From 6f4eb164b588e376cd490678fc88acacbbe06cfd 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: Wed, 4 Dec 2013 15:47:00 +0300 Subject: [PATCH] 2_2_1_35 --- .../Задание/Forms/ДействиеВыполнить/Form.form | 160 +- .../Forms/ДействиеВыполнить/Module.bsl | 43 +- .../Задание/Forms/ДействиеПроверить/Form.form | 120 +- .../Forms/ДействиеПроверить/Module.bsl | 34 +- .../Forms/ФормаБизнесПроцесса/Form.form | 313 +- .../Forms/ФормаБизнесПроцесса/Module.bsl | 156 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Задание/Forms/ФормаСписка/Form.form | 136 +- .../Задание/Forms/ФормаСписка/Module.bsl | 2 +- .../BusinessProcesses/Задание/Help/ru.html | 2 +- .../Задание/ObjectModule.bsl | 67 +- SSL/src/BusinessProcesses/Задание/Задание.mdo | 11 + .../ПодборВалютИзКлассификатора/Form.form | 54 +- .../ПодборВалютИзКлассификатора/Help/ru.html | 2 +- .../ПодборВалютИзКлассификатора/Module.bsl | 3 +- .../Валюты/Forms/ФормаВыбора/Module.bsl | 55 - .../Список/ExtInfo/ListSettings.dcss | 2 + .../Валюты/Forms/ФормаСписка/Form.form | 56 +- .../Валюты/Forms/ФормаСписка/Module.bsl | 30 +- .../Валюты/Forms/ФормаЭлемента/Form.form | 122 +- .../Валюты/Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Валюты/Forms/ФормаЭлемента/Module.bsl | 36 +- SSL/src/Catalogs/Валюты/Help/ru.html | 2 +- .../Template.txt | 2 +- SSL/src/Catalogs/Валюты/Валюты.mdo | 11 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 28 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 66 +- .../Forms/ФормаЭлемента/Form.form | 12 +- .../CommandModule.bsl | 77 +- .../CommandModule.bsl | 91 +- .../Forms/РазмещениеВРазделах/Form.form | 62 +- .../Forms/РазмещениеВРазделах/Help/ru.html | 2 +- .../Forms/РазмещениеВРазделах/Module.bsl | 51 +- .../Forms/СбросНастроекРазмещения/Form.form | 221 + .../Forms/СбросНастроекРазмещения/Module.bsl | 112 + .../СбросПользовательскихНастроек}/Form.form | 144 +- .../СбросПользовательскихНастроек/Module.bsl | 91 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 170 +- .../Forms/ФормаСписка/Module.bsl | 122 +- .../Forms/ФормаЭлемента/Form.form | 144 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 34 +- SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html | 2 +- .../ВариантыОтчетов/ВариантыОтчетов.mdo | 18 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../ВерсииФайлов/Forms/ФормаВыбора/Form.form | 36 +- .../Form.form | 8 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ВерсииФайлов/Forms/ФормаСписка/Form.form | 68 +- .../ВерсииФайлов/Forms/ФормаСписка/Module.bsl | 11 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСпискаВерсийФайла/Form.form | 90 +- .../Forms/ФормаСпискаВерсийФайла/Module.bsl | 311 +- .../Forms/ФормаЭлемента/Form.form | 90 +- .../Forms/ФормаЭлемента/Module.bsl | 19 +- SSL/src/Catalogs/ВерсииФайлов/Help/ru.html | 2 +- .../Catalogs/ВерсииФайлов/ManagerModule.bsl | 18 + .../Catalogs/ВерсииФайлов/ObjectModule.bsl | 8 +- .../Catalogs/ВерсииФайлов/ВерсииФайлов.mdo | 7 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаЭлемента/Form.form | 2 +- .../ВидыДокументовФизическихЛиц/Help/ru.html | 2 +- .../ManagerModule.bsl | 5 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбораГруппы/Form.form | 24 +- .../Forms/ФормаГруппы/Form.form | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 32 +- .../Forms/ФормаСписка/Module.bsl | 9 +- .../Forms/ФормаЭлемента/Form.form | 104 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 24 +- .../ВидыКонтактнойИнформации/Help/ru.html | 2 +- .../ВидыКонтактнойИнформации.mdo | 26 +- .../Commands/ВнешнийДоступ/CommandModule.bsl | 3 +- .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 214 +- .../Forms/ФормаСписка/Module.bsl | 160 +- .../Forms/ФормаЭлемента/Form.form | 165 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 57 +- .../Catalogs/ВнешниеПользователи/Help/ru.html | 2 +- .../ВнешниеПользователи/ManagerModule.bsl | 26 +- .../ВстречаПрисоединенныеФайлы.mdo | 8 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаСписка/Module.bsl | 8 +- .../Forms/ФормаЭлемента/Form.form | 171 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 45 +- .../ГруппыВнешнихПользователей/Help/ru.html | 2 +- .../ManagerModule.bsl | 20 + .../Forms/ВыборПоОтветственному/Form.form | 26 +- .../Form.form | 232 - .../Module.bsl | 66 - .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбораГруппы/Form.form | 24 +- .../ГруппыДоступа/Forms/ФормаГруппы/Form.form | 6 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ГруппыДоступа/Forms/ФормаСписка/Form.form | 56 +- .../Forms/ФормаСписка/Help/ru.html | 2 +- .../Forms/ФормаСписка/Module.bsl | 31 +- .../Forms/ФормаЭлемента/Form.form | 1878 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 1088 +- SSL/src/Catalogs/ГруппыДоступа/Help/ru.html | 2 +- .../Catalogs/ГруппыДоступа/ManagerModule.bsl | 52 +- .../Catalogs/ГруппыДоступа/ГруппыДоступа.mdo | 36 +- .../ГруппыИсполнителейЗадач/ManagerModule.bsl | 19 + .../ГруппыИсполнителейЗадач.mdo | 6 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаСписка/Module.bsl | 8 +- .../Forms/ФормаЭлемента/Form.form | 97 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 5 +- .../Catalogs/ГруппыПользователей/Help/ru.html | 2 +- .../Form.form | 92 +- .../Forms/ПодборРазделов/Form.form | 74 +- .../Forms/ПодборРазделов/Module.bsl | 4 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 82 +- .../Forms/ФормаЭлемента/Form.form | 307 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 581 +- .../Help/ru.html | 2 +- .../ObjectModule.bsl | 50 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 58 +- .../Forms/ФормаЭлемента/Form.form | 16 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Заметки/Forms/ВсеЗаметки/Form.form | 93 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Заметки/Forms/ЗаметкиПоПредмету/Form.form | 50 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Заметки/Forms/МоиЗаметки/Form.form | 70 +- .../Заметки/Forms/МоиЗаметки/Module.bsl | 2 +- .../Заметки/Forms/ФормаГруппы/Form.form | 14 +- .../Заметки/Forms/ФормаЭлемента/Form.form | 44 +- .../Заметки/Forms/ФормаЭлемента/Module.bsl | 4 +- SSL/src/Catalogs/Заметки/ObjectModule.bsl | 5 +- ...анноеВзаимодействиеПрисоединенныеФайлы.mdo | 8 +- .../Forms/ФормаГруппы/Form.form | 10 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 82 +- .../Forms/ФормаСписка/Module.bsl | 14 +- .../Forms/ФормаЭлемента/Form.form | 15 +- .../Forms/ФормаЭлемента/Module.bsl | 21 +- .../ЗначенияСвойствОбъектов/Help/ru.html | 2 +- .../ЗначенияСвойствОбъектов/ManagerModule.bsl | 19 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 81 +- .../Forms/ФормаСписка/Module.bsl | 14 +- .../Forms/ФормаЭлемента/Form.form | 15 +- .../Forms/ФормаЭлемента/Module.bsl | 21 +- .../Help/ru.html | 2 +- .../ManagerModule.bsl | 19 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаСписка/Module.bsl | 13 +- .../Forms/ФормаЭлемента/Form.form | 48 +- .../Forms/ФормаЭлемента/Module.bsl | 2 +- .../ManagerModule.bsl | 190 +- .../Forms/РасписаниеРаботы/Form.form | 32 +- .../Forms/РасписаниеРаботы/Module.bsl | 32 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Календари/Forms/ФормаСписка/Form.form | 40 +- .../Календари/Forms/ФормаЭлемента/Form.form | 270 +- .../Календари/Forms/ФормаЭлемента/Module.bsl | 123 +- .../Forms/ЗагрузкаКлассификатора/Form.form | 349 +- .../Forms/ЗагрузкаКлассификатора/Module.bsl | 6 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 48 +- .../Forms/ФормаВыбора/Module.bsl | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 42 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../Forms/ФормаЭлемента/Form.form | 46 +- .../Forms/ФормаЭлемента/Module.bsl | 6 +- .../КлассификаторБанковРФ/Help/ru.html | 3 +- .../КлассификаторБанковРФ/ManagerModule.bsl | 15 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 24 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 36 +- .../Forms/ФормаЭлемента/Form.form | 14 +- .../КлючевыеОперации/ObjectModule.bsl | 2 +- .../КлючевыеОперации/КлючевыеОперации.mdo | 1 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 24 +- .../Forms/ФормаГруппы/Form.form | 2 +- .../НаборыСвойств/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 178 +- .../Forms/ФормаСписка/Module.bsl | 30 +- .../Forms/ФормаЭлемента/Form.form | 66 +- .../Help/ru.html | 2 +- .../ManagerModule.bsl | 14 + .../НазначенияСертификатов/Template.txt | 0 .../Template.txt | 0 .../НазначенияСертификатовЭП.mdo} | 7 +- .../ДобавитьОрганизацию}/CommandModule.bsl | 5 +- .../Commands/Организации/CommandModule.bsl | 12 + .../РеквизитыОрганизации/CommandModule.bsl | 19 + .../Организации/Forms/ФормаЭлемента/Form.form | 41 +- .../Forms/ФормаЭлемента/Module.bsl | 33 +- .../Catalogs/Организации/ManagerModule.bsl | 101 + SSL/src/Catalogs/Организации/Организации.mdo | 28 +- .../Forms/ФормаЭлемента/Form.form | 70 +- .../Forms/ФормаЭлемента/Module.bsl | 20 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 110 +- .../Forms/ФормаЭлемента/Form.form | 82 +- .../Forms/ФормаЭлемента/Module.bsl | 22 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ПапкиФайлов/Forms/ФормаВыбора/Form.form | 49 +- .../ПапкиФайлов/Forms/ФормаЭлемента/Form.form | 89 +- .../Forms/ФормаЭлемента/Module.bsl | 55 +- SSL/src/Catalogs/ПапкиФайлов/Help/ru.html | 2 +- .../Catalogs/ПапкиФайлов/ManagerModule.bsl | 20 + SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl | 105 +- SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo | 20 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 24 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 58 +- .../Forms/ФормаЭлемента/Form.form | 16 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ПользователиИБ/Form.form | 114 +- .../Forms/ПользователиИБ/Help/ru.html | 2 +- .../Forms/ПользователиИБ/Module.bsl | 82 +- .../Пользователи/Forms/СменаПочты/Form.form | 4 +- .../Пользователи/Forms/СменаПочты/Module.bsl | 31 +- .../Forms/ФормаВыбораПользователяОС/Form.form | 1235 +- .../ФормаВыбораПользователяОС/Help/ru.html | 2 +- .../ФормаВыбораПользователяОС/Module.bsl | 4 +- .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../Пользователи/Forms/ФормаСписка/Form.form | 217 +- .../Пользователи/Forms/ФормаСписка/Module.bsl | 118 +- .../Forms/ФормаЭлемента/Form.form | 170 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 406 +- SSL/src/Catalogs/Пользователи/Help/ru.html | 2 +- .../Catalogs/Пользователи/ManagerModule.bsl | 28 +- .../Catalogs/Пользователи/ObjectModule.bsl | 22 +- .../Forms/ПрименениеПравил/Form.form | 66 +- .../Forms/ПрименениеПравил/Help/ru.html | 2 +- .../Forms/ПрименениеПравил/Module.bsl | 4 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 126 +- .../Forms/ФормаСписка/Help/ru.html | 2 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../Forms/ФормаЭлемента/Form.form | 15 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Help/ru.html | 2 +- .../ManagerModule.bsl | 25 +- .../ManagerModule.bsl | 20 + .../Forms/ФормаЭлемента/Form.form | 66 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 59 +- .../ManagerModule.bsl | 31 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбораГруппы/Form.form | 24 +- .../Forms/ФормаГруппы/Form.form | 6 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 25 +- .../Forms/ФормаСписка/Help/ru.html | 2 +- .../ConditionalAppearance.dcssca | 30 - .../Forms/ФормаЭлемента/Form.form | 874 +- .../Forms/ФормаЭлемента/Module.bsl | 997 +- .../Catalogs/ПрофилиГруппДоступа/Help/ru.html | 2 +- .../ПрофилиГруппДоступа/ManagerModule.bsl | 308 +- .../ПрофилиГруппДоступа/ObjectModule.bsl | 13 +- .../ПрофилиГруппДоступа.mdo | 26 +- .../ВыполнитьСейчас/CommandModule.bsl | 79 +- .../Forms/ПараметрыFTP/Form.form | 28 +- .../Forms/ПараметрыFTP/Help/ru.html | 2 +- .../Forms/ПараметрыFTP/Module.bsl | 39 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбораГруппы/Form.form | 28 +- .../Forms/ФормаВыбораГруппы/Help/ru.html | 2 +- .../Forms/ФормаГруппы/Form.form | 6 +- .../Forms/ФормаГруппы/Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 89 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../Forms/ФормаЭлемента/Form.form | 1287 +- .../Forms/ФормаЭлемента/Help/ru.html | 6 +- .../Forms/ФормаЭлемента/Module.bsl | 3110 ++- SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html | 2 +- .../Catalogs/РассылкиОтчетов/ObjectModule.bsl | 5 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 44 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 52 +- .../Forms/ФормаЭлемента/Form.form | 66 +- .../Forms/ФормаЭлемента/Module.bsl | 10 +- .../Catalogs/РолиИсполнителей/Help/ru.html | 2 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 4 +- .../СообщениеSMSПрисоединенныеФайлы.mdo | 8 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 174 +- .../Forms/ФормаСписка/Module.bsl | 50 +- .../Forms/ФормаЭлемента/Form.form | 22 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 131 +- .../Forms/ФормаСписка/Module.bsl | 62 +- .../Forms/ФормаЭлемента/Form.form | 22 +- .../СтраныМира/Forms/Классификатор/Form.form | 70 +- .../Forms/Классификатор/Help/ru.html | 2 +- .../СтраныМира/Forms/Классификатор/Module.bsl | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../СтраныМира/Forms/ФормаСписка/Form.form | 69 +- .../СтраныМира/Forms/ФормаСписка/Module.bsl | 37 +- .../СтраныМира/Forms/ФормаЭлемента/Form.form | 24 +- .../СтраныМира/Forms/ФормаЭлемента/Module.bsl | 2 +- SSL/src/Catalogs/СтраныМира/Help/ru.html | 2 +- SSL/src/Catalogs/СтраныМира/ManagerModule.bsl | 439 +- .../Templates/Классификатор/Template.txt | 2 +- .../СтроковыеКонтактыВзаимодействий.mdo | 113 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Form.form | 73 +- .../Module.bsl | 6 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 32 +- .../Forms/ФормаЭлемента/Form.form | 92 +- .../Forms/ФормаЭлемента/Module.bsl | 20 +- .../СценарииОбменовДанными/Help/ru.html | 5 + .../СценарииОбменовДанными.mdo | 9 +- .../ТелефонныйЗвонокПрисоединенныеФайлы.mdo | 8 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 44 +- .../Forms/ФормаЭлемента/Form.form | 40 +- .../Forms/ФормаЭлемента/Help/ru.html | 4 +- .../Catalogs/ТомаХраненияФайлов/Help/ru.html | 2 +- .../ТомаХраненияФайлов/ManagerModule.bsl | 18 + .../Form.form | 112 +- .../Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 30 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 70 +- .../Forms/ФормаЭлемента/Form.form | 78 +- .../Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Forms/ФормаЭлемента/Module.bsl | 10 +- .../Help/ru.html | 2 +- .../ObjectModule.bsl | 31 +- .../УчетныеЗаписиЭлектроннойПочты.mdo | 2 +- .../CommandModule.bsl | 0 .../{ПапкиФайлов => Файлы}/CommandModule.bsl | 2 +- .../Form.form | 73 +- .../Forms/ВопросПриИмпортеФайлов/Form.form | 44 +- .../Forms/ВопросПриИмпортеФайлов/Help/ru.html | 2 +- .../Файлы/Forms/ВыборКодировки/Form.form | 42 +- .../Файлы/Forms/ВыборКодировки/Help/ru.html | 23 +- .../Файлы/Forms/ВыборКодировки/Module.bsl | 15 +- .../Form.form | 32 +- .../Help/ru.html | 4 +- .../Module.bsl | 11 +- .../ВыборУстройстваСканирования/Form.form | 21 +- .../ВыборУстройстваСканирования/Module.bsl | 2 +- .../ИнформацияФайлНеБылИзменен/Form.form | 10 +- .../ИнформацияФайлНеБылИзменен/Module.bsl | 8 + .../Forms/НастройкаСканирования/Form.form | 107 +- .../Forms/НастройкаСканирования/Help/ru.html | 2 +- .../Forms/НастройкаСканирования/Module.bsl | 12 +- .../НастройкаСканированияНаСеанс/Form.form | 72 +- .../НастройкаСканированияНаСеанс/Help/ru.html | 2 +- .../РедактированиеТекстовогоФайла/Form.form | 30 +- .../Help/ru.html | 20 +- .../РедактированиеТекстовогоФайла/Module.bsl | 249 +- .../СписокФайлов/ExtInfo/ListSettings.dcss | 2 + .../Файлы/Forms/РедактируемыеФайлы/Form.form | 93 +- .../Forms/РедактируемыеФайлы/Help/ru.html | 2 +- .../Файлы/Forms/РедактируемыеФайлы/Module.bsl | 75 +- .../Form.form | 48 +- .../Module.bsl | 2 +- .../Forms/РезультатСканирования/Form.form | 75 +- .../Forms/РезультатСканирования/Help/ru.html | 2 +- .../Forms/РезультатСканирования/Module.bsl | 393 +- .../СписокФайлов/ExtInfo/ListSettings.dcss | 2 + .../Forms/СписокЗанятыхСВопросом/Form.form | 117 +- .../Forms/СписокЗанятыхСВопросом/Help/ru.html | 2 +- .../Forms/СписокЗанятыхСВопросом/Module.bsl | 86 +- .../Файлы/Forms/ФайлСуществует/Form.form | 18 +- .../Папки}/ExtInfo/ListSettings.dcss | 2 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../{ХранилищеФайлов => Файлы}/Form.form | 984 +- .../{ХранилищеФайлов => Файлы}/Help/ru.html | 2 +- SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl | 1405 + .../ФайлыВОсновномРабочемКаталоге/Form.form | 100 +- .../Help/ru.html | 2 +- .../ФайлыВОсновномРабочемКаталоге/Module.bsl | 216 +- .../Файлы/Forms/ФормаВозвратаФайла/Form.form | 40 +- .../Forms/ФормаВозвратаФайла/Help/ru.html | 2 +- .../Файлы/Forms/ФормаВозвратаФайла/Module.bsl | 18 +- .../Файлы/Forms/ФормаВопроса/Form.form | 50 +- .../Файлы/Forms/ФормаВопроса/Module.bsl | 18 +- .../Form.form | 12 +- .../Группы/ExtInfo/ListSettings.dcss | 2 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Файлы/Forms/ФормаВыбора/Form.form | 167 +- .../Файлы/Forms/ФормаВыбора/Module.bsl | 18 +- .../Forms/ФормаВыбораРежимаОткрытия/Form.form | 38 +- .../ФормаВыбораРежимаОткрытия/Help/ru.html | 2 +- .../ФормаВыбораРежимаОткрытия/Module.bsl | 9 +- .../ФормаГруповаяОперацияНаПапке/Form.form | 12 +- .../Файлы/Forms/ФормаИмпортаПапки/Form.form | 54 +- .../Forms/ФормаИмпортаПапки/Help/ru.html | 2 +- .../Файлы/Forms/ФормаИмпортаПапки/Module.bsl | 39 +- .../Файлы/Forms/ФормаИмпортаФайлов/Form.form | 92 +- .../Forms/ФормаИмпортаФайлов/Help/ru.html | 2 +- .../Файлы/Forms/ФормаИмпортаФайлов/Module.bsl | 88 +- .../Form.form | 31 +- .../Module.bsl | 8 +- .../Файлы/Forms/ФормаНового/Form.form | 35 +- .../Файлы/Forms/ФормаНового/Help/ru.html | 2 +- .../Файлы/Forms/ФормаНового/Module.bsl | 6 +- .../Файлы/Forms/ФормаОтчета/Form.form | 4 +- .../Файлы/Forms/ФормаПеретаскивания/Form.form | 96 +- .../Forms/ФормаПеретаскивания/Module.bsl | 36 +- .../Группы/ExtInfo/ListSettings.dcss | 2 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Файлы/Forms/ФормаПодбора/Form.form | 88 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Файлы/Forms/ФормаСписка/Form.form | 121 +- .../Файлы/Forms/ФормаСписка/Module.bsl | 30 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ФормаСпискаПрисоединенныхФайлов/Form.form | 403 +- .../Module.bsl | 718 +- .../Файлы/Forms/ФормаЭкспортаПапки/Form.form | 32 +- .../Forms/ФормаЭкспортаПапки/Help/ru.html | 2 +- .../Файлы/Forms/ФормаЭкспортаПапки/Module.bsl | 997 +- .../Файлы/Forms/ФормаЭлемента/Form.form | 358 +- .../Файлы/Forms/ФормаЭлемента/Help/ru.html | 2 +- .../Файлы/Forms/ФормаЭлемента/Module.bsl | 687 +- .../Файлы/Forms/ХранилищеФайлов/Module.bsl | 1266 - SSL/src/Catalogs/Файлы/Help/ru.html | 4 +- SSL/src/Catalogs/Файлы/ManagerModule.bsl | 19 + SSL/src/Catalogs/Файлы/ObjectModule.bsl | 34 +- SSL/src/Catalogs/Файлы/Файлы.mdo | 63 +- .../Forms/ФормаГруппы/Form.form | 6 +- SSL/src/Catalogs/ФизическиеЛица/Help/ru.html | 2 +- .../Catalogs/ФизическиеЛица/ManagerModule.bsl | 27 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../ШаблоныАнкет/Forms/ФормаВыбора/Form.form | 62 +- .../ФормаМастераТабличныхВопросов/Form.form | 556 +- .../Help/ru.html | 2 +- .../ФормаМастераТабличныхВопросов/Module.bsl | 18 +- .../Forms/ФормаПростыхВопросов/Form.form | 35 +- .../Forms/ФормаПростыхВопросов/Module.bsl | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ШаблоныАнкет/Forms/ФормаСписка/Form.form | 62 +- .../Forms/ФормаЭлемента/Form.form | 196 +- .../Forms/ФормаЭлемента/Module.bsl | 128 +- .../Forms/ФормаЭлемента/Form.form | 32 +- .../Forms/ФормаЭлемента/Module.bsl | 11 +- ...онноеПисьмоВходящееПрисоединенныеФайлы.mdo | 8 +- ...нноеПисьмоИсходящееПрисоединенныеФайлы.mdo | 8 +- .../ВидыДоступа/Forms/ФормаВыбора/Form.form | 242 - .../ВидыДоступа/Forms/ФормаВыбора/Module.bsl | 57 - .../Список/ExtInfo/ListSettings.dcss | 15 - .../ВидыДоступа/Forms/ФормаСписка/Module.bsl | 47 - .../ВидыДоступа/Forms/ФормаЭлемента/Form.form | 140 - .../Forms/ФормаЭлемента/Module.bsl | 9 - .../ВидыДоступа/ManagerModule.bsl | 300 - .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 62 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 120 +- .../ВариантыОтветов/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаЭлемента/Form.form | 264 +- .../Forms/ФормаЭлемента/Module.bsl | 19 +- .../ВопросыДляАнкетирования/ObjectModule.bsl | 28 +- .../ВопросыДляАнкетирования.mdo | 22 - .../ИзменениеНастройкиСвойства/Form.form | 98 +- .../ИзменениеНастройкиСвойства/Module.bsl | 21 +- .../Forms/РазблокированиеРеквизитов/Form.form | 38 +- .../РазблокированиеРеквизитов/Module.bsl | 10 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 54 +- .../Forms/ФормаВыбора/Module.bsl | 13 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 30 +- .../Forms/ФормаСписка/Module.bsl | 13 +- .../Значения/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаЭлемента/Form.form | 226 +- .../Forms/ФормаЭлемента/Module.bsl | 576 +- .../Help/ru.html | 2 +- .../ManagerModule.bsl | 18 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаЭлемента/Form.form | 6 +- .../ОбъектыАдресацииЗадач/Help/ru.html | 2 +- .../УдалитьВидыДоступа/ManagerModule.bsl} | 0 .../ObjectModule.bsl | 0 .../УдалитьВидыДоступа.mdo} | 105 +- .../ОбластьДанныхВспомогательныеДанные.mdo | 8 +- .../ОбластьДанныхОсновныеДанные.mdo | 26 +- .../CommandModule.bsl | 10 - .../ВыгрузитьДанныеВЛокальнуюВерсию.mdo | 10 - .../CommandModule.bsl | 11 - .../ВыгрузитьДанныеДляПереходаВСервис.mdo | 10 - .../CommandModule.bsl | 11 - ...полнительныеОбработкиАдминистрирование.mdo | 10 - .../CommandModule.bsl | 11 - .../ДополнительныеОтчетыАдминистрирование.mdo | 10 - .../CommandModule.bsl | 0 .../ДополнительныеПечатныеФормыОбъекта.mdo} | 2 +- .../ЗагрузитьДанныеВОбласть/CommandModule.bsl | 12 - .../ЗагрузитьДанныеВОбласть.mdo | 10 - .../ЗагрузитьДанныеИзСервиса.mdo | 10 - .../ЗагрузитьКурсыВалют/CommandModule.bsl | 16 +- .../CommandModule.bsl | 0 .../ЗаполнениеОбъекта.mdo} | 2 +- .../CommandModule.bsl | 0 .../МоиЗаметкиПоПредмету.mdo} | 2 +- .../CommandModule.bsl | 0 .../Напомнить.mdo} | 2 +- .../CommandModule.bsl | 2 +- .../НастроитьПрава.mdo} | 6 +- .../ОткрытьСценарииОбменовДанными.mdo | 2 +- .../CommandModule.bsl | 0 .../ОтчетыОбъекта.mdo} | 2 +- .../CommandModule.bsl | 7 - ...нельОтчетовНастройкаИАдминистрирование.mdo | 10 - .../CommandModule.bsl | 6 +- .../CommandModule.bsl | 2 +- .../CommandModule.bsl | 2 +- .../СведенияОПользователе/CommandModule.bsl | 4 +- .../CommandModule.bsl | 0 .../СозданиеСвязанныхОбъектов.mdo} | 2 +- .../СоставОтправляемыхДанных.mdo | 5 +- .../CommandModule.bsl | 2 +- .../CommonForms/АвтономнаяРабота/Form.form | 102 +- .../CommonForms/АвтономнаяРабота/Module.bsl | 35 +- .../АвтономнаяРаботаВМоделиСервиса/Form.form | 238 +- .../АвтономнаяРаботаВМоделиСервиса/Module.bsl | 34 +- .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + SSL/src/CommonForms/АдреснаяКнига/Form.form | 339 +- SSL/src/CommonForms/АдреснаяКнига/Module.bsl | 70 +- .../АутентификацияВСервисе/Form.form | 24 +- .../АутентификацияВСервисе/Module.bsl | 18 +- .../ВводПароляСОписаниями/Form.form | 20 +- .../ВводПароляСОписаниями/Help/ru.html | 4 +- .../ВключениеЖурналаРегистрации/Form.form | 392 - .../ВключениеЖурналаРегистрации/Module.bsl | 60 - .../ВключениеЖурналаРегистрации.mdo | 10 - SSL/src/CommonForms/Вопрос/Form.form | 32 +- SSL/src/CommonForms/Вопрос/Module.bsl | 10 + .../Form.form | 48 +- .../Module.bsl | 49 +- .../CommonForms/ВходВОбластьДанных/Form.form | 16 +- .../CommonForms/ВходВОбластьДанных/Module.bsl | 179 +- SSL/src/CommonForms/ВыборДаты/Form.form | 60 +- SSL/src/CommonForms/ВыборДаты/Module.bsl | 9 +- .../Form.form | 76 +- .../Module.bsl | 6 +- .../ExtInfo/ListSettings.dcss | 2 + .../СписокРоли/ExtInfo/ListSettings.dcss | 2 + .../ВыборИсполнителяБизнесПроцесса/Form.form | 66 +- .../Help/ru.html | 2 +- .../ВыборИсполнителяБизнесПроцесса/Module.bsl | 2 +- .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + SSL/src/CommonForms/ВыборКонтакта/Form.form | 194 +- SSL/src/CommonForms/ВыборКонтакта/Module.bsl | 11 +- .../Form.form | 36 +- .../Module.bsl | 6 +- .../ВыборОбъектовМетаданных/Form.form | 59 +- .../ВыборОбъектовМетаданных/Module.bsl | 92 +- SSL/src/CommonForms/ВыборПодписей/Form.form | 56 +- .../CommonForms/ВыборПодписей/Help/ru.html | 6 +- SSL/src/CommonForms/ВыборПодписей/Module.bsl | 32 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ВыборПрисоединенныхФайлов/Form.form | 18 +- .../ВыборПроизвольногоПериода/Form.form | 10 +- .../ВыборПроизвольногоПериода/Module.bsl | 2 +- .../ВыборПутиКАрхивуФайловТомов/Form.form | 10 +- .../ВыборПутиКАрхивуФайловТомов/Module.bsl | 13 +- .../ВыборРолиИсполнителя/Form.form | 18 +- .../ВыборСертификатовШифрования/Form.form | 55 +- .../ВыборСертификатовШифрования/Help/ru.html | 4 +- .../ВыборСертификатовШифрования/Module.bsl | 12 +- .../ВыборУзловПлановОбмена/Form.form | 32 +- .../ВыборУзловПлановОбмена/Module.bsl | 2 +- .../ВыборФорматаВложений/Form.form | 43 +- SSL/src/CommonForms/ВыгрузкаДанных/Form.form | 561 - SSL/src/CommonForms/ВыгрузкаДанных/Module.bsl | 254 - .../ВыгрузкаДанных/ВыгрузкаДанных.mdo | 10 - .../CommonForms/ГруппыПользователей/Form.form | 72 +- .../ГруппыПользователей/Module.bsl | 142 +- .../CommonForms/ДлительнаяОперация/Form.form | 6 +- .../Form.form | 10 +- .../Module.bsl | 38 +- .../ДобавлениеПодписиИзФайла/Form.form | 34 +- .../ДобавлениеПодписиИзФайла/Help/ru.html | 4 +- .../ДополнительноеОписание/Form.form | 4 +- .../ДополнительныеОтчетыИОбработки/Form.form | 76 +- .../ДополнительныеОтчетыИОбработки/Module.bsl | 29 +- .../Form.form | 80 +- .../Module.bsl | 8 +- .../ЗагрузкаДанныхВОбласть/Module.bsl | 103 - .../ЗагрузкаДанныхВОбласть.mdo | 10 - .../ЗагрузкаДанныхИзСервиса/Form.form | 480 - .../ЗагрузкаДанныхИзСервиса/Module.bsl | 57 - .../ЗагрузкаДанныхИзСервиса.mdo | 10 - .../Form.form | 312 - .../Module.bsl | 67 - ...ообщенияОбменаСИзменениямиКонфигурации.mdo | 10 - .../Form.form | 108 - .../Module.bsl | 17 - .../ИнформацияНеразделенногоПользователя.mdo | 11 - .../МастерАнкетыПоРазделам/Form.form | 106 +- .../МастерАнкетыПоРазделам/Module.bsl | 12 +- .../Form.form | 106 +- .../Module.bsl | 14 +- .../НапоминаниеПриРедактировании/Form.form | 152 +- .../НапоминаниеПриРедактировании/Module.bsl | 10 +- .../НастройкаМоихОтчетовИОбработок/Form.form | 80 +- .../НастройкаМоихОтчетовИОбработок/Module.bsl | 29 +- .../НастройкаОбменаСообщениями/Form.form | 118 +- .../НастройкаОбменаСообщениями/Module.bsl | 31 +- .../Form.form | 40 +- .../Help/ru.html | 2 +- .../Module.bsl | 91 +- .../НастройкаОтправкиSMS/Form.form | 18 +- .../НастройкаОтправкиSMS/Help/ru.html | 2 +- .../НастройкиАгентаСервиса/Form.form | 10 +- .../Form.form | 638 +- .../Help/ru.html | 2 +- .../Module.bsl | 137 +- .../НастройкиКриптографии.mdo} | 2 +- .../ConditionalAppearance.dcssca | 4 +- .../Form.form | 879 +- .../НастройкиПравОбъектов/Module.bsl | 897 + .../НастройкиПравОбъектов.mdo} | 4 +- .../Form.form | 30 +- .../Module.bsl | 67 +- SSL/src/CommonForms/ОбменыДанными/Form.form | 492 +- .../CommonForms/ОбменыДанными/Help/ru.html | 2 +- SSL/src/CommonForms/ОбменыДанными/Module.bsl | 64 +- .../ОписаниеИзмененийСистемы/Form.form | 46 +- .../ОписаниеИзмененийСистемы/Help/ru.html | 2 +- .../ОписаниеИзмененийСистемы/Module.bsl | 6 +- .../Form.form | 50 +- .../Module.bsl | 4 +- .../CommonForms/ОтправкаСообщения/Form.form | 82 +- .../ОтправкаСообщения/Help/ru.html | 2 +- .../CommonForms/ОтправкаСообщения/Module.bsl | 56 +- .../Form.form | 74 +- .../Module.bsl | 2 +- .../ОтчетОСохраненииФайлов/Form.form | 4 +- SSL/src/CommonForms/ПанельОтчетов/Form.form | 162 +- .../CommonForms/ПанельОтчетов/Help/ru.html | 2 +- SSL/src/CommonForms/ПанельОтчетов/Module.bsl | 88 +- .../Form.form | 70 +- .../Help/ru.html | 2 +- .../Module.bsl | 17 +- .../ПараметрыПроксиСервера/Form.form | 257 +- .../ПараметрыПроксиСервера/Help/ru.html | 7 +- .../ПараметрыПроксиСервера/Module.bsl | 414 +- .../Form.form | 221 +- .../Help/ru.html | 4 +- .../ПерсональныеНастройкиЭП/Module.bsl | 152 + .../ПерсональныеНастройкиЭП.mdo} | 2 +- .../ПерсональныеНастройкиЭЦП/Module.bsl | 171 - .../Form.form | 118 +- .../Help/ru.html | 4 +- .../Module.bsl | 25 +- .../ПерсональныеСертификатыДляШифрования.mdo} | 4 +- .../CommonForms/ПечатьДокументов/Form.form | 188 +- .../CommonForms/ПечатьДокументов/Help/ru.html | 4 + .../CommonForms/ПечатьДокументов/Module.bsl | 122 +- .../ПечатьДокументов/ПечатьДокументов.mdo | 5 + .../ПодготовкаНовогоПисьма/Form.form | 107 +- .../ПодготовкаНовогоПисьма/Module.bsl | 2 +- .../ПодключениеКонечнойТочки/Form.form | 197 +- .../ПодключениеКонечнойТочки/Module.bsl | 57 +- .../{ПодписьЭЦП => ПодписьЭП}/Form.form | 24 +- .../{ПодписьЭЦП => ПодписьЭП}/Help/ru.html | 4 +- .../{ПодписьЭЦП => ПодписьЭП}/Module.bsl | 4 +- .../ПодписьЭП.mdo} | 2 +- .../Form.form | 16 +- .../Help/ru.html | 2 +- .../Module.bsl | 14 +- SSL/src/CommonForms/ПоискПоИндексу/Form.form | 1082 - SSL/src/CommonForms/ПоискПоИндексу/Module.bsl | 236 - .../ПоискПоИндексу/ПоискПоИндексу.mdo | 11 - .../CommonForms/ПользователиСервиса/Form.form | 60 +- .../ПользователиСервиса/Module.bsl | 31 +- SSL/src/CommonForms/ПраваДоступа/Form.form | 190 +- SSL/src/CommonForms/ПраваДоступа/Module.bsl | 173 +- .../ПраваДоступаУпрощенно/Form.form | 1804 +- .../ПраваДоступаУпрощенно/Module.bsl | 1169 +- .../ПраваПоЗначениямДоступа/Module.bsl | 986 - .../Form.form | 14 +- .../Module.bsl | 24 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../CommonForms/ПрисоединенныеФайлы/Form.form | 235 +- .../ПрисоединенныеФайлы/Module.bsl | 102 +- .../CommonForms/ПрисоединенныйФайл/Form.form | 230 +- .../CommonForms/ПрисоединенныйФайл/Module.bsl | 460 +- .../Form.form | 42 +- .../Module.bsl | 18 +- .../Form.form | 119 +- .../Help/ru.html | 2 +- .../Module.bsl | 148 +- .../{СертификатЭЦП => СертификатЭП}/Form.form | 20 +- .../Help/ru.html | 4 +- .../Module.bsl | 10 +- .../СертификатЭП.mdo} | 2 +- .../Form.form | 172 +- .../Module.bsl | 12 +- .../Form.form | 102 +- .../Help/ru.html | 2 +- .../Module.bsl | 19 +- .../СозданиеРезервнойКопии/Form.form | 24 +- .../СозданиеРезервнойКопии/Module.bsl | 30 +- .../СохранениеПечатнойФормы/Form.form | 74 +- .../СохранениеПечатнойФормы/Module.bsl | 2 +- .../СтруктураПодчиненности/Form.form | 8 +- .../СтруктураПодчиненности/Help/ru.html | 2 +- .../СтруктураПодчиненности/Module.bsl | 46 +- .../УстановкаВедущейКонечнойТочки/Form.form | 33 +- .../УстановкаВедущейКонечнойТочки/Module.bsl | 40 +- .../Form.form | 156 +- .../Help/ru.html | 4 +- .../Module.bsl | 20 +- .../УстановкаПодписиЭП.mdo} | 2 +- .../CommonForms/УточнениеКонтактов/Form.form | 44 +- .../CommonForms/УточнениеКонтактов/Module.bsl | 18 +- .../ФайлыВТомах/ExtInfo/ListSettings.dcss | 2 + SSL/src/CommonForms/ФайлыВТоме/Form.form | 74 +- SSL/src/CommonForms/ФайлыВТоме/Module.bsl | 14 +- .../CommonForms/ФормаВариантаОтчета/Form.form | 522 +- .../ФормаВариантаОтчета/Module.bsl | 4 +- .../CommonForms/ФормаНастроекОтчета/Form.form | 8 +- .../ФормаНастроекОтчета/Module.bsl | 4 +- SSL/src/CommonForms/ФормаОтчета/Form.form | 335 +- SSL/src/CommonForms/ФормаОтчета/Module.bsl | 2304 +- .../АвтономнаяРаботаСлужебный/Module.bsl | 28 +- .../АдресныйКлассификатор/Module.bsl | 1330 +- .../Module.bsl | 38 +- .../АдресныйКлассификаторКлиент/Module.bsl | 172 +- .../Module.bsl | 2 +- .../Module.bsl | 18 +- .../CommonModules/Анкетирование/Module.bsl | 16 +- .../АнкетированиеКлиентСервер/Module.bsl | 6 +- .../БанкиСлужебныйВМоделиСервиса/Module.bsl | 2 +- .../Module.bsl | 442 +- .../БизнесПроцессыИЗадачиВызовСервера.mdo | 2 - .../БизнесПроцессыИЗадачиКлиент/Module.bsl | 311 +- .../Module.bsl | 13 +- .../БизнесПроцессыИЗадачиСервер/Module.bsl | 302 +- .../CommonModules/ВариантыОтчетов/Module.bsl | 675 +- .../ВариантыОтчетовКлиент/Module.bsl | 242 +- .../ВариантыОтчетовКлиентСервер/Module.bsl | 3 - .../Module.bsl | 55 +- .../ВариантыОтчетовПовтИсп/Module.bsl | 19 +- .../ВерсионированиеОбъектов/Module.bsl | 39 +- .../CommonModules/Взаимодействия/Module.bsl | 1554 +- .../ВзаимодействияВызовСервера/Module.bsl | 146 +- .../ВзаимодействияКлиент/Module.bsl | 105 +- .../ВзаимодействияКлиентСервер/Module.bsl | 70 +- .../Module.bsl | 18 - .../ВыгрузкаЗагрузкаДанных/Module.bsl | 2579 -- .../Module.bsl | 96 - ...ВыгрузкаЗагрузкаДанныхПереопределяемый.mdo | 11 - .../CommonModules/ГрафикиРаботы/Module.bsl | 637 + .../ГрафикиРаботы.mdo} | 6 +- .../Module.bsl | 20 +- .../ГрафикиРаботыКлиентСервер.mdo} | 4 +- .../Module.bsl | 2 +- .../ДатыЗапретаИзмененияСлужебный/Module.bsl | 73 +- .../ДлительныеОперации/Module.bsl | 104 +- .../ДополнительныеОтчетыИОбработки/Module.bsl | 845 +- .../Module.bsl | 2 +- .../Module.bsl | 39 +- .../Module.bsl | 4 +- .../Module.bsl | 93 +- .../Module.bsl | 13 +- .../Module.bsl | 15 +- .../Module.bsl | 453 +- .../Module.bsl | 3 +- .../Module.bsl | 139 +- .../Module.bsl | 18 +- .../Module.bsl | 31 +- .../Module.bsl | 24 +- .../ЖурналРегистрации/Module.bsl | 163 +- .../ЖурналРегистрацииВызовСервера/Module.bsl | 18 + .../ЖурналРегистрацииВызовСервера.mdo} | 6 +- .../ЖурналРегистрацииКлиент/Module.bsl | 125 +- .../ЗаметкиПользователяСлужебный/Module.bsl | 36 +- .../Module.bsl | 28 +- .../Module.bsl | 267 +- .../ЗащитаПерсональныхДанных/Module.bsl | 20 + .../ЗащитаПерсональныхДанныхКлиент/Module.bsl | 20 + .../ЗащитаПерсональныхДанныхКлиент.mdo} | 6 +- .../ИнформацияПриЗапуске/Module.bsl | 4 +- .../ИнформацияПриЗапускеКлиент/Module.bsl | 7 +- .../КалендарныеГрафики/Module.bsl | 664 +- .../Module.bsl | 27 +- .../Module.bsl | 71 - .../КомандыРаботыСБизнесПроцессамиКлиент.mdo | 10 - .../КомандыРаботыСФайламиКлиент/Module.bsl | 143 - .../КонтактнаяИнформацияXML/Module.bsl | 80 +- .../Module.bsl | 135 +- .../Module.bsl | 23 +- .../КонтактнаяИнформацияСлужебный/Module.bsl | 1596 +- .../Module.bsl | 8 + .../Module.bsl | 10 +- .../Module.bsl | 16 + ...огоОбновленияКонфигурацииВызовСервера.mdo} | 4 +- .../Module.bsl | 19 +- .../Module.bsl | 48 +- .../Module.bsl | 13 +- ...ческогоОбновленияКонфигурацииСлужебный.mdo | 11 + .../Module.bsl | 14 +- .../Module.bsl | 14 - .../НапоминанияПользователяКлиент/Module.bsl | 37 +- .../Module.bsl | 22 +- .../Module.bsl | 98 +- .../Module.bsl | 15 +- .../НастройкиПользователейКлиент/Module.bsl | 14 +- .../ОбменДаннымиВМоделиСервиса/Module.bsl | 127 +- .../Module.bsl | 5 +- .../Module.bsl | 4 +- .../ОбменДаннымиВызовСервера/Module.bsl | 38 +- .../ОбменДаннымиКлиент/Module.bsl | 609 +- .../ОбменДаннымиКлиентСервер/Module.bsl | 8 +- .../ОбменДаннымиПовтИсп/Module.bsl | 133 +- .../ОбменДаннымиСервер/Module.bsl | 748 +- .../ОбменДаннымиСобытия/Module.bsl | 120 +- .../CommonModules/ОбменСообщениями/Module.bsl | 32 +- .../ОбменСообщениямиВнутренний/Module.bsl | 6 +- .../ОбменСообщениямиПовтИсп/Module.bsl | 2 +- .../ОбновлениеИнформационнойБазы/Module.bsl | 501 +- .../Module.bsl | 4 +- .../Module.bsl | 7 +- .../Module.bsl | 75 +- .../Module.bsl | 47 +- .../Module.bsl | 55 +- .../Module.bsl | 3 +- .../ОбновлениеКонфигурации/Module.bsl | 27 +- .../ОбновлениеКонфигурацииКлиент/Module.bsl | 1141 +- .../Module.bsl | 26 + .../Module.bsl | 4 +- .../CommonModules/ОбщегоНазначения/Module.bsl | 2547 +- .../ОбщегоНазначенияВызовСервера/Module.bsl | 45 +- .../Module.bsl | 85 - ...НазначенияВызовСервераПереопределяемый.mdo | 11 - .../ОбщегоНазначенияГлобальный/Module.bsl | 23 + .../ОбщегоНазначенияГлобальный.mdo} | 7 +- .../ОбщегоНазначенияКлиент/Module.bsl | 776 +- .../Module.bsl | 119 +- .../ОбщегоНазначенияКлиентПовтИсп/Module.bsl | 28 +- .../ОбщегоНазначенияКлиентСервер/Module.bsl | 485 +- .../Module.bsl | 68 +- .../ОбщегоНазначенияПовтИсп/Module.bsl | 93 +- .../ОбщегоНазначенияПовтИсп.mdo | 1 - .../ОрганизацииСлужебный/Module.bsl | 137 +- SSL/src/CommonModules/ОтправкаSMS/Module.bsl | 67 +- .../ОтправкаSMSПереопределяемый.mdo | 2 +- .../ОтправкаSMSЧерезБилайн/Module.bsl | 115 +- .../ОтправкаSMSЧерезМТС/Module.bsl | 21 +- .../Module.bsl | 0 ...ПроизводительностиВызовСервераПовтИсп.mdo} | 4 +- .../Module.bsl | 25 +- .../ОценкаПроизводительностиКлиент/Module.bsl | 154 +- .../Module.bsl | 4 +- .../Module.bsl | 16 - .../CommonModules/ОчередьЗаданий/Module.bsl | 6 +- .../ОчередьЗаданийСлужебный/Module.bsl | 62 +- .../ОчередьЗаданийСлужебныйПовтИсп/Module.bsl | 2 +- .../Module.bsl | 28 +- .../ПерепрефиксацияОбъектов/Module.bsl | 34 +- .../ПолнотекстовыйПоискКлиент/Module.bsl | 39 - .../ПолнотекстовыйПоискСервер/Module.bsl | 28 +- .../ПолучениеФайловИзИнтернета/Module.bsl | 47 +- .../Module.bsl | 16 +- .../Module.bsl | 219 +- .../Module.bsl | 2 +- SSL/src/CommonModules/Пользователи/Module.bsl | 228 +- .../ПользователиСлужебный/Module.bsl | 833 +- .../Module.bsl | 153 +- .../Module.bsl | 18 +- .../Module.bsl | 18 + ...зователиСлужебныйВМоделиСервисаПовтИсп.mdo | 12 + .../Module.bsl | 21 + .../ПользователиСлужебныйКлиент/Module.bsl | 88 +- .../ПользователиСлужебныйПовтИсп/Module.bsl | 10 +- .../ПоставляемыеДанные/Module.bsl | 4 +- .../ПрефиксацияОбъектовПовтИсп.mdo | 2 +- .../Module.bsl | 0 .../ПрефиксацияОбъектовСлужебный.mdo} | 6 +- .../ПрефиксацияОбъектовСобытия/Module.bsl | 19 +- .../ПрисоединенныеФайлы/Module.bsl | 75 +- .../ПрисоединенныеФайлыКлиент/Module.bsl | 335 +- .../Module.bsl | 31 - .../ПрисоединенныеФайлыСлужебный/Module.bsl | 161 +- .../Module.bsl | 20 +- .../Module.bsl | 1132 +- .../Module.bsl | 15 - ...гальностиПолученияОбновленияГлобальный.mdo | 11 - .../Module.bsl | 94 +- .../РаботаВМоделиСервиса/Module.bsl | 357 +- .../РаботаВМоделиСервисаКлиент/Module.bsl | 28 + .../РаботаВМоделиСервисаКлиент.mdo} | 6 +- .../CommonModules/РаботаСБанками/Module.bsl | 43 +- .../РаботаСБанкамиКлиент/Module.bsl | 10 +- .../РаботаСБанкамиПереопределяемый.mdo | 2 +- .../РаботаСКурсамиВалют/Module.bsl | 84 +- .../РаботаСКурсамиВалютКлиент/Module.bsl | 11 +- .../Module.bsl | 52 +- .../РаботаСКурсамиВалютПереопределяемый.mdo | 2 +- .../РаботаСПочтовымиСообщениями/Module.bsl | 64 +- .../Module.bsl | 42 +- .../CommonModules/РаботаСФайлами/Module.bsl | 8 +- .../РаботаСФайламиВызовСервера/Module.bsl | 15 - .../Module.bsl | 53 - ...таСФайламиВызовСервераПереопределяемый.mdo | 11 - .../РаботаСФайламиКлиент/Module.bsl | 1277 +- .../РаботаСФайламиПереопределяемый/Module.bsl | 4 +- .../РаботаСФайламиСлужебный/Module.bsl | 364 +- .../Module.bsl | 176 +- .../РаботаСФайламиСлужебныйКлиент/Module.bsl | 11390 +++++--- .../Module.bsl | 9 +- .../CommonModules/РассылкаОтчетов/Module.bsl | 763 +- .../РассылкаОтчетовВызовСервера/Module.bsl | 3 +- .../РассылкаОтчетовКлиент/Module.bsl | 276 +- .../РассылкаОтчетовКлиентСервер/Module.bsl | 57 +- .../Module.bsl | 111 +- .../РассылкаОтчетовПовтИсп/Module.bsl | 43 +- .../РегламентныеЗаданияКлиент/Module.bsl | 29 - .../РегламентныеЗаданияСлужебный/Module.bsl | 978 +- .../Module.bsl | 45 - ...гламентныеЗаданияСлужебныйВызовСервера.mdo | 10 - .../Module.bsl | 70 - .../Module.bsl | 245 - .../РегламентныеЗаданияСлужебныйКлиент.mdo | 10 - .../Module.bsl | 8 +- .../РезервноеКопированиеИБКлиент/Module.bsl | 274 +- .../РезервноеКопированиеИБСервер/Module.bsl | 371 +- .../Module.bsl | 118 +- .../Module.bsl | 6 +- .../Module.bsl | 23 +- .../Module.bsl | 11 + SSL/src/CommonModules/СоединенияИБ/Module.bsl | 62 +- .../Module.bsl | 3 + .../СоединенияИБВызовСервераПовтИсп.mdo} | 4 +- .../СоединенияИБГлобальный/Module.bsl | 51 +- .../СоединенияИБКлиент/Module.bsl | 163 +- .../СоединенияИБКлиентСервер/Module.bsl | 20 +- .../Module.bsl | 4 +- .../СообщенияВМоделиСервиса/Module.bsl | 4 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 30 +- .../Module.bsl | 26 +- .../Module.bsl | 2 +- .../Module.bsl | 2 +- .../Module.bsl | 116 +- .../Module.bsl | 16 + .../СтандартныеПодсистемыГлобальный.mdo} | 6 +- .../СтандартныеПодсистемыКлиент/Module.bsl | 2380 +- .../Module.bsl | 36 +- .../Module.bsl | 36 +- .../СтандартныеПодсистемыПовтИсп/Module.bsl | 44 +- .../СтандартныеПодсистемыСервер/Module.bsl | 952 +- .../СтроковыеФункцииКлиентСервер/Module.bsl | 376 +- .../Module.bsl | 20 + .../УправлениеДоступом/Module.bsl | 2725 +- .../Module.bsl | 229 +- .../УправлениеДоступомСлужебный/Module.bsl | 2670 +- .../Module.bsl | 38 +- .../Module.bsl | 130 + ...правлениеДоступомСлужебныйВызовСервера.mdo | 10 + .../Module.bsl | 453 + .../УправлениеДоступомСлужебныйКлиент.mdo | 10 + .../Module.bsl | 430 + ...равлениеДоступомСлужебныйКлиентСервер.mdo} | 6 +- .../Module.bsl | 370 +- .../Module.bsl | 1 - .../Module.bsl | 136 +- .../Module.bsl | 574 +- .../Module.bsl | 87 - ...ниеКонтактнойИнформациейКлассификаторы.mdo | 12 - .../Module.bsl | 1040 +- .../Module.bsl | 14 +- .../УправлениеПечатью/Module.bsl | 530 +- .../УправлениеПечатьюMSWordКлиент/Module.bsl | 63 +- .../Module.bsl | 58 +- .../УправлениеПечатьюВызовСервера/Module.bsl | 2 +- .../УправлениеПечатьюКлиент/Module.bsl | 1161 +- .../Module.bsl | 6 +- .../Module.bsl | 237 + .../УправлениеПечатьюСлужебныйКлиент.mdo | 10 + .../УправлениеСвойствами/Module.bsl | 132 +- .../УправлениеСвойствамиКлиент/Module.bsl | 3 +- .../УправлениеСвойствамиСлужебный/Module.bsl | 133 +- .../УправлениеЭлектроннойПочтой/Module.bsl | 55 +- .../ФайловыеФункцииСлужебный/Module.bsl | 76 +- .../Module.bsl | 19 +- .../ФайловыеФункцииСлужебныйКлиент/Module.bsl | 271 +- .../Module.bsl | 47 +- .../ФизическиеЛицаКлиентСервер/Module.bsl | 11 +- .../Module.bsl | 63 +- .../ФормаОтчетаПереопределяемый/Module.bsl | 88 +- .../ФункцииОтчетовКлиентСервер/Module.bsl | 342 +- .../Module.bsl | 244 +- .../ЭлектроннаяПодпись.mdo} | 2 +- .../Module.bsl | 136 +- .../ЭлектроннаяПодписьКлиент.mdo} | 2 +- .../Module.bsl | 61 +- .../ЭлектроннаяПодписьКлиентСервер.mdo} | 2 +- .../Module.bsl | 3 +- .../ЭлектроннаяПодписьПовтИсп.mdo} | 2 +- .../CommonModules/ЭлектроннаяПочта/Module.bsl | 42 +- .../Picture.png | Bin .../Администрирование48.mdo} | 4 +- .../Picture.png | Bin 1100 -> 1421 bytes .../Picture.png | Bin 681 -> 0 bytes ...йСеансДляВыполненияРегламентныхЗаданий.mdo | 12 - .../ЗаставкаВнешнейОперации/Picture.png | Bin 43519 -> 16887 bytes .../ЗаставкаВнешнейОперации83/Picture.png | Bin 16887 -> 0 bytes .../ЗаставкаВнешнейОперации83.mdo | 8 - .../КоличествоРассмотрено/Picture.png | Bin 0 -> 3013 bytes .../КоличествоРассмотрено.mdo | 8 + .../Picture.png | Bin 882 -> 0 bytes ...НастройкаВыполненияРегламентныхЗаданий.mdo | 12 - .../Picture.png | Bin 802 -> 0 bytes .../ОшибкаВыполненияРегламентныхЗаданий.mdo | 12 - .../ПиктограммыЭлементов/Picture.png | Bin 1661 -> 6571 bytes .../{ПодписанЭЦП => ПодписанЭП}/Picture.png | Bin .../ПодписанЭП.mdo} | 2 +- .../РаспространяетсяВИерархии/Picture.png | Bin 434 -> 0 bytes .../РаспространяетсяВИерархии.mdo | 8 - SSL/src/CommonPictures/Успешно32/Picture.png | Bin 0 -> 983 bytes .../CommonPictures/Успешно32/Успешно32.mdo | 8 + .../Picture.png | Bin ...тьПризнакРассмотреноДляВзаимодействия.mdo} | 2 +- .../ИзвлечениеКодовОбщихДанных/Template.bin | 66 - .../ИзвлечениеКодовОбщихДанных.mdo | 9 - .../ru.html | 2 +- .../КомпонентаПечатиQRКода/Template.bin | Bin 406366 -> 0 bytes .../КомпонентаПечатиQRКода.mdo | 10 - SSL/src/Configuration/Configuration.mdo | 216 +- SSL/src/Configuration/Logo.png | Bin 4363 -> 3673 bytes .../ManagedApplicationModule.bsl | 20 +- .../OrdinaryApplicationModule.bsl | 20 +- .../Configuration/ParentConfigurations.bin | 2 +- SSL/src/Configuration/Splash.bmp | Bin 100816 -> 0 bytes SSL/src/Configuration/Splash.png | Bin 0 -> 36962 bytes .../ВыполнятьПроверкуЭПНаСервере.mdo} | 2 +- .../ValueManagerModule.bsl | 0 .../ИдентификаторИнформационнойБазы.mdo | 23 + .../ValueManagerModule.bsl | 4 +- .../ValueManagerModule.bsl | 11 + .../ИспользоватьНесколькоОрганизаций.mdo | 19 + .../ValueManagerModule.bsl | 20 +- .../ИспользоватьЭлектронныеПодписи.mdo} | 2 +- .../КаталогОбменаФайламиВМоделиСервиса.mdo} | 4 +- .../ValueManagerModule.bsl} | 0 ...талогОбменаФайламиВМоделиСервисаLinux.mdo} | 4 +- ...КаталогСообщенийОбменаДаннымиДляLinux.mdo} | 4 +- .../ValueManagerModule.bsl | 0 ...талогСообщенийОбменаДаннымиДляWindows.mdo} | 4 +- .../НеИспользоватьНесколькоОрганизаций.mdo | 19 + .../ValueManagerModule.bsl | 461 +- .../ValueManagerModule.bsl | 10 +- .../ПровайдерЭП.mdo} | 2 +- .../ТипПровайдераЭП.mdo} | 2 +- .../Forms/Форма/Form.form | 32 +- .../Forms/Форма/Module.bsl | 12 +- .../Help/ru.html | 2 +- .../Forms/Форма/Form.form | 22 +- .../Forms/Форма/Module.bsl | 10 +- .../Help/ru.html | 2 +- .../Form.form | 783 +- .../Help/ru.html | 2 +- .../Module.bsl | 63 +- .../АктивныеПользователи/Help/ru.html | 2 +- .../Form.form | 40 +- .../Forms/Форма/Form.form | 110 +- .../Forms/Форма/Module.bsl | 64 +- .../Help/ru.html | 2 +- .../Forms/ВводАдреса/Form.form | 328 +- .../Forms/ВводАдреса/Help/ru.html | 2 +- .../Forms/ВводАдреса/Module.bsl | 478 +- .../Forms/ВводТелефона/Form.form | 90 +- .../Forms/ВводТелефона/Module.bsl | 46 +- .../Forms/НаселенныйПунктАдреса/Form.form | 23 +- .../Forms/НаселенныйПунктАдреса/Module.bsl | 51 +- .../ПоискАдресаПоПочтовомуИндексу/Form.form | 827 + .../ПоискАдресаПоПочтовомуИндексу/Module.bsl | 101 + .../ВводКонтактнойИнформации.mdo | 9 + .../Forms/Форма/Form.form | 163 +- .../Forms/Форма/Module.bsl | 6 +- .../CommandModule.bsl | 5 + .../Forms/ВыборВидаОбъектов/Form.form | 326 + .../Forms/ВыборВидаОбъектов/Module.bsl | 337 + .../Список}/ExtInfo/ListSettings.dcss | 2 + .../Forms/ВыбранныеЭлементы/Form.form | 820 + .../Forms/ВыбранныеЭлементы/Module.bsl | 115 + .../Form.form | 389 +- .../Help/ru.html | 5 +- .../Module.bsl | 17 +- .../Forms/Форма/ConditionalAppearance.dcssca | 4 +- .../Forms/Форма/Form.form | 3042 ++- .../Forms/Форма/Module.bsl | 4168 ++- .../ГрупповоеИзменениеОбъектов/Help/ru.html | 4 +- .../ManagerModule.bsl | 368 - .../ObjectModule.bsl | 1243 +- .../Templates/ФильтрРеквизитов/Template.txt | 26 +- .../ГрупповоеИзменениеОбъектов.mdo | 300 +- .../Forms/ЖурналРегистрации/Form.form | 184 +- .../Forms/ЖурналРегистрации/Module.bsl | 21 +- .../Forms/ОтборЖурналаРегистрации/Form.form | 182 +- .../Forms/ОтборЖурналаРегистрации/Module.bsl | 4 +- .../Forms/РедакторСоставаСвойства/Form.form | 48 +- .../Forms/РедакторСоставаСвойства/Module.bsl | 9 +- .../Forms/ФормаСобытия/Form.form | 274 +- .../Forms/ФормаСобытия/Help/ru.html | 2 +- .../Forms/ФормаСобытия/Module.bsl | 6 +- .../ЖурналРегистрации/Help/ru.html | 2 +- .../ЗагрузкаКурсовВалют/Forms/Форма/Form.form | 78 +- .../Forms/Форма/Module.bsl | 13 +- .../ЗагрузкаКурсовВалют/Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ConditionalAppearance.dcssca | 143 + .../Forms/ЗаменаЭлементов/Form.form | 2237 ++ .../Forms/ЗаменаЭлементов/Help/ru.html | 3 + .../КартинкаДлительнойОперации2/Picture.gif | Bin 0 -> 14354 bytes .../Forms/ЗаменаЭлементов/Module.bsl | 1563 ++ .../МногострочноеПредупреждение/Form.form | 337 + .../МногострочноеПредупреждение/Module.bsl | 41 + .../ConditionalAppearance.dcssca | 259 + .../Forms/ОбъединениеЭлементов/Form.form | 3002 +++ .../Forms/ОбъединениеЭлементов/Help/ru.html | 5 + .../КартинкаДлительнойОперации1/Picture.gif | Bin 0 -> 14354 bytes .../КартинкаДлительнойОперации2/Picture.gif | Bin 0 -> 14354 bytes .../Forms/ОбъединениеЭлементов/Module.bsl | 1740 ++ .../ЗаменаСсылок/ManagerModule.bsl | 12 + .../ЗаменаСсылок/ObjectModule.bsl | 0 .../Template.dcs | 262 + .../ЗаменаСсылок/ЗаменаСсылок.mdo | 59 + .../Forms/Форма/Form.form | 215 +- .../Forms/Форма/Module.bsl | 14 +- .../ВыборВидаОбъектаСоставаУзла/Form.form | 30 +- .../ОбщиеПараметрыСинхронизации/Form.form | 4 +- .../РедактированиеПериодаИОтбора/Form.form | 27 +- .../РедактированиеПериодаИОтбора/Module.bsl | 2 +- .../РедактированиеСоставаНастроек/Form.form | 34 +- .../РедактированиеСоставаНастроек/Module.bsl | 77 +- .../Forms/СоставВыгрузки/Form.form | 34 +- .../Forms/СоставВыгрузки/Module.bsl | 12 +- .../Forms/Форма/Form.form | 74 +- .../Forms/Форма/Module.bsl | 95 +- .../ObjectModule.bsl | 189 +- .../Forms/Форма/Form.form | 14 +- .../Forms/Форма/Module.bsl | 20 +- .../ИнформацияПриЗапуске/Help/ru.html | 2 +- .../Forms/Форма/Form.form | 62 +- .../Forms/Форма/Module.bsl | 6 +- .../ObjectModule.bsl | 186 +- .../ObjectModule.bsl | 43 +- .../Form.form | 39 +- .../Module.bsl | 43 +- .../УсловияРаспространенияОбновлений/ru.html | 2 +- .../Forms/НапоминаниеКлиентСервер}/Form.form | 399 +- .../Forms/НапоминаниеКлиентСервер/Module.bsl | 51 + .../Form.form | 3556 --- .../Module.bsl | 820 - .../Forms/Форма}/Form.form | 1967 +- .../Forms/Форма/Module.bsl | 474 + .../Help/ru.html | 2 +- .../НастройкаРезервногоКопированияИБ.mdo | 157 +- .../Forms/НастройкаБезИнтервалов/Form.form | 106 +- .../Forms/НастройкаБезИнтервалов/Module.bsl | 43 +- .../Forms/НастройкаСИнтервалами/Form.form | 118 +- .../Forms/НастройкаСИнтервалами/Module.bsl | 41 +- .../ManagerModule.bsl | 11 +- .../Forms/ВыборНастроек/Form.form | 205 +- .../Forms/ВыборНастроек/Help/ru.html | 2 +- .../Forms/ВыборНастроек/Module.bsl | 20 +- .../Forms/ВыборПользователей/Form.form | 114 +- .../Forms/ВыборПользователей/Help/ru.html | 2 +- .../Forms/ВыборПользователей/Module.bsl | 18 +- .../Form.form | 48 +- .../Help/ru.html | 2 +- .../Module.bsl | 114 +- .../Forms/НастройкиПользователей/Form.form | 326 +- .../Forms/НастройкиПользователей/Help/ru.html | 2 +- .../Forms/НастройкиПользователей/Module.bsl | 570 +- .../ОчисткаНастроекПользователей/Form.form | 38 +- .../ОчисткаНастроекПользователей/Help/ru.html | 2 +- .../ОчисткаНастроекПользователей/Module.bsl | 55 +- .../Form.form | 10 +- .../НерекомендуемаяВерсияПлатформы/Form.form | 55 +- .../НерекомендуемаяВерсияПлатформы/Module.bsl | 56 +- .../ПорядокОбновленияПлатформы/Form.form | 12 +- .../ПорядокОбновленияПлатформы/Module.bsl | 27 +- .../ru.html | 8 +- .../Template.htmldoc | 4 - .../ru.html | 21 - .../_files/Download1.png | Bin .../_files/Download11.png | Bin 0 -> 94896 bytes .../_files/Safe2.png | Bin .../_files/Safe21.png | Bin 0 -> 158964 bytes .../_files/UserSite1.png | Bin .../_files/UserSite11.png | Bin 0 -> 83487 bytes .../_files/Платф1.jpg | Bin .../_files/Платф11.jpg | Bin 0 -> 128815 bytes .../_files/Уст1.png | Bin .../_files/Уст11.png | Bin 0 -> 115180 bytes .../_files/запуск.png | Bin .../_files/запуск1.png | Bin 0 -> 24982 bytes .../_files/шаг12.png | Bin .../_files/шаг121.png | Bin 0 -> 37956 bytes .../_files/шаг2.png | Bin .../_files/шаг21.png | Bin 0 -> 24638 bytes .../_files/шаг31.png | Bin .../_files/шаг311.png | Bin 0 -> 25447 bytes .../_files/шаг4.png | Bin .../_files/шаг41.png | Bin 0 -> 27923 bytes .../_files/шаг5.png | Bin .../_files/шаг51.png | Bin 0 -> 71213 bytes .../_files/шаг6.png | Bin .../_files/шаг61.png | Bin 0 -> 42094 bytes .../ПорядокОбновленияДляФайловойБазы/ru.html | 49 +- .../Template.htmldoc | 4 - .../ru.html | 41 - .../НерекомендуемаяВерсияПлатформы.mdo | 16 - .../Forms/ИндикацияХодаОбновленияИБ/Form.form | 16 +- .../ИндикацияХодаОбновленияИБ/Module.bsl | 192 +- .../Form.form | 367 +- .../Module.bsl | 18 +- .../Forms/ОтложенныеОбработчики/Form.form | 64 +- .../Forms/ОтложенныеОбработчики/Module.bsl | 22 +- .../СообщениеОНеудачномОбновлении/Form.form | 18 +- .../ОбновлениеИнформационнойБазы.mdo | 1 + .../Forms/НастройкаРасписания/Form.form | 563 +- .../Forms/НастройкаРасписания/Module.bsl | 56 +- .../Forms/НастройкаРезервнойКопии/Form.form | 83 +- .../Forms/НастройкаРезервнойКопии/Module.bsl | 8 +- .../Forms/Обозреватель/Form.form | 24 +- .../Forms/ПредупреждениеWMI/Form.form | 14 +- .../Forms/Форма/Form.form | 3772 +-- .../Forms/Форма/Module.bsl | 475 +- .../ОбновлениеКонфигурации/Help/ru.html | 11 +- .../Template.txt | 9 +- .../Template.txt | 23 +- .../ОбновлениеКонфигурации.mdo | 14 +- .../Form.form | 34 +- .../Module.bsl | 66 +- .../Forms/ИсторияВыполнения/Form.form | 104 +- .../Forms/Форма/Form.form | 234 +- .../Forms/Форма/Module.bsl | 216 +- .../Forms/ФормаОтбора/Form.form | 24 +- .../ОценкаПроизводительности/Help/ru.html | 2 +- .../ОценкаПроизводительности/ObjectModule.bsl | 14 +- .../CommandModule.bsl | 4 +- .../CommandModule.bsl | 26 - .../НастройкиПользователейИПрав/Form.form | 160 +- .../НастройкиПользователейИПрав/Help/ru.html | 8 +- .../НастройкиПользователейИПрав/Module.bsl | 89 +- .../Forms/НастройкиРаботыСФайлами/Form.form | 220 +- .../НастройкиРаботыСФайлами/Help/ru.html | 6 +- .../Forms/НастройкиРаботыСФайлами/Module.bsl | 12 +- .../Form.form | 264 +- .../НастройкиСинхронизацииДанных/Help/ru.html | 32 + .../Module.bsl | 20 +- .../Forms/ОбщиеНастройки/Form.form | 371 +- .../Forms/ОбщиеНастройки/Help/ru.html | 17 +- .../Forms/ОбщиеНастройки/Module.bsl | 23 +- .../Forms/Органайзер/Form.form | 220 +- .../Forms/Органайзер/Help/ru.html | 2 +- .../Forms/Органайзер/Module.bsl | 19 +- .../ПечатныеФормыОтчетыИОбработки/Form.form | 56 +- .../Help/ru.html | 2 +- .../ПечатныеФормыОтчетыИОбработки/Module.bsl | 4 +- .../Forms/ПоддержкаИОбслуживание/Form.form | 1294 +- .../Forms/ПоддержкаИОбслуживание/Help/ru.html | 8 +- .../Forms/ПоддержкаИОбслуживание/Module.bsl | 189 +- .../Forms/СинхронизацияДанных/Help/ru.html | 19 - .../Form.form | 1075 - .../Help/ru.html | 13 - .../Form.form | 78 +- .../Help/ru.html | 2 +- .../Module.bsl | 22 +- .../ПанельАдминистрированияБСП/Help/ru.html | 5 +- .../ManagerModule.bsl | 61 + .../ПанельАдминистрированияБСП.mdo | 47 +- .../CommandModule.bsl | 26 + .../Form.form | 26 +- .../Help/ru.html | 4 +- .../Module.bsl | 6 +- .../Form.form | 1286 + .../Help/ru.html | 26 + .../Module.bsl | 31 +- ...нельАдминистрированияБСПВМоделиСервиса.mdo | 50 + .../ПереносФайловВТома/Forms/Форма/Form.form | 30 +- .../ПереносФайловВТома/Forms/Форма/Module.bsl | 38 +- .../Forms/ФормаОтчета/Form.form | 6 +- .../ПереносФайловВТома/Help/ru.html | 2 +- .../Forms/УпрощеннаяФорма/Form.form | 7 +- .../Forms/УпрощеннаяФорма/Module.bsl | 4 +- .../Forms/Форма/Form.form | 49 +- .../Forms/Форма/Module.bsl | 42 +- .../ПолнотекстовыйПоискВДанных/Help/ru.html | 2 +- .../Forms/Форма/Form.form | 759 +- .../Forms/Форма/Module.bsl | 406 +- .../Help/ru.html | 2 +- .../Forms/Форма/Form.form | 1586 +- .../Forms/Форма/Module.bsl | 454 +- .../ОтключениеСинхронизацииДанных/Form.form | 52 +- .../ОтключениеСинхронизацииДанных/Module.bsl | 8 +- .../ПолучениеДанныхКорреспондента/Form.form | 22 +- .../ПолучениеДанныхКорреспондента/Module.bsl | 2 +- .../Forms/Форма/Form.form | 710 +- .../Forms/Форма/Module.bsl | 148 +- .../Forms/ДополнительноеОписание/Form.form | 4 +- .../Form.form | 427 +- .../Module.bsl | 15 +- .../Forms/НастройкаНаСторонеСервиса/Form.form | 572 +- .../НастройкаНаСторонеСервиса/Module.bsl | 73 +- .../ManagerModule.bsl | 3 +- .../ObjectModule.bsl | 6 +- .../ru.html | 2 +- .../ru.html | 2 +- .../Forms/ДополнительноеОписание/Form.form | 4 +- .../Form.form | 16 +- .../Forms/Форма/Form.form | 2574 +- .../Forms/Форма/Module.bsl | 615 +- .../Help/ru.html | 2 +- .../ObjectModule.bsl | 4 +- .../КакОпределитьПараметрыПодключения/ru.html | 2 +- .../ru.html | 2 +- .../ru.html | 2 +- .../ru.html | 2 +- .../ru.html | 2 +- .../Forms/ВыборКонстанты/Form.form | 56 +- .../Forms/ВыборКонстанты/Module.bsl | 13 +- .../СписокДанных/ExtInfo/ListSettings.dcss | 2 + .../Forms/ВыборОбъектовОтбором/Form.form | 92 +- .../Forms/ВыборОбъектовОтбором/Module.bsl | 12 +- .../Forms/ВыборУзлаПланаОбмена/Form.form | 50 +- .../Forms/ВыборУзлаПланаОбмена/Module.bsl | 36 +- .../Forms/Настройки/Form.form | 62 +- .../Forms/Настройки/Module.bsl | 40 +- .../НомераСообщенийУзлаПланаОбмена/Form.form | 20 +- .../НомераСообщенийУзлаПланаОбмена/Module.bsl | 6 +- .../СообщениеОбОбычномИнтерфейсе/Form.oform | Bin 8033 -> 8402 bytes .../Forms/УзлыРегистрацииОбъекта/Form.form | 86 +- .../Forms/УзлыРегистрацииОбъекта/Module.bsl | 141 +- .../СписокКонстант/ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../СписокСсылок/ExtInfo/ListSettings.dcss | 2 + .../Forms/Форма/Form.form | 530 +- .../Forms/Форма/Module.bsl | 751 +- .../ObjectModule.bsl | 462 +- .../РегистрацияИзмененийДляОбменаДанными.mdo | 2 +- .../ВыполнениеРегламентныхЗаданий/Form.form | 972 - .../ВыполнениеРегламентныхЗаданий/Module.bsl | 155 - .../Form.form | 502 - .../Help/ru.html | 35 - .../Module.bsl | 122 - .../Form.form | 22 - .../Forms/РегламентноеЗадание/Form.form | 86 +- .../Forms/РегламентноеЗадание/Help/ru.html | 4 +- .../Forms/РегламентноеЗадание/Module.bsl | 93 +- .../РегламентныеИФоновыеЗадания/Form.form | 428 +- .../РегламентныеИФоновыеЗадания/Module.bsl | 324 +- .../Forms/ФоновоеЗадание/Form.form | 58 +- .../Forms/ФоновоеЗадание/Help/ru.html | 2 +- .../Forms/ФоновоеЗадание/Module.bsl | 4 +- .../РегламентныеИФоновыеЗадания/Help/ru.html | 12 +- .../РегламентныеИФоновыеЗадания.mdo | 32 - .../CommandModule.bsl | 3 +- .../Form.form | 1530 ++ .../Help/ru.html | 2 +- .../Module.bsl | 423 +- .../РезервноеКопированиеДанных/Form.form | 2207 ++ .../Help/ru.html | 2 +- .../Module.bsl | 663 +- .../Form.form | 3440 --- .../ЗаставкаВосстановления/Template.txt | 2 + .../Template.txt | 2 + .../МакетФайлаЗагрузкаИБ/Template.txt | 11 +- .../Template.txt | 71 +- .../РезервноеКопированиеИБ.mdo | 207 +- .../Forms/ОсновнаяФорма/Form.form | 4 +- .../Help/ru.html | 2 +- .../Forms/Форма/Form.form | 103 +- .../Forms/Форма/Module.bsl | 35 +- .../ManagerModule.bsl | 2 +- .../СогласиеНаОбработкуПерсональныхДанных.mdo | 5 +- .../Form.form | 44 +- .../Forms/НастройкаПолейТаблицы/Form.form | 40 +- .../Form.form | 48 +- .../Forms/НастройкаСортировки/Form.form | 46 +- .../Form.form | 202 +- .../Module.bsl | 2 +- .../Forms/Форма/Form.form | 298 +- .../Forms/Форма/Module.bsl | 299 +- .../ФормаВыбораСвязиСопоставления/Form.form | 138 +- .../Help/ru.html | 2 +- .../ObjectModule.bsl | 18 +- .../ExtInfo/ListSettings.dcss | 2 + .../Forms/АрхивАнкет/Form.form | 68 +- .../СписокРеспондента/Forms/Форма/Form.form | 46 +- .../СписокРеспондента/Forms/Форма/Module.bsl | 4 +- .../ObjectModule.bsl | 39 +- .../ConditionalAppearance.dcssca | 58 + .../Forms/ОсновнаяФорма/Form.form | 3955 ++- .../Forms/ОсновнаяФорма/Module.bsl | 1337 +- .../УдалениеПомеченныхОбъектов/Help/ru.html | 2 +- .../ManagerModule.bsl | 921 +- .../CommandModule.bsl | 5 + .../Forms/УправляемаяФорма/Form.form | 1790 +- .../Forms/УправляемаяФорма/Module.bsl | 316 +- .../Form.form | 108 +- .../Module.bsl | 124 +- .../Module.bsl | 57 - .../Forms/Форма/Form.oform | Bin 215017 -> 0 bytes .../Form.oform | Bin 42315 -> 0 bytes .../Form.oform | Bin 5985 -> 0 bytes .../УниверсальныйОбменДаннымиXML/Help/ru.html | 2 +- .../ObjectModule.bsl | 630 +- .../ОбщиеПроцедурыФункции/Template.txt | 86 +- .../ПараметрыОбработчиков/Template.mxlx | 559 +- .../УниверсальныйОбменДаннымиXML.mdo | 51 +- .../Forms/ОсновнаяФорма/Form.form | 354 +- .../Forms/ОсновнаяФорма/Module.bsl | 925 +- .../Forms/ФормаВыбораПериода/Form.form | 12 +- .../Forms/ФормаВыбораПериода/Help/ru.html | 2 +- .../Forms/ФормаВыбораПериода/Module.bsl | 2 +- .../ФормаПараметровПерестроения/Form.form | 10 +- .../ФормаПараметровПерестроения/Help/ru.html | 2 +- .../ФормаПараметровПерестроения/Module.bsl | 2 +- .../УправлениеИтогамиИАгрегатами/Help/ru.html | 2 +- .../Forms/Форма/Form.form | 10 +- .../Help/ru.html | 2 +- .../ВладелецНастроекПрав.mdo | 14 + .../ЗначениеДоступа/ЗначениеДоступа.mdo | 26 + .../Forms/НастройкиРаботыСПочтой/Form.form | 126 +- .../Forms/НастройкиРаботыСПочтой/Help/ru.html | 2 +- .../Forms/НастройкиРаботыСПочтой/Module.bsl | 54 +- .../ПараметрыЭлектронногоПисьма/Form.form | 44 +- .../ПараметрыЭлектронногоПисьма/Help/ru.html | 2 +- .../ПараметрыЭлектронногоПисьма/Module.bsl | 19 +- .../Forms/ПечатьЭлектронногоПисьма/Form.form | 2 +- .../Закладки/ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 77 + .../ExtInfo/ListSettings.dcss | 76 + .../Список/ExtInfo/ListSettings.dcss | 6 +- .../ФормаСписка/ConditionalAppearance.dcssca | 75 - .../Forms/ФормаСписка/Form.form | 3784 ++- .../Forms/ФормаСписка/Help/ru.html | 2 +- .../Forms/ФормаСписка/Module.bsl | 1821 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ФормаСпискаПараметрическая/Form.form | 315 +- .../ФормаСпискаПараметрическая/Help/ru.html | 2 +- .../ФормаСпискаПараметрическая/Module.bsl | 191 +- .../Template.dcs | 125 +- .../Template.dcs | 12 +- .../СхемаОтборВзаимодействия/Template.dcs | 16 +- .../Template.dcs | 233 + .../Взаимодействия/Взаимодействия.mdo | 69 +- .../Анкета/Forms/ФормаДокумента/Form.form | 164 +- .../Анкета/Forms/ФормаДокумента/Help/ru.html | 2 +- .../Анкета/Forms/ФормаДокумента/Module.bsl | 135 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Анкета/Forms/ФормаСписка/Form.form | 74 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Встреча/Forms/ФормаВыбора/Form.form | 74 +- .../Встреча/Forms/ФормаДокумента/Form.form | 253 +- .../Встреча/Forms/ФормаДокумента/Help/ru.html | 2 +- .../Встреча/Forms/ФормаДокумента/Module.bsl | 36 +- SSL/src/Documents/Встреча/ManagerModule.bsl | 9 +- SSL/src/Documents/Встреча/ObjectModule.bsl | 13 +- SSL/src/Documents/Встреча/Встреча.mdo | 103 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 74 +- .../Forms/ФормаДокумента/Form.form | 223 +- .../Forms/ФормаДокумента/Help/ru.html | 2 +- .../Forms/ФормаДокумента/Module.bsl | 34 +- .../Help/ru.html | 2 +- .../ManagerModule.bsl | 11 +- .../ObjectModule.bsl | 12 +- .../ЗапланированноеВзаимодействие.mdo | 102 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 70 +- .../Forms/ФормаДокумента/Form.form | 133 +- .../Forms/ФормаДокумента/Module.bsl | 5 +- .../Респонденты/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаПодбораРеспондентов/Form.form | 144 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 78 +- .../Forms/ФормаДокумента/Form.form | 264 +- .../Forms/ФормаДокумента/Help/ru.html | 2 +- .../Forms/ФормаДокумента/Module.bsl | 33 +- SSL/src/Documents/СообщениеSMS/Help/ru.html | 2 +- .../Documents/СообщениеSMS/ManagerModule.bsl | 8 +- .../Documents/СообщениеSMS/ObjectModule.bsl | 14 +- .../Documents/СообщениеSMS/СообщениеSMS.mdo | 102 +- .../Forms/ФормаДокумента/Form.form | 275 +- .../Forms/ФормаДокумента/Help/ru.html | 2 +- .../Forms/ФормаДокумента/Module.bsl | 37 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 74 +- .../ТелефонныйЗвонок/ManagerModule.bsl | 9 +- .../ТелефонныйЗвонок/ObjectModule.bsl | 12 +- .../ТелефонныйЗвонок/ТелефонныйЗвонок.mdo | 102 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 74 +- .../Forms/ФормаДокумента/Form.form | 280 +- .../Forms/ФормаДокумента/Help/ru.html | 2 +- .../Forms/ФормаДокумента/Module.bsl | 88 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 120 +- .../ManagerModule.bsl | 8 +- .../ObjectModule.bsl | 1 + .../ЭлектронноеПисьмоВходящее.mdo | 102 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 74 +- .../Forms/ФормаДокумента/Form.form | 357 +- .../Forms/ФормаДокумента/Help/ru.html | 2 +- .../Forms/ФормаДокумента/Module.bsl | 284 +- .../Form.form | 42 +- .../ManagerModule.bsl | 6 +- .../ObjectModule.bsl | 1 + .../ЭлектронноеПисьмоИсходящее.mdo | 102 +- .../ДействияПриОбмене/ДействияПриОбмене.mdo | 4 +- .../ДействияПриСохраненииСЭП.mdo} | 2 +- .../ДополнительныеЗначенияДоступа.mdo | 45 + .../ТипыОтветовНаВопрос.mdo | 7 - .../УдалитьВидыКалендарей.mdo | 2 +- ...ЗаписатьЗависимыеНаборыЗначенийДоступа.mdo | 3 +- .../ЗаписатьНаборыЗначенийДоступа.mdo | 3 +- ...КонтрольНеразделенныхОбъектовПриЗаписи.mdo | 10 +- .../ОбновитьГруппыЗначенийДоступа.mdo | 1 - ...ормуПрисоединенногоФайлаВзаимодействия.mdo | 2 +- ...еОпцииИспользоватьНесколькоОрганизаций.mdo | 13 + ...итьПометкуУдаленияЗаметкамПользователя.mdo | 13 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 24 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 24 +- .../Forms/ФормаУзла/Form.form | 16 +- .../Forms/ФормаУзла/Module.bsl | 2 +- .../ОбменСообщениями/ManagerModule.bsl | 16 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ФайлыВТоме/Forms/ФормаСписка/Form.form | 40 +- ...полнительныеОбработкиЗаполненияОбъекта.mdo | 2 +- ...ьныеОбработкиСозданияСвязанныхОбъектов.mdo | 2 +- .../ИспользоватьДополнительныеОтчеты.mdo | 2 +- ...льзоватьДополнительныеОтчетыИОбработки.mdo | 2 - ...спользоватьДополнительныеПечатныеФормы.mdo | 2 +- .../ИспользоватьЗаметки.mdo | 2 +- .../ИспользоватьНапоминанияПользователя.mdo | 2 +- .../ИспользоватьНесколькоОрганизаций.mdo | 11 + .../ИспользоватьПочтовыйКлиент.mdo | 2 +- .../ИспользоватьПризнакРассмотрено.mdo | 26 +- ...атьСинхронизациюДанныхВЛокальномРежиме.mdo | 1 - .../ИспользоватьЭПВПрисоединенныхФайлах.mdo} | 4 +- .../ИспользоватьЭлектронныеПодписи.mdo} | 12 +- .../НеИспользоватьНесколькоОрганизаций.mdo | 12 + .../ОграничиватьДоступНаУровнеЗаписей.mdo | 6 +- ...СтандартныеПодсистемыВАвтономномРежиме.mdo | 4 +- .../СтандартныеПодсистемыВЛокальномРежиме.mdo | 6 +- .../СтандартныеПодсистемыВМоделиСервиса.mdo | 6 +- .../Form.form | 22 +- .../Help/ru.html | 2 +- .../Forms/АдресныйКлассификатор/Form.form | 22 +- .../Forms/АдресныйКлассификатор/Help/ru.html | 2 +- .../Forms/АдресныйКлассификатор/Module.bsl | 2 +- .../ЗагрузкаАдресногоКлассификатора/Form.form | 764 +- .../Help/ru.html | 2 +- .../Module.bsl | 673 +- .../ОчисткаАдресногоКлассификатора/Form.form | 94 +- .../Help/ru.html | 2 +- .../ОчисткаАдресногоКлассификатора/Module.bsl | 53 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаВыбора/Form.form | 66 +- .../Forms/ФормаВыбора/Module.bsl | 26 +- .../АдресныйКлассификатор/Help/ru.html | 2 +- .../Template.txt | 2 - .../Forms/ВыборХранимыхВерсий/Form.form | 68 +- .../Forms/ВыборХранимыхВерсий/Module.bsl | 6 +- .../Forms/ОтчетПоВерсиямОбъекта/Form.form | 2 +- .../Forms/ОтчетПоВерсиямОбъекта/Module.bsl | 44 +- .../Forms/ФормаЗаписи/Form.form | 45 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 42 +- .../Forms/ФормаСписка/Module.bsl | 18 +- .../Forms/ФормаЗаписи/Form.form | 262 +- .../Список/ExtInfo/ListSettings.dcss | 6 + .../ФормаСписка/ConditionalAppearance.dcssca | 128 + .../Forms/ФормаСписка/Form.form | 265 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ГруппыЗначенийДоступа/ManagerModule.bsl | 759 +- .../ГруппыЗначенийДоступа.mdo | 146 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/МоиБизнесПроцессы/Form.form | 72 +- .../Forms/МоиБизнесПроцессы/Module.bsl | 14 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 72 +- .../Forms/ФормаСписка/Module.bsl | 14 +- .../ДанныеБизнесПроцессов/Help/ru.html | 2 +- .../Forms/ДатыЗапретаИзменения/Form.form | 400 +- .../Forms/ДатыЗапретаИзменения/Module.bsl | 1121 +- .../Forms/РедактированиеДатыЗапрета/Form.form | 94 +- .../РедактированиеДатыЗапрета/Module.bsl | 12 +- .../Forms/ФормаЗаписи/Form.form | 26 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 52 +- .../Forms/ФормаСписка/Module.bsl | 8 +- .../ДатыЗапретаИзменения/Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ДокументыФизическогоЛица/Form.form | 40 +- .../Forms/ФормаЗаписи/Form.form | 46 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 70 +- .../ДокументыФизическихЛиц/Help/ru.html | 2 +- .../ДополнительныеСведения/Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Form.form | 209 +- .../Forms/ФормаЗаписи/Module.bsl | 2 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 333 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ЗависимостиПравДоступа/ManagerModule.bsl | 90 +- .../RecordSetModule.bsl | 16 - .../ЗависимостиПравДоступа.mdo | 105 +- .../Forms/ФормаЗаписи/Form.form | 125 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 144 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ЗначенияГруппДоступа/ManagerModule.bsl | 326 +- .../ЗначенияГруппДоступа.mdo | 95 +- .../Forms/ФормаЗаписи/Form.form | 244 + .../Forms/ФормаЗаписи/Module.bsl | 24 + .../Список/ExtInfo/ListSettings.dcss | 17 + .../ФормаСписка}/ConditionalAppearance.dcssca | 15 +- .../Forms/ФормаСписка}/Form.form | 401 +- .../Forms/ФормаСписка/Module.bsl | 88 + .../ManagerModule.bsl | 0 .../ЗначенияГруппДоступаПоУмолчанию.mdo | 158 + .../Forms/АдресацияПоОбъекту/Form.form | 78 +- .../Forms/АдресацияПоОбъекту/Help/ru.html | 2 +- .../Forms/АдресацияПоОбъекту/Module.bsl | 10 +- .../Forms/АдресацияПоОбъектуИРоли/Form.form | 40 +- .../АдресацияПоОбъектуИРоли/Help/ru.html | 2 +- .../Исполнители/ExtInfo/ListSettings.dcss | 2 + .../Forms/ИсполнителиРоли/Form.form | 70 +- .../Forms/ИсполнителиРоли/Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Form.form | 14 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 36 +- .../ИсполнителиЗадач/Help/ru.html | 2 +- .../ИсполнителиЗадач/RecordSetModule.bsl | 2 +- .../КалендарныеГрафики/Help/ru.html | 2 +- .../КонтактыВзаимодействий/ManagerModule.bsl | 270 + .../RecordSetModule.bsl | 81 + .../КонтактыВзаимодействий.mdo | 100 + .../КурсыВалют/Forms/ФормаЗаписи/Form.form | 18 +- .../Forms/ФормаЗаписи/Form.form | 1012 +- .../Forms/ФормаЗаписи/Module.bsl | 69 - .../Список/ExtInfo/ListSettings.dcss | 2 + .../ФормаСписка/ConditionalAppearance.dcssca | 63 + .../Forms/ФормаСписка/Form.form | 511 +- .../НаборыЗначенийДоступа/ManagerModule.bsl | 62 + .../НаборыЗначенийДоступа.mdo | 273 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 48 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/МоиНапоминания/Form.form | 50 +- .../Forms/МоиНапоминания/Module.bsl | 54 +- .../Forms/Напоминание/Form.form | 80 +- .../Forms/Напоминание/Module.bsl | 53 +- .../Forms/ФормаОповещения/Form.form | 74 +- .../Forms/ФормаОповещения/Module.bsl | 14 +- .../Forms/ФормаЗаписи/Form.form | 250 + .../Forms/ФормаЗаписи/Module.bsl | 15 + .../Список/ExtInfo/ListSettings.dcss | 17 + .../Forms/ФормаСписка/Form.form | 255 +- .../Forms/ФормаСписка/Module.bsl | 54 + .../ManagerModule.bsl | 361 + .../RecordSetModule.bsl | 0 .../НаследованиеНастроекПравОбъектов.mdo | 165 + .../Forms/ВерсионированиеОбъектов/Form.form | 62 +- .../Forms/ВерсионированиеОбъектов/Module.bsl | 4 +- .../Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Form.form | 6 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 28 +- .../Forms/ФормаЗаписи/Form.form | 509 +- .../Forms/ФормаЗаписи/Module.bsl | 1 - .../Список/ExtInfo/ListSettings.dcss | 17 + .../ФормаСписка}/ConditionalAppearance.dcssca | 20 +- .../Forms/ФормаСписка/Form.form | 509 +- .../Forms/ФормаСписка/Module.bsl | 5 +- .../НастройкиПравОбъектов/ManagerModule.bsl | 1048 + .../НастройкиПравОбъектов/RecordSetModule.bsl | 0 .../НастройкиПравОбъектов.mdo} | 221 +- .../НастройкаПодключенияКСервису/Form.form | 36 +- .../НастройкаПодключенияКСервису/Module.bsl | 4 +- .../Form.form | 19 +- .../Module.bsl | 7 +- .../Forms/ФормаЗаписи/Form.form | 288 +- .../Forms/ФормаЗаписи/Module.bsl | 35 +- .../НастройкиТранспортаОбмена/Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Form.form | 95 +- .../Forms/ФормаЗаписи/Module.bsl | 7 +- .../Forms/ФормаЗаписи/Form.form | 10 +- .../Forms/ФормаЗаписи/Module.bsl | 2 +- .../Commands/Настройки/CommandModule.bsl | 21 +- .../Forms/ФормаЗаписи/Form.form | 158 +- .../Forms/ФормаЗаписи/Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Module.bsl | 61 +- .../ManagerModule.bsl | 90 - .../Список/ExtInfo/ListSettings.dcss | 2 + .../ОбластиДанных/Forms/ФормаСписка/Form.form | 56 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Form.form | 24 +- .../Forms/ФормаЗаписи/Form.form | 6 +- .../ВыбораРежимаОткрытияМакета/Form.form | 14 +- .../ВыбораРежимаОткрытияМакета/Help/ru.html | 2 +- .../Forms/ДиалогПовтораПечати/Form.form | 10 +- .../Forms/ДиалогПовтораПечати/Module.bsl | 2 +- .../Forms/МакетыПечатныхФорм/Form.form | 127 +- .../Forms/МакетыПечатныхФорм/Help/ru.html | 2 +- .../Forms/МакетыПечатныхФорм/Module.bsl | 22 +- .../НастройкаКаталогаФайловПечати/Form.form | 8 +- .../НастройкаКаталогаФайловПечати/Module.bsl | 2 +- .../Forms/РедактированиеМакета/Form.form | 52 +- .../Forms/РедактированиеМакета/Help/ru.html | 12 +- .../Forms/РедактированиеМакета/Module.bsl | 24 +- .../Список/ExtInfo/ListSettings.dcss | 15 - .../ПраваПоЗначениямДоступа/ManagerModule.bsl | 611 - .../ПраваРолей/Forms/ФормаЗаписи/Form.form | 128 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../ПраваРолей/Forms/ФормаСписка/Form.form | 187 +- .../ПраваРолей/Forms/ФормаСписка/Module.bsl | 2 +- .../ПраваРолей/ManagerModule.bsl | 15 +- .../ПраваРолей/ПраваРолей.mdo | 37 - .../ПравилаКонвертацииОбъектов/Form.form | 120 +- .../ПравилаКонвертацииОбъектов/Help/ru.html | 2 +- .../ПравилаКонвертацииОбъектов/Module.bsl | 234 +- .../ПравилаРегистрацииОбъектов/Form.form | 68 +- .../ПравилаРегистрацииОбъектов/Help/ru.html | 2 +- .../ПравилаРегистрацииОбъектов/Module.bsl | 221 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 92 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ПравилаДляОбменаДанными/ManagerModule.bsl | 48 +- .../ManagerModule.bsl | 115 + .../RecordSetModule.bsl | 94 + .../ПредметыПапкиВзаимодействий.mdo | 42 +- .../Коллизии/ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../ExtInfo/ListSettings.dcss | 2 + .../Forms/Форма/Form.form | 608 +- .../Forms/Форма/Module.bsl | 71 +- .../РезультатыОбменаДанными/Help/ru.html | 2 +- .../Forms/ФормаЗаписи/Form.form | 12 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 74 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ManagerModule.bsl | 148 + .../СостоянияКонтактовВзаимодействий.mdo | 120 + .../СостоянияПапокПисем/ManagerModule.bsl | 102 + .../СостоянияПапокПисем/RecordSetModule.bsl | 5 + .../СостоянияПапокПисем.mdo} | 46 +- .../ManagerModule.bsl | 228 + .../RecordSetModule.bsl | 5 + .../СостоянияПредметовВзаимодействий.mdo | 144 + .../ManagerModule.bsl | 14 +- .../Forms/ФормаЗаписи/Form.form | 170 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 193 +- .../Forms/ФормаСписка/Module.bsl | 2 +- .../ТаблицыГруппДоступа/ManagerModule.bsl | 26 +- .../ТаблицыГруппДоступа.mdo | 85 +- .../УведомленияОПрочтении.mdo | 1 - ...далить_АктивныеПредметыВзаимодействий.mdo} | 5 +- .../УдалитьБлокировкиСеансовОбластиДанных.mdo | 2 +- .../УдалитьВерсииПодсистем.mdo | 2 +- .../ManagerModule.bsl | 49 + .../RecordSetModule.bsl | 0 .../УдалитьГруппыЗначенийДоступа.mdo | 182 + .../УдалитьЗамерыВремени.mdo | 2 +- .../ManagerModule.bsl | 189 + .../RecordSetModule.bsl | 0 .../УдалитьНаборыЗначенийДоступа.mdo | 188 + .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 60 +- .../УдалитьОбластиДанных.mdo | 2 +- .../УдалитьОбластиКРезервномуКопированию.mdo | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 76 +- .../УдалитьОчередьЗаданий.mdo | 2 +- .../УдалитьОчередьИзвлеченияТекста.mdo | 2 +- .../ManagerModule.bsl | 15 +- .../УдалитьПраваПоЗначениямДоступа.mdo | 154 +- .../УдалитьСтраныМира/УдалитьСтраныМира.mdo | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 52 +- .../СведенияОРегламентномЗадании/Form.form | 6 +- .../СведенияОРегламентномЗадании/Module.bsl | 29 +- .../Forms/ФормаВарианта/Form.form | 3846 +++ .../Forms/ФормаВарианта/Module.bsl | 347 + .../Forms/ФормаНастроек/Form.form | 76 + .../Forms/ФормаОтчета/Form.form | 50 +- .../Forms/ФормаОтчета/Module.bsl | 82 +- .../АнализЖурналаРегистрации/Help/ru.html | 2 +- .../ManagerModule.bsl | 154 +- .../АнализЖурналаРегистрации/ObjectModule.bsl | 4 +- .../Template.mxlx | 788 +- .../АнализЖурналаРегистрации.mdo | 20 + .../Forms/РасшифровкаПростыхОтветов/Form.form | 7 +- .../РасшифровкаТабличныхВопросов/Form.form | 2 +- .../АнализОпроса/Forms/ФормаОтчета/Form.form | 15 +- .../АнализОпроса/Forms/ФормаОтчета/Module.bsl | 4 +- .../Forms/ФормаОтчета/Form.form | 58 +- .../Forms/ФормаОтчета/Form.form | 58 +- .../Forms/ФормаОтчета/Form.form | 82 +- SSL/src/Reports/ЗависшиеЗадачи/Help/ru.html | 2 +- .../Задачи/Forms/ФормаОтчета/Form.form | 82 +- .../Задачи/Forms/ФормаОтчета/Module.bsl | 2 +- SSL/src/Reports/Задачи/Help/ru.html | 2 +- .../Forms/ФормаОтчета/Form.form | 82 +- .../ЗадачиИстекающиеНаДату/Help/ru.html | 2 +- .../Forms/МестаИспользования/Form.form | 619 + .../Forms/МестаИспользования/Module.bsl | 90 + .../ManagerModule.bsl | 5 + .../МестаИспользованияСсылок/ObjectModule.bsl | 113 + .../Template.dcs | 280 + .../МестаИспользованияСсылок.mdo | 33 + .../ПраваДоступа/Forms/ФормаОтчета/Form.form | 48 +- .../ПраваДоступа/Forms/ФормаОтчета/Module.bsl | 781 +- .../Templates/Макет/Template.mxlx | 726 +- .../Forms/ФормаОтчета/Form.form | 82 +- .../Reports/ПросроченныеЗадачи/Help/ru.html | 2 +- .../Roles/АдминистраторСистемы/Rights.rights | 267 +- SSL/src/Roles/БазовыеПрава/Rights.rights | 50 +- .../Rights.rights | 1240 +- .../Rights.rights | 7 - .../Rights.rights | 124 +- .../Rights.rights | 4 + .../Rights.rights | 18449 ++++++------- .../Rights.rights | 7 - .../Rights.rights | 1194 +- .../ДобавлениеИзменениеЗаданий/Rights.rights | 17484 ++++++------ .../Rights.rights | 16 + .../ДобавлениеИзменениеОпросов/Rights.rights | 1211 +- .../Rights.rights | 1218 +- .../Rights.rights | 1182 +- .../Rights.rights | 7 - .../Rights.rights | 14 +- .../Rights.rights | 4 + .../Rights.rights | 1178 +- .../Rights.rights | 1178 +- .../Rights.rights | 1167 +- SSL/src/Roles/ЗапускAutomation/Rights.rights | 1240 +- SSL/src/Roles/ЗапускВебКлиента/Rights.rights | 1240 +- .../Roles/ЗапускТолстогоКлиента/Rights.rights | 1240 +- .../Roles/ЗапускТонкогоКлиента/Rights.rights | 1240 +- .../ИзменениеВыполнениеЗадач/Rights.rights | 13316 +++++---- .../Rights.rights | 5344 ++-- .../Rights.rights | 1178 +- .../Rights.rights | 7 - .../Rights.rights | 22354 +++++++--------- .../Rights.rights | 1248 +- .../Rights.rights | 1200 +- .../Roles/ИспользованиеЗаметок/Rights.rights | 2 +- .../ИспользованиеНапоминаний/Rights.rights | 2 +- .../Rights.rights | 4164 ++- .../Rights.rights | 12 +- .../ИспользованиеЭП.mdo} | 2 +- .../Rights.rights | 7 - SSL/src/Roles/ПолныеПрава/Rights.rights | 1359 +- .../Roles/РаботаСПапкамиФайлов/Rights.rights | 18684 ++++++------- .../Rights.rights | 1178 +- .../Rights.rights | 1364 +- .../Rights.rights | 1243 +- SSL/src/Roles/ЧтениеБазовойНСИ/Rights.rights | 8380 +++--- .../Rights.rights | 5342 ++-- SSL/src/Roles/ЧтениеЗаданий/Rights.rights | 13316 +++++---- SSL/src/Roles/ЧтениеЗадач/Rights.rights | 13314 +++++---- .../ЧтениеОтветовНаВопросыАнкет/Rights.rights | 1174 +- .../Rights.rights | 1178 +- .../Roles/ЧтениеФизическихЛиц/Rights.rights | 1178 +- .../Schedule.schedule | 2 +- .../ЗаполнениеДанныхДляОграниченияДоступа.mdo | 3 +- .../УдалениеПомеченных/Schedule.schedule | 22 + .../УдалениеПомеченных/УдалениеПомеченных.mdo | 13 + .../АвторизованныйПользователь.mdo | 12 + ...ВидыДоступаБезГруппДляЗначенияДоступа.mdo} | 7 +- ...оступаСОднойГруппойДляЗначенияДоступа.mdo} | 8 +- ...ВидыДоступаСОтключеннымИспользованием.mdo} | 7 +- .../ВсеВидыДоступаКромеСпециальных.mdo} | 8 +- ...каторыТаблицСОтдельнымиНастройкамиПрав.mdo | 11 + .../ОграничиватьДоступПоВиду.mdo | 14 - ...ичиватьДоступПоВидуВнешниеПользователи.mdo | 14 - ...ватьДоступПоВидуДополнительныеСведения.mdo | 14 - .../ОграничиватьДоступПоВидуОрганизации.mdo | 14 - .../ОграничиватьДоступПоВидуПапкиФайлов.mdo | 15 - .../ОграничиватьДоступПоВидуПользователи.mdo | 14 - ...граничиватьДоступПоВидуПравоДобавления.mdo | 14 - ...ОграничиватьДоступПоВидуПравоИзменения.mdo | 14 - .../ОграничиватьДоступПоВидуПравоЧтения.mdo | 14 - ...тупПоВидуУчетныеЗаписиЭлектроннойПочты.mdo | 14 - .../ПропуститьПроверкуЗапретаИзменения.mdo | 2 +- .../ТаблицыСОтдельнымиНастройкамиПрав.mdo} | 7 +- .../ТипыВладельцевНастроекПрав.mdo} | 6 +- .../ТипыЗначенийДоступаСГруппами.mdo | 11 + .../Forms/ВыборВариантаОтчета/Form.form | 78 +- .../Forms/ВыборВариантаОтчета/Help/ru.html | 2 +- .../Forms/ВыборВариантаОтчета/Module.bsl | 60 +- .../Forms/СохранениеВариантаОтчета/Form.form | 146 +- .../СохранениеВариантаОтчета/Help/ru.html | 2 +- .../Forms/СохранениеВариантаОтчета/Module.bsl | 351 +- .../ManagerModule.bsl | 104 +- .../ХранилищеВариантовОтчетов.mdo | 2 +- .../CommandInterface.cmi | 65 +- .../Администрирование.mdo} | 23 +- .../АнализЖурналаРегистрации/Help/ru.html | 2 +- .../БазоваяФункциональность.mdo | 17 +- .../БизнесПроцессыИЗадачи/Help/ru.html | 2 +- .../БизнесПроцессыИЗадачи.mdo | 1 - .../Subsystems/Валюты/Help/ru.html | 2 +- .../ВерсионированиеОбъектов/Help/ru.html | 2 +- .../Взаимодействия/Взаимодействия.mdo | 10 +- .../ГрафикиРаботы/ГрафикиРаботы.mdo | 17 + .../ГрупповоеИзменениеОбъектов/Help/ru.html | 2 +- .../Help/ru.html | 2 +- .../ДополнительныеОтчетыИОбработки.mdo | 8 +- .../Help/ru.html | 2 +- .../ЗавершениеРаботыПользователей.mdo | 2 +- .../ЗаметкиПользователя.mdo | 3 +- .../Help/ru.html | 2 +- .../ЗащитаПерсональныхДанных.mdo | 1 + .../КалендарныеГрафики/Help/ru.html | 2 +- .../КалендарныеГрафики/КалендарныеГрафики.mdo | 6 - .../КонтактнаяИнформация/Help/ru.html | 2 +- .../КонтактнаяИнформация.mdo | 2 - .../Help/ru.html | 2 +- ...ольДинамическогоОбновленияКонфигурации.mdo | 3 +- .../НапоминанияПользователя.mdo | 2 +- .../НастройкаПорядкаЭлементов/Help/ru.html | 2 +- .../НастройкиПрограммы/НастройкиПрограммы.mdo | 4 +- .../Subsystems/ОбменДанными/Help/ru.html | 2 +- .../Subsystems/ОбменДанными/ОбменДанными.mdo | 3 +- .../ОбновлениеВерсииИБ/ОбновлениеВерсииИБ.mdo | 1 - .../ОбновлениеКонфигурации/Help/ru.html | 2 +- .../Subsystems/Организации/Организации.mdo | 5 + .../Subsystems/ОтправкаSMS/ОтправкаSMS.mdo | 1 + .../ОценкаПроизводительности.mdo | 2 +- .../Subsystems/Печать/Help/ru.html | 2 +- .../Subsystems/Печать/Печать.mdo | 2 +- .../ПолнотекстовыйПоиск/Help/ru.html | 2 +- .../ПолнотекстовыйПоиск.mdo | 1 - .../ПолучениеФайловИзИнтернета/Help/ru.html | 2 +- .../Subsystems/Пользователи/Help/ru.html | 2 +- .../Subsystems/Пользователи/Пользователи.mdo | 1 + .../ПрефиксацияОбъектов/Help/ru.html | 2 +- .../ПрефиксацияОбъектов.mdo | 2 +- .../ПрисоединенныеФайлы.mdo | 3 +- ...ПроверкаЛегальностиПолученияОбновления.mdo | 1 - .../БазоваяФункциональностьВМоделиСервиса.mdo | 5 +- .../ВыгрузкаЗагрузкаДанных.mdo | 21 - .../ПользователиВМоделиСервиса.mdo | 2 +- .../РаботаВМоделиСервиса.mdo | 1 - .../РаботаСПочтовымиСообщениями/Help/ru.html | 2 +- .../Subsystems/РаботаСФайлами/Help/ru.html | 2 +- .../РаботаСФайлами/РаботаСФайлами.mdo | 3 - .../РегламентныеЗадания/Help/ru.html | 2 +- .../РегламентныеЗадания.mdo | 7 - .../Subsystems/Свойства/Help/ru.html | 2 +- .../УправлениеДоступом/Help/ru.html | 2 +- .../УправлениеДоступом/УправлениеДоступом.mdo | 47 +- .../УправлениеИтогамиИАгрегатами/Help/ru.html | 2 +- .../ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo | 38 +- .../СтандартныеПодсистемы.mdo | 1 + .../Commands/Выполнено/CommandModule.bsl | 2 +- .../Forms/Дополнительно/Form.form | 68 +- .../Forms/Дополнительно/Help/ru.html | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ЗадачиПоБизнесПроцессу/Form.form | 134 +- .../Forms/ЗадачиПоБизнесПроцессу/Module.bsl | 18 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ЗадачиПоПредмету/Form.form | 156 +- .../Forms/ЗадачиПоПредмету/Module.bsl | 16 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/МоиЗадачи/Form.form | 112 +- .../Forms/МоиЗадачи/Help/ru.html | 2 +- .../Forms/МоиЗадачи/Module.bsl | 2 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/МоиЗадачиДляРабочегоСтола/Form.form | 98 +- .../МоиЗадачиДляРабочегоСтола/Help/ru.html | 2 +- .../МоиЗадачиДляРабочегоСтола/Module.bsl | 4 +- .../Forms/ПеренаправитьЗадачи/Form.form | 56 +- .../Forms/ПеренаправитьЗадачи/Help/ru.html | 2 +- .../Forms/ФормаЗадачи/Form.form | 110 +- .../Forms/ФормаЗадачи/Module.bsl | 14 +- .../Список/ExtInfo/ListSettings.dcss | 2 + .../Forms/ФормаСписка/Form.form | 207 +- .../Forms/ФормаСписка/Module.bsl | 4 +- SSL/src/Tasks/ЗадачаИсполнителя/Help/ru.html | 2 +- .../Tasks/ЗадачаИсполнителя/ObjectModule.bsl | 3 +- .../ЗадачаИсполнителя/ЗадачаИсполнителя.mdo | 4 + .../ОтправкаSMSЧерезМТС/WsDefinitions.wsdl | 328 + .../ОтправкаSMSЧерезМТС.mdo | 12 + SSL/src/WebServices/Exchange/Module.bsl | 26 +- .../WebServices/Exchange_2_0_1_6/Module.bsl | 26 +- .../MessageExchange_2_0_1_6/Module.bsl | 3 + .../RemoteAdministrationOfExchange/Module.bsl | 2 +- .../Module.bsl | 5 +- .../Module.bsl | 3 + .../DataDump_1_0_1_1/DataDump_1_0_1_1.mdo | 9 - .../DataDump_1_0_1_1/Package.xdto | 43 - 2032 files changed, 201912 insertions(+), 217678 deletions(-) delete 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 rename SSL/src/{CommonForms/ЗагрузкаДанныхВОбласть => Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек}/Form.form (54%) create mode 100644 SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl create mode 100644 SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl delete mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form delete mode 100644 SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl rename SSL/src/Catalogs/{НазначенияСертификатовЭЦП => НазначенияСертификатовЭП}/Templates/НазначенияСертификатов/Template.txt (100%) rename SSL/src/Catalogs/{НазначенияСертификатовЭЦП => НазначенияСертификатовЭП}/Templates/УдаленныйНазначенияСертификатов/Template.txt (100%) rename SSL/src/Catalogs/{НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo => НазначенияСертификатовЭП/НазначенияСертификатовЭП.mdo} (96%) rename SSL/src/{CommonCommands/ЗагрузитьДанныеИзСервиса => Catalogs/Организации/Commands/ДобавитьОрганизацию}/CommandModule.bsl (69%) create mode 100644 SSL/src/Catalogs/Организации/Commands/Организации/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Организации/Commands/РеквизитыОрганизации/CommandModule.bsl create mode 100644 SSL/src/Catalogs/Организации/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl create mode 100644 SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl delete mode 100644 SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca create mode 100644 SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/СтроковыеКонтактыВзаимодействий.mdo create mode 100644 SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html create mode 100644 SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl rename SSL/src/Catalogs/Файлы/Commands/{ЗанятыеФайлы => РедактируемыеФайлы}/CommandModule.bsl (100%) rename SSL/src/Catalogs/Файлы/Commands/{ПапкиФайлов => Файлы}/CommandModule.bsl (84%) rename SSL/src/Catalogs/{Валюты/Forms/ФормаВыбора/Attributes/Список => Файлы/Forms/Файлы/Attributes/Папки}/ExtInfo/ListSettings.dcss (89%) rename SSL/src/{ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора => Catalogs/Файлы/Forms/Файлы}/Attributes/Список/ExtInfo/ListSettings.dcss (89%) rename SSL/src/Catalogs/Файлы/Forms/{ХранилищеФайлов => Файлы}/Form.form (80%) rename SSL/src/Catalogs/Файлы/Forms/{ХранилищеФайлов => Файлы}/Help/ru.html (95%) create mode 100644 SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl delete mode 100644 SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl create mode 100644 SSL/src/Catalogs/ФизическиеЛица/ManagerModule.bsl delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Module.bsl delete mode 100644 SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl rename SSL/src/{Constants/КаталогВременныхФайловДляWindows/ValueManagerModule.bsl => ChartsOfCharacteristicTypes/УдалитьВидыДоступа/ManagerModule.bsl} (100%) rename SSL/src/ChartsOfCharacteristicTypes/{ВидыДоступа => УдалитьВидыДоступа}/ObjectModule.bsl (100%) rename SSL/src/ChartsOfCharacteristicTypes/{ВидыДоступа/ВидыДоступа.mdo => УдалитьВидыДоступа/УдалитьВидыДоступа.mdo} (65%) delete mode 100644 SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/ВыгрузитьДанныеВЛокальнуюВерсию.mdo delete mode 100644 SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/ВыгрузитьДанныеДляПереходаВСервис.mdo delete mode 100644 SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/ДополнительныеОбработкиАдминистрирование.mdo delete mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/ДополнительныеОтчетыАдминистрирование.mdo rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиПечатныеФормы => ДополнительныеПечатныеФормыОбъекта}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo => ДополнительныеПечатныеФормыОбъекта/ДополнительныеПечатныеФормыОбъекта.mdo} (85%) delete mode 100644 SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/ЗагрузитьДанныеВОбласть.mdo delete mode 100644 SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/ЗагрузитьДанныеИзСервиса.mdo rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта => ЗаполнениеОбъекта}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo => ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo} (84%) rename SSL/src/CommonCommands/{ЗаметкиПоПредмету => МоиЗаметкиПоПредмету}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{ЗаметкиПоПредмету/ЗаметкиПоПредмету.mdo => МоиЗаметкиПоПредмету/МоиЗаметкиПоПредмету.mdo} (86%) rename SSL/src/CommonCommands/{УстановитьНапоминаниеПоПредмету => Напомнить}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{УстановитьНапоминаниеПоПредмету/УстановитьНапоминаниеПоПредмету.mdo => Напомнить/Напомнить.mdo} (92%) rename SSL/src/CommonCommands/{ПраваПоЗначениямДоступа => НастроитьПрава}/CommandModule.bsl (68%) rename SSL/src/CommonCommands/{ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo => НастроитьПрава/НастроитьПрава.mdo} (70%) rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиОтчеты => ОтчетыОбъекта}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo => ОтчетыОбъекта/ОтчетыОбъекта.mdo} (85%) delete mode 100644 SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/CommandModule.bsl delete mode 100644 SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/ПанельОтчетовНастройкаИАдминистрирование.mdo rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов => СозданиеСвязанныхОбъектов}/CommandModule.bsl (100%) rename SSL/src/CommonCommands/{ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo => СозданиеСвязанныхОбъектов/СозданиеСвязанныхОбъектов.mdo} (84%) delete mode 100644 SSL/src/CommonForms/ВключениеЖурналаРегистрации/Form.form delete mode 100644 SSL/src/CommonForms/ВключениеЖурналаРегистрации/Module.bsl delete mode 100644 SSL/src/CommonForms/ВключениеЖурналаРегистрации/ВключениеЖурналаРегистрации.mdo delete mode 100644 SSL/src/CommonForms/ВыгрузкаДанных/Form.form delete mode 100644 SSL/src/CommonForms/ВыгрузкаДанных/Module.bsl delete mode 100644 SSL/src/CommonForms/ВыгрузкаДанных/ВыгрузкаДанных.mdo delete mode 100644 SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Module.bsl delete mode 100644 SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/ЗагрузкаДанныхВОбласть.mdo delete mode 100644 SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Form.form delete mode 100644 SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Module.bsl delete mode 100644 SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/ЗагрузкаДанныхИзСервиса.mdo delete mode 100644 SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Form.form delete mode 100644 SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Module.bsl delete mode 100644 SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации.mdo delete mode 100644 SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form delete mode 100644 SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Module.bsl delete mode 100644 SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/ИнформацияНеразделенногоПользователя.mdo rename SSL/src/CommonForms/{НастройкиЭЦП => НастройкиКриптографии}/Form.form (56%) rename SSL/src/CommonForms/{НастройкиЭЦП => НастройкиКриптографии}/Help/ru.html (98%) rename SSL/src/CommonForms/{НастройкиЭЦП => НастройкиКриптографии}/Module.bsl (76%) rename SSL/src/CommonForms/{НастройкиЭЦП/НастройкиЭЦП.mdo => НастройкиКриптографии/НастройкиКриптографии.mdo} (89%) rename SSL/src/CommonForms/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/ConditionalAppearance.dcssca (86%) rename SSL/src/CommonForms/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/Form.form (70%) create mode 100644 SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl rename SSL/src/CommonForms/{ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo => НастройкиПравОбъектов/НастройкиПравОбъектов.mdo} (70%) rename SSL/src/CommonForms/{ПерсональныеНастройкиЭЦП => ПерсональныеНастройкиЭП}/Form.form (68%) rename SSL/src/CommonForms/{ПерсональныеНастройкиЭЦП => ПерсональныеНастройкиЭП}/Help/ru.html (92%) create mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭП/Module.bsl rename SSL/src/CommonForms/{ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo => ПерсональныеНастройкиЭП/ПерсональныеНастройкиЭП.mdo} (88%) delete mode 100644 SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl rename SSL/src/CommonForms/{ВыборСертификата => ПерсональныеСертификатыДляШифрования}/Form.form (82%) rename SSL/src/CommonForms/{ВыборСертификата => ПерсональныеСертификатыДляШифрования}/Help/ru.html (62%) rename SSL/src/CommonForms/{ВыборСертификата => ПерсональныеСертификатыДляШифрования}/Module.bsl (67%) rename SSL/src/CommonForms/{ВыборСертификата/ВыборСертификата.mdo => ПерсональныеСертификатыДляШифрования/ПерсональныеСертификатыДляШифрования.mdo} (70%) create mode 100644 SSL/src/CommonForms/ПечатьДокументов/Help/ru.html rename SSL/src/CommonForms/{ПодписьЭЦП => ПодписьЭП}/Form.form (95%) rename SSL/src/CommonForms/{ПодписьЭЦП => ПодписьЭП}/Help/ru.html (73%) rename SSL/src/CommonForms/{ПодписьЭЦП => ПодписьЭП}/Module.bsl (86%) rename SSL/src/CommonForms/{ПодписьЭЦП/ПодписьЭЦП.mdo => ПодписьЭП/ПодписьЭП.mdo} (92%) delete mode 100644 SSL/src/CommonForms/ПоискПоИндексу/Form.form delete mode 100644 SSL/src/CommonForms/ПоискПоИндексу/Module.bsl delete mode 100644 SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo delete mode 100644 SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl rename SSL/src/CommonForms/{СертификатЭЦП => СертификатЭП}/Form.form (95%) rename SSL/src/CommonForms/{СертификатЭЦП => СертификатЭП}/Help/ru.html (72%) rename SSL/src/CommonForms/{СертификатЭЦП => СертификатЭП}/Module.bsl (91%) rename SSL/src/CommonForms/{СертификатЭЦП/СертификатЭЦП.mdo => СертификатЭП/СертификатЭП.mdo} (91%) rename SSL/src/CommonForms/{УстановкаПодписиЭЦП => УстановкаПодписиЭП}/Form.form (88%) rename SSL/src/CommonForms/{УстановкаПодписиЭЦП => УстановкаПодписиЭП}/Help/ru.html (79%) rename SSL/src/CommonForms/{УстановкаПодписиЭЦП => УстановкаПодписиЭП}/Module.bsl (77%) rename SSL/src/CommonForms/{УстановкаПодписиЭЦП/УстановкаПодписиЭЦП.mdo => УстановкаПодписиЭП/УстановкаПодписиЭП.mdo} (90%) delete mode 100644 SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/Module.bsl delete mode 100644 SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/Module.bsl delete mode 100644 SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/ВыгрузкаЗагрузкаДанныхПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ГрафикиРаботы/Module.bsl rename SSL/src/CommonModules/{ВыгрузкаЗагрузкаДанных/ВыгрузкаЗагрузкаДанных.mdo => ГрафикиРаботы/ГрафикиРаботы.mdo} (62%) rename SSL/src/CommonModules/{КалендарныеГрафикиКлиентСервер => ГрафикиРаботыКлиентСервер}/Module.bsl (82%) rename SSL/src/CommonModules/{КалендарныеГрафикиКлиентСервер/КалендарныеГрафикиКлиентСервер.mdo => ГрафикиРаботыКлиентСервер/ГрафикиРаботыКлиентСервер.mdo} (72%) create mode 100644 SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl rename SSL/src/CommonModules/{ПрефиксацияОбъектовВызовСервера/ПрефиксацияОбъектовВызовСервера.mdo => ЖурналРегистрацииВызовСервера/ЖурналРегистрацииВызовСервера.mdo} (50%) create mode 100644 SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl rename SSL/src/CommonModules/{КомандыРаботыСФайламиКлиент/КомандыРаботыСФайламиКлиент.mdo => ЗащитаПерсональныхДанныхКлиент/ЗащитаПерсональныхДанныхКлиент.mdo} (57%) delete mode 100644 SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/Module.bsl delete mode 100644 SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/КомандыРаботыСБизнесПроцессамиКлиент.mdo delete mode 100644 SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl rename SSL/src/CommonModules/{КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo => КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo} (75%) rename SSL/src/CommonModules/{КонтрольДинамическогоОбновленияКонфигурации => КонтрольДинамическогоОбновленияКонфигурацииСлужебный}/Module.bsl (64%) create mode 100644 SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo delete mode 100644 SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/Module.bsl delete mode 100644 SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/ОбщегоНазначенияВызовСервераПереопределяемый.mdo create mode 100644 SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl rename SSL/src/CommonModules/{РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo => ОбщегоНазначенияГлобальный/ОбщегоНазначенияГлобальный.mdo} (56%) rename SSL/src/CommonModules/{ОценкаПроизводительностиПовтИсп => ОценкаПроизводительностиВызовСервераПовтИсп}/Module.bsl (100%) rename SSL/src/CommonModules/{ОценкаПроизводительностиПовтИсп/ОценкаПроизводительностиПовтИсп.mdo => ОценкаПроизводительностиВызовСервераПовтИсп/ОценкаПроизводительностиВызовСервераПовтИсп.mdo} (61%) delete mode 100644 SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl create mode 100644 SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/ПользователиСлужебныйВМоделиСервисаПовтИсп.mdo rename SSL/src/CommonModules/{ПрефиксацияОбъектовВызовСервера => ПрефиксацияОбъектовСлужебный}/Module.bsl (100%) rename SSL/src/CommonModules/{РаботаСФайламиВызовСервера/РаботаСФайламиВызовСервера.mdo => ПрефиксацияОбъектовСлужебный/ПрефиксацияОбъектовСлужебный.mdo} (59%) delete mode 100644 SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl delete mode 100644 SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/Module.bsl delete mode 100644 SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/ПроверкаЛегальностиПолученияОбновленияГлобальный.mdo create mode 100644 SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl rename SSL/src/CommonModules/{ПолнотекстовыйПоискКлиент/ПолнотекстовыйПоискКлиент.mdo => РаботаВМоделиСервисаКлиент/РаботаВМоделиСервисаКлиент.mdo} (59%) delete mode 100644 SSL/src/CommonModules/РаботаСФайламиВызовСервера/Module.bsl delete mode 100644 SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/Module.bsl delete mode 100644 SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/РаботаСФайламиВызовСервераПереопределяемый.mdo delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/Module.bsl delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/РегламентныеЗаданияСлужебныйВызовСервера.mdo delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/Module.bsl delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/Module.bsl delete mode 100644 SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/РегламентныеЗаданияСлужебныйКлиент.mdo rename SSL/src/CommonModules/{СоединенияИБПовтИсп => СоединенияИБВызовСервераПовтИсп}/Module.bsl (92%) rename SSL/src/CommonModules/{СоединенияИБПовтИсп/СоединенияИБПовтИсп.mdo => СоединенияИБВызовСервераПовтИсп/СоединенияИБВызовСервераПовтИсп.mdo} (67%) create mode 100644 SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl rename SSL/src/CommonModules/{РегламентныеЗаданияСлужебныйГлобальный/РегламентныеЗаданияСлужебныйГлобальный.mdo => СтандартныеПодсистемыГлобальный/СтандартныеПодсистемыГлобальный.mdo} (55%) create mode 100644 SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/УправлениеДоступомСлужебныйВызовСервера.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/УправлениеДоступомСлужебныйКлиент.mdo create mode 100644 SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl rename SSL/src/CommonModules/{ПрисоединенныеФайлыКлиентСервер/ПрисоединенныеФайлыКлиентСервер.mdo => УправлениеДоступомСлужебныйКлиентСервер/УправлениеДоступомСлужебныйКлиентСервер.mdo} (58%) delete mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl delete mode 100644 SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo create mode 100644 SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl create mode 100644 SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/УправлениеПечатьюСлужебныйКлиент.mdo rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодпись => ЭлектроннаяПодпись}/Module.bsl (69%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодпись/ЭлектроннаяЦифроваяПодпись.mdo => ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo} (86%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьКлиент => ЭлектроннаяПодписьКлиент}/Module.bsl (80%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьКлиент/ЭлектроннаяЦифроваяПодписьКлиент.mdo => ЭлектроннаяПодписьКлиент/ЭлектроннаяПодписьКлиент.mdo} (84%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьКлиентСервер => ЭлектроннаяПодписьКлиентСервер}/Module.bsl (59%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьКлиентСервер/ЭлектроннаяЦифроваяПодписьКлиентСервер.mdo => ЭлектроннаяПодписьКлиентСервер/ЭлектроннаяПодписьКлиентСервер.mdo} (84%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьПовтИсп => ЭлектроннаяПодписьПовтИсп}/Module.bsl (93%) rename SSL/src/CommonModules/{ЭлектроннаяЦифроваяПодписьПовтИсп/ЭлектроннаяЦифроваяПодписьПовтИсп.mdo => ЭлектроннаяПодписьПовтИсп/ЭлектроннаяПодписьПовтИсп.mdo} (85%) rename SSL/src/CommonPictures/{НастройкаИАдминистрирование48 => Администрирование48}/Picture.png (100%) rename SSL/src/CommonPictures/{НастройкаИАдминистрирование48/НастройкаИАдминистрирование48.mdo => Администрирование48/Администрирование48.mdo} (60%) delete mode 100644 SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/Picture.png delete mode 100644 SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий.mdo delete mode 100644 SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/Picture.png delete mode 100644 SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/ЗаставкаВнешнейОперации83.mdo create mode 100644 SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png create mode 100644 SSL/src/CommonPictures/КоличествоРассмотрено/КоличествоРассмотрено.mdo delete mode 100644 SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/Picture.png delete mode 100644 SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/НастройкаВыполненияРегламентныхЗаданий.mdo delete mode 100644 SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/Picture.png delete mode 100644 SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/ОшибкаВыполненияРегламентныхЗаданий.mdo rename SSL/src/CommonPictures/{ПодписанЭЦП => ПодписанЭП}/Picture.png (100%) rename SSL/src/CommonPictures/{ПодписанЭЦП/ПодписанЭЦП.mdo => ПодписанЭП/ПодписанЭП.mdo} (87%) delete mode 100644 SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png delete mode 100644 SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo create mode 100644 SSL/src/CommonPictures/Успешно32/Picture.png create mode 100644 SSL/src/CommonPictures/Успешно32/Успешно32.mdo rename SSL/src/CommonPictures/{УстановитьПризнакРассмотреноДляВзамодействия => УстановитьПризнакРассмотреноДляВзаимодействия}/Picture.png (100%) rename SSL/src/CommonPictures/{УстановитьПризнакРассмотреноДляВзамодействия/УстановитьПризнакРассмотреноДляВзамодействия.mdo => УстановитьПризнакРассмотреноДляВзаимодействия/УстановитьПризнакРассмотреноДляВзаимодействия.mdo} (90%) delete mode 100644 SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/Template.bin delete mode 100644 SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/ИзвлечениеКодовОбщихДанных.mdo delete mode 100644 SSL/src/CommonTemplates/КомпонентаПечатиQRКода/Template.bin delete mode 100644 SSL/src/CommonTemplates/КомпонентаПечатиQRКода/КомпонентаПечатиQRКода.mdo delete mode 100644 SSL/src/Configuration/Splash.bmp create mode 100644 SSL/src/Configuration/Splash.png rename SSL/src/Constants/{ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo => ВыполнятьПроверкуЭПНаСервере/ВыполнятьПроверкуЭПНаСервере.mdo} (92%) rename SSL/src/Constants/{ОбщийКаталогВременныхФайловLinux => ИдентификаторИнформационнойБазы}/ValueManagerModule.bsl (100%) create mode 100644 SSL/src/Constants/ИдентификаторИнформационнойБазы/ИдентификаторИнформационнойБазы.mdo create mode 100644 SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ValueManagerModule.bsl create mode 100644 SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ИспользоватьНесколькоОрганизаций.mdo rename SSL/src/Constants/{ИспользоватьЭлектронныеЦифровыеПодписи/ИспользоватьЭлектронныеЦифровыеПодписи.mdo => ИспользоватьЭлектронныеПодписи/ИспользоватьЭлектронныеПодписи.mdo} (91%) rename SSL/src/Constants/{ОбщийКаталогВременныхФайлов/ОбщийКаталогВременныхФайлов.mdo => КаталогОбменаФайламиВМоделиСервиса/КаталогОбменаФайламиВМоделиСервиса.mdo} (83%) rename SSL/src/{InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl => Constants/КаталогОбменаФайламиВМоделиСервисаLinux/ValueManagerModule.bsl} (100%) rename SSL/src/Constants/{ОбщийКаталогВременныхФайловLinux/ОбщийКаталогВременныхФайловLinux.mdo => КаталогОбменаФайламиВМоделиСервисаLinux/КаталогОбменаФайламиВМоделиСервисаLinux.mdo} (83%) rename SSL/src/Constants/{КаталогВременныхФайловДляLinux/КаталогВременныхФайловДляLinux.mdo => КаталогСообщенийОбменаДаннымиДляLinux/КаталогСообщенийОбменаДаннымиДляLinux.mdo} (83%) create mode 100644 SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl rename SSL/src/Constants/{КаталогВременныхФайловДляWindows/КаталогВременныхФайловДляWindows.mdo => КаталогСообщенийОбменаДаннымиДляWindows/КаталогСообщенийОбменаДаннымиДляWindows.mdo} (83%) create mode 100644 SSL/src/Constants/НеИспользоватьНесколькоОрганизаций/НеИспользоватьНесколькоОрганизаций.mdo rename SSL/src/Constants/{ПровайдерЭЦП/ПровайдерЭЦП.mdo => ПровайдерЭП/ПровайдерЭП.mdo} (96%) rename SSL/src/Constants/{ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo => ТипПровайдераЭП/ТипПровайдераЭП.mdo} (95%) create mode 100644 SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Form.form create mode 100644 SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Module.bsl create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Commands/ГрупповоеИзменениеРеквизитов/CommandModule.bsl create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Form.form create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Module.bsl rename SSL/src/{Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки => DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Attributes/Список}/ExtInfo/ListSettings.dcss (89%) create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Form.form create mode 100644 SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Module.bsl rename SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/{Настройка => ДополнительныеПараметры}/Form.form (64%) rename SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/{Настройка => ДополнительныеПараметры}/Help/ru.html (74%) rename SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/{Настройка => ДополнительныеПараметры}/Module.bsl (75%) rename SSL/src/{Catalogs/Файлы/Forms/ХранилищеФайлов => DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов}/Attributes/Список/ExtInfo/ListSettings.dcss (89%) create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/ConditionalAppearance.dcssca create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Form.form create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Help/ru.html create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Items/КартинкаДлительнойОперации2/Picture.gif create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Module.bsl create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Form.form create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Module.bsl create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/ConditionalAppearance.dcssca create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Form.form create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Help/ru.html create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Items/КартинкаДлительнойОперации1/Picture.gif create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Items/КартинкаДлительнойОперации2/Picture.gif create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Module.bsl create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/ManagerModule.bsl create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/ObjectModule.bsl create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs create mode 100644 SSL/src/DataProcessors/ЗаменаСсылок/ЗаменаСсылок.mdo rename SSL/src/DataProcessors/{УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаРедактораТекстовогоДокумента => НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер}/Form.form (50%) create mode 100644 SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Module.bsl delete mode 100644 SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Form.form delete mode 100644 SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Module.bsl rename SSL/src/DataProcessors/{РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии => НастройкаРезервногоКопированияИБ/Forms/Форма}/Form.form (56%) create mode 100644 SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Module.bsl delete mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/Template.htmldoc delete mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/ru.html rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/Download1.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Download11.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/Safe2.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Safe21.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/UserSite1.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/UserSite11.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/Платф1.jpg (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Платф11.jpg rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/Уст1.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Уст11.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/запуск.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/запуск1.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг12.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг121.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг2.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг21.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг31.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг311.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг4.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг41.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг5.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг51.png rename SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/{ПорядокОбновленияДляФайловойБазы83 => ПорядокОбновленияДляФайловойБазы}/_files/шаг6.png (100%) create mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг61.png delete mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/Template.htmldoc delete mode 100644 SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/ru.html rename SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/{СинхронизацияДанных => НастройкиСинхронизацииДанных}/CommandModule.bsl (68%) delete mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСП/Commands/СинхронизацияДанныхВМоделиСервиса/CommandModule.bsl rename SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/{СинхронизацияДанных => НастройкиСинхронизацииДанных}/Form.form (82%) create mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/НастройкиСинхронизацииДанных/Help/ru.html rename SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/{СинхронизацияДанных => НастройкиСинхронизацииДанных}/Module.bsl (89%) delete mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанных/Help/ru.html delete mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form delete mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСП/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Help/ru.html create mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Commands/НастройкиСинхронизацииДанных/CommandModule.bsl rename SSL/src/DataProcessors/{ПанельАдминистрированияБСП => ПанельАдминистрированияБСПВМоделиСервиса}/Forms/СинхронизацияДанныхДляАдминистратораАбонента/Form.form (94%) rename SSL/src/DataProcessors/{ПанельАдминистрированияБСП => ПанельАдминистрированияБСПВМоделиСервиса}/Forms/СинхронизацияДанныхДляАдминистратораАбонента/Help/ru.html (68%) rename SSL/src/DataProcessors/{ПанельАдминистрированияБСП => ПанельАдминистрированияБСПВМоделиСервиса}/Forms/СинхронизацияДанныхДляАдминистратораАбонента/Module.bsl (96%) create mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Form.form create mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Help/ru.html rename SSL/src/DataProcessors/{ПанельАдминистрированияБСП => ПанельАдминистрированияБСПВМоделиСервиса}/Forms/СинхронизацияДанныхДляАдминистратораСервиса/Module.bsl (85%) create mode 100644 SSL/src/DataProcessors/ПанельАдминистрированияБСПВМоделиСервиса/ПанельАдминистрированияБСПВМоделиСервиса.mdo delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ВыполнениеРегламентныхЗаданий/Form.form delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/ВыполнениеРегламентныхЗаданий/Module.bsl delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаВыполненияРегламентныхЗаданий/Form.form delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаВыполненияРегламентныхЗаданий/Help/ru.html delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/НастройкаВыполненияРегламентныхЗаданий/Module.bsl delete mode 100644 SSL/src/DataProcessors/РегламентныеИФоновыеЗадания/Forms/РабочийСтолОтдельногоСеансаВыполненияРегламентныхЗаданий/Form.form create mode 100644 SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИзРезервнойКопии/Form.form rename SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/{ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии => ВосстановлениеДанныхИзРезервнойКопии}/Help/ru.html (98%) rename SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/{ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии => ВосстановлениеДанныхИзРезервнойКопии}/Module.bsl (60%) create mode 100644 SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеДанных/Form.form rename SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/{РезервноеКопированиеИнформационнойБазы => РезервноеКопированиеДанных}/Help/ru.html (98%) rename SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/{РезервноеКопированиеИнформационнойБазы => РезервноеКопированиеДанных}/Module.bsl (54%) delete mode 100644 SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/РезервноеКопированиеИнформационнойБазы/Form.form create mode 100644 SSL/src/DataProcessors/УдалениеПомеченныхОбъектов/Forms/ОсновнаяФорма/ConditionalAppearance.dcssca create mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Commands/УниверсальныйОбменДанными/CommandModule.bsl delete mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаРедактораТекстовогоДокумента/Module.bsl delete mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/Форма/Form.oform delete mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаНастройкиОтладкиОбработчиков/Form.oform delete mode 100644 SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/ФормаРедактораТекстовогоДокумента/Form.oform create mode 100644 SSL/src/DefinedTypes/ВладелецНастроекПрав/ВладелецНастроекПрав.mdo create mode 100644 SSL/src/DefinedTypes/ЗначениеДоступа/ЗначениеДоступа.mdo create mode 100644 SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Attributes/КонтактыПанельНавигации/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/DocumentJournals/Взаимодействия/Forms/ФормаСписка/Attributes/ПредметыПанельНавигации/ExtInfo/ListSettings.dcss create mode 100644 SSL/src/DocumentJournals/Взаимодействия/Templates/СхемаОтборВзаимодействияКонтакт/Template.dcs rename SSL/src/Enums/{ДействияПриСохраненииСЭЦП/ДействияПриСохраненииСЭЦП.mdo => ДействияПриСохраненииСЭП/ДействияПриСохраненииСЭП.mdo} (96%) create mode 100644 SSL/src/Enums/ДополнительныеЗначенияДоступа/ДополнительныеЗначенияДоступа.mdo create mode 100644 SSL/src/EventSubscriptions/ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизаций/ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизаций.mdo create mode 100644 SSL/src/EventSubscriptions/УстановитьПометкуУдаленияЗаметкамПользователя/УстановитьПометкуУдаленияЗаметкамПользователя.mdo create mode 100644 SSL/src/FunctionalOptions/ИспользоватьНесколькоОрганизаций/ИспользоватьНесколькоОрганизаций.mdo rename SSL/src/FunctionalOptions/{ИспользоватьЭЦПВПрисоединенныхФайлах/ИспользоватьЭЦПВПрисоединенныхФайлах.mdo => ИспользоватьЭПВПрисоединенныхФайлах/ИспользоватьЭПВПрисоединенныхФайлах.mdo} (76%) rename SSL/src/FunctionalOptions/{ИспользоватьЭлектронныеЦифровыеПодписи/ИспользоватьЭлектронныеЦифровыеПодписи.mdo => ИспользоватьЭлектронныеПодписи/ИспользоватьЭлектронныеПодписи.mdo} (67%) create mode 100644 SSL/src/FunctionalOptions/НеИспользоватьНесколькоОрганизаций/НеИспользоватьНесколькоОрганизаций.mdo create mode 100644 SSL/src/InformationRegisters/ГруппыЗначенийДоступа/Forms/ФормаСписка/ConditionalAppearance.dcssca create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename SSL/src/{DataProcessors/РегламентныеИФоновыеЗадания/Forms/ВыполнениеРегламентныхЗаданий => InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка}/ConditionalAppearance.dcssca (67%) rename SSL/src/{Catalogs/Валюты/Forms/ФормаВыбора => InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка}/Form.form (60%) create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ЗначенияГруппДоступаПоУмолчанию/ЗначенияГруппДоступаПоУмолчанию.mdo create mode 100644 SSL/src/InformationRegisters/КонтактыВзаимодействий/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/КонтактыВзаимодействий/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/КонтактыВзаимодействий/КонтактыВзаимодействий.mdo create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/Forms/ФормаСписка/ConditionalAppearance.dcssca create mode 100644 SSL/src/InformationRegisters/НаборыЗначенийДоступа/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаЗаписи/Form.form create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаЗаписи/Module.bsl create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename SSL/src/{ChartsOfCharacteristicTypes/ВидыДоступа => InformationRegisters/НаследованиеНастроекПравОбъектов}/Forms/ФормаСписка/Form.form (54%) create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/Forms/ФормаСписка/Module.bsl create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/НаследованиеНастроекПравОбъектов/НаследованиеНастроекПравОбъектов.mdo rename SSL/src/InformationRegisters/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/Forms/ФормаЗаписи/Form.form (71%) rename SSL/src/InformationRegisters/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/Forms/ФормаЗаписи/Module.bsl (99%) create mode 100644 SSL/src/InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss rename SSL/src/{CommonForms/ПоискПоИндексу => InformationRegisters/НастройкиПравОбъектов/Forms/ФормаСписка}/ConditionalAppearance.dcssca (63%) rename SSL/src/InformationRegisters/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/Forms/ФормаСписка/Form.form (76%) rename SSL/src/InformationRegisters/{ПраваПоЗначениямДоступа => НастройкиПравОбъектов}/Forms/ФормаСписка/Module.bsl (89%) create mode 100644 SSL/src/InformationRegisters/НастройкиПравОбъектов/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/НастройкиПравОбъектов/RecordSetModule.bsl rename SSL/src/InformationRegisters/{ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo => НастройкиПравОбъектов/НастройкиПравОбъектов.mdo} (58%) delete mode 100644 SSL/src/InformationRegisters/НеразделенныеПользователи/ManagerModule.bsl delete mode 100644 SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss delete mode 100644 SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/ПредметыПапкиВзаимодействий/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СостоянияКонтактовВзаимодействий/СостоянияКонтактовВзаимодействий.mdo create mode 100644 SSL/src/InformationRegisters/СостоянияПапокПисем/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СостоянияПапокПисем/RecordSetModule.bsl rename SSL/src/InformationRegisters/{НеразделенныеПользователи/НеразделенныеПользователи.mdo => СостоянияПапокПисем/СостоянияПапокПисем.mdo} (56%) create mode 100644 SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/СостоянияПредметовВзаимодействий/СостоянияПредметовВзаимодействий.mdo rename SSL/src/InformationRegisters/{АктивныеПредметыВзаимодействий/АктивныеПредметыВзаимодействий.mdo => Удалить_АктивныеПредметыВзаимодействий/Удалить_АктивныеПредметыВзаимодействий.mdo} (94%) create mode 100644 SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/УдалитьГруппыЗначенийДоступа/УдалитьГруппыЗначенийДоступа.mdo create mode 100644 SSL/src/InformationRegisters/УдалитьНаборыЗначенийДоступа/ManagerModule.bsl create mode 100644 SSL/src/InformationRegisters/УдалитьНаборыЗначенийДоступа/RecordSetModule.bsl create mode 100644 SSL/src/InformationRegisters/УдалитьНаборыЗначенийДоступа/УдалитьНаборыЗначенийДоступа.mdo create mode 100644 SSL/src/Reports/АнализЖурналаРегистрации/Forms/ФормаВарианта/Form.form create mode 100644 SSL/src/Reports/АнализЖурналаРегистрации/Forms/ФормаВарианта/Module.bsl create mode 100644 SSL/src/Reports/АнализЖурналаРегистрации/Forms/ФормаНастроек/Form.form create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/Forms/МестаИспользования/Form.form create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/Forms/МестаИспользования/Module.bsl create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/ManagerModule.bsl create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/ObjectModule.bsl create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs create mode 100644 SSL/src/Reports/МестаИспользованияСсылок/МестаИспользованияСсылок.mdo rename SSL/src/Roles/{ИспользованиеЭЦП => ИспользованиеЭП}/Rights.rights (82%) rename SSL/src/Roles/{ИспользованиеЭЦП/ИспользованиеЭЦП.mdo => ИспользованиеЭП/ИспользованиеЭП.mdo} (84%) create mode 100644 SSL/src/ScheduledJobs/УдалениеПомеченных/Schedule.schedule create mode 100644 SSL/src/ScheduledJobs/УдалениеПомеченных/УдалениеПомеченных.mdo create mode 100644 SSL/src/SessionParameters/АвторизованныйПользователь/АвторизованныйПользователь.mdo rename SSL/src/SessionParameters/{ВидыДоступаБезГруппЗначенияДоступа/ВидыДоступаБезГруппЗначенияДоступа.mdo => ВидыДоступаБезГруппДляЗначенияДоступа/ВидыДоступаБезГруппДляЗначенияДоступа.mdo} (51%) rename SSL/src/SessionParameters/{ОграничиватьДоступПоВидуУсловие/ОграничиватьДоступПоВидуУсловие.mdo => ВидыДоступаСОднойГруппойДляЗначенияДоступа/ВидыДоступаСОднойГруппойДляЗначенияДоступа.mdo} (54%) rename SSL/src/SessionParameters/{ВидыДоступаБезОграничения/ВидыДоступаБезОграничения.mdo => ВидыДоступаСОтключеннымИспользованием/ВидыДоступаСОтключеннымИспользованием.mdo} (51%) rename SSL/src/SessionParameters/{ОграничиватьДоступПоВидуОбъект/ОграничиватьДоступПоВидуОбъект.mdo => ВсеВидыДоступаКромеСпециальных/ВсеВидыДоступаКромеСпециальных.mdo} (54%) create mode 100644 SSL/src/SessionParameters/ИдентификаторыТаблицСОтдельнымиНастройкамиПрав/ИдентификаторыТаблицСОтдельнымиНастройкамиПрав.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВиду/ОграничиватьДоступПоВиду.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуВнешниеПользователи/ОграничиватьДоступПоВидуВнешниеПользователи.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуДополнительныеСведения/ОграничиватьДоступПоВидуДополнительныеСведения.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуОрганизации/ОграничиватьДоступПоВидуОрганизации.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПапкиФайлов/ОграничиватьДоступПоВидуПапкиФайлов.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПользователи/ОграничиватьДоступПоВидуПользователи.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоДобавления/ОграничиватьДоступПоВидуПравоДобавления.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоИзменения/ОграничиватьДоступПоВидуПравоИзменения.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуПравоЧтения/ОграничиватьДоступПоВидуПравоЧтения.mdo delete mode 100644 SSL/src/SessionParameters/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты/ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты.mdo rename SSL/src/SessionParameters/{ВидыДоступаЕдинственныеДляТипаЗначенияДоступа/ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.mdo => ТаблицыСОтдельнымиНастройкамиПрав/ТаблицыСОтдельнымиНастройкамиПрав.mdo} (50%) rename SSL/src/SessionParameters/{ВидыДоступаЧерезПраваПоЗначениямДоступа/ВидыДоступаЧерезПраваПоЗначениямДоступа.mdo => ТипыВладельцевНастроекПрав/ТипыВладельцевНастроекПрав.mdo} (61%) create mode 100644 SSL/src/SessionParameters/ТипыЗначенийДоступаСГруппами/ТипыЗначенийДоступаСГруппами.mdo rename SSL/src/Subsystems/{НастройкаИАдминистрирование => Администрирование}/CommandInterface.cmi (89%) rename SSL/src/Subsystems/{НастройкаИАдминистрирование/НастройкаИАдминистрирование.mdo => Администрирование/Администрирование.mdo} (83%) create mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/ГрафикиРаботы/ГрафикиРаботы.mdo delete mode 100644 SSL/src/Subsystems/СтандартныеПодсистемы/Subsystems/РаботаВМоделиСервиса/Subsystems/ВыгрузкаЗагрузкаДанных/ВыгрузкаЗагрузкаДанных.mdo create mode 100644 SSL/src/WSReferences/ОтправкаSMSЧерезМТС/WsDefinitions.wsdl create mode 100644 SSL/src/WSReferences/ОтправкаSMSЧерезМТС/ОтправкаSMSЧерезМТС.mdo delete mode 100644 SSL/src/XDTOPackages/DataDump_1_0_1_1/DataDump_1_0_1_1.mdo delete mode 100644 SSL/src/XDTOPackages/DataDump_1_0_1_1/Package.xdto diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form index 31247f274..a32621a53 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Form.form @@ -11,7 +11,7 @@ true false - ГруппаСостояниеРасширеннаяПодсказка + ГруппаСостояниеExtendedTooltip 172 Label true @@ -51,7 +51,7 @@ Объект.Автор - АвторРасширеннаяПодсказка + АвторExtendedTooltip 176 Label true @@ -97,8 +97,8 @@ Исполнитель - ИсполнительРасширеннаяПодсказка - 178 + ИсполнительExtendedTooltip + 177 Label true true @@ -138,7 +138,7 @@ Автор и исполнитель - ГруппаАвторИсполнительРасширеннаяПодсказка + ГруппаАвторИсполнительExtendedTooltip 175 Label true @@ -172,8 +172,8 @@ Объект.Date - ДатаРасширеннаяПодсказка - 181 + ДатаExtendedTooltip + 179 Label true true @@ -219,8 +219,8 @@ Срок исполнения - СрокИсполненияРасширеннаяПодсказка - 183 + СрокИсполненияExtendedTooltip + 180 Label true true @@ -261,8 +261,8 @@ Дата и срок - ГруппаДатаИСрокРасширеннаяПодсказка - 180 + ГруппаДатаИСрокExtendedTooltip + 178 Label true true @@ -295,8 +295,8 @@ Объект.Number - НомерРасширеннаяПодсказка - 186 + НомерExtendedTooltip + 182 Label true true @@ -337,8 +337,8 @@ Объект.Важность - ВажностьРасширеннаяПодсказка - 188 + ВажностьExtendedTooltip + 183 Label true true @@ -386,8 +386,8 @@ true - ГруппаНомерИВажностьРасширеннаяПодсказка - 185 + ГруппаНомерИВажностьExtendedTooltip + 181 Label true true @@ -415,7 +415,7 @@ Группы шапки - ГруппыШапкиРасширеннаяПодсказка + ГруппыШапкиExtendedTooltip 174 Label true @@ -456,8 +456,8 @@ СрокНачалаИсполненияПриИзменении - СрокНачалаИсполненияРасширеннаяПодсказка - 191 + СрокНачалаИсполненияExtendedTooltip + 185 Label true true @@ -506,8 +506,8 @@ Срок начала исполнения - СрокНачалаИсполненияВремяРасширеннаяПодсказка - 193 + СрокНачалаИсполненияВремяExtendedTooltip + 186 Label true true @@ -546,8 +546,8 @@ true - ГруппаПриоритетРасширеннаяПодсказка - 190 + ГруппаПриоритетExtendedTooltip + 184 Label true true @@ -574,7 +574,7 @@ Шапка - ШапкаРасширеннаяПодсказка + ШапкаExtendedTooltip 173 Label true @@ -609,8 +609,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 196 + НаименованиеExtendedTooltip + 188 Label true true @@ -651,8 +651,8 @@ ПредметСтрокой - ПредметРасширеннаяПодсказка - 198 + ПредметExtendedTooltip + 189 Label true true @@ -693,8 +693,8 @@ None - СодержаниеРасширеннаяПодсказка - 200 + СодержаниеExtendedTooltip + 190 Label true true @@ -746,8 +746,8 @@ ЗаданиеРезультатВыполнения - РезультатВыполненияРасширеннаяПодсказка - 202 + РезультатВыполненияExtendedTooltip + 191 Label true true @@ -795,8 +795,8 @@ false - ГруппаСодержаниеРасширеннаяПодсказка - 195 + ГруппаСодержаниеExtendedTooltip + 187 Label true true @@ -836,8 +836,8 @@ Описание результата выполнения - ОписаниеРезультатаРасширеннаяПодсказка - 205 + ОписаниеРезультатаExtendedTooltip + 193 Label true true @@ -880,8 +880,8 @@ false - ВыполненоРасширеннаяПодсказка - 208 + ВыполненоExtendedTooltip + 195 Label true true @@ -909,8 +909,8 @@ false - ОтклоненоРасширеннаяПодсказка - 209 + ОтклоненоExtendedTooltip + 196 Label true true @@ -951,8 +951,8 @@ ДатаИсполненияПриИзменении - ДатаИсполненияРасширеннаяПодсказка - 210 + ДатаИсполненияExtendedTooltip + 197 Label true true @@ -1002,8 +1002,8 @@ Срок начала исполнения - ДатаИсполненияВремяРасширеннаяПодсказка - 212 + ДатаИсполненияВремяExtendedTooltip + 198 Label true true @@ -1036,14 +1036,41 @@ Normal + + ИзменитьЗадание + 199 + true + true + + true + + + ИзменитьЗаданиеРасширеннаяПодсказка + 200 + Label + true + true + + Left + + + Hyperlink + Form.Command.ИзменитьЗадание + Normal + Auto + true + true + UserCmds + Auto + true true true - ГруппаВыполненоДатаРасширеннаяПодсказка - 207 + ГруппаВыполненоДатаExtendedTooltip + 194 Label true true @@ -1071,8 +1098,8 @@ - ГруппаРезультатРасширеннаяПодсказка - 204 + ГруппаРезультатExtendedTooltip + 192 Label true true @@ -1104,7 +1131,7 @@ false - ЗаписатьИЗакрытьРасширеннаяПодсказка + ЗаписатьИЗакрытьExtendedTooltip 166 Label true @@ -1130,7 +1157,7 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка + ОсновнаяКоманднаяПанельExtendedTooltip 167 Label true @@ -1152,7 +1179,7 @@ true - ФормаПринятьКИсполнениюРасширеннаяПодсказка + ФормаПринятьКИсполнениюExtendedTooltip 168 Label true @@ -1178,7 +1205,7 @@ true - ФормаОтменитьПринятиеКИсполнениюРасширеннаяПодсказка + ФормаОтменитьПринятиеКИсполнениюExtendedTooltip 169 Label true @@ -1206,7 +1233,7 @@ false - ДополнительноРасширеннаяПодсказка + ДополнительноExtendedTooltip 170 Label true @@ -1234,7 +1261,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 171 Label true @@ -1540,6 +1567,29 @@ Auto Auto + + ИзменитьЗадание + + <key>ru</key> + <value>Изменить задание</value> + + 7 + + ru + Изменить задание + + + true + + + + ИзменитьЗадание + + + FunctionalOption.ИзменятьЗаданияЗаднимЧислом + Auto + Auto + diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl index b056b696c..d0d5d556f 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеВыполнить/Module.bsl @@ -21,7 +21,7 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - БизнесПроцессыИЗадачиКлиент.ОбновитьДоступностьКомандПринятияКИсполнению(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ОбновитьДоступностьКомандПринятияКИсполнению(ЭтотОбъект); КонецПроцедуры @@ -48,7 +48,15 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник); + + БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); + Если ИмяСобытия = "Запись_Задание" Тогда + Если (Источник = Объект.БизнесПроцесс ИЛИ (ТипЗнч(Источник) = Тип("Массив") + И Источник.Найти(Объект.БизнесПроцесс) <> Неопределено)) Тогда + Прочитать(); + КонецЕсли; + КонецЕсли; + КонецПроцедуры &НаСервере @@ -82,19 +90,19 @@ &НаКлиенте Процедура ЗаписатьИЗакрытьВыполнить() - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); - Иначе - ОткрытьЗначение(Объект.Предмет); + Иначе + ПоказатьЗначение(,Объект.Предмет); КонецЕсли; - СтандартнаяОбработка = Ложь; КонецПроцедуры @@ -105,7 +113,7 @@ Процедура ВыполненоВыполнить(Команда) ЗаданиеВыполнено = Истина; - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект, Истина); КонецПроцедуры @@ -113,7 +121,7 @@ Процедура Отменено(Команда) ЗаданиеВыполнено = Ложь; - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект, Истина); КонецПроцедуры @@ -127,14 +135,22 @@ &НаКлиенте Процедура ПринятьКИсполнению(Команда) - БизнесПроцессыИЗадачиКлиент.ПринятьЗадачуКИсполнению(ЭтаФорма, ТекущийПользователь); + БизнесПроцессыИЗадачиКлиент.ПринятьЗадачуКИсполнению(ЭтотОбъект, ТекущийПользователь); КонецПроцедуры &НаКлиенте Процедура ОтменитьПринятиеКИсполнению(Команда) - БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачиКИсполнению(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачиКИсполнению(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьЗадание(Команда) + + Записать(); + ПоказатьЗначение(,Объект.БизнесПроцесс); КонецПроцедуры @@ -154,10 +170,12 @@ БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); - БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтотОбъект, Объект, Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; + Элементы.ИзменитьЗадание.Видимость = (Объект.Автор = Пользователи.ТекущийПользователь()); + КонецПроцедуры &НаСервере @@ -187,7 +205,6 @@ &НаСервере Процедура УстановитьСостояниеЭлементов() - БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтаФорма); + БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтотОбъект); КонецПроцедуры - diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form index 181e9d84c..793daa953 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Form.form @@ -11,7 +11,7 @@ true false - ГруппаСостояниеРасширеннаяПодсказка + ГруппаСостояниеExtendedTooltip 193 Label true @@ -51,7 +51,7 @@ Объект.Автор - АвторРасширеннаяПодсказка + АвторExtendedTooltip 197 Label true @@ -101,8 +101,8 @@ Исполнитель - ИсполнительРасширеннаяПодсказка - 199 + ИсполнительExtendedTooltip + 198 Label true true @@ -142,7 +142,7 @@ Автор и исполнитель - ГруппаАвторИсполнительРасширеннаяПодсказка + ГруппаАвторИсполнительExtendedTooltip 196 Label true @@ -176,8 +176,8 @@ Объект.Date - ДатаРасширеннаяПодсказка - 202 + ДатаExtendedTooltip + 200 Label true true @@ -223,8 +223,8 @@ Срок исполнения - СрокИсполненияРасширеннаяПодсказка - 204 + СрокИсполненияExtendedTooltip + 201 Label true true @@ -265,8 +265,8 @@ Дата и срок - ГруппаДатаИСрокРасширеннаяПодсказка - 201 + ГруппаДатаИСрокExtendedTooltip + 199 Label true true @@ -299,8 +299,8 @@ Объект.Number - НомерРасширеннаяПодсказка - 207 + НомерExtendedTooltip + 203 Label true true @@ -341,8 +341,8 @@ Объект.Важность - ВажностьРасширеннаяПодсказка - 209 + ВажностьExtendedTooltip + 204 Label true true @@ -390,8 +390,8 @@ true - ГруппаНомерИВажностьРасширеннаяПодсказка - 206 + ГруппаНомерИВажностьExtendedTooltip + 202 Label true true @@ -419,7 +419,7 @@ Группы шапки - ГруппыШапкиРасширеннаяПодсказка + ГруппыШапкиExtendedTooltip 195 Label true @@ -460,8 +460,8 @@ СрокНачалаИсполненияПриИзменении - СрокНачалаИсполненияРасширеннаяПодсказка - 212 + СрокНачалаИсполненияExtendedTooltip + 206 Label true true @@ -510,8 +510,8 @@ Срок начала исполнения - СрокНачалаИсполненияВремяРасширеннаяПодсказка - 214 + СрокНачалаИсполненияВремяExtendedTooltip + 207 Label true true @@ -550,8 +550,8 @@ true - ГруппаПриоритетРасширеннаяПодсказка - 211 + ГруппаПриоритетExtendedTooltip + 205 Label true true @@ -578,7 +578,7 @@ Шапка - ШапкаРасширеннаяПодсказка + ШапкаExtendedTooltip 194 Label true @@ -613,8 +613,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 217 + НаименованиеExtendedTooltip + 209 Label true true @@ -655,8 +655,8 @@ ПредметСтрокой - ПредметРасширеннаяПодсказка - 219 + ПредметExtendedTooltip + 210 Label true true @@ -701,8 +701,8 @@ None - СодержаниеРасширеннаяПодсказка - 221 + СодержаниеExtendedTooltip + 211 Label true true @@ -754,8 +754,8 @@ ЗаданиеРезультатВыполнения - РезультатВыполненияРасширеннаяПодсказка - 223 + РезультатВыполненияExtendedTooltip + 212 Label true true @@ -798,8 +798,8 @@ true - ГруппаСодержаниеРасширеннаяПодсказка - 216 + ГруппаСодержаниеExtendedTooltip + 208 Label true true @@ -839,8 +839,8 @@ Описание результата выполнения - ОписаниеРезультатаРасширеннаяПодсказка - 226 + ОписаниеРезультатаExtendedTooltip + 214 Label true true @@ -883,8 +883,8 @@ false - ВыполненоРасширеннаяПодсказка - 229 + ВыполненоExtendedTooltip + 216 Label true true @@ -912,8 +912,8 @@ false - ОтмененоРасширеннаяПодсказка - 230 + ОтмененоExtendedTooltip + 217 Label true true @@ -944,8 +944,8 @@ false - ВозвращеноРасширеннаяПодсказка - 231 + ВозвращеноExtendedTooltip + 218 Label true true @@ -982,8 +982,8 @@ Объект.ДатаИсполнения - ДатаИсполненияРасширеннаяПодсказка - 232 + ДатаИсполненияExtendedTooltip + 219 Label true true @@ -1029,8 +1029,8 @@ None - ДатаИсполненияВремяРасширеннаяПодсказка - 234 + ДатаИсполненияВремяExtendedTooltip + 220 Label true true @@ -1073,8 +1073,8 @@ false - ИзменитьЗаданиеРасширеннаяПодсказка - 236 + ИзменитьЗаданиеExtendedTooltip + 221 Label true true @@ -1106,8 +1106,8 @@ true - ГруппаВыполненаДатаРасширеннаяПодсказка - 228 + ГруппаВыполненаДатаExtendedTooltip + 215 Label true true @@ -1136,8 +1136,8 @@ true - ГруппаРезультатРасширеннаяПодсказка - 225 + ГруппаРезультатExtendedTooltip + 213 Label true true @@ -1170,7 +1170,7 @@ false - ЗаписатьИЗакрытьРасширеннаяПодсказка + ЗаписатьИЗакрытьExtendedTooltip 187 Label true @@ -1196,7 +1196,7 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка + ОсновнаяКоманднаяПанельExtendedTooltip 188 Label true @@ -1218,7 +1218,7 @@ true - ФормаПринятьКИсполнениюРасширеннаяПодсказка + ФормаПринятьКИсполнениюExtendedTooltip 189 Label true @@ -1244,7 +1244,7 @@ true - ФормаОтменитьПринятиеКИсполнениюРасширеннаяПодсказка + ФормаОтменитьПринятиеКИсполнениюExtendedTooltip 190 Label true @@ -1272,7 +1272,7 @@ false - ДополнительноРасширеннаяПодсказка + ДополнительноExtendedTooltip 191 Label true @@ -1300,7 +1300,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 192 Label true @@ -1593,7 +1593,7 @@ ИзменитьЗаданиеВыполнить - true + FunctionalOption.ИзменятьЗаданияЗаднимЧислом Auto Auto diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl index 6aae83e98..0be1ddb2d 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ДействиеПроверить/Module.bsl @@ -21,7 +21,7 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - КомандыРаботыСБизнесПроцессамиКлиент.ОбновитьДоступностьКомандПринятияКИсполнению(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ОбновитьДоступностьКомандПринятияКИсполнению(ЭтотОбъект); КонецПроцедуры @@ -63,7 +63,7 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник); + БизнесПроцессыИЗадачиКлиент.ФормаЗадачиОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник); Если ИмяСобытия = "Запись_Задание" Тогда Если (Источник = ЗаданиеСсылка ИЛИ (ТипЗнч(Источник) = Тип("Массив") @@ -88,12 +88,14 @@ &НаКлиенте Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); - Иначе - ОткрытьЗначение(Объект.Предмет); + Иначе + ПоказатьЗначение(,Объект.Предмет); КонецЕсли; - СтандартнаяОбработка = Ложь; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -102,7 +104,7 @@ &НаКлиенте Процедура ЗаписатьИЗакрытьВыполнить(Команда) - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект); КонецПроцедуры @@ -111,7 +113,7 @@ ЗаданиеПодтверждено = Истина; ЗаданиеВыполнено = Истина; - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект, Истина); КонецПроцедуры @@ -120,7 +122,7 @@ ЗаданиеПодтверждено = Ложь; ЗаданиеВыполнено = Ложь; - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект, Истина); КонецПроцедуры @@ -129,7 +131,7 @@ ЗаданиеПодтверждено = Истина; ЗаданиеВыполнено = Ложь; - БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтаФорма, Истина); + БизнесПроцессыИЗадачиКлиент.ЗаписатьИЗакрытьВыполнить(ЭтотОбъект, Истина); КонецПроцедуры @@ -137,7 +139,7 @@ Процедура ИзменитьЗаданиеВыполнить(Команда) Записать(); - ОткрытьЗначение(ЗаданиеСсылка); + ПоказатьЗначение(,ЗаданиеСсылка); КонецПроцедуры @@ -151,15 +153,15 @@ &НаКлиенте Процедура ПринятьКИсполнению(Команда) - КомандыРаботыСБизнесПроцессамиКлиент.ПринятьЗадачуКИсполнению(ЭтаФорма, ТекущийПользователь); + БизнесПроцессыИЗадачиКлиент.ПринятьЗадачуКИсполнению(ЭтотОбъект, ТекущийПользователь); КонецПроцедуры - + &НаКлиенте Процедура ОтменитьПринятиеКИсполнению(Команда) - КомандыРаботыСБизнесПроцессамиКлиент.ОтменитьПринятиеЗадачиКИсполнению(ЭтаФорма); - + БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачиКИсполнению(ЭтотОбъект); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -178,7 +180,7 @@ БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.СрокИсполнения); БизнесПроцессыИЗадачиСервер.УстановитьФорматДаты(Элементы.Дата); - БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтаФорма, Объект, + БизнесПроцессыИЗадачиСервер.ФормаЗадачиПриСозданииНаСервере(ЭтотОбъект, Объект, Элементы.ГруппаСостояние, Элементы.ДатаИсполнения); Элементы.ОписаниеРезультата.ТолькоПросмотр = Объект.Выполнена; @@ -214,6 +216,6 @@ &НаСервере Процедура УстановитьСостояниеЭлементов() - БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтаФорма); + БизнесПроцессы.Задание.УстановитьСостояниеЭлементовФормыЗадачи(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form index 2c552e2f4..e157669b4 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Form.form @@ -12,7 +12,7 @@ true - ДекорацияЗначокРасширеннаяПодсказка + ДекорацияЗначокExtendedTooltip 108 Label true @@ -50,7 +50,7 @@ true - ДекорацияТекстРасширеннаяПодсказка + ДекорацияТекстExtendedTooltip 109 Label true @@ -66,8 +66,9 @@ Label true - 1 true + true + false false Left @@ -80,7 +81,7 @@ true - ГруппаСостояниеРасширеннаяПодсказка + ГруппаСостояниеExtendedTooltip 107 Label true @@ -111,7 +112,7 @@ ГлавнаяЗадачаСтрокой - ГлавнаяЗадачаРасширеннаяПодсказка + ГлавнаяЗадачаExtendedTooltip 110 Label true @@ -156,8 +157,8 @@ true - ЗаголовокЗаданияРасширеннаяПодсказка - 113 + ЗаголовокЗаданияExtendedTooltip + 112 Label true true @@ -201,8 +202,8 @@ Объект.Важность - ВажностьРасширеннаяПодсказка - 115 + ВажностьExtendedTooltip + 113 Label true true @@ -241,8 +242,8 @@ Объект.Number - НомерРасширеннаяПодсказка - 117 + НомерExtendedTooltip + 114 Label true true @@ -278,8 +279,8 @@ true - ГруппаСрокВажностьРасширеннаяПодсказка - 112 + ГруппаСрокВажностьExtendedTooltip + 111 Label true true @@ -315,8 +316,8 @@ ИсполнительПриИзменении - ИсполнительРасширеннаяПодсказка - 120 + ИсполнительExtendedTooltip + 116 Label true true @@ -386,8 +387,8 @@ СрокИсполненияПриИзменении - СрокИсполненияРасширеннаяПодсказка - 122 + СрокИсполненияExtendedTooltip + 117 Label true true @@ -441,8 +442,8 @@ Срок исполнения (время) - СрокИсполненияВремяРасширеннаяПодсказка - 124 + СрокИсполненияВремяExtendedTooltip + 118 Label true true @@ -494,8 +495,8 @@ true - ГруппаИсполнениеРасширеннаяПодсказка - 119 + ГруппаИсполнениеExtendedTooltip + 115 Label true true @@ -527,8 +528,8 @@ ПредметСтрокой - ПредметРасширеннаяПодсказка - 127 + ПредметExtendedTooltip + 120 Label true true @@ -572,8 +573,8 @@ None - СодержаниеРасширеннаяПодсказка - 129 + СодержаниеExtendedTooltip + 121 Label true true @@ -617,8 +618,8 @@ - ГруппаСодержаниеРасширеннаяПодсказка - 126 + ГруппаСодержаниеExtendedTooltip + 119 Label true true @@ -661,8 +662,8 @@ НаПроверкеПриИзменении - НаПроверкеРасширеннаяПодсказка - 132 + НаПроверкеExtendedTooltip + 123 Label true true @@ -702,8 +703,8 @@ ПроверяющийПриИзменении - ПроверяющийРасширеннаяПодсказка - 135 + ПроверяющийExtendedTooltip + 125 Label true true @@ -779,8 +780,8 @@ СрокПроверкиПриИзменении - СрокПроверкиРасширеннаяПодсказка - 137 + СрокПроверкиExtendedTooltip + 126 Label true true @@ -837,8 +838,8 @@ Срок проверки (время) - СрокПроверкиВремяРасширеннаяПодсказка - 139 + СрокПроверкиВремяExtendedTooltip + 127 Label true true @@ -881,8 +882,8 @@ true - ГруппаПроверяющийРасширеннаяПодсказка - 134 + ГруппаПроверяющийExtendedTooltip + 124 Label true true @@ -911,8 +912,8 @@ true - ГруппаПроверкаРасширеннаяПодсказка - 131 + ГруппаПроверкаExtendedTooltip + 122 Label true true @@ -946,8 +947,8 @@ Объект.Автор - АвторРасширеннаяПодсказка - 142 + АвторExtendedTooltip + 129 Label true true @@ -993,8 +994,8 @@ Объект.Date - ДатаРасширеннаяПодсказка - 144 + ДатаExtendedTooltip + 130 Label true true @@ -1045,8 +1046,8 @@ true - ГруппаОбщиеСведенияРасширеннаяПодсказка - 141 + ГруппаОбщиеСведенияExtendedTooltip + 128 Label true true @@ -1069,6 +1070,110 @@ ФормаКоманднаяПанель -1 + + ФормаСтартИЗакрыть + 131 + true + true + + true + + + ФормаСтартИЗакрытьРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + Form.StandardCommand.StartAndClose + Auto + true + true + true + UserCmds + Auto + + + ФормаЗаписатьИЗакрыть + 141 + true + true + + true + + + ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + 142 + Label + true + true + + Left + + + Form.Command.ЗаписатьИЗакрыть + Normal + Auto + true + true + UserCmds + Auto + + + ФормаЗаписать + 135 + true + true + + true + + + ФормаЗаписатьРасширеннаяПодсказка + 136 + Label + true + true + + Left + + + Form.StandardCommand.Write + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСтарт + 137 + true + true + + true + + + ФормаСтартРасширеннаяПодсказка + 138 + Label + true + true + + Left + + + Form.StandardCommand.Start + Normal + Auto + true + true + UserCmds + Auto + ФормаОстановить 101 @@ -1078,7 +1183,7 @@ true - ФормаОстановитьРасширеннаяПодсказка + ФормаОстановитьExtendedTooltip 105 Label true @@ -1104,7 +1209,7 @@ true - ФормаПродолжитьРасширеннаяПодсказка + ФормаПродолжитьExtendedTooltip 106 Label true @@ -1121,8 +1226,93 @@ UserCmds Auto + + ГлобальныеКоманды + 143 + true + true + + true + + + <key>ru</key> + <value>Глобальные команды</value> + + + ru + Глобальные команды + + + ГлобальныеКомандыРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + FormCommandPanelGlobalCommands + + + + СтандартныеКоманды + 133 + true + true + + true + + + <key>ru</key> + <value>Стандартные команды</value> + + + ru + Стандартные команды + + + СтандартныеКомандыРасширеннаяПодсказка + 134 + Label + true + true + + Left + + + + Form + + + + ФормаСправка + 139 + true + true + + true + + + ФормаСправкаРасширеннаяПодсказка + 140 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + Left - true ChoiceProcessing @@ -1136,6 +1326,7 @@ OnCreateAtServer ПриСозданииНаСервере + Activate DontBlock true true @@ -1276,6 +1467,28 @@ Auto Auto + + ЗаписатьИЗакрыть + + <key>ru</key> + <value>Записать и закрыть</value> + + 3 + + ru + Записать и закрыть + + + true + + + + ЗаписатьИЗакрыть + + + Auto + Auto + @@ -1285,6 +1498,10 @@ AfterWrite ПослеЗаписи + + OnReadAtServer + ПриЧтенииНаСервере + OnWriteAtServer ПриЗаписиНаСервере diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl index 0c38fd32c..c21e49634 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаБизнесПроцесса/Module.bsl @@ -15,50 +15,12 @@ Возврат; КонецЕсли; - НачальныйПризнакСтарта = Объект.Стартован; - - ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); - Элементы.СрокИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; - Элементы.СрокПроверкиВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; - Элементы.Дата.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); - - Элементы.Предмет.Гиперссылка = Объект.Предмет <> Неопределено И НЕ Объект.Предмет.Пустая(); - ПредметСтрокой = ОбщегоНазначения.ПредметСтрокой(Объект.Предмет); - Элементы.ГруппаСостояние.Видимость = Объект.Завершен; - Если Объект.Завершен Тогда - ДатаЗавершенияСтрокой = ?(ИспользоватьДатуИВремяВСрокахЗадач, - Формат(Объект.ДатаЗавершения, "ДЛФ=DT"), Формат(Объект.ДатаЗавершения, "ДЛФ=D")); - ТекстСостояния = ?(Объект.Выполнено, - НСтр("ru = 'Задание выполнено %1.'"), - НСтр("ru = 'Задание отменено %1.'")); - Элементы.ДекорацияТекст.Заголовок = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСостояния, - ДатаЗавершенияСтрокой); - - Для каждого Элемент Из Элементы Цикл - Если ТипЗнч(Элемент) <> Тип("ПолеФормы") И ТипЗнч(Элемент) <> Тип("ГруппаФормы") Тогда - Продолжить; - КонецЕсли; - Элемент.ТолькоПросмотр = Истина; - КонецЦикла; - + // Для нового объекта выполняем код инициализации формы в ПриСозданииНаСервере. + // Для существующего - в ПриЧтенииНаСервере. + Если Объект.Ссылка.Пустая() Тогда + ИнициализацияФормы(); КонецЕсли; - Если Объект.ГлавнаяЗадача = Неопределено Или Объект.ГлавнаяЗадача.Пустая() Тогда - Элементы.ГлавнаяЗадача.Гиперссылка = Ложь; - ГлавнаяЗадачаСтрокой = НСтр("ru = 'не задана'"); - Иначе - ГлавнаяЗадачаСтрокой = Строка(Объект.ГлавнаяЗадача); - КонецЕсли; - - Если Не ПолучитьФункциональнуюОпцию("ИспользоватьПодчиненныеБизнесПроцессы") Тогда - Элементы.ГлавнаяЗадача.Видимость = Ложь; - КонецЕсли; - - БизнесПроцессыИЗадачиСервер.ПриОпределенииИспользованияВнешнихЗадачИБизнесПроцессов(ИспользоватьВнешниеЗадачиИБизнесПроцессы); - - УстановитьДоступностьПроверяющего(ЭтаФорма); - КонецПроцедуры &НаКлиенте @@ -68,6 +30,13 @@ КонецПроцедуры +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) + + ИнициализацияФормы(); + +КонецПроцедуры + &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) @@ -79,7 +48,7 @@ Объект.Исполнитель = ВыбранноеЗначение.РольИсполнителя; КонецЕсли; - УстановитьДоступностьПроверяющего(ЭтаФорма); + УстановитьДоступностьПроверяющего(ЭтотОбъект); ИначеЕсли КонтекстВыбора = "ПроверяющийПриИзменении" Тогда @@ -117,27 +86,29 @@ &НаКлиенте Процедура НаПроверкеПриИзменении(Элемент) - УстановитьДоступностьПроверяющего(ЭтаФорма); + УстановитьДоступностьПроверяющего(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПредметНажатие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; Если ТипЗнч(Объект.Предмет) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.Предмет); - Иначе - ОткрытьЗначение(Объект.Предмет); + Иначе + ПоказатьЗначение(,Объект.Предмет); КонецЕсли; - СтандартнаяОбработка = Ложь; + КонецПроцедуры &НаКлиенте Процедура ГлавнаяЗадачаНажатие(Элемент, СтандартнаяОбработка) - Если Не БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.ГлавнаяЗадача) Тогда - ОткрытьЗначение(Объект.ГлавнаяЗадача); - КонецЕсли; СтандартнаяОбработка = Ложь; + Если Не БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Объект.ГлавнаяЗадача) Тогда + ПоказатьЗначение(,Объект.ГлавнаяЗадача); + КонецЕсли; КонецПроцедуры @@ -170,7 +141,7 @@ ПараметрыФормы.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); ПараметрыФормы.Вставить("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); - ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтотОбъект); Возврат; @@ -178,7 +149,7 @@ КонецЕсли; - УстановитьДоступностьПроверяющего(ЭтаФорма); + УстановитьДоступностьПроверяющего(ЭтотОбъект); КонецПроцедуры @@ -243,7 +214,7 @@ ПараметрыФормы.Вставить("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); ПараметрыФормы.Вставить("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); - ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтотОбъект); КонецЕсли; @@ -302,10 +273,23 @@ //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + ОчиститьСообщения(); + Если Не ПроверитьЗаполнение() Тогда + Возврат; + КонецЕсли; + + Записать(); + Закрыть(); + +КонецПроцедуры + &НаКлиенте Процедура Остановить(Команда) - БизнесПроцессыИЗадачиКлиент.ОстановитьБизнесПроцессИзФормыОбъекта(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ОстановитьБизнесПроцессИзФормыОбъекта(ЭтотОбъект); ОбновитьДоступностьКомандОстановки(); КонецПроцедуры @@ -313,7 +297,7 @@ &НаКлиенте Процедура ПродолжитьБизнесПроцесс(Команда) - БизнесПроцессыИЗадачиКлиент.ПродолжитьБизнесПроцессИзФормыОбъекта(ЭтаФорма); + БизнесПроцессыИЗадачиКлиент.ПродолжитьБизнесПроцессИзФормыОбъекта(ЭтотОбъект); ОбновитьДоступностьКомандОстановки(); КонецПроцедуры @@ -321,6 +305,68 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаСервере +Процедура ИнициализацияФормы() + + НачальныйПризнакСтарта = Объект.Стартован; + + ИспользоватьДатуИВремяВСрокахЗадач = ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"); + Элементы.СрокИсполненияВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.СрокПроверкиВремя.Видимость = ИспользоватьДатуИВремяВСрокахЗадач; + Элементы.Дата.Формат = ?(ИспользоватьДатуИВремяВСрокахЗадач, "ДЛФ=DT", "ДЛФ=D"); + + Элементы.Предмет.Гиперссылка = Объект.Предмет <> Неопределено И НЕ Объект.Предмет.Пустая(); + ПредметСтрокой = ОбщегоНазначения.ПредметСтрокой(Объект.Предмет); + Элементы.ГруппаСостояние.Видимость = Объект.Завершен Или Объект.Стартован; + Если Объект.Завершен Тогда + ДатаЗавершенияСтрокой = ?(ИспользоватьДатуИВремяВСрокахЗадач, + Формат(Объект.ДатаЗавершения, "ДЛФ=DT"), Формат(Объект.ДатаЗавершения, "ДЛФ=D")); + ТекстСостояния = ?(Объект.Выполнено, + НСтр("ru = 'Задание выполнено %1.'"), + НСтр("ru = 'Задание отменено %1.'")); + Элементы.ДекорацияТекст.Заголовок = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСостояния, + ДатаЗавершенияСтрокой); + + Для каждого Элемент Из Элементы Цикл + Если ТипЗнч(Элемент) <> Тип("ПолеФормы") И ТипЗнч(Элемент) <> Тип("ГруппаФормы") Тогда + Продолжить; + КонецЕсли; + Элемент.ТолькоПросмотр = Истина; + КонецЦикла; + + Иначе + + ТекстСостояния = ?(ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"), + НСтр("ru = 'Изменения формулировки, важности, автора, а также перенос сроков исполнения и проверки задания + |вступят в силу немедленно для ранее выданной задачи.'"), + НСтр("ru = 'Изменения формулировки, важности, автора, а также перенос сроков исполнения и проверки задания + |не будут отражены в ранее выданной задаче.'")); + Элементы.ДекорацияТекст.Заголовок = ТекстСостояния; + КонецЕсли; + + Элементы.ФормаСтартИЗакрыть.Видимость = Не Объект.Стартован; + Элементы.ФормаСтартИЗакрыть.КнопкаПоУмолчанию = Не Объект.Стартован; + Элементы.ФормаСтарт.Видимость = Не Объект.Стартован; + Элементы.ФормаЗаписатьИЗакрыть.Видимость = Объект.Стартован; + Элементы.ФормаЗаписатьИЗакрыть.КнопкаПоУмолчанию = Объект.Стартован; + + Если Объект.ГлавнаяЗадача = Неопределено Или Объект.ГлавнаяЗадача.Пустая() Тогда + Элементы.ГлавнаяЗадача.Гиперссылка = Ложь; + ГлавнаяЗадачаСтрокой = НСтр("ru = 'не задана'"); + Иначе + ГлавнаяЗадачаСтрокой = Строка(Объект.ГлавнаяЗадача); + КонецЕсли; + + Если Не ПолучитьФункциональнуюОпцию("ИспользоватьПодчиненныеБизнесПроцессы") Тогда + Элементы.ГлавнаяЗадача.Видимость = Ложь; + КонецЕсли; + + БизнесПроцессыИЗадачиСервер.ПриОпределенииИспользованияВнешнихЗадачИБизнесПроцессов(ИспользоватьВнешниеЗадачиИБизнесПроцессы); + + УстановитьДоступностьПроверяющего(ЭтотОбъект); +КонецПроцедуры + &НаКлиенте Процедура ОбновитьДоступностьКомандОстановки() diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 19e2f0520..3b13f2128 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -33,4 +33,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form index a97c5fad1..89a073125 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Form.form @@ -22,7 +22,7 @@ ПоАвторуПриИзменении - ПоАвторуРасширеннаяПодсказка + ПоАвторуExtendedTooltip 60 Label true @@ -71,8 +71,8 @@ ПоИсполнителюПриИзменении - ПоИсполнителюРасширеннаяПодсказка - 62 + ПоИсполнителюExtendedTooltip + 61 Label true true @@ -120,8 +120,8 @@ ПоПроверяющемуПриИзменении - ПоПроверяющемуРасширеннаяПодсказка - 64 + ПоПроверяющемуExtendedTooltip + 62 Label true true @@ -163,7 +163,7 @@ Отборы - ГруппаПоРеквизитамРасширеннаяПодсказка + ГруппаПоРеквизитамExtendedTooltip 59 Label true @@ -201,8 +201,8 @@ ПоказыватьЗавершенныеЗаданияПриИзменении - ПоказыватьЗавершенныеЗаданияРасширеннаяПодсказка - 67 + ПоказыватьЗавершенныеЗаданияExtendedTooltip + 64 Label true true @@ -239,8 +239,8 @@ ПоказыватьОстановленныеПриИзменении - ПоказыватьОстановленныеРасширеннаяПодсказка - 69 + ПоказыватьОстановленныеExtendedTooltip + 65 Label true true @@ -275,8 +275,8 @@ true - ФлажкиРасширеннаяПодсказка - 66 + ФлажкиExtendedTooltip + 63 Label true true @@ -303,7 +303,7 @@ Отбор - ГруппаОтборРасширеннаяПодсказка + ГруппаОтборExtendedTooltip 58 Label true @@ -334,8 +334,8 @@ true - ФормаОстановитьРасширеннаяПодсказка - 72 + ФормаОстановитьExtendedTooltip + 67 Label true true @@ -360,8 +360,8 @@ true - ФормаПродолжитьБизнесПроцессРасширеннаяПодсказка - 73 + ФормаПродолжитьБизнесПроцессExtendedTooltip + 68 Label true true @@ -391,8 +391,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 71 + КоманднаяПанельExtendedTooltip + 66 Label true true @@ -437,8 +437,8 @@ Важность - ВажностьКартинкаРасширеннаяПодсказка - 84 + ВажностьКартинкаExtendedTooltip + 70 Label true true @@ -490,8 +490,8 @@ Бизнес-процесс остановлен - ОстановленРасширеннаяПодсказка - 86 + ОстановленExtendedTooltip + 71 Label true true @@ -539,8 +539,8 @@ true - НомерРасширеннаяПодсказка - 88 + НомерExtendedTooltip + 72 Label true true @@ -575,8 +575,8 @@ Список.Date - ДатаРасширеннаяПодсказка - 90 + ДатаExtendedTooltip + 73 Label true true @@ -614,8 +614,8 @@ Список.Наименование - НаименованиеРасширеннаяПодсказка - 93 + НаименованиеExtendedTooltip + 75 Label true true @@ -650,8 +650,8 @@ Список.Содержание - СодержаниеРасширеннаяПодсказка - 95 + СодержаниеExtendedTooltip + 76 Label true true @@ -684,8 +684,8 @@ Содержание - ГруппаСодержаниеРасширеннаяПодсказка - 92 + ГруппаСодержаниеExtendedTooltip + 74 Label true true @@ -712,8 +712,8 @@ Список.Предмет - ПредметРасширеннаяПодсказка - 97 + ПредметExtendedTooltip + 77 Label true true @@ -748,8 +748,8 @@ Список.СрокИсполнения - СрокИсполненияРасширеннаяПодсказка - 99 + СрокИсполненияExtendedTooltip + 78 Label true true @@ -782,8 +782,8 @@ Список.СрокПроверки - СрокПроверкиРасширеннаяПодсказка - 101 + СрокПроверкиExtendedTooltip + 79 Label true true @@ -816,8 +816,8 @@ Список.Started - СтартованРасширеннаяПодсказка - 103 + СтартованExtendedTooltip + 80 Label true true @@ -849,8 +849,8 @@ Список.ДатаЗавершения - ДатаЗавершенияРасширеннаяПодсказка - 105 + ДатаЗавершенияExtendedTooltip + 81 Label true true @@ -883,8 +883,8 @@ Список.HeadTask - ВедущаяЗадачаРасширеннаяПодсказка - 107 + ВедущаяЗадачаExtendedTooltip + 82 Label true true @@ -919,8 +919,8 @@ Список.НомерИтерации - НомерИтерацииРасширеннаяПодсказка - 109 + НомерИтерацииExtendedTooltip + 83 Label true true @@ -953,8 +953,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 111 + АвторExtendedTooltip + 84 Label true true @@ -987,8 +987,8 @@ Список.Исполнитель - ИсполнительРасширеннаяПодсказка - 113 + ИсполнительExtendedTooltip + 85 Label true true @@ -1025,8 +1025,8 @@ None - НаПроверкеРасширеннаяПодсказка - 116 + НаПроверкеExtendedTooltip + 87 Label true true @@ -1056,8 +1056,8 @@ Список.Проверяющий - ПроверяющийРасширеннаяПодсказка - 118 + ПроверяющийExtendedTooltip + 88 Label true true @@ -1090,8 +1090,8 @@ На проверке - ГруппаПроверкаРасширеннаяПодсказка - 115 + ГруппаПроверкаExtendedTooltip + 86 Label true true @@ -1114,10 +1114,10 @@ СписокСтрокаПоиска - 75 + 94 СписокСтрокаПоискаРасширеннаяПодсказка - 77 + 96 Label true true @@ -1127,7 +1127,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 76 + 95 true Список @@ -1137,10 +1137,10 @@ СписокСостояниеПросмотра - 78 + 97 СписокСостояниеПросмотраРасширеннаяПодсказка - 80 + 99 Label true true @@ -1150,7 +1150,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 79 + 98 true ViewStatusAddition @@ -1161,10 +1161,10 @@ СписокУправлениеПоиском - 81 + 100 СписокУправлениеПоискомРасширеннаяПодсказка - 83 + 102 Label true true @@ -1174,7 +1174,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 82 + 101 true SearchControlAddition @@ -1184,8 +1184,8 @@ - СписокРасширеннаяПодсказка - 74 + СписокExtendedTooltip + 69 Label true true diff --git a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl index 2e7349f35..099ea2711 100644 --- a/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/BusinessProcesses/Задание/Forms/ФормаСписка/Module.bsl @@ -82,7 +82,7 @@ ПараметрыОтбора.Вставить("ПоАвтору", ПоАвтору); ПараметрыОтбора.Вставить("ПоИсполнителю", ПоИсполнителю); ПараметрыОтбора.Вставить("ПоПроверяющему", ПоПроверяющему); - УстановитьОтборСписка(ПараметрыОтбора); + УстановитьОтборСписка(ПараметрыОтбора); КонецПроцедуры &НаСервере diff --git a/SSL/src/BusinessProcesses/Задание/Help/ru.html b/SSL/src/BusinessProcesses/Задание/Help/ru.html index 08597c771..9dc8d1ef9 100644 --- a/SSL/src/BusinessProcesses/Задание/Help/ru.html +++ b/SSL/src/BusinessProcesses/Задание/Help/ru.html @@ -1,3 +1,3 @@ - +

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

См. также: Общая информация о бизнес-процессах.

\ No newline at end of file diff --git a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl index 709ffecbc..07b7ecc71 100644 --- a/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl +++ b/SSL/src/BusinessProcesses/Задание/ObjectModule.bsl @@ -5,31 +5,12 @@ // СтандартныеПодсистемы.УправлениеДоступом -// Процедура ЗаполнитьНаборыЗначенийДоступа по свойствам объекта заполняет наборы значений доступа -// в таблице с полями: -// НомерНабора - Число (необязательно, если набор один), -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), -// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), -// Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// -// Вызывается из процедуры УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа(), -// если объект зарегистрирован в "ПодпискаНаСобытие.ЗаписатьНаборыЗначенийДоступа" и -// из таких же процедур объектов, у которых наборы значений доступа зависят от наборов этого -// объекта (в этом случае объект зарегистрирован в "ПодпискаНаСобытие.ЗаписатьЗависимыеНаборыЗначенийДоступа"). -// -// Параметры: -// Таблица - ТабличнаяЧасть, -// РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа, -// ТаблицаЗначений, возвращаемая УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(). -// +// См. описание в комментарии к одноименной процедуре в модуле УправлениеДоступом. Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт // Логика ограничения: - // Чтения: Автор ИЛИ Исполнитель ИЛИ Проверяющий ИЛИ Предмет - // Добавления, Изменения: Автор + // Чтения: Автор ИЛИ Исполнитель ИЛИ Проверяющий ИЛИ Предмет + // Изменения: Автор // Если предмет не задан (т.е. бизнес-процесс без основания), // тогда предмет не участвует в логике ограничения. @@ -38,33 +19,28 @@ Строка = Таблица.Добавить(); Строка.НомерНабора = 1; Строка.Чтение = Истина; - Строка.Добавление = Истина; Строка.Изменение = Истина; - Строка.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].Пользователи; Строка.ЗначениеДоступа = Автор; // Чтение: набор №2. Строка = Таблица.Добавить(); Строка.НомерНабора = 2; Строка.Чтение = Истина; - Строка.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].Пользователи; Строка.ЗначениеДоступа = Исполнитель; // Чтение: набор №3. Строка = Таблица.Добавить(); Строка.НомерНабора = 3; Строка.Чтение = Истина; - Строка.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].Пользователи; Строка.ЗначениеДоступа = Проверяющий; // Чтение: набор "№4". Если ЗначениеЗаполнено(Предмет) Тогда - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); Если ТипЗнч(Предмет) = Тип("СправочникСсылка.Пользователи") Тогда Строка = Таблица.Добавить(); Строка.НомерНабора = 4; Строка.Чтение = Истина; - Строка.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].Пользователи; Строка.ЗначениеДоступа = Предмет; ИначеЕсли МодульУправлениеДоступом.ВозможноЗаполнитьНаборыЗначенийДоступа(Предмет) Тогда @@ -89,6 +65,11 @@ НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", Ссылка); + Блокировка.Заблокировать(); + Запрос = Новый Запрос( "ВЫБРАТЬ | Задачи.Ссылка КАК Ссылка @@ -99,19 +80,8 @@ | И Задачи.ПометкаУдаления = ЛОЖЬ | И Задачи.Выполнена = ЛОЖЬ"); Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); - Результат = Запрос.Выполнить(); + ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); - Блокировка = Новый БлокировкаДанных; - - ВыборкаДетальныеЗаписи = Результат.Выбрать(); - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДетальныеЗаписи.Ссылка); - КонецЦикла; - Блокировка.Заблокировать(); - - ВыборкаДетальныеЗаписи.Сбросить(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); ЗадачаОбъект.Важность = Важность; @@ -415,6 +385,11 @@ УстановитьПривилегированныйРежим(Истина); НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", Ссылка); + Блокировка.Заблокировать(); + Запрос = Новый Запрос( "ВЫБРАТЬ | Задачи.Ссылка КАК Ссылка @@ -424,18 +399,8 @@ | Задачи.БизнесПроцесс = &БизнесПроцесс"); Запрос.УстановитьПараметр("БизнесПроцесс", Ссылка); - Результат = Запрос.Выполнить(); + ВыборкаДетальныеЗаписи = Запрос.Выполнить().Выбрать(); - Блокировка = Новый БлокировкаДанных; - ВыборкаДетальныеЗаписи = Результат.Выбрать(); - Пока ВыборкаДетальныеЗаписи.Следующий() Цикл - ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Ссылка", ВыборкаДетальныеЗаписи.Ссылка); - КонецЦикла; - Блокировка.Заблокировать(); - - ВыборкаДетальныеЗаписи.Сбросить(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл ЗадачаОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект(); ЗадачаОбъект.Предмет = Предмет; diff --git a/SSL/src/BusinessProcesses/Задание/Задание.mdo b/SSL/src/BusinessProcesses/Задание/Задание.mdo index 3e7247535..5fdade934 100644 --- a/SSL/src/BusinessProcesses/Задание/Задание.mdo +++ b/SSL/src/BusinessProcesses/Задание/Задание.mdo @@ -37,6 +37,14 @@ Use Completed + + ru + Завершено + + + ru + Задание завершено + Use @@ -97,6 +105,8 @@ ru + BusinessProcess.Задание.Attribute.ГлавнаяЗадача + BusinessProcess.Задание.StandardAttribute.HeadTask Managed Use @@ -203,6 +213,7 @@ + Index Use Use diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form index 6c86cfdd8..3c87c2e00 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Form.form @@ -37,8 +37,8 @@ Валюты.КодВалютыЦифровой - КодВалютыРасширеннаяПодсказка - 38 + КодВалютыExtendedTooltip + 29 Label true true @@ -79,8 +79,8 @@ Валюты.КодВалютыБуквенный - КраткоеНаименованиеРасширеннаяПодсказка - 40 + КраткоеНаименованиеExtendedTooltip + 30 Label true true @@ -121,8 +121,8 @@ Валюты.Наименование - НаименованиеРасширеннаяПодсказка - 42 + НаименованиеExtendedTooltip + 31 Label true true @@ -163,8 +163,8 @@ Валюты.СтраныИТерритории - СтраныИТерриторииРасширеннаяПодсказка - 44 + СтраныИТерриторииExtendedTooltip + 32 Label true true @@ -207,8 +207,8 @@ Валюта может быть загружена с сайта РБК - ЗагружаетсяРасширеннаяПодсказка - 46 + ЗагружаетсяExtendedTooltip + 33 Label true true @@ -242,7 +242,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 24 Label true @@ -268,7 +268,7 @@ false - НайтиРасширеннаяПодсказка + НайтиExtendedTooltip 25 Label true @@ -295,7 +295,7 @@ false - ОтменитьПоискРасширеннаяПодсказка + ОтменитьПоискExtendedTooltip 26 Label true @@ -321,7 +321,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 27 Label true @@ -346,10 +346,10 @@ СписокВалютСтрокаПоиска - 29 + 34 СписокВалютСтрокаПоискаРасширеннаяПодсказка - 31 + 36 Label true true @@ -359,7 +359,7 @@ СписокВалютСтрокаПоискаКонтекстноеМеню - 30 + 35 true СписокВалют @@ -369,10 +369,10 @@ СписокВалютСостояниеПросмотра - 32 + 37 СписокВалютСостояниеПросмотраРасширеннаяПодсказка - 34 + 39 Label true true @@ -382,7 +382,7 @@ СписокВалютСостояниеПросмотраКонтекстноеМеню - 33 + 38 true ViewStatusAddition @@ -393,10 +393,10 @@ СписокВалютУправлениеПоиском - 35 + 40 СписокВалютУправлениеПоискомРасширеннаяПодсказка - 37 + 42 Label true true @@ -406,7 +406,7 @@ СписокВалютУправлениеПоискомКонтекстноеМеню - 36 + 41 true SearchControlAddition @@ -416,7 +416,7 @@ - СписокВалютРасширеннаяПодсказка + СписокВалютExtendedTooltip 28 Label true @@ -437,7 +437,7 @@ true - СписокВалютКонтекстноеМенюВыбратьРасширеннаяПодсказка + СписокВалютКонтекстноеМенюВыбратьExtendedTooltip 21 Label true @@ -463,7 +463,7 @@ true - СписокВалютКонтекстноеМенюНайтиРасширеннаяПодсказка + СписокВалютКонтекстноеМенюНайтиExtendedTooltip 22 Label true @@ -489,7 +489,7 @@ true - СписокВалютКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка + СписокВалютКонтекстноеМенюОтменитьПоискExtendedTooltip 23 Label true diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html index f7db8a2ec..1162be1b4 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Help/ru.html @@ -1,4 +1,4 @@ - +

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

Реквизиты:

diff --git a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl index 43186224d..9cce426cd 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ПодборВалютИзКлассификатора/Module.bsl @@ -110,7 +110,8 @@ ПоказатьОповещениеПользователя( НСтр("ru = 'Валюты добавлены.'"), , - ?(ОбщегоНазначенияПовтИсп.РазделениеВключено() И ЕстьКурсы, НСтр("ru = 'Курсы будут загружены автоматически через непродолжительное время.'"), ""), + ?(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено И ЕстьКурсы, + НСтр("ru = 'Курсы будут загружены автоматически через непродолжительное время.'"), ""), БиблиотекаКартинок.Информация32); Закрыть(); diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаВыбора/Module.bsl deleted file mode 100644 index dd42fd93a..000000000 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаВыбора/Module.bsl +++ /dev/null @@ -1,55 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ДатаКурса = НачалоДня(ТекущаяДатаСеанса()); - Элементы.Курс.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Курс на %1'"), - Формат(ДатаКурса, "ДЛФ=DD")); - Элементы.Курс.Подсказка = Элементы.Курс.Заголовок; - Список.Параметры.УстановитьЗначениеПараметра("КонецПериода", ДатаКурса); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Валюты - -&НаКлиенте -Процедура ВалютыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - - Текст = НСтр("ru = 'Есть возможность подобрать валюту из классификатора. - |Подобрать?'"); - Результат = Вопрос(Текст, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - Если Результат = КодВозвратаДиалога.Да Тогда - Отказ = Истина; - - ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора", , ЭтаФорма); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ПодобратьИзКлассификатора(Команда) - - ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора",, ЭтаФорма); - -КонецПроцедуры - - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Элементы.Валюты.Обновить(); - Элементы.Валюты.ТекущаяСтрока = ВыбранноеЗначение; - -КонецПроцедуры - diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 0254953cb..c92f7a5ca 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Form.form @@ -25,8 +25,8 @@ Список.Code - КодРасширеннаяПодсказка - 62 + КодExtendedTooltip + 53 Label true true @@ -66,8 +66,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 64 + НаименованиеExtendedTooltip + 54 Label true true @@ -107,8 +107,8 @@ Список.НаименованиеПолное - НаименованиеПолноеРасширеннаяПодсказка - 66 + НаименованиеПолноеExtendedTooltip + 55 Label true true @@ -148,8 +148,8 @@ Список.Курс - КурсРасширеннаяПодсказка - 68 + КурсExtendedTooltip + 56 Label true true @@ -189,8 +189,8 @@ None - РубЗаРасширеннаяПодсказка - 71 + РубЗаExtendedTooltip + 58 Label true true @@ -230,8 +230,8 @@ кратность равная единице не отображается - КратностьРасширеннаяПодсказка - 73 + КратностьExtendedTooltip + 59 Label true true @@ -267,8 +267,8 @@ None - КраткоеНаименованиеРасширеннаяПодсказка - 75 + КраткоеНаименованиеExtendedTooltip + 60 Label true true @@ -305,8 +305,8 @@ Кратность валюты. Отображается, если не равна 1. - ПредставлениеКратностиРасширеннаяПодсказка - 70 + ПредставлениеКратностиExtendedTooltip + 57 Label true true @@ -334,10 +334,10 @@ ВалютыСтрокаПоиска - 53 + 61 ВалютыСтрокаПоискаРасширеннаяПодсказка - 55 + 63 Label true true @@ -347,7 +347,7 @@ ВалютыСтрокаПоискаКонтекстноеМеню - 54 + 62 true Валюты @@ -357,10 +357,10 @@ ВалютыСостояниеПросмотра - 56 + 64 ВалютыСостояниеПросмотраРасширеннаяПодсказка - 58 + 66 Label true true @@ -370,7 +370,7 @@ ВалютыСостояниеПросмотраКонтекстноеМеню - 57 + 65 true ViewStatusAddition @@ -381,10 +381,10 @@ ВалютыУправлениеПоиском - 59 + 67 ВалютыУправлениеПоискомРасширеннаяПодсказка - 61 + 69 Label true true @@ -394,7 +394,7 @@ ВалютыУправлениеПоискомКонтекстноеМеню - 60 + 68 true SearchControlAddition @@ -404,7 +404,7 @@ - ВалютыРасширеннаяПодсказка + ВалютыExtendedTooltip 52 Label true @@ -466,7 +466,7 @@ true - ФормаЗагрузитьКурсыВалютРасширеннаяПодсказка + ФормаЗагрузитьКурсыВалютExtendedTooltip 50 Label true @@ -492,7 +492,7 @@ true - ФормаПодборИзОКВРасширеннаяПодсказка + ФормаПодборИзОКВExtendedTooltip 51 Label true diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl index 4b20d2cac..8a765e025 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаСписка/Module.bsl @@ -15,6 +15,8 @@ Элементы.Курс.Подсказка = Элементы.Курс.Заголовок; Список.Параметры.УстановитьЗначениеПараметра ("КонецПериода", ДатаКурса); + Элементы.Валюты.РежимВыбора = Параметры.РежимВыбора; + КонецПроцедуры &НаКлиенте @@ -40,16 +42,11 @@ &НаКлиенте Процедура ВалютыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Текст = НСтр("ru = 'Есть возможность подобрать валюту из классификатора. - |Подобрать?'"); - Результат = Вопрос(Текст, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - Если Результат = КодВозвратаДиалога.Да Тогда - Отказ = Истина; - - ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора", , ЭтаФорма); - КонецЕсли; - + |Подобрать?'"); + Оповещение = Новый ОписаниеОповещения("ВалютыПередНачаломДобавленияЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + Отказ = Истина; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -58,7 +55,7 @@ &НаКлиенте Процедура ПодборИзОКВ(Команда) - ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора",, ЭтаФорма); + ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора",, ЭтотОбъект); КонецПроцедуры @@ -68,4 +65,17 @@ ОткрытьФорму("Обработка.ЗагрузкаКурсовВалют.Форма", ПараметрыФормы); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ВалютыПередНачаломДобавленияЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ОткрытьФорму("Справочник.Валюты.Форма.ПодборВалютИзКлассификатора", , ЭтотОбъект); + Иначе + ОткрытьФорму("Справочник.Валюты.ФормаОбъекта"); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form index 9aaaa82f7..a0592563c 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.НаименованиеПолное - НаименованиеПолноеРасширеннаяПодсказка + НаименованиеПолноеExtendedTooltip 72 Label true @@ -63,8 +63,8 @@ Объект.Code - КодРасширеннаяПодсказка - 76 + КодExtendedTooltip + 75 Label true true @@ -108,8 +108,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 78 + НаименованиеExtendedTooltip + 76 Label true true @@ -160,8 +160,8 @@ ЗагружаетсяИзИнтернетаПриИзменении - ЗагружаетсяИзИнтернетаРасширеннаяПодсказка - 81 + ЗагружаетсяИзИнтернетаExtendedTooltip + 78 Label true true @@ -201,8 +201,8 @@ ЗависимыйКурсВалютПриИзменении - ЗависимыйКурсВалютРасширеннаяПодсказка - 84 + ЗависимыйКурсВалютExtendedTooltip + 80 Label true true @@ -234,8 +234,8 @@ Объект.ОсновнаяВалюта - ОсновнаяВалютаРасширеннаяПодсказка - 86 + ОсновнаяВалютаExtendedTooltip + 81 Label true true @@ -285,8 +285,8 @@ Объект.Наценка - НаценкаРасширеннаяПодсказка - 88 + НаценкаExtendedTooltip + 82 Label true true @@ -339,8 +339,8 @@ Группа зависимый курс валют - ГруппаЗависимыйКурсВалютРасширеннаяПодсказка - 83 + ГруппаЗависимыйКурсВалютExtendedTooltip + 79 Label true true @@ -373,8 +373,8 @@ true - ПрочееРасширеннаяПодсказка - 80 + ПрочееExtendedTooltip + 77 Label true true @@ -407,8 +407,8 @@ Основные сведения - ОсновныеСведенияРасширеннаяПодсказка - 75 + ОсновныеСведенияExtendedTooltip + 74 Label true true @@ -448,8 +448,8 @@ ПолеПрописи4наРусскомПриИзменении - ПолеПрописи4наРусскомРасширеннаяПодсказка - 92 + ПолеПрописи4наРусскомExtendedTooltip + 85 Label true true @@ -481,7 +481,8 @@ true true false - true + true + true true @@ -536,8 +537,8 @@ ПолеПрописи1наРусскомПриИзменении - ПолеПрописи1наРусскомРасширеннаяПодсказка - 94 + ПолеПрописи1наРусскомExtendedTooltip + 86 Label true true @@ -589,8 +590,8 @@ ПолеПрописи2наРусскомПриИзменении - ПолеПрописи2наРусскомРасширеннаяПодсказка - 96 + ПолеПрописи2наРусскомExtendedTooltip + 87 Label true true @@ -642,8 +643,8 @@ ПолеПрописи3наРусскомПриИзменении - ПолеПрописи3наРусскомРасширеннаяПодсказка - 98 + ПолеПрописи3наРусскомExtendedTooltip + 88 Label true true @@ -685,8 +686,8 @@ Целая часть - ГруппаПрописанийЦелойЧастиРасширеннаяПодсказка - 91 + ГруппаПрописанийЦелойЧастиExtendedTooltip + 84 Label true true @@ -735,8 +736,8 @@ ПолеПрописи8наРусскомПриИзменении - ПолеПрописи8наРусскомРасширеннаяПодсказка - 102 + ПолеПрописи8наРусскомExtendedTooltip + 91 Label true true @@ -768,7 +769,8 @@ true true false - true + true + true true @@ -823,8 +825,8 @@ ПолеПрописи5наРусскомПриИзменении - ПолеПрописи5наРусскомРасширеннаяПодсказка - 104 + ПолеПрописи5наРусскомExtendedTooltip + 92 Label true true @@ -876,8 +878,8 @@ ПолеПрописи6наРусскомПриИзменении - ПолеПрописи6наРусскомРасширеннаяПодсказка - 106 + ПолеПрописи6наРусскомExtendedTooltip + 93 Label true true @@ -929,8 +931,8 @@ ПолеПрописи7наРусскомПриИзменении - ПолеПрописи7наРусскомРасширеннаяПодсказка - 108 + ПолеПрописи7наРусскомExtendedTooltip + 94 Label true true @@ -972,8 +974,8 @@ Дробная часть - ГруппаПрописанийДробнойЧастиРасширеннаяПодсказка - 101 + ГруппаПрописанийДробнойЧастиExtendedTooltip + 90 Label true true @@ -1013,8 +1015,8 @@ ДлинаДробнойЧастиПриИзменении - ДлинаДробнойЧастиРасширеннаяПодсказка - 111 + ДлинаДробнойЧастиExtendedTooltip + 96 Label true true @@ -1046,7 +1048,7 @@ true true false - true + true ru @@ -1095,8 +1097,8 @@ true - ГруппаЧислоРазрядовДробнойЧастиРасширеннаяПодсказка - 110 + ГруппаЧислоРазрядовДробнойЧастиExtendedTooltip + 95 Label true true @@ -1138,8 +1140,8 @@ СуммаЧислоПриИзменении - СуммаЧислоРасширеннаяПодсказка - 114 + СуммаЧислоExtendedTooltip + 98 Label true true @@ -1179,8 +1181,8 @@ СуммаПрописью - СуммаПрописьюРасширеннаяПодсказка - 116 + СуммаПрописьюExtendedTooltip + 99 Label true true @@ -1222,8 +1224,8 @@ Группа пример прописи - ГруппаПримерПрописиРасширеннаяПодсказка - 113 + ГруппаПримерПрописиExtendedTooltip + 97 Label true true @@ -1256,8 +1258,8 @@ Группа параметры дробной части - ГруппаПараметрыДробнойЧастиРасширеннаяПодсказка - 100 + ГруппаПараметрыДробнойЧастиExtendedTooltip + 89 Label true true @@ -1291,8 +1293,8 @@ Группа сумма прописью - ГруппаСуммаПрописьюРасширеннаяПодсказка - 90 + ГруппаСуммаПрописьюExtendedTooltip + 83 Label true true @@ -1316,8 +1318,8 @@ Странницы - СтранницыРасширеннаяПодсказка - 74 + СтранницыExtendedTooltip + 73 Label true true @@ -1343,8 +1345,8 @@ None - ТекстРучногоИзмененияРасширеннаяПодсказка - 118 + ТекстРучногоИзмененияExtendedTooltip + 100 Label true true diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html index fa7257121..3d3f5b0a4 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

Справочник «Валюты» предназначен для хранения списка используемых валют и их курсов.

Реквизиты:

diff --git a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl index 065b79db8..5b0e4150a 100644 --- a/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Валюты/Forms/ФормаЭлемента/Module.bsl @@ -67,7 +67,7 @@ &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) - ТекущийОбъект.ПараметрыПрописиНаРусском = ПараметрыПрописиНаРусском(ЭтаФорма); + ТекущийОбъект.ПараметрыПрописиНаРусском = ПараметрыПрописиНаРусском(ЭтотОбъект); КонецПроцедуры @@ -86,14 +86,14 @@ Объект.Наценка = 0; КонецЕсли; - УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтаФорма); + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ЗависимыйКурсВалютПриИзменении(Элемент) - УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтаФорма); + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтотОбъект); КонецПроцедуры @@ -111,14 +111,14 @@ &НаКлиенте Процедура СуммаЧислоПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи4наРусскомПриИзменении(Элемент) - УстановитьСклоненияПараметровПрописи(ЭтаФорма); - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -137,8 +137,8 @@ &НаКлиенте Процедура ПолеПрописи8наРусскомПриИзменении(Элемент) - УстановитьСклоненияПараметровПрописи(ЭтаФорма); - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -157,37 +157,37 @@ &НаКлиенте Процедура ПолеПрописи1наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи2наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи3наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи5наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи6наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПолеПрописи7наРусскомПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ДлинаДробнойЧастиПриИзменении(Элемент) - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -214,9 +214,9 @@ ПрочитатьПараметрыПрописи(); - УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтаФорма); - УстановитьСклоненияПараметровПрописи(ЭтаФорма); - УстановитьСуммуПрописью(ЭтаФорма); + УстановитьСвойстваЭлементовГруппыЗависимойВалюты(ЭтотОбъект); + УстановитьСклоненияПараметровПрописи(ЭтотОбъект); + УстановитьСуммуПрописью(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/Валюты/Help/ru.html b/SSL/src/Catalogs/Валюты/Help/ru.html index 9772ea823..4110f6741 100644 --- a/SSL/src/Catalogs/Валюты/Help/ru.html +++ b/SSL/src/Catalogs/Валюты/Help/ru.html @@ -1,4 +1,4 @@ - +

Справочник «Валюты» предназначен для хранения списка используемых валют и их курсов.

Реквизиты:

diff --git a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt index ded747288..76ea29a79 100644 --- a/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt +++ b/SSL/src/Catalogs/Валюты/Templates/ОбщероссийскийКлассификаторВалют/Template.txt @@ -156,7 +156,7 @@ - + diff --git a/SSL/src/Catalogs/Валюты/Валюты.mdo b/SSL/src/Catalogs/Валюты/Валюты.mdo index f649641ae..beb89ec70 100644 --- a/SSL/src/Catalogs/Валюты/Валюты.mdo +++ b/SSL/src/Catalogs/Валюты/Валюты.mdo @@ -140,7 +140,7 @@ BothWays Catalog.Валюты.Form.ФормаЭлемента Catalog.Валюты.Form.ФормаСписка - Catalog.Валюты.Form.ФормаВыбора + Catalog.Валюты.Form.ФормаСписка ЗагружаетсяИзИнтернета @@ -270,15 +270,6 @@ PersonalComputer MobileDevice - - ФормаВыбора - - ru - Форма выбора - - PersonalComputer - MobileDevice - ФормаСписка diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 9197d8387..d62cd513c 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаВыбора/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -63,8 +63,8 @@ Список.Code - КодРасширеннаяПодсказка - 20 + КодExtendedTooltip + 10 Label true true @@ -95,10 +95,10 @@ СписокСтрокаПоиска - 9 + 11 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 13 Label true true @@ -108,7 +108,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 12 true Список @@ -118,10 +118,10 @@ СписокСостояниеПросмотра - 12 + 14 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 16 Label true true @@ -131,7 +131,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 15 true ViewStatusAddition @@ -142,10 +142,10 @@ СписокУправлениеПоиском - 15 + 17 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 19 Label true true @@ -155,7 +155,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 18 true SearchControlAddition @@ -165,7 +165,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index fccff4dfc..202cfc8f0 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 20 + НаименованиеExtendedTooltip + 11 Label true true @@ -63,8 +63,8 @@ Список.Code - КодРасширеннаяПодсказка - 22 + КодExtendedTooltip + 12 Label true true @@ -87,6 +87,40 @@ true + + Ссылка + 14 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 15 + true + + LabelField + Enter + true + Left + true + + true + true + + Владелец 8 @@ -99,8 +133,8 @@ Список.Owner - ВладелецРасширеннаяПодсказка - 24 + ВладелецExtendedTooltip + 13 Label true true @@ -131,10 +165,10 @@ СписокСтрокаПоиска - 11 + 17 СписокСтрокаПоискаРасширеннаяПодсказка - 13 + 19 Label true true @@ -144,7 +178,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 12 + 18 true Список @@ -154,10 +188,10 @@ СписокСостояниеПросмотра - 14 + 20 СписокСостояниеПросмотраРасширеннаяПодсказка - 16 + 22 Label true true @@ -167,7 +201,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 15 + 21 true ViewStatusAddition @@ -178,10 +212,10 @@ СписокУправлениеПоиском - 17 + 23 СписокУправлениеПоискомРасширеннаяПодсказка - 19 + 25 Label true true @@ -191,7 +225,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 18 + 24 true SearchControlAddition @@ -201,7 +235,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 10 Label true diff --git a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form index 56ddb9a84..aafe2cae0 100644 --- a/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтветовАнкет/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ Объект.Code - КодРасширеннаяПодсказка + КодExtendedTooltip 9 Label true @@ -57,8 +57,8 @@ Right - ТребуетОткрытогоОтветаРасширеннаяПодсказка - 11 + ТребуетОткрытогоОтветаExtendedTooltip + 10 Label true true @@ -84,7 +84,7 @@ true - КодОткрытыйОтветРасширеннаяПодсказка + КодОткрытыйОтветExtendedTooltip 8 Label true @@ -115,8 +115,8 @@ true - НаименованиеРасширеннаяПодсказка - 13 + НаименованиеExtendedTooltip + 11 Label true true diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl index 6551ce333..3109c384b 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиПользователей/CommandModule.bsl @@ -3,78 +3,5 @@ &НаКлиенте Процедура ОбработкаКоманды(МассивВариантов, ПараметрыВыполненияКоманды) - КоличествоВариантов = МассивВариантов.Количество(); - Если КоличествоВариантов = 0 Тогда - Возврат; - КонецЕсли; - - Если НЕ ЕстьПользовательскиеНастройкиСервер(МассивВариантов) Тогда - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пользовательские настройки выбранных вариантов отчетов (%1 шт) не заданы или уже сброшены.'"), - Формат(КоличествоВариантов, "ЧГ="))); - Возврат; - КонецЕсли; - - ТекстВопроса = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Внимание, операция ""Сбросить настройки пользователей"" необратима. - | - |Нажмите ""Продолжить"" что бы сбросить пользовательские настройки - |быстрого доступа и видимости выбранных вариантов отчетов (%1 шт).'"), - Формат(КоличествоВариантов, "ЧГ=")); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Продолжить'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена); - Если Ответ <> 1 Тогда - Возврат; - КонецЕсли; - - СброситьНастройкиПользователейСервер(МассивВариантов); - Если КоличествоВариантов = 1 Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Сброшены пользовательские настройки варианта отчета'"), - ПолучитьНавигационнуюСсылку(МассивВариантов[0]), - Строка(МассивВариантов[0])); - Иначе - ПоказатьОповещениеПользователя( - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сброшены пользовательские настройки - |вариантов отчетов (%1 шт.).'"), - Формат(МассивВариантов.Количество(), "ЧН=0; ЧГ=0"))); - КонецЕсли; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Функция СброситьНастройкиПользователейСервер(МассивВариантов) - НачатьТранзакцию(); - Для Каждого ВариантСсылка Из МассивВариантов Цикл - РегистрыСведений.НастройкиВариантовОтчетов.СброситьНастройкиВариантаОтчета(ВариантСсылка); - КонецЦикла; - ЗафиксироватьТранзакцию(); -КонецФункции - -&НаСервере -Функция ЕстьПользовательскиеНастройкиСервер(МассивВариантов) - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("МассивВариантов", МассивВариантов); - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК Поле1 - |ИЗ - | РегистрСведений.НастройкиВариантовОтчетов КАК Настройки - |ГДЕ - | Настройки.Вариант В(&МассивВариантов)"; - - ЕстьПользовательскиеНастройки = НЕ Запрос.Выполнить().Пустой(); - Возврат ЕстьПользовательскиеНастройки; -КонецФункции - + ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекПользователей(МассивВариантов, ПараметрыВыполненияКоманды.Источник); +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl index d9a1a268f..38c29738b 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Commands/СброситьНастройкиРазмещения/CommandModule.bsl @@ -3,94 +3,5 @@ &НаКлиенте Процедура ОбработкаКоманды(МассивВариантов, ПараметрыВыполненияКоманды) - ОбщееКоличество = МассивВариантов.Количество(); - Если ОбщееКоличество = 0 Тогда - Возврат; - КонецЕсли; - - Отфильтровать(МассивВариантов); - КоличествоПредопределенных = МассивВариантов.Количество(); - - Если КоличествоПредопределенных = 0 Тогда - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сброс настроек выбранных вариантов отчетов (%1 шт) не требуется по ряду причин: - |- Выбраны только пользовательские варианты отчетов. - |- Выбранные варианты отчетов помечены на удаление. - |- Выбраны варианты дополнительных или внешних отчетов.'"), - Формат(КоличествоПредопределенных, "ЧГ="))); - Возврат; - КонецЕсли; - - ТекстВопроса = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Внимание, операция ""Сбросить настройки размещения"" необратима. - | - |Нажмите ""Продолжить"" что бы сбросить настройки размещения, - |видимости и доступности выбранных вариантов отчетов (%1 шт).'"), - Формат(КоличествоПредопределенных, "ЧГ=")); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Продолжить'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена); - Если Ответ <> 1 Тогда - Возврат; - КонецЕсли; - - СброситьНастройкиРазмещенияСервер(МассивВариантов); - Если КоличествоПредопределенных = 1 Тогда - ВариантСсылка = МассивВариантов[0]; - ПоказатьОповещениеПользователя( - НСтр("ru = 'Сброшены настройки размещения варианта отчета'"), - ПолучитьНавигационнуюСсылку(ВариантСсылка), - Строка(ВариантСсылка)); - Иначе - ПоказатьОповещениеПользователя( - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сброшены настройки размещения - |вариантов отчетов (%1 шт.).'"), - Формат(МассивВариантов.Количество(), "ЧН=0; ЧГ=0"))); - КонецЕсли; - - ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); + ВариантыОтчетовКлиент.ОткрытьДиалогСбросаНастроекРазмещения(МассивВариантов, ПараметрыВыполненияКоманды.Источник); КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Функция СброситьНастройкиРазмещенияСервер(МассивВариантов) - НачатьТранзакцию(); - Для Каждого ВариантСсылка Из МассивВариантов Цикл - ВариантОбъект = ВариантСсылка.ПолучитьОбъект(); - ВариантОбъект.ВидимостьПоУмолчаниюПереопределена = Ложь; - ВариантОбъект.ВидимостьПоУмолчанию = ВариантОбъект.ПредопределенныйВариант.ВидимостьПоУмолчанию; - ВариантОбъект.Размещение.Очистить(); - ВариантОбъект.Записать(); - КонецЦикла; - ЗафиксироватьТранзакцию(); -КонецФункции - -&НаСервере -Процедура Отфильтровать(МассивВариантов) - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("МассивВариантов", МассивВариантов); - Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний); - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВариантыОтчетовРазмещение.Ссылка - |ИЗ - | Справочник.ВариантыОтчетов КАК ВариантыОтчетовРазмещение - |ГДЕ - | ВариантыОтчетовРазмещение.Ссылка В(&МассивВариантов) - | И ВариантыОтчетовРазмещение.Пользовательский = ЛОЖЬ - | И ВариантыОтчетовРазмещение.ТипОтчета = &ТипОтчета - | И ВариантыОтчетовРазмещение.ПометкаУдаления = ЛОЖЬ"; - - МассивВариантов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); -КонецПроцедуры - diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form index 5e2dd739d..277767418 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Form.form @@ -16,7 +16,7 @@ ИзменяемыеВариантыПриИзменении - ИзменяемыеВариантыРасширеннаяПодсказка + ИзменяемыеВариантыExtendedTooltip 82 Label true @@ -97,8 +97,8 @@ ДеревоПодсистемИспользованиеПриИзменении - ДеревоПодсистемИспользованиеРасширеннаяПодсказка - 97 + ДеревоПодсистемИспользованиеExtendedTooltip + 87 Label true true @@ -133,8 +133,8 @@ ДеревоПодсистем.Представление - ДеревоПодсистемПредставлениеРасширеннаяПодсказка - 99 + ДеревоПодсистемПредставлениеExtendedTooltip + 88 Label true true @@ -177,8 +177,8 @@ Группа колонок - ГруппаКолонокРасширеннаяПодсказка - 96 + ГруппаКолонокExtendedTooltip + 86 Label true true @@ -209,8 +209,8 @@ ДеревоПодсистемВажностьПриИзменении - ДеревоПодсистемВажностьРасширеннаяПодсказка - 101 + ДеревоПодсистемВажностьExtendedTooltip + 89 Label true true @@ -252,10 +252,10 @@ ДеревоПодсистемСтрокаПоиска - 87 + 91 ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка - 89 + 93 Label true true @@ -265,7 +265,7 @@ ДеревоПодсистемСтрокаПоискаКонтекстноеМеню - 88 + 92 true ДеревоПодсистем @@ -275,10 +275,10 @@ ДеревоПодсистемСостояниеПросмотра - 90 + 94 ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка - 92 + 96 Label true true @@ -288,7 +288,7 @@ ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню - 91 + 95 true ViewStatusAddition @@ -299,10 +299,10 @@ ДеревоПодсистемУправлениеПоиском - 93 + 97 ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка - 95 + 99 Label true true @@ -312,7 +312,7 @@ ДеревоПодсистемУправлениеПоискомКонтекстноеМеню - 94 + 98 true SearchControlAddition @@ -322,8 +322,8 @@ - ДеревоПодсистемРасширеннаяПодсказка - 86 + ДеревоПодсистемExtendedTooltip + 85 Label true true @@ -343,8 +343,8 @@ true - ДеревоПодсистемКонтекстноеМенюСнятьФлажкиРасширеннаяПодсказка - 84 + ДеревоПодсистемКонтекстноеМенюСнятьФлажкиExtendedTooltip + 83 Label true true @@ -369,8 +369,8 @@ true - ДеревоПодсистемКонтекстноеМенюПеречитатьРасширеннаяПодсказка - 85 + ДеревоПодсистемКонтекстноеМенюПеречитатьExtendedTooltip + 84 Label true true @@ -425,7 +425,7 @@ true - РазместитьРасширеннаяПодсказка + РазместитьExtendedTooltip 79 Label true @@ -450,7 +450,7 @@ true - ДеревоПодсистемСнятьФлажкиРасширеннаяПодсказка + ДеревоПодсистемСнятьФлажкиExtendedTooltip 80 Label true @@ -477,7 +477,7 @@ true - ДеревоПодсистемПеречитатьРасширеннаяПодсказка + ДеревоПодсистемПеречитатьExtendedTooltip 81 Label true @@ -502,18 +502,10 @@ OnOpen ПриОткрытии - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере - - OnClose - ПриЗакрытии - 50 LockOwner true diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Help/ru.html index 0abf7795e..b6a810744 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Help/ru.html +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Help/ru.html @@ -1,3 +1,3 @@ - +

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

См. также: Вариант отчета, Общая информация о формах.

\ No newline at end of file diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl index ea65d39a7..fad82705b 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/РазмещениеВРазделах/Module.bsl @@ -14,7 +14,7 @@ ПерезаполнитьДерево(Ложь); - ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтаФорма); + ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтотОбъект); ТекущийЭлемент = Элементы.ДеревоПодсистем; КонецПроцедуры @@ -31,20 +31,6 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если ВариантыОтчетовКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность, Отказ) Тогда - ЗаписатьНаКлиенте(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если ВариантыОтчетовКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность) Тогда - ЗаписатьНаКлиенте(); - КонецЕсли; -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ @@ -59,12 +45,12 @@ &НаКлиенте Процедура ДеревоПодсистемИспользованиеПриИзменении(Элемент) - ВариантыОтчетовКлиент.ДеревоПодсистемИспользованиеПриИзменении(ЭтаФорма, Элемент); + ВариантыОтчетовКлиент.ДеревоПодсистемИспользованиеПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ДеревоПодсистемВажностьПриИзменении(Элемент) - ВариантыОтчетовКлиент.ДеревоПодсистемВажностьПриИзменении(ЭтаФорма, Элемент); + ВариантыОтчетовКлиент.ДеревоПодсистемВажностьПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -73,7 +59,11 @@ &НаКлиенте Процедура Разместить(Команда) Если ПроверитьКоличествоВариантов() Тогда - ЗаписатьНаКлиенте(); + ЗаписатьНаСервере(); + ТекстОповещения = НСтр("ru = 'Изменены настройки вариантов отчетов (%1 шт.).'"); + ТекстОповещения = СтрЗаменить(ТекстОповещения, "%1", Формат(ИзменяемыеВарианты.Количество(), "ЧН=0; ЧГ=0")); + ПоказатьОповещениеПользователя(, , ТекстОповещения); + ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); Закрыть(); КонецЕсли; КонецПроцедуры @@ -115,27 +105,11 @@ Возврат Истина; КонецФункции -&НаКлиенте -Функция ЗаписатьНаКлиенте() - Результат = ЗаписатьНаСервере(); - ПоказатьОповещениеПользователя( - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Изменены настройки вариантов отчетов (%1 шт.).'"), - Формат(ИзменяемыеВарианты.Количество(), "ЧН=0; ЧГ=0"))); - Модифицированность = Ложь; - - ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); - - Возврат Результат; -КонецФункции - &НаКлиенте Процедура ПоказатьРезультатВыполнения() ОчиститьСообщения(); Если РезультатВыполнения <> Неопределено Тогда - СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтаФорма, РезультатВыполнения); + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, РезультатВыполнения); РезультатВыполнения = Неопределено; КонецЕсли; КонецПроцедуры @@ -352,19 +326,18 @@ КонецПроцедуры &НаСервере -Функция ЗаписатьНаСервере() +Процедура ЗаписатьНаСервере() Кэш = Новый Структура; НачатьТранзакцию(); Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл ВариантОбъект = ЭлементСписка.Значение.ПолучитьОбъект(); - ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтаФорма, ВариантОбъект, Кэш); + ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтотОбъект, ВариантОбъект, Кэш); ВариантОбъект.Записать(); КонецЦикла; ЗафиксироватьТранзакцию(); - Возврат Истина; -КонецФункции +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Сервер diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Form.form new file mode 100644 index 000000000..421208bc0 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Form.form @@ -0,0 +1,221 @@ + + + + Надпись2 + 11 + + <key>ru</key> + <value>Сбросить настройки размещения, видимости и доступности +выбранных предопределенных вариантов отчетов программы?</value> + + true + true + + true + + + Надпись2РасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + Надпись2КонтекстноеМеню + 12 + true + + true + Label + true + true + + Left + + + + Надпись1 + 1 + + <key>ru</key> + <value>Внимание, операция "<b>Сбросить настройки размещения</>" необратима.</value> + + true + true + + true + + + Надпись1РасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + Надпись1КонтекстноеМеню + 2 + true + + true + Label + true + true + + Left + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаКомандаПродолжить + 6 + true + true + + true + + + ФормаКомандаПродолжитьРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + Form.Command.КомандаСбросить + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОтмена + 4 + true + true + + true + + true + + ФормаОтменаРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Auto + true + true + true + UserCmds + Auto + + Right + true + + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + CustomizeForm + Help + LockOwner + true + true + true + Vertical + true + true + true + auto + true + + ИзменяемыеВарианты + + <key>ru</key> + <value>Варианты отчетов</value> + + 1 + + ValueList + + + true + + + true + + + + CatalogRef.ВариантыОтчетов + + + + + ТекстОшибки + + <key>ru</key> + <value>Текст ошибки</value> + + 2 + + 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..9a5da03e3 --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросНастроекРазмещения/Module.bsl @@ -0,0 +1,112 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если Не Параметры.Свойство("МассивВариантов") Или ТипЗнч(Параметры.МассивВариантов) <> Тип("Массив") Тогда + ТекстОшибки = НСтр("ru = 'Не указаны варианты отчетов.'"); + Возврат; + КонецЕсли; + + ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.МассивВариантов); + Отфильтровать(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если Не ПустаяСтрока(ТекстОшибки) Тогда + Отказ = Истина; + ПоказатьПредупреждение(, ТекстОшибки); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура КомандаСбросить(Команда) + КоличествоВыбранныхВариантов = ИзменяемыеВарианты.Количество(); + Если КоличествоВыбранныхВариантов = 0 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не указаны варианты отчетов.'")); + Возврат; + КонецЕсли; + + КоличествоВариантов = СброситьНастройкиРазмещенияСервер(ИзменяемыеВарианты); + Если КоличествоВариантов = 1 И КоличествоВыбранныхВариантов = 1 Тогда + СсылкаВарианта = ИзменяемыеВарианты[0].Значение; + ОповещениеЗаголовок = НСтр("ru = 'Сброшены настройки размещения варианта отчета'"); + ОповещениеСсылка = ПолучитьНавигационнуюСсылку(СсылкаВарианта); + ОповещениеТекст = Строка(СсылкаВарианта); + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, ОповещениеСсылка, ОповещениеТекст); + Иначе + ОповещениеТекст = НСтр("ru = 'Сброшены настройки размещения + |вариантов отчетов (%1 шт.).'"); + ОповещениеТекст = СтрЗаменить(ОповещениеТекст, "%1", Формат(КоличествоВариантов, "ЧН=0; ЧГ=0")); + ПоказатьОповещениеПользователя(, , ОповещениеТекст); + КонецЕсли; + ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); + Закрыть(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера + +&НаСервереБезКонтекста +Функция СброситьНастройкиРазмещенияСервер(Знач ИзменяемыеВарианты) + КоличествоВариантов = 0; + НачатьТранзакцию(); + Для Каждого ЭлементСписка Из ИзменяемыеВарианты Цикл + ВариантОбъект = ЭлементСписка.Значение.ПолучитьОбъект(); + Если ВариантыОтчетов.СброситьНастройкиВариантаОтчета(ВариантОбъект) Тогда + ВариантОбъект.Записать(); + КоличествоВариантов = КоличествоВариантов + 1; + КонецЕсли; + КонецЦикла; + ЗафиксироватьТранзакцию(); + Возврат КоличествоВариантов; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сервер + +&НаСервере +Процедура Отфильтровать() + + КоличествоДоФильтрации = ИзменяемыеВарианты.Количество(); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("МассивВариантов", ИзменяемыеВарианты.ВыгрузитьЗначения()); + Запрос.УстановитьПараметр("ТипОтчета", Перечисления.ТипыОтчетов.Внутренний); + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВариантыОтчетовРазмещение.Ссылка + |ИЗ + | Справочник.ВариантыОтчетов КАК ВариантыОтчетовРазмещение + |ГДЕ + | ВариантыОтчетовРазмещение.Ссылка В(&МассивВариантов) + | И ВариантыОтчетовРазмещение.Пользовательский = ЛОЖЬ + | И ВариантыОтчетовРазмещение.ТипОтчета = &ТипОтчета + | И ВариантыОтчетовРазмещение.ПометкаУдаления = ЛОЖЬ"; + + МассивВариантов = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); + ИзменяемыеВарианты.ЗагрузитьЗначения(МассивВариантов); + + КоличествоПослеФильтрации = ИзменяемыеВарианты.Количество(); + Если КоличествоДоФильтрации <> КоличествоПослеФильтрации Тогда + Если КоличествоПослеФильтрации = 0 Тогда + ТекстОшибки = НСтр("ru = 'Сброс настроек размещения выбранных вариантов отчетов не требуется по одной или нескольким причинам: + |- Выбраны пользовательские варианты отчетов. + |- Выбраны помеченные на удаление варианты отчетов. + |- Выбраны варианты дополнительных или внешних отчетов.'"); + Возврат; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Form.form similarity index 54% rename from SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Form.form rename to SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Form.form index 8a0a1a935..29a69cd03 100644 --- a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Form.form @@ -1,23 +1,21 @@ - - ЗначениеРазделителя - 1 + + Надпись2 + 11 <key>ru</key> - <value>Область данных</value> + <value>Сбросить пользовательские настройки быстрого доступа и видимости +выбранных вариантов отчетов?</value> true true true - - ЗначениеРазделителя - - ЗначениеРазделителяРасширеннаяПодсказка - 10 + Надпись2РасширеннаяПодсказка + 13 Label true true @@ -26,23 +24,51 @@ - ЗначениеРазделителяКонтекстноеМеню + Надпись2КонтекстноеМеню + 12 + true + + true + Label + true + true + + Left + + + + Надпись1 + 1 + + <key>ru</key> + <value>Внимание, операция "<b>Сбросить настройки пользователей</>" необратима.</value> + + true + true + + true + + + Надпись1РасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + Надпись1КонтекстноеМеню 2 true - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal + true + Label + true + true + + Left Bottom @@ -51,20 +77,16 @@ ФормаКоманднаяПанель -1 - ПродолжитьЗагрузкуДанных + ФормаКомандаСбросить 6 - - <key>ru</key> - <value>Продолжить</value> - true true true - ПродолжитьЗагрузкуДанныхРасширеннаяПодсказка - 8 + ФормаКомандаСброситьРасширеннаяПодсказка + 7 Label true true @@ -72,25 +94,26 @@ Left - Form.Command.ПродолжитьЗагрузкуДанных + Form.Command.КомандаСбросить + Normal Auto - true true true UserCmds Auto - Отмена - 7 + ФормаОтмена + 4 true true true + true - ОтменаРасширеннаяПодсказка - 9 + ФормаОтменаРасширеннаяПодсказка + 5 Label true true @@ -99,16 +122,27 @@ Form.StandardCommand.Cancel - Normal Auto + true true true UserCmds Auto Right + true - DontBlock + + OnOpen + ПриОткрытии + + + OnCreateAtServer + ПриСозданииНаСервере + + CustomizeForm + Help + LockOwner true true true @@ -116,22 +150,17 @@ true true true - UseIfNecessary auto true - ЗначениеРазделителя + ИзменяемыеВарианты <key>ru</key> - <value>Значение разделителя</value> + <value>Варианты отчетов</value> 1 - Number - - 7 - true - + ValueList true @@ -139,14 +168,19 @@ true + + + CatalogRef.ВариантыОтчетов + + - АдресВХранилище + ТекстОшибки <key>ru</key> - <value>Адрес в хранилище</value> + <value>Текст ошибки</value> - 3 + 2 String @@ -159,22 +193,18 @@ - ПродолжитьЗагрузкуДанных + КомандаСбросить <key>ru</key> - <value>Продолжить загрузку данных</value> + <value>Сбросить пользовательские настройки</value> - 3 - - ru - Продолжить загрузку данных - + 1 true - ПродолжитьЗагрузкуДанных + КомандаСбросить Auto diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl new file mode 100644 index 000000000..f21e6d7fd --- /dev/null +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/СбросПользовательскихНастроек/Module.bsl @@ -0,0 +1,91 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если Не Параметры.Свойство("МассивВариантов") Или ТипЗнч(Параметры.МассивВариантов) <> Тип("Массив") Тогда + ТекстОшибки = НСтр("ru = 'Не указаны варианты отчетов.'"); + Возврат; + КонецЕсли; + + Если Не ЕстьПользовательскиеНастройки(Параметры.МассивВариантов) Тогда + ТекстОшибки = НСтр("ru = 'Пользовательские настройки выбранных вариантов отчетов (%1 шт) не заданы или уже сброшены.'"); + ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", Формат(Параметры.МассивВариантов.Количество(), "ЧН=0; ЧГ=0")); + Возврат; + КонецЕсли; + + ИзменяемыеВарианты.ЗагрузитьЗначения(Параметры.МассивВариантов); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если Не ПустаяСтрока(ТекстОшибки) Тогда + Отказ = Истина; + ПоказатьПредупреждение(, ТекстОшибки); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура КомандаСбросить(Команда) + КоличествоВариантов = ИзменяемыеВарианты.Количество(); + Если КоличествоВариантов = 0 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не указаны варианты отчетов.'")); + Возврат; + КонецЕсли; + + СброситьНастройкиПользователейСервер(ИзменяемыеВарианты); + Если КоличествоВариантов = 1 Тогда + СсылкаВарианта = ИзменяемыеВарианты[0].Значение; + ОповещениеЗаголовок = НСтр("ru = 'Сброшены пользовательские настройки варианта отчета'"); + ОповещениеСсылка = ПолучитьНавигационнуюСсылку(СсылкаВарианта); + ОповещениеТекст = Строка(СсылкаВарианта); + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, ОповещениеСсылка, ОповещениеТекст); + Иначе + ОповещениеТекст = НСтр("ru = 'Сброшены пользовательские настройки + |вариантов отчетов (%1 шт.).'"); + ОповещениеТекст = СтрЗаменить(ОповещениеТекст, "%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 index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 489b38537..f460e0071 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Form.form @@ -20,7 +20,7 @@ ОтборНаименованиеПриИзменении - ОтборНаименованиеРасширеннаяПодсказка + ОтборНаименованиеExtendedTooltip 99 Label true @@ -45,7 +45,7 @@ true false true - true + true false true false @@ -72,8 +72,8 @@ ОтборАвторПриИзменении - ОтборАвторРасширеннаяПодсказка - 101 + ОтборАвторExtendedTooltip + 100 Label true true @@ -126,8 +126,8 @@ ОтборТипОтчетаПриИзменении - ОтборТипОтчетаРасширеннаяПодсказка - 103 + ОтборТипОтчетаExtendedTooltip + 101 Label true true @@ -179,7 +179,7 @@ Быстрые отборы - БыстрыеОтборыРасширеннаяПодсказка + БыстрыеОтборыExtendedTooltip 98 Label true @@ -209,8 +209,8 @@ true - ВыбратьРасширеннаяПодсказка - 106 + ВыбратьExtendedTooltip + 103 Label true true @@ -238,8 +238,8 @@ Items.Список.CurrentData.Ref - ПросмотрРасширеннаяПодсказка - 107 + ПросмотрExtendedTooltip + 104 Label true true @@ -268,8 +268,8 @@ true - ИзменитьРасширеннаяПодсказка - 108 + ИзменитьExtendedTooltip + 105 Label true true @@ -297,8 +297,8 @@ Items.Список.CurrentData.Ref - РазместитьВРазделахРасширеннаяПодсказка - 109 + РазместитьВРазделахExtendedTooltip + 106 Label true true @@ -324,8 +324,8 @@ true - ИзменитьФормуРасширеннаяПодсказка - 110 + ИзменитьФормуExtendedTooltip + 107 Label true true @@ -350,8 +350,8 @@ true - СправкаРасширеннаяПодсказка - 111 + СправкаExtendedTooltip + 108 Label true true @@ -384,8 +384,8 @@ Команды списка - КомандыСпискаРасширеннаяПодсказка - 112 + КомандыСпискаExtendedTooltip + 109 Label true true @@ -409,8 +409,8 @@ Items.Список.CurrentData.Ref - СправочникВариантыОтчетовСброситьНастройкиРазмещенияРасширеннаяПодсказка - 113 + СправочникВариантыОтчетовСброситьНастройкиРазмещенияExtendedTooltip + 110 Label true true @@ -439,8 +439,8 @@ Items.Список.CurrentData.Ref - СброситьНастройкиПользователейРасширеннаяПодсказка - 114 + СброситьНастройкиПользователейExtendedTooltip + 111 Label true true @@ -466,8 +466,8 @@ true - УстановитьПометкуУдаленияРасширеннаяПодсказка - 115 + УстановитьПометкуУдаленияExtendedTooltip + 112 Label true true @@ -498,8 +498,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 105 + КоманднаяПанельExtendedTooltip + 102 Label true true @@ -550,8 +550,8 @@ ДеревоПодсистем.Представление - ДеревоПодсистемПредставлениеРасширеннаяПодсказка - 128 + ДеревоПодсистемПредставлениеExtendedTooltip + 116 Label true true @@ -605,10 +605,10 @@ ДеревоПодсистемСтрокаПоиска - 119 + 135 ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка - 121 + 137 Label true true @@ -618,7 +618,7 @@ ДеревоПодсистемСтрокаПоискаКонтекстноеМеню - 120 + 136 true ДеревоПодсистем @@ -628,10 +628,10 @@ ДеревоПодсистемСостояниеПросмотра - 122 + 138 ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка - 124 + 140 Label true true @@ -641,7 +641,7 @@ ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню - 123 + 139 true ViewStatusAddition @@ -652,10 +652,10 @@ ДеревоПодсистемУправлениеПоиском - 125 + 141 ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка - 127 + 143 Label true true @@ -665,7 +665,7 @@ ДеревоПодсистемУправлениеПоискомКонтекстноеМеню - 126 + 142 true SearchControlAddition @@ -675,8 +675,8 @@ - ДеревоПодсистемРасширеннаяПодсказка - 118 + ДеревоПодсистемExtendedTooltip + 115 Label true true @@ -734,8 +734,8 @@ ВключаяПодчиненныеПриИзменении - ВключаяПодчиненныеРасширеннаяПодсказка - 138 + ВключаяПодчиненныеExtendedTooltip + 117 Label true true @@ -769,8 +769,8 @@ Левая колонка - ЛеваяКолонкаРасширеннаяПодсказка - 117 + ЛеваяКолонкаExtendedTooltip + 114 Label true true @@ -818,8 +818,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 155 + НаименованиеExtendedTooltip + 124 Label true true @@ -855,8 +855,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 157 + АвторExtendedTooltip + 125 Label true true @@ -894,8 +894,8 @@ Доступен всем пользователям - ДоступенВсемПользователямРасширеннаяПодсказка - 159 + ДоступенВсемПользователямExtendedTooltip + 126 Label true true @@ -942,8 +942,8 @@ Видимость по умолчанию в панели отчетов - ВидимостьПоУмолчаниюРасширеннаяПодсказка - 161 + ВидимостьПоУмолчаниюExtendedTooltip + 127 Label true true @@ -973,8 +973,8 @@ Список.ИмяОтчета - ИмяОтчетаРасширеннаяПодсказка - 163 + ИмяОтчетаExtendedTooltip + 128 Label true true @@ -1007,8 +1007,8 @@ Список.Отчет - ОтчетРасширеннаяПодсказка - 165 + ОтчетExtendedTooltip + 129 Label true true @@ -1041,8 +1041,8 @@ Список.ТипОтчета - ТипОтчетаРасширеннаяПодсказка - 167 + ТипОтчетаExtendedTooltip + 130 Label true true @@ -1075,8 +1075,8 @@ Список.КлючВарианта - КлючВариантаРасширеннаяПодсказка - 169 + КлючВариантаExtendedTooltip + 131 Label true true @@ -1112,10 +1112,10 @@ СписокСтрокаПоиска - 146 + 154 СписокСтрокаПоискаРасширеннаяПодсказка - 148 + 156 Label true true @@ -1125,7 +1125,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 147 + 155 true Список @@ -1135,10 +1135,10 @@ СписокСостояниеПросмотра - 149 + 157 СписокСостояниеПросмотраРасширеннаяПодсказка - 151 + 159 Label true true @@ -1148,7 +1148,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 150 + 158 true ViewStatusAddition @@ -1159,10 +1159,10 @@ СписокУправлениеПоиском - 152 + 160 СписокУправлениеПоискомРасширеннаяПодсказка - 154 + 162 Label true true @@ -1172,7 +1172,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 153 + 161 true SearchControlAddition @@ -1182,8 +1182,8 @@ - СписокРасширеннаяПодсказка - 145 + СписокExtendedTooltip + 123 Label true true @@ -1206,8 +1206,8 @@ Items.Список.CurrentData.Ref - ПросмотрСписокРасширеннаяПодсказка - 140 + ПросмотрСписокExtendedTooltip + 118 Label true true @@ -1236,8 +1236,8 @@ true - ИзменитьСписокРасширеннаяПодсказка - 141 + ИзменитьСписокExtendedTooltip + 119 Label true true @@ -1265,8 +1265,8 @@ Items.Список.CurrentData.Ref - РазместитьВРазделахСписокРасширеннаяПодсказка - 142 + РазместитьВРазделахСписокExtendedTooltip + 120 Label true true @@ -1299,8 +1299,8 @@ Команды списка - КомандыСпискаСписокРасширеннаяПодсказка - 143 + КомандыСпискаСписокExtendedTooltip + 121 Label true true @@ -1321,8 +1321,8 @@ true - УстановитьПометкуУдаленияСписокРасширеннаяПодсказка - 144 + УстановитьПометкуУдаленияСписокExtendedTooltip + 122 Label true true @@ -1392,8 +1392,8 @@ Группа горизонтальная - ГруппаГоризонтальнаяРасширеннаяПодсказка - 116 + ГруппаГоризонтальнаяExtendedTooltip + 113 Label true true diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl index b4db8902e..d11497bd8 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаСписка/Module.bsl @@ -207,12 +207,12 @@ Возврат; КонецЕсли; - Размещение = Новый Структура("Варианты, Действие, Приемник, Источник"); //МассивВариантов, Всего, Представление - Размещение.Варианты = Новый Структура("Массив, Всего, Представление"); - Размещение.Варианты.Массив = ПараметрыПеретаскивания.Значение; - Размещение.Варианты.Всего = ПараметрыПеретаскивания.Значение.Количество(); + ПараметрыРазмещения = Новый Структура("Варианты, Действие, Приемник, Источник"); //МассивВариантов, Всего, Представление + ПараметрыРазмещения.Варианты = Новый Структура("Массив, Всего, Представление"); + ПараметрыРазмещения.Варианты.Массив = ПараметрыПеретаскивания.Значение; + ПараметрыРазмещения.Варианты.Всего = ПараметрыПеретаскивания.Значение.Количество(); - Если Размещение.Варианты.Всего = 0 Тогда + Если ПараметрыРазмещения.Варианты.Всего = 0 Тогда Возврат; КонецЕсли; @@ -221,46 +221,46 @@ Возврат; КонецЕсли; - Размещение.Приемник = Новый Структура("Ссылка, ПолноеПредставление"); - ЗаполнитьЗначенияСвойств(Размещение.Приемник, СтрокаПриемник); + ПараметрыРазмещения.Приемник = Новый Структура("Ссылка, ПолноеПредставление"); + ЗаполнитьЗначенияСвойств(ПараметрыРазмещения.Приемник, СтрокаПриемник); СтрокаИсточник = Элементы.ДеревоПодсистем.ТекущиеДанные; - Размещение.Источник = Новый Структура("Ссылка, ПолноеПредставление"); + ПараметрыРазмещения.Источник = Новый Структура("Ссылка, ПолноеПредставление"); Если СтрокаИсточник = Неопределено ИЛИ СтрокаИсточник.Приоритет = "" Тогда - Размещение.Действие = "Копирование"; + ПараметрыРазмещения.Действие = "Копирование"; Иначе - ЗаполнитьЗначенияСвойств(Размещение.Источник, СтрокаИсточник); + ЗаполнитьЗначенияСвойств(ПараметрыРазмещения.Источник, СтрокаИсточник); Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование Тогда - Размещение.Действие = "Копирование"; + ПараметрыРазмещения.Действие = "Копирование"; Иначе - Размещение.Действие = "Перемещение"; + ПараметрыРазмещения.Действие = "Перемещение"; КонецЕсли; КонецЕсли; - Если Размещение.Источник.Ссылка = Размещение.Приемник.Ссылка Тогда - Предупреждение(НСтр("ru = 'Выбранные варианты отчетов уже в данном разделе.'")); + Если ПараметрыРазмещения.Источник.Ссылка = ПараметрыРазмещения.Приемник.Ссылка Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выбранные варианты отчетов уже в данном разделе.'")); Возврат; КонецЕсли; - Если Размещение.Варианты.Всего = 1 Тогда - Если Размещение.Действие = "Копирование" Тогда + Если ПараметрыРазмещения.Варианты.Всего = 1 Тогда + Если ПараметрыРазмещения.Действие = "Копирование" Тогда ШаблонВопроса = НСтр("ru = 'Разместить ""%1"" в ""%4""?'"); Иначе ШаблонВопроса = НСтр("ru = 'Переместить ""%1"" из ""%3"" в ""%4""?'"); КонецЕсли; - Размещение.Варианты.Представление = Строка(Размещение.Варианты.Массив[0]); + ПараметрыРазмещения.Варианты.Представление = Строка(ПараметрыРазмещения.Варианты.Массив[0]); Иначе - Размещение.Варианты.Представление = ""; - Для Каждого ВариантСсылка Из Размещение.Варианты.Массив Цикл - Размещение.Варианты.Представление = Размещение.Варианты.Представление - + ?(Размещение.Варианты.Представление = "", "", ", ") + ПараметрыРазмещения.Варианты.Представление = ""; + Для Каждого ВариантСсылка Из ПараметрыРазмещения.Варианты.Массив Цикл + ПараметрыРазмещения.Варианты.Представление = ПараметрыРазмещения.Варианты.Представление + + ?(ПараметрыРазмещения.Варианты.Представление = "", "", ", ") + Строка(ВариантСсылка); - Если СтрДлина(Размещение.Варианты.Представление) > 23 Тогда - Размещение.Варианты.Представление = Лев(Размещение.Варианты.Представление, 20) + "..."; + Если СтрДлина(ПараметрыРазмещения.Варианты.Представление) > 23 Тогда + ПараметрыРазмещения.Варианты.Представление = Лев(ПараметрыРазмещения.Варианты.Представление, 20) + "..."; Прервать; КонецЕсли; КонецЦикла; - Если Размещение.Действие = "Копирование" Тогда + Если ПараметрыРазмещения.Действие = "Копирование" Тогда ШаблонВопроса = НСтр("ru = 'Разместить варианты отчетов ""%1"" (%2 шт.) в ""%4""?'"); Иначе ШаблонВопроса = НСтр("ru = 'Переместить варианты отчетов ""%1"" (%2 шт.) из ""%3"" в ""%4""?'"); @@ -269,20 +269,14 @@ ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ШаблонВопроса, - Размещение.Варианты.Представление, - Формат(Размещение.Варианты.Всего, "ЧГ=0"), - Размещение.Источник.ПолноеПредставление, - Размещение.Приемник.ПолноеПредставление); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); - Если Ответ <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; + ПараметрыРазмещения.Варианты.Представление, + Формат(ПараметрыРазмещения.Варианты.Всего, "ЧГ=0"), + ПараметрыРазмещения.Источник.ПолноеПредставление, + ПараметрыРазмещения.Приемник.ПолноеПредставление + ); - РезультатВыполнения = РазместитьВариантыВПодсистеме(Размещение); - - ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); - - СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтаФорма, РезультатВыполнения); + Обработчик = Новый ОписаниеОповещения("ДеревоПодсистемПеретаскиваниеЗавершение", ЭтотОбъект, ПараметрыРазмещения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); КонецПроцедуры @@ -293,18 +287,32 @@ Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) Если РежимРаботыФормы = "ВсеОтчетыРаздела" Тогда СтандартнаяОбработка = Ложь; - ВариантыОтчетовКлиент.ОткрытьВариантОтчета(ЭтаФорма); + ВариантыОтчетовКлиент.ОткрытьВариантОтчета(ЭтотОбъект); ИначеЕсли РежимРаботыФормы = "Выбор" Тогда // Действие не требуется. Иначе СтандартнаяОбработка = Ложь; - ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаОбъекта", Новый Структура("Ключ", ВыбраннаяСтрока), ЭтаФорма, , ВариантОткрытияОкна.ОтдельноеОкно); + ОткрытьФорму("Справочник.ВариантыОтчетов.ФормаОбъекта", Новый Структура("Ключ", ВыбраннаяСтрока), ЭтотОбъект, , ВариантОткрытияОкна.ОтдельноеОкно); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ДеревоПодсистемПеретаскиваниеЗавершение(Ответ, ПараметрыРазмещения) Экспорт + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + РезультатВыполнения = РазместитьВариантыВПодсистеме(ПараметрыРазмещения); + + ВариантыОтчетовКлиент.ОбновитьОткрытыеФормы(); + + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, РезультатВыполнения); + +КонецПроцедуры + &НаСервере Процедура УстановитьСвойствоСпискаПоПараметруФормы(Ключ) @@ -439,11 +447,11 @@ КонецПроцедуры &НаСервере -Функция РазместитьВариантыВПодсистеме(Размещение) +Функция РазместитьВариантыВПодсистеме(ПараметрыРазмещения) Размещено = 0; ТекстОшибок = ""; НачатьТранзакцию(); - Для Каждого ВариантСсылка Из Размещение.Варианты.Массив Цикл + Для Каждого ВариантСсылка Из ПараметрыРазмещения.Варианты.Массив Цикл Если ВариантСсылка.ТипОтчета = Перечисления.ТипыОтчетов.Внешний Тогда ТекстОшибок = ТекстОшибок + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = '""%1"" внешний.'"), @@ -460,15 +468,15 @@ ВариантОбъект = ВариантСсылка.ПолучитьОбъект(); - СтрокаПриемник = ВариантОбъект.Размещение.Найти(Размещение.Приемник.Ссылка, "РазделИлиГруппа"); + СтрокаПриемник = ВариантОбъект.Размещение.Найти(ПараметрыРазмещения.Приемник.Ссылка, "РазделИлиГруппа"); - Если Размещение.Действие = "Перемещение" Тогда - СтрокаИсточник = ВариантОбъект.Размещение.Найти(Размещение.Источник.Ссылка, "РазделИлиГруппа"); + Если ПараметрыРазмещения.Действие = "Перемещение" Тогда + СтрокаИсточник = ВариантОбъект.Размещение.Найти(ПараметрыРазмещения.Источник.Ссылка, "РазделИлиГруппа"); Если СтрокаИсточник = Неопределено Тогда // Действие не требуется ИначеЕсли СтрокаПриемник = Неопределено Тогда // Замена подсистемы - СтрокаИсточник.РазделИлиГруппа = Размещение.Приемник.Ссылка; + СтрокаИсточник.РазделИлиГруппа = ПараметрыРазмещения.Приемник.Ссылка; СтрокаПриемник = СтрокаИсточник; Иначе // Удаление строки @@ -478,7 +486,7 @@ Если СтрокаПриемник = Неопределено Тогда СтрокаПриемник = ВариантОбъект.Размещение.Добавить(); - СтрокаПриемник.РазделИлиГруппа = Размещение.Приемник.Ссылка; + СтрокаПриемник.РазделИлиГруппа = ПараметрыРазмещения.Приемник.Ссылка; КонецЕсли; СтрокаПриемник.Использование = Истина; @@ -490,23 +498,23 @@ ЗафиксироватьТранзакцию(); РезультатВыполнения = Новый Структура; - Если Размещение.Варианты.Всего = Размещено Тогда + Если ПараметрыРазмещения.Варианты.Всего = Размещено Тогда РезультатВыполнения.Вставить("ВыводОповещения", Новый Структура("Использование, Заголовок, Текст, Ссылка, Картинка")); ВыводОповещения = РезультатВыполнения.ВыводОповещения; ВыводОповещения.Использование = Истина; - Если Размещение.Варианты.Всего = 1 Тогда + Если ПараметрыРазмещения.Варианты.Всего = 1 Тогда ВыводОповещения.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Вариант отчета ""%1"" размещен в ""%2"".'"), - Размещение.Варианты.Представление, - Размещение.Приемник.ПолноеПредставление); - ВыводОповещения.Текст = Размещение.Варианты.Представление; - ВыводОповещения.Ссылка = ПолучитьНавигационнуюСсылку(Размещение.Варианты.Массив[0]); + ПараметрыРазмещения.Варианты.Представление, + ПараметрыРазмещения.Приемник.ПолноеПредставление); + ВыводОповещения.Текст = ПараметрыРазмещения.Варианты.Представление; + ВыводОповещения.Ссылка = ПолучитьНавигационнуюСсылку(ПараметрыРазмещения.Варианты.Массив[0]); Иначе ВыводОповещения.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Варианты отчетов ""%1"" (%2 шт.) размещены в ""%3"".'"), - Размещение.Варианты.Представление, - Формат(Размещение.Варианты.Всего, "ЧН=0; ЧГ=0"), - Размещение.Приемник.ПолноеПредставление); + ПараметрыРазмещения.Варианты.Представление, + Формат(ПараметрыРазмещения.Варианты.Всего, "ЧН=0; ЧГ=0"), + ПараметрыРазмещения.Приемник.ПолноеПредставление); КонецЕсли; Иначе РезультатВыполнения.Вставить("ВыводПредупреждения", Новый Структура("Использование, Текст, ТекстОшибок")); @@ -515,13 +523,13 @@ ВыводПредупреждения.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Размещено вариантов отчетов: %1 из %2'"), Формат(Размещено, "ЧН=0; ЧГ=0"), - Формат(Размещение.Варианты.Всего, "ЧН=0; ЧГ=0")); + Формат(ПараметрыРазмещения.Варианты.Всего, "ЧН=0; ЧГ=0")); ВыводПредупреждения.ТекстОшибок = НСтр("ru = 'Варианты отчетов, которые не могут размещаться в командном интерфейсе:'") + Символы.ПС + ТекстОшибок; КонецЕсли; - Если Размещение.Действие = "Перемещение" И Размещено > 0 Тогда + Если ПараметрыРазмещения.Действие = "Перемещение" И Размещено > 0 Тогда Элементы.Список.Обновить(); КонецЕсли; diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form index 7053d3c22..288ed5714 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 161 Label true @@ -54,8 +54,8 @@ Left - ОписаниеРасширеннаяПодсказка - 163 + ОписаниеExtendedTooltip + 162 Label true true @@ -116,8 +116,8 @@ ДоступенПриИзменении - ДоступенРасширеннаяПодсказка - 166 + ДоступенExtendedTooltip + 164 Label true true @@ -170,8 +170,8 @@ true - ДекорацияРасширеннаяПодсказка - 169 + ДекорацияExtendedTooltip + 166 Label true true @@ -204,8 +204,8 @@ None - АвторРасширеннаяПодсказка - 170 + АвторExtendedTooltip + 167 Label true true @@ -252,8 +252,8 @@ ВидимостьПоУмолчаниюПриИзменении - ВидимостьПоУмолчаниюРасширеннаяПодсказка - 172 + ВидимостьПоУмолчаниюExtendedTooltip + 168 Label true true @@ -287,8 +287,8 @@ Группа автор и видимость по умолчанию - ГруппаАвторИВидимостьПоУмолчаниюРасширеннаяПодсказка - 168 + ГруппаАвторИВидимостьПоУмолчаниюExtendedTooltip + 165 Label true true @@ -320,8 +320,8 @@ Группа доступен - ГруппаДоступенРасширеннаяПодсказка - 165 + ГруппаДоступенExtendedTooltip + 163 Label true true @@ -349,7 +349,7 @@ ДеревоПодсистем - None + Top Add Copy Delete @@ -380,8 +380,8 @@ ДеревоПодсистемИспользованиеПриИзменении - ДеревоПодсистемИспользованиеРасширеннаяПодсказка - 185 + ДеревоПодсистемИспользованиеExtendedTooltip + 171 Label true true @@ -414,8 +414,8 @@ ДеревоПодсистем.Представление - ДеревоПодсистемПредставлениеРасширеннаяПодсказка - 187 + ДеревоПодсистемПредставлениеExtendedTooltip + 172 Label true true @@ -459,8 +459,8 @@ Группа колонок - ГруппаКолонокРасширеннаяПодсказка - 184 + ГруппаКолонокExtendedTooltip + 170 Label true true @@ -491,8 +491,8 @@ ДеревоПодсистемВажностьПриИзменении - ДеревоПодсистемВажностьРасширеннаяПодсказка - 189 + ДеревоПодсистемВажностьExtendedTooltip + 173 Label true true @@ -533,10 +533,10 @@ ДеревоПодсистемСтрокаПоиска - 175 + 187 ДеревоПодсистемСтрокаПоискаРасширеннаяПодсказка - 177 + 189 Label true true @@ -546,7 +546,7 @@ ДеревоПодсистемСтрокаПоискаКонтекстноеМеню - 176 + 188 true ДеревоПодсистем @@ -556,10 +556,10 @@ ДеревоПодсистемСостояниеПросмотра - 178 + 190 ДеревоПодсистемСостояниеПросмотраРасширеннаяПодсказка - 180 + 192 Label true true @@ -569,7 +569,7 @@ ДеревоПодсистемСостояниеПросмотраКонтекстноеМеню - 179 + 191 true ViewStatusAddition @@ -580,10 +580,10 @@ ДеревоПодсистемУправлениеПоиском - 181 + 193 ДеревоПодсистемУправлениеПоискомРасширеннаяПодсказка - 183 + 195 Label true true @@ -593,7 +593,7 @@ ДеревоПодсистемУправлениеПоискомКонтекстноеМеню - 182 + 194 true SearchControlAddition @@ -603,8 +603,8 @@ - ДеревоПодсистемРасширеннаяПодсказка - 174 + ДеревоПодсистемExtendedTooltip + 169 Label true true @@ -658,8 +658,8 @@ Объект.Отчет - ОтчетРасширеннаяПодсказка - 200 + ОтчетExtendedTooltip + 175 Label true true @@ -700,8 +700,8 @@ Объект.ПредопределенныйВариант - ПредопределенныйВариантРасширеннаяПодсказка - 202 + ПредопределенныйВариантExtendedTooltip + 176 Label true true @@ -768,8 +768,8 @@ Объект.Размещение.Использование - РазмещениеИспользованиеРасширеннаяПодсказка - 214 + РазмещениеИспользованиеExtendedTooltip + 178 Label true true @@ -801,8 +801,8 @@ Объект.Размещение.РазделИлиГруппа - РазмещениеРазделИлиГруппаРасширеннаяПодсказка - 216 + РазмещениеРазделИлиГруппаExtendedTooltip + 179 Label true true @@ -842,8 +842,8 @@ Объект.Размещение.Важный - РазмещениеВажныйРасширеннаяПодсказка - 218 + РазмещениеВажныйExtendedTooltip + 180 Label true true @@ -875,8 +875,8 @@ Объект.Размещение.СмТакже - РазмещениеСмТакжеРасширеннаяПодсказка - 220 + РазмещениеСмТакжеExtendedTooltip + 181 Label true true @@ -904,10 +904,10 @@ РазмещениеСтрокаПоиска - 205 + 209 РазмещениеСтрокаПоискаРасширеннаяПодсказка - 207 + 211 Label true true @@ -917,7 +917,7 @@ РазмещениеСтрокаПоискаКонтекстноеМеню - 206 + 210 true Размещение @@ -927,10 +927,10 @@ РазмещениеСостояниеПросмотра - 208 + 212 РазмещениеСостояниеПросмотраРасширеннаяПодсказка - 210 + 214 Label true true @@ -940,7 +940,7 @@ РазмещениеСостояниеПросмотраКонтекстноеМеню - 209 + 213 true ViewStatusAddition @@ -951,10 +951,10 @@ РазмещениеУправлениеПоиском - 211 + 215 РазмещениеУправлениеПоискомРасширеннаяПодсказка - 213 + 217 Label true true @@ -964,7 +964,7 @@ РазмещениеУправлениеПоискомКонтекстноеМеню - 212 + 216 true SearchControlAddition @@ -974,8 +974,8 @@ - РазмещениеРасширеннаяПодсказка - 204 + РазмещениеExtendedTooltip + 177 Label true true @@ -1031,8 +1031,8 @@ true true - ТехническаяИнформацияРасширеннаяПодсказка - 199 + ТехническаяИнформацияExtendedTooltip + 174 Label true true @@ -1064,7 +1064,7 @@ true - ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + ФормаЗаписатьИЗакрытьExtendedTooltip 150 Label true @@ -1090,7 +1090,7 @@ true - ФормаЗаписатьРасширеннаяПодсказка + ФормаЗаписатьExtendedTooltip 151 Label true @@ -1119,7 +1119,7 @@ Объект.Ref - ФормаОткрытьРасширеннаяПодсказка + ФормаОткрытьExtendedTooltip 152 Label true @@ -1145,7 +1145,7 @@ true - ФормаУстановитьПометкуУдаленияРасширеннаяПодсказка + ФормаУстановитьПометкуУдаленияExtendedTooltip 153 Label true @@ -1177,7 +1177,7 @@ Объект.Ref - ФормаСброситьНастройкиРазмещенияРасширеннаяПодсказка + ФормаСброситьНастройкиРазмещенияExtendedTooltip 155 Label true @@ -1207,7 +1207,7 @@ Объект.Ref - ФормаСброситьНастройкиПользователейРасширеннаяПодсказка + ФормаСброситьНастройкиПользователейExtendedTooltip 156 Label true @@ -1236,7 +1236,7 @@ Объект.Ref - ФормаРазместитьВРазделахРасширеннаяПодсказка + ФормаРазместитьВРазделахExtendedTooltip 157 Label true @@ -1267,7 +1267,7 @@ Сброс настроек - СбросНастроекРасширеннаяПодсказка + СбросНастроекExtendedTooltip 154 Label true @@ -1287,7 +1287,7 @@ true - ФормаПеречитатьРасширеннаяПодсказка + ФормаПеречитатьExtendedTooltip 158 Label true @@ -1313,7 +1313,7 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка + ФормаИзменитьФормуExtendedTooltip 159 Label true @@ -1339,7 +1339,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 160 Label true @@ -1454,7 +1454,7 @@ ДеревоПодсистем <key>ru</key> - <value>Раздел, группа</value> + <value>Размещение в панелях отчетов</value> 2 diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html index 17073d224..a98448d86 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

Справочник предназначен для хранения вариантов отчетов и настройки их размещения в командном интерфейсе.

Реквизиты:

diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl index 219cf9d5f..e5c0b2ba9 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВариантыОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -58,11 +58,11 @@ ПерезаполнитьДерево(); - ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтаФорма); + ВариантыОтчетов.ДеревоПодсистемДобавитьУсловноеОформление(ЭтотОбъект); Доступен = ?(Объект.ТолькоДляАвтора, "1", "2"); - ВидимостьДоступность(ЭтаФорма); + ВидимостьДоступность(ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -74,7 +74,7 @@ ТолькоПросмотр = Истина; КонецЕсли; - Предупреждение(ОшибкаОткрытия); + ПоказатьПредупреждение(, ОшибкаОткрытия); КонецЕсли; КонецПроцедуры @@ -100,7 +100,7 @@ КонецЕсли; // Запись дерева подсистем. - ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтаФорма, ТекущийОбъект); + ВариантыОтчетов.ДеревоПодсистемЗаписать(ЭтотОбъект, ТекущийОбъект); КонецПроцедуры &НаКлиенте @@ -116,17 +116,13 @@ &НаКлиенте Процедура ОписаниеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста( - Объект.Описание, - Объект.Описание, - Модифицированность, - НСтр("ru = 'Описание'")); + ВариантыОтчетовКлиент.РедактироватьМногострочныйТекст(ЭтотОбъект, Элемент.ТекстРедактирования, Объект, "Описание", НСтр("ru = 'Описание'")); КонецПроцедуры &НаКлиенте Процедура ДоступенПриИзменении(Элемент) - Объект.ТолькоДляАвтора = (ЭтаФорма.Доступен = "1"); - ВидимостьДоступность(ЭтаФорма, "ТолькоДляАвтора"); + Объект.ТолькоДляАвтора = (ЭтотОбъект.Доступен = "1"); + ВидимостьДоступность(ЭтотОбъект, "ТолькоДляАвтора"); КонецПроцедуры &НаКлиенте @@ -139,28 +135,28 @@ &НаКлиенте Процедура ДеревоПодсистемИспользованиеПриИзменении(Элемент) - ВариантыОтчетовКлиент.ДеревоПодсистемИспользованиеПриИзменении(ЭтаФорма, Элемент); + ВариантыОтчетовКлиент.ДеревоПодсистемИспользованиеПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ДеревоПодсистемВажностьПриИзменении(Элемент) - ВариантыОтчетовКлиент.ДеревоПодсистемВажностьПриИзменении(ЭтаФорма, Элемент); + ВариантыОтчетовКлиент.ДеревоПодсистемВажностьПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаКлиентеНаСервереБезКонтекста -Процедура ВидимостьДоступность(ЭтаФорма, Изменения = "") - Если ЭтаФорма.ТолькоПросмотр Тогда +Процедура ВидимостьДоступность(Форма, Изменения = "") + Если Форма.ТолькоПросмотр Тогда Возврат; КонецЕсли; - Объект = ЭтаФорма.Объект; - Элементы = ЭтаФорма.Элементы; + Объект = Форма.Объект; + Элементы = Форма.Элементы; Если Изменения = "" ИЛИ Изменения = "ТолькоДляАвтора" Тогда - Если НЕ ЭтаФорма.ЭтоВнешний И НЕ ЭтаФорма.Объект.ПометкаУдаления Тогда + Если НЕ Форма.ЭтоВнешний И НЕ Форма.Объект.ПометкаУдаления Тогда Элементы.ВидимостьПоУмолчанию.Доступность = НЕ Объект.ТолькоДляАвтора; КонецЕсли; КонецЕсли; @@ -168,7 +164,7 @@ &НаСервере Функция ПерезаполнитьДерево() - ДеревоПриемник = ВариантыОтчетов.ДеревоПодсистемСформировать(ЭтаФорма, Объект); + ДеревоПриемник = ВариантыОтчетов.ДеревоПодсистемСформировать(ЭтотОбъект, Объект); ЗначениеВРеквизитФормы(ДеревоПриемник, "ДеревоПодсистем"); Возврат Истина; КонецФункции diff --git a/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html index fa648bb5e..059916d38 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html +++ b/SSL/src/Catalogs/ВариантыОтчетов/Help/ru.html @@ -1,4 +1,4 @@ - +

Редактирование, открытие и выбор вариантов отчетов.

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

Чтобы быстро найти нужный вариант отчета в списке "Варианты отчетов" также можно применять быстрые отборы по Наименованию и Автору. Для этого нужно указать искомые значения в соответствующих полях, расположенных над списком.

diff --git a/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo index a09b38e81..a7ec14ae6 100644 --- a/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo +++ b/SSL/src/Catalogs/ВариантыОтчетов/ВариантыОтчетов.mdo @@ -577,6 +577,24 @@ PersonalComputer MobileDevice
+ + СбросНастроекРазмещения + + ru + Сброс настроек размещения + + PersonalComputer + MobileDevice + + + СбросПользовательскихНастроек + + ru + Сброс пользовательских настроек + + PersonalComputer + MobileDevice + ФормаСписка diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index dce3d5353..cd7cceddd 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбора/Form.form @@ -30,8 +30,8 @@ Список.НомерВерсии - НомерВерсииРасширеннаяПодсказка - 37 + НомерВерсииExtendedTooltip + 28 Label true true @@ -74,8 +74,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 39 + АвторExtendedTooltip + 29 Label true true @@ -114,8 +114,8 @@ Список.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 41 + ДатаСозданияExtendedTooltip + 30 Label true true @@ -154,8 +154,8 @@ Список.Размер - РазмерРасширеннаяПодсказка - 43 + РазмерExtendedTooltip + 31 Label true true @@ -191,10 +191,10 @@ СписокСтрокаПоиска - 28 + 32 СписокСтрокаПоискаРасширеннаяПодсказка - 30 + 34 Label true true @@ -204,7 +204,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 29 + 33 true Список @@ -214,10 +214,10 @@ СписокСостояниеПросмотра - 31 + 35 СписокСостояниеПросмотраРасширеннаяПодсказка - 33 + 37 Label true true @@ -227,7 +227,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 32 + 36 true ViewStatusAddition @@ -238,10 +238,10 @@ СписокУправлениеПоиском - 34 + 38 СписокУправлениеПоискомРасширеннаяПодсказка - 36 + 40 Label true true @@ -251,7 +251,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 35 + 39 true SearchControlAddition @@ -261,7 +261,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 27 Label true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form index 1ffc01a29..42d1070db 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаВыбораСпособаСравненияВерсий/Form.form @@ -16,7 +16,7 @@ СпособСравненияВерсийФайлов - СпособСравненияВерсийФайловРасширеннаяПодсказка + СпособСравненияВерсийФайловExtendedTooltip 10 Label true @@ -64,7 +64,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 7 Label true @@ -90,7 +90,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 8 Label true @@ -117,7 +117,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 9 Label true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 2096fe479..4b02cd077 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Form.form @@ -28,8 +28,8 @@ Список.ПолноеНаименование - ПолноеНаименованиеРасширеннаяПодсказка - 48 + ПолноеНаименованиеExtendedTooltip + 39 Label true true @@ -62,8 +62,8 @@ Список.Owner - ВладелецРасширеннаяПодсказка - 50 + ВладелецExtendedTooltip + 40 Label true true @@ -98,8 +98,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 52 + АвторExtendedTooltip + 41 Label true true @@ -134,8 +134,8 @@ Список.Комментарий - КомментарийРасширеннаяПодсказка - 54 + КомментарийExtendedTooltip + 42 Label true true @@ -171,8 +171,8 @@ Список.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 56 + ДатаСозданияExtendedTooltip + 43 Label true true @@ -207,8 +207,8 @@ Список.Размер - РазмерРасширеннаяПодсказка - 58 + РазмерExtendedTooltip + 44 Label true true @@ -243,8 +243,8 @@ Список.НомерВерсии - НомерВерсииРасширеннаяПодсказка - 60 + НомерВерсииExtendedTooltip + 45 Label true true @@ -279,8 +279,8 @@ Список.DeletionMark - ПометкаУдаленияРасширеннаяПодсказка - 62 + ПометкаУдаленияExtendedTooltip + 46 Label true true @@ -312,8 +312,8 @@ Список.Расширение - РасширениеРасширеннаяПодсказка - 64 + РасширениеExtendedTooltip + 47 Label true true @@ -356,10 +356,10 @@ СписокСтрокаПоиска - 39 + 48 СписокСтрокаПоискаРасширеннаяПодсказка - 41 + 50 Label true true @@ -369,7 +369,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 40 + 49 true Список @@ -379,10 +379,10 @@ СписокСостояниеПросмотра - 42 + 51 СписокСостояниеПросмотраРасширеннаяПодсказка - 44 + 53 Label true true @@ -392,7 +392,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 43 + 52 true ViewStatusAddition @@ -403,10 +403,10 @@ СписокУправлениеПоиском - 45 + 54 СписокУправлениеПоискомРасширеннаяПодсказка - 47 + 56 Label true true @@ -416,7 +416,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 46 + 55 true SearchControlAddition @@ -426,7 +426,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 38 Label true @@ -451,7 +451,7 @@ true - СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка + СписокКонтекстноеМенюИзменитьExtendedTooltip 35 Label true @@ -477,7 +477,7 @@ true - СписокКонтекстноеМенюУстановитьПометкуУдаленияРасширеннаяПодсказка + СписокКонтекстноеМенюУстановитьПометкуУдаленияExtendedTooltip 36 Label true @@ -503,7 +503,7 @@ true - СписокКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + СписокКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip 37 Label true @@ -578,7 +578,7 @@ true - ФормаИзменитьРасширеннаяПодсказка + ФормаИзменитьExtendedTooltip 32 Label true @@ -612,7 +612,7 @@ Форма стандартные команды - ФормаСтандартныеКомандыРасширеннаяПодсказка + ФормаСтандартныеКомандыExtendedTooltip 33 Label true @@ -634,7 +634,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 34 Label true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl index 1abdd84ad..ddf517016 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСписка/Module.bsl @@ -48,9 +48,14 @@ СтандартнаяОбработка = Ложь; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Неопределено, ВыбраннаяСтрока, УникальныйИдентификатор); + Неопределено, + ВыбраннаяСтрока, + УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(ДанныеФайла, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла( + Неопределено, + ДанныеФайла, + УникальныйИдентификатор); КонецПроцедуры @@ -68,7 +73,7 @@ Неопределено, Элементы.Список.ТекущаяСтрока); Если ДанныеФайла.ТекущаяВерсия = Элементы.Список.ТекущаяСтрока Тогда - Предупреждение(НСтр("ru = 'Активную версию нельзя удалить.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Активную версию нельзя удалить.'")); Отказ = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 1d67c78b8..07d3b84ba 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Form.form @@ -38,8 +38,8 @@ ДеревоВерсий.ИндексКартинкиТекущий - СписокИндексКартинкиРасширеннаяПодсказка - 100 + СписокИндексКартинкиExtendedTooltip + 91 Label true true @@ -82,8 +82,8 @@ ДеревоВерсий.Автор - АвторРасширеннаяПодсказка - 102 + АвторExtendedTooltip + 92 Label true true @@ -125,8 +125,8 @@ Картинка и наименование - КартинкаИНаименованиеРасширеннаяПодсказка - 99 + КартинкаИНаименованиеExtendedTooltip + 90 Label true true @@ -152,8 +152,8 @@ ДеревоВерсий.Владелец - ВладелецРасширеннаяПодсказка - 104 + ВладелецExtendedTooltip + 93 Label true true @@ -193,8 +193,8 @@ ДеревоВерсий.НомерВерсии - НомерВерсииРасширеннаяПодсказка - 106 + НомерВерсииExtendedTooltip + 94 Label true true @@ -234,8 +234,8 @@ ДеревоВерсий.Комментарий - КомментарийРасширеннаяПодсказка - 108 + КомментарийExtendedTooltip + 95 Label true true @@ -275,8 +275,8 @@ ДеревоВерсий.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 110 + ДатаСозданияExtendedTooltip + 96 Label true true @@ -316,8 +316,8 @@ ДеревоВерсий.Размер - РазмерРасширеннаяПодсказка - 112 + РазмерExtendedTooltip + 97 Label true true @@ -356,8 +356,8 @@ ДеревоВерсий.Ссылка - СсылкаРасширеннаяПодсказка - 114 + СсылкаExtendedTooltip + 98 Label true true @@ -414,10 +414,10 @@ СписокСтрокаПоиска - 90 + 99 СписокСтрокаПоискаРасширеннаяПодсказка - 92 + 101 Label true true @@ -427,7 +427,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 91 + 100 true Список @@ -437,10 +437,10 @@ СписокСостояниеПросмотра - 93 + 102 СписокСостояниеПросмотраРасширеннаяПодсказка - 95 + 104 Label true true @@ -450,7 +450,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 94 + 103 true ViewStatusAddition @@ -461,10 +461,10 @@ СписокУправлениеПоиском - 96 + 105 СписокУправлениеПоискомРасширеннаяПодсказка - 98 + 107 Label true true @@ -474,7 +474,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 97 + 106 true SearchControlAddition @@ -484,7 +484,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 89 Label true @@ -506,7 +506,7 @@ false - КонтекстноеМенюСписокОткрытьВерсиюРасширеннаяПодсказка + КонтекстноеМенюСписокОткрытьВерсиюExtendedTooltip 82 Label true @@ -537,7 +537,7 @@ false - КонтекстноеМенюСписокОткрытьКарточкуРасширеннаяПодсказка + КонтекстноеМенюСписокОткрытьКарточкуExtendedTooltip 83 Label true @@ -564,7 +564,7 @@ false - КонтекстноеМенюСписокСделатьАктивнойРасширеннаяПодсказка + КонтекстноеМенюСписокСделатьАктивнойExtendedTooltip 84 Label true @@ -591,7 +591,7 @@ false - КонтекстноеМенюСписокСравнитьРасширеннаяПодсказка + КонтекстноеМенюСписокСравнитьExtendedTooltip 85 Label true @@ -617,7 +617,7 @@ true - КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка + КонтекстноеМенюСписокСохранитьКакExtendedTooltip 86 Label true @@ -644,7 +644,7 @@ false - КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + КонтекстноеМенюСписокПометитьНаУдаление_СнятьПометкуExtendedTooltip 87 Label true @@ -671,7 +671,7 @@ false - КонтекстноеМенюСписокКопироватьРасширеннаяПодсказка + КонтекстноеМенюСписокКопироватьExtendedTooltip 88 Label true @@ -735,7 +735,7 @@ false - ФормаОткрытьВерсиюРасширеннаяПодсказка + ФормаОткрытьВерсиюExtendedTooltip 74 Label true @@ -766,7 +766,7 @@ false - ФормаОткрытьКарточкуРасширеннаяПодсказка + ФормаОткрытьКарточкуExtendedTooltip 75 Label true @@ -793,7 +793,7 @@ false - ФормаСделатьАктивнойРасширеннаяПодсказка + ФормаСделатьАктивнойExtendedTooltip 76 Label true @@ -820,7 +820,7 @@ false - ФормаПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + ФормаПометитьНаУдаление_СнятьПометкуExtendedTooltip 77 Label true @@ -847,7 +847,7 @@ false - ФормаСравнитьРасширеннаяПодсказка + ФормаСравнитьExtendedTooltip 78 Label true @@ -873,7 +873,7 @@ true - ФормаСохранитьКакРасширеннаяПодсказка + ФормаСохранитьКакExtendedTooltip 79 Label true @@ -907,7 +907,7 @@ Форма стандартные команды - ФормаСтандартныеКомандыРасширеннаяПодсказка + ФормаСтандартныеКомандыExtendedTooltip 80 Label true @@ -929,7 +929,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 81 Label true @@ -948,10 +948,6 @@ Left - - ChoiceProcessing - ОбработкаВыбора - NotificationProcessing ОбработкаОповещения diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl index 114ab69a3..75cd2378e 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаСпискаВерсийФайла/Module.bsl @@ -22,17 +22,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ВерсииФайлов.Форма.ФормаВыбораСпособаСравненияВерсий") Тогда - Если ВыбранноеЗначение <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - СпособСравненияВерсийФайлов = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().СпособСравненияВерсийФайлов; - ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов); - КонецЕсли; -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ @@ -50,7 +39,7 @@ ЗаполнитьДеревоВерсий(); Оповестить("Запись_Файл", Новый Структура("Событие", "АктивнаяВерсияИзменена"), Параметры.Файл); Иначе - Предупреждение(НСтр("ru = 'Смена активной версии разрешена только для не занятых файлов.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Смена активной версии разрешена только для не занятых файлов.'")); КонецЕсли; КонецПроцедуры @@ -100,10 +89,18 @@ СтандартнаяОбработка = Ложь; ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Неопределено, + ТекущиеДанные.Ссылка, + УникальныйИдентификатор); РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла( - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор), + Неопределено, + ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -128,7 +125,7 @@ Отказ = Истина; ПометитьНаУдалениеСнятьПометку(); - + КонецПроцедуры &НаКлиенте @@ -158,61 +155,64 @@ // Сравнить 2 выбранные версии. &НаКлиенте Процедура Сравнить(Команда) + + #Если ВебКлиент Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Сравнение версий не поддерживается в веб-клиенте.'")); + Возврат; + #КонецЕсли + ЧислоВыделенныхСтрок = Элементы.Список.ВыделенныеСтроки.Количество(); Если ЧислоВыделенныхСтрок = 2 ИЛИ ЧислоВыделенныхСтрок = 1 Тогда + Если ЧислоВыделенныхСтрок = 2 Тогда + Ссылка1 = ДеревоВерсий.НайтиПоИдентификатору(Элементы.Список.ВыделенныеСтроки[0]).Ссылка; + Ссылка2 = ДеревоВерсий.НайтиПоИдентификатору(Элементы.Список.ВыделенныеСтроки[1]).Ссылка; + ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда + + Ссылка1 = Элементы.Список.ТекущиеДанные.Ссылка; + Ссылка2 = Элементы.Список.ТекущиеДанные.РодительскаяВерсия; + + КонецЕсли; - #Если НЕ ВебКлиент Тогда - - Если ЧислоВыделенныхСтрок = 2 Тогда - Ссылка1 = ДеревоВерсий.НайтиПоИдентификатору(Элементы.Список.ВыделенныеСтроки[0]).Ссылка; - Ссылка2 = ДеревоВерсий.НайтиПоИдентификатору(Элементы.Список.ВыделенныеСтроки[1]).Ссылка; - ИначеЕсли ЧислоВыделенныхСтрок = 1 Тогда - - Ссылка1 = Элементы.Список.ТекущиеДанные.Ссылка; - Ссылка2 = Элементы.Список.ТекущиеДанные.РодительскаяВерсия; - - КонецЕсли; - - СпособСравненияВерсийФайлов = Неопределено; - Расширение = НРег(Элементы.Список.ТекущиеДанные.Расширение); - - РасширениеПоддерживается = (Расширение = "txt" ИЛИ Расширение = "doc" ИЛИ Расширение = "docx" ИЛИ Расширение = "rtf" ИЛИ Расширение = "htm" ИЛИ Расширение = "html" ИЛИ Расширение = "odt"); - - Если Не РасширениеПоддерживается Тогда - Предупреждение(НСтр("ru = 'Сравнение версий поддерживается только для файлов следующих типов: - | Текстовый документ (.txt) - | Документ формата RTF (.rtf) - | Документ Microsoft Word (.doc, .docx) - | Документ HTML (.html .htm) - | Текстовый документ OpenDocument (.odt)'")); - Возврат; - КонецЕсли; - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Данная операция не поддерживается в базовой версии.'")); - Возврат; - КонецЕсли; - - Если Расширение = "odt" Тогда - СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter"; - ИначеЕсли Расширение = "htm" ИЛИ Расширение = "html" Тогда - СпособСравненияВерсийФайлов = "MicrosoftOfficeWord"; - ИначеЕсли СпособСравненияВерсийФайлов = Неопределено Тогда - СпособСравненияВерсийФайлов = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().СпособСравненияВерсийФайлов; - Если СпособСравненияВерсийФайлов = Неопределено Тогда // первый вызов - еще не инициализирована настройка - ПараметрыФормы = Новый Структура; - ОткрытьФорму("Справочник.ВерсииФайлов.Форма.ФормаВыбораСпособаСравненияВерсий", ПараметрыФормы, ЭтаФорма); - Возврат; - КонецЕсли; - КонецЕсли; - - ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов); - #Иначе - Предупреждение(НСтр("ru = 'Сравнение версий в веб-клиенте не поддерживается.'")); - #КонецЕсли - + СпособСравненияВерсийФайлов = Неопределено; + Расширение = НРег(Элементы.Список.ТекущиеДанные.Расширение); + + РасширениеПоддерживается = ( + Расширение = "txt" + ИЛИ Расширение = "doc" + ИЛИ Расширение = "docx" + ИЛИ Расширение = "rtf" + ИЛИ Расширение = "htm" + ИЛИ Расширение = "html" + ИЛИ Расширение = "odt"); + + Если Не РасширениеПоддерживается Тогда + ТекстПредупреждения = + НСтр("ru = 'Сравнение версий поддерживается только для файлов следующих типов: + | Текстовый документ (.txt) + | Документ формата RTF (.rtf) + | Документ Microsoft Word (.doc, .docx) + | Документ HTML (.html .htm) + | Текстовый документ OpenDocument (.odt)'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + КонецЕсли; + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Данная операция не поддерживается в базовой версии.'")); + Возврат; + КонецЕсли; + + Если Расширение = "odt" Тогда + СпособСравненияВерсийФайлов = "OpenOfficeOrgWriter"; + ИначеЕсли Расширение = "htm" ИЛИ Расширение = "html" Тогда + СпособСравненияВерсийФайлов = "MicrosoftOfficeWord"; + КонецЕсли; + + ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов); КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -253,9 +253,14 @@ Возврат; КонецЕсли; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Неопределено, + ТекущиеДанные.Ссылка, + УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла( - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор), + Неопределено, + ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -269,8 +274,14 @@ КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Неопределено, ТекущиеДанные.Ссылка, УникальныйИдентификатор); - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла, УникальныйИдентификатор); + Неопределено, + ТекущиеДанные.Ссылка, + УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.СохранитьКак( + Неопределено, + ДанныеФайла, + УникальныйИдентификатор); КонецПроцедуры @@ -386,16 +397,13 @@ &НаСервере Процедура УстановитьПометкуУдаления(Версия, Пометка) - ВерсияОбъект = Версия.ПолучитьОбъект(); ВерсияОбъект.Заблокировать(); ВерсияОбъект.УстановитьПометкуУдаления(Пометка); - КонецПроцедуры &НаКлиенте Процедура ПометитьНаУдалениеСнятьПометку() - ТекущиеДанные = Элементы.Список.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; @@ -411,64 +419,133 @@ Строка(ТекущиеДанные.Ссылка)); КонецЕсли; - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); - Если Результат <> КодВозвратаДиалога.Да Тогда + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ТекущиеДанные", ТекущиеДанные); + Обработчик = Новый ОписаниеОповещения("ПометитьНаУдалениеСнятьПометкуЗавершение", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура ПометитьНаУдалениеСнятьПометкуЗавершение(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; + ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления = Не ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления; + УстановитьПометкуУдаления(ПараметрыВыполнения.ТекущиеДанные.Ссылка, ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления); - УстановитьПометкуУдаления(ТекущиеДанные.Ссылка, Не ТекущиеДанные.ПометкаУдаления); - - ТекущиеДанные.ПометкаУдаления = Не ТекущиеДанные.ПометкаУдаления; - - Если ТекущиеДанные.ПометкаУдаления Тогда - ТекущиеДанные.ИндексКартинкиТекущий = 1; + Если ПараметрыВыполнения.ТекущиеДанные.ПометкаУдаления Тогда + ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = 1; Иначе - ТекущиеДанные.ИндексКартинкиТекущий = ТекущиеДанные.ИндексКартинки; + ПараметрыВыполнения.ТекущиеДанные.ИндексКартинкиТекущий = ПараметрыВыполнения.ТекущиеДанные.ИндексКартинки; КонецЕсли; - КонецПроцедуры &НаКлиенте Процедура ПродолжитьСравнениеВерсий(СпособСравненияВерсийФайлов) - #Если НЕ ВебКлиент Тогда - - Если СпособСравненияВерсийФайлов = Неопределено Тогда - Возврат; - КонецЕсли; - - ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия(Неопределено, Ссылка1, УникальныйИдентификатор); - ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия(Неопределено, Ссылка2, УникальныйИдентификатор); - - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется сравнение версий файла ""%1""...'"), ДанныеФайла1.Ссылка); - Состояние(ТекстСостояния); - - ПолноеИмяФайла1 = ""; - Результат1 = РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла1, ПолноеИмяФайла1); - - ПолноеИмяФайла2 = ""; - Результат2 = РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла2, ПолноеИмяФайла2); - - Если Результат1 И Результат2 Тогда - - ПутьКФайлу1 = ""; - ПутьКФайлу2 = ""; - - Если ДанныеФайла1.НомерВерсии < ДанныеФайла2.НомерВерсии Тогда - ПутьКФайлу1 = ПолноеИмяФайла1; - ПутьКФайлу2 = ПолноеИмяФайла2; - Иначе - ПутьКФайлу1 = ПолноеИмяФайла2; - ПутьКФайлу2 = ПолноеИмяФайла1; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("СпособСравненияВерсийФайлов", СпособСравненияВерсийФайлов); + ПараметрыВыполнения.Вставить("ТекущийШаг", 1); + ПараметрыВыполнения.Вставить("ДанныеФайла1", Неопределено); + ПараметрыВыполнения.Вставить("ДанныеФайла2", Неопределено); + ПараметрыВыполнения.Вставить("Результат1", Неопределено); + ПараметрыВыполнения.Вставить("Результат2", Неопределено); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла1", Неопределено); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла2", Неопределено); + + СравнениеВерсийАвтомат(-1, ПараметрыВыполнения); + +КонецПроцедуры + +&НаКлиенте +Процедура СравнениеВерсийАвтомат(Результат, ПараметрыВыполнения) Экспорт + + Если Результат <> -1 Тогда + Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда + Если Результат <> КодВозвратаДиалога.ОК Тогда + Возврат; КонецЕсли; - РаботаСФайламиСлужебныйКлиент.СравнитьФайлы( - ПутьКФайлу1, ПутьКФайлу2, СпособСравненияВерсийФайлов); + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыВыполнения.ТекущийШаг = 2; + + ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 3 Тогда + ПараметрыВыполнения.Результат1 = Результат.ФайлПолучен; + ПараметрыВыполнения.ПолноеИмяФайла1 = Результат.ПолноеИмяФайла; + ПараметрыВыполнения.ТекущийШаг = 4; + + ИначеЕсли ПараметрыВыполнения.ТекущийШаг = 4 Тогда + ПараметрыВыполнения.Результат2 = Результат.ФайлПолучен; + ПараметрыВыполнения.ПолноеИмяФайла2 = Результат.ПолноеИмяФайла; + ПараметрыВыполнения.ТекущийШаг = 5; КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 1 Тогда + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ПараметрыВыполнения.СпособСравненияВерсийФайлов = ПерсональныеНастройки.СпособСравненияВерсийФайлов; + + Если ПараметрыВыполнения.СпособСравненияВерсийФайлов = Неопределено Тогда + // Первый вызов - еще не инициализирована настройка. + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("Справочник.ВерсииФайлов.Форма.ФормаВыбораСпособаСравненияВерсий", , + ЭтотОбъект, , , , Обработчик); + Возврат; + КонецЕсли; + КонецЕсли; + ПараметрыВыполнения.ТекущийШаг = 2; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 2 Тогда + ПараметрыВыполнения.ДанныеФайла1 = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Неопределено, Ссылка1, УникальныйИдентификатор); + + ПараметрыВыполнения.ДанныеФайла2 = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Неопределено, Ссылка2, УникальныйИдентификатор); + + ТекстСостояния = НСтр("ru = 'Выполняется сравнение версий файла ""%1""...'"); + ТекстСостояния = СтрЗаменить(ТекстСостояния, "%1", Строка(ПараметрыВыполнения.ДанныеФайла1.Ссылка)); + Состояние(ТекстСостояния); + ПараметрыВыполнения.ТекущийШаг = 3; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 3 Тогда + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, ПараметрыВыполнения.ДанныеФайла1, ПараметрыВыполнения.ПолноеИмяФайла1); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 4 Тогда + Обработчик = Новый ОписаниеОповещения("СравнениеВерсийАвтомат", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, ПараметрыВыполнения.ДанныеФайла2, ПараметрыВыполнения.ПолноеИмяФайла2); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ТекущийШаг = 5 Тогда + Если ПараметрыВыполнения.Результат1 И ПараметрыВыполнения.Результат2 Тогда + Если ПараметрыВыполнения.ДанныеФайла1.НомерВерсии < ПараметрыВыполнения.ДанныеФайла2.НомерВерсии Тогда + ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла1; + ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла2; + Иначе + ПолноеИмяФайлаСлева = ПараметрыВыполнения.ПолноеИмяФайла2; + ПолноеИмяФайлаСправа = ПараметрыВыполнения.ПолноеИмяФайла1; + КонецЕсли; + РаботаСФайламиСлужебныйКлиент.СравнитьФайлы( + ПолноеИмяФайлаСлева, + ПолноеИмяФайлаСправа, + ПараметрыВыполнения.СпособСравненияВерсийФайлов); + КонецЕсли; Состояние(); - #КонецЕсли + КонецЕсли; + КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form index 9de846959..07ac77bc1 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Owner - ВладелецРасширеннаяПодсказка + ВладелецExtendedTooltip 59 Label true @@ -68,8 +68,8 @@ ПолноеНаименованиеПриИзменении - ПолноеНаименованиеРасширеннаяПодсказка - 62 + ПолноеНаименованиеExtendedTooltip + 61 Label true true @@ -111,8 +111,8 @@ Объект.Code - КодРасширеннаяПодсказка - 64 + КодExtendedTooltip + 62 Label true true @@ -153,8 +153,8 @@ Наименование код - НаименованиеКодРасширеннаяПодсказка - 61 + НаименованиеКодExtendedTooltip + 60 Label true true @@ -183,8 +183,8 @@ Объект.РодительскаяВерсия - РодительскаяВерсияРасширеннаяПодсказка - 66 + РодительскаяВерсияExtendedTooltip + 63 Label true true @@ -233,8 +233,8 @@ Объект.Размер - РазмерРасширеннаяПодсказка - 69 + РазмерExtendedTooltip + 65 Label true true @@ -278,8 +278,8 @@ Объект.Расширение - РасширениеРасширеннаяПодсказка - 71 + РасширениеExtendedTooltip + 66 Label true true @@ -325,8 +325,8 @@ None - КартинкаРасширеннаяПодсказка - 73 + КартинкаExtendedTooltip + 67 Label true true @@ -368,8 +368,8 @@ Расширение картинка - РасширениеКартинкаРасширеннаяПодсказка - 68 + РасширениеКартинкаExtendedTooltip + 64 Label true true @@ -402,8 +402,8 @@ Объект.Комментарий - КомментарийРасширеннаяПодсказка - 75 + КомментарийExtendedTooltip + 68 Label true true @@ -452,8 +452,8 @@ Объект.Автор - АвторРасширеннаяПодсказка - 77 + АвторExtendedTooltip + 69 Label true true @@ -500,8 +500,8 @@ Объект.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 80 + ДатаСозданияExtendedTooltip + 71 Label true true @@ -545,8 +545,8 @@ Объект.НомерВерсии - НомерВерсииРасширеннаяПодсказка - 82 + НомерВерсииExtendedTooltip + 72 Label true true @@ -585,8 +585,8 @@ Дата и номер - ДатаИНомерРасширеннаяПодсказка - 79 + ДатаИНомерExtendedTooltip + 70 Label true true @@ -619,8 +619,8 @@ Объект.ДатаМодификацииФайла - ДатаМодификацииФайлаРасширеннаяПодсказка - 84 + ДатаМодификацииФайлаExtendedTooltip + 73 Label true true @@ -661,8 +661,8 @@ Кодировка - КодировкаРасширеннаяПодсказка - 86 + КодировкаExtendedTooltip + 74 Label true true @@ -701,8 +701,8 @@ Объект.ТипХраненияФайла - ТипХраненияФайлаРасширеннаяПодсказка - 89 + ТипХраненияФайлаExtendedTooltip + 76 Label true true @@ -746,8 +746,8 @@ Объект.Том - ТомРасширеннаяПодсказка - 92 + ТомExtendedTooltip + 78 Label true true @@ -788,8 +788,8 @@ ТомПолныйПуть - ТомПолныйПутьРасширеннаяПодсказка - 94 + ТомПолныйПутьExtendedTooltip + 79 Label true true @@ -832,8 +832,8 @@ Группа том - ГруппаТомРасширеннаяПодсказка - 91 + ГруппаТомExtendedTooltip + 77 Label true true @@ -863,8 +863,8 @@ Объект.ПутьКФайлу - ПутьКФайлуРасширеннаяПодсказка - 96 + ПутьКФайлуExtendedTooltip + 80 Label true true @@ -905,8 +905,8 @@ Группа хранение - ГруппаХранениеРасширеннаяПодсказка - 88 + ГруппаХранениеExtendedTooltip + 75 Label true true @@ -940,7 +940,7 @@ false - ОткрытьРасширеннаяПодсказка + ОткрытьExtendedTooltip 57 Label true @@ -975,7 +975,7 @@ true - ФормаСохранитьКакРасширеннаяПодсказка + ФормаСохранитьКакExtendedTooltip 58 Label true diff --git a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl index 3b8806f47..7ca36497e 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/Forms/ФормаЭлемента/Module.bsl @@ -63,9 +63,14 @@ Процедура ОткрытьВыполнить() ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Неопределено, Объект.Ссылка, УникальныйИдентификатор); + Неопределено, + Объект.Ссылка, + УникальныйИдентификатор); - РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла(ДанныеФайла, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.ОткрытьВерсиюФайла( + Неопределено, + ДанныеФайла, + УникальныйИдентификатор); КонецПроцедуры @@ -81,8 +86,14 @@ Процедура СохранитьКак(Команда) ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Неопределено, Объект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла, УникальныйИдентификатор); + Неопределено, + Объект.Ссылка, + УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.СохранитьКак( + Неопределено, + ДанныеФайла, + УникальныйИдентификатор); КонецПроцедуры diff --git a/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html index b2135b08c..08a4f0df3 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ВерсииФайлов/Help/ru.html @@ -1,4 +1,4 @@ - +

Для просмотра списка всех версий файла откройте его карточку (F2 или команда "Открыть карточку") и перейдите в раздел "Версии файлов".

В списке версий можно:

  • открыть файл версии соответствующим приложением для просмотра (команда "Открыть карточку"); diff --git a/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl new file mode 100644 index 000000000..ca3ca9b78 --- /dev/null +++ b/SSL/src/Catalogs/ВерсииФайлов/ManagerModule.bsl @@ -0,0 +1,18 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Комментарий"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl index f1131807f..c4c9d79b4 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ВерсииФайлов/ObjectModule.bsl @@ -35,15 +35,15 @@ Если ЗначениеЗаполнено(Ссылка) Тогда - СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "ПодписанЭЦП, Зашифрован"); - СсылкаПодписан = СтруктураРеквизитов.ПодписанЭЦП; + СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "ПодписанЭП, Зашифрован"); + СсылкаПодписан = СтруктураРеквизитов.ПодписанЭП; СсылкаЗашифрован = СтруктураРеквизитов.Зашифрован; - Если ПодписанЭЦП И СсылкаПодписан Тогда + Если ПодписанЭП И СсылкаПодписан Тогда ВызватьИсключение НСтр("ru = 'Подписанную версию нельзя редактировать.'"); КонецЕсли; - Если Зашифрован И СсылкаЗашифрован И ПодписанЭЦП И НЕ СсылкаПодписан Тогда + Если Зашифрован И СсылкаЗашифрован И ПодписанЭП И НЕ СсылкаПодписан Тогда ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); КонецЕсли; diff --git a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo index 7b47191c9..ce55189c0 100644 --- a/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo +++ b/SSL/src/Catalogs/ВерсииФайлов/ВерсииФайлов.mdo @@ -320,11 +320,12 @@ Use - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП + Файл версии подписан ЭП Boolean @@ -565,10 +566,10 @@ - ЭлектронныеЦифровыеПодписи + ЭлектронныеПодписи ru - Электронные подписи + электронные подписи Use diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 370e15285..e8c18dec9 100644 --- a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -20,4 +20,6 @@ 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 index d1a7d6586..3bc022dfa 100644 --- a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 22 + НаименованиеExtendedTooltip + 13 Label true true @@ -60,10 +60,10 @@ СписокСтрокаПоиска - 13 + 14 СписокСтрокаПоискаРасширеннаяПодсказка - 15 + 16 Label true true @@ -73,7 +73,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 14 + 15 true Список @@ -83,10 +83,10 @@ СписокСостояниеПросмотра - 16 + 17 СписокСостояниеПросмотраРасширеннаяПодсказка - 18 + 19 Label true true @@ -96,7 +96,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 17 + 18 true ViewStatusAddition @@ -107,10 +107,10 @@ СписокУправлениеПоиском - 19 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 21 + 22 Label true true @@ -120,7 +120,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 20 + 21 true SearchControlAddition @@ -130,7 +130,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 12 Label true @@ -192,7 +192,7 @@ true - ФормаПереместитьЭлементВверхРасширеннаяПодсказка + ФормаПереместитьЭлементВверхExtendedTooltip 10 Label true @@ -218,7 +218,7 @@ true - ФормаПереместитьЭлементВнизРасширеннаяПодсказка + ФормаПереместитьЭлементВнизExtendedTooltip 11 Label true diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form index 6920fee53..2b3088bd1 100644 --- a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 3 Label true diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html index e9b9fffc8..1f123e498 100644 --- a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

     

    diff --git a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl index 5df6baadd..f974a3401 100644 --- a/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВидыДокументовФизическихЛиц/ManagerModule.bsl @@ -1,5 +1,8 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#КонецЕсли + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -30,5 +33,3 @@ КонецЦикла; КонецПроцедуры - -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index b5b71662c..11b54836d 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаВыбораГруппы/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -64,10 +64,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -77,7 +77,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -87,10 +87,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -100,7 +100,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -111,10 +111,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -124,7 +124,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -134,7 +134,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form index e38db64d0..c5d8d1859 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаГруппы/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 3 Label true diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 47e7d6fec..3c82ef846 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -16,4 +16,6 @@ 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 index 0f08570a7..e8e1f2f56 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Form.form @@ -29,8 +29,8 @@ None - НомерКартинкиРасширеннаяПодсказка - 44 + НомерКартинкиExtendedTooltip + 35 Label true true @@ -79,8 +79,8 @@ Список.Ref - СсылкаРасширеннаяПодсказка - 46 + СсылкаExtendedTooltip + 36 Label true true @@ -120,10 +120,10 @@ СписокСтрокаПоиска - 35 + 37 СписокСтрокаПоискаРасширеннаяПодсказка - 37 + 39 Label true true @@ -133,7 +133,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 36 + 38 true Список @@ -143,10 +143,10 @@ СписокСостояниеПросмотра - 38 + 40 СписокСостояниеПросмотраРасширеннаяПодсказка - 40 + 42 Label true true @@ -156,7 +156,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 39 + 41 true ViewStatusAddition @@ -167,10 +167,10 @@ СписокУправлениеПоиском - 41 + 43 СписокУправлениеПоискомРасширеннаяПодсказка - 43 + 45 Label true true @@ -180,7 +180,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 42 + 44 true SearchControlAddition @@ -190,7 +190,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 34 Label true @@ -258,7 +258,7 @@ false - ПереместитьВверхРасширеннаяПодсказка + ПереместитьВверхExtendedTooltip 32 Label true @@ -291,7 +291,7 @@ false - ПереместитьВнизРасширеннаяПодсказка + ПереместитьВнизExtendedTooltip 33 Label true diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl index 5d2d0f9fa..a9ae22844 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаСписка/Module.bsl @@ -15,7 +15,6 @@ КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ @@ -24,13 +23,9 @@ // Проверим, выполняется ли копирование группы Если Копирование И Группа Тогда - Предупреждение(НСтр("ru = 'Добавление новых групп в справочнике запрещено.'")); Отказ = Истина; + + ПоказатьПредупреждение(, НСтр("ru='Добавление новых групп в справочнике запрещено.'")); КонецЕсли; КонецПроцедуры - - - - - diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form index 91a4d8c6c..367138177 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Form.form @@ -19,7 +19,7 @@ ТипПриИзменении - ТипРасширеннаяПодсказка + ТипExtendedTooltip 86 Label true @@ -66,8 +66,8 @@ true - НаименованиеРасширеннаяПодсказка - 88 + НаименованиеExtendedTooltip + 87 Label true true @@ -101,7 +101,7 @@ true - ГруппаТипНаименованиеРасширеннаяПодсказка + ГруппаТипНаименованиеExtendedTooltip 85 Label true @@ -132,8 +132,8 @@ Left - ПодсказкаРасширеннаяПодсказка - 90 + ПодсказкаExtendedTooltip + 88 Label true true @@ -175,8 +175,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 92 + РодительExtendedTooltip + 89 Label true true @@ -223,8 +223,8 @@ Right - ОбязательноеЗаполнениеРасширеннаяПодсказка - 96 + ОбязательноеЗаполнениеExtendedTooltip + 92 Label true true @@ -257,8 +257,8 @@ Right - РедактированиеТолькоВДиалогеРасширеннаяПодсказка - 98 + РедактированиеТолькоВДиалогеExtendedTooltip + 93 Label true true @@ -295,8 +295,8 @@ Разрешить ввод нескольких значений одного вида - РазрешитьВводНесколькихЗначенийРасширеннаяПодсказка - 100 + РазрешитьВводНесколькихЗначенийExtendedTooltip + 94 Label true true @@ -331,8 +331,8 @@ true - ГруппаТипОбщиеДляВсехРасширеннаяПодсказка - 95 + ГруппаТипОбщиеДляВсехExtendedTooltip + 91 Label true true @@ -363,8 +363,8 @@ true - Декорация1РасширеннаяПодсказка - 103 + Декорация1ExtendedTooltip + 96 Label true true @@ -391,8 +391,8 @@ true - Группа3РасширеннаяПодсказка - 102 + Группа3ExtendedTooltip + 95 Label true true @@ -443,8 +443,8 @@ АдресТолькоРоссийскийПриИзменении - АдресТолькоРоссийскийРасширеннаяПодсказка - 108 + АдресТолькоРоссийскийExtendedTooltip + 101 Label true true @@ -476,8 +476,8 @@ true - Декорация3РасширеннаяПодсказка - 111 + Декорация3ExtendedTooltip + 103 Label true true @@ -522,8 +522,8 @@ ПроверятьПоКлассификаторуПриИзменении - ПроверятьПоКлассификаторуРасширеннаяПодсказка - 113 + ПроверятьПоКлассификаторуExtendedTooltip + 105 Label true true @@ -556,8 +556,8 @@ Right - СкрыватьНеактуальныеАдресаРасширеннаяПодсказка - 115 + СкрыватьНеактуальныеАдресаExtendedTooltip + 106 Label true true @@ -583,8 +583,8 @@ true - Группа1РасширеннаяПодсказка - 112 + Группа1ExtendedTooltip + 104 Label true true @@ -608,8 +608,8 @@ true - Группа2РасширеннаяПодсказка - 110 + Группа2ExtendedTooltip + 102 Label true true @@ -639,8 +639,8 @@ Right - ВключатьСтрануВПредставлениеРасширеннаяПодсказка - 117 + ВключатьСтрануВПредставлениеExtendedTooltip + 107 Label true true @@ -666,8 +666,8 @@ true - АдресРасширеннаяПодсказка - 107 + АдресExtendedTooltip + 100 Label true true @@ -705,8 +705,8 @@ ПроверятьКорректностьПриИзменении - ПроверятьКорректностьРасширеннаяПодсказка - 120 + ПроверятьКорректностьExtendedTooltip + 109 Label true true @@ -732,8 +732,8 @@ true - АдресЭлектроннойПочтыРасширеннаяПодсказка - 119 + АдресЭлектроннойПочтыExtendedTooltip + 108 Label true true @@ -759,8 +759,8 @@ true - Декорация7РасширеннаяПодсказка - 123 + Декорация7ExtendedTooltip + 111 Label true true @@ -786,8 +786,8 @@ true - ДругоеРасширеннаяПодсказка - 122 + ДругоеExtendedTooltip + 110 Label true true @@ -815,8 +815,8 @@ Проверки - ПроверкиРасширеннаяПодсказка - 106 + ПроверкиExtendedTooltip + 99 Label true true @@ -844,8 +844,8 @@ false - ГруппаВыравниваниеПоТипамРасширеннаяПодсказка - 105 + ГруппаВыравниваниеПоТипамExtendedTooltip + 98 Label true true @@ -878,8 +878,8 @@ false - ГруппаНаименованиеНастройкиПоТипамРасширеннаяПодсказка - 104 + ГруппаНаименованиеНастройкиПоТипамExtendedTooltip + 97 Label true true @@ -903,8 +903,8 @@ true - ГруппаТипКонтактнойИнформацииРасширеннаяПодсказка - 94 + ГруппаТипКонтактнойИнформацииExtendedTooltip + 90 Label true true diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html index b236eab8a..7e8afe0d4 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

    Конфигурация позволяет хранить следующие типы контактной информации:

    • Адрес — реквизит с таким типом контактной информации предназначен для хранения адреса в виде произвольной строки или в виде шаблона адреса. Позволяет заполнять адрес, используя адресный классификатор, из формы‑шаблона ввода адреса. Если адрес заполняется с помощью адресного классификатора, то индекс адреса устанавливается из классификатора автоматически, после окончания ввода адреса. Предопределенные фактический и юридический адреса используются в печатных формах документов.
      diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl index 8acb76136..131055788 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Forms/ФормаЭлемента/Module.bsl @@ -11,11 +11,11 @@ ОбъектНаСервере = РеквизитФормыВЗначение("Объект"); ЭтоПредопределенный = ОбъектНаСервере.Предопределенный; - ИспользуетсяЗапретРедактированияРеквизитов = ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов"); Если Не ЭтоПредопределенный Тогда - Если ИспользуетсяЗапретРедактированияРеквизитов Тогда - МодульЗапретРедактированияРеквизитовОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектов"); - МодульЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + // Обработчик подсистемы запрета редактирования реквизитов объектов. + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда + МодульЗапретРедактированияРеквизитовОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектов"); + МодульЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект,, НСтр("ru = 'Разрешить редактирование типа и группы'")); КонецЕсли; КонецЕсли; @@ -30,7 +30,7 @@ Элементы.Подсказка.ТолькоПросмотр = Истина; Иначе - Если Не ИспользуетсяЗапретРедактированияРеквизитов Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда Элементы.Родитель.ТолькоПросмотр = Истина; Элементы.Тип.ТолькоПросмотр = Истина; КонецЕсли; @@ -69,9 +69,10 @@ Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Если Не ЭтоПредопределенный Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектов"); - МодульЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + // Обработчик подсистемы запрета редактирования реквизитов объектов. + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда + МодульЗапретРедактированияРеквизитовОбъектов = ОбщегоНазначения.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектов"); + МодульЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект); КонецЕсли; КонецЕсли; @@ -124,10 +125,9 @@ Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда) Если Не ЭтоПредопределенный Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); - МодульЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъекта(ЭтаФорма); - МодульЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(ЭтаФорма); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда + МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); + МодульЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъекта(ЭтотОбъект); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Help/ru.html b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Help/ru.html index fea95a1a6..88e7af97a 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/Help/ru.html +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/Help/ru.html @@ -1,4 +1,4 @@ - +

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

      См. также

      \ No newline at end of file diff --git a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo index 74aa77500..c5e8edc0c 100644 --- a/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo +++ b/SSL/src/Catalogs/ВидыКонтактнойИнформации/ВидыКонтактнойИнформации.mdo @@ -132,13 +132,6 @@ true - - EmailОрганизации - Email - - - - ДругаяИнформацияОрганизации Другое @@ -174,6 +167,13 @@ + + EmailОрганизации + Электронная почта + + + + ЮрАдресОрганизации Юридический адрес @@ -189,16 +189,16 @@ true - - EmailПользователя - Email + + ТелефонПользователя + Телефон - - ТелефонПользователя - Телефон + + EmailПользователя + Электронная почта diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl index 66c9bd0aa..3b23b1ac2 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Commands/ВнешнийДоступ/CommandModule.bsl @@ -16,7 +16,8 @@ ИнформацияОбОшибке = ИнформацияОбОшибке(); Если Найти(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке), "ВызватьИсключение ОписаниеОшибкиКакПредупреждения") > 0 Тогда - Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Иначе ВызватьИсключение; КонецЕсли; diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ВнешниеПользователиСписок/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Attributes/ГруппыВнешнихПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 1ebb91512..62dd69870 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Form.form @@ -37,8 +37,8 @@ ГруппыВнешнихПользователей.Description - НаименованиеГруппыРасширеннаяПодсказка - 122 + НаименованиеГруппыExtendedTooltip + 113 Label true true @@ -91,10 +91,10 @@ ГруппыВнешнихПользователейСтрокаПоиска - 113 + 133 ГруппыВнешнихПользователейСтрокаПоискаРасширеннаяПодсказка - 115 + 135 Label true true @@ -104,7 +104,7 @@ ГруппыВнешнихПользователейСтрокаПоискаКонтекстноеМеню - 114 + 134 true ГруппыВнешнихПользователей @@ -114,10 +114,10 @@ ГруппыВнешнихПользователейСостояниеПросмотра - 116 + 136 ГруппыВнешнихПользователейСостояниеПросмотраРасширеннаяПодсказка - 118 + 138 Label true true @@ -127,7 +127,7 @@ ГруппыВнешнихПользователейСостояниеПросмотраКонтекстноеМеню - 117 + 137 true ViewStatusAddition @@ -138,10 +138,10 @@ ГруппыВнешнихПользователейУправлениеПоиском - 119 + 139 ГруппыВнешнихПользователейУправлениеПоискомРасширеннаяПодсказка - 121 + 141 Label true true @@ -151,7 +151,7 @@ ГруппыВнешнихПользователейУправлениеПоискомКонтекстноеМеню - 120 + 140 true SearchControlAddition @@ -161,7 +161,7 @@ - ГруппыВнешнихПользователейРасширеннаяПодсказка + ГруппыВнешнихПользователейExtendedTooltip 112 Label true @@ -231,8 +231,8 @@ true - ОтступРасширеннаяПодсказка - 133 + ОтступExtendedTooltip + 115 Label true true @@ -261,8 +261,8 @@ true - ВыбратьГруппуРасширеннаяПодсказка - 134 + ВыбратьГруппуExtendedTooltip + 116 Label true true @@ -289,8 +289,8 @@ true - ОтменитьВыборПользователяИлиГруппыРасширеннаяПодсказка - 135 + ОтменитьВыборПользователяИлиГруппыExtendedTooltip + 117 Label true true @@ -317,8 +317,8 @@ true - ОчиститьСписокВыбранныхПользователейИГруппРасширеннаяПодсказка - 136 + ОчиститьСписокВыбранныхПользователейИГруппExtendedTooltip + 118 Label true true @@ -345,8 +345,8 @@ Группа выбрать группу - ГруппаВыбратьГруппуРасширеннаяПодсказка - 132 + ГруппаВыбратьГруппуExtendedTooltip + 114 Label true true @@ -374,7 +374,7 @@ Группа группы - ГруппаГруппыРасширеннаяПодсказка + ГруппаГруппыExtendedTooltip 111 Label true @@ -427,8 +427,8 @@ ВнешниеПользователиСписок.Description - НаименованиеРасширеннаяПодсказка - 149 + НаименованиеExtendedTooltip + 122 Label true true @@ -472,10 +472,10 @@ ВнешниеПользователиСписокСтрокаПоиска - 140 + 151 ВнешниеПользователиСписокСтрокаПоискаРасширеннаяПодсказка - 142 + 153 Label true true @@ -485,7 +485,7 @@ ВнешниеПользователиСписокСтрокаПоискаКонтекстноеМеню - 141 + 152 true ВнешниеПользователиСписок @@ -495,10 +495,10 @@ ВнешниеПользователиСписокСостояниеПросмотра - 143 + 154 ВнешниеПользователиСписокСостояниеПросмотраРасширеннаяПодсказка - 145 + 156 Label true true @@ -508,7 +508,7 @@ ВнешниеПользователиСписокСостояниеПросмотраКонтекстноеМеню - 144 + 155 true ViewStatusAddition @@ -519,10 +519,10 @@ ВнешниеПользователиСписокУправлениеПоиском - 146 + 157 ВнешниеПользователиСписокУправлениеПоискомРасширеннаяПодсказка - 148 + 159 Label true true @@ -532,7 +532,7 @@ ВнешниеПользователиСписокУправлениеПоискомКонтекстноеМеню - 147 + 158 true SearchControlAddition @@ -542,8 +542,8 @@ - ВнешниеПользователиСписокРасширеннаяПодсказка - 139 + ВнешниеПользователиСписокExtendedTooltip + 121 Label true true @@ -563,8 +563,8 @@ true - ВнешниеПользователиСписокКонтекстноеМенюНазначитьГруппыРасширеннаяПодсказка - 138 + ВнешниеПользователиСписокКонтекстноеМенюНазначитьГруппыExtendedTooltip + 120 Label true true @@ -636,8 +636,8 @@ true - Отступ2РасширеннаяПодсказка - 160 + Отступ2ExtendedTooltip + 124 Label true true @@ -666,8 +666,8 @@ true - ВыбратьПользователяКомандаРасширеннаяПодсказка - 161 + ВыбратьПользователяКомандаExtendedTooltip + 125 Label true true @@ -693,8 +693,8 @@ true - ОтменитьВыборПользователяРасширеннаяПодсказка - 162 + ОтменитьВыборПользователяExtendedTooltip + 126 Label true true @@ -720,8 +720,8 @@ true - ОчиститьСписокВыбранныхРасширеннаяПодсказка - 163 + ОчиститьСписокВыбранныхExtendedTooltip + 127 Label true true @@ -748,8 +748,8 @@ Группа выбрать пользователя - ГруппаВыбратьПользователяРасширеннаяПодсказка - 159 + ГруппаВыбратьПользователяExtendedTooltip + 123 Label true true @@ -777,8 +777,8 @@ Группа пользователи - ГруппаПользователиРасширеннаяПодсказка - 137 + ГруппаПользователиExtendedTooltip + 119 Label true true @@ -805,7 +805,7 @@ Группы и пользователи - ГруппыИПользователиРасширеннаяПодсказка + ГруппыИПользователиExtendedTooltip 110 Label true @@ -863,8 +863,8 @@ ВыбранныеПользователиИГруппы.Пользователь - ПользователиИГруппыРасширеннаяПодсказка - 175 + ПользователиИГруппыExtendedTooltip + 130 Label true true @@ -878,7 +878,6 @@ true InputField - true Auto true Left @@ -887,6 +886,11 @@ true true true + false + false + false + false + false true true true @@ -902,38 +906,11 @@ Selection СписокВыбранныхПользователейИГруппВыбор - - BeforeAddRow - СписокВыбранныхПользователейИГруппПередНачаломДобавления - СписокВыбранныхПользователейИГруппСтрокаПоиска - 166 - - СписокВыбранныхПользователейИГруппСтрокаПоискаРасширеннаяПодсказка - 168 - Label - true - true - - Left - - - - СписокВыбранныхПользователейИГруппСтрокаПоискаКонтекстноеМеню - 167 - true - - СписокВыбранныхПользователейИГрупп - - true - - - - СписокВыбранныхПользователейИГруппСостояниеПросмотра 169 - СписокВыбранныхПользователейИГруппСостояниеПросмотраРасширеннаяПодсказка + СписокВыбранныхПользователейИГруппСтрокаПоискаРасширеннаяПодсказка 171 Label true @@ -943,10 +920,33 @@ - СписокВыбранныхПользователейИГруппСостояниеПросмотраКонтекстноеМеню + СписокВыбранныхПользователейИГруппСтрокаПоискаКонтекстноеМеню 170 true + СписокВыбранныхПользователейИГрупп + + true + + + + СписокВыбранныхПользователейИГруппСостояниеПросмотра + 172 + + СписокВыбранныхПользователейИГруппСостояниеПросмотраРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + + СписокВыбранныхПользователейИГруппСостояниеПросмотраКонтекстноеМеню + 173 + true + ViewStatusAddition СписокВыбранныхПользователейИГрупп @@ -955,10 +955,10 @@ СписокВыбранныхПользователейИГруппУправлениеПоиском - 172 + 175 СписокВыбранныхПользователейИГруппУправлениеПоискомРасширеннаяПодсказка - 174 + 177 Label true true @@ -968,7 +968,7 @@ СписокВыбранныхПользователейИГруппУправлениеПоискомКонтекстноеМеню - 173 + 176 true SearchControlAddition @@ -978,8 +978,8 @@ - СписокВыбранныхПользователейИГруппРасширеннаяПодсказка - 165 + СписокВыбранныхПользователейИГруппExtendedTooltip + 129 Label true true @@ -1032,8 +1032,8 @@ Выбранные пользователи и группы - ВыбранныеПользователиИГруппыРасширеннаяПодсказка - 164 + ВыбранныеПользователиИГруппыExtendedTooltip + 128 Label true true @@ -1065,7 +1065,7 @@ Группа - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 109 Label true @@ -1104,8 +1104,8 @@ ВыбиратьИерархическиПриИзменении - ВыбиратьИерархическиРасширеннаяПодсказка - 186 + ВыбиратьИерархическиExtendedTooltip + 132 Label true true @@ -1135,8 +1135,8 @@ Группа показывать внешних пользователей дочерних групп - ГруппаПоказыватьВнешнихПользователейДочернихГруппРасширеннаяПодсказка - 185 + ГруппаПоказыватьВнешнихПользователейДочернихГруппExtendedTooltip + 131 Label true true @@ -1165,7 +1165,7 @@ true - ЗавершитьИЗакрытьРасширеннаяПодсказка + ЗавершитьИЗакрытьExtendedTooltip 99 Label true @@ -1196,7 +1196,7 @@ false - ВыбратьГруппуВнешнихПользователейРасширеннаяПодсказка + ВыбратьГруппуВнешнихПользователейExtendedTooltip 100 Label true @@ -1226,7 +1226,7 @@ false - ВыбратьВнешнегоПользователяРасширеннаяПодсказка + ВыбратьВнешнегоПользователяExtendedTooltip 101 Label true @@ -1253,7 +1253,7 @@ false - СоздатьВнешнегоПользователяРасширеннаяПодсказка + СоздатьВнешнегоПользователяExtendedTooltip 102 Label true @@ -1280,7 +1280,7 @@ false - СоздатьГруппуВнешнихПользователейРасширеннаяПодсказка + СоздатьГруппуВнешнихПользователейExtendedTooltip 103 Label true @@ -1306,7 +1306,7 @@ true - НазначитьГруппыРасширеннаяПодсказка + НазначитьГруппыExtendedTooltip 104 Label true @@ -1340,7 +1340,7 @@ true - ПоказыватьНедействительныхПользователейРасширеннаяПодсказка + ПоказыватьНедействительныхПользователейExtendedTooltip 106 Label true @@ -1368,7 +1368,7 @@ false - ПользователиИБРасширеннаяПодсказка + ПользователиИБExtendedTooltip 107 Label true @@ -1400,7 +1400,7 @@ Командная панель внешние пользователи - КоманднаяПанельВнешниеПользователиРасширеннаяПодсказка + КоманднаяПанельВнешниеПользователиExtendedTooltip 105 Label true @@ -1422,7 +1422,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 108 Label true @@ -1445,10 +1445,6 @@ NotificationProcessing ОбработкаОповещения - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl index 452b4b6a8..3812a785d 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаСписка/Module.bsl @@ -98,10 +98,10 @@ Элементы.ВнешниеПользователиСписок.МножественныйВыбор = Истина; Если ХранимыеПараметры.РасширенныйПодбор Тогда - ЭтаФорма.КлючСохраненияПоложенияОкна = "РасширенныйПодборВнешнихПользователей"; + ЭтотОбъект.КлючСохраненияПоложенияОкна = "РасширенныйПодборВнешнихПользователей"; ИзменитьПараметрыРасширеннойФормыПодбора(); Иначе - ЭтаФорма.КлючСохраненияПоложенияОкна = "РежимПодбораВнешнихПользователей"; + ЭтотОбъект.КлючСохраненияПоложенияОкна = "РежимПодбораВнешнихПользователей"; КонецЕсли; Если ХранимыеПараметры.ВыборГруппВнешнихПользователей Тогда @@ -128,7 +128,7 @@ Элементы.ГруппыВнешнихПользователей.Обновить(); Элементы.ВнешниеПользователиСписок.Обновить(); - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); ИначеЕсли ВРег(ИмяСобытия) = ВРег("Запись_ИспользоватьГруппыПользователей") Тогда @@ -150,34 +150,7 @@ КонецЕсли; Если НЕ ВыбиратьИерархически Тогда - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Если Не ХранимыеПараметры.РасширенныйПодбор - Или Не СписокВыбранныхПользователейИзменен Тогда - Возврат; - КонецЕсли; - - ТекстВопроса = НСтр("ru = 'Список выбранных пользователей был изменен. Сохранить изменения?'"); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Да'")); - КнопкиВопроса.Добавить(НСтр("ru='Нет'")); - КнопкиВопроса.Добавить(НСтр("ru='Отмена'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - МассивПользователей = РезультатВыбора(); - ОповеститьОВыборе(МассивПользователей); - ИначеЕсли Ответ = КнопкиВопроса[2].Значение Тогда - Отказ = Истина; - Возврат; + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -188,7 +161,7 @@ &НаКлиенте Процедура ВыбиратьИерархическиПриИзменении(Элемент) - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры @@ -198,7 +171,7 @@ &НаКлиенте Процедура ГруппыВнешнихПользователейПриАктивизацииСтроки(Элемент) - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры @@ -252,7 +225,7 @@ СтандартнаяОбработка = Ложь; Если ВыбиратьИерархически Тогда - Предупреждение(НСтр("ru = 'Для перетаскивания пользователя в группы необходимо отключить + ПоказатьПредупреждение(,НСтр("ru = 'Для перетаскивания пользователя в группы необходимо отключить |флажок ""Показывать пользователей дочерних групп"".'")); Возврат; КонецЕсли; @@ -325,52 +298,16 @@ КонецЕсли; - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); - - Если Ответ = КодВозвратаДиалога.Нет Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу( + ДополнительныеПараметры = Новый Структура("ПараметрыПеретаскивания, Строка, Перемещение", ПараметрыПеретаскивания.Значение, Строка, Перемещение); - КонецЕсли; - - Если СообщениеПользователю.Сообщение = Неопределено Тогда + Оповещение = Новый ОписаниеОповещения("ГруппыВнешнихПользователейПеретаскиваниеОбработкаВопроса", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); Возврат; - КонецЕсли; - - Оповестить("Запись_ГруппыВнешнихПользователей"); - - Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.Информация32); - Иначе - - Если СообщениеПользователю.Пользователи <> Неопределено Тогда - Отчет = Новый ТекстовыйДокумент; - Отчет.ДобавитьСтроку(НСтр("ru = 'Следующие пользователи не были включены в выбранную группу:'")); - Отчет.ДобавитьСтроку(Символы.ПС); - Отчет.ДобавитьСтроку(СообщениеПользователю.Пользователи); - - ТекстВопроса = СообщениеПользователю.Сообщение; - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='ОК'")); - КнопкиВопроса.Добавить(НСтр("ru='Показать отчет'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - Возврат; - Иначе - Отчет.Показать(НСтр("ru = 'Пользователи, не включенные в группы'")); - Возврат; - КонецЕсли; - Иначе - Предупреждение(СообщениеПользователю.Сообщение); - КонецЕсли; КонецЕсли; + ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -431,15 +368,10 @@ Процедура СписокВыбранныхПользователейИГруппВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) УдалитьИзСпискаВыбранных(); - СписокВыбранныхПользователейИзменен = Истина; + ЭтотОбъект.Модифицированность = Истина; КонецПроцедуры -&НаКлиенте -Процедура СписокВыбранныхПользователейИГруппПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Отказ = Истина; -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ @@ -479,7 +411,7 @@ Если ХранимыеПараметры.РасширенныйПодбор Тогда МассивПользователей = РезультатВыбора(); ОповеститьОВыборе(МассивПользователей); - СписокВыбранныхПользователейИзменен = Ложь; + ЭтотОбъект.Модифицированность = Ложь; Закрыть(); КонецЕсли; @@ -588,12 +520,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); @@ -700,7 +628,7 @@ Если ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей") Тогда Элементы.ГруппыИПользователи.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; Элементы.ГруппыИПользователи.ШиринаПодчиненныхЭлементов = ШиринаПодчиненныхЭлементовФормы.Одинаковая; - ЭтаФорма.Высота = 25; + ЭтотОбъект.Высота = 25; Элементы.ГруппаВыбратьГруппу.Видимость = Истина; // Включение отображения заголовков списков ПользователиСписок и ГруппыПользователей. Элементы.ГруппыВнешнихПользователей.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; @@ -759,7 +687,7 @@ СтрокаВыбранныеПользователи = ВыбранныеПользователиИГруппы.Добавить(); СтрокаВыбранныеПользователи.Пользователь = ВыбранныйПользовательИлиГруппа; СтрокаВыбранныеПользователи.НомерКартинки = НомерКартинки; - СписокВыбранныхПользователейИзменен = Истина; + ЭтотОбъект.Модифицированность = Истина; КонецЕсли; @@ -868,7 +796,7 @@ КонецЕсли; КонецЕсли; - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры @@ -961,3 +889,53 @@ ВладелецПараметров.Параметры.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Перетаскивание пользователей + +&НаКлиенте +Процедура ГруппыВнешнихПользователейПеретаскиваниеОбработкаВопроса(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу( + ДополнительныеПараметры.ПараметрыПеретаскивания, ДополнительныеПараметры.Строка, ДополнительныеПараметры.Перемещение); + ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыВнешнихПользователейПеретаскиваниеЗавершение(СообщениеПользователю) + + Если СообщениеПользователю.Сообщение = Неопределено Тогда + Возврат; + КонецЕсли; + + Оповестить("Запись_ГруппыВнешнихПользователей"); + + Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.Информация32); + Иначе + + Если СообщениеПользователю.Пользователи <> Неопределено Тогда + Отчет = НСтр("ru = 'Следующие пользователи не были включены в выбранную группу:'"); + Отчет = Отчет + Символы.ПС + СообщениеПользователю.Пользователи; + + ТекстВопроса = СообщениеПользователю.Сообщение; + + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); + ВыводПредупреждения = Результат.ВыводПредупреждения; + ВыводПредупреждения.Использование = Истина; + ВыводПредупреждения.Текст = ТекстВопроса; + ВыводПредупреждения.ТекстОшибок = Отчет; + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, Результат); + Иначе + ПоказатьПредупреждение(,СообщениеПользователю.Сообщение); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form index 11e964e0f..ead2d3ff6 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Form.form @@ -16,7 +16,7 @@ true - СвязьКартинкаПредупрежденияРасширеннаяПодсказка + СвязьКартинкаПредупрежденияExtendedTooltip 200 Label true @@ -57,7 +57,7 @@ true - СвязьПояснениеНесоответствияРасширеннаяПодсказка + СвязьПояснениеНесоответствияExtendedTooltip 201 Label true @@ -95,7 +95,7 @@ true - СвязьОбработкаНесоответствияРасширеннаяПодсказка + СвязьОбработкаНесоответствияExtendedTooltip 199 Label true @@ -130,7 +130,7 @@ ОбъектАвторизацииПриИзменении - ОбъектАвторизацииРасширеннаяПодсказка + ОбъектАвторизацииExtendedTooltip 202 Label true @@ -178,8 +178,8 @@ НедействителенПриИзменении - НедействителенРасширеннаяПодсказка - 204 + НедействителенExtendedTooltip + 203 Label true true @@ -216,8 +216,8 @@ ДоступКИнформационнойБазеРазрешенПриИзменении - ДоступКИнформационнойБазеРазрешенРасширеннаяПодсказка - 206 + ДоступКИнформационнойБазеРазрешенExtendedTooltip + 204 Label true true @@ -255,8 +255,8 @@ ПользовательИнфБазыИмя - ПользовательИнфБазыИмяРасширеннаяПодсказка - 210 + ПользовательИнфБазыИмяExtendedTooltip + 207 Label true true @@ -305,8 +305,8 @@ ПользовательИнфБазыАутентификацияСтандартнаяПриИзменении - ПользовательИнфБазыАутентификацияСтандартнаяРасширеннаяПодсказка - 213 + ПользовательИнфБазыАутентификацияСтандартнаяExtendedTooltip + 209 Label true true @@ -346,8 +346,8 @@ ПарольПриИзменении - ПарольРасширеннаяПодсказка - 216 + ПарольExtendedTooltip + 211 Label true true @@ -397,8 +397,8 @@ ПарольПриИзменении - ПодтверждениеПароляРасширеннаяПодсказка - 218 + ПодтверждениеПароляExtendedTooltip + 212 Label true true @@ -445,8 +445,8 @@ Right - ПользовательИнфБазыЗапрещеноИзменятьПарольРасширеннаяПодсказка - 220 + ПользовательИнфБазыЗапрещеноИзменятьПарольExtendedTooltip + 213 Label true true @@ -477,8 +477,8 @@ true - СвойстваПараметрыАутентификации1СПредприятияРасширеннаяПодсказка - 215 + СвойстваПараметрыАутентификации1СПредприятияExtendedTooltip + 210 Label true true @@ -503,8 +503,8 @@ true - СвойстваАутентификации1СПредприятияРасширеннаяПодсказка - 212 + СвойстваАутентификации1СПредприятияExtendedTooltip + 208 Label true true @@ -535,8 +535,8 @@ Right - ПользовательИнфБазыАутентификацияOpenIDРасширеннаяПодсказка - 222 + ПользовательИнфБазыАутентификацияOpenIDExtendedTooltip + 214 Label true true @@ -571,8 +571,8 @@ ПользовательИнфБазыЯзык - ПользовательИнфБазыЯзыкРасширеннаяПодсказка - 225 + ПользовательИнфБазыЯзыкExtendedTooltip + 216 Label true true @@ -596,7 +596,6 @@ true true false - true true true @@ -611,8 +610,8 @@ true - ГруппаПредставлениеЯзыкаРасширеннаяПодсказка - 224 + ГруппаПредставлениеЯзыкаExtendedTooltip + 215 Label true true @@ -643,8 +642,8 @@ 36 true - ОсновныеСвойстваРасширеннаяПодсказка - 209 + ОсновныеСвойстваExtendedTooltip + 206 Label true true @@ -682,8 +681,8 @@ УстановитьРолиНепосредственноПриИзменении - УстановитьРолиНепосредственноРасширеннаяПодсказка - 228 + УстановитьРолиНепосредственноExtendedTooltip + 218 Label true true @@ -755,8 +754,8 @@ РолиПометкаПриИзменении - РолиПометкаРасширеннаяПодсказка - 246 + РолиПометкаExtendedTooltip + 226 Label true true @@ -786,8 +785,8 @@ Роли.Синоним - РолиСинонимРасширеннаяПодсказка - 248 + РолиСинонимExtendedTooltip + 227 Label true true @@ -830,8 +829,8 @@ Роли колонок - РолиКолонокРасширеннаяПодсказка - 245 + РолиКолонокExtendedTooltip + 225 Label true true @@ -859,8 +858,8 @@ false - РолиУстановитьФлажкиРасширеннаяПодсказка - 231 + РолиУстановитьФлажкиExtendedTooltip + 220 Label true true @@ -886,8 +885,8 @@ false - РолиСнятьФлажкиРасширеннаяПодсказка - 232 + РолиСнятьФлажкиExtendedTooltip + 221 Label true true @@ -913,8 +912,8 @@ false - РолиПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка - 233 + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 222 Label true true @@ -939,8 +938,8 @@ true - РолиПоказатьПодсистемыРолейРасширеннаяПодсказка - 234 + РолиПоказатьПодсистемыРолейExtendedTooltip + 223 Label true true @@ -960,32 +959,9 @@ РолиСтрокаПоиска - 236 - - РолиСтрокаПоискаРасширеннаяПодсказка - 238 - Label - true - true - - Left - - - - РолиСтрокаПоискаКонтекстноеМеню - 237 - true - - Роли - - true - - - - РолиСостояниеПросмотра 239 - РолиСостояниеПросмотраРасширеннаяПодсказка + РолиСтрокаПоискаРасширеннаяПодсказка 241 Label true @@ -995,10 +971,33 @@ - РолиСостояниеПросмотраКонтекстноеМеню + РолиСтрокаПоискаКонтекстноеМеню 240 true + Роли + + true + + + + РолиСостояниеПросмотра + 242 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 244 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 243 + true + ViewStatusAddition Роли @@ -1007,10 +1006,10 @@ РолиУправлениеПоиском - 242 + 245 РолиУправлениеПоискомРасширеннаяПодсказка - 244 + 247 Label true true @@ -1020,7 +1019,7 @@ РолиУправлениеПоискомКонтекстноеМеню - 243 + 246 true SearchControlAddition @@ -1030,8 +1029,8 @@ - РолиРасширеннаяПодсказка - 235 + РолиExtendedTooltip + 224 Label true true @@ -1082,8 +1081,8 @@ Список ролей - ОтображениеРолейРасширеннаяПодсказка - 230 + ОтображениеРолейExtendedTooltip + 219 Label true true @@ -1115,8 +1114,8 @@ Редактирование или просмотр ролей - РедактированиеИлиПросмотрРолейРасширеннаяПодсказка - 227 + РедактированиеИлиПросмотрРолейExtendedTooltip + 217 Label true true @@ -1145,8 +1144,8 @@ true - СвойстваПользователяИБРасширеннаяПодсказка - 208 + СвойстваПользователяИБExtendedTooltip + 205 Label true true diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html index b1dd246bd..fd5225672 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

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

      Внешний пользователь связан с каким-то объектом программы (например, контрагентом, сотрудником и т.п.), указанным в поле Объект.

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

      diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl index 7c74d75e9..ef9bf2cd3 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/Forms/ФормаЭлемента/Module.bsl @@ -51,7 +51,7 @@ Объект.ОбъектАвторизации = Параметры.ОбъектАвторизацииНовогоВнешнегоПользователя; ОбъектАвторизацииЗаданПриОткрытии = ЗначениеЗаполнено(Объект.ОбъектАвторизации); - ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтаФорма, Объект); + ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтотОбъект, Объект); ИначеЕсли ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда @@ -134,7 +134,7 @@ КонецПроцедуры &НаКлиенте -Процедура ПередЗаписью(Отказ) +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) ОчиститьСообщения(); @@ -142,15 +142,16 @@ И Объект.УстановитьРолиНепосредственно И ПользовательИнфБазыРоли.Количество() = 0 Тогда - Ответ = Вопрос( - НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), - РежимДиалогаВопрос.ДаНет, - , - , - НСтр("ru = 'Запись пользователя информационной базы'")); - - Если Ответ = КодВозвратаДиалога.Нет Тогда + Если НЕ ПараметрыЗаписи.Свойство("СПустымСпискомРолей") Тогда Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей", ЭтотОбъект, ПараметрыЗаписи), + НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), + РежимДиалогаВопрос.ДаНет, + , + , + НСтр("ru = 'Запись пользователя информационной базы'")); + Возврат; КонецЕсли; КонецЕсли; @@ -224,19 +225,19 @@ Оповестить("Запись_ВнешниеПользователи", Новый Структура, Объект.Ссылка); Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда - Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтаФорма); + Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда - Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтаФорма); + Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда - Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтаФорма); + Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("ОчищенаСвязьСНесуществующимПользователемИБ") Тогда Оповестить( "ОчищенаСвязьСНесуществующимПользователемИБ", - ПараметрыЗаписи.ОчищенаСвязьСНесуществующимПользователемИБ, ЭтаФорма); + ПараметрыЗаписи.ОчищенаСвязьСНесуществующимПользователемИБ, ЭтотОбъект); КонецЕсли; Если ЗначениеЗаполнено(ГруппаНовогоВнешнегоПользователя) Тогда @@ -252,7 +253,7 @@ УстановитьДоступностьСвойств(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -296,7 +297,7 @@ &НаКлиенте Процедура ОбъектАвторизацииПриИзменении(Элемент) - ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтаФорма, Объект); + ОбъектАвторизацииПриИзмененииНаКлиентеНаСервере(ЭтотОбъект, Объект); КонецПроцедуры @@ -334,7 +335,7 @@ Если НЕ Объект.УстановитьРолиНепосредственно Тогда ПрочитатьРолиПользователяИБ(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецЕсли; УстановитьДоступностьСвойств(); @@ -366,7 +367,7 @@ Процедура ПоказатьТолькоВыбранныеРоли(Команда) ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -374,7 +375,7 @@ Процедура ГруппировкаРолейПоПодсистемам(Команда) ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -383,7 +384,7 @@ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма, Ложь); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь); КонецПроцедуры @@ -480,7 +481,7 @@ Результат = Пользователи.НовоеОписаниеПользователяИБ(); Пользователи.СкопироватьСвойстваПользователяИБ( Результат, - ЭтаФорма, + ЭтотОбъект, , "УникальныйИдентификатор, |Роли", @@ -545,6 +546,16 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("СПустымСпискомРолей"); + Записать(ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработка пользователя ИБ. @@ -621,7 +632,7 @@ КонецЕсли; Пользователи.СкопироватьСвойстваПользователяИБ( - ЭтаФорма, + ЭтотОбъект, ОписаниеПользователяИБ, , "УникальныйИдентификатор, @@ -723,7 +734,7 @@ ПараметрыДействия = Новый Структура; ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр); - ПараметрыДействия.Вставить("Форма", ЭтаФорма); + ПараметрыДействия.Вставить("Форма", ЭтотОбъект); ПараметрыДействия.Вставить("КоллекцияРолей", ПользовательИнфБазыРоли); ПараметрыДействия.Вставить("ТипПользователей", Перечисления.ТипыПользователей.ВнешнийПользователь); ПараметрыДействия.Вставить("СкрытьРольПолныеПрава", Истина); diff --git a/SSL/src/Catalogs/ВнешниеПользователи/Help/ru.html b/SSL/src/Catalogs/ВнешниеПользователи/Help/ru.html index b7d189410..873d50838 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/Help/ru.html +++ b/SSL/src/Catalogs/ВнешниеПользователи/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

      diff --git a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl index ca0981afe..801a25ee9 100644 --- a/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/ВнешниеПользователи/ManagerModule.bsl @@ -1,5 +1,27 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяИБ"); + НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяСервиса"); + НеРедактируемыеРеквизиты.Добавить("Недействителен"); + НеРедактируемыеРеквизиты.Добавить("ОбъектАвторизации"); + НеРедактируемыеРеквизиты.Добавить("УдалитьПароль"); + НеРедактируемыеРеквизиты.Добавить("УстановитьРолиНепосредственно"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -21,7 +43,7 @@ НайденныйВнешнийПользователь = Неопределено; ЕстьПравоДобавленияВнешнегоПользователя = Ложь; - ОбъектАвторизацииИспользуется = ПользователиСлужебный.ОбъектАвторизацииИспользуется( + ОбъектАвторизацииИспользуется = ПользователиСлужебныйВызовСервера.ОбъектАвторизацииИспользуется( Параметры.ОбъектАвторизации, , НайденныйВнешнийПользователь, @@ -45,5 +67,3 @@ КонецЕсли; КонецПроцедуры - -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo index 8a3ce2282..3b1339612 100644 --- a/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ВстречаПрисоединенныеФайлы/ВстречаПрисоединенныеФайлы.mdo @@ -288,7 +288,7 @@ Use - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП @@ -298,7 +298,7 @@ ru - Флажок, означающий что файл подписан с помощью ЭП + Признак того, что файл подписан с помощью ЭП @@ -502,10 +502,10 @@ - ЭлектронныеЦифровыеПодписи + ЭлектронныеПодписи ru - Электронные подписи + электронные подписи ru diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 4cff6a4d9..7f23a616f 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -69,8 +69,8 @@ Список.Комментарий - КомментарийРасширеннаяПодсказка - 20 + КомментарийExtendedTooltip + 10 Label true true @@ -107,10 +107,10 @@ СписокСтрокаПоиска - 9 + 11 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 13 Label true true @@ -120,7 +120,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 12 true Список @@ -130,10 +130,10 @@ СписокСостояниеПросмотра - 12 + 14 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 16 Label true true @@ -143,7 +143,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 15 true ViewStatusAddition @@ -154,10 +154,10 @@ СписокУправлениеПоиском - 15 + 17 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 19 Label true true @@ -167,7 +167,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 18 true SearchControlAddition @@ -177,7 +177,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl index 8ce442e58..94f6c5c57 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаСписка/Module.bsl @@ -48,12 +48,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form index 0d991be6c..8377e4579 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 153 Label true @@ -74,8 +74,8 @@ СоставУчастниковПриИзменении - УчастникиГруппыРасширеннаяПодсказка - 158 + УчастникиГруппыExtendedTooltip + 157 Label true true @@ -157,8 +157,8 @@ ПредставлениеТипаОбъектовАвторизацииПриИзменении - ПредставлениеТипаОбъектовАвторизацииРасширеннаяПодсказка - 160 + ПредставлениеТипаОбъектовАвторизацииExtendedTooltip + 158 Label true true @@ -201,8 +201,8 @@ Тип пользователей - ТипПользователейРасширеннаяПодсказка - 157 + ТипПользователейExtendedTooltip + 156 Label true true @@ -226,9 +226,6 @@ ru Внешние пользователи - - System.DefaultGUIFont - true true @@ -252,8 +249,8 @@ Объект.Состав.ВнешнийПользователь - СоставВнешнийПользовательРасширеннаяПодсказка - 184 + СоставВнешнийПользовательExtendedTooltip + 172 Label true true @@ -296,8 +293,8 @@ Объект.Состав.Недействителен - НедействителенРасширеннаяПодсказка - 186 + НедействителенExtendedTooltip + 173 Label true true @@ -330,8 +327,8 @@ false - СоставПодобратьРасширеннаяПодсказка - 166 + СоставПодобратьExtendedTooltip + 163 Label true true @@ -357,8 +354,8 @@ false - СоставДобавитьРасширеннаяПодсказка - 167 + СоставДобавитьExtendedTooltip + 164 Label true true @@ -384,8 +381,8 @@ false - СоставСкопироватьРасширеннаяПодсказка - 168 + СоставСкопироватьExtendedTooltip + 165 Label true true @@ -411,8 +408,8 @@ false - СоставУдалитьРасширеннаяПодсказка - 169 + СоставУдалитьExtendedTooltip + 166 Label true true @@ -438,8 +435,8 @@ false - СоставПереместитьВверхРасширеннаяПодсказка - 170 + СоставПереместитьВверхExtendedTooltip + 167 Label true true @@ -465,8 +462,8 @@ false - СоставПереместитьВнизРасширеннаяПодсказка - 171 + СоставПереместитьВнизExtendedTooltip + 168 Label true true @@ -492,8 +489,8 @@ false - СортироватьПоВозрастаниюРасширеннаяПодсказка - 172 + СортироватьПоВозрастаниюExtendedTooltip + 169 Label true true @@ -520,8 +517,8 @@ false - СортироватьПоУбываниюРасширеннаяПодсказка - 173 + СортироватьПоУбываниюExtendedTooltip + 170 Label true true @@ -550,10 +547,10 @@ СоставСтрокаПоиска - 175 + 189 СоставСтрокаПоискаРасширеннаяПодсказка - 177 + 191 Label true true @@ -563,7 +560,7 @@ СоставСтрокаПоискаКонтекстноеМеню - 176 + 190 true Состав @@ -573,10 +570,10 @@ СоставСостояниеПросмотра - 178 + 192 СоставСостояниеПросмотраРасширеннаяПодсказка - 180 + 194 Label true true @@ -586,7 +583,7 @@ СоставСостояниеПросмотраКонтекстноеМеню - 179 + 193 true ViewStatusAddition @@ -597,10 +594,10 @@ СоставУправлениеПоиском - 181 + 195 СоставУправлениеПоискомРасширеннаяПодсказка - 183 + 197 Label true true @@ -610,7 +607,7 @@ СоставУправлениеПоискомКонтекстноеМеню - 182 + 196 true SearchControlAddition @@ -620,8 +617,8 @@ - СоставРасширеннаяПодсказка - 174 + СоставExtendedTooltip + 171 Label true true @@ -642,8 +639,8 @@ false - КонтекстноеМенюСоставПодобратьРасширеннаяПодсказка - 162 + КонтекстноеМенюСоставПодобратьExtendedTooltip + 159 Label true true @@ -669,8 +666,8 @@ false - КонтекстноеМенюСоставДобавитьРасширеннаяПодсказка - 163 + КонтекстноеМенюСоставДобавитьExtendedTooltip + 160 Label true true @@ -696,8 +693,8 @@ false - КонтекстноеМенюСоставСкопироватьРасширеннаяПодсказка - 164 + КонтекстноеМенюСоставСкопироватьExtendedTooltip + 161 Label true true @@ -723,8 +720,8 @@ false - КонтекстноеМенюСоставУдалитьРасширеннаяПодсказка - 165 + КонтекстноеМенюСоставУдалитьExtendedTooltip + 162 Label true true @@ -784,8 +781,8 @@ Участники группы - ВнешниеПользователиГруппыРасширеннаяПодсказка - 156 + ВнешниеПользователиГруппыExtendedTooltip + 155 Label true true @@ -850,8 +847,8 @@ РолиПометкаПриИзменении - РолиПометкаРасширеннаяПодсказка - 213 + РолиПометкаExtendedTooltip + 182 Label true true @@ -881,8 +878,8 @@ Роли.Синоним - РолиСинонимРасширеннаяПодсказка - 215 + РолиСинонимExtendedTooltip + 183 Label true true @@ -925,8 +922,8 @@ Роли колонок - РолиКолонокРасширеннаяПодсказка - 212 + РолиКолонокExtendedTooltip + 181 Label true true @@ -954,8 +951,8 @@ false - РолиУстановитьФлажкиРасширеннаяПодсказка - 198 + РолиУстановитьФлажкиExtendedTooltip + 176 Label true true @@ -981,8 +978,8 @@ false - РолиСнятьФлажкиРасширеннаяПодсказка - 199 + РолиСнятьФлажкиExtendedTooltip + 177 Label true true @@ -1008,8 +1005,8 @@ false - РолиПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка - 200 + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 178 Label true true @@ -1034,8 +1031,8 @@ true - РолиПоказатьПодсистемыРолейРасширеннаяПодсказка - 201 + РолиПоказатьПодсистемыРолейExtendedTooltip + 179 Label true true @@ -1055,10 +1052,10 @@ РолиСтрокаПоиска - 203 + 208 РолиСтрокаПоискаРасширеннаяПодсказка - 205 + 210 Label true true @@ -1068,7 +1065,7 @@ РолиСтрокаПоискаКонтекстноеМеню - 204 + 209 true Роли @@ -1078,10 +1075,10 @@ РолиСостояниеПросмотра - 206 + 211 РолиСостояниеПросмотраРасширеннаяПодсказка - 208 + 213 Label true true @@ -1091,7 +1088,7 @@ РолиСостояниеПросмотраКонтекстноеМеню - 207 + 212 true ViewStatusAddition @@ -1102,10 +1099,10 @@ РолиУправлениеПоиском - 209 + 214 РолиУправлениеПоискомРасширеннаяПодсказка - 211 + 216 Label true true @@ -1115,7 +1112,7 @@ РолиУправлениеПоискомКонтекстноеМеню - 210 + 215 true SearchControlAddition @@ -1125,8 +1122,8 @@ - РолиРасширеннаяПодсказка - 202 + РолиExtendedTooltip + 180 Label true true @@ -1179,8 +1176,8 @@ 48 - ОтображениеРолейРасширеннаяПодсказка - 197 + ОтображениеРолейExtendedTooltip + 175 Label true true @@ -1212,8 +1209,8 @@ Роли группы - РолиГруппыРасширеннаяПодсказка - 196 + РолиГруппыExtendedTooltip + 174 Label true true @@ -1241,8 +1238,8 @@ Состав и роли - СоставИРолиРасширеннаяПодсказка - 155 + СоставИРолиExtendedTooltip + 154 Label true true @@ -1276,8 +1273,8 @@ РодительПриИзменении - РодительРасширеннаяПодсказка - 225 + РодительExtendedTooltip + 184 Label true true @@ -1322,8 +1319,8 @@ Left - КомментарийРасширеннаяПодсказка - 227 + КомментарийExtendedTooltip + 185 Label true true @@ -1371,7 +1368,7 @@ true - ПоказыватьНедействительныхПользователейРасширеннаяПодсказка + ПоказыватьНедействительныхПользователейExtendedTooltip 152 Label true diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html index 7e1d32686..c05c31be2 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

      Карточка группы внешних пользователей позволяет просматривать и редактировать свойства группы.

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

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

      diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl index 2e26d0e4f..094b6270e 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Forms/ФормаЭлемента/Module.bsl @@ -83,7 +83,7 @@ ПользователиСлужебный.ЗапретРедактированияРолей() ИЛИ ДействияВФорме.Роли <> "Редактирование"); - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); ЗаполнитьСтатусПользователей(); ОбновитьСписокНедействительныхПользователей(Истина); @@ -190,7 +190,7 @@ Объект.ТипОбъектовАвторизации = Неопределено; КонецЕсли; - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -204,7 +204,7 @@ Объект.ТипОбъектовАвторизации = Неопределено; КонецЕсли; - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -213,20 +213,12 @@ СтандартнаяОбработка = Ложь; - ВыбранныйЭлемент = ВыбратьИзСписка( + ПоказатьВыборИзСписка( + Новый ОписаниеОповещения("ПредставлениеТипаОбъектовАвторизацииЗавершениеВыбора", ЭтотОбъект), ТипыОбъектовАвторизации, Элемент, ТипыОбъектовАвторизации.НайтиПоЗначению(Объект.ТипОбъектовАвторизации)); - Если ВыбранныйЭлемент <> Неопределено Тогда - - Модифицированность = Истина; - Объект.ТипОбъектовАвторизации = ВыбранныйЭлемент.Значение; - ПредставлениеТипаОбъектовАвторизации = ВыбранныйЭлемент.Представление; - - ПредставлениеТипаОбъектовАвторизацииПриИзменении(Элемент); - КонецЕсли; - КонецПроцедуры &НаКлиенте @@ -235,7 +227,7 @@ Объект.ВсеОбъектыАвторизации = Ложь; ОтобратьДоступныеДляВыбораТипыУчастниковГруппы(); - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -254,7 +246,8 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария( + Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); КонецПроцедуры @@ -335,7 +328,7 @@ Процедура ПоказатьТолькоВыбранныеРоли(Команда) ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -343,7 +336,7 @@ Процедура ГруппировкаРолейПоПодсистемам(Команда) ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -352,7 +345,7 @@ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма, Ложь); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь); КонецПроцедуры @@ -366,6 +359,20 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ПредставлениеТипаОбъектовАвторизацииЗавершениеВыбора(ВыбранныйЭлемент, Неопределен) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + + Модифицированность = Истина; + Объект.ТипОбъектовАвторизации = ВыбранныйЭлемент.Значение; + ПредставлениеТипаОбъектовАвторизации = ВыбранныйЭлемент.Представление; + + ПредставлениеТипаОбъектовАвторизацииПриИзменении(Элементы.ПредставлениеТипаОбъектовАвторизации); + КонецЕсли; + +КонецПроцедуры + &НаСервере Функция ПеремещениеПользователяВГруппу(МассивПользователей, НоваяГруппаВладелец) @@ -663,7 +670,7 @@ ПараметрыДействия = Новый Структура; ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр); - ПараметрыДействия.Вставить("Форма", ЭтаФорма); + ПараметрыДействия.Вставить("Форма", ЭтотОбъект); ПараметрыДействия.Вставить("КоллекцияРолей", КоллекцияРолей); ПараметрыДействия.Вставить("ТипПользователей", Перечисления.ТипыПользователей.ВнешнийПользователь); ПараметрыДействия.Вставить("СкрытьРольПолныеПрава", Истина); diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html index 43e256735..ec744cbaf 100644 --- a/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/Help/ru.html @@ -1,4 +1,4 @@ - +

      В этом списке ведется учет групп внешних пользователей.

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

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

      diff --git a/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl new file mode 100644 index 000000000..bda4e2bd5 --- /dev/null +++ b/SSL/src/Catalogs/ГруппыВнешнихПользователей/ManagerModule.bsl @@ -0,0 +1,20 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("ТипОбъектовАвторизации"); + НеРедактируемыеРеквизиты.Добавить("ВсеОбъектыАвторизации"); + НеРедактируемыеРеквизиты.Добавить("Роли.УдалитьРоль"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form index df934dddf..53fcfcc5c 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ВыборПоОтветственному/Form.form @@ -42,8 +42,8 @@ true - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -78,10 +78,10 @@ ГруппыДоступаСтрокаПоиска - 9 + 10 ГруппыДоступаСтрокаПоискаРасширеннаяПодсказка - 11 + 12 Label true true @@ -91,7 +91,7 @@ ГруппыДоступаСтрокаПоискаКонтекстноеМеню - 10 + 11 true ГруппыДоступа @@ -101,10 +101,10 @@ ГруппыДоступаСостояниеПросмотра - 12 + 13 ГруппыДоступаСостояниеПросмотраРасширеннаяПодсказка - 14 + 15 Label true true @@ -114,7 +114,7 @@ ГруппыДоступаСостояниеПросмотраКонтекстноеМеню - 13 + 14 true ViewStatusAddition @@ -125,10 +125,10 @@ ГруппыДоступаУправлениеПоиском - 15 + 16 ГруппыДоступаУправлениеПоискомРасширеннаяПодсказка - 17 + 18 Label true true @@ -138,7 +138,7 @@ ГруппыДоступаУправлениеПоискомКонтекстноеМеню - 16 + 17 true SearchControlAddition @@ -148,7 +148,7 @@ - ГруппыДоступаРасширеннаяПодсказка + ГруппыДоступаExtendedTooltip 8 Label true @@ -204,7 +204,7 @@ true - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 7 Label true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form deleted file mode 100644 index d7f42bb1f..000000000 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Form.form +++ /dev/null @@ -1,232 +0,0 @@ - - - - ПрекращениеОбработки - 3 - - <key>ru</key> - <value>Выполняется обновление данных для ограничения доступа... -Для остановки нажмите Ctrl+Break, выполненые шаги не будут потеряны</value> - - true - true - - true - - - ПрекращениеОбработкиРасширеннаяПодсказка - 10 - Label - true - true - - Left - - - - ПрекращениеОбработкиКонтекстноеМеню - 4 - true - - Label - true - true - - Left - - - - Выполнение - 5 - - ВыполненоШаговОбновления - 1 - true - true - - true - - - ВыполненоШаговОбновления - - - ВыполненоШаговОбновленияРасширеннаяПодсказка - 12 - Label - true - true - - Left - - - - ВыполненоШаговОбновленияКонтекстноеМеню - 2 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ВыполнениеЗавершено - 6 - - <key>ru</key> - <value>Выполнение завершено</value> - - true - - true - - - ВыполнениеЗавершеноРасширеннаяПодсказка - 14 - Label - true - true - - Left - - - - ВыполнениеЗавершеноКонтекстноеМеню - 7 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Выполнение</value> - - - ВыполнениеРасширеннаяПодсказка - 11 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - ФормаЗакрыть - 8 - true - true - - true - - - ФормаЗакрытьРасширеннаяПодсказка - 9 - Label - true - true - - Left - - - Form.StandardCommand.Close - true - true - true - UserCmds - Auto - - Right - true - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - Abort - Cancel - CustomizeForm - Help - Ignore - No - OK - RestoreValues - Retry - SaveValues - Yes - LockOwner - true - true - true - Vertical - true - true - true - UseIfNecessary - auto - true - - ВыполненоШаговОбновления - - <key>ru</key> - <value>Выполнено шагов обновления</value> - - 1 - - Number - - 10 - true - - - - true - - - true - - - - - - - diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl deleted file mode 100644 index cea459467..000000000 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ОбновлениеДанныхОграниченияДоступа/Module.bsl +++ /dev/null @@ -1,66 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда - Отказ = Истина; - КонецЕсли; - - ВыполнитьПроверкуПравДоступа("АдминистрированиеДанных", Метаданные); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - ПодключитьОбработчикОжидания("ВыполнитьОбновление", 0.1, Истина); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаКлиенте -Процедура ВыполнитьОбновление() - - Пока ОбновлениеТребуется() Цикл - ОбработкаПрерыванияПользователя(); - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Функция ОбновлениеТребуется() - - УстановитьПривилегированныйРежим(Истина); - - КоличествоДанных = 0; - УправлениеДоступомСлужебный.ЗаполнениеДанныхДляОграниченияДоступа(КоличествоДанных); - Если КоличествоДанных > 0 Тогда - ВыполненоШаговОбновления = 1; - КонецЕсли; - Начало = ТекущаяДатаСеанса(); - - МетаданныеЗадания = Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа; - - Пока РегламентныеЗадания.НайтиПредопределенное(МетаданныеЗадания).Использование - И Начало + 15 > ТекущаяДатаСеанса() Цикл - - ВыполненоШаговОбновления = ВыполненоШаговОбновления + 1; - УправлениеДоступомСлужебный.ЗаполнениеДанныхДляОграниченияДоступа(); - - КонецЦикла; - - ОбновлениеТребуется = РегламентныеЗадания.НайтиПредопределенное(МетаданныеЗадания).Использование; - Элементы.ВыполнениеЗавершено.Видимость = НЕ ОбновлениеТребуется; - - Возврат ОбновлениеТребуется; - -КонецФункции - diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index ff6c39986..2427aef24 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаВыбораГруппы/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -59,10 +59,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -72,7 +72,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -82,10 +82,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -95,7 +95,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -106,10 +106,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -119,7 +119,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -129,7 +129,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Form.form index 7463d7201..e6504c3e1 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаГруппы/Form.form @@ -16,7 +16,7 @@ Наименование группы (папки) - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 5 Label true @@ -65,8 +65,8 @@ Вышестоящая группа (папка), объединяющая группы (папки) для удобства поиска - РодительРасширеннаяПодсказка - 7 + РодительExtendedTooltip + 6 Label true true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index c879f4d3a..b98fd4b69 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Form.form @@ -30,8 +30,8 @@ true - НаименованиеРасширеннаяПодсказка - 42 + НаименованиеExtendedTooltip + 33 Label true true @@ -70,8 +70,8 @@ Список.Профиль - ПрофильРасширеннаяПодсказка - 44 + ПрофильExtendedTooltip + 34 Label true true @@ -110,8 +110,8 @@ Список.Ответственный - ОтветственныйРасширеннаяПодсказка - 46 + ОтветственныйExtendedTooltip + 35 Label true true @@ -164,10 +164,10 @@ СписокСтрокаПоиска - 33 + 37 СписокСтрокаПоискаРасширеннаяПодсказка - 35 + 39 Label true true @@ -177,7 +177,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 34 + 38 true Список @@ -187,10 +187,10 @@ СписокСостояниеПросмотра - 36 + 40 СписокСостояниеПросмотраРасширеннаяПодсказка - 38 + 42 Label true true @@ -200,7 +200,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 37 + 41 true ViewStatusAddition @@ -211,10 +211,10 @@ СписокУправлениеПоиском - 39 + 43 СписокУправлениеПоискомРасширеннаяПодсказка - 41 + 45 Label true true @@ -224,7 +224,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 40 + 44 true SearchControlAddition @@ -234,7 +234,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 32 Label true @@ -255,7 +255,7 @@ true - СписокКонтекстноеМенюСоздатьРасширеннаяПодсказка + СписокКонтекстноеМенюСоздатьExtendedTooltip 28 Label true @@ -281,7 +281,7 @@ true - СписокКонтекстноеМенюСоздатьГруппуРасширеннаяПодсказка + СписокКонтекстноеМенюСоздатьГруппуExtendedTooltip 29 Label true @@ -307,7 +307,7 @@ true - СписокКонтекстноеМенюСкопироватьРасширеннаяПодсказка + СписокКонтекстноеМенюСкопироватьExtendedTooltip 30 Label true @@ -341,7 +341,7 @@ Контекстное меню списка - КонтекстноеМенюСпискаРасширеннаяПодсказка + КонтекстноеМенюСпискаExtendedTooltip 31 Label true @@ -406,8 +406,8 @@ Left - ОписаниеРасширеннаяПодсказка - 56 + ОписаниеExtendedTooltip + 36 Label true true @@ -444,7 +444,7 @@ true - ФормаВыбратьРасширеннаяПодсказка + ФормаВыбратьExtendedTooltip 22 Label true @@ -470,7 +470,7 @@ true - ФормаСоздатьРасширеннаяПодсказка + ФормаСоздатьExtendedTooltip 23 Label true @@ -496,7 +496,7 @@ true - ФормаСоздатьГруппуРасширеннаяПодсказка + ФормаСоздатьГруппуExtendedTooltip 24 Label true @@ -522,7 +522,7 @@ true - ФормаСкопироватьРасширеннаяПодсказка + ФормаСкопироватьExtendedTooltip 25 Label true @@ -556,7 +556,7 @@ Командная панель формы - КоманднаяПанельФормыРасширеннаяПодсказка + КоманднаяПанельФормыExtendedTooltip 26 Label true @@ -578,7 +578,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 27 Label true diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html index 917676659..f17e84d61 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Help/ru.html @@ -1,4 +1,4 @@ - +

      Назначение групп доступа см. здесь.

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

      Для удобства сделана возможность отоборажения профиля группы.

      diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl index e74b2c4fd..84479dda3 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаСписка/Module.bsl @@ -16,7 +16,7 @@ РодительПерсональныхГруппДоступа = Справочники.ГруппыДоступа.РодительПерсональныхГруппДоступа(Истина); - УпрощенныйИнтерфейсНастройкиПравДоступа = УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа(); + УпрощенныйИнтерфейсНастройкиПравДоступа = УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа(); Если УпрощенныйИнтерфейсНастройкиПравДоступа Тогда Элементы.ФормаСоздать.Видимость = Ложь; @@ -96,7 +96,9 @@ &НаКлиенте Процедура СписокПриАктивизацииСтроки(Элемент) - Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда + Если Элементы.Список.ТекущиеДанные <> Неопределено + И Элементы.Список.ТекущиеДанные.Свойство("Пользователь") + И Элементы.Список.ТекущиеДанные.Свойство("Ссылка") Тогда ПереносДопустим = НЕ ЗначениеЗаполнено(Элементы.Список.ТекущиеДанные.Пользователь) И Элементы.Список.ТекущиеДанные.Ссылка <> РодительПерсональныхГруппДоступа; @@ -121,7 +123,7 @@ Если Значение = РодительПерсональныхГруппДоступа Тогда СтандартнаяОбработка = Ложь; - Предупреждение(НСтр("ru = 'Эта группа только для персональных групп доступа.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Эта группа только для персональных групп доступа.'")); КонецЕсли; КонецПроцедуры @@ -131,24 +133,27 @@ Если Родитель = РодительПерсональныхГруппДоступа Тогда + Отказ = Истина; + Если Группа Тогда - Предупреждение(НСтр("ru = 'В этой группе не используются подгруппы.'")); + ПоказатьПредупреждение(, НСтр("ru = 'В этой группе не используются подгруппы.'")); ИначеЕсли УпрощенныйИнтерфейсНастройкиПравДоступа Тогда - Предупреждение(НСтр("ru = 'Персональные группы доступа - |создаются только в форме ""Права доступа"".'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Персональные группы доступа + |создаются только в форме ""Права доступа"".'")); Иначе - Предупреждение(НСтр("ru = 'Персональные группы доступа не используются.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Персональные группы доступа не используются.'")); КонецЕсли; - Отказ = Истина; - ИначеЕсли НЕ Группа И УпрощенныйИнтерфейсНастройкиПравДоступа Тогда - Предупреждение(НСтр("ru = 'Используются только персональные группы доступа, - |которые создаются только в форме ""Права доступа"".'")); Отказ = Истина; + + ПоказатьПредупреждение(, + НСтр("ru = 'Используются только персональные группы доступа, + |которые создаются только в форме ""Права доступа"".'")); КонецЕсли; КонецПроцедуры @@ -158,11 +163,11 @@ Если Строка = РодительПерсональныхГруппДоступа Тогда СтандартнаяОбработка = Ложь; - Предупреждение(НСтр("ru = 'Эта папка только для персональных групп доступа.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Эта папка только для персональных групп доступа.'")); ИначеЕсли ПараметрыПеретаскивания.Значение = РодительПерсональныхГруппДоступа Тогда СтандартнаяОбработка = Ложь; - Предупреждение(НСтр("ru = 'Папка персональных групп доступа не переносится.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Папка персональных групп доступа не переносится.'")); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form index 38f03db32..899ead2fd 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 336 Label true @@ -52,8 +52,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 338 + РодительExtendedTooltip + 337 Label true true @@ -97,8 +97,8 @@ ПрофильПриИзменении - ПрофильРасширеннаяПодсказка - 340 + ПрофильExtendedTooltip + 338 Label true true @@ -143,8 +143,8 @@ - тип внешних пользователей - ПредставлениеТипаПользователейРасширеннаяПодсказка - 342 + ПредставлениеТипаПользователейExtendedTooltip + 339 Label true true @@ -195,8 +195,8 @@ Объект.Пользователь - ПользовательВладелецРасширеннаяПодсказка - 345 + ПользовательВладелецExtendedTooltip + 341 Label true true @@ -244,8 +244,8 @@ Right - ИспользованиеПерсональногоДоступаРасширеннаяПодсказка - 347 + ИспользованиеПерсональногоДоступаExtendedTooltip + 342 Label true true @@ -275,8 +275,8 @@ Свойства персональной группы - СвойстваПерсональнойГруппыРасширеннаяПодсказка - 344 + СвойстваПерсональнойГруппыExtendedTooltip + 340 Label true true @@ -335,8 +335,8 @@ ПользовательПриИзменении - ПользовательРасширеннаяПодсказка - 375 + ПользовательExtendedTooltip + 360 Label true true @@ -393,8 +393,8 @@ false - ПользователиПодобратьРасширеннаяПодсказка - 358 + ПользователиПодобратьExtendedTooltip + 352 Label true true @@ -421,8 +421,8 @@ false - ПользователиДобавитьРасширеннаяПодсказка - 359 + ПользователиДобавитьExtendedTooltip + 353 Label true true @@ -449,8 +449,8 @@ false - ПользователиУдалитьРасширеннаяПодсказка - 360 + ПользователиУдалитьExtendedTooltip + 354 Label true true @@ -477,8 +477,8 @@ false - ПользователиПереместитьВверхРасширеннаяПодсказка - 361 + ПользователиПереместитьВверхExtendedTooltip + 355 Label true true @@ -505,8 +505,8 @@ false - ПользователиПереместитьВнизРасширеннаяПодсказка - 362 + ПользователиПереместитьВнизExtendedTooltip + 356 Label true true @@ -533,8 +533,8 @@ false - ПользователиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 363 + ПользователиСортироватьСписокПоВозрастаниюExtendedTooltip + 357 Label true true @@ -561,8 +561,8 @@ false - ПользователиСортироватьСписокПоУбываниюРасширеннаяПодсказка - 364 + ПользователиСортироватьСписокПоУбываниюExtendedTooltip + 358 Label true true @@ -615,10 +615,10 @@ ПользователиСтрокаПоиска - 366 + 409 ПользователиСтрокаПоискаРасширеннаяПодсказка - 368 + 411 Label true true @@ -628,7 +628,7 @@ ПользователиСтрокаПоискаКонтекстноеМеню - 367 + 410 true Пользователи @@ -638,10 +638,10 @@ ПользователиСостояниеПросмотра - 369 + 412 ПользователиСостояниеПросмотраРасширеннаяПодсказка - 371 + 414 Label true true @@ -651,7 +651,7 @@ ПользователиСостояниеПросмотраКонтекстноеМеню - 370 + 413 true ViewStatusAddition @@ -662,10 +662,10 @@ ПользователиУправлениеПоиском - 372 + 415 ПользователиУправлениеПоискомРасширеннаяПодсказка - 374 + 417 Label true true @@ -675,7 +675,7 @@ ПользователиУправлениеПоискомКонтекстноеМеню - 373 + 416 true SearchControlAddition @@ -685,8 +685,8 @@ - ПользователиРасширеннаяПодсказка - 365 + ПользователиExtendedTooltip + 359 Label true true @@ -707,8 +707,8 @@ false - КонтекстноеМенюПользователиПодобратьРасширеннаяПодсказка - 351 + КонтекстноеМенюПользователиПодобратьExtendedTooltip + 345 Label true true @@ -734,8 +734,8 @@ false - КонтекстноеМенюПользователиДобавитьРасширеннаяПодсказка - 352 + КонтекстноеМенюПользователиДобавитьExtendedTooltip + 346 Label true true @@ -761,8 +761,8 @@ false - КонтекстноеМенюПользователиУдалитьРасширеннаяПодсказка - 353 + КонтекстноеМенюПользователиУдалитьExtendedTooltip + 347 Label true true @@ -790,8 +790,8 @@ true - ПользователиКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 355 + ПользователиКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 349 Label true true @@ -816,8 +816,8 @@ true - ПользователиКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 356 + ПользователиКонтекстноеМенюВыделитьВсеExtendedTooltip + 350 Label true true @@ -842,8 +842,8 @@ true - ПользователиКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 357 + ПользователиКонтекстноеМенюВывестиСписокExtendedTooltip + 351 Label true true @@ -869,8 +869,8 @@ Пользователи группа кнопок контекстного меню - ПользователиГруппаКнопокКонтекстногоМенюРасширеннаяПодсказка - 354 + ПользователиГруппаКнопокКонтекстногоМенюExtendedTooltip + 348 Label true true @@ -925,8 +925,8 @@ Объект.Ответственный - ОтветственныйРасширеннаяПодсказка - 385 + ОтветственныйExtendedTooltip + 361 Label true true @@ -977,8 +977,8 @@ 25 - ПользователиГруппыРасширеннаяПодсказка - 350 + ПользователиГруппыExtendedTooltip + 344 Label true true @@ -1022,7 +1022,7 @@ SortListAsc SortListDesc - ВидыДоступаВидДоступа + ВидыДоступаВидДоступаПредставление 191 true true @@ -1030,15 +1030,15 @@ true - Объект.ВидыДоступа.ВидДоступа + Объект.ВидыДоступа.ВидДоступаПредставление ru Вид доступа изменяется только в профиле - ВидыДоступаВидДоступаРасширеннаяПодсказка - 405 + ВидыДоступаВидДоступаПредставлениеРасширеннаяПодсказка + 371 Label true true @@ -1047,7 +1047,7 @@ - ВидыДоступаВидДоступаКонтекстноеМеню + ВидыДоступаВидДоступаПредставлениеКонтекстноеМеню 192 true @@ -1060,6 +1060,7 @@ true true + true true true true @@ -1067,19 +1068,15 @@ - ВидыДоступаИспользование + ВидыДоступаВсеРазрешеныПредставление 193 - - <key>ru</key> - <value>Значения доступа</value> - true true true - Объект.ВидыДоступа.Использование + Объект.ВидыДоступа.ВсеРазрешеныПредставление ru @@ -1087,11 +1084,11 @@ OnChange - ВидыДоступаИспользованиеПриИзменении + ВидыДоступаВсеРазрешеныПредставлениеПриИзменении - ВидыДоступаИспользованиеРасширеннаяПодсказка - 407 + ВидыДоступаВсеРазрешеныПредставлениеРасширеннаяПодсказка + 372 Label true true @@ -1100,7 +1097,7 @@ - ВидыДоступаИспользованиеКонтекстноеМеню + ВидыДоступаВсеРазрешеныПредставлениеКонтекстноеМеню 194 true @@ -1110,42 +1107,18 @@ Left true - - StartChoice - ВидыДоступаИспользованиеНачалоВыбора - - - Clearing - ВидыДоступаИспользованиеОчистка - ChoiceProcessing - ВидыДоступаИспользованиеОбработкаВыбора + ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора 30 true true true + true true true - - - ru - Все запрещены - - - ВсеЗапрещены - - - - - ru - Все разрешены - - - ВсеРазрешены - - + true Normal @@ -1162,8 +1135,8 @@ false - ВидыДоступаИзменитьРасширеннаяПодсказка - 393 + ВидыДоступаИзменитьExtendedTooltip + 368 Label true true @@ -1190,8 +1163,8 @@ false - ВидыДоступаЗакончитьРедактированиеРасширеннаяПодсказка - 394 + ВидыДоступаЗакончитьРедактированиеExtendedTooltip + 369 Label true true @@ -1222,16 +1195,20 @@ OnActivateRow ВидыДоступаПриАктивизацииСтроки + + OnStartEdit + ВидыДоступаПриНачалеРедактирования + OnActivateCell ВидыДоступаПриАктивизацииЯчейки ВидыДоступаСтрокаПоиска - 396 + 428 ВидыДоступаСтрокаПоискаРасширеннаяПодсказка - 398 + 430 Label true true @@ -1241,7 +1218,7 @@ ВидыДоступаСтрокаПоискаКонтекстноеМеню - 397 + 429 true ВидыДоступа @@ -1251,10 +1228,10 @@ ВидыДоступаСостояниеПросмотра - 399 + 431 ВидыДоступаСостояниеПросмотраРасширеннаяПодсказка - 401 + 433 Label true true @@ -1264,7 +1241,7 @@ ВидыДоступаСостояниеПросмотраКонтекстноеМеню - 400 + 432 true ViewStatusAddition @@ -1275,10 +1252,10 @@ ВидыДоступаУправлениеПоиском - 402 + 434 ВидыДоступаУправлениеПоискомРасширеннаяПодсказка - 404 + 436 Label true true @@ -1288,7 +1265,7 @@ ВидыДоступаУправлениеПоискомКонтекстноеМеню - 403 + 435 true SearchControlAddition @@ -1298,8 +1275,8 @@ - ВидыДоступаРасширеннаяПодсказка - 395 + ВидыДоступаExtendedTooltip + 370 Label true true @@ -1319,8 +1296,8 @@ true - ВидыДоступаКонтекстноеМенюИзменитьРасширеннаяПодсказка - 388 + ВидыДоступаКонтекстноеМенюИзменитьExtendedTooltip + 363 Label true true @@ -1345,8 +1322,8 @@ true - ВидыДоступаКонтекстноеМенюЗакончитьРедактированиеРасширеннаяПодсказка - 389 + ВидыДоступаКонтекстноеМенюЗакончитьРедактированиеExtendedTooltip + 364 Label true true @@ -1374,8 +1351,8 @@ true - ВидыДоступаКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 391 + ВидыДоступаКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 366 Label true true @@ -1400,8 +1377,8 @@ true - ВидыДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 392 + ВидыДоступаКонтекстноеМенюВывестиСписокExtendedTooltip + 367 Label true true @@ -1427,8 +1404,8 @@ Виды доступа группа кнопок контекстного меню - ВидыДоступаГруппаКнопокКонтекстногоМенюРасширеннаяПодсказка - 390 + ВидыДоступаГруппаКнопокКонтекстногоМенюExtendedTooltip + 365 Label true true @@ -1468,25 +1445,114 @@ ЗначенияДоступаПоВидуДоступа 268 - - ГоризонтальнаяГруппа - 285 + + НадписьВидДоступа + 121 + true + true + + true + + + НадписьВидДоступа + + None + Ctrl+S + + НадписьВидДоступаExtendedTooltip + 375 + Label + true + true + + Left + + + + НадписьВидДоступаКонтекстноеМеню + 122 + true + + LabelField + Enter + true + Left + true + + true + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ТекстВидДоступаНеИспользуется + 321 + + <key>ru</key> + <value>В данный момент не используется, т.к. эта возможность отключена в программе.</value> + + true + + true + + + ТекстВидДоступаНеИспользуетсяExtendedTooltip + 377 + Label + true + true + + Left + + + + ТекстВидДоступаНеИспользуетсяКонтекстноеМеню + 322 + true + + Label + true + true + + Left + + + + ЗначенияДоступа + 66 + true + true + + true + + + Объект.ЗначенияДоступа + + false + None + Copy + EndEdit - НадписьВидДоступа - 121 + ЗначенияДоступаНомерСтрокиПоВиду + 308 true true true - НадписьВидДоступа + Объект.ЗначенияДоступа.НомерСтрокиПоВиду - None - Ctrl+S - НадписьВидДоступаРасширеннаяПодсказка - 419 + ЗначенияДоступаНомерСтрокиПоВидуРасширеннаяПодсказка + 393 Label true true @@ -1495,74 +1561,35 @@ - НадписьВидДоступаКонтекстноеМеню - 122 + ЗначенияДоступаНомерСтрокиПоВидуКонтекстноеМеню + 309 true LabelField - Enter + Auto true Left true + 3 true true - true - - System.DefaultGUIFont - true - false - false - false - - true - true - - true - - - <key>ru</key> - <value>Горизонтальная группа</value> - - - ГоризонтальнаяГруппаРасширеннаяПодсказка - 418 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ВидДоступаНеИспользуется - 320 - - ТекстВидДоступаНеИспользуется - 321 - - <key>ru</key> - <value>В данный момент не используется, т.к. эта возможность отключена в программе.</value> - + + ЗначенияДоступаЗначениеДоступа + 312 true true true + + Объект.ЗначенияДоступа.ЗначениеДоступа + - ТекстВидДоступаНеИспользуетсяРасширеннаяПодсказка - 422 + ЗначенияДоступаЗначениеДоступаРасширеннаяПодсказка + 394 Label true true @@ -1571,695 +1598,60 @@ - ТекстВидДоступаНеИспользуетсяКонтекстноеМеню - 322 + ЗначенияДоступаЗначениеДоступаКонтекстноеМеню + 313 true - Label - true - true - - Left - - - true - - true - - - <key>ru</key> - <value>Вид доступа не используется</value> - - - ВидДоступаНеИспользуетсяРасширеннаяПодсказка - 421 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ТипыВидовДоступа - 168 - - ОбычныйВидДоступа - 264 - - ЗначенияДоступа - 66 - true - true - - true - - - Объект.ЗначенияДоступа - - false - None - Copy - EndEdit - - НомерСтрокиПоВиду - 308 - true - true - - true - - - Объект.ЗначенияДоступа.НомерСтрокиПоВиду - - - НомерСтрокиПоВидуРасширеннаяПодсказка - 447 - Label - true - true - - Left - - - - НомерСтрокиПоВидуКонтекстноеМеню - 309 - true - - LabelField - Auto - true - Left - true - - 3 - true - true - - - - ЗначениеДоступа - 312 - true - true - - true - - - Объект.ЗначенияДоступа.ЗначениеДоступа - - - ЗначениеДоступаРасширеннаяПодсказка - 449 - Label - true - true - - Left - - - - ЗначениеДоступаКонтекстноеМеню - 313 - true - - InputField - Auto - true - Left - true - - - AutoComplete - ЗначениеДоступаАвтоПодбор - - - StartChoice - ЗначениеДоступаНачалоВыбора - - - Clearing - ЗначениеДоступаОчистка - - - TextEditEnd - ЗначениеДоступаОкончаниеВводаТекста - - - ChoiceProcessing - ЗначениеДоступаОбработкаВыбора - - true - true - true - true - true - true - Normal - - - - ЗначенияДоступаКоманднаяПанель - 68 - - ЗначенияДоступаДобавить - 246 - true - true - - true - - false - - ЗначенияДоступаДобавитьРасширеннаяПодсказка - 431 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Add - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаУдалить - 249 - true - true - - true - - false - - ЗначенияДоступаУдалитьРасширеннаяПодсказка - 432 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Delete - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаПереместитьВверх - 252 - true - true - - true - - false - - ЗначенияДоступаПереместитьВверхРасширеннаяПодсказка - 433 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.MoveUp - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаПереместитьВниз - 253 - true - true - - true - - false - - ЗначенияДоступаПереместитьВнизРасширеннаяПодсказка - 434 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.MoveDown - Normal - Auto - true - true - UserCmds - Auto - - - СортироватьСписокПоВозрастанию - 254 - true - true - - true - - false - - СортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 435 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СортироватьСписокПоУбыванию - 255 - true - true - - true - - false - - СортироватьСписокПоУбываниюРасширеннаяПодсказка - 436 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - Left - + InputField + Auto + true + Left + true + - OnEditEnd - ЗначенияДоступаПриОкончанииРедактирования + AutoComplete + ЗначениеДоступаАвтоПодбор + + + StartChoice + ЗначениеДоступаНачалоВыбора + + + Clearing + ЗначениеДоступаОчистка + + + TextEditEnd + ЗначениеДоступаОкончаниеВводаТекста ChoiceProcessing ЗначениеДоступаОбработкаВыбора - - OnStartEdit - ЗначенияДоступаПриНачалеРедактирования - - - OnChange - ЗначенияДоступаПриИзменении - - - ЗначенияДоступаСтрокаПоиска - 438 - - ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка - 440 - Label - true - true - - Left - - - - ЗначенияДоступаСтрокаПоискаКонтекстноеМеню - 439 - true - - ЗначенияДоступа - - true - - - - ЗначенияДоступаСостояниеПросмотра - 441 - - ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка - 443 - Label - true - true - - Left - - - - ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню - 442 - true - - ViewStatusAddition - ЗначенияДоступа - - true - - - - ЗначенияДоступаУправлениеПоиском - 444 - - ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка - 446 - Label - true - true - - Left - - - - ЗначенияДоступаУправлениеПоискомКонтекстноеМеню - 445 - true - - SearchControlAddition - ЗначенияДоступа - - true - - - - ЗначенияДоступаРасширеннаяПодсказка - 437 - Label - true - true - - Left - - - - ЗначенияДоступаКонтекстноеМеню - 67 - - КонтекстноеМенюЗначенияДоступаДобавить - 256 - true - true - - true - - false - - КонтекстноеМенюЗначенияДоступаДобавитьРасширеннаяПодсказка - 425 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Add - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюЗначенияДоступаУдалить - 258 - true - true - - true - - false - - КонтекстноеМенюЗначенияДоступаУдалитьРасширеннаяПодсказка - 426 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Delete - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаГруппаКнопокКонтекстногоМеню - 332 - - ЗначенияДоступаКонтекстноеМенюКопироватьВБуферОбмена - 329 - true - true - - true - - - ЗначенияДоступаКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 428 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.CopyToClipboard - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаКонтекстноеМенюВыделитьВсе - 330 - true - true - - true - - - ЗначенияДоступаКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 429 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.SelectAll - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаКонтекстноеМенюВывестиСписок - 328 - true - true - - true - - - ЗначенияДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 430 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Значения доступа группа кнопок контекстного меню</value> - - - ЗначенияДоступаГруппаКнопокКонтекстногоМенюРасширеннаяПодсказка - 427 - Label - true - true - - Left - - - - - - true - true true true - true - MultiRow - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - None - None - None - true - - - true - true - - true - - - <key>ru</key> - <value>Обычный вид доступа</value> - - - ru - Обычный вид доступа - - - ОбычныйВидДоступаРасширеннаяПодсказка - 424 - Label - true - true - - Left - - - Page - - Vertical - auto + true + true + true + true + Normal - - ВидДоступаЧерезПраваПоЗначениямДоступаИнформация - 265 - - Информация - 269 - - ТекстИнформации - 266 - - <key>ru</key> - <value>Для настройки используется команда "Права доступа" в форме значения. - </value> - - true - true - - true - - - ТекстИнформацииРасширеннаяПодсказка - 461 - Label - true - true - - Left - - - - ТекстИнформацииКонтекстноеМеню - 267 - true - - Label - true - true - false - - Left - - + + ЗначенияДоступаКоманднаяПанель + 68 + + ЗначенияДоступаДобавить + 246 true true true + false - ИнформацияРасширеннаяПодсказка - 460 + ЗначенияДоступаДобавитьExtendedTooltip + 386 Label true true @@ -2267,86 +1659,26 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - ВидДоступаЧерезПраваПоЗначениямДоступаИнформацияРасширеннаяПодсказка - 459 - Label + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto true true - - Left - - - Page - - Vertical - - - - ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждение - 307 - - Предупреждение - 270 - - ТекстПредупреждения - 273 - - <key>ru</key> - <value>Когда задано "Все разрешены" хотя бы в одной группе доступа, -для участников группы все права разрешены -независимо от настройки прав по значениям.</value> - - true - true - - true - - - ТекстПредупрежденияРасширеннаяПодсказка - 464 - Label - true - true - - Left - - - - ТекстПредупрежденияКонтекстноеМеню - 274 - true - - Label - true - true - false - - Left - - + UserCmds + Auto + + + ЗначенияДоступаУдалить + 249 true true true + false - ПредупреждениеРасширеннаяПодсказка - 463 + ЗначенияДоступаУдалитьExtendedTooltip + 387 Label true true @@ -2354,23 +1686,148 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto - true - true - - true - + + ЗначенияДоступаПереместитьВверх + 252 + true + true + + true + + false + + ЗначенияДоступаПереместитьВверхExtendedTooltip + 388 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаПереместитьВниз + 253 + true + true + + true + + false + + ЗначенияДоступаПереместитьВнизExtendedTooltip + 389 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьСписокПоВозрастанию + 254 + true + true + + true + + false + + СортироватьСписокПоВозрастаниюExtendedTooltip + 390 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьСписокПоУбыванию + 255 + true + true + + true + + false + + СортироватьСписокПоУбываниюExtendedTooltip + 391 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnEditEnd + ЗначенияДоступаПриОкончанииРедактирования + + + ChoiceProcessing + ЗначениеДоступаОбработкаВыбора + + + OnStartEdit + ЗначенияДоступаПриНачалеРедактирования + + + OnChange + ЗначенияДоступаПриИзменении + + + ЗначенияДоступаСтрокаПоиска + 448 - ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждениеРасширеннаяПодсказка - 462 + ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка + 450 Label true true @@ -2378,23 +1835,67 @@ Left - Page - - Vertical + + ЗначенияДоступаСтрокаПоискаКонтекстноеМеню + 449 + true + + ЗначенияДоступа + + true - - true - true - - true - - - <key>ru</key> - <value>Типы видов доступа</value> - + + + ЗначенияДоступаСостояниеПросмотра + 451 + + ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка + 453 + Label + true + true + + Left + + + + ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню + 452 + true + + ViewStatusAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаУправлениеПоиском + 454 + + ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка + 456 + Label + true + true + + Left + + + + ЗначенияДоступаУправлениеПоискомКонтекстноеМеню + 455 + true + + SearchControlAddition + ЗначенияДоступа + + true + + - ТипыВидовДоступаРасширеннаяПодсказка - 423 + ЗначенияДоступаExtendedTooltip + 392 Label true true @@ -2402,10 +1903,191 @@ Left - Pages - - Auto - + + ЗначенияДоступаКонтекстноеМеню + 67 + + КонтекстноеМенюЗначенияДоступаДобавить + 256 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаДобавитьExtendedTooltip + 380 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюЗначенияДоступаУдалить + 258 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаУдалитьExtendedTooltip + 381 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаГруппаКнопокКонтекстногоМеню + 332 + + ЗначенияДоступаКонтекстноеМенюКопироватьВБуферОбмена + 329 + true + true + + true + + + ЗначенияДоступаКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 383 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаКонтекстноеМенюВыделитьВсе + 330 + true + true + + true + + + ЗначенияДоступаКонтекстноеМенюВыделитьВсеExtendedTooltip + 384 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SelectAll + Normal + Auto + true + true + UserCmds + Auto + + + ЗначенияДоступаКонтекстноеМенюВывестиСписок + 328 + true + true + + true + + + ЗначенияДоступаКонтекстноеМенюВывестиСписокExtendedTooltip + 385 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Значения доступа группа кнопок контекстного меню</value> + + + ЗначенияДоступаГруппаКнопокКонтекстногоМенюExtendedTooltip + 382 + Label + true + true + + Left + + + + + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + true true @@ -2421,8 +2103,8 @@ Значения доступа по виду доступа - ЗначенияДоступаПоВидуДоступаРасширеннаяПодсказка - 417 + ЗначенияДоступаПоВидуДоступаExtendedTooltip + 373 Label true true @@ -2461,8 +2143,8 @@ Доступ - ДоступРасширеннаяПодсказка - 387 + ДоступExtendedTooltip + 362 Label true true @@ -2490,8 +2172,8 @@ Пользователи и доступ - ПользователиИДоступРасширеннаяПодсказка - 349 + ПользователиИДоступExtendedTooltip + 343 Label true true @@ -2521,8 +2203,8 @@ Пользователь, которой может изменять использование персональной группы доступа. - ОтветственныйЗаПерсональнуюГруппуРасширеннаяПодсказка - 465 + ОтветственныйЗаПерсональнуюГруппуExtendedTooltip + 401 Label true true @@ -2564,8 +2246,8 @@ Left - ОписаниеРасширеннаяПодсказка - 467 + ОписаниеExtendedTooltip + 402 Label true true @@ -2609,7 +2291,7 @@ true - ПоказыватьНеиспользуемыеВидыДоступаРасширеннаяПодсказка + ПоказыватьНеиспользуемыеВидыДоступаExtendedTooltip 335 Label true @@ -2630,10 +2312,6 @@ Left true - - ChoiceProcessing - ОбработкаВыбора - OnOpen ПриОткрытии @@ -2701,29 +2379,12 @@ Объект.ВидыДоступа - ТекущийТипЗначенияДоступа + ВидДоступаПредставление <key>ru</key> - <value>Текущий тип значения доступа</value> + <value>Вид доступа</value> - 2 - - AnyRef - - - true - - - true - - - - Использование - - <key>ru</key> - <value>Использование</value> - - 3 + 4 String @@ -2736,14 +2397,15 @@ - ИспользуетсяВПрограмме + ВсеРазрешеныПредставление <key>ru</key> - <value>Используется в программе</value> + <value>Значения доступа</value> - 1 + 5 - Boolean + String + true @@ -2780,23 +2442,6 @@
      - - ТекущийВидДоступа - - <key>ru</key> - <value>Текущий вид доступа</value> - - 10 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - ИзменилсяСоставВидовДоступаПриЧтении @@ -2814,26 +2459,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ВидыДоступаЧерезПраваПоЗначениямДоступа</name> - <title> - <key>ru</key> - <value>Виды доступа через права по значениям доступа</value> - - 4 - - ValueList - - - true - - - true - - - - - НадписьВидДоступа @@ -2853,23 +2478,6 @@ </edit> <functionalOptions>FunctionalOption.ОграничиватьДоступНаУровнеЗаписей</functionalOptions> </attributes> - <attributes> - <name>ИспользоватьВнешнихПользователей</name> - <title> - <key>ru</key> - <value>Использовать внешних пользователей</value> - - 14 - - Boolean - - - true - - - true - - СписокТиповПользователей @@ -2929,112 +2537,6 @@ <itemValueType/> </extInfo> </attributes> - <attributes> - <name>ТекущиеТипыЗначенийДоступа</name> - <title> - <key>ru</key> - <value>Текущие типы значений доступа</value> - - 22 - - ValueList - - - true - - - true - - - - - - - ТекущийТипЗначенияДоступа - - <key>ru</key> - <value>Текущий тип значения доступа</value> - - 23 - - AnyRef - - - true - - - true - - - - ТипыЗначенийДоступаВидовДоступа - - <key>ru</key> - <value>Типы значений доступа видов доступа</value> - - 17 - - ValueTable - - - true - - - true - - - ВидДоступа - - <key>ru</key> - <value>Вид доступа</value> - - 1 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - ТипЗначенияДоступа - - <key>ru</key> - <value>Тип значения доступа</value> - - 2 - - AnyRef - - - true - - - true - - - - ПредставлениеТипа - - <key>ru</key> - <value>Представление типа</value> - - 3 - - String - - - - true - - - true - - - ИспользованиеПерсональногоДоступа @@ -3181,6 +2683,58 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ИспользоватьВнешнихПользователей</name> + <title> + <key>ru</key> + <value>Использовать внешних пользователей</value> + + 4 + + Boolean + + + true + + + true + + + + ВыполненаПроцедураПриСозданииНаСервере + + <key>ru</key> + <value>Выполнена процедура при создании на сервере</value> + + 6 + + Boolean + + + true + + + true + + + + ОтветНаВопросПриОткрытииФормы + + <key>ru</key> + <value>Ответ на вопрос при открытии формы</value> + + 8 + + String + + + + true + + + true + + Подобрать diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html index 824629032..552c348b6 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p><a href="Catalog.ГруппыДоступа/Help">Назначение групп доступа см. здесь.</a></p> <p>Для группы доступа задается профиль, список участников и ограничения доступа.</p> <p>Профиль определит права (списком ролей) и возможности ограничения прав по "разрезам" (видам доступа), например, ограничения по видам Организации, Склады, ...<br>Виды доступа из профиля будут добавлены в группу доступа автоматически.</p> diff --git a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl index 7c4f5cc37..7debdea0e 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/Forms/ФормаЭлемента/Module.bsl @@ -8,60 +8,17 @@ Возврат; КонецЕсли; - Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда - НачальнаяНастройкаПриЧтенииИСоздании(Объект); - КонецЕсли; + // Подготовка вспомогательных данных. + УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений(ЭтотОбъект); - // Заполнение вспомогательных данных. - - // Заполнение списка видов доступа через права по значениям доступа. - Отбор = Новый Структура("ВидДоступаЧерезПраваПоЗначениямДоступа", Истина); - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа().НайтиСтроки(Отбор) Цикл - - ВидДоступаПредставлениеОбъекта = Неопределено; - Если СвойстваВидаДоступа.Таблицы.Количество() = 1 Тогда - МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(СвойстваВидаДоступа.Таблицы[0]); - ВидДоступаПредставлениеОбъекта = МетаданныеОбъект.ПредставлениеОбъекта; - КонецЕсли; - - ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа, ВидДоступаПредставлениеОбъекта); - КонецЦикла; - - // Заполнение типов значений доступа всех видов доступа. - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл - Для каждого Тип Из СвойстваВидаДоступа.ВидДоступа.ТипЗначения.Типы() Цикл - МассивТипов = Новый Массив; - МассивТипов.Добавить(Тип); - ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); - - МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); - Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда - ПредставлениеТипа = МетаданныеТипа.Представление(); - Иначе - ПредставлениеТипа = ?(ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), - МетаданныеТипа.ПредставлениеОбъекта, - МетаданныеТипа.Представление()); - КонецЕсли; - - НоваяСтрока = ТипыЗначенийДоступаВидовДоступа.Добавить(); - НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.ВидДоступа; - НоваяСтрока.ТипЗначенияДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); - НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; - КонецЦикла; - КонецЦикла; - - ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + НачальнаяНастройкаПриЧтенииИСоздании(Объект); СправочникВнешниеПользователиДоступен = ПравоДоступа( "Просмотр", Метаданные.Справочники.ВнешниеПользователи); - СписокТиповПользователей.Добавить( - Тип("СправочникСсылка.Пользователи"), - "Пользователи"); + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.Пользователи"), "Пользователи"); - СписокТиповПользователей.Добавить( - Тип("СправочникСсылка.ВнешниеПользователи"), - "ВнешниеПользователи"); + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.ВнешниеПользователи"), "ВнешниеПользователи"); // Заполнение списка выбора типа пользователей. ЗаполнитьСписокТиповПользователей(); @@ -90,70 +47,37 @@ КонецЕсли; КонецЕсли; - ОбновитьНеИспользуемыеВидыДоступа(Истина); + ВыполненаПроцедураПриСозданииНаСервере = Истина; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") - И Объект.Профиль <> ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + Если ОтветНаВопросПриОткрытииФормы = "УстановитьТолькоПросмотр" Тогда + ОтветНаВопросПриОткрытииФормы = ""; + ТолькоПросмотр = Истина; + КонецЕсли; + + Если ОтветНаВопросПриОткрытииФормы = "УстановитьПрофильАдминистратор" Тогда + ОтветНаВопросПриОткрытииФормы = Неопределено; + Объект.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор"); + Модифицированность = Истина; - Ответ = Вопрос( + ИначеЕсли Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") + И Объект.Профиль <> ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + + Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПриОткрытииПослеПодтвержденияУстановкиПрофиляАдминистратор", ЭтотОбъект), НСтр("ru = 'У группы доступа Администраторы должен быть профиль Администратор. | |Установить профиль в группе доступа (нет - открыть только для просмотра)?'"), РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - Объект.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор"); - Модифицированность = Истина; - Иначе - ТолькоПросмотр = Истина; - КонецЕсли; - КонецЕсли; - - Если НЕ ТолькоПросмотр - И ИзменилсяСоставВидовДоступаПриЧтении Тогда - - Ответ = Вопрос( - НСтр("ru = 'Изменился состав видов доступа профиля этой группы доступа. - | - |Обновить виды доступа в группе доступа (нет - открыть только для просмотра)?'"), - РежимДиалогаВопрос.ДаНет, - , - КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - ОбновитьСоставВидовДоступа(); - Иначе - ТолькоПросмотр = Истина; - КонецЕсли; - КонецЕсли; - - Если НЕ ТолькоПросмотр - И НЕ ЗначениеЗаполнено(Объект.Ссылка) - И ТипЗнч(ВладелецФормы) = Тип("ТаблицаФормы") - И ВладелецФормы.Родитель.Параметры.Свойство("Профиль") Тогда - - Если ЗначениеЗаполнено(ВладелецФормы.Родитель.Параметры.Профиль) Тогда - Объект.Профиль = ВладелецФормы.Родитель.Параметры.Профиль; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АутентификацияВСервисе") - И ВыбранноеЗначение <> Неопределено Тогда - - ПарольПользователяСервиса = ВыбранноеЗначение; - Записать(); + Иначе + ПриОткрытииПродолжение(Отказ); КонецЕсли; КонецПроцедуры @@ -165,6 +89,12 @@ Возврат; КонецЕсли; + Если НЕ ВыполненаПроцедураПриСозданииНаСервере Тогда + Возврат; + КонецЕсли; + + УправлениеДоступомСлужебный.ПриПовторномЧтенииНаСервереФормыРедактированияРазрешенныхЗначений(ЭтотОбъект, ТекущийОбъект); + НачальнаяНастройкаПриЧтенииИСоздании(ТекущийОбъект); КонецПроцедуры @@ -173,16 +103,15 @@ Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено - И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + И Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") + И ПарольПользователяСервиса = Неопределено Тогда - ПарольЕщеНеВведен = Ложь; + Отказ = Истина; СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); - - Если ПарольЕщеНеВведен Тогда - Отказ = Истина; - Возврат; - КонецЕсли; + Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект, ПараметрыЗаписи), + ЭтотОбъект, + ПарольПользователяСервиса); + Возврат; КонецЕсли; КонецПроцедуры @@ -227,8 +156,6 @@ &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) - ЗаполнитьСвойстваВидовДоступаВФорме(); - УстановитьПривилегированныйРежим(Истина); ПрофильПомеченНаУдаление = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( @@ -240,6 +167,9 @@ ПараметрыЗаписи.Вставить("ПредупредитьЧтоПрофильПомеченНаУдаление"); КонецЕсли; + УправлениеДоступомСлужебный.ПослеЗаписиНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); + КонецПроцедуры &НаКлиенте @@ -249,8 +179,9 @@ Если ПараметрыЗаписи.Свойство("ПредупредитьЧтоПрофильПомеченНаУдаление") Тогда - Предупреждение(НСтр("ru = 'Группа доступа не влияет на права участников - |так как ее профиль помечен на удаление.'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Группа доступа не влияет на права участников + |так как ее профиль помечен на удаление.'")); КонецЕсли; КонецПроцедуры @@ -433,64 +364,15 @@ КонецЕсли; // Проверка незаполненных и повторяющихся значений доступа. - ПроверенныеРеквизитыОбъекта.Добавить("ВидыДоступа.ВидДоступа"); - ПроверенныеРеквизитыОбъекта.Добавить("ЗначенияДоступа.ВидДоступа"); - ПроверенныеРеквизитыОбъекта.Добавить("ЗначенияДоступа.ЗначениеДоступа"); - + ПропуститьПроверкуВидовИЗначений = Ложь; Если КоличествоОшибок <> ?(Ошибки = Неопределено, 0, Ошибки.Количество()) Тогда + ПропуститьПроверкуВидовИЗначений = Истина; Элементы.ПользователиИДоступ.ТекущаяСтраница = Элементы.ПользователиГруппы; - Иначе - НомерСтрокиВидаДоступа = Объект.ВидыДоступа.Количество()-1; - - Пока НЕ Отказ И НомерСтрокиВидаДоступа >= 0 Цикл - ТекущаяСтрокаВидаДоступа = Объект.ВидыДоступа.Получить(НомерСтрокиВидаДоступа); - - ЗначенияДоступаВидаДоступа = Объект.ЗначенияДоступа.НайтиСтроки( - Новый Структура("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа)); - НомерСтроки = ЗначенияДоступаВидаДоступа.Количество()-1; - - Пока НомерСтроки >= 0 Цикл - - ТекущаяСтрока = ЗначенияДоступаВидаДоступа.Получить(НомерСтроки); - - // Проверка заполнения значения. - Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ЗначениеДоступа) Тогда - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение не выбрано.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 не выбрано.'")); - Отказ = Истина; - Прервать; - КонецЕсли; - - // Проверка наличия повторяющихся значений. - Отбор = Новый Структура; - Отбор.Вставить("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа); - Отбор.Вставить("ЗначениеДоступа", ТекущаяСтрока.ЗначениеДоступа); - НайденныеЗначения = Объект.ЗначенияДоступа.НайтиСтроки(Отбор); - - Если НайденныеЗначения.Количество() > 1 Тогда - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение повторяется.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 повторяется.'")); - Отказ = Истина; - Прервать; - КонецЕсли; - - НомерСтроки = НомерСтроки - 1; - КонецЦикла; - - НомерСтрокиВидаДоступа = НомерСтрокиВидаДоступа - 1; - КонецЦикла; КонецЕсли; + УправлениеДоступомСлужебныйКлиентСервер.ОбработкаПроверкиЗаполненияНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, Отказ, ПроверенныеРеквизитыОбъекта, Ошибки, ПропуститьПроверкуВидовИЗначений); + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Объект")); @@ -520,23 +402,12 @@ СтандартнаяОбработка = Ложь; - ВыбранныйЭлемент = ВыбратьИзСписка( + ПоказатьВыборИзСписка( + Новый ОписаниеОповещения("ПредставлениеТипаПользователейНачалоВыбораЗавершение", ЭтотОбъект), ТипыПользователей, Элемент, ТипыПользователей.НайтиПоЗначению(Объект.ТипПользователей)); - Если ВыбранныйЭлемент <> Неопределено - И Объект.ТипПользователей <> ВыбранныйЭлемент.Значение Тогда - - Модифицированность = Истина; - Объект.ТипПользователей = ВыбранныйЭлемент.Значение; - ПредставлениеТипаПользователей = ВыбранныйЭлемент.Представление; - - Если Объект.ТипПользователей <> Неопределено Тогда - УдалитьНеТипичныхПользователей(); - КонецЕсли; - КонецЕсли; - КонецПроцедуры &НаКлиенте @@ -609,16 +480,15 @@ Если ТипЗнч(СтрокаРодителя.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") Тогда - Предупреждение( + ПоказатьПредупреждение(, НСтр("ru = 'Пользователи групп отображаются для сведения, |что они получают доступ групп пользователей. |Их нельзя удалить в этом списке.'")); Иначе - Предупреждение( + ПоказатьПредупреждение(, НСтр("ru = 'Внешние пользователи групп отображаются для сведения, |что они получают доступ групп внешних пользователей. |Их нельзя удалить в этом списке.'")); - КонецЕсли; КонецЕсли; @@ -750,9 +620,11 @@ Если ЗначениеЗаполнено(Текст) Тогда СтандартнаяОбработка = Ложь; Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст, Ложь, Ложь); + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( + Текст, Ложь, Ложь); Иначе - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( + Текст); КонецЕсли; КонецЕсли; @@ -764,9 +636,11 @@ Если ЗначениеЗаполнено(Текст) Тогда СтандартнаяОбработка = Ложь; Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст, Ложь, Ложь); + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( + Текст, Ложь, Ложь); Иначе - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( + Текст); КонецЕсли; КонецЕсли; @@ -787,59 +661,51 @@ &НаКлиенте Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриАктивизацииСтроки( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ВидыДоступаПриАктивизацииЯчейки(Элемент) - Если Элементы.ВидыДоступа.ТекущийЭлемент <> Элементы.ВидыДоступаИспользование Тогда - Элементы.ВидыДоступа.ТекущийЭлемент = Элементы.ВидыДоступаИспользование; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриАктивизацииЯчейки( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); КонецПроцедуры &НаКлиенте Процедура ВидыДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий элемента ВсеРазрешеныПредставление таблицы формы ВидыДоступа &НаКлиенте -Процедура ВидыДоступаИспользованиеПриИзменении(Элемент) +Процедура ВидыДоступаВсеРазрешеныПредставлениеПриИзменении(Элемент) - Элементы.ВидыДоступа.ЗакончитьРедактированиеСтроки(Ложь); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеПриИзменении( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте -Процедура ВидыДоступаИспользованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) +Процедура ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - - ДанныеВыбора = Элемент.СписокВыбора; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен = (ВыбранноеЗначение = "ВсеРазрешены"); - - Модифицированность = Истина; - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); КонецПроцедуры @@ -849,193 +715,65 @@ &НаКлиенте Процедура ЗначенияДоступаПриИзменении(Элемент) - Если Элемент.ТекущиеДанные <> Неопределено - И НЕ ЗначениеЗаполнено(Элемент.ТекущиеДанные.ВидДоступа) Тогда - - Элемент.ТекущиеДанные.ВидДоступа = ТекущийВидДоступа; - - Отбор = Новый Структура("ВидДоступа", ТекущийВидДоступа); - - Элемент.ТекущиеДанные.НомерСтрокиПоВиду = - Объект.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - КонецЕсли; - - ОбновитьНомерСтрокиПоВиду(ЭтаФорма, Элементы.ВидыДоступа.ТекущиеДанные); - ОбновитьПредставлениеИспользованияВидаДоступа(ЭтаФорма, Элементы.ВидыДоступа.ТекущиеДанные); + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриИзменении( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда - Элемент.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - Если НЕ ВыбранТипЗначенияДоступа(ТекущиеТипыЗначенийДоступа) Тогда - СтандартнаяОбработка = Ложь; - Возврат; - КонецЕсли; - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) - И ТекущиеДанные.ЗначениеДоступа <> ТекущийТипЗначенияДоступа Тогда - - ТекущиеДанные.ЗначениеДоступа = ТекущийТипЗначенияДоступа; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - - Если ТекущийТипЗначенияДоступа = - ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка") - - ИЛИ ТекущийТипЗначенияДоступа = - ПредопределенноеЗначение("Справочник.ГруппыПользователей.ПустаяСсылка") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ТекущийТипЗначенияДоступа = - ПредопределенноеЗначение("Справочник.ВнешниеПользователи.ПустаяСсылка") - - ИЛИ ТекущийТипЗначенияДоступа = - ПредопределенноеЗначение("Справочник.ГруппыВнешнихПользователей.ПустаяСсылка") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ТекущийТипЗначенияДоступа = Неопределено; - - Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - Элементы.ЗначениеДоступа.КнопкаОчистки = Ложь; + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); КонецПроцедуры &НаКлиенте Процедура ЗначенияДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) - Если ОтменаРедактирования Тогда - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаНачалоВыбора( + ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОчистка( + ЭтотОбъект, Элемент, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи") - - ИЛИ ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.Пользователи") Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи"), - - ТекущийВидДоступа <> - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.Пользователи")); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаАвтоПодбор( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи") - - ИЛИ ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.Пользователи") Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи"), - - ТекущийВидДоступа <> - ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыДоступа.Пользователи")); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОкончаниеВводаТекста( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка); КонецПроцедуры @@ -1053,13 +791,125 @@ &НаКлиенте Процедура ПоказыватьНеиспользуемыеВидыДоступа(Команда) - ОбновитьНеиспользуемыеВидыДоступа(Ложь); + ПоказыватьНеИспользуемыеВидыДоступаНаСервере(); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Продолжение обработчика события ПриОткрытии +&НаКлиенте +Процедура ПриОткрытииПослеПодтвержденияУстановкиПрофиляАдминистратор(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ОтветНаВопросПриОткрытииФормы = "УстановитьПрофильАдминистратор"; + Иначе + ОтветНаВопросПриОткрытииФормы = "УстановитьТолькоПросмотр"; + КонецЕсли; + + Открыть(); + +КонецПроцедуры + +// Продолжение обработчика события ПриОткрытии +&НаКлиенте +Процедура ПриОткрытииПродолжение(Отказ) Экспорт + + Если ОтветНаВопросПриОткрытииФормы = "ОбновитьСоставВидовДоступа" Тогда + ОтветНаВопросПриОткрытииФормы = ""; + ОбновитьСоставВидовДоступа(); + ИзменилсяСоставВидовДоступаПриЧтении = Ложь; + + ИначеЕсли НЕ ТолькоПросмотр И ИзменилсяСоставВидовДоступаПриЧтении Тогда + + Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПриОткрытииПослеПодтвержденияОбновленияВидовДоступа", ЭтотОбъект), + НСтр("ru = 'Изменился состав видов доступа профиля этой группы доступа. + | + |Обновить виды доступа в группе доступа (нет - открыть только для просмотра)?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Нет); + Иначе + ПриОткрытииЗавершение(); + КонецЕсли; + +КонецПроцедуры + +// Продолжение обработчика события ПриОткрытии +&НаКлиенте +Процедура ПриОткрытииПослеПодтвержденияОбновленияВидовДоступа(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ОтветНаВопросПриОткрытииФормы = "ОбновитьСоставВидовДоступа"; + Иначе + ОтветНаВопросПриОткрытииФормы = "УстановитьТолькоПросмотр"; + КонецЕсли; + + Открыть(); + +КонецПроцедуры + +// Продолжение обработчика события ПриОткрытии +&НаКлиенте +Процедура ПриОткрытииЗавершение() Экспорт + + Если НЕ ТолькоПросмотр + И НЕ ЗначениеЗаполнено(Объект.Ссылка) + И ТипЗнч(ВладелецФормы) = Тип("ТаблицаФормы") + И ВладелецФормы.Родитель.Параметры.Свойство("Профиль") Тогда + + Если ЗначениеЗаполнено(ВладелецФормы.Родитель.Параметры.Профиль) Тогда + Объект.Профиль = ВладелецФормы.Родитель.Параметры.Профиль; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение обработчика события ПередЗаписью +&НаКлиенте +Процедура ПередЗаписьюПродолжение(НовыйПарольПользователяСервиса, ПараметрыЗаписи) Экспорт + + Если НовыйПарольПользователяСервиса = Неопределено Тогда + Возврат; + КонецЕсли; + + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; + + Попытка + + Записать(ПараметрыЗаписи); + + Исключение + + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + + КонецПопытки; + +КонецПроцедуры + + +// Продолжение обработчика события ПредставлениеТипаПользователейНачалоВыбора +&НаКлиенте +Процедура ПредставлениеТипаПользователейНачалоВыбораЗавершение(ВыбранныйЭлемент, Неопределен) Экспорт + + Если ВыбранныйЭлемент <> Неопределено + И Объект.ТипПользователей <> ВыбранныйЭлемент.Значение Тогда + + Модифицированность = Истина; + Объект.ТипПользователей = ВыбранныйЭлемент.Значение; + ПредставлениеТипаПользователей = ВыбранныйЭлемент.Представление; + + Если Объект.ТипПользователей <> Неопределено Тогда + УдалитьНеТипичныхПользователей(); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура НачальнаяНастройкаПриЧтенииИСоздании(ТекущийОбъект) @@ -1077,8 +927,9 @@ + " " + НСтр("ru = '(Группа доступа)'"); - ИспользованиеПерсональногоДоступа = ТекущийОбъект.Пользователи.Найти( - ТекущийОбъект.Пользователь, "Пользователь") <> Неопределено; + Отбор = Новый Структура("Пользователь", ТекущийОбъект.Пользователь); + НайденныеСтроки = ТекущийОбъект.Пользователи.НайтиСтроки(Отбор); + ИспользованиеПерсональногоДоступа = НайденныеСтроки.Количество() > 0; Иначе АвтоЗаголовок = Истина; КонецЕсли; @@ -1110,7 +961,7 @@ И ТипЗнч(Объект.ТипПользователей) <> Тип("СправочникСсылка.Пользователи")); Элементы.ПользовательВладелец.ТолькоПросмотр - = УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа(); + = УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа(); // Подготовка к режиму редактирования пользователей ответственным за участников. Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда @@ -1148,26 +999,13 @@ КонецЦикла; ОбновитьПользователейГрупп(); - ЗаполнитьСвойстваВидовДоступаВФорме(); - КонецПроцедуры &НаСервере Процедура ПрофильПриИзмененииНаСервере() ОбновитьСоставВидовДоступа(); - ЗаполнитьСвойстваВидовДоступаВФорме(); - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСвойстваВидовДоступаВФорме() - - Для каждого Строка Из Объект.ВидыДоступа Цикл - Строка.ИспользуетсяВПрограмме = УправлениеДоступомСлужебный.ВидДоступаИспользуется(Строка.ВидДоступа); - ОбновитьПредставлениеИспользованияВидаДоступа(ЭтаФорма, Строка); - ОбновитьНомерСтрокиПоВиду(ЭтаФорма, Строка); - КонецЦикла; + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(ЭтотОбъект); КонецПроцедуры @@ -1227,10 +1065,9 @@ Пока Индекс >= 0 Цикл Если ТипЗнч(Объект.Пользователи[Индекс].Пользователь) - <> Тип("СправочникСсылка.Пользователи") - + <> Тип("СправочникСсылка.Пользователи") И ТипЗнч(Объект.Пользователи[Индекс].Пользователь) - <> Тип("СправочникСсылка.ГруппыПользователей") Тогда + <> Тип("СправочникСсылка.ГруппыПользователей") Тогда Объект.Пользователи.Удалить(Индекс); КонецЕсли; @@ -1242,10 +1079,9 @@ Пока Индекс >= 0 Цикл Если ТипЗнч(Объект.Пользователи[Индекс].Пользователь) - <> Тип("СправочникСсылка.ВнешниеПользователи") - + <> Тип("СправочникСсылка.ВнешниеПользователи") И ТипЗнч(Объект.Пользователи[Индекс].Пользователь) - <> Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + <> Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда Объект.Пользователи.Удалить(Индекс); КонецЕсли; @@ -1291,21 +1127,20 @@ КонецПроцедуры - &НаСервере Процедура ОбновитьСоставВидовДоступа(Знач ПриЧтенииНаСервере = Ложь) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ - | ПрофилиГруппДоступаВидыДоступа.ВидДоступа, - | ПрофилиГруппДоступаВидыДоступа.Предустановленный, - | ПрофилиГруппДоступаВидыДоступа.ДоступРазрешен + | ВидыДоступаПрофиля.ВидДоступа, + | ВидыДоступаПрофиля.Предустановленный, + | ВидыДоступаПрофиля.ВсеРазрешены |ИЗ - | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофиля |ГДЕ - | ПрофилиГруппДоступаВидыДоступа.Ссылка = &Ссылка - | И ПрофилиГруппДоступаВидыДоступа.ВидДоступа.Предопределенный"; + | ВидыДоступаПрофиля.Ссылка = &Ссылка + | И НЕ ВидыДоступаПрофиля.Предустановленный"; Запрос.УстановитьПараметр("Ссылка", Объект.Профиль); @@ -1316,42 +1151,41 @@ ИзменилсяСоставВидовДоступа = Ложь; // Добавление недостающих видов доступа. - Для каждого СтрокаТЧ Из ВидыДоступаПрофиля Цикл + Индекс = ВидыДоступаПрофиля.Количество() - 1; + Пока Индекс >= 0 Цикл + Строка = ВидыДоступаПрофиля[Индекс]; - Отбор = Новый Структура("ВидДоступа", СтрокаТЧ.ВидДоступа); - СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(СтрокаТЧ.ВидДоступа); + Отбор = Новый Структура("ВидДоступа", Строка.ВидДоступа); + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(Строка.ВидДоступа); - Если СвойстваВидаДоступа <> Неопределено - И НЕ СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда - И НЕ СтрокаТЧ.Предустановленный - И Объект.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда - + Если СвойстваВидаДоступа = Неопределено Тогда + ВидыДоступаПрофиля.Удалить(Строка); + + ИначеЕсли Объект.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда ИзменилсяСоставВидовДоступа = Истина; + Если ПриЧтенииНаСервере Тогда Прервать; Иначе НоваяСтрока = Объект.ВидыДоступа.Добавить(); - НоваяСтрока.ВидДоступа = СтрокаТЧ.ВидДоступа; - НоваяСтрока.ДоступРазрешен = СтрокаТЧ.ДоступРазрешен; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ВсеРазрешены = Строка.ВсеРазрешены; КонецЕсли; КонецЕсли; + Индекс = Индекс - 1; КонецЦикла; // Удаление лишних видов доступа. Индекс = Объект.ВидыДоступа.Количество() - 1; Пока Индекс >= 0 Цикл - - ТекущийВидДоступа1 = Объект.ВидыДоступа[Индекс].ВидДоступа; - Отбор = Новый Структура("ВидДоступа", ТекущийВидДоступа1); + ВидДоступа = Объект.ВидыДоступа[Индекс].ВидДоступа; + Отбор = Новый Структура("ВидДоступа", ВидДоступа); СвойстваВидаДоступаВПрофиле = ВидыДоступаПрофиля.НайтиСтроки(Отбор); - СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ТекущийВидДоступа1); + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ВидДоступа); Если СвойстваВидаДоступа = Неопределено - ИЛИ СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда - ИЛИ СвойстваВидаДоступаВПрофиле.Количество() > 0 - И СвойстваВидаДоступаВПрофиле[0].Предустановленный ИЛИ ВидыДоступаПрофиля.НайтиСтроки(Отбор).Количество() = 0 Тогда ИзменилсяСоставВидовДоступа = Истина; @@ -1368,8 +1202,7 @@ КонецЦикла; Модифицированность = Модифицированность - ИЛИ ИзменилсяСоставВидовДоступа - И НЕ ПриЧтенииНаСервере; + ИЛИ ИзменилсяСоставВидовДоступа И НЕ ПриЧтенииНаСервере; // Установка флажка для запроса у пользователя решения обновить состав видов доступа. Если ПриЧтенииНаСервере @@ -1385,13 +1218,6 @@ // Установка порядка видов доступа по профилю. Если НЕ ИзменилсяСоставВидовДоступаПриЧтении Тогда - Индекс = ВидыДоступаПрофиля.Количество()-1; - Пока Индекс >=0 Цикл - Если ВидыДоступаПрофиля[Индекс].Предустановленный Тогда - ВидыДоступаПрофиля.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; Для каждого СтрокаТЧ Из ВидыДоступаПрофиля Цикл Отбор = Новый Структура("ВидДоступа", СтрокаТЧ.ВидДоступа); Индекс = Объект.ВидыДоступа.Индекс(Объект.ВидыДоступа.НайтиСтроки(Отбор)[0]); @@ -1403,301 +1229,102 @@ ТекущийВидДоступа = Неопределено; КонецЕсли; -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ПриИзмененииТекущегоВидаДоступа(Знач Форма) - - Элементы = Форма.Элементы; - - ЗначенияЗадаются = Ложь; - - #Если Клиент Тогда - ТекущиеДанные = Элементы.ВидыДоступа.ТекущиеДанные; - #Иначе - ТекущиеДанные = Форма.Объект.ВидыДоступа.НайтиПоИдентификатору( - ?(Элементы.ВидыДоступа.ТекущаяСтрока = Неопределено, - -1, - Элементы.ВидыДоступа.ТекущаяСтрока)); - #КонецЕсли - - Если ТекущиеДанные <> Неопределено Тогда - Если ТекущиеДанные.ИспользуетсяВПрограмме Тогда - Если Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Ложь; - КонецЕсли; - Иначе - Если НЕ Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Истина; - КонецЕсли; - КонецЕсли; - - Форма.ТекущийВидДоступа = ТекущиеДанные.ВидДоступа; - НайденныйВидДоступа = Форма.ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - ТекущиеДанные.ВидДоступа); - - Если НайденныйВидДоступа = Неопределено Тогда - - ЗначенияЗадаются = Истина; - Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ОбычныйВидДоступа; - - // Установка отбора значений. - Если Элементы.ЗначенияДоступа.ОтборСтрок = Неопределено - ИЛИ Элементы.ЗначенияДоступа.ОтборСтрок.ВидДоступа - <> ТекущиеДанные.ВидДоступа Тогда - - Элементы.ЗначенияДоступа.ОтборСтрок = - Новый ФиксированнаяСтруктура("ВидДоступа", ТекущиеДанные.ВидДоступа); - КонецЕсли; - Иначе - - Если ТекущиеДанные.ДоступРазрешен - И НайденныйВидДоступа.Представление <> Неопределено Тогда - ТекстИнформации = - НСтр("ru = 'Права доступа настраиваются индивидуально для каждого объекта ""%1"" - |с помощью команды ""Права доступа"".'"); - Элементы.ТекстИнформации.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстИнформации, - НайденныйВидДоступа.Представление); - КонецЕсли; - - Элементы.ТипыВидовДоступа.ТекущаяСтраница = - ?(ТекущиеДанные.ДоступРазрешен, - Элементы.ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждение, - Элементы.ВидДоступаЧерезПраваПоЗначениямДоступаИнформация); - КонецЕсли; - - // Обновление поля НадписьВидДоступа. - Если ТекущиеДанные.ВидДоступа = ПредопределенноеЗначение( - "ПланВидовХарактеристик.ВидыДоступа.Пользователи") Тогда - - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1) - текущий пользователь всегда разрешен'"), - НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'") ); - - ИначеЕсли ТекущиеДанные.ВидДоступа = ПредопределенноеЗначение( - "ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи") Тогда - - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'"), - НСтр("ru = 'Разрешенные значения (%1) - текущий внешний пользователь всегда разрешен'") ); - Иначе - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1)'"), - НСтр("ru = 'Разрешенные значения (%1)'") ); - КонецЕсли; - - Форма.НадписьВидДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонНадписи, - Строка(ТекущиеДанные.ВидДоступа)); - - ОбновитьПредставлениеИспользованияВидаДоступа(Форма, ТекущиеДанные); - Иначе - Если Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Ложь; - КонецЕсли; - Форма.ТекущийВидДоступа = Неопределено; - - Элементы.ЗначенияДоступа.ОтборСтрок = - Новый ФиксированнаяСтруктура("ВидДоступа", Неопределено); - - Если Форма.Объект.ВидыДоступа.Количество() = 0 Тогда - Форма.Объект.ЗначенияДоступа.Очистить(); - КонецЕсли; - КонецЕсли; - - Форма.ТекущийТипЗначенияДоступа = - ?(ТекущиеДанные = Неопределено, - Неопределено, - ТекущиеДанные.ТекущийТипЗначенияДоступа); - - Форма.ТекущиеТипыЗначенийДоступа = Новый СписокЗначений; - - Если ЗначенияЗадаются Тогда - Отбор = Новый Структура("ВидДоступа", ТекущиеДанные.ВидДоступа); - ОписаниеТиповВидовДоступа = Форма.ТипыЗначенийДоступаВидовДоступа.НайтиСтроки(Отбор); - - Для каждого ОписаниеТипаВидаДоступа Из ОписаниеТиповВидовДоступа Цикл - - Форма.ТекущиеТипыЗначенийДоступа.Добавить( - ОписаниеТипаВидаДоступа.ТипЗначенияДоступа, - ОписаниеТипаВидаДоступа.ПредставлениеТипа); - КонецЦикла; - Иначе - Если ТекущиеДанные <> Неопределено Тогда - Отбор = Новый Структура("ВидДоступа", Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа); - - Для каждого Строка Из Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор) Цикл - Форма.Объект.ЗначенияДоступа.Удалить(Строка); - КонецЦикла - КонецЕсли; - КонецЕсли; - // - Если Форма.ТекущиеТипыЗначенийДоступа.Количество() = 0 Тогда - Форма.ТекущиеТипыЗначенийДоступа.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); - КонецЕсли; - - Элементы.ЗначенияДоступа.Доступность = ЗначенияЗадаются; - - Элементы.ЗначенияДоступа.КоманднаяПанель.ПодчиненныеЭлементы - .ЗначенияДоступаДобавить.Доступность = ЗначенияЗадаются; + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(ЭтотОбъект); КонецПроцедуры -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьПредставлениеИспользованияВидаДоступа(Форма, ОписаниеВидаДоступа) +&НаСервере +Процедура ПоказыватьНеИспользуемыеВидыДоступаНаСервере() - Отбор = Новый Структура("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - КоличествоЗначений = Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - - Если КоличествоЗначений > 0 Тогда - - ПрописьЧисла = ЧислоПрописью( - КоличествоЗначений, - "Л = ru_RU", - НСтр("ru = ',,,,,,,,0'")); - - ПрописьЧислаИПредмета = ЧислоПрописью( - КоличествоЗначений, - "Л = ru_RU", - НСтр("ru = '-го значения,-х значений,-и значений,,,,,,0'")); - - ЧислоИПредмет = СтрЗаменить( - ПрописьЧислаИПредмета, - ПрописьЧисла, - Формат(КоличествоЗначений, "ЧГ=")); - - ОписаниеВидаДоступа.Использование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, кроме %1'"), - НСтр("ru = 'Все запрещены, кроме %1'") ), - ЧислоИПредмет); - - ИначеЕсли Форма.ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - ОписаниеВидаДоступа.ВидДоступа) = Неопределено Тогда - - ОписаниеВидаДоступа.Использование = - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, без исключений'"), - НСтр("ru = 'Все запрещены, без исключений'") ); - Иначе - ОписаниеВидаДоступа.Использование = - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, без исключений'"), - НСтр("ru = 'Все запрещены, кроме исключений'") ); - КонецЕсли; + УправлениеДоступомСлужебный.ОбновитьОтображениеНеиспользуемыхВидовДоступа(ЭтотОбъект); КонецПроцедуры -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьНомерСтрокиПоВиду(Форма, ОписаниеВидаДоступа) - - Отбор = Новый Структура("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - ЗначенияДоступаПоВиду = Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор); - - ТекущийНомер = 1; - Для каждого Строка Из ЗначенияДоступаПоВиду Цикл - Строка.НомерСтрокиПоВиду = ТекущийНомер; - ТекущийНомер = ТекущийНомер + 1; - КонецЦикла; - -КонецПроцедуры - - &НаКлиенте -Функция ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) +Процедура ПоказатьВыборТипаПользователиИлиВнешниеПользователи(ОбработкаПродолжения) ВыборИПодборВнешнихПользователей = Ложь; Если Объект.Ссылка = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - Возврат Истина; + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); + Возврат; КонецЕсли; Если Объект.ТипПользователей <> Неопределено Тогда Если ТипЗнч(Объект.ТипПользователей) <> Тип("СправочникСсылка.Пользователи") Тогда ВыборИПодборВнешнихПользователей = Истина; КонецЕсли; - Возврат Истина; + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); + Возврат; КонецЕсли; Если ИспользоватьВнешнихПользователей Тогда - Элемент = СписокТиповПользователей.ВыбратьЭлемент( - НСтр("ru = 'Выбор типа данных'"), СписокТиповПользователей[0]); - - Если Элемент <> Неопределено Тогда - ВыборИПодборВнешнихПользователей = - Элемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); - Иначе - Возврат Ложь; - КонецЕсли; + СписокТиповПользователей.ПоказатьВыборЭлемента( + Новый ОписаниеОповещения( + "ПоказатьВыборТипаПользователиИлиВнешниеПользователиЗавершение", + ЭтотОбъект, + ОбработкаПродолжения), + НСтр("ru = 'Выбор типа данных'"), + СписокТиповПользователей[0]); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); КонецЕсли; - Возврат Истина; - -КонецФункции +КонецПроцедуры &НаКлиенте -Функция ВыбранТипЗначенияДоступа(Знач ТипыЗначенияДоступа) +Процедура ПоказатьВыборТипаПользователиИлиВнешниеПользователиЗавершение(ВыбранныйЭлемент, ОбработкаПродолжения) Экспорт - Если ТекущийТипЗначенияДоступа <> Неопределено Тогда + Если ВыбранныйЭлемент <> Неопределено Тогда + ВыборИПодборВнешнихПользователей = + ВыбранныйЭлемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() = 1 Тогда - - ТекущийТипЗначенияДоступа = ТипыЗначенияДоступа[0].Значение; - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() > 0 Тогда - - Если ТипыЗначенияДоступа.Количество() = 2 Тогда - - Если ТипыЗначенияДоступа.НайтиПоЗначению(ПредопределенноеЗначение( - "Справочник.Пользователи.ПустаяСсылка")) <> Неопределено - - И ТипыЗначенияДоступа.НайтиПоЗначению(ПредопределенноеЗначение( - "Справочник.ГруппыПользователей.ПустаяСсылка")) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ПредопределенноеЗначение( - "Справочник.Пользователи.ПустаяСсылка"); - - Возврат Истина; - КонецЕсли; - - Если ТипыЗначенияДоступа.НайтиПоЗначению(ПредопределенноеЗначение( - "Справочник.ВнешниеПользователи.ПустаяСсылка")) <> Неопределено - - И ТипыЗначенияДоступа.НайтиПоЗначению(ПредопределенноеЗначение( - "Справочник.ГруппыВнешнихПользователей.ПустаяСсылка")) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ПредопределенноеЗначение( - "Справочник.ВнешниеПользователи.ПустаяСсылка"); - - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Элемент = ТипыЗначенияДоступа.ВыбратьЭлемент( - НСтр("ru = 'Выбор типа данных'"), ТипыЗначенияДоступа[0]); - - Если Элемент <> Неопределено Тогда - ТекущийТипЗначенияДоступа = Элемент.Значение; - Возврат Истина; - КонецЕсли; + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, Неопределено); КонецЕсли; - Возврат Ложь; - -КонецФункции +КонецПроцедуры &НаКлиенте Процедура ВыбратьПодобратьПользователей(Подобрать) + ТекущийПользователь = ?(Элементы.Пользователи.ТекущиеДанные = Неопределено, + Неопределено, Элементы.Пользователи.ТекущиеДанные.Пользователь); + + Если НЕ Подобрать + И ЗначениеЗаполнено(ТекущийПользователь) + И ( ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.Пользователи") + ИЛИ ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Ложь; + + ИначеЕсли НЕ Подобрать + И ИспользоватьВнешнихПользователей + И ЗначениеЗаполнено(ТекущийПользователь) + И ( ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи") + ИЛИ ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Истина; + Иначе + ПоказатьВыборТипаПользователиИлиВнешниеПользователи( + Новый ОписаниеОповещения("ВыбратьПодобратьПользователейЗавершение", ЭтотОбъект, Подобрать)); + Возврат; + КонецЕсли; + + ВыбратьПодобратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Подобрать); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьПодобратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Подобрать) Экспорт + + Если ВыборИПодборВнешнихПользователей = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РежимВыбора", Истина); ПараметрыФормы.Вставить("ТекущаяСтрока", ?( @@ -1705,26 +1332,6 @@ Неопределено, Элементы.Пользователи.ТекущиеДанные.Пользователь)); - Если НЕ Подобрать - И ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) - И ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") - ИЛИ ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда - - ВыборИПодборВнешнихПользователей = Ложь; - - ИначеЕсли НЕ Подобрать - И ИспользоватьВнешнихПользователей - И ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) - И ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ВнешниеПользователи") - ИЛИ ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда - - ВыборИПодборВнешнихПользователей = Истина; - Иначе - Если НЕ ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - Если Объект.Ссылка <> ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда Если ВыборИПодборВнешнихПользователей Тогда ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); @@ -1746,11 +1353,9 @@ ПараметрыФормы.Вставить("ТипОбъектовАвторизации", Объект.ТипПользователей); КонецЕсли; Если СправочникВнешниеПользователиДоступен Тогда - - ОткрытьФорму( - "Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элементы.Пользователи); + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элементы.Пользователи); Иначе - Предупреждение(НСтр("ru = 'Недостаточно прав для выбора внешних пользователей.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Недостаточно прав для выбора внешних пользователей.'")); КонецЕсли; Иначе ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элементы.Пользователи); @@ -1758,6 +1363,7 @@ КонецПроцедуры + &НаСервере Функция ВыбранныеУчастникиГруппыДоступа() @@ -1910,7 +1516,7 @@ |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ГруппыДоступаВидыДоступа.ВидДоступа, - | ГруппыДоступаВидыДоступа.ДоступРазрешен + | ГруппыДоступаВидыДоступа.ВсеРазрешены |ИЗ | Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа |ГДЕ @@ -1939,45 +1545,3 @@ ТекущийОбъект.ЗначенияДоступа.Загрузить(РезультатыЗапросов[2].Выгрузить()); КонецПроцедуры - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораПользователя(Знач Текст, - Знач ВключаяГруппы = Истина, - Знач ВключаяВнешнихПользователей = Неопределено, - Знач БезПользователей = Ложь) - - Возврат Пользователи.СформироватьДанныеВыбораПользователя( - Текст, - ВключаяГруппы, - ВключаяВнешнихПользователей, - БезПользователей); - - -КонецФункции - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) - - Возврат УправлениеДоступомСлужебный.СформироватьДанныеВыбораЗначенияДоступа( - Текст, - ВидДоступа, - ВключаяГруппы); - -КонецФункции - -&НаСервере -Процедура ОбновитьНеиспользуемыеВидыДоступа(ПередОткрытиемФормы) - - Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка = ?(ПередОткрытиемФормы, Ложь, - НЕ Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка); - - Отбор = Новый Структура; - - Если Не Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка Тогда - Отбор.Вставить("ИспользуетсяВПрограмме", Истина); - Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор); - Иначе - Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(); - КонецЕсли; - -КонецПроцедуры diff --git a/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html b/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html index e3898a1da..330891784 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыДоступа/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Группы доступа предназначены для настройки прав и ограничений прав доступа конкретным пользователям и группам пользователей системы.</p> <p>Набор прав и возможности по их ограничению определяются заданным <a href="Catalog.ПрофилиГруппДоступа/Help">профилем групп доступа</a>. Например, группа доступа "Менеджеры по продажам ПО делового назначения" с пользователями Иванов и Петров может ссылаться на профиль "Менеджер по продажам", в котором предусмотрена возможность ограничения по виду доступа "Виды номенклатуры". Тогда если по этому виду доступа для всех значений указать вариант "Запрещены", а в список добавить вид номенклатуры "ПО делового назначения", то Иванову и Петрову будут доступны только те данные и операции, которые связаны с ПО делового назначения.</p> <p>Рекомендуется задавать наименования групп таким образом, чтобы название отражало как суть профиля, так и смысл ограничений, заданных в группе.</p> diff --git a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl index 9dfa24c0d..a628e8200 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыДоступа/ManagerModule.bsl @@ -1,5 +1,24 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("ТипПользователей"); + НеРедактируемыеРеквизиты.Добавить("Пользователь"); + НеРедактируемыеРеквизиты.Добавить("ОсновнаяГруппаДоступаПоставляемогоПрофиля"); + НеРедактируемыеРеквизиты.Добавить("ВидыДоступа.*"); + НеРедактируемыеРеквизиты.Добавить("ЗначенияДоступа.*"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -55,7 +74,22 @@ ГруппаДоступаОбновлена = Ложь; - Запрос = Новый Запрос( + ВидыДоступаПрофиля = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Профиль, "ВидыДоступа").Выгрузить(); + Индекс = ВидыДоступаПрофиля.Количество() - 1; + Пока Индекс >= 0 Цикл + Строка = ВидыДоступаПрофиля[Индекс]; + + Отбор = Новый Структура("ВидДоступа", Строка.ВидДоступа); + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(Строка.ВидДоступа); + + Если СвойстваВидаДоступа = Неопределено Тогда + ВидыДоступаПрофиля.Удалить(Строка); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ | ГруппыДоступа.Ссылка |ИЗ @@ -63,7 +97,7 @@ |ГДЕ | (ГруппыДоступа.Профиль = &Профиль | ИЛИ &Профиль = ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.Администратор) - | И ГруппыДоступа.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы))"); + | И ГруппыДоступа.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы))"; Запрос.УстановитьПараметр("Профиль", Профиль.Ссылка); Выборка = Запрос.Выполнить().Выбрать(); @@ -79,13 +113,13 @@ КонецЕсли; // Проверка состава видов доступа. - СоставВидовДоступаИзменен = Ложь; + СоставВидовДоступаИзменен = Ложь; ЕстьУдаляемыеВидыДоступаСЗаданнымиЗначениямиДоступа = Ложь; - Если ГруппаДоступа.ВидыДоступа.Количество() <> Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("Предустановленный", Ложь)).Количество() Тогда + Если ГруппаДоступа.ВидыДоступа.Количество() <> ВидыДоступаПрофиля.НайтиСтроки(Новый Структура("Предустановленный", Ложь)).Количество() Тогда СоставВидовДоступаИзменен = Истина; Иначе Для каждого СтрокаВидаДоступа Из ГруппаДоступа.ВидыДоступа Цикл - Если Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", СтрокаВидаДоступа.ВидДоступа, Ложь)).Количество() = 0 Тогда + Если ВидыДоступаПрофиля.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", СтрокаВидаДоступа.ВидДоступа, Ложь)).Количество() = 0 Тогда СоставВидовДоступаИзменен = Истина; Если ГруппаДоступа.ЗначенияДоступа.Найти(СтрокаВидаДоступа.ВидДоступа, "ВидДоступа") <> Неопределено Тогда ЕстьУдаляемыеВидыДоступаСЗаданнымиЗначениямиДоступа = Истина; @@ -102,7 +136,7 @@ ТекущийНомерСтроки = ГруппаДоступа.ВидыДоступа.Количество()-1; Пока ТекущийНомерСтроки >= 0 Цикл ТекущийВидДоступа = ГруппаДоступа.ВидыДоступа[ТекущийНомерСтроки].ВидДоступа; - Если Профиль.ВидыДоступа.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", ТекущийВидДоступа, Ложь)).Количество() = 0 Тогда + Если ВидыДоступаПрофиля.НайтиСтроки(Новый Структура("ВидДоступа, Предустановленный", ТекущийВидДоступа, Ложь)).Количество() = 0 Тогда СтрокиЗначенийВидаДоступа = ГруппаДоступа.ЗначенияДоступа.НайтиСтроки(Новый Структура("ВидДоступа", ТекущийВидДоступа)); Для каждого СтрокаЗначения Из СтрокиЗначенийВидаДоступа Цикл ГруппаДоступа.ЗначенияДоступа.Удалить(СтрокаЗначения); @@ -112,13 +146,13 @@ ТекущийНомерСтроки = ТекущийНомерСтроки - 1; КонецЦикла; // 2. Добавление новых видов доступа (если есть). - Для каждого СтрокаВидаДоступа Из Профиль.ВидыДоступа Цикл + Для каждого СтрокаВидаДоступа Из ВидыДоступаПрофиля Цикл Если НЕ СтрокаВидаДоступа.Предустановленный И ГруппаДоступа.ВидыДоступа.Найти(СтрокаВидаДоступа.ВидДоступа, "ВидДоступа") = Неопределено Тогда НоваяСтрока = ГруппаДоступа.ВидыДоступа.Добавить(); - НоваяСтрока.ВидДоступа = СтрокаВидаДоступа.ВидДоступа; - НоваяСтрока.ДоступРазрешен = СтрокаВидаДоступа.ДоступРазрешен; + НоваяСтрока.ВидДоступа = СтрокаВидаДоступа.ВидДоступа; + НоваяСтрока.ВсеРазрешены = СтрокаВидаДоступа.ВсеРазрешены; КонецЕсли; КонецЦикла; КонецЕсли; diff --git a/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo index 0d20ec5a3..01a44251e 100644 --- a/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo +++ b/SSL/src/Catalogs/ГруппыДоступа/ГруппыДоступа.mdo @@ -328,32 +328,34 @@ <key>ru</key> <value>Вид доступа</value> </synonym> + <comment>Представлен пустой ссылкой основного типа значений</comment> <type> - <types>ChartOfCharacteristicTypesRef.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> - <value>Вид доступа, по которому возможно ограничение доступа в группе доступа</value> + <value>Возможный "разрез" ограничения прав доступа +в заданном списке разрешенных действий (ролей), +указанных в профиле этой группы доступа.</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> </attributes> <attributes uuid="7021fca5-d612-43e1-927b-7f822153cf75"> - <name>ДоступРазрешен</name> + <name>ВсеРазрешены</name> <synonym> <key>ru</key> - <value>Доступ разрешен</value> + <value>Все разрешены</value> </synonym> <type> <types>Boolean</types> </type> <toolTip> <key>ru</key> - <value>Флажок установлен Истина, когда разрешены все значения доступа, кроме списка исключений</value> + <value>Способ определения разрешенных значений доступа</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -384,8 +386,9 @@ <key>ru</key> <value>Вид доступа</value> </synonym> + <comment>Представлен пустой ссылкой основного типа значений</comment> <type> - <types>ChartOfCharacteristicTypesRef.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> @@ -393,7 +396,6 @@ </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> @@ -405,18 +407,14 @@ <value>Значение доступа</value> </synonym> <type> - <types>Characteristic.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> - <value>Значение доступа, заданное по виду доступа</value> + <value>Разрешенное или запрещенное значение доступа</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> - <linkByType> - <field>Catalog.ГруппыДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа</field> - </linkByType> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> @@ -468,16 +466,6 @@ <usePurposes>PersonalComputer</usePurposes> <usePurposes>MobileDevice</usePurposes> </forms> - <forms uuid="e3ca64af-7766-48e2-b7c6-2a96f4539905"> - <name>ОбновлениеДанныхОграниченияДоступа</name> - <synonym> - <key>ru</key> - <value>Обновление данных ограничения доступа</value> - </synonym> - <comment>Используется для обновления данных ограничения доступа после обновления ИБ вместо регламентного задания</comment> - <usePurposes>PersonalComputer</usePurposes> - <usePurposes>MobileDevice</usePurposes> - </forms> <forms uuid="6ed466d7-e016-4d9c-9c0e-8deed48cbd70"> <name>ВыборПоОтветственному</name> <synonym> diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl index e69de29bb..60e34f69c 100644 --- a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ManagerModule.bsl @@ -0,0 +1,19 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + Результат.Добавить("РольИсполнителя"); + Результат.Добавить("ОсновнойОбъектАдресации"); + Результат.Добавить("ДополнительныйОбъектАдресации"); + Возврат Результат; + +КонецФункции + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo index d228c06b7..c89b64f85 100644 --- a/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo +++ b/SSL/src/Catalogs/ГруппыИсполнителейЗадач/ГруппыИсполнителейЗадач.mdo @@ -94,6 +94,9 @@ <maxValue xsi:type="core:UndefinedValue"/> </standardAttributes> <createOnInput>Use</createOnInput> + <dataLockFields>Catalog.ГруппыИсполнителейЗадач.Attribute.ОсновнойОбъектАдресации</dataLockFields> + <dataLockFields>Catalog.ГруппыИсполнителейЗадач.Attribute.РольИсполнителя</dataLockFields> + <dataLockFields>Catalog.ГруппыИсполнителейЗадач.Attribute.ДополнительныйОбъектАдресации</dataLockFields> <dataLockControlMode>Managed</dataLockControlMode> <fullTextSearch>Use</fullTextSearch> <objectPresentation> @@ -126,6 +129,7 @@ <fillValue xsi:type="core:ReferenceValue"> <value>Catalog.РолиИсполнителей.EmptyRef</value> </fillValue> + <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> @@ -145,6 +149,7 @@ <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:ReferenceValue"/> + <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> @@ -164,6 +169,7 @@ <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:ReferenceValue"/> + <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> <dataHistory>Use</dataHistory> </attributes> diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form index e3073d887..7c0cc9400 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Form.form @@ -34,8 +34,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>18</id> + <name>НаименованиеExtendedTooltip</name> + <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -72,8 +72,8 @@ <segments>Список.Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>20</id> + <name>КомментарийExtendedTooltip</name> + <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -110,10 +110,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>9</id> + <id>11</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>11</id> + <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -123,7 +123,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>10</id> + <id>12</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -133,10 +133,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>12</id> + <id>14</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>14</id> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -146,7 +146,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>13</id> + <id>15</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -157,10 +157,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>15</id> + <id>17</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>17</id> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -170,7 +170,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>16</id> + <id>18</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -180,7 +180,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl index 8ceb386b3..a836e32ee 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаСписка/Module.bsl @@ -48,12 +48,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form index 3d010c0c6..8f5155655 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -48,9 +48,6 @@ <items xsi:type="form:Table"> <name>Состав</name> <id>10</id> - <titleFont xsi:type="core:FontRef"> - <font>System.DefaultGUIFont</font> - </titleFont> <visible>true</visible> <enabled>true</enabled> <userVisible> @@ -74,8 +71,8 @@ <segments>Объект.Состав.Пользователь</segments> </dataPath> <extendedTooltip> - <name>ПользовательРасширеннаяПодсказка</name> - <id>79</id> + <name>ПользовательExtendedTooltip</name> + <id>69</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -117,8 +114,8 @@ <segments>Объект.Состав.Недействителен</segments> </dataPath> <extendedTooltip> - <name>НедействителенРасширеннаяПодсказка</name> - <id>81</id> + <name>НедействителенExtendedTooltip</name> + <id>70</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -151,8 +148,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставПодобратьРасширеннаяПодсказка</name> - <id>61</id> + <name>СоставПодобратьExtendedTooltip</name> + <id>60</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -178,8 +175,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставДобавитьРасширеннаяПодсказка</name> - <id>62</id> + <name>СоставДобавитьExtendedTooltip</name> + <id>61</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -205,8 +202,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставСкопироватьРасширеннаяПодсказка</name> - <id>63</id> + <name>СоставСкопироватьExtendedTooltip</name> + <id>62</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -232,8 +229,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставУдалитьРасширеннаяПодсказка</name> - <id>64</id> + <name>СоставУдалитьExtendedTooltip</name> + <id>63</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -259,8 +256,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставПереместитьВверхРасширеннаяПодсказка</name> - <id>65</id> + <name>СоставПереместитьВверхExtendedTooltip</name> + <id>64</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -286,8 +283,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставПереместитьВнизРасширеннаяПодсказка</name> - <id>66</id> + <name>СоставПереместитьВнизExtendedTooltip</name> + <id>65</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -313,8 +310,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставСортироватьПоВозрастаниюРасширеннаяПодсказка</name> - <id>67</id> + <name>СоставСортироватьПоВозрастаниюExtendedTooltip</name> + <id>66</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -341,8 +338,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СоставСортироватьПоУбываниюРасширеннаяПодсказка</name> - <id>68</id> + <name>СоставСортироватьПоУбываниюExtendedTooltip</name> + <id>67</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -371,10 +368,10 @@ </handlers> <searchStringAddition> <name>СоставСтрокаПоиска</name> - <id>70</id> + <id>75</id> <extendedTooltip> <name>СоставСтрокаПоискаРасширеннаяПодсказка</name> - <id>72</id> + <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -384,7 +381,7 @@ </extendedTooltip> <contextMenu> <name>СоставСтрокаПоискаКонтекстноеМеню</name> - <id>71</id> + <id>76</id> <autoFill>true</autoFill> </contextMenu> <source>Состав</source> @@ -394,10 +391,10 @@ </searchStringAddition> <viewStatusAddition> <name>СоставСостояниеПросмотра</name> - <id>73</id> + <id>78</id> <extendedTooltip> <name>СоставСостояниеПросмотраРасширеннаяПодсказка</name> - <id>75</id> + <id>80</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -407,7 +404,7 @@ </extendedTooltip> <contextMenu> <name>СоставСостояниеПросмотраКонтекстноеМеню</name> - <id>74</id> + <id>79</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -418,10 +415,10 @@ </viewStatusAddition> <searchControlAddition> <name>СоставУправлениеПоиском</name> - <id>76</id> + <id>81</id> <extendedTooltip> <name>СоставУправлениеПоискомРасширеннаяПодсказка</name> - <id>78</id> + <id>83</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -431,7 +428,7 @@ </extendedTooltip> <contextMenu> <name>СоставУправлениеПоискомКонтекстноеМеню</name> - <id>77</id> + <id>82</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -441,8 +438,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СоставРасширеннаяПодсказка</name> - <id>69</id> + <name>СоставExtendedTooltip</name> + <id>68</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -463,8 +460,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСоставПодобратьПользователейРасширеннаяПодсказка</name> - <id>57</id> + <name>КонтекстноеМенюСоставПодобратьПользователейExtendedTooltip</name> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -490,8 +487,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСоставДобавитьРасширеннаяПодсказка</name> - <id>58</id> + <name>КонтекстноеМенюСоставДобавитьExtendedTooltip</name> + <id>57</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -517,8 +514,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСоставСкопироватьРасширеннаяПодсказка</name> - <id>59</id> + <name>КонтекстноеМенюСоставСкопироватьExtendedTooltip</name> + <id>58</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -544,8 +541,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСоставУдалитьРасширеннаяПодсказка</name> - <id>60</id> + <name>КонтекстноеМенюСоставУдалитьExtendedTooltip</name> + <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -610,8 +607,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>92</id> + <name>РодительExtendedTooltip</name> + <id>72</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -656,8 +653,8 @@ </dataPath> <titleLocation>Left</titleLocation> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>94</id> + <name>КомментарийExtendedTooltip</name> + <id>73</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -706,8 +703,8 @@ <value>Прочее</value> </toolTip> <extendedTooltip> - <name>ПрочееРасширеннаяПодсказка</name> - <id>91</id> + <name>ПрочееExtendedTooltip</name> + <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -740,7 +737,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПоказыватьНедействительныхПользователейРасширеннаяПодсказка</name> + <name>ПоказыватьНедействительныхПользователейExtendedTooltip</name> <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html index 4862fa5be..f8a5a9c94 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Карточка группы пользователей позволяет просматривать и редактировать свойства группы.</p> <p>При редактировании состава пользователей группы нужно учитывать, что они неявно входят в состав групп-родителей. Для добавления большого числа пользователей можно использовать команду <strong>Подобрать</strong>.</p> <h3>См. также</h3> diff --git a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl index 227ee2ce7..5989692ef 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ГруппыПользователей/Forms/ФормаЭлемента/Module.bsl @@ -48,7 +48,10 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, Модифицированность); + + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария( + Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html index 6af86d255..5dedb0817 100644 --- a/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html +++ b/SSL/src/Catalogs/ГруппыПользователей/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p class="Usual">В этом списке ведется учет групп пользователей.</p> <p class="Usual">Группы пользователей могут использоваться для группировки большого числа пользователей, а также когда нужно указывать не только пользователя, но и группу пользователей, например, при настройке доступа, в ролях исполнителей задач бизнес-процессов и др.<br></p> <p class="Usual">Группы создаются плоским списком или иерархическим. В иерархическом списке, пользователи вложенных групп неявно входят в группы-родители.</p> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form index 38d473845..31df522e7 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/БыстрыйДоступКДополнительнымОтчетамИОбработкам/Form.form @@ -41,8 +41,8 @@ <segments>ВсеПользователи.Пользователь</segments> </dataPath> <extendedTooltip> - <name>ПользователиСсылкаРасширеннаяПодсказка</name> - <id>46</id> + <name>ПользователиСсылкаExtendedTooltip</name> + <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -84,7 +84,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ПользователиНайтиРасширеннаяПодсказка</name> + <name>ПользователиНайтиExtendedTooltip</name> <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -111,7 +111,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ПользователиОтменитьПоискРасширеннаяПодсказка</name> + <name>ПользователиОтменитьПоискExtendedTooltip</name> <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -140,10 +140,10 @@ </handlers> <searchStringAddition> <name>ВсеПользователиСтрокаПоиска</name> - <id>37</id> + <id>48</id> <extendedTooltip> <name>ВсеПользователиСтрокаПоискаРасширеннаяПодсказка</name> - <id>39</id> + <id>50</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -153,7 +153,7 @@ </extendedTooltip> <contextMenu> <name>ВсеПользователиСтрокаПоискаКонтекстноеМеню</name> - <id>38</id> + <id>49</id> <autoFill>true</autoFill> </contextMenu> <source>ВсеПользователи</source> @@ -163,10 +163,10 @@ </searchStringAddition> <viewStatusAddition> <name>ВсеПользователиСостояниеПросмотра</name> - <id>40</id> + <id>51</id> <extendedTooltip> <name>ВсеПользователиСостояниеПросмотраРасширеннаяПодсказка</name> - <id>42</id> + <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -176,7 +176,7 @@ </extendedTooltip> <contextMenu> <name>ВсеПользователиСостояниеПросмотраКонтекстноеМеню</name> - <id>41</id> + <id>52</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -187,10 +187,10 @@ </viewStatusAddition> <searchControlAddition> <name>ВсеПользователиУправлениеПоиском</name> - <id>43</id> + <id>54</id> <extendedTooltip> <name>ВсеПользователиУправлениеПоискомРасширеннаяПодсказка</name> - <id>45</id> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -200,7 +200,7 @@ </extendedTooltip> <contextMenu> <name>ВсеПользователиУправлениеПоискомКонтекстноеМеню</name> - <id>44</id> + <id>55</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -210,7 +210,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ВсеПользователиРасширеннаяПодсказка</name> + <name>ВсеПользователиExtendedTooltip</name> <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -264,8 +264,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПустаяДекорацияРасширеннаяПодсказка</name> - <id>57</id> + <name>ПустаяДекорацияExtendedTooltip</name> + <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -294,8 +294,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УстановитьКомандуДляВыделенныхПользователейРасширеннаяПодсказка</name> - <id>58</id> + <name>УстановитьКомандуДляВыделенныхПользователейExtendedTooltip</name> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -321,8 +321,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УстановитьДоступДляВсехПользователейРасширеннаяПодсказка</name> - <id>59</id> + <name>УстановитьДоступДляВсехПользователейExtendedTooltip</name> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -348,8 +348,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УбратьДоступККомандеУВсехПользователейРасширеннаяПодсказка</name> - <id>60</id> + <name>УбратьДоступККомандеУВсехПользователейExtendedTooltip</name> + <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -375,8 +375,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УбратьДоступККомандеУВыделенныхПользователейРасширеннаяПодсказка</name> - <id>61</id> + <name>УбратьДоступККомандеУВыделенныхПользователейExtendedTooltip</name> + <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -404,8 +404,8 @@ </toolTip> <enableContentChange>true</enableContentChange> <extendedTooltip> - <name>КомандыУправленияСпискомРасширеннаяПодсказка</name> - <id>56</id> + <name>КомандыУправленияСпискомExtendedTooltip</name> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -463,8 +463,8 @@ <segments>ПользователиКороткогоСписка.Пользователь</segments> </dataPath> <extendedTooltip> - <name>ПользователиКороткогоСпискаПользовательРасширеннаяПодсказка</name> - <id>74</id> + <name>ПользователиКороткогоСпискаПользовательExtendedTooltip</name> + <id>47</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -506,8 +506,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ПользователиКороткогоСпискаНайтиРасширеннаяПодсказка</name> - <id>62</id> + <name>ПользователиКороткогоСпискаНайтиExtendedTooltip</name> + <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -533,8 +533,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ПользователиКороткогоСпискаОтменитьПоискРасширеннаяПодсказка</name> - <id>63</id> + <name>ПользователиКороткогоСпискаОтменитьПоискExtendedTooltip</name> + <id>45</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -562,10 +562,10 @@ </handlers> <searchStringAddition> <name>ПользователиКороткогоСпискаСтрокаПоиска</name> - <id>65</id> + <id>66</id> <extendedTooltip> <name>ПользователиКороткогоСпискаСтрокаПоискаРасширеннаяПодсказка</name> - <id>67</id> + <id>68</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -575,7 +575,7 @@ </extendedTooltip> <contextMenu> <name>ПользователиКороткогоСпискаСтрокаПоискаКонтекстноеМеню</name> - <id>66</id> + <id>67</id> <autoFill>true</autoFill> </contextMenu> <source>ПользователиКороткогоСписка</source> @@ -585,10 +585,10 @@ </searchStringAddition> <viewStatusAddition> <name>ПользователиКороткогоСпискаСостояниеПросмотра</name> - <id>68</id> + <id>69</id> <extendedTooltip> <name>ПользователиКороткогоСпискаСостояниеПросмотраРасширеннаяПодсказка</name> - <id>70</id> + <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -598,7 +598,7 @@ </extendedTooltip> <contextMenu> <name>ПользователиКороткогоСпискаСостояниеПросмотраКонтекстноеМеню</name> - <id>69</id> + <id>70</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -609,10 +609,10 @@ </viewStatusAddition> <searchControlAddition> <name>ПользователиКороткогоСпискаУправлениеПоиском</name> - <id>71</id> + <id>72</id> <extendedTooltip> <name>ПользователиКороткогоСпискаУправлениеПоискомРасширеннаяПодсказка</name> - <id>73</id> + <id>74</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -622,7 +622,7 @@ </extendedTooltip> <contextMenu> <name>ПользователиКороткогоСпискаУправлениеПоискомКонтекстноеМеню</name> - <id>72</id> + <id>73</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -632,8 +632,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ПользователиКороткогоСпискаРасширеннаяПодсказка</name> - <id>64</id> + <name>ПользователиКороткогоСпискаExtendedTooltip</name> + <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -688,7 +688,7 @@ <value>Группа пользователи</value> </toolTip> <extendedTooltip> - <name>ГруппаПользователиРасширеннаяПодсказка</name> + <name>ГруппаПользователиExtendedTooltip</name> <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -722,7 +722,7 @@ <defaultItem>true</defaultItem> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОКРасширеннаяПодсказка</name> + <name>ОКExtendedTooltip</name> <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -749,7 +749,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОтменаРасширеннаяПодсказка</name> + <name>ОтменаExtendedTooltip</name> <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form index 92e045557..6e6895590 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Form.form @@ -42,8 +42,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ИспользуетсяРасширеннаяПодсказка</name> - <id>26</id> + <name>ИспользуетсяExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -75,8 +75,8 @@ <segments>Разделы.Представление</segments> </dataPath> <extendedTooltip> - <name>ПредставлениеРасширеннаяПодсказка</name> - <id>28</id> + <name>ПредставлениеExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -118,8 +118,8 @@ <value>Группа колонок</value> </toolTip> <extendedTooltip> - <name>ГруппаКолонокРасширеннаяПодсказка</name> - <id>25</id> + <name>ГруппаКолонокExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -140,32 +140,9 @@ </autoCommandBar> <searchStringAddition> <name>РазделыСтрокаПоиска</name> - <id>16</id> - <extendedTooltip> - <name>РазделыСтрокаПоискаРасширеннаяПодсказка</name> - <id>18</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>РазделыСтрокаПоискаКонтекстноеМеню</name> - <id>17</id> - <autoFill>true</autoFill> - </contextMenu> - <source>Разделы</source> - <extInfo xsi:type="form:SearchStringAdditionExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - </extInfo> - </searchStringAddition> - <viewStatusAddition> - <name>РазделыСостояниеПросмотра</name> <id>19</id> <extendedTooltip> - <name>РазделыСостояниеПросмотраРасширеннаяПодсказка</name> + <name>РазделыСтрокаПоискаРасширеннаяПодсказка</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -175,10 +152,33 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>РазделыСостояниеПросмотраКонтекстноеМеню</name> + <name>РазделыСтрокаПоискаКонтекстноеМеню</name> <id>20</id> <autoFill>true</autoFill> </contextMenu> + <source>Разделы</source> + <extInfo xsi:type="form:SearchStringAdditionExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + </extInfo> + </searchStringAddition> + <viewStatusAddition> + <name>РазделыСостояниеПросмотра</name> + <id>22</id> + <extendedTooltip> + <name>РазделыСостояниеПросмотраРасширеннаяПодсказка</name> + <id>24</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>РазделыСостояниеПросмотраКонтекстноеМеню</name> + <id>23</id> + <autoFill>true</autoFill> + </contextMenu> <type>ViewStatusAddition</type> <source>Разделы</source> <extInfo xsi:type="form:ViewStatusAdditionExtInfo"> @@ -187,10 +187,10 @@ </viewStatusAddition> <searchControlAddition> <name>РазделыУправлениеПоиском</name> - <id>22</id> + <id>25</id> <extendedTooltip> <name>РазделыУправлениеПоискомРасширеннаяПодсказка</name> - <id>24</id> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -200,7 +200,7 @@ </extendedTooltip> <contextMenu> <name>РазделыУправлениеПоискомКонтекстноеМеню</name> - <id>23</id> + <id>26</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -210,7 +210,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>РазделыРасширеннаяПодсказка</name> + <name>РазделыExtendedTooltip</name> <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -268,7 +268,7 @@ <defaultItem>true</defaultItem> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОКРасширеннаяПодсказка</name> + <name>ОКExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -295,7 +295,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОтменаРасширеннаяПодсказка</name> + <name>ОтменаExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl index 934e95a3d..499d6f0ad 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ПодборРазделов/Module.bsl @@ -11,9 +11,9 @@ ИспользуемыеРазделы = Новый Массив; Если Параметры.ВидОбработки = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками(ИспользуемыеРазделы); + ИспользуемыеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОбработок(); Иначе - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами(ИспользуемыеРазделы); + ИспользуемыеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОтчетов(); КонецЕсли; РабочийСтол = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form index bd76767bd..d154bbb06 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаСписка/Form.form @@ -19,7 +19,7 @@ <name>ВидОтборПриИзменении</name> </handlers> <extendedTooltip> - <name>ВидОтборРасширеннаяПодсказка</name> + <name>ВидОтборExtendedTooltip</name> <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -68,8 +68,8 @@ <name>ПубликацияОтборПриИзменении</name> </handlers> <extendedTooltip> - <name>ПубликацияОтборРасширеннаяПодсказка</name> - <id>35</id> + <name>ПубликацияОтборExtendedTooltip</name> + <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -116,7 +116,7 @@ <value>Быстрые отборы</value> </toolTip> <extendedTooltip> - <name>БыстрыеОтборыРасширеннаяПодсказка</name> + <name>БыстрыеОтборыExtendedTooltip</name> <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -149,8 +149,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСоздатьРасширеннаяПодсказка</name> - <id>39</id> + <name>ФормаСоздатьExtendedTooltip</name> + <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -175,8 +175,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСоздатьГруппуРасширеннаяПодсказка</name> - <id>40</id> + <name>ФормаСоздатьГруппуExtendedTooltip</name> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -201,8 +201,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСкопироватьРасширеннаяПодсказка</name> - <id>41</id> + <name>ФормаСкопироватьExtendedTooltip</name> + <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -232,8 +232,8 @@ <value>Кнопки добавления</value> </toolTip> <extendedTooltip> - <name>КнопкиДобавленияРасширеннаяПодсказка</name> - <id>38</id> + <name>КнопкиДобавленияExtendedTooltip</name> + <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -260,8 +260,8 @@ <value>Команды формы</value> </toolTip> <extendedTooltip> - <name>КомандыФормыРасширеннаяПодсказка</name> - <id>42</id> + <name>КомандыФормыExtendedTooltip</name> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -282,8 +282,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СправкаРасширеннаяПодсказка</name> - <id>43</id> + <name>СправкаExtendedTooltip</name> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -313,8 +313,8 @@ <value>Командная панель</value> </toolTip> <extendedTooltip> - <name>КоманднаяПанельРасширеннаяПодсказка</name> - <id>37</id> + <name>КоманднаяПанельExtendedTooltip</name> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -354,8 +354,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>54</id> + <name>НаименованиеExtendedTooltip</name> + <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -390,8 +390,8 @@ <segments>Список.Вид</segments> </dataPath> <extendedTooltip> - <name>ВидРасширеннаяПодсказка</name> - <id>56</id> + <name>ВидExtendedTooltip</name> + <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -426,8 +426,8 @@ <segments>Список.Публикация</segments> </dataPath> <extendedTooltip> - <name>ПубликацияРасширеннаяПодсказка</name> - <id>58</id> + <name>ПубликацияExtendedTooltip</name> + <id>45</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -462,8 +462,8 @@ <segments>Список.Версия</segments> </dataPath> <extendedTooltip> - <name>ВерсияРасширеннаяПодсказка</name> - <id>60</id> + <name>ВерсияExtendedTooltip</name> + <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -498,8 +498,8 @@ <segments>Список.Ответственный</segments> </dataPath> <extendedTooltip> - <name>ОтветственныйРасширеннаяПодсказка</name> - <id>62</id> + <name>ОтветственныйExtendedTooltip</name> + <id>47</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -532,8 +532,8 @@ <segments>Список.ИмяОбъекта</segments> </dataPath> <extendedTooltip> - <name>ИмяОбъектаРасширеннаяПодсказка</name> - <id>64</id> + <name>ИмяОбъектаExtendedTooltip</name> + <id>48</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -563,10 +563,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>45</id> + <id>51</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>47</id> + <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -576,7 +576,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>46</id> + <id>52</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -586,10 +586,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>48</id> + <id>54</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>50</id> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -599,7 +599,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>49</id> + <id>55</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -610,10 +610,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>51</id> + <id>57</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>53</id> + <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -623,7 +623,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>52</id> + <id>58</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -633,8 +633,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> - <id>44</id> + <name>СписокExtendedTooltip</name> + <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form index 7be5c1d69..4fbb4d601 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>178</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -59,8 +59,8 @@ </dataPath> <titleLocation>Left</titleLocation> <extendedTooltip> - <name>ПубликацияРасширеннаяПодсказка</name> - <id>181</id> + <name>ПубликацияExtendedTooltip</name> + <id>180</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -111,8 +111,8 @@ <value>Группа публикация ответственный</value> </toolTip> <extendedTooltip> - <name>ГруппаПубликацияОтветственныйРасширеннаяПодсказка</name> - <id>180</id> + <name>ГруппаПубликацияОтветственныйExtendedTooltip</name> + <id>179</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -141,8 +141,8 @@ <segments>ПредставлениеНазначения</segments> </dataPath> <extendedTooltip> - <name>НазначениеКомандРасширеннаяПодсказка</name> - <id>183</id> + <name>НазначениеКомандExtendedTooltip</name> + <id>181</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -186,8 +186,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПоказыватьРасширеннаяПодсказка</name> - <id>186</id> + <name>ПоказыватьExtendedTooltip</name> + <id>183</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -228,8 +228,8 @@ <name>ИспользоватьДляФормыСпискаПриИзменении</name> </handlers> <extendedTooltip> - <name>ИспользоватьДляФормыСпискаРасширеннаяПодсказка</name> - <id>187</id> + <name>ИспользоватьДляФормыСпискаExtendedTooltip</name> + <id>184</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -270,8 +270,8 @@ <name>ИспользоватьДляФормыОбъектаПриИзменении</name> </handlers> <extendedTooltip> - <name>ИспользоватьДляФормыОбъектаРасширеннаяПодсказка</name> - <id>189</id> + <name>ИспользоватьДляФормыОбъектаExtendedTooltip</name> + <id>185</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -305,8 +305,8 @@ <value>Типы форм</value> </toolTip> <extendedTooltip> - <name>ТипыФормРасширеннаяПодсказка</name> - <id>185</id> + <name>ТипыФормExtendedTooltip</name> + <id>182</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -342,8 +342,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>РазрешенияРасширеннаяПодсказка</name> - <id>193</id> + <name>РазрешенияExtendedTooltip</name> + <id>188</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -388,8 +388,8 @@ <value>Страница разрешения</value> </toolTip> <extendedTooltip> - <name>СтраницаРазрешенияРасширеннаяПодсказка</name> - <id>192</id> + <name>СтраницаРазрешенияExtendedTooltip</name> + <id>187</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -427,8 +427,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВариантыИнформационнаяНадписьРасширеннаяПодсказка</name> - <id>198</id> + <name>ВариантыИнформационнаяНадписьExtendedTooltip</name> + <id>192</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -463,8 +463,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗаписатьРасширеннаяПодсказка</name> - <id>199</id> + <name>ЗаписатьExtendedTooltip</name> + <id>193</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -496,8 +496,8 @@ </toolTip> <enableContentChange>true</enableContentChange> <extendedTooltip> - <name>ВариантыСкрытьДоЗаписиРасширеннаяПодсказка</name> - <id>197</id> + <name>ВариантыСкрытьДоЗаписиExtendedTooltip</name> + <id>191</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -543,8 +543,8 @@ <segments>ВариантыДополнительногоОтчета.Наименование</segments> </dataPath> <extendedTooltip> - <name>ВариантыДополнительногоОтчетаНаименованиеРасширеннаяПодсказка</name> - <id>223</id> + <name>ВариантыДополнительногоОтчетаНаименованиеExtendedTooltip</name> + <id>208</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -582,8 +582,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВариантыДополнительногоОтчетаНайтиРасширеннаяПодсказка</name> - <id>206</id> + <name>ВариантыДополнительногоОтчетаНайтиExtendedTooltip</name> + <id>200</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -609,8 +609,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВариантыДополнительногоОтчетаОтменитьПоискРасширеннаяПодсказка</name> - <id>207</id> + <name>ВариантыДополнительногоОтчетаОтменитьПоискExtendedTooltip</name> + <id>201</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -636,8 +636,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВариантыДополнительногоОтчетаВывестиСписокРасширеннаяПодсказка</name> - <id>208</id> + <name>ВариантыДополнительногоОтчетаВывестиСписокExtendedTooltip</name> + <id>202</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -663,8 +663,8 @@ <value>Группа поиск и вывести список</value> - ВариантыДополнительногоОтчетаПоискИВывестиСписокРасширеннаяПодсказка - 205 + ВариантыДополнительногоОтчетаПоискИВывестиСписокExtendedTooltip + 199 Label true true @@ -683,8 +683,8 @@ true - ВариантыДополнительногоОтчетаОткрытьРасширеннаяПодсказка - 209 + ВариантыДополнительногоОтчетаОткрытьExtendedTooltip + 203 Label true true @@ -713,8 +713,8 @@ true - ВариантыДополнительногоОтчетаИзменитьРасширеннаяПодсказка - 210 + ВариантыДополнительногоОтчетаИзменитьExtendedTooltip + 204 Label true true @@ -739,8 +739,8 @@ true - ВариантыДополнительногоОтчетаРазместитьВРазделахРасширеннаяПодсказка - 211 + ВариантыДополнительногоОтчетаРазместитьВРазделахExtendedTooltip + 205 Label true true @@ -765,8 +765,8 @@ true - ВариантыДополнительногоОтчетаУдалитьРасширеннаяПодсказка - 212 + ВариантыДополнительногоОтчетаУдалитьExtendedTooltip + 206 Label true true @@ -802,10 +802,10 @@ ВариантыДополнительногоОтчетаСтрокаПоиска - 214 + 246 ВариантыДополнительногоОтчетаСтрокаПоискаРасширеннаяПодсказка - 216 + 248 Label true true @@ -815,7 +815,7 @@ ВариантыДополнительногоОтчетаСтрокаПоискаКонтекстноеМеню - 215 + 247 true ВариантыДополнительногоОтчета @@ -825,10 +825,10 @@ ВариантыДополнительногоОтчетаСостояниеПросмотра - 217 + 249 ВариантыДополнительногоОтчетаСостояниеПросмотраРасширеннаяПодсказка - 219 + 251 Label true true @@ -838,7 +838,7 @@ ВариантыДополнительногоОтчетаСостояниеПросмотраКонтекстноеМеню - 218 + 250 true ViewStatusAddition @@ -849,10 +849,10 @@ ВариантыДополнительногоОтчетаУправлениеПоиском - 220 + 252 ВариантыДополнительногоОтчетаУправлениеПоискомРасширеннаяПодсказка - 222 + 254 Label true true @@ -862,7 +862,7 @@ ВариантыДополнительногоОтчетаУправлениеПоискомКонтекстноеМеню - 221 + 253 true SearchControlAddition @@ -872,8 +872,8 @@ - ВариантыДополнительногоОтчетаРасширеннаяПодсказка - 213 + ВариантыДополнительногоОтчетаExtendedTooltip + 207 Label true true @@ -893,8 +893,8 @@ true - ВариантыДополнительногоОтчетаОткрыть1РасширеннаяПодсказка - 201 + ВариантыДополнительногоОтчетаОткрыть1ExtendedTooltip + 195 Label true true @@ -923,8 +923,8 @@ true - ВариантыДополнительногоОтчетаИзменить1РасширеннаяПодсказка - 202 + ВариантыДополнительногоОтчетаИзменить1ExtendedTooltip + 196 Label true true @@ -949,8 +949,8 @@ true - ВариантыДополнительногоОтчетаРазместитьВРазделах1РасширеннаяПодсказка - 203 + ВариантыДополнительногоОтчетаРазместитьВРазделах1ExtendedTooltip + 197 Label true true @@ -975,8 +975,8 @@ true - ВариантыДополнительногоОтчетаУдалить1РасширеннаяПодсказка - 204 + ВариантыДополнительногоОтчетаУдалить1ExtendedTooltip + 198 Label true true @@ -1044,8 +1044,8 @@ true - ВариантыПоказатьРасширеннаяПодсказка - 200 + ВариантыПоказатьExtendedTooltip + 194 Label true true @@ -1074,8 +1074,8 @@ true - СтраницыВариантыРасширеннаяПодсказка - 196 + СтраницыВариантыExtendedTooltip + 190 Label true true @@ -1102,8 +1102,8 @@ Страница варианты - СтраницаВариантыРасширеннаяПодсказка - 195 + СтраницаВариантыExtendedTooltip + 189 Label true true @@ -1136,8 +1136,8 @@ ПредставлениеНазначения - РазмещениеКомандРасширеннаяПодсказка - 234 + РазмещениеКомандExtendedTooltip + 210 Label true true @@ -1203,8 +1203,8 @@ Объект.Команды.Представление - ОбъектКомандыПредставлениеРасширеннаяПодсказка - 248 + ОбъектКомандыПредставлениеExtendedTooltip + 214 Label true true @@ -1245,8 +1245,8 @@ Объект.Команды.БыстрыйДоступПредставление - ОбъектКомандыБыстрыйДоступПредставлениеРасширеннаяПодсказка - 250 + ОбъектКомандыБыстрыйДоступПредставлениеExtendedTooltip + 215 Label true true @@ -1301,8 +1301,8 @@ ОбъектКомандыРегламентноеЗаданиеИспользованиеПриИзменении - ОбъектКомандыРегламентноеЗаданиеИспользованиеРасширеннаяПодсказка - 252 + ОбъектКомандыРегламентноеЗаданиеИспользованиеExtendedTooltip + 216 Label true true @@ -1337,8 +1337,8 @@ Объект.Команды.РегламентноеЗаданиеПредставление - ОбъектКомандыРегламентноеЗаданиеПредставлениеРасширеннаяПодсказка - 254 + ОбъектКомандыРегламентноеЗаданиеПредставлениеExtendedTooltip + 217 Label true true @@ -1393,10 +1393,10 @@ ОбъектКомандыСтрокаПоиска - 239 + 265 ОбъектКомандыСтрокаПоискаРасширеннаяПодсказка - 241 + 267 Label true true @@ -1406,7 +1406,7 @@ ОбъектКомандыСтрокаПоискаКонтекстноеМеню - 240 + 266 true ОбъектКоманды @@ -1416,10 +1416,10 @@ ОбъектКомандыСостояниеПросмотра - 242 + 268 ОбъектКомандыСостояниеПросмотраРасширеннаяПодсказка - 244 + 270 Label true true @@ -1429,7 +1429,7 @@ ОбъектКомандыСостояниеПросмотраКонтекстноеМеню - 243 + 269 true ViewStatusAddition @@ -1440,10 +1440,10 @@ ОбъектКомандыУправлениеПоиском - 245 + 271 ОбъектКомандыУправлениеПоискомРасширеннаяПодсказка - 247 + 273 Label true true @@ -1453,7 +1453,7 @@ ОбъектКомандыУправлениеПоискомКонтекстноеМеню - 246 + 272 true SearchControlAddition @@ -1463,8 +1463,8 @@ - ОбъектКомандыРасширеннаяПодсказка - 238 + ОбъектКомандыExtendedTooltip + 213 Label true true @@ -1484,8 +1484,8 @@ true - ОбъектКомандыНастроитьБыстрыйДоступРасширеннаяПодсказка - 236 + ОбъектКомандыНастроитьБыстрыйДоступExtendedTooltip + 211 Label true true @@ -1510,8 +1510,8 @@ true - ОбъектКомандыНастроитьРасписаниеРасширеннаяПодсказка - 237 + ОбъектКомандыНастроитьРасписаниеExtendedTooltip + 212 Label true true @@ -1566,8 +1566,8 @@ Страница команды - СтраницаКомандыРасширеннаяПодсказка - 233 + СтраницаКомандыExtendedTooltip + 209 Label true true @@ -1596,8 +1596,8 @@ true - СтраницыВариантыКомандыРасширеннаяПодсказка - 191 + СтраницыВариантыКомандыExtendedTooltip + 186 Label true true @@ -1626,8 +1626,8 @@ true - ПустаяДекорацияРасширеннаяПодсказка - 266 + ПустаяДекорацияExtendedTooltip + 220 Label true true @@ -1662,8 +1662,8 @@ Группа без текста - ГруппаБезТекстаРасширеннаяПодсказка - 265 + ГруппаБезТекстаExtendedTooltip + 219 Label true true @@ -1694,8 +1694,8 @@ true - ПредупреждениеОбработкиОНебезопасномРежимеРасширеннаяПодсказка - 268 + ПредупреждениеОбработкиОНебезопасномРежимеExtendedTooltip + 222 Label true true @@ -1733,8 +1733,8 @@ Группа предупреждение обработки - ГруппаПредупреждениеОбработкиРасширеннаяПодсказка - 267 + ГруппаПредупреждениеОбработкиExtendedTooltip + 221 Label true true @@ -1765,8 +1765,8 @@ true - ПредупреждениеОтчетаОНебезопасномРежимеРасширеннаяПодсказка - 270 + ПредупреждениеОтчетаОНебезопасномРежимеExtendedTooltip + 224 Label true true @@ -1804,8 +1804,8 @@ Группа предупреждение - ГруппаПредупреждениеОтчетаРасширеннаяПодсказка - 269 + ГруппаПредупреждениеОтчетаExtendedTooltip + 223 Label true true @@ -1835,8 +1835,8 @@ true - ИнформацияОбработкиОБезопасномРежимеРасширеннаяПодсказка - 272 + ИнформацияОбработкиОБезопасномРежимеExtendedTooltip + 226 Label true true @@ -1875,8 +1875,8 @@ true - ИнформацияОбработкиОРазрешенияхРасширеннаяПодсказка - 273 + ИнформацияОбработкиОРазрешенияхExtendedTooltip + 227 Label true true @@ -1916,8 +1916,8 @@ Группа информация обработки - ГруппаИнформацияОбработкиРасширеннаяПодсказка - 271 + ГруппаИнформацияОбработкиExtendedTooltip + 225 Label true true @@ -1946,8 +1946,8 @@ true - ИнформацияОтчетаОБезопасномРежимеРасширеннаяПодсказка - 275 + ИнформацияОтчетаОБезопасномРежимеExtendedTooltip + 229 Label true true @@ -1986,8 +1986,8 @@ true - ИнформацияОтчетаОРазрешенияхРасширеннаяПодсказка - 276 + ИнформацияОтчетаОРазрешенияхExtendedTooltip + 230 Label true true @@ -2027,8 +2027,8 @@ Группа информация отчета - ГруппаИнформацияОтчетаРасширеннаяПодсказка - 274 + ГруппаИнформацияОтчетаExtendedTooltip + 228 Label true true @@ -2056,8 +2056,8 @@ true - ГруппаДополнительнаяИнформацияРасширеннаяПодсказка - 264 + ГруппаДополнительнаяИнформацияExtendedTooltip + 218 Label true true @@ -2086,8 +2086,8 @@ true - ВидРасширеннаяПодсказка - 278 + ВидExtendedTooltip + 232 Label true true @@ -2135,8 +2135,8 @@ true - ИмяФайлаРасширеннаяПодсказка - 280 + ИмяФайлаExtendedTooltip + 233 Label true true @@ -2185,8 +2185,8 @@ true - ВерсияРасширеннаяПодсказка - 282 + ВерсияExtendedTooltip + 234 Label true true @@ -2230,8 +2230,8 @@ true - ИмяОбъектаРасширеннаяПодсказка - 284 + ИмяОбъектаExtendedTooltip + 235 Label true true @@ -2280,8 +2280,8 @@ true Left - ИнформацияРасширеннаяПодсказка - 286 + ИнформацияExtendedTooltip + 236 Label true true @@ -2321,8 +2321,8 @@ Дополнительная информация - ДополнительнаяИнформацияРасширеннаяПодсказка - 277 + ДополнительнаяИнформацияExtendedTooltip + 231 Label true true @@ -2358,8 +2358,8 @@ Объект.Parent - ГруппаРасширеннаяПодсказка - 288 + ГруппаExtendedTooltip + 237 Label true true @@ -2402,8 +2402,8 @@ true - ОтветственныйРасширеннаяПодсказка - 290 + ОтветственныйExtendedTooltip + 238 Label true true @@ -2450,8 +2450,8 @@ Left - КомментарийРасширеннаяПодсказка - 292 + КомментарийExtendedTooltip + 239 Label true true @@ -2505,7 +2505,7 @@ false - ЗагрузитьФайлОбработкиОтчетаРасширеннаяПодсказка + ЗагрузитьФайлОбработкиОтчетаExtendedTooltip 176 Label true @@ -2532,7 +2532,7 @@ false - СохранитьФайлОбработкиОтчетаРасширеннаяПодсказка + СохранитьФайлОбработкиОтчетаExtendedTooltip 177 Label true @@ -3032,6 +3032,23 @@ true + + ДиалогЗагрузкиНовогоПройден + + <key>ru</key> + <value>Диалог загрузки нового пройден</value> + + 14 + + Boolean + + + true + + + true + + ЗагрузитьФайлОбработкиОтчета @@ -3041,7 +3058,7 @@ <id>1</id> <toolTip> <key>ru</key> - <value>Загрузить файл обработки отчета</value> + <value>Загрузить обработку (отчет) из файла на компьютере</value> </toolTip> <use> <common>true</common> @@ -3064,7 +3081,7 @@ <id>2</id> <toolTip> <key>ru</key> - <value>Выгрузить файл обработки отчета</value> + <value>Выгрузить обработку (отчет) в файл на компьютер</value> </toolTip> <use> <common>true</common> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Help/ru.html index 51f5b399d..07af07be4 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Для <a href="Catalog.ДополнительныеОтчетыИОбработки/Help">дополнительных обработок или отчетов</a>, предназначенных для работы с конкретными объектами, можно определить состав объектов, в которых будут доступны команды обработки или отчета (команда <strong>Назначение обработки</strong>). </p> <p>Команды обработок или отчетов могут быть доступны из списка выбранных объектов, если установлен флаг <strong>Использовать для форм списка</strong> и из формы самого объекта, если установлен флаг <strong>Использовать для форм объекта</strong>. </p> <p>Для обработок и отчетов, которые вызываются из командного интерфейса (не прикрепляются к объектам конфигурации):</p> diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl index b728d5464..49eb20bf2 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Forms/ФормаЭлемента/Module.bsl @@ -50,7 +50,7 @@ АдресРазрешений = ПоместитьВоВременноеХранилище( РеквизитФормыВЗначение("Объект").Разрешения.Выгрузить(), - ЭтаФорма.УникальныйИдентификатор); + ЭтотОбъект.УникальныйИдентификатор); УстановитьВидимостьДоступность(); @@ -61,12 +61,8 @@ КлиентскийКэш = Новый Структура; - Если ЭтоНовый Тогда - - Если НЕ ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(Истина) Тогда - Отказ = Истина; - КонецЕсли; - + Если ЭтоНовый И Не ДиалогЗагрузкиНовогоПройден Тогда + ПодключитьОбработчикОжидания("ПоказатьДиалогВыбораНовогоФайла", 0.1, Истина); КонецЕсли; КонецПроцедуры @@ -192,10 +188,12 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария( - Объект.Комментарий, - Объект.Комментарий, - Модифицированность); + ДополнительныеОтчетыИОбработкиКлиент.РедактироватьМногострочныйТекст( + ЭтотОбъект, + Элемент.ТекстРедактирования, + Объект, + "Комментарий" + ); КонецПроцедуры &НаКлиенте @@ -211,29 +209,24 @@ &НаКлиенте Процедура ВариантыДополнительногоОтчетаПередУдалением(Элемент, Отказ) + Отказ = Истина; Вариант = Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные; Если Вариант = Неопределено Тогда - Отказ = Истина; Возврат; КонецЕсли; Если НЕ Вариант.Пользовательский Тогда - Предупреждение(НСтр("ru = 'Пометка на удаление предопределенного варианта отчета запрещена.'")); - Отказ = Истина; + ПоказатьПредупреждение(, НСтр("ru = 'Пометка на удаление предопределенного варианта отчета запрещена.'")); Возврат; КонецЕсли; - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Пометить ""%1"" на удаление?'"), - Вариант.Наименование); + ТекстВопроса = НСтр("ru = 'Пометить ""%1"" на удаление?'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, Вариант.Наименование); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); - Если Ответ <> КодВозвратаДиалога.Да Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - УдалитьВариантДополнительногоОтчета("ВнешнийОтчет." + Объект.ИмяОбъекта, Вариант.КлючВарианта); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Вариант", Вариант); + Обработчик = Новый ОписаниеОповещения("ВариантыДополнительногоОтчетаПередУдалениемЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); КонецПроцедуры &НаКлиенте @@ -305,47 +298,48 @@ &НаКлиенте Процедура ЗагрузитьФайлОбработкиОтчета(Команда) - ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(Ложь); + ПоказатьДиалогВыбораНовогоФайла(); КонецПроцедуры &НаКлиенте Процедура ВыгрузитьФайлОбработкиОтчета(Команда) - Если НЕ ЭтоАдресВременногоХранилища(АдресДанныхОбработки) Тогда - Предупреждение(НСтр("ru = 'Нет данных для обработки.'")); + Оповещение = Новый ОписаниеОповещения("ВыгрузитьФайлОбработкиОтчетаЗавершение", ЭтотОбъект); + ТекстСообщения = НСтр("ru = 'Для выгрузки внешней обработки (отчета) в файл рекомендуется установить расширение работы с файлами.'"); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьФайлОбработкиОтчетаЗавершение(Результат, Параметры) Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + ПолучитьФайл(АдресДанныхОбработки, Объект.ИмяФайла, Истина); Возврат; КонецЕсли; - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ДиалогСохраненияФайла.ПолноеИмяФайла = Объект.ИмяФайла; - ДиалогСохраненияФайла.Фильтр = ДополнительныеОтчетыИОбработкиКлиентСервер.ФильтрДиалоговВыбораИСохранения(); - ДиалогСохраненияФайла.ИндексФильтра = ?(Объект.Вид = ВидДополнительныйОтчет ИЛИ Объект.Вид = ВидОтчет, 1, 2); - ДиалогСохраненияФайла.МножественныйВыбор = Ложь; - ДиалогСохраненияФайла.Заголовок = НСтр("ru = 'Укажите файл'"); - - Если ДиалогСохраненияФайла.Выбрать() Тогда - ПолучаемыеФайлы = Новый Массив; - ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(, АдресДанныхОбработки)); - ПолученныеФайлы = Новый Массив; - ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, ДиалогСохраненияФайла.ПолноеИмяФайла, Ложь); - КонецЕсли; - - Иначе - - ПолучитьФайл(АдресДанныхОбработки, Объект.ИмяФайла, Истина); - + ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ДиалогСохраненияФайла.ПолноеИмяФайла = Объект.ИмяФайла; + ДиалогСохраненияФайла.Фильтр = ДополнительныеОтчетыИОбработкиКлиентСервер.ФильтрДиалоговВыбораИСохранения(); + ДиалогСохраненияФайла.ИндексФильтра = ?(Объект.Вид = ВидДополнительныйОтчет ИЛИ Объект.Вид = ВидОтчет, 1, 2); + ДиалогСохраненияФайла.МножественныйВыбор = Ложь; + ДиалогСохраненияФайла.Заголовок = НСтр("ru = 'Укажите файл'"); + + Если ДиалогСохраненияФайла.Выбрать() Тогда + ПолучаемыеФайлы = Новый Массив; + ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(, АдресДанныхОбработки)); + ПолученныеФайлы = Новый Массив; + ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, ДиалогСохраненияФайла.ПолноеИмяФайла, Ложь); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВариантыДополнительногоОтчетаОткрыть(Команда) - Вариант = ЭтаФорма.Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные; + Вариант = ЭтотОбъект.Элементы.ВариантыДополнительногоОтчета.ТекущиеДанные; Если Вариант = Неопределено Тогда - Предупреждение(НСтр("ru = 'Выберите вариант отчета.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите вариант отчета.'")); Возврат; КонецЕсли; @@ -363,8 +357,8 @@ КонецЦикла; // Открывает диалог размещения нескольких вариантов отчетов в разделах командного интерфейса. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетовКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВариантыОтчетовКлиент"); МодульВариантыОтчетовКлиент.ОткрытьДиалогРазмещенияВариантовВРазделах(МассивВариантов); КонецЕсли; КонецПроцедуры @@ -384,7 +378,7 @@ ПараметрыФормы.Вставить("Разделы", Разделы); ПараметрыФормы.Вставить("ВидОбработки", Объект.Вид); - ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.ПодборРазделов", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.ПодборРазделов", ПараметрыФормы, ЭтотОбъект); Иначе // Выбор объектов метаданных ПараметрыФормы = ПодготовитьПараметрыФормыВыборОбъектовМетаданных(); @@ -400,180 +394,222 @@ // Клиент &НаКлиенте -Функция ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(ФлагДобавить, ПараметрыРегистрации = Неопределено) +Процедура ПоказатьДиалогВыбораНовогоФайла() + Обработчик = Новый ОписаниеОповещения("ОбработкаРезультатаВыбораНовогоФайла", ЭтотОбъект); - // Выбор файла - Если ПараметрыРегистрации = Неопределено Тогда - ПараметрыРегистрации = Новый Структура("ИмяФайла, ЭтоОтчет, ОтключатьКонфликтующие, Конфликтующие, АдресДанныхОбработки"); - ПараметрыРегистрации.ИмяФайла = ""; - ПараметрыРегистрации.ЭтоОтчет = Неопределено; - ПараметрыРегистрации.ОтключатьКонфликтующие = Ложь; - ПараметрыРегистрации.Конфликтующие = Новый СписокЗначений; - - // Параметры результата выбора - ВыбранноеИмяФайла = ""; - - // Параметры выбора - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ДиалогОткрытияФайла.ПолноеИмяФайла = Объект.ИмяФайла; - ДиалогОткрытияФайла.Фильтр = ДополнительныеОтчетыИОбработкиКлиентСервер.ФильтрДиалоговВыбораИСохранения(); - ДиалогОткрытияФайла.ИндексФильтра = ?(Объект.Ссылка.Пустая(), 0, ?(Объект.Вид = ВидДополнительныйОтчет ИЛИ Объект.Вид = ВидОтчет, 1, 2)); - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите дополнительный отчет или обработку'"); - - ПомещаемыеФайлы = Новый Массив; - ПомещенныеФайлы = Новый Массив; - - Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, ДиалогОткрытияФайла, Истина, УникальныйИдентификатор) Тогда - Возврат Ложь; - КонецЕсли; - - АдресДанныхОбработки = ПомещенныеФайлы[0].Хранение; - ВыбранноеИмяФайла = ПомещенныеФайлы[0].Имя; - - Иначе - - Если НЕ ПоместитьФайл(АдресДанныхОбработки, , ВыбранноеИмяФайла, Истина, УникальныйИдентификатор) Тогда - Возврат Ложь; - КонецЕсли; - - КонецЕсли; - - МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ВыбранноеИмяФайла, "\"); - ПараметрыРегистрации.ИмяФайла = МассивПодстрок.Получить(МассивПодстрок.ВГраница()); - РасширениеФайла = ВРег(Прав(ПараметрыРегистрации.ИмяФайла, 3)); - - Если РасширениеФайла = "ERF" Тогда - ПараметрыРегистрации.ЭтоОтчет = Истина; - ИначеЕсли РасширениеФайла = "EPF" Тогда - ПараметрыРегистрации.ЭтоОтчет = Ложь; - Иначе - Предупреждение(НСтр("ru = 'Расширение файла не соответствует расширению внешнего отчета (ERF) или обработки (EPF).'")); - Возврат Ложь; + ПараметрыДиалога = Новый Структура; + ПараметрыДиалога.Вставить("Режим", РежимДиалогаВыбораФайла.Открытие); + ПараметрыДиалога.Вставить("Фильтр", ДополнительныеОтчетыИОбработкиКлиентСервер.ФильтрДиалоговВыбораИСохранения()); + ПараметрыДиалога.Вставить("ИндексФильтра", ?(Объект.Ссылка.Пустая(), 0, ?(Объект.Вид = ВидДополнительныйОтчет Или Объект.Вид = ВидОтчет, 1, 2))); + ПараметрыДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл внешнего отчета или обработки'")); + + ДополнительныеОтчетыИОбработкиКлиент.ПоказатьПомещениеФайла(Обработчик, УникальныйИдентификатор, Объект.ИмяФайла, ПараметрыДиалога); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаРезультатаВыбораНовогоФайла(ПомещенныеФайлы, ДополнительныеПараметры) Экспорт + Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда + Если ЭтоНовый И Открыта() Тогда + Закрыть(); КонецЕсли; + Возврат; + КонецЕсли; + + АдресДанныхОбработки = ПомещенныеФайлы[0].Хранение; + ВыбранноеИмяФайла = ПомещенныеФайлы[0].Имя; + + ПараметрыРегистрации = Новый Структура("ИмяФайла, ЭтоОтчет, ОтключатьКонфликтующие, Конфликтующие, АдресДанныхОбработки"); + ПараметрыРегистрации.ИмяФайла = ""; + ПараметрыРегистрации.ЭтоОтчет = Неопределено; + ПараметрыРегистрации.ОтключатьКонфликтующие = Ложь; + ПараметрыРегистрации.Конфликтующие = Новый СписокЗначений; + + МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ВыбранноеИмяФайла, "\"); + ПараметрыРегистрации.ИмяФайла = МассивПодстрок.Получить(МассивПодстрок.ВГраница()); + РасширениеФайла = ВРег(Прав(ПараметрыРегистрации.ИмяФайла, 3)); + + Если РасширениеФайла = "ERF" Тогда + ПараметрыРегистрации.ЭтоОтчет = Истина; + ИначеЕсли РасширениеФайла = "EPF" Тогда + ПараметрыРегистрации.ЭтоОтчет = Ложь; + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Расширение файла не соответствует расширению внешнего отчета (ERF) или обработки (EPF).'")); + Возврат; КонецЕсли; - // Вызов сервера ПараметрыРегистрации.АдресДанныхОбработки = АдресДанныхОбработки; - РезультатРегистрации = ЗарегистрироватьОбработку(ПараметрыРегистрации); + + ЗарегистрироватьНаКлиенте(ПараметрыРегистрации); +КонецПроцедуры + +&НаКлиенте +Процедура ЗарегистрироватьНаКлиенте(ПараметрыРегистрации) + + РезультатРегистрации = ЗарегистрироватьНаСервере(ПараметрыРегистрации); + + Если ПараметрыРегистрации.ОтключатьКонфликтующие = Истина Тогда + + // Отключается несколько объектов, потому динамические списки надо обновить + ОповеститьОбИзменении(Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки")); + + КонецЕсли; // Обработка результата работы сервера Если РезультатРегистрации.Успешно = Истина Тогда Модифицированность = Истина; - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл обработки успешно загружен'"), - ?(ЭтоНовый, "", ПолучитьНавигационнуюСсылку(Объект.Ссылка)), - ПараметрыРегистрации.ИмяФайла); - Возврат Истина; + ОповещениеЗаголовок = ?(ПараметрыРегистрации.ЭтоОтчет, НСтр("ru = 'Файл внешнего отчета загружен'"), НСтр("ru = 'Файл внешней обработки загружен'")); + ОповещениеСсылка = ?(ЭтоНовый, "", ПолучитьНавигационнуюСсылку(Объект.Ссылка)); + ОповещениеТекст = ПараметрыРегистрации.ИмяФайла; + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, ОповещениеСсылка, ОповещениеТекст); - КонецЕсли; - - // Разбор причины отказа загрузки обработки и отображение информации пользователю - Если РезультатРегистрации.ИмяОбъектаЗанято = Ложь Тогда - - // Причина отказа в КраткоеПредставлениеОшибки - Предупреждение(РезультатРегистрации.КраткоеПредставлениеОшибки); - Возврат Ложь; - - Иначе - - // Причина отказа - имя объекта занято - ЗаголовокВопроса = НСтр("ru = 'Имя объекта занято'"); - - // Представление занявших объектов - КоличествоКонфликтующих = РезультатРегистрации.Конфликтующие.Количество(); - ПредставлениеЗанявших = ""; - Для Каждого ЭлементСписка Из РезультатРегистрации.Конфликтующие Цикл - ПредставлениеЗанявших = ПредставлениеЗанявших - + ?(ПредставлениеЗанявших = "", "", ", ") - + СокрЛП(ЭлементСписка.Представление); - Если СтрДлина(ПредставлениеЗанявших) > 80 Тогда - ПредставлениеЗанявших = Лев(ПредставлениеЗанявших, 70) - + "... (" - + Формат(КоличествоКонфликтующих, "ЧН=0; ЧГ=") - + " " - + НСтр("ru = 'шт'") - + ")"; - Прервать; - КонецЕсли; - КонецЦикла; - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Имя ""%1"" уже занято другими дополнительными отчетами (обработками): - |%2. - | - |Доступные действия: - |1. ""Продолжить"" - продолжить загрузку, отключив Публикацию текущего отчета (обработки). - |2. ""Отключить конфликтующие"" - продолжить загрузку, отключив Публикацию отчетов (обработок), конфликтующих с загружаемой по имени. - |3. ""Показать конфликтующие"" - отменить загрузку и показать список отчетов (обработок), конфликтующих с загружаемой по имени. - |4. ""Отмена"" - отменить загрузку.'"), - РезультатРегистрации.ИмяОбъекта, - ПредставлениеЗанявших); - - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(1, НСтр("ru = 'Продолжить'")); - КнопкиВопроса.Добавить(2, НСтр("ru = 'Отключить конфликтующие'")); - КнопкиВопроса.Добавить(3, НСтр("ru = 'Показать конфликтующие'")); - КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса, , 1, ЗаголовокВопроса); - Если Ответ = 1 Тогда - - // Продолжить - Объект.Публикация = ДополнительныеОтчетыИОбработкиВызовСервера.ВидПубликацииДляКонфликтующихОбработок(); - - // Повторный вызов сервера (публикация в режиме отладки) и обработка результата - Возврат ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(ФлагДобавить, ПараметрыРегистрации); - - ИначеЕсли Ответ = 2 Тогда - - // Отключить конфликтующие - ПараметрыРегистрации.ОтключатьКонфликтующие = Истина; - ПараметрыРегистрации.Конфликтующие = РезультатРегистрации.Конфликтующие; - - // Повторный вызов сервера (с переводом конфликтующих в режим отладки) и обработка результата - РезультатВторогоЗахода = ОткрытьДиалогЗагрузкиФайлаОбработкиОтчета(ФлагДобавить, ПараметрыРегистрации); - - // Отключается несколько объектов, потому динамические списки надо обновить - ОповеститьОбИзменении(Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки")); - - // Возврат результата вызывающему коду - Возврат РезультатВторогоЗахода; - - ИначеЕсли Ответ = 3 Тогда - - // Показать конфликтующие (отмена далее) - Если КоличествоКонфликтующих = 1 - И ( - ЭтоНовый - ИЛИ РезультатРегистрации.СтароеИмяОбъекта <> РезультатРегистрации.ИмяОбъекта - ) Тогда - - // Форма элемента - ОткрытьЗначение(РезультатРегистрации.Конфликтующие[0].Значение); - - Иначе - - // Форма списка с отбором по конфликтующим - ПараметрыСписка = Новый Структура("Отбор, Заголовок, Отображение"); - ПараметрыСписка.Отбор = Новый Структура("ИмяОбъекта, ЭтоГруппа", РезультатРегистрации.ИмяОбъекта, Ложь); - ПараметрыСписка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Дополнительные отчеты и обработки с именем объекта ""%1""'"), - РезультатРегистрации.ИмяОбъекта); - ПараметрыСписка.Отображение = "Список"; - ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.ФормаСписка", ПараметрыСписка, , Истина); - - КонецЕсли; - + Если Не Открыта() Тогда + ДиалогЗагрузкиНовогоПройден = Истина; + Открыть(); КонецЕсли; + + Иначе + + // Разбор причины отказа загрузки обработки и отображение информации пользователю + Если РезультатРегистрации.ИмяОбъектаЗанято = Истина Тогда + ПоказатьКонфликтыВозникшиеПриЗагрузке(ПараметрыРегистрации, РезультатРегистрации); + Иначе + ПоказатьПредупреждение(, РезультатРегистрации.КраткоеПредставлениеОшибки); + КонецЕсли; + КонецЕсли; - // Отменить загрузку - Возврат Ложь; -КонецФункции +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьКонфликтыВозникшиеПриЗагрузке(ПараметрыРегистрации, РезультатРегистрации) + + // Представление занявших объектов + КоличествоКонфликтующих = РезультатРегистрации.Конфликтующие.Количество(); + ПредставлениеЗанявших = ""; + Для Каждого ЭлементСписка Из РезультатРегистрации.Конфликтующие Цикл + ПредставлениеЗанявших = ПредставлениеЗанявших + + ?(ПредставлениеЗанявших = "", "", ", ") + + СокрЛП(ЭлементСписка.Представление); + Если СтрДлина(ПредставлениеЗанявших) > 80 Тогда + ПредставлениеЗанявших = Лев(ПредставлениеЗанявших, 70) + "... "; + Прервать; + КонецЕсли; + КонецЦикла; + + Если КоличествоКонфликтующих > 1 Тогда + Если ПараметрыРегистрации.ЭтоОтчет Тогда + ЗаголовокВопроса = НСтр("ru = 'Конфликты при загрузке внешнего отчета'"); + ТекстВопроса = НСтр("ru = 'Внутреннее имя отчета ""%1"" уже занято другими дополнительными отчетами (%2): + |%3. + | + |Выберите: + |1. ""Продолжить"" - выполнить загрузку, отключив публикацию этого отчета. + |2. ""Отключить конфликтующие"" - выполнить загрузку, отключив публикацию всех других конфликтующих отчетов. + |3. ""Открыть список"" - отменить загрузку и открыть список конфликтующих отчетов.'"); + ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить конфликтующие отчеты'"); + Иначе + ЗаголовокВопроса = НСтр("ru = 'Конфликты при загрузке внешней обработки'"); + ТекстВопроса = НСтр("ru = 'Внутреннее имя обработки ""%1"" уже занято другими дополнительными обработками (%2): + |%3. + | + |Выберите: + |1. ""Продолжить"" - выполнить загрузку, отключив публикацию этой обработки. + |2. ""Отключить конфликтующие"" - выполнить загрузку, отключив публикацию всех других конфликтующих обработок. + |3. ""Открыть список"" - отменить загрузку и открыть список конфликтующих обработок.'"); + ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить конфликтующие обработки'"); + КонецЕсли; + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, КоличествоКонфликтующих, РезультатРегистрации.ИмяОбъекта, ПредставлениеЗанявших); + ПредставлениеКнопкиОткрыть = НСтр("ru = 'Открыть список'"); + Иначе + Если ПараметрыРегистрации.ЭтоОтчет Тогда + ЗаголовокВопроса = НСтр("ru = 'Конфликт при загрузке внешнего отчета'"); + ТекстВопроса = НСтр("ru = 'Внутреннее имя отчета ""%1"" уже занято другим дополнительным отчетом: + |%2. + | + |Выберите: + |1. ""Продолжить"" - выполнить загрузку, отключив публикацию этого отчета. + |2. ""Отключить другой отчет"" - выполнить загрузку, отключив публикацию другого отчета. + |3. ""Отменить и открыть"" - отменить загрузку и открыть карточку другого отчета.'"); + ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить другой отчет'"); + Иначе + ЗаголовокВопроса = НСтр("ru = 'Конфликт при загрузке внешней обработки'"); + ТекстВопроса = НСтр("ru = 'Внутреннее имя обработки ""%1"" уже занято другой дополнительной обработкой: + |%2. + | + |Выберите: + |1. ""Продолжить"" - выполнить загрузку, отключив публикацию этой обработки. + |2. ""Отключить другую обработку"" - выполнить загрузку, отключив публикацию другой обработки. + |3. ""Отменить и открыть"" - отменить загрузку и открыть карточку другой обработку.'"); + ПредставлениеКнопкиОтключить = НСтр("ru = 'Отключить другую обработку'"); + КонецЕсли; + ПредставлениеКнопкиОткрыть = НСтр("ru = 'Отменить и открыть'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, РезультатРегистрации.ИмяОбъекта, ПредставлениеЗанявших); + КонецЕсли; + + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("ПродолжитьБезПубликации", НСтр("ru = 'Продолжить'")); + КнопкиВопроса.Добавить("ОтключитьКонфликтующие", ПредставлениеКнопкиОтключить); + КнопкиВопроса.Добавить("ОтменитьИОткрыть", НСтр("ru = 'Открыть список'")); + КнопкиВопроса.Добавить(КодВозвратаДиалога.Отмена); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПараметрыРегистрации", ПараметрыРегистрации); + ДополнительныеПараметры.Вставить("РезультатРегистрации", РезультатРегистрации); + ДополнительныеПараметры.Вставить("КоличествоКонфликтующих", КоличествоКонфликтующих); + Обработчик = Новый ОписаниеОповещения("ПоказатьКонфликтыВозникшиеПриЗагрузкеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + ПоказатьВопрос(Обработчик, ТекстВопроса, КнопкиВопроса, , "ПродолжитьБезПубликации", ЗаголовокВопроса); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьКонфликтыВозникшиеПриЗагрузкеЗавершение(Ответ, ДополнительныеПараметры) Экспорт + ПараметрыРегистрации = ДополнительныеПараметры.ПараметрыРегистрации; + РезультатРегистрации = ДополнительныеПараметры.РезультатРегистрации; + + Если Ответ = "ПродолжитьБезПубликации" Тогда + + // Продолжить. + Объект.Публикация = ДополнительныеОтчетыИОбработкиВызовСервера.ВидПубликацииДляКонфликтующихОбработок(); + + // Повторный вызов сервера (публикация в режиме отладки) и обработка результата. + ЗарегистрироватьНаКлиенте(ПараметрыРегистрации); + + ИначеЕсли Ответ = "ОтключитьКонфликтующие" Тогда + + // Отключить конфликтующие. + ПараметрыРегистрации.ОтключатьКонфликтующие = Истина; + ПараметрыРегистрации.Конфликтующие = РезультатРегистрации.Конфликтующие; + + // Повторный вызов сервера (с переводом конфликтующих в режим отладки) и обработка результата. + ЗарегистрироватьНаКлиенте(ПараметрыРегистрации); + + ИначеЕсли Ответ = "ОтменитьИОткрыть" Тогда + + Если ЭтоНовый И РезультатРегистрации.СтароеИмяОбъекта = РезультатРегистрации.ИмяОбъекта Тогда + // В списке будут два элемента - текущий и конфликтующий. + // Это позволит принять решение о том, какой из них отключать. + ПоказатьСписок = Истина; + Иначе + ПоказатьСписок = (ДополнительныеПараметры.КоличествоКонфликтующих > 1); + КонецЕсли; + + Если ПоказатьСписок Тогда // Форма списка с отбором по конфликтующим + ЗаголовокФормы = НСтр("ru = 'Дополнительные отчеты и обработки с внутреннем именем ""%1""'"); + ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%1", РезультатРегистрации.ИмяОбъекта); + ПараметрыФормы = Новый Структура("Отбор, Заголовок, Отображение"); + ПараметрыФормы.Отбор = Новый Структура("ИмяОбъекта, ЭтоГруппа", РезультатРегистрации.ИмяОбъекта, Ложь); + ПараметрыФормы.Заголовок = ЗаголовокФормы; + ПараметрыФормы.Отображение = "Список"; + ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.ФормаСписка", ПараметрыФормы, , Истина); + Иначе // Форма элемента + ПоказатьЗначение(, РезультатРегистрации.Конфликтующие[0].Значение); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры &НаКлиенте Процедура ОткрытьВариант() @@ -583,12 +619,11 @@ КонецЕсли; Если НЕ ЗначениеЗаполнено(Вариант.Ссылка) Тогда - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вариант отчета ""%1"" не зарегистрирован.'"), - Вариант.Наименование)); + ТекстОшибки = НСтр("ru = 'Вариант отчета ""%1"" не зарегистрирован.'"); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Вариант.Наименование); + ПоказатьПредупреждение(, ТекстОшибки); Иначе - ОткрытьЗначение(Вариант.Ссылка); + ПоказатьЗначение(, Вариант.Ссылка); КонецЕсли; КонецПроцедуры @@ -601,13 +636,11 @@ КонецЕсли; Если ЭлементКоманда.ВариантЗапуска <> ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода") - И ЭлементКоманда.ВариантЗапуска <> ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда - Предупреждение( - СтрЗаменить( - НСтр("ru = 'Команда с вариантом запуска ""%1"" - |не может использоваться в регламентных заданиях.'"), - "%1", - Строка(ЭлементКоманда.ВариантЗапуска))); + И ЭлементКоманда.ВариантЗапуска <> ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда + ТекстОшибки = НСтр("ru = 'Команда с вариантом запуска ""%1"" + |не может использоваться в регламентных заданиях.'"); + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, Строка(ЭлементКоманда.ВариантЗапуска)); + ПоказатьПредупреждение(, ТекстОшибки); Если ИзмененФлажок тогда ЭлементКоманда.РегламентноеЗаданиеИспользование = НЕ ЭлементКоманда.РегламентноеЗаданиеИспользование; КонецЕсли; @@ -631,15 +664,25 @@ РасписаниеКоманды = Новый РасписаниеРегламентногоЗадания; КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ЭлементКоманда", ЭлементКоманда); + Обработчик = Новый ОписаниеОповещения("ИзменитьРегламентноеЗаданиеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + РедактированиеРасписания = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеКоманды); - Если НЕ РедактированиеРасписания.ОткрытьМодально() Тогда + РедактированиеРасписания.Показать(Обработчик); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРегламентноеЗаданиеЗавершение(Расписание, ДополнительныеПараметры) Экспорт + Если Расписание = Неопределено Тогда Возврат; КонецЕсли; - РасписаниеКоманды = РедактированиеРасписания.Расписание; + ЭлементКоманда = ДополнительныеПараметры.ЭлементКоманда; ЭлементКоманда.РегламентноеЗаданиеРасписание.Очистить(); - ЭлементКоманда.РегламентноеЗаданиеРасписание.Добавить(РасписаниеКоманды); - ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(РасписаниеКоманды); + ЭлементКоманда.РегламентноеЗаданиеРасписание.Добавить(Расписание); + ЭлементКоманда.РегламентноеЗаданиеПредставление = Строка(Расписание); Если ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеПустогоРасписания() Тогда ЭлементКоманда.РегламентноеЗаданиеПредставление = ПредставлениеОтключенногоРасписания(); @@ -648,7 +691,6 @@ Иначе ЭлементКоманда.РегламентноеЗаданиеИспользование = Истина; КонецЕсли; - КонецПроцедуры &НаКлиенте @@ -669,7 +711,7 @@ ПараметрыФормы.Вставить("ПредставлениеКоманды", ЭлементКоманда.Представление); КлиентскийКэш.Вставить("ИдентификаторСтрокиКоманды", ЭлементКоманда.ПолучитьИдентификатор()); - ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.БыстрыйДоступКДополнительнымОтчетамИОбработкам", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.ДополнительныеОтчетыИОбработки.Форма.БыстрыйДоступКДополнительнымОтчетамИОбработкам", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -702,6 +744,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ВариантыДополнительногоОтчетаПередУдалениемЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + Вариант = ДополнительныеПараметры.Вариант; + УдалитьВариантДополнительногоОтчета("ВнешнийОтчет." + Объект.ИмяОбъекта, Вариант.КлючВарианта); + ВариантыДополнительногоОтчета.Удалить(Вариант); + КонецЕсли; +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент, Сервер @@ -742,22 +793,22 @@ // Вызов сервера, Сервер &НаСервере -Функция ЗарегистрироватьОбработку(ПараметрыРегистрации) +Функция ЗарегистрироватьНаСервере(ПараметрыРегистрации) ОбъектСправочника = РеквизитФормыВЗначение("Объект"); КомандыСохраненные = ОбъектСправочника.Команды.Выгрузить(); - Результат = ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(ОбъектСправочника, ПараметрыРегистрации); - АдресРазрешений = ПоместитьВоВременноеХранилище(ОбъектСправочника.Разрешения.Выгрузить(), ЭтаФорма.УникальныйИдентификатор); + РезультатРегистрации = ДополнительныеОтчетыИОбработки.ЗарегистрироватьОбработку(ОбъектСправочника, ПараметрыРегистрации); + АдресРазрешений = ПоместитьВоВременноеХранилище(ОбъектСправочника.Разрешения.Выгрузить(), ЭтотОбъект.УникальныйИдентификатор); ЗначениеВРеквизитФормы(ОбъектСправочника, "Объект"); - Если Результат.Успешно Тогда + Если РезультатРегистрации.Успешно Тогда ЗаполнитьКоманды(КомандыСохраненные); - РегистрацияОбработки = Результат.Успешно; + РегистрацияОбработки = РезультатРегистрации.Успешно; КонецЕсли; УстановитьВидимостьДоступность(Истина); - Возврат Результат; + Возврат РезультатРегистрации; КонецФункции @@ -765,13 +816,13 @@ Функция ПодготовитьПараметрыФормыВыборОбъектовМетаданных() ФильтрПоОбъектамМетаданных = Новый СписокЗначений; Если Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта; ИначеЕсли Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиОтчеты; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ОтчетыОбъекта; ИначеЕсли Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиПечатныеФормы; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеПечатныеФормыОбъекта; ИначеЕсли Объект.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.СозданиеСвязанныхОбъектов; КонецЕсли; Для Каждого ТипПараметраКоманды Из ОбщаяКоманда.ТипПараметраКоманды.Типы() Цикл ФильтрПоОбъектамМетаданных.Добавить(Метаданные.НайтиПоТипу(ТипПараметраКоманды).ПолноеИмя()); @@ -1057,35 +1108,39 @@ Возврат; КонецПопытки; - ОтчетМетаданные = ВнешнийОбъект.Метаданные(); - СхемаКДМетаданные = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных; - Если СхемаКДМетаданные <> Неопределено Тогда - СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя); - Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл - ВариантСсылка = Неопределено; - КлючВарианта = ВариантНастроекКД.Имя; - ДополнительныеОтчетыИОбработки.ПриОпределенииСсылкиВариантаДополнительногоОтчета(Объект.Ссылка, КлючВарианта, ВариантСсылка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + + ОтчетМетаданные = ВнешнийОбъект.Метаданные(); + СхемаКДМетаданные = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных; + Если СхемаКДМетаданные <> Неопределено Тогда + СхемаКД = ВнешнийОбъект.ПолучитьМакет(СхемаКДМетаданные.Имя); + Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл + КлючВарианта = ВариантНастроекКД.Имя; + ВариантСсылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, КлючВарианта); + Если ВариантСсылка <> Неопределено Тогда + Вариант = ВариантыДополнительногоОтчета.Добавить(); + Вариант.КлючВарианта = КлючВарианта; + Вариант.Наименование = ВариантНастроекКД.Представление; + Вариант.Пользовательский = Ложь; + Вариант.ИндексКартинки = 5; + Вариант.Ссылка = ВариантСсылка; + КонецЕсли; + КонецЦикла; + Иначе + КлючВарианта = ""; + ВариантСсылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, КлючВарианта); Если ВариантСсылка <> Неопределено Тогда Вариант = ВариантыДополнительногоОтчета.Добавить(); Вариант.КлючВарианта = КлючВарианта; - Вариант.Наименование = ВариантНастроекКД.Представление; + Вариант.Наименование = ОтчетМетаданные.Представление(); Вариант.Пользовательский = Ложь; Вариант.ИндексКартинки = 5; Вариант.Ссылка = ВариантСсылка; КонецЕсли; - КонецЦикла; - Иначе - ВариантСсылка = Неопределено; - КлючВарианта = ""; - ДополнительныеОтчетыИОбработки.ПриОпределенииСсылкиВариантаДополнительногоОтчета(Объект.Ссылка, КлючВарианта, ВариантСсылка); - Если ВариантСсылка <> Неопределено Тогда - Вариант = ВариантыДополнительногоОтчета.Добавить(); - Вариант.КлючВарианта = КлючВарианта; - Вариант.Наименование = ОтчетМетаданные.Представление(); - Вариант.Пользовательский = Ложь; - Вариант.ИндексКартинки = 5; - Вариант.Ссылка = ВариантСсылка; КонецЕсли; + Иначе + МодульВариантыОтчетов = Неопределено; КонецЕсли; Если Объект.ИспользуетХранилищеВариантов Тогда @@ -1104,7 +1159,9 @@ Вариант.Наименование = ЭлементСписка.Представление; Вариант.Пользовательский = Истина; Вариант.ИндексКартинки = 3; - ДополнительныеОтчетыИОбработки.ПриОпределенииСсылкиВариантаДополнительногоОтчета(Объект.Ссылка, Вариант.КлючВарианта, Вариант.Ссылка); + Если МодульВариантыОтчетов <> Неопределено Тогда + Вариант.Ссылка = МодульВариантыОтчетов.ПолучитьСсылку(Объект.Ссылка, Вариант.КлючВарианта); + КонецЕсли; КонецЦикла; КонецПроцедуры diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html index fb139144f..ba9310120 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/Help/ru.html @@ -1,3 +1,3 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Для хранения в ИБ дополнительных отчетов и обработок служит справочник <strong>Дополнительные отчеты и обработки</strong>. По команде <strong>Создать</strong> система предложит выбрать файл <a href="v8help://1cv8/ExtRepotrs">внешнего отчета или обработки</a>, и <a href="Catalog.ДополнительныеОтчетыИОбработки.Form.ФормаЭлемента/Help">настроить его параметры</a>.</p> <p>Как разработать дополнительный отчет или обработку см. на <a href="http://its.1c.ru/db/bspdoc#content:22:1:IssOgl1_%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BF%D1%80%D0%B8%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B5%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0">сайте ИТС</a> в разделе "Разработка и администрирование" - "Стандартные библиотеки" - "Библиотека стандартных подсистем" - "3 Настройка и использование подсистем при разработке конфигурации" - "3.13 Дополнительные отчеты и обработки" - "Использование при разработке конфигурации".</p></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl index 15c649433..da0e6250a 100644 --- a/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl +++ b/SSL/src/Catalogs/ДополнительныеОтчетыИОбработки/ObjectModule.bsl @@ -1,5 +1,8 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +Перем УстанавливатьПривилегированныйРежим, ЭтоГлобальнаяОбработка; + + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -104,11 +107,9 @@ КонецЕсли; // Кэш стандартных проверок - ДополнительныеСвойства.Вставить("УстанавливатьПривилегированныйРежим", УстанавливатьПривилегированныйРежим()); - ДополнительныеСвойства.Вставить("ЭтоГлобальнаяОбработка", ДополнительныеОтчетыИОбработки.ПроверитьГлобальнаяОбработка(Вид)); ДополнительныеСвойства.Вставить("ПубликацияИспользуется", Публикация = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Используется); - Если ДополнительныеСвойства.ЭтоГлобальнаяОбработка Тогда + Если ЭтоГлобальнаяОбработка() Тогда Если ПравоНастройкиРасписания() Тогда ПередЗаписьюГлобальнойОбработки(Отказ); КонецЕсли; @@ -134,7 +135,7 @@ РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.ОбновитьДанныеПриЗаписиДополнительногоОбъекта(Ссылка, БыстрыйДоступ); КонецЕсли; - Если ДополнительныеСвойства.ЭтоГлобальнаяОбработка Тогда + Если ЭтоГлобальнаяОбработка() Тогда Если ПравоНастройкиРасписания() Тогда ПриЗаписиГлобальнойОбработки(Отказ); КонецЕсли; @@ -165,6 +166,16 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +Функция ЭтоГлобальнаяОбработка() + + Если ЭтоГлобальнаяОбработка = Неопределено Тогда + ЭтоГлобальнаяОбработка = ДополнительныеОтчетыИОбработки.ПроверитьГлобальнаяОбработка(Вид); + КонецЕсли; + + Возврат ЭтоГлобальнаяОбработка; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Глобальные обработки @@ -180,7 +191,7 @@ ПубликацияВключена = (Публикация <> Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); // Регламентные задание необходимо изменять в неразделенном режиме. - Если ДополнительныеСвойства.УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -249,7 +260,7 @@ ДополнительныеСвойства.Вставить("ЗаданияДляОбновления", ЗаданияДляОбновления); - Если ДополнительныеСвойства.УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Ложь); КонецЕсли; @@ -264,7 +275,7 @@ ПубликацияВключена = (Публикация <> Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); // Регламентные задание необходимо изменять в неразделенном режиме. - Если ДополнительныеСвойства.УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -294,7 +305,7 @@ КонецЦикла; - Если ДополнительныеСвойства.УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Ложь); КонецЕсли; @@ -302,9 +313,7 @@ Процедура ПередУдалениемГлобальнойОбработки(Отказ) // Регламентные задание необходимо изменять в неразделенном режиме. - УстанавливатьПривилегированныйРежим = УстанавливатьПривилегированныйРежим(); - - Если УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Истина); КонецЕсли; @@ -318,7 +327,7 @@ КонецЕсли; КонецЦикла; - Если УстанавливатьПривилегированныйРежим Тогда + Если УстанавливатьПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Ложь); КонецЕсли; @@ -352,8 +361,15 @@ Функция УстанавливатьПривилегированныйРежим() - Возврат РольДоступна(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) - И НЕ ПравоДоступа("Администрирование", Метаданные); + Если УстанавливатьПривилегированныйРежим = Неопределено Тогда + УстанавливатьПривилегированныйРежим = Ложь; + Если РольДоступна(Метаданные.Роли.ДобавлениеИзменениеДополнительныхОтчетовИОбработок) + И Не ПравоДоступа("Администрирование", Метаданные) Тогда + УстанавливатьПривилегированныйРежим = Истина; + КонецЕсли; + КонецЕсли; + + Возврат УстанавливатьПривилегированныйРежим; КонецФункции @@ -393,7 +409,7 @@ Процедура ПриЗаписиГлобальногоОтчета(Отказ) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда Попытка Если ЭтоНовый() Тогда @@ -408,8 +424,8 @@ Возврат; КонецПопытки; - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); - МодульВариантыОтчетов.ОбработкаВариантовДополнительногоОтчета(ЭтотОбъект, Отказ, ВнешнийОбъект); + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриЗаписиДополнительногоОтчета(ЭтотОбъект, Отказ, ВнешнийОбъект); КонецЕсли; diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form index f25a0b1aa..9d763b25e 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаСписка/Form.form @@ -26,8 +26,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>16</id> + <name>НаименованиеExtendedTooltip</name> + <id>7</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -50,6 +50,40 @@ <autoMaxHeight>true</autoMaxHeight> </extInfo> </items> + <items xsi:type="form:FormField"> + <name>Ссылка</name> + <id>8</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible/> + <dataPath xsi:type="form:DataPath"> + <segments>Список.Ref</segments> + </dataPath> + <extendedTooltip> + <name>СсылкаРасширеннаяПодсказка</name> + <id>10</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СсылкаКонтекстноеМеню</name> + <id>9</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> <commandBarLocation>None</commandBarLocation> <autoCommandBar> <name>СписокКоманднаяПанель</name> @@ -58,10 +92,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>7</id> + <id>11</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>9</id> + <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -71,7 +105,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>8</id> + <id>12</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -81,10 +115,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>10</id> + <id>14</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>12</id> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -94,7 +128,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>11</id> + <id>15</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -105,10 +139,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>13</id> + <id>17</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>15</id> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -118,7 +152,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>14</id> + <id>18</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -128,7 +162,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>6</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form index a471697a1..c68dcb75e 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Form.form @@ -9,7 +9,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> + <name>КодExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -50,8 +50,8 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>11</id> + <name>НаименованиеExtendedTooltip</name> + <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -73,7 +73,7 @@ <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <wrap>true</wrap> - <chooseType>true</chooseType> + <dropListButton>true</dropListButton> <typeDomainEnabled>true</typeDomainEnabled> <textEdit>true</textEdit> <textSize>Normal</textSize> @@ -102,8 +102,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КомпоновщикНастроекНастройкиОтборСвойстваЭлементаПользовательскойНастройкиРасширеннаяПодсказка</name> - <id>13</id> + <name>КомпоновщикНастроекНастройкиОтборСвойстваЭлементаПользовательскойНастройкиExtendedTooltip</name> + <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -194,8 +194,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>КомпоновщикНастроекНастройкиОтборРасширеннаяПодсказка</name> - <id>14</id> + <name>КомпоновщикНастроекНастройкиОтборExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html index ca05edf0d..d684331f0 100644 --- a/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ЗакладкиВзаимодействий/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <h1>Закладка взаимодействий</h1> <p style="MARGIN-LEFT: 0px">Справочник <b>Закладки взаимодействий</b> предназначен для настройки и хранения отборов, по которым в дальнейшем можно осуществлять быстрый доступ к группе взаимодействий.</p> <p style="MARGIN-TOP: 0px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 20px"><a href="#70a6370b13ca43baa611bed9691c461119059afee61f135f174b11e300c4cc0dda01">Что необходимо указать в данной форме?</a></p><a name="70a6370b13ca43baa611bed9691c461119059afee61f135f174b11e300c4cc0dda01"> diff --git a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss index 060fd7fe7..dfff02937 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss @@ -41,4 +41,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form index 667997a3f..6f802cabc 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ВсеЗаметки/Form.form @@ -31,7 +31,7 @@ <name>ФильтрПоЦветуПриИзменении</name> </handlers> <extendedTooltip> - <name>ФильтрПоЦветуРасширеннаяПодсказка</name> + <name>ФильтрПоЦветуExtendedTooltip</name> <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -56,8 +56,6 @@ <autoMaxHeight>true</autoMaxHeight> <horizontalStretch>false</horizontalStretch> <wrap>true</wrap> - <choiceListButton>true</choiceListButton> - <choiceButton>false</choiceButton> <clearButton>true</clearButton> <listChoiceMode>true</listChoiceMode> <chooseType>true</chooseType> @@ -124,8 +122,8 @@ <name>ФильтрПоПредметуПриИзменении</name> </handlers> <extendedTooltip> - <name>ФильтрПоПредметуРасширеннаяПодсказка</name> - <id>37</id> + <name>ФильтрПоПредметуExtendedTooltip</name> + <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -153,8 +151,7 @@ <autoMaxHeight>true</autoMaxHeight> <horizontalStretch>false</horizontalStretch> <wrap>true</wrap> - <choiceListButton>true</choiceListButton> - <choiceButton>false</choiceButton> + <dropListButton>true</dropListButton> <clearButton>true</clearButton> <typeDomainEnabled>true</typeDomainEnabled> <textEdit>true</textEdit> @@ -182,8 +179,8 @@ <name>ПоказыватьУдаленныеПриИзменении</name> </handlers> <extendedTooltip> - <name>ПоказыватьУдаленныеРасширеннаяПодсказка</name> - <id>39</id> + <name>ПоказыватьУдаленныеExtendedTooltip</name> + <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -217,7 +214,7 @@ <value>Фильтры</value> </toolTip> <extendedTooltip> - <name>ФильтрыРасширеннаяПодсказка</name> + <name>ФильтрыExtendedTooltip</name> <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -252,8 +249,8 @@ <value>Командная панель</value> </toolTip> <extendedTooltip> - <name>КоманднаяПанельРасширеннаяПодсказка</name> - <id>41</id> + <name>КоманднаяПанельExtendedTooltip</name> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -296,8 +293,8 @@ <segments>Список.Description</segments> </dataPath> <extendedTooltip> - <name>ТемаРасширеннаяПодсказка</name> - <id>52</id> + <name>ТемаExtendedTooltip</name> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -332,8 +329,8 @@ <segments>Список.ПредставлениеПредмета</segments> </dataPath> <extendedTooltip> - <name>ПредметРасширеннаяПодсказка</name> - <id>54</id> + <name>ПредметExtendedTooltip</name> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -368,8 +365,8 @@ <segments>Список.ДатаИзменения</segments> </dataPath> <extendedTooltip> - <name>ДатаИзмененияРасширеннаяПодсказка</name> - <id>56</id> + <name>ДатаИзмененияExtendedTooltip</name> + <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -400,32 +397,9 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>43</id> - <extendedTooltip> - <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>45</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>44</id> - <autoFill>true</autoFill> - </contextMenu> - <source>Список</source> - <extInfo xsi:type="form:SearchStringAdditionExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - </extInfo> - </searchStringAddition> - <viewStatusAddition> - <name>СписокСостояниеПросмотра</name> <id>46</id> <extendedTooltip> - <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> + <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> <id>48</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -435,10 +409,33 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокСостояниеПросмотраКонтекстноеМеню</name> + <name>СписокСтрокаПоискаКонтекстноеМеню</name> <id>47</id> <autoFill>true</autoFill> </contextMenu> + <source>Список</source> + <extInfo xsi:type="form:SearchStringAdditionExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + </extInfo> + </searchStringAddition> + <viewStatusAddition> + <name>СписокСостояниеПросмотра</name> + <id>49</id> + <extendedTooltip> + <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> + <id>51</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СписокСостояниеПросмотраКонтекстноеМеню</name> + <id>50</id> + <autoFill>true</autoFill> + </contextMenu> <type>ViewStatusAddition</type> <source>Список</source> <extInfo xsi:type="form:ViewStatusAdditionExtInfo"> @@ -447,10 +444,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>49</id> + <id>52</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>51</id> + <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -460,7 +457,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>50</id> + <id>53</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -470,8 +467,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> - <id>42</id> + <name>СписокExtendedTooltip</name> + <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss index d46a2a2c2..2e8e87233 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Attributes/Список/ExtInfo/ListSettings.dcss @@ -36,4 +36,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form index b8f4454e0..7588d389f 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ЗаметкиПоПредмету/Form.form @@ -40,8 +40,8 @@ <segments>Список.Ref</segments> </dataPath> <extendedTooltip> - <name>СсылкаРасширеннаяПодсказка</name> - <id>44</id> + <name>СсылкаExtendedTooltip</name> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -76,8 +76,8 @@ <segments>Список.СрокИсполнения</segments> </dataPath> <extendedTooltip> - <name>СрокИсполненияРасширеннаяПодсказка</name> - <id>46</id> + <name>СрокИсполненияExtendedTooltip</name> + <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -115,8 +115,8 @@ <segments>Список.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>48</id> + <name>АвторExtendedTooltip</name> + <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -148,10 +148,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>35</id> + <id>41</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>37</id> + <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -161,7 +161,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>36</id> + <id>42</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -171,10 +171,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>38</id> + <id>44</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>40</id> + <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -184,7 +184,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>39</id> + <id>45</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -195,10 +195,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>41</id> + <id>47</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>43</id> + <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -208,7 +208,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>42</id> + <id>48</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -218,7 +218,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -295,8 +295,8 @@ <name>ПоказыватьЗаметкиДругихПользователейПриИзменении</name> </handlers> <extendedTooltip> - <name>ПоказыватьЗаметкиДругихПользователейРасширеннаяПодсказка</name> - <id>59</id> + <name>ПоказыватьЗаметкиДругихПользователейExtendedTooltip</name> + <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -333,8 +333,8 @@ <name>ПоказыватьУдаленныеПриИзменении</name> </handlers> <extendedTooltip> - <name>ПоказыватьУдаленныеРасширеннаяПодсказка</name> - <id>61</id> + <name>ПоказыватьУдаленныеExtendedTooltip</name> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -368,8 +368,8 @@ <value>Фильтры</value> </toolTip> <extendedTooltip> - <name>ФильтрыРасширеннаяПодсказка</name> - <id>58</id> + <name>ФильтрыExtendedTooltip</name> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -402,7 +402,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СоздатьРасширеннаяПодсказка</name> + <name>СоздатьExtendedTooltip</name> <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -439,7 +439,7 @@ <value>Стандартные команды</value> </toolTip> <extendedTooltip> - <name>СтандартныеКомандыРасширеннаяПодсказка</name> + <name>СтандартныеКомандыExtendedTooltip</name> <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -461,7 +461,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss index dc49b59dc..1c3ed0ed1 100644 --- a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Attributes/Список/ExtInfo/ListSettings.dcss @@ -36,4 +36,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form index 5864052e7..fedaeba4a 100644 --- a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Form.form @@ -48,8 +48,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>ПредставлениеЗаметкиРасширеннаяПодсказка</name> - <id>22</id> + <name>ПредставлениеЗаметкиExtendedTooltip</name> + <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -86,8 +86,8 @@ <segments>Список.ПредставлениеПредмета</segments> </dataPath> <extendedTooltip> - <name>ПредставлениеПредметаРасширеннаяПодсказка</name> - <id>24</id> + <name>ПредставлениеПредметаExtendedTooltip</name> + <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -127,8 +127,8 @@ <width>5</width> <horizontalStretch>false</horizontalStretch> <extendedTooltip> - <name>СодержаниеРасширеннаяПодсказка</name> - <id>21</id> + <name>СодержаниеExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -152,32 +152,9 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>12</id> - <extendedTooltip> - <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>14</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>13</id> - <autoFill>true</autoFill> - </contextMenu> - <source>Список</source> - <extInfo xsi:type="form:SearchStringAdditionExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - </extInfo> - </searchStringAddition> - <viewStatusAddition> - <name>СписокСостояниеПросмотра</name> <id>15</id> <extendedTooltip> - <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> + <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -187,10 +164,33 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СписокСостояниеПросмотраКонтекстноеМеню</name> + <name>СписокСтрокаПоискаКонтекстноеМеню</name> <id>16</id> <autoFill>true</autoFill> </contextMenu> + <source>Список</source> + <extInfo xsi:type="form:SearchStringAdditionExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + </extInfo> + </searchStringAddition> + <viewStatusAddition> + <name>СписокСостояниеПросмотра</name> + <id>18</id> + <extendedTooltip> + <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> + <id>20</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СписокСостояниеПросмотраКонтекстноеМеню</name> + <id>19</id> + <autoFill>true</autoFill> + </contextMenu> <type>ViewStatusAddition</type> <source>Список</source> <extInfo xsi:type="form:ViewStatusAdditionExtInfo"> @@ -199,10 +199,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>18</id> + <id>21</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>20</id> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -212,7 +212,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>19</id> + <id>22</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -222,7 +222,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Module.bsl b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Module.bsl index c4be80208..2caa7c04f 100644 --- a/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Module.bsl +++ b/SSL/src/Catalogs/Заметки/Forms/МоиЗаметки/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Тогда + Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Form.form index 96df107f1..8aebfb220 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ФормаГруппы/Form.form @@ -9,7 +9,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> + <name>КодExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -50,8 +50,8 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>11</id> + <name>НаименованиеExtendedTooltip</name> + <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -92,8 +92,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>13</id> + <name>РодительExtendedTooltip</name> + <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -136,8 +136,8 @@ <segments>Объект.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>15</id> + <name>АвторExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form index 5b1f50f84..aacbf7eeb 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Form.form @@ -19,7 +19,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьПредметРасширеннаяПодсказка</name> + <name>НадписьПредметExtendedTooltip</name> <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -57,7 +57,7 @@ <value>Предмет, по которому сделана заметка</value> </toolTip> <extendedTooltip> - <name>ПредметРасширеннаяПодсказка</name> + <name>ПредметExtendedTooltip</name> <id>111</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -101,7 +101,7 @@ <value>Группа предмет</value> </toolTip> <extendedTooltip> - <name>ГруппаПредметРасширеннаяПодсказка</name> + <name>ГруппаПредметExtendedTooltip</name> <id>109</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -129,7 +129,7 @@ <value>Содержание заметки</value> </toolTip> <extendedTooltip> - <name>СодержаниеЗаметкиРасширеннаяПодсказка</name> + <name>СодержаниеЗаметкиExtendedTooltip</name> <id>108</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -170,7 +170,7 @@ <value>Текст заметки</value> </toolTip> <extendedTooltip> - <name>СодержаниеРасширеннаяПодсказка</name> + <name>СодержаниеExtendedTooltip</name> <id>112</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -218,8 +218,8 @@ </dataPath> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>ОтображатьНаРабочемСтолеРасширеннаяПодсказка</name> - <id>115</id> + <name>ОтображатьНаРабочемСтолеExtendedTooltip</name> + <id>114</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -255,8 +255,8 @@ <segments>Объект.Пометка</segments> </dataPath> <extendedTooltip> - <name>ПометкаРасширеннаяПодсказка</name> - <id>117</id> + <name>ПометкаExtendedTooltip</name> + <id>115</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -298,8 +298,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>ГруппаЗаметокРасширеннаяПодсказка</name> - <id>119</id> + <name>ГруппаЗаметокExtendedTooltip</name> + <id>116</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -342,8 +342,8 @@ <value>Параметры отображения</value> </toolTip> <extendedTooltip> - <name>ПараметрыОтображенияРасширеннаяПодсказка</name> - <id>114</id> + <name>ПараметрыОтображенияExtendedTooltip</name> + <id>113</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -376,8 +376,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьАвторРасширеннаяПодсказка</name> - <id>122</id> + <name>НадписьАвторExtendedTooltip</name> + <id>118</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -414,8 +414,8 @@ <value>Автор заметки</value> </toolTip> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>123</id> + <name>АвторExtendedTooltip</name> + <id>119</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -454,8 +454,8 @@ <value>Информация об авторе</value> </toolTip> <extendedTooltip> - <name>ИнформацияОбАвтореРасширеннаяПодсказка</name> - <id>121</id> + <name>ИнформацияОбАвтореExtendedTooltip</name> + <id>117</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -485,8 +485,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДатаЗаметкиРасширеннаяПодсказка</name> - <id>124</id> + <name>ДатаЗаметкиExtendedTooltip</name> + <id>120</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -529,7 +529,7 @@ <value>Командная панель редактирования</value> </toolTip> <extendedTooltip> - <name>КоманднаяПанельРедактированияРасширеннаяПодсказка</name> + <name>КоманднаяПанельРедактированияExtendedTooltip</name> <id>107</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Module.bsl index 17cdb6f26..0a1f34721 100644 --- a/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Заметки/Forms/ФормаЭлемента/Module.bsl @@ -57,12 +57,12 @@ &НаКлиенте Процедура ПредметНажатие(Элемент) - ОткрытьЗначение(Объект.Предмет); + ПоказатьЗначение(,Объект.Предмет); КонецПроцедуры &НаКлиенте Процедура АвторНажатие(Элемент) - ОткрытьЗначение(Объект.Автор); + ПоказатьЗначение(,Объект.Автор); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/Заметки/ObjectModule.bsl b/SSL/src/Catalogs/Заметки/ObjectModule.bsl index 23b50ef82..2c064d3f7 100644 --- a/SSL/src/Catalogs/Заметки/ObjectModule.bsl +++ b/SSL/src/Catalogs/Заметки/ObjectModule.bsl @@ -7,7 +7,10 @@ Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; - + Если ДополнительныеСвойства.Свойство("ПометкаУдаленияЗаметки") И ДополнительныеСвойства.ПометкаУдаленияЗаметки Тогда + Возврат; + КонецЕсли; + Если ЗначениеЗаполнено(Родитель) И Родитель.Автор <> Автор Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Нельзя указывать группу другого пользователя.'")); Отказ = Истина; diff --git a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo index bd8b9b91a..c2835885e 100644 --- a/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЗапланированноеВзаимодействиеПрисоединенныеФайлы/ЗапланированноеВзаимодействиеПрисоединенныеФайлы.mdo @@ -288,7 +288,7 @@ <dataHistory>Use</dataHistory> </attributes> <attributes uuid="03f68d82-752c-45d1-bf9a-60ecd21a2c81"> - <name>ПодписанЭЦП</name> + <name>ПодписанЭП</name> <synonym> <key>ru</key> <value>Подписан ЭП</value> @@ -298,7 +298,7 @@ </type> <toolTip> <key>ru</key> - <value>Флажок, означающий что файл подписан с помощью ЭП</value> + <value>Признак того, что файл подписан с помощью ЭП</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -502,10 +502,10 @@ <objectType typeId="1b7212d4-9fe7-4c96-a6a3-1c96923226e8" valueTypeId="ba1c67fe-ded1-4324-b58a-1ccc00144598"/> <rowType typeId="ddebcaba-7b67-4969-bf3c-2afda7d7ffe0" valueTypeId="ada1f59b-cfc3-45a5-bae9-5938be1bbf5a"/> </producedTypes> - <name>ЭлектронныеЦифровыеПодписи</name> + <name>ЭлектронныеПодписи</name> <synonym> <key>ru</key> - <value>Электронные подписи</value> + <value>электронные подписи</value> </synonym> <toolTip> <key>ru</key> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Form.form index aee5f6f17..3e7f3459b 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаГруппы/Form.form @@ -20,7 +20,7 @@ <value>Группа значений свойства объектов.</value> </toolTip> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>7</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -65,8 +65,8 @@ <value>Вышестоящая группа значений свойства объектов.</value> </toolTip> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>9</id> + <name>РодительExtendedTooltip</name> + <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -111,8 +111,8 @@ <segments>Объект.Owner</segments> </dataPath> <extendedTooltip> - <name>ВладелецРасширеннаяПодсказка</name> - <id>11</id> + <name>ВладелецExtendedTooltip</name> + <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form index 1feb885a9..92812e8c3 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Form.form @@ -15,7 +15,7 @@ <name>СвойствоПриИзменении</name> </handlers> <extendedTooltip> - <name>СвойствоРасширеннаяПодсказка</name> + <name>СвойствоExtendedTooltip</name> <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -75,8 +75,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>43</id> + <name>НаименованиеExtendedTooltip</name> + <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -103,6 +103,42 @@ <textSize>Normal</textSize> </extInfo> </items> + <items xsi:type="form:FormField"> + <name>Вес</name> + <id>35</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.Вес</segments> + </dataPath> + <extendedTooltip> + <name>ВесРасширеннаяПодсказка</name> + <id>37</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ВесКонтекстноеМеню</name> + <id>36</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> <items xsi:type="form:FormField"> <name>Владелец</name> <id>8</id> @@ -119,8 +155,8 @@ <segments>Список.Owner</segments> </dataPath> <extendedTooltip> - <name>ВладелецРасширеннаяПодсказка</name> - <id>45</id> + <name>ВладелецExtendedTooltip</name> + <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -160,10 +196,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>34</id> + <id>39</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>36</id> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -173,7 +209,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>35</id> + <id>40</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -183,10 +219,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>37</id> + <id>42</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>39</id> + <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -196,7 +232,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>38</id> + <id>43</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -207,10 +243,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>40</id> + <id>45</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>42</id> + <id>47</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -220,7 +256,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>41</id> + <id>46</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -230,8 +266,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> - <id>33</id> + <name>СписокExtendedTooltip</name> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -294,7 +330,7 @@ </userVisible> <defaultItem>true</defaultItem> <extendedTooltip> - <name>ФормаВыбратьРасширеннаяПодсказка</name> + <name>ФормаВыбратьExtendedTooltip</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -320,7 +356,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСоздатьРасширеннаяПодсказка</name> + <name>ФормаСоздатьExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -346,7 +382,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСоздатьГруппуРасширеннаяПодсказка</name> + <name>ФормаСоздатьГруппуExtendedTooltip</name> <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -372,7 +408,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСкопироватьРасширеннаяПодсказка</name> + <name>ФормаСкопироватьExtendedTooltip</name> <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -398,7 +434,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаИзменитьРасширеннаяПодсказка</name> + <name>ФормаИзменитьExtendedTooltip</name> <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -432,7 +468,7 @@ <value>Команды формы</value> </toolTip> <extendedTooltip> - <name>КомандыФормыРасширеннаяПодсказка</name> + <name>КомандыФормыExtendedTooltip</name> <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -454,7 +490,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl index 071877c8a..71e5e84a3 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаСписка/Module.bsl @@ -124,12 +124,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); @@ -242,7 +238,7 @@ Элементы.Список.Отображение = ОтображениеТаблицы.ИерархическийСписок; Элементы.Владелец.Видимость = Ложь; - Элементы.Список.Шапка = Ложь; + Элементы.Вес.Видимость = ДополнительныеЗначенияСВесом; Иначе ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка( Список, "Владелец"); @@ -250,7 +246,9 @@ Элементы.Список.Отображение = ОтображениеТаблицы.Список; Элементы.Список.ИзменятьСоставСтрок = Ложь; Элементы.Владелец.Видимость = Истина; - Элементы.Список.Шапка = Истина; + Элементы.Вес.Видимость = Ложь; КонецЕсли; + Элементы.Список.Шапка = Элементы.Владелец.Видимость Или Элементы.Вес.Видимость; + КонецПроцедуры diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form index f46472ac8..13078a408 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -52,8 +52,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>11</id> + <name>РодительExtendedTooltip</name> + <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -89,6 +89,7 @@ <items xsi:type="form:FormField"> <name>Вес</name> <id>7</id> + <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> @@ -97,8 +98,8 @@ <segments>Объект.Вес</segments> </dataPath> <extendedTooltip> - <name>ВесРасширеннаяПодсказка</name> - <id>13</id> + <name>ВесExtendedTooltip</name> + <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -137,8 +138,8 @@ <segments>Объект.Owner</segments> </dataPath> <extendedTooltip> - <name>ВладелецРасширеннаяПодсказка</name> - <id>15</id> + <name>ВладелецExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl index 374cb5f6f..634296829 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Forms/ФормаЭлемента/Module.bsl @@ -20,13 +20,26 @@ КонецЕсли; Если ТипЗнч(Параметры.ПоказатьВес) = Тип("Булево") Тогда - Если Параметры.ПоказатьВес Тогда - Элементы.Вес.Видимость = Истина; + ПоказатьВес = Параметры.ПоказатьВес; + Иначе + РеквизитыСвойства = ОбщегоНазначения.ПолучитьЗначенияРеквизитов( + Объект.Владелец, "ДополнительныеЗначенияСВесом, ВладелецДополнительныхЗначений"); + + Если ЗначениеЗаполнено(РеквизитыСвойства.ВладелецДополнительныхЗначений) Тогда + ПоказатьВес = ОбщегоНазначения.ПолучитьЗначениеРеквизита( + РеквизитыСвойства.ВладелецДополнительныхЗначений, "ДополнительныеЗначенияСВесом"); Иначе - Объект.Вес = 0; + ПоказатьВес = РеквизитыСвойства.ДополнительныеЗначенияСВесом; КонецЕсли; КонецЕсли; + Если ПоказатьВес = Истина Тогда + Элементы.Вес.Видимость = Истина; + Иначе + Элементы.Вес.Видимость = Ложь; + Объект.Вес = 0; + КонецЕсли; + УстановитьЗаголовок(); КонецПроцедуры @@ -35,7 +48,7 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "Изменение_ЗначениеХарактеризуетсяВесовымКоэффициентом" - И Источник = Объект.Свойство Тогда + И Источник = Объект.Владелец Тогда Если Параметр = Истина Тогда Элементы.Вес.Видимость = Истина; diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html index 348c74a6b..a3647efcb 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>В списке <strong>Значения свойств объектов</strong> задаются значения <a href="ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения/Help">дополнительных реквизитов и сведений</a>. При этом для каждого дополнительного реквизита или сведения список значений будет свой. Если список значений большой, то может быть удобно создать группы и разнести значения по ним.</p> <p>При формировании списка значений можно указать не только наименование в поле <strong>Значение</strong>, но и указать <strong>Вес</strong> значения (числовое поле). Это поле в дальнейшем можно использовать для анализа в отчетах. Логику использования этого поля пользователю необходимо продумывать самостоятельно. Например, для значений свойства Надежность можно задать вес следующим образом: для значений от единицы до тройки поставить вес равным нулю, а для значений четыре и пять равным единице. При таких весах в отчет можно быстро вывести надежных клиентов (у которых вес значения больше нуля).</p> <p> </p></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl new file mode 100644 index 000000000..2732b6327 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектов/ManagerModule.bsl @@ -0,0 +1,19 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Родитель"); + РедактируемыеРеквизиты.Добавить("ПометкаУдаления"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form index c0690a719..10c2a3d4a 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Form.form @@ -15,7 +15,7 @@ <name>СвойствоПриИзменении</name> </handlers> <extendedTooltip> - <name>СвойствоРасширеннаяПодсказка</name> + <name>СвойствоExtendedTooltip</name> <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -75,8 +75,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>42</id> + <name>НаименованиеExtendedTooltip</name> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -103,9 +103,46 @@ <textSize>Normal</textSize> </extInfo> </items> + <items xsi:type="form:FormField"> + <name>Вес</name> + <id>34</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>Список.Вес</segments> + </dataPath> + <extendedTooltip> + <name>ВесРасширеннаяПодсказка</name> + <id>36</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ВесКонтекстноеМеню</name> + <id>35</id> + <autoFill>true</autoFill> + </contextMenu> + <type>LabelField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:LabelFieldExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + </extInfo> + </items> <items xsi:type="form:FormField"> <name>Владелец</name> <id>8</id> + <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> @@ -114,8 +151,8 @@ <segments>Список.Owner</segments> </dataPath> <extendedTooltip> - <name>ВладелецРасширеннаяПодсказка</name> - <id>44</id> + <name>ВладелецExtendedTooltip</name> + <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -151,10 +188,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>33</id> + <id>38</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>35</id> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -164,7 +201,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>34</id> + <id>39</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -174,10 +211,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>36</id> + <id>41</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>38</id> + <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -187,7 +224,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>37</id> + <id>42</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -198,10 +235,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>39</id> + <id>44</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>41</id> + <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -211,7 +248,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>40</id> + <id>45</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -221,8 +258,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> - <id>32</id> + <name>СписокExtendedTooltip</name> + <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -285,7 +322,7 @@ </userVisible> <defaultItem>true</defaultItem> <extendedTooltip> - <name>ФормаВыбратьРасширеннаяПодсказка</name> + <name>ФормаВыбратьExtendedTooltip</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -311,7 +348,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСоздатьРасширеннаяПодсказка</name> + <name>ФормаСоздатьExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -337,7 +374,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСкопироватьРасширеннаяПодсказка</name> + <name>ФормаСкопироватьExtendedTooltip</name> <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -363,7 +400,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаИзменитьРасширеннаяПодсказка</name> + <name>ФормаИзменитьExtendedTooltip</name> <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -397,7 +434,7 @@ <value>Команды формы</value> </toolTip> <extendedTooltip> - <name>КомандыФормыРасширеннаяПодсказка</name> + <name>КомандыФормыExtendedTooltip</name> <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -419,7 +456,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Module.bsl index 1b4870874..feb9f6cbc 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаСписка/Module.bsl @@ -83,12 +83,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); @@ -187,7 +183,7 @@ Элементы.Список.Отображение = ОтображениеТаблицы.ИерархическийСписок; Элементы.Владелец.Видимость = Ложь; - Элементы.Список.Шапка = Ложь; + Элементы.Вес.Видимость = ДополнительныеЗначенияСВесом; Иначе ОбщегоНазначенияКлиентСервер.УдалитьЭлементыГруппыОтбораДинамическогоСписка( Список, "Владелец"); @@ -195,7 +191,9 @@ Элементы.Список.Отображение = ОтображениеТаблицы.Список; Элементы.Список.ИзменятьСоставСтрок = Ложь; Элементы.Владелец.Видимость = Истина; - Элементы.Список.Шапка = Истина; + Элементы.Вес.Видимость = Ложь; КонецЕсли; + Элементы.Список.Шапка = Элементы.Владелец.Видимость Или Элементы.Вес.Видимость; + КонецПроцедуры diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Form.form index 2e46b34ba..167d67592 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -52,8 +52,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>11</id> + <name>РодительExtendedTooltip</name> + <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -83,6 +83,7 @@ <items xsi:type="form:FormField"> <name>Вес</name> <id>7</id> + <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> @@ -91,8 +92,8 @@ <segments>Объект.Вес</segments> </dataPath> <extendedTooltip> - <name>ВесРасширеннаяПодсказка</name> - <id>13</id> + <name>ВесExtendedTooltip</name> + <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -131,8 +132,8 @@ <segments>Объект.Owner</segments> </dataPath> <extendedTooltip> - <name>ВладелецРасширеннаяПодсказка</name> - <id>15</id> + <name>ВладелецExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl index e9016e1c6..a051daa66 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Forms/ФормаЭлемента/Module.bsl @@ -20,13 +20,26 @@ КонецЕсли; Если ТипЗнч(Параметры.ПоказатьВес) = Тип("Булево") Тогда - Если Параметры.ПоказатьВес Тогда - Элементы.Вес.Видимость = Истина; + ПоказатьВес = Параметры.ПоказатьВес; + Иначе + РеквизитыСвойства = ОбщегоНазначения.ПолучитьЗначенияРеквизитов( + Объект.Владелец, "ДополнительныеЗначенияСВесом, ВладелецДополнительныхЗначений"); + + Если ЗначениеЗаполнено(РеквизитыСвойства.ВладелецДополнительныхЗначений) Тогда + ПоказатьВес = ОбщегоНазначения.ПолучитьЗначениеРеквизита( + РеквизитыСвойства.ВладелецДополнительныхЗначений, "ДополнительныеЗначенияСВесом"); Иначе - Объект.Вес = 0; + ПоказатьВес = РеквизитыСвойства.ДополнительныеЗначенияСВесом; КонецЕсли; КонецЕсли; + Если ПоказатьВес = Истина Тогда + Элементы.Вес.Видимость = Истина; + Иначе + Элементы.Вес.Видимость = Ложь; + Объект.Вес = 0; + КонецЕсли; + УстановитьЗаголовок(); КонецПроцедуры @@ -35,7 +48,7 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Если ИмяСобытия = "Изменение_ЗначениеХарактеризуетсяВесовымКоэффициентом" - И Источник = Объект.Свойство Тогда + И Источник = Объект.Владелец Тогда Если Параметр = Истина Тогда Элементы.Вес.Видимость = Истина; diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Help/ru.html b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Help/ru.html index 8839485eb..cf394ed4b 100644 --- a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Help/ru.html +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>В списке <strong>Значения свойств объектов (иерархия)</strong> задаются значения <a href="ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения/Help">дополнительных реквизитов и сведений</a>. При этом для каждого дополнительного реквизита или сведения список значений будет свой. В списке можно использовать иерархию значений.</p> <p>При формировании списка значений можно указать не только наименование в поле <strong>Значение</strong>, но и указать <strong>Вес</strong> значения (числовое поле). Это поле в дальнейшем можно использовать для анализа в отчетах. Логику использования этого поля пользователю необходимо продумывать самостоятельно. Например, для значений свойства Надежность можно задать вес следующим образом: для значений от единицы до тройки поставить вес равным нулю, а для значений четыре и пять равным единице. При таких весах в отчет можно быстро вывести надежных клиентов (у которых вес значения больше нуля).</p> <p> </p></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl new file mode 100644 index 000000000..2732b6327 --- /dev/null +++ b/SSL/src/Catalogs/ЗначенияСвойствОбъектовИерархия/ManagerModule.bsl @@ -0,0 +1,19 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Родитель"); + РедактируемыеРеквизиты.Добавить("ПометкаУдаления"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form index d1e775c89..11272f30f 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Form.form @@ -30,8 +30,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>СинонимРасширеннаяПодсказка</name> - <id>25</id> + <name>СинонимExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -64,8 +64,8 @@ <segments>Список.ПолноеИмя</segments> </dataPath> <extendedTooltip> - <name>ПолноеИмяРасширеннаяПодсказка</name> - <id>27</id> + <name>ПолноеИмяExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -100,10 +100,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>16</id> + <id>18</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>18</id> + <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -113,7 +113,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>17</id> + <id>19</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -123,10 +123,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>19</id> + <id>21</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>21</id> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -136,7 +136,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>20</id> + <id>22</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -147,10 +147,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>22</id> + <id>24</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>24</id> + <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -160,7 +160,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>23</id> + <id>25</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -170,7 +170,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Module.bsl index 6741dfa0d..27837329e 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаСписка/Module.bsl @@ -51,8 +51,9 @@ Элемент.ТекущаяСтрока = ТекущаяСтрока; КонецЕсли; Иначе - Предупреждение(НСтр("ru = 'Невозможно выбрать группу объектов метаданных. - |Выберите объект метаданных.'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Невозможно выбрать группу объектов метаданных. + |Выберите объект метаданных.'")); КонецЕсли; КонецЕсли; @@ -65,12 +66,8 @@ Процедура УпорядочитьИОформитьСписок() // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form index 2efa57208..ddb861a21 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Form.form @@ -13,7 +13,7 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -59,8 +59,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>ИмяРасширеннаяПодсказка</name> - <id>36</id> + <name>ИмяExtendedTooltip</name> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -102,8 +102,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>СинонимРасширеннаяПодсказка</name> - <id>38</id> + <name>СинонимExtendedTooltip</name> + <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -146,8 +146,8 @@ <value>Имя и синоним объекта метаданных</value> </toolTip> <extendedTooltip> - <name>ИмяИСинонимОбъектаМетаданныхРасширеннаяПодсказка</name> - <id>35</id> + <name>ИмяИСинонимОбъектаМетаданныхExtendedTooltip</name> + <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -186,8 +186,8 @@ <name>ПолноеИмяПриИзменении</name> </handlers> <extendedTooltip> - <name>ПолноеИмяРасширеннаяПодсказка</name> - <id>41</id> + <name>ПолноеИмяExtendedTooltip</name> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -232,8 +232,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>ПолныйСинонимРасширеннаяПодсказка</name> - <id>43</id> + <name>ПолныйСинонимExtendedTooltip</name> + <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -276,8 +276,8 @@ <value>Полное имя и полный синоним объекта метаданных</value> </toolTip> <extendedTooltip> - <name>ПолноеИмяИПолныйСинонимОбъектаМетаданныхРасширеннаяПодсказка</name> - <id>40</id> + <name>ПолноеИмяИПолныйСинонимОбъектаМетаданныхExtendedTooltip</name> + <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -311,8 +311,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>ПорядокКоллекцииРасширеннаяПодсказка</name> - <id>46</id> + <name>ПорядокКоллекцииExtendedTooltip</name> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -353,8 +353,8 @@ <skipOnInput>true</skipOnInput> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>БезДанныхРасширеннаяПодсказка</name> - <id>48</id> + <name>БезДанныхExtendedTooltip</name> + <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -394,8 +394,8 @@ типа значения пустой ссылки)</value> </toolTip> <extendedTooltip> - <name>ПустаяСсылкаПредставлениеРасширеннаяПодсказка</name> - <id>50</id> + <name>ПустаяСсылкаПредставлениеExtendedTooltip</name> + <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -434,8 +434,8 @@ <segments>Объект.НоваяСсылка</segments> </dataPath> <extendedTooltip> - <name>НоваяСсылкаРасширеннаяПодсказка</name> - <id>52</id> + <name>НоваяСсылкаExtendedTooltip</name> + <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -479,8 +479,8 @@ </toolTip> <horizontalStretch>true</horizontalStretch> <extendedTooltip> - <name>ПрочиеСвойстваРасширеннаяПодсказка</name> - <id>45</id> + <name>ПрочиеСвойстваExtendedTooltip</name> + <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -512,7 +512,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьВозможностьРедактированияРасширеннаяПодсказка</name> + <name>ФормаВключитьВозможностьРедактированияExtendedTooltip</name> <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Module.bsl index 96acc751f..77b0c2e32 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/Forms/ФормаЭлемента/Module.bsl @@ -43,7 +43,7 @@ Если ПолноеИмя <> Объект.ПолноеИмя Тогда Объект.ПолноеИмя = ПолноеИмя; - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Объект метаданных не найден по полному имени: |%1.'"), ПолноеИмя)); diff --git a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl index 86cb04792..c77ed1331 100644 --- a/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl +++ b/SSL/src/Catalogs/ИдентификаторыОбъектовМетаданных/ManagerModule.bsl @@ -56,6 +56,17 @@ КонецПроцедуры +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + + Возврат РедактируемыеРеквизиты; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -84,18 +95,19 @@ // значение Истина, если кэш идентификаторов объектов метаданных // в константе ПараметрыБазовойФункциональности нужно обновить. // -// СписокКритичныхИзменений - Строка (возвращаемое значение) - содержит полные имена -// объектов метаданных, которые добавлены или требуется добавить, -// а также объектов метаданных, полные имена которых изменены или требуется изменить. +// СписокНовыхОбъектовМетаданных - Строка (возвращаемое значение) - содержит полные имена +// объектов метаданных, которые добавлены или требуется добавить. // Процедура ВыполнитьОбновлениеДанных(ЕстьИзменения = Ложь, ЕстьУдаленные = Ложь, ТолькоПроверка = Ложь, ЕстьКритичныеИзменения = Ложь, - ТребуетсяОбновитьКэш = Ложь, СписокКритичныхИзменений = "") Экспорт + ТребуетсяОбновитьКэш = Ложь, СписокНовыхОбъектовМетаданных = "") Экспорт ПроверкаИспользования(); УстановитьПривилегированныйРежим(Истина); - ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьИзменения); + Если НЕ ТолькоПроверка Тогда + ЗаменаДублейПодчиненногоУзлаНайденныхПриЗагрузке(); + КонецЕсли; СвойстваКоллекцийОбъектовМетаданных = СвойстваКоллекцийОбъектовМетаданных(); СвойстваОбъектовМетаданных = СвойстваОбъектовМетаданных(СвойстваКоллекцийОбъектовМетаданных); @@ -128,7 +140,7 @@ Запрос.Текст = "ВЫБРАТЬ | Идентификаторы.Ссылка, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных, + | Идентификаторы.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, | Идентификаторы.Родитель, | Идентификаторы.ПометкаУдаления, | Идентификаторы.Предопределенный КАК Предопределенный, @@ -143,9 +155,6 @@ | Идентификаторы.КлючОбъектаМетаданных КАК ХранилищеКлюча |ИЗ | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы"; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "Идентификаторы.ИмяПредопределенныхДанных"); - КонецЕсли; Выгрузка = Запрос.Выполнить().Выгрузить(); Выгрузка.Колонки.Добавить("КлючОбъектаМетаданных"); Выгрузка.Колонки.Добавить("БезКлючаОбъектаМетаданных", Новый ОписаниеТипов("Булево")); @@ -200,7 +209,6 @@ КонецЦикла; КонецЕсли; - СписокПереименованийОбъектовМетаданных = ""; ЕстьТекущиеКритичныеИзменения = Ложь; // Обработка идентификаторов объектов метаданных. @@ -216,11 +224,7 @@ КонецЕсли; Если Свойства.Предопределенный Тогда - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяПредопределенногоИдентификатора = Свойства.ИмяПредопределенныхДанных; - Иначе - ИмяПредопределенногоИдентификатора = ПолучитьИмяПредопределенного(Свойства.Ссылка); - КонецЕсли; + ИмяПредопределенногоИдентификатора = Свойства.ИмяПредопределенныхДанных; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В справочнике ""Идентификаторы объектов метаданных"" |для предопределенного элемента @@ -289,9 +293,6 @@ Если ВРег(Свойства.ПолноеИмя) <> ВРег(СвойстваОбъекта.ПолноеИмя) Тогда ЕстьТекущиеКритичныеИзменения = Истина; ЕстьКритичныеИзменения = Истина; - СписокПереименованийОбъектовМетаданных = СписокПереименованийОбъектовМетаданных - + ?(ЗначениеЗаполнено(СписокПереименованийОбъектовМетаданных), "," + Символы.ПС, "") - + Свойства.ПолноеИмя + " -> " + СвойстваОбъекта.ПолноеИмя; КонецЕсли; // Установка новых свойств идентификатора объекта метаданных. @@ -310,8 +311,6 @@ КонецЕсли; КонецЦикла; - СписокНовыхОбъектовМетаданных = ""; - // Добавление идентификаторов новых объектов метаданных. Для каждого СвойстваОбъекта Из СвойстваОбъектовМетаданных.НайтиСтроки(Новый Структура("Найден", Ложь)) Цикл Свойства = Выгрузка.Добавить(); @@ -329,17 +328,6 @@ + СвойстваОбъекта.ПолноеИмя; КонецЦикла; - СписокКритичныхИзменений = ""; - Если ЗначениеЗаполнено(СписокПереименованийОбъектовМетаданных) Тогда - СписокКритичныхИзменений = НСтр("ru = 'Переименование идентификаторов объектов метаданных СтароеПолноеИмя -> НовоеПолноеИмя:'") - + Символы.ПС + СписокПереименованийОбъектовМетаданных + Символы.ПС + Символы.ПС; - КонецЕсли; - Если ЗначениеЗаполнено(СписокНовыхОбъектовМетаданных) Тогда - СписокКритичныхИзменений = СписокКритичныхИзменений - + НСтр("ru = 'Добавление новых идентификаторов объектов метаданных:'") - + Символы.ПС + СписокНовыхОбъектовМетаданных + Символы.ПС; - КонецЕсли; - Если НЕ (ТолькоПроверка ИЛИ МонопольныйРежим()) Тогда // Если кэш нужно обновить, тогда тоже нужен монопольный режим. ТребуетсяОбновитьТекущийКэш = Ложь; @@ -415,17 +403,6 @@ ОбновитьКэшИдентификаторов(Выгрузка, ЕстьИзменения, ТолькоПроверка); - Если ЗначениеЗаполнено(СписокКритичныхИзменений) Тогда - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Идентификаторы объектов метаданных.Выполнены критичные изменения'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация, - , - , - СписокКритичныхИзменений, - РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - КонецЕсли; - ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); @@ -446,123 +423,24 @@ УстановитьМонопольныйРежим(Ложь); КонецЕсли; -КонецПроцедуры - -// Только для внутреннего использования. -Процедура ВыгрузитьДанныеСправочника(Знач КаталогВыгрузки) Экспорт - - ПроверкаИспользования(); - - Запись = Новый ЗаписьXML; - Запись.ОткрытьФайл(КаталогВыгрузки + "MetadataObjectsIdentifiers.xml"); - Запись.ЗаписатьОбъявлениеXML(); - - Запись.ЗаписатьНачалоЭлемента("Data"); - Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns2", "http://v8.1c.ru/8.1/data/enterprise"); - Запись.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); - - НачатьТранзакцию(); - Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить(); - ЭлементБлокировки.Область = "Справочник.ИдентификаторыОбъектовМетаданных"; - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - Блокировка.Заблокировать(); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ИдентификаторыОбъектовМетаданных.Ссылка КАК Ссылка - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК ИдентификаторыОбъектовМетаданных"; - Выборка = Запрос.Выполнить().Выбрать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Пока Выборка.Следующий() Цикл - СериализаторXDTO.ЗаписатьXML(Запись, Выборка.Ссылка.ПолучитьОбъект(), НазначениеТипаXML.Явное); - КонецЦикла; - - Запись.ЗаписатьКонецЭлемента(); - - Запись.Закрыть(); КонецПроцедуры -// Только для внутреннего использования. -Процедура ДополнитьСловарьЗаменСсылокИдентификаторовТекущихИЗагружаемыхДанных( - Знач СловарьЗамен, - Знач КаталогВыгрузки) Экспорт +// Возвращает реквизиты справочника, которые образуют естественный ключ +// для элементов справочника. +// +// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих +// естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт - ПроверкаИспользования(); + Результат = Новый Массив(); - // Перед загрузкой в пустую базу требутся обновление справочника. - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - |ГДЕ - | НЕ Идентификаторы.Предопределенный"; + Результат.Добавить("ПолноеИмя"); - Если Запрос.Выполнить().Пустой() Тогда - ОбновитьДанныеСправочника(); - КонецЕсли; + Возврат Результат; - СоответствиеСсылок = Новый Соответствие; - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(КаталогВыгрузки + "MetadataObjectsIdentifiers.xml"); - Чтение.ПерейтиКСодержимому(); - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Data" Тогда - - ВызватьИсключение НСтр("ru = 'Неверный формат файла MetadataObjectsIdentifiers.xml'"); - - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'"); - КонецЕсли; - - Пока Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл - Данные = СериализаторXDTO.ПрочитатьXML(Чтение); - - КлючОбъектаМетаданных = Данные.КлючОбъектаМетаданных.Получить(); - ОбъектМетаданных = ОбъектМетаданныхПоКлючу(КлючОбъектаМетаданных); - - Если ОбъектМетаданных = Неопределено Тогда - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Данные.ПолноеИмя); - КонецЕсли; - - Если ОбъектМетаданных <> Неопределено Тогда - Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ОбъектМетаданных); - - // Ключ - Существующая ссылка. - // Значение - Загружаемая ссылка. - Если ЗначениеЗаполнено(Данные.Ссылка) Тогда - ЗагружаемыйИдентификатор = Данные.Ссылка.УникальныйИдентификатор(); - Иначе - ЗагружаемыйИдентификатор = Данные.ПолучитьСсылкуНового().УникальныйИдентификатор(); - КонецЕсли; - - СоответствиеСсылок.Вставить(Идентификатор.УникальныйИдентификатор(), ЗагружаемыйИдентификатор); - КонецЕсли; - КонецЦикла; - - СтрокаФрагмента = СловарьЗамен.Добавить(); - СтрокаФрагмента.Тип = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных"); - СтрокаФрагмента.СоответствиеСсылок = СоответствиеСсылок; - -КонецПроцедуры +КонецФункции // Только для внутреннего использования. Процедура ПроверкаИспользования() Экспорт @@ -857,6 +735,7 @@ Итог.Вставить("ВерсииБиблиотек", Новый Соответствие); Итог.Вставить("ПорядокБиблиотек", Новый Соответствие); + ОбщегоНазначенияПереопределяемый.ПриДобавленииПереименованийОбъектовМетаданных(Итог); ОбщегоНазначенияПереопределяемый.ЗаполнитьТаблицуПереименованияОбъектовМетаданных(Итог); ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( @@ -1361,7 +1240,7 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции замены идентификатора в базе данных -Процедура ЗаменитьДублиПодчиненногоУзлаНайденныеПриЗагрузке(ТолькоПроверка, ЕстьИзменения) +Процедура ЗаменаДублейПодчиненногоУзлаНайденныхПриЗагрузке() Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда // В модели сервиса не поддерживается. @@ -1388,11 +1267,6 @@ Возврат; КонецЕсли; - Если ТолькоПроверка Тогда - ЕстьИзменения = Истина; - Возврат; - КонецЕсли; - Если МонопольныйРежим() Тогда СнятьМонопольныйРежим = Ложь; Иначе diff --git a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form index e754d8a99..a587270d9 100644 --- a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Form.form @@ -24,8 +24,8 @@ <segments>РасписаниеРаботы.ВремяНачала</segments> </dataPath> <extendedTooltip> - <name>РасписаниеРаботыВремяНачалаРасширеннаяПодсказка</name> - <id>24</id> + <name>РасписаниеРаботыВремяНачалаExtendedTooltip</name> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -73,8 +73,8 @@ <segments>РасписаниеРаботы.ВремяОкончания</segments> </dataPath> <extendedTooltip> - <name>РасписаниеРаботыВремяОкончанияРасширеннаяПодсказка</name> - <id>26</id> + <name>РасписаниеРаботыВремяОкончанияExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -122,10 +122,10 @@ </handlers> <searchStringAddition> <name>РасписаниеРаботыСтрокаПоиска</name> - <id>15</id> + <id>17</id> <extendedTooltip> <name>РасписаниеРаботыСтрокаПоискаРасширеннаяПодсказка</name> - <id>17</id> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -135,7 +135,7 @@ </extendedTooltip> <contextMenu> <name>РасписаниеРаботыСтрокаПоискаКонтекстноеМеню</name> - <id>16</id> + <id>18</id> <autoFill>true</autoFill> </contextMenu> <source>РасписаниеРаботы</source> @@ -145,10 +145,10 @@ </searchStringAddition> <viewStatusAddition> <name>РасписаниеРаботыСостояниеПросмотра</name> - <id>18</id> + <id>20</id> <extendedTooltip> <name>РасписаниеРаботыСостояниеПросмотраРасширеннаяПодсказка</name> - <id>20</id> + <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -158,7 +158,7 @@ </extendedTooltip> <contextMenu> <name>РасписаниеРаботыСостояниеПросмотраКонтекстноеМеню</name> - <id>19</id> + <id>21</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -169,10 +169,10 @@ </viewStatusAddition> <searchControlAddition> <name>РасписаниеРаботыУправлениеПоиском</name> - <id>21</id> + <id>23</id> <extendedTooltip> <name>РасписаниеРаботыУправлениеПоискомРасширеннаяПодсказка</name> - <id>23</id> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -182,7 +182,7 @@ </extendedTooltip> <contextMenu> <name>РасписаниеРаботыУправлениеПоискомКонтекстноеМеню</name> - <id>22</id> + <id>24</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -192,7 +192,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>РасписаниеРаботыРасширеннаяПодсказка</name> + <name>РасписаниеРаботыExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -246,7 +246,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОКРасширеннаяПодсказка</name> + <name>ФормаОКExtendedTooltip</name> <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -272,7 +272,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОтменаРасширеннаяПодсказка</name> + <name>ФормаОтменаExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Module.bsl b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Module.bsl index 850db08e9..bc154f77e 100644 --- a/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Module.bsl +++ b/SSL/src/Catalogs/Календари/Forms/РасписаниеРаботы/Module.bsl @@ -20,8 +20,9 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность, БылиНажатыКнопкиЗакрытия); - + Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); + КонецПроцедуры /////////////////////////////////////////////////////////////////////////////// @@ -30,22 +31,14 @@ &НаКлиенте Процедура ОК(Команда) - БылиНажатыКнопкиЗакрытия = Истина; - - РасписаниеДня = РасписаниеДня(); - Если РасписаниеДня = Неопределено Тогда - Возврат; - КонецЕсли; - - ОповеститьОВыборе(Новый Структура("РасписаниеРаботы", РасписаниеДня)); + ВыбратьИЗакрыть(); КонецПроцедуры &НаКлиенте Процедура Отмена(Команда) - БылиНажатыКнопкиЗакрытия = Истина; - + Модифицированность = Ложь; ОповеститьОВыборе(Неопределено); КонецПроцедуры @@ -60,7 +53,7 @@ Возврат; КонецЕсли; - КалендарныеГрафикиКлиентСервер.ВосстановитьПорядокСтрокКоллекцииПослеРедактирования(РасписаниеРаботы, "ВремяНачала", Элемент.ТекущиеДанные); + ГрафикиРаботыКлиентСервер.ВосстановитьПорядокСтрокКоллекцииПослеРедактирования(РасписаниеРаботы, "ВремяНачала", Элемент.ТекущиеДанные); КонецПроцедуры @@ -111,3 +104,16 @@ Возврат РасписаниеДня; КонецФункции + +&НаКлиенте +Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + РасписаниеДня = РасписаниеДня(); + Если РасписаниеДня = Неопределено Тогда + Возврат; + КонецЕсли; + + Модифицированность = Ложь; + ОповеститьОВыборе(Новый Структура("РасписаниеРаботы", РасписаниеДня)); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 2f37747cc..9fb1acfdf 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -28,4 +28,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form index 4bd35ff21..df16af177 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаСписка/Form.form @@ -26,8 +26,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>31</id> + <name>НаименованиеExtendedTooltip</name> + <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -62,8 +62,8 @@ <segments>Список.ПроизводственныйКалендарь</segments> </dataPath> <extendedTooltip> - <name>ПроизводственныйКалендарьРасширеннаяПодсказка</name> - <id>33</id> + <name>ПроизводственныйКалендарьExtendedTooltip</name> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -98,8 +98,8 @@ <segments>Список.СпособЗаполнения</segments> </dataPath> <extendedTooltip> - <name>СпособЗаполненияРасширеннаяПодсказка</name> - <id>35</id> + <name>СпособЗаполненияExtendedTooltip</name> + <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -134,8 +134,8 @@ <segments>Список.ВозможнаяПричина</segments> </dataPath> <extendedTooltip> - <name>ВозможнаяПричинаРасширеннаяПодсказка</name> - <id>37</id> + <name>ВозможнаяПричинаExtendedTooltip</name> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -170,8 +170,8 @@ <segments>Список.Описание</segments> </dataPath> <extendedTooltip> - <name>ОписаниеРасширеннаяПодсказка</name> - <id>39</id> + <name>ОписаниеExtendedTooltip</name> + <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -203,10 +203,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>22</id> + <id>27</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>24</id> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -216,7 +216,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>23</id> + <id>28</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -226,10 +226,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>25</id> + <id>30</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>27</id> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -239,7 +239,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>26</id> + <id>31</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -250,10 +250,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>28</id> + <id>33</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>30</id> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -263,7 +263,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>29</id> + <id>34</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -273,7 +273,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form index 31b794cd1..7dcd838a4 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Form.form @@ -21,7 +21,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>302</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -57,7 +57,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаРасширеннаяПодсказка</name> + <name>ГруппаExtendedTooltip</name> <id>301</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -104,8 +104,8 @@ <name>ДатаНачалаПриИзменении</name> </handlers> <extendedTooltip> - <name>ДатаНачалаРасширеннаяПодсказка</name> - <id>307</id> + <name>ДатаНачалаExtendedTooltip</name> + <id>306</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -149,8 +149,8 @@ <segments>Объект.ДатаОкончания</segments> </dataPath> <extendedTooltip> - <name>ДатаОкончанияРасширеннаяПодсказка</name> - <id>309</id> + <name>ДатаОкончанияExtendedTooltip</name> + <id>307</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -192,8 +192,8 @@ <value>Период группа</value> </toolTip> <extendedTooltip> - <name>ПериодГруппаРасширеннаяПодсказка</name> - <id>306</id> + <name>ПериодГруппаExtendedTooltip</name> + <id>305</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -224,8 +224,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДатаНачалаИнформационныйТекстРасширеннаяПодсказка</name> - <id>311</id> + <name>ДатаНачалаИнформационныйТекстExtendedTooltip</name> + <id>308</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -262,8 +262,8 @@ <value>Период заполнения группа</value> </toolTip> <extendedTooltip> - <name>ПериодЗаполненияГруппаРасширеннаяПодсказка</name> - <id>305</id> + <name>ПериодЗаполненияГруппаExtendedTooltip</name> + <id>304</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -300,8 +300,8 @@ <name>ПроизводственныйКалендарьПриИзменении</name> </handlers> <extendedTooltip> - <name>ПроизводственныйКалендарьРасширеннаяПодсказка</name> - <id>313</id> + <name>ПроизводственныйКалендарьExtendedTooltip</name> + <id>310</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -344,8 +344,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВыборПроизводственногоКалендаряПоясняющийТекстРасширеннаяПодсказка</name> - <id>315</id> + <name>ВыборПроизводственногоКалендаряПоясняющийТекстExtendedTooltip</name> + <id>311</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -383,8 +383,8 @@ <value>Производственный календарь группа</value> </toolTip> <extendedTooltip> - <name>ПроизводственныйКалендарьГруппаРасширеннаяПодсказка</name> - <id>312</id> + <name>ПроизводственныйКалендарьГруппаExtendedTooltip</name> + <id>309</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -416,8 +416,8 @@ <value>Настройки производственного календаря группа</value> </toolTip> <extendedTooltip> - <name>НастройкиПроизводственногоКалендаряГруппаРасширеннаяПодсказка</name> - <id>304</id> + <name>НастройкиПроизводственногоКалендаряГруппаExtendedTooltip</name> + <id>303</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -461,8 +461,8 @@ <name>СпособЗаполненияПриИзменении</name> </handlers> <extendedTooltip> - <name>СпособЗаполненияПоНеделямРасширеннаяПодсказка</name> - <id>319</id> + <name>СпособЗаполненияПоНеделямExtendedTooltip</name> + <id>315</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -514,8 +514,8 @@ <name>СпособЗаполненияПриИзменении</name> </handlers> <extendedTooltip> - <name>СпособЗаполненияПоЦикламПроизвольнойДлиныРасширеннаяПодсказка</name> - <id>322</id> + <name>СпособЗаполненияПоЦикламПроизвольнойДлиныExtendedTooltip</name> + <id>317</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -572,8 +572,8 @@ <name>ДлинаЦиклаПриИзменении</name> </handlers> <extendedTooltip> - <name>ДлинаЦиклаРасширеннаяПодсказка</name> - <id>325</id> + <name>ДлинаЦиклаExtendedTooltip</name> + <id>319</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -622,8 +622,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДлинаЦиклаЕдиницаИзмеренияРасширеннаяПодсказка</name> - <id>327</id> + <name>ДлинаЦиклаЕдиницаИзмеренияExtendedTooltip</name> + <id>320</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -657,8 +657,8 @@ <value>Длина цикла дней</value> </toolTip> <extendedTooltip> - <name>ГруппаДлинаЦиклаДнейРасширеннаяПодсказка</name> - <id>324</id> + <name>ГруппаДлинаЦиклаДнейExtendedTooltip</name> + <id>318</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -695,8 +695,8 @@ <name>ДатаОтсчетаПриИзменении</name> </handlers> <extendedTooltip> - <name>ДатаОтсчетаРасширеннаяПодсказка</name> - <id>328</id> + <name>ДатаОтсчетаExtendedTooltip</name> + <id>321</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -736,8 +736,8 @@ <value>Способ заполнения по циклам произвольной длины группа</value> - СпособЗаполненияПоЦикламПроизвольнойДлиныГруппаРасширеннаяПодсказка - 321 + СпособЗаполненияПоЦикламПроизвольнойДлиныГруппаExtendedTooltip + 316 Label true true @@ -767,8 +767,8 @@ true - ВыборСпособаЗаполненияПоясняющийТекстРасширеннаяПодсказка - 330 + ВыборСпособаЗаполненияПоясняющийТекстExtendedTooltip + 322 Label true true @@ -805,8 +805,8 @@ Способ заполнения группа - СпособЗаполненияГруппаРасширеннаяПодсказка - 318 + СпособЗаполненияГруппаExtendedTooltip + 314 Label true true @@ -844,8 +844,8 @@ УчитыватьПраздникиПриИзменении - УчитыватьПраздникиРасширеннаяПодсказка - 332 + УчитыватьПраздникиExtendedTooltip + 324 Label true true @@ -879,8 +879,8 @@ true - УчитыватьПраздникиИнформационныйТекстРасширеннаяПодсказка - 334 + УчитыватьПраздникиИнформационныйТекстExtendedTooltip + 325 Label true true @@ -915,8 +915,8 @@ РасписаниеПредпраздничногоДня - РасписаниеПредпраздничногоДняРасширеннаяПодсказка - 335 + РасписаниеПредпраздничногоДняExtendedTooltip + 326 Label true true @@ -959,8 +959,8 @@ Учитывать праздники группа - УчитыватьПраздникиГруппаРасширеннаяПодсказка - 331 + УчитыватьПраздникиГруппаExtendedTooltip + 323 Label true true @@ -992,8 +992,8 @@ Настройки группа - НастройкиГруппаРасширеннаяПодсказка - 317 + НастройкиГруппаExtendedTooltip + 313 Label true true @@ -1042,8 +1042,8 @@ Объект.ШаблонЗаполнения.LineNumber - ШаблонЗаполненияНомерСтрокиРасширеннаяПодсказка - 349 + ШаблонЗаполненияНомерСтрокиExtendedTooltip + 330 Label true true @@ -1078,8 +1078,8 @@ Объект.ШаблонЗаполнения.ПредставлениеДня - ШаблонЗаполненияПредставлениеДняРасширеннаяПодсказка - 351 + ШаблонЗаполненияПредставлениеДняExtendedTooltip + 331 Label true true @@ -1123,8 +1123,8 @@ ШаблонЗаполненияДеньВключенВГрафикПриИзменении - ШаблонЗаполненияДеньВключенВГрафикРасширеннаяПодсказка - 353 + ШаблонЗаполненияДеньВключенВГрафикExtendedTooltip + 332 Label true true @@ -1156,8 +1156,8 @@ Объект.ШаблонЗаполнения.ПредставлениеРасписания - ШаблонЗаполненияПредставлениеРасписанияРасширеннаяПодсказка - 355 + ШаблонЗаполненияПредставлениеРасписанияExtendedTooltip + 333 Label true true @@ -1198,8 +1198,8 @@ Шаблон заполнения группа колонок - ШаблонЗаполненияГруппаКолонокРасширеннаяПодсказка - 348 + ШаблонЗаполненияГруппаКолонокExtendedTooltip + 329 Label true true @@ -1226,10 +1226,10 @@ ШаблонЗаполненияСтрокаПоиска - 339 + 374 ШаблонЗаполненияСтрокаПоискаРасширеннаяПодсказка - 341 + 376 Label true true @@ -1239,7 +1239,7 @@ ШаблонЗаполненияСтрокаПоискаКонтекстноеМеню - 340 + 375 true ШаблонЗаполнения @@ -1249,10 +1249,10 @@ ШаблонЗаполненияСостояниеПросмотра - 342 + 377 ШаблонЗаполненияСостояниеПросмотраРасширеннаяПодсказка - 344 + 379 Label true true @@ -1262,7 +1262,7 @@ ШаблонЗаполненияСостояниеПросмотраКонтекстноеМеню - 343 + 378 true ViewStatusAddition @@ -1273,10 +1273,10 @@ ШаблонЗаполненияУправлениеПоиском - 345 + 380 ШаблонЗаполненияУправлениеПоискомРасширеннаяПодсказка - 347 + 382 Label true true @@ -1286,7 +1286,7 @@ ШаблонЗаполненияУправлениеПоискомКонтекстноеМеню - 346 + 381 true SearchControlAddition @@ -1296,8 +1296,8 @@ - ШаблонЗаполненияРасширеннаяПодсказка - 338 + ШаблонЗаполненияExtendedTooltip + 328 Label true true @@ -1346,8 +1346,8 @@ true - ШаблонЗаполненияИнформационныйТекстРасширеннаяПодсказка - 365 + ШаблонЗаполненияИнформационныйТекстExtendedTooltip + 334 Label true true @@ -1384,8 +1384,8 @@ Шаблон заполнения - ШаблонЗаполненияГруппаРасширеннаяПодсказка - 337 + ШаблонЗаполненияГруппаExtendedTooltip + 327 Label true true @@ -1417,8 +1417,8 @@ Настройка заполнения - НастройкаЗаполненияГруппаРасширеннаяПодсказка - 316 + НастройкаЗаполненияГруппаExtendedTooltip + 312 Label true true @@ -1461,8 +1461,8 @@ ГоризонтПланированияПриИзменении - ГоризонтПланированияРасширеннаяПодсказка - 369 + ГоризонтПланированияExtendedTooltip + 338 Label true true @@ -1504,8 +1504,8 @@ true - ГоризонтПланированияЕдиницаДекорацияРасширеннаяПодсказка - 371 + ГоризонтПланированияЕдиницаДекорацияExtendedTooltip + 339 Label true true @@ -1540,8 +1540,8 @@ true - ГоризонтПланированияЕдиницаГруппаРасширеннаяПодсказка - 368 + ГоризонтПланированияЕдиницаГруппаExtendedTooltip + 337 Label true true @@ -1571,8 +1571,8 @@ true - ГоризонтПланированияПоясняющийТекстРасширеннаяПодсказка - 372 + ГоризонтПланированияПоясняющийТекстExtendedTooltip + 340 Label true true @@ -1610,8 +1610,8 @@ false - ГоризонтПланированияГруппаРасширеннаяПодсказка - 367 + ГоризонтПланированияГруппаExtendedTooltip + 336 Label true true @@ -1644,8 +1644,8 @@ true - ЗаполненностьДекорацияРасширеннаяПодсказка - 374 + ЗаполненностьДекорацияExtendedTooltip + 342 Label true true @@ -1677,8 +1677,8 @@ None - ЗаполненностьИнформационныйТекстРасширеннаяПодсказка - 375 + ЗаполненностьИнформационныйТекстExtendedTooltip + 343 Label true true @@ -1718,8 +1718,8 @@ Заполненность группа - ЗаполненностьГруппаРасширеннаяПодсказка - 373 + ЗаполненностьГруппаExtendedTooltip + 341 Label true true @@ -1750,8 +1750,8 @@ Контроль заполнения - КонтрольЗаполненияГруппаРасширеннаяПодсказка - 366 + КонтрольЗаполненияГруппаExtendedTooltip + 335 Label true true @@ -1786,8 +1786,8 @@ Left - ОписаниеРасширеннаяПодсказка - 378 + ОписаниеExtendedTooltip + 345 Label true true @@ -1834,8 +1834,8 @@ Описание группа - ОписаниеГруппаРасширеннаяПодсказка - 377 + ОписаниеГруппаExtendedTooltip + 344 Label true true @@ -1873,8 +1873,8 @@ true - РучноеРедактированиеДекорацияРасширеннаяПодсказка - 382 + РучноеРедактированиеДекорацияExtendedTooltip + 348 Label true true @@ -1910,8 +1910,8 @@ None - РучноеРедактированиеИнформационныйТекстРасширеннаяПодсказка - 383 + РучноеРедактированиеИнформационныйТекстExtendedTooltip + 349 Label true true @@ -1951,8 +1951,8 @@ Годы ручного редактирования - ГодыРучногоРедактированияГруппаРасширеннаяПодсказка - 381 + ГодыРучногоРедактированияГруппаExtendedTooltip + 347 Label true true @@ -1978,8 +1978,8 @@ true - РезультатЗаполненияРасширеннаяПодсказка - 385 + РезультатЗаполненияExtendedTooltip + 350 Label true true @@ -2018,8 +2018,8 @@ true - РезультатЗаполненияКомандаПереходаГруппаРасширеннаяПодсказка - 380 + РезультатЗаполненияКомандаПереходаГруппаExtendedTooltip + 346 Label true true @@ -2050,7 +2050,7 @@ Настройка заполнения страница - НастройкаЗаполненияСтраницаРасширеннаяПодсказка + НастройкаЗаполненияСтраницаExtendedTooltip 300 Label true @@ -2097,8 +2097,8 @@ НомерТекущегоГодаПриИзменении - НомерТекущегоГодаРасширеннаяПодсказка - 390 + НомерТекущегоГодаExtendedTooltip + 355 Label true true @@ -2144,8 +2144,8 @@ true - ГодПодписьРасширеннаяПодсказка - 392 + ГодПодписьExtendedTooltip + 356 Label true true @@ -2174,8 +2174,8 @@ true - ЗаполнитьПоШаблонуРасширеннаяПодсказка - 393 + ЗаполнитьПоШаблонуExtendedTooltip + 357 Label true true @@ -2206,8 +2206,8 @@ Настройка результата заполнения группа - НастройкаРезультатаЗаполненияГруппаРасширеннаяПодсказка - 389 + НастройкаРезультатаЗаполненияГруппаExtendedTooltip + 354 Label true true @@ -2241,8 +2241,8 @@ None - ГрафикРаботыРасширеннаяПодсказка - 394 + ГрафикРаботыExtendedTooltip + 358 Label true true @@ -2297,8 +2297,8 @@ true - УправлениеГрафикомИнформационныйТекстРасширеннаяПодсказка - 396 + УправлениеГрафикомИнформационныйТекстExtendedTooltip + 359 Label true true @@ -2336,8 +2336,8 @@ График работы группа - ГрафикРаботыГруппаРасширеннаяПодсказка - 388 + ГрафикРаботыГруппаExtendedTooltip + 353 Label true true @@ -2369,8 +2369,8 @@ Результат заполнения - РезультатЗаполненияГруппаРасширеннаяПодсказка - 387 + РезультатЗаполненияГруппаExtendedTooltip + 352 Label true true @@ -2404,8 +2404,8 @@ true - РезультатЗаполненияДекорацияРасширеннаяПодсказка - 398 + РезультатЗаполненияДекорацияExtendedTooltip + 361 Label true true @@ -2437,8 +2437,8 @@ None - РезультатЗаполненияИнформационныйТекстРасширеннаяПодсказка - 399 + РезультатЗаполненияИнформационныйТекстExtendedTooltip + 362 Label true true @@ -2479,8 +2479,8 @@ Результат заполнения информационный текст группа - РезультатЗаполненияИнформационныйТекстГруппаРасширеннаяПодсказка - 397 + РезультатЗаполненияИнформационныйТекстГруппаExtendedTooltip + 360 Label true true @@ -2506,8 +2506,8 @@ true - НастройкаЗаполненияРасширеннаяПодсказка - 401 + НастройкаЗаполненияExtendedTooltip + 363 Label true true @@ -2545,8 +2545,8 @@ Результат заполнения страница - РезультатЗаполненияСтраницаРасширеннаяПодсказка - 386 + РезультатЗаполненияСтраницаExtendedTooltip + 351 Label true true @@ -2574,7 +2574,7 @@ Страницы - СтраницыРасширеннаяПодсказка + СтраницыExtendedTooltip 299 Label true diff --git a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl index 400862e4e..1f4743663 100644 --- a/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Календари/Forms/ФормаЭлемента/Module.bsl @@ -28,21 +28,21 @@ Объект.ДатаНачала = НачалоГода(ТекущаяДатаСеанса()); Объект.ДатаОтсчета = НачалоГода(ТекущаяДатаСеанса()); - УстановитьЭлементыНастройкиЗаполнения(ЭтаФорма); + УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект); СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); ЗаполнитьПредставлениеРасписания(); - УстановитьДоступностьУчитыватьПраздники(ЭтаФорма); + УстановитьДоступностьУчитыватьПраздники(ЭтотОбъект); УточнитьДатуЗаполненности(); ЗаполнитьДаннымиТекущегоГода(Параметры.ЗначениеКопирования); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Истина); - УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтаФорма); + УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтотОбъект); КонецПроцедуры @@ -51,22 +51,22 @@ ДлинаЦикла = Объект.ШаблонЗаполнения.Количество(); - УстановитьЭлементыНастройкиЗаполнения(ЭтаФорма); + УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект); СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); ЗаполнитьПредставлениеРасписания(); - УстановитьДоступностьУчитыватьПраздники(ЭтаФорма); + УстановитьДоступностьУчитыватьПраздники(ЭтотОбъект); УточнитьДатуЗаполненности(); ЗаполнитьДаннымиТекущегоГода(); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Истина); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Ложь); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Истина); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Ложь); - УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтаФорма); + УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтотОбъект); КонецПроцедуры @@ -97,14 +97,14 @@ НоваяСтрока.НомерДня = КонтекстВыбора.НомерДня; КонецЦикла; - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); Если КонтекстВыбора.Источник = "ШаблонЗаполненияВыбор" Тогда СтрокаШаблона = Объект.ШаблонЗаполнения.НайтиПоИдентификатору(КонтекстВыбора.ИдентификаторСтрокиШаблона); СтрокаШаблона.ДеньВключенВГрафик = ВыбранноеЗначение.РасписаниеРаботы.Количество() > 0; // расписание заполнено - СтрокаШаблона.ПредставлениеРасписания = ПредставлениеРасписанияДня(ЭтаФорма, КонтекстВыбора.НомерДня); + СтрокаШаблона.ПредставлениеРасписания = ПредставлениеРасписанияДня(ЭтотОбъект, КонтекстВыбора.НомерДня); КонецЕсли; @@ -135,7 +135,7 @@ ДлинаЦикла = Объект.ШаблонЗаполнения.Количество(); - УстановитьЭлементыНастройкиЗаполнения(ЭтаФорма); + УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект); СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); @@ -143,7 +143,7 @@ УточнитьДатуЗаполненности(); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Ложь); ЗаполнитьДаннымиТекущегоГода(); @@ -202,22 +202,22 @@ &НаКлиенте Процедура ПроизводственныйКалендарьПриИзменении(Элемент) - УстановитьДоступностьУчитыватьПраздники(ЭтаФорма); + УстановитьДоступностьУчитыватьПраздники(ЭтотОбъект); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); КонецПроцедуры &НаКлиенте Процедура СпособЗаполненияПриИзменении(Элемент) - УстановитьЭлементыНастройкиЗаполнения(ЭтаФорма); + УстановитьЭлементыНастройкиЗаполнения(ЭтотОбъект); СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); КонецПроцедуры @@ -239,8 +239,8 @@ СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); КонецПроцедуры @@ -249,18 +249,18 @@ СформироватьШаблонЗаполнения(Объект.СпособЗаполнения, Объект.ШаблонЗаполнения, ДлинаЦикла, Объект.ДатаОтсчета); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); КонецПроцедуры &НаКлиенте Процедура УчитыватьПраздникиПриИзменении(Элемент) - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); - УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтаФорма); + УстановитьДоступностьРасписанияПредпраздничногоДня(ЭтотОбъект); КонецПроцедуры @@ -286,15 +286,15 @@ ПараметрыФормы.Вставить("РасписаниеРаботы", РасписаниеРаботы(КонтекстВыбора.НомерДня)); ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); - ОткрытьФорму("Справочник.Календари.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.Календари.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ШаблонЗаполненияДеньВключенВГрафикПриИзменении(Элемент) - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Ложь); - УстановитьСнятьМодифицированностьШаблона(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Ложь); + УстановитьСнятьМодифицированностьШаблона(ЭтотОбъект, Истина); КонецПроцедуры @@ -312,22 +312,21 @@ ПараметрыФормы.Вставить("РасписаниеРаботы", РасписаниеРаботы(КонтекстВыбора.НомерДня)); ПараметрыФормы.Вставить("ТолькоПросмотр", ТолькоПросмотр); - ОткрытьФорму("Справочник.Календари.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.Календари.Форма.РасписаниеРаботы", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ГоризонтПланированияПриИзменении(Элемент) - УточнитьЗаполненностьГрафика(ЭтаФорма); + УточнитьЗаполненностьГрафика(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста( - Элемент.ТекстРедактирования, Объект.Описание, Модифицированность, НСтр("ru = 'Описание'")); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Описание"); КонецПроцедуры @@ -347,14 +346,15 @@ НСтр("ru = 'Записать измененные данные за %1 год?'"), Формат(НомерПредыдущегоГода, "ЧГ=0")); - Если Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда - ЗаписыватьДанныеГрафика = Истина; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("НомерТекущегоГодаПриИзмененииЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; ОбработатьИзменениеГода(ЗаписыватьДанныеГрафика); - УстановитьСнятьМодифицированностьРезультата(ЭтаФорма, Ложь); + УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Ложь); Элементы.ГрафикРаботы.Обновить(); @@ -386,21 +386,21 @@ Если ДниГрафика.Получить(ВыбраннаяДата) = Неопределено Тогда // Включаем в график - КалендарныеГрафикиКлиентСервер.ВставитьВФиксированноеСоответствие(ДниГрафика, ВыбраннаяДата, Истина); + ГрафикиРаботыКлиентСервер.ВставитьВФиксированноеСоответствие(ДниГрафика, ВыбраннаяДата, Истина); ДеньВключенВГрафик = Истина; Иначе // Исключаем из графика - КалендарныеГрафикиКлиентСервер.УдалитьИзФиксированногоСоответствия(ДниГрафика, ВыбраннаяДата); + ГрафикиРаботыКлиентСервер.УдалитьИзФиксированногоСоответствия(ДниГрафика, ВыбраннаяДата); ДеньВключенВГрафик = Ложь; КонецЕсли; // Фиксируем ручное изменение на дату - КалендарныеГрафикиКлиентСервер.ВставитьВФиксированноеСоответствие(ДниИзмененные, ВыбраннаяДата, ДеньВключенВГрафик); + ГрафикиРаботыКлиентСервер.ВставитьВФиксированноеСоответствие(ДниИзмененные, ВыбраннаяДата, ДеньВключенВГрафик); Элементы.ГрафикРаботы.Обновить(); - УстановитьСнятьПризнакРучногоРедактирования(ЭтаФорма, Истина); - УстановитьСнятьМодифицированностьРезультата(ЭтаФорма, Истина); + УстановитьСнятьПризнакРучногоРедактирования(ЭтотОбъект, Истина); + УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Истина); КонецПроцедуры @@ -459,10 +459,10 @@ Процедура ЗаполнитьПредставлениеРасписания() Для Каждого СтрокаШаблона Из Объект.ШаблонЗаполнения Цикл - СтрокаШаблона.ПредставлениеРасписания = ПредставлениеРасписанияДня(ЭтаФорма, СтрокаШаблона.НомерСтроки); + СтрокаШаблона.ПредставлениеРасписания = ПредставлениеРасписанияДня(ЭтотОбъект, СтрокаШаблона.НомерСтроки); КонецЦикла; - РасписаниеПредпраздничногоДня = ПредставлениеРасписанияДня(ЭтаФорма, 0); + РасписаниеПредпраздничногоДня = ПредставлениеРасписанияДня(ЭтотОбъект, 0); КонецПроцедуры @@ -543,7 +543,7 @@ ДатаЗаполненности = Выборка.Дата; КонецЕсли; - УточнитьЗаполненностьГрафика(ЭтаФорма); + УточнитьЗаполненностьГрафика(ЭтотОбъект); КонецПроцедуры @@ -605,14 +605,14 @@ КонецЕсли; КонецЦикла; Иначе - УстановитьСнятьМодифицированностьРезультата(ЭтаФорма, Истина); - УстановитьСнятьПризнакРучногоРедактирования(ЭтаФорма, Ложь); + УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Истина); + УстановитьСнятьПризнакРучногоРедактирования(ЭтотОбъект, Ложь); КонецЕсли; КонецЕсли; // Переносим результат в исходное соответствие заполнения, // чтобы не «затереть» даты, не входящие в интервал заполнения - ДниГрафикаСоответствие = КалендарныеГрафикиКлиентСервер.СоответствиеПоФиксированномуСоответствию(ДниГрафика); + ДниГрафикаСоответствие = Новый Соответствие(ДниГрафика); ДатаДня = Объект.ДатаНачала; ДатаОкончания = Объект.ДатаОкончания; Если Не ЗначениеЗаполнено(ДатаОкончания) Тогда @@ -630,7 +630,7 @@ ДниГрафика = Новый ФиксированноеСоответствие(ДниГрафикаСоответствие); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Истина); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Истина); КонецПроцедуры @@ -666,8 +666,8 @@ ДниГрафика = Новый ФиксированноеСоответствие(ДниВключенныеВГрафик); КонецЕсли; - УстановитьСнятьМодифицированностьРезультата(ЭтаФорма, Ложь); - УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтаФорма, Не МодифицированностьШаблона); + УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Ложь); + УстановитьСнятьПризнакСоответствияРезультатовШаблону(ЭтотОбъект, Не МодифицированностьШаблона); КонецПроцедуры @@ -675,7 +675,7 @@ Процедура ПрочитатьПризнакРучногоРедактирования(ТекущийОбъект, НомерГода) Если ТекущийОбъект.Ссылка.Пустая() Тогда - УстановитьСнятьПризнакРучногоРедактирования(ЭтаФорма, Ложь); + УстановитьСнятьПризнакРучногоРедактирования(ЭтотОбъект, Ложь); Возврат; КонецЕсли; @@ -698,7 +698,7 @@ КонецЦикла; ДниИзмененные = Новый ФиксированноеСоответствие(Соответствие); - УстановитьСнятьПризнакРучногоРедактирования(ЭтаФорма, ДниИзмененные.Количество() > 0); + УстановитьСнятьПризнакРучногоРедактирования(ЭтотОбъект, ДниИзмененные.Количество() > 0); КонецПроцедуры @@ -815,7 +815,7 @@ ЗаполнитьИнформационныйТекстРучногоРедактирования(Форма); КонецПроцедуры - + &НаКлиентеНаСервереБезКонтекста Процедура ЗаполнитьИнформационныйТекстРучногоРедактирования(Форма) @@ -844,3 +844,16 @@ Элементы.ГрафикРаботы.КонецПериодаОтображения = Дата(НомерТекущегоГода, 12, 31); КонецПроцедуры + +&НаКлиенте +Процедура НомерТекущегоГодаПриИзмененииЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ЗаписыватьДанныеГрафика = Истина; + КонецЕсли; + + ОбработатьИзменениеГода(ЗаписыватьДанныеГрафика); + УстановитьСнятьМодифицированностьРезультата(ЭтотОбъект, Ложь); + Элементы.ГрафикРаботы.Обновить(); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form index dec5f251f..a3761de94 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Form.form @@ -27,7 +27,7 @@ ВариантЗагрузкиПриИзменении - ВариантЗагрузкиРасширеннаяПодсказка + ВариантЗагрузкиExtendedTooltip 28 Label true @@ -81,8 +81,8 @@ ПутьКДискуИТС - ПутьКДискуИТСРасширеннаяПодсказка - 30 + ПутьКДискуИТСExtendedTooltip + 29 Label true true @@ -129,7 +129,7 @@ Страница выбор источника - СтраницаВыборИсточникаРасширеннаяПодсказка + СтраницаВыборИсточникаExtendedTooltip 27 Label true @@ -162,8 +162,8 @@ true - ПредупреждениеОЗагрузкаССайтаРБКРасширеннаяПодсказка - 33 + ПредупреждениеОЗагрузкаССайтаРБКExtendedTooltip + 31 Label true true @@ -197,8 +197,8 @@ Загрузка с сайта РБК - ЗагрузкаССайтаРБКРасширеннаяПодсказка - 32 + ЗагрузкаССайтаРБКExtendedTooltip + 30 Label true true @@ -228,8 +228,8 @@ true - КартинкаВыполняетсяЗагрузкаРасширеннаяПодсказка - 35 + КартинкаВыполняетсяЗагрузкаExtendedTooltip + 33 Label true true @@ -265,8 +265,8 @@ true - НадписьВыполняетсяЗагрузкаРасширеннаяПодсказка - 36 + НадписьВыполняетсяЗагрузкаExtendedTooltip + 34 Label true true @@ -301,8 +301,8 @@ Выполняется загрузка - ВыполняетсяЗагрузкаРасширеннаяПодсказка - 34 + ВыполняетсяЗагрузкаExtendedTooltip + 32 Label true true @@ -331,8 +331,8 @@ true - ПоясняющийТекстРасширеннаяПодсказка - 38 + ПоясняющийТекстExtendedTooltip + 36 Label true true @@ -373,8 +373,8 @@ Страница результат - СтраницаРезультатРасширеннаяПодсказка - 37 + СтраницаРезультатExtendedTooltip + 35 Label true true @@ -402,7 +402,7 @@ Страницы формы - СтраницыФормыРасширеннаяПодсказка + СтраницыФормыExtendedTooltip 26 Label true @@ -416,116 +416,213 @@ Auto + + КоманднаяПанель + 43 + + ГруппаКнопокСлева + 37 + + ФормаКнопкаНазад + 1 + true + true + + true + + + ФормаКнопкаНазадExtendedTooltip + 22 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок слева</value> + + + ru + Группа кнопок слева + + + ГруппаКнопокСлеваРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаКнопокСправа + 39 + + ФормаКнопкаДалее + 2 + true + true + + true + + + ФормаКнопкаДалееExtendedTooltip + 23 + Label + true + true + + Left + + + Form.Command.Далее + Auto + true + true + true + UserCmds + Auto + + + ФормаКнопкаОтмена + 3 + true + true + + true + + + ФормаКнопкаОтменаExtendedTooltip + 24 + Label + true + true + + Left + + + Form.Command.Отмена + Normal + Auto + true + true + UserCmds + Auto + + + ФормаКнопкаСправка + 4 + true + true + + true + + + ФормаКнопкаСправкаExtendedTooltip + 25 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа кнопок справа</value> + + + ru + Группа кнопок справа + + + ГруппаКнопокСправаРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + Bottom true ФормаКоманднаяПанель -1 - - ФормаКнопкаНазад - 1 - true - true - - true - - - ФормаКнопкаНазадРасширеннаяПодсказка - 22 - Label - true - true - - Left - - - Form.Command.Назад - Normal - Auto - true - true - UserCmds - Auto - - - ФормаКнопкаДалее - 2 - true - true - - true - - - ФормаКнопкаДалееРасширеннаяПодсказка - 23 - Label - true - true - - Left - - - Form.Command.Далее - Auto - true - true - true - UserCmds - Auto - - - ФормаКнопкаОтмена - 3 - true - true - - true - - - ФормаКнопкаОтменаРасширеннаяПодсказка - 24 - Label - true - true - - Left - - - Form.Command.Отмена - Normal - Auto - true - true - UserCmds - Auto - - - ФормаКнопкаСправка - 4 - true - true - - true - - - ФормаКнопкаСправкаРасширеннаяПодсказка - 25 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - - Right + Left OnOpen @@ -649,7 +746,7 @@ Далее <key>ru</key> - <value>Далее >></value> + <value>Загрузить</value> 1 @@ -667,7 +764,7 @@ Назад <key>ru</key> - <value><< Назад </value> + <value>< Назад </value> 2 diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl index 4c0edc79a..8b73aea72 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ЗагрузкаКлассификатора/Module.bsl @@ -188,11 +188,11 @@ НСтр("ru ='Загрузка классификатора банков. %1.'"), Источник); Если ПараметрыЗагрузкиКлассификатора["ЗагрузкаВыполнена"] Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия,, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия,, ПараметрыЗагрузкиКлассификатора["ТекстСообщения"],, Истина); РаботаСБанкамиКлиент.ОповеститьКлассификаторУспешноОбновлен(); Иначе - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, "Ошибка", ПараметрыЗагрузкиКлассификатора["ТекстСообщения"],, Истина); КонецЕсли; Элементы.ПоясняющийТекст.Заголовок = ПараметрыЗагрузкиКлассификатора["ТекстСообщения"]; @@ -348,7 +348,7 @@ Если Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.СтраницаВыборИсточника Или Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ЗагрузкаССайтаРБК Тогда Элементы.ФормаКнопкаНазад.Доступность = Ложь; - Элементы.ФормаКнопкаДалее.Заголовок = НСтр("ru ='Далее >>'"); + Элементы.ФормаКнопкаДалее.Заголовок = НСтр("ru ='Загрузить'"); Элементы.ФормаКнопкаОтмена.Доступность = Истина; Элементы.ФормаКнопкаДалее.Доступность = Истина; ИначеЕсли Элементы.СтраницыФормы.ТекущаяСтраница = Элементы.ВыполняетсяЗагрузка Тогда diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 781ee595d..576766bf4 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -28,4 +28,6 @@ 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 index 75da0e27e..6d0f8e59c 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 33 + НаименованиеExtendedTooltip + 24 Label true true @@ -76,8 +76,8 @@ Список.Code - КодРасширеннаяПодсказка - 35 + КодExtendedTooltip + 25 Label true true @@ -118,8 +118,8 @@ Список.КоррСчет - КоррСчетРасширеннаяПодсказка - 37 + КоррСчетExtendedTooltip + 26 Label true true @@ -156,8 +156,8 @@ Список.Город - ГородРасширеннаяПодсказка - 39 + ГородExtendedTooltip + 27 Label true true @@ -197,8 +197,8 @@ Список.Адрес - АдресРасширеннаяПодсказка - 41 + АдресExtendedTooltip + 28 Label true true @@ -235,8 +235,8 @@ Список.Телефоны - ТелефоныРасширеннаяПодсказка - 43 + ТелефоныExtendedTooltip + 29 Label true true @@ -268,10 +268,10 @@ СписокСтрокаПоиска - 24 + 30 СписокСтрокаПоискаРасширеннаяПодсказка - 26 + 32 Label true true @@ -281,7 +281,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 25 + 31 true Список @@ -291,10 +291,10 @@ СписокСостояниеПросмотра - 27 + 33 СписокСостояниеПросмотраРасширеннаяПодсказка - 29 + 35 Label true true @@ -304,7 +304,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 28 + 34 true ViewStatusAddition @@ -315,10 +315,10 @@ СписокУправлениеПоиском - 30 + 36 СписокУправлениеПоискомРасширеннаяПодсказка - 32 + 38 Label true true @@ -328,7 +328,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 31 + 37 true SearchControlAddition @@ -338,7 +338,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 23 Label true @@ -400,7 +400,7 @@ true - ФормаЗагрузитьКлассификаторРасширеннаяПодсказка + ФормаЗагрузитьКлассификаторExtendedTooltip 21 Label true @@ -426,7 +426,7 @@ true - ФормаПоказыватьНедействующиеБанкиРасширеннаяПодсказка + ФормаПоказыватьНедействующиеБанкиExtendedTooltip 22 Label true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl index e2feb1539..10cde5fc8 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаВыбора/Module.bsl @@ -28,7 +28,7 @@ &НаКлиенте Процедура ЗагрузитьКлассификатор(Команда) - ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", , ЭтаФорма); + ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", , ЭтотОбъект); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 781ee595d..576766bf4 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -28,4 +28,6 @@ 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 index bb21d6c97..bc10e6804 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 28 + НаименованиеExtendedTooltip + 19 Label true true @@ -79,8 +79,8 @@ Список.Code - КодРасширеннаяПодсказка - 30 + КодExtendedTooltip + 20 Label true true @@ -122,8 +122,8 @@ Список.КоррСчет - КоррСчетРасширеннаяПодсказка - 32 + КоррСчетExtendedTooltip + 21 Label true true @@ -162,8 +162,8 @@ Список.Город - ГородРасширеннаяПодсказка - 34 + ГородExtendedTooltip + 22 Label true true @@ -203,8 +203,8 @@ Список.Адрес - АдресРасширеннаяПодсказка - 36 + АдресExtendedTooltip + 23 Label true true @@ -240,10 +240,10 @@ СписокСтрокаПоиска - 19 + 24 СписокСтрокаПоискаРасширеннаяПодсказка - 21 + 26 Label true true @@ -253,7 +253,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 20 + 25 true Список @@ -263,10 +263,10 @@ СписокСостояниеПросмотра - 22 + 27 СписокСостояниеПросмотраРасширеннаяПодсказка - 24 + 29 Label true true @@ -276,7 +276,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 23 + 28 true ViewStatusAddition @@ -287,10 +287,10 @@ СписокУправлениеПоиском - 25 + 30 СписокУправлениеПоискомРасширеннаяПодсказка - 27 + 32 Label true true @@ -300,7 +300,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 26 + 31 true SearchControlAddition @@ -310,7 +310,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 18 Label true @@ -377,7 +377,7 @@ true - ФормаЗагрузитьКлассификаторРасширеннаяПодсказка + ФормаЗагрузитьКлассификаторExtendedTooltip 17 Label true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl index f7e4eb419..6b3346328 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаСписка/Module.bsl @@ -27,5 +27,5 @@ &НаКлиенте Процедура ЗагрузитьКлассификатор(Команда) ПараметрыФормы = Новый Структура("ОткрытиеИзСписка"); - ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.КлассификаторБанковРФ.Форма.ЗагрузкаКлассификатора", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form index 402f4d8b1..cc51eb8bc 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Form.form @@ -19,7 +19,7 @@ true - НадписьДеятельностьБанкаПрекращенаРасширеннаяПодсказка + НадписьДеятельностьБанкаПрекращенаExtendedTooltip 26 Label true @@ -57,7 +57,7 @@ Страница надпись деятельность прекращена - СтраницаНадписьДеятельностьПрекращенаРасширеннаяПодсказка + СтраницаНадписьДеятельностьПрекращенаExtendedTooltip 25 Label true @@ -88,7 +88,7 @@ Right - ДеятельностьПрекращенаРасширеннаяПодсказка + ДеятельностьПрекращенаExtendedTooltip 28 Label true @@ -123,7 +123,7 @@ Страница флажок деятельность прекращена - СтраницаФлажокДеятельностьПрекращенаРасширеннаяПодсказка + СтраницаФлажокДеятельностьПрекращенаExtendedTooltip 27 Label true @@ -152,7 +152,7 @@ Страницы деятельность прекращена - СтраницыДеятельностьПрекращенаРасширеннаяПодсказка + СтраницыДеятельностьПрекращенаExtendedTooltip 24 Label true @@ -178,8 +178,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 30 + НаименованиеExtendedTooltip + 29 Label true true @@ -224,8 +224,8 @@ Объект.КоррСчет - КоррСчетРасширеннаяПодсказка - 33 + КоррСчетExtendedTooltip + 31 Label true true @@ -267,8 +267,8 @@ Объект.Code - КодРасширеннаяПодсказка - 35 + КодExtendedTooltip + 32 Label true true @@ -308,8 +308,8 @@ Группа корр счет БИК - ГруппаКоррСчетБИКРасширеннаяПодсказка - 32 + ГруппаКоррСчетБИКExtendedTooltip + 30 Label true true @@ -341,8 +341,8 @@ Объект.Город - ГородРасширеннаяПодсказка - 38 + ГородExtendedTooltip + 34 Label true true @@ -384,8 +384,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 40 + РодительExtendedTooltip + 35 Label true true @@ -425,8 +425,8 @@ Группа город - ГруппаГородРасширеннаяПодсказка - 37 + ГруппаГородExtendedTooltip + 33 Label true true @@ -455,8 +455,8 @@ Объект.Адрес - АдресРасширеннаяПодсказка - 42 + АдресExtendedTooltip + 36 Label true true @@ -498,8 +498,8 @@ Объект.Телефоны - ТелефоныРасширеннаяПодсказка - 44 + ТелефоныExtendedTooltip + 37 Label true true diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl index feb65270f..06a44845e 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Forms/ФормаЭлемента/Module.bsl @@ -22,10 +22,10 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульАвтономнаяРабота = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АвтономнаяРабота"); - МодульАвтономнаяРабота.ОбъектПриЧтенииНаСервере(ТекущийОбъект, ЭтаФорма.ТолькоПросмотр); + МодульАвтономнаяРабота = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРабота"); + МодульАвтономнаяРабота.ОбъектПриЧтенииНаСервере(ТекущийОбъект, ЭтотОбъект.ТолькоПросмотр); КонецЕсли; diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html b/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html index ecb85ceab..5917d6b9f 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/Help/ru.html @@ -1,6 +1,7 @@ - +

      В классификаторе банков РФ хранятся сведения о банках: БИК, корреспондентский счет, данные о местонахождении, телефоны для связи с сотрудниками, почтовый адрес банка. Эти сведения используются при заполнении реквизитов банковских счетов и в других объектах программы.

      По команде Загрузить классификатор можно обновить сведения о банках с сайта РБК или из поставляемого на диске 1С:ИТС "Общероссийского классификатора банков" (ОКБ).

      +

      Следует иметь ввиду, что сведения об адресах и телефонах банков загружаются только с диска 1С:ИТС.

      Также можно настроить обновление классификатора с сайта РБК автоматически по расписанию с помощью регламентного задания Загрузка классификатора банков РФ с сайта РБК.

      Реквизиты:

      diff --git a/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl b/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl index 133d43b3f..144cba291 100644 --- a/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl +++ b/SSL/src/Catalogs/КлассификаторБанковРФ/ManagerModule.bsl @@ -1,4 +1,19 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +// Возвращает реквизиты справочника, которые образуют естественный ключ +// для элементов справочника. +// +// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих +// естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + + Результат = Новый Массив(); + + Результат.Добавить("Код"); + + Возврат Результат; + +КонецФункции #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normalb75fecce-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 index f3bfeeee4..618d65892 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаВыбора/Form.form @@ -25,8 +25,8 @@ Список.Ref - СсылкаРасширеннаяПодсказка - 18 + СсылкаExtendedTooltip + 9 Label true true @@ -61,10 +61,10 @@ СписокСтрокаПоиска - 9 + 10 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 12 Label true true @@ -74,7 +74,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 11 true Список @@ -84,10 +84,10 @@ СписокСостояниеПросмотра - 12 + 13 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 15 Label true true @@ -97,7 +97,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 14 true ViewStatusAddition @@ -108,10 +108,10 @@ СписокУправлениеПоиском - 15 + 16 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 18 Label true true @@ -121,7 +121,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 17 true SearchControlAddition @@ -131,7 +131,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index c135eb38a..a479ef814 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -16,4 +16,6 @@ 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 index bd3b9f732..02fa12d22 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаСписка/Form.form @@ -26,8 +26,8 @@ true - НаименованиеРасширеннаяПодсказка - 22 + НаименованиеExtendedTooltip + 13 Label true true @@ -62,8 +62,8 @@ Список.Приоритет - ПриоритетРасширеннаяПодсказка - 24 + ПриоритетExtendedTooltip + 14 Label true true @@ -98,8 +98,8 @@ Список.ЦелевоеВремя - ЦелевоеВремяРасширеннаяПодсказка - 26 + ЦелевоеВремяExtendedTooltip + 15 Label true true @@ -134,8 +134,8 @@ Список.МинимальноДопустимыйУровень - МинимальноДопустимыйУровеньРасширеннаяПодсказка - 28 + МинимальноДопустимыйУровеньExtendedTooltip + 16 Label true true @@ -166,10 +166,10 @@ СписокСтрокаПоиска - 13 + 17 СписокСтрокаПоискаРасширеннаяПодсказка - 15 + 19 Label true true @@ -179,7 +179,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 14 + 18 true Список @@ -189,10 +189,10 @@ СписокСостояниеПросмотра - 16 + 20 СписокСостояниеПросмотраРасширеннаяПодсказка - 18 + 22 Label true true @@ -202,7 +202,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 17 + 21 true ViewStatusAddition @@ -213,10 +213,10 @@ СписокУправлениеПоиском - 19 + 23 СписокУправлениеПоискомРасширеннаяПодсказка - 21 + 25 Label true true @@ -226,7 +226,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 20 + 24 true SearchControlAddition @@ -236,7 +236,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 12 Label true diff --git a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаЭлемента/Form.form index b54f9fe44..85645885c 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/КлючевыеОперации/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 11 Label true @@ -53,8 +53,8 @@ Объект.Приоритет - ПриоритетРасширеннаяПодсказка - 13 + ПриоритетExtendedTooltip + 12 Label true true @@ -95,8 +95,8 @@ Объект.ЦелевоеВремя - ЦелевоеВремяРасширеннаяПодсказка - 15 + ЦелевоеВремяExtendedTooltip + 13 Label true true @@ -136,8 +136,8 @@ Объект.МинимальноДопустимыйУровень - МинимальноДопустимыйУровеньРасширеннаяПодсказка - 17 + МинимальноДопустимыйУровеньExtendedTooltip + 14 Label true true diff --git a/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl b/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl index dff6d5112..800977702 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl +++ b/SSL/src/Catalogs/КлючевыеОперации/ObjectModule.bsl @@ -42,7 +42,7 @@ "Справочник.КлючевыеОперации.МодульОбъекта.ПередЗаписью", УровеньЖурналаРегистрации.Ошибка, ТекстСообщения); - Сообщить(ТекстСообщения); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); Отказ = Истина; КонецЕсли; diff --git a/SSL/src/Catalogs/КлючевыеОперации/КлючевыеОперации.mdo b/SSL/src/Catalogs/КлючевыеОперации/КлючевыеОперации.mdo index af6dc8a5d..d5a6386ca 100644 --- a/SSL/src/Catalogs/КлючевыеОперации/КлючевыеОперации.mdo +++ b/SSL/src/Catalogs/КлючевыеОперации/КлючевыеОперации.mdo @@ -109,6 +109,7 @@ + AutoUpdate InDialog BothWays Catalog.КлючевыеОперации.Form.ФормаЭлемента diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 31eeca29e..c086fdc26 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаВыбора/Form.form @@ -36,8 +36,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -72,10 +72,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -85,7 +85,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -95,10 +95,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -108,7 +108,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -119,10 +119,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -132,7 +132,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -142,7 +142,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form index f1eb50acd..72a3ac751 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаГруппы/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 3 Label true diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/НаборыСвойств/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/НаборыСвойств/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/НаборыСвойств/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Attributes/НаборыСвойств/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 232e92804..16f91ee19 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Form.form @@ -16,7 +16,7 @@ ЭтоНаборыДополнительныхСведенийПриИзменении - ЭтоНаборыДополнительныхСведенийРасширеннаяПодсказка + ЭтоНаборыДополнительныхСведенийExtendedTooltip 103 Label true @@ -82,8 +82,8 @@ true - СвойстваТолькоСоздатьРасширеннаяПодсказка - 106 + СвойстваТолькоСоздатьExtendedTooltip + 105 Label true true @@ -114,8 +114,8 @@ true - СвойстваСоздатьРасширеннаяПодсказка - 108 + СвойстваСоздатьExtendedTooltip + 107 Label true true @@ -140,8 +140,8 @@ true - СвойстваСоздатьПоОбразцуРасширеннаяПодсказка - 109 + СвойстваСоздатьПоОбразцуExtendedTooltip + 108 Label true true @@ -166,8 +166,8 @@ true - СвойстваСоздатьОбщееРасширеннаяПодсказка - 110 + СвойстваСоздатьОбщееExtendedTooltip + 109 Label true true @@ -193,8 +193,8 @@ Добавить - СвойстваПодменюДобавитьРасширеннаяПодсказка - 107 + СвойстваПодменюДобавитьExtendedTooltip + 106 Label true true @@ -223,8 +223,8 @@ true - СвойстваСкопироватьРасширеннаяПодсказка - 112 + СвойстваСкопироватьExtendedTooltip + 111 Label true true @@ -249,8 +249,8 @@ true - СвойстваИзменитьРасширеннаяПодсказка - 113 + СвойстваИзменитьExtendedTooltip + 112 Label true true @@ -275,8 +275,8 @@ true - СвойстваПометитьНаУдалениеРасширеннаяПодсказка - 114 + СвойстваПометитьНаУдалениеExtendedTooltip + 113 Label true true @@ -302,8 +302,8 @@ Свойства группа кнопок 2 - СвойстваГруппаКнопок2РасширеннаяПодсказка - 111 + СвойстваГруппаКнопок2ExtendedTooltip + 110 Label true true @@ -325,8 +325,8 @@ true - СвойстваПереместитьВверхРасширеннаяПодсказка - 116 + СвойстваПереместитьВверхExtendedTooltip + 115 Label true true @@ -351,8 +351,8 @@ true - СвойстваПереместитьВнизРасширеннаяПодсказка - 117 + СвойстваПереместитьВнизExtendedTooltip + 116 Label true true @@ -378,8 +378,8 @@ Свойства группа кнопок 3 - СвойстваГруппаКнопок3РасширеннаяПодсказка - 115 + СвойстваГруппаКнопок3ExtendedTooltip + 114 Label true true @@ -398,8 +398,8 @@ true - СписокНайтиРасширеннаяПодсказка - 118 + СписокНайтиExtendedTooltip + 117 Label true true @@ -424,8 +424,8 @@ true - СписокОтменитьПоискРасширеннаяПодсказка - 119 + СписокОтменитьПоискExtendedTooltip + 118 Label true true @@ -450,8 +450,8 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка - 120 + ФормаИзменитьФормуExtendedTooltip + 119 Label true true @@ -476,8 +476,8 @@ true - ФормаСправкаРасширеннаяПодсказка - 121 + ФормаСправкаExtendedTooltip + 120 Label true true @@ -507,8 +507,8 @@ Командная панель формы - КоманднаяПанельФормыРасширеннаяПодсказка - 105 + КоманднаяПанельФормыExtendedTooltip + 104 Label true true @@ -563,8 +563,8 @@ true - ПредставлениеРасширеннаяПодсказка - 133 + ПредставлениеExtendedTooltip + 123 Label true true @@ -610,10 +610,10 @@ НаборыСвойствСтрокаПоиска - 124 + 140 НаборыСвойствСтрокаПоискаРасширеннаяПодсказка - 126 + 142 Label true true @@ -623,7 +623,7 @@ НаборыСвойствСтрокаПоискаКонтекстноеМеню - 125 + 141 true НаборыСвойств @@ -633,10 +633,10 @@ НаборыСвойствСостояниеПросмотра - 127 + 143 НаборыСвойствСостояниеПросмотраРасширеннаяПодсказка - 129 + 145 Label true true @@ -646,7 +646,7 @@ НаборыСвойствСостояниеПросмотраКонтекстноеМеню - 128 + 144 true ViewStatusAddition @@ -657,10 +657,10 @@ НаборыСвойствУправлениеПоиском - 130 + 146 НаборыСвойствУправлениеПоискомРасширеннаяПодсказка - 132 + 148 Label true true @@ -670,7 +670,7 @@ НаборыСвойствУправлениеПоискомКонтекстноеМеню - 131 + 147 true SearchControlAddition @@ -680,8 +680,8 @@ - НаборыСвойствРасширеннаяПодсказка - 123 + НаборыСвойствExtendedTooltip + 122 Label true true @@ -767,8 +767,8 @@ Свойства.Заголовок - СвойстваЗаголовокРасширеннаяПодсказка - 162 + СвойстваЗаголовокExtendedTooltip + 134 Label true true @@ -813,8 +813,8 @@ Типы значения, которое можно ввести при заполнении реквизита. - СвойстваТипЗначенияРасширеннаяПодсказка - 164 + СвойстваТипЗначенияExtendedTooltip + 135 Label true true @@ -857,8 +857,8 @@ Настройка проверки заполненности дополнительного реквизита. - СвойстваЗаполнятьОбязательноРасширеннаяПодсказка - 166 + СвойстваЗаполнятьОбязательноExtendedTooltip + 136 Label true true @@ -893,8 +893,8 @@ Реквизит использует список значений реквизита-образца. - СвойстваОбщиеЗначенияРасширеннаяПодсказка - 168 + СвойстваОбщиеЗначенияExtendedTooltip + 137 Label true true @@ -929,8 +929,8 @@ Реквизит может быть в нескольких разных наборах. - СвойстваОбщееРасширеннаяПодсказка - 170 + СвойстваОбщееExtendedTooltip + 138 Label true true @@ -978,10 +978,10 @@ СвойстваСтрокаПоиска - 153 + 158 СвойстваСтрокаПоискаРасширеннаяПодсказка - 155 + 160 Label true true @@ -991,7 +991,7 @@ СвойстваСтрокаПоискаКонтекстноеМеню - 154 + 159 true Свойства @@ -1001,10 +1001,10 @@ СвойстваСостояниеПросмотра - 156 + 161 СвойстваСостояниеПросмотраРасширеннаяПодсказка - 158 + 163 Label true true @@ -1014,7 +1014,7 @@ СвойстваСостояниеПросмотраКонтекстноеМеню - 157 + 162 true ViewStatusAddition @@ -1025,10 +1025,10 @@ СвойстваУправлениеПоиском - 159 + 164 СвойстваУправлениеПоискомРасширеннаяПодсказка - 161 + 166 Label true true @@ -1038,7 +1038,7 @@ СвойстваУправлениеПоискомКонтекстноеМеню - 160 + 165 true SearchControlAddition @@ -1048,8 +1048,8 @@ - СвойстваРасширеннаяПодсказка - 152 + СвойстваExtendedTooltip + 133 Label true true @@ -1073,8 +1073,8 @@ true - СвойстваКонтекстноеМенюТолькоСоздатьРасширеннаяПодсказка - 143 + СвойстваКонтекстноеМенюТолькоСоздатьExtendedTooltip + 124 Label true true @@ -1105,8 +1105,8 @@ true - СвойстваКонтекстноеМенюСоздатьРасширеннаяПодсказка - 145 + СвойстваКонтекстноеМенюСоздатьExtendedTooltip + 126 Label true true @@ -1131,8 +1131,8 @@ true - СвойстваКонтекстноеМенюСоздатьПоОбразцуРасширеннаяПодсказка - 146 + СвойстваКонтекстноеМенюСоздатьПоОбразцуExtendedTooltip + 127 Label true true @@ -1157,8 +1157,8 @@ true - СвойстваКонтекстноеМенюСоздатьОбщееРасширеннаяПодсказка - 147 + СвойстваКонтекстноеМенюСоздатьОбщееExtendedTooltip + 128 Label true true @@ -1184,8 +1184,8 @@ Добавить - СвойстваКонтекстноеМенюПодменюДобавитьРасширеннаяПодсказка - 144 + СвойстваКонтекстноеМенюПодменюДобавитьExtendedTooltip + 125 Label true true @@ -1214,8 +1214,8 @@ true - СвойстваКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 149 + СвойстваКонтекстноеМенюСкопироватьExtendedTooltip + 130 Label true true @@ -1240,8 +1240,8 @@ true - СвойстваКонтекстноеМенюИзменитьРасширеннаяПодсказка - 150 + СвойстваКонтекстноеМенюИзменитьExtendedTooltip + 131 Label true true @@ -1266,8 +1266,8 @@ true - СвойстваКонтекстноеМенюПометитьНаУдалениеРасширеннаяПодсказка - 151 + СвойстваКонтекстноеМенюПометитьНаУдалениеExtendedTooltip + 132 Label true true @@ -1293,8 +1293,8 @@ Свойства контекстное меню группа кнопок 2 - СвойстваКонтекстноеМенюГруппаКнопок2РасширеннаяПодсказка - 148 + СвойстваКонтекстноеМенюГруппаКнопок2ExtendedTooltip + 129 Label true true @@ -1351,8 +1351,8 @@ Горизонтальная группа 1 - ГоризонтальнаяГруппа1РасширеннаяПодсказка - 122 + ГоризонтальнаяГруппа1ExtendedTooltip + 121 Label true true diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl index b2b8c36ed..3b4ec9d7c 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаСписка/Module.bsl @@ -90,7 +90,7 @@ &НаКлиенте Процедура СвойстваПриАктивизацииСтроки(Элемент) - СвойстваУстановитьДоступностьКоманд(ЭтаФорма); + СвойстваУстановитьДоступностьКоманд(ЭтотОбъект); КонецПроцедуры @@ -553,19 +553,27 @@ КонецЕсли; КонецЕсли; - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ВыполнитьКомандуНаСервере("ИзменитьПометкуУдаления"); - - Оповестить("Запись_НаборыДополнительныхРеквизитовИСведений", - Новый Структура("Ссылка", ТекущийНабор), ТекущийНабор); + ПоказатьВопрос( + Новый ОписаниеОповещения("ИзменитьПометкуУдаленияЗавершение", ЭтотОбъект, ТекущийНабор), + ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ИзменитьПометкуУдаленияЗавершение(Ответ, ТекущийНабор) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ВыполнитьКомандуНаСервере("ИзменитьПометкуУдаления"); + + Оповестить("Запись_НаборыДополнительныхРеквизитовИСведений", + Новый Структура("Ссылка", ТекущийНабор), ТекущийНабор); + +КонецПроцедуры + &НаСервере Процедура ПриИзмененииТекущегоНабораНаСервере() @@ -589,7 +597,7 @@ Элементы.Свойства.ТолькоПросмотр = НЕ ТекущаяДоступность; КонецЕсли; - СвойстваУстановитьДоступностьКоманд(ЭтаФорма); + СвойстваУстановитьДоступностьКоманд(ЭтотОбъект); Элементы.НаборыСвойств.Обновить(); diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form index f8663b3db..b5449012d 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 96 Label true @@ -52,8 +52,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 98 + РодительExtendedTooltip + 97 Label true true @@ -105,8 +105,8 @@ Объект.ДополнительныеРеквизиты.Свойство - ДополнительныеРеквизитыСвойствоРасширеннаяПодсказка - 110 + ДополнительныеРеквизитыСвойствоExtendedTooltip + 99 Label true true @@ -146,8 +146,8 @@ Объект.ДополнительныеРеквизиты.ПометкаУдаления - ДополнительныеРеквизитыПометкаУдаленияРасширеннаяПодсказка - 112 + ДополнительныеРеквизитыПометкаУдаленияExtendedTooltip + 100 Label true true @@ -176,10 +176,10 @@ ДополнительныеРеквизитыСтрокаПоиска - 101 + 106 ДополнительныеРеквизитыСтрокаПоискаРасширеннаяПодсказка - 103 + 108 Label true true @@ -189,7 +189,7 @@ ДополнительныеРеквизитыСтрокаПоискаКонтекстноеМеню - 102 + 107 true ДополнительныеРеквизиты @@ -199,10 +199,10 @@ ДополнительныеРеквизитыСостояниеПросмотра - 104 + 109 ДополнительныеРеквизитыСостояниеПросмотраРасширеннаяПодсказка - 106 + 111 Label true true @@ -212,7 +212,7 @@ ДополнительныеРеквизитыСостояниеПросмотраКонтекстноеМеню - 105 + 110 true ViewStatusAddition @@ -223,10 +223,10 @@ ДополнительныеРеквизитыУправлениеПоиском - 107 + 112 ДополнительныеРеквизитыУправлениеПоискомРасширеннаяПодсказка - 109 + 114 Label true true @@ -236,7 +236,7 @@ ДополнительныеРеквизитыУправлениеПоискомКонтекстноеМеню - 108 + 113 true SearchControlAddition @@ -246,8 +246,8 @@ - ДополнительныеРеквизитыРасширеннаяПодсказка - 100 + ДополнительныеРеквизитыExtendedTooltip + 98 Label true true @@ -312,8 +312,8 @@ Объект.ДополнительныеСведения.Свойство - ДополнительныеСведенияСвойствоРасширеннаяПодсказка - 132 + ДополнительныеСведенияСвойствоExtendedTooltip + 102 Label true true @@ -353,8 +353,8 @@ Объект.ДополнительныеСведения.ПометкаУдаления - ДополнительныеСведенияПометкаУдаленияРасширеннаяПодсказка - 134 + ДополнительныеСведенияПометкаУдаленияExtendedTooltip + 103 Label true true @@ -383,10 +383,10 @@ ДополнительныеСведенияСтрокаПоиска - 123 + 125 ДополнительныеСведенияСтрокаПоискаРасширеннаяПодсказка - 125 + 127 Label true true @@ -396,7 +396,7 @@ ДополнительныеСведенияСтрокаПоискаКонтекстноеМеню - 124 + 126 true ДополнительныеСведения @@ -406,10 +406,10 @@ ДополнительныеСведенияСостояниеПросмотра - 126 + 128 ДополнительныеСведенияСостояниеПросмотраРасширеннаяПодсказка - 128 + 130 Label true true @@ -419,7 +419,7 @@ ДополнительныеСведенияСостояниеПросмотраКонтекстноеМеню - 127 + 129 true ViewStatusAddition @@ -430,10 +430,10 @@ ДополнительныеСведенияУправлениеПоиском - 129 + 131 ДополнительныеСведенияУправлениеПоискомРасширеннаяПодсказка - 131 + 133 Label true true @@ -443,7 +443,7 @@ ДополнительныеСведенияУправлениеПоискомКонтекстноеМеню - 130 + 132 true SearchControlAddition @@ -453,8 +453,8 @@ - ДополнительныеСведенияРасширеннаяПодсказка - 122 + ДополнительныеСведенияExtendedTooltip + 101 Label true true diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html index 508fef602..a6c7c1389 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/Help/ru.html @@ -1,4 +1,4 @@ - +

      Администратор системы может настроить наборы дополнительных свойств для определенных объектов системы. Способ хранения дополнительного свойства в информационной базе и место размещения на форме объекта зависит от типа свойства: дополнительный реквизит или сведение.

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

      Для набора выбранного в левой таблице можно добавить новые дополнительные свойства с помощью командной панели в правой таблице.

      diff --git a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl index 7296d0b0c..99a234dc6 100644 --- a/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl +++ b/SSL/src/Catalogs/НаборыДополнительныхРеквизитовИСведений/ManagerModule.bsl @@ -1,5 +1,19 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + + Возврат РедактируемыеРеквизиты; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС diff --git a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt b/SSL/src/Catalogs/НазначенияСертификатовЭП/Templates/НазначенияСертификатов/Template.txt similarity index 100% rename from SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/НазначенияСертификатов/Template.txt rename to SSL/src/Catalogs/НазначенияСертификатовЭП/Templates/НазначенияСертификатов/Template.txt diff --git a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/УдаленныйНазначенияСертификатов/Template.txt b/SSL/src/Catalogs/НазначенияСертификатовЭП/Templates/УдаленныйНазначенияСертификатов/Template.txt similarity index 100% rename from SSL/src/Catalogs/НазначенияСертификатовЭЦП/Templates/УдаленныйНазначенияСертификатов/Template.txt rename to SSL/src/Catalogs/НазначенияСертификатовЭП/Templates/УдаленныйНазначенияСертификатов/Template.txt diff --git a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo b/SSL/src/Catalogs/НазначенияСертификатовЭП/НазначенияСертификатовЭП.mdo similarity index 96% rename from SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo rename to SSL/src/Catalogs/НазначенияСертификатовЭП/НазначенияСертификатовЭП.mdo index ae411fa61..f2aa589a6 100644 --- a/SSL/src/Catalogs/НазначенияСертификатовЭЦП/НазначенияСертификатовЭЦП.mdo +++ b/SSL/src/Catalogs/НазначенияСертификатовЭП/НазначенияСертификатовЭП.mdo @@ -7,14 +7,14 @@ - НазначенияСертификатовЭЦП + НазначенияСертификатовЭП ru Назначения сертификатов ЭП true - Catalog.НазначенияСертификатовЭЦП.StandardAttribute.Description - Catalog.НазначенияСертификатовЭЦП.StandardAttribute.Code + Catalog.НазначенияСертификатовЭП.StandardAttribute.Description + Catalog.НазначенияСертификатовЭП.StandardAttribute.Code DontUse Use @@ -124,7 +124,6 @@ String Variable true - true InDialog BothWays diff --git a/SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/CommandModule.bsl b/SSL/src/Catalogs/Организации/Commands/ДобавитьОрганизацию/CommandModule.bsl similarity index 69% rename from SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/CommandModule.bsl rename to SSL/src/Catalogs/Организации/Commands/ДобавитьОрганизацию/CommandModule.bsl index 992a5fb73..32435c1ee 100644 --- a/SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/CommandModule.bsl +++ b/SSL/src/Catalogs/Организации/Commands/ДобавитьОрганизацию/CommandModule.bsl @@ -1,12 +1,9 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ - &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОткрытьФорму( - "ОбщаяФорма.ЗагрузкаДанныхИзСервиса", + "Справочник.Организации.ФормаОбъекта", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, diff --git a/SSL/src/Catalogs/Организации/Commands/Организации/CommandModule.bsl b/SSL/src/Catalogs/Организации/Commands/Организации/CommandModule.bsl new file mode 100644 index 000000000..fc624e94d --- /dev/null +++ b/SSL/src/Catalogs/Организации/Commands/Организации/CommandModule.bsl @@ -0,0 +1,12 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Справочник.Организации.ФормаСписка", + , + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Организации/Commands/РеквизитыОрганизации/CommandModule.bsl b/SSL/src/Catalogs/Организации/Commands/РеквизитыОрганизации/CommandModule.bsl new file mode 100644 index 000000000..844bb5555 --- /dev/null +++ b/SSL/src/Catalogs/Организации/Commands/РеквизитыОрганизации/CommandModule.bsl @@ -0,0 +1,19 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + + ОткрытьФорму( + "Справочник.Организации.ФормаОбъекта", + ПолучитьПараметрыОткрытиФормы(), + ПараметрыВыполненияКоманды.Источник, + ПараметрыВыполненияКоманды.Уникальность, + ПараметрыВыполненияКоманды.Окно); + +КонецПроцедуры + +&НаСервере +Функция ПолучитьПараметрыОткрытиФормы() + + Возврат Новый Структура("Ключ", Справочники.Организации.ОрганизацияПоУмолчанию()); + +КонецФункции diff --git a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form index 799b15436..ae6baa98e 100644 --- a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Code - КодРасширеннаяПодсказка + КодExtendedTooltip 11 Label true @@ -55,8 +55,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 14 + НаименованиеExtendedTooltip + 13 Label true true @@ -95,8 +95,8 @@ Объект.Префикс - ПрефиксРасширеннаяПодсказка - 16 + ПрефиксExtendedTooltip + 14 Label true true @@ -137,8 +137,8 @@ Основная группировка - ОсновнаяГруппировкаРасширеннаяПодсказка - 13 + ОсновнаяГруппировкаExtendedTooltip + 12 Label true true @@ -172,8 +172,8 @@ Группа контактная информация - ГруппаКонтактнаяИнформацияРасширеннаяПодсказка - 18 + ГруппаКонтактнаяИнформацияExtendedTooltip + 15 Label true true @@ -207,7 +207,7 @@ FillCheckProcessingAtServer ОбработкаПроверкиЗаполненияНаСервере - LockOwner + DontBlock true true true @@ -233,6 +233,23 @@
      true
      true + + ОбновитьИнтерфейс + + <key>ru</key> + <value>Обновить интерфейс</value> + + 2 + + Boolean + + + true + + + true + + @@ -251,6 +268,10 @@ + + AfterWrite + ПослеЗаписи + OnReadAtServer ПриЧтенииНаСервере diff --git a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl index 06ed7ef15..a3315196b 100644 --- a/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Организации/Forms/ФормаЭлемента/Module.bsl @@ -9,7 +9,7 @@ КонецЕсли; // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтаФорма, Объект, "ГруппаКонтактнаяИнформация"); + УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "ГруппаКонтактнаяИнформация"); // Конец СтандартныеПодсистемы.КонтактнаяИнформация КонецПроцедуры @@ -18,7 +18,7 @@ Процедура ПриЧтенииНаСервере(ТекущийОбъект) // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.КонтактнаяИнформация КонецПроцедуры @@ -27,7 +27,7 @@ Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтаФорма, Объект, Отказ); + УправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, Объект, Отказ); // Конец СтандартныеПодсистемы.КонтактнаяИнформация КонецПроцедуры @@ -36,9 +36,20 @@ Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.КонтактнаяИнформация + ОбновитьИнтерфейс = ТекущийОбъект.ЭтоНовый() И НЕ ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций"); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеЗаписи(ПараметрыЗаписи) + + Если ОбновитьИнтерфейс Тогда + ОбновитьИнтерфейс(); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -49,14 +60,14 @@ &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент) - УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора(ЭтаФорма, Элемент, , СтандартнаяОбработка); + Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора(ЭтотОбъект, Элемент, , СтандартнаяОбработка); ОбновитьКонтактнуюИнформацию(Результат); КонецПроцедуры @@ -64,7 +75,7 @@ &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка) - Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеОчистка(ЭтаФорма, Элемент.Имя); + Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеОчистка(ЭтотОбъект, Элемент.Имя); ОбновитьКонтактнуюИнформацию(Результат); КонецПроцедуры @@ -72,17 +83,17 @@ &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда) - Результат = УправлениеКонтактнойИнформациейКлиент.ПодключаемаяКоманда(ЭтаФорма, Команда.Имя); + Результат = УправлениеКонтактнойИнформациейКлиент.ПодключаемаяКоманда(ЭтотОбъект, Команда.Имя); ОбновитьКонтактнуюИнформацию(Результат); - УправлениеКонтактнойИнформациейКлиент.ОткрытьФормуВводаАдреса(ЭтаФорма, Результат); + УправлениеКонтактнойИнформациейКлиент.ОткрытьФормуВводаАдреса(ЭтотОбъект, Результат); КонецПроцедуры &НаСервере Функция ОбновитьКонтактнуюИнформацию(Результат = Неопределено) - Возврат УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтаФорма, Объект, Результат); + Возврат УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтотОбъект, Объект, Результат); КонецФункции -// Конец СтандартныеПодсистемы.КонтактнаяИнформация \ No newline at end of file +// Конец СтандартныеПодсистемы.КонтактнаяИнформация diff --git a/SSL/src/Catalogs/Организации/ManagerModule.bsl b/SSL/src/Catalogs/Организации/ManagerModule.bsl new file mode 100644 index 000000000..821667c7b --- /dev/null +++ b/SSL/src/Catalogs/Организации/ManagerModule.bsl @@ -0,0 +1,101 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +//////////////////////////////////////////////////////////////////////////////// +// Групповое изменение объектов + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + Результат = Новый Массив; + Результат.Добавить("Префикс"); + Возврат Результат; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Использование нескольких организаций + +// Возвращает организацию по умолчанию. +// Если в ИБ есть только одна организация, которая не помечена на удаление и не является предопределенной, +// то будет возвращена ссылка на нее, иначе будет возвращена пустая ссылка. +// +// Возвращаемое значение: +// СправочникСсылка.Организации - ссылка на организацию +// +Функция ОрганизацияПоУмолчанию() Экспорт + + Организация = Справочники.Организации.ПустаяСсылка(); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2 + | Организации.Ссылка КАК Организация + |ИЗ + | Справочник.Организации КАК Организации + |ГДЕ + | НЕ Организации.ПометкаУдаления + | И НЕ Организации.Предопределенный"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() И Выборка.Количество() = 1 Тогда + Организация = Выборка.Организация; + КонецЕсли; + + Возврат Организация; + +КонецФункции + +// Возвращает количество элементов справочника Организации. +// Не учитывает предопределенные и помеченные на удаление элементы. +// +// Возвращаемое значение: +// Число - количество организаций +// +Функция КоличествоОрганизаций() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Количество = 0; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | КОЛИЧЕСТВО(*) КАК Количество + |ИЗ + | Справочник.Организации КАК Организации + |ГДЕ + | НЕ Организации.Предопределенный"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + Количество = Выборка.Количество; + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат Количество; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Вызывается при переходе на версию БСП 2.2.1.12 +// +Процедура ЗаполнитьКонстантуИспользоватьНесколькоОрганизаций() Экспорт + + Если ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций") = + ПолучитьФункциональнуюОпцию("НеИспользоватьНесколькоОрганизаций") Тогда + // Опции должны иметь противоположные значения. + // Если это не так, то значит в ИБ раньше не было этих опций - инициализируем их значения. + Константы.ИспользоватьНесколькоОрганизаций.Установить(КоличествоОрганизаций() > 1); + КонецЕсли; + +КонецПроцедуры + +#КонецЕсли diff --git a/SSL/src/Catalogs/Организации/Организации.mdo b/SSL/src/Catalogs/Организации/Организации.mdo index b06e97280..adb545149 100644 --- a/SSL/src/Catalogs/Организации/Организации.mdo +++ b/SSL/src/Catalogs/Организации/Организации.mdo @@ -13,7 +13,6 @@ Организации Организации - true Catalog.Организации.StandardAttribute.Description Catalog.Организации.StandardAttribute.Code DontUse @@ -399,4 +398,31 @@ PersonalComputer MobileDevice + + РеквизитыОрганизации + + ru + Реквизиты организации + + NavigationPanelOrdinary + Auto + + + ДобавитьОрганизацию + + ru + Добавить организацию + + NavigationPanelOrdinary + Auto + + + Организации + + ru + Организации + + NavigationPanelOrdinary + Auto + diff --git a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form index 796d0394f..7acb6a7d3 100644 --- a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Form.form @@ -18,7 +18,7 @@ Идентификатор - ИдентификаторРасширеннаяПодсказка + ИдентификаторExtendedTooltip 42 Label true @@ -55,8 +55,8 @@ ПредставлениеРасписания - ПредставлениеРасписанияРасширеннаяПодсказка - 44 + ПредставлениеРасписанияExtendedTooltip + 43 Label true true @@ -106,8 +106,8 @@ Объект.ИмяМетода - ИмяМетодаРасширеннаяПодсказка - 46 + ИмяМетодаExtendedTooltip + 44 Label true true @@ -148,8 +148,8 @@ Объект.Ключ - КлючРасширеннаяПодсказка - 48 + КлючExtendedTooltip + 45 Label true true @@ -190,8 +190,8 @@ Объект.Использование - ИспользованиеРасширеннаяПодсказка - 50 + ИспользованиеExtendedTooltip + 46 Label true true @@ -224,8 +224,8 @@ Объект.ЭксклюзивноеВыполнение - ЭксклюзивноеВыполнениеРасширеннаяПодсказка - 52 + ЭксклюзивноеВыполнениеExtendedTooltip + 47 Label true true @@ -256,7 +256,7 @@ Основное - ГруппаОсновноеРасширеннаяПодсказка + ГруппаОсновноеExtendedTooltip 41 Label true @@ -286,8 +286,8 @@ Объект.СостояниеЗадания - СостояниеЗаданияРасширеннаяПодсказка - 55 + СостояниеЗаданияExtendedTooltip + 49 Label true true @@ -328,8 +328,8 @@ Объект.ЗапланированныйМоментЗапуска - ЗапланированныйМоментЗапускаРасширеннаяПодсказка - 57 + ЗапланированныйМоментЗапускаExtendedTooltip + 50 Label true true @@ -370,8 +370,8 @@ Объект.НомерПопытки - НомерПопыткиРасширеннаяПодсказка - 59 + НомерПопыткиExtendedTooltip + 51 Label true true @@ -412,8 +412,8 @@ Объект.КоличествоПовторовПриАварийномЗавершении - КоличествоПовторовПриАварийномЗавершенииРасширеннаяПодсказка - 61 + КоличествоПовторовПриАварийномЗавершенииExtendedTooltip + 52 Label true true @@ -454,8 +454,8 @@ Объект.ИнтервалПовтораПриАварийномЗавершении - ИнтервалПовтораПриАварийномЗавершенииРасширеннаяПодсказка - 63 + ИнтервалПовтораПриАварийномЗавершенииExtendedTooltip + 53 Label true true @@ -496,8 +496,8 @@ Объект.ДатаНачалаПоследнегоЗапуска - ДатаНачалаПоследнегоЗапускаРасширеннаяПодсказка - 65 + ДатаНачалаПоследнегоЗапускаExtendedTooltip + 54 Label true true @@ -538,8 +538,8 @@ Объект.ДатаЗавершенияПоследнегоЗапуска - ДатаЗавершенияПоследнегоЗапускаРасширеннаяПодсказка - 67 + ДатаЗавершенияПоследнегоЗапускаExtendedTooltip + 55 Label true true @@ -580,8 +580,8 @@ Объект.ИсполняющееФоновоеЗадание - ИсполняющееФоновоеЗаданиеРасширеннаяПодсказка - 69 + ИсполняющееФоновоеЗаданиеExtendedTooltip + 56 Label true true @@ -614,8 +614,8 @@ Состояние выполнения - ГруппаСостояниеВыполненияРасширеннаяПодсказка - 54 + ГруппаСостояниеВыполненияExtendedTooltip + 48 Label true true @@ -645,8 +645,8 @@ None - ПараметрыМетодаРасширеннаяПодсказка - 72 + ПараметрыМетодаExtendedTooltip + 58 Label true true @@ -686,8 +686,8 @@ Параметры - ГруппаПараметрыРасширеннаяПодсказка - 71 + ГруппаПараметрыExtendedTooltip + 57 Label true true @@ -711,7 +711,7 @@ Группа страницы - ГруппаСтраницыРасширеннаяПодсказка + ГруппаСтраницыExtendedTooltip 40 Label true diff --git a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl index b33f31c55..6c691a876 100644 --- a/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ОчередьЗаданий/Forms/ФормаЭлемента/Module.bsl @@ -11,7 +11,7 @@ КонецЕсли; Если Объект.Ссылка.Пустая() Тогда - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПараметрыМетода = ОбщегоНазначения.ЗначениеВСтрокуXML(Новый Массив); КонецЕсли; @@ -23,7 +23,7 @@ Идентификатор = Объект.Ссылка.УникальныйИдентификатор(); Расписание = ТекущийОбъект.Расписание.Получить(); - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПараметрыМетода = ОбщегоНазначения.ЗначениеВСтрокуXML(ТекущийОбъект.Параметры.Получить()); @@ -57,13 +57,21 @@ КонецЕсли; Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РедактируемоеРасписание); - Если НЕ Диалог.ОткрытьМодально() Тогда + ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ИзменитьРасписание", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещенияОЗакрытии); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРасписание(НовоеРасписание, ДополнительныеПараметры) Экспорт + + Если НовоеРасписание = Неопределено Тогда Возврат; КонецЕсли; - Расписание = Диалог.Расписание; + Расписание = НовоеРасписание; Модифицированность = Истина; - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПоказатьОповещениеПользователя(НСтр("ru = 'Перепланирование'"), , НСтр("ru = 'Новое расписание будет учтено при |следующем выполнении задания'")); @@ -78,7 +86,7 @@ Расписание = Неопределено; Модифицированность = Истина; - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 91ae8590e..2afe73a10 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаСписка/Form.form @@ -30,8 +30,8 @@ true - ОбластьДанныхВспомогательныеДанныеРасширеннаяПодсказка - 44 + ОбластьДанныхВспомогательныеДанныеExtendedTooltip + 35 Label true true @@ -67,8 +67,8 @@ true - ИспользованиеРасширеннаяПодсказка - 46 + ИспользованиеExtendedTooltip + 36 Label true true @@ -101,8 +101,8 @@ true - ЗапланированныйМоментЗапускаРасширеннаяПодсказка - 48 + ЗапланированныйМоментЗапускаExtendedTooltip + 37 Label true true @@ -138,8 +138,8 @@ true - СостояниеЗаданияРасширеннаяПодсказка - 50 + СостояниеЗаданияExtendedTooltip + 38 Label true true @@ -175,8 +175,8 @@ true - ИсполняющееФоновоеЗаданиеРасширеннаяПодсказка - 52 + ИсполняющееФоновоеЗаданиеExtendedTooltip + 39 Label true true @@ -212,8 +212,8 @@ true - ЭксклюзивноеВыполнениеРасширеннаяПодсказка - 54 + ЭксклюзивноеВыполнениеExtendedTooltip + 40 Label true true @@ -246,8 +246,8 @@ true - ШаблонРасширеннаяПодсказка - 56 + ШаблонExtendedTooltip + 41 Label true true @@ -283,8 +283,8 @@ true - НомерПопыткиРасширеннаяПодсказка - 58 + НомерПопыткиExtendedTooltip + 42 Label true true @@ -320,8 +320,8 @@ true - ИмяМетодаРасширеннаяПодсказка - 60 + ИмяМетодаExtendedTooltip + 43 Label true true @@ -357,8 +357,8 @@ true - ДатаНачалаПоследнегоЗапускаРасширеннаяПодсказка - 62 + ДатаНачалаПоследнегоЗапускаExtendedTooltip + 44 Label true true @@ -394,8 +394,8 @@ true - ДатаЗавершенияПоследнегоЗапускаРасширеннаяПодсказка - 64 + ДатаЗавершенияПоследнегоЗапускаExtendedTooltip + 45 Label true true @@ -431,8 +431,8 @@ true - КлючРасширеннаяПодсказка - 66 + КлючExtendedTooltip + 46 Label true true @@ -468,8 +468,8 @@ true - ИнтервалПовтораПриАварийномЗавершенииРасширеннаяПодсказка - 68 + ИнтервалПовтораПриАварийномЗавершенииExtendedTooltip + 47 Label true true @@ -505,8 +505,8 @@ true - КоличествоПовторовПриАварийномЗавершенииРасширеннаяПодсказка - 70 + КоличествоПовторовПриАварийномЗавершенииExtendedTooltip + 48 Label true true @@ -529,6 +529,40 @@ true + + Ссылка + 49 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 50 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -537,10 +571,10 @@ СписокСтрокаПоиска - 35 + 52 СписокСтрокаПоискаРасширеннаяПодсказка - 37 + 54 Label true true @@ -550,7 +584,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 36 + 53 true Список @@ -560,10 +594,10 @@ СписокСостояниеПросмотра - 38 + 55 СписокСостояниеПросмотраРасширеннаяПодсказка - 40 + 57 Label true true @@ -573,7 +607,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 39 + 56 true ViewStatusAddition @@ -584,10 +618,10 @@ СписокУправлениеПоиском - 41 + 58 СписокУправлениеПоискомРасширеннаяПодсказка - 43 + 60 Label true true @@ -597,7 +631,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 42 + 59 true SearchControlAddition @@ -607,7 +641,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 34 Label true diff --git a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form index 0705f6945..c4d4718c7 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.ОбластьДанныхВспомогательныеДанные - ОбластьДанныхВспомогательныеДанныеРасширеннаяПодсказка + ОбластьДанныхВспомогательныеДанныеExtendedTooltip 40 Label true @@ -60,8 +60,8 @@ Идентификатор - ИдентификаторРасширеннаяПодсказка - 44 + ИдентификаторExtendedTooltip + 43 Label true true @@ -97,8 +97,8 @@ Объект.Шаблон - ШаблонРасширеннаяПодсказка - 46 + ШаблонExtendedTooltip + 44 Label true true @@ -139,8 +139,8 @@ ПредставлениеРасписания - ПредставлениеРасписанияРасширеннаяПодсказка - 48 + ПредставлениеРасписанияExtendedTooltip + 45 Label true true @@ -190,8 +190,8 @@ Объект.ИмяМетода - ИмяМетодаРасширеннаяПодсказка - 50 + ИмяМетодаExtendedTooltip + 46 Label true true @@ -232,8 +232,8 @@ Объект.Ключ - КлючРасширеннаяПодсказка - 52 + КлючExtendedTooltip + 47 Label true true @@ -274,8 +274,8 @@ Объект.Использование - ИспользованиеРасширеннаяПодсказка - 54 + ИспользованиеExtendedTooltip + 48 Label true true @@ -308,8 +308,8 @@ Объект.ЭксклюзивноеВыполнение - ЭксклюзивноеВыполнениеРасширеннаяПодсказка - 56 + ЭксклюзивноеВыполнениеExtendedTooltip + 49 Label true true @@ -340,8 +340,8 @@ Основное - ГруппаОсновноеРасширеннаяПодсказка - 43 + ГруппаОсновноеExtendedTooltip + 42 Label true true @@ -370,8 +370,8 @@ Объект.СостояниеЗадания - СостояниеЗаданияРасширеннаяПодсказка - 59 + СостояниеЗаданияExtendedTooltip + 51 Label true true @@ -412,8 +412,8 @@ Объект.ЗапланированныйМоментЗапуска - ЗапланированныйМоментЗапускаРасширеннаяПодсказка - 61 + ЗапланированныйМоментЗапускаExtendedTooltip + 52 Label true true @@ -454,8 +454,8 @@ Объект.НомерПопытки - НомерПопыткиРасширеннаяПодсказка - 63 + НомерПопыткиExtendedTooltip + 53 Label true true @@ -496,8 +496,8 @@ Объект.КоличествоПовторовПриАварийномЗавершении - КоличествоПовторовПриАварийномЗавершенииРасширеннаяПодсказка - 65 + КоличествоПовторовПриАварийномЗавершенииExtendedTooltip + 54 Label true true @@ -538,8 +538,8 @@ Объект.ИнтервалПовтораПриАварийномЗавершении - ИнтервалПовтораПриАварийномЗавершенииРасширеннаяПодсказка - 67 + ИнтервалПовтораПриАварийномЗавершенииExtendedTooltip + 55 Label true true @@ -580,8 +580,8 @@ Объект.ДатаНачалаПоследнегоЗапуска - ДатаНачалаПоследнегоЗапускаРасширеннаяПодсказка - 69 + ДатаНачалаПоследнегоЗапускаExtendedTooltip + 56 Label true true @@ -622,8 +622,8 @@ Объект.ДатаЗавершенияПоследнегоЗапуска - ДатаЗавершенияПоследнегоЗапускаРасширеннаяПодсказка - 71 + ДатаЗавершенияПоследнегоЗапускаExtendedTooltip + 57 Label true true @@ -664,8 +664,8 @@ Объект.ИсполняющееФоновоеЗадание - ИсполняющееФоновоеЗаданиеРасширеннаяПодсказка - 73 + ИсполняющееФоновоеЗаданиеExtendedTooltip + 58 Label true true @@ -698,8 +698,8 @@ Состояние выполнения - ГруппаСостояниеВыполненияРасширеннаяПодсказка - 58 + ГруппаСостояниеВыполненияExtendedTooltip + 50 Label true true @@ -729,8 +729,8 @@ None - ПараметрыМетодаРасширеннаяПодсказка - 76 + ПараметрыМетодаExtendedTooltip + 60 Label true true @@ -770,8 +770,8 @@ Параметры - ГруппаПараметрыРасширеннаяПодсказка - 75 + ГруппаПараметрыExtendedTooltip + 59 Label true true @@ -795,8 +795,8 @@ Группа страницы - ГруппаСтраницыРасширеннаяПодсказка - 42 + ГруппаСтраницыExtendedTooltip + 41 Label true true diff --git a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Module.bsl index 3bad1083e..014e56ef9 100644 --- a/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ОчередьЗаданийОбластейДанных/Forms/ФормаЭлемента/Module.bsl @@ -11,7 +11,7 @@ КонецЕсли; Если Объект.Ссылка.Пустая() Тогда - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПараметрыМетода = ОбщегоНазначения.ЗначениеВСтрокуXML(Новый Массив); КонецЕсли; @@ -23,7 +23,7 @@ Идентификатор = Объект.Ссылка.УникальныйИдентификатор(); Расписание = ТекущийОбъект.Расписание.Получить(); - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПараметрыМетода = ОбщегоНазначения.ЗначениеВСтрокуXML(ТекущийОбъект.Параметры.Получить()); @@ -51,7 +51,7 @@ ЗаблокироватьДанныеФормыДляРедактирования(); Если ЗначениеЗаполнено(Объект.Шаблон) Тогда - Предупреждение(НСтр("ru = 'Для заданий на основе шаблонов, расписание задается в шаблоне.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Для заданий на основе шаблонов, расписание задается в шаблоне.'")); Возврат; КонецЕсли; @@ -62,13 +62,21 @@ КонецЕсли; Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РедактируемоеРасписание); - Если НЕ Диалог.ОткрытьМодально() Тогда + ОписаниеОповещенияОЗакрытии = Новый ОписаниеОповещения("ИзменитьРасписание", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещенияОЗакрытии); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРасписание(НовоеРасписание, ДополнительныеПараметры) Экспорт + + Если НовоеРасписание = Неопределено Тогда Возврат; КонецЕсли; - Расписание = Диалог.Расписание; + Расписание = НовоеРасписание; Модифицированность = Истина; - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); ПоказатьОповещениеПользователя(НСтр("ru = 'Перепланирование'"), , НСтр("ru = 'Новое расписание будет учтено при |следующем выполнении задания'")); @@ -83,7 +91,7 @@ Расписание = Неопределено; Модифицированность = Истина; - УстановитьПредставлениеРасписания(ЭтаФорма); + УстановитьПредставлениеРасписания(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 2311894ec..7678d6277 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаВыбора/Form.form @@ -18,6 +18,11 @@ true false None + Copy + Create + Delete + MoveItem + SetDeletionMark Наименование 4 @@ -31,8 +36,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -63,10 +68,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -76,7 +81,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -86,10 +91,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -99,7 +104,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -110,10 +115,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -123,7 +128,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -133,7 +138,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true @@ -148,6 +153,7 @@ true Tree + true true true 40 @@ -168,6 +174,7 @@ false Auto Auto + ExpandTopLevel true true @@ -201,11 +208,14 @@ OnCreateAtServer ПриСозданииНаСервере - CancelSearch - Find + Copy + Create + Delete HierarchicalList List ListSettings + MoveItem + SetDeletionMark Tree LockOwner true @@ -259,7 +269,16 @@ - + + + CommonCommand.НастроитьПрава + + + + CommonCommand.ДополнительныеСведенияКоманднаяПанель + + + diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form index 059a43f81..213b1caf4 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Form.form @@ -1,29 +1,5 @@ - - ОсновнаяКоманднаяПанель - 1 - true - true - - true - - - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - CommandBar - - Left - Form - - Код 2 @@ -34,7 +10,7 @@ Объект.Code - КодРасширеннаяПодсказка + КодExtendedTooltip 32 Label true @@ -78,8 +54,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 34 + НаименованиеExtendedTooltip + 33 Label true true @@ -130,8 +106,8 @@ РодительПриИзменении - РодительРасширеннаяПодсказка - 36 + РодительExtendedTooltip + 34 Label true true @@ -174,8 +150,8 @@ ПолныйПуть - ПолныйПутьРасширеннаяПодсказка - 38 + ПолныйПутьExtendedTooltip + 35 Label true true @@ -216,8 +192,8 @@ Объект.Описание - ОписаниеРасширеннаяПодсказка - 40 + ОписаниеExtendedTooltip + 36 Label true true @@ -261,8 +237,8 @@ Объект.Ответственный - ОтветственныйРасширеннаяПодсказка - 42 + ОтветственныйExtendedTooltip + 37 Label true true @@ -305,8 +281,8 @@ Объект.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 44 + ДатаСозданияExtendedTooltip + 38 Label true true @@ -350,8 +326,8 @@ РабочийКаталог - РабочийКаталогРасширеннаяПодсказка - 46 + РабочийКаталогExtendedTooltip + 39 Label true true @@ -397,8 +373,8 @@ true - ОткрытьСписокПапокИФайловРасширеннаяПодсказка - 48 + ОткрытьСписокПапокИФайловExtendedTooltip + 40 Label true true @@ -415,11 +391,38 @@ UserCmds Auto - None - false ФормаКоманднаяПанель -1 + + ФормаОбщаяКомандаНастроитьПрава + 41 + true + true + + true + + + Объект.Ref + + + ФормаОбщаяКомандаНастроитьПраваРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + CommonCommand.НастроитьПрава + Normal + Auto + true + true + UserCmds + Auto + Left true diff --git a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl index bc37c5c90..76279eb7b 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/Forms/ФормаЭлемента/Module.bsl @@ -12,10 +12,12 @@ Объект.Родитель = Параметры.Родитель; КонецЕсли; + ОбновитьДоступностьКомандПоНастройкеПрав(); + РабочийКаталог = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Объект.Ссылка); // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма); + УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект); // Конец СтандартныеПодсистемы.Свойства ОбновитьПолныйПуть(); @@ -26,18 +28,22 @@ Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) // СтандартныеПодсистемы.Свойства - Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтаФорма, ИмяСобытия, Параметр) Тогда + Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда ОбновитьЭлементыДополнительныхРеквизитов(); КонецЕсли; // Конец СтандартныеПодсистемы.Свойства + Если ИмяСобытия = "Запись_НастройкиПравОбъектов" Тогда + ОбновитьДоступностьКомандПоНастройкеПрав(); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры @@ -46,21 +52,25 @@ Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) + РабочийКаталог = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Объект.Ссылка); + + ОбновитьДоступностьКомандПоНастройкеПрав(); + КонецПроцедуры &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтаФорма, Отказ, ПроверяемыеРеквизиты); + УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры @@ -164,8 +174,7 @@ Процедура ОткрытьСписокПапокИФайлов(Команда) ПараметрыФормы = Новый Структура("Папка", Объект.Ссылка); - - ОткрытьФорму("Справочник.Файлы.Форма.ХранилищеФайлов", ПараметрыФормы, ,Объект.Ссылка); + ОткрытьФорму("Справочник.Файлы.Форма.Файлы", ПараметрыФормы, ,Объект.Ссылка); КонецПроцедуры @@ -174,7 +183,7 @@ &НаКлиенте Процедура Подключаемый_РедактироватьСоставСвойств() - УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтаФорма, Объект.Ссылка); + УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); КонецПроцедуры @@ -209,14 +218,40 @@ КонецЕсли; -КонецПроцедуры +КонецПроцедуры + +&НаСервере +Процедура ОбновитьДоступностьКомандПоНастройкеПрав() + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") + ИЛИ Элементы.Найти("ФормаОбщаяКомандаНастроитьПрава") = Неопределено Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + Если ЗначениеЗаполнено(Объект.Ссылка) + И НЕ МодульУправлениеДоступом.ЕстьПраво("ИзменениеПапок", Объект.Ссылка) Тогда + + ТолькоПросмотр = Истина; + КонецЕсли; + + УправлениеПравами = ЗначениеЗаполнено(Объект.Ссылка) + И МодульУправлениеДоступом.ЕстьПраво("УправлениеПравами", Объект.Ссылка); + + Если Элементы.ФормаОбщаяКомандаНастроитьПрава.Видимость <> УправлениеПравами Тогда + Элементы.ФормаОбщаяКомандаНастроитьПрава.Видимость = УправлениеПравами; + КонецЕсли; + +КонецПроцедуры + // СтандартныеПодсистемы.Свойства &НаСервере Процедура ОбновитьЭлементыДополнительныхРеквизитов() - УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма); + УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html index cab897a7b..c86efc0b9 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ПапкиФайлов/Help/ru.html @@ -1,4 +1,4 @@ - +

      Все файлы хранятся в структуре папок, которую удобно вести, например:

      • в соответствии с организационной структурой Вашего предприятия; 
      • по типам файлов (например, "Договора", "Приказы", "Служебные записки");  diff --git a/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl new file mode 100644 index 000000000..946a2754e --- /dev/null +++ b/SSL/src/Catalogs/ПапкиФайлов/ManagerModule.bsl @@ -0,0 +1,20 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Описание"); + РедактируемыеРеквизиты.Добавить("Ответственный"); + РедактируемыеРеквизиты.Добавить("ДатаСоздания"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl index 028bc2cf7..39c34bb18 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПапкиФайлов/ObjectModule.bsl @@ -1,44 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// СтандартныеПодсистемы.УправлениеДоступом - -// Процедура ЗаполнитьНаборыЗначенийДоступа по свойствам объекта заполняет наборы значений доступа -// в таблице с полями: -// НомерНабора - Число (необязательно, если набор один), -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), -// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), -// Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// -// Вызывается из процедуры УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа(), -// если объект зарегистрирован в "ПодпискаНаСобытие.ЗаписатьНаборыЗначенийДоступа" и -// из таких же процедур объектов, у которых наборы значений доступа зависят от наборов этого -// объекта (в этом случае объект зарегистрирован в "ПодпискаНаСобытие.ЗаписатьЗависимыеНаборыЗначенийДоступа"). -// -// Параметры: -// Таблица - ТабличнаяЧасть, -// РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа, -// ТаблицаЗначений, возвращаемая УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(). -// -Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) Экспорт - - // Логика ограничения: - // Чтения, Добавления, Изменения: Ссылка - - // Доступ по папке файлов. - Строка = Таблица.Добавить(); - Строка.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].ПапкиФайлов; - Строка.ЗначениеДоступа = Ссылка; - -КонецПроцедуры - -// Конец СтандартныеПодсистемы.УправлениеДоступом - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -47,23 +8,30 @@ Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; - - ПометкаИБ = ПометкаУдаленияВИБ(); - Если ПометкаУдаления И Не ПометкаИБ Тогда + + ТекущаяПапка = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, + "Наименование, Родитель, ПометкаУдаления"); + + Если ЭтоНовый() Или ТекущаяПапка.Родитель <> Родитель Тогда + // Проверка права "Добавление". + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ИзменениеПапок", Родитель) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недостаточно прав для добавления подпапок в папку файлов ""%1"".'"), + Строка(Родитель)); + КонецЕсли; + КонецЕсли; + + Если ПометкаУдаления И ТекущаяПапка.ПометкаУдаления <> Истина Тогда // Проверка права "Пометка на удаление". - ПометкаНаУдалениеРазрешена = Истина; - РаботаСФайламиСлужебный.ПриОпределенииПраваПометкиУдаления( - Ссылка, ПометкаНаУдалениеРазрешена); - - Если НЕ ПометкаНаУдалениеРазрешена Тогда + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ИзменениеПапок", Ссылка) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'У вас нет права ""Пометка на удаление"" папки файлов ""%1"".'"), + НСтр("ru = 'Недостаточно прав для изменения папки файлов ""%1"".'"), Строка(Ссылка)); КонецЕсли; КонецЕсли; - Если ПометкаУдаления <> ПометкаИБ И Не Ссылка.Пустая() Тогда + Если ПометкаУдаления <> ТекущаяПапка.ПометкаУдаления И Не Ссылка.Пустая() Тогда // Отбираем файлы и пытаемся поставить им пометку удаления Запрос = Новый Запрос; Запрос.Текст = @@ -97,9 +65,9 @@ Если НЕ ЭтоНовый() Тогда - Если Наименование <> Ссылка.Наименование Тогда // переименована папка + Если Наименование <> ТекущаяПапка.Наименование Тогда // переименована папка РабочийКаталогПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Ссылка); - РабочийКаталогРодителяПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Ссылка.Родитель); + РабочийКаталогРодителяПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(ТекущаяПапка.Родитель); Если РабочийКаталогРодителяПапки <> "" Тогда // Добавляем слэш в конце, если его нет @@ -107,7 +75,7 @@ РабочийКаталогРодителяПапки, ОбщегоНазначенияПовтИсп.ТипПлатформыСервера()); РабочийКаталогПапкиУнаследованныйПрежний = РабочийКаталогРодителяПапки - + Ссылка.Наименование + ОбщегоНазначенияКлиентСервер.РазделительПути(); + + ТекущаяПапка.Наименование + ОбщегоНазначенияКлиентСервер.РазделительПути(); Если РабочийКаталогПапкиУнаследованныйПрежний = РабочийКаталогПапки Тогда @@ -119,9 +87,9 @@ КонецЕсли; КонецЕсли; - Если Родитель <> Ссылка.Родитель Тогда // перенесли папку в другую папку + Если Родитель <> ТекущаяПапка.Родитель Тогда // перенесли папку в другую папку РабочийКаталогПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Ссылка); - РабочийКаталогРодителяПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Ссылка.Родитель); + РабочийКаталогРодителяПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(ТекущаяПапка.Родитель); РабочийКаталогНовогоРодителяПапки = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(Родитель); Если РабочийКаталогРодителяПапки <> "" ИЛИ РабочийКаталогНовогоРодителяПапки <> "" Тогда @@ -130,7 +98,7 @@ Если РабочийКаталогРодителяПапки <> "" Тогда РабочийКаталогПапкиУнаследованныйПрежний = РабочийКаталогРодителяПапки - + Ссылка.Наименование + ОбщегоНазначенияКлиентСервер.РазделительПути(); + + ТекущаяПапка.Наименование + ОбщегоНазначенияКлиентСервер.РазделительПути(); КонецЕсли; Если РабочийКаталогПапкиУнаследованныйПрежний = РабочийКаталогПапки Тогда // Рабочий каталог автоформируется от родителя. @@ -191,31 +159,4 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Возвращает текущее значение пометки удаления в информационной базе -Функция ПометкаУдаленияВИБ() - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПапкиФайлов.ПометкаУдаления - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Ссылка = &Ссылка"; - - Запрос.УстановитьПараметр("Ссылка", Ссылка); - - Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - Возврат Выборка.ПометкаУдаления; - КонецЕсли; - - Возврат Неопределено; -КонецФункции - #КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo b/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo index 9e5a34253..51c98cc5c 100644 --- a/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo +++ b/SSL/src/Catalogs/ПапкиФайлов/ПапкиФайлов.mdo @@ -114,33 +114,33 @@ Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.StandardAttribute.Ref + -1 + -1 Catalog.НаборыДополнительныхРеквизитовИСведений.Справочник_ПапкиФайлов -1 -1 Catalog.ПапкиФайлов.TabularSection.ДополнительныеРеквизиты - Catalog.ПапкиФайлов.TabularSection.ДополнительныеРеквизиты.StandardAttribute.Ref - Catalog.ПапкиФайлов.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство - Catalog.ПапкиФайлов.TabularSection.ДополнительныеРеквизиты.Attribute.Значение + -1 + -1 + -1 -1 -1 Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.Attribute.Свойство - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.StandardAttribute.Ref + -1 + -1 Catalog.НаборыДополнительныхРеквизитовИСведений.Справочник_ПапкиФайлов -1 -1 InformationRegister.ДополнительныеСведения - InformationRegister.ДополнительныеСведения.Dimension.Объект - InformationRegister.ДополнительныеСведения.Dimension.Свойство - InformationRegister.ДополнительныеСведения.Resource.Значение + -1 + -1 + -1 -1 -1 diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 3e50e5272..f73d4db39 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаВыбора/Form.form @@ -26,8 +26,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -58,10 +58,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -71,7 +71,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -81,10 +81,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -94,7 +94,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -105,10 +105,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -118,7 +118,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -128,7 +128,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index f4262fd56..7aa892488 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаСписка/Form.form @@ -26,8 +26,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -50,6 +50,40 @@ true + + Ссылка + 8 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 10 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 9 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -59,10 +93,10 @@ СписокСтрокаПоиска - 7 + 11 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 13 Label true true @@ -72,7 +106,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 12 true Список @@ -82,10 +116,10 @@ СписокСостояниеПросмотра - 10 + 14 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 16 Label true true @@ -95,7 +129,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 15 true ViewStatusAddition @@ -106,10 +140,10 @@ СписокУправлениеПоиском - 13 + 17 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 19 Label true true @@ -119,7 +153,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 18 true SearchControlAddition @@ -129,7 +163,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form index a2606c28b..8c198d9a4 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ Объект.Code - КодРасширеннаяПодсказка + КодExtendedTooltip 11 Label true @@ -61,8 +61,8 @@ Right - ПредопределеннаяПапкаРасширеннаяПодсказка - 13 + ПредопределеннаяПапкаExtendedTooltip + 12 Label true true @@ -97,7 +97,7 @@ Группа код предопределенная - ГруппаКодПредопределеннаяРасширеннаяПодсказка + ГруппаКодПредопределеннаяExtendedTooltip 10 Label true @@ -127,8 +127,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 15 + НаименованиеExtendedTooltip + 13 Label true true @@ -168,8 +168,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 17 + РодительExtendedTooltip + 14 Label true true diff --git a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Help/ru.html index 8eb38def6..0326101fd 100644 --- a/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ПапкиЭлектронныхПисем/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

        Папка электронных писем

        Справочник Папки электронных писем предназначен для категоризации входящей и исходящей почтовой корреспонденции. Владельцем папки является Учетная запись электронной почты.

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

        diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form index 5bdf682e7..5ac94a14a 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Form.form @@ -16,7 +16,7 @@ true - КартинкаПредупреждениеРасширеннаяПодсказка + КартинкаПредупреждениеExtendedTooltip 52 Label true @@ -55,7 +55,7 @@ true - ТекстПредупрежденияРасширеннаяПодсказка + ТекстПредупрежденияExtendedTooltip 53 Label true @@ -90,7 +90,7 @@ 3 false - ПредупреждениеРасширеннаяПодсказка + ПредупреждениеExtendedTooltip 51 Label true @@ -124,7 +124,7 @@ ПредставлениеОтбораПриИзменении - ПредставлениеОтбораРасширеннаяПодсказка + ПредставлениеОтбораExtendedTooltip 54 Label true @@ -217,8 +217,8 @@ false - ПользователиИнфБазыИзменитьРасширеннаяПодсказка - 57 + ПользователиИнфБазыИзменитьExtendedTooltip + 56 Label true true @@ -244,8 +244,8 @@ false - ПользователиИнфБазыУдалитьРасширеннаяПодсказка - 58 + ПользователиИнфБазыУдалитьExtendedTooltip + 57 Label true true @@ -271,8 +271,8 @@ false - ПользователиИнфБазыОбновитьРасширеннаяПодсказка - 59 + ПользователиИнфБазыОбновитьExtendedTooltip + 58 Label true true @@ -298,8 +298,8 @@ false - ПользователиИнфБазыНайтиРасширеннаяПодсказка - 60 + ПользователиИнфБазыНайтиExtendedTooltip + 59 Label true true @@ -325,8 +325,8 @@ false - ПользователиИнфБазыОтменитьПоискРасширеннаяПодсказка - 61 + ПользователиИнфБазыОтменитьПоискExtendedTooltip + 60 Label true true @@ -352,8 +352,8 @@ false - ПользователиИнфБазыСортироватьПоВозрастаниюРасширеннаяПодсказка - 62 + ПользователиИнфБазыСортироватьПоВозрастаниюExtendedTooltip + 61 Label true true @@ -380,8 +380,8 @@ false - ПользователиИнфБазыСортироватьПоУбываниюРасширеннаяПодсказка - 63 + ПользователиИнфБазыСортироватьПоУбываниюExtendedTooltip + 62 Label true true @@ -412,8 +412,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 56 + КоманднаяПанельExtendedTooltip + 55 Label true true @@ -464,8 +464,8 @@ Полное имя пользователя информационной базы - ПолноеИмяРасширеннаяПодсказка - 77 + ПолноеИмяExtendedTooltip + 67 Label true true @@ -509,8 +509,8 @@ Имя пользователя информационной базы - ИмяРасширеннаяПодсказка - 79 + ИмяExtendedTooltip + 68 Label true true @@ -554,8 +554,8 @@ Аутентификация 1С:Предприятия - АутентификацияСтандартнаяРасширеннаяПодсказка - 81 + АутентификацияСтандартнаяExtendedTooltip + 69 Label true true @@ -596,8 +596,8 @@ Аутентификация операционной системы - АутентификацияОСРасширеннаяПодсказка - 84 + АутентификацияОСExtendedTooltip + 71 Label true true @@ -635,8 +635,8 @@ Пользователь операционной системы - ПользовательОСРасширеннаяПодсказка - 86 + ПользовательОСExtendedTooltip + 72 Label true true @@ -669,8 +669,8 @@ true - ПользователиИнфБазыГруппа1РасширеннаяПодсказка - 83 + ПользователиИнфБазыГруппа1ExtendedTooltip + 70 Label true true @@ -695,8 +695,8 @@ ПользователиИнфБазы.ЭтоПользователь - ЭтоПользовательРасширеннаяПодсказка - 88 + ЭтоПользовательExtendedTooltip + 73 Label true true @@ -726,8 +726,8 @@ ПользователиИнфБазы.ЭтоВнешнийПользователь - ЭтоВнешнийПользовательРасширеннаяПодсказка - 90 + ЭтоВнешнийПользовательExtendedTooltip + 74 Label true true @@ -757,8 +757,8 @@ ПользователиИнфБазы.Ссылка - СсылкаРасширеннаяПодсказка - 92 + СсылкаExtendedTooltip + 75 Label true true @@ -796,8 +796,8 @@ ПользователиИнфБазы.ПометкаУдаления - ПометкаУдаленияРасширеннаяПодсказка - 94 + ПометкаУдаленияExtendedTooltip + 76 Label true true @@ -838,10 +838,10 @@ ПользователиИнфБазыСтрокаПоиска - 68 + 78 ПользователиИнфБазыСтрокаПоискаРасширеннаяПодсказка - 70 + 80 Label true true @@ -851,7 +851,7 @@ ПользователиИнфБазыСтрокаПоискаКонтекстноеМеню - 69 + 79 true ПользователиИнфБазы @@ -861,10 +861,10 @@ ПользователиИнфБазыСостояниеПросмотра - 71 + 81 ПользователиИнфБазыСостояниеПросмотраРасширеннаяПодсказка - 73 + 83 Label true true @@ -874,7 +874,7 @@ ПользователиИнфБазыСостояниеПросмотраКонтекстноеМеню - 72 + 82 true ViewStatusAddition @@ -885,10 +885,10 @@ ПользователиИнфБазыУправлениеПоиском - 74 + 84 ПользователиИнфБазыУправлениеПоискомРасширеннаяПодсказка - 76 + 86 Label true true @@ -898,7 +898,7 @@ ПользователиИнфБазыУправлениеПоискомКонтекстноеМеню - 75 + 85 true SearchControlAddition @@ -908,8 +908,8 @@ - ПользователиИнфБазыРасширеннаяПодсказка - 67 + ПользователиИнфБазыExtendedTooltip + 66 Label true true @@ -930,8 +930,8 @@ false - КонтекстноеМенюПользователиИнфБазыИзменитьРасширеннаяПодсказка - 64 + КонтекстноеМенюПользователиИнфБазыИзменитьExtendedTooltip + 63 Label true true @@ -957,8 +957,8 @@ false - КонтекстноеМенюПользователиИнфБазыОбновитьРасширеннаяПодсказка - 65 + КонтекстноеМенюПользователиИнфБазыОбновитьExtendedTooltip + 64 Label true true @@ -984,8 +984,8 @@ false - КонтекстноеМенюПользователиИнфБазыУдалитьРасширеннаяПодсказка - 66 + КонтекстноеМенюПользователиИнфБазыУдалитьExtendedTooltip + 65 Label true true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html index 8bfd14a9b..74c5ad56c 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Help/ru.html @@ -1,4 +1,4 @@ - +

        При записи пользователя (или внешнего пользователя) с установленным флажком Доступ к информационной базе разрешен, вместе с ним автоматически создается соответствующий ему новый (или модифицируется существующий) пользователь ИБ. И наоборот, когда пользователь (или внешний пользователь) записывается со снятым флажком Доступ к информационной базе разрешен, то соответствующий ему пользователь ИБ автоматически удаляется из списка пользователей ИБ. Однако есть ряд ситуаций, когда список пользователей ИБ становится рассинхронизированным со списком пользователей. Тогда с помощью данного списка могут быть решены следующие задачи:

        • Найти "некорректных" пользователей ИБ и синхронизировать списки пользователей ИБ и пользователей между собой:
          • если пользователь ИБ был добавлен с помощью конфигуратора (или каким-либо нештатным программным способом), предлагается удалить такого пользователя ИБ; diff --git a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl index c37cfdb4a..195b42c56 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ПользователиИБ/Module.bsl @@ -8,10 +8,8 @@ Возврат; КонецЕсли; - Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение - НСтр("ru = 'Недостаточно прав для открытия - |списка пользователей информационной базы.'"); + Если НЕ Пользователи.ЭтоПолноправныйПользователь(, ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный) Тогда + ВызватьИсключение НСтр("ru = 'Недостаточно прав для открытия списка пользователей информационной базы.'"); КонецЕсли; Пользователи.НайтиНеоднозначныхПользователейИБ(); @@ -73,17 +71,23 @@ СтандартнаяОбработка = Ложь; - ВыбранныйЭлемент = ВыбратьИзСписка( - Элементы.ПредставлениеОтбора.СписокВыбора, + ПоказатьВыборИзСписка( + Новый ОписаниеОповещения("ПредставлениеОтбораЗавершениеВыбора", ЭтотОбъект), + Элемент.СписокВыбора, Элемент, - Элементы.ПредставлениеОтбора.СписокВыбора.НайтиПоЗначению(Отбор)); + Элемент.СписокВыбора.НайтиПоЗначению(Отбор)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеОтбораЗавершениеВыбора(ВыбранныйЭлемент, Неопределен) Экспорт Если ВыбранныйЭлемент <> Неопределено Тогда Отбор = ВыбранныйЭлемент.Значение; ПредставлениеОтбора = ВыбранныйЭлемент.Представление; - ПредставлениеОтбораПриИзменении(Элемент); + ПредставлениеОтбораПриИзменении(Элементы.ПредставлениеОтбора); КонецЕсли; КонецПроцедуры @@ -123,20 +127,10 @@ &НаКлиенте Процедура ПользователиИнфБазыПередУдалением(Элемент, Отказ) + Отказ = Истина; + Если Элементы.ПользователиИнфБазы.ТекущиеДанные.КодПроблемы = 0 Тогда - - Ответ = Вопрос( - НСтр("ru = 'Удалить пользователя информационной базы?'"), РежимДиалогаВопрос.ДаНет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - - УдалитьПользователяИБ( - Элементы.ПользователиИнфБазы.ТекущиеДанные.ИдентификаторПользователяИБ, Отказ); - Иначе - Отказ = Истина; - КонецЕсли; - Иначе - Отказ = Истина; + УдалитьТекущегоПользователяИБ(); КонецЕсли; КонецПроцедуры @@ -225,10 +219,8 @@ Иначе НоваяСтрока.Имя = ПользовательИБ.Имя; НоваяСтрока.АутентификацияСтандартная = ПользовательИБ.АутентификацияСтандартная; - Если Не ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда - НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; - НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; - КонецЕсли; + НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; + НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; НоваяСтрока.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; Если Выборка.Наименование <> ПользовательИБ.ПолноеИмя Тогда @@ -256,10 +248,8 @@ НоваяСтрока.ПолноеИмя = ПользовательИБ.ПолноеИмя; НоваяСтрока.Имя = ПользовательИБ.Имя; НоваяСтрока.АутентификацияСтандартная = ПользовательИБ.АутентификацияСтандартная; - Если Не ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда - НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; - НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; - КонецЕсли; + НоваяСтрока.АутентификацияОС = ПользовательИБ.АутентификацияОС; + НоваяСтрока.ПользовательОС = ПользовательИБ.ПользовательОС; НоваяСтрока.ИдентификаторПользователяИБ = ПользовательИБ.УникальныйИдентификатор; НоваяСтрока.Картинка = ПолучитьНомерКартинкиПоСостоянию( НоваяСтрока.КодПроблемы, НоваяСтрока.ПометкаУдаления, Ложь); @@ -357,18 +347,13 @@ КонецЕсли; Если ТекущиеДанные.КодПроблемы = 0 Тогда - Предупреждение( + ПоказатьПредупреждение( + Новый ОписаниеОповещения("УдалитьТекущегоПользователяИБ", ЭтотОбъект, Истина), НСтр("ru = 'Данному пользователю информационной базы не сопоставлен элемент справочника. | |Для создания пользователя информационной базы, |связанного с пользователем или внешним пользователем применяйте флажок |""Доступ к информационной базе разрешен"" в соответствующей форме элемента.'")); - - Отказ = Ложь; - ПользователиИнфБазыПередУдалением(Элементы.ПользователиИнфБазы, Отказ); - Если НЕ Отказ Тогда - ПользователиИнфБазы.Удалить(ТекущиеДанные); - КонецЕсли; Иначе ОткрытьФорму( ?( ТекущиеДанные.ЭтоВнешнийПользователь, @@ -379,6 +364,29 @@ КонецПроцедуры +&НаКлиенте +Процедура УдалитьТекущегоПользователяИБ(УдалитьСтроку = Ложь) Экспорт + + ПоказатьВопрос( + Новый ОписаниеОповещения("УдалитьТекущегоПользователяИБЗавершение", ЭтотОбъект, УдалитьСтроку), + НСтр("ru = 'Удалить пользователя информационной базы?'"), + РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры - +&НаКлиенте +Процедура УдалитьТекущегоПользователяИБЗавершение(Ответ, УдалитьСтроку) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + Отказ = Ложь; + УдалитьПользователяИБ( + Элементы.ПользователиИнфБазы.ТекущиеДанные.ИдентификаторПользователяИБ, Отказ); + + Если НЕ Отказ Тогда + ПользователиИнфБазы.Удалить(Элементы.ПользователиИнфБазы.ТекущиеДанные); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Form.form b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Form.form index 0bf9900ad..108aac60c 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Form.form @@ -12,7 +12,7 @@ НоваяПочта - НоваяПочтаРасширеннаяПодсказка + НоваяПочтаExtendedTooltip 5 Label true @@ -53,7 +53,7 @@ true - ФормаСменитьПочтуРасширеннаяПодсказка + ФормаСменитьПочтуExtendedTooltip 4 Label true diff --git a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl index ae70a3284..b043b3ef6 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/СменаПочты/Module.bsl @@ -28,22 +28,35 @@ ТекстВопроса = ""; Если Не ЗначениеЗаполнено(СтараяПочта) Тогда - ТекстВопроса = Нстр("ru = 'Адрес электронной почты пользователя сервиса изменен. - |Владельцы и администраторы абонента больше не смогут изменять параметры пользователя.'") + ТекстВопроса = + НСтр("ru = 'Адрес электронной почты пользователя сервиса изменен. + |Владельцы и администраторы абонента больше не смогут изменять параметры пользователя.'") + + Символы.ПС + Символы.ПС; КонецЕсли; - ТекстВопроса = ТекстВопроса + Нстр("ru = 'Выполнить изменение адреса электронной почты?'"); + ТекстВопроса = ТекстВопроса + НСтр("ru = 'Выполнить изменение адреса электронной почты?'"); + + ПоказатьВопрос( + Новый ОписаниеОповещения("СменитьПочтуЗавершение", ЭтотОбъект), + ТекстВопроса, + РежимДиалогаВопрос.ДаНетОтмена); + +КонецПроцедуры + +&НаКлиенте +Процедура СменитьПочтуЗавершение(Ответ, Неопределен) Экспорт - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); Если Ответ = КодВозвратаДиалога.Да Тогда + СоздатьЗапросНаСменуПочты(); - Предупреждение(Нстр("ru = 'На указанный адрес отправлено письмо с запросом на подтверждение. - |Почта будет изменена только после подтверждения запроса пользователем.'")); - Закрыть(); + + ПоказатьПредупреждение( + Новый ОписаниеОповещения("Закрыть", ЭтотОбъект), + НСтр("ru = 'На указанный адрес отправлено письмо с запросом на подтверждение. + |Почта будет изменена только после подтверждения запроса пользователем.'")); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда Закрыть(); КонецЕсли; КонецПроцедуры - - diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form index eca1399bc..30eef4b4a 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Form.form @@ -3,36 +3,12 @@ ДоменыИПользователи 2 - - ТаблицаДоменов - 5 - - <key>ru</key> - <value>Домены</value> - - true - true - - true - - - СписокДоменов - - false - Top - Add - Change - Copy - CopyToClipboard - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - Домены - 11 + + ГруппаДомены + 51 + + ТаблицаДоменов + 5 <key>ru</key> <value>Домены</value> @@ -43,11 +19,202 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СписокДоменов.ИмяДомена</segments> + <segments>СписокДоменов</segments> </dataPath> + <skipOnInput>false</skipOnInput> + <titleLocation>None</titleLocation> + <excludedCommands>Add</excludedCommands> + <excludedCommands>Change</excludedCommands> + <excludedCommands>Copy</excludedCommands> + <excludedCommands>CopyToClipboard</excludedCommands> + <excludedCommands>Delete</excludedCommands> + <excludedCommands>EndEdit</excludedCommands> + <excludedCommands>MoveDown</excludedCommands> + <excludedCommands>MoveUp</excludedCommands> + <excludedCommands>SortListAsc</excludedCommands> + <excludedCommands>SortListDesc</excludedCommands> + <items xsi:type="form:FormField"> + <name>Домены</name> + <id>11</id> + <title> + <key>ru</key> + <value>Домены</value> + + true + true + + true + + + СписокДоменов.ИмяДомена + + + ДоменыExtendedTooltip + 34 + Label + true + true + + Left + + + + ДоменыКонтекстноеМеню + 12 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТаблицаДоменовКоманднаяПанель + 7 + + ТаблицаДоменовНайти + 41 + true + true + + true + + + ТаблицаДоменовНайтиРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаДоменовОтменитьПоиск + 43 + true + true + + true + + + ТаблицаДоменовОтменитьПоискРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + OnActivateRow + ТаблицаДоменовПриАктивизацииСтроки + + + ТаблицаДоменовСтрокаПоиска + 53 + + ТаблицаДоменовСтрокаПоискаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + ТаблицаДоменовСтрокаПоискаКонтекстноеМеню + 54 + true + + ТаблицаДоменов + + true + + + + ТаблицаДоменовСостояниеПросмотра + 56 + + ТаблицаДоменовСостояниеПросмотраРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + ТаблицаДоменовСостояниеПросмотраКонтекстноеМеню + 57 + true + + ViewStatusAddition + ТаблицаДоменов + + true + + + + ТаблицаДоменовУправлениеПоиском + 59 + + ТаблицаДоменовУправлениеПоискомРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + ТаблицаДоменовУправлениеПоискомКонтекстноеМеню + 60 + true + + SearchControlAddition + ТаблицаДоменов + + true + + - ДоменыРасширеннаяПодсказка - 43 + ТаблицаДоменовExtendedTooltip + 33 Label true true @@ -56,110 +223,135 @@ - ДоменыКонтекстноеМеню - 12 + ТаблицаДоменовКонтекстноеМеню + 6 + + ТаблицаДоменовКонтекстноеМенюНайти + 17 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюНайтиExtendedTooltip + 30 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаДоменовКонтекстноеМенюОтменитьПоиск + 18 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюОтменитьПоискExtendedTooltip + 31 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаДоменовКонтекстноеМенюВывестиСписок + 21 + true + true + + true + + + ТаблицаДоменовКонтекстноеМенюВывестиСписокExtendedTooltip + 32 + Label + true + true + + Left + + + Form.Item.ТаблицаДоменов.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + true - InputField - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - + true + true + true + true + 40 + true + true + 4 + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + - - ТаблицаДоменовКоманднаяПанель - 7 - Left - - - OnActivateRow - ТаблицаДоменовПриАктивизацииСтроки - - - ТаблицаДоменовСтрокаПоиска - 34 - - ТаблицаДоменовСтрокаПоискаРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - - ТаблицаДоменовСтрокаПоискаКонтекстноеМеню - 35 - true - - ТаблицаДоменов - - true - - - - ТаблицаДоменовСостояниеПросмотра - 37 - - ТаблицаДоменовСостояниеПросмотраРасширеннаяПодсказка - 39 - Label - true - true - - Left - - - - ТаблицаДоменовСостояниеПросмотраКонтекстноеМеню - 38 - true - - ViewStatusAddition - ТаблицаДоменов - - true - - - - ТаблицаДоменовУправлениеПоиском - 40 - - ТаблицаДоменовУправлениеПоискомРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - - ТаблицаДоменовУправлениеПоискомКонтекстноеМеню - 41 - true - - SearchControlAddition - ТаблицаДоменов - - true - - + true + true + + true + + + <key>ru</key> + <value>Домены:</value> + + + ru + Группа домены + - ТаблицаДоменовРасширеннаяПодсказка - 33 + ГруппаДоменыРасширеннаяПодсказка + 52 Label true true @@ -167,150 +359,24 @@ Left - - ТаблицаДоменовКонтекстноеМеню - 6 - - ТаблицаДоменовКонтекстноеМенюНайти - 17 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюНайтиРасширеннаяПодсказка - 30 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаДоменовКонтекстноеМенюОтменитьПоиск - 18 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаДоменовКонтекстноеМенюВывестиСписок - 21 - true - true - - true - - - ТаблицаДоменовКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 32 - Label - true - true - - Left - - - Form.Item.ТаблицаДоменов.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - true - - true - true - true - true - 40 - true - true - 4 - true - 1 - 1 - AutoUse - AutoUse - true - true - false - false - false - Auto - Auto - true - true - - Style.BorderColor - - None - None - None - true - + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + - - ТаблицаПользователейДомена - 8 - - <key>ru</key> - <value>Пользователи</value> - - true - true - - true - - - СписокПользователейТекущегоДомена - - false - Top - Add - Change - Copy - CopyToClipboard - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - Пользователи - 13 + + ГруппаПользователи + 49 + + ТаблицаПользователейДомена + 8 <key>ru</key> <value>Пользователи</value> @@ -321,11 +387,202 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СписокПользователейТекущегоДомена.ИмяПользователя</segments> + <segments>СписокПользователейТекущегоДомена</segments> </dataPath> + <skipOnInput>false</skipOnInput> + <titleLocation>None</titleLocation> + <excludedCommands>Add</excludedCommands> + <excludedCommands>Change</excludedCommands> + <excludedCommands>Copy</excludedCommands> + <excludedCommands>CopyToClipboard</excludedCommands> + <excludedCommands>Delete</excludedCommands> + <excludedCommands>EndEdit</excludedCommands> + <excludedCommands>MoveDown</excludedCommands> + <excludedCommands>MoveUp</excludedCommands> + <excludedCommands>SortListAsc</excludedCommands> + <excludedCommands>SortListDesc</excludedCommands> + <items xsi:type="form:FormField"> + <name>Пользователи</name> + <id>13</id> + <title> + <key>ru</key> + <value>Пользователи</value> + + true + true + + true + + + СписокПользователейТекущегоДомена.ИмяПользователя + + + ПользователиExtendedTooltip + 40 + Label + true + true + + Left + + + + ПользователиКонтекстноеМеню + 14 + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + + Style.BorderColor + + Normal + + + + ТаблицаПользователейДоменаКоманднаяПанель + 10 + + ТаблицаПользователейДоменаНайти + 45 + true + true + + true + + + ТаблицаПользователейДоменаНайтиРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаОтменитьПоиск + 47 + true + true + + true + + + ТаблицаПользователейДоменаОтменитьПоискРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + Left + + + Selection + ТаблицаПользователейДоменаВыбор + + + ТаблицаПользователейДоменаСтрокаПоиска + 71 + + ТаблицаПользователейДоменаСтрокаПоискаРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаСтрокаПоискаКонтекстноеМеню + 72 + true + + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаСостояниеПросмотра + 74 + + ТаблицаПользователейДоменаСостояниеПросмотраРасширеннаяПодсказка + 76 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаСостояниеПросмотраКонтекстноеМеню + 75 + true + + ViewStatusAddition + ТаблицаПользователейДомена + + true + + + + ТаблицаПользователейДоменаУправлениеПоиском + 77 + + ТаблицаПользователейДоменаУправлениеПоискомРасширеннаяПодсказка + 79 + Label + true + true + + Left + + + + ТаблицаПользователейДоменаУправлениеПоискомКонтекстноеМеню + 78 + true + + SearchControlAddition + ТаблицаПользователейДомена + + true + + - ПользователиРасширеннаяПодсказка - 67 + ТаблицаПользователейДоменаExtendedTooltip + 39 Label true true @@ -334,110 +591,168 @@ - ПользователиКонтекстноеМеню - 14 + ТаблицаПользователейДоменаКонтекстноеМеню + 9 + + ТаблицаПользователейДоменаКонтекстноеМенюВыбрать + 27 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюВыбратьExtendedTooltip + 35 + Label + true + true + + Left + + + Form.Command.Выбрать + Normal + Auto + true + true + UserCmds + + System.DefaultGUIFont + true + false + false + false + + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюНайти + 22 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюНайтиExtendedTooltip + 36 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоиск + 23 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоискExtendedTooltip + 37 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписок + 26 + true + true + + true + + + ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписокExtendedTooltip + 38 + Label + true + true + + Left + + + Form.Item.ТаблицаПользователейДомена.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + true - InputField - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - + true + true + true + true + 40 + true + true + 4 + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + + Style.BorderColor + + None + None + None + true + - - ТаблицаПользователейДоменаКоманднаяПанель - 10 - Left - - - Selection - ТаблицаПользователейДоменаВыбор - - - ТаблицаПользователейДоменаСтрокаПоиска - 58 - - ТаблицаПользователейДоменаСтрокаПоискаРасширеннаяПодсказка - 60 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаСтрокаПоискаКонтекстноеМеню - 59 - true - - ТаблицаПользователейДомена - - true - - - - ТаблицаПользователейДоменаСостояниеПросмотра - 61 - - ТаблицаПользователейДоменаСостояниеПросмотраРасширеннаяПодсказка - 63 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаСостояниеПросмотраКонтекстноеМеню - 62 - true - - ViewStatusAddition - ТаблицаПользователейДомена - - true - - - - ТаблицаПользователейДоменаУправлениеПоиском - 64 - - ТаблицаПользователейДоменаУправлениеПоискомРасширеннаяПодсказка - 66 - Label - true - true - - Left - - - - ТаблицаПользователейДоменаУправлениеПоискомКонтекстноеМеню - 65 - true - - SearchControlAddition - ТаблицаПользователейДомена - - true - - + true + true + + true + + + <key>ru</key> + <value>Пользователи:</value> + + + ru + Группа пользователи + - ТаблицаПользователейДоменаРасширеннаяПодсказка - 57 + ГруппаПользователиРасширеннаяПодсказка + 50 Label true true @@ -445,152 +760,17 @@ Left - - ТаблицаПользователейДоменаКонтекстноеМеню - 9 - - ТаблицаПользователейДоменаКонтекстноеМенюВыбрать - 27 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюВыбратьРасширеннаяПодсказка - 53 - Label - true - true - - Left - - - Form.Command.Выбрать - Normal - Auto - true - true - UserCmds - - System.DefaultGUIFont - true - false - false - false - - Auto - - - ТаблицаПользователейДоменаКонтекстноеМенюНайти - 22 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюНайтиРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоиск - 23 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка - 55 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписок - 26 - true - true - - true - - - ТаблицаПользователейДоменаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 56 - Label - true - true - - Left - - - Form.Item.ТаблицаПользователейДомена.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - true - - true - true - true - true - 40 - true - true - 4 - true - 1 - 1 - AutoUse - AutoUse - true - true - false - false - false - Auto - Auto - true - true - - Style.BorderColor - - None - None - None - true - + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + true true @@ -606,7 +786,7 @@ Домены и пользователи - ДоменыИПользователиРасширеннаяПодсказка + ДоменыИПользователиExtendedTooltip 29 Label true @@ -618,6 +798,7 @@ UsualGroup Auto + NormalSeparation true true Auto @@ -637,7 +818,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 28 Label true diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html index c3baf5360..c98fe893d 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Help/ru.html @@ -1,4 +1,4 @@ - +

            Диалог "Выбор пользователя операционной системы" позволяет выбрать одного из пользователей, зарегистрированных в операционной системе.

            В списке "Домены" отображаются имена доменов, видимых с данного компьютера.

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

            diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl index 019835372..04f973c23 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаВыбораПользователяОС/Module.bsl @@ -62,13 +62,13 @@ Процедура Выбрать(Команда) Если Элементы.ТаблицаДоменов.ТекущиеДанные = Неопределено Тогда - Предупреждение(НСтр("ru = 'Выберите домен.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите домен.'")); Возврат; КонецЕсли; ИмяДомена = Элементы.ТаблицаДоменов.ТекущиеДанные.ИмяДомена; Если Элементы.ТаблицаПользователейДомена.ТекущиеДанные = Неопределено Тогда - Предупреждение(НСтр("ru = 'Выберите пользователя домена.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите пользователя домена.'")); Возврат; КонецЕсли; ИмяПользователя = Элементы.ТаблицаПользователейДомена.ТекущиеДанные.ИмяПользователя; diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Attributes/ПользователиСписок/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 73b930d98..2b72049ba 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Form.form @@ -37,8 +37,8 @@ ГруппыПользователей.Description - НаименованиеГруппыРасширеннаяПодсказка - 121 + НаименованиеГруппыExtendedTooltip + 112 Label true true @@ -91,10 +91,10 @@ ГруппыПользователейСтрокаПоиска - 112 + 132 ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка - 114 + 134 Label true true @@ -104,7 +104,7 @@ ГруппыПользователейСтрокаПоискаКонтекстноеМеню - 113 + 133 true ГруппыПользователей @@ -114,10 +114,10 @@ ГруппыПользователейСостояниеПросмотра - 115 + 135 ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка - 117 + 137 Label true true @@ -127,7 +127,7 @@ ГруппыПользователейСостояниеПросмотраКонтекстноеМеню - 116 + 136 true ViewStatusAddition @@ -138,10 +138,10 @@ ГруппыПользователейУправлениеПоиском - 118 + 138 ГруппыПользователейУправлениеПоискомРасширеннаяПодсказка - 120 + 140 Label true true @@ -151,7 +151,7 @@ ГруппыПользователейУправлениеПоискомКонтекстноеМеню - 119 + 139 true SearchControlAddition @@ -161,7 +161,7 @@
            - ГруппыПользователейРасширеннаяПодсказка + ГруппыПользователейExtendedTooltip 111 Label true @@ -230,8 +230,8 @@ true - ОтступРасширеннаяПодсказка - 132 + ОтступExtendedTooltip + 114 Label true true @@ -260,8 +260,8 @@ true - ВыбратьГруппуРасширеннаяПодсказка - 133 + ВыбратьГруппуExtendedTooltip + 115 Label true true @@ -288,8 +288,8 @@ true - ОтменитьВыборПользователяИлиГруппыРасширеннаяПодсказка - 134 + ОтменитьВыборПользователяИлиГруппыExtendedTooltip + 116 Label true true @@ -316,8 +316,8 @@ true - ОчиститьСписокВыбранныхПользователейИГруппРасширеннаяПодсказка - 135 + ОчиститьСписокВыбранныхПользователейИГруппExtendedTooltip + 117 Label true true @@ -344,8 +344,8 @@ Группа выбрать группу - ГруппаВыбратьГруппуРасширеннаяПодсказка - 131 + ГруппаВыбратьГруппуExtendedTooltip + 113 Label true true @@ -373,7 +373,7 @@ Группа группы - ГруппаГруппыРасширеннаяПодсказка + ГруппаГруппыExtendedTooltip 110 Label true @@ -426,8 +426,8 @@ ПользователиСписок.Description - НаименованиеРасширеннаяПодсказка - 148 + НаименованиеExtendedTooltip + 121 Label true true @@ -471,10 +471,10 @@ ПользователиСписокСтрокаПоиска - 139 + 150 ПользователиСписокСтрокаПоискаРасширеннаяПодсказка - 141 + 152 Label true true @@ -484,7 +484,7 @@ ПользователиСписокСтрокаПоискаКонтекстноеМеню - 140 + 151 true ПользователиСписок @@ -494,10 +494,10 @@ ПользователиСписокСостояниеПросмотра - 142 + 153 ПользователиСписокСостояниеПросмотраРасширеннаяПодсказка - 144 + 155 Label true true @@ -507,7 +507,7 @@ ПользователиСписокСостояниеПросмотраКонтекстноеМеню - 143 + 154 true ViewStatusAddition @@ -518,10 +518,10 @@ ПользователиСписокУправлениеПоиском - 145 + 156 ПользователиСписокУправлениеПоискомРасширеннаяПодсказка - 147 + 158 Label true true @@ -531,7 +531,7 @@ ПользователиСписокУправлениеПоискомКонтекстноеМеню - 146 + 157 true SearchControlAddition @@ -541,8 +541,8 @@ - ПользователиСписокРасширеннаяПодсказка - 138 + ПользователиСписокExtendedTooltip + 120 Label true true @@ -562,8 +562,8 @@ true - ПользователиСписокКонтекстноеМенюНазначитьГруппыРасширеннаяПодсказка - 137 + ПользователиСписокКонтекстноеМенюНазначитьГруппыExtendedTooltip + 119 Label true true @@ -635,8 +635,8 @@ true - Отступ2РасширеннаяПодсказка - 159 + Отступ2ExtendedTooltip + 123 Label true true @@ -665,8 +665,8 @@ true - ВыбратьПользователяКомандаРасширеннаяПодсказка - 160 + ВыбратьПользователяКомандаExtendedTooltip + 124 Label true true @@ -692,8 +692,8 @@ true - ОтменитьВыборПользователяРасширеннаяПодсказка - 161 + ОтменитьВыборПользователяExtendedTooltip + 125 Label true true @@ -719,8 +719,8 @@ true - ОчиститьСписокВыбранныхРасширеннаяПодсказка - 162 + ОчиститьСписокВыбранныхExtendedTooltip + 126 Label true true @@ -747,8 +747,8 @@ Группа выбрать пользователя - ГруппаВыбратьПользователяРасширеннаяПодсказка - 158 + ГруппаВыбратьПользователяExtendedTooltip + 122 Label true true @@ -776,8 +776,8 @@ Группа пользователи - ГруппаПользователиРасширеннаяПодсказка - 136 + ГруппаПользователиExtendedTooltip + 118 Label true true @@ -804,7 +804,7 @@ Группы и пользователи - ГруппыИПользователиРасширеннаяПодсказка + ГруппыИПользователиExtendedTooltip 109 Label true @@ -862,8 +862,8 @@ ВыбранныеПользователиИГруппы.Пользователь - ПользователиИГруппыРасширеннаяПодсказка - 174 + ПользователиИГруппыExtendedTooltip + 129 Label true true @@ -877,7 +877,6 @@ true InputField - true Auto true Left @@ -886,6 +885,11 @@ true true true + false + false + false + false + false true true true @@ -901,38 +905,11 @@ Selection СписокВыбранныхПользователейИГруппВыбор - - BeforeAddRow - СписокВыбранныхПользователейИГруппПередНачаломДобавления - СписокВыбранныхПользователейИГруппСтрокаПоиска - 165 - - СписокВыбранныхПользователейИГруппСтрокаПоискаРасширеннаяПодсказка - 167 - Label - true - true - - Left - - - - СписокВыбранныхПользователейИГруппСтрокаПоискаКонтекстноеМеню - 166 - true - - СписокВыбранныхПользователейИГрупп - - true - - - - СписокВыбранныхПользователейИГруппСостояниеПросмотра 168 - СписокВыбранныхПользователейИГруппСостояниеПросмотраРасширеннаяПодсказка + СписокВыбранныхПользователейИГруппСтрокаПоискаРасширеннаяПодсказка 170 Label true @@ -942,10 +919,33 @@ - СписокВыбранныхПользователейИГруппСостояниеПросмотраКонтекстноеМеню + СписокВыбранныхПользователейИГруппСтрокаПоискаКонтекстноеМеню 169 true + СписокВыбранныхПользователейИГрупп + + true + + + + СписокВыбранныхПользователейИГруппСостояниеПросмотра + 171 + + СписокВыбранныхПользователейИГруппСостояниеПросмотраРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + + СписокВыбранныхПользователейИГруппСостояниеПросмотраКонтекстноеМеню + 172 + true + ViewStatusAddition СписокВыбранныхПользователейИГрупп @@ -954,10 +954,10 @@ СписокВыбранныхПользователейИГруппУправлениеПоиском - 171 + 174 СписокВыбранныхПользователейИГруппУправлениеПоискомРасширеннаяПодсказка - 173 + 176 Label true true @@ -967,7 +967,7 @@ СписокВыбранныхПользователейИГруппУправлениеПоискомКонтекстноеМеню - 172 + 175 true SearchControlAddition @@ -977,8 +977,8 @@ - СписокВыбранныхПользователейИГруппРасширеннаяПодсказка - 164 + СписокВыбранныхПользователейИГруппExtendedTooltip + 128 Label true true @@ -1031,8 +1031,8 @@ Выбранные пользователи и группы - ВыбранныеПользователиИГруппыРасширеннаяПодсказка - 163 + ВыбранныеПользователиИГруппыExtendedTooltip + 127 Label true true @@ -1064,7 +1064,7 @@ Группа - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 108 Label true @@ -1103,8 +1103,8 @@ ВыбиратьИерархическиПриИзменении - ВыбиратьИерархическиРасширеннаяПодсказка - 185 + ВыбиратьИерархическиExtendedTooltip + 131 Label true true @@ -1134,8 +1134,8 @@ Группа показывать пользователей дочерних групп - ГруппаПоказыватьПользователейДочернихГруппРасширеннаяПодсказка - 184 + ГруппаПоказыватьПользователейДочернихГруппExtendedTooltip + 130 Label true true @@ -1164,7 +1164,7 @@ true - ЗавершитьИЗакрытьРасширеннаяПодсказка + ЗавершитьИЗакрытьExtendedTooltip 98 Label true @@ -1195,7 +1195,7 @@ false - ВыбратьГруппуПользователейРасширеннаяПодсказка + ВыбратьГруппуПользователейExtendedTooltip 99 Label true @@ -1229,7 +1229,7 @@ false - ВыбратьПользователяРасширеннаяПодсказка + ВыбратьПользователяExtendedTooltip 100 Label true @@ -1256,7 +1256,7 @@ false - СоздатьПользователяРасширеннаяПодсказка + СоздатьПользователяExtendedTooltip 101 Label true @@ -1283,7 +1283,7 @@ false - СоздатьГруппуПользователейРасширеннаяПодсказка + СоздатьГруппуПользователейExtendedTooltip 102 Label true @@ -1309,7 +1309,7 @@ true - НазначитьГруппыРасширеннаяПодсказка + НазначитьГруппыExtendedTooltip 103 Label true @@ -1339,7 +1339,7 @@ true - ПоказыватьНедействительныхПользователейРасширеннаяПодсказка + ПоказыватьНедействительныхПользователейExtendedTooltip 105 Label true @@ -1367,7 +1367,7 @@ false - ПользователиИБРасширеннаяПодсказка + ПользователиИБExtendedTooltip 106 Label true @@ -1399,7 +1399,7 @@ Командная панель пользователи - КоманднаяПанельПользователиРасширеннаяПодсказка + КоманднаяПанельПользователиExtendedTooltip 104 Label true @@ -1421,7 +1421,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 107 Label true @@ -1444,10 +1444,6 @@ NotificationProcessing ОбработкаОповещения - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере @@ -1487,9 +1483,6 @@ true - - ПользователиСписок.Недействителен -
            true
            ВЫБРАТЬ diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl index 1f1157614..480633c4f 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаСписка/Module.bsl @@ -24,7 +24,7 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Тогда + Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; @@ -106,10 +106,10 @@ Элементы.ПользователиСписок.МножественныйВыбор = Истина; Если ХранимыеПараметры.РасширенныйПодбор Тогда - ЭтаФорма.КлючСохраненияПоложенияОкна = "РасширенныйПодборПользователей"; + ЭтотОбъект.КлючСохраненияПоложенияОкна = "РасширенныйПодборПользователей"; ИзменитьПараметрыРасширеннойФормыПодбора(); Иначе - ЭтаФорма.КлючСохраненияПоложенияОкна = "РежимПодбораПользователей"; + ЭтотОбъект.КлючСохраненияПоложенияОкна = "РежимПодбораПользователей"; КонецЕсли; Если ХранимыеПараметры.ВыборГруппПользователей Тогда @@ -156,34 +156,7 @@ КонецЕсли; Если НЕ ВыбиратьИерархически Тогда - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Если Не ХранимыеПараметры.РасширенныйПодбор - Или Не СписокВыбранныхПользователейИзменен Тогда - Возврат; - КонецЕсли; - - ТекстВопроса = НСтр("ru = 'Список выбранных пользователей был изменен. Сохранить изменения?'"); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Да'")); - КнопкиВопроса.Добавить(НСтр("ru='Нет'")); - КнопкиВопроса.Добавить(НСтр("ru='Отмена'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - МассивПользователей = РезультатВыбора(); - ОповеститьОВыборе(МассивПользователей); - ИначеЕсли Ответ = КнопкиВопроса[2].Значение Тогда - Отказ = Истина; - Возврат; + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -194,7 +167,7 @@ &НаКлиенте Процедура ВыбиратьИерархическиПриИзменении(Элемент) - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры @@ -250,8 +223,9 @@ СтандартнаяОбработка = Ложь; Если ВыбиратьИерархически Тогда - Предупреждение(НСтр("ru = 'Для перетаскивания пользователя в группы необходимо отключить - |флажок ""Показывать пользователей дочерних групп"".'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Для перетаскивания пользователя в группы необходимо отключить + |флажок ""Показывать пользователей дочерних групп"".'")); Возврат; КонецЕсли; @@ -310,28 +284,13 @@ КонецЕсли; - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПараметрыПеретаскивания", ПараметрыПеретаскивания.Значение); + ДополнительныеПараметры.Вставить("Строка", Строка); + ДополнительныеПараметры.Вставить("Перемещение", Перемещение); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу( - ПараметрыПеретаскивания.Значение, Строка, Перемещение); - - Если СообщениеПользователю.Сообщение = Неопределено Тогда - Возврат; - КонецЕсли; - - Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.Информация32); - Иначе - Предупреждение(СообщениеПользователю.Сообщение); - КонецЕсли; - - Оповестить("Запись_ГруппыВнешнихПользователей"); + Оповещение = Новый ОписаниеОповещения("ГруппыПользователейПеретаскиваниеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); КонецПроцедуры @@ -396,11 +355,6 @@ КонецПроцедуры -&НаКлиенте -Процедура СписокВыбранныхПользователейИГруппПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Отказ = Истина; -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ @@ -529,12 +483,8 @@ Перем Порядок; // Порядок. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; - Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; - Иначе - Порядок = Список.Порядок; - КонецЕсли; + Порядок = Список.КомпоновщикНастроек.Настройки.Порядок; + Порядок.ИдентификаторПользовательскойНастройки = "ОсновнойПорядок"; Порядок.Элементы.Очистить(); @@ -615,7 +565,7 @@ Если ПолучитьФункциональнуюОпцию("ИспользоватьГруппыПользователей") Тогда Элементы.ГруппыИПользователи.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; Элементы.ГруппыИПользователи.ШиринаПодчиненныхЭлементов = ШиринаПодчиненныхЭлементовФормы.Одинаковая; - ЭтаФорма.Высота = 25; + ЭтотОбъект.Высота = 25; Элементы.ГруппаВыбратьГруппу.Видимость = Истина; // Включение отображения заголовков списков ПользователиСписок и ГруппыПользователей. Элементы.ГруппыПользователей.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; @@ -780,14 +730,14 @@ КонецЕсли; КонецЕсли; - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ГруппыПользователейПослеАктивизацииСтроки() - ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтаФорма); + ОбновитьСодержимоеФормыПриИзмененииГруппы(ЭтотОбъект); КонецПроцедуры @@ -809,6 +759,34 @@ КонецФункции +&НаКлиенте +Процедура ГруппыПользователейПеретаскиваниеЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + СообщениеПользователю = ПеремещениеПользователяВНовуюГруппу( + ДополнительныеПараметры.ПараметрыПеретаскивания, + ДополнительныеПараметры.Строка, + ДополнительныеПараметры.Перемещение); + + Если СообщениеПользователю.Сообщение = Неопределено Тогда + Возврат; + КонецЕсли; + + Если СообщениеПользователю.ЕстьОшибки = Ложь Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Перемещение пользователей'"), , СообщениеПользователю.Сообщение, БиблиотекаКартинок.Информация32); + Иначе + ПоказатьПредупреждение(,СообщениеПользователю.Сообщение); + КонецЕсли; + + Оповестить("Запись_ГруппыВнешнихПользователей"); + +КонецПроцедуры + &НаКлиентеНаСервереБезКонтекста Процедура ОбновитьСодержимоеФормыПриИзмененииГруппы(Форма) @@ -859,3 +837,5 @@ КонецПроцедуры + + diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form index 8f9785b21..e620e0482 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Form.form @@ -18,7 +18,7 @@ 50 - КоманднаяПанельРасширеннаяПодсказка + КоманднаяПанельExtendedTooltip 207 Label true @@ -49,7 +49,7 @@ true - ПолноеИмяКартинкаПредупрежденияРасширеннаяПодсказка + ПолноеИмяКартинкаПредупрежденияExtendedTooltip 209 Label true @@ -93,7 +93,7 @@ true - ПолноеИмяПояснениеНесоответствияРасширеннаяПодсказка + ПолноеИмяПояснениеНесоответствияExtendedTooltip 211 Label true @@ -126,7 +126,7 @@ false - ПолноеИмяВыполнитьСинхронизациюРасширеннаяПодсказка + ПолноеИмяВыполнитьСинхронизациюExtendedTooltip 212 Label true @@ -154,7 +154,7 @@ Полное имя пояснение и команда - ПолноеИмяПояснениеИКомандаРасширеннаяПодсказка + ПолноеИмяПояснениеИКомандаExtendedTooltip 210 Label true @@ -184,7 +184,7 @@ true - ПолноеИмяОбработкаНесоответствияРасширеннаяПодсказка + ПолноеИмяОбработкаНесоответствияExtendedTooltip 208 Label true @@ -219,7 +219,7 @@ true - СвязьКартинкаПредупрежденияРасширеннаяПодсказка + СвязьКартинкаПредупрежденияExtendedTooltip 214 Label true @@ -260,7 +260,7 @@ true - СвязьПояснениеНесоответствияРасширеннаяПодсказка + СвязьПояснениеНесоответствияExtendedTooltip 215 Label true @@ -298,7 +298,7 @@ true - СвязьОбработкаНесоответствияРасширеннаяПодсказка + СвязьОбработкаНесоответствияExtendedTooltip 213 Label true @@ -333,7 +333,7 @@ НаименованиеПриИзменении
            - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 216 Label true @@ -382,8 +382,8 @@ ДействителенПриИзменении - НедействителенРасширеннаяПодсказка - 218 + НедействителенExtendedTooltip + 217 Label true true @@ -420,8 +420,8 @@ ДоступКИнформационнойБазеРазрешенПриИзменении - ДоступКИнформационнойБазеРазрешенРасширеннаяПодсказка - 220 + ДоступКИнформационнойБазеРазрешенExtendedTooltip + 218 Label true true @@ -466,8 +466,8 @@ ПользовательИнфБазыИмяПриИзменении - ПользовательИнфБазыИмяРасширеннаяПодсказка - 225 + ПользовательИнфБазыИмяExtendedTooltip + 222 Label true true @@ -517,8 +517,8 @@ ПользовательИнфБазыАутентификацияСтандартнаяПриИзменении - ПользовательИнфБазыАутентификацияСтандартнаяРасширеннаяПодсказка - 228 + ПользовательИнфБазыАутентификацияСтандартнаяExtendedTooltip + 224 Label true true @@ -558,8 +558,8 @@ ПарольПриИзменении - ПарольРасширеннаяПодсказка - 231 + ПарольExtendedTooltip + 226 Label true true @@ -609,8 +609,8 @@ ПарольПриИзменении - ПодтверждениеПароляРасширеннаяПодсказка - 233 + ПодтверждениеПароляExtendedTooltip + 227 Label true true @@ -657,8 +657,8 @@ Right - ПользовательИнфБазыПоказыватьВСпискеВыбораРасширеннаяПодсказка - 235 + ПользовательИнфБазыПоказыватьВСпискеВыбораExtendedTooltip + 228 Label true true @@ -692,8 +692,8 @@ Right - ПользовательИнфБазыЗапрещеноИзменятьПарольРасширеннаяПодсказка - 237 + ПользовательИнфБазыЗапрещеноИзменятьПарольExtendedTooltip + 229 Label true true @@ -724,8 +724,8 @@ true - СвойстваПараметрыАутентификации1СПредприятияРасширеннаяПодсказка - 230 + СвойстваПараметрыАутентификации1СПредприятияExtendedTooltip + 225 Label true true @@ -750,8 +750,8 @@ true - СвойстваАутентификации1СПредприятияРасширеннаяПодсказка - 227 + СвойстваАутентификации1СПредприятияExtendedTooltip + 223 Label true true @@ -782,8 +782,8 @@ Right - ПользовательИнфБазыАутентификацияOpenIDРасширеннаяПодсказка - 239 + ПользовательИнфБазыАутентификацияOpenIDExtendedTooltip + 230 Label true true @@ -823,8 +823,8 @@ ПользовательИнфБазыАутентификацияОСПриИзменении - ПользовательИнфБазыАутентификацияОСРасширеннаяПодсказка - 242 + ПользовательИнфБазыАутентификацияОСExtendedTooltip + 232 Label true true @@ -861,8 +861,8 @@ true - ДекорацияОтступРасширеннаяПодсказка - 245 + ДекорацияОтступExtendedTooltip + 234 Label true true @@ -896,8 +896,8 @@ Left - ПользовательИнфБазыПользовательОСРасширеннаяПодсказка - 246 + ПользовательИнфБазыПользовательОСExtendedTooltip + 235 Label true true @@ -943,8 +943,8 @@ Свойства параметры аутентификации ОС - СвойстваПараметрыАутентификацииОСРасширеннаяПодсказка - 244 + СвойстваПараметрыАутентификацииОСExtendedTooltip + 233 Label true true @@ -971,8 +971,8 @@ Аутентификация операционной системы - СвойстваАутентификацииОСРасширеннаяПодсказка - 241 + СвойстваАутентификацииОСExtendedTooltip + 231 Label true true @@ -1009,8 +1009,8 @@ ПользовательИнфБазыЯзыкПриИзменении - ПользовательИнфБазыЯзыкРасширеннаяПодсказка - 249 + ПользовательИнфБазыЯзыкExtendedTooltip + 237 Label true true @@ -1056,8 +1056,8 @@ ПользовательИнфБазыРежимЗапуска - ПользовательИнфБазыРежимЗапускаРасширеннаяПодсказка - 251 + ПользовательИнфБазыРежимЗапускаExtendedTooltip + 238 Label true true @@ -1102,8 +1102,8 @@ false - СвойстваДополнительныеРасширеннаяПодсказка - 248 + СвойстваДополнительныеExtendedTooltip + 236 Label true true @@ -1133,8 +1133,8 @@ Основные свойства - ОсновныеСвойстваРасширеннаяПодсказка - 224 + ОсновныеСвойстваExtendedTooltip + 221 Label true true @@ -1204,8 +1204,8 @@ РолиПометкаПриИзменении - РолиПометкаРасширеннаяПодсказка - 269 + РолиПометкаExtendedTooltip + 246 Label true true @@ -1235,8 +1235,8 @@ Роли.Синоним - РолиСинонимРасширеннаяПодсказка - 271 + РолиСинонимExtendedTooltip + 247 Label true true @@ -1279,8 +1279,8 @@ Роли колонок - РолиКолонокРасширеннаяПодсказка - 268 + РолиКолонокExtendedTooltip + 245 Label true true @@ -1308,8 +1308,8 @@ false - РолиУстановитьФлажкиРасширеннаяПодсказка - 254 + РолиУстановитьФлажкиExtendedTooltip + 240 Label true true @@ -1335,8 +1335,8 @@ false - РолиСнятьФлажкиРасширеннаяПодсказка - 255 + РолиСнятьФлажкиExtendedTooltip + 241 Label true true @@ -1362,8 +1362,8 @@ false - РолиПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка - 256 + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 242 Label true true @@ -1388,8 +1388,8 @@ true - РолиПоказатьПодсистемыРолейРасширеннаяПодсказка - 257 + РолиПоказатьПодсистемыРолейExtendedTooltip + 243 Label true true @@ -1409,10 +1409,10 @@ РолиСтрокаПоиска - 259 + 263 РолиСтрокаПоискаРасширеннаяПодсказка - 261 + 265 Label true true @@ -1422,7 +1422,7 @@ РолиСтрокаПоискаКонтекстноеМеню - 260 + 264 true Роли @@ -1432,10 +1432,10 @@ РолиСостояниеПросмотра - 262 + 266 РолиСостояниеПросмотраРасширеннаяПодсказка - 264 + 268 Label true true @@ -1445,7 +1445,7 @@ РолиСостояниеПросмотраКонтекстноеМеню - 263 + 267 true ViewStatusAddition @@ -1456,10 +1456,10 @@ РолиУправлениеПоиском - 265 + 269 РолиУправлениеПоискомРасширеннаяПодсказка - 267 + 271 Label true true @@ -1469,7 +1469,7 @@ РолиУправлениеПоискомКонтекстноеМеню - 266 + 270 true SearchControlAddition @@ -1479,8 +1479,8 @@ - РолиРасширеннаяПодсказка - 258 + РолиExtendedTooltip + 244 Label true true @@ -1531,8 +1531,8 @@ Разрешенные действия (роли) - ОтображениеРолейРасширеннаяПодсказка - 253 + ОтображениеРолейExtendedTooltip + 239 Label true true @@ -1560,8 +1560,8 @@ Основные свойства - СвойстваПользователяИБРасширеннаяПодсказка - 223 + СвойстваПользователяИБExtendedTooltip + 220 Label true true @@ -1587,8 +1587,8 @@ Адреса, телефоны - КонтактнаяИнформацияРасширеннаяПодсказка - 281 + КонтактнаяИнформацияExtendedTooltip + 248 Label true true @@ -1614,8 +1614,8 @@ true true - СтраницыРасширеннаяПодсказка - 222 + СтраницыExtendedTooltip + 219 Label true true @@ -1634,10 +1634,6 @@ -1 Left - - ChoiceProcessing - ОбработкаВыбора - OnOpen ПриОткрытии diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html index b0503637b..5e961c52b 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

            diff --git a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl index eb476a29e..3c0e4f5cf 100644 --- a/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Пользователи/Forms/ФормаЭлемента/Module.bsl @@ -1,15 +1,6 @@ //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ -&НаСервере -Процедура ПриЧтенииНаСервере(ТекущийОбъект) - - // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект); - // Конец СтандартныеПодсистемы.КонтактнаяИнформация - -КонецПроцедуры - &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) @@ -39,10 +30,6 @@ Элементы.ПользовательИнфБазыРежимЗапуска.Видимость = Ложь; КонецЕсли; - Если ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда - Элементы.СвойстваАутентификацииОС.ТолькоПросмотр = Истина; - КонецЕсли; - Если Объект.Служебный Тогда ТолькоПросмотр = Истина; КонецЕсли; @@ -126,11 +113,11 @@ ПользователиСлужебный.ЗапретРедактированияРолей() ИЛИ ДействияВФорме.Роли <> "Редактирование"); - // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтаФорма, Объект, "КонтактнаяИнформация"); - // Конец СтандартныеПодсистемы.КонтактнаяИнформация - - АдаптироватьРедактированиеКонтактнойИнформацииВСервисе(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульУправлениеКонтактнойИнформацией.ПриСозданииНаСервере(ЭтотОбъект, Объект, "КонтактнаяИнформация"); + ПереопределитьРедактированиеКонтактнойИнформацииВСервисе(); + КонецЕсли; Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда Элементы.Недействителен.ТолькоПросмотр = Истина; @@ -143,7 +130,7 @@ КонецЕсли; УстановитьПостояннуюДоступностьСвойств(); - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); ТребуетсяСинхронизацияССервисом = Объект.Ссылка.Пустая(); @@ -158,31 +145,18 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) +&НаСервере +Процедура ПриЧтенииНаСервере(ТекущийОбъект) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АутентификацияВСервисе") Тогда - - Если ВыбранноеЗначение <> Неопределено Тогда - ПарольПользователяСервиса = ВыбранноеЗначение; - Если ЗапросПароляПередЗаписью Тогда - Записать(); - Иначе - Подключаемый_EMailНачалоВыбора(); - КонецЕсли; - КонецЕсли; - - ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.Пользователи.Форма.ФормаВыбораПользователяОС") Тогда - - Если ТипЗнч(ВыбранноеЗначение) = Тип("Строка") Тогда - ПользовательИнфБазыПользовательОС = ВыбранноеЗначение; - КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульУправлениеКонтактнойИнформацией.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ПередЗаписью(Отказ) +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) ОчиститьСообщения(); @@ -192,46 +166,43 @@ Если ДействияВФорме.Роли = "Редактирование" И ПользовательИнфБазыРоли.Количество() = 0 Тогда - Ответ = Вопрос( - НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), - РежимДиалогаВопрос.ДаНет, - , - , - ЗаголовокВопросов); - - Если Ответ = КодВозвратаДиалога.Нет Тогда + Если НЕ ПараметрыЗаписи.Свойство("СПустымСпискомРолей") Тогда Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей", ЭтотОбъект, ПараметрыЗаписи), + НСтр("ru = 'Пользователю информационной базы не установлено ни одной роли. Продолжить?'"), + РежимДиалогаВопрос.ДаНет, + , + , + ЗаголовокВопросов); + Возврат; КонецЕсли; КонецЕсли; - + // Обработка записи первого администратора. - ТекстВопроса = ""; - Если ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопросов); - Если Ответ = КодВозвратаДиалога.Нет Тогда + Если НЕ ПараметрыЗаписи.Свойство("ССозданиемПервогоАдминистратора") Тогда + ТекстВопроса = ""; + Если ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса) Тогда Отказ = Истина; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеПодтвержденияСозданияПервогоАдминистратора", ЭтотОбъект, ПараметрыЗаписи), + ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ЗаголовокВопросов); + Возврат; КонецЕсли; КонецЕсли; КонецЕсли; - Если Отказ Тогда - Возврат; - КонецЕсли; - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено - И ТребуетсяСинхронизацияССервисом Тогда + И ТребуетсяСинхронизацияССервисом + И ПарольПользователяСервиса = Неопределено Тогда - ЗапросПароляПередЗаписью = Истина; - - ПарольЕщеНеВведен = Ложь; + Отказ = Истина; СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); - - Если ПарольЕщеНеВведен Тогда - Отказ = Истина; - Возврат; - КонецЕсли; + Новый ОписаниеОповещения( + "ПослеЗапросаПароляДляАутентификацииВСервисеПередЗаписью", ЭтотОбъект, ПараметрыЗаписи), + ЭтотОбъект, + ПарольПользователяСервиса); + Возврат; КонецЕсли; КонецПроцедуры @@ -273,11 +244,12 @@ ТекущийОбъект.ДополнительныеСвойства.Вставить("ГруппаНовогоПользователя", ГруппаНовогоПользователя); - // СтандартныеПодсистемы.КонтактнаяИнформация - Если НЕ Отказ И ДействияВФорме.КонтактнаяИнформация = "Редактирование" Тогда - УправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Если НЕ Отказ И ДействияВФорме.КонтактнаяИнформация = "Редактирование" Тогда + МодульУправлениеКонтактнойИнформацией.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); + КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.КонтактнаяИнформация КонецПроцедуры @@ -305,19 +277,19 @@ Оповестить("Запись_Пользователи", Новый Структура, Объект.Ссылка); Если ПараметрыЗаписи.Свойство("ДобавленПользовательИБ") Тогда - Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтаФорма); + Оповестить("ДобавленПользовательИБ", ПараметрыЗаписи.ДобавленПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("ИзмененПользовательИБ") Тогда - Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтаФорма); + Оповестить("ИзмененПользовательИБ", ПараметрыЗаписи.ИзмененПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("УдаленПользовательИБ") Тогда - Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтаФорма); + Оповестить("УдаленПользовательИБ", ПараметрыЗаписи.УдаленПользовательИБ, ЭтотОбъект); ИначеЕсли ПараметрыЗаписи.Свойство("ОчищенаСвязьСНесуществующимПользователемИБ") Тогда Оповестить( "ОчищенаСвязьСНесуществующимПользователемИБ", ПараметрыЗаписи.ОчищенаСвязьСНесуществующимПользователемИБ, - ЭтаФорма); + ЭтотОбъект); КонецЕсли; Если ЗначениеЗаполнено(ГруппаНовогоПользователя) Тогда @@ -339,9 +311,10 @@ ПользователиСлужебный.ПроверитьОписаниеПользователяИБ(ОписаниеПользователяИБ, Отказ); КонецЕсли; - // СтандартныеПодсистемы.КонтактнаяИнформация - УправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтаФорма, Объект, Отказ); - // Конец СтандартныеПодсистемы.КонтактнаяИнформация + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + МодульУправлениеКонтактнойИнформацией.ОбработкаПроверкиЗаполненияНаСервере(ЭтотОбъект, Объект, Отказ); + КонецЕсли; КонецПроцедуры @@ -384,7 +357,7 @@ Объект.Наименование); КонецЕсли; - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры @@ -401,16 +374,16 @@ ПользовательИнфБазыПолноеИмя = Объект.Наименование; КонецЕсли; - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПользовательИнфБазыАутентификацияСтандартнаяПриИзменении(Элемент) - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -419,14 +392,14 @@ ПользовательИнфБазыПароль = Пароль; - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПользовательИнфБазыАутентификацияОСПриИзменении(Элемент) - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры @@ -434,7 +407,7 @@ Процедура ПользовательИнфБазыПользовательОСНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) #Если НЕ ВебКлиент Тогда - ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораПользователяОС", , ЭтаФорма); + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаВыбораПользователяОС", , Элемент); #КонецЕсли КонецПроцедуры @@ -446,99 +419,132 @@ ДоступКИнформационнойБазеРазрешен = Ложь; КонецЕсли; - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПользовательИнфБазыИмяПриИзменении(Элемент) - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПользовательИнфБазыЯзыкПриИзменении(Элемент) - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры -// СтандартныеПодсистемы.КонтактнаяИнформация - &НаКлиенте Процедура Подключаемый_EMailПриИзменении(Элемент) - УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + + МодульУправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтотОбъект, Элемент); Если НЕ Объект.Ссылка.Пустая() Тогда Возврат; КонецЕсли; - ТаблицаКИ = ЭтаФорма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - СтрокаEMail = ТаблицаКИ.НайтиСтроки(Новый Структура("Вид", - ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EmailПользователя")))[0]; + ТаблицаКИ = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - Если ЗначениеЗаполнено(ЭтаФорма[СтрокаEMail.ИмяРеквизита]) Тогда + СтрокаEMail = ТаблицаКИ.НайтиСтроки(Новый Структура("Вид", + ВидКонтактнойИнформацииEmailПользователя()))[0]; + + Если ЗначениеЗаполнено(ЭтотОбъект[СтрокаEMail.ИмяРеквизита]) Тогда Пароль = "" + Новый УникальныйИдентификатор + "qQ"; ПодтверждениеПароля = Пароль; ПользовательИнфБазыПароль = Пароль; КонецЕсли; - УстановитьДоступностьСвойств(ЭтаФорма); + УстановитьДоступностьСвойств(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура Подключаемый_ТелефонПриИзменении(Элемент) - УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + МодульУправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтотОбъект, Элемент); + + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура Подключаемый_EMailНачалоВыбора() - ЗапросПароляПередЗаписью = Ложь; + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + И ПарольПользователяСервиса = Неопределено Тогда - ПарольЕщеНеВведен = Ложь; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); + СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + Новый ОписаниеОповещения("Подключаемый_EMailНачалоВыбораЗавершение", ЭтотОбъект), + ЭтотОбъект, + ПарольПользователяСервиса); + Иначе + Подключаемый_EMailНачалоВыбораЗавершение("", Неопределено); + КонецЕсли; - Если ПарольЕщеНеВведен Тогда +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_EMailНачалоВыбораЗавершение(НовыйПарольПользователяСервиса, Неопределен) Экспорт + + Если НовыйПарольПользователяСервиса = Неопределено Тогда Возврат; КонецЕсли; - ТаблицаКИ = ЭтаФорма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; - Отбор = Новый Структура("Вид", - ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EmailПользователя")); + ТаблицаКИ = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + + Отбор = Новый Структура("Вид", ВидКонтактнойИнформацииEmailПользователя()); СтрокаEMail = ТаблицаКИ.НайтиСтроки(Отбор)[0]; ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПарольПользователяСервиса", ПарольПользователяСервиса); - ПараметрыФормы.Вставить("СтараяПочта", ЭтаФорма[СтрокаEMail.ИмяРеквизита]); + ПараметрыФормы.Вставить("СтараяПочта", ЭтотОбъект[СтрокаEMail.ИмяРеквизита]); ПараметрыФормы.Вставить("Пользователь", Объект.Ссылка); - ОткрытьФорму("Справочник.Пользователи.Форма.СменаПочты", ПараметрыФормы, ЭтаФорма); + Попытка + + ОткрытьФорму("Справочник.Пользователи.Форма.СменаПочты", ПараметрыФормы, ЭтотОбъект); + + Исключение + + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + + КонецПопытки; КонецПроцедуры &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияПриИзменении(Элемент) - УправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтаФорма, Элемент); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + + МодульУправлениеКонтактнойИнформациейКлиент.ПредставлениеПриИзменении(ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора(ЭтаФорма, Элемент, , СтандартнаяОбработка); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + + Результат = МодульУправлениеКонтактнойИнформациейКлиент.ПредставлениеНачалоВыбора( + ЭтотОбъект, Элемент, , СтандартнаяОбработка); + ОбновитьКонтактнуюИнформацию(Результат); КонецПроцедуры @@ -546,7 +552,12 @@ &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияОчистка(Элемент, СтандартнаяОбработка) - Результат = УправлениеКонтактнойИнформациейКлиент.ПредставлениеОчистка(ЭтаФорма, Элемент.Имя); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + + Результат = МодульУправлениеКонтактнойИнформациейКлиент.ПредставлениеОчистка( + ЭтотОбъект, Элемент.Имя); + ОбновитьКонтактнуюИнформацию(Результат); КонецПроцедуры @@ -554,20 +565,59 @@ &НаКлиенте Процедура Подключаемый_КонтактнаяИнформацияВыполнитьКоманду(Команда) - Результат = УправлениеКонтактнойИнформациейКлиент.ПодключаемаяКоманда(ЭтаФорма, Команда.Имя); + МодульУправлениеКонтактнойИнформациейКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеКонтактнойИнформациейКлиент"); + + Результат = МодульУправлениеКонтактнойИнформациейКлиент.ПодключаемаяКоманда( + ЭтотОбъект, Команда.Имя); + ОбновитьКонтактнуюИнформацию(Результат); - УправлениеКонтактнойИнформациейКлиент.ОткрытьФормуВводаАдреса(ЭтаФорма, Результат); + + МодульУправлениеКонтактнойИнформациейКлиент.ОткрытьФормуВводаАдреса(ЭтотОбъект, Результат); КонецПроцедуры &НаСервере Функция ОбновитьКонтактнуюИнформацию(Результат = Неопределено) - Возврат УправлениеКонтактнойИнформацией.ОбновитьКонтактнуюИнформацию(ЭтаФорма, Объект, Результат); + МодульУправлениеКонтактнойИнформациейСервер = + ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + Возврат МодульУправлениеКонтактнойИнформациейСервер.ОбновитьКонтактнуюИнформацию( + ЭтотОбъект, Объект, Результат); КонецФункции -// Конец СтандартныеПодсистемы.КонтактнаяИнформация +&НаСервере +Процедура ПереопределитьРедактированиеКонтактнойИнформацииВСервисе() + + Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + КонтактнаяИнформация = ЭтотОбъект.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + + СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники["ВидыКонтактнойИнформации"].EmailПользователя))[0]; + ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита]; + ЭлементEMail.УстановитьДействие("ПриИзменении", "Подключаемый_EMailПриИзменении"); + + ЭлементEMail.КнопкаВыбора = Истина; + ЭлементEMail.УстановитьДействие("НачалоВыбора", "Подключаемый_EMailНачалоВыбора"); + + СтрокаТелефон = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники["ВидыКонтактнойИнформации"].ТелефонПользователя))[0]; + ЭлементТелефон = Элементы[СтрокаТелефон.ИмяРеквизита]; + ЭлементТелефон.УстановитьДействие("ПриИзменении", "Подключаемый_ТелефонПриИзменении"); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ВидКонтактнойИнформацииEmailПользователя() + + ИмяПредопределенногоЗначения = "Справочник." + "ВидыКонтактнойИнформации" + ".EmailПользователя"; + + Возврат ПредопределенноеЗначение(ИмяПредопределенногоЗначения); + +КонецФункции //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Роли @@ -582,7 +632,7 @@ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей"); Если Элементы.Роли.ТекущиеДанные.Имя = "ПолныеПрава" Тогда - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецЕсли; КонецЕсли; @@ -598,7 +648,7 @@ Процедура ПоказатьТолькоВыбранныеРоли(Команда) ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -606,7 +656,7 @@ Процедура ГруппировкаРолейПоПодсистемам(Команда) ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -615,7 +665,7 @@ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма, Ложь); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь); КонецПроцедуры @@ -629,6 +679,29 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Продолжение обработчика события ПередЗаписью +&НаКлиенте +Процедура ПослеЗапросаПароляДляАутентификацииВСервисеПередЗаписью(НовыйПарольПользователяСервиса, ПараметрыЗаписи) Экспорт + + Если НовыйПарольПользователяСервиса = Неопределено Тогда + Возврат; + КонецЕсли; + + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; + + Попытка + + Записать(ПараметрыЗаписи); + + Исключение + + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + + КонецПопытки; + +КонецПроцедуры + &НаСервере Процедура ОпределитьДействияВФорме() @@ -646,15 +719,31 @@ // "", "Просмотр", "Редактирование". ДействияВФорме.Вставить("СвойстваЭлемента", ""); - Если Пользователи.ЭтоПолноправныйПользователь() Тогда + Если Пользователи.ЭтоПолноправныйПользователь(,ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный) Тогда // Администратор. ДействияВФорме.Роли = "Редактирование"; ДействияВФорме.КонтактнаяИнформация = "Редактирование"; ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех"; ДействияВФорме.СвойстваЭлемента = "Редактирование"; + ИначеЕсли Пользователи.ЭтоПолноправныйПользователь() Тогда + + Если Пользователи.АвторизованныйПользователь() <> Объект.Ссылка И + Пользователи.ЭтоПолноправныйПользователь(Объект.Ссылка, ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный) Тогда + // Другой администратор. + ДействияВФорме.Роли = ""; + ДействияВФорме.КонтактнаяИнформация = "Просмотр"; + ДействияВФорме.СвойстваПользователяИБ = "Просмотр"; + ДействияВФорме.СвойстваЭлемента = "Просмотр"; + Иначе + ДействияВФорме.Роли = "Редактирование"; + ДействияВФорме.КонтактнаяИнформация = "Редактирование"; + ДействияВФорме.СвойстваПользователяИБ = "РедактированиеВсех"; + ДействияВФорме.СвойстваЭлемента = "Редактирование"; + КонецЕсли; + ИначеЕсли РольДоступна("ДобавлениеИзменениеПользователей") - И НЕ Пользователи.ЭтоПолноправныйПользователь(Объект.Ссылка) Тогда + И НЕ Пользователи.ЭтоПолноправныйПользователь(Объект.Ссылка) Тогда // Ответственный за список пользователей и групп пользователей. // (Исполнитель распоряжений о приеме на работу и переводу, @@ -732,7 +821,7 @@ КонецПроцедуры &НаСервере -Функция ОписаниеПользователяИБ() +Функция ОписаниеПользователяИБ(ДляПроверкиПервогоАдминистратора = Ложь) Если Элементы.ПолноеИмяПояснениеНесоответствия.Видимость Тогда ПользовательИнфБазыПолноеИмя = Объект.Наименование; @@ -743,7 +832,7 @@ Результат = Пользователи.НовоеОписаниеПользователяИБ(); Пользователи.СкопироватьСвойстваПользователяИБ( Результат, - ЭтаФорма, + ЭтотОбъект, , "УникальныйИдентификатор, |Роли", @@ -762,7 +851,9 @@ Результат.Вставить("Роли", ТекущиеРоли); КонецЕсли; - Если ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Результат) Тогда + Если НЕ ДляПроверкиПервогоАдминистратора + И ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора(Результат) Тогда + РолиАдминистратора = Новый Массив; РолиАдминистратора.Добавить("ПолныеПрава"); @@ -781,7 +872,7 @@ Функция ТребуетсяСоздатьПервогоАдминистратора(ТекстВопроса = Неопределено) Возврат ПользователиСлужебный.ТребуетсяСоздатьПервогоАдминистратора( - ОписаниеПользователяИБ(), + ОписаниеПользователяИБ(Истина), ТекстВопроса); КонецФункции @@ -793,6 +884,26 @@ КонецПроцедуры +&НаКлиенте +Процедура ПослеОтветаНаВопросОЗаписиСПустымСпискомРолей(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("СПустымСпискомРолей"); + Записать(ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеПодтвержденияСозданияПервогоАдминистратора(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ <> КодВозвратаДиалога.Нет Тогда + ПараметрыЗаписи.Вставить("ССозданиемПервогоАдминистратора"); + Записать(ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработка пользователя ИБ. @@ -872,7 +983,7 @@ КонецЕсли; Пользователи.СкопироватьСвойстваПользователяИБ( - ЭтаФорма, + ЭтотОбъект, ОписаниеПользователяИБ, , "УникальныйИдентификатор, @@ -947,7 +1058,7 @@ ВыводитьСписокРолей = ЗначениеЗаполнено(ДействияВФорме.Роли); Элементы.ОтображениеРолей.Видимость = ВыводитьСписокРолей; Элементы.СвойстваАутентификации1СПредприятия.Отображение = - ?(ВыводитьСписокРолей, ОтображениеОбычнойГруппы.Нет, ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыОтступ()); + ?(ВыводитьСписокРолей, ОтображениеОбычнойГруппы.Нет, ОтображениеОбычнойГруппы.ОбычноеВыделение); Элементы.Наименование.ТолькоПросмотр = ДействияВФорме.СвойстваЭлемента <> "Редактирование"; @@ -1038,7 +1149,7 @@ ЭлементКИ = Элементы[СтрокаКИ.ИмяРеквизита]; - Если СтрокаКИ.Вид = ПредопределенноеЗначение("Справочник.ВидыКонтактнойИнформации.EmailПользователя") Тогда + Если СтрокаКИ.Вид = ВидКонтактнойИнформацииEmailПользователя() Тогда ЭлементКИ.ТолькоПросмотр = НЕ Форма.Объект.Ссылка.Пустая(); @@ -1073,7 +1184,7 @@ Элементы.ДоступКИнформационнойБазеРазрешен.Доступность = Элементы.ДоступКИнформационнойБазеРазрешен.Доступность И Форма.ДействияСПользователемСервиса.ИзменениеДоступа; - Элементы.Недействителен.Доступность = Элементы.Недействителен.Доступность + Элементы.Недействителен.Доступность = Элементы.Недействителен.Доступность И Форма.ДействияСПользователемСервиса.ИзменениеДоступа; Форма.ЗапретИзмененияАдминистративногоДоступа = НЕ Форма.ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа; @@ -1082,28 +1193,6 @@ КонецПроцедуры -&НаСервере -Процедура АдаптироватьРедактированиеКонтактнойИнформацииВСервисе() - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - КонтактнаяИнформация = ЭтаФорма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; - - СтрокаEMail = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники.ВидыКонтактнойИнформации.EmailПользователя))[0]; - ЭлементEMail = Элементы[СтрокаEMail.ИмяРеквизита]; - ЭлементEMail.УстановитьДействие("ПриИзменении", "Подключаемый_EMailПриИзменении"); - - ЭлементEMail.КнопкаВыбора = Истина; - ЭлементEMail.УстановитьДействие("НачалоВыбора", "Подключаемый_EMailНачалоВыбора"); - - СтрокаТелефон = КонтактнаяИнформация.НайтиСтроки(Новый Структура("Вид", Справочники.ВидыКонтактнойИнформации.ТелефонПользователя))[0]; - ЭлементТелефон = Элементы[СтрокаТелефон.ИмяРеквизита]; - ЭлементТелефон.УстановитьДействие("ПриИзменении", "Подключаемый_ТелефонПриИзменении"); - -КонецПроцедуры - &НаКлиенте Процедура ПользовательИнфБазыРежимЗапускаОчистка(Элемент, СтандартнаяОбработка) @@ -1119,17 +1208,14 @@ ПараметрыДействия = Новый Структура; ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр); - ПараметрыДействия.Вставить("Форма", ЭтаФорма); + ПараметрыДействия.Вставить("Форма", ЭтотОбъект); ПараметрыДействия.Вставить("КоллекцияРолей", ПользовательИнфБазыРоли); ПараметрыДействия.Вставить("ЗапретИзмененияАдминистративногоДоступа", ЗапретИзмененияАдминистративногоДоступа); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательОбластиДанных); - Иначе - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); - КонецЕсли; + ТипПользователей = ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), + Перечисления.ТипыПользователей.ПользовательОбластиДанных, + Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); + ПараметрыДействия.Вставить("ТипПользователей", ТипПользователей); БылУстановленАдминистративныйДоступ = ПользовательИнфБазыРоли.НайтиСтроки( Новый Структура("Роль", "ПолныеПрава")).Количество() > 0; @@ -1140,7 +1226,7 @@ Новый Структура("Роль", "ПолныеПрава")).Количество() > 0; Если УстановленАдминистративныйДоступ <> БылУстановленАдминистративныйДоступ Тогда - УстановитьНеобходимостьСинхронизацииССервисом(ЭтаФорма); + УстановитьНеобходимостьСинхронизацииССервисом(ЭтотОбъект); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/Пользователи/Help/ru.html b/SSL/src/Catalogs/Пользователи/Help/ru.html index 6cd5f0fc5..ad6a195e6 100644 --- a/SSL/src/Catalogs/Пользователи/Help/ru.html +++ b/SSL/src/Catalogs/Пользователи/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

            diff --git a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl index 33f562110..3add699f2 100644 --- a/SSL/src/Catalogs/Пользователи/ManagerModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ManagerModule.bsl @@ -1,5 +1,25 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяИБ"); + НеРедактируемыеРеквизиты.Добавить("ИдентификаторПользователяСервиса"); + НеРедактируемыеРеквизиты.Добавить("Недействителен"); + НеРедактируемыеРеквизиты.Добавить("Служебный"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -15,11 +35,3 @@ КонецПроцедуры -Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) - - ПользователиСлужебный.ОбработкаПолученияФормыПользователя(ВидФормы, Параметры, ВыбраннаяФорма, - ДополнительнаяИнформация, СтандартнаяОбработка); - -КонецПроцедуры - -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl index ad8107bd5..48c35015b 100644 --- a/SSL/src/Catalogs/Пользователи/ObjectModule.bsl +++ b/SSL/src/Catalogs/Пользователи/ObjectModule.bsl @@ -117,19 +117,15 @@ Процедура ОбщиеДействияПередУдалениемВОбычномРежимеИПриОбмененДанными() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ Пользователи.ЭтоНеразделенныйПользователь(ИдентификаторПользователяИБ) Тогда - - // Требуется удалить пользователя ИБ, иначе он попадет в список ошибок в форме ПользователиИБ, - // кроме того, вход под этим пользователем ИБ приведет к ошибке. - - ОписаниеПользователяИБ = Новый Структура; - ОписаниеПользователяИБ.Вставить("Действие", "Удалить"); - ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ); - - ПользователиСлужебный.НачатьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ, Истина); - ПользователиСлужебный.ЗавершитьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ); - КонецЕсли; + // Требуется удалить пользователя ИБ, иначе он попадет в список ошибок в форме ПользователиИБ, + // кроме того, вход под этим пользователем ИБ приведет к ошибке. + + ОписаниеПользователяИБ = Новый Структура; + ОписаниеПользователяИБ.Вставить("Действие", "Удалить"); + ДополнительныеСвойства.Вставить("ОписаниеПользователяИБ", ОписаниеПользователяИБ); + + ПользователиСлужебный.НачатьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ, Истина); + ПользователиСлужебный.ЗавершитьОбработкуПользователяИБ(ЭтотОбъект, ПараметрыОбработкиПользователяИБ); КонецПроцедуры diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form index c1a08b97c..984b8b53f 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Form.form @@ -15,7 +15,7 @@ ДляПисемВПапке - ДляПисемВПапкеРасширеннаяПодсказка + ДляПисемВПапкеExtendedTooltip 24 Label true @@ -65,8 +65,8 @@ Right - ВключаяПодчиненныеРасширеннаяПодсказка - 26 + ВключаяПодчиненныеExtendedTooltip + 25 Label true true @@ -100,7 +100,7 @@ Группа для папки - ГруппаДляПапкиРасширеннаяПодсказка + ГруппаДляПапкиExtendedTooltip 23 Label true @@ -156,8 +156,8 @@ Признак применения правила - ПрименяемыеПравилаПрименятьРасширеннаяПодсказка - 43 + ПрименяемыеПравилаПрименятьExtendedTooltip + 32 Label true true @@ -193,8 +193,8 @@ ПрименяемыеПравила.Правило - ПрименяемыеПравилаПравилоРасширеннаяПодсказка - 45 + ПрименяемыеПравилаПравилоExtendedTooltip + 33 Label true true @@ -235,8 +235,8 @@ ПрименяемыеПравила.ПомещатьВПапку - ПрименяемыеПравилаПеремещатьВПапкуРасширеннаяПодсказка - 47 + ПрименяемыеПравилаПеремещатьВПапкуExtendedTooltip + 34 Label true true @@ -279,8 +279,8 @@ true - ПрименяемыеПравилаПрименитьРасширеннаяПодсказка - 28 + ПрименяемыеПравилаПрименитьExtendedTooltip + 26 Label true true @@ -305,8 +305,8 @@ true - ПрименяемыеПравилаУстановитьВсеПрименитьРасширеннаяПодсказка - 29 + ПрименяемыеПравилаУстановитьВсеПрименитьExtendedTooltip + 27 Label true true @@ -331,8 +331,8 @@ true - ПрименяемыеПравилаСнятьВсеПрименитьРасширеннаяПодсказка - 30 + ПрименяемыеПравилаСнятьВсеПрименитьExtendedTooltip + 28 Label true true @@ -360,8 +360,8 @@ УчетнаяЗапись - ПрименяемыеПравилаСправочникПравилаОбработкиЭлектроннойПочтыОткрытьПоЗначению1РасширеннаяПодсказка - 31 + ПрименяемыеПравилаСправочникПравилаОбработкиЭлектроннойПочтыОткрытьПоЗначению1ExtendedTooltip + 29 Label true true @@ -395,8 +395,8 @@ Группа стандартные команды - ГруппаСтандартныеКомандыРасширеннаяПодсказка - 32 + ГруппаСтандартныеКомандыExtendedTooltip + 30 Label true true @@ -412,10 +412,10 @@ ПрименяемыеПравилаСтрокаПоиска - 34 + 38 ПрименяемыеПравилаСтрокаПоискаРасширеннаяПодсказка - 36 + 40 Label true true @@ -425,7 +425,7 @@ ПрименяемыеПравилаСтрокаПоискаКонтекстноеМеню - 35 + 39 true ПрименяемыеПравила @@ -435,10 +435,10 @@ ПрименяемыеПравилаСостояниеПросмотра - 37 + 41 ПрименяемыеПравилаСостояниеПросмотраРасширеннаяПодсказка - 39 + 43 Label true true @@ -448,7 +448,7 @@ ПрименяемыеПравилаСостояниеПросмотраКонтекстноеМеню - 38 + 42 true ViewStatusAddition @@ -459,10 +459,10 @@ ПрименяемыеПравилаУправлениеПоиском - 40 + 44 ПрименяемыеПравилаУправлениеПоискомРасширеннаяПодсказка - 42 + 46 Label true true @@ -472,7 +472,7 @@ ПрименяемыеПравилаУправлениеПоискомКонтекстноеМеню - 41 + 45 true SearchControlAddition @@ -482,8 +482,8 @@ - ПрименяемыеПравилаРасширеннаяПодсказка - 33 + ПрименяемыеПравилаExtendedTooltip + 31 Label true true @@ -536,8 +536,8 @@ None - ПредставлениеОтбораРасширеннаяПодсказка - 57 + ПредставлениеОтбораExtendedTooltip + 35 Label true true diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html index 3bd860083..73a54ceb4 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Help/ru.html @@ -1,4 +1,4 @@ - +

            Применение правил обработки электронной почты

            Когда возникает необходимость применения правил обработки электронной почты?

            Как применить правила?

            diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl index 79b33a9e7..ed4929563 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ПрименениеПравил/Module.bsl @@ -114,7 +114,7 @@ ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина); - ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, ИдентификаторЗадания); + ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтотОбъект, ИдентификаторЗадания); Иначе Оповестить("ПримененыПравилаОбработкиПисем"); @@ -149,7 +149,7 @@ ПараметрыВыгрузки = Новый Структура( "ТаблицаПравил,ДляПисемВПапке,ВключаяПодчиненные, УчетнаяЗапись", ПрименяемыеПравила.Выгрузить(),ДляПисемВПапке, ВключаяПодчиненные, УчетнаяЗапись); - ЗаполнитьЗначенияСвойств(ПараметрыВыгрузки, ЭтаФорма); + ЗаполнитьЗначенияСвойств(ПараметрыВыгрузки, ЭтотОбъект); Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 47e7d6fec..3c82ef846 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -16,4 +16,6 @@ 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 index a5fac573d..ee3887211 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -34,8 +34,8 @@ true - НаименованиеРасширеннаяПодсказка - 28 + НаименованиеExtendedTooltip + 19 Label true true @@ -70,8 +70,8 @@ Список.ПомещатьВПапку - ПомещатьВПапкуРасширеннаяПодсказка - 30 + ПомещатьВПапкуExtendedTooltip + 20 Label true true @@ -94,40 +94,17 @@ true
            - None - - СписокКоманднаяПанель - 3 - Left - - - СписокСтрокаПоиска - 19 - - СписокСтрокаПоискаРасширеннаяПодсказка - 21 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 20 - true - - Список - - true - - - - СписокСостояниеПросмотра + + Ссылка 22 + true + true + + + Список.Ref + - СписокСостояниеПросмотраРасширеннаяПодсказка + СсылкаРасширеннаяПодсказка 24 Label true @@ -137,10 +114,67 @@ - СписокСостояниеПросмотраКонтекстноеМеню + СсылкаКонтекстноеМеню 23 true + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 25 + + СписокСтрокаПоискаРасширеннаяПодсказка + 27 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 26 + true + + Список + + true + + + + СписокСостояниеПросмотра + 28 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 29 + true + ViewStatusAddition Список @@ -149,10 +183,10 @@ СписокУправлениеПоиском - 25 + 31 СписокУправлениеПоискомРасширеннаяПодсказка - 27 + 33 Label true true @@ -162,7 +196,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 26 + 32 true SearchControlAddition @@ -172,7 +206,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 18 Label true @@ -236,8 +270,8 @@ None - ПредставлениеОтбораРасширеннаяПодсказка - 40 + ПредставлениеОтбораExtendedTooltip + 21 Label true true @@ -277,7 +311,7 @@ true - СписокПереместитьВариантОтветаВверхРасширеннаяПодсказка + СписокПереместитьВариантОтветаВверхExtendedTooltip 15 Label true @@ -303,7 +337,7 @@ true - СписокПереместитьВариантОтветаВнизРасширеннаяПодсказка + СписокПереместитьВариантОтветаВнизExtendedTooltip 16 Label true @@ -329,7 +363,7 @@ true - ФормаПрименитьПравилаРасширеннаяПодсказка + ФормаПрименитьПравилаExtendedTooltip 17 Label true diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Help/ru.html index 0d30377b0..3d8fb73b0 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Help/ru.html +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Help/ru.html @@ -1,4 +1,4 @@ - +

            Правила обработки электронной почты

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

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

            diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl index a4928011b..014dee8c6 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаСписка/Module.bsl @@ -48,7 +48,7 @@ Возврат; КонецЕсли; - ОткрытьФорму("Справочник.ПравилаОбработкиЭлектроннойПочты.Форма.ПрименениеПравил", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.ПравилаОбработкиЭлектроннойПочты.Форма.ПрименениеПравил", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index 33babbf65..74c18dc62 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -16,7 +16,7 @@ НаименованиеПриИзменении - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 15 Label true @@ -39,7 +39,6 @@ true true true - true true true true @@ -58,8 +57,8 @@ Объект.ПомещатьВПапку - ПомещатьВПапкуРасширеннаяПодсказка - 17 + ПомещатьВПапкуExtendedTooltip + 16 Label true true @@ -116,8 +115,8 @@ true - КомпоновщикНастроекНастройкиОтборСвойстваЭлементаПользовательскойНастройкиРасширеннаяПодсказка - 19 + КомпоновщикНастроекНастройкиОтборСвойстваЭлементаПользовательскойНастройкиExtendedTooltip + 17 Label true true @@ -212,8 +211,8 @@ - КомпоновщикНастроекНастройкиОтборРасширеннаяПодсказка - 20 + КомпоновщикНастроекНастройкиОтборExtendedTooltip + 18 Label true true diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html index 1c52e0929..90d1f4764 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

            Правило обработки электронной почты

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

            Как настроить правило?

            diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html index 482811335..4df5cc4f3 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/Help/ru.html @@ -1,4 +1,4 @@ - +

            Правила обработки электронной почты

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

             

            \ No newline at end of file diff --git a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl index c20fe9468..4144a3695 100644 --- a/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПравилаОбработкиЭлектроннойПочты/ManagerModule.bsl @@ -1,7 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - - &НаСервере Процедура ПрименитьПравила(ПараметрыВыгрузки, АдресХранилища) Экспорт @@ -35,7 +33,8 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ЭлектронноеПисьмоВходящее.Ссылка + | ЭлектронноеПисьмоВходящее.Ссылка, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка |ИЗ | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий @@ -46,7 +45,8 @@ |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ - | ЭлектронноеПисьмоИсходящее.Ссылка + | ЭлектронноеПисьмоИсходящее.Ссылка, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма |ИЗ | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий @@ -54,8 +54,8 @@ |ГДЕ | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма " + ТекстУсловияПоПапке ; - Запрос.УстановитьПараметр("ВыбранныеПравила",ПараметрыВыгрузки.ТаблицаПравил); - Запрос.УстановитьПараметр("ПапкаЭлектронногоПисьма",ПараметрыВыгрузки.ДляПисемВПапке); + Запрос.УстановитьПараметр("ВыбранныеПравила", ПараметрыВыгрузки.ТаблицаПравил); + Запрос.УстановитьПараметр("ПапкаЭлектронногоПисьма", ПараметрыВыгрузки.ДляПисемВПапке); Результат = Запрос.ВыполнитьПакет(); Если Результат[2].Пустой() Тогда @@ -63,7 +63,11 @@ ПоместитьВоВременноеХранилище(ТекстСообщения, АдресХранилища); Возврат; КонецЕсли; - МассивПисем = Результат[2].Выгрузить().ВыгрузитьКолонку("Ссылка"); + + ТаблицаПисем = Результат[2].Выгрузить(); + МассивПисем = ТаблицаПисем.ВыгрузитьКолонку("Ссылка"); + МассивПапок = ТаблицаПисем.ВыгрузитьКолонку("Папка"); + МассивПапок = Взаимодействия.УдалитьПовторяющиесяЭлементыМассива(МассивПапок); Выборка = Результат[1].Выбрать(); Пока Выборка.Следующий() Цикл @@ -110,8 +114,13 @@ Для каждого СтрокаТаблицы Из ТаблицаСоответствий Цикл ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма( - СтрокаТаблицы.Письмо,СтрокаТаблицы.Папка); + СтрокаТаблицы.Письмо, СтрокаТаблицы.Папка, Ложь); + Если ЗначениеЗаполнено(СтрокаТаблицы.Папка) И МассивПапок.Найти(СтрокаТаблицы.Папка) = Неопределено Тогда + МассивПапок.Добавить(СтрокаТаблицы.Папка); + КонецЕсли; КонецЦикла; + + Взаимодействия.РассчитатьРассмотреноПоПапкам(Взаимодействия.ТаблицаДанныхДляРасчетаРассмотрено(МассивПапок, "Папка")); Если ТаблицаСоответствий.Количество() > 0 Тогда ТекстСообщения = НСтр("ru = 'Перенос писем в папки выполнен.'"); diff --git a/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl new file mode 100644 index 000000000..0749f18f0 --- /dev/null +++ b/SSL/src/Catalogs/ПредопределенныеВариантыОтчетов/ManagerModule.bsl @@ -0,0 +1,20 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +// Возвращает реквизиты справочника, которые образуют естественный ключ +// для элементов справочника. +// +// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих +// естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + + Результат = Новый Массив(); + + Результат.Добавить("Отчет"); + Результат.Добавить("КлючВарианта"); + + Возврат Результат; + +КонецФункции + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form index a164fbf10..0af23160a 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 31 Label true @@ -56,8 +56,8 @@ Объект.Code - КодРасширеннаяПодсказка - 33 + КодExtendedTooltip + 32 Label true true @@ -101,8 +101,8 @@ НомерТекущегоГодаПриИзменении - НомерТекущегоГодаРасширеннаяПодсказка - 35 + НомерТекущегоГодаExtendedTooltip + 33 Label true true @@ -152,7 +152,7 @@ Основные реквизиты - ГруппаОсновныеРеквизитыРасширеннаяПодсказка + ГруппаОсновныеРеквизитыExtendedTooltip 30 Label true @@ -186,8 +186,8 @@ None - КалендарьРасширеннаяПодсказка - 40 + КалендарьExtendedTooltip + 37 Label true true @@ -207,8 +207,8 @@ true - КалендарьКонтекстноеМенюИзменитьДеньРасширеннаяПодсказка - 38 + КалендарьКонтекстноеМенюИзменитьДеньExtendedTooltip + 35 Label true true @@ -233,8 +233,8 @@ true - КалендарьКонтекстноеМенюПеренестиДеньРасширеннаяПодсказка - 39 + КалендарьКонтекстноеМенюПеренестиДеньExtendedTooltip + 36 Label true true @@ -289,8 +289,8 @@ Top - ПредставлениеПереносовРасширеннаяПодсказка - 42 + ПредставлениеПереносовExtendedTooltip + 38 Label true true @@ -346,8 +346,8 @@ None - СписокПереносовПредставлениеРасширеннаяПодсказка - 54 + СписокПереносовПредставлениеExtendedTooltip + 40 Label true true @@ -380,10 +380,10 @@ СписокПереносовСтрокаПоиска - 45 + 46 СписокПереносовСтрокаПоискаРасширеннаяПодсказка - 47 + 48 Label true true @@ -393,7 +393,7 @@ СписокПереносовСтрокаПоискаКонтекстноеМеню - 46 + 47 true СписокПереносов @@ -403,10 +403,10 @@ СписокПереносовСостояниеПросмотра - 48 + 49 СписокПереносовСостояниеПросмотраРасширеннаяПодсказка - 50 + 51 Label true true @@ -416,7 +416,7 @@ СписокПереносовСостояниеПросмотраКонтекстноеМеню - 49 + 50 true ViewStatusAddition @@ -427,10 +427,10 @@ СписокПереносовУправлениеПоиском - 51 + 52 СписокПереносовУправлениеПоискомРасширеннаяПодсказка - 53 + 54 Label true true @@ -440,7 +440,7 @@ СписокПереносовУправлениеПоискомКонтекстноеМеню - 52 + 53 true SearchControlAddition @@ -450,8 +450,8 @@ - СписокПереносовРасширеннаяПодсказка - 44 + СписокПереносовExtendedTooltip + 39 Label true true @@ -504,8 +504,8 @@ Календарь - КалендарьГруппаРасширеннаяПодсказка - 37 + КалендарьГруппаExtendedTooltip + 34 Label true true @@ -534,7 +534,7 @@ true - ФормаИзменитьДеньРасширеннаяПодсказка + ФормаИзменитьДеньExtendedTooltip 26 Label true @@ -560,7 +560,7 @@ true - ФормаПеренестиВыходнойДеньРасширеннаяПодсказка + ФормаПеренестиВыходнойДеньExtendedTooltip 27 Label true @@ -586,7 +586,7 @@ true - ФормаЗаполнитьПоУмолчаниюРасширеннаяПодсказка + ФормаЗаполнитьПоУмолчаниюExtendedTooltip 28 Label true @@ -612,7 +612,7 @@ true - ФормаПечатьРасширеннаяПодсказка + ФормаПечатьExtendedTooltip 29 Label true diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html index 1b3dedaff..ced90fa3e 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

            Виды дней производственного календаря выделены разными цветами:

            • черным – рабочий день,
            • темно-красным – суббота, diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl index 2187859bc..3dd1592ba 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/Forms/ФормаЭлемента/Module.bsl @@ -21,11 +21,6 @@ &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульАвтономнаяРабота = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АвтономнаяРабота"); - МодульАвтономнаяРабота.ОбъектПриЧтенииНаСервере(ТекущийОбъект, ЭтаФорма.ТолькоПросмотр); - КонецЕсли; - ЗаполнитьДаннымиТекущегоГода(); КонецПроцедуры @@ -71,9 +66,10 @@ НСтр("ru = 'Записать измененные данные за %1 год?'"), Формат(НомерПредыдущегоГода, "ЧГ=0")); - Если Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда - ЗаписыватьДанныеГрафика = Истина; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("НомерТекущегоГодаПриИзмененииЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; ОбработатьИзменениеГода(ЗаписыватьДанныеГрафика); @@ -106,11 +102,8 @@ ВыделенныеДаты = Элементы.Календарь.ВыделенныеДаты; Если ВыделенныеДаты.Количество() > 0 И Год(ВыделенныеДаты[0]) = НомерТекущегоГода Тогда - ВыбранныйЭлемент = ВыбратьИзСписка(СписокВидовДня, , СписокВидовДня.НайтиПоЗначению(ВидыДней.Получить(ВыделенныеДаты[0]))); - Если ВыбранныйЭлемент <> Неопределено Тогда - ИзменитьВидыДней(ВыделенныеДаты, ВыбранныйЭлемент.Значение); - Элементы.Календарь.Обновить(); - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ИзменитьДеньЗавершение", ЭтотОбъект, ВыделенныеДаты); + ПоказатьВыборИзСписка(Оповещение, СписокВидовДня, , СписокВидовДня.НайтиПоЗначению(ВидыДней.Получить(ВыделенныеДаты[0]))); КонецЕсли; КонецПроцедуры @@ -133,11 +126,12 @@ ПараметрыВыбораДаты.Вставить("КонецПериодаОтображения", КонецГода(Календарь)); ПараметрыВыбораДаты.Вставить("Заголовок", НСтр("ru = 'Выбор даты переноса'")); ПараметрыВыбораДаты.Вставить("ПоясняющийТекст", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выберите дату, на которую будет осуществлен перенос дня %1 (%2)'"), + НСтр("ru = 'Выберите дату, на которую будет осуществлен + |перенос дня %1 (%2)'"), Формат(ДатаПереноса, "ДФ='д ММММ'"), ВидДня)); - ОткрытьФорму("ОбщаяФорма.ВыборДаты", ПараметрыВыбораДаты, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборДаты", ПараметрыВыбораДаты, ЭтотОбъект); КонецПроцедуры @@ -160,10 +154,10 @@ ПараметрКоманды = Новый Массив; ПараметрКоманды.Добавить(Объект.Ссылка); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеПечатьюКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент"); МодульУправлениеПечатьюКлиент.ВыполнитьКомандуПечати("Справочник.ПроизводственныеКалендари", "ПроизводственныйКалендарь", - ПараметрКоманды, ЭтаФорма, ПараметрыПечати); + ПараметрКоманды, ЭтотОбъект, ПараметрыПечати); КонецЕсли; КонецПроцедуры @@ -230,7 +224,7 @@ ВидыДней = Новый ФиксированноеСоответствие(ВидыДнейСоответствие); ПереносыДней = Новый ФиксированноеСоответствие(ПереносыДнейСоответствие); - ЗаполнитьПредставлениеПереносов(ЭтаФорма); + ЗаполнитьПредставлениеПереносов(ЭтотОбъект); Элементы.СписокПереносов.Видимость = СписокПереносов.Количество() > 0; @@ -292,7 +286,7 @@ // Устанавливает дням по всем датам массива определенный вид - ВидыДнейСоответствие = КалендарныеГрафикиКлиентСервер.СоответствиеПоФиксированномуСоответствию(ВидыДней); + ВидыДнейСоответствие = Новый Соответствие(ВидыДней); Для Каждого ВыбраннаяДата Из ДатыДней Цикл ВидыДнейСоответствие.Вставить(ВыбраннаяДата, ВидДня); @@ -312,12 +306,12 @@ // используем имеющуюся дату переноса // * если даты совпадают (день возвращен на "свое место") - удаляем такую запись - ВидыДнейСоответствие = КалендарныеГрафикиКлиентСервер.СоответствиеПоФиксированномуСоответствию(ВидыДней); + ВидыДнейСоответствие = Новый Соответствие(ВидыДней); ВидыДнейСоответствие.Вставить(ДатаНазначения, ВидыДней.Получить(ДатаПереноса)); ВидыДнейСоответствие.Вставить(ДатаПереноса, ВидыДней.Получить(ДатаНазначения)); - ПереносыДнейСоответствие = КалендарныеГрафикиКлиентСервер.СоответствиеПоФиксированномуСоответствию(ПереносыДней); + ПереносыДнейСоответствие = Новый Соответствие(ПереносыДней); ВписатьДатуПереноса(ПереносыДнейСоответствие, ДатаПереноса, ДатаНазначения); ВписатьДатуПереноса(ПереносыДнейСоответствие, ДатаНазначения, ДатаПереноса); @@ -325,7 +319,7 @@ ВидыДней = Новый ФиксированноеСоответствие(ВидыДнейСоответствие); ПереносыДней = Новый ФиксированноеСоответствие(ПереносыДнейСоответствие); - ЗаполнитьПредставлениеПереносов(ЭтаФорма); + ЗаполнитьПредставлениеПереносов(ЭтотОбъект); КонецПроцедуры @@ -410,3 +404,22 @@ Элементы.Календарь.КонецПериодаОтображения = Дата(НомерТекущегоГода, 12, 31); КонецПроцедуры + +&НаКлиенте +Процедура НомерТекущегоГодаПриИзмененииЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + ОбработатьИзменениеГода(Ответ = КодВозвратаДиалога.Да); + Модифицированность = Ложь; + Элементы.Календарь.Обновить(); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьДеньЗавершение(ВыбранныйЭлемент, ВыделенныеДаты) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + ИзменитьВидыДней(ВыделенныеДаты, ВыбранныйЭлемент.Значение); + Элементы.Календарь.Обновить(); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl index 026c272dc..2e5b8a029 100644 --- a/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПроизводственныеКалендари/ManagerModule.bsl @@ -341,10 +341,13 @@ // Обновляем данные графиков работы, // заполняемых автоматически на основании производственного календаря - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - КалендарныеГрафики.ЗапланироватьОбновлениеГрафиковРаботы(ТаблицаИзменений); - Иначе - Справочники.Календари.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(ТаблицаИзменений); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + МодульГрафикиРаботы.ЗапланироватьОбновлениеГрафиковРаботы(ТаблицаИзменений); + Иначе + МодульГрафикиРаботы.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(ТаблицаИзменений); + КонецЕсли; КонецЕсли; ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( @@ -521,7 +524,23 @@ Возврат УсловияОбновления; КонецФункции + +// Возвращает реквизиты справочника, которые образуют естественный ключ +// для элементов справочника. +// +// Возвращаемое значение: Массив(Строка) - массив имен реквизитов, образующих +// естественный ключ. +// +Функция ПоляЕстественногоКлюча() Экспорт + Результат = Новый Массив(); + + Результат.Добавить("Код"); + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Печатная форма производственного календаря @@ -539,8 +558,8 @@ // Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеПечатью"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, "ПроизводственныйКалендарь", НСтр("ru = 'Производственный календарь'"), diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index cc1954031..398943e74 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаВыбораГруппы/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -59,10 +59,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -72,7 +72,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -82,10 +82,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -95,7 +95,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -106,10 +106,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -119,7 +119,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -129,7 +129,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Form.form index 808b4a8e3..e4e26bd55 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаГруппы/Form.form @@ -16,7 +16,7 @@ Наименование группы (папки) - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 5 Label true @@ -65,8 +65,8 @@ Вышестоящая группа (папка), объединяющая группы (папки) для удобства поиска - РодительРасширеннаяПодсказка - 7 + РодительExtendedTooltip + 6 Label true true diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index d72f30b6a..f505e6338 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 16 + НаименованиеExtendedTooltip + 7 Label true true @@ -68,10 +68,10 @@ СписокСтрокаПоиска - 7 + 8 СписокСтрокаПоискаРасширеннаяПодсказка - 9 + 10 Label true true @@ -81,7 +81,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 8 + 9 true Список @@ -91,10 +91,10 @@ СписокСостояниеПросмотра - 10 + 11 СписокСостояниеПросмотраРасширеннаяПодсказка - 12 + 13 Label true true @@ -104,7 +104,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 11 + 12 true ViewStatusAddition @@ -115,10 +115,10 @@ СписокУправлениеПоиском - 13 + 14 СписокУправлениеПоискомРасширеннаяПодсказка - 15 + 16 Label true true @@ -128,7 +128,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 14 + 15 true SearchControlAddition @@ -138,7 +138,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 6 Label true @@ -158,7 +158,6 @@ true true true -
              true
              1 1 AutoUse diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html index 735665819..2e4d2bd01 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаСписка/Help/ru.html @@ -1,4 +1,4 @@ - +

              Назначение профилей групп доступа см. здесь.

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

               

              \ No newline at end of file diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca deleted file mode 100644 index 8d7309ed8..000000000 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/ConditionalAppearance.dcssca +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - ВидыДоступаВидДоступа - - - ВидыДоступаИспользование - - - - - Объект.ВидыДоступа.ИспользуетсяВПрограмме - Equal - false - - - Объект.ВидыДоступа.ВидДоступа - Filled - - - - - ЦветТекста - web:Gray - - - - diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form index 79c3c89a3..0560a16da 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 252 Label true @@ -52,8 +52,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 254 + РодительExtendedTooltip + 253 Label true true @@ -81,47 +81,6 @@ Normal - - Комментарий - 47 - true - true - - true - - - Объект.Комментарий - - - КомментарийРасширеннаяПодсказка - 256 - Label - true - true - - Left - - - - КомментарийКонтекстноеМеню - 48 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - Доступ 242 @@ -173,8 +132,8 @@ РолиПометкаПриИзменении - РолиПометкаРасширеннаяПодсказка - 275 + РолиПометкаExtendedTooltip + 263 Label true true @@ -204,8 +163,8 @@ Роли.Синоним - РолиСинонимРасширеннаяПодсказка - 277 + РолиСинонимExtendedTooltip + 264 Label true true @@ -248,8 +207,8 @@ Роли колонок - РолиКолонокРасширеннаяПодсказка - 274 + РолиКолонокExtendedTooltip + 262 Label true true @@ -277,8 +236,8 @@ false - РолиУстановитьФлажкиРасширеннаяПодсказка - 260 + РолиУстановитьФлажкиExtendedTooltip + 257 Label true true @@ -304,8 +263,8 @@ false - РолиСнятьФлажкиРасширеннаяПодсказка - 261 + РолиСнятьФлажкиExtendedTooltip + 258 Label true true @@ -331,8 +290,8 @@ false - РолиПоказатьТолькоВыбранныеРолиРасширеннаяПодсказка - 262 + РолиПоказатьТолькоВыбранныеРолиExtendedTooltip + 259 Label true true @@ -357,8 +316,8 @@ true - РолиПоказатьПодсистемыРолейРасширеннаяПодсказка - 263 + РолиПоказатьПодсистемыРолейExtendedTooltip + 260 Label true true @@ -378,10 +337,10 @@ РолиСтрокаПоиска - 265 + 303 РолиСтрокаПоискаРасширеннаяПодсказка - 267 + 305 Label true true @@ -391,7 +350,7 @@ РолиСтрокаПоискаКонтекстноеМеню - 266 + 304 true Роли @@ -401,10 +360,10 @@ РолиСостояниеПросмотра - 268 + 306 РолиСостояниеПросмотраРасширеннаяПодсказка - 270 + 308 Label true true @@ -414,7 +373,7 @@ РолиСостояниеПросмотраКонтекстноеМеню - 269 + 307 true ViewStatusAddition @@ -425,10 +384,10 @@ РолиУправлениеПоиском - 271 + 309 РолиУправлениеПоискомРасширеннаяПодсказка - 273 + 311 Label true true @@ -438,7 +397,7 @@ РолиУправлениеПоискомКонтекстноеМеню - 272 + 310 true SearchControlAddition @@ -448,8 +407,8 @@ - РолиРасширеннаяПодсказка - 264 + РолиExtendedTooltip + 261 Label true true @@ -500,8 +459,8 @@ 48 - ОтображениеРолейРасширеннаяПодсказка - 259 + ОтображениеРолейExtendedTooltip + 256 Label true true @@ -550,7 +509,7 @@ Find OutputList - ВидыДоступаВидДоступа + ВидыДоступаВидДоступаПредставление 27 true true @@ -558,15 +517,15 @@ true - Объект.ВидыДоступа.ВидДоступа + Объект.ВидыДоступа.ВидДоступаПредставление OnChange - ВидыДоступаВидДоступаПриИзменении + ВидыДоступаВидДоступаПредставлениеПриИзменении - ВидыДоступаВидДоступаРасширеннаяПодсказка - 309 + ВидыДоступаВидДоступаПредставлениеРасширеннаяПодсказка + 278 Label true true @@ -575,30 +534,26 @@ - ВидыДоступаВидДоступаКонтекстноеМеню + ВидыДоступаВидДоступаПредставлениеКонтекстноеМеню 28 true InputField + true Enter true Left true - AutoComplete - ВидыДоступаВидДоступаАвтоПодбор - - - StartChoice - ВидыДоступаВидДоступаНачалоВыбора - - - TextEditEnd - ВидыДоступаВидДоступаОкончаниеВводаТекста + ChoiceProcessing + ВидыДоступаВидДоступаПредставлениеОбработкаВыбора true true + true + true + true true true true @@ -606,7 +561,7 @@ - ВидыДоступаИспользование + ВидыДоступаВсеРазрешеныПредставление 187 true true @@ -614,15 +569,19 @@ true - Объект.ВидыДоступа.Использование + Объект.ВидыДоступа.ВсеРазрешеныПредставление ru Способ определения разрешенных значений доступа + + OnChange + ВидыДоступаВсеРазрешеныПредставлениеПриИзменении + - ВидыДоступаИспользованиеРасширеннаяПодсказка - 311 + ВидыДоступаВсеРазрешеныПредставлениеРасширеннаяПодсказка + 279 Label true true @@ -631,72 +590,31 @@ - ВидыДоступаИспользованиеКонтекстноеМеню + ВидыДоступаВсеРазрешеныПредставлениеКонтекстноеМеню 188 true InputField - Auto + true + Enter true true Left true - - StartChoice - ВидыДоступаИспользованиеНачалоВыбора - - - Clearing - ВидыДоступаИспользованиеОчистка - ChoiceProcessing - ВидыДоступаИспользованиеОбработкаВыбора + ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора - 40 true true true - true - true + true + true + true + true true - - - ru - Все запрещены, исключения назначаются в группах доступа - - - ВначалеВсеЗапрещены - - - - - ru - Все разрешены, исключения назначаются в группах доступа - - - ВначалеВсеРазрешены - - - - - ru - Все запрещены, исключения назначаются в профиле - - - ВсеЗапрещены - - - - - ru - Все разрешены, исключения назначаются в профиле - - - ВсеРазрешены - - + true Normal @@ -713,8 +631,8 @@ false - ВидыДоступаДобавитьРасширеннаяПодсказка - 293 + ВидыДоступаДобавитьExtendedTooltip + 271 Label true true @@ -740,8 +658,8 @@ false - ВидыДоступаУдалитьРасширеннаяПодсказка - 294 + ВидыДоступаУдалитьExtendedTooltip + 272 Label true true @@ -767,8 +685,8 @@ false - ВидыДоступаПереместитьВверхРасширеннаяПодсказка - 295 + ВидыДоступаПереместитьВверхExtendedTooltip + 273 Label true true @@ -794,8 +712,8 @@ false - ВидыДоступаПереместитьВнизРасширеннаяПодсказка - 296 + ВидыДоступаПереместитьВнизExtendedTooltip + 274 Label true true @@ -821,8 +739,8 @@ false - ВидыДоступаСортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 297 + ВидыДоступаСортироватьСписокПоВозрастаниюExtendedTooltip + 275 Label true true @@ -849,8 +767,8 @@ false - ВидыДоступаСортироватьСписокПоУбываниюРасширеннаяПодсказка - 298 + ВидыДоступаСортироватьСписокПоУбываниюExtendedTooltip + 276 Label true true @@ -869,6 +787,10 @@ Left + + OnEditEnd + ВидыДоступаПриОкончанииРедактирования + BeforeAddRow ВидыДоступаПередНачаломДобавления @@ -891,10 +813,10 @@ ВидыДоступаСтрокаПоиска - 300 + 322 ВидыДоступаСтрокаПоискаРасширеннаяПодсказка - 302 + 324 Label true true @@ -904,7 +826,7 @@ ВидыДоступаСтрокаПоискаКонтекстноеМеню - 301 + 323 true ВидыДоступа @@ -914,10 +836,10 @@ ВидыДоступаСостояниеПросмотра - 303 + 325 ВидыДоступаСостояниеПросмотраРасширеннаяПодсказка - 305 + 327 Label true true @@ -927,7 +849,7 @@ ВидыДоступаСостояниеПросмотраКонтекстноеМеню - 304 + 326 true ViewStatusAddition @@ -938,10 +860,10 @@ ВидыДоступаУправлениеПоиском - 306 + 328 ВидыДоступаУправлениеПоискомРасширеннаяПодсказка - 308 + 330 Label true true @@ -951,7 +873,7 @@ ВидыДоступаУправлениеПоискомКонтекстноеМеню - 307 + 329 true SearchControlAddition @@ -961,8 +883,8 @@ - ВидыДоступаРасширеннаяПодсказка - 299 + ВидыДоступаExtendedTooltip + 277 Label true true @@ -983,8 +905,8 @@ false - КонтекстноеМенюВидыДоступаДобавитьРасширеннаяПодсказка - 288 + КонтекстноеМенюВидыДоступаДобавитьExtendedTooltip + 266 Label true true @@ -1010,8 +932,8 @@ false - КонтекстноеМенюВидыДоступаУдалитьРасширеннаяПодсказка - 289 + КонтекстноеМенюВидыДоступаУдалитьExtendedTooltip + 267 Label true true @@ -1037,8 +959,8 @@ false - КонтекстноеМенюВидыДоступаПереместитьВверхРасширеннаяПодсказка - 290 + КонтекстноеМенюВидыДоступаПереместитьВверхExtendedTooltip + 268 Label true true @@ -1064,8 +986,8 @@ false - КонтекстноеМенюВидыДоступаПереместитьВнизРасширеннаяПодсказка - 291 + КонтекстноеМенюВидыДоступаПереместитьВнизExtendedTooltip + 269 Label true true @@ -1091,8 +1013,8 @@ false - КонтекстноеМенюВидыДоступаВыделитьВсеРасширеннаяПодсказка - 292 + КонтекстноеМенюВидыДоступаВыделитьВсеExtendedTooltip + 270 Label true true @@ -1152,8 +1074,8 @@ None Ctrl+S - НадписьВидДоступаРасширеннаяПодсказка - 322 + НадписьВидДоступаExtendedTooltip + 281 Label true true @@ -1183,58 +1105,20 @@ - - ВидДоступаНеИспользуется - 245 - - ТекстВидДоступаНеИспользуется - 246 - - <key>ru</key> - <value>В данный момент не используется, т.к. эта возможность отключена в программе.</value> - - true - true - - true - - - ТекстВидДоступаНеИспользуетсяРасширеннаяПодсказка - 325 - Label - true - true - - Left - - - - ТекстВидДоступаНеИспользуетсяКонтекстноеМеню - 247 - true - - Label - true - true - - Left - - + + ТекстВидДоступаНеИспользуется + 246 + + <key>ru</key> + <value>В данный момент не используется, т.к. эта возможность отключена в программе.</value> + true true - - <key>ru</key> - <value>Вид доступа не используется</value> - - - ru - Вид доступа не используется - - ВидДоступаНеИспользуетсяРасширеннаяПодсказка - 324 + ТекстВидДоступаНеИспользуетсяExtendedTooltip + 283 Label true true @@ -1242,14 +1126,16 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + ТекстВидДоступаНеИспользуетсяКонтекстноеМеню + 247 + true + + Label + true + true + + Left @@ -1274,7 +1160,7 @@ EndEdit OutputList - НомерСтрокиПоВиду + ЗначенияДоступаНомерСтрокиПоВиду 236 true true @@ -1285,8 +1171,8 @@ Объект.ЗначенияДоступа.НомерСтрокиПоВиду - НомерСтрокиПоВидуРасширеннаяПодсказка - 346 + ЗначенияДоступаНомерСтрокиПоВидуРасширеннаяПодсказка + 295 Label true true @@ -1295,7 +1181,7 @@ - НомерСтрокиПоВидуКонтекстноеМеню + ЗначенияДоступаНомерСтрокиПоВидуКонтекстноеМеню 237 true @@ -1312,7 +1198,7 @@ - ЗначениеДоступа + ЗначенияДоступаЗначениеДоступа 240 true true @@ -1323,8 +1209,8 @@ Объект.ЗначенияДоступа.ЗначениеДоступа - ЗначениеДоступаРасширеннаяПодсказка - 348 + ЗначенияДоступаЗначениеДоступаРасширеннаяПодсказка + 296 Label true true @@ -1333,7 +1219,7 @@ - ЗначениеДоступаКонтекстноеМеню + ЗначенияДоступаЗначениеДоступаКонтекстноеМеню 241 true @@ -1384,8 +1270,8 @@ false - ЗначенияДоступаДобавитьРасширеннаяПодсказка - 330 + ЗначенияДоступаДобавитьExtendedTooltip + 288 Label true true @@ -1411,8 +1297,8 @@ false - ЗначенияДоступаУдалитьРасширеннаяПодсказка - 331 + ЗначенияДоступаУдалитьExtendedTooltip + 289 Label true true @@ -1438,8 +1324,8 @@ false - ЗначенияДоступаПереместитьВверхРасширеннаяПодсказка - 332 + ЗначенияДоступаПереместитьВверхExtendedTooltip + 290 Label true true @@ -1465,8 +1351,8 @@ false - ЗначенияДоступаПереместитьВнизРасширеннаяПодсказка - 333 + ЗначенияДоступаПереместитьВнизExtendedTooltip + 291 Label true true @@ -1492,8 +1378,8 @@ false - СортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 334 + СортироватьСписокПоВозрастаниюExtendedTooltip + 292 Label true true @@ -1520,8 +1406,8 @@ false - СортироватьСписокПоУбываниюРасширеннаяПодсказка - 335 + СортироватьСписокПоУбываниюExtendedTooltip + 293 Label true true @@ -1554,10 +1440,10 @@ ЗначенияДоступаСтрокаПоиска - 337 + 342 ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка - 339 + 344 Label true true @@ -1567,7 +1453,7 @@ ЗначенияДоступаСтрокаПоискаКонтекстноеМеню - 338 + 343 true ЗначенияДоступа @@ -1577,10 +1463,10 @@ ЗначенияДоступаСостояниеПросмотра - 340 + 345 ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка - 342 + 347 Label true true @@ -1590,7 +1476,7 @@ ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню - 341 + 346 true ViewStatusAddition @@ -1601,10 +1487,10 @@ ЗначенияДоступаУправлениеПоиском - 343 + 348 ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка - 345 + 350 Label true true @@ -1614,7 +1500,7 @@ ЗначенияДоступаУправлениеПоискомКонтекстноеМеню - 344 + 349 true SearchControlAddition @@ -1624,8 +1510,8 @@ - ЗначенияДоступаРасширеннаяПодсказка - 336 + ЗначенияДоступаExtendedTooltip + 294 Label true true @@ -1646,8 +1532,8 @@ false - КонтекстноеМенюЗначенияДоступаДобавитьРасширеннаяПодсказка - 328 + КонтекстноеМенюЗначенияДоступаДобавитьExtendedTooltip + 286 Label true true @@ -1673,8 +1559,8 @@ false - КонтекстноеМенюЗначенияДоступаУдалитьРасширеннаяПодсказка - 329 + КонтекстноеМенюЗначенияДоступаУдалитьExtendedTooltip + 287 Label true true @@ -1728,8 +1614,8 @@ 8 - ПредустановленныйВидДоступаРасширеннаяПодсказка - 327 + ПредустановленныйВидДоступаExtendedTooltip + 285 Label true true @@ -1742,68 +1628,6 @@ Vertical - - ВидДоступаЧерезПраваПоЗначениямДоступа - 163 - - ТекстИнформации - 167 - - <key>ru</key> - <value>Для настройки используется команда "Права доступа" в форме значения. - </value> - - true - true - - true - - - ТекстИнформацииРасширеннаяПодсказка - 359 - Label - true - true - - Left - - - - ТекстИнформацииКонтекстноеМеню - 168 - true - - Label - true - true - false - - Left - Center - - - true - true - - true - - - <key>ru</key> - <value>Вид доступа через права по значениям доступа</value> - - - ВидДоступаЧерезПраваПоЗначениямДоступаРасширеннаяПодсказка - 358 - Label - true - true - - Left - - - Page - - ОбычныйВидДоступа 182 @@ -1821,8 +1645,8 @@ true - ТекстИнформацииОбычногоВидаДоступаРасширеннаяПодсказка - 361 + ТекстИнформацииОбычногоВидаДоступаExtendedTooltip + 300 Label true true @@ -1854,8 +1678,8 @@ Обычный вид доступа - ОбычныйВидДоступаРасширеннаяПодсказка - 360 + ОбычныйВидДоступаExtendedTooltip + 299 Label true true @@ -1880,8 +1704,8 @@ Типы видов доступа - ТипыВидовДоступаРасширеннаяПодсказка - 326 + ТипыВидовДоступаExtendedTooltip + 284 Label true true @@ -1908,8 +1732,8 @@ Значения доступа по виду доступа - ЗначенияДоступаПоВидуДоступаРасширеннаяПодсказка - 321 + ЗначенияДоступаПоВидуДоступаExtendedTooltip + 280 Label true true @@ -1937,8 +1761,8 @@ Ограничения доступа - ВидыИЗначенияДоступаРасширеннаяПодсказка - 287 + ВидыИЗначенияДоступаExtendedTooltip + 265 Label true true @@ -1966,8 +1790,8 @@ Доступ - ДоступРасширеннаяПодсказка - 258 + ДоступExtendedTooltip + 255 Label true true @@ -1981,6 +1805,52 @@ Auto + + Комментарий + 47 + true + true + + true + + + Объект.Комментарий + + + КомментарийExtendedTooltip + 254 + Label + true + true + + Left + + + + КомментарийКонтекстноеМеню + 48 + true + + InputField + Enter + true + Left + true + + + StartChoice + КомментарийНачалоВыбора + + true + true + true + true + true + true + true + Normal + + ФормаКоманднаяПанель -1 @@ -1994,7 +1864,7 @@ false - ВосстановитьПоНачальномуЗаполнениюРасширеннаяПодсказка + ВосстановитьПоНачальномуЗаполнениюExtendedTooltip 249 Label true @@ -2021,7 +1891,7 @@ true - ОписаниеПоставляемогоПрофиляРасширеннаяПодсказка + ОписаниеПоставляемогоПрофиляExtendedTooltip 250 Label true @@ -2047,7 +1917,7 @@ true - ПоказыватьНеиспользуемыеВидыДоступаРасширеннаяПодсказка + ПоказыватьНеиспользуемыеВидыДоступаExtendedTooltip 251 Label true @@ -2112,29 +1982,12 @@ Объект.ВидыДоступа - ТекущийТипЗначенияДоступа + ВидДоступаПредставление <key>ru</key> - <value>Текущий тип значения доступа</value> + <value>Вид доступа</value> 1 - - AnyRef - - - true - - - true - - - - Использование - - <key>ru</key> - <value>Значения доступа</value> - - 3 String @@ -2147,14 +2000,15 @@ - ИспользуетсяВПрограмме + ВсеРазрешеныПредставление <key>ru</key> - <value>Используется в программе</value> + <value>Значения доступа</value> 2 - Boolean + String + true @@ -2196,26 +2050,6 @@ - - ВидыДоступаИспользуемыеВсегда - - <key>ru</key> - <value>Виды доступа используемые всегда</value> - - 4 - - ValueList - - - true - - - true - - - - - НадписьВидДоступа @@ -2235,251 +2069,6 @@ </edit> <functionalOptions>FunctionalOption.ОграничиватьДоступНаУровнеЗаписей</functionalOptions> </attributes> - <attributes> - <name>ВидыДоступаЧерезПраваПоЗначениямДоступа</name> - <title> - <key>ru</key> - <value>Виды доступа через права по значениям доступа</value> - - 9 - - ValueList - - - true - - - true - - - - - - - ТекущийВидДоступа - - <key>ru</key> - <value>Текущий вид доступа</value> - - 10 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - ТекущийТипЗначенияДоступа - - <key>ru</key> - <value>Текущий тип значения доступа</value> - - 11 - - AnyRef - - - true - - - true - - - - ВидДоступаПользователи - - <key>ru</key> - <value>Вид доступа пользователи</value> - - 12 - - ChartOfCharacteristicTypesRef - - - true - - - true - - - - ВидДоступаВнешниеПользователи - - <key>ru</key> - <value>Вид доступа внешние пользователи</value> - - 13 - - ChartOfCharacteristicTypesRef - - - true - - - true - - - - ТекущиеТипыЗначенийДоступа - - <key>ru</key> - <value>Текущие типы значений доступа</value> - - 15 - - ValueList - - - true - - - true - - - - - - - ПользовательПустаяСсылка - - <key>ru</key> - <value>Пользователь пустая ссылка</value> - - 16 - - CatalogRef.Пользователи - - - true - - - true - - - - ГруппаПользователейПустаяСсылка - - <key>ru</key> - <value>Группа пользователей пустая ссылка</value> - - 17 - - CatalogRef.ГруппыПользователей - - - true - - - true - - - - ВнешнийПользовательПустаяСсылка - - <key>ru</key> - <value>Внешний пользователь пустая ссылка</value> - - 18 - - CatalogRef.ВнешниеПользователи - - - true - - - true - - - - ГруппаВнешнихПользователейПустаяСсылка - - <key>ru</key> - <value>Группа внешних пользователей пустая ссылка</value> - - 19 - - CatalogRef.ГруппыВнешнихПользователей - - - true - - - true - - - - ТипыЗначенийДоступаВидовДоступа - - <key>ru</key> - <value>Типы значений доступа видов доступа</value> - - 20 - - ValueTable - - - true - - - true - - - ВидДоступа - - <key>ru</key> - <value>Вид доступа</value> - - 1 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - ТипЗначенияДоступа - - <key>ru</key> - <value>Тип значения доступа</value> - - 2 - - AnyRef - - - true - - - true - - - - ПредставлениеТипа - - <key>ru</key> - <value>Представление типа</value> - - 3 - - String - - - - true - - - true - - - ТребуетсяОбновитьГруппыДоступаПрофиля @@ -2644,10 +2233,10 @@ </settingsSavedData> </attributes> <attributes> - <name>ТребуетсяПроверитьЗаполнение</name> + <name>ТребуетсяПроверитьЗаполнениеПрофиля</name> <title> <key>ru</key> - <value>Требуется проверить заполнение</value> + <value>Требуется проверить заполнение профиля</value> 8 @@ -2695,6 +2284,23 @@ + + ВыполненаПроцедураПриСозданииНаСервере + + <key>ru</key> + <value>Выполнена процедура при создании на сервере</value> + + 4 + + Boolean + + + true + + + true + + ВосстановитьПоНачальномуЗаполнению diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl index 236c462ef..49f10f01f 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Forms/ФормаЭлемента/Module.bsl @@ -8,60 +8,11 @@ Возврат; КонецЕсли; - Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда - ОбработатьИнтерфейсРолей("ЗаполнитьРоли", Объект.Роли); - ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", Ложь); - КонецЕсли; + ОбработатьИнтерфейсРолей("ЗаполнитьРоли", Объект.Роли); + ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", ЗначениеЗаполнено(Объект.Ссылка)); // Подготовка вспомогательных данных. - - // Заполнение списка всегда используемых видов доступа (для исключения при выборе). - Отбор = Новый Структура("ВидДоступаИспользуетсяВсегда", Истина); - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа().НайтиСтроки(Отбор) Цикл - ВидыДоступаИспользуемыеВсегда.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЦикла; - - // Заполнение списка видов доступа через права по значениям доступа. - Отбор = Новый Структура("ВидДоступаЧерезПраваПоЗначениямДоступа", Истина); - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа().НайтиСтроки(Отбор) Цикл - - ВидДоступаПредставлениеОбъекта = Неопределено; - Если СвойстваВидаДоступа.Таблицы.Количество() = 1 Тогда - МетаданныеОбъект = Метаданные.НайтиПоПолномуИмени(СвойстваВидаДоступа.Таблицы[0]); - ВидДоступаПредставлениеОбъекта = МетаданныеОбъект.ПредставлениеОбъекта; - КонецЕсли; - - ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа, ВидДоступаПредставлениеОбъекта); - КонецЦикла; - - // Заполнение типов значений доступа всех видов доступа. - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл - Для каждого Тип Из СвойстваВидаДоступа.ВидДоступа.ТипЗначения.Типы() Цикл - МассивТипов = Новый Массив; - МассивТипов.Добавить(Тип); - ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); - - МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); - Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда - ПредставлениеТипа = МетаданныеТипа.Представление(); - Иначе - ПредставлениеТипа = ?( - ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), - МетаданныеТипа.ПредставлениеОбъекта, - МетаданныеТипа.Представление()); - КонецЕсли; - - НоваяСтрока = ТипыЗначенийДоступаВидовДоступа.Добавить(); - НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.ВидДоступа; - НоваяСтрока.ТипЗначенияДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); - НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; - КонецЦикла; - КонецЦикла; - - ВидДоступаПользователи = ПланыВидовХарактеристик.ВидыДоступа.Пользователи; - ВидДоступаВнешниеПользователи = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи; - - ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений(ЭтотОбъект, Истина); // Установка постоянной доступности свойств. @@ -70,16 +21,14 @@ Элементы.ВидыИЗначенияДоступа.Видимость = Ложь; КонецЕсли; - Если Объект.Ссылка.Пустая() Тогда - // Не было вызова ПриЧтенииНаСервере, требуется сделать вызов ПриСозданииНаСервере. - УстановитьДоступностьОписанияИВосстановленияПоставляемогоПрофиля(); - КонецЕсли; - // Определение возможности редактирования элементов формы (перезапись доступна). - БезРедактированияПоставляемыхЗначений = - ТолькоПросмотр - ИЛИ НЕ Объект.Ссылка.Пустая() - И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект); + БезРедактированияПоставляемыхЗначений = ТолькоПросмотр + ИЛИ НЕ Объект.Ссылка.Пустая() И Справочники.ПрофилиГруппДоступа.ЗапретИзмененияПрофиля(Объект); + + Если Объект.Ссылка = Справочники.ПрофилиГруппДоступа.Администратор + И Не Пользователи.ЭтоПолноправныйПользователь(,ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный) Тогда + ТолькоПросмотр = Истина; + КонецЕсли; Элементы.Наименование.ТолькоПросмотр = БезРедактированияПоставляемыхЗначений; @@ -88,18 +37,11 @@ Элементы.ВидыДоступаДобавить.Доступность = НЕ БезРедактированияПоставляемыхЗначений; Элементы.КонтекстноеМенюВидыДоступаДобавить.Доступность = НЕ БезРедактированияПоставляемыхЗначений; - ОбработатьИнтерфейсРолей( - "УстановитьТолькоПросмотрРолей", - БезРедактированияПоставляемыхЗначений); + ОбработатьИнтерфейсРолей("УстановитьТолькоПросмотрРолей", БезРедактированияПоставляемыхЗначений); - // При создании копированием. - Если Объект.ВидыДоступа.Количество() > 0 - И НЕ ЗначениеЗаполнено(Объект.ВидыДоступа[0].Использование) Тогда - - ЗаполнитьСвойстваВидовДоступаВФорме(); - КонецЕсли; + УстановитьДоступностьОписанияИВосстановленияПоставляемогоПрофиля(); - ОбновитьНеиспользуемыеВидыДоступа(Истина); + ВыполненаПроцедураПриСозданииНаСервере = Истина; КонецПроцедуры @@ -110,44 +52,42 @@ Возврат; КонецЕсли; + Если НЕ ВыполненаПроцедураПриСозданииНаСервере Тогда + Возврат; + КонецЕсли; + ОбработатьИнтерфейсРолей("ЗаполнитьРоли", Объект.Роли); ОбработатьИнтерфейсРолей("НастроитьИнтерфейсРолейПриСозданииФормы", Истина); + УправлениеДоступомСлужебный.ПриПовторномЧтенииНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, ТекущийОбъект); + ОбновитьГруппыДоступаПрофиля = Ложь; УстановитьДоступностьОписанияИВосстановленияПоставляемогоПрофиля(ТекущийОбъект); - ЗаполнитьСвойстваВидовДоступаВФорме(); - КонецПроцедуры &НаКлиенте Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) - ТребуетсяПроверитьЗаполнение = Истина; + ТребуетсяПроверитьЗаполнениеПрофиля = НЕ ПараметрыЗаписи.Свойство( + "ОтветПоОбновлениюГруппДоступаПрофиляПолучен"); Если ЗначениеЗаполнено(Объект.Ссылка) - И ТребуетсяОбновитьГруппыДоступаПрофиля Тогда + И ТребуетсяОбновитьГруппыДоступаПрофиля + И НЕ ПараметрыЗаписи.Свойство("ОтветПоОбновлениюГруппДоступаПрофиляПолучен") Тогда + Отказ = Истина; Если ПроверитьЗаполнение() Тогда - ТребуетсяПроверитьЗаполнение = Ложь; - - КодОтвета = Вопрос( + ПоказатьВопрос( + Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект, ПараметрыЗаписи), ТекстВопросаОбновитьГруппыДоступаПрофиля(), РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); - - Если КодОтвета = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - Возврат; - - ИначеЕсли КодОтвета = КодВозвратаДиалога.Да Тогда - ПараметрыЗаписи.Вставить("ОбновитьГруппыДоступаПрофиля"); - КонецЕсли; - Иначе - Отказ = Истина; КонецЕсли; + Возврат; КонецЕсли; КонецПроцедуры @@ -166,6 +106,9 @@ ТекущийОбъект.ДополнительныеСвойства.Вставить("ОбновитьГруппыДоступаПрофиля"); КонецЕсли; + УправлениеДоступомСлужебный.ПередЗаписьюНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, ТекущийОбъект); + КонецПроцедуры &НаСервере @@ -179,7 +122,8 @@ ТекущийОбъект.ДополнительныеСвойства.ПерсональныеГруппыДоступаСОбновленнымНаименованием); КонецЕсли; - ЗаполнитьСвойстваВидовДоступаВФорме(); + УправлениеДоступомСлужебный.ПослеЗаписиНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, ТекущийОбъект, ПараметрыЗаписи); УстановитьДоступностьОписанияИВосстановленияПоставляемогоПрофиля(ТекущийОбъект); @@ -206,7 +150,7 @@ &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - Если НЕ ТребуетсяПроверитьЗаполнение Тогда + Если НЕ ТребуетсяПроверитьЗаполнениеПрофиля Тогда ПроверяемыеРеквизиты.Очистить(); Возврат; КонецЕсли; @@ -233,89 +177,9 @@ КонецЕсли; КонецЦикла; - // Проверка незаполненных и повторяющихся видов доступа. - ПроверенныеРеквизитыОбъекта.Добавить("ВидыДоступа.ВидДоступа"); - - Для каждого Строка Из Объект.ВидыДоступа Цикл - - // Проверка заполнения вида доступа. - Если НЕ ЗначениеЗаполнено(Строка.ВидДоступа) Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ВидыДоступа[%1].ВидДоступа", - НСтр("ru = 'Вид доступа не выбран.'"), - "ВидыДоступа", - Объект.ВидыДоступа.Индекс(Строка), - НСтр("ru = 'Вид доступа в строке %1 не выбран.'")); - КонецЕсли; - - // Проверка наличия повторяющихся видов доступа. - НайденныеВидыДоступа = Объект.ВидыДоступа.НайтиСтроки( - Новый Структура("ВидДоступа", Строка.ВидДоступа)); - - Если НайденныеВидыДоступа.Количество() > 1 Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ВидыДоступа[%1].ВидДоступа", - НСтр("ru = 'Вид доступа повторяется.'"), - "ВидыДоступа", - Объект.ВидыДоступа.Индекс(Строка), - НСтр("ru = 'Вид доступа в строке %1 повторяется.'")); - КонецЕсли; - КонецЦикла; - - // Проверка незаполненных и повторяющихся значений доступа. - ПроверенныеРеквизитыОбъекта.Добавить("ЗначенияДоступа.ВидДоступа"); - ПроверенныеРеквизитыОбъекта.Добавить("ЗначенияДоступа.ЗначениеДоступа"); - - НомерСтрокиВидаДоступа = Объект.ВидыДоступа.Количество()-1; - - Пока НЕ Отказ И НомерСтрокиВидаДоступа >= 0 Цикл - ТекущаяСтрокаВидаДоступа = Объект.ВидыДоступа.Получить(НомерСтрокиВидаДоступа); - - ЗначенияДоступаВидаДоступа = Объект.ЗначенияДоступа.НайтиСтроки( - Новый Структура("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа)); - НомерСтроки = ЗначенияДоступаВидаДоступа.Количество()-1; - - Пока НомерСтроки >= 0 Цикл - - ТекущаяСтрока = ЗначенияДоступаВидаДоступа.Получить(НомерСтроки); - - // Проверка заполнения значения. - Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ЗначениеДоступа) Тогда - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение не выбрано.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 не выбрано.'")); - Отказ = Истина; - Прервать; - КонецЕсли; - - // Проверка наличия повторяющихся значений. - Отбор = Новый Структура; - Отбор.Вставить("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа); - Отбор.Вставить("ЗначениеДоступа", ТекущаяСтрока.ЗначениеДоступа); - - НайденныеЗначения = Объект.ЗначенияДоступа.НайтиСтроки(Отбор); - - Если НайденныеЗначения.Количество() > 1 Тогда - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение повторяется.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 повторяется.'")); - Отказ = Истина; - Прервать; - КонецЕсли; - - НомерСтроки = НомерСтроки - 1; - КонецЦикла; - - НомерСтрокиВидаДоступа = НомерСтрокиВидаДоступа - 1; - КонецЦикла; + // Проверка незаполненных и повторяющихся видов и значений доступа. + УправлениеДоступомСлужебныйКлиентСервер.ОбработкаПроверкиЗаполненияНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, Отказ, ПроверенныеРеквизитыОбъекта, Ошибки); ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); @@ -351,146 +215,78 @@ &НаКлиенте Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриАктивизацииСтроки( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ВидыДоступаПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - Если Копирование Тогда - Отказ = Истина; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПередНачаломДобавления( + ЭтотОбъект, Элемент, Отказ, Копирование, Родитель, Группа); КонецПроцедуры &НаКлиенте Процедура ВидыДоступаПередУдалением(Элемент, Отказ) - ТекущийВидДоступа = Неопределено; + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПередУдалением( + ЭтотОбъект, Элемент, Отказ); КонецПроцедуры &НаКлиенте Процедура ВидыДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - Если НЕ ЗначениеЗаполнено(Элементы.ВидыДоступа.ТекущиеДанные.Использование) Тогда - Элементы.ВидыДоступа.ТекущиеДанные.Предустановленный = Ложь; - Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен = Ложь; - Элементы.ВидыДоступа.ТекущиеДанные.Использование = - Элементы.ВидыДоступаИспользование.СписокВыбора.НайтиПоЗначению( - "ВначалеВсеЗапрещены").Представление; - КонецЕсли; - - Если Не ЗначениеЗаполнено(Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) Тогда - Элементы.ВидыДоступа.ТекущиеДанные.ИспользуетсяВПрограмме = Истина; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); КонецПроцедуры +&НаКлиенте +Процедура ВидыДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий элемента ВидДоступаПредставление таблицы формы ВидыДоступа &НаКлиенте -Процедура ВидыДоступаВидДоступаПриИзменении(Элемент) +Процедура ВидыДоступаВидДоступаПредставлениеПриИзменении(Элемент) - Если ВидыДоступаИспользуемыеВсегда.НайтиПоЗначению( - Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) <> Неопределено Тогда + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВидДоступаПредставлениеПриИзменении( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаВидДоступаПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВидДоступаПредставлениеОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вид доступа ""%1"" не требуется выбирать. - |По нему ограничение всегда выполняется.'"), - Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа)); - - Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа = Неопределено; - КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий элемента ВсеРазрешеныПредставление таблицы формы ВидыДоступа + +&НаКлиенте +Процедура ВидыДоступаВсеРазрешеныПредставлениеПриИзменении(Элемент) - ЗаполнитьСвойстваВидовДоступаВФорме(); - - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеПриИзменении( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте -Процедура ВидыДоступаВидДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) +Процедура ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - ПараметрыВыбора = Новый Массив; - - Если Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка Тогда - ПараметрыВыбора.Добавить(Новый ПараметрВыбора("ПоказыватьНеиспользуемыеВидыДоступа", Истина)); - КонецЕсли; - - Элемент.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбора); - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаВидДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - ДанныеВыбора = СформироватьДанныеВыбораВидаДоступа( - Текст, Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка); - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаВидДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - ДанныеВыбора = СформироватьДанныеВыбораВидаДоступа( - Текст, Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка); - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - ДанныеВыбора = Элемент.СписокВыбора; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Если ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа) <> Неопределено - И - ВыбранноеЗначение = "ВсеРазрешены" Тогда - - Предупреждение( - НСтр("ru = 'Для вида доступа через права по значениям доступа - |вариант ""Все разрешены, исключения задаются в профиле"" - |не имеет смысла - вместо этого следует удалить вид доступа.'")); - - Если ВыбранноеЗначение = "ВсеРазрешены" Тогда - ВыбранноеЗначение = "ВсеЗапрещены"; - Иначе - ВыбранноеЗначение = "ВначалеВсеЗапрещены"; - КонецЕсли; - - КонецЕсли; - - Элементы.ВидыДоступа.ТекущиеДанные.Предустановленный = - ВыбранноеЗначение = "ВсеРазрешены" - ИЛИ ВыбранноеЗначение = "ВсеЗапрещены"; - - Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен = - ВыбранноеЗначение = "ВначалеВсеРазрешены" - ИЛИ ВыбранноеЗначение = "ВсеРазрешены"; - - Модифицированность = Истина; - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); КонецПроцедуры @@ -500,171 +296,65 @@ &НаКлиенте Процедура ЗначенияДоступаПриИзменении(Элемент) - Если Элемент.ТекущиеДанные <> Неопределено - И НЕ ЗначениеЗаполнено(Элемент.ТекущиеДанные.ВидДоступа) Тогда - - Элемент.ТекущиеДанные.ВидДоступа = ТекущийВидДоступа; - - Отбор = Новый Структура("ВидДоступа", ТекущийВидДоступа); - Элемент.ТекущиеДанные.НомерСтрокиПоВиду = Объект.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - КонецЕсли; - - ОбновитьНомерСтрокиПоВиду(ЭтаФорма, Элементы.ВидыДоступа.ТекущиеДанные); - ОбновитьПредставлениеИспользованияВидаДоступа(ЭтаФорма, Элементы.ВидыДоступа.ТекущиеДанные); + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриИзменении( + ЭтотОбъект, Элемент); КонецПроцедуры &НаКлиенте Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда - Элемент.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - Если НЕ ВыбранТипЗначенияДоступа(ТекущиеТипыЗначенийДоступа) Тогда - СтандартнаяОбработка = Ложь; - Возврат; - КонецЕсли; - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) - И ТекущиеДанные.ЗначениеДоступа <> ТекущийТипЗначенияДоступа Тогда - - ТекущиеДанные.ЗначениеДоступа = ТекущийТипЗначенияДоступа; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - - Если ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка ИЛИ - ТекущийТипЗначенияДоступа = ГруппаПользователейПустаяСсылка Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка ИЛИ - ТекущийТипЗначенияДоступа = ГруппаВнешнихПользователейПустаяСсылка Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); КонецПроцедуры &НаКлиенте Процедура ЗначенияДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) - Если ОтменаРедактирования Тогда - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаНачалоВыбора( + ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - ТекущийТипЗначенияДоступа = Неопределено; - - Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - Элементы.ЗначениеДоступа.КнопкаОчистки = Ложь; + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОчистка( + ЭтотОбъект, Элемент, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи - ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = ВидДоступаВнешниеПользователи, - ТекущийВидДоступа <> ВидДоступаПользователи); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаАвтоПодбор( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи - ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = ВидДоступаВнешниеПользователи, - ТекущийВидДоступа <> ВидДоступаПользователи); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОкончаниеВводаТекста( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка); КонецПроцедуры @@ -693,35 +383,10 @@ РазблокироватьДанныеФормыДляРедактирования(); КонецЕсли; - Ответ = Вопрос( + ПоказатьВопрос( + Новый ОписаниеОповещения("ВосстановитьПоНачальномуЗаполнениюПродолжение", ЭтотОбъект), НСтр("ru = 'Восстановить профиль по содержимому начального заполнения?'"), РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Да Тогда - - КодОтвета = Вопрос( - ТекстВопросаОбновитьГруппыДоступаПрофиля(), - РежимДиалогаВопрос.ДаНетОтмена, - , - КодВозвратаДиалога.Нет); - - Если КодОтвета <> КодВозвратаДиалога.Отмена Тогда - ОбновитьГруппыДоступа = (КодОтвета = КодВозвратаДиалога.Да); - - НачальноеЗаполнениеПрофиляГруппДоступа(ОбновитьГруппыДоступа); - - Прочитать(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); - - Если ОбновитьГруппыДоступа Тогда - Текст = НСтр("ru = 'Профиль ""%1"" восстановлен по содержимому начального заполнения, группы доступа профиля обновлены.'"); - Иначе - Текст = НСтр("ru = 'Профиль ""%1"" восстановлен по содержимому начального заполнения, группы доступа профиля не обновлены.'"); - КонецЕсли; - - ПоказатьОповещениеПользователя(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - Текст, Объект.Наименование)); - КонецЕсли; - КонецЕсли; КонецПроцедуры @@ -741,7 +406,7 @@ &НаКлиенте Процедура ПоказыватьНеИспользуемыеВидыДоступа(Команда) - ОбновитьНеиспользуемыеВидыДоступа(Ложь); + ПоказыватьНеИспользуемыеВидыДоступаНаСервере(); КонецПроцедуры @@ -752,7 +417,7 @@ Процедура ПоказатьТолькоВыбранныеРоли(Команда) ОбработатьИнтерфейсРолей("ТолькоВыбранныеРоли"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -760,7 +425,7 @@ Процедура ГруппировкаРолейПоПодсистемам(Команда) ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -769,7 +434,7 @@ ОбработатьИнтерфейсРолей("ОбновитьСоставРолей", "ВключитьВсе"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма, Ложь); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект, Ложь); КонецПроцедуры @@ -783,6 +448,74 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Продолжение обработчика события ПередЗаписью +&НаКлиенте +Процедура ПередЗаписьюПродолжение(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыЗаписи.Вставить("ОбновитьГруппыДоступаПрофиля"); + КонецЕсли; + + ПараметрыЗаписи.Вставить("ОтветПоОбновлениюГруппДоступаПрофиляПолучен"); + + Записать(ПараметрыЗаписи); + +КонецПроцедуры + +// Продолжение обработчика команды ВосстановитьПоНачальномуЗаполнению +&НаКлиенте +Процедура ВосстановитьПоНачальномуЗаполнениюПродолжение(Ответ, Неопределен) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ПоказатьВопрос( + Новый ОписаниеОповещения("ВосстановитьПоНачальномуЗаполнениюЗавершение", ЭтотОбъект), + ТекстВопросаОбновитьГруппыДоступаПрофиля(), + РежимДиалогаВопрос.ДаНетОтмена, + , + КодВозвратаДиалога.Нет); + +КонецПроцедуры + +// Продолжение обработчика команды ВосстановитьПоНачальномуЗаполнению +&НаКлиенте +Процедура ВосстановитьПоНачальномуЗаполнениюЗавершение(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + ОбновитьГруппыДоступа = (Ответ = КодВозвратаДиалога.Да); + + НачальноеЗаполнениеПрофиляГруппДоступа(ОбновитьГруппыДоступа); + + Прочитать(); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); + + Если ОбновитьГруппыДоступа Тогда + Текст = НСтр("ru = 'Профиль ""%1"" восстановлен по содержимому начального заполнения, группы доступа профиля обновлены.'"); + Иначе + Текст = НСтр("ru = 'Профиль ""%1"" восстановлен по содержимому начального заполнения, группы доступа профиля не обновлены.'"); + КонецЕсли; + + ПоказатьОповещениеПользователя(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Текст, Объект.Наименование)); + +КонецПроцедуры + +&НаСервере +Процедура ПоказыватьНеИспользуемыеВидыДоступаНаСервере() + + УправлениеДоступомСлужебный.ОбновитьОтображениеНеиспользуемыхВидовДоступа(ЭтотОбъект); + +КонецПроцедуры + &НаСервере Процедура УстановитьДоступностьОписанияИВосстановленияПоставляемогоПрофиля(ТекущийОбъект = Неопределено) @@ -809,280 +542,6 @@ КонецПроцедуры -&НаСервере -Процедура ЗаполнитьСвойстваВидовДоступаВФорме() - - Для каждого Строка Из Объект.ВидыДоступа Цикл - Если ЗначениеЗаполнено(Строка.ВидДоступа) Тогда - Строка.ИспользуетсяВПрограмме = УправлениеДоступомСлужебный.ВидДоступаИспользуется(Строка.ВидДоступа); - КонецЕсли; - ОбновитьПредставлениеИспользованияВидаДоступа(ЭтаФорма, Строка); - ОбновитьНомерСтрокиПоВиду(ЭтаФорма, Строка); - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ОбновитьНеиспользуемыеВидыДоступа(ПередОткрытиемФормы) - - Элементы.ПоказыватьНеИспользуемыеВидыДоступа.Пометка = ?(ПередОткрытиемФормы, Ложь, - НЕ Элементы.ПоказыватьНеИспользуемыеВидыДоступа.Пометка); - - Отбор = Новый Структура; - - Если Не Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка Тогда - Отбор.Вставить("ИспользуетсяВПрограмме", Истина); - Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор); - Иначе - Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ПриИзмененииТекущегоВидаДоступа(Знач Форма) - - Элементы = Форма.Элементы; - - ЗначенияЗадаются = Ложь; - - #Если Клиент Тогда - ТекущиеДанные = Элементы.ВидыДоступа.ТекущиеДанные; - #Иначе - ТекущиеДанные = Форма.Объект.ВидыДоступа.НайтиПоИдентификатору( - ?(Элементы.ВидыДоступа.ТекущаяСтрока = Неопределено, - -1, - - Элементы.ВидыДоступа.ТекущаяСтрока)); - #КонецЕсли - - Если ТекущиеДанные <> Неопределено Тогда - Если ЗначениеЗаполнено(ТекущиеДанные.ВидДоступа) - И НЕ ТекущиеДанные.ИспользуетсяВПрограмме Тогда - - Если НЕ Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Истина; - КонецЕсли; - Иначе - Если Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Ложь; - КонецЕсли; - КонецЕсли; - - Форма.ТекущийВидДоступа = ТекущиеДанные.ВидДоступа; - НайденныйВидДоступа = Форма.ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - ТекущиеДанные.ВидДоступа); - - Если НайденныйВидДоступа = Неопределено Тогда - - ЗначенияЗадаются = ТекущиеДанные.Предустановленный; - Если ЗначенияЗадаются Тогда - - Элементы.ТипыВидовДоступа.ТекущаяСтраница = - Элементы.ПредустановленныйВидДоступа; - - // Установка отбора значений. - Если Элементы.ЗначенияДоступа.ОтборСтрок = Неопределено - ИЛИ Элементы.ЗначенияДоступа.ОтборСтрок.ВидДоступа - <> ТекущиеДанные.ВидДоступа Тогда - - Элементы.ЗначенияДоступа.ОтборСтрок = - Новый ФиксированнаяСтруктура("ВидДоступа", ТекущиеДанные.ВидДоступа); - КонецЕсли; - Иначе - Элементы.ТипыВидовДоступа.ТекущаяСтраница = - Элементы.ОбычныйВидДоступа; - КонецЕсли; - Иначе - Элементы.ТипыВидовДоступа.ТекущаяСтраница = - Элементы.ВидДоступаЧерезПраваПоЗначениямДоступа; - - Если НайденныйВидДоступа.Представление <> Неопределено Тогда - ТекстИнформации = - НСтр("ru = 'Права доступа настраиваются индивидуально для каждого объекта ""%1"" - |с помощью команды ""Права доступа"".'"); - Элементы.ТекстИнформации.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстИнформации, - НайденныйВидДоступа.Представление); - КонецЕсли; - - КонецЕсли; - - Если ТекущиеДанные.ВидДоступа = Форма.ВидДоступаПользователи Тогда - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'"), - НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'") ); - - ИначеЕсли ТекущиеДанные.ВидДоступа = Форма.ВидДоступаВнешниеПользователи Тогда - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'"), - НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'") ); - Иначе - ШаблонНадписи = ?( - ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1)'"), - НСтр("ru = 'Разрешенные значения (%1)'") ); - КонецЕсли; - - // Обновление поля НадписьВидДоступа. - Форма.НадписьВидДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонНадписи, - Строка(ТекущиеДанные.ВидДоступа)); - - ОбновитьПредставлениеИспользованияВидаДоступа(Форма, ТекущиеДанные); - Иначе - Если Элементы.ВидДоступаНеИспользуется.Видимость Тогда - Элементы.ВидДоступаНеИспользуется.Видимость = Ложь; - КонецЕсли; - - Форма.ТекущийВидДоступа = Неопределено; - Элементы.ЗначенияДоступа.ОтборСтрок = - Новый ФиксированнаяСтруктура("ВидДоступа", Неопределено); - - Если Форма.Объект.ВидыДоступа.Количество() = 0 Тогда - Форма.Объект.ЗначенияДоступа.Очистить(); - КонецЕсли; - КонецЕсли; - - Форма.ТекущийТипЗначенияДоступа = ?( - ТекущиеДанные = Неопределено, - Неопределено, - ТекущиеДанные.ТекущийТипЗначенияДоступа); - - Форма.ТекущиеТипыЗначенийДоступа = Новый СписокЗначений; - - Если ЗначенияЗадаются Тогда - Отбор = Новый Структура("ВидДоступа", ТекущиеДанные.ВидДоступа); - ОписаниеТиповВидовДоступа = Форма.ТипыЗначенийДоступаВидовДоступа.НайтиСтроки(Отбор); - Для каждого ОписаниеТипаВидаДоступа Из ОписаниеТиповВидовДоступа Цикл - - Форма.ТекущиеТипыЗначенийДоступа.Добавить( - ОписаниеТипаВидаДоступа.ТипЗначенияДоступа, - ОписаниеТипаВидаДоступа.ПредставлениеТипа); - КонецЦикла; - Иначе - Если ТекущиеДанные <> Неопределено Тогда - Отбор = Новый Структура("ВидДоступа", Элементы.ВидыДоступа.ТекущиеДанные.ВидДоступа); - Для каждого Строка Из Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор) Цикл - Форма.Объект.ЗначенияДоступа.Удалить(Строка); - КонецЦикла - КонецЕсли; - КонецЕсли; - - Если Форма.ТекущиеТипыЗначенийДоступа.Количество() = 0 Тогда - Форма.ТекущиеТипыЗначенийДоступа.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); - КонецЕсли; - - Элементы.ЗначенияДоступа.Доступность = ЗначенияЗадаются; - Элементы.ЗначенияДоступаДобавить.Доступность = ЗначенияЗадаются; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьПредставлениеИспользованияВидаДоступа(Форма, ОписаниеВидаДоступа) - - Если ОписаниеВидаДоступа.Предустановленный Тогда - Отбор = Новый Структура("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - КоличествоЗначений = Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - Если КоличествоЗначений = 0 Тогда - ЧислоИПредмет = НСтр("ru = 'не назначены'"); - Иначе - ПрописьЧисла = ЧислоПрописью( - КоличествоЗначений, - "Л = ru_RU", - НСтр("ru = ',,,,,,,,0'")); - - ПрописьЧислаИПредмета = ЧислоПрописью( - КоличествоЗначений, - "Л = ru_RU", - НСтр("ru = 'значение,значения,значений,,,,,,0'")); - - ЧислоИПредмет = СтрЗаменить( - ПрописьЧислаИПредмета, - ПрописьЧисла, - Формат(КоличествоЗначений, "ЧГ=") + " "); - - КонецЕсли; - ОписаниеВидаДоступа.Использование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, исключения назначаются в профиле (%1)'"), - НСтр("ru = 'Все запрещены, исключения назначаются в профиле (%1)'") ), - ЧислоИПредмет); - Иначе - ОписаниеВидаДоступа.Использование = - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, исключения назначаются в группах доступа'"), - НСтр("ru = 'Все запрещены, исключения назначаются в группах доступа'")); - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьНомерСтрокиПоВиду(Форма, ОписаниеВидаДоступа) - - Отбор = Новый Структура("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - ЗначенияДоступаПоВиду = Форма.Объект.ЗначенияДоступа.НайтиСтроки(Отбор); - - ТекущийНомер = 1; - Для каждого Строка Из ЗначенияДоступаПоВиду Цикл - Строка.НомерСтрокиПоВиду = ТекущийНомер; - ТекущийНомер = ТекущийНомер + 1; - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Функция ВыбранТипЗначенияДоступа(Знач ТипыЗначенияДоступа) - - Если ТекущийТипЗначенияДоступа <> Неопределено Тогда - - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() = 1 Тогда - - ТекущийТипЗначенияДоступа = ТипыЗначенияДоступа[0].Значение; - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() > 0 Тогда - - Если ТипыЗначенияДоступа.Количество() = 2 Тогда - - Если ТипыЗначенияДоступа.НайтиПоЗначению( - ПользовательПустаяСсылка) <> Неопределено - - И ТипыЗначенияДоступа.НайтиПоЗначению( - ГруппаПользователейПустаяСсылка) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка; - Возврат Истина; - КонецЕсли; - - Если ТипыЗначенияДоступа.НайтиПоЗначению( - ВнешнийПользовательПустаяСсылка) <> Неопределено - - И ТипыЗначенияДоступа.НайтиПоЗначению( - ГруппаВнешнихПользователейПустаяСсылка) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка; - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Элемент = ТипыЗначенияДоступа.ВыбратьЭлемент( - НСтр("ru = 'Выбор типа данных'"), ТипыЗначенияДоступа[0]); - - Если Элемент <> Неопределено Тогда - ТекущийТипЗначенияДоступа = Элемент.Значение; - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - &НаКлиенте Функция ТекстВопросаОбновитьГруппыДоступаПрофиля() @@ -1102,99 +561,21 @@ ПараметрыДействия = Новый Структура; ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр); - ПараметрыДействия.Вставить("Форма", ЭтаФорма); + ПараметрыДействия.Вставить("Форма", ЭтотОбъект); ПараметрыДействия.Вставить("КоллекцияРолей", КоллекцияРолей); ПараметрыДействия.Вставить("СкрытьРольПолныеПрава", Объект.Ссылка <> Справочники.ПрофилиГруппДоступа.Администратор); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательОбластиДанных); - Иначе - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); - КонецЕсли; + ТипПользователей = ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), + Перечисления.ТипыПользователей.ПользовательОбластиДанных, + Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); + ПараметрыДействия.Вставить("ТипПользователей", ТипПользователей); ПользователиСлужебный.ОбработатьИнтерфейсРолей(Действие, ПараметрыДействия); КонецПроцедуры -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораПользователя(Знач Текст, - Знач ВключаяГруппы = Истина, - Знач ВключаяВнешнихПользователей = Неопределено, - Знач БезПользователей = Ложь) - - Возврат Пользователи.СформироватьДанныеВыбораПользователя( - Текст, - ВключаяГруппы, - ВключаяВнешнихПользователей, - БезПользователей); - -КонецФункции - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораВидаДоступа(Знач Текст, Знач ПоказыватьНеиспользуемыеВидыДоступа) - - ТехнологическиеВидыДоступа = Новый СписокЗначений; - НеиспользуемыеВидыДоступа = Новый СписокЗначений; - - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл - - Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда - ТехнологическиеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - - ИначеЕсли НЕ УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваВидаДоступа.ВидДоступа) Тогда - НеиспользуемыеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЕсли; - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Текст", Текст + "%"); - Запрос.УстановитьПараметр("ТехнологическиеВидыДоступа", ТехнологическиеВидыДоступа); - Запрос.Текст = - "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ВидыДоступа.Ссылка КАК Ссылка, - | ВидыДоступа.Наименование КАК Наименование - |ИЗ - | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа - |ГДЕ - | ВидыДоступа.Наименование ПОДОБНО &Текст - | И ВидыДоступа.ПометкаУдаления = ЛОЖЬ - | И НЕ ВидыДоступа.Ссылка В (&ТехнологическиеВидыДоступа) - | И &НеиспользуемыеВидыДоступа"; - - Если ПоказыватьНеиспользуемыеВидыДоступа Тогда - ТекстУсловия = "ИСТИНА"; - Иначе - Запрос.УстановитьПараметр("НеиспользуемыеВидыДоступа", НеиспользуемыеВидыДоступа); - ТекстУсловия = "НЕ ВидыДоступа.Ссылка В (&НеиспользуемыеВидыДоступа)"; - КонецЕсли; - Запрос.Текст = СтрЗаменить(Запрос.Текст, "&НеиспользуемыеВидыДоступа", ТекстУсловия); - - ДанныеВыбора = Новый СписокЗначений; - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - - ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); - КонецЦикла; - - Возврат ДанныеВыбора; - -КонецФункции - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) - - Возврат УправлениеДоступомСлужебный.СформироватьДанныеВыбораЗначенияДоступа( - Текст, - ВидДоступа, - ВключаяГруппы); - -КонецФункции - &НаСервере Процедура НачальноеЗаполнениеПрофиляГруппДоступа(Знач ОбновитьГруппыДоступа) @@ -1209,3 +590,9 @@ Возврат Справочники.ПрофилиГруппДоступа.ОписаниеПоставляемогоПрофиля(Профиль); КонецФункции + +&НаКлиенте +Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, + ЭтотОбъект, "Объект.Комментарий"); +КонецПроцедуры diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html b/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html index a03b835a2..6b1e4c46f 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Как правило, настройка профилей групп доступа обычно выполняется при внедрении и конфигурировании прикладного решения. Они предназначены для создания готовых подборок разрешенных действий (ролей), содержащих права доступа к объектам метаданных, и "разрезов" ограничения этих прав (видов доступа), которые предполагается использовать в <a href="Catalog.ГруппыДоступа/Help">группах доступа</a>.</p> <p>С помощью профилей становится возможным:</p> <p>а) задать общий список ролей для некоторой группы пользователей системы. Например, для менеджеров может быть определен профиль "Менеджер" с ролями:</p> diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl index 5b2b3d9fa..89436d1c7 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ManagerModule.bsl @@ -1,5 +1,24 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые не нужно редактировать +// с помощью обработки группового изменения объектов +// +Функция РеквизитыНеРедактируемыеВГрупповойОбработке() Экспорт + + НеРедактируемыеРеквизиты = Новый Массив; + НеРедактируемыеРеквизиты.Добавить("ИдентификаторПоставляемыхДанных"); + НеРедактируемыеРеквизиты.Добавить("ПоставляемыйПрофильИзменен"); + НеРедактируемыеРеквизиты.Добавить("Роли.УдалитьРоль"); + НеРедактируемыеРеквизиты.Добавить("ВидыДоступа.*"); + НеРедактируемыеРеквизиты.Добавить("ЗначенияДоступа.*"); + + Возврат НеРедактируемыеРеквизиты; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -402,7 +421,7 @@ Если СвойстваПрофиля = Неопределено Тогда Возврат Ложь; КонецЕсли; - + ОписаниеРолейПрофиля = ОписаниеРолейПрофиля(СвойстваПрофиля); Если ВРег(Профиль.Наименование) <> ВРег(СвойстваПрофиля.Наименование) Тогда @@ -431,10 +450,11 @@ КонецЦикла; Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ); Отбор = Новый Структура; - Отбор.Вставить("ВидДоступа", ПланыВидовХарактеристик.ВидыДоступа[ОписаниеВидаДоступа.Ключ]); + Отбор.Вставить("ВидДоступа", СвойстваВидаДоступа.Ссылка); Отбор.Вставить("Предустановленный", ОписаниеВидаДоступа.Значение = "Предустановленный"); - Отбор.Вставить("ДоступРазрешен", ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"); + Отбор.Вставить("ВсеРазрешены", ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"); Если Профиль.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда Возврат Истина; КонецЕсли; @@ -442,7 +462,6 @@ Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл Отбор = Новый Структура; - Отбор.Вставить("ВидДоступа", ПланыВидовХарактеристик.ВидыДоступа[ОписаниеЗначенияДоступа.ВидДоступа]); Запрос = Новый Запрос(СтрЗаменить("Выбрать Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.ЗначениеДоступа)); Отбор.Вставить("ЗначениеДоступа", Запрос.Выполнить().Выгрузить()[0].Значение); Если Профиль.ЗначенияДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда @@ -601,6 +620,111 @@ КонецПроцедуры +// Заменяет ссылку на ПВХ.ВидыДоступа пустой ссылкой основного типа значений вида доступа. +Процедура ПреобразоватьИдентификаторыВидовДоступа() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПрофилиГруппДоступа.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа + |ГДЕ + | НЕ(НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступа + | ГДЕ + | ВидыДоступа.Ссылка = ПрофилиГруппДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ВидыДоступа.ВидДоступа) = ТИП(ПланВидовХарактеристик.УдалитьВидыДоступа)) + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ПрофилиГруппДоступа.ЗначенияДоступа КАК ЗначенияДоступа + | ГДЕ + | ЗначенияДоступа.Ссылка = ПрофилиГруппДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияДоступа.ВидДоступа) = ТИП(ПланВидовХарактеристик.УдалитьВидыДоступа))) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ГруппыДоступа.Ссылка + |ИЗ + | Справочник.ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | НЕ(НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ГруппыДоступа.ВидыДоступа КАК ВидыДоступа + | ГДЕ + | ВидыДоступа.Ссылка = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ВидыДоступа.ВидДоступа) = ТИП(ПланВидовХарактеристик.УдалитьВидыДоступа)) + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ГруппыДоступа.ЗначенияДоступа КАК ЗначенияДоступа + | ГДЕ + | ЗначенияДоступа.Ссылка = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияДоступа.ВидДоступа) = ТИП(ПланВидовХарактеристик.УдалитьВидыДоступа)))"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Если Выборка.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + + Пока Выборка.Следующий() Цикл + Объект = Выборка.Ссылка.ПолучитьОбъект(); + + Индекс = Объект.ВидыДоступа.Количество()-1; + Пока Индекс >= 0 Цикл + Строка = Объект.ВидыДоступа[Индекс]; + Попытка + ИмяВидаДоступа = ПланыВидовХарактеристик.УдалитьВидыДоступа.ПолучитьИмяПредопределенного( + Строка.ВидДоступа); + Исключение + ИмяВидаДоступа = ""; + КонецПопытки; + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + Объект.ВидыДоступа.Удалить(Индекс); + Иначе + Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка; + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Индекс = Объект.ЗначенияДоступа.Количество()-1; + Пока Индекс >= 0 Цикл + Строка = Объект.ЗначенияДоступа[Индекс]; + Попытка + ИмяВидаДоступа = ПланыВидовХарактеристик.УдалитьВидыДоступа.ПолучитьИмяПредопределенного( + Строка.ВидДоступа); + Исключение + ИмяВидаДоступа = ""; + КонецПопытки; + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + Объект.ЗначенияДоступа.Удалить(Индекс); + Иначе + Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка; + Если Объект.ВидыДоступа.Найти(Строка.ВидДоступа, "ВидДоступа") = Неопределено Тогда + Объект.ЗначенияДоступа.Удалить(Индекс); + КонецЕсли; + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции @@ -611,7 +735,7 @@ ПараметрыОбновления.Вставить("ОбновлятьИзмененныеПрофили", Истина); ПараметрыОбновления.Вставить("ЗапретитьИзменениеПрофилей", Истина); // Свойства обновления групп доступа поставляемых профилей. - ПараметрыОбновления.Вставить("ОбновлятьГруппыДоступа", Истина); + ПараметрыОбновления.Вставить("ОбновлятьГруппыДоступа", Истина); ПараметрыОбновления.Вставить("ОбновлятьГруппыДоступаСУстаревшимиНастройками", Ложь); ОписанияПрофилей = Новый Массив; @@ -622,11 +746,11 @@ Обработчик.Модуль.ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления); КонецЦикла; - УправлениеДоступомПереопределяемый.ЗаполнитьПоставляемыеПрофилиГруппДоступа( + УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа( ОписанияПрофилей, ПараметрыОбновления); ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ЗаполнитьПоставляемыеПрофилиГруппДоступа + НСтр("ru = 'Ошибка в процедуре ПриЗаполненииПоставляемыхПрофилейГруппДоступа |модуля УправлениеДоступомПереопределяемый. | |'"); @@ -643,12 +767,10 @@ // Описание для заполнения предопределенного профиля "Администратор". ОписаниеПрофиляАдминистратор = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); - ОписаниеПрофиляАдминистратор.Имя = "Администратор"; ОписаниеПрофиляАдминистратор.Идентификатор = ИдентификаторПрофиляАдминистратор(); ОписаниеПрофиляАдминистратор.Наименование = НСтр("ru = 'Администратор'"); ОписаниеПрофиляАдминистратор.Роли.Добавить("ПолныеПрава"); - ОписаниеПрофиляАдминистратор.Описание = НСтр("ru = 'Предназначен для: |- настройки параметров работы и обслуживания информационной системы, @@ -661,6 +783,10 @@ ОписанияПрофилей.Добавить(ОписаниеПрофиляАдминистратор); ВсеРоли = ПользователиСлужебный.ВсеРоли().Соответствие; + + СвойстваВидовДоступа = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( + "ПараметрыОграниченияДоступа").СвойстваВидовДоступа; + // Преобразование описаний в соответствие идентификаторов и // свойств для хранения и быстрой обработки. СвойстваПрофилей = Новый Соответствие; @@ -669,9 +795,10 @@ Для каждого Роль Из ОписаниеПрофиля.Роли Цикл Если ВсеРоли.Получить(Роль) = Неопределено Тогда ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В описании профиля ""%1"" - |роль ""%2"" не найдена в метаданных.'"), - ОписаниеПрофиля.Наименование, + НСтр("ru = 'В описании профиля ""%1 (%2)"" + |роль ""%3"" не найдена в метаданных.'"), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор, Роль); КонецЕсли; КонецЦикла; @@ -683,7 +810,7 @@ СвойстваПрофилей.Вставить(ОписаниеПрофиля.Идентификатор, ОписаниеПрофиля); Если ЗначениеЗаполнено(ОписаниеПрофиля.Имя) Тогда Если СвойстваПрофилей.Получить(ОписаниеПрофиля.Имя) <> Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Профиль с именем ""%1"" уже существует.'"), ОписаниеПрофиля.Имя); КонецЕсли; @@ -692,16 +819,142 @@ // Преобразование СпискаЗначений к Соответствию для фиксации. ВидыДоступа = Новый Соответствие; Для каждого ЭлементСписка Из ОписаниеПрофиля.ВидыДоступа Цикл - ВидыДоступа.Вставить(ЭлементСписка.Значение, ЭлементСписка.Представление); + ИмяВидаДоступа = ЭлементСписка.Значение; + УточнениеВидаДоступа = ЭлементСписка.Представление; + Если СвойстваВидовДоступа.ПоИменам.Получить(ИмяВидаДоступа) = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указан несуществующий вид доступа ""%2"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ИмяВидаДоступа); + КонецЕсли; + Если УточнениеВидаДоступа <> "" + И УточнениеВидаДоступа <> "ВначалеВсеЗапрещены" + И УточнениеВидаДоступа <> "Предустановленный" + И УточнениеВидаДоступа <> "ВначалеВсеРазрешены" Тогда + + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" указано неизвестное уточнение ""%3"". + | + |Допустимы только следующие уточнения: + |- ""ВначалеВсеЗапрещены"" или """", + |- ""ВначалеВсеРазрешены"", + |- ""Предустановленный"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ИмяВидаДоступа, + УточнениеВидаДоступа); + КонецЕсли; + ВидыДоступа.Вставить(ИмяВидаДоступа, УточнениеВидаДоступа); КонецЦикла; ОписаниеПрофиля.ВидыДоступа = ВидыДоступа; + // Удаление повторяющихся значений. ЗначенияДоступа = Новый Массив; + ТаблицаЗначенийДоступа = Новый ТаблицаЗначений; + ТаблицаЗначенийДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + ТаблицаЗначенийДоступа.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + Отбор = Новый Структура; + Для каждого ЭлементСписка Из ОписаниеПрофиля.ЗначенияДоступа Цикл - ОписаниеЗначенияДоступа = Новый Структура; - ОписаниеЗначенияДоступа.Вставить("ВидДоступа", ЭлементСписка.Значение); - ОписаниеЗначенияДоступа.Вставить("ЗначениеДоступа", ЭлементСписка.Представление); - ЗначенияДоступа.Добавить(ОписаниеЗначенияДоступа); + Отбор.Вставить("ВидДоступа", ЭлементСписка.Значение); + Отбор.Вставить("ЗначениеДоступа", ЭлементСписка.Представление); + ВидДоступа = Отбор.ВидДоступа; + ЗначениеДоступа = Отбор.ЗначениеДоступа; + + СвойстваВидаДоступа = СвойстваВидовДоступа.ПоИменам.Получить(ВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указан несуществующий вид доступа ""%2"" + |для значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + КонецЕсли; + + ОбъектМетаданных = Неопределено; + ПозицияТочки = Найти(ЗначениеДоступа, "."); + Если ПозицияТочки > 0 Тогда + ВидОбъектаМетаданных = Лев(ЗначениеДоступа, ПозицияТочки - 1); + ОстатокСтроки = Сред(ЗначениеДоступа, ПозицияТочки + 1); + ПозицияТочки = Найти(ОстатокСтроки, "."); + Если ПозицияТочки > 0 Тогда + ИмяОбъектаМетаданных = Лев(ОстатокСтроки, ПозицияТочки - 1); + ПолноеИмяОбъектаМетаданных = ВидОбъектаМетаданных + "." + ИмяОбъектаМетаданных; + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяОбъектаМетаданных); + КонецЕсли; + КонецЕсли; + + Если ОбъектМетаданных = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |не существует тип указаного значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + КонецЕсли; + + Попытка + ПустаяСсылкаЗначенияДоступа = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + ПолноеИмяОбъектаМетаданных).ПустаяСсылка(); + Исключение + ПустаяСсылкаЗначенияДоступа = Неопределено; + КонецПопытки; + + Если ПустаяСсылкаЗначенияДоступа = Неопределено Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |указан не ссылочный тип значения доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + КонецЕсли; + ТипЗначенияДоступа = ТипЗнч(ПустаяСсылкаЗначенияДоступа); + + СвойстваВидаДоступаПоТипу = СвойстваВидовДоступа.ПоТипамЗначений.Получить(ТипЗначенияДоступа); + Если СвойстваВидаДоступаПоТипу = Неопределено + ИЛИ СвойстваВидаДоступаПоТипу.Имя <> ВидДоступа Тогда + + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |указано значение доступа ""%3"" + |типа, который не указан в свойствах вида доступа ""%2"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + КонецЕсли; + + Если ТаблицаЗначенийДоступа.НайтиСтроки(Отбор).Количество() > 0 Тогда + ВызватьИсключение ЗаголовокОшибки + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В описании профиля ""%1"" + |для вида доступа ""%2"" + |повторно указано значение доступа + |""%3"".'"), + ?(ЗначениеЗаполнено(ОписаниеПрофиля.Имя), + ОписаниеПрофиля.Имя, + ОписаниеПрофиля.Идентификатор), + ВидДоступа, + ЗначениеДоступа); + КонецЕсли; + ЗначенияДоступа.Добавить(Отбор); КонецЦикла; ОписаниеПрофиля.ЗначенияДоступа = ЗначенияДоступа; КонецЦикла; @@ -749,22 +1002,15 @@ Запрос.Текст = "ВЫБРАТЬ | ПрофилиГруппДоступа.Ссылка КАК Ссылка, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных + | ПрофилиГруппДоступа.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных |ИЗ | Справочник.ПрофилиГруппДоступа КАК ПрофилиГруппДоступа |ГДЕ | ПрофилиГруппДоступа.Предопределенный = ИСТИНА"; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ПрофилиГруппДоступа.ИмяПредопределенныхДанных"); - КонецЕсли; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяПредопределенного = ПолучитьИмяПредопределенного(Выборка.Ссылка); - КонецЕсли; + ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных; Если ВРег(СвойстваПрофиля.Имя) = ВРег(ИмяПредопределенного) Тогда ПрофильСсылка = Выборка.Ссылка; Прервать; @@ -810,16 +1056,18 @@ ПрофильОбъект.ВидыДоступа.Очистить(); Для каждого ОписаниеВидаДоступа Из СвойстваПрофиля.ВидыДоступа Цикл + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеВидаДоступа.Ключ); Строка = ПрофильОбъект.ВидыДоступа.Добавить(); - Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа[ОписаниеВидаДоступа.Ключ]; + Строка.ВидДоступа = СвойстваВидаДоступа.Ссылка; Строка.Предустановленный = ОписаниеВидаДоступа.Значение = "Предустановленный"; - Строка.ДоступРазрешен = ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"; + Строка.ВсеРазрешены = ОписаниеВидаДоступа.Значение = "ВначалеВсеРазрешены"; КонецЦикла; ПрофильОбъект.ЗначенияДоступа.Очистить(); Для каждого ОписаниеЗначенияДоступа Из СвойстваПрофиля.ЗначенияДоступа Цикл + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ОписаниеЗначенияДоступа.ВидДоступа); СтрокаЗначения = ПрофильОбъект.ЗначенияДоступа.Добавить(); - СтрокаЗначения.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа[ОписаниеЗначенияДоступа.ВидДоступа]; + СтрокаЗначения.ВидДоступа = СвойстваВидаДоступа.Ссылка; Запрос = Новый Запрос(СтрЗаменить("Выбрать Значение(%1) КАК Значение", "%1", ОписаниеЗначенияДоступа.ЗначениеДоступа)); СтрокаЗначения.ЗначениеДоступа = Запрос.Выполнить().Выгрузить()[0].Значение; КонецЦикла; diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl index 779a4a03f..d75bc86c7 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ObjectModule.bsl @@ -46,23 +46,12 @@ КонецЦикла; КонецЕсли; - // Удаление всегда используемых видов доступа. - Отбор = Новый Структура("ВидДоступаИспользуетсяВсегда", Истина); - ВидыДоступаИспользуемыеВсегда = УправлениеДоступомСлужебный.СвойстваВидаДоступа().НайтиСтроки(Отбор); - - Для каждого СвойстваВидаДоступа Из ВидыДоступаИспользуемыеВсегда Цикл - Отбор = Новый Структура("ВидДоступа", СвойстваВидаДоступа.ВидДоступа); - Для каждого Строка Из ВидыДоступа.НайтиСтроки(Отбор) Цикл - ВидыДоступа.Удалить(Строка); - КонецЦикла; - КонецЦикла; - Если НЕ ДополнительныеСвойства.Свойство("НеОбновлятьРеквизитПоставляемыйПрофильИзменен") Тогда ПоставляемыйПрофильИзменен = Справочники.ПрофилиГруппДоступа.ПоставляемыйПрофильИзменен(ЭтотОбъект); КонецЕсли; - ИнтерфейсУпрощенный = УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа(); + ИнтерфейсУпрощенный = УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа(); Если ИнтерфейсУпрощенный Тогда // Обновление наименования у персональных групп доступа этого профиля (если есть) diff --git a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo index a4bdd080d..11b75cc9c 100644 --- a/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo +++ b/SSL/src/Catalogs/ПрофилиГруппДоступа/ПрофилиГруппДоступа.mdo @@ -191,6 +191,7 @@ <key>ru</key> <value>Произвольная строка</value> </toolTip> + <multiLine>true</multiLine> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> <fillValue xsi:type="core:StringValue"/> @@ -276,18 +277,17 @@ <key>ru</key> <value>Вид доступа</value> </synonym> + <comment>Представлен пустой ссылкой основного типа значений</comment> <type> - <types>ChartOfCharacteristicTypesRef.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> - <value>Возможный "разрез" -ограничения прав доступа + <value>Возможный "разрез" ограничения прав доступа в заданном списке разрешенных действий (ролей)</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> @@ -315,17 +315,17 @@ <fullTextSearch>Use</fullTextSearch> </attributes> <attributes uuid="7e7c5abd-b645-4de5-a40e-5805ec4456e2"> - <name>ДоступРазрешен</name> + <name>ВсеРазрешены</name> <synonym> <key>ru</key> - <value>Доступ разрешен</value> + <value>Все разрешены</value> </synonym> <type> <types>Boolean</types> </type> <toolTip> <key>ru</key> - <value>Начальная разрешенность или запрещенность всех значений доступа для вида доступа, настраиваемого в группе доступа</value> + <value>Способ определения разрешенных значений доступа</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -357,8 +357,9 @@ <key>ru</key> <value>Вид доступа</value> </synonym> + <comment>Представлен пустой ссылкой основного типа значений</comment> <type> - <types>ChartOfCharacteristicTypesRef.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> @@ -366,7 +367,6 @@ </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> @@ -378,18 +378,14 @@ <value>Значение доступа</value> </synonym> <type> - <types>Characteristic.ВидыДоступа</types> + <types>DefinedType.ЗначениеДоступа</types> </type> <toolTip> <key>ru</key> - <value>Предустановленное значение доступа, заданное по предустановленному виду доступа</value> + <value>Предустановленное разрешенное или запрещенное значение доступа.</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> - <fillChecking>ShowError</fillChecking> - <linkByType> - <field>Catalog.ПрофилиГруппДоступа.TabularSection.ЗначенияДоступа.Attribute.ВидДоступа</field> - </linkByType> <dataHistory>Use</dataHistory> <indexing>Index</indexing> <fullTextSearch>Use</fullTextSearch> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Commands/ВыполнитьСейчас/CommandModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Commands/ВыполнитьСейчас/CommandModule.bsl index 16e68867d..eba6826fb 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Commands/ВыполнитьСейчас/CommandModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Commands/ВыполнитьСейчас/CommandModule.bsl @@ -7,65 +7,84 @@ Возврат; КонецЕсли; - ЭтаФорма = Параметры.Источник; + Форма = Параметры.Источник; - ПредварительныеНастройки = Неопределено; - Если ЭтаФорма.ИмяФормы = "Справочник.РассылкиОтчетов.Форма.ФормаЭлемента" Тогда - ТекстСообщения = НСтр("ru = 'Выполняется рассылка отчетов'"); - - Объект = ЭтаФорма.Объект; - Если НЕ Объект.Подготовлена Тогда - Предупреждение(НСтр("ru = 'Рассылка не подготовлена'")); + ДополнительныеПараметры = Новый Структура("МассивРассылок, Форма, ЭтоФормаЭлемента"); + ДополнительныеПараметры.МассивРассылок = МассивРассылок; + ДополнительныеПараметры.Форма = Форма; + ДополнительныеПараметры.ЭтоФормаЭлемента = (Форма.ИмяФормы = "Справочник.РассылкиОтчетов.Форма.ФормаЭлемента"); + Обработчик = Новый ОписаниеОповещения("ВыполнитьСейчасЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + Если ДополнительныеПараметры.ЭтоФормаЭлемента Тогда + Если НЕ Форма.Объект.Подготовлена Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Рассылка не подготовлена'")); Возврат; КонецЕсли; - Если Объект.ИспользоватьЭлектроннуюПочту Тогда - Получатели = РассылкаОтчетовКлиент.ВыбратьПолучателя(Объект, Истина, Истина); + Если Форма.Объект.ИспользоватьЭлектроннуюПочту Тогда + РассылкаОтчетовКлиент.ВыбратьПолучателя(Обработчик, Форма.Объект, Истина, Истина); + Возврат; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Обработчик, Неопределено); +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьСейчасЗавершение(Получатели, ДополнительныеПараметры) Экспорт + // Обработчик результата работы процедуры ВыполнитьСейчас. + + Форма = ДополнительныеПараметры.Форма; + + ПредварительныеНастройки = Неопределено; + + Если ДополнительныеПараметры.ЭтоФормаЭлемента Тогда + Если Форма.Объект.ИспользоватьЭлектроннуюПочту Тогда Если Получатели = Неопределено Тогда Возврат; КонецЕсли; ПредварительныеНастройки = Новый Структура("Получатели", Получатели); КонецЕсли; + ТекстСостояния = НСтр("ru = 'Выполняется рассылка отчетов'"); Иначе - ТекстСообщения = НСтр("ru = 'Выполняются рассылки отчетов'"); + ТекстСостояния = НСтр("ru = 'Выполняются рассылки отчетов'"); КонецЕсли; - Состояние(ТекстСообщения, , , ); + Состояние(ТекстСостояния, , , ); - ПараметрыВызоваСервера = Новый Структура("МассивРассылок, ПредварительныеНастройки", - МассивРассылок, - ПредварительныеНастройки); + ПараметрыВызоваСервера = Новый Структура; + ПараметрыВызоваСервера.Вставить("МассивРассылок", ДополнительныеПараметры.МассивРассылок); + ПараметрыВызоваСервера.Вставить("ПредварительныеНастройки", ПредварительныеНастройки); - Результат = ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, ЭтаФорма.УникальныйИдентификатор); + Результат = ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, Форма.УникальныйИдентификатор); Если Результат.Статус = "ВыполненоУспешно" Тогда - РассылкаОтчетовКлиент.ПоказатьРезультат(Результат.Детали); + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Форма, Результат.Детали); ИначеЕсли Результат.Статус = "Исключение" Тогда - Предупреждение( - НСтр("ru = 'Рассылки не выполнены из-за ошибки, - |Подробности см. в журнале регистрации.'")); + ТекстПредупреждения = НСтр("ru = 'Рассылки не выполнены из-за ошибки, + |Подробности см. в журнале регистрации.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); ИначеЕсли Результат.Статус = "Выполняется" Тогда - ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, Результат.Детали.ИдентификаторЗадания); + ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(Форма, Результат.Детали.ИдентификаторЗадания); ПараметрыОбработчика = Неопределено; ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчика); ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчика); - ЭтаФорма.ПараметрыФоновогоЗадания.Очистить(); - ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.ИдентификаторЗадания); - ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.АдресХранилища); - ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(ПараметрыОбработчика); - ЭтаФорма.ПараметрыФоновогоЗадания.Добавить(ФормаДлительнойОперации); + Форма.ПараметрыФоновогоЗадания.Очистить(); + Форма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.ИдентификаторЗадания); + Форма.ПараметрыФоновогоЗадания.Добавить(Результат.Детали.АдресХранилища); + Форма.ПараметрыФоновогоЗадания.Добавить(ПараметрыОбработчика); + Форма.ПараметрыФоновогоЗадания.Добавить(ФормаДлительнойОперации); - ЭтаФорма.ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеФоновогоЗадания", ПараметрыОбработчика.ТекущийИнтервал, Истина); + Форма.ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеФоновогоЗадания", ПараметрыОбработчика.ТекущийИнтервал, Истина); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаСервере Функция ВыполнитьРассылкиВФоновомЗадании(ПараметрыВызоваСервера, Знач УникальныйИдентификатор) + // Запускает выполнение рассылок отчетов в фоновом задании. + Результат = Новый Структура("Статус, Детали"); Попытка diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form index 64a14c16e..8b1013029 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Form.form @@ -19,7 +19,7 @@ <name>СерверИКаталогПриИзменении</name> </handlers> <extendedTooltip> - <name>СерверИКаталогРасширеннаяПодсказка</name> + <name>СерверИКаталогExtendedTooltip</name> <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -60,8 +60,8 @@ <segments>Порт</segments> </dataPath> <extendedTooltip> - <name>ПортРасширеннаяПодсказка</name> - <id>24</id> + <name>ПортExtendedTooltip</name> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -108,7 +108,7 @@ <value>Основные параметры</value> </toolTip> <extendedTooltip> - <name>ОсновныеПараметрыРасширеннаяПодсказка</name> + <name>ОсновныеПараметрыExtendedTooltip</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -141,8 +141,8 @@ <segments>Логин</segments> </dataPath> <extendedTooltip> - <name>ЛогинРасширеннаяПодсказка</name> - <id>27</id> + <name>ЛогинExtendedTooltip</name> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -182,8 +182,8 @@ <segments>Пароль</segments> </dataPath> <extendedTooltip> - <name>ПарольРасширеннаяПодсказка</name> - <id>29</id> + <name>ПарольExtendedTooltip</name> + <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -225,8 +225,8 @@ </dataPath> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>ПассивноеСоединениеРасширеннаяПодсказка</name> - <id>31</id> + <name>ПассивноеСоединениеExtendedTooltip</name> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -260,8 +260,8 @@ <value>Дополнительные параметры</value> </toolTip> <extendedTooltip> - <name>ДополнительныеПараметрыРасширеннаяПодсказка</name> - <id>26</id> + <name>ДополнительныеПараметрыExtendedTooltip</name> + <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -290,7 +290,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОКРасширеннаяПодсказка</name> + <name>ФормаОКExtendedTooltip</name> <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -316,7 +316,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаЗаполнитьРасширеннаяПодсказка</name> + <name>ФормаЗаполнитьExtendedTooltip</name> <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html index b0e05588d..767d7ec7a 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Позволяет указать параметры, необходимые для подключения к FTP ресурсу. <br>Поле "Сервер и каталог" является обязательным для заполнения, остальные поля не обязательны.</p> <h2><a name="Реквизиты">Реквизиты:</a></h2> <p></p> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Module.bsl index d70cfab41..4fd46cd12 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ПараметрыFTP/Module.bsl @@ -11,14 +11,14 @@ РеквизитСправочника = Метаданные.Справочники.РассылкиОтчетов.Реквизиты.FTPПорт; ЗаполнитьЗначенияСвойств(Элементы.Порт, РеквизитСправочника, "Подсказка, МаксимальноеЗначение, МинимальноеЗначение"); - ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, "Сервер, Каталог, Порт, Логин, Пароль, ПассивноеСоединение"); - Если ЭтаФорма.Сервер = "" Тогда - ЭтаФорма.Сервер = "сервер"; + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры, "Сервер, Каталог, Порт, Логин, Пароль, ПассивноеСоединение"); + Если ЭтотОбъект.Сервер = "" Тогда + ЭтотОбъект.Сервер = "сервер"; КонецЕсли; - Если ЭтаФорма.Каталог = "" Тогда - ЭтаФорма.Каталог = "/каталог/"; + Если ЭтотОбъект.Каталог = "" Тогда + ЭтотОбъект.Каталог = "/каталог/"; КонецЕсли; - ВидимостьДоступность(ЭтаФорма); + ВидимостьДоступность(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -26,8 +26,8 @@ &НаКлиенте Процедура СерверИКаталогПриИзменении(Элемент) - ЗаполнитьЗначенияСвойств(ЭтаФорма, РассылкаОтчетовКлиентСервер.РазобратьFTPАдрес(СерверИКаталог), "Сервер, Каталог"); - ВидимостьДоступность(ЭтаФорма); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, РассылкаОтчетовКлиентСервер.РазобратьFTPАдрес(СерверИКаталог), "Сервер, Каталог"); + ВидимостьДоступность(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -45,16 +45,14 @@ КонецЕсли; КонецЕсли; - Если ВвестиСтроку(ПолныйАдрес, НСтр("ru = 'Введите полный ftp адрес'")) Тогда - ЗаполнитьЗначенияСвойств(ЭтаФорма, РассылкаОтчетовКлиентСервер.РазобратьFTPАдрес(ПолныйАдрес)); - ВидимостьДоступность(ЭтаФорма); - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ЗаполнитьЗавершение", ЭтотОбъект); + ПоказатьВводСтроки(Обработчик, ПолныйАдрес, НСтр("ru = 'Введите полный ftp адрес'")) КонецПроцедуры &НаКлиенте Процедура ОК(Команда) ЗначениеВыбора = Новый Структура("Сервер, Каталог, Порт, Логин, Пароль, ПассивноеСоединение"); - ЗаполнитьЗначенияСвойств(ЗначениеВыбора, ЭтаФорма); + ЗаполнитьЗначенияСвойств(ЗначениеВыбора, ЭтотОбъект); ОповеститьОВыборе(ЗначениеВыбора); КонецПроцедуры @@ -62,10 +60,17 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаКлиентеНаСервереБезКонтекста -Процедура ВидимостьДоступность(ЭтаФорма, Изменения = "") - Если Прав(ЭтаФорма.Каталог, 1) <> "/" Тогда - ЭтаФорма.Каталог = ЭтаФорма.Каталог + "/"; +Процедура ВидимостьДоступность(Форма, Изменения = "") + Если Прав(Форма.Каталог, 1) <> "/" Тогда + Форма.Каталог = Форма.Каталог + "/"; КонецЕсли; - ЭтаФорма.СерверИКаталог = "ftp://"+ ЭтаФорма.Сервер + ЭтаФорма.Каталог; + Форма.СерверИКаталог = "ftp://"+ Форма.Сервер + Форма.Каталог; КонецПроцедуры +&НаКлиенте +Процедура ЗаполнитьЗавершение(РезультатВвода, ДополнительныеПараметры) Экспорт + Если РезультатВвода <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ЭтотОбъект, РассылкаОтчетовКлиентСервер.РазобратьFTPАдрес(РезультатВвода)); + ВидимостьДоступность(ЭтотОбъект); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form index 8156a99ef..15544be83 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Form.form @@ -27,8 +27,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>20</id> + <name>НаименованиеExtendedTooltip</name> + <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -59,10 +59,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>11</id> + <id>12</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>13</id> + <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -72,7 +72,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>12</id> + <id>13</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -82,10 +82,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>14</id> + <id>15</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>16</id> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -95,7 +95,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>15</id> + <id>16</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -106,10 +106,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>17</id> + <id>18</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>19</id> + <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -119,7 +119,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>18</id> + <id>19</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -129,7 +129,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -201,7 +201,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>ВыполнитьСейчасРасширеннаяПодсказка</name> + <name>ВыполнитьСейчасExtendedTooltip</name> <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -229,7 +229,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>СобытияРассылкиРасширеннаяПодсказка</name> + <name>СобытияРассылкиExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Help/ru.html index a59d70ef0..61df13164 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаВыбораГруппы/Help/ru.html @@ -1,2 +1,2 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Форма предназначена для выбора группы рассылок из списка доступных.</p></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Form.form index b5c413780..32976903e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>5</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -53,8 +53,8 @@ <segments>Объект.Parent</segments> </dataPath> <extendedTooltip> - <name>РодительРасширеннаяПодсказка</name> - <id>7</id> + <name>РодительExtendedTooltip</name> + <id>6</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Help/ru.html index 3aa9682fd..818588245 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаГруппы/Help/ru.html @@ -1 +1 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body>Позволяет задать Наименование и Группу для группы рассылок отчетов.</body></html> \ No newline at end of file +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body>Позволяет задать Наименование и Группу для группы рассылок отчетов.</body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form index c996a55e7..b3e4369ca 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Form.form @@ -24,8 +24,8 @@ <segments>Список.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>72</id> + <name>НаименованиеExtendedTooltip</name> + <id>63</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -65,8 +65,8 @@ <segments>Список.ИндексКартинкиПоследнегоЗапуска</segments> </dataPath> <extendedTooltip> - <name>КартинкаРасширеннаяПодсказка</name> - <id>75</id> + <name>КартинкаExtendedTooltip</name> + <id>65</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -112,8 +112,8 @@ <segments>Список.ПоследнийЗапуск</segments> </dataPath> <extendedTooltip> - <name>ПоследнийЗапускРасширеннаяПодсказка</name> - <id>77</id> + <name>ПоследнийЗапускExtendedTooltip</name> + <id>66</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -151,8 +151,8 @@ <value>Последний запуск с картинкой</value> </toolTip> <extendedTooltip> - <name>ПоследнийЗапускСКартинкойРасширеннаяПодсказка</name> - <id>74</id> + <name>ПоследнийЗапускСКартинкойExtendedTooltip</name> + <id>64</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -186,8 +186,8 @@ <segments>Список.ИндексКартинкиРасписания</segments> </dataPath> <extendedTooltip> - <name>РасписаниеРасширеннаяПодсказка</name> - <id>80</id> + <name>РасписаниеExtendedTooltip</name> + <id>68</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -230,8 +230,8 @@ <segments>Список.ПериодичностьРасписания</segments> </dataPath> <extendedTooltip> - <name>ПериодичностьРасписанияРасширеннаяПодсказка</name> - <id>82</id> + <name>ПериодичностьРасписанияExtendedTooltip</name> + <id>69</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -268,8 +268,8 @@ <value>Расписание с картинкой</value> </toolTip> <extendedTooltip> - <name>РасписаниеСКартинкойРасширеннаяПодсказка</name> - <id>79</id> + <name>РасписаниеСКартинкойExtendedTooltip</name> + <id>67</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -296,8 +296,8 @@ <segments>Список.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>84</id> + <name>АвторExtendedTooltip</name> + <id>70</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -332,8 +332,8 @@ <segments>Список.Подготовлена</segments> </dataPath> <extendedTooltip> - <name>ПодготовленаРасширеннаяПодсказка</name> - <id>86</id> + <name>ПодготовленаExtendedTooltip</name> + <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -363,8 +363,8 @@ <segments>Список.Состояние</segments> </dataPath> <extendedTooltip> - <name>СостояниеРасширеннаяПодсказка</name> - <id>88</id> + <name>СостояниеExtendedTooltip</name> + <id>72</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -398,8 +398,8 @@ <segments>Список.Архивировать</segments> </dataPath> <extendedTooltip> - <name>АрхивироватьРасширеннаяПодсказка</name> - <id>90</id> + <name>АрхивироватьExtendedTooltip</name> + <id>73</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -429,8 +429,8 @@ <segments>Список.ТипПолучателейРассылки</segments> </dataPath> <extendedTooltip> - <name>ТипПолучателейРассылкиРасширеннаяПодсказка</name> - <id>92</id> + <name>ТипПолучателейРассылкиExtendedTooltip</name> + <id>74</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -464,8 +464,8 @@ <segments>Список.ВидПочтовогоАдресаПолучателей</segments> </dataPath> <extendedTooltip> - <name>ВидПочтовогоАдресаПолучателейРасширеннаяПодсказка</name> - <id>94</id> + <name>ВидПочтовогоАдресаПолучателейExtendedTooltip</name> + <id>75</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -496,10 +496,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>63</id> + <id>76</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>65</id> + <id>78</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -509,7 +509,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>64</id> + <id>77</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -519,10 +519,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>66</id> + <id>79</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>68</id> + <id>81</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -532,7 +532,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>67</id> + <id>80</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -543,10 +543,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>69</id> + <id>82</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>71</id> + <id>84</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -556,7 +556,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>70</id> + <id>83</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -566,7 +566,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>62</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -590,7 +590,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>СписокКонтекстноеМенюСправочникРассылкиОтчетовВыполнитьСейчасРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюСправочникРассылкиОтчетовВыполнитьСейчасExtendedTooltip</name> <id>60</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -619,7 +619,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>СписокКонтекстноеМенюСправочникРассылкиОтчетовСобытияРассылкиРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюСправочникРассылкиОтчетовСобытияРассылкиExtendedTooltip</name> <id>61</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -692,7 +692,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаИзменитьФормуРасширеннаяПодсказка</name> + <name>ФормаИзменитьФормуExtendedTooltip</name> <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -723,7 +723,7 @@ <value>Группа кнопок</value> </toolTip> <extendedTooltip> - <name>ГруппаКнопокРасширеннаяПодсказка</name> + <name>ГруппаКнопокExtendedTooltip</name> <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -748,7 +748,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>ВыполнитьСейчасРасширеннаяПодсказка</name> + <name>ВыполнитьСейчасExtendedTooltip</name> <id>57</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -777,7 +777,7 @@ <segments>Items.Список.CurrentData.Ref</segments> </dataPath> <extendedTooltip> - <name>СобытияРассылкиРасширеннаяПодсказка</name> + <name>СобытияРассылкиExtendedTooltip</name> <id>58</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -803,7 +803,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -849,6 +849,9 @@ <edit> <common>true</common> </edit> + <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> + <segments>Список.Ref</segments> + </notDefaultUseAlwaysAttributes> <main>true</main> <extInfo xsi:type="form:DynamicListExtInfo"> <queryText>ВЫБРАТЬ diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl index 1d35b0501..e34f5ae70 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаСписка/Module.bsl @@ -53,7 +53,7 @@ &НаКлиенте Процедура Подключаемый_ПроверитьВыполнениеФоновогоЗадания() - РассылкаОтчетовКлиент.ПроверитьВыполнениеФоновогоЗадания(ЭтаФорма); + РассылкаОтчетовКлиент.ПроверитьВыполнениеФоновогоЗадания(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form index 59af234d0..d9b4f90d1 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>701</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -57,8 +57,8 @@ </dataPath> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>ПодготовленаРасширеннаяПодсказка</name> - <id>703</id> + <name>ПодготовленаExtendedTooltip</name> + <id>702</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -92,7 +92,7 @@ <value>Группа рассылка подготовлена</value> </toolTip> <extendedTooltip> - <name>ГруппаРассылкаПодготовленаРасширеннаяПодсказка</name> + <name>ГруппаРассылкаПодготовленаExtendedTooltip</name> <id>700</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -133,8 +133,8 @@ <name>ВидРассылкиПриИзменении</name> </handlers> <extendedTooltip> - <name>ВидРассылкиРасширеннаяПодсказка</name> - <id>706</id> + <name>ВидРассылкиExtendedTooltip</name> + <id>704</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -216,8 +216,8 @@ <segments>Объект.ВидПочтовогоАдресаПолучателей</segments> </dataPath> <extendedTooltip> - <name>ВидПочтовогоАдресаАвтораРасширеннаяПодсказка</name> - <id>710</id> + <name>ВидПочтовогоАдресаАвтораExtendedTooltip</name> + <id>707</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -267,8 +267,8 @@ <value>Виды рассылки личная</value> </toolTip> <extendedTooltip> - <name>ВидыРассылкиЛичнаяРасширеннаяПодсказка</name> - <id>709</id> + <name>ВидыРассылкиЛичнаяExtendedTooltip</name> + <id>706</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -301,8 +301,8 @@ <name>ТипПолучателейРассылкиПриИзменении</name> </handlers> <extendedTooltip> - <name>ТипПолучателейРассылкиРасширеннаяПодсказка</name> - <id>713</id> + <name>ТипПолучателейРассылкиExtendedTooltip</name> + <id>709</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -355,8 +355,8 @@ <value>Виды рассылки для получателей</value> </toolTip> <extendedTooltip> - <name>ВидыРассылкиДляПолучателейРасширеннаяПодсказка</name> - <id>712</id> + <name>ВидыРассылкиДляПолучателейExtendedTooltip</name> + <id>708</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -387,8 +387,8 @@ <horizontalStretch>false</horizontalStretch> <verticalStretch>false</verticalStretch> <extendedTooltip> - <name>ВидыРассылкиРасширеннаяПодсказка</name> - <id>708</id> + <name>ВидыРассылкиExtendedTooltip</name> + <id>705</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -410,8 +410,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация10РасширеннаяПодсказка</name> - <id>715</id> + <name>Декорация10ExtendedTooltip</name> + <id>710</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -446,8 +446,8 @@ <value>Группа вид рассылки</value> </toolTip> <extendedTooltip> - <name>ГруппаВидРассылкиРасширеннаяПодсказка</name> - <id>705</id> + <name>ГруппаВидРассылкиExtendedTooltip</name> + <id>703</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -497,8 +497,8 @@ <segments>Объект.Отчеты.Представление</segments> </dataPath> <extendedTooltip> - <name>ПредставлениеРасширеннаяПодсказка</name> - <id>733</id> + <name>ПредставлениеExtendedTooltip</name> + <id>719</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -542,8 +542,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОтчетыДобавитьОтчетРасширеннаяПодсказка</name> - <id>719</id> + <name>ОтчетыДобавитьОтчетExtendedTooltip</name> + <id>714</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -568,8 +568,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОтчетыДобавитьДополнительныйОтчетРасширеннаяПодсказка</name> - <id>720</id> + <name>ОтчетыДобавитьДополнительныйОтчетExtendedTooltip</name> + <id>715</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -599,8 +599,8 @@ <value>Включить отчет в рассылку</value> </toolTip> <extendedTooltip> - <name>ОтчетыВключитьВРассылкуРасширеннаяПодсказка</name> - <id>718</id> + <name>ОтчетыВключитьВРассылкуExtendedTooltip</name> + <id>713</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -634,8 +634,8 @@ <value>Отчеты группа стандартных действий</value> </toolTip> <extendedTooltip> - <name>ОтчетыГруппаСтандартныхДействийРасширеннаяПодсказка</name> - <id>721</id> + <name>ОтчетыГруппаСтандартныхДействийExtendedTooltip</name> + <id>716</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -656,8 +656,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОтчетыСформироватьОтчетРасширеннаяПодсказка</name> - <id>722</id> + <name>ОтчетыСформироватьОтчетExtendedTooltip</name> + <id>717</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -697,10 +697,10 @@ </handlers> <searchStringAddition> <name>ОтчетыСтрокаПоиска</name> - <id>724</id> + <id>960</id> <extendedTooltip> <name>ОтчетыСтрокаПоискаРасширеннаяПодсказка</name> - <id>726</id> + <id>962</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -710,7 +710,7 @@ </extendedTooltip> <contextMenu> <name>ОтчетыСтрокаПоискаКонтекстноеМеню</name> - <id>725</id> + <id>961</id> <autoFill>true</autoFill> </contextMenu> <source>Отчеты</source> @@ -720,10 +720,10 @@ </searchStringAddition> <viewStatusAddition> <name>ОтчетыСостояниеПросмотра</name> - <id>727</id> + <id>963</id> <extendedTooltip> <name>ОтчетыСостояниеПросмотраРасширеннаяПодсказка</name> - <id>729</id> + <id>965</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -733,7 +733,7 @@ </extendedTooltip> <contextMenu> <name>ОтчетыСостояниеПросмотраКонтекстноеМеню</name> - <id>728</id> + <id>964</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -744,10 +744,10 @@ </viewStatusAddition> <searchControlAddition> <name>ОтчетыУправлениеПоиском</name> - <id>730</id> + <id>966</id> <extendedTooltip> <name>ОтчетыУправлениеПоискомРасширеннаяПодсказка</name> - <id>732</id> + <id>968</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -757,7 +757,7 @@ </extendedTooltip> <contextMenu> <name>ОтчетыУправлениеПоискомКонтекстноеМеню</name> - <id>731</id> + <id>967</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -767,8 +767,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ОтчетыРасширеннаяПодсказка</name> - <id>723</id> + <name>ОтчетыExtendedTooltip</name> + <id>718</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -823,8 +823,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация4РасширеннаяПодсказка</name> - <id>743</id> + <name>Декорация4ExtendedTooltip</name> + <id>720</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -892,8 +892,8 @@ <segments>НастройкиТекущегоОтчета.Использование</segments> </dataPath> <extendedTooltip> - <name>НастройкиТекущегоОтчетаИспользование1РасширеннаяПодсказка</name> - <id>756</id> + <name>НастройкиТекущегоОтчетаИспользование1ExtendedTooltip</name> + <id>724</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -930,8 +930,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>НастройкиТекущегоОтчетаПредставление1РасширеннаяПодсказка</name> - <id>758</id> + <name>НастройкиТекущегоОтчетаПредставление1ExtendedTooltip</name> + <id>725</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -972,8 +972,8 @@ <segments>НастройкиТекущегоОтчета.Значение</segments> </dataPath> <extendedTooltip> - <name>НастройкиТекущегоОтчетаЗначение1РасширеннаяПодсказка</name> - <id>760</id> + <name>НастройкиТекущегоОтчетаЗначение1ExtendedTooltip</name> + <id>726</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1012,10 +1012,10 @@ </autoCommandBar> <searchStringAddition> <name>ПустыеНастройкиСтрокаПоиска</name> - <id>747</id> + <id>978</id> <extendedTooltip> <name>ПустыеНастройкиСтрокаПоискаРасширеннаяПодсказка</name> - <id>749</id> + <id>980</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1025,7 +1025,7 @@ </extendedTooltip> <contextMenu> <name>ПустыеНастройкиСтрокаПоискаКонтекстноеМеню</name> - <id>748</id> + <id>979</id> <autoFill>true</autoFill> </contextMenu> <source>ПустыеНастройки</source> @@ -1035,10 +1035,10 @@ </searchStringAddition> <viewStatusAddition> <name>ПустыеНастройкиСостояниеПросмотра</name> - <id>750</id> + <id>981</id> <extendedTooltip> <name>ПустыеНастройкиСостояниеПросмотраРасширеннаяПодсказка</name> - <id>752</id> + <id>983</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1048,7 +1048,7 @@ </extendedTooltip> <contextMenu> <name>ПустыеНастройкиСостояниеПросмотраКонтекстноеМеню</name> - <id>751</id> + <id>982</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -1059,10 +1059,10 @@ </viewStatusAddition> <searchControlAddition> <name>ПустыеНастройкиУправлениеПоиском</name> - <id>753</id> + <id>984</id> <extendedTooltip> <name>ПустыеНастройкиУправлениеПоискомРасширеннаяПодсказка</name> - <id>755</id> + <id>986</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1072,7 +1072,7 @@ </extendedTooltip> <contextMenu> <name>ПустыеНастройкиУправлениеПоискомКонтекстноеМеню</name> - <id>754</id> + <id>985</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -1082,8 +1082,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ПустыеНастройкиРасширеннаяПодсказка</name> - <id>746</id> + <name>ПустыеНастройкиExtendedTooltip</name> + <id>723</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1140,8 +1140,8 @@ <value>Пустая страница</value> </toolTip> <extendedTooltip> - <name>ПустаяСтраницаРасширеннаяПодсказка</name> - <id>745</id> + <name>ПустаяСтраницаExtendedTooltip</name> + <id>722</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1170,9 +1170,12 @@ <segments>КомпоновщикНастроекКД.UserSettings</segments> </dataPath> <titleLocation>None</titleLocation> + <excludedCommands>Change</excludedCommands> + <excludedCommands>EndEdit</excludedCommands> <excludedCommands>HierarchicalList</excludedCommands> <excludedCommands>List</excludedCommands> <excludedCommands>Tree</excludedCommands> + <excludedCommands>UseFieldAsValue</excludedCommands> <items xsi:type="form:FormField"> <name>КомпоновщикНастроекПользовательскиеНастройкиИспользование</name> <id>581</id> @@ -1186,8 +1189,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиИспользованиеРасширеннаяПодсказка</name> - <id>781</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиИспользованиеExtendedTooltip</name> + <id>729</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1221,8 +1224,8 @@ <segments>КомпоновщикНастроекКД.UserSettings.SettingPicture</segments> </dataPath> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиКартинкаНастройкиРасширеннаяПодсказка</name> - <id>784</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиКартинкаНастройкиExtendedTooltip</name> + <id>731</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1261,8 +1264,8 @@ <segments>КомпоновщикНастроекКД.UserSettings.Setting</segments> </dataPath> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиНастройкаРасширеннаяПодсказка</name> - <id>786</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиНастройкаExtendedTooltip</name> + <id>732</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1298,8 +1301,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиГруппаКолонокРасширеннаяПодсказка</name> - <id>783</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиГруппаКолонокExtendedTooltip</name> + <id>730</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1326,8 +1329,8 @@ <segments>КомпоновщикНастроекКД.UserSettings.ComparisonType</segments> </dataPath> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиВидСравненияРасширеннаяПодсказка</name> - <id>788</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиВидСравненияExtendedTooltip</name> + <id>733</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1369,8 +1372,8 @@ <segments>КомпоновщикНастроекКД.UserSettings.ValuePicture</segments> </dataPath> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиКартинкаЗначенияРасширеннаяПодсказка</name> - <id>791</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиКартинкаЗначенияExtendedTooltip</name> + <id>735</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1410,8 +1413,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиЗначениеРасширеннаяПодсказка</name> - <id>793</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиЗначениеExtendedTooltip</name> + <id>736</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1430,10 +1433,6 @@ <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> <extInfo xsi:type="form:InputFieldExtInfo"> - <handlers> - <event>StartChoice</event> - <name>КомпоновщикНастроекПользовательскиеНастройкиЗначениеНачалоВыбора</name> - </handlers> <width>15</width> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1452,8 +1451,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиГруппаКолонок1РасширеннаяПодсказка</name> - <id>790</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиГруппаКолонок1ExtendedTooltip</name> + <id>734</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1478,8 +1477,8 @@ <segments>КомпоновщикНастроекКД.UserSettings.EditInReportForm</segments> </dataPath> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиРедактированиеВФормеОтчетаРасширеннаяПодсказка</name> - <id>795</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиРедактированиеВФормеОтчетаExtendedTooltip</name> + <id>737</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1501,7 +1500,86 @@ <autoCommandBar> <name>КомпоновщикНастроекПользовательскиеНастройкиКоманднаяПанель</name> <id>189</id> + <items xsi:type="form:Button"> + <name>КомпоновщикНастроекПользовательскиеНастройкиУстановитьФлажки</name> + <id>951</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>КомпоновщикНастроекПользовательскиеНастройкиУстановитьФлажкиРасширеннаяПодсказка</name> + <id>952</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.КомпоновщикНастроекПользовательскиеНастройки.StandardCommand.CheckAll</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>КомпоновщикНастроекПользовательскиеНастройкиСнятьФлажки</name> + <id>953</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>КомпоновщикНастроекПользовательскиеНастройкиСнятьФлажкиРасширеннаяПодсказка</name> + <id>954</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Item.КомпоновщикНастроекПользовательскиеНастройки.StandardCommand.UncheckAll</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <items xsi:type="form:Button"> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета1</name> + <id>945</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета1РасширеннаяПодсказка</name> + <id>946</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.ИспользоватьПолучателяРассылкиВНастройкеОтчета</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <horizontalAlign>Left</horizontalAlign> + <autoFill>true</autoFill> </autoCommandBar> <handlers> <event>OnChange</event> @@ -1509,10 +1587,10 @@ </handlers> <searchStringAddition> <name>КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоиска</name> - <id>772</id> + <id>998</id> <extendedTooltip> <name>КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка</name> - <id>774</id> + <id>1000</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1522,7 +1600,7 @@ </extendedTooltip> <contextMenu> <name>КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню</name> - <id>773</id> + <id>999</id> <autoFill>true</autoFill> </contextMenu> <source>КомпоновщикНастроекПользовательскиеНастройки</source> @@ -1532,10 +1610,10 @@ </searchStringAddition> <viewStatusAddition> <name>КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотра</name> - <id>775</id> + <id>1001</id> <extendedTooltip> <name>КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка</name> - <id>777</id> + <id>1003</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1545,7 +1623,7 @@ </extendedTooltip> <contextMenu> <name>КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню</name> - <id>776</id> + <id>1002</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -1556,10 +1634,10 @@ </viewStatusAddition> <searchControlAddition> <name>КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоиском</name> - <id>778</id> + <id>1004</id> <extendedTooltip> <name>КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка</name> - <id>780</id> + <id>1006</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1569,7 +1647,7 @@ </extendedTooltip> <contextMenu> <name>КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню</name> - <id>779</id> + <id>1005</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -1579,8 +1657,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка</name> - <id>771</id> + <name>КомпоновщикНастроекПользовательскиеНастройкиExtendedTooltip</name> + <id>728</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1591,6 +1669,33 @@ <contextMenu> <name>КомпоновщикНастроекПользовательскиеНастройкиКонтекстноеМеню</name> <id>188</id> + <items xsi:type="form:Button"> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета2</name> + <id>949</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета2РасширеннаяПодсказка</name> + <id>950</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.ИспользоватьПолучателяРассылкиВНастройкеОтчета</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> + <autoFill>true</autoFill> </contextMenu> <representation>HierarchicalList</representation> <changeRowSet>true</changeRowSet> @@ -1632,8 +1737,8 @@ <value>Страница компоновщик</value> </toolTip> <extendedTooltip> - <name>СтраницаКомпоновщикРасширеннаяПодсказка</name> - <id>770</id> + <name>СтраницаКомпоновщикExtendedTooltip</name> + <id>727</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1643,7 +1748,6 @@ </extendedTooltip> <type>Page</type> <extInfo xsi:type="form:PageGroupExtInfo"> - <group>Vertical</group> <showTitle>auto</showTitle> </extInfo> </items> @@ -1672,7 +1776,6 @@ <excludedCommands>Find</excludedCommands> <excludedCommands>MoveDown</excludedCommands> <excludedCommands>MoveUp</excludedCommands> - <excludedCommands>OutputList</excludedCommands> <excludedCommands>SelectAll</excludedCommands> <excludedCommands>SortListAsc</excludedCommands> <excludedCommands>SortListDesc</excludedCommands> @@ -1692,8 +1795,8 @@ <segments>НастройкиТекущегоОтчета.Использование</segments> </dataPath> <extendedTooltip> - <name>НастройкиТекущегоОтчетаИспользованиеРасширеннаяПодсказка</name> - <id>816</id> + <name>НастройкиТекущегоОтчетаИспользованиеExtendedTooltip</name> + <id>740</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1730,8 +1833,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>НастройкиТекущегоОтчетаПредставлениеРасширеннаяПодсказка</name> - <id>818</id> + <name>НастройкиТекущегоОтчетаПредставлениеExtendedTooltip</name> + <id>741</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1776,8 +1879,8 @@ <name>НастройкиТекущегоОтчетаЗначениеПриИзменении</name> </handlers> <extendedTooltip> - <name>НастройкиТекущегоОтчетаЗначениеРасширеннаяПодсказка</name> - <id>820</id> + <name>НастройкиТекущегоОтчетаЗначениеExtendedTooltip</name> + <id>742</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1795,10 +1898,6 @@ <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> <extInfo xsi:type="form:InputFieldExtInfo"> - <handlers> - <event>StartChoice</event> - <name>НастройкиТекущегоОтчетаЗначениеНачалоВыбора</name> - </handlers> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> <wrap>true</wrap> @@ -1816,6 +1915,32 @@ <autoCommandBar> <name>НастройкиТекущегоОтчетаКоманднаяПанель</name> <id>236</id> + <items xsi:type="form:Button"> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета3</name> + <id>943</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета3РасширеннаяПодсказка</name> + <id>944</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.ИспользоватьПолучателяРассылкиВНастройкеОтчета</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> <horizontalAlign>Left</horizontalAlign> </autoCommandBar> <handlers> @@ -1824,10 +1949,10 @@ </handlers> <searchStringAddition> <name>НастройкиТекущегоОтчетаСтрокаПоиска</name> - <id>807</id> + <id>1022</id> <extendedTooltip> <name>НастройкиТекущегоОтчетаСтрокаПоискаРасширеннаяПодсказка</name> - <id>809</id> + <id>1024</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1837,7 +1962,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиТекущегоОтчетаСтрокаПоискаКонтекстноеМеню</name> - <id>808</id> + <id>1023</id> <autoFill>true</autoFill> </contextMenu> <source>НастройкиТекущегоОтчета</source> @@ -1847,10 +1972,10 @@ </searchStringAddition> <viewStatusAddition> <name>НастройкиТекущегоОтчетаСостояниеПросмотра</name> - <id>810</id> + <id>1025</id> <extendedTooltip> <name>НастройкиТекущегоОтчетаСостояниеПросмотраРасширеннаяПодсказка</name> - <id>812</id> + <id>1027</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1860,7 +1985,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиТекущегоОтчетаСостояниеПросмотраКонтекстноеМеню</name> - <id>811</id> + <id>1026</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -1871,10 +1996,10 @@ </viewStatusAddition> <searchControlAddition> <name>НастройкиТекущегоОтчетаУправлениеПоиском</name> - <id>813</id> + <id>1028</id> <extendedTooltip> <name>НастройкиТекущегоОтчетаУправлениеПоискомРасширеннаяПодсказка</name> - <id>815</id> + <id>1030</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1884,7 +2009,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиТекущегоОтчетаУправлениеПоискомКонтекстноеМеню</name> - <id>814</id> + <id>1029</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -1894,8 +2019,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>НастройкиТекущегоОтчетаРасширеннаяПодсказка</name> - <id>806</id> + <name>НастройкиТекущегоОтчетаExtendedTooltip</name> + <id>739</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1906,6 +2031,32 @@ <contextMenu> <name>НастройкиТекущегоОтчетаКонтекстноеМеню</name> <id>235</id> + <items xsi:type="form:Button"> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета4</name> + <id>947</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <extendedTooltip> + <name>ИспользоватьПолучателяРассылкиВНастройкеОтчета4РасширеннаяПодсказка</name> + <id>948</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <commandName>Form.Command.ИспользоватьПолучателяРассылкиВНастройкеОтчета</commandName> + <buttonImportance>Normal</buttonImportance> + <representation>Auto</representation> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <placementArea>UserCmds</placementArea> + <representationInContextMenu>Auto</representationInContextMenu> + </items> </contextMenu> <changeRowSet>true</changeRowSet> <changeRowOrder>true</changeRowOrder> @@ -1952,8 +2103,8 @@ <value>Страница настройки текущего отчета</value> </toolTip> <extendedTooltip> - <name>СтраницаНастройкиТекущегоОтчетаРасширеннаяПодсказка</name> - <id>805</id> + <name>СтраницаНастройкиТекущегоОтчетаExtendedTooltip</name> + <id>738</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1963,7 +2114,6 @@ </extendedTooltip> <type>Page</type> <extInfo xsi:type="form:PageGroupExtInfo"> - <group>Vertical</group> <showTitle>auto</showTitle> </extInfo> </items> @@ -1981,8 +2131,8 @@ <value>Страницы настроек отчета</value> </toolTip> <extendedTooltip> - <name>СтраницыНастроекОтчетаРасширеннаяПодсказка</name> - <id>744</id> + <name>СтраницыНастроекОтчетаExtendedTooltip</name> + <id>721</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2009,8 +2159,8 @@ <value>Отчеты</value> </toolTip> <extendedTooltip> - <name>СтраницаОтчетыРасширеннаяПодсказка</name> - <id>717</id> + <name>СтраницаОтчетыExtendedTooltip</name> + <id>712</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2051,8 +2201,8 @@ <name>ВыполнятьПоРасписаниюПриИзменении</name> </handlers> <extendedTooltip> - <name>ВыполнятьПоРасписаниюРасширеннаяПодсказка</name> - <id>832</id> + <name>ВыполнятьПоРасписаниюExtendedTooltip</name> + <id>745</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2092,8 +2242,8 @@ <name>ПериодичностьРасписанияПриИзменении</name> </handlers> <extendedTooltip> - <name>ПериодичностьРасписанияРасширеннаяПодсказка</name> - <id>835</id> + <name>ПериодичностьРасписанияExtendedTooltip</name> + <id>747</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2114,6 +2264,7 @@ <extInfo xsi:type="form:InputFieldExtInfo"> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> + <horizontalStretch>false</horizontalStretch> <wrap>true</wrap> <choiceListButton>false</choiceListButton> <choiceButton>true</choiceButton> @@ -2146,8 +2297,8 @@ <name>ВремяНачалаПриИзменении</name> </handlers> <extendedTooltip> - <name>ВремяНачалаРасширеннаяПодсказка</name> - <id>839</id> + <name>ВремяНачалаExtendedTooltip</name> + <id>750</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2194,8 +2345,8 @@ <value>Страница время начала</value> </toolTip> <extendedTooltip> - <name>СтраницаВремяНачалаРасширеннаяПодсказка</name> - <id>838</id> + <name>СтраницаВремяНачалаExtendedTooltip</name> + <id>749</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2221,8 +2372,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИзменитьРасписаниеРасширеннаяПодсказка</name> - <id>842</id> + <name>ИзменитьРасписаниеExtendedTooltip</name> + <id>752</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2253,8 +2404,8 @@ <value>Страница изменить расписание</value> </toolTip> <extendedTooltip> - <name>СтраницаИзменитьРасписаниеРасширеннаяПодсказка</name> - <id>841</id> + <name>СтраницаИзменитьРасписаниеExtendedTooltip</name> + <id>751</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2282,8 +2433,8 @@ <value>Страницы время или изменить</value> </toolTip> <extendedTooltip> - <name>СтраницыВремяИлиИзменитьРасширеннаяПодсказка</name> - <id>837</id> + <name>СтраницыВремяИлиИзменитьExtendedTooltip</name> + <id>748</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2305,8 +2456,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация9РасширеннаяПодсказка</name> - <id>843</id> + <name>Декорация9ExtendedTooltip</name> + <id>753</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2336,8 +2487,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗаполнитьРасписаниеПоШаблонуРасширеннаяПодсказка</name> - <id>844</id> + <name>ЗаполнитьРасписаниеПоШаблонуExtendedTooltip</name> + <id>754</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2368,8 +2519,8 @@ <value>Параметры выполнения по расписанию</value> </toolTip> <extendedTooltip> - <name>ПараметрыВыполненияПоРасписаниюРасширеннаяПодсказка</name> - <id>834</id> + <name>ПараметрыВыполненияПоРасписаниюExtendedTooltip</name> + <id>746</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2400,8 +2551,8 @@ <value>Группа периодичность</value> </toolTip> <extendedTooltip> - <name>ГруппаПериодичностьРасширеннаяПодсказка</name> - <id>831</id> + <name>ГруппаПериодичностьExtendedTooltip</name> + <id>744</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2437,8 +2588,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация5РасширеннаяПодсказка</name> - <id>847</id> + <name>Декорация5ExtendedTooltip</name> + <id>757</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2472,8 +2623,8 @@ <value>Страница не выбрано</value> </toolTip> <extendedTooltip> - <name>СтраницаНеВыбраноРасширеннаяПодсказка</name> - <id>846</id> + <name>СтраницаНеВыбраноExtendedTooltip</name> + <id>756</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2509,8 +2660,8 @@ <name>ПериодПовтораДнейПриИзменении</name> </handlers> <extendedTooltip> - <name>ПериодПовтораДнейРасширеннаяПодсказка</name> - <id>850</id> + <name>ПериодПовтораДнейExtendedTooltip</name> + <id>760</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2551,8 +2702,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация6РасширеннаяПодсказка</name> - <id>852</id> + <name>Декорация6ExtendedTooltip</name> + <id>761</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2586,8 +2737,8 @@ <value>Группа строка период повтора дней</value> </toolTip> <extendedTooltip> - <name>ГруппаСтрокаПериодПовтораДнейРасширеннаяПодсказка</name> - <id>849</id> + <name>ГруппаСтрокаПериодПовтораДнейExtendedTooltip</name> + <id>759</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2617,8 +2768,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПредставлениеРасписания1РасширеннаяПодсказка</name> - <id>853</id> + <name>ПредставлениеРасписания1ExtendedTooltip</name> + <id>762</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2662,8 +2813,8 @@ <value>Страница ежедневно</value> </toolTip> <extendedTooltip> - <name>СтраницаЕжедневноРасширеннаяПодсказка</name> - <id>848</id> + <name>СтраницаЕжедневноExtendedTooltip</name> + <id>758</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2700,8 +2851,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>ПонедельникРасширеннаяПодсказка</name> - <id>857</id> + <name>ПонедельникExtendedTooltip</name> + <id>765</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2738,8 +2889,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>ВторникРасширеннаяПодсказка</name> - <id>859</id> + <name>ВторникExtendedTooltip</name> + <id>766</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2776,8 +2927,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>СредаРасширеннаяПодсказка</name> - <id>861</id> + <name>СредаExtendedTooltip</name> + <id>767</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2814,8 +2965,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>ЧетвергРасширеннаяПодсказка</name> - <id>863</id> + <name>ЧетвергExtendedTooltip</name> + <id>768</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2852,8 +3003,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>ПятницаРасширеннаяПодсказка</name> - <id>865</id> + <name>ПятницаExtendedTooltip</name> + <id>769</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2890,8 +3041,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>СубботаРасширеннаяПодсказка</name> - <id>867</id> + <name>СубботаExtendedTooltip</name> + <id>770</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2928,8 +3079,8 @@ <name>ДниНеделиПриИзменении</name> </handlers> <extendedTooltip> - <name>ВоскресеньеРасширеннаяПодсказка</name> - <id>869</id> + <name>ВоскресеньеExtendedTooltip</name> + <id>771</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2963,8 +3114,8 @@ <value>Группа дни недели</value> </toolTip> <extendedTooltip> - <name>ГруппаДниНеделиРасширеннаяПодсказка</name> - <id>856</id> + <name>ГруппаДниНеделиExtendedTooltip</name> + <id>764</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -2994,8 +3145,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПредставлениеРасписания2РасширеннаяПодсказка</name> - <id>871</id> + <name>ПредставлениеРасписания2ExtendedTooltip</name> + <id>772</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3039,8 +3190,8 @@ <value>Страница еженедельно</value> </toolTip> <extendedTooltip> - <name>СтраницаЕженедельноРасширеннаяПодсказка</name> - <id>855</id> + <name>СтраницаЕженедельноExtendedTooltip</name> + <id>763</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3073,8 +3224,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация1РасширеннаяПодсказка</name> - <id>875</id> + <name>Декорация1ExtendedTooltip</name> + <id>775</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3111,8 +3262,8 @@ <name>ДеньМесяцаПриИзменении</name> </handlers> <extendedTooltip> - <name>ДеньВМесяцеРасширеннаяПодсказка</name> - <id>876</id> + <name>ДеньВМесяцеExtendedTooltip</name> + <id>776</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3153,8 +3304,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация7РасширеннаяПодсказка</name> - <id>878</id> + <name>Декорация7ExtendedTooltip</name> + <id>777</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3187,8 +3338,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГиперссылкаНачалоКонецМесяцаРасширеннаяПодсказка</name> - <id>879</id> + <name>ГиперссылкаНачалоКонецМесяцаExtendedTooltip</name> + <id>778</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3226,8 +3377,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация8РасширеннаяПодсказка</name> - <id>880</id> + <name>Декорация8ExtendedTooltip</name> + <id>779</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3261,8 +3412,8 @@ <value>Группа строка ежемесячных параметров</value> </toolTip> <extendedTooltip> - <name>ГруппаСтрокаЕжемесячныхПараметровРасширеннаяПодсказка</name> - <id>874</id> + <name>ГруппаСтрокаЕжемесячныхПараметровExtendedTooltip</name> + <id>774</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3302,8 +3453,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ЯнварьРасширеннаяПодсказка</name> - <id>883</id> + <name>ЯнварьExtendedTooltip</name> + <id>782</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3340,8 +3491,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ФевральРасширеннаяПодсказка</name> - <id>885</id> + <name>ФевральExtendedTooltip</name> + <id>783</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3378,8 +3529,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>МартРасширеннаяПодсказка</name> - <id>887</id> + <name>МартExtendedTooltip</name> + <id>784</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3413,8 +3564,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаКвартал1РасширеннаяПодсказка</name> - <id>882</id> + <name>ГруппаКвартал1ExtendedTooltip</name> + <id>781</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3453,8 +3604,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>АпрельРасширеннаяПодсказка</name> - <id>890</id> + <name>АпрельExtendedTooltip</name> + <id>786</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3491,8 +3642,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>МайРасширеннаяПодсказка</name> - <id>892</id> + <name>МайExtendedTooltip</name> + <id>787</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3529,8 +3680,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ИюньРасширеннаяПодсказка</name> - <id>894</id> + <name>ИюньExtendedTooltip</name> + <id>788</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3564,8 +3715,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаКвартал2РасширеннаяПодсказка</name> - <id>889</id> + <name>ГруппаКвартал2ExtendedTooltip</name> + <id>785</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3596,8 +3747,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УстановитьПометкиРасширеннаяПодсказка</name> - <id>897</id> + <name>УстановитьПометкиExtendedTooltip</name> + <id>790</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3628,8 +3779,8 @@ <value>Установить пометки</value> </toolTip> <extendedTooltip> - <name>ГруппаУстановитьПометкиРасширеннаяПодсказка</name> - <id>896</id> + <name>ГруппаУстановитьПометкиExtendedTooltip</name> + <id>789</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3663,8 +3814,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаМесяцы1РасширеннаяПодсказка</name> - <id>881</id> + <name>ГруппаМесяцы1ExtendedTooltip</name> + <id>780</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3704,8 +3855,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ИюльРасширеннаяПодсказка</name> - <id>900</id> + <name>ИюльExtendedTooltip</name> + <id>793</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3742,8 +3893,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>АвгустРасширеннаяПодсказка</name> - <id>902</id> + <name>АвгустExtendedTooltip</name> + <id>794</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3780,8 +3931,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>СентябрьРасширеннаяПодсказка</name> - <id>904</id> + <name>СентябрьExtendedTooltip</name> + <id>795</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3815,8 +3966,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаКвартал3РасширеннаяПодсказка</name> - <id>899</id> + <name>ГруппаКвартал3ExtendedTooltip</name> + <id>792</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3855,8 +4006,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ОктябрьРасширеннаяПодсказка</name> - <id>907</id> + <name>ОктябрьExtendedTooltip</name> + <id>797</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3893,8 +4044,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>НоябрьРасширеннаяПодсказка</name> - <id>909</id> + <name>НоябрьExtendedTooltip</name> + <id>798</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3931,8 +4082,8 @@ <name>МесяцыПриИзменении</name> </handlers> <extendedTooltip> - <name>ДекабрьРасширеннаяПодсказка</name> - <id>911</id> + <name>ДекабрьExtendedTooltip</name> + <id>799</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3966,8 +4117,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаКвартал4РасширеннаяПодсказка</name> - <id>906</id> + <name>ГруппаКвартал4ExtendedTooltip</name> + <id>796</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -3998,8 +4149,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СнятьПометкиРасширеннаяПодсказка</name> - <id>914</id> + <name>СнятьПометкиExtendedTooltip</name> + <id>801</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4030,8 +4181,8 @@ <value>Снять пометки</value> </toolTip> <extendedTooltip> - <name>ГруппаСнятьПометкиРасширеннаяПодсказка</name> - <id>913</id> + <name>ГруппаСнятьПометкиExtendedTooltip</name> + <id>800</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4065,8 +4216,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ГруппаМесяцы2РасширеннаяПодсказка</name> - <id>898</id> + <name>ГруппаМесяцы2ExtendedTooltip</name> + <id>791</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4096,8 +4247,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПредставлениеРасписания4РасширеннаяПодсказка</name> - <id>915</id> + <name>ПредставлениеРасписания4ExtendedTooltip</name> + <id>802</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4141,8 +4292,8 @@ <value>Страница ежемесячно</value> </toolTip> <extendedTooltip> - <name>СтраницаЕжемесячноРасширеннаяПодсказка</name> - <id>873</id> + <name>СтраницаЕжемесячноExtendedTooltip</name> + <id>773</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4172,8 +4323,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПредставлениеРасписания3РасширеннаяПодсказка</name> - <id>918</id> + <name>ПредставлениеРасписания3ExtendedTooltip</name> + <id>804</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4217,8 +4368,8 @@ <value>Страница произвольное</value> </toolTip> <extendedTooltip> - <name>СтраницаПроизвольноеРасширеннаяПодсказка</name> - <id>917</id> + <name>СтраницаПроизвольноеExtendedTooltip</name> + <id>803</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4246,8 +4397,8 @@ <value>Страницы периодичности</value> </toolTip> <extendedTooltip> - <name>СтраницыПериодичностиРасширеннаяПодсказка</name> - <id>845</id> + <name>СтраницыПериодичностиExtendedTooltip</name> + <id>755</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4279,8 +4430,8 @@ <name>АвторПриИзменении</name> </handlers> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>921</id> + <name>АвторExtendedTooltip</name> + <id>806</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4323,8 +4474,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>РасшифровкаАвтораРасширеннаяПодсказка</name> - <id>923</id> + <name>РасшифровкаАвтораExtendedTooltip</name> + <id>807</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4364,8 +4515,8 @@ <value>Группа автор</value> </toolTip> <extendedTooltip> - <name>ГруппаАвторРасширеннаяПодсказка</name> - <id>920</id> + <name>ГруппаАвторExtendedTooltip</name> + <id>805</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4396,8 +4547,8 @@ <value>Страница расписание</value> </toolTip> <extendedTooltip> - <name>СтраницаРасписаниеРасширеннаяПодсказка</name> - <id>830</id> + <name>СтраницаРасписаниеExtendedTooltip</name> + <id>743</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4434,8 +4585,8 @@ <name>ПубликоватьПриИзменении</name> </handlers> <extendedTooltip> - <name>ПубликоватьРасширеннаяПодсказка</name> - <id>926</id> + <name>ПубликоватьExtendedTooltip</name> + <id>810</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4472,8 +4623,8 @@ <name>ДругойСпособДоставкиПриИзменении</name> </handlers> <extendedTooltip> - <name>ДругойСпособДоставкиРасширеннаяПодсказка</name> - <id>928</id> + <name>ДругойСпособДоставкиExtendedTooltip</name> + <id>811</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4553,8 +4704,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПапкаРасширеннаяПодсказка</name> - <id>932</id> + <name>ПапкаExtendedTooltip</name> + <id>814</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4606,8 +4757,8 @@ <value>Использовать папку</value> </toolTip> <extendedTooltip> - <name>ИспользоватьПапкуРасширеннаяПодсказка</name> - <id>931</id> + <name>ИспользоватьПапкуExtendedTooltip</name> + <id>813</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4643,8 +4794,8 @@ <name>СетевойКаталогWindowsПриИзменении</name> </handlers> <extendedTooltip> - <name>СетевойКаталогWindowsРасширеннаяПодсказка</name> - <id>935</id> + <name>СетевойКаталогWindowsExtendedTooltip</name> + <id>816</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4699,8 +4850,8 @@ <name>СетевойКаталогLinuxПриИзменении</name> </handlers> <extendedTooltip> - <name>СетевойКаталогLinuxРасширеннаяПодсказка</name> - <id>937</id> + <name>СетевойКаталогLinuxExtendedTooltip</name> + <id>817</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4749,8 +4900,8 @@ <value>Использовать сетевой каталог</value> </toolTip> <extendedTooltip> - <name>ИспользоватьСетевойКаталогРасширеннаяПодсказка</name> - <id>934</id> + <name>ИспользоватьСетевойКаталогExtendedTooltip</name> + <id>815</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4779,8 +4930,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>FTPСерверИКаталогРасширеннаяПодсказка</name> - <id>940</id> + <name>FTPСерверИКаталогExtendedTooltip</name> + <id>819</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4844,8 +4995,8 @@ <value> </value> </toolTip> <extendedTooltip> - <name>ИспользоватьFTPРесурсРасширеннаяПодсказка</name> - <id>939</id> + <name>ИспользоватьFTPРесурсExtendedTooltip</name> + <id>818</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4872,8 +5023,8 @@ <value>Параметры доставки</value> </toolTip> <extendedTooltip> - <name>ПараметрыДоставкиРасширеннаяПодсказка</name> - <id>930</id> + <name>ПараметрыДоставкиExtendedTooltip</name> + <id>812</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4895,8 +5046,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПроверитьПубликациюРасширеннаяПодсказка</name> - <id>942</id> + <name>ПроверитьПубликациюExtendedTooltip</name> + <id>820</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4927,8 +5078,8 @@ <value>Другие способы доставки</value> </toolTip> <extendedTooltip> - <name>ДругиеСпособыДоставкиРасширеннаяПодсказка</name> - <id>925</id> + <name>ДругиеСпособыДоставкиExtendedTooltip</name> + <id>809</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -4968,8 +5119,8 @@ <name>ИспользоватьЭлектроннуюПочтуПриИзменении</name> </handlers> <extendedTooltip> - <name>ИспользоватьЭлектроннуюПочтуРасширеннаяПодсказка</name> - <id>945</id> + <name>ИспользоватьЭлектроннуюПочтуExtendedTooltip</name> + <id>823</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5012,8 +5163,8 @@ <name>ТолькоУведомитьПриИзменении</name> </handlers> <extendedTooltip> - <name>ТолькоУведомитьРасширеннаяПодсказка</name> - <id>949</id> + <name>ТолькоУведомитьExtendedTooltip</name> + <id>826</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5048,8 +5199,8 @@ <value>Только уведомления показать</value> </toolTip> <extendedTooltip> - <name>ТолькоУведомленияПоказатьРасширеннаяПодсказка</name> - <id>948</id> + <name>ТолькоУведомленияПоказатьExtendedTooltip</name> + <id>825</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5075,8 +5226,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация3РасширеннаяПодсказка</name> - <id>952</id> + <name>Декорация3ExtendedTooltip</name> + <id>828</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5110,8 +5261,8 @@ <value>Только уведомления скрыть</value> </toolTip> <extendedTooltip> - <name>ТолькоУведомленияСкрытьРасширеннаяПодсказка</name> - <id>951</id> + <name>ТолькоУведомленияСкрытьExtendedTooltip</name> + <id>827</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5139,8 +5290,8 @@ <value>Только уведомления</value> </toolTip> <extendedTooltip> - <name>ТолькоУведомленияРасширеннаяПодсказка</name> - <id>947</id> + <name>ТолькоУведомленияExtendedTooltip</name> + <id>824</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5167,8 +5318,8 @@ <value>Группа использовать электронную почту</value> </toolTip> <extendedTooltip> - <name>ГруппаИспользоватьЭлектроннуюПочтуРасширеннаяПодсказка</name> - <id>944</id> + <name>ГруппаИспользоватьЭлектроннуюПочтуExtendedTooltip</name> + <id>822</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5200,8 +5351,8 @@ <segments>Объект.УчетнаяЗапись</segments> </dataPath> <extendedTooltip> - <name>УчетнаяЗаписьРасширеннаяПодсказка</name> - <id>954</id> + <name>УчетнаяЗаписьExtendedTooltip</name> + <id>830</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5244,8 +5395,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПроверитьЭлектроннуюПочтуРасширеннаяПодсказка</name> - <id>956</id> + <name>ПроверитьЭлектроннуюПочтуExtendedTooltip</name> + <id>831</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5276,8 +5427,8 @@ <value>Группа учетная запись</value> </toolTip> <extendedTooltip> - <name>ГруппаУчетнаяЗаписьРасширеннаяПодсказка</name> - <id>953</id> + <name>ГруппаУчетнаяЗаписьExtendedTooltip</name> + <id>829</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5312,8 +5463,8 @@ <segments>Объект.ТемаПисьма</segments> </dataPath> <extendedTooltip> - <name>ТемаПисьмаРасширеннаяПодсказка</name> - <id>967</id> + <name>ТемаПисьмаExtendedTooltip</name> + <id>842</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5336,8 +5487,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка</name> - <id>960</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip</name> + <id>835</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5362,8 +5513,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонАвтораРасширеннаяПодсказка</name> - <id>961</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонАвтораExtendedTooltip</name> + <id>836</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5388,8 +5539,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонПолучателяРасширеннаяПодсказка</name> - <id>962</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонПолучателяExtendedTooltip</name> + <id>837</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5414,8 +5565,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонРассылкиРасширеннаяПодсказка</name> - <id>963</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонРассылкиExtendedTooltip</name> + <id>838</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5440,8 +5591,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонСистемыРасширеннаяПодсказка</name> - <id>964</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонСистемыExtendedTooltip</name> + <id>839</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5458,7 +5609,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ТемаПисьмаКонтекстноеМенюВосстановитьШаблонПоУмолчанию</name> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонПоУмолчанию</name> <id>671</id> <visible>true</visible> <enabled>true</enabled> @@ -5466,8 +5617,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюВосстановитьШаблонПоУмолчаниюРасширеннаяПодсказка</name> - <id>965</id> + <name>ТемаПисьмаКонтекстноеМенюДобавитьШаблонПоУмолчаниюРасширеннаяПодсказка</name> + <id>840</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5492,8 +5643,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТемаПисьмаКонтекстноеМенюПредпросмотрШаблонаРасширеннаяПодсказка</name> - <id>966</id> + <name>ТемаПисьмаКонтекстноеМенюПредпросмотрШаблонаExtendedTooltip</name> + <id>841</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -5519,8 +5670,8 @@ <value>Параметр</value> - ТемаПисьмаКонтекстноеМенюПодменюПараметрРасширеннаяПодсказка - 959 + ТемаПисьмаКонтекстноеМенюПодменюПараметрExtendedTooltip + 834 Label true true @@ -5575,8 +5726,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка - 973 + ТекстПисьмаФорматированныйДокументДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip + 847 Label true true @@ -5601,8 +5752,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонАвтораРасширеннаяПодсказка - 974 + ТекстПисьмаФорматированныйДокументДобавитьШаблонАвтораExtendedTooltip + 848 Label true true @@ -5627,8 +5778,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонПолучателяРасширеннаяПодсказка - 975 + ТекстПисьмаФорматированныйДокументДобавитьШаблонПолучателяExtendedTooltip + 849 Label true true @@ -5653,8 +5804,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонРассылкиРасширеннаяПодсказка - 976 + ТекстПисьмаФорматированныйДокументДобавитьШаблонРассылкиExtendedTooltip + 850 Label true true @@ -5679,8 +5830,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонСформированныхОтчетовРасширеннаяПодсказка - 977 + ТекстПисьмаФорматированныйДокументДобавитьШаблонСформированныхОтчетовExtendedTooltip + 851 Label true true @@ -5705,8 +5856,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонСистемыРасширеннаяПодсказка - 978 + ТекстПисьмаФорматированныйДокументДобавитьШаблонСистемыExtendedTooltip + 852 Label true true @@ -5731,8 +5882,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонСпособаДоставкиРасширеннаяПодсказка - 979 + ТекстПисьмаФорматированныйДокументДобавитьШаблонСпособаДоставкиExtendedTooltip + 853 Label true true @@ -5757,8 +5908,8 @@ true - ТекстПисьмаФорматированныйДокументДобавитьШаблонПоУмолчаниюРасширеннаяПодсказка - 980 + ТекстПисьмаФорматированныйДокументДобавитьШаблонПоУмолчаниюExtendedTooltip + 854 Label true true @@ -5783,8 +5934,8 @@ true - ТекстПисьмаФорматированныйДокументПредпросмотрШаблонаРасширеннаяПодсказка - 981 + ТекстПисьмаФорматированныйДокументПредпросмотрШаблонаExtendedTooltip + 855 Label true true @@ -5814,8 +5965,8 @@ Добавить параметр в текст письма - ТекстПисьмаФорматированныйДокументДобавитьПараметрШаблонаРасширеннаяПодсказка - 972 + ТекстПисьмаФорматированныйДокументДобавитьПараметрШаблонаExtendedTooltip + 846 Label true true @@ -5844,8 +5995,8 @@ true - ИзменитьТипТекстаНаHTMLПометкаРасширеннаяПодсказка - 983 + ИзменитьТипТекстаНаHTMLПометкаExtendedTooltip + 857 Label true true @@ -5871,8 +6022,8 @@ true - ИзменитьТипТекстаНаОбычныйРасширеннаяПодсказка - 984 + ИзменитьТипТекстаНаОбычныйExtendedTooltip + 858 Label true true @@ -5902,8 +6053,8 @@ Сменить формат письма - HTMLРасширеннаяПодсказка - 982 + HTMLExtendedTooltip + 856 Label true true @@ -5926,8 +6077,8 @@ true - ТекстПисьмаФорматированныйДокументКартинкаРасширеннаяПодсказка - 985 + ТекстПисьмаФорматированныйДокументКартинкаExtendedTooltip + 859 Label true true @@ -5956,8 +6107,8 @@ true - ТекстПисьмаФорматированныйДокументВыровнятьВлевоРасширеннаяПодсказка - 987 + ТекстПисьмаФорматированныйДокументВыровнятьВлевоExtendedTooltip + 861 Label true true @@ -5983,8 +6134,8 @@ true - ТекстПисьмаФорматированныйДокументВыровнятьПоЦентруРасширеннаяПодсказка - 988 + ТекстПисьмаФорматированныйДокументВыровнятьПоЦентруExtendedTooltip + 862 Label true true @@ -6010,8 +6161,8 @@ true - ТекстПисьмаФорматированныйДокументВыровнятьВправоРасширеннаяПодсказка - 989 + ТекстПисьмаФорматированныйДокументВыровнятьВправоExtendedTooltip + 863 Label true true @@ -6037,8 +6188,8 @@ true - ТекстПисьмаФорматированныйДокументВыровнятьПоШиринеРасширеннаяПодсказка - 990 + ТекстПисьмаФорматированныйДокументВыровнятьПоШиринеExtendedTooltip + 864 Label true true @@ -6064,8 +6215,8 @@ true - ТекстПисьмаФорматированныйДокументУвеличитьОтступРасширеннаяПодсказка - 991 + ТекстПисьмаФорматированныйДокументУвеличитьОтступExtendedTooltip + 865 Label true true @@ -6091,8 +6242,8 @@ true - ТекстПисьмаФорматированныйДокументУменьшитьОтступРасширеннаяПодсказка - 992 + ТекстПисьмаФорматированныйДокументУменьшитьОтступExtendedTooltip + 866 Label true true @@ -6123,8 +6274,8 @@ Стандартные действия - СтандартныеДействияРасширеннаяПодсказка - 986 + СтандартныеДействияExtendedTooltip + 860 Label true true @@ -6150,8 +6301,8 @@ Командная панель текст письма форматированный документ - КоманднаяПанельТекстПисьмаФорматированныйДокументРасширеннаяПодсказка - 971 + КоманднаяПанельТекстПисьмаФорматированныйДокументExtendedTooltip + 845 Label true true @@ -6177,8 +6328,8 @@ None - ТекстПисьмаФорматированныйДокументРасширеннаяПодсказка - 1003 + ТекстПисьмаФорматированныйДокументExtendedTooltip + 877 Label true true @@ -6201,8 +6352,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка - 994 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip + 868 Label true true @@ -6227,8 +6378,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонАвтораРасширеннаяПодсказка - 995 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонАвтораExtendedTooltip + 869 Label true true @@ -6253,8 +6404,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонПолучателяРасширеннаяПодсказка - 996 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонПолучателяExtendedTooltip + 870 Label true true @@ -6279,8 +6430,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонРассылкиРасширеннаяПодсказка - 997 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонРассылкиExtendedTooltip + 871 Label true true @@ -6305,8 +6456,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСформированныхОтчетовРасширеннаяПодсказка - 998 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСформированныхОтчетовExtendedTooltip + 872 Label true true @@ -6331,8 +6482,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСистемыРасширеннаяПодсказка - 999 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСистемыExtendedTooltip + 873 Label true true @@ -6357,8 +6508,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСпособаДоставкиРасширеннаяПодсказка - 1000 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонСпособаДоставкиExtendedTooltip + 874 Label true true @@ -6383,8 +6534,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонПоУмолчаниюРасширеннаяПодсказка - 1001 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюДобавитьШаблонПоУмолчаниюExtendedTooltip + 875 Label true true @@ -6409,8 +6560,8 @@ true - ТекстПисьмаФорматированныйДокументКонтекстноеМенюПредпросмотрШаблонаРасширеннаяПодсказка - 1002 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюПредпросмотрШаблонаExtendedTooltip + 876 Label true true @@ -6436,8 +6587,8 @@ Параметр - ТекстПисьмаФорматированныйДокументКонтекстноеМенюПодменюПараметрРасширеннаяПодсказка - 993 + ТекстПисьмаФорматированныйДокументКонтекстноеМенюПодменюПараметрExtendedTooltip + 867 Label true true @@ -6484,8 +6635,8 @@ Страницы текст письма HTML - СтраницыТекстПисьмаHTMLРасширеннаяПодсказка - 970 + СтраницыТекстПисьмаHTMLExtendedTooltip + 844 Label true true @@ -6517,8 +6668,8 @@ true - ДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка - 1008 + ДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip + 881 Label true true @@ -6543,8 +6694,8 @@ true - ДобавитьШаблонАвтораРасширеннаяПодсказка - 1009 + ДобавитьШаблонАвтораExtendedTooltip + 882 Label true true @@ -6569,8 +6720,8 @@ true - ДобавитьШаблонПолучателяРасширеннаяПодсказка - 1010 + ДобавитьШаблонПолучателяExtendedTooltip + 883 Label true true @@ -6595,8 +6746,8 @@ true - ДобавитьШаблонРассылкиРасширеннаяПодсказка - 1011 + ДобавитьШаблонРассылкиExtendedTooltip + 884 Label true true @@ -6621,8 +6772,8 @@ true - ДобавитьШаблонСформированныхОтчетовРасширеннаяПодсказка - 1012 + ДобавитьШаблонСформированныхОтчетовExtendedTooltip + 885 Label true true @@ -6647,8 +6798,8 @@ true - ДобавитьШаблонСистемыРасширеннаяПодсказка - 1013 + ДобавитьШаблонСистемыExtendedTooltip + 886 Label true true @@ -6673,8 +6824,8 @@ true - ДобавитьШаблонСпособаДоставкиРасширеннаяПодсказка - 1014 + ДобавитьШаблонСпособаДоставкиExtendedTooltip + 887 Label true true @@ -6699,8 +6850,8 @@ true - ДобавитьШаблонПоУмолчаниюРасширеннаяПодсказка - 1015 + ДобавитьШаблонПоУмолчаниюExtendedTooltip + 888 Label true true @@ -6725,8 +6876,8 @@ true - ПредпросмотрШаблонаРасширеннаяПодсказка - 1016 + ПредпросмотрШаблонаExtendedTooltip + 889 Label true true @@ -6756,8 +6907,8 @@ Добавить параметр шаблона - ТекстПисьмаДобавитьПараметрШаблонаРасширеннаяПодсказка - 1007 + ТекстПисьмаДобавитьПараметрШаблонаExtendedTooltip + 880 Label true true @@ -6786,8 +6937,8 @@ true - ИзменитьТипТекстаНаHTMLРасширеннаяПодсказка - 1018 + ИзменитьТипТекстаНаHTMLExtendedTooltip + 891 Label true true @@ -6812,8 +6963,8 @@ true - ИзменитьТипТекстаНаОбычныйПометкаРасширеннаяПодсказка - 1019 + ИзменитьТипТекстаНаОбычныйПометкаExtendedTooltip + 892 Label true true @@ -6844,8 +6995,8 @@ Сменить формат письма - ОбычныйТекстРасширеннаяПодсказка - 1017 + ОбычныйТекстExtendedTooltip + 890 Label true true @@ -6873,8 +7024,8 @@ Командная панель текст письма - КоманднаяПанельТекстПисьмаРасширеннаяПодсказка - 1006 + КоманднаяПанельТекстПисьмаExtendedTooltip + 879 Label true true @@ -6900,8 +7051,8 @@ None - ТекстПисьмаРасширеннаяПодсказка - 1030 + ТекстПисьмаExtendedTooltip + 903 Label true true @@ -6924,8 +7075,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка - 1021 + ТекстПисьмаКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip + 894 Label true true @@ -6950,8 +7101,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонАвтораРасширеннаяПодсказка - 1022 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонАвтораExtendedTooltip + 895 Label true true @@ -6976,8 +7127,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонПолучателяРасширеннаяПодсказка - 1023 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонПолучателяExtendedTooltip + 896 Label true true @@ -7002,8 +7153,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонРассылкиРасширеннаяПодсказка - 1024 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонРассылкиExtendedTooltip + 897 Label true true @@ -7028,8 +7179,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонСформированныхОтчетовРасширеннаяПодсказка - 1025 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонСформированныхОтчетовExtendedTooltip + 898 Label true true @@ -7054,8 +7205,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонСистемыРасширеннаяПодсказка - 1026 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонСистемыExtendedTooltip + 899 Label true true @@ -7080,8 +7231,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонСпособаДоставкиРасширеннаяПодсказка - 1027 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонСпособаДоставкиExtendedTooltip + 900 Label true true @@ -7106,8 +7257,8 @@ true - ТекстПисьмаКонтекстноеМенюДобавитьШаблонПоУмолчаниюРасширеннаяПодсказка - 1028 + ТекстПисьмаКонтекстноеМенюДобавитьШаблонПоУмолчаниюExtendedTooltip + 901 Label true true @@ -7132,8 +7283,8 @@ true - ТекстПисьмаКонтекстноеМенюПредпросмотрШаблонаРасширеннаяПодсказка - 1029 + ТекстПисьмаКонтекстноеМенюПредпросмотрШаблонаExtendedTooltip + 902 Label true true @@ -7159,8 +7310,8 @@ Параметр - ТекстПисьмаКонтекстноеМенюПодменюПараметрРасширеннаяПодсказка - 1020 + ТекстПисьмаКонтекстноеМенюПодменюПараметрExtendedTooltip + 893 Label true true @@ -7207,8 +7358,8 @@ Страницы текст письма обычный текст - СтраницыТекстПисьмаОбычныйТекстРасширеннаяПодсказка - 1005 + СтраницыТекстПисьмаОбычныйТекстExtendedTooltip + 878 Label true true @@ -7236,8 +7387,8 @@ Страницы текст письма - СтраницыТекстПисьмаРасширеннаяПодсказка - 969 + СтраницыТекстПисьмаExtendedTooltip + 843 Label true true @@ -7264,8 +7415,8 @@ Тема и текст письма - ТемаИТекстПисьмаРасширеннаяПодсказка - 958 + ТемаИТекстПисьмаExtendedTooltip + 833 Label true true @@ -7298,8 +7449,8 @@ Объект.ВидПочтовогоАдресаПолучателей - ВидПочтовогоАдресаПолучателейРасширеннаяПодсказка - 1033 + ВидПочтовогоАдресаПолучателейExtendedTooltip + 905 Label true true @@ -7326,8 +7477,6 @@ true true true - false - true Items true true @@ -7380,8 +7529,8 @@ Объект.Получатели.Получатель - ПолучателиПолучательРасширеннаяПодсказка - 1051 + ПолучателиПолучательExtendedTooltip + 913 Label true true @@ -7425,8 +7574,8 @@ Объект.Получатели.Исключен - ПолучателиИсключенРасширеннаяПодсказка - 1053 + ПолучателиИсключенExtendedTooltip + 914 Label true true @@ -7457,8 +7606,8 @@ true - ПолучателиПодобратьРасширеннаяПодсказка - 1035 + ПолучателиПодобратьExtendedTooltip + 906 Label true true @@ -7483,8 +7632,8 @@ true - ПолучателиУдалитьРасширеннаяПодсказка - 1036 + ПолучателиУдалитьExtendedTooltip + 907 Label true true @@ -7509,8 +7658,8 @@ true - ПолучателиПереместитьВверхРасширеннаяПодсказка - 1037 + ПолучателиПереместитьВверхExtendedTooltip + 908 Label true true @@ -7535,8 +7684,8 @@ true - ПолучателиПереместитьВнизРасширеннаяПодсказка - 1038 + ПолучателиПереместитьВнизExtendedTooltip + 909 Label true true @@ -7561,8 +7710,8 @@ true - ПолучателиСортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 1039 + ПолучателиСортироватьСписокПоВозрастаниюExtendedTooltip + 910 Label true true @@ -7588,8 +7737,8 @@ true - ПолучателиСортироватьСписокПоУбываниюРасширеннаяПодсказка - 1040 + ПолучателиСортироватьСписокПоУбываниюExtendedTooltip + 911 Label true true @@ -7622,10 +7771,10 @@ ПолучателиСтрокаПоиска - 1042 + 1084 ПолучателиСтрокаПоискаРасширеннаяПодсказка - 1044 + 1086 Label true true @@ -7635,7 +7784,7 @@ ПолучателиСтрокаПоискаКонтекстноеМеню - 1043 + 1085 true Получатели @@ -7645,10 +7794,10 @@ ПолучателиСостояниеПросмотра - 1045 + 1087 ПолучателиСостояниеПросмотраРасширеннаяПодсказка - 1047 + 1089 Label true true @@ -7658,7 +7807,7 @@ ПолучателиСостояниеПросмотраКонтекстноеМеню - 1046 + 1088 true ViewStatusAddition @@ -7669,10 +7818,10 @@ ПолучателиУправлениеПоиском - 1048 + 1090 ПолучателиУправлениеПоискомРасширеннаяПодсказка - 1050 + 1092 Label true true @@ -7682,7 +7831,7 @@ ПолучателиУправлениеПоискомКонтекстноеМеню - 1049 + 1091 true SearchControlAddition @@ -7692,8 +7841,8 @@ - ПолучателиРасширеннаяПодсказка - 1041 + ПолучателиExtendedTooltip + 912 Label true true @@ -7738,16 +7887,16 @@ <key>ru</key> - <value>Настройка получателей</value> + <value>Получатели</value> ru - Настройка получателей + 20 - НастройкаПолучателейРасширеннаяПодсказка - 1032 + НастройкаПолучателейExtendedTooltip + 904 Label true true @@ -7759,8 +7908,10 @@ Vertical Auto + WeakSeparation true true + auto Auto Auto @@ -7779,8 +7930,8 @@ Параметры письма - ПараметрыПисьмаРасширеннаяПодсказка - 957 + ПараметрыПисьмаExtendedTooltip + 832 Label true true @@ -7811,8 +7962,8 @@ Доставка по электронной почте - ДоставкаПоЭлектроннойПочтеРасширеннаяПодсказка - 943 + ДоставкаПоЭлектроннойПочтеExtendedTooltip + 821 Label true true @@ -7845,8 +7996,8 @@ Страница доставка - СтраницаДоставкаРасширеннаяПодсказка - 924 + СтраницаДоставкаExtendedTooltip + 808 Label true true @@ -7875,8 +8026,8 @@ ФорматыПоУмолчанию - ФорматыПоУмолчаниюРасширеннаяПодсказка - 1064 + ФорматыПоУмолчаниюExtendedTooltip + 916 Label true true @@ -7955,8 +8106,8 @@ Объект.Отчеты.Представление - ФорматыОтчетовОтчетРасширеннаяПодсказка - 1081 + ФорматыОтчетовОтчетExtendedTooltip + 923 Label true true @@ -7997,8 +8148,8 @@ Объект.Отчеты.Форматы - ФорматыОтчетовФорматыРасширеннаяПодсказка - 1083 + ФорматыОтчетовФорматыExtendedTooltip + 924 Label true true @@ -8048,8 +8199,8 @@ Объект.Отчеты.ОтправлятьЕслиПустой - ФорматыОтчетовОтправлятьЕслиПустойРасширеннаяПодсказка - 1085 + ФорматыОтчетовОтправлятьЕслиПустойExtendedTooltip + 925 Label true true @@ -8080,8 +8231,8 @@ true - ФорматыОтчетовУстановитьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1069 + ФорматыОтчетовУстановитьПометкиОтправлятьЕслиПустойExtendedTooltip + 920 Label true true @@ -8105,8 +8256,8 @@ true - ФорматыОтчетовСнятьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1070 + ФорматыОтчетовСнятьПометкиОтправлятьЕслиПустойExtendedTooltip + 921 Label true true @@ -8127,10 +8278,10 @@ ФорматыОтчетовСтрокаПоиска - 1072 + 1104 ФорматыОтчетовСтрокаПоискаРасширеннаяПодсказка - 1074 + 1106 Label true true @@ -8140,7 +8291,7 @@ ФорматыОтчетовСтрокаПоискаКонтекстноеМеню - 1073 + 1105 true ФорматыОтчетов @@ -8150,10 +8301,10 @@ ФорматыОтчетовСостояниеПросмотра - 1075 + 1107 ФорматыОтчетовСостояниеПросмотраРасширеннаяПодсказка - 1077 + 1109 Label true true @@ -8163,7 +8314,7 @@ ФорматыОтчетовСостояниеПросмотраКонтекстноеМеню - 1076 + 1108 true ViewStatusAddition @@ -8174,10 +8325,10 @@ ФорматыОтчетовУправлениеПоиском - 1078 + 1110 ФорматыОтчетовУправлениеПоискомРасширеннаяПодсказка - 1080 + 1112 Label true true @@ -8187,7 +8338,7 @@ ФорматыОтчетовУправлениеПоискомКонтекстноеМеню - 1079 + 1111 true SearchControlAddition @@ -8197,8 +8348,8 @@ - ФорматыОтчетовРасширеннаяПодсказка - 1071 + ФорматыОтчетовExtendedTooltip + 922 Label true true @@ -8218,8 +8369,8 @@ true - ФорматыОтчетовКонтекстноеМенюУстановитьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1067 + ФорматыОтчетовКонтекстноеМенюУстановитьПометкиОтправлятьЕслиПустойExtendedTooltip + 918 Label true true @@ -8244,8 +8395,8 @@ true - ФорматыОтчетовКонтекстноеМенюСнятьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1068 + ФорматыОтчетовКонтекстноеМенюСнятьПометкиОтправлятьЕслиПустойExtendedTooltip + 919 Label true true @@ -8299,8 +8450,8 @@ true - УстановитьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1096 + УстановитьПометкиОтправлятьЕслиПустойExtendedTooltip + 927 Label true true @@ -8326,8 +8477,8 @@ true - СнятьПометкиОтправлятьЕслиПустойРасширеннаяПодсказка - 1097 + СнятьПометкиОтправлятьЕслиПустойExtendedTooltip + 928 Label true true @@ -8358,8 +8509,8 @@ Кнопки форматов отчетов - КнопкиФорматовОтчетовРасширеннаяПодсказка - 1095 + КнопкиФорматовОтчетовExtendedTooltip + 926 Label true true @@ -8391,8 +8542,8 @@ Форматы отчетов и кнопки - ФорматыОтчетовИКнопкиРасширеннаяПодсказка - 1066 + ФорматыОтчетовИКнопкиExtendedTooltip + 917 Label true true @@ -8433,8 +8584,8 @@ АрхивироватьПриИзменении - АрхивироватьРасширеннаяПодсказка - 1099 + АрхивироватьExtendedTooltip + 930 Label true true @@ -8467,8 +8618,8 @@ None - ИмяАрхиваРасширеннаяПодсказка - 1104 + ИмяАрхиваExtendedTooltip + 934 Label true true @@ -8491,8 +8642,8 @@ true - ИмяАрхиваКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиРасширеннаяПодсказка - 1102 + ИмяАрхиваКонтекстноеМенюДобавитьИлиИзменитьШаблонДатыРассылкиExtendedTooltip + 932 Label true true @@ -8517,8 +8668,8 @@ true - ИмяАрхиваКонтекстноеМенюДобавитьШаблонРассылкиРасширеннаяПодсказка - 1103 + ИмяАрхиваКонтекстноеМенюДобавитьШаблонРассылкиExtendedTooltip + 933 Label true true @@ -8544,8 +8695,8 @@ Параметр - ИмяАрхиваКонтекстноеМенюПодменюПараметрРасширеннаяПодсказка - 1101 + ИмяАрхиваКонтекстноеМенюПодменюПараметрExtendedTooltip + 931 Label true true @@ -8591,8 +8742,8 @@ Объект.ПарольАрхива - ПарольАрхиваРасширеннаяПодсказка - 1106 + ПарольАрхиваExtendedTooltip + 935 Label true true @@ -8635,8 +8786,8 @@ true - ГруппаПараметрыАрхивацииВZIPРасширеннаяПодсказка - 1098 + ГруппаПараметрыАрхивацииВZIPExtendedTooltip + 929 Label true true @@ -8668,8 +8819,8 @@ Объект.АдресОтвета - АдресОтветаРасширеннаяПодсказка - 1109 + АдресОтветаExtendedTooltip + 937 Label true true @@ -8712,8 +8863,8 @@ Right - ИспользоватьСкрытыеКопииРасширеннаяПодсказка - 1111 + ИспользоватьСкрытыеКопииExtendedTooltip + 938 Label true true @@ -8748,8 +8899,8 @@ true - ДополнительныеПараметрыРассылкиПоЭлектроннойПочтеРасширеннаяПодсказка - 1108 + ДополнительныеПараметрыРассылкиПоЭлектроннойПочтеExtendedTooltip + 936 Label true true @@ -8784,8 +8935,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 1114 + РодительExtendedTooltip + 940 Label true true @@ -8833,8 +8984,8 @@ Right - ДобавлятьДатуРассылкиВИменаФайловРасширеннаяПодсказка - 1116 + ДобавлятьДатуРассылкиВИменаФайловExtendedTooltip + 941 Label true true @@ -8871,8 +9022,8 @@ Группа автор родитель - ГруппаАвторРодительРасширеннаяПодсказка - 1118 + ГруппаАвторРодительExtendedTooltip + 942 Label true true @@ -8905,8 +9056,8 @@ true - ДополнительныеПараметрыРасширеннаяПодсказка - 1113 + ДополнительныеПараметрыExtendedTooltip + 939 Label true true @@ -8940,8 +9091,8 @@ Страница дополнительно - СтраницаДополнительноРасширеннаяПодсказка - 1063 + СтраницаДополнительноExtendedTooltip + 915 Label true true @@ -8965,8 +9116,8 @@ Страницы - СтраницыРасширеннаяПодсказка - 716 + СтраницыExtendedTooltip + 711 Label true true @@ -10791,7 +10942,7 @@ - ЗаполнитьПоШаблону + ЗаполнитьРасписаниеПоШаблону TextPicture @@ -11020,6 +11171,32 @@ Auto Auto + + ИспользоватьПолучателяРассылкиВНастройкеОтчета + + <key>ru</key> + <value>Указать получателя рассылки</value> + + 2 + + ru + Указать получателя рассылки в выбранной настройке + + + true + + + CommonPicture.ВариантыОтчетовДоступныеВсемПользователям + + + + ИспользоватьПолучателяРассылкиВНастройкеОтчета + + + TextPicture + Auto + Auto + diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html index ddf65fb18..831dfc798 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

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

              Реквизиты:

              @@ -66,8 +66,8 @@

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

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

      -

      Если сервер 1С:Предприятия 8.2 работает под Windows, то необходимо убедиться, что сетевой каталог Windows доступен для чтения и записи пользователю операционной системы, от имени которого запущен сервер 1С:Предприятия. Если это не так, то необходимо дать этому пользователю необходимые права, или выбрать другого пользователя для запуска сервера 1С:Предприятия с необходимыми правами к сетевому каталогу. Эти же рекомендации актуальны и для доступа к ресурсам FTP и электронной почты.

      -

      Поле сетевой каталог Linux предназначено для серверов 1С:Предприятия 8.2 работающих под управлением ОС Linux. В этом поле можно указать только локальный путь, например /home/path. Чтобы использовать UNC путь, нужно сделать на него ссылку. Для этого под правами администратора (root) сделайте следующее:

      +

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

      +

      Поле сетевой каталог Linux предназначено для серверов 1С:Предприятия работающих под управлением ОС Linux. В этом поле можно указать только локальный путь, например /home/path. Чтобы использовать UNC путь, нужно сделать на него ссылку. Для этого под правами администратора (root) сделайте следующее:

      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

      diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl index cfc476b8d..e1390178e 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/Forms/ФормаЭлемента/Module.bsl @@ -20,20 +20,25 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; Если Объект.ПометкаУдаления Тогда - ЭтаФорма.ТолькоПросмотр = Истина; + ЭтотОбъект.ТолькоПросмотр = Истина; КонецЕсли; - // Удаление варианта "В папку" если не используется интеграция с подсистемой "РаботаСФайлами". + // Удаление варианта "В папку", если не используется интеграция с подсистемой "РаботаСФайлами". Если ТипЗнч(Объект.Папка) = Тип("Неопределено") ИЛИ ТипЗнч(Объект.Папка) = Тип("Строка") Тогда Элементы.ДругойСпособДоставки.СписокВыбора.Удалить(0); КонецЕсли; + // Удаление варианта "В сетевой каталог", если режим работы в модели сервиса. + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + СпособДоставкиСетевойКаталог = Элементы.ДругойСпособДоставки.СписокВыбора.НайтиПоЗначению("ИспользоватьСетевойКаталог"); + Элементы.ДругойСпособДоставки.СписокВыбора.Удалить(СпособДоставкиСетевойКаталог); + КонецЕсли; + ЗначениеКопирования = Параметры.ЗначениеКопирования; // Используется при загрузке и записи настроек выбранного отчета @@ -151,20 +156,18 @@ Если Объект.Отчеты.Количество() > 0 И ИдентификаторТекущейСтрокиТаблицыОтчетов = -1 Тогда СтрокаОтчеты = Объект.Отчеты[0]; ИдентификаторСтроки = СтрокаОтчеты.ПолучитьИдентификатор(); - СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки); - Если СтрокаПредупреждения <> "" Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаПредупреждения, , "Объект.Отчеты[0].Представление"); + ТекстОшибки = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки); + Если ТекстОшибки <> "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , "Объект.Отчеты[0].Представление"); КонецЕсли; КонецЕсли; - // - ВидимостьДоступностьКорректность(ЭтаФорма); + ВидимостьДоступностьКорректность(ЭтотОбъект); - // ЗафиксироватьЗначенияРеквизитовДоИзменения(); - // ПравоВывода = ПравоДоступа("Вывод", Метаданные); + КонецПроцедуры &НаКлиенте @@ -173,7 +176,7 @@ Модифицированность = Истина; КонецЕсли; Если НЕ ПравоВывода Тогда - Предупреждение(НСтр("ru = 'Недостаточно прав на вывод информации. Рассылки отчетов не будут выполнены.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Недостаточно прав на вывод информации. Рассылки отчетов не будут выполнены.'")); КонецЕсли; КонецПроцедуры @@ -191,29 +194,27 @@ КонецЕсли; КонецЦикла; - Если ЗначенияИзменились - И Объект.ИспользоватьПапку + Если ЗначенияИзменились + И Объект.ИспользоватьПапку И Объект.Архивировать - И (Объект.ТолькоУведомить ИЛИ НЕ Объект.ИспользоватьЭлектроннуюПочту) Тогда + И (Объект.ТолькоУведомить ИЛИ НЕ Объект.ИспользоватьЭлектроннуюПочту) + И Не ПараметрыЗаписи.Свойство("НеОтключатьАрхивацию") Тогда - Заголовок = НСтр("ru = 'Отключить архивацию'"); + Отказ = Истина; + ЗаголовокВопроса = НСтр("ru = 'Отключить архивацию'"); ТекстВопроса = НСтр("ru = 'При публикации отчетов в папку рекомендуется отключать архивацию в ZIP.'"); Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Отключить архивацию в ZIP'")); - Кнопки.Добавить(2, НСтр("ru = 'Продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Отключить архивацию в ZIP'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Продолжить'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1, Заголовок, 2); - - Если Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - ИначеЕсли Ответ = 1 Тогда - Объект.Архивировать = Ложь; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ПередЗаписьюПродолжение", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да, ЗаголовокВопроса, КодВозвратаДиалога.Нет); КонецЕсли; + КонецПроцедуры &НаСервере @@ -406,15 +407,15 @@ Возврат; КонецЕсли; - СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки); - Если СтрокаПредупреждения <> "" Тогда - Предупреждение(СтрокаПредупреждения); + ТекстПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки); + Если ТекстПредупреждения <> "" Тогда + ПоказатьПредупреждение(, ТекстПредупреждения); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Подключаемый_ПроверитьВыполнениеФоновогоЗадания() - РассылкаОтчетовКлиент.ПроверитьВыполнениеФоновогоЗадания(ЭтаФорма); + РассылкаОтчетовКлиент.ПроверитьВыполнениеФоновогоЗадания(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -425,23 +426,23 @@ &НаКлиенте Процедура ВыполнятьПоРасписаниюПриИзменении(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "ВыполнятьПоРасписанию"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ВыполнятьПоРасписанию"); КонецПроцедуры &НаКлиенте Процедура МесяцыПриИзменении(Элемент) Если Элемент <> Неопределено Тогда - Расписание.Месяцы = ИзменитьСоставМассива(ЭтаФорма[Элемент.Имя], Кэш.Соответствия.Месяцы[Элемент.Имя], Расписание.Месяцы); + Расписание.Месяцы = ИзменитьСоставМассива(ЭтотОбъект[Элемент.Имя], Кэш.Соответствия.Месяцы[Элемент.Имя], Расписание.Месяцы); КонецЕсли; - ВидимостьДоступностьКорректность(ЭтаФорма, "Месяцы"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы"); КонецПроцедуры &НаКлиенте Процедура ДниНеделиПриИзменении(Элемент) Если Элемент <> Неопределено Тогда - Расписание.ДниНедели = ИзменитьСоставМассива(ЭтаФорма[Элемент.Имя], Кэш.Соответствия.ДниНедели[Элемент.Имя], Расписание.ДниНедели); + Расписание.ДниНедели = ИзменитьСоставМассива(ЭтотОбъект[Элемент.Имя], Кэш.Соответствия.ДниНедели[Элемент.Имя], Расписание.ДниНедели); КонецЕсли; - ВидимостьДоступностьКорректность(ЭтаФорма, "ДниНедели"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ДниНедели"); КонецПроцедуры &НаКлиенте @@ -451,7 +452,7 @@ &НаКлиенте Процедура ПериодичностьРасписанияПриИзменении(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "ПериодичностьРасписания"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодичностьРасписания"); Если Кэш.Перечисления.Периодичности[Объект.ПериодичностьРасписания] = "Произвольное" Тогда ИзменитьРасписаниеВДиалоге(); КонецЕсли; @@ -466,25 +467,25 @@ Расписание.ДеньВМесяце = -Расписание.ДеньВМесяце; КонецЕсли; Модифицированность = Истина; - ВидимостьДоступностьКорректность(ЭтаФорма, "НачалоКонецМесяца"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "НачалоКонецМесяца"); КонецПроцедуры &НаКлиенте Процедура ВремяНачалаПриИзменении(Элемент) Расписание.ВремяНачала = ВремяНачала; - ВидимостьДоступностьКорректность(ЭтаФорма, "ВремяНачала"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ВремяНачала"); КонецПроцедуры &НаКлиенте Процедура ПериодПовтораДнейПриИзменении(Элемент) Расписание.ПериодПовтораДней = ПериодПовтораДней; - ВидимостьДоступностьКорректность(ЭтаФорма, "ПериодПовтораДней"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ПериодПовтораДней"); КонецПроцедуры &НаКлиенте Процедура ДеньМесяцаПриИзменении(Элемент) Расписание.ДеньВМесяце = ?(Расписание.ДеньВМесяце >= 0, ДеньВМесяце, -ДеньВМесяце); - ВидимостьДоступностьКорректность(ЭтаФорма, "ДеньВМесяце"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ДеньВМесяце"); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -502,23 +503,22 @@ СтандартнаяОбработка = Ложь; Возврат; КонецЕсли; - + // Очистка получателей (если нужно) Если Объект.Получатели.Количество() > 0 Тогда - + СтандартнаяОбработка = Ложь; + СтрокаВопроса = НСтр("ru = 'Для продолжения необходимо очистить список получателей.'"); - НаборКнопок = Новый СписокЗначений; - НаборКнопок.Добавить("Очистить", НСтр("ru = 'Очистить'")); - НаборКнопок.Добавить(КодВозвратаДиалога.Отмена); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Очистить'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); - Ответ = Вопрос(СтрокаВопроса, НаборКнопок, 60, "Очистить"); - Если Ответ <> "Очистить" Тогда - СтандартнаяОбработка = Ложь; - Возврат; - КонецЕсли; - Объект.Получатели.Очистить(); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ВыбранноеЗначение", ВыбранноеЗначение); + Обработчик = Новый ОписаниеОповещения("ТипПолучателейРассылкиОбработкаВыбораЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Обработчик, СтрокаВопроса, Кнопки, 60, КодВозвратаДиалога.Да); КонецЕсли; КонецПроцедуры @@ -538,10 +538,21 @@ СтандартнаяОбработка = Ложь; КонецПроцедуры +&НаКлиенте +Процедура ВидПочтовогоАдресаПолучателейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + Если НЕ ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Перед выбором почтового адреса необходимо выбрать получателей'"), + , + "ТипПолучателейРассылки"); + СтандартнаяОбработка = Ложь; + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура ВидПочтовогоАдресаАвтораОткрытие(Элемент, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОткрытьЗначение(Объект.Автор); + ПоказатьЗначение(, Объект.Автор); КонецПроцедуры &НаКлиенте @@ -564,7 +575,7 @@ Для Каждого КлючИЗначение Из ВыбранноеЗначение Цикл Объект["FTP" + КлючИЗначение.Ключ] = КлючИЗначение.Значение; КонецЦикла; - ВидимостьДоступностьКорректность(ЭтаФорма, "FTPСерверИКаталог"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "FTPСерверИКаталог"); Модифицированность = Истина; КонецПроцедуры @@ -590,55 +601,57 @@ Объект.Личная = (ВидРассылки = "Личная"); Объект.Персонализирована = (ВидРассылки = "Персонализирована"); - ВидимостьДоступностьКорректность(ЭтаФорма, "ВидРассылки"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ВидРассылки"); КонецПроцедуры &НаКлиенте Процедура ИспользоватьЭлектроннуюПочтуПриИзменении(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "ИспользоватьЭлектроннуюПочту"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ИспользоватьЭлектроннуюПочту"); Если НЕ Публиковать И НЕ Объект.ИспользоватьЭлектроннуюПочту Тогда Публиковать = Истина; ВычислитьФлажкиДополнительныхСпособовДоставки(); - ВидимостьДоступностьКорректность(ЭтаФорма, "Публиковать"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Публиковать"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ТолькоУведомитьПриИзменении(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "ТолькоУведомить"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ТолькоУведомить"); КонецПроцедуры &НаКлиенте Процедура ДругойСпособДоставкиПриИзменении(Элемент) ВычислитьФлажкиДополнительныхСпособовДоставки(); - ВидимостьДоступностьКорректность(ЭтаФорма, "ДругойСпособДоставки"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ДругойСпособДоставки"); КонецПроцедуры &НаКлиенте Процедура ПубликоватьПриИзменении(Элемент) ВычислитьФлажкиДополнительныхСпособовДоставки(); - ВидимостьДоступностьКорректность(ЭтаФорма, "Публиковать"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Публиковать"); Если НЕ Публиковать И НЕ Объект.ИспользоватьЭлектроннуюПочту Тогда Объект.ИспользоватьЭлектроннуюПочту = Истина; - ВидимостьДоступностьКорректность(ЭтаФорма, "ИспользоватьЭлектроннуюПочту"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ИспользоватьЭлектроннуюПочту"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПапкаОткрытие(Элемент, СтандартнаяОбработка) - РассылкаОтчетовКлиент.РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Объект.Папка); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); + МодульРаботаСФайламиСлужебныйКлиент.РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Объект.Папка); + КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПапкаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если НЕ ПравоИзмененияПапкиИФайлов(ВыбранноеЗначение) Тогда СтандартнаяОбработка = Ложь; - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Недостаточно прав на изменение файлов папки %1'"), - "'"+ Строка(ВыбранноеЗначение) +"'")); + ТекстПредупреждения = НСтр("ru = 'Недостаточно прав для изменения файлов папки ""%1"".'"); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Строка(ВыбранноеЗначение)); + ПоказатьПредупреждение(, ТекстПредупреждения); КонецЕсли; КонецПроцедуры @@ -664,10 +677,8 @@ &НаКлиенте Процедура ФорматыПоУмолчаниюНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - СтрокаФорматов = ВыбратьФормат(Кэш.ПустоеЗначениеОтчета); - Если СтрокаФорматов <> Неопределено Тогда - ФорматыПоУмолчанию = СтрокаФорматов; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ФорматыПоУмолчаниюЗавершениеВыбора", ЭтотОбъект); + ВыбратьФормат(Кэш.ПустоеЗначениеОтчета, Обработчик); КонецПроцедуры &НаКлиенте @@ -679,7 +690,7 @@ &НаКлиенте Процедура АрхивироватьПриИзменении(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "Архивировать"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Архивировать"); КонецПроцедуры &НаКлиенте @@ -699,7 +710,7 @@ Процедура РодительОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Если ВыбранноеЗначение = Кэш.ГруппаЛичныхРассылок Тогда СтандартнаяОбработка = Ложь; - Предупреждение(НСтр("ru = 'Выбранная группа используется только для личных рассылок по электронной почте'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выбранная группа используется только для личных рассылок по электронной почте'")); КонецЕсли; КонецПроцедуры @@ -723,22 +734,18 @@ ПроверитьДобавленныеСтрокиОтчетов(СтруктураВыбора); // Вывод результатов выбора - Результат = Новый Структура("Оповестить, Заголовок, Текст, ТекстОшибок"); + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); Если СтруктураВыбора.СОшибками.Количество > 0 Тогда - Результат.Оповестить = Ложь; - Результат.ТекстОшибок = СтруктураВыбора.СОшибками.Текст; - Результат.Заголовок = НСтр("ru = 'Ошибки добавления отчетов в рассылку'"); - Если СтруктураВыбора.Выбрано.Количество = 1 Тогда - Результат.Текст = НСтр("ru = 'Не удалось добавить отчет из-за ошибок'"); + ТекстСообщения = НСтр("ru = 'Не удалось добавить отчет из-за ошибок'"); ИначеЕсли СтруктураВыбора.Успешно.Количество = 0 Тогда - Результат.Текст = НСтр("ru = 'Не удалось добавить отчеты из-за ошибок'"); + ТекстСообщения = НСтр("ru = 'Не удалось добавить отчеты из-за ошибок'"); ИначеЕсли СтруктураВыбора.Выбрано.Количество >= 6 Тогда - Результат.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Добавлено отчетов: %1 из %2, - |Не добавлено из-за ошибок: %3'"), + |Не добавлено из-за ошибок: %3'"), Формат(СтруктураВыбора.Успешно.Количество, "ЧН=0; ЧГ="), Формат(СтруктураВыбора.Выбрано.Количество, "ЧН=0; ЧГ="), Формат(СтруктураВыбора.СОшибками.Количество, "ЧН=0; ЧГ=")); @@ -746,7 +753,7 @@ Разделитель = ", "; ПредставлениеОтчетовУспешно = СтрЗаменить(Разделитель + СтруктураВыбора.Успешно.ПредставлениеОтчетов , Разделитель, Символы.ПС + " - "); ПредставлениеОтчетовСОшибками = СтрЗаменить(Разделитель + СтруктураВыбора.СОшибками.ПредставлениеОтчетов, Разделитель, Символы.ПС + " - "); - Результат.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Успешно добавлены отчеты: |%1 | @@ -756,26 +763,35 @@ ПредставлениеОтчетовСОшибками); КонецЕсли; - ИначеЕсли СтруктураВыбора.Успешно.Количество = 0 Тогда - - Результат.Оповестить = Истина; - Результат.Текст = НСтр("ru = 'Все выбранные отчеты уже включены в рассылку'"); + Результат.ВыводПредупреждения.Использование = Истина; + Результат.ВыводПредупреждения.Заголовок = НСтр("ru = 'Ошибки добавления отчетов в рассылку'"); + Результат.ВыводПредупреждения.Текст = ТекстСообщения; + Результат.ВыводПредупреждения.ТекстОшибок = СтруктураВыбора.СОшибками.Текст; Иначе - Результат.Оповестить = Истина; - Если СтруктураВыбора.Выбрано.Количество = 1 Тогда - Результат.Заголовок = НСтр("ru = 'Отчет включен в рассылку'"); + Если СтруктураВыбора.Успешно.Количество = 0 Тогда + ЗаголовокОповещения = Неопределено; + ТекстОповещения = НСтр("ru = 'Все выбранные отчеты уже включены в рассылку'"); Иначе - Результат.Заголовок = НСтр("ru = 'Отчеты включены в рассылку'"); + Если СтруктураВыбора.Выбрано.Количество = 1 Тогда + ЗаголовокОповещения = НСтр("ru = 'Отчет включен в рассылку'"); + Иначе + ЗаголовокОповещения = НСтр("ru = 'Отчеты включены в рассылку'"); + КонецЕсли; + ТекстОповещения = СтруктураВыбора.Успешно.ПредставлениеОтчетов; КонецЕсли; - Результат.Текст = СтруктураВыбора.Успешно.ПредставлениеОтчетов; + + Результат.ВыводОповещения.Использование = Истина; + Результат.ВыводОповещения.Заголовок = ЗаголовокОповещения; + Результат.ВыводОповещения.Текст = ТекстОповещения; + Результат.ВыводОповещения.Картинка = БиблиотекаКартинок.ВыполнитьЗадачу; КонецЕсли; - РассылкаОтчетовКлиент.ПоказатьРезультат(Результат); + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, Результат); - ВидимостьДоступностьКорректность(ЭтаФорма, "Отчеты"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Отчеты"); КонецПроцедуры &НаКлиенте @@ -795,7 +811,7 @@ &НаКлиенте Процедура ОтчетыПослеУдаления(Элемент) - ВидимостьДоступностьКорректность(ЭтаФорма, "Отчеты"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Отчеты"); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -811,11 +827,6 @@ СтрокаОтчеты.ВнесеныИзменения = Истина; КонецПроцедуры -&НаКлиенте -Процедура КомпоновщикНастроекПользовательскиеНастройкиЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - НачалоВыбораНастройкиОтчета(Элемент, ДанныеВыбора, СтандартнаяОбработка, Истина); -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ НастройкиТекущегоОтчета @@ -839,11 +850,6 @@ СтрокаОтчеты.ВнесеныИзменения = Истина; КонецПроцедуры -&НаКлиенте -Процедура НастройкиТекущегоОтчетаЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - НачалоВыбораНастройкиОтчета(Элемент, ДанныеВыбора, СтандартнаяОбработка, Ложь); -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Получатели @@ -894,10 +900,12 @@ Возврат; КонецЕсли; - СтрокаФорматов = ВыбратьФормат(СтрокаОтчеты.Отчет); - Если СтрокаФорматов <> Неопределено Тогда - СтрокаОтчеты.Форматы = СтрокаФорматов; - КонецЕсли; + Переменные = Новый Структура; + Переменные.Вставить("СтрокаОтчеты", СтрокаОтчеты); + + Обработчик = Новый ОписаниеОповещения("ФорматыОтчетовФорматыЗавершениеВыбора", ЭтотОбъект, Переменные); + + ВыбратьФормат(СтрокаОтчеты.Отчет, Обработчик); КонецПроцедуры &НаКлиенте @@ -943,7 +951,11 @@ &НаКлиенте Процедура ДобавитьДополнительныйОтчет(Команда) - РассылкаОтчетовКлиент.РассылкаОтчетовПодборДопОтчета(Элементы.Отчеты); + // Форма подбора дополнительных отчетов. + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); + МодульДополнительныеОтчетыИОбработкиКлиент.РассылкаОтчетовПодборДопОтчета(Элементы.Отчеты); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -954,7 +966,7 @@ // СтрокаОтчеты = Элементы.Отчеты.ТекущиеДанные; Если СтрокаОтчеты = Неопределено Тогда - Предупреждение(НСтр("ru = 'Выберите отчет'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите отчет'")); Возврат; КонецЕсли; @@ -968,13 +980,16 @@ Если СтрокаОтчеты.СКД Тогда ПараметрыОтчета.Настройки = КомпоновщикНастроекКД.ПользовательскиеНастройки; Иначе - ПараметрыОтчета.Настройки = Новый Структура; + ПараметрыОтчета.Настройки = Новый Массив; Найденные = НастройкиТекущегоОтчета.НайтиСтроки(Новый Структура("Использование", Истина)); Для Каждого СтрокаНастройка Из Найденные Цикл - ПараметрыОтчета.Настройки.Вставить(СтрокаНастройка.Реквизит, СтрокаНастройка.Значение);; + ДобавляемаяНастройка = Новый Структура("Реквизит, Значение", СтрокаНастройка.Реквизит, СтрокаНастройка.Значение); + ПараметрыОтчета.Настройки.Добавить(ДобавляемаяНастройка); КонецЦикла; КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ПредварительныйПросмотрОтчетаПродолжение", ЭтотОбъект, ПараметрыОтчета); + Получатель = Неопределено; Если Объект.Персонализирована Тогда Отказ = Ложь; @@ -983,29 +998,174 @@ Если Отказ Тогда Возврат; КонецЕсли; - РезультатВыбора = РассылкаОтчетовКлиент.ВыбратьПолучателя(Объект, Ложь, Ложь); - Если РезультатВыбора = Неопределено Тогда + + РассылкаОтчетовКлиент.ВыбратьПолучателя(Обработчик, Объект, Ложь, Ложь); + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Обработчик, Неопределено); +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьПолучателяРассылкиВНастройкеОтчета(Команда) + ОчиститьСообщения(); + + // Проверка - включена ли возможность персонализации рассылки. + Если НЕ Объект.Персонализирована Тогда + ПредставлениеВида = Элементы.ВидРассылки.СписокВыбора.НайтиПоЗначению("Персонализирована").Представление; + СообщениеТекст = НСтр("ru = 'Использовать получателя в параметрах возможно только для вида рассылки ""%1""'"); + СообщениеТекст = СтрЗаменить(СообщениеТекст, "%1", ПредставлениеВида); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеТекст, , "ВидРассылки"); + Возврат; + КонецЕсли; + + СКД = (Элементы.СтраницыНастроекОтчета.ТекущаяСтраница = Элементы.СтраницаКомпоновщик); + + // Получение основного типа получателей. + КоличествоТипов = ТипПолучателейРассылки.Типы().Количество(); + Если КоличествоТипов <> 1 И КоличествоТипов <> 2 Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Поле ""Получатели"" не заполнено'"), , "ТипПолучателейРассылки"); + Возврат; + КонецЕсли; + + Если СКД Тогда + Инициатор = Элементы.КомпоновщикНастроекПользовательскиеНастройки; + Иначе + Инициатор = Элементы.НастройкиТекущегоОтчета; + КонецЕсли; + + НайденныеИОМД = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки)); + Если НайденныеИОМД.Количество() <> 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Тип получателей не найден'")); + Возврат; + КонецЕсли; + + МассивТипов = НайденныеИОМД[0].ОсновнойТип.Типы(); + Если МассивТипов.Количество() <> 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Тип получателей не найден'")); + Возврат; + КонецЕсли; + + ОсновнойТипПолучателей = МассивТипов[0]; + + // Получения описания типов, доступных для выбора. + Если СКД Тогда + + // Идентификатор пользовательской настройки. + ИдентификаторНастройки = Инициатор.ТекущаяСтрока; + Если ИдентификаторНастройки = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите настройку отчета'")); Возврат; КонецЕсли; - Получатель = РезультатВыбора.Получатель; + + // Получение строки из состава настроек компоновки данных. + СтрокаНастроек = КомпоновщикНастроекКД.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИдентификаторНастройки); + Если СтрокаНастроек = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Настройка отчета не найдена'")); + Возврат; + КонецЕсли; + + // Проверка типа настройки. + Если ТипЗнч(СтрокаНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + ЭтоЭлементОтбора = Истина; + ИначеЕсли ТипЗнч(СтрокаНастроек) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + ЭтоЭлементОтбора = Ложь; + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Указывать получателя можно только для параметров и отборов отчетов'")); + Возврат; + КонецЕсли; + + // Поле компоновки данных. + Если ЭтоЭлементОтбора Тогда + + Если ЗначениеЗаполнено(СтрокаНастроек.ЛевоеЗначение) Тогда + + ПолеКД = СтрокаНастроек.ЛевоеЗначение; + + Иначе + + // Нахождение поля в составе элементов отбора КД по идентификатору. + ТекущийЭлементОтбораКД = Неопределено; + Идентификатор = Строка(ИдентификаторНастройки); + + ГруппыЭлементовОтбора = Новый Массив; + ГруппыЭлементовОтбора.Добавить(КомпоновщикНастроекКД.Настройки.Отбор.Элементы); + Пока ГруппыЭлементовОтбора.Количество() > 0 И ТекущийЭлементОтбораКД = Неопределено Цикл + ГруппаЭлементовОтбора = ГруппыЭлементовОтбора[0]; + ГруппыЭлементовОтбора.Удалить(0); + + Для Каждого ЭлементОтбораКД Из ГруппаЭлементовОтбора Цикл + Если ТипЗнч(ЭлементОтбораКД) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда + ГруппыЭлементовОтбора.Добавить(ЭлементОтбораКД.Элементы); + ИначеЕсли ЭлементОтбораКД.ИдентификаторПользовательскойНастройки = Идентификатор Тогда + ТекущийЭлементОтбораКД = ЭлементОтбораКД; + Прервать; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + Если ТекущийЭлементОтбораКД = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Для настройки отчета не найдено описание доступного поля'")); + Возврат; + КонецЕсли; + + ПолеКД = ТекущийЭлементОтбораКД.ЛевоеЗначение; + + КонецЕсли; + + // Нахождение поля в составе доступных полей выбора. + ДоступноеПолеКД = КомпоновщикНастроекКД.Настройки.Выбор.ДоступныеПоляВыбора.НайтиПоле(ПолеКД); + Если ДоступноеПолеКД = Неопределено Тогда + Возврат; + КонецЕсли; + + ОписаниеДоступныхТипов = ДоступноеПолеКД.Тип; + + Иначе + + ДоступныйПараметрКД = КомпоновщикНастроекКД.Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(СтрокаНастроек.Параметр); + ОписаниеДоступныхТипов = ДоступныйПараметрКД.Тип; + + КонецЕсли; + + Иначе + + // Массив типов для произвольных отчетов. + СтрокаНастроек = Инициатор.ТекущиеДанные; + Если СтрокаНастроек = Неопределено Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите настройку отчета'")); + Возврат; + КонецЕсли; + + ОписаниеДоступныхТипов = СтрокаНастроек.Тип; + КонецЕсли; - ТребуемыеРеквизиты = Новый Структура; - ТребуемыеРеквизиты.Вставить("Ссылка", Объект.Ссылка); - ТребуемыеРеквизиты.Вставить("Персонализирована", Объект.Персонализирована); - ТребуемыеРеквизиты.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); - - Результат = СформироватьОтчетНаСервере(ПараметрыОтчета, Получатель, ТребуемыеРеквизиты); - - // Вывод табличного документа - Если ТипЗнч(Результат.ТабДок) = Тип("ТабличныйДокумент") Тогда - Результат.ТабДок.ТолькоПросмотр = Истина; - Результат.ТабДок.ОтображатьСетку = Ложь; - Результат.ТабДок.Показать(СтрокаОтчеты.Представление); + // Проверка на содержание типа получателей. + Если НЕ ОписаниеДоступныхТипов.СодержитТип(ОсновнойТипПолучателей) Тогда + ТекстПредупреждения = НСтр("ru = 'Тип ""%1"" не подходит по типу к выбранной настройке. + |Необходимо выбрать другой тип получателей или другую настройку.'"); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Строка(ОсновнойТипПолучателей)); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; КонецЕсли; - // Вывод результата пользователю - РассылкаОтчетовКлиент.ПоказатьРезультат(Результат); + Инициатор.ЗакончитьРедактированиеСтроки(Ложь); + СтрокаНастроек.Использование = Истина; + Если СКД Тогда + Если ЭтоЭлементОтбора Тогда + СтрокаНастроек.ПравоеЗначение = "[Получатель]"; + Иначе + СтрокаНастроек.Значение = "[Получатель]"; + КонецЕсли; + Иначе + СтрокаНастроек.Значение = "[Получатель]"; + КонецЕсли; + + РассылкаБылаПерсонализирована = Истина; + Элементы.Отчеты.ТекущиеДанные.ВнесеныИзменения = Истина; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -1015,31 +1175,29 @@ Процедура УстановитьПометки(Команда) ВсеМесяцы = Новый Массив; Для Каждого КлючИЗначение Из Кэш.Соответствия.Месяцы Цикл - ЭтаФорма[КлючИЗначение.Ключ] = Истина; + ЭтотОбъект[КлючИЗначение.Ключ] = Истина; ВсеМесяцы.Добавить(КлючИЗначение.Значение); КонецЦикла; Расписание.Месяцы = ВсеМесяцы; - ВидимостьДоступностьКорректность(ЭтаФорма, "Месяцы"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы"); КонецПроцедуры &НаКлиенте Процедура СнятьПометки(Команда) ВсеМесяцы = Новый Массив; Для Каждого КлючИЗначение Из Кэш.Соответствия.Месяцы Цикл - ЭтаФорма[КлючИЗначение.Ключ] = Ложь; + ЭтотОбъект[КлючИЗначение.Ключ] = Ложь; КонецЦикла; Расписание.Месяцы = ВсеМесяцы; - ВидимостьДоступностьКорректность(ЭтаФорма, "Месяцы"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "Месяцы"); КонецПроцедуры &НаКлиенте -Процедура ЗаполнитьПоШаблону(Команда) - СписокВариантов = РассылкаОтчетовКлиентСервер.СписокВариантовЗаполненияРасписаний(); +Процедура ЗаполнитьРасписаниеПоШаблону(Команда) + Обработчик = Новый ОписаниеОповещения("ЗаполнитьРасписаниеПоШаблонуЗавершение", ЭтотОбъект); - Вариант = СписокВариантов.ВыбратьЭлемент(НСтр("ru = 'Выберите шаблон расписания'")); - Если Вариант <> Неопределено Тогда - ЗаполнитьРасписаниеПоВарианту(Вариант.Значение, Истина); - КонецЕсли; + СписокВариантов = РассылкаОтчетовКлиентСервер.СписокВариантовЗаполненияРасписаний(); + СписокВариантов.ПоказатьВыборЭлемента(Обработчик, НСтр("ru = 'Выберите шаблон расписания'")); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -1054,44 +1212,29 @@ Процедура ДобавитьИзменитьШаблонДатыРассылки(Команда) ДобавитьШаблон(); - Конструктор = Новый КонструкторФорматнойСтроки; - Конструктор.ДоступныеТипы = Новый ОписаниеТипов("Дата"); + Переменные = Новый Структура; + Переменные.Вставить("Элемент", ТекущийЭлемент); + Переменные.Вставить("СтарыйТекст", Переменные.Элемент.ВыделенныйТекст); + Переменные.Вставить("Префикс", "[ДатаВыполнения("); + Переменные.Вставить("Постфикс", ")]"); + Переменные.Вставить("ТекстФормата", ""); - СтарыйТекст = СокрЛП(ТекущийЭлемент.ВыделенныйТекст); - Префикс = "[ДатаВыполнения("; - Постфикс = ")]"; - ДлинаПрефикса = СтрДлина(Префикс); - ДлинаПостфикса = СтрДлина(Постфикс); - ПозицияПрефикса = Найти(СтарыйТекст, Префикс); - ПозицияПостфикса = Найти(СтарыйТекст, Постфикс); - Если ПозицияПрефикса > 0 И ПозицияПостфикса > ПозицияПрефикса Тогда - ТекстФормата = Сред(СтарыйТекст, ПозицияПрефикса + ДлинаПрефикса, ПозицияПостфикса - ПозицияПрефикса - ДлинаПрефикса); - Иначе - ТекстФормата = ""; + ДлинаПрефикса = СтрДлина(Переменные.Префикс); + ДлинаПостфикса = СтрДлина(Переменные.Постфикс); + ПозицияПрефикса = Найти(Переменные.СтарыйТекст, Переменные.Префикс); + ПозицияПостфикса = Найти(Переменные.СтарыйТекст, Переменные.Постфикс); + + Переменные.Вставить("СтарыйФрагментНайден", (ПозицияПрефикса > 0 И ПозицияПостфикса > ПозицияПрефикса)); + Если Переменные.СтарыйФрагментНайден Тогда + Переменные.ТекстФормата = Сред(Переменные.СтарыйТекст, ПозицияПрефикса + ДлинаПрефикса, ПозицияПостфикса - ПозицияПрефикса - ДлинаПрефикса); КонецЕсли; - Конструктор.Текст = ТекстФормата; - Если НЕ Конструктор.ОткрытьМодально() Тогда - Возврат; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ДобавитьИзменитьШаблонДатыРассылкиЗавершение", ЭтотОбъект, Переменные); - Если ПозицияПрефикса > 0 И ПозицияПостфикса > ПозицияПрефикса Тогда - Если Конструктор.Текст = ТекстФормата Тогда - Возврат; - КонецЕсли; - ТекущийЭлемент.ВыделенныйТекст = СтрЗаменить(ТекущийЭлемент.ВыделенныйТекст, Префикс + ТекстФормата + Постфикс, Префикс + Конструктор.Текст + Постфикс); - ИначеЕсли ТекущийЭлемент.ВыделенныйТекст = "" Тогда - // Форматированный документ некорректно отрабатывает изменения свойства - // ВыделенныйТекст, в случае, если ничего не выделено, - // поэтому используется альтернативный метод добавления текста. - Если ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда - ТекстПисьмаФорматированныйДокумент.Добавить(Префикс + Конструктор.Текст + Постфикс, ТипЭлементаФорматированногоДокумента.Текст); - Иначе - ТекущийЭлемент.ВыделенныйТекст = Префикс + Конструктор.Текст + Постфикс; - КонецЕсли; - Иначе - ТекущийЭлемент.ВыделенныйТекст = ТекущийЭлемент.ВыделенныйТекст + Префикс + Конструктор.Текст + Постфикс; - КонецЕсли; + Диалог = Новый КонструкторФорматнойСтроки; + Диалог.ДоступныеТипы = Новый ОписаниеТипов("Дата"); + Диалог.Текст = Переменные.ТекстФормата; + Диалог.Показать(Обработчик); КонецПроцедуры @@ -1140,69 +1283,58 @@ &НаКлиенте Процедура ДобавитьШаблонПоУмолчанию(Команда) - ОчищаетсяТема = (ТекущийЭлемент = Элементы.ТемаПисьма); + ПерезаполняетсяТема = (ТекущийЭлемент = Элементы.ТемаПисьма); - ЗначениеПредмета = ""; - ШаблонПоУмолчанию = ""; - - Если ОчищаетсяТема Тогда + Если ПерезаполняетсяТема Тогда ЗначениеПредмета = Объект.ТемаПисьма; ШаблонПоУмолчанию = Кэш.Шаблоны.Тема; Иначе + Если Объект.ПисьмоВФорматеHTML Тогда + ЗначениеПредмета = ТекстПисьмаФорматированныйДокумент.ПолучитьТекст(); + Иначе + ЗначениеПредмета = Объект.ТекстПисьма; + КонецЕсли; + ЗначениеПредмета = СокрЛП(ЗначениеПредмета); ШаблонПоУмолчанию = Кэш.Шаблоны.Текст; - ЗначениеПредмета = СокрЛП( - ?(Объект.ПисьмоВФорматеHTML, - ТекстПисьмаФорматированныйДокумент.ПолучитьТекст(), - Объект.ТекстПисьма)); КонецЕсли; - Ответ = 1; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ПерезаполняетсяТема", ПерезаполняетсяТема); + ДополнительныеПараметры.Вставить("ШаблонПоУмолчанию", ШаблонПоУмолчанию); + Если ЗначениеПредмета = "" Тогда - // Предмет пуст - надо заполнить без вопросов + // Предмет пуст - надо заполнить без вопросов. + ДобавитьШаблонПоУмолчаниюЗавершение(1, ДополнительныеПараметры); ИначеЕсли ЗначениеПредмета = ШаблонПоУмолчанию Тогда - // Предмет соответствует шаблону - заполнять не требуется + // Предмет соответствует шаблону - заполнять не требуется. - ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 уже соответствует шаблону по умолчанию.'"), - ?(ОчищаетсяТема, НСтр("ru = 'Тема письма'"), НСтр("ru = 'Текст письма'"))); - Предупреждение(ТекстПредупреждения); - Возврат; + Если ПерезаполняетсяТема Тогда + ТекстПредупреждения = НСтр("ru = 'Тема письма уже соответствует шаблону по умолчанию.'"); + Иначе + ТекстПредупреждения = НСтр("ru = 'Текст письма уже соответствует шаблону по умолчанию.'"); + КонецЕсли; + ПоказатьПредупреждение(, ТекстПредупреждения); Иначе - // Предмет не пуст - надо запросить замену на стандартный шаблон + // Предмет не пуст - надо запросить замену на стандартный шаблон. - Предмет = ?(ОчищаетсяТема, НСтр("ru = 'тему письма'"), НСтр("ru = 'текст письма'")); - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Заменить %1 на шаблон по умолчанию?'"), - Предмет); - - Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Добавить в %1 шаблон по умолчанию'"), - Предмет); + Если ПерезаполняетсяТема Тогда + ЗаголовокВопроса = НСтр("ru = 'Добавить в тему письма шаблон по умолчанию'"); + ТекстВопроса = НСтр("ru = 'Заменить тему письма на шаблон по умолчанию?'"); + Иначе + ЗаголовокВопроса = НСтр("ru = 'Добавить в текст письма шаблон по умолчанию'"); + ТекстВопроса = НСтр("ru = 'Заменить текст письма на шаблон по умолчанию?'"); + КонецЕсли; Кнопки = Новый СписокЗначений; Кнопки.Добавить(1, НСтр("ru = 'Заменить'")); - Кнопки.Добавить(2, НСтр("ru = 'Добавить'")); // без замены + Кнопки.Добавить(2, НСтр("ru = 'Добавить'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1); - КонецЕсли; - - Если Ответ = 1 Тогда - Если ОчищаетсяТема Тогда - Объект.ТемаПисьма = ШаблонПоУмолчанию; - Иначе - Если Объект.ПисьмоВФорматеHTML Тогда - ТекстПисьмаФорматированныйДокумент.Удалить(); - ТекстПисьмаФорматированныйДокумент.Добавить(ШаблонПоУмолчанию, ТипЭлементаФорматированногоДокумента.Текст); - Иначе - Объект.ТекстПисьма = ШаблонПоУмолчанию; - КонецЕсли; - КонецЕсли; - ИначеЕсли Ответ = 2 Тогда - ДобавитьШаблон(ШаблонПоУмолчанию); + Обработчик = Новый ОписаниеОповещения("ДобавитьШаблонПоУмолчаниюЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, 1, ЗаголовокВопроса); КонецЕсли; КонецПроцедуры @@ -1279,7 +1411,7 @@ ТекстПисьмаФорматированныйДокумент.Добавить(Объект.ТекстПисьма, ТипЭлементаФорматированногоДокумента.Текст); КонецЕсли; ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент; - ВидимостьДоступностьКорректность(ЭтаФорма, "ПисьмоВФорматеHTML"); + ВидимостьДоступностьКорректность(ЭтотОбъект, "ПисьмоВФорматеHTML"); КонецПроцедуры &НаКлиенте @@ -1291,18 +1423,7 @@ Объект.ТекстПисьма = ТекстПисьмаИзHTML; КонецЕсли; ТекущийЭлемент = Элементы.ТекстПисьма; - ВидимостьДоступностьКорректность(ЭтаФорма, "ПисьмоВФорматеHTML"); -КонецПроцедуры - -&НаКлиенте -Процедура ВидПочтовогоАдресаПолучателейНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - Если НЕ ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Перед выбором почтового адреса необходимо выбрать получателей'"), - , - "ТипПолучателейРассылки"); - СтандартнаяОбработка = Ложь; - КонецЕсли; + ВидимостьДоступностьКорректность(ЭтотОбъект, "ПисьмоВФорматеHTML"); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -1332,7 +1453,1279 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //////////////////////////////////////////////////////////////////////////////// -// Контекстные вызовы сервера +// Обработчики асинхронных диалогов + +&НаКлиенте +Процедура ПередЗаписьюПродолжение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда // Отключить архивацию и записать. + Объект.Архивировать = Ложь; + Записать(); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Не отключать архивацию и записать. + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("НеОтключатьАрхивацию"); + Записать(ПараметрыЗаписи); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ТипПолучателейРассылкиОбработкаВыбораЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + Объект.Получатели.Очистить(); + ТипПолучателейРассылки = ДополнительныеПараметры.ВыбранноеЗначение; + Модифицированность = Истина; + ТипПолучателейРассылкиПриИзменении(Неопределено); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьШаблонПоУмолчаниюЗавершение(Ответ, ДополнительныеПараметры) Экспорт + ШаблонПоУмолчанию = ДополнительныеПараметры.ШаблонПоУмолчанию; + Если Ответ = 1 Тогда + Если ДополнительныеПараметры.ПерезаполняетсяТема Тогда + Объект.ТемаПисьма = ШаблонПоУмолчанию; + Иначе + Если Объект.ПисьмоВФорматеHTML Тогда + ТекстПисьмаФорматированныйДокумент.Удалить(); + ТекстПисьмаФорматированныйДокумент.Добавить(ШаблонПоУмолчанию, ТипЭлементаФорматированногоДокумента.Текст); + Иначе + Объект.ТекстПисьма = ШаблонПоУмолчанию; + КонецЕсли; + КонецЕсли; + ИначеЕсли Ответ = 2 Тогда + ДобавитьШаблон(ШаблонПоУмолчанию); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьРассылкуПослеОтветаНаВопрос(Ответ, ПараметрыДоставки) Экспорт + Если Ответ = 1 Тогда + Объект.Подготовлена = Истина; + Если НЕ Записать() Тогда + Возврат; + КонецЕсли; + ИначеЕсли Ответ <> -1 Тогда + Возврат; + КонецЕсли; + + // Очистка окна сообщений. + ОчиститьСообщения(); + + // Формирование параметров доставки. + ПараметрыДоставки.Вставить("Рассылка", Объект.Наименование); + + // Папка. + Если ПараметрыДоставки.ИспользоватьПапку Тогда + ПараметрыДоставки.Вставить("Папка", Объект.Папка); + КонецЕсли; + + // Сетевой каталог. + Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда + ПараметрыДоставки.Вставить("СетевойКаталогWindows", Объект.СетевойКаталогWindows); + ПараметрыДоставки.Вставить("СетевойКаталогLinux", Объект.СетевойКаталогLinux); + КонецЕсли; + + // FTP. + Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда + ПараметрыДоставки.Вставить("Сервер", Объект.FTPСервер); + ПараметрыДоставки.Вставить("Порт", Объект.FTPПорт); + ПараметрыДоставки.Вставить("Логин", Объект.FTPЛогин); + ПараметрыДоставки.Вставить("Пароль", Объект.FTPПароль); + ПараметрыДоставки.Вставить("Каталог", Объект.FTPКаталог); + ПараметрыДоставки.Вставить("ПассивноеСоединение", Объект.FTPПассивноеСоединение); + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ПроверитьРассылкуПослеВыбораПолучателей", ЭтотОбъект, ПараметрыДоставки); + + // Почта. + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда + РассылкаОтчетовКлиент.ВыбратьПолучателя(Обработчик, Объект, Ложь, Истина); + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Обработчик, Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьРассылкуПослеВыбораПолучателей(РезультатВыбора, ПараметрыДоставки) Экспорт + // Обработчик результата работы процедуры ПроверитьРассылкуПослеОтветаНаВопрос. + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда + Если РезультатВыбора = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыДоставки.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись); + ПараметрыДоставки.Вставить("СкрытыеКопии", Объект.СкрытыеКопии); + ПараметрыДоставки.Вставить("ШаблонТемы", НСтр("ru = 'Тестовое сообщение 1С:Предприятие'")); + ПараметрыДоставки.Вставить("ШаблонТекста", НСтр("ru = 'Это сообщение отправлено системой рассылок 1С:Предприятие.'") + Символы.ПС + Кэш.ЗаголовокСистемы); + ПараметрыДоставки.Вставить("Получатели", РезультатВыбора); + ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); + ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); + ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); + ПараметрыДоставки.Вставить("Соединение", Неопределено); + + КонецЕсли; + + ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); + + Результат = ПроверитьСпособДоставки(Объект.Ссылка, ПараметрыДоставки); + + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтаФорма, Результат); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьРасписаниеПоШаблонуЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент <> Неопределено Тогда + ЗаполнитьРасписаниеПоВарианту(ВыбранныйЭлемент.Значение, Истина); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьИзменитьШаблонДатыРассылкиЗавершение(СтрокаРезультат, Переменные) Экспорт + Если СтрокаРезультат = Неопределено Тогда + Возврат; + КонецЕсли; + + НовыйФрагмент = Переменные.Префикс + СтрокаРезультат + Переменные.Постфикс; + СтарыйФрагмент = Переменные.Префикс + Переменные.ТекстФормата + Переменные.Постфикс; + ВыделенныйТекст = Переменные.СтарыйТекст; + + Если Переменные.Элемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда + ЗаменаВыполнена = Ложь; + Если Переменные.СтарыйФрагментНайден Тогда + РезультатПоиска = ТекстПисьмаФорматированныйДокумент.НайтиТекст(СтарыйФрагмент); + Если РезультатПоиска <> Неопределено Тогда + Найденные = ТекстПисьмаФорматированныйДокумент.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца); + Для Каждого ТекстФД Из Найденные Цикл + Если Найти(ТекстФД.Текст, СтарыйФрагмент) > 0 Тогда + ТекстФД.Текст = СтрЗаменить(ТекстФД.Текст, СтарыйФрагмент, НовыйФрагмент); + ЗаменаВыполнена = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЕсли; // Переменные.СтарыйФрагментНайден + Если Не ЗаменаВыполнена Тогда + Если СокрЛП(Переменные.СтарыйТекст) = СтарыйФрагмент Тогда + // Для форматированного документа свойство ВыделенныйТекст используется в тех редких случаях, + // когда это безопасно для редактируемого текста. + Переменные.Элемент.ВыделенныйТекст = НовыйФрагмент; + Иначе + ТекстПисьмаФорматированныйДокумент.Добавить(НовыйФрагмент, ТипЭлементаФорматированногоДокумента.Текст); + КонецЕсли; + КонецЕсли; + Иначе + Если Переменные.СтарыйФрагментНайден Тогда + Если СтрокаРезультат = Переменные.ТекстФормата Тогда + Возврат; + КонецЕсли; + Переменные.Элемент.ВыделенныйТекст = СтрЗаменить(Переменные.СтарыйТекст, СтарыйФрагмент, НовыйФрагмент); + Иначе + Переменные.Элемент.ВыделенныйТекст = Переменные.СтарыйТекст + НовыйФрагмент; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьФорматЗавершение(СписокФорматов, Переменные) Экспорт + Если СписокФорматов = Неопределено Тогда + Возврат; + КонецЕсли; + + // Проверка изменений + ФорматыСовпадают = Истина; + Для н = 1 По СписокФорматов.Количество() Цикл + Если СписокФорматов[н-1].Пометка <> Переменные.СписокФорматовКопия[н-1].Пометка Тогда + ФорматыСовпадают = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если ФорматыСовпадают Тогда + Возврат; + КонецЕсли; + + ПредставлениеФормата = ""; + + // Очистка существующих записей + ОчиститьФормат(Переменные.СсылкаНаОтчет); + + // Добавление отмеченных форматов + Для Каждого ЭлементСписка Из СписокФорматов Цикл + Если ЭлементСписка.Пометка Тогда + СтрокаФормат = Объект.ФорматыОтчетов.Добавить(); + СтрокаФормат.Отчет = Переменные.СсылкаНаОтчет; + СтрокаФормат.Формат = ЭлементСписка.Значение; + ПредставлениеФормата = ПредставлениеФормата + ?(ПредставлениеФормата = "", "", ", ") + Строка(ЭлементСписка.Значение); + КонецЕсли; + КонецЦикла; + + Если Переменные.ЭтоФорматПоУмолчанию И ПредставлениеФормата = "" Тогда + ПредставлениеФормата = СписокФорматовПоУмолчаниюПредставление; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Переменные.ОбработчикРезультата, ПредставлениеФормата); +КонецПроцедуры + +&НаКлиенте +Процедура ФорматыОтчетовФорматыЗавершениеВыбора(ПредставлениеФормата, Переменные) Экспорт + Если ПредставлениеФормата <> Неопределено Тогда + Переменные.СтрокаОтчеты.Форматы = ПредставлениеФормата; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ФорматыПоУмолчаниюЗавершениеВыбора(ПредставлениеФормата, Переменные) Экспорт + Если ПредставлениеФормата <> Неопределено Тогда + ФорматыПоУмолчанию = ПредставлениеФормата; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПослеИзмененияРасписания(РасписаниеРезультат, ДополнительныеПараметры) Экспорт + Если РасписаниеРезультат <> Неопределено Тогда + Модифицированность = Истина; + Расписание = РасписаниеРезультат; + ВидимостьДоступностьКорректность(ЭтотОбъект, "Расписание"); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПредварительныйПросмотрОтчетаПродолжение(РезультатВыбора, ПараметрыОтчета) Экспорт + // Обработчик результата работы процедуры ПредварительныйПросмотрОтчета. + Если Объект.Персонализирована Тогда + Если РезультатВыбора = Неопределено Тогда + Возврат; + КонецЕсли; + Получатель = РезультатВыбора.Получатель; + Иначе + Получатель = Неопределено; + КонецЕсли; + + ТребуемыеРеквизиты = Новый Структура; + ТребуемыеРеквизиты.Вставить("Ссылка", Объект.Ссылка); + ТребуемыеРеквизиты.Вставить("Персонализирована", Объект.Персонализирована); + ТребуемыеРеквизиты.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Результат = СформироватьОтчетНаСервере(ПараметрыОтчета, Получатель, ТребуемыеРеквизиты); + + // Вывод табличного документа + Если ТипЗнч(Результат.ТабДок) = Тип("ТабличныйДокумент") Тогда + Результат.ТабДок.ТолькоПросмотр = Истина; + Результат.ТабДок.ОтображатьСетку = Ложь; + Результат.ТабДок.Показать(ПараметрыОтчета.Представление); + КонецЕсли; + + // Вывод результата пользователю + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, Результат); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Клиент + +&НаКлиенте +Процедура ДобавитьПеретащитьПолучателя(ПолучательИлиНаборПолучателей) + Если ПодборПользователейИлиГрупп(ПолучательИлиНаборПолучателей) Тогда + + КоличествоПолучателей = Объект.Получатели.Количество(); + Для н = 1 По КоличествоПолучателей Цикл + ИндексПолучателя = КоличествоПолучателей - н; + + СтрокаПолучатель = Объект.Получатели.Получить(ИндексПолучателя); + + ИндексВМассиве = ПолучательИлиНаборПолучателей.Найти(СтрокаПолучатель.Получатель); + Если ИндексВМассиве = Неопределено Тогда + Объект.Получатели.Удалить(СтрокаПолучатель); + Иначе + ПолучательИлиНаборПолучателей.Удалить(ИндексВМассиве); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + МассивНовыхСтрок = ВыборПодборПеретаскиваниеВТабличнуюЧасть( + ПолучательИлиНаборПолучателей, + Объект.Получатели, + "Получатель", + Новый Структура("Исключен", Ложь)); + + Если МассивНовыхСтрок.Количество() > 0 Тогда + Если МассивНовыхСтрок.Количество() = 1 Тогда + ЗаголовокОповещения = НСтр("ru = 'Получатель добавлен в рассылку'"); + Иначе + ЗаголовокОповещения = НСтр("ru = 'Получатели добавлены в рассылку'"); + КонецЕсли; + + ТекстОповещения = ""; + Для Каждого СтрокаПолучатель Из МассивНовыхСтрок Цикл + ТекстОповещения = ТекстОповещения + ?(ТекстОповещения = "", "", ", ") + Строка(СтрокаПолучатель.Получатель); + КонецЦикла; + + ПоказатьОповещениеПользователя(ЗаголовокОповещения, , ТекстОповещения, БиблиотекаКартинок.ВыполнитьЗадачу); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Уникальность = Истина) + ПереданаСтруктура = (ТипЗнч(ЭлементПодбора) = Тип("Структура")); + Если ПереданаСтруктура ИЛИ ТипЗнч(ЭлементПодбора) = Тип("ДанныеФормыЭлементКоллекции") Тогда + Если ЭлементПодбора.Свойство(ИмяРеквизита) Тогда + ЗначениеРеквизита = ЭлементПодбора[ИмяРеквизита]; + Иначе + Возврат Неопределено; + КонецЕсли; + Иначе // (СправочникСсылка.*) перетаскивание из формы выбора или подбора + ЗначениеРеквизита = ЭлементПодбора; + КонецЕсли; + + // Требуется уникальность реквизита в рамках таблицы + Найденные = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяРеквизита, ЗначениеРеквизита)); + + Если Уникальность И Найденные.Количество() > 0 Тогда + Возврат Неопределено; + КонецЕсли; + + СтрокаТаблицы = ТабличнаяЧасть.Добавить(); + СтрокаТаблицы[ИмяРеквизита] = ЗначениеРеквизита; + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтруктураЗаполнения); + Если ПереданаСтруктура Тогда + Для Каждого КлючИЗначение Из ЭлементПодбора Цикл + Если СтруктураЗаполнения.Свойство(КлючИЗначение.Ключ) Тогда + ЭлементПодбора.Удалить(ЭлементПодбора.Ключ); + КонецЕсли; + КонецЦикла; + ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементПодбора); + КонецЕсли; + + Возврат СтрокаТаблицы; +КонецФункции + +&НаКлиенте +Функция ВыборПодборПеретаскиваниеВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Идентификаторы = Ложь) + Модифицированность = Истина; + МассивНовыхСтрок = Новый Массив; + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда + Для Каждого ЭлементПодбора Из ВыбранноеЗначение Цикл + Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения); + Если Результат <> Неопределено Тогда + МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат)); + КонецЕсли; + КонецЦикла; + Иначе + Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения); + Если Результат <> Неопределено Тогда + МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат)); + КонецЕсли; + КонецЕсли; + Возврат МассивНовыхСтрок; +КонецФункции + +&НаКлиенте +Процедура ОткрытьФормуВыбораДляПодбораПолучателей(ФормаИлиЭлементФормы) + Отказ = Ложь; + ПроверитьТипПолучателей(Отказ); + Если Отказ Тогда + Возврат; + КонецЕсли; + + Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки)); + + Если Найденные.Количество() = 1 Тогда + ПараметрыРасширеннойФормыПодбора = ВыбранныеПолучателиРассылки(); + ПараметрыФормыВыбора = Новый Структура; + // Стандартные реквизиты формы выбора (см. Расширение управляемой формы для динамического списка) + ПараметрыФормыВыбора.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.ГруппыИЭлементы); + ПараметрыФормыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь); + ПараметрыФормыВыбора.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина); + ПараметрыФормыВыбора.Вставить("МножественныйВыбор", Истина); + ПараметрыФормыВыбора.Вставить("РежимВыбора", Истина); + // Предполагаемые реквизиты + ПараметрыФормыВыбора.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.Независимый); + ПараметрыФормыВыбора.Вставить("ВыборГрупп", Истина); + ПараметрыФормыВыбора.Вставить("ВыборГруппПользователей", Истина); + ПараметрыФормыВыбора.Вставить("РазрешитьНачалоПеретаскивания", Истина); + // Параметры открытия расширенной формы подбора + // (описание реквизитов см. в форме списка справочника Пользователи) + ПараметрыФормыВыбора.Вставить("РасширенныйПодбор", Истина); + ПараметрыФормыВыбора.Вставить("ПараметрыРасширеннойФормыПодбора", ПараметрыРасширеннойФормыПодбора); + + ОткрытьФорму(Найденные[0].ПутьФормыВыбора, ПараметрыФормыВыбора, ФормаИлиЭлементФормы); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ВыбратьФормат(СсылкаНаОтчет, ОбработчикРезультата) + // Для хранения всех форматов, выбранных пользователем, используется табличная часть ФорматыОтчетов. + // При этом, для форматов "по умолчанию" используется пустое значение реквизита Отчет. + // В зависимости от типа внедрения реквизит Отчет может принимать значение Неопределено или ПустаяСсылка. + ЭтоФорматПоУмолчанию = НЕ ЗначениеЗаполнено(СсылкаНаОтчет); + + Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет)); + Если Найденные.Количество() > 0 Тогда + СписокФорматов.ЗаполнитьПометки(Ложь); + Для Каждого СтрокаФормат Из Найденные Цикл + СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина; + КонецЦикла; + Иначе + СписокФорматов = СписокФорматовПоУмолчанию.Скопировать(); + Если НЕ ЭтоФорматПоУмолчанию Тогда + Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", Кэш.ПустоеЗначениеОтчета)); + Если Найденные.Количество() > 0 Тогда + СписокФорматов.ЗаполнитьПометки(Ложь); + Для Каждого СтрокаФормат Из Найденные Цикл + СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина; + КонецЦикла; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ЭтоФорматПоУмолчанию Тогда + ЗаголовокДиалога = НСтр("ru = 'Выберите форматы по умолчанию'"); + Иначе + ЗаголовокДиалога = НСтр("ru = 'Выберите форматы для отчета ""%1""'"); + ЗаголовокДиалога = СтрЗаменить(ЗаголовокДиалога, "%1", Строка(СсылкаНаОтчет)); + КонецЕсли; + + Переменные = Новый Структура; + Переменные.Вставить("СсылкаНаОтчет", СсылкаНаОтчет); + Переменные.Вставить("СписокФорматовКопия", СписокФорматов.Скопировать()); + Переменные.Вставить("ЭтоФорматПоУмолчанию", ЭтоФорматПоУмолчанию); + Переменные.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("ВыбратьФорматЗавершение", ЭтотОбъект, Переменные); + + СписокФорматов.ПоказатьОтметкуЭлементов(Обработчик, ЗаголовокДиалога); + +КонецФункции + +&НаКлиенте +Процедура ОчиститьФормат(СсылкаНаОтчет) + Модифицированность = Истина; + Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет)); + Для Каждого СтрокаФормат Из Найденные Цикл + Объект.ФорматыОтчетов.Удалить(СтрокаФормат); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьШаблон(ТекстовыйШаблон = Неопределено, ИсключитьТемуПисьма = Ложь) + // Проверяем и устанавливаем фокус в нужный элемент + Если ИсключитьТемуПисьма ИЛИ НЕ (ТекущийЭлемент = Элементы.ТемаПисьма ИЛИ ТекущийЭлемент = Элементы.ИмяАрхива) Тогда + Если Объект.ПисьмоВФорматеHTML Тогда + Если ТекущийЭлемент <> Элементы.ТекстПисьмаФорматированныйДокумент Тогда + ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент; + КонецЕсли; + Иначе + Если ТекущийЭлемент <> Элементы.ТекстПисьма Тогда + ТекущийЭлемент = Элементы.ТекстПисьма; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ТекстовыйШаблон = Неопределено Тогда + // Ограничимся подготовкой к добавлению шаблона (переключением текущего элемента) + Возврат; + КонецЕсли; + + Если ТекущийЭлемент.ВыделенныйТекст = "" Тогда + // Форматированный документ некорректно отрабатывает изменения свойства + // ВыделенныйТекст, в случае, если ничего не выделено, + // поэтому используется альтернативный метод добавления текста. + Если ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда + ТекстПисьмаФорматированныйДокумент.Добавить(ТекстовыйШаблон, ТипЭлементаФорматированногоДокумента.Текст); + Иначе + ТекущийЭлемент.ВыделенныйТекст = ТекстовыйШаблон; + КонецЕсли; + Иначе + ТекущийЭлемент.ВыделенныйТекст = ТекущийЭлемент.ВыделенныйТекст + ТекстовыйШаблон; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ИзменитьСоставМассива(Добавить, Элемент, Знач Массив) + Индекс = Массив.Найти(Элемент); + Если Добавить И Индекс = Неопределено Тогда + ВГраницаПлюс1 = ?(Массив.Количество() >= Элемент, Элемент, Массив.Количество()); + Для н = 1 По ВГраницаПлюс1 Цикл + Если Массив[ВГраницаПлюс1-н] < Элемент Тогда + Массив.Вставить(ВГраницаПлюс1-н+1, Элемент); + Возврат Массив; + КонецЕсли; + КонецЦикла; + Массив.Вставить(0, Элемент); + ИначеЕсли НЕ Добавить И Индекс <> Неопределено Тогда + Массив.Удалить(Индекс); + КонецЕсли; + Возврат Массив; +КонецФункции + +&НаКлиенте +Процедура ИзменитьРасписаниеВДиалоге() + Обработчик = Новый ОписаниеОповещения("ПослеИзмененияРасписания", ЭтотОбъект); + ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + ДиалогРасписания.Показать(Обработчик); +КонецПроцедуры + +&НаКлиенте +Процедура ВычислитьФлажкиДополнительныхСпособовДоставки() + Объект.ИспользоватьПапку = Публиковать И (ДругойСпособДоставки = "ИспользоватьПапку"); + Объект.ИспользоватьСетевойКаталог = Публиковать И (ДругойСпособДоставки = "ИспользоватьСетевойКаталог"); + Объект.ИспользоватьFTPРесурс = Публиковать И (ДругойСпособДоставки = "ИспользоватьFTPРесурс"); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьРассылку(ПараметрыДоставки) + // Очистка окна сообщений. + ОчиститьСообщения(); + + // Проверка подготовленности данных и необходимости записи. + Если НЕ Объект.Подготовлена ИЛИ Объект.Ссылка.Пустая() Тогда + ЗаголовокВопроса = НСтр("ru = 'Проверка способа доставки'"); + Если НЕ Объект.Подготовлена Тогда + ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть подготовлена. + |Нажмите ""Продолжить"", чтобы установить флажок ""Подготовлена"" и записать рассылку.'"); + Иначе + ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть записана. + |Нажмите ""Продолжить"", чтобы записать рассылку.'"); + КонецЕсли; + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(1, НСтр("ru = 'Продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + + Обработчик = Новый ОписаниеОповещения("ПроверитьРассылкуПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыДоставки); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, 1, ЗаголовокВопроса); + Иначе + ПроверитьРассылкуПослеОтветаНаВопрос(-1, ПараметрыДоставки); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьТипПолучателей(Отказ) + Если НЕ ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда + ТекстСообщения = НСтр("ru = 'Поле ""Получатели"" не заполнено'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ТипПолучателейРассылки"); + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьКоличествоПолучателей(Отказ) + Если Объект.Получатели.Количество() = 0 Тогда + ТекстСообщения = НСтр("ru = 'Не введено ни одной строки в список ""Получатели"".'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "Объект.Получатели"); + Отказ = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Функция ПодборПользователейИлиГрупп(ПолучательИлиНаборПолучателей) + Если ТипЗнч(ПолучательИлиНаборПолучателей) = Тип("Массив") + И ПолучательИлиНаборПолучателей.Количество() > 0 + И (ТипЗнч(ПолучательИлиНаборПолучателей[0]) = Тип("СправочникСсылка.Пользователи") + Или ТипЗнч(ПолучательИлиНаборПолучателей[0]) = Тип("СправочникСсылка.ГруппыПользователей")) Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Клиент, Сервер + +&НаКлиентеНаСервереБезКонтекста +Процедура ПереключитьСтраницу(Элементы, ИмяНабораСтраниц, СуффиксСтраниц) + Элементы[ИмяНабораСтраниц].ТекущаяСтраница = Элементы[ИмяНабораСтраниц + СуффиксСтраниц]; +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ВидимостьДоступностьКорректность(Форма, Изменения = "") + Объект = Форма.Объект; + Элементы = Форма.Элементы; + + Если Изменения = "" ИЛИ Изменения = "FTPСерверИКаталог" Тогда + Форма.FTPСерверИКаталог = "ftp://"+ Объект.FTPСервер + Объект.FTPКаталог; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ВидРассылки" Тогда + // Корректность + Если Объект.Личная И Объект.Персонализирована Тогда + Объект.Личная = Ложь; + КонецЕсли; + + ИспользуетсяГруппаЛичныхРассылок = (Объект.Родитель = Форма.Кэш.ГруппаЛичныхРассылок); + Если Объект.Личная <> ИспользуетсяГруппаЛичныхРассылок Тогда + УстановитьМодифицированностьФормы(Форма, "Родитель", , + НСтр("ru = 'Группа установлена в соответствии с видом рассылки'")); + Объект.Родитель = ?(Объект.Личная, Форма.Кэш.ГруппаЛичныхРассылок, Неопределено); + КонецЕсли; + + Если Объект.Личная Тогда + РассылкаОбщая = Ложь; + Форма.ВидРассылки = "Личная"; + ИначеЕсли Объект.Персонализирована Тогда + РассылкаОбщая = Ложь; + Форма.ВидРассылки = "Персонализирована"; + Иначе + РассылкаОбщая = Истина; + Форма.ВидРассылки = "Общая"; + КонецЕсли; + + Если НЕ РассылкаОбщая Тогда + Объект.ИспользоватьПапку = Ложь; + Объект.ИспользоватьСетевойКаталог = Ложь; + Объект.ИспользоватьFTPРесурс = Ложь; + Объект.ИспользоватьЭлектроннуюПочту = Истина; + КонецЕсли; + + // Видимость & Доступность + Элементы.Родитель.Доступность = НЕ Объект.Личная; + Элементы.НастройкаПолучателей.Видимость = НЕ Объект.Личная; + ПереключитьСтраницу(Элементы, "ВидыРассылки", ?(Объект.Личная, "Личная", "ДляПолучателей")); + Элементы.ДругиеСпособыДоставки.Видимость = РассылкаОбщая; + Элементы.ГруппаИспользоватьЭлектроннуюПочту.Видимость = РассылкаОбщая; + + // Восстановление параметров + Если Объект.ИспользоватьПапку Тогда + Форма.ДругойСпособДоставки = "ИспользоватьПапку"; + Форма.Публиковать = Истина; + ИначеЕсли Объект.ИспользоватьСетевойКаталог Тогда + Форма.ДругойСпособДоставки = "ИспользоватьСетевойКаталог"; + Форма.Публиковать = Истина; + ИначеЕсли Объект.ИспользоватьFTPРесурс Тогда + Форма.ДругойСпособДоставки = "ИспользоватьFTPРесурс"; + Форма.Публиковать = Истина; + Иначе + Форма.ДругойСпособДоставки = Элементы.ДругойСпособДоставки.СписокВыбора[0].Значение; + Форма.Публиковать = Ложь; + КонецЕсли; + + Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета1.Видимость = Объект.Персонализирована; + Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета2.Видимость = Объект.Персонализирована; + Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета3.Видимость = Объект.Персонализирована; + Элементы.ИспользоватьПолучателяРассылкиВНастройкеОтчета4.Видимость = Объект.Персонализирована; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "Отчеты" Тогда + КоличествоОтчетов = Форма.Объект.Отчеты.Количество(); + Если КоличествоОтчетов > 0 Тогда + Элементы.СтраницаОтчеты.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отчеты (%1)'"), + Формат(КоличествоОтчетов, "ЧН=0; ЧГ=")); + Иначе + Элементы.СтраницаОтчеты.Заголовок = НСтр("ru = 'Отчеты'") ; + КонецЕсли; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ДругойСпособДоставки" ИЛИ Изменения = "Публиковать" ИЛИ Изменения = "ВидРассылки" Тогда + Элементы.ДругойСпособДоставки.Доступность = Форма.Публиковать; + Элементы.ПараметрыДоставки.Доступность = Форма.Публиковать; + Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы[Форма.ДругойСпособДоставки]; + Элементы.ПроверитьПубликацию.Доступность = Форма.Публиковать; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ИспользоватьЭлектроннуюПочту" ИЛИ Изменения = "ВидРассылки" Тогда + Элементы.ГруппаУчетнаяЗапись.Доступность = Объект.ИспользоватьЭлектроннуюПочту; + Элементы.ПараметрыПисьма.Доступность = Объект.ИспользоватьЭлектроннуюПочту; + Элементы.ДополнительныеПараметрыРассылкиПоЭлектроннойПочте.Доступность = Объект.ИспользоватьЭлектроннуюПочту; + КонецЕсли; + + Если Изменения = "" + ИЛИ Изменения = "ТолькоУведомить" + ИЛИ Изменения = "ИспользоватьЭлектроннуюПочту" + ИЛИ Изменения = "ДругойСпособДоставки" + ИЛИ Изменения = "Публиковать" + ИЛИ Изменения = "ВидРассылки" Тогда + + ВидимостьОпции = (Объект.ИспользоватьЭлектроннуюПочту И Форма.Публиковать); + ПереключитьСтраницу(Элементы, "ТолькоУведомления", ?(ВидимостьОпции, "Показать", "Скрыть")); + Если НЕ ВидимостьОпции Тогда + Объект.ТолькоУведомить = Ложь; + КонецЕсли; + + СпособыДоставки = ""; + Если Объект.ИспользоватьПапку Тогда + СпособыДоставки = НСтр("ru = 'папка'"); + КонецЕсли; + Если Объект.ИспользоватьСетевойКаталог Тогда + СпособыДоставки = НСтр("ru = 'сетевой каталог'"); + КонецЕсли; + Если Объект.ИспользоватьFTPРесурс Тогда + СпособыДоставки = НСтр("ru = 'FTP'"); + КонецЕсли; + Если Объект.ИспользоватьЭлектроннуюПочту И НЕ Объект.ТолькоУведомить Тогда + СпособыДоставки = СпособыДоставки + ?(СпособыДоставки = "", НСтр("ru = 'эл. почта'"), " "+ НСтр("ru = 'и эл. почта'")); + КонецЕсли; + + Элементы.СтраницаДоставка.Заголовок = СтрЗаменить(НСтр("ru = 'Доставка (%1)'"), "%1", СпособыДоставки); + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ПисьмоВФорматеHTML" Тогда + ПереключитьСтраницу(Элементы, "СтраницыТекстПисьма", ?(Объект.ПисьмоВФорматеHTML, "HTML", "ОбычныйТекст")); + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "Архивировать" Тогда + Элементы.ИмяАрхива.Доступность = Объект.Архивировать; + Элементы.ПарольАрхива.Доступность = Объект.Архивировать; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ВыполнятьПоРасписанию" Тогда + Если Объект.ВыполнятьПоРасписанию Тогда + Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (активно)'"); + Иначе + Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (не активно)'"); + КонецЕсли; + Элементы.ПараметрыВыполненияПоРасписанию.Доступность = Объект.ВыполнятьПоРасписанию; + Элементы.СтраницыПериодичности.Доступность = Объект.ВыполнятьПоРасписанию; + КонецЕсли; + + Если Изменения = "" ИЛИ Изменения = "ПериодичностьРасписания" Тогда + ИмяПеречисления = Форма.Кэш.Перечисления.Периодичности[Объект.ПериодичностьРасписания]; + + Элементы.СтраницыПериодичности.ТекущаяСтраница = Элементы["Страница"+ИмяПеречисления]; + Если ИмяПеречисления = "Произвольное" Тогда + Элементы.СтраницыВремяИлиИзменить.ТекущаяСтраница = Элементы.СтраницаИзменитьРасписание; + Иначе + Элементы.СтраницыВремяИлиИзменить.ТекущаяСтраница = Элементы.СтраницаВремяНачала; + КонецЕсли; + + // Сброс параметров, которые не соответствуют закладкам упрощенного редактирования + Если Изменения = "ПериодичностьРасписания" + И (ИмяПеречисления = "Ежедневно" + ИЛИ ИмяПеречисления = "Еженедельно" + ИЛИ ИмяПеречисления = "Ежемесячно") Тогда + + // Общие параметры + Форма.Расписание.ДатаНачала = '00010101'; + Форма.Расписание.ДатаКонца = '00010101'; + Форма.Расписание.ВремяКонца = '00010101'; + Форма.Расписание.ВремяЗавершения = '00010101'; + Форма.Расписание.ДеньНеделиВМесяце = 0; + Форма.Расписание.ДетальныеРасписанияДня = Новый Массив; + Форма.Расписание.ИнтервалЗавершения = 0; + Форма.Расписание.ПаузаПовтора = 0; + Форма.Расписание.ПериодНедель = 0; + Форма.Расписание.ПериодПовтораВТечениеДня = 0; + + Если ИмяПеречисления <> "Ежедневно" Тогда + Форма.Расписание.ПериодПовтораДней = 1; + КонецЕсли; + + Если ИмяПеречисления <> "Еженедельно" Тогда + ВыбранныеДниНедели = Новый Массив; + Для н = 1 По 7 Цикл + ВыбранныеДниНедели.Добавить(н); + КонецЦикла; + Форма.Расписание.ДниНедели = ВыбранныеДниНедели; + КонецЕсли; + + Если ИмяПеречисления <> "Ежемесячно" Тогда + ВсеМесяцы = Новый Массив; + Для н = 1 По 12 Цикл + ВсеМесяцы.Добавить(н); + КонецЦикла; + Форма.Расписание.Месяцы = ВсеМесяцы; + Форма.Расписание.ДеньВМесяце = 0; + КонецЕсли; + КонецЕсли; + + // Восстанавливаем параметры на текущей закладке в соответствии с параметрами расписания + Если ИмяПеречисления = "Ежедневно" Тогда + Форма.ВремяНачала = Форма.Расписание.ВремяНачала; + Форма.ПериодПовтораДней = Форма.Расписание.ПериодПовтораДней; + ИначеЕсли ИмяПеречисления = "Еженедельно" Тогда + Форма.ВремяНачала = Форма.Расписание.ВремяНачала; + Для Каждого КлючИЗначение Из Форма.Кэш.Соответствия.ДниНедели Цикл + Форма[КлючИЗначение.Ключ] = (Форма.Расписание.ДниНедели.Найти(КлючИЗначение.Значение) <> Неопределено); + КонецЦикла; + ИначеЕсли ИмяПеречисления = "Ежемесячно" Тогда + Форма.ВремяНачала = Форма.Расписание.ВремяНачала; + Если Форма.Расписание.ДеньВМесяце >= 0 Тогда + Форма.ДеньВМесяце = Форма.Расписание.ДеньВМесяце; + Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'начала'"); + Иначе + Форма.ДеньВМесяце = -Форма.Расписание.ДеньВМесяце; + Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'конца'"); + КонецЕсли; + Для Каждого КлючИЗначение Из Форма.Кэш.Соответствия.Месяцы Цикл + Форма[КлючИЗначение.Ключ] = (Форма.Расписание.Месяцы.Найти(КлючИЗначение.Значение) <> Неопределено); + КонецЦикла; + КонецЕсли; + + КонецЕсли; // Изменения = "" ИЛИ Изменения = "ПериодичностьРасписания" + + Если Изменения = "" ИЛИ Изменения = "НачалоКонецМесяца" Тогда + Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = ?(Форма.Расписание.ДеньВМесяце >= 0, "начала", "конца"); + КонецЕсли; + + Если Изменения = "" ИЛИ Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРасписание Тогда + Форма.ПредставлениеРасписания = Строка(Форма.Расписание); + КонецЕсли; +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура УстановитьМодифицированностьФормы(Форма, Поле = "", ПутьКДанным = "", Текст = "") + Если НЕ Форма.Модифицированность Тогда + Форма.ФормаБылаМодифицированаНаСервере = Истина; + Если ЗначениеЗаполнено(Текст) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , Поле, ПутьКДанным); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Функция ПредставлениеФорматовПоУмолчанию() + Возврат НСтр("ru = 'по умолчанию'"); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вызов сервера, Сервер + +&НаСервереБезКонтекста +Функция ПолучитьСписокПочтовыхАдресов(Получатель, СписокЗначений = Неопределено) + ТекстЗапроса = + "ВЫБРАТЬ + | тчКонтактнаяИнформация.Представление КАК Представление, + | тчКонтактнаяИнформация.Вид КАК Значение + |ИЗ + | Справочник.Пользователи.КонтактнаяИнформация КАК тчКонтактнаяИнформация + |ГДЕ + | тчКонтактнаяИнформация.Ссылка = &Получатель + | И тчКонтактнаяИнформация.Тип = &ТипКИ"; + Попытка + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Пользователи", Получатель.Метаданные().Имя); + Исключение + Возврат СписокЗначений; + КонецПопытки; + + Если СписокЗначений = Неопределено Тогда + СписокЗначений = Новый СписокЗначений; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Получатель", Получатель); + Запрос.УстановитьПараметр("ТипКИ", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); + Запрос.Текст = ТекстЗапроса; + + ТЗИтог = Запрос.Выполнить().Выгрузить(); + Для Каждого СтрИтог Из ТЗИтог Цикл + Если ЗначениеЗаполнено(СтрИтог.Представление) Тогда + СписокЗначений.Добавить(СтрИтог.Значение, СтрИтог.Представление +" ("+ Строка(СтрИтог.Значение) +")"); + КонецЕсли; + КонецЦикла; + + Возврат СписокЗначений; +КонецФункции + +&НаСервереБезКонтекста +Функция СформироватьОтчетНаСервере(Знач ПараметрыОтчета, Получатель, ТребуемыеРеквизиты) + ПараметрыЖурнала = Новый Структура; + ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Формирование отчета'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + ПараметрыЖурнала.Вставить("Данные", ТребуемыеРеквизиты.Ссылка); + ПараметрыЖурнала.Вставить("Метаданные", ПараметрыЖурнала.Данные.Метаданные()); + ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив); + + ОтчетИнициализирован = РассылкаОтчетов.ИнициализироватьОтчет( + ПараметрыЖурнала, + ПараметрыОтчета, + ТребуемыеРеквизиты.Персонализирована + ); + + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); + Результат.Вставить("ТабДок", Неопределено); + + ОтчетСформирован = Ложь; + ТекстПредупреждения = ""; + Если ОтчетИнициализирован Тогда + Попытка + РезультатФормирования = РассылкаОтчетов.СформироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, Получатель); + ОтчетСформирован = РезультатФормирования.Сформирован; + Если РезультатФормирования.Пустой И НЕ ПараметрыОтчета.ОтправлятьЕслиПустой Тогда + ТекстПредупреждения = НСтр("ru = 'Отчет пустой'"); + Иначе + Результат.ТабДок = РезультатФормирования.ТабДок; + Результат.ВыводОповещения.Использование = Истина; + Результат.ВыводОповещения.Заголовок = НСтр("ru = 'Отчет сформирован'"); + Результат.ВыводОповещения.Текст = Строка(ПараметрыОтчета.Отчет); + Результат.ВыводОповещения.Картинка = БиблиотекаКартинок.ВыполнитьЗадачу; + КонецЕсли; + Исключение + РассылкаОтчетов.ЗаписьЖурнала(ПараметрыЖурнала, , + НСтр("ru = 'Ошибка формирования отчета %1:'"), ИнформацияОбОшибке(), + "'"+ Строка(ПараметрыОтчета.Отчет) +"'" + ); + КонецПопытки; + КонецЕсли; + + Если Не ОтчетИнициализирован Или Не ОтчетСформирован Тогда + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось сформировать отчет %1.'"), + ?(ПараметрыОтчета.Представление = "", "", "'"+ ПараметрыОтчета.Представление +"'") + ); + КонецЕсли; + + Если ТекстПредупреждения <> "" Тогда + Результат.ВыводПредупреждения.Использование = Истина; + Результат.ВыводПредупреждения.Текст = ТекстПредупреждения; + Результат.ВыводПредупреждения.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(ПараметрыЖурнала.МассивОшибок); + КонецЕсли; + + Возврат Результат; +КонецФункции + +&НаСервереБезКонтекста +Функция ПравоИзмененияПапкиИФайлов(Папка) + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + Результат = МодульРаботаСФайламиСлужебный.ПравоДобавленияФайловВПапку(Папка); + Иначе + Результат = Истина; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, ДобавитьДежурнуюФразу = Истина, ПользовательскиеНастройки = Неопределено) + // Сохранение настроек предыдущего отчета + Если ИдентификаторСтроки <> ИдентификаторТекущейСтрокиТаблицыОтчетов И ИдентификаторТекущейСтрокиТаблицыОтчетов <> -1 Тогда + ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторТекущейСтрокиТаблицыОтчетов); + КонецЕсли; + ИдентификаторТекущейСтрокиТаблицыОтчетов = ИдентификаторСтроки; + + // Поиск строки + СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки); + Если СтрокаОтчеты = Неопределено Тогда + ИдентификаторТекущейСтрокиТаблицыОтчетов = -1; + Возврат ""; + КонецЕсли; + + Если ПользовательскиеНастройки = Неопределено Тогда + // Чтение настроек текущей строки из временного хранилища или из табличной части по ссылке. + Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда + ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек); + Иначе + ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты); + ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки); + ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить()); + КонецЕсли; + КонецЕсли; + + // Инициализация + ПараметрыОтчета = ИнициализироватьОтчет(СтрокаОтчеты, ДобавитьДежурнуюФразу, ПользовательскиеНастройки); + + Возврат ПараметрыОтчета.Ошибки; +КонецФункции + +&НаСервере +Процедура ЗаполнитьРасписаниеПоВарианту(Вариант, ОбновитьВидимость = Ложь) + // Список вариантов - см. РассылкаОтчетовКлиентСервер.СписокВариантовЗаполненияРасписаний() + + Расписание = Новый РасписаниеРегламентногоЗадания; + + // в 7:30 утра + Расписание.ВремяНачала = '00010101073000'; + + // каждый день + Расписание.ПериодПовтораДней = 1; + + // по дням недели + ДеньНеделиМин = 1; + ДеньНеделиМакс = 7; + + // по всем месяцам + ВсеМесяцы = Новый Массив; + Для н = 1 По 12 Цикл + ВсеМесяцы.Добавить(н); + КонецЦикла; + Расписание.Месяцы = ВсеМесяцы; + + Если Вариант = 1 Тогда // "Каждый день" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; + + ИначеЕсли Вариант = 2 Тогда // "Каждый второй день" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; + Расписание.ПериодПовтораДней = 2; + + ИначеЕсли Вариант = 3 Тогда // "Каждый четвертый день" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; + Расписание.ПериодПовтораДней = 4; + + ИначеЕсли Вариант = 4 Тогда // "По будням" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; + ДеньНеделиМин = 1; + ДеньНеделиМакс = 5; + + ИначеЕсли Вариант = 5 Тогда // "По выходным" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; + Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера + ДеньНеделиМин = 6; + ДеньНеделиМакс = 7; + + ИначеЕсли Вариант = 6 Тогда // "По понедельникам" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; + ДеньНеделиМин = 1; + ДеньНеделиМакс = 1; + + ИначеЕсли Вариант = 7 Тогда // "По пятницам" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; + ДеньНеделиМин = 5; + ДеньНеделиМакс = 5; + + ИначеЕсли Вариант = 8 Тогда // "По воскресеньям" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; + Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера + ДеньНеделиМин = 7; + ДеньНеделиМакс = 7; + + ИначеЕсли Вариант = 9 Тогда // "В первый день месяца" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; + Расписание.ДеньВМесяце = 1; + + ИначеЕсли Вариант = 10 Тогда // "В последний день месяца" + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; + Расписание.ДеньВМесяце = -1; + + ИначеЕсли Вариант = 11 Тогда // "Каждый квартал десятого числа" + ВсеМесяцы = Новый Массив; + ВсеМесяцы.Добавить(1); + ВсеМесяцы.Добавить(4); + ВсеМесяцы.Добавить(7); + ВсеМесяцы.Добавить(10); + Расписание.Месяцы = ВсеМесяцы; + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; + Расписание.ДеньВМесяце = 10; + + ИначеЕсли Вариант = 12 Тогда // "Другое..." + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное; + + Иначе + Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; + + КонецЕсли; + + // по дням недели + ВыбранныеДниНедели = Новый Массив; + Для н = ДеньНеделиМин По ДеньНеделиМакс Цикл + ВыбранныеДниНедели.Добавить(н); + КонецЦикла; + Расписание.ДниНедели = ВыбранныеДниНедели; + + Если ОбновитьВидимость Тогда + ВидимостьДоступностьКорректность(ЭтотОбъект); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПроверитьДобавленныеСтрокиОтчетов(СтруктураВыбора) + // СтруктураВыбора: + // Выбрано - Структура - строки, выбранные пользователем + // Успешно - Структура - строки, инициализированные и добавленные в список + // СОшибками - Структура - строки, не добавленные в список из-за ошибок + // * МассивСтрок - Массив + // * Количество - Число + // * ПредставлениеОтчетов - Строка + // * Текст - Строка + + МассивОшибок = Новый Массив; + + СтруктураВыбора.Выбрано.Количество = СтруктураВыбора.Выбрано.МассивСтрок.Количество(); + Для ОбратныйИндекс = 1 По СтруктураВыбора.Выбрано.Количество Цикл + Индекс = СтруктураВыбора.Выбрано.Количество - ОбратныйИндекс; + ИдентификаторСтрокиОтчеты = СтруктураВыбора.Выбрано.МассивСтрок[Индекс]; + + СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтрокиОтчеты); + Если СтрокаОтчеты.Представление = "" Тогда + СтрокаОтчеты.Представление = Строка(СтрокаОтчеты.Отчет); + КонецЕсли; + + СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь); + Если СтрокаПредупреждения = "" Тогда + Ключ = "Успешно"; + Иначе + Ключ = "СОшибками"; + МассивОшибок.Добавить(СтрокаПредупреждения); + КонецЕсли; + + СтруктураВыбора[Ключ].Количество = СтруктураВыбора[Ключ].Количество + 1; + СтруктураВыбора[Ключ].МассивСтрок.Добавить(ИдентификаторСтрокиОтчеты); + СтруктураВыбора[Ключ].ПредставлениеОтчетов = СтруктураВыбора[Ключ].ПредставлениеОтчетов + + ?(СтруктураВыбора[Ключ].ПредставлениеОтчетов = "", "", ", ") + + СтрокаОтчеты.Представление; + КонецЦикла; + + // Установка курсора на первый из добавленных элементов + Если СтруктураВыбора.Успешно.Количество > 0 Тогда + Элементы.Отчеты.ТекущаяСтрока = СтруктураВыбора.Успешно.МассивСтрок[0]; + ИдентификаторТекущейСтрокиТаблицыОтчетов = Элементы.Отчеты.ТекущаяСтрока; + ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь); + КонецЕсли; + + // Сборка текста ошибок + Если СтруктураВыбора.СОшибками.Количество > 0 Тогда + СтруктураВыбора.СОшибками.Текст = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(МассивОшибок); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ПроверитьСпособДоставки(Рассылка, Знач ПараметрыДоставки) + Если Модифицированность И НЕ Записать() Тогда + Возврат Неопределено; + КонецЕсли; + + ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); + + // Инициализация параметров записи в журнал регистрации + УстановитьПривилегированныйРежим(Истина); + + ПараметрыЖурнала = Новый Структура; + ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Проверка способа доставки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + ПараметрыЖурнала.Вставить("Данные", Рассылка); + ПараметрыЖурнала.Вставить("Метаданные", Метаданные.Справочники.РассылкиОтчетов); + ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив); + + УстановитьПривилегированныйРежим(Ложь); + + // Добавление параметров доставки для записи результатов выполнения + ПараметрыДоставки.Вставить("БылиОшибки", Ложь); + ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); + ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); + ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); + ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); + + // Запись пустого табличного документа в html 4 + ПолноеИмяФайла = ПолучитьИмяВременногоФайла(".html"); + + ТабДок = Новый ТабличныйДокумент; + ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML4); + + // Формирование вложений + Файл = Новый Файл(ПолноеИмяФайла); + + Вложения = Новый Соответствие; + Вложения.Вставить(Файл.Имя, Файл.ПолноеИмя); + + // Доставка + Если ПараметрыДоставки.ИспользоватьПапку Тогда + НачатьТранзакцию(); + КонецЕсли; + + Выполнена = РассылкаОтчетов.ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, Вложения); + + Если ПараметрыДоставки.ИспользоватьПапку Тогда + ОтменитьТранзакцию(); + КонецЕсли; + + // Очистка вложений + Для Каждого Вложение Из Вложения Цикл + УдалитьФайлы(Вложение.Значение); + КонецЦикла; + + Если Выполнена Тогда + ТекстСообщения = НСтр("ru = 'Тест способа доставки успешно пройден.'"); + Иначе + ТекстСообщения = НСтр("ru = 'Тест способа доставки не пройден.'"); + КонецЕсли; + + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); + Результат.ВыводПредупреждения.Использование = Истина; + Результат.ВыводПредупреждения.Текст = ТекстСообщения; + Результат.ВыводПредупреждения.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(ПараметрыЖурнала.МассивОшибок); + + Возврат Результат; +КонецФункции + +&НаСервере +Функция ВыбранныеПолучателиРассылки() + + ВыбранныеПользователи = Новый ТаблицаЗначений; + ВыбранныеПользователи.Колонки.Добавить("Пользователь"); + ВыбранныеПользователи.Колонки.Добавить("НомерКартинки"); + + ПолучателиРассылки = Объект.Получатели.Выгрузить(, "Получатель"); + + Для каждого Элемент Из ПолучателиРассылки Цикл + + СтрокаВыбранныеПользователи = ВыбранныеПользователи.Добавить(); + СтрокаВыбранныеПользователи.Пользователь = Элемент.Получатель; + + КонецЦикла; + + ЗаголовокФормыПодбора = НСтр("ru = 'Подбор получателей рассылки'"); + ПараметрыРасширеннойФормыПодбора = Новый Структура("ЗаголовокФормыПодбора, ВыбранныеПользователи", + ЗаголовокФормыПодбора, ВыбранныеПользователи); + АдресХранилища = ПоместитьВоВременноеХранилище(ПараметрыРасширеннойФормыПодбора); + Возврат АдресХранилища; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Сервер + +&НаСервереБезКонтекста +Функция ПолучитьКэш() + // Преобразование наименований в значения + ДниНедели = Новый Соответствие; + ДниНедели.Вставить("Понедельник", 1); + ДниНедели.Вставить("Вторник", 2); + ДниНедели.Вставить("Среда", 3); + ДниНедели.Вставить("Четверг", 4); + ДниНедели.Вставить("Пятница", 5); + ДниНедели.Вставить("Суббота", 6); + ДниНедели.Вставить("Воскресенье", 7); + ДниНедели = Новый ФиксированноеСоответствие(ДниНедели); + + Месяцы = Новый Соответствие; + Месяцы.Вставить("Январь", 1); + Месяцы.Вставить("Февраль", 2); + Месяцы.Вставить("Март", 3); + Месяцы.Вставить("Апрель", 4); + Месяцы.Вставить("Май", 5); + Месяцы.Вставить("Июнь", 6); + Месяцы.Вставить("Июль", 7); + Месяцы.Вставить("Август", 8); + Месяцы.Вставить("Сентябрь", 9); + Месяцы.Вставить("Октябрь", 10); + Месяцы.Вставить("Ноябрь", 11); + Месяцы.Вставить("Декабрь", 12); + Месяцы = Новый ФиксированноеСоответствие(Месяцы); + + // + Периодичности = Новый Соответствие; + Периодичности.Вставить(Перечисления.ПериодичностиРасписанийРассылокОтчетов.ПустаяСсылка(), "НеВыбрано"); + Для Каждого ОбъектМД Из Метаданные.Перечисления.ПериодичностиРасписанийРассылокОтчетов.ЗначенияПеречисления Цикл + Периодичности.Вставить(Перечисления.ПериодичностиРасписанийРассылокОтчетов[ОбъектМД.Имя], ОбъектМД.Имя); + КонецЦикла; + Периодичности = Новый ФиксированноеСоответствие(Периодичности); + + // + Шаблоны = Новый ФиксированнаяСтруктура("Тема, Текст, ИмяАрхива", + РассылкаОтчетовКлиентСервер.ШаблонТемы(), + РассылкаОтчетовКлиентСервер.ШаблонТекста(), + РассылкаОтчетовКлиентСервер.ШаблонИмениАрхива()); + + // + Кэш = Новый Структура; + Кэш.Вставить("ПустоеЗначениеОтчета", РассылкаОтчетовПовтИсп.ПустоеЗначениеОтчета()); + Кэш.Вставить("ГруппаЛичныхРассылок", Справочники.РассылкиОтчетов.ЛичныеРассылки); + Кэш.Вставить("ЗаголовокСистемы", РассылкаОтчетовПовтИсп.ИмяЭтойИнформационнойБазы()); + Кэш.Вставить("Соответствия", Новый ФиксированнаяСтруктура("ДниНедели, Месяцы", ДниНедели, Месяцы)); + Кэш.Вставить("Перечисления", Новый ФиксированнаяСтруктура("Периодичности", Периодичности)); + Кэш.Вставить("Шаблоны", Шаблоны); + Кэш = Новый ФиксированнаяСтруктура(Кэш); + + // + Возврат Кэш; +КонецФункции &НаСервере Процедура ПрочитатьПользовательскоеПредставлениеФорматов() @@ -1431,9 +2824,9 @@ ИначеЕсли СтрокаОтчеты.СКД Тогда СохраняемоеЗначение = КомпоновщикНастроекКД.ПользовательскиеНастройки; Иначе - ИменаРеквизитов = "Реквизит, Представление, Значение, Использование"; + ИменаКолонок = "Реквизит, Представление, Значение, Использование"; Отбор = Новый Структура("Обнаружен", Истина); - СохраняемоеЗначение = НастройкиТекущегоОтчета.Выгрузить().Скопировать(ИменаРеквизитов, Отбор); + СохраняемоеЗначение = НастройкиТекущегоОтчета.Выгрузить().Скопировать(Отбор, ИменаКолонок); КонецЕсли; Адрес = ?(ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек), СтрокаОтчеты.АдресНастроек, УникальныйИдентификатор); @@ -1441,38 +2834,6 @@ СтрокаОтчеты.АдресНастроек = ПоместитьВоВременноеХранилище(СохраняемоеЗначение, Адрес); КонецПроцедуры -&НаСервере -Функция ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтроки, ДобавитьДежурнуюФразу = Истина, ПользовательскиеНастройки = Неопределено) - // Сохранение настроек предыдущего отчета - Если ИдентификаторСтроки <> ИдентификаторТекущейСтрокиТаблицыОтчетов И ИдентификаторТекущейСтрокиТаблицыОтчетов <> -1 Тогда - ЗаписатьНастройкиСтрокиОтчеты(ИдентификаторТекущейСтрокиТаблицыОтчетов); - КонецЕсли; - ИдентификаторТекущейСтрокиТаблицыОтчетов = ИдентификаторСтроки; - - // Поиск строки - СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтроки); - Если СтрокаОтчеты = Неопределено Тогда - ИдентификаторТекущейСтрокиТаблицыОтчетов = -1; - Возврат ""; - КонецЕсли; - - Если ПользовательскиеНастройки = Неопределено Тогда - // Чтение настроек текущей строки из временного хранилища или из табличной части по ссылке. - Если ЭтоАдресВременногоХранилища(СтрокаОтчеты.АдресНастроек) Тогда - ПользовательскиеНастройки = ПолучитьИзВременногоХранилища(СтрокаОтчеты.АдресНастроек); - Иначе - ИндексСтроки = Объект.Отчеты.Индекс(СтрокаОтчеты); - ОбъектСтрокаОтчеты = РеквизитФормыВЗначение("Объект").Отчеты.Получить(ИндексСтроки); - ПользовательскиеНастройки = ?(ОбъектСтрокаОтчеты = Неопределено, Неопределено, ОбъектСтрокаОтчеты.Настройки.Получить()); - КонецЕсли; - КонецЕсли; - - // Инициализация - ПараметрыОтчета = ИнициализироватьОтчет(СтрокаОтчеты, ДобавитьДежурнуюФразу, ПользовательскиеНастройки); - - Возврат ПараметрыОтчета.Ошибки; -КонецФункции - &НаСервере Функция ИнициализироватьОтчет(СтрокаОтчеты, ДобавитьДежурнуюФразу, ПользовательскиеНастройки, Интерактивно = Истина) // Параметры журнала @@ -1488,7 +2849,7 @@ ПараметрыЖурнала, ПараметрыОтчета, Объект.Персонализирована, - ЭтаФорма.УникальныйИдентификатор); + ЭтотОбъект.УникальныйИдентификатор); ПараметрыОтчета.Вставить("МассивОшибок", ПараметрыЖурнала.МассивОшибок); ПараметрыОтчета.Ошибки = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(ПараметрыОтчета.МассивОшибок, ДобавитьДежурнуюФразу); @@ -1563,105 +2924,6 @@ Возврат ПараметрыОтчета; КонецФункции -&НаСервере -Процедура ЗаполнитьРасписаниеПоВарианту(Вариант, ОбновитьВидимость = Ложь) - // Список вариантов - см. РассылкаОтчетовКлиентСервер.СписокВариантовЗаполненияРасписаний() - - Расписание = Новый РасписаниеРегламентногоЗадания; - - // в 7:30 утра - Расписание.ВремяНачала = '00010101073000'; - - // каждый день - Расписание.ПериодПовтораДней = 1; - - // по дням недели - ДеньНеделиМин = 1; - ДеньНеделиМакс = 7; - - // по всем месяцам - ВсеМесяцы = Новый Массив; - Для н = 1 По 12 Цикл - ВсеМесяцы.Добавить(н); - КонецЦикла; - Расписание.Месяцы = ВсеМесяцы; - - Если Вариант = 1 Тогда // "Каждый день" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; - - ИначеЕсли Вариант = 2 Тогда // "Каждый второй день" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; - Расписание.ПериодПовтораДней = 2; - - ИначеЕсли Вариант = 3 Тогда // "Каждый четвертый день" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; - Расписание.ПериодПовтораДней = 4; - - ИначеЕсли Вариант = 4 Тогда // "По будням" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; - ДеньНеделиМин = 1; - ДеньНеделиМакс = 5; - - ИначеЕсли Вариант = 5 Тогда // "По выходным" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; - Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера - ДеньНеделиМин = 6; - ДеньНеделиМакс = 7; - - ИначеЕсли Вариант = 6 Тогда // "По понедельникам" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; - ДеньНеделиМин = 1; - ДеньНеделиМакс = 1; - - ИначеЕсли Вариант = 7 Тогда // "По пятницам" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; - ДеньНеделиМин = 5; - ДеньНеделиМакс = 5; - - ИначеЕсли Вариант = 8 Тогда // "По воскресеньям" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Еженедельно; - Расписание.ВремяНачала = '00010101220000'; // в 10:00 вечера - ДеньНеделиМин = 7; - ДеньНеделиМакс = 7; - - ИначеЕсли Вариант = 9 Тогда // "В первый день месяца" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; - Расписание.ДеньВМесяце = 1; - - ИначеЕсли Вариант = 10 Тогда // "В последний день месяца" - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; - Расписание.ДеньВМесяце = -1; - - ИначеЕсли Вариант = 11 Тогда // "Каждый квартал десятого числа" - ВсеМесяцы = Новый Массив; - ВсеМесяцы.Добавить(1); - ВсеМесяцы.Добавить(4); - ВсеМесяцы.Добавить(7); - ВсеМесяцы.Добавить(10); - Расписание.Месяцы = ВсеМесяцы; - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежемесячно; - Расписание.ДеньВМесяце = 10; - - ИначеЕсли Вариант = 12 Тогда // "Другое..." - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Произвольное; - - Иначе - Объект.ПериодичностьРасписания = Перечисления.ПериодичностиРасписанийРассылокОтчетов.Ежедневно; - - КонецЕсли; - - // по дням недели - ВыбранныеДниНедели = Новый Массив; - Для н = ДеньНеделиМин По ДеньНеделиМакс Цикл - ВыбранныеДниНедели.Добавить(н); - КонецЦикла; - Расписание.ДниНедели = ВыбранныеДниНедели; - - Если ОбновитьВидимость Тогда - ВидимостьДоступностьКорректность(ЭтаФорма); - КонецЕсли; -КонецПроцедуры - &НаСервере Функция ЗафиксироватьЗначенияРеквизитовДоИзменения() ЗначенияРеквизитовДоИзменения = Новый Структура("ИспользоватьПапку, ИспользоватьЭлектроннуюПочту, ТолькоУведомить, Архивировать"); @@ -1669,124 +2931,6 @@ ЗначенияРеквизитовДоИзменения = Новый ФиксированнаяСтруктура(ЗначенияРеквизитовДоИзменения); КонецФункции -&НаСервере -Процедура ПроверитьДобавленныеСтрокиОтчетов(СтруктураВыбора) - // СтруктураВыбора: - // Выбрано - (Структура) строки, выбранные пользователем - // Успешно - (Структура) строки, инициализированные и добавленные в список - // СОшибками - (Структура) строки, не добавленные в список из-за ошибок - // |- Количество - (Число) - // |- МассивСтрок - (Массив) - // |- ПредставлениеОтчетов - (Строка) - // |- Текст - (Строка) - - МассивОшибок = Новый Массив; - - СтруктураВыбора.Выбрано.Количество = СтруктураВыбора.Выбрано.МассивСтрок.Количество(); - Для ОбратныйИндекс = 1 По СтруктураВыбора.Выбрано.Количество Цикл - Индекс = СтруктураВыбора.Выбрано.Количество - ОбратныйИндекс; - ИдентификаторСтрокиОтчеты = СтруктураВыбора.Выбрано.МассивСтрок[Индекс]; - - СтрокаОтчеты = Объект.Отчеты.НайтиПоИдентификатору(ИдентификаторСтрокиОтчеты); - Если СтрокаОтчеты.Представление = "" Тогда - СтрокаОтчеты.Представление = Строка(СтрокаОтчеты.Отчет); - КонецЕсли; - - СтрокаПредупреждения = ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь); - Если СтрокаПредупреждения = "" Тогда - Ключ = "Успешно"; - Иначе - Ключ = "СОшибками"; - МассивОшибок.Добавить(СтрокаПредупреждения); - КонецЕсли; - - СтруктураВыбора[Ключ].Количество = СтруктураВыбора[Ключ].Количество + 1; - СтруктураВыбора[Ключ].МассивСтрок.Добавить(ИдентификаторСтрокиОтчеты); - СтруктураВыбора[Ключ].ПредставлениеОтчетов = СтруктураВыбора[Ключ].ПредставлениеОтчетов - + ?(СтруктураВыбора[Ключ].ПредставлениеОтчетов = "", "", ", ") - + СтрокаОтчеты.Представление; - КонецЦикла; - - // Установка курсора на первый из добавленных элементов - Если СтруктураВыбора.Успешно.Количество > 0 Тогда - Элементы.Отчеты.ТекущаяСтрока = СтруктураВыбора.Успешно.МассивСтрок[0]; - ИдентификаторТекущейСтрокиТаблицыОтчетов = Элементы.Отчеты.ТекущаяСтрока; - ОтчетыПриАктивизацииСтрокиНаСервере(ИдентификаторСтрокиОтчеты, Ложь); - КонецЕсли; - - // Сборка текста ошибок - Если СтруктураВыбора.СОшибками.Количество > 0 Тогда - СтруктураВыбора.СОшибками.Текст = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(МассивОшибок); - КонецЕсли; -КонецПроцедуры - -&НаСервере -Функция ПроверитьСпособДоставки(Рассылка, Знач ПараметрыДоставки) - Если Модифицированность И НЕ Записать() Тогда - Возврат Неопределено; - КонецЕсли; - - ПараметрыДоставки.Вставить("ДатаВыполнения", ТекущаяДатаСеанса()); - - // Инициализация параметров записи в журнал регистрации - УстановитьПривилегированныйРежим(Истина); - - ПараметрыЖурнала = Новый Структура; - ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Проверка способа доставки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); - ПараметрыЖурнала.Вставить("Данные", Рассылка); - ПараметрыЖурнала.Вставить("Метаданные", Метаданные.Справочники.РассылкиОтчетов); - ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив); - - УстановитьПривилегированныйРежим(Ложь); - - // Добавление параметров доставки для записи результатов выполнения - ПараметрыДоставки.Вставить("БылиОшибки", Ложь); - ПараметрыДоставки.Вставить("БылиПредупреждения", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВПапку", Ложь); - ПараметрыДоставки.Вставить("ВыполненаВСетевойКаталог", Ложь); - ПараметрыДоставки.Вставить("ВыполненаНаFTP", Ложь); - ПараметрыДоставки.Вставить("ВыполненаПоЭлектроннойПочте", Ложь); - - // Запись пустого табличного документа в html 4 - ПолноеИмяФайла = ПолучитьИмяВременногоФайла(".html"); - - ТабДок = Новый ТабличныйДокумент; - ТабДок.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML4); - - // Формирование вложений - Файл = Новый Файл(ПолноеИмяФайла); - - Вложения = Новый Соответствие; - Вложения.Вставить(Файл.Имя, Файл.ПолноеИмя); - - // Доставка - Если ПараметрыДоставки.ИспользоватьПапку Тогда - НачатьТранзакцию(); - КонецЕсли; - - Выполнена = РассылкаОтчетов.ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, Вложения); - - Если ПараметрыДоставки.ИспользоватьПапку Тогда - ОтменитьТранзакцию(); - КонецЕсли; - - // Очистка вложений - Для Каждого Вложение Из Вложения Цикл - УдалитьФайлы(Вложение.Значение); - КонецЦикла; - - Результат = Новый Структура("Оповестить, Заголовок, Текст, ТекстОшибок"); - Результат.Оповестить = Ложь; - Результат.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(ПараметрыЖурнала.МассивОшибок); - Если Выполнена Тогда - Результат.Текст = НСтр("ru = 'Тест способа доставки успешно пройден.'"); - Иначе - Результат.Текст = НСтр("ru = 'Тест способа доставки не пройден.'"); - КонецЕсли; - - Возврат Результат; -КонецФункции - &НаСервере Процедура ДобавитьНастройкиОтчетов(ПрисоединяемыеОтчеты) Для Каждого СтрокаОтчетыПараметры Из ПрисоединяемыеОтчеты Цикл @@ -1834,1007 +2978,3 @@ КонецЕсли; КонецЦикла; КонецПроцедуры - -&НаСервере -Функция ВыбранныеПолучателиРассылки() - - ВыбранныеПользователи = Новый ТаблицаЗначений; - ВыбранныеПользователи.Колонки.Добавить("Пользователь"); - ВыбранныеПользователи.Колонки.Добавить("НомерКартинки"); - - ПолучателиРассылки = Объект.Получатели.Выгрузить(, "Получатель"); - - Для каждого Элемент Из ПолучателиРассылки Цикл - - СтрокаВыбранныеПользователи = ВыбранныеПользователи.Добавить(); - СтрокаВыбранныеПользователи.Пользователь = Элемент.Получатель; - - КонецЦикла; - - ЗаголовокФормыПодбора = НСтр("ru = 'Подбор получателей рассылки'"); - ПараметрыРасширеннойФормыПодбора = Новый Структура("ЗаголовокФормыПодбора, ВыбранныеПользователи", - ЗаголовокФормыПодбора, ВыбранныеПользователи); - АдресХранилища = ПоместитьВоВременноеХранилище(ПараметрыРасширеннойФормыПодбора); - Возврат АдресХранилища; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Неконтекстные вызовы сервера - -&НаСервереБезКонтекста -Функция ПолучитьКэш() - // Преобразование наименований в значения - ДниНедели = Новый Соответствие; - ДниНедели.Вставить("Понедельник", 1); - ДниНедели.Вставить("Вторник", 2); - ДниНедели.Вставить("Среда", 3); - ДниНедели.Вставить("Четверг", 4); - ДниНедели.Вставить("Пятница", 5); - ДниНедели.Вставить("Суббота", 6); - ДниНедели.Вставить("Воскресенье", 7); - ДниНедели = Новый ФиксированноеСоответствие(ДниНедели); - - Месяцы = Новый Соответствие; - Месяцы.Вставить("Январь", 1); - Месяцы.Вставить("Февраль", 2); - Месяцы.Вставить("Март", 3); - Месяцы.Вставить("Апрель", 4); - Месяцы.Вставить("Май", 5); - Месяцы.Вставить("Июнь", 6); - Месяцы.Вставить("Июль", 7); - Месяцы.Вставить("Август", 8); - Месяцы.Вставить("Сентябрь", 9); - Месяцы.Вставить("Октябрь", 10); - Месяцы.Вставить("Ноябрь", 11); - Месяцы.Вставить("Декабрь", 12); - Месяцы = Новый ФиксированноеСоответствие(Месяцы); - - // - Периодичности = Новый Соответствие; - Периодичности.Вставить(Перечисления.ПериодичностиРасписанийРассылокОтчетов.ПустаяСсылка(), "НеВыбрано"); - Для Каждого ОбъектМД Из Метаданные.Перечисления.ПериодичностиРасписанийРассылокОтчетов.ЗначенияПеречисления Цикл - Периодичности.Вставить(Перечисления.ПериодичностиРасписанийРассылокОтчетов[ОбъектМД.Имя], ОбъектМД.Имя); - КонецЦикла; - Периодичности = Новый ФиксированноеСоответствие(Периодичности); - - // - Шаблоны = Новый ФиксированнаяСтруктура("Тема, Текст, ИмяАрхива", - РассылкаОтчетовКлиентСервер.ШаблонТемы(), - РассылкаОтчетовКлиентСервер.ШаблонТекста(), - РассылкаОтчетовКлиентСервер.ШаблонИмениАрхива()); - - // - Кэш = Новый Структура; - Кэш.Вставить("ПустоеЗначениеОтчета", РассылкаОтчетовПовтИсп.ПустоеЗначениеОтчета()); - Кэш.Вставить("ГруппаЛичныхРассылок", Справочники.РассылкиОтчетов.ЛичныеРассылки); - Кэш.Вставить("ЗаголовокСистемы", РассылкаОтчетовПовтИсп.ИмяЭтойИнформационнойБазы()); - Кэш.Вставить("Соответствия", Новый ФиксированнаяСтруктура("ДниНедели, Месяцы", ДниНедели, Месяцы)); - Кэш.Вставить("Перечисления", Новый ФиксированнаяСтруктура("Периодичности", Периодичности)); - Кэш.Вставить("Шаблоны", Шаблоны); - Кэш = Новый ФиксированнаяСтруктура(Кэш); - - // - Возврат Кэш; -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьСписокПочтовыхАдресов(Получатель, СписокЗначений = Неопределено) - ТекстЗапроса = - "ВЫБРАТЬ - | тчКонтактнаяИнформация.Представление КАК Представление, - | тчКонтактнаяИнформация.Вид КАК Значение - |ИЗ - | Справочник.Пользователи.КонтактнаяИнформация КАК тчКонтактнаяИнформация - |ГДЕ - | тчКонтактнаяИнформация.Ссылка = &Получатель - | И тчКонтактнаяИнформация.Тип = &ТипКИ"; - Попытка - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Пользователи", Получатель.Метаданные().Имя); - Исключение - Возврат СписокЗначений; - КонецПопытки; - - Если СписокЗначений = Неопределено Тогда - СписокЗначений = Новый СписокЗначений; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Получатель", Получатель); - Запрос.УстановитьПараметр("ТипКИ", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты); - Запрос.Текст = ТекстЗапроса; - - ТЗИтог = Запрос.Выполнить().Выгрузить(); - Для Каждого СтрИтог Из ТЗИтог Цикл - Если ЗначениеЗаполнено(СтрИтог.Представление) Тогда - СписокЗначений.Добавить(СтрИтог.Значение, СтрИтог.Представление +" ("+ Строка(СтрИтог.Значение) +")"); - КонецЕсли; - КонецЦикла; - - Возврат СписокЗначений; -КонецФункции - -&НаСервереБезКонтекста -Функция СформироватьОтчетНаСервере(Знач ПараметрыОтчета, Получатель, ТребуемыеРеквизиты) - ПараметрыЖурнала = Новый Структура; - ПараметрыЖурнала.Вставить("ИмяСобытия", НСтр("ru = 'Рассылка отчетов. Формирование отчета'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); - ПараметрыЖурнала.Вставить("Данные", ТребуемыеРеквизиты.Ссылка); - ПараметрыЖурнала.Вставить("Метаданные", ПараметрыЖурнала.Данные.Метаданные()); - ПараметрыЖурнала.Вставить("МассивОшибок", Новый Массив); - - ОтчетИнициализирован = РассылкаОтчетов.ИнициализироватьОтчет( - ПараметрыЖурнала, - ПараметрыОтчета, - ТребуемыеРеквизиты.Персонализирована); - - Результат = Новый Структура("Оповестить, Заголовок, Текст, ТекстОшибок, ТабДок"); - - ОтчетСформирован = Ложь; - Если ОтчетИнициализирован Тогда - Попытка - РезультатФормирования = РассылкаОтчетов.СформироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, Получатель); - ОтчетСформирован = РезультатФормирования.Сформирован; - Если РезультатФормирования.Пустой И НЕ ПараметрыОтчета.ОтправлятьЕслиПустой Тогда - Результат.Оповестить = Ложь; - Результат.Текст = НСтр("ru = 'Отчет пустой'"); - Иначе - Результат.ТабДок = РезультатФормирования.ТабДок; - Результат.Оповестить = Истина; - Результат.Заголовок = НСтр("ru = 'Отчет сформирован'"); - Результат.Текст = Строка(ПараметрыОтчета.Отчет); - КонецЕсли; - Исключение - РассылкаОтчетов.ЗаписьЖурнала(ПараметрыЖурнала, , - НСтр("ru = 'Ошибка формирования отчета %1:'"), ИнформацияОбОшибке(), - "'"+ Строка(ПараметрыОтчета.Отчет) +"'"); - КонецПопытки; - КонецЕсли; - - Если НЕ ОтчетИнициализирован ИЛИ НЕ ОтчетСформирован Тогда - Результат.Оповестить = Ложь; - Результат.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось сформировать отчет %1.'"), - ?(ПараметрыОтчета.Представление = "", "", "'"+ ПараметрыОтчета.Представление +"'")); - КонецЕсли; - - Результат.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(ПараметрыЖурнала.МассивОшибок); - - Возврат Результат; -КонецФункции - -&НаСервереБезКонтекста -Функция ПравоИзмененияПапкиИФайлов(Папка) - - Результат = Истина; - РассылкаОтчетов.ПриОпределенииПраваИзмененияПапкиИФайлов(Папка, Результат); - Возврат Результат; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Вызовы клиента и сервера - -&НаКлиентеНаСервереБезКонтекста -Процедура ПереключитьСтраницу(Элементы, ИмяНабораСтраниц, СуффиксСтраниц) - Элементы[ИмяНабораСтраниц].ТекущаяСтраница = Элементы[ИмяНабораСтраниц + СуффиксСтраниц]; -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ВидимостьДоступностьКорректность(ЭтаФорма, Изменения = "") - Объект = ЭтаФорма.Объект; - Элементы = ЭтаФорма.Элементы; - - Если Изменения = "" ИЛИ Изменения = "FTPСерверИКаталог" Тогда - ЭтаФорма.FTPСерверИКаталог = "ftp://"+ Объект.FTPСервер + Объект.FTPКаталог; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ВидРассылки" Тогда - // Корректность - Если Объект.Личная И Объект.Персонализирована Тогда - Объект.Личная = Ложь; - КонецЕсли; - - ИспользуетсяГруппаЛичныхРассылок = (Объект.Родитель = ЭтаФорма.Кэш.ГруппаЛичныхРассылок); - Если Объект.Личная <> ИспользуетсяГруппаЛичныхРассылок Тогда - УстановитьМодифицированностьФормы(ЭтаФорма, "Родитель", , - НСтр("ru = 'Группа установлена в соответствии с видом рассылки'")); - Объект.Родитель = ?(Объект.Личная, ЭтаФорма.Кэш.ГруппаЛичныхРассылок, Неопределено); - КонецЕсли; - - Если Объект.Личная Тогда - РассылкаОбщая = Ложь; - ЭтаФорма.ВидРассылки = "Личная"; - ИначеЕсли Объект.Персонализирована Тогда - РассылкаОбщая = Ложь; - ЭтаФорма.ВидРассылки = "Персонализирована"; - Иначе - РассылкаОбщая = Истина; - ЭтаФорма.ВидРассылки = "Общая"; - КонецЕсли; - - Если НЕ РассылкаОбщая Тогда - Объект.ИспользоватьПапку = Ложь; - Объект.ИспользоватьСетевойКаталог = Ложь; - Объект.ИспользоватьFTPРесурс = Ложь; - Объект.ИспользоватьЭлектроннуюПочту = Истина; - КонецЕсли; - - // Видимость & Доступность - Элементы.Родитель.Доступность = НЕ Объект.Личная; - Элементы.НастройкаПолучателей.Видимость = НЕ Объект.Личная; - ПереключитьСтраницу(Элементы, "ВидыРассылки", ?(Объект.Личная, "Личная", "ДляПолучателей")); - Элементы.ДругиеСпособыДоставки.Видимость = РассылкаОбщая; - Элементы.ГруппаИспользоватьЭлектроннуюПочту.Видимость = РассылкаОбщая; - - // Восстановление параметров - Если Объект.ИспользоватьПапку Тогда - ЭтаФорма.ДругойСпособДоставки = "ИспользоватьПапку"; - ЭтаФорма.Публиковать = Истина; - ИначеЕсли Объект.ИспользоватьСетевойКаталог Тогда - ЭтаФорма.ДругойСпособДоставки = "ИспользоватьСетевойКаталог"; - ЭтаФорма.Публиковать = Истина; - ИначеЕсли Объект.ИспользоватьFTPРесурс Тогда - ЭтаФорма.ДругойСпособДоставки = "ИспользоватьFTPРесурс"; - ЭтаФорма.Публиковать = Истина; - Иначе - ЭтаФорма.ДругойСпособДоставки = Элементы.ДругойСпособДоставки.СписокВыбора[0].Значение; - ЭтаФорма.Публиковать = Ложь; - КонецЕсли; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "Отчеты" Тогда - КоличествоОтчетов = ЭтаФорма.Объект.Отчеты.Количество(); - Если КоличествоОтчетов > 0 Тогда - Элементы.СтраницаОтчеты.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отчеты (%1)'"), - Формат(КоличествоОтчетов, "ЧН=0; ЧГ=")); - Иначе - Элементы.СтраницаОтчеты.Заголовок = НСтр("ru = 'Отчеты'") ; - КонецЕсли; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ДругойСпособДоставки" ИЛИ Изменения = "Публиковать" ИЛИ Изменения = "ВидРассылки" Тогда - Элементы.ДругойСпособДоставки.Доступность = ЭтаФорма.Публиковать; - Элементы.ПараметрыДоставки.Доступность = ЭтаФорма.Публиковать; - Элементы.ПараметрыДоставки.ТекущаяСтраница = Элементы[ЭтаФорма.ДругойСпособДоставки]; - Элементы.ПроверитьПубликацию.Доступность = ЭтаФорма.Публиковать; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ИспользоватьЭлектроннуюПочту" ИЛИ Изменения = "ВидРассылки" Тогда - Элементы.ГруппаУчетнаяЗапись.Доступность = Объект.ИспользоватьЭлектроннуюПочту; - Элементы.ПараметрыПисьма.Доступность = Объект.ИспользоватьЭлектроннуюПочту; - Элементы.ДополнительныеПараметрыРассылкиПоЭлектроннойПочте.Доступность = Объект.ИспользоватьЭлектроннуюПочту; - КонецЕсли; - - Если Изменения = "" - ИЛИ Изменения = "ТолькоУведомить" - ИЛИ Изменения = "ИспользоватьЭлектроннуюПочту" - ИЛИ Изменения = "ДругойСпособДоставки" - ИЛИ Изменения = "Публиковать" - ИЛИ Изменения = "ВидРассылки" - Тогда - - ВидимостьОпции = (Объект.ИспользоватьЭлектроннуюПочту И ЭтаФорма.Публиковать); - ПереключитьСтраницу(Элементы, "ТолькоУведомления", ?(ВидимостьОпции, "Показать", "Скрыть")); - Если НЕ ВидимостьОпции Тогда - Объект.ТолькоУведомить = Ложь; - КонецЕсли; - - СпособыДоставки = ""; - Если Объект.ИспользоватьПапку Тогда - СпособыДоставки = НСтр("ru = 'папка'"); - КонецЕсли; - Если Объект.ИспользоватьСетевойКаталог Тогда - СпособыДоставки = НСтр("ru = 'сетевой каталог'"); - КонецЕсли; - Если Объект.ИспользоватьFTPРесурс Тогда - СпособыДоставки = НСтр("ru = 'FTP'"); - КонецЕсли; - Если Объект.ИспользоватьЭлектроннуюПочту И НЕ Объект.ТолькоУведомить Тогда - СпособыДоставки = СпособыДоставки + ?(СпособыДоставки = "", НСтр("ru = 'эл. почта'"), " "+ НСтр("ru = 'и эл. почта'")); - КонецЕсли; - - Элементы.СтраницаДоставка.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Доставка (%1)'"), - СпособыДоставки); - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ПисьмоВФорматеHTML" Тогда - ПереключитьСтраницу(Элементы, "СтраницыТекстПисьма", ?(Объект.ПисьмоВФорматеHTML, "HTML", "ОбычныйТекст")); - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "Архивировать" Тогда - Элементы.ИмяАрхива.Доступность = Объект.Архивировать; - Элементы.ПарольАрхива.Доступность = Объект.Архивировать; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ВыполнятьПоРасписанию" Тогда - Если Объект.ВыполнятьПоРасписанию Тогда - Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (активно)'"); - Иначе - Элементы.СтраницаРасписание.Заголовок = НСтр("ru = 'Расписание (не активно)'"); - КонецЕсли; - Элементы.ПараметрыВыполненияПоРасписанию.Доступность = Объект.ВыполнятьПоРасписанию; - Элементы.СтраницыПериодичности.Доступность = Объект.ВыполнятьПоРасписанию; - КонецЕсли; - - Если Изменения = "" ИЛИ Изменения = "ПериодичностьРасписания" Тогда - ИмяПеречисления = ЭтаФорма.Кэш.Перечисления.Периодичности[Объект.ПериодичностьРасписания]; - - Элементы.СтраницыПериодичности.ТекущаяСтраница = Элементы["Страница"+ИмяПеречисления]; - Если ИмяПеречисления = "Произвольное" Тогда - Элементы.СтраницыВремяИлиИзменить.ТекущаяСтраница = Элементы.СтраницаИзменитьРасписание; - Иначе - Элементы.СтраницыВремяИлиИзменить.ТекущаяСтраница = Элементы.СтраницаВремяНачала; - КонецЕсли; - - // Сброс параметров, которые не соответствуют закладкам упрощенного редактирования - Если Изменения = "ПериодичностьРасписания" - И (ИмяПеречисления = "Ежедневно" - ИЛИ ИмяПеречисления = "Еженедельно" - ИЛИ ИмяПеречисления = "Ежемесячно") Тогда - - // Общие параметры - ЭтаФорма.Расписание.ДатаНачала = '00010101'; - ЭтаФорма.Расписание.ДатаКонца = '00010101'; - ЭтаФорма.Расписание.ВремяКонца = '00010101'; - ЭтаФорма.Расписание.ВремяЗавершения = '00010101'; - ЭтаФорма.Расписание.ДеньНеделиВМесяце = 0; - ЭтаФорма.Расписание.ДетальныеРасписанияДня = Новый Массив; - ЭтаФорма.Расписание.ИнтервалЗавершения = 0; - ЭтаФорма.Расписание.ПаузаПовтора = 0; - ЭтаФорма.Расписание.ПериодНедель = 0; - ЭтаФорма.Расписание.ПериодПовтораВТечениеДня = 0; - - Если ИмяПеречисления <> "Ежедневно" Тогда - ЭтаФорма.Расписание.ПериодПовтораДней = 1; - КонецЕсли; - - Если ИмяПеречисления <> "Еженедельно" Тогда - ВыбранныеДниНедели = Новый Массив; - Для н = 1 По 7 Цикл - ВыбранныеДниНедели.Добавить(н); - КонецЦикла; - ЭтаФорма.Расписание.ДниНедели = ВыбранныеДниНедели; - КонецЕсли; - - Если ИмяПеречисления <> "Ежемесячно" Тогда - ВсеМесяцы = Новый Массив; - Для н = 1 По 12 Цикл - ВсеМесяцы.Добавить(н); - КонецЦикла; - ЭтаФорма.Расписание.Месяцы = ВсеМесяцы; - ЭтаФорма.Расписание.ДеньВМесяце = 0; - КонецЕсли; - КонецЕсли; - - // Восстанавливаем параметры на текущей закладке в соответствии с параметрами расписания - Если ИмяПеречисления = "Ежедневно" Тогда - ЭтаФорма.ВремяНачала = ЭтаФорма.Расписание.ВремяНачала; - ЭтаФорма.ПериодПовтораДней = ЭтаФорма.Расписание.ПериодПовтораДней; - ИначеЕсли ИмяПеречисления = "Еженедельно" Тогда - ЭтаФорма.ВремяНачала = ЭтаФорма.Расписание.ВремяНачала; - Для Каждого КлючИЗначение Из ЭтаФорма.Кэш.Соответствия.ДниНедели Цикл - ЭтаФорма[КлючИЗначение.Ключ] = (ЭтаФорма.Расписание.ДниНедели.Найти(КлючИЗначение.Значение) <> Неопределено); - КонецЦикла; - ИначеЕсли ИмяПеречисления = "Ежемесячно" Тогда - ЭтаФорма.ВремяНачала = ЭтаФорма.Расписание.ВремяНачала; - Если ЭтаФорма.Расписание.ДеньВМесяце >= 0 Тогда - ЭтаФорма.ДеньВМесяце = ЭтаФорма.Расписание.ДеньВМесяце; - Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'начала'"); - Иначе - ЭтаФорма.ДеньВМесяце = -ЭтаФорма.Расписание.ДеньВМесяце; - Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = НСтр("ru = 'конца'"); - КонецЕсли; - Для Каждого КлючИЗначение Из ЭтаФорма.Кэш.Соответствия.Месяцы Цикл - ЭтаФорма[КлючИЗначение.Ключ] = (ЭтаФорма.Расписание.Месяцы.Найти(КлючИЗначение.Значение) <> Неопределено); - КонецЦикла; - КонецЕсли; - - КонецЕсли; // Изменения = "" ИЛИ Изменения = "ПериодичностьРасписания" - - Если Изменения = "" ИЛИ Изменения = "НачалоКонецМесяца" Тогда - Элементы.ГиперссылкаНачалоКонецМесяца.Заголовок = ?(ЭтаФорма.Расписание.ДеньВМесяце >= 0, "начала", "конца"); - КонецЕсли; - - Если Изменения = "" ИЛИ Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРасписание Тогда - ЭтаФорма.ПредставлениеРасписания = Строка(ЭтаФорма.Расписание); - КонецЕсли; -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьМодифицированностьФормы(ЭтаФорма, Поле = "", ПутьКДанным = "", Текст = "") - Если НЕ ЭтаФорма.Модифицированность Тогда - ЭтаФорма.ФормаБылаМодифицированаНаСервере = Истина; - Если ЗначениеЗаполнено(Текст) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Текст, , Поле, ПутьКДанным); - КонецЕсли; - КонецЕсли; -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Функция ПредставлениеФорматовПоУмолчанию() - Возврат НСтр("ru = 'по умолчанию'"); -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Вызовы клиента - -&НаКлиенте -Процедура ДобавитьПеретащитьПолучателя(ПолучательИлиНаборПолучателей) - - Если ПодборПользователейИлиГрупп(ПолучательИлиНаборПолучателей) Тогда - - КоличествоПолучателей = Объект.Получатели.Количество(); - Для н = 1 По КоличествоПолучателей Цикл - ИндексПолучателя = КоличествоПолучателей - н; - - СтрокаПолучатель = Объект.Получатели.Получить(ИндексПолучателя); - - ИндексВМассиве = ПолучательИлиНаборПолучателей.Найти(СтрокаПолучатель.Получатель); - Если ИндексВМассиве = Неопределено Тогда - Объект.Получатели.Удалить(СтрокаПолучатель); - Иначе - ПолучательИлиНаборПолучателей.Удалить(ИндексВМассиве); - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - МассивНовыхСтрок = ВыборПодборПеретаскиваниеВТабличнуюЧасть( - ПолучательИлиНаборПолучателей, - Объект.Получатели, - "Получатель", - Новый Структура("Исключен", Ложь)); - - Если МассивНовыхСтрок.Количество() > 0 Тогда - Если МассивНовыхСтрок.Количество() = 1 Тогда - ЗаголовокОповещения = НСтр("ru = 'Получатель добавлен в рассылку'"); - Иначе - ЗаголовокОповещения = НСтр("ru = 'Получатели добавлены в рассылку'"); - КонецЕсли; - - ТекстОповещения = ""; - Для Каждого СтрокаПолучатель Из МассивНовыхСтрок Цикл - ТекстОповещения = ТекстОповещения + ?(ТекстОповещения = "", "", ", ") + Строка(СтрокаПолучатель.Получатель); - КонецЦикла; - - РассылкаОтчетовКлиент.ПоказатьРезультат( - Новый Структура("Оповестить, Заголовок, Текст", Истина, ЗаголовокОповещения, ТекстОповещения)); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Уникальность = Истина) - ПереданаСтруктура = (ТипЗнч(ЭлементПодбора) = Тип("Структура")); - Если ПереданаСтруктура ИЛИ ТипЗнч(ЭлементПодбора) = Тип("ДанныеФормыЭлементКоллекции") Тогда - Если ЭлементПодбора.Свойство(ИмяРеквизита) Тогда - ЗначениеРеквизита = ЭлементПодбора[ИмяРеквизита]; - Иначе - Возврат Неопределено; - КонецЕсли; - Иначе // (СправочникСсылка.*) перетаскивание из формы выбора или подбора - ЗначениеРеквизита = ЭлементПодбора; - КонецЕсли; - - // Требуется уникальность реквизита в рамках таблицы - Найденные = ТабличнаяЧасть.НайтиСтроки(Новый Структура(ИмяРеквизита, ЗначениеРеквизита)); - - Если Уникальность И Найденные.Количество() > 0 Тогда - Возврат Неопределено; - КонецЕсли; - - СтрокаТаблицы = ТабличнаяЧасть.Добавить(); - СтрокаТаблицы[ИмяРеквизита] = ЗначениеРеквизита; - ЗаполнитьЗначенияСвойств(СтрокаТаблицы, СтруктураЗаполнения); - Если ПереданаСтруктура Тогда - Для Каждого КлючИЗначение Из ЭлементПодбора Цикл - Если СтруктураЗаполнения.Свойство(КлючИЗначение.Ключ) Тогда - ЭлементПодбора.Удалить(ЭлементПодбора.Ключ); - КонецЕсли; - КонецЦикла; - ЗаполнитьЗначенияСвойств(СтрокаТаблицы, ЭлементПодбора); - КонецЕсли; - - Возврат СтрокаТаблицы; -КонецФункции - -&НаКлиенте -Функция ВыборПодборПеретаскиваниеВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения, Идентификаторы = Ложь) - Модифицированность = Истина; - МассивНовыхСтрок = Новый Массив; - - Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда - Для Каждого ЭлементПодбора Из ВыбранноеЗначение Цикл - Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ЭлементПодбора, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения); - Если Результат <> Неопределено Тогда - МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат)); - КонецЕсли; - КонецЦикла; - Иначе - Результат = ВыборПодборПеретаскиваниеЭлементаВТабличнуюЧасть(ВыбранноеЗначение, ТабличнаяЧасть, ИмяРеквизита, СтруктураЗаполнения); - Если Результат <> Неопределено Тогда - МассивНовыхСтрок.Добавить(?(Идентификаторы, Результат.ПолучитьИдентификатор(), Результат)); - КонецЕсли; - КонецЕсли; - Возврат МассивНовыхСтрок; -КонецФункции - -&НаКлиенте -Процедура ОткрытьФормуВыбораДляПодбораПолучателей(ФормаИлиЭлементФормы) - Отказ = Ложь; - ПроверитьТипПолучателей(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - - Найденные = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки)); - - Если Найденные.Количество() = 1 Тогда - ПараметрыРасширеннойФормыПодбора = ВыбранныеПолучателиРассылки(); - ПараметрыФормыВыбора = Новый Структура; - // Стандартные реквизиты формы выбора (см. Расширение управляемой формы для динамического списка) - ПараметрыФормыВыбора.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.ГруппыИЭлементы); - ПараметрыФормыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь); - ПараметрыФормыВыбора.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина); - ПараметрыФормыВыбора.Вставить("МножественныйВыбор", Истина); - ПараметрыФормыВыбора.Вставить("РежимВыбора", Истина); - // Предполагаемые реквизиты - ПараметрыФормыВыбора.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.Независимый); - ПараметрыФормыВыбора.Вставить("ВыборГрупп", Истина); - ПараметрыФормыВыбора.Вставить("ВыборГруппПользователей", Истина); - ПараметрыФормыВыбора.Вставить("РазрешитьНачалоПеретаскивания", Истина); - // Параметры открытия расширенной формы подбора - // (описание реквизитов см. в форме списка справочника Пользователи) - ПараметрыФормыВыбора.Вставить("РасширенныйПодбор", Истина); - ПараметрыФормыВыбора.Вставить("ПараметрыРасширеннойФормыПодбора", ПараметрыРасширеннойФормыПодбора); - - ОткрытьФорму(Найденные[0].ПутьФормыВыбора, ПараметрыФормыВыбора, ФормаИлиЭлементФормы); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция ВыбратьФормат(СсылкаНаОтчет) - ЗаполняетсяФорматПоУмолчанию = НЕ ЗначениеЗаполнено(СсылкаНаОтчет); - - Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет)); - Если Найденные.Количество() > 0 Тогда - СписокФорматов.ЗаполнитьПометки(Ложь); - Для Каждого СтрокаФормат Из Найденные Цикл - СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина; - КонецЦикла; - Иначе - СписокФорматов = СписокФорматовПоУмолчанию.Скопировать(); - Если НЕ ЗаполняетсяФорматПоУмолчанию Тогда - Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", Кэш.ПустоеЗначениеОтчета)); - Если Найденные.Количество() > 0 Тогда - СписокФорматов.ЗаполнитьПометки(Ложь); - Для Каждого СтрокаФормат Из Найденные Цикл - СписокФорматов.НайтиПоЗначению(СтрокаФормат.Формат).Пометка = Истина; - КонецЦикла; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если ЗаполняетсяФорматПоУмолчанию Тогда - ЗаголовокФормыВыбора = НСтр("ru = 'Выберите форматы по умолчанию'"); - Иначе - ЗаголовокФормыВыбора = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выберите форматы для отчета %1'"), - "'"+ Строка(СсылкаНаОтчет) +"'"); - КонецЕсли; - - ДублирующийСписокФорматов = СписокФорматов.Скопировать(); - Если НЕ СписокФорматов.ОтметитьЭлементы(ЗаголовокФормыВыбора) Тогда - Возврат Неопределено; - КонецЕсли; - - // Проверка изменений - ФорматыСовпадают = Истина; - Для н = 1 По СписокФорматов.Количество() Цикл - Если СписокФорматов[н-1].Пометка <> ДублирующийСписокФорматов[н-1].Пометка Тогда - ФорматыСовпадают = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; - Если ФорматыСовпадают Тогда - Возврат Неопределено; - КонецЕсли; - - Результат = ""; - - // Очистка существующих записей - ОчиститьФормат(СсылкаНаОтчет); - - // Добавление отмеченных форматов - Для Каждого ЭлементСписка Из СписокФорматов Цикл - Если ЭлементСписка.Пометка Тогда - СтрокаФормат = Объект.ФорматыОтчетов.Добавить(); - СтрокаФормат.Отчет = СсылкаНаОтчет; - СтрокаФормат.Формат = ЭлементСписка.Значение; - Результат = Результат + ?(Результат = "", "", ", ") + Строка(ЭлементСписка.Значение); - КонецЕсли; - КонецЦикла; - - Если ЗаполняетсяФорматПоУмолчанию И Результат = "" Тогда - Результат = СписокФорматовПоУмолчаниюПредставление; - КонецЕсли; - - Возврат Результат; -КонецФункции - -&НаКлиенте -Процедура ОчиститьФормат(СсылкаНаОтчет) - Модифицированность = Истина; - Найденные = Объект.ФорматыОтчетов.НайтиСтроки(Новый Структура("Отчет", СсылкаНаОтчет)); - Для Каждого СтрокаФормат Из Найденные Цикл - Объект.ФорматыОтчетов.Удалить(СтрокаФормат); - КонецЦикла; -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьШаблон(ТекстовыйШаблон = Неопределено, ИсключитьТемуПисьма = Ложь) - // Проверяем и устанавливаем фокус в нужный элемент - Если ИсключитьТемуПисьма ИЛИ НЕ (ТекущийЭлемент = Элементы.ТемаПисьма ИЛИ ТекущийЭлемент = Элементы.ИмяАрхива) Тогда - Если Объект.ПисьмоВФорматеHTML Тогда - Если ТекущийЭлемент <> Элементы.ТекстПисьмаФорматированныйДокумент Тогда - ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент; - КонецЕсли; - Иначе - Если ТекущийЭлемент <> Элементы.ТекстПисьма Тогда - ТекущийЭлемент = Элементы.ТекстПисьма; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если ТекстовыйШаблон = Неопределено Тогда - // Ограничимся подготовкой к добавлению шаблона (переключением текущего элемента) - Возврат; - КонецЕсли; - - Если ТекущийЭлемент.ВыделенныйТекст = "" Тогда - // Форматированный документ некорректно отрабатывает изменения свойства - // ВыделенныйТекст, в случае, если ничего не выделено, - // поэтому используется альтернативный метод добавления текста. - Если ТекущийЭлемент = Элементы.ТекстПисьмаФорматированныйДокумент Тогда - ТекстПисьмаФорматированныйДокумент.Добавить(ТекстовыйШаблон, ТипЭлементаФорматированногоДокумента.Текст); - Иначе - ТекущийЭлемент.ВыделенныйТекст = ТекстовыйШаблон; - КонецЕсли; - Иначе - ТекущийЭлемент.ВыделенныйТекст = ТекущийЭлемент.ВыделенныйТекст + ТекстовыйШаблон; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция ИзменитьСоставМассива(Добавить, Элемент, Знач Массив) - Индекс = Массив.Найти(Элемент); - Если Добавить И Индекс = Неопределено Тогда - ВГраницаПлюс1 = ?(Массив.Количество() >= Элемент, Элемент, Массив.Количество()); - Для н = 1 По ВГраницаПлюс1 Цикл - Если Массив[ВГраницаПлюс1-н] < Элемент Тогда - Массив.Вставить(ВГраницаПлюс1-н+1, Элемент); - Возврат Массив; - КонецЕсли; - КонецЦикла; - Массив.Вставить(0, Элемент); - ИначеЕсли НЕ Добавить И Индекс <> Неопределено Тогда - Массив.Удалить(Индекс); - КонецЕсли; - Возврат Массив; -КонецФункции - -&НаКлиенте -Процедура ИзменитьРасписаниеВДиалоге() - ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - Если ДиалогРасписания.ОткрытьМодально() Тогда - Модифицированность = Истина; - Расписание = ДиалогРасписания.Расписание; - ВидимостьДоступностьКорректность(ЭтаФорма, "Расписание"); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура НачалоВыбораНастройкиОтчета(Элемент, ДанныеВыбора, СтандартнаяОбработка, СКД = Неопределено) - // Сброс ограничителя - Элемент.ОграничениеТипа = Новый ОписаниеТипов; - - // - ЭлементСвязиПоТипу = Неопределено; - - // Возможность персонализации рассылки - Если НЕ Объект.Персонализирована Тогда - Возврат; - КонецЕсли; - - // Основной тип получателей - КоличествоТипов = ТипПолучателейРассылки.Типы().Количество(); - Если КоличествоТипов <> 1 И КоличествоТипов <> 2 Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Поле ""Получатели"" не заполнено'"), - , - "ТипПолучателейРассылки"); - СтандартнаяОбработка = Ложь; - Возврат; - КонецЕсли; - - // - Если СКД Тогда - Инициатор = Элементы.КомпоновщикНастроекПользовательскиеНастройки; - Иначе - Инициатор = Элементы.НастройкиТекущегоОтчета; - КонецЕсли; - - НайденныеИОМД = ТаблицаТиповПолучателей.НайтиСтроки(Новый Структура("ТипПолучателей", ТипПолучателейРассылки)); - Если НайденныеИОМД.Количество() <> 1 Тогда - Возврат; - КонецЕсли; - - МассивТипов = НайденныеИОМД[0].ОсновнойТип.Типы(); - Если МассивТипов.Количество() <> 1 Тогда - Возврат; - КонецЕсли; - - ОсновнойТипПолучателей = МассивТипов[0]; - - // - Получения описания типов, доступных для выбора - Если СКД Тогда - - // - Идентификатор пользовательской настройки КД - ИдентификаторНастройки = Инициатор.ТекущаяСтрока; - Если ИдентификаторНастройки = Неопределено Тогда - Возврат; - КонецЕсли; - - // - Строка в составе настроек компоновки данных - СтрокаНастроек = КомпоновщикНастроекКД.ПользовательскиеНастройки.ПолучитьОбъектПоИдентификатору(ИдентификаторНастройки); - Если СтрокаНастроек = Неопределено Тогда - Возврат; - КонецЕсли; - - // - Тип настройки - Если ТипЗнч(СтрокаНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда - ЭтоЭлементОтбора = Истина; - ИначеЕсли ТипЗнч(СтрокаНастроек) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - ЭтоЭлементОтбора = Ложь; - Иначе - Возврат; - КонецЕсли; - - // - Поле компоновки данных - Если ЭтоЭлементОтбора Тогда - - Если ЗначениеЗаполнено(СтрокаНастроек.ЛевоеЗначение) Тогда - - ПолеКД = СтрокаНастроек.ЛевоеЗначение; - - Иначе - - // - Нахождение поля в составе элементов отбора КД по идентификатору - ТекущийЭлементОтбораКД = Неопределено; - Идентификатор = Строка(ИдентификаторНастройки); - - ГруппыЭлементовОтбора = Новый Массив; - ГруппыЭлементовОтбора.Добавить(КомпоновщикНастроекКД.Настройки.Отбор.Элементы); - Пока ГруппыЭлементовОтбора.Количество() > 0 И ТекущийЭлементОтбораКД = Неопределено Цикл - ГруппаЭлементовОтбора = ГруппыЭлементовОтбора[0]; - ГруппыЭлементовОтбора.Удалить(0); - - Для Каждого ЭлементОтбораКД Из ГруппаЭлементовОтбора Цикл - Если ТипЗнч(ЭлементОтбораКД) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда - ГруппыЭлементовОтбора.Добавить(ЭлементОтбораКД.Элементы); - ИначеЕсли ЭлементОтбораКД.ИдентификаторПользовательскойНастройки = Идентификатор Тогда - ТекущийЭлементОтбораКД = ЭлементОтбораКД; - Прервать; - КонецЕсли; - КонецЦикла; - - КонецЦикла; - - Если ТекущийЭлементОтбораКД = Неопределено Тогда - Возврат; - КонецЕсли; - - ПолеКД = ТекущийЭлементОтбораКД.ЛевоеЗначение; - - КонецЕсли; - - // - Нахождение поля в составе доступных полей выбора - ДоступноеПолеКД = КомпоновщикНастроекКД.Настройки.Выбор.ДоступныеПоляВыбора.НайтиПоле(ПолеКД); - Если ДоступноеПолеКД = Неопределено Тогда - Возврат; - КонецЕсли; - - ОписаниеДоступныхТипов = ДоступноеПолеКД.Тип; - - Иначе - - ДоступныйПараметрКД = КомпоновщикНастроекКД.Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(СтрокаНастроек.Параметр); - ОписаниеДоступныхТипов = ДоступныйПараметрКД.Тип; - - КонецЕсли; - - Иначе - - // Массив типов для произвольных отчетов - СтрокаНастроек = Инициатор.ТекущиеДанные; - Если СтрокаНастроек = Неопределено Тогда - Возврат; - КонецЕсли; - - ОписаниеДоступныхТипов = СтрокаНастроек.Тип; - - КонецЕсли; - - // - Проверка на содержание типа получателей - Если НЕ ОписаниеДоступныхТипов.СодержитТип(ОсновнойТипПолучателей) Тогда - Возврат; - КонецЕсли; - - // - Подмена списка выбора типов на список, содержащий получателя - СписокТипов = Новый СписокЗначений; - СписокТипов.Добавить("[Получатель]", НСтр("ru = 'Получатель отчета'")); - МассивТипов = ОписаниеДоступныхТипов.Типы(); - Для Каждого Тип Из МассивТипов Цикл - МассивДляОписанияТипов = Новый Массив; - МассивДляОписанияТипов.Добавить(Тип); - ОписаниеТипов = Новый ОписаниеТипов(МассивДляОписанияТипов); - ОписаниеТипов.ПривестиЗначение(); - СписокТипов.Добавить(ОписаниеТипов, Строка(Тип)); - КонецЦикла; - - // - Выбор - РезультатВыбора = ВыбратьИзСписка(СписокТипов); - Если РезультатВыбора = Неопределено Тогда - СтандартнаяОбработка = Ложь; - Инициатор.ЗакончитьРедактированиеСтроки(Истина); - Возврат; - КонецЕсли; - - // - Обработка результатов выбора - Если ТипЗнч(РезультатВыбора.Значение) = Тип("ОписаниеТипов") Тогда - - // - Выбран тип получателей - Элемент.ОграничениеТипа = РезультатВыбора.Значение; - - Иначе - - // - Выбран шаблон получателя - СтандартнаяОбработка = Ложь; - СтрокаНастроек.Использование = Истина; - Инициатор.ЗакончитьРедактированиеСтроки(Ложь); - РассылкаБылаПерсонализирована = Истина; - Элементы.Отчеты.ТекущиеДанные.ВнесеныИзменения = Истина; - - Если СКД Тогда - Если ЭтоЭлементОтбора Тогда - СтрокаНастроек.ПравоеЗначение = РезультатВыбора.Значение; - Иначе - СтрокаНастроек.Значение = РезультатВыбора.Значение; - КонецЕсли; - Иначе - СтрокаНастроек.Значение = РезультатВыбора.Значение; - КонецЕсли; - - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ВычислитьФлажкиДополнительныхСпособовДоставки() - Объект.ИспользоватьПапку = Публиковать И (ДругойСпособДоставки = "ИспользоватьПапку"); - Объект.ИспользоватьСетевойКаталог = Публиковать И (ДругойСпособДоставки = "ИспользоватьСетевойКаталог"); - Объект.ИспользоватьFTPРесурс = Публиковать И (ДругойСпособДоставки = "ИспользоватьFTPРесурс"); -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьРассылку(ПараметрыДоставки) - // Очистка окна сообщений - ОчиститьСообщения(); - - // - Если НЕ Объект.Подготовлена ИЛИ Объект.Ссылка.Пустая() Тогда - Если НЕ Объект.Подготовлена Тогда - ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть подготовлена. - |Нажмите ""Продолжить"", чтобы установить флажок ""Подготовлена"" и записать рассылку.'"); - Иначе - ТекстВопроса = НСтр("ru = 'Перед проверкой рассылка должна быть записана. - |Нажмите ""Продолжить"", чтобы записать рассылку.'"); - КонецЕсли; - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Продолжить'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1, НСтр("ru = 'Проверка способа доставки'")); - Если Ответ = 1 Тогда - Объект.Подготовлена = Истина; - Если НЕ Записать() Тогда - Возврат; - КонецЕсли; - Иначе - Возврат; - КонецЕсли; - КонецЕсли; - - // - ПараметрыДоставки.Вставить("Рассылка", Объект.Наименование); - - // - Если ПараметрыДоставки.ИспользоватьПапку Тогда - ПараметрыДоставки.Вставить("Папка", Объект.Папка); - КонецЕсли; - // - Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда - ПараметрыДоставки.Вставить("СетевойКаталогWindows", Объект.СетевойКаталогWindows); - ПараметрыДоставки.Вставить("СетевойКаталогLinux", Объект.СетевойКаталогLinux); - КонецЕсли; - // - Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда - ПараметрыДоставки.Вставить("Сервер", Объект.FTPСервер); - ПараметрыДоставки.Вставить("Порт", Объект.FTPПорт); - ПараметрыДоставки.Вставить("Логин", Объект.FTPЛогин); - ПараметрыДоставки.Вставить("Пароль", Объект.FTPПароль); - ПараметрыДоставки.Вставить("Каталог", Объект.FTPКаталог); - ПараметрыДоставки.Вставить("ПассивноеСоединение", Объект.FTPПассивноеСоединение); - КонецЕсли; - // - Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда - ПараметрыДоставки.Вставить("УчетнаяЗапись", Объект.УчетнаяЗапись); - ПараметрыДоставки.Вставить("СкрытыеКопии", Объект.СкрытыеКопии); - ПараметрыДоставки.Вставить("ШаблонТемы", НСтр("ru = 'Тестовое сообщение 1С:Предприятие'")); - ПараметрыДоставки.Вставить("ШаблонТекста", НСтр("ru = 'Это сообщение отправлено системой рассылок 1С:Предприятие.'") - + Символы.ПС + Кэш.ЗаголовокСистемы); - - РезультатВыбора = РассылкаОтчетовКлиент.ВыбратьПолучателя(Объект, Ложь, Истина); // Получатель и E-Mail - Если РезультатВыбора = Неопределено Тогда - Возврат; - КонецЕсли; - ПараметрыДоставки.Вставить("Получатели", РезультатВыбора); - - ПараметрыДоставки.Вставить("ТолькоУведомить", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСпособДоставкиВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьСформированныеОтчетыВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеТемы", Ложь); - ПараметрыДоставки.Вставить("ЗаполнитьПолучателяВШаблонеСообщения", Ложь); - ПараметрыДоставки.Вставить("ПараметрыПисьма", Новый Структура); - ПараметрыДоставки.Вставить("Соединение", Неопределено); - КонецЕсли; // ПараметрыДоставки.ИспользоватьЭлектроннуюПочту - - ПараметрыДоставки.Вставить("ДобавлятьСсылки", ""); - - Результат = ПроверитьСпособДоставки(Объект.Ссылка, ПараметрыДоставки); - - РассылкаОтчетовКлиент.ПоказатьРезультат(Результат); -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьТипПолучателей(Отказ) - Если НЕ ЗначениеЗаполнено(ТипПолучателейРассылки) Тогда - ТекстСообщения = НСтр("ru = 'Поле ""Получатели"" не заполнено'"); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "ТипПолучателейРассылки"); - Отказ = Истина; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьКоличествоПолучателей(Отказ) - Если Объект.Получатели.Количество() = 0 Тогда - ТекстСообщения = НСтр("ru = 'Не введено ни одной строки в список ""Получатели"".'"); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , "Объект.Получатели"); - Отказ = Истина; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Функция ПодборПользователейИлиГрупп(ПолучательИлиНаборПолучателей) - Если ТипЗнч(ПолучательИлиНаборПолучателей) = Тип("Массив") - И ПолучательИлиНаборПолучателей.Количество() > 0 - И (ТипЗнч(ПолучательИлиНаборПолучателей[0]) = Тип("СправочникСсылка.Пользователи") - Или ТипЗнч(ПолучательИлиНаборПолучателей[0]) = Тип("СправочникСсылка.ГруппыПользователей")) Тогда - Возврат Истина; - Иначе - Возврат Ложь; - КонецЕсли; -КонецФункции - diff --git a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html index 2ff8e12f4..0ebc73f7c 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html +++ b/SSL/src/Catalogs/РассылкиОтчетов/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

      Реквизиты:

      diff --git a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl index 563325174..2a4057e07 100644 --- a/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl +++ b/SSL/src/Catalogs/РассылкиОтчетов/ObjectModule.bsl @@ -96,8 +96,11 @@ Если Таблица[0][Реквизит.Имя] = Истина Тогда МассивНепроверяемыхРеквизитов.Добавить(Реквизит.Имя); + Если Реквизит.Имя = "Получатели" Тогда + МассивНепроверяемыхРеквизитов.Добавить("Получатели.Получатель"); + КонецЕсли; КонецЕсли; - + КонецЦикла; КонецЕсли; diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 8b58107b6..d7cf28261 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -36,4 +36,6 @@ 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 index b3c82ae55..ddc537e02 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаВыбора/Form.form @@ -26,8 +26,8 @@ true - НаименованиеРасширеннаяПодсказка - 26 + НаименованиеExtendedTooltip + 17 Label true true @@ -62,8 +62,8 @@ Список.КраткоеПредставление - КраткоеПредставлениеРасширеннаяПодсказка - 28 + КраткоеПредставлениеExtendedTooltip + 18 Label true true @@ -98,8 +98,8 @@ Список.Code - КодРасширеннаяПодсказка - 30 + КодExtendedTooltip + 19 Label true true @@ -141,8 +141,8 @@ Внешняя роль, исполнители которой определены в другой информационной базе - ВнешняяРольРасширеннаяПодсказка - 32 + ВнешняяРольExtendedTooltip + 20 Label true true @@ -175,8 +175,8 @@ Список.Комментарий - СписокКомментарийРасширеннаяПодсказка - 34 + СписокКомментарийExtendedTooltip + 21 Label true true @@ -207,10 +207,10 @@ СписокСтрокаПоиска - 17 + 23 СписокСтрокаПоискаРасширеннаяПодсказка - 19 + 25 Label true true @@ -220,7 +220,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 18 + 24 true Список @@ -230,10 +230,10 @@ СписокСостояниеПросмотра - 20 + 26 СписокСостояниеПросмотраРасширеннаяПодсказка - 22 + 28 Label true true @@ -243,7 +243,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 21 + 27 true ViewStatusAddition @@ -254,10 +254,10 @@ СписокУправлениеПоиском - 23 + 29 СписокУправлениеПоискомРасширеннаяПодсказка - 25 + 31 Label true true @@ -267,7 +267,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 24 + 30 true SearchControlAddition @@ -277,7 +277,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 16 Label true @@ -342,8 +342,8 @@ Left - КомментарийРасширеннаяПодсказка - 44 + КомментарийExtendedTooltip + 22 Label true true diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 8b58107b6..d7cf28261 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -36,4 +36,6 @@ 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 index bbd9aac51..2f29c1e73 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаСписка/Form.form @@ -33,8 +33,8 @@ true - НаименованиеРасширеннаяПодсказка - 30 + НаименованиеExtendedTooltip + 21 Label true true @@ -69,8 +69,8 @@ Список.КраткоеПредставление - КраткоеПредставлениеРасширеннаяПодсказка - 32 + КраткоеПредставлениеExtendedTooltip + 22 Label true true @@ -105,8 +105,8 @@ Список.Code - КодРасширеннаяПодсказка - 34 + КодExtendedTooltip + 23 Label true true @@ -148,8 +148,8 @@ Внешняя роль, исполнители которой определены в другой информационной базе - ВнешняяРольРасширеннаяПодсказка - 36 + ВнешняяРольExtendedTooltip + 24 Label true true @@ -190,8 +190,8 @@ Используется с объектами адресации - ИспользуетсяБезОбъектовАдресацииРасширеннаяПодсказка - 38 + ИспользуетсяБезОбъектовАдресацииExtendedTooltip + 25 Label true true @@ -221,8 +221,8 @@ Группа - ГруппаРасширеннаяПодсказка - 29 + ГруппаExtendedTooltip + 20 Label true true @@ -246,8 +246,8 @@ Список.Комментарий - КомментарийРасширеннаяПодсказка - 40 + КомментарийExtendedTooltip + 26 Label true true @@ -282,8 +282,8 @@ Основное - ОсновноеРасширеннаяПодсказка - 28 + ОсновноеExtendedTooltip + 19 Label true true @@ -307,10 +307,10 @@ СписокСтрокаПоиска - 19 + 27 СписокСтрокаПоискаРасширеннаяПодсказка - 21 + 29 Label true true @@ -320,7 +320,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 20 + 28 true Список @@ -330,10 +330,10 @@ СписокСостояниеПросмотра - 22 + 30 СписокСостояниеПросмотраРасширеннаяПодсказка - 24 + 32 Label true true @@ -343,7 +343,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 23 + 31 true ViewStatusAddition @@ -354,10 +354,10 @@ СписокУправлениеПоиском - 25 + 33 СписокУправлениеПоискомРасширеннаяПодсказка - 27 + 35 Label true true @@ -367,7 +367,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 26 + 34 true SearchControlAddition @@ -377,7 +377,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 18 Label true diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form index 0d4fa1e85..59c4fddb8 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Form.form @@ -18,7 +18,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 41 Label true @@ -58,8 +58,8 @@ Объект.КраткоеПредставление - КраткоеПредставлениеРасширеннаяПодсказка - 43 + КраткоеПредставлениеExtendedTooltip + 42 Label true true @@ -97,7 +97,7 @@ Наименование и сокращение - НаименованиеИСокращениеРасширеннаяПодсказка + НаименованиеИСокращениеExtendedTooltip 40 Label true @@ -128,8 +128,8 @@ Объект.Code - КодРасширеннаяПодсказка - 45 + КодExtendedTooltip + 43 Label true true @@ -163,7 +163,7 @@ true - ГруппаШапкаРасширеннаяПодсказка + ГруппаШапкаExtendedTooltip 39 Label true @@ -206,8 +206,8 @@ ВнешняяРольПриИзменении - ВнешняяРольРасширеннаяПодсказка - 48 + ВнешняяРольExtendedTooltip + 45 Label true true @@ -244,8 +244,8 @@ None - УзелОбменаРасширеннаяПодсказка - 50 + УзелОбменаExtendedTooltip + 46 Label true true @@ -291,8 +291,8 @@ Группа внешняя роль - ГруппаВнешняяРольРасширеннаяПодсказка - 47 + ГруппаВнешняяРольExtendedTooltip + 44 Label true true @@ -329,8 +329,8 @@ Роль может назначаться исполнителям без указания других объектов адресации (основного или дополнительного). - ИспользуетсяБезКонтекстаДругихИзмеренийАдресацииРасширеннаяПодсказка - 53 + ИспользуетсяБезКонтекстаДругихИзмеренийАдресацииExtendedTooltip + 48 Label true true @@ -374,8 +374,8 @@ ИспользуетсяВКонтекстеДругихИзмеренийАдресацииПриИзменении - ИспользуетсяВКонтекстеДругихИзмеренийАдресацииРасширеннаяПодсказка - 56 + ИспользуетсяВКонтекстеДругихИзмеренийАдресацииExtendedTooltip + 50 Label true true @@ -410,8 +410,8 @@ Объект.ТипыОсновногоОбъектаАдресации - ТипыОсновногоОбъектаАдресацииРасширеннаяПодсказка - 59 + ТипыОсновногоОбъектаАдресацииExtendedTooltip + 52 Label true true @@ -451,8 +451,8 @@ Объект.ТипыДополнительногоОбъектаАдресации - ТипыДополнительногоОбъектаАдресацииРасширеннаяПодсказка - 61 + ТипыДополнительногоОбъектаАдресацииExtendedTooltip + 53 Label true true @@ -494,8 +494,8 @@ true - ПояснениеРасширеннаяПодсказка - 63 + ПояснениеExtendedTooltip + 54 Label true true @@ -524,8 +524,8 @@ true - ГруппаТипыОбъектовАдресацииРасширеннаяПодсказка - 58 + ГруппаТипыОбъектовАдресацииExtendedTooltip + 51 Label true true @@ -553,8 +553,8 @@ Адресация задач исполнителям (дополнительно) - ГруппаАдресацииДополнительноРасширеннаяПодсказка - 55 + ГруппаАдресацииДополнительноExtendedTooltip + 49 Label true true @@ -583,8 +583,8 @@ Адресация задач исполнителям - ГруппаАдресацииРасширеннаяПодсказка - 52 + ГруппаАдресацииExtendedTooltip + 47 Label true true @@ -620,8 +620,8 @@ Left - КомментарийРасширеннаяПодсказка - 65 + КомментарийExtendedTooltip + 56 Label true true @@ -661,8 +661,8 @@ true - ГруппаКомментарийРасширеннаяПодсказка - 64 + ГруппаКомментарийExtendedTooltip + 55 Label true true diff --git a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl index 0892b9cc0..181352ac7 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/РолиИсполнителей/Forms/ФормаЭлемента/Module.bsl @@ -70,16 +70,15 @@ ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Истина); ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); - ОткрытьФорму("ОбщаяФорма.ВыборУзловПлановОбмена", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборУзловПлановОбмена", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Объект.Комментарий, - Модифицированность); - КонецПроцедуры - + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -129,3 +128,4 @@ КонецЕсли; КонецПроцедуры + diff --git a/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html b/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html index 35e2a2cbb..ccb43d07b 100644 --- a/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html +++ b/SSL/src/Catalogs/РолиИсполнителей/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

      diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаСписка/Module.bsl index 9fb5734b2..96de9ce6f 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаСписка/Module.bsl @@ -9,6 +9,6 @@ Возврат; КонецЕсли; - ПрисоединенныеФайлы.ВызватьИсключениеОткрытияФормы(ЭтаФорма); + ПрисоединенныеФайлы.ВызватьИсключениеОткрытияФормы(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаЭлемента/Module.bsl index 7f746dab0..4a1356848 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/Forms/ФормаЭлемента/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - ПрисоединенныеФайлы.ПриСозданииНаСервереПрисоединенныйФайл(ЭтаФорма); + ПрисоединенныеФайлы.ПриСозданииНаСервереПрисоединенныйФайл(ЭтотОбъект); КонецПроцедуры @@ -17,6 +17,6 @@ &НаКлиенте Процедура ПерейтиКФормеФайла(Команда) - ПрисоединенныеФайлыКлиент.ПерейтиКФормеПрисоединенногоФайла(ЭтаФорма); + ПрисоединенныеФайлыКлиент.ПерейтиКФормеПрисоединенногоФайла(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo index 41793786d..854ddc61a 100644 --- a/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/СообщениеSMSПрисоединенныеФайлы/СообщениеSMSПрисоединенныеФайлы.mdo @@ -291,7 +291,7 @@ Use - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП @@ -301,7 +301,7 @@ ru - Флажок, означающий что файл подписан с помощью ЭП + Признак того, что файл подписан с помощью ЭП @@ -504,10 +504,10 @@ - ЭлектронныеЦифровыеПодписи + ЭлектронныеПодписи ru - Электронные подписи + электронные подписи ru diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index a56d27f5a..e0179a60a 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -57,4 +57,6 @@ 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 index 41b137b71..0a35b8bab 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Form.form @@ -20,7 +20,7 @@ ВариантГруппировкиПриИзменении - ВариантГруппировкиРасширеннаяПодсказка + ВариантГруппировкиExtendedTooltip 53 Label true @@ -110,8 +110,8 @@ Список.ОбластьДанныхВспомогательныеДанные - ОбластьДанныхВспомогательныеДанныеРасширеннаяПодсказка - 69 + ОбластьДанныхВспомогательныеДанныеExtendedTooltip + 59 Label true true @@ -146,8 +146,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 71 + НаименованиеExtendedTooltip + 60 Label true true @@ -182,8 +182,8 @@ Список.Отправитель - ОтправительРасширеннаяПодсказка - 73 + ОтправительExtendedTooltip + 61 Label true true @@ -218,8 +218,8 @@ Список.Получатель - ПолучательРасширеннаяПодсказка - 75 + ПолучательExtendedTooltip + 62 Label true true @@ -242,41 +242,17 @@ true - None - - СписокКоманднаяПанель - 3 - Left - true - - - СписокСтрокаПоиска - 60 - - СписокСтрокаПоискаРасширеннаяПодсказка - 62 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 61 - true - - Список - - true - - - - СписокСостояниеПросмотра + + Ссылка 63 + true + true + + + Список.Ref + - СписокСостояниеПросмотраРасширеннаяПодсказка + СсылкаРасширеннаяПодсказка 65 Label true @@ -286,10 +262,68 @@ - СписокСостояниеПросмотраКонтекстноеМеню + СсылкаКонтекстноеМеню 64 true + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + true + + + СписокСтрокаПоиска + 67 + + СписокСтрокаПоискаРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 68 + true + + Список + + true + + + + СписокСостояниеПросмотра + 70 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 71 + true + ViewStatusAddition Список @@ -298,10 +332,10 @@ СписокУправлениеПоиском - 66 + 73 СписокУправлениеПоискомРасширеннаяПодсказка - 68 + 75 Label true true @@ -311,7 +345,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 67 + 74 true SearchControlAddition @@ -321,8 +355,8 @@ - СписокРасширеннаяПодсказка - 59 + СписокExtendedTooltip + 58 Label true true @@ -345,8 +379,8 @@ true - СписокИзменитьРасширеннаяПодсказка - 56 + СписокИзменитьExtendedTooltip + 55 Label true true @@ -371,8 +405,8 @@ true - СписокУдалитьРасширеннаяПодсказка - 57 + СписокУдалитьExtendedTooltip + 56 Label true true @@ -394,8 +428,8 @@ true - СписокГруппа1РасширеннаяПодсказка - 55 + СписокГруппа1ExtendedTooltip + 54 Label true true @@ -414,8 +448,8 @@ true - СписокКопироватьВБуферОбменаРасширеннаяПодсказка - 58 + СписокКопироватьВБуферОбменаExtendedTooltip + 57 Label true true @@ -484,7 +518,7 @@ true - ФормаИзменитьРасширеннаяПодсказка + ФормаИзменитьExtendedTooltip 40 Label true @@ -511,7 +545,7 @@ true - ФормаУдалитьРасширеннаяПодсказка + ФормаУдалитьExtendedTooltip 41 Label true @@ -535,7 +569,7 @@ true - ФормаГруппа2РасширеннаяПодсказка + ФормаГруппа2ExtendedTooltip 39 Label true @@ -558,7 +592,7 @@ true - ФормаОтправитьИПолучитьСообщенияРасширеннаяПодсказка + ФормаОтправитьИПолучитьСообщенияExtendedTooltip 43 Label true @@ -584,7 +618,7 @@ true - ФормаНастройкаРасширеннаяПодсказка + ФормаНастройкаExtendedTooltip 44 Label true @@ -607,7 +641,7 @@ true - ФормаГруппа1РасширеннаяПодсказка + ФормаГруппа1ExtendedTooltip 42 Label true @@ -630,7 +664,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 46 Label true @@ -657,7 +691,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 47 Label true @@ -681,7 +715,7 @@ true - ФормаГруппа3РасширеннаяПодсказка + ФормаГруппа3ExtendedTooltip 45 Label true @@ -701,7 +735,7 @@ true - ФормаОбновитьРасширеннаяПодсказка + ФормаОбновитьExtendedTooltip 48 Label true @@ -731,7 +765,7 @@ true - ФормаНастройкаСпискаРасширеннаяПодсказка + ФормаНастройкаСпискаExtendedTooltip 50 Label true @@ -758,7 +792,7 @@ true - ФормаВывестиСписокРасширеннаяПодсказка + ФормаВывестиСписокExtendedTooltip 51 Label true @@ -785,7 +819,7 @@ true - ФормаКопироватьВБуферОбменаРасширеннаяПодсказка + ФормаКопироватьВБуферОбменаExtendedTooltip 52 Label true @@ -809,7 +843,7 @@ true - ФормаГруппа4РасширеннаяПодсказка + ФормаГруппа4ExtendedTooltip 49 Label true diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl index c85885d25..f3745b57c 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаСписка/Module.bsl @@ -9,14 +9,11 @@ КонецЕсли; // Начальная настройка группировки. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ОсновнаяГруппировка"; - ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; - Иначе - ПоляГруппировки = Список.Группировка; - КонецЕсли; + ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ОсновнаяГруппировка"; + ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + + ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; ЭлементГруппировкиДанных = ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЭлементГруппировкиДанных.Поле = Новый ПолеКомпоновкиДанных("Получатель"); @@ -57,7 +54,7 @@ &НаКлиенте Процедура Настройка(Команда) - ОткрытьФорму("ОбщаяФорма.НастройкаОбменаСообщениями",, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.НастройкаОбменаСообщениями",, ЭтотОбъект); КонецПроцедуры @@ -69,7 +66,7 @@ Если Элементы.Список.ТекущиеДанные.Свойство("ГруппировкаСтроки") И ТипЗнч(Элементы.Список.ТекущиеДанные.ГруппировкаСтроки) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru = 'Действие недоступно для строки группировки списка.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Действие недоступно для строки группировки списка.'")); Иначе @@ -84,13 +81,8 @@ КонецЕсли; - Ответ = Вопрос(СтрокаВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - - Если Ответ = КодВозвратаДиалога.Да Тогда - - УдалитьСообщениеНепосредственно(Элементы.Список.ВыделенныеСтроки); - - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, СтрокаВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецЕсли; @@ -98,23 +90,25 @@ КонецПроцедуры +&НаКлиенте +Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + УдалитьСообщениеНепосредственно(Элементы.Список.ВыделенныеСтроки); + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаСервере Процедура УстановитьГруппировкуСписка() - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - - ГруппировкаПолучатель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[0]; - ГруппировкаОтправитель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[1]; - - Иначе - - ГруппировкаПолучатель = Список.Группировка.Элементы[0]; - ГруппировкаОтправитель = Список.Группировка.Элементы[1]; - - КонецЕсли; + ГруппировкаПолучатель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[0]; + ГруппировкаОтправитель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[1]; Если ВариантГруппировки = "БезГруппировки" Тогда diff --git a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form index 600e920ce..903792d9f 100644 --- a/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СообщенияОбластейДанных/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 13 Label true @@ -54,8 +54,8 @@ Объект.Отправитель - ОтправительРасширеннаяПодсказка - 15 + ОтправительExtendedTooltip + 14 Label true true @@ -96,8 +96,8 @@ Объект.Получатель - ПолучательРасширеннаяПодсказка - 17 + ПолучательExtendedTooltip + 15 Label true true @@ -138,8 +138,8 @@ ТелоСообщенияПредставление - ТелоСообщенияРасширеннаяПодсказка - 19 + ТелоСообщенияExtendedTooltip + 16 Label true true @@ -182,8 +182,8 @@ Объект.Заблокировано - ЗаблокированоРасширеннаяПодсказка - 21 + ЗаблокированоExtendedTooltip + 17 Label true true @@ -216,8 +216,8 @@ Top - ПодробноеПредставлениеОшибкиРасширеннаяПодсказка - 23 + ПодробноеПредставлениеОшибкиExtendedTooltip + 18 Label true true diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index a56d27f5a..e0179a60a 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -57,4 +57,6 @@ 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 index 6834a3f90..55b35a816 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Form.form @@ -20,7 +20,7 @@ ВариантГруппировкиПриИзменении - ВариантГруппировкиРасширеннаяПодсказка + ВариантГруппировкиExtendedTooltip 49 Label true @@ -106,8 +106,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 65 + НаименованиеExtendedTooltip + 55 Label true true @@ -142,8 +142,8 @@ Список.Отправитель - ОтправительРасширеннаяПодсказка - 67 + ОтправительExtendedTooltip + 56 Label true true @@ -178,8 +178,8 @@ Список.Получатель - ПолучательРасширеннаяПодсказка - 69 + ПолучательExtendedTooltip + 57 Label true true @@ -202,6 +202,40 @@ true + + Ссылка + 58 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 59 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -211,10 +245,10 @@ СписокСтрокаПоиска - 56 + 62 СписокСтрокаПоискаРасширеннаяПодсказка - 58 + 64 Label true true @@ -224,7 +258,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 57 + 63 true Список @@ -234,10 +268,10 @@ СписокСостояниеПросмотра - 59 + 65 СписокСостояниеПросмотраРасширеннаяПодсказка - 61 + 67 Label true true @@ -247,7 +281,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 60 + 66 true ViewStatusAddition @@ -258,10 +292,10 @@ СписокУправлениеПоиском - 62 + 68 СписокУправлениеПоискомРасширеннаяПодсказка - 64 + 70 Label true true @@ -271,7 +305,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 63 + 69 true SearchControlAddition @@ -281,8 +315,8 @@ - СписокРасширеннаяПодсказка - 55 + СписокExtendedTooltip + 54 Label true true @@ -305,8 +339,8 @@ true - СписокИзменитьРасширеннаяПодсказка - 52 + СписокИзменитьExtendedTooltip + 51 Label true true @@ -331,8 +365,8 @@ true - СписокУдалитьРасширеннаяПодсказка - 53 + СписокУдалитьExtendedTooltip + 52 Label true true @@ -354,8 +388,8 @@ true - СписокГруппа1РасширеннаяПодсказка - 51 + СписокГруппа1ExtendedTooltip + 50 Label true true @@ -374,8 +408,8 @@ true - СписокКопироватьВБуферОбменаРасширеннаяПодсказка - 54 + СписокКопироватьВБуферОбменаExtendedTooltip + 53 Label true true @@ -444,7 +478,7 @@ true - ФормаИзменитьРасширеннаяПодсказка + ФормаИзменитьExtendedTooltip 36 Label true @@ -471,7 +505,7 @@ true - ФормаУдалитьРасширеннаяПодсказка + ФормаУдалитьExtendedTooltip 37 Label true @@ -495,7 +529,7 @@ true - ФормаГруппа2РасширеннаяПодсказка + ФормаГруппа2ExtendedTooltip 35 Label true @@ -518,7 +552,7 @@ true - ФормаОтправитьИПолучитьСообщенияРасширеннаяПодсказка + ФормаОтправитьИПолучитьСообщенияExtendedTooltip 39 Label true @@ -544,7 +578,7 @@ true - ФормаНастройкаРасширеннаяПодсказка + ФормаНастройкаExtendedTooltip 40 Label true @@ -567,7 +601,7 @@ true - ФормаГруппа1РасширеннаяПодсказка + ФормаГруппа1ExtendedTooltip 38 Label true @@ -590,7 +624,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 42 Label true @@ -617,7 +651,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 43 Label true @@ -641,7 +675,7 @@ true - ФормаГруппа3РасширеннаяПодсказка + ФормаГруппа3ExtendedTooltip 41 Label true @@ -661,7 +695,7 @@ true - ФормаОбновитьРасширеннаяПодсказка + ФормаОбновитьExtendedTooltip 44 Label true @@ -691,7 +725,7 @@ true - ФормаНастройкаСпискаРасширеннаяПодсказка + ФормаНастройкаСпискаExtendedTooltip 46 Label true @@ -718,7 +752,7 @@ true - ФормаВывестиСписокРасширеннаяПодсказка + ФормаВывестиСписокExtendedTooltip 47 Label true @@ -745,7 +779,7 @@ true - ФормаКопироватьВБуферОбменаРасширеннаяПодсказка + ФормаКопироватьВБуферОбменаExtendedTooltip 48 Label true @@ -769,7 +803,7 @@ true - ФормаГруппа4РасширеннаяПодсказка + ФормаГруппа4ExtendedTooltip 45 Label true @@ -851,6 +885,23 @@ true + + ЭтоСеансСУстановленнымиЗначениямиРазделителей + + <key>ru</key> + <value>Это сеанс с установленными значениями разделителей</value> + + 3 + + Boolean + + + true + + + true + + ОтправитьИПолучитьСообщения diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl index 20b384b65..d7fd4f8ae 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаСписка/Module.bsl @@ -8,15 +8,15 @@ Возврат; КонецЕсли; + ЭтоСеансСУстановленнымиЗначениямиРазделителей = ОбщегоНазначенияПовтИсп.РазделениеВключено() + И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных(); + // Начальная настройка группировки. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ОсновнаяГруппировка"; - ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; - Иначе - ПоляГруппировки = Список.Группировка; - КонецЕсли; + ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ОсновнаяГруппировка"; + ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + + ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; ЭлементГруппировкиДанных = ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЭлементГруппировкиДанных.Поле = Новый ПолеКомпоновкиДанных("Получатель"); @@ -48,13 +48,13 @@ &НаКлиенте Процедура ОтправитьИПолучитьСообщения(Команда) - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Сообщить(НСтр("ru = 'Обработка сообщений из разделенного сеанса невозможна'")); + Если ЭтоСеансСУстановленнымиЗначениямиРазделителей Тогда + ТекстСообщения = НСтр("ru = 'Обработка сообщений возможна только в неразделенном сеансе администратора сервиса.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); Возврат; КонецЕсли; - + ОбменСообщениямиКлиент.ОтправитьИПолучитьСообщения(); - Элементы.Список.Обновить(); КонецПроцедуры @@ -62,7 +62,7 @@ &НаКлиенте Процедура Настройка(Команда) - ОткрытьФорму("ОбщаяФорма.НастройкаОбменаСообщениями",, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.НастройкаОбменаСообщениями",, ЭтотОбъект); КонецПроцедуры @@ -74,7 +74,7 @@ Если Элементы.Список.ТекущиеДанные.Свойство("ГруппировкаСтроки") И ТипЗнч(Элементы.Список.ТекущиеДанные.ГруппировкаСтроки) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru = 'Действие недоступно для строки группировки списка.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Действие недоступно для строки группировки списка.'")); Иначе @@ -89,13 +89,8 @@ КонецЕсли; - Ответ = Вопрос(СтрокаВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - - Если Ответ = КодВозвратаДиалога.Да Тогда - - УдалитьСообщениеНепосредственно(Элементы.Список.ВыделенныеСтроки); - - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, СтрокаВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецЕсли; @@ -103,23 +98,25 @@ КонецПроцедуры +&НаКлиенте +Процедура УдалитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + УдалитьСообщениеНепосредственно(Элементы.Список.ВыделенныеСтроки); + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаСервере Процедура УстановитьГруппировкуСписка() - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - - ГруппировкаПолучатель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[0]; - ГруппировкаОтправитель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[1]; - - Иначе - - ГруппировкаПолучатель = Список.Группировка.Элементы[0]; - ГруппировкаОтправитель = Список.Группировка.Элементы[1]; - - КонецЕсли; + ГруппировкаПолучатель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[0]; + ГруппировкаОтправитель = Список.КомпоновщикНастроек.Настройки.Структура[0].ПоляГруппировки.Элементы[1]; Если ВариантГруппировки = "БезГруппировки" Тогда @@ -176,4 +173,3 @@ Элементы.Список.Обновить(); КонецПроцедуры - diff --git a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form index df5cf4e2e..3622f65b0 100644 --- a/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СообщенияСистемы/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -54,8 +54,8 @@ <segments>Объект.Отправитель</segments> </dataPath> <extendedTooltip> - <name>ОтправительРасширеннаяПодсказка</name> - <id>15</id> + <name>ОтправительExtendedTooltip</name> + <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -96,8 +96,8 @@ <segments>Объект.Получатель</segments> </dataPath> <extendedTooltip> - <name>ПолучательРасширеннаяПодсказка</name> - <id>17</id> + <name>ПолучательExtendedTooltip</name> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -138,8 +138,8 @@ <segments>ТелоСообщенияПредставление</segments> </dataPath> <extendedTooltip> - <name>ТелоСообщенияРасширеннаяПодсказка</name> - <id>19</id> + <name>ТелоСообщенияExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -182,8 +182,8 @@ <segments>Объект.Заблокировано</segments> </dataPath> <extendedTooltip> - <name>ЗаблокированоРасширеннаяПодсказка</name> - <id>21</id> + <name>ЗаблокированоExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -216,8 +216,8 @@ </dataPath> <titleLocation>Top</titleLocation> <extendedTooltip> - <name>ПодробноеПредставлениеОшибкиРасширеннаяПодсказка</name> - <id>23</id> + <name>ПодробноеПредставлениеОшибкиExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form index 7fb7fe126..a581a4e17 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Form.form @@ -34,8 +34,8 @@ <segments>Классификатор.Наименование</segments> </dataPath> <extendedTooltip> - <name>КлассификаторНаименованиеРасширеннаяПодсказка</name> - <id>73</id> + <name>КлассификаторНаименованиеExtendedTooltip</name> + <id>64</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -74,8 +74,8 @@ <segments>Классификатор.Код</segments> </dataPath> <extendedTooltip> - <name>КлассификаторКодРасширеннаяПодсказка</name> - <id>75</id> + <name>КлассификаторКодExtendedTooltip</name> + <id>65</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -114,8 +114,8 @@ <segments>Классификатор.КодАльфа2</segments> </dataPath> <extendedTooltip> - <name>КлассификаторКодАльфа2РасширеннаяПодсказка</name> - <id>77</id> + <name>КлассификаторКодАльфа2ExtendedTooltip</name> + <id>66</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -154,8 +154,8 @@ <segments>Классификатор.КодАльфа3</segments> </dataPath> <extendedTooltip> - <name>КлассификаторКолАльфа3РасширеннаяПодсказка</name> - <id>79</id> + <name>КлассификаторКолАльфа3ExtendedTooltip</name> + <id>67</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -194,8 +194,8 @@ <segments>Классификатор.НаименованиеПолное</segments> </dataPath> <extendedTooltip> - <name>КлассификаторНаименованиеПолноеРасширеннаяПодсказка</name> - <id>81</id> + <name>КлассификаторНаименованиеПолноеExtendedTooltip</name> + <id>68</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -238,7 +238,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторНайтиРасширеннаяПодсказка</name> + <name>КлассификаторНайтиExtendedTooltip</name> <id>57</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -264,7 +264,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторОтменитьПоискРасширеннаяПодсказка</name> + <name>КлассификаторОтменитьПоискExtendedTooltip</name> <id>58</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -295,7 +295,7 @@ <value>Классификатор группа поиск</value> </toolTip> <extendedTooltip> - <name>КлассификаторГруппаПоискРасширеннаяПодсказка</name> + <name>КлассификаторГруппаПоискExtendedTooltip</name> <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -315,7 +315,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторСортироватьСписокПоВозрастаниюРасширеннаяПодсказка</name> + <name>КлассификаторСортироватьСписокПоВозрастаниюExtendedTooltip</name> <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -342,7 +342,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторСортироватьСписокПоУбываниюРасширеннаяПодсказка</name> + <name>КлассификаторСортироватьСписокПоУбываниюExtendedTooltip</name> <id>60</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -369,7 +369,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторИзменитьФормуРасширеннаяПодсказка</name> + <name>КлассификаторИзменитьФормуExtendedTooltip</name> <id>61</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -395,7 +395,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторСправкаРасширеннаяПодсказка</name> + <name>КлассификаторСправкаExtendedTooltip</name> <id>62</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -437,10 +437,10 @@ </handlers> <searchStringAddition> <name>КлассификаторСтрокаПоиска</name> - <id>64</id> + <id>69</id> <extendedTooltip> <name>КлассификаторСтрокаПоискаРасширеннаяПодсказка</name> - <id>66</id> + <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -450,7 +450,7 @@ </extendedTooltip> <contextMenu> <name>КлассификаторСтрокаПоискаКонтекстноеМеню</name> - <id>65</id> + <id>70</id> <autoFill>true</autoFill> </contextMenu> <source>Классификатор</source> @@ -460,10 +460,10 @@ </searchStringAddition> <viewStatusAddition> <name>КлассификаторСостояниеПросмотра</name> - <id>67</id> + <id>72</id> <extendedTooltip> <name>КлассификаторСостояниеПросмотраРасширеннаяПодсказка</name> - <id>69</id> + <id>74</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -473,7 +473,7 @@ </extendedTooltip> <contextMenu> <name>КлассификаторСостояниеПросмотраКонтекстноеМеню</name> - <id>68</id> + <id>73</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -484,10 +484,10 @@ </viewStatusAddition> <searchControlAddition> <name>КлассификаторУправлениеПоиском</name> - <id>70</id> + <id>75</id> <extendedTooltip> <name>КлассификаторУправлениеПоискомРасширеннаяПодсказка</name> - <id>72</id> + <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -497,7 +497,7 @@ </extendedTooltip> <contextMenu> <name>КлассификаторУправлениеПоискомКонтекстноеМеню</name> - <id>71</id> + <id>76</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -507,7 +507,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>КлассификаторРасширеннаяПодсказка</name> + <name>КлассификаторExtendedTooltip</name> <id>63</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -528,7 +528,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюИзменитьРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюИзменитьExtendedTooltip</name> <id>48</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -554,7 +554,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюНайтиРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюНайтиExtendedTooltip</name> <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -580,7 +580,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюОтменитьПоискExtendedTooltip</name> <id>50</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -606,7 +606,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюСортироватьСписокПоВозрастаниюРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюСортироватьСписокПоВозрастаниюExtendedTooltip</name> <id>51</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -632,7 +632,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюСортироватьСписокПоУбываниюРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюСортироватьСписокПоУбываниюExtendedTooltip</name> <id>52</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -658,7 +658,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюВывестиСписокРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюВывестиСписокExtendedTooltip</name> <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -684,7 +684,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip</name> <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -710,7 +710,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КлассификаторКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка</name> + <name>КлассификаторКонтекстноеМенюВыделитьВсеExtendedTooltip</name> <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html index 4f8c328a9..c991bdaf8 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Help/ru.html @@ -7,7 +7,7 @@ P:first-letter { SUP { LINE-HEIGHT: normal; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 0.9em; FONT-WEIGHT: normal } -</style><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +</style><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <h1>Общероссийский классификатор стран мира (ОКСМ)</h1> <p>Общероссийский классификатор стран мира (ОКСМ) ходит в состав Единой системы классификации и кодирования технико-экономической и социальной информации (ЕСКК) в Российской Федерации.</p> <p>ОКСМ гармонизирован с Международным стандартом ИСО 3166-97 «Коды для представления наименований стран», разработанным Международной организацией по стандартизации (ИСО), и Межгосударственным классификатором стран мира MK (ИСО 3166) 004-97.</p> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl index b2e30c2a8..3aa4204a3 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/Классификатор/Module.bsl @@ -159,5 +159,5 @@ &НаКлиенте Процедура ОповеститьОСозданииЭлементов(Ссылка) ОповеститьОЗаписиНового(Ссылка); - Оповестить("Справочник.СтраныМира.Изменение", Ссылка, Этаформа); + Оповестить("Справочник.СтраныМира.Изменение", Ссылка, ЭтотОбъект); КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form index cf24dbd5b..3dbad5ff5 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Form.form @@ -25,8 +25,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>37</id> + <name>НаименованиеExtendedTooltip</name> + <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -61,8 +61,8 @@ <segments>Список.Code</segments> </dataPath> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> - <id>39</id> + <name>КодExtendedTooltip</name> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -97,8 +97,8 @@ <segments>Список.КодАльфа2</segments> </dataPath> <extendedTooltip> - <name>КодАльфа2РасширеннаяПодсказка</name> - <id>41</id> + <name>КодАльфа2ExtendedTooltip</name> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -133,8 +133,8 @@ <segments>Список.КодАльфа3</segments> </dataPath> <extendedTooltip> - <name>КодАльфа3РасширеннаяПодсказка</name> - <id>43</id> + <name>КодАльфа3ExtendedTooltip</name> + <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -173,8 +173,8 @@ <segments>Список.НаименованиеПолное</segments> </dataPath> <extendedTooltip> - <name>НаименованиеПолноеРасширеннаяПодсказка</name> - <id>45</id> + <name>НаименованиеПолноеExtendedTooltip</name> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -210,7 +210,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокВыбратьРасширеннаяПодсказка</name> + <name>СписокВыбратьExtendedTooltip</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -244,7 +244,7 @@ <value>Список команды</value> </toolTip> <extendedTooltip> - <name>СписокКомандыРасширеннаяПодсказка</name> + <name>СписокКомандыExtendedTooltip</name> <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -266,7 +266,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКлассификаторРасширеннаяПодсказка</name> + <name>СписокКлассификаторExtendedTooltip</name> <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -292,7 +292,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокВыбратьИзКлассификатораРасширеннаяПодсказка</name> + <name>СписокВыбратьИзКлассификатораExtendedTooltip</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -318,7 +318,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокИзменитьФормуРасширеннаяПодсказка</name> + <name>СписокИзменитьФормуExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -344,7 +344,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокСправкаРасширеннаяПодсказка</name> + <name>СписокСправкаExtendedTooltip</name> <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -377,10 +377,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>28</id> + <id>33</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>30</id> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -390,7 +390,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>29</id> + <id>34</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -400,10 +400,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>31</id> + <id>36</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>33</id> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -413,7 +413,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>32</id> + <id>37</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -424,10 +424,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>34</id> + <id>39</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>36</id> + <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -437,7 +437,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>35</id> + <id>40</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -447,7 +447,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -600,23 +600,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ЭтоПлатформа83</name> - <title> - <key>ru</key> - <value>Это платформа 8.3</value> - - 5 - - Boolean - - - true - - - true - - ОткрытьКлассификатор diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl index 0e3a297d7..de065778c 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаСписка/Module.bsl @@ -9,8 +9,6 @@ КонецЕсли; // Инициализируем внутренние флаги - ЭтоПлатформа83 = ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(); - МожноДобавлятьВСправочник = Справочники.СтраныМира.ЕстьПравоДобавления(); Если Параметры.РазрешитьДанныеКлассификатора=Неопределено Тогда @@ -100,14 +98,13 @@ &НаКлиенте Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - ТекстВопроса = НСтр("ru='Есть возможность подобрать страну мира из классификатора. - |Подобрать?'"); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - Если Результат = КодВозвратаДиалога.Да Тогда + Если Не Копирование Тогда Отказ = Истина; - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("РежимВыбора", Истина); - ОткрытьФорму("Справочник.СтраныМира.Форма.Классификатор", ПараметрыОткрытия, Элементы.Список); + ТекстВопроса = НСтр("ru='Есть возможность подобрать страну мира из классификатора. + |Подобрать?'"); + + ОбработчикОповещения = Новый ОписаниеОповещения("ОповещениеВопросОПодбореИзКлассификатора", ЭтотОбъект); + ПоказатьВопрос(ОбработчикОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Нет); КонецЕсли; КонецПроцедуры @@ -162,10 +159,10 @@ Элементы.Список.Обновить(); КонецПроцедуры - + &НаСервере Процедура УстановитьОтборПересеченияСКлассификатором() - ОтборСписка = ?(ЭтоПлатформа83, Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор, Список.Отбор); + ОтборСписка = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; Если ИдентификаторЭлементаОтбораСсылки=Неопределено Тогда ЭлементОтбора = ОтборСписка.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); @@ -203,3 +200,21 @@ Запрос.УстановитьПараметр("Классификатор", Справочники.СтраныМира.ТаблицаКлассификатора()); ЭлементОтбора.ПравоеЗначение = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); КонецПроцедуры + +&НаКлиенте +Процедура ОповещениеВопросОПодбореИзКлассификатора(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса=КодВозвратаДиалога.Да Тогда + // Подбор из классификатора + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("РежимВыбора", Истина); + ОткрытьФорму("Справочник.СтраныМира.Форма.Классификатор", ПараметрыОткрытия, Элементы.Список); + + ИначеЕсли РезультатВопроса=КодВозвратаДиалога.Нет Тогда + // Добавление нового элемента + ОткрытьФорму("Справочник.СтраныМира.ФормаОбъекта"); + + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form index 9d797cf8d..ea369d7a1 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -55,8 +55,8 @@ <segments>Объект.Code</segments> </dataPath> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> - <id>16</id> + <name>КодExtendedTooltip</name> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -89,7 +89,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаРасширеннаяПодсказка</name> + <name>ГруппаExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -123,8 +123,8 @@ <segments>Объект.НаименованиеПолное</segments> </dataPath> <extendedTooltip> - <name>НаименованиеПолноеРасширеннаяПодсказка</name> - <id>18</id> + <name>НаименованиеПолноеExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -166,8 +166,8 @@ <segments>Объект.КодАльфа2</segments> </dataPath> <extendedTooltip> - <name>КодАльфа2РасширеннаяПодсказка</name> - <id>21</id> + <name>КодАльфа2ExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -208,8 +208,8 @@ <segments>Объект.КодАльфа3</segments> </dataPath> <extendedTooltip> - <name>КодАльфа3РасширеннаяПодсказка</name> - <id>23</id> + <name>КодАльфа3ExtendedTooltip</name> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -252,8 +252,8 @@ <value>Группа альфа кодов</value> </toolTip> <extendedTooltip> - <name>ГруппаАльфаКодовРасширеннаяПодсказка</name> - <id>20</id> + <name>ГруппаАльфаКодовExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Module.bsl index 86d03c580..3cf330964 100644 --- a/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СтраныМира/Forms/ФормаЭлемента/Module.bsl @@ -15,6 +15,6 @@ &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) - Оповестить("Справочник.СтраныМира.Изменение", Объект.Ссылка, Этаформа); + Оповестить("Справочник.СтраныМира.Изменение", Объект.Ссылка, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/СтраныМира/Help/ru.html b/SSL/src/Catalogs/СтраныМира/Help/ru.html index 102335c1f..f981dd002 100644 --- a/SSL/src/Catalogs/СтраныМира/Help/ru.html +++ b/SSL/src/Catalogs/СтраныМира/Help/ru.html @@ -7,7 +7,7 @@ P:first-letter { SUP { LINE-HEIGHT: normal; FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 0.9em; FONT-WEIGHT: normal } -</style><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +</style><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <h1>Справочник стран мира</h1> <p>Справочник хранит информацию о странах мира, таможенных союзах стран, либо регионах или части страны. Данные справочника используются, например, при указании страны адреса контактной информации, страны происхождения товара. </p> <p>Справочник может быть заполнен как вручную, так и по данным <a href="Catalog.СтраныМира.Form.Классификатор/Help">общероссийского классификатор стран мира (ОКСМ)</a> </p> diff --git a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl index 3ad854738..726b0fb93 100644 --- a/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl +++ b/SSL/src/Catalogs/СтраныМира/ManagerModule.bsl @@ -1,174 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ -// - -Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) - Если Не СтандартнаяОбработка Тогда - // Обрабатывается в другом месте - Возврат; - - ИначеЕсли Не Параметры.Свойство("РазрешитьДанныеКлассификатора") Тогда - // Поведение по умолчанию, подбор только справочника - Возврат; - - ИначеЕсли Истина<>Параметры.РазрешитьДанныеКлассификатора Тогда - // Подбор классификатора отключен, поведение по умолчанию - Возврат; - - ИначеЕсли Не ЕстьПравоДобавления() Тогда - // Нет прав на добавление страны мира, поведение по умолчанию - Возврат; - - КонецЕсли; - - // Будем имитировать поведение платформы - поиск по всем доступным полям поиска с формированием подобного списка - - // Подразумеваем, что поля справочника и классификатора совпадают, за исключением отсутствующего в классификаторе поля "Ссылка" - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - - ПрефиксПараметраОтбора = "ПараметрыОтбора"; - - // Общий отбор по параметрам - ШаблонОтбора = "ИСТИНА"; - Для Каждого КлючЗначение Из Параметры.Отбор Цикл - ЗначениеПоля = КлючЗначение.Значение; - ИмяПоля = КлючЗначение.Ключ; - ИмяПараметра = ПрефиксПараметраОтбора + ИмяПоля; - - Если ТипЗнч(ЗначениеПоля)=Тип("Массив") Тогда - ШаблонОтбора = ШаблонОтбора + " И %1." + ИмяПоля + " В (&" + ИмяПараметра + ")"; - Иначе - ШаблонОтбора = ШаблонОтбора + " И %1." + ИмяПоля + " = &" + ИмяПараметра; - КонецЕсли; - - Запрос.УстановитьПараметр(ИмяПараметра, КлючЗначение.Значение); - КонецЦикла; - - // Дополнительные отборы - Если Параметры.Свойство("ВыборГруппИЭлементов") Тогда - Если Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда - ШаблонОтбора = ШаблонОтбора + " И %1.ЭтоГруппа"; - - ИначеЕсли Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда - ШаблонОтбора = ШаблонОтбора + " И (НЕ %1.ЭтоГруппа)"; - - КонецЕсли; - КонецЕсли; - - // Источники данных - Если (Параметры.Свойство("ТолькоДанныеКлассификатора") И Параметры.ТолькоДанныеКлассификатора) Тогда - // Запрос только по классификатору - ШаблонЗапроса = " - |ВЫБРАТЬ ПЕРВЫЕ 50 - | NULL КАК Ссылка, - | Классификатор.Код КАК Код, - | Классификатор.Наименование КАК Наименование, - | ЛОЖЬ КАК ПометкаУдаления, - | %2 КАК Представление - |ИЗ - | Классификатор КАК Классификатор - |ГДЕ - | Классификатор.%1 ПОДОБНО &СтрокаПоиска - | И ( - | " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "Классификатор") + " - | ) - |УПОРЯДОЧИТЬ ПО - | Классификатор.%1 - |"; - Иначе - // Запрос и по справочнику и по классификатору - ШаблонЗапроса = " - |ВЫБРАТЬ ПЕРВЫЕ 50 - | СтраныМира.Ссылка КАК Ссылка, - | ЕСТЬNULL(СтраныМира.Код, Классификатор.Код) КАК Код, - | ЕСТЬNULL(СтраныМира.Наименование, Классификатор.Наименование) КАК Наименование, - | ЕСТЬNULL(СтраныМира.ПометкаУдаления, ЛОЖЬ) КАК ПометкаУдаления, - | - | ВЫБОР КОГДА СтраныМира.Ссылка ЕСТЬ NULL ТОГДА - | %2 - | ИНАЧЕ - | %3 - | КОНЕЦ КАК Представление - | - |ИЗ - | Справочник.СтраныМира КАК СтраныМира - |ПОЛНОЕ СОЕДИНЕНИЕ - | Классификатор - |ПО - | Классификатор.Код = СтраныМира.Код - | И Классификатор.Наименование = СтраныМира.Наименование - |ГДЕ - | (СтраныМира.%1 ПОДОБНО &СтрокаПоиска ИЛИ Классификатор.%1 ПОДОБНО &СтрокаПоиска) - | И (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "Классификатор") + ") - | И (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "СтраныМира") + ") - | - |УПОРЯДОЧИТЬ ПО - | ЕСТЬNULL(СтраныМира.%1, Классификатор.%1) - |"; - КонецЕсли; - - ИменаПолей = ПоляПоиска(); - - // Код + Наименование - ключевые поля соответствия справочника классифкатору. Их обрабатываем всегда - ИменаПолейСтрокой = "," + СтрЗаменить(ИменаПолей.ИменаПолейСтрокой, " ", ""); - ИменаПолейСтрокой = СтрЗаменить(ИменаПолейСтрокой, ",Код", ""); - ИменаПолейСтрокой = СтрЗаменить(ИменаПолейСтрокой, ",Наименование", ""); - - Запрос.Текст = " - |ВЫБРАТЬ - | Код, Наименование " + ИменаПолейСтрокой + " - |ПОМЕСТИТЬ - | Классификатор - |ИЗ - | &Классификатор КАК Классификатор - |ИНДЕКСИРОВАТЬ ПО - | Код, Наименование - | " + ИменаПолейСтрокой + " - |"; - Запрос.УстановитьПараметр("Классификатор", ТаблицаКлассификатора()); - Запрос.Выполнить(); - Запрос.УстановитьПараметр("СтрокаПоиска", ЭкранироватьСимволыПодобия(Параметры.СтрокаПоиска) + "%"); - - Для Каждого ДанныеПоля Из ИменаПолей.СписокПолей Цикл - Запрос.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, - ДанныеПоля.Имя, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ДанныеПоля.ШаблонПредставления, "Классификатор"), - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ДанныеПоля.ШаблонПредставления, "СтраныМира"), - ); - - Результат = Запрос.Выполнить(); - Если Не Результат.Пустой() Тогда - ДанныеВыбора = Новый СписокЗначений; - СтандартнаяОбработка = Ложь; - - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - Если ЗначениеЗаполнено(Выборка.Ссылка) Тогда - // Данные справочника - ЭлементВыбора = Выборка.Ссылка; - Иначе - // Данные классификатора - РезультатВыбора = Новый Структура("Код, Наименование", - Выборка.Код, Выборка.Наименование - ); - - ЭлементВыбора = Новый Структура("Значение, ПометкаУдаления, Предупреждение", - РезультатВыбора, Выборка.ПометкаУдаления, Неопределено, - ); - КонецЕсли; - - ДанныеВыбора.Добавить(ЭлементВыбора, Выборка.Представление); - КонецЦикла; - - Прервать; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // @@ -340,25 +171,44 @@ КонецЕсли; КонецПроцедуры -// Возвращает таблицу значений с данными ОКСМ +// Создает или возвращает существующую ссылку по данным классификатора // -// Колонки: -// Код - Строка(3, Переменная), -// Наименование - Строка(60, Переменная), -// НаименованиеПолное - Строка(100, Переменная), -// КодАльфа2 - Строка(2, Переменная), -// КодАльфа3 - Строка(3, Переменная) -// Индексы: -// Код, -// Наименование +// Параметры: +// Отбор - объект с полем Код для поиска страны в классфикаторе +// Данные - необязательная структура для заполнения оставшихся полей создаваемого объекта. // -Функция ТаблицаКлассификатора() Экспорт - Макет = Справочники.СтраныМира.ПолучитьМакет("Классификатор"); +// Возвращаемое значение - ссылка на созданый элемент +// +Функция СсылкаПоДаннымКлассификатора(Знач Отбор, Знач ДополнительныеДанные=Неопределено) Экспорт - Чтение = Новый ЧтениеXML; - Чтение.УстановитьСтроку(Макет.ПолучитьТекст()); + // Убеждаемся, что страна есть в классификаторе + ДанныеПоиска = ДанныеКлассификатораСтранМираПоКоду(Отбор.Код); + Если ДанныеПоиска=Неопределено Тогда + ВызватьИсключение НСтр("ru='Некорректный код страны мира для поиска в классификаторе'"); + КонецЕсли; - Возврат СериализаторXDTO.ПрочитатьXML(Чтение); + // Проверяем на существование в справочнике по данным классификатора + ДанныеПоиска = ДанныеСтраныМира(ДанныеПоиска.Код, ДанныеПоиска.Наименование); + Результат = ДанныеПоиска.Ссылка; + Если Не ЗначениеЗаполнено(Результат) Тогда + ОбъектСтраны = Справочники.СтраныМира.СоздатьЭлемент(); + ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДанныеПоиска); + Если ДополнительныеДанные<>Неопределено Тогда + ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДополнительныеДанные); + КонецЕсли; + ОбъектСтраны.Записать(); + Результат = ОбъектСтраны.Ссылка; + КонецЕсли; + + Возврат Результат; +КонецФункции + +#КонецЕсли + +// Возвращает флаг возможности добавления и изменения элементов +// +Функция ЕстьПравоДобавления() Экспорт + Возврат ПравоДоступа("Добавление", Справочники.СтраныМира.ПустаяСсылка().Метаданные()); КонецФункции // Возвращает поля поиска в порядке предпочтения для справочника стран мира @@ -405,45 +255,28 @@ Возврат Новый Структура("СписокПолей, ИменаПолейСтрокой", Результат, Сред(ВсеИменаСтрокой, 2)); КонецФункции -// Создает или возвращает существующую ссылку по данным классификатора +// Возвращает таблицу значений с данными ОКСМ // -// Параметры: -// Отбор - объект с полем Код для поиска страны в классфикаторе -// Данные - необязательная структура для заполнения оставшихся полей создаваемого объекта. +// Колонки: +// Код - Строка(3, Переменная), +// Наименование - Строка(60, Переменная), +// НаименованиеПолное - Строка(100, Переменная), +// КодАльфа2 - Строка(2, Переменная), +// КодАльфа3 - Строка(3, Переменная) +// Индексы: +// Код, +// Наименование // -// Возвращаемое значение - ссылка на созданый элемент -// -Функция СсылкаПоДаннымКлассификатора(Знач Отбор, Знач ДополнительныеДанные=Неопределено) Экспорт +Функция ТаблицаКлассификатора() Экспорт + Макет = Справочники.СтраныМира.ПолучитьМакет("Классификатор"); - // Убеждаемся, что страна есть в классификаторе - ДанныеПоиска = ДанныеКлассификатораСтранМираПоКоду(Отбор.Код); - Если ДанныеПоиска=Неопределено Тогда - ВызватьИсключение НСтр("ru='Некорректный код страны мира для поиска в классификаторе'"); - КонецЕсли; + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(Макет.ПолучитьТекст()); - // Проверяем на существование в справочнике по данным классификатора - ДанныеПоиска = ДанныеСтраныМира(ДанныеПоиска.Код, ДанныеПоиска.Наименование); - Результат = ДанныеПоиска.Ссылка; - Если Не ЗначениеЗаполнено(Результат) Тогда - ОбъектСтраны = Справочники.СтраныМира.СоздатьЭлемент(); - ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДанныеПоиска); - Если ДополнительныеДанные<>Неопределено Тогда - ЗаполнитьЗначенияСвойств(ОбъектСтраны, ДополнительныеДанные); - КонецЕсли; - ОбъектСтраны.Записать(); - Результат = ОбъектСтраны.Ссылка; - КонецЕсли; - - Возврат Результат; + Возврат СериализаторXDTO.ПрочитатьXML(Чтение); КонецФункции -// Возвращает флаг возможности добавления и изменения элементов -// -Функция ЕстьПравоДобавления() Экспорт - - Возврат ПравоДоступа("Добавление", Метаданные.Справочники.СтраныМира); - -КонецФункции +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -466,6 +299,8 @@ Возврат """" + СтрЗаменить(Строка, """", """""") + """"; КонецФункции +#КонецЕсли + // Экранирует символы для использования в функции запроса ПОДОБНО // Функция ЭкранироватьСимволыПодобия(Знач Текст, Знач СпецСимвол = "\") @@ -480,4 +315,172 @@ Возврат Результат; КонецФункции -#КонецЕсли +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ +// + +Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка) + Если Не СтандартнаяОбработка Тогда + // Обрабатывается в другом месте + Возврат; + + ИначеЕсли Не Параметры.Свойство("РазрешитьДанныеКлассификатора") Тогда + // Поведение по умолчанию, подбор только справочника + Возврат; + + ИначеЕсли Истина<>Параметры.РазрешитьДанныеКлассификатора Тогда + // Подбор классификатора отключен, поведение по умолчанию + Возврат; + + ИначеЕсли Не ЕстьПравоДобавления() Тогда + // Нет прав на добавление страны мира, поведение по умолчанию + Возврат; + + КонецЕсли; + + // Будем имитировать поведение платформы - поиск по всем доступным полям поиска с формированием подобного списка + + // Подразумеваем, что поля справочника и классификатора совпадают, за исключением отсутствующего в классификаторе поля "Ссылка" + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + ПрефиксПараметраОтбора = "ПараметрыОтбора"; + + // Общий отбор по параметрам + ШаблонОтбора = "ИСТИНА"; + Для Каждого КлючЗначение Из Параметры.Отбор Цикл + ЗначениеПоля = КлючЗначение.Значение; + ИмяПоля = КлючЗначение.Ключ; + ИмяПараметра = ПрефиксПараметраОтбора + ИмяПоля; + + Если ТипЗнч(ЗначениеПоля)=Тип("Массив") Тогда + ШаблонОтбора = ШаблонОтбора + " И %1." + ИмяПоля + " В (&" + ИмяПараметра + ")"; + Иначе + ШаблонОтбора = ШаблонОтбора + " И %1." + ИмяПоля + " = &" + ИмяПараметра; + КонецЕсли; + + Запрос.УстановитьПараметр(ИмяПараметра, КлючЗначение.Значение); + КонецЦикла; + + // Дополнительные отборы + Если Параметры.Свойство("ВыборГруппИЭлементов") Тогда + Если Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда + ШаблонОтбора = ШаблонОтбора + " И %1.ЭтоГруппа"; + + ИначеЕсли Параметры.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда + ШаблонОтбора = ШаблонОтбора + " И (НЕ %1.ЭтоГруппа)"; + + КонецЕсли; + КонецЕсли; + + // Источники данных + Если (Параметры.Свойство("ТолькоДанныеКлассификатора") И Параметры.ТолькоДанныеКлассификатора) Тогда + // Запрос только по классификатору + ШаблонЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 50 + | NULL КАК Ссылка, + | Классификатор.Код КАК Код, + | Классификатор.Наименование КАК Наименование, + | ЛОЖЬ КАК ПометкаУдаления, + | %2 КАК Представление + |ИЗ + | Классификатор КАК Классификатор + |ГДЕ + | Классификатор.%1 ПОДОБНО &СтрокаПоиска + | И ( + | " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "Классификатор") + " + | ) + |УПОРЯДОЧИТЬ ПО + | Классификатор.%1 + |"; + Иначе + // Запрос и по справочнику и по классификатору + ШаблонЗапроса = " + |ВЫБРАТЬ ПЕРВЫЕ 50 + | СтраныМира.Ссылка КАК Ссылка, + | ЕСТЬNULL(СтраныМира.Код, Классификатор.Код) КАК Код, + | ЕСТЬNULL(СтраныМира.Наименование, Классификатор.Наименование) КАК Наименование, + | ЕСТЬNULL(СтраныМира.ПометкаУдаления, ЛОЖЬ) КАК ПометкаУдаления, + | + | ВЫБОР КОГДА СтраныМира.Ссылка ЕСТЬ NULL ТОГДА + | %2 + | ИНАЧЕ + | %3 + | КОНЕЦ КАК Представление + | + |ИЗ + | Справочник.СтраныМира КАК СтраныМира + |ПОЛНОЕ СОЕДИНЕНИЕ + | Классификатор + |ПО + | Классификатор.Код = СтраныМира.Код + | И Классификатор.Наименование = СтраныМира.Наименование + |ГДЕ + | (СтраныМира.%1 ПОДОБНО &СтрокаПоиска ИЛИ Классификатор.%1 ПОДОБНО &СтрокаПоиска) + | И (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "Классификатор") + ") + | И (" + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонОтбора, "СтраныМира") + ") + | + |УПОРЯДОЧИТЬ ПО + | ЕСТЬNULL(СтраныМира.%1, Классификатор.%1) + |"; + КонецЕсли; + + ИменаПолей = ПоляПоиска(); + + // Код + Наименование - ключевые поля соответствия справочника классифкатору. Их обрабатываем всегда + ИменаПолейСтрокой = "," + СтрЗаменить(ИменаПолей.ИменаПолейСтрокой, " ", ""); + ИменаПолейСтрокой = СтрЗаменить(ИменаПолейСтрокой, ",Код", ""); + ИменаПолейСтрокой = СтрЗаменить(ИменаПолейСтрокой, ",Наименование", ""); + + Запрос.Текст = " + |ВЫБРАТЬ + | Код, Наименование " + ИменаПолейСтрокой + " + |ПОМЕСТИТЬ + | Классификатор + |ИЗ + | &Классификатор КАК Классификатор + |ИНДЕКСИРОВАТЬ ПО + | Код, Наименование + | " + ИменаПолейСтрокой + " + |"; + Запрос.УстановитьПараметр("Классификатор", ТаблицаКлассификатора()); + Запрос.Выполнить(); + Запрос.УстановитьПараметр("СтрокаПоиска", ЭкранироватьСимволыПодобия(Параметры.СтрокаПоиска) + "%"); + + Для Каждого ДанныеПоля Из ИменаПолей.СписокПолей Цикл + Запрос.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонЗапроса, + ДанныеПоля.Имя, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ДанныеПоля.ШаблонПредставления, "Классификатор"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ДанныеПоля.ШаблонПредставления, "СтраныМира"), + ); + + Результат = Запрос.Выполнить(); + Если Не Результат.Пустой() Тогда + ДанныеВыбора = Новый СписокЗначений; + СтандартнаяОбработка = Ложь; + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + Если ЗначениеЗаполнено(Выборка.Ссылка) Тогда + // Данные справочника + ЭлементВыбора = Выборка.Ссылка; + Иначе + // Данные классификатора + РезультатВыбора = Новый Структура("Код, Наименование", + Выборка.Код, Выборка.Наименование + ); + + ЭлементВыбора = Новый Структура("Значение, ПометкаУдаления, Предупреждение", + РезультатВыбора, Выборка.ПометкаУдаления, Неопределено, + ); + КонецЕсли; + + ДанныеВыбора.Добавить(ЭлементВыбора, Выборка.Представление); + КонецЦикла; + + Прервать; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + diff --git a/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt b/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt index 565277785..82be1a4e7 100644 --- a/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt +++ b/SSL/src/Catalogs/СтраныМира/Templates/Классификатор/Template.txt @@ -1398,7 +1398,7 @@ <Value>SO</Value> <Value>SOM</Value> <Value>706</Value> - <Value>Федеративная Республика Сомали</Value> + <Value>Сомалийская Республика</Value> </row> <row> <Value>СУДАН</Value> diff --git a/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/СтроковыеКонтактыВзаимодействий.mdo b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/СтроковыеКонтактыВзаимодействий.mdo new file mode 100644 index 000000000..dcdcd811d --- /dev/null +++ b/SSL/src/Catalogs/СтроковыеКонтактыВзаимодействий/СтроковыеКонтактыВзаимодействий.mdo @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Catalog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4"> + <producedTypes> + <objectType typeId="462f0243-f197-4b99-834e-c6465debe032" valueTypeId="afeac01a-2a7d-4fea-9750-40e740c3556d"/> + <refType typeId="53a1d478-1a21-4d7c-8778-85bf0ed70899" valueTypeId="3a2e3c76-03af-4f1e-9a91-2fbc048611c1"/> + <selectionType typeId="d4459109-8a8b-40c1-92f2-fae35bb52c4f" valueTypeId="d90cb070-9d0d-4077-8fb9-c61fd3fe3502"/> + <listType typeId="82970b31-4cf5-47e8-8fd9-51d6edf89b8b" valueTypeId="80c2442d-9cfb-4d48-a32b-c1eee6724d13"/> + <managerType typeId="4a455a67-ea24-4e9a-848e-cb2b433df2e0" valueTypeId="ccb2837d-380c-42b4-b590-a996c1f2168e"/> + </producedTypes> + <name>СтроковыеКонтактыВзаимодействий</name> + <synonym> + <key>ru</key> + <value>Строковые контакты взаимодействий</value> + </synonym> + <useStandardCommands>true</useStandardCommands> + <inputByString>Catalog.СтроковыеКонтактыВзаимодействий.StandardAttribute.Description</inputByString> + <fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>PredefinedDataName</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Predefined</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Ref</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>DeletionMark</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>IsFolder</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Owner</name> + <fillFromFillingValue>true</fillFromFillingValue> + <fillValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Parent</name> + <fillFromFillingValue>true</fillFromFillingValue> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Description</name> + <toolTip> + <key>ru</key> + <value>Строковое представление контакта взаимодействий</value> + </toolTip> + <fillValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <standardAttributes> + <dataHistory>Use</dataHistory> + <name>Code</name> + <fillValue xsi:type="core:UndefinedValue"/> + <fullTextSearch>Use</fullTextSearch> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + </standardAttributes> + <createOnInput>Use</createOnInput> + <dataLockControlMode>Managed</dataLockControlMode> + <fullTextSearch>Use</fullTextSearch> + <objectPresentation> + <key>ru</key> + <value>Строковый контакт взаимодействий</value> + </objectPresentation> + <levelCount>2</levelCount> + <foldersOnTop>true</foldersOnTop> + <descriptionLength>100</descriptionLength> + <codeType>String</codeType> + <codeAllowedLength>Variable</codeAllowedLength> + <defaultPresentation>AsDescription</defaultPresentation> + <editType>InDialog</editType> + <choiceMode>BothWays</choiceMode> +</mdclass:Catalog> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss index 09fd93e5f..0839ac070 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Attributes/Список/ExtInfo/ListSettings.dcss @@ -52,4 +52,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form index a07c2f101..f61327227 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Form.form @@ -34,8 +34,8 @@ <value>Загрузка</value> </toolTip> <extendedTooltip> - <name>ФлагИспользованияЗагрузкиРасширеннаяПодсказка</name> - <id>62</id> + <name>ФлагИспользованияЗагрузкиExtendedTooltip</name> + <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -79,8 +79,8 @@ <value>Выгрузка</value> </toolTip> <extendedTooltip> - <name>ФлагИспользованияВыгрузкиРасширеннаяПодсказка</name> - <id>64</id> + <name>ФлагИспользованияВыгрузкиExtendedTooltip</name> + <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -115,8 +115,8 @@ <segments>Список.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>66</id> + <name>НаименованиеExtendedTooltip</name> + <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -151,10 +151,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>53</id> + <id>57</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>55</id> + <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -164,7 +164,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>54</id> + <id>58</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -174,10 +174,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>56</id> + <id>60</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>58</id> + <id>62</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -187,7 +187,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>57</id> + <id>61</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -198,10 +198,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>59</id> + <id>63</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>61</id> + <id>65</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -211,7 +211,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>60</id> + <id>64</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -221,7 +221,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>52</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -245,7 +245,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКонтекстноеМенюВключитьОтключитьЗагрузкуРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюВключитьОтключитьЗагрузкуExtendedTooltip</name> <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -271,7 +271,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьВыгрузкуРасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьВыгрузкуExtendedTooltip</name> <id>47</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -302,7 +302,7 @@ <value>Группа кнопок включения загрузки выгрузки данных</value> </toolTip> <extendedTooltip> - <name>ГруппаКнопокВключенияЗагрузкиВыгрузкиДанныхРасширеннаяПодсказка</name> + <name>ГруппаКнопокВключенияЗагрузкиВыгрузкиДанныхExtendedTooltip</name> <id>45</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -325,7 +325,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеExtendedTooltip</name> <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -351,7 +351,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКонтекстноеМенюОткрытьСценарийОбменаДаннымиРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюОткрытьСценарийОбменаДаннымиExtendedTooltip</name> <id>50</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -382,7 +382,7 @@ <value>Список контекстное меню группа кнопок</value> </toolTip> <extendedTooltip> - <name>СписокКонтекстноеМенюГруппаКнопокРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюГруппаКнопокExtendedTooltip</name> <id>48</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -402,7 +402,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКонтекстноеМенюВыполнитьСценарийРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюВыполнитьСценарийExtendedTooltip</name> <id>51</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -472,8 +472,8 @@ <segments>Items.Список.CurrentData.Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>76</id> + <name>КомментарийExtendedTooltip</name> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -524,7 +524,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьЗагрузкуВыгрузкуРасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьЗагрузкуВыгрузкуExtendedTooltip</name> <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -554,7 +554,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьЗагрузкуРасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьЗагрузкуExtendedTooltip</name> <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -584,7 +584,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьВыгрузку1РасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьВыгрузку1ExtendedTooltip</name> <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -615,7 +615,7 @@ <value>Включить или отключить загрузку и выгрузку данных</value> </toolTip> <extendedTooltip> - <name>ВключитьОтключитьВыгрузкуЗагрузкуРасширеннаяПодсказка</name> + <name>ВключитьОтключитьВыгрузкуЗагрузкуExtendedTooltip</name> <id>36</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -639,7 +639,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СоздатьРасширеннаяПодсказка</name> + <name>СоздатьExtendedTooltip</name> <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -665,7 +665,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИзменитьСценарийОбменаДаннымиРасширеннаяПодсказка</name> + <name>ИзменитьСценарийОбменаДаннымиExtendedTooltip</name> <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -694,7 +694,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьРегламентноеЗаданиеExtendedTooltip</name> <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -725,7 +725,7 @@ <value>Группа кнопок</value> </toolTip> <extendedTooltip> - <name>ГруппаКнопокРасширеннаяПодсказка</name> + <name>ГруппаКнопокExtendedTooltip</name> <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -745,7 +745,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВыполнитьСценарийРасширеннаяПодсказка</name> + <name>ФормаВыполнитьСценарийExtendedTooltip</name> <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -774,7 +774,12 @@ <name>ПриСозданииНаСервере</name> </handlers> <excludedCommands>CancelSearch</excludedCommands> + <excludedCommands>Change</excludedCommands> + <excludedCommands>Copy</excludedCommands> + <excludedCommands>Create</excludedCommands> + <excludedCommands>Delete</excludedCommands> <excludedCommands>Find</excludedCommands> + <excludedCommands>SetDeletionMark</excludedCommands> <windowOpeningMode>DontBlock</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoUrl>true</autoUrl> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl index 4292de159..200de6f11 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/НастройкаРасписанияОбменовДанными/Module.bsl @@ -33,6 +33,8 @@ &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ТекущиеДанные = Элементы.Список.ДанныеСтроки(ВыбраннаяСтрока); Если ТекущиеДанные = Неопределено Тогда @@ -63,7 +65,7 @@ ПараметрыФормы = Новый Структура("УзелИнформационнойБазы", Параметры.УзелИнформационнойБазы); - ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -79,7 +81,7 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Ключ", ТекущиеДанные.Ссылка); - ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form index 3f50fcd70..99bf8566e 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ИспользоватьРегламентноеЗаданиеРасширеннаяПодсказка</name> - <id>26</id> + <name>ИспользоватьРегламентноеЗаданиеExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -77,8 +77,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>28</id> + <name>НаименованиеExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -114,10 +114,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>17</id> + <id>19</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>19</id> + <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -127,7 +127,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>18</id> + <id>20</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -137,10 +137,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>20</id> + <id>22</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>22</id> + <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -150,7 +150,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>21</id> + <id>23</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -161,10 +161,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>23</id> + <id>25</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>25</id> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -174,7 +174,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>24</id> + <id>26</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -184,7 +184,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -205,7 +205,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка</name> + <name>СписокКонтекстноеМенюВключитьОтключитьРегламентноеЗаданиеExtendedTooltip</name> <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -271,7 +271,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВключитьОтключитьРегламентноеЗаданиеРасширеннаяПодсказка</name> + <name>ФормаВключитьОтключитьРегламентноеЗаданиеExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form index 264db8732..f826e4c93 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>129</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -52,8 +52,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> - <id>131</id> + <name>КодExtendedTooltip</name> + <id>130</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -87,7 +87,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаРасширеннаяПодсказка</name> + <name>ГруппаExtendedTooltip</name> <id>128</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -129,8 +129,8 @@ <name>ИспользоватьРегламентноеЗаданиеПриИзменении</name> </handlers> <extendedTooltip> - <name>ИспользоватьРегламентноеЗаданиеРасширеннаяПодсказка</name> - <id>134</id> + <name>ИспользоватьРегламентноеЗаданиеExtendedTooltip</name> + <id>132</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -160,8 +160,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>НастроитьРасписаниеРегламентногоЗаданияРасширеннаяПодсказка</name> - <id>136</id> + <name>НастроитьРасписаниеРегламентногоЗаданияExtendedTooltip</name> + <id>133</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -194,8 +194,8 @@ <width>70</width> <horizontalStretch>false</horizontalStretch> <extendedTooltip> - <name>ОбменПоРасписаниюРасширеннаяПодсказка</name> - <id>133</id> + <name>ОбменПоРасписаниюExtendedTooltip</name> + <id>131</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -240,8 +240,8 @@ <segments>Объект.НастройкиОбмена.LineNumber</segments> </dataPath> <extendedTooltip> - <name>НастройкиОбменаНомерСтрокиРасширеннаяПодсказка</name> - <id>150</id> + <name>НастройкиОбменаНомерСтрокиExtendedTooltip</name> + <id>138</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -280,8 +280,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>НастройкиОбменаРезультатВыполненияОбменаРасширеннаяПодсказка</name> - <id>153</id> + <name>НастройкиОбменаРезультатВыполненияОбменаExtendedTooltip</name> + <id>140</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -329,8 +329,8 @@ <name>НастройкиОбменаУзелИнформационнойБазыПриИзменении</name> </handlers> <extendedTooltip> - <name>НастройкиОбменаУзелИнформационнойБазыРасширеннаяПодсказка</name> - <id>155</id> + <name>НастройкиОбменаУзелИнформационнойБазыExtendedTooltip</name> + <id>141</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -372,8 +372,8 @@ <value>Колонки узла информационной базы</value> </toolTip> <extendedTooltip> - <name>КолонкиУзлаИнформационнойБазыРасширеннаяПодсказка</name> - <id>152</id> + <name>КолонкиУзлаИнформационнойБазыExtendedTooltip</name> + <id>139</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -400,8 +400,8 @@ <segments>Объект.НастройкиОбмена.ВидТранспортаОбмена</segments> </dataPath> <extendedTooltip> - <name>НастройкиОбменаВидТранспортаОбменаРасширеннаяПодсказка</name> - <id>157</id> + <name>НастройкиОбменаВидТранспортаОбменаExtendedTooltip</name> + <id>142</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -446,8 +446,8 @@ <segments>Объект.НастройкиОбмена.ВыполняемоеДействие</segments> </dataPath> <extendedTooltip> - <name>НастройкиОбменаВыполняемоеДействиеРасширеннаяПодсказка</name> - <id>159</id> + <name>НастройкиОбменаВыполняемоеДействиеExtendedTooltip</name> + <id>143</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -491,8 +491,8 @@ <segments>Объект.НастройкиОбмена.КоличествоЭлементовВТранзакции</segments> </dataPath> <extendedTooltip> - <name>НастройкиОбменаКоличествоЭлементовВТранзакцииРасширеннаяПодсказка</name> - <id>161</id> + <name>НастройкиОбменаКоличествоЭлементовВТранзакцииExtendedTooltip</name> + <id>144</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -532,10 +532,10 @@ </handlers> <searchStringAddition> <name>СоставРасписанияСтрокаПоиска</name> - <id>141</id> + <id>150</id> <extendedTooltip> <name>СоставРасписанияСтрокаПоискаРасширеннаяПодсказка</name> - <id>143</id> + <id>152</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -545,7 +545,7 @@ </extendedTooltip> <contextMenu> <name>СоставРасписанияСтрокаПоискаКонтекстноеМеню</name> - <id>142</id> + <id>151</id> <autoFill>true</autoFill> </contextMenu> <source>СоставРасписания</source> @@ -555,10 +555,10 @@ </searchStringAddition> <viewStatusAddition> <name>СоставРасписанияСостояниеПросмотра</name> - <id>144</id> + <id>153</id> <extendedTooltip> <name>СоставРасписанияСостояниеПросмотраРасширеннаяПодсказка</name> - <id>146</id> + <id>155</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -568,7 +568,7 @@ </extendedTooltip> <contextMenu> <name>СоставРасписанияСостояниеПросмотраКонтекстноеМеню</name> - <id>145</id> + <id>154</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -579,10 +579,10 @@ </viewStatusAddition> <searchControlAddition> <name>СоставРасписанияУправлениеПоиском</name> - <id>147</id> + <id>156</id> <extendedTooltip> <name>СоставРасписанияУправлениеПоискомРасширеннаяПодсказка</name> - <id>149</id> + <id>158</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -592,7 +592,7 @@ </extendedTooltip> <contextMenu> <name>СоставРасписанияУправлениеПоискомКонтекстноеМеню</name> - <id>148</id> + <id>157</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -602,8 +602,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СоставРасписанияРасширеннаяПодсказка</name> - <id>140</id> + <name>СоставРасписанияExtendedTooltip</name> + <id>137</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -624,8 +624,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>НастройкиТранспортаРасширеннаяПодсказка</name> - <id>138</id> + <name>НастройкиТранспортаExtendedTooltip</name> + <id>135</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -651,8 +651,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСоставРасписанияПерейтиВЖурналРегистрацииРасширеннаяПодсказка</name> - <id>139</id> + <name>КонтекстноеМенюСоставРасписанияПерейтиВЖурналРегистрацииExtendedTooltip</name> + <id>136</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -711,8 +711,8 @@ <value>Состав</value> </toolTip> <extendedTooltip> - <name>СоставРасширеннаяПодсказка</name> - <id>137</id> + <name>СоставExtendedTooltip</name> + <id>134</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -745,8 +745,8 @@ <segments>Объект.Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>172</id> + <name>КомментарийExtendedTooltip</name> + <id>146</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -793,8 +793,8 @@ <value>Дополнительно</value> </toolTip> <extendedTooltip> - <name>ДополнительноРасширеннаяПодсказка</name> - <id>171</id> + <name>ДополнительноExtendedTooltip</name> + <id>145</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -824,7 +824,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ВыполнитьОбменРасширеннаяПодсказка</name> + <name>ВыполнитьОбменExtendedTooltip</name> <id>127</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl index cbaedf0cd..5a8ea5570 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Forms/ФормаЭлемента/Module.bsl @@ -102,8 +102,8 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, - Объект.Комментарий, Модифицированность); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, + ЭтотОбъект, "Объект.Комментарий"); КонецПроцедуры @@ -167,7 +167,7 @@ Отбор = Новый Структура("Узел", ТекущиеДанные.УзелИнформационнойБазы); ЗначенияЗаполнения = Новый Структура("Узел", ТекущиеДанные.УзелИнформационнойБазы); - ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ЭтаФорма); + ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", ЭтотОбъект); КонецПроцедуры @@ -181,7 +181,7 @@ КонецЕсли; ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, - ЭтаФорма, + ЭтотОбъект, ТекущиеДанные.ВыполняемоеДействие); КонецПроцедуры @@ -202,9 +202,17 @@ Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеРегламентногоЗадания); // открываем диалог для редактирования Расписания - Если Диалог.ОткрытьМодально() Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("РедактированиеРасписанияРегламентногоЗаданияЗавершение", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура РедактированиеРасписанияРегламентногоЗаданияЗавершение(Расписание, ДополнительныеПараметры) Экспорт + + Если Расписание <> Неопределено Тогда - РасписаниеРегламентногоЗадания = Диалог.Расписание; + РасписаниеРегламентногоЗадания = Расписание; КонецЕсли; diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html b/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html new file mode 100644 index 000000000..67400ce48 --- /dev/null +++ b/SSL/src/Catalogs/СценарииОбменовДанными/Help/ru.html @@ -0,0 +1,5 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> +<p>Позволяет настроить автоматическую синхронизацию данных по заданному расписанию для выбранных информационных баз. Настройка сценария синхронизации данных состоит из следующих этапов:</p> +<ul><li>Настроить расписание выполнения сценария синхронизации данных. +</li><li>Выбрать информационные базы, для которых будет выполняться сценарий синхронизации данных. +</li><li>Для каждой информационной базы выбрать способ подключения и выполняемое действие (отправка или получение).</li></ul></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo index 34a01afc0..d765c0a0e 100644 --- a/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo +++ b/SSL/src/Catalogs/СценарииОбменовДанными/СценарииОбменовДанными.mdo @@ -82,6 +82,7 @@ <value>Наименование сценария обмена данными.</value> </toolTip> <fillValue xsi:type="core:UndefinedValue"/> + <fillChecking>ShowError</fillChecking> <fullTextSearch>Use</fullTextSearch> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -99,6 +100,11 @@ <maxValue xsi:type="core:UndefinedValue"/> </standardAttributes> <createOnInput>Use</createOnInput> + <help> + <pages> + <lang>ru</lang> + </pages> + </help> <dataLockControlMode>Managed</dataLockControlMode> <fullTextSearch>Use</fullTextSearch> <objectPresentation> @@ -192,12 +198,13 @@ <name>НастройкиОбмена</name> <synonym> <key>ru</key> - <value>Настройки обмена</value> + <value>Настройки синхронизации</value> </synonym> <toolTip> <key>ru</key> <value>Содержит последовательно выполняемые действия сценария синхронизации.</value> </toolTip> + <fillChecking>ShowError</fillChecking> <standardAttributes> <dataHistory>Use</dataHistory> <name>LineNumber</name> diff --git a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo index 106b7ce7a..2684162e1 100644 --- a/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ТелефонныйЗвонокПрисоединенныеФайлы/ТелефонныйЗвонокПрисоединенныеФайлы.mdo @@ -288,7 +288,7 @@ <dataHistory>Use</dataHistory> </attributes> <attributes uuid="2005bf54-219b-4111-bff1-e12e2c6dca3e"> - <name>ПодписанЭЦП</name> + <name>ПодписанЭП</name> <synonym> <key>ru</key> <value>Подписан ЭП</value> @@ -298,7 +298,7 @@ </type> <toolTip> <key>ru</key> - <value>Флажок, означающий что файл подписан с помощью ЭП</value> + <value>Признак того, что файл подписан с помощью ЭП</value> </toolTip> <minValue xsi:type="core:UndefinedValue"/> <maxValue xsi:type="core:UndefinedValue"/> @@ -502,10 +502,10 @@ <objectType typeId="b641d5fc-a4d1-4e17-aaa6-3f82495c427e" valueTypeId="f8f3cba1-52c8-4f04-ab0e-ea2072fa4db7"/> <rowType typeId="e3212ad4-6028-4911-b86e-72320d7c2408" valueTypeId="203a2356-5267-4462-bcc1-9c67ede542b8"/> </producedTypes> - <name>ЭлектронныеЦифровыеПодписи</name> + <name>ЭлектронныеПодписи</name> <synonym> <key>ru</key> - <value>Электронные подписи</value> + <value>электронные подписи</value> </synonym> <toolTip> <key>ru</key> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 4b86f1264..264cf663c 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -16,4 +16,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form index a116ad564..6a2369e54 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>28</id> + <name>НаименованиеExtendedTooltip</name> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -63,8 +63,8 @@ <segments>Список.ПорядокЗаполнения</segments> </dataPath> <extendedTooltip> - <name>ПорядокЗаполненияРасширеннаяПодсказка</name> - <id>30</id> + <name>ПорядокЗаполненияExtendedTooltip</name> + <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -103,8 +103,8 @@ <segments>Список.МаксимальныйРазмер</segments> </dataPath> <extendedTooltip> - <name>МаксимальныйРазмерРасширеннаяПодсказка</name> - <id>32</id> + <name>МаксимальныйРазмерExtendedTooltip</name> + <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -143,8 +143,8 @@ <segments>Список.ПолныйПутьWindows</segments> </dataPath> <extendedTooltip> - <name>ПолныйПутьWindowsРасширеннаяПодсказка</name> - <id>34</id> + <name>ПолныйПутьWindowsExtendedTooltip</name> + <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -183,8 +183,8 @@ <segments>Список.ПолныйПутьLinux</segments> </dataPath> <extendedTooltip> - <name>ПолныйПутьLinuxРасширеннаяПодсказка</name> - <id>36</id> + <name>ПолныйПутьLinuxExtendedTooltip</name> + <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -219,8 +219,8 @@ <segments>Список.Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>38</id> + <name>КомментарийExtendedTooltip</name> + <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -252,10 +252,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>19</id> + <id>25</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>21</id> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -265,7 +265,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>20</id> + <id>26</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -275,10 +275,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>22</id> + <id>28</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>24</id> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -288,7 +288,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>23</id> + <id>29</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -299,10 +299,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>25</id> + <id>31</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>27</id> + <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -312,7 +312,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>26</id> + <id>32</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -322,7 +322,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form index 1d1ff7ce1..8e8692be2 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ <segments>Объект.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> + <name>НаименованиеExtendedTooltip</name> <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -57,8 +57,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>КодРасширеннаяПодсказка</name> - <id>28</id> + <name>КодExtendedTooltip</name> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -100,7 +100,7 @@ <value>Группа код и наименование</value> </toolTip> <extendedTooltip> - <name>ГруппаКодИНаименованиеРасширеннаяПодсказка</name> + <name>ГруппаКодИНаименованиеExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -138,8 +138,8 @@ </dataPath> <titleLocation>Top</titleLocation> <extendedTooltip> - <name>ПолныйПутьWindowsРасширеннаяПодсказка</name> - <id>31</id> + <name>ПолныйПутьWindowsExtendedTooltip</name> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -189,8 +189,8 @@ </dataPath> <titleLocation>Top</titleLocation> <extendedTooltip> - <name>ПолныйПутьLinuxРасширеннаяПодсказка</name> - <id>33</id> + <name>ПолныйПутьLinuxExtendedTooltip</name> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -232,8 +232,8 @@ <value>Группа пути</value> </toolTip> <extendedTooltip> - <name>ГруппаПутиРасширеннаяПодсказка</name> - <id>30</id> + <name>ГруппаПутиExtendedTooltip</name> + <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -265,8 +265,8 @@ <segments>Объект.ПорядокЗаполнения</segments> </dataPath> <extendedTooltip> - <name>ПорядокРасширеннаяПодсказка</name> - <id>35</id> + <name>ПорядокExtendedTooltip</name> + <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -314,8 +314,8 @@ <segments>Объект.МаксимальныйРазмер</segments> </dataPath> <extendedTooltip> - <name>МаксимальныйРазмерРасширеннаяПодсказка</name> - <id>38</id> + <name>МаксимальныйРазмерExtendedTooltip</name> + <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -356,8 +356,8 @@ <segments>ТекущийРазмер</segments> </dataPath> <extendedTooltip> - <name>ТекущийРазмерРасширеннаяПодсказка</name> - <id>40</id> + <name>ТекущийРазмерExtendedTooltip</name> + <id>34</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -400,8 +400,8 @@ <value>Группа максимальный размер</value> </toolTip> <extendedTooltip> - <name>ГруппаМаксимальныйРазмерРасширеннаяПодсказка</name> - <id>37</id> + <name>ГруппаМаксимальныйРазмерExtendedTooltip</name> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -430,8 +430,8 @@ <segments>Объект.Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>42</id> + <name>КомментарийExtendedTooltip</name> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html index d9cff5c9b..50b9cd068 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Forms/ФормаЭлемента/Help/ru.html @@ -1,3 +1,3 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> -<p>Если сервер 1С:Предприятия 8.2 работает под Linux, то путь к тому <br> хранения файлов можно указать только локальный, например /home/path. <br> Чтобы использовать UNC путь, нужно сделать на него ссылку.  Для этого <br> под правами администратора сделайте следующее:<br> <br><strong> mkdir folder</strong><br>  --- вместо folder напишите имя каталога. например в каталоге /home <br> делаем mkdir shared - создаст каталог shared с полным путем  /home/shared.<br> <br> <br><strong> mount -t cifs //server/share folder -o //domain/user, password=pwd</strong><br>   - где //server/share - UNC путь к другому компьютеру , folder - путь <br> каталога на Linux компьютере, например \home\shared, //domain/user - имя <br> домена/пользователя, если нужно, pwd - пароль пользователя (если <br> нужно).<br> Если имя и пароль не нужны, команда выглядит так:<br><strong> mount -t cifs //server/share folder</strong></p> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> +<p>Если сервер 1С:Предприятия работает под Linux, то путь к тому <br> хранения файлов можно указать только локальный, например /home/path. <br> Чтобы использовать UNC путь, нужно сделать на него ссылку.  Для этого <br> под правами администратора сделайте следующее:<br> <br><strong> mkdir folder</strong><br>  --- вместо folder напишите имя каталога. например в каталоге /home <br> делаем mkdir shared - создаст каталог shared с полным путем  /home/shared.<br> <br> <br><strong> mount -t cifs //server/share folder -o //domain/user, password=pwd</strong><br>   - где //server/share - UNC путь к другому компьютеру , folder - путь <br> каталога на Linux компьютере, например \home\shared, //domain/user - имя <br> домена/пользователя, если нужно, pwd - пароль пользователя (если <br> нужно).<br> Если имя и пароль не нужны, команда выглядит так:<br><strong> mount -t cifs //server/share folder</strong></p> <p>После этого в пути к тому указываем folder, например /home/shared<br></p></body></html> \ No newline at end of file diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html index 7894df91c..4e522c7e0 100644 --- a/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Используется в том случае, если установлен режим хранения файлов "В томах на диске" (см. Настройка системы). В этом справочнике нужно указать один или несколько каталогов на жестком диске сервера, на котором работает система или других серверов в сети, которые будут использоваться для хранения в них всех файлов.</p> <p>Для каждого тома необходимо указать его наименование, порядок заполнения и UNC-путь к каталогу тома для сервера под управлением Microsoft Windows и/или путь к каталогу для сервера под управлением Linux.</p> <p>Также можно указать максимальный размер всех файлов на томе (квота тома). Если квота установлена равной нулю, то при размещении файлов в томе, она не проверяется. При установленном ненулевом свойстве «Максимальный размер», если суммарный размер файлов на томе уже превышает установленную квоту, то будет использован следующий по порядку заполнения том. Если ни на одном из доступных томов не будет достаточно места для размещения файла, то информация об этом будет записана в <a href="DataProcessor.ЖурналРегистрации/Help">журнал регистрации</a> и пользователю будет выдана ошибка.  </p> diff --git a/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl new file mode 100644 index 000000000..ca3ca9b78 --- /dev/null +++ b/SSL/src/Catalogs/ТомаХраненияФайлов/ManagerModule.bsl @@ -0,0 +1,18 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Комментарий"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form index 4014fe18a..6a3dffc54 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Form.form @@ -25,7 +25,7 @@ <value>Порт сервера POP3</value> </toolTip> <extendedTooltip> - <name>ПортPOP3РасширеннаяПодсказка</name> + <name>ПортPOP3ExtendedTooltip</name> <id>80</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -72,8 +72,8 @@ <value>Порт сервера SMTP</value> </toolTip> <extendedTooltip> - <name>ПортSMTPРасширеннаяПодсказка</name> - <id>82</id> + <name>ПортSMTPExtendedTooltip</name> + <id>81</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -116,7 +116,7 @@ <value>Номера портов</value> </toolTip> <extendedTooltip> - <name>НомераПортовРасширеннаяПодсказка</name> + <name>НомераПортовExtendedTooltip</name> <id>79</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -145,8 +145,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>УстановитьПортыПоУмолчаниюРасширеннаяПодсказка</name> - <id>84</id> + <name>УстановитьПортыПоУмолчаниюExtendedTooltip</name> + <id>82</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -177,7 +177,7 @@ <value>Порты</value> </toolTip> <extendedTooltip> - <name>ПортыРасширеннаяПодсказка</name> + <name>ПортыExtendedTooltip</name> <id>78</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -214,8 +214,8 @@ <value>Время ожидания сервера до разрыва соединения в секундах (от 10 до 600)</value> </toolTip> <extendedTooltip> - <name>ДлительностьОжиданияСервераРасширеннаяПодсказка</name> - <id>86</id> + <name>ДлительностьОжиданияСервераExtendedTooltip</name> + <id>84</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -263,8 +263,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьСекундРасширеннаяПодсказка</name> - <id>88</id> + <name>НадписьСекундExtendedTooltip</name> + <id>85</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -298,8 +298,8 @@ <value>Группа длительность ожидания</value> </toolTip> <extendedTooltip> - <name>ГруппаДлительностьОжиданияРасширеннаяПодсказка</name> - <id>85</id> + <name>ГруппаДлительностьОжиданияExtendedTooltip</name> + <id>83</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -332,7 +332,7 @@ <value>Настройка соединения</value> </toolTip> <extendedTooltip> - <name>НастройкаСоединенияРасширеннаяПодсказка</name> + <name>НастройкаСоединенияExtendedTooltip</name> <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -375,8 +375,8 @@ <value>Способ аутентификации на POP3 сервере</value> </toolTip> <extendedTooltip> - <name>СпособPOP3АутентификацииРасширеннаяПодсказка</name> - <id>91</id> + <name>СпособPOP3АутентификацииExtendedTooltip</name> + <id>88</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -443,8 +443,8 @@ <name>ОставлятьКопииСообщенийНаСервереПриИзменении</name> </handlers> <extendedTooltip> - <name>ОставлятьКопииСообщенийНаСервереРасширеннаяПодсказка</name> - <id>94</id> + <name>ОставлятьКопииСообщенийНаСервереExtendedTooltip</name> + <id>90</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -492,8 +492,8 @@ <name>УдалятьСообщенияССервераПриИзменении</name> </handlers> <extendedTooltip> - <name>УдалятьСообщенияССервераРасширеннаяПодсказка</name> - <id>97</id> + <name>УдалятьСообщенияССервераExtendedTooltip</name> + <id>92</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -534,8 +534,8 @@ <value>Оставлять копии сообщений на сервере указанное количество дней (от 1 до 600)</value> </toolTip> <extendedTooltip> - <name>ОставлятьКопииСообщенийЧислоДнейРасширеннаяПодсказка</name> - <id>99</id> + <name>ОставлятьКопииСообщенийЧислоДнейExtendedTooltip</name> + <id>93</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -584,8 +584,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьДнейРасширеннаяПодсказка</name> - <id>101</id> + <name>НадписьДнейExtendedTooltip</name> + <id>94</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -619,8 +619,8 @@ <value>Группа период хранения сообщений на сервере</value> </toolTip> <extendedTooltip> - <name>ГруппаПериодХраненияСообщенийНаСервереРасширеннаяПодсказка</name> - <id>96</id> + <name>ГруппаПериодХраненияСообщенийНаСервереExtendedTooltip</name> + <id>91</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -647,8 +647,8 @@ <value>Транспорт сообщений</value> - ГруппаОставлятьКопииСообщенийНаСервереРасширеннаяПодсказка - 93 + ГруппаОставлятьКопииСообщенийНаСервереExtendedTooltip + 89 Label true true @@ -680,8 +680,8 @@ Группа сервер входящей почты - ГруппаСерверВходящейПочтыРасширеннаяПодсказка - 90 + ГруппаСерверВходящейПочтыExtendedTooltip + 87 Label true true @@ -721,8 +721,8 @@ SMTPАутентификацияУстановленаПриИзменении - SMTPАутентификацияУстановленаРасширеннаяПодсказка - 103 + SMTPАутентификацияУстановленаExtendedTooltip + 96 Label true true @@ -759,8 +759,8 @@ SMTPАутентификацияПриИзменении - SMTPАутентификацияРасширеннаяПодсказка - 105 + SMTPАутентификацияExtendedTooltip + 97 Label true true @@ -830,8 +830,8 @@ None - ПустоеПолеРасширеннаяПодсказка - 109 + ПустоеПолеExtendedTooltip + 100 Label true true @@ -870,8 +870,8 @@ Группа пустая страница - ГруппаПустаяСтраницаРасширеннаяПодсказка - 108 + ГруппаПустаяСтраницаExtendedTooltip + 99 Label true true @@ -904,8 +904,8 @@ Имя пользователя для дополнительной аутентификации на SMTP сервере - ПользовательSMTPРасширеннаяПодсказка - 112 + ПользовательSMTPExtendedTooltip + 102 Label true true @@ -950,8 +950,8 @@ Имя пользователя для дополнительной аутентификации на SMTP сервере - ПарольSMTPРасширеннаяПодсказка - 114 + ПарольSMTPExtendedTooltip + 103 Label true true @@ -997,8 +997,8 @@ Способ аутентификации на сервере SMTP - СпособSMTPАутентификацииРасширеннаяПодсказка - 116 + СпособSMTPАутентификацииExtendedTooltip + 104 Label true true @@ -1021,8 +1021,6 @@ true true true - true - false true true true @@ -1063,8 +1061,8 @@ Требуется SMTP аутентификация - ГруппаПараметрыРасширеннаяПодсказка - 111 + ГруппаПараметрыExtendedTooltip + 101 Label true true @@ -1092,8 +1090,8 @@ Группа аутентификация SMTP - ГруппаАутентификацияSMTPРасширеннаяПодсказка - 107 + ГруппаАутентификацияSMTPExtendedTooltip + 98 Label true true @@ -1121,8 +1119,8 @@ Сервер исходящей почты - СерверИсходящейПочтыРасширеннаяПодсказка - 102 + СерверИсходящейПочтыExtendedTooltip + 95 Label true true @@ -1156,8 +1154,8 @@ Дополнительно - ДополнительноРасширеннаяПодсказка - 89 + ДополнительноExtendedTooltip + 86 Label true true @@ -1190,7 +1188,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 74 Label true @@ -1217,7 +1215,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 75 Label true @@ -1244,7 +1242,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 76 Label true diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html index 8ab57468f..8afe9c9cd 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ДополнительныеСвойстваУчетнойЗаписи/Help/ru.html @@ -1,4 +1,4 @@ - +

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

      • Общие
        • POP3 аутентификация - настройка аутентификации на сервере POP3 (сервер входящих сообщений)
      • Сервер исходящей почты - настройка аутентификации на сервере SMTP diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 0a4d18a58..1c0525ce5 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаВыбора/Form.form @@ -34,8 +34,8 @@ true - НаименованиеРасширеннаяПодсказка - 22 + НаименованиеExtendedTooltip + 13 Label true true @@ -66,10 +66,10 @@ СписокСтрокаПоиска - 13 + 14 СписокСтрокаПоискаРасширеннаяПодсказка - 15 + 16 Label true true @@ -79,7 +79,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 14 + 15 true Список @@ -89,10 +89,10 @@ СписокСостояниеПросмотра - 16 + 17 СписокСостояниеПросмотраРасширеннаяПодсказка - 18 + 19 Label true true @@ -102,7 +102,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 17 + 18 true ViewStatusAddition @@ -113,10 +113,10 @@ СписокУправлениеПоиском - 19 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 21 + 22 Label true true @@ -126,7 +126,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 20 + 21 true SearchControlAddition @@ -136,7 +136,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 12 Label true @@ -197,7 +197,7 @@ true - ФормаВыбратьРасширеннаяПодсказка + ФормаВыбратьExtendedTooltip 9 Label true @@ -223,7 +223,7 @@ true - ФормаИзменитьРасширеннаяПодсказка + ФормаИзменитьExtendedTooltip 10 Label true @@ -249,7 +249,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 11 Label true diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 061063a64..8672f447c 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаСписка/Form.form @@ -31,8 +31,8 @@ true - НаименованиеРасширеннаяПодсказка - 20 + НаименованиеExtendedTooltip + 11 Label true true @@ -77,8 +77,8 @@ Список.ИмяПользователя - ИмяПользователяРасширеннаяПодсказка - 22 + ИмяПользователяExtendedTooltip + 12 Label true true @@ -122,8 +122,8 @@ Список.АдресЭлектроннойПочты - АдресЭлектроннойПочтыРасширеннаяПодсказка - 24 + АдресЭлектроннойПочтыExtendedTooltip + 13 Label true true @@ -160,32 +160,9 @@ СписокСтрокаПоиска - 11 - - СписокСтрокаПоискаРасширеннаяПодсказка - 13 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 12 - true - - Список - - true - - - - СписокСостояниеПросмотра 14 - СписокСостояниеПросмотраРасширеннаяПодсказка + СписокСтрокаПоискаРасширеннаяПодсказка 16 Label true @@ -195,10 +172,33 @@ - СписокСостояниеПросмотраКонтекстноеМеню + СписокСтрокаПоискаКонтекстноеМеню 15 true + Список + + true + + + + СписокСостояниеПросмотра + 17 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 18 + true + ViewStatusAddition Список @@ -207,10 +207,10 @@ СписокУправлениеПоиском - 17 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 19 + 22 Label true true @@ -220,7 +220,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 18 + 21 true SearchControlAddition @@ -230,7 +230,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 10 Label true diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form index 55c08899c..2993b6d66 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Form.form @@ -21,7 +21,7 @@ Наименование учетной записи - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 59 Label true @@ -74,8 +74,8 @@ Объект.ИмяПользователя - ИмяПользователяРасширеннаяПодсказка - 64 + ИмяПользователяExtendedTooltip + 63 Label true true @@ -120,8 +120,8 @@ Объект.АдресЭлектроннойПочты - АдресЭлектроннойПочтыРасширеннаяПодсказка - 66 + АдресЭлектроннойПочтыExtendedTooltip + 64 Label true true @@ -173,8 +173,8 @@ Сведения о пользователе - СведенияОПользователеРасширеннаяПодсказка - 63 + СведенияОПользователеExtendedTooltip + 62 Label true true @@ -208,8 +208,8 @@ Объект.Пользователь - ПользовательРасширеннаяПодсказка - 69 + ПользовательExtendedTooltip + 66 Label true true @@ -252,8 +252,8 @@ Объект.Пароль - ПарольРасширеннаяПодсказка - 71 + ПарольExtendedTooltip + 67 Label true true @@ -300,8 +300,8 @@ Запомнить пароль в учетной записи - ЗапомнитьПарольРасширеннаяПодсказка - 73 + ЗапомнитьПарольExtendedTooltip + 68 Label true true @@ -338,8 +338,8 @@ false - ПользовательПарольРасширеннаяПодсказка - 68 + ПользовательПарольExtendedTooltip + 65 Label true true @@ -372,8 +372,8 @@ Основное - ОсновноеРасширеннаяПодсказка - 62 + ОсновноеExtendedTooltip + 61 Label true true @@ -409,8 +409,8 @@ Объект.СерверВходящейПочтыPOP3 - СерверВходящейПочтыPOP3РасширеннаяПодсказка - 77 + СерверВходящейПочтыPOP3ExtendedTooltip + 71 Label true true @@ -453,8 +453,8 @@ Объект.СерверИсходящейПочтыSMTP - СерверИсходящейПочтыSMTPРасширеннаяПодсказка - 79 + СерверИсходящейПочтыSMTPExtendedTooltip + 72 Label true true @@ -495,8 +495,8 @@ false - ДополнительныеНастройкиСервераПочтыРасширеннаяПодсказка - 81 + ДополнительныеНастройкиСервераПочтыExtendedTooltip + 73 Label true true @@ -530,8 +530,8 @@ false - СведенияОСервереРасширеннаяПодсказка - 76 + СведенияОСервереExtendedTooltip + 70 Label true true @@ -569,8 +569,8 @@ Right - ИспользоватьДляОтправкиРасширеннаяПодсказка - 84 + ИспользоватьДляОтправкиExtendedTooltip + 76 Label true true @@ -603,8 +603,8 @@ Right - ИспользоватьДляПолученияРасширеннаяПодсказка - 86 + ИспользоватьДляПолученияExtendedTooltip + 77 Label true true @@ -638,8 +638,8 @@ Использование учетной записи - ИспользованиеУчетнойЗаписиРасширеннаяПодсказка - 83 + ИспользованиеУчетнойЗаписиExtendedTooltip + 75 Label true true @@ -672,8 +672,8 @@ Дополнительные параметры учетной записи - ДополнительныеПараметрыУчетнойЗаписиРасширеннаяПодсказка - 82 + ДополнительныеПараметрыУчетнойЗаписиExtendedTooltip + 74 Label true true @@ -709,8 +709,8 @@ true - АутентификацияРасширеннаяПодсказка - 75 + АутентификацияExtendedTooltip + 69 Label true true @@ -742,8 +742,8 @@ Общая группировка - ОбщаяГруппировкаРасширеннаяПодсказка - 61 + ОбщаяГруппировкаExtendedTooltip + 60 Label true true @@ -774,10 +774,6 @@ OnCreateAtServer ПриСозданииНаСервере - - FillCheckProcessingAtServer - ОбработкаПроверкиЗаполненияНаСервере - DontBlock true true diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html index cc3b756e4..fb618689d 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

        Сведения о пользователе:

      • имя - имя владельца учетной записи, например Иван Сергеевич
      • почтовый адрес - адрес электронной почты учетной записи в формате пользователь@почтовыйсервер
      • Сведения о сервере:

        diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl index 990500c99..9ebadf9da 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Forms/ФормаЭлемента/Module.bsl @@ -58,15 +58,6 @@ КонецПроцедуры -&НаСервере -Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - Если Не ПустаяСтрока(Объект.АдресЭлектроннойПочты) И Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(Объект.АдресЭлектроннойПочты) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Почтовый адрес заполнен неверно'"), , "АдресЭлектроннойПочты", "Объект"); - Отказ = Истина; - КонецЕсли; -КонецПроцедуры - &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Оповестить("Запись_УчетныеЗаписиЭлектроннойПочты", ПараметрыЗаписи, Объект.Ссылка); @@ -95,3 +86,4 @@ ОткрытьФорму("Справочник.УчетныеЗаписиЭлектроннойПочты.Форма.ДополнительныеСвойстваУчетнойЗаписи", ПараметрыВызова); КонецПроцедуры + diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html index 63b161df4..22a24ee52 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

        См. также:

        diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl index bce477867..3e915c522 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/ObjectModule.bsl @@ -32,4 +32,33 @@ КонецПроцедуры -#КонецЕсли \ No newline at end of file +Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) + + Если Не ИспользоватьДляОтправки И Не ИспользоватьДляПолучения Тогда + ПроверяемыеРеквизиты.Очистить(); + ПроверяемыеРеквизиты.Добавить("Наименование"); + Возврат; + КонецЕсли; + + МассивНепроверяемыхРеквизитов = Новый Массив; + + Если Не ИспользоватьДляОтправки Тогда + МассивНепроверяемыхРеквизитов.Добавить("СерверИсходящейПочтыSMTP"); + КонецЕсли; + + Если Не ИспользоватьДляПолучения Тогда + МассивНепроверяемыхРеквизитов.Добавить("СерверВходящейПочтыPOP3"); + КонецЕсли; + + Если Не ПустаяСтрока(АдресЭлектроннойПочты) И Не ОбщегоНазначенияКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(АдресЭлектроннойПочты, Истина) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Почтовый адрес заполнен неверно.'"), ЭтотОбъект, "АдресЭлектроннойПочты"); + МассивНепроверяемыхРеквизитов.Добавить("АдресЭлектроннойПочты"); + Отказ = Истина; + КонецЕсли; + + ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов); + +КонецПроцедуры + +#КонецЕсли diff --git a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo index 3afe77210..59ecc6b80 100644 --- a/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo +++ b/SSL/src/Catalogs/УчетныеЗаписиЭлектроннойПочты/УчетныеЗаписиЭлектроннойПочты.mdo @@ -158,7 +158,7 @@ String - 256 + 255 diff --git a/SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/РедактируемыеФайлы/CommandModule.bsl similarity index 100% rename from SSL/src/Catalogs/Файлы/Commands/ЗанятыеФайлы/CommandModule.bsl rename to SSL/src/Catalogs/Файлы/Commands/РедактируемыеФайлы/CommandModule.bsl diff --git a/SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl b/SSL/src/Catalogs/Файлы/Commands/Файлы/CommandModule.bsl similarity index 84% rename from SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl rename to SSL/src/Catalogs/Файлы/Commands/Файлы/CommandModule.bsl index 22a3b3efa..af52a5a31 100644 --- a/SSL/src/Catalogs/Файлы/Commands/ПапкиФайлов/CommandModule.bsl +++ b/SSL/src/Catalogs/Файлы/Commands/Файлы/CommandModule.bsl @@ -2,7 +2,7 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ОткрытьФорму( - "Справочник.Файлы.Форма.ХранилищеФайлов", + "Справочник.Файлы.Форма.Файлы", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form index 5c546adf1..b703f1d9e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ВопросПриВыходеИзТекстовогоРедактора/Form.form @@ -16,7 +16,7 @@ true - Декорация1РасширеннаяПодсказка + Декорация1ExtendedTooltip 14 Label true @@ -53,7 +53,7 @@ None - ТекстВопросаРасширеннаяПодсказка + ТекстВопросаExtendedTooltip 15 Label true @@ -92,7 +92,7 @@ Группа текст - ГруппаТекстРасширеннаяПодсказка + ГруппаТекстExtendedTooltip 13 Label true @@ -124,8 +124,8 @@ false - СохранитьИЗакончитьРедактированиеРасширеннаяПодсказка - 18 + СохранитьИЗакончитьРедактированиеExtendedTooltip + 17 Label true true @@ -142,17 +142,6 @@ 1 true UserCmds - - Web.Green - - - System.DefaultGUIFont - 10.0 - true - false - false - false - Auto @@ -165,8 +154,8 @@ false - СохранитьИзмененияРасширеннаяПодсказка - 19 + СохранитьИзмененияExtendedTooltip + 18 Label true true @@ -183,17 +172,6 @@ 1 true UserCmds - - Web.Green - - - System.DefaultGUIFont - 10.0 - true - false - false - false - Auto @@ -206,8 +184,8 @@ false - НеСохранятьРасширеннаяПодсказка - 20 + НеСохранятьExtendedTooltip + 19 Label true true @@ -224,17 +202,6 @@ 1 true UserCmds - - Web.FireBrick - - - System.DefaultGUIFont - 10.0 - true - false - false - false - Auto @@ -246,8 +213,8 @@ true - ДекорацияПустаяРасширеннаяПодсказка - 21 + ДекорацияПустаяExtendedTooltip + 20 Label true true @@ -277,8 +244,8 @@ false - ВернутьсяРасширеннаяПодсказка - 22 + ВернутьсяExtendedTooltip + 21 Label true true @@ -295,14 +262,6 @@ 1 true UserCmds - - System.DefaultGUIFont - 10.0 - true - false - false - false - Auto true @@ -319,8 +278,8 @@ Группа кнопок - ГруппаКнопокРасширеннаяПодсказка - 17 + ГруппаКнопокExtendedTooltip + 16 Label true true @@ -350,7 +309,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form index ef07e6cec..847e498fc 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Form.form @@ -17,7 +17,7 @@ None - СообщениеРасширеннаяПодсказка + СообщениеExtendedTooltip 24 Label true @@ -68,8 +68,8 @@ ФайлыБольшие.Value - ЗначениеРасширеннаяПодсказка - 36 + ЗначениеExtendedTooltip + 26 Label true true @@ -105,10 +105,10 @@ ФайлыБольшиеСтрокаПоиска - 27 + 29 ФайлыБольшиеСтрокаПоискаРасширеннаяПодсказка - 29 + 31 Label true true @@ -118,7 +118,7 @@ ФайлыБольшиеСтрокаПоискаКонтекстноеМеню - 28 + 30 true ФайлыБольшие @@ -128,10 +128,10 @@ ФайлыБольшиеСостояниеПросмотра - 30 + 32 ФайлыБольшиеСостояниеПросмотраРасширеннаяПодсказка - 32 + 34 Label true true @@ -141,7 +141,7 @@ ФайлыБольшиеСостояниеПросмотраКонтекстноеМеню - 31 + 33 true ViewStatusAddition @@ -152,10 +152,10 @@ ФайлыБольшиеУправлениеПоиском - 33 + 35 ФайлыБольшиеУправлениеПоискомРасширеннаяПодсказка - 35 + 37 Label true true @@ -165,7 +165,7 @@ ФайлыБольшиеУправлениеПоискомКонтекстноеМеню - 34 + 36 true SearchControlAddition @@ -175,8 +175,8 @@ - ФайлыБольшиеРасширеннаяПодсказка - 26 + ФайлыБольшиеExtendedTooltip + 25 Label true true @@ -223,8 +223,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 46 + ОсновнаяКоманднаяПанельExtendedTooltip + 27 Label true true @@ -245,6 +245,10 @@ OK 18 + + <key>ru</key> + <value>Продолжить импорт</value> + true true @@ -252,7 +256,7 @@ false - OKРасширеннаяПодсказка + OKExtendedTooltip 21 Label true @@ -279,7 +283,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 22 Label true @@ -306,7 +310,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 23 Label true @@ -330,7 +334,7 @@ ПриСозданииНаСервере 70 - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html index f8adb340e..49dcf675f 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ВопросПриИмпортеФайлов/Help/ru.html @@ -1 +1 @@ -Предельно допустимый размера файлов можно увеличить в настройках системы.  \ No newline at end of file +Предельно допустимый размера файлов можно увеличить в настройках системы.  \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form index 60f6c5b25..ed5ac3e5c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Form.form @@ -24,8 +24,8 @@ СписокКодировок.Value - СписокКодировокЗначениеРасширеннаяПодсказка - 21 + СписокКодировокЗначениеExtendedTooltip + 12 Label true true @@ -64,10 +64,10 @@ СписокКодировокСтрокаПоиска - 12 + 14 СписокКодировокСтрокаПоискаРасширеннаяПодсказка - 14 + 16 Label true true @@ -77,7 +77,7 @@ СписокКодировокСтрокаПоискаКонтекстноеМеню - 13 + 15 true СписокКодировок @@ -87,10 +87,10 @@ СписокКодировокСостояниеПросмотра - 15 + 17 СписокКодировокСостояниеПросмотраРасширеннаяПодсказка - 17 + 19 Label true true @@ -100,7 +100,7 @@ СписокКодировокСостояниеПросмотраКонтекстноеМеню - 16 + 18 true ViewStatusAddition @@ -111,10 +111,10 @@ СписокКодировокУправлениеПоиском - 18 + 20 СписокКодировокУправлениеПоискомРасширеннаяПодсказка - 20 + 22 Label true true @@ -124,7 +124,7 @@ СписокКодировокУправлениеПоискомКонтекстноеМеню - 19 + 21 true SearchControlAddition @@ -134,7 +134,7 @@ - СписокКодировокРасширеннаяПодсказка + СписокКодировокExtendedTooltip 11 Label true @@ -195,8 +195,8 @@ ПоказыватьТолькоОсновныеКодировкиПриИзменении - ПоказыватьТолькоОсновныеКодировкиРасширеннаяПодсказка - 31 + ПоказыватьТолькоОсновныеКодировкиExtendedTooltip + 13 Label true true @@ -222,7 +222,7 @@ ФормаКоманднаяПанель -1 - ФормаОК + ФормаВыбрать 6 true true @@ -230,7 +230,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаВыбратьРасширеннаяПодсказка 10 Label true @@ -239,7 +239,7 @@ Left - Form.Command.ОК + Form.Command.Выбрать Auto true true @@ -321,22 +321,22 @@ - ОК + Выбрать <key>ru</key> - <value>ОК</value> + <value>Выбрать</value> 1 ru - ОК + Выбрать кодировку true - ОК + ВыбратьКодировку Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html index ec12bc982..894c0f472 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Help/ru.html @@ -1,4 +1,4 @@ - +

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

        -

        В этом разделе:

        -

        Как изменить кодировку текстового файла

        -

        Общие сведения

        -

        -

        Как изменить кодировку текстового файла

        +

         

        +

        Как изменить кодировку текстового файла

        Чтобы изменить кодировку текстового файла:

        1. Выполните команду Изменить кодировку меню Все действия
        2. Выберите кодировку из списка @@ -38,15 +35,7 @@ UL {
        3. Нажмите ОК, чтобы сохранить настройку

        Если после открытия файла вместо текста вы увидели набор незнакомых знаков, измените кодировку. Основными кодировками для работы с текстовыми файлами на русском языке являются:

        • IBM866 (Кириллица Dos)
        • KOI8-R (Кириллица KOI8-R) -
        • Windows-1251 (Кириллица Windows
        -
        -

        -

        В начало

        -

        -

        Общие сведения

        +
      • Windows-1251 (Кириллица Windows

       

      +

      Общие сведения

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

      -

      См. также: Файлы, Хранилище файлов

      - -
      -

      -

      В начало

      \ No newline at end of file +

      См. также: Файлы, Хранилище файлов

      \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl index 844f13768..ba8bc1b1b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборКодировки/Module.bsl @@ -38,7 +38,7 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) +Процедура ВыбратьКодировку(Команда) ЗакрытьФормуСВозвратомКодировки(); @@ -92,15 +92,12 @@ КонецПроцедуры +// Возвращает таблицу имен кодировок. +// +// Возвращаемое значение: +// Таблица значений +// &НаСервереБезКонтекста -//Функция возвращает таблицу имен кодировок -// -//Параметры -// НЕТ -// -//Возвращаемое значение: -// Таблица значений -// Функция ПолучитьПолныйСписокКодировок() СписокКодировок = Новый СписокЗначений; diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form index bc77b3690..a357fad62 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Form.form @@ -21,7 +21,7 @@ СохранятьСРасшифровкойПриИзменении - СохранятьСРасшифровкойРасширеннаяПодсказка + СохранятьСРасшифровкойExtendedTooltip 13 Label true @@ -79,8 +79,8 @@ true - ПарольРасширеннаяПодсказка - 16 + ПарольExtendedTooltip + 15 Label true true @@ -121,8 +121,8 @@ ПредставленияСертификатов - ПредставленияСертификатовРасширеннаяПодсказка - 18 + ПредставленияСертификатовExtendedTooltip + 16 Label true true @@ -166,8 +166,8 @@ Группа шифрование - ГруппаШифрованиеРасширеннаяПодсказка - 15 + ГруппаШифрованиеExtendedTooltip + 14 Label true true @@ -192,7 +192,7 @@ ФормаКоманднаяПанель -1 - ФормаОК + ФормаСохранитьФайл 5 true true @@ -200,7 +200,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаСохранитьФайлРасширеннаяПодсказка 11 Label true @@ -209,7 +209,7 @@ Left - Form.Command.ОК + Form.Command.СохранитьФайл Auto true true @@ -226,7 +226,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 12 Label true @@ -250,7 +250,7 @@ ПриСозданииНаСервере 40 - DontBlock + LockOwner true true Vertical @@ -334,22 +334,22 @@ - ОК + СохранитьФайл <key>ru</key> - <value>ОК</value> + <value>Сохранить файл</value> 1 ru - ОК + Сохранить файл true - ОК + СохранитьФайл Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html index 9178b895a..a427bfc36 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Help/ru.html @@ -1,8 +1,8 @@ - +

      В форме выбирается способ сохранения шифрованного файла при выполнении команды "Сохранить как".

      Если выбран режим сохранения "Сохранить шифрованный файл", то файл просто сохраняется нерасшифрованным.

      Если выбран режим "Расшифровать и сохранить", то файл при сохранении расшифровывается. В этом случае требуется ввести пароль для расшифровки.

       

      См. также:

      -

      Настройка ЭП и шифрования
      Настройка программы 

      \ No newline at end of file +

      Настройка ЭП и шифрования
      Настройка программы 

      \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl index 8c7ef5941..284a76b48 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборСохраненияШифрованногоФайла/Module.bsl @@ -3,8 +3,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -17,11 +16,7 @@ Элементы.ПредставленияСертификатов.Видимость = Ложь; КонецЕсли; - РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); - Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда - РасширениеДляЗашифрованныхФайлов = "p7m"; - КонецЕсли; - + РасширениеДляЗашифрованныхФайлов = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляЗашифрованныхФайлов; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -36,7 +31,7 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) +Процедура СохранитьФайл(Команда) ВозвратПароль = Пароль; Если ПустаяСтрока(Пароль) И НЕ ПустаяСтрока(Элементы.Пароль.ТекстРедактирования) Тогда diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form index 99500478f..3d5d4d8b3 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Form.form @@ -16,7 +16,7 @@ ИмяУстройства - ИмяУстройстваРасширеннаяПодсказка + ИмяУстройстваExtendedTooltip 7 Label true @@ -39,7 +39,6 @@ true true true - true true true true @@ -52,7 +51,7 @@ ФормаКоманднаяПанель -1 - ЗаписатьИЗакрыть + Выбрать 3 true true @@ -61,7 +60,7 @@ false - ЗаписатьИЗакрытьРасширеннаяПодсказка + ВыбратьРасширеннаяПодсказка 5 Label true @@ -70,7 +69,7 @@ Left - Form.Command.ЗаписатьИЗакрыть + Form.Command.Выбрать Auto true true @@ -88,7 +87,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 6 Label true @@ -112,7 +111,7 @@ OnOpen ПриОткрытии - DontBlock + LockOwner true true true @@ -142,22 +141,22 @@ ShowError - ЗаписатьИЗакрыть + Выбрать <key>ru</key> - <value>ОК</value> + <value>Выбрать</value> 1 ru - Записать и закрыть + Выбрать устройство сканирования true - ЗаписатьИЗакрыть + ВыбратьСканер Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl index 7193ded10..38441723a 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ВыборУстройстваСканирования/Module.bsl @@ -19,7 +19,7 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ЗаписатьИЗакрыть(Команда) +Процедура ВыбратьСканер(Команда) МассивСтруктур = Новый Массив; СистемнаяИнформация = Новый СистемнаяИнформация(); diff --git a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Form.form b/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Form.form index 8d0a59c4e..c0f315922 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Form.form @@ -17,7 +17,7 @@ None - ТекстНапоминанияРасширеннаяПодсказка + ТекстНапоминанияExtendedTooltip 10 Label true @@ -56,8 +56,8 @@ Right - ПоказыватьНапоминаниеПриРедактированииРасширеннаяПодсказка - 12 + ПоказыватьНапоминаниеПриРедактированииExtendedTooltip + 11 Label true true @@ -91,7 +91,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 9 Label true @@ -114,7 +114,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl index 0a3782b65..38a5419d3 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ИнформацияФайлНеБылИзменен/Module.bsl @@ -21,6 +21,14 @@ &НаКлиенте Процедура ОК(Команда) + Если БольшеНеПоказывать = Истина Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( + "НастройкиПрограммы", + "ПоказыватьИнформациюЧтоФайлНеБылИзменен", + Ложь); + КонецЕсли; + Закрыть(БольшеНеПоказывать); КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form index 5d1c9d4fe..5c01bfbad 100644 --- a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Form.form @@ -10,7 +10,7 @@ false - УстановитьКомпонентуСканированияРасширеннаяПодсказка + УстановитьКомпонентуСканированияExtendedTooltip 53 Label true @@ -40,7 +40,7 @@ ВерсияКомпонентыСканирования - ВерсияКомпонентыСканированияРасширеннаяПодсказка + ВерсияКомпонентыСканированияExtendedTooltip 54 Label true @@ -95,8 +95,8 @@ ИмяУстройстваПриИзменении - ИмяУстройстваРасширеннаяПодсказка - 57 + ИмяУстройстваExtendedTooltip + 56 Label true true @@ -124,7 +124,6 @@ true false true - true true true true @@ -151,8 +150,8 @@ ИспользоватьImageMagickДляПреобразованияВPDFПриИзменении - ИспользоватьImageMagickДляПреобразованияВPDFРасширеннаяПодсказка - 60 + ИспользоватьImageMagickДляПреобразованияВPDFExtendedTooltip + 58 Label true true @@ -185,8 +184,8 @@ Top - ПутьКПрограммеКонвертацииРасширеннаяПодсказка - 62 + ПутьКПрограммеКонвертацииExtendedTooltip + 59 Label true true @@ -233,8 +232,8 @@ Группа PDF - ГруппаPDFРасширеннаяПодсказка - 59 + ГруппаPDFExtendedTooltip + 57 Label true true @@ -274,8 +273,8 @@ ФорматХраненияОдностраничныйПриИзменении - ФорматХраненияОдностраничныйРасширеннаяПодсказка - 66 + ФорматХраненияОдностраничныйExtendedTooltip + 62 Label true true @@ -319,8 +318,8 @@ true - ДекорацияФорматХраненияОдностраничныйРасширеннаяПодсказка - 68 + ДекорацияФорматХраненияОдностраничныйExtendedTooltip + 63 Label true true @@ -354,8 +353,8 @@ Группа формата хранения - ГруппаФорматаХраненияРасширеннаяПодсказка - 65 + ГруппаФорматаХраненияExtendedTooltip + 61 Label true true @@ -391,8 +390,8 @@ ФорматСканированногоИзображенияПриИзменении - ФорматСканированногоИзображенияРасширеннаяПодсказка - 70 + ФорматСканированногоИзображенияExtendedTooltip + 65 Label true true @@ -436,8 +435,8 @@ true - ДекорацияФорматСканированногоИзображенияРасширеннаяПодсказка - 72 + ДекорацияФорматСканированногоИзображенияExtendedTooltip + 66 Label true true @@ -471,8 +470,8 @@ Группа формата сканирования - ГруппаФорматаСканированияРасширеннаяПодсказка - 69 + ГруппаФорматаСканированияExtendedTooltip + 64 Label true true @@ -501,8 +500,8 @@ КачествоJPG - КачествоJPGРасширеннаяПодсказка - 73 + КачествоJPGExtendedTooltip + 67 Label true true @@ -544,8 +543,8 @@ СжатиеTIFF - СжатиеTIFFРасширеннаяПодсказка - 75 + СжатиеTIFFExtendedTooltip + 68 Label true true @@ -591,8 +590,8 @@ true - ГруппаФорматХраненияОдиночныйРасширеннаяПодсказка - 64 + ГруппаФорматХраненияОдиночныйExtendedTooltip + 60 Label true true @@ -627,8 +626,8 @@ ФорматХраненияМногостраничный - ФорматХраненияМногостраничныйРасширеннаяПодсказка - 78 + ФорматХраненияМногостраничныйExtendedTooltip + 70 Label true true @@ -674,8 +673,8 @@ true - ГруппаФорматХраненияМногостраничныйРасширеннаяПодсказка - 77 + ГруппаФорматХраненияМногостраничныйExtendedTooltip + 69 Label true true @@ -710,8 +709,8 @@ Разрешение - РазрешениеРасширеннаяПодсказка - 81 + РазрешениеExtendedTooltip + 72 Label true true @@ -753,8 +752,8 @@ Цветность - ЦветностьРасширеннаяПодсказка - 83 + ЦветностьExtendedTooltip + 73 Label true true @@ -800,8 +799,8 @@ Поворот - ПоворотРасширеннаяПодсказка - 85 + ПоворотExtendedTooltip + 74 Label true true @@ -843,8 +842,8 @@ РазмерБумаги - РазмерБумагиРасширеннаяПодсказка - 87 + РазмерБумагиExtendedTooltip + 75 Label true true @@ -887,8 +886,8 @@ Right - ДвустороннееСканированиеРасширеннаяПодсказка - 89 + ДвустороннееСканированиеExtendedTooltip + 76 Label true true @@ -921,8 +920,8 @@ Right - ПоказыватьДиалогСканераРасширеннаяПодсказка - 91 + ПоказыватьДиалогСканераExtendedTooltip + 77 Label true true @@ -952,8 +951,8 @@ false - УстановитьСтандартныеНастройкиРасширеннаяПодсказка - 93 + УстановитьСтандартныеНастройкиExtendedTooltip + 78 Label true true @@ -984,8 +983,8 @@ Группа параметры сканирования - ГруппаПараметрыСканированияРасширеннаяПодсказка - 80 + ГруппаПараметрыСканированияExtendedTooltip + 71 Label true true @@ -1019,8 +1018,8 @@ Группа настройки - ГруппаНастройкиРасширеннаяПодсказка - 56 + ГруппаНастройкиExtendedTooltip + 55 Label true true @@ -1054,7 +1053,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 50 Label true @@ -1081,7 +1080,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 51 Label true @@ -1108,7 +1107,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 52 Label true diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html index b89892693..e5b4f5311 100644 --- a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Help/ru.html @@ -1,4 +1,4 @@ - +

      В форме выполняется настройка сканирования. Форма открывается из формы персональных настроек.

      Установить компоненту сканирования - устанавливает компоненту сканирования. Если на Вашем компьютере нет сканера, устанавливать компоненту не нужно. Если компонента уже установлена, то вместо этой кнопки отображается версия установленной компоненты.

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

      diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl index 0ecbee713..7a3aed5fb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканирования/Module.bsl @@ -225,11 +225,8 @@ &НаКлиенте Процедура УстановитьКомпонентуСканирования(Команда) - - РаботаСФайламиСлужебныйКлиент.УстановитьКомпоненту(); - - ОбновитьСостояние(); - + Обработчик = Новый ОписаниеОповещения("УстановитьКомпонентуСканированияЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.УстановитьКомпоненту(Обработчик); КонецПроцедуры &НаКлиенте @@ -481,3 +478,8 @@ ФорматХраненияОдностраничныйПредыдущее = ФорматХраненияОдностраничный; КонецПроцедуры + +&НаКлиенте +Процедура УстановитьКомпонентуСканированияЗавершение(Результат, ПараметрыВыполнения) Экспорт + ОбновитьСостояние(); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Form.form b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Form.form index fd6470bc2..f349adbaf 100644 --- a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Form.form @@ -26,7 +26,7 @@ ФорматХраненияОдностраничныйПриИзменении - ФорматХраненияОдностраничныйРасширеннаяПодсказка + ФорматХраненияОдностраничныйExtendedTooltip 53 Label true @@ -71,8 +71,8 @@ true - ДекорацияФорматХраненияОдностраничныйРасширеннаяПодсказка - 55 + ДекорацияФорматХраненияОдностраничныйExtendedTooltip + 54 Label true true @@ -106,7 +106,7 @@ Группа формата хранения - ГруппаФорматаХраненияРасширеннаяПодсказка + ГруппаФорматаХраненияExtendedTooltip 52 Label true @@ -143,8 +143,8 @@ ФорматСканированногоИзображенияПриИзменении - ФорматСканированногоИзображенияРасширеннаяПодсказка - 57 + ФорматСканированногоИзображенияExtendedTooltip + 56 Label true true @@ -188,8 +188,8 @@ true - ДекорацияФорматСканированногоИзображенияРасширеннаяПодсказка - 59 + ДекорацияФорматСканированногоИзображенияExtendedTooltip + 57 Label true true @@ -223,8 +223,8 @@ Группа формата сканирования - ГруппаФорматаСканированияРасширеннаяПодсказка - 56 + ГруппаФорматаСканированияExtendedTooltip + 55 Label true true @@ -253,8 +253,8 @@ КачествоJPG - КачествоJPGРасширеннаяПодсказка - 60 + КачествоJPGExtendedTooltip + 58 Label true true @@ -296,8 +296,8 @@ СжатиеTIFF - СжатиеTIFFРасширеннаяПодсказка - 62 + СжатиеTIFFExtendedTooltip + 59 Label true true @@ -343,7 +343,7 @@ true - ГруппаФорматХраненияОдиночныйРасширеннаяПодсказка + ГруппаФорматХраненияОдиночныйExtendedTooltip 51 Label true @@ -379,8 +379,8 @@ ФорматХраненияМногостраничный - ФорматХраненияМногостраничныйРасширеннаяПодсказка - 65 + ФорматХраненияМногостраничныйExtendedTooltip + 61 Label true true @@ -426,8 +426,8 @@ true - ГруппаФорматХраненияМногостраничныйРасширеннаяПодсказка - 64 + ГруппаФорматХраненияМногостраничныйExtendedTooltip + 60 Label true true @@ -462,8 +462,8 @@ Разрешение - РазрешениеРасширеннаяПодсказка - 68 + РазрешениеExtendedTooltip + 63 Label true true @@ -505,8 +505,8 @@ Цветность - ЦветностьРасширеннаяПодсказка - 70 + ЦветностьExtendedTooltip + 64 Label true true @@ -552,8 +552,8 @@ Поворот - ПоворотРасширеннаяПодсказка - 72 + ПоворотExtendedTooltip + 65 Label true true @@ -595,8 +595,8 @@ РазмерБумаги - РазмерБумагиРасширеннаяПодсказка - 74 + РазмерБумагиExtendedTooltip + 66 Label true true @@ -639,8 +639,8 @@ Right - ДвустороннееСканированиеРасширеннаяПодсказка - 76 + ДвустороннееСканированиеExtendedTooltip + 67 Label true true @@ -673,8 +673,8 @@ Right - ПоказыватьДиалогСканераРасширеннаяПодсказка - 78 + ПоказыватьДиалогСканераExtendedTooltip + 68 Label true true @@ -709,8 +709,8 @@ true - ГруппаПараметрыСканированияРасширеннаяПодсказка - 67 + ГруппаПараметрыСканированияExtendedTooltip + 62 Label true true @@ -745,7 +745,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 48 Label true @@ -772,7 +772,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 49 Label true @@ -799,7 +799,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 50 Label true diff --git a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Help/ru.html index c492f2753..728c35a49 100644 --- a/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/НастройкаСканированияНаСеанс/Help/ru.html @@ -1,4 +1,4 @@ - +

      В форме выполняется настройка сканирования на данный сеанс сканирования (эти настройки не будут сохранены). Форма открывается из формы сканирования.

      Формат одностраничного изображения - позволяет выбрать один из поддерживаемых форматов (BMP, JPG, GIF, PNG, TIF, PDF) для помещения в информационную базу.

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

      diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form index 7f7fad654..79a8a8cd0 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Form.form @@ -16,7 +16,7 @@ None - ТекстРасширеннаяПодсказка + ТекстExtendedTooltip 75 Label true @@ -58,7 +58,7 @@ Группа текст и команды - ГруппаТекстИКомандыРасширеннаяПодсказка + ГруппаТекстИКомандыExtendedTooltip 74 Label true @@ -90,7 +90,7 @@ true - ЗаписатьИЗакрытьРасширеннаяПодсказка + ЗаписатьИЗакрытьExtendedTooltip 63 Label true @@ -116,7 +116,7 @@ true - ЗаписатьРасширеннаяПодсказка + ЗаписатьExtendedTooltip 64 Label true @@ -146,7 +146,7 @@ true - РедактироватьРасширеннаяПодсказка + РедактироватьExtendedTooltip 65 Label true @@ -174,7 +174,7 @@ true - ЗакончитьРедактированиеРасширеннаяПодсказка + ЗакончитьРедактированиеExtendedTooltip 66 Label true @@ -205,7 +205,7 @@ Файл - ФормаОбщаяКомандаЗадачиПоПредметуРасширеннаяПодсказка + ФормаОбщаяКомандаЗадачиПоПредметуExtendedTooltip 67 Label true @@ -232,7 +232,7 @@ true - ОткрытьКарточкуРасширеннаяПодсказка + ОткрытьКарточкуExtendedTooltip 68 Label true @@ -260,7 +260,7 @@ true - ПоказатьОтличияРасширеннаяПодсказка + ПоказатьОтличияExtendedTooltip 69 Label true @@ -288,7 +288,7 @@ true - СохранитьКакРасширеннаяПодсказка + СохранитьКакExtendedTooltip 70 Label true @@ -316,7 +316,7 @@ true - ВнешнийРедакторРасширеннаяПодсказка + ВнешнийРедакторExtendedTooltip 71 Label true @@ -344,7 +344,7 @@ true - ФормаВыбратьКодировкуРасширеннаяПодсказка + ФормаВыбратьКодировкуExtendedTooltip 72 Label true @@ -371,7 +371,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 73 Label true @@ -390,10 +390,6 @@
      Left - - ChoiceProcessing - ОбработкаВыбора - NotificationProcessing ОбработкаОповещения diff --git a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html index 887c213c5..fb59f9ced 100644 --- a/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/РедактированиеТекстовогоФайла/Help/ru.html @@ -1,4 +1,4 @@ - +

      @@ -523,8 +731,8 @@ Зашифрован - ЗашифрованРасширеннаяПодсказка - 238 + ЗашифрованExtendedTooltip + 210 Label true true @@ -574,8 +782,8 @@ Список.ИндексКартинки - КартинкаРасширеннаяПодсказка - 241 + КартинкаExtendedTooltip + 212 Label true true @@ -625,8 +833,8 @@ true - НаименованиеРасширеннаяПодсказка - 243 + НаименованиеExtendedTooltip + 213 Label true true @@ -663,8 +871,8 @@ true - КартинкаИНаименованиеРасширеннаяПодсказка - 240 + КартинкаИНаименованиеExtendedTooltip + 211 Label true true @@ -691,8 +899,8 @@ Список.Описание - ОписаниеРасширеннаяПодсказка - 245 + ОписаниеExtendedTooltip + 214 Label true true @@ -736,8 +944,8 @@ Список.Редактирует - РедактируетРасширеннаяПодсказка - 247 + РедактируетExtendedTooltip + 215 Label true true @@ -788,8 +996,8 @@ Номер версии - ТекущаяВерсияКодРасширеннаяПодсказка - 249 + ТекущаяВерсияКодExtendedTooltip + 216 Label true true @@ -840,8 +1048,8 @@ Дата редактирования версии - ТекущаяВерсияДатаСозданияРасширеннаяПодсказка - 251 + ТекущаяВерсияДатаСозданияExtendedTooltip + 217 Label true true @@ -897,8 +1105,8 @@ Список.ТекущаяВерсияАвтор - ТекущаяВерсияАвторРасширеннаяПодсказка - 253 + ТекущаяВерсияАвторExtendedTooltip + 218 Label true true @@ -945,8 +1153,8 @@ Размер текущей версии - ТекущаяВерсияРазмерРасширеннаяПодсказка - 255 + ТекущаяВерсияРазмерExtendedTooltip + 219 Label true true @@ -989,8 +1197,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 257 + АвторExtendedTooltip + 220 Label true true @@ -1031,8 +1239,8 @@ Список.ХранитьВерсии - ХранитьВерсииРасширеннаяПодсказка - 259 + ХранитьВерсииExtendedTooltip + 221 Label true true @@ -1062,8 +1270,8 @@ Список.РедактируетТекущийПользователь - РедактируетТекущийПользовательРасширеннаяПодсказка - 261 + РедактируетТекущийПользовательExtendedTooltip + 222 Label true true @@ -1093,8 +1301,8 @@ Список.Ref - СсылкаРасширеннаяПодсказка - 263 + СсылкаExtendedTooltip + 223 Label true true @@ -1131,8 +1339,8 @@ Список.ТекущаяВерсияДатаМодификацииФайла - ТекущаяВерсияДатаМодификацииФайлаРасширеннаяПодсказка - 265 + ТекущаяВерсияДатаМодификацииФайлаExtendedTooltip + 224 Label true true @@ -1188,10 +1396,10 @@ СписокСтрокаПоиска - 227 + 280 СписокСтрокаПоискаРасширеннаяПодсказка - 229 + 282 Label true true @@ -1201,7 +1409,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 228 + 281 true Список @@ -1211,10 +1419,10 @@ СписокСостояниеПросмотра - 230 + 283 СписокСостояниеПросмотраРасширеннаяПодсказка - 232 + 285 Label true true @@ -1224,7 +1432,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 231 + 284 true ViewStatusAddition @@ -1235,10 +1443,10 @@ СписокУправлениеПоиском - 233 + 286 СписокУправлениеПоискомРасширеннаяПодсказка - 235 + 288 Label true true @@ -1248,7 +1456,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 234 + 287 true SearchControlAddition @@ -1258,8 +1466,8 @@ - СписокРасширеннаяПодсказка - 226 + СписокExtendedTooltip + 208 Label true true @@ -1271,7 +1479,7 @@ СписокКонтекстноеМеню 4 - КонтекстноеМенюСписокСоздать + КонтекстноеМенюСписокСоздатьФайл 96 true true @@ -1280,8 +1488,8 @@ false - КонтекстноеМенюСписокСоздатьРасширеннаяПодсказка - 203 + КонтекстноеМенюСписокСоздатьФайлРасширеннаяПодсказка + 185 Label true true @@ -1297,6 +1505,84 @@ UserCmds Auto + + СписокКонтекстноеМенюИзменитьФайл + 242 + true + true + + true + + + СписокКонтекстноеМенюИзменитьФайлРасширеннаяПодсказка + 243 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюСкопироватьФайл + 244 + true + true + + true + + + СписокКонтекстноеМенюСкопироватьФайлРасширеннаяПодсказка + 245 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюУстановитьПометкуУдаленияФайла + 246 + true + true + + true + + + СписокКонтекстноеМенюУстановитьПометкуУдаленияФайлаРасширеннаяПодсказка + 247 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + ГруппаСтандартныхКоманд 95 @@ -1314,8 +1600,8 @@ Группа стандартных команд - ГруппаСтандартныхКомандРасширеннаяПодсказка - 204 + ГруппаСтандартныхКомандExtendedTooltip + 186 Label true true @@ -1337,8 +1623,8 @@ false - КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка - 205 + КонтекстноеМенюСписокОткрытьФайлExtendedTooltip + 187 Label true true @@ -1364,8 +1650,8 @@ false - КонтекстноеМенюСписокРедактироватьРасширеннаяПодсказка - 206 + КонтекстноеМенюСписокРедактироватьExtendedTooltip + 188 Label true true @@ -1391,8 +1677,8 @@ false - КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка - 207 + КонтекстноеМенюСписокЗакончитьРедактированиеExtendedTooltip + 189 Label true true @@ -1418,8 +1704,8 @@ false - КонтекстноеМенюСписокЗанятьРасширеннаяПодсказка - 208 + КонтекстноеМенюСписокЗанятьExtendedTooltip + 190 Label true true @@ -1445,8 +1731,8 @@ false - КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка - 209 + КонтекстноеМенюСписокСохранитьИзмененияExtendedTooltip + 191 Label true true @@ -1472,8 +1758,8 @@ false - КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка - 210 + КонтекстноеМенюСписокОткрытьКаталогФайлаExtendedTooltip + 192 Label true true @@ -1499,8 +1785,8 @@ false - КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка - 211 + КонтекстноеМенюСписокСохранитьКакExtendedTooltip + 193 Label true true @@ -1530,8 +1816,8 @@ false - КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка - 212 + КонтекстноеМенюСписокОсвободитьExtendedTooltip + 194 Label true true @@ -1548,7 +1834,7 @@ Auto - КонтекстноеМенюСписокПеренестиВРаздел + КонтекстноеМенюСписокПеренестиВПапку 83 true true @@ -1557,8 +1843,8 @@ false - КонтекстноеМенюСписокПеренестиВРазделРасширеннаяПодсказка - 213 + КонтекстноеМенюСписокПеренестиВПапкуРасширеннаяПодсказка + 195 Label true true @@ -1584,8 +1870,8 @@ false - КонтекстноеМенюСписокОбновитьИзФайлаНаДискеРасширеннаяПодсказка - 214 + КонтекстноеМенюСписокОбновитьИзФайлаНаДискеExtendedTooltip + 196 Label true true @@ -1614,8 +1900,8 @@ false - КонтекстноеМенюСписокИмпортФайловРасширеннаяПодсказка - 216 + КонтекстноеМенюСписокИмпортФайловExtendedTooltip + 198 Label true true @@ -1641,8 +1927,8 @@ false - КонтекстноеМенюСписокИмпортПапкиРасширеннаяПодсказка - 217 + КонтекстноеМенюСписокИмпортПапкиExtendedTooltip + 199 Label true true @@ -1672,8 +1958,8 @@ Группа команд импорта - ГруппаКомандИмпортаРасширеннаяПодсказка - 215 + ГруппаКомандИмпортаExtendedTooltip + 197 Label true true @@ -1684,10 +1970,10 @@ - ФормаЭЦПИШифрованиеКонтекстное + ФормаЭПИШифрованиеКонтекстное 130 - ФормаГруппаЭЦПКонтекст + ФормаГруппаЭПКонтекст 131 ФормаПодписатьКонтекст @@ -1698,8 +1984,8 @@ true - ФормаПодписатьКонтекстРасширеннаяПодсказка - 220 + ФормаПодписатьКонтекстExtendedTooltip + 202 Label true true @@ -1716,7 +2002,7 @@ Auto - ФормаДобавитьЭЦПИзФайлаКонтекст + ФормаДобавитьПодписьИзФайлаКонтекст 134 true true @@ -1724,8 +2010,8 @@ true - ФормаДобавитьЭЦПИзФайлаКонтекстРасширеннаяПодсказка - 221 + ФормаДобавитьПодписьИзФайлаКонтекстРасширеннаяПодсказка + 203 Label true true @@ -1733,7 +2019,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьПодписьИзФайла Normal Auto true @@ -1742,7 +2028,7 @@ Auto - ФормаСохранитьВместеСЭЦПКонтекст + ФормаСохранитьВместеСПодписьюКонтекст 135 true true @@ -1750,8 +2036,8 @@ true - ФормаСохранитьВместеСЭЦПКонтекстРасширеннаяПодсказка - 222 + ФормаСохранитьВместеСПодписьюКонтекстРасширеннаяПодсказка + 204 Label true true @@ -1759,7 +2045,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСПодписью Normal Auto true @@ -1778,11 +2064,11 @@ ru - + Форма группа ЭП - ФормаГруппаЭЦПКонтекстРасширеннаяПодсказка - 219 + ФормаГруппаЭПКонтекстРасширеннаяПодсказка + 201 Label true true @@ -1804,8 +2090,8 @@ true - ФормаЗашифроватьКонтекстРасширеннаяПодсказка - 224 + ФормаЗашифроватьКонтекстExtendedTooltip + 206 Label true true @@ -1830,8 +2116,8 @@ true - ФормаРасшифроватьКонтекстРасширеннаяПодсказка - 225 + ФормаРасшифроватьКонтекстExtendedTooltip + 207 Label true true @@ -1861,8 +2147,8 @@ Форма группа шифрование - ФормаГруппаШифрованиеКонтекстРасширеннаяПодсказка - 223 + ФормаГруппаШифрованиеКонтекстExtendedTooltip + 205 Label true true @@ -1883,11 +2169,11 @@ ru - + Форма ЭПИШифрование - ФормаЭЦПИШифрованиеКонтекстноеРасширеннаяПодсказка - 218 + ФормаЭПИШифрованиеКонтекстноеРасширеннаяПодсказка + 200 Label true true @@ -1947,7 +2233,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 175 Label true @@ -1988,8 +2274,8 @@ ПоискПриИзменении - ПоискРасширеннаяПодсказка - 276 + ПоискExtendedTooltip + 226 Label true true @@ -2027,8 +2313,8 @@ false - НайтиРасширеннаяПодсказка - 278 + НайтиExtendedTooltip + 227 Label true true @@ -2054,8 +2340,8 @@ false - ГруппаПоискРасширеннаяПодсказка - 275 + ГруппаПоискExtendedTooltip + 225 Label true true @@ -2078,7 +2364,7 @@ true - Группа2РасширеннаяПодсказка + Группа2ExtendedTooltip 174 Label true @@ -2099,7 +2385,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 173 Label true @@ -2116,18 +2402,104 @@ ФормаКоманднаяПанель -1 - - СоздатьФайл - 87 + + ГруппаСоздать + 228 + + СоздатьФайл + 87 + true + true + + true + + false + + СоздатьФайлExtendedTooltip + 148 + Label + true + true + + Left + + + Form.Command.СоздатьФайл + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьФайлИзШаблона + 230 + true + true + + true + + + СоздатьФайлИзШаблонаРасширеннаяПодсказка + 231 + Label + true + true + + Left + + + Form.Command.СоздатьФайлИзШаблона + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьФайлСоСканера + 232 + true + true + + true + + + СоздатьФайлСоСканераРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + Form.Command.СоздатьФайлСоСканера + Normal + Auto + true + true + UserCmds + Auto + true true true - false + + <key>ru</key> + <value>Создать</value> + + + ru + Создать файл + - СоздатьФайлРасширеннаяПодсказка - 148 + ГруппаСоздатьРасширеннаяПодсказка + 229 Label true true @@ -2135,16 +2507,17 @@ Left - Form.Command.СоздатьФайл - Normal - Auto - true - true - UserCmds - Auto + Popup + + + StdPicture.CreateListItem + + Auto + Normal + - Создать + СоздатьПапку 86 true true @@ -2153,7 +2526,7 @@ false - СоздатьРасширеннаяПодсказка + СоздатьПапкуРасширеннаяПодсказка 149 Label true @@ -2186,7 +2559,7 @@ false - ОткрытьФайлРасширеннаяПодсказка + ОткрытьФайлExtendedTooltip 151 Label true @@ -2213,7 +2586,7 @@ false - РедактироватьРасширеннаяПодсказка + РедактироватьExtendedTooltip 152 Label true @@ -2240,7 +2613,7 @@ false - ЗакончитьРедактированиеРасширеннаяПодсказка + ЗакончитьРедактированиеExtendedTooltip 153 Label true @@ -2267,7 +2640,7 @@ false - ЗанятьРасширеннаяПодсказка + ЗанятьExtendedTooltip 154 Label true @@ -2295,7 +2668,7 @@ false - ОткрытьКаталогФайлаРасширеннаяПодсказка + ОткрытьКаталогФайлаExtendedTooltip 155 Label true @@ -2327,7 +2700,7 @@ false - ОсвободитьРасширеннаяПодсказка + ОсвободитьExtendedTooltip 156 Label true @@ -2355,7 +2728,7 @@ false - СохранитьИзмененияРасширеннаяПодсказка + СохранитьИзмененияExtendedTooltip 157 Label true @@ -2383,7 +2756,7 @@ false - СохранитьКакРасширеннаяПодсказка + СохранитьКакExtendedTooltip 158 Label true @@ -2402,7 +2775,7 @@ InAdditionalSubmenu - ПеренестиВРаздел + ПеренестиВПапку 84 true true @@ -2411,7 +2784,7 @@ false - ПеренестиВРазделРасширеннаяПодсказка + ПеренестиВПапкуРасширеннаяПодсказка 159 Label true @@ -2439,7 +2812,7 @@ false - ОбновитьИзФайлаНаДискеРасширеннаяПодсказка + ОбновитьИзФайлаНаДискеExtendedTooltip 160 Label true @@ -2471,7 +2844,7 @@ Группа команд файлов - ГруппаКомандФайловРасширеннаяПодсказка + ГруппаКомандФайловExtendedTooltip 150 Label true @@ -2483,10 +2856,10 @@ - ФормаЭЦПИШифрование + ФормаЭПИШифрование 129 - ФормаГруппаЭЦП + ФормаГруппаЭП 119 ФормаПодписать @@ -2497,7 +2870,7 @@ true - ФормаПодписатьРасширеннаяПодсказка + ФормаПодписатьExtendedTooltip 163 Label true @@ -2515,7 +2888,7 @@ Auto - ФормаДобавитьЭЦПИзФайла + ФормаДобавитьПодписьИзФайла 127 true true @@ -2523,7 +2896,7 @@ true - ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + ФормаДобавитьПодписьИзФайлаРасширеннаяПодсказка 164 Label true @@ -2532,7 +2905,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьПодписьИзФайла Normal Auto true @@ -2541,7 +2914,7 @@ Auto - ФормаСохранитьВместеСЭЦП + ФормаСохранитьВместеСПодписью 128 true true @@ -2549,7 +2922,7 @@ true - ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + ФормаСохранитьВместеСПодписьюРасширеннаяПодсказка 165 Label true @@ -2558,7 +2931,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСПодписью Normal Auto true @@ -2577,10 +2950,10 @@ ru - + Форма группа ЭП - ФормаГруппаЭЦПРасширеннаяПодсказка + ФормаГруппаЭПРасширеннаяПодсказка 162 Label true @@ -2603,7 +2976,7 @@ true - ФормаЗашифроватьРасширеннаяПодсказка + ФормаЗашифроватьExtendedTooltip 167 Label true @@ -2629,7 +3002,7 @@ true - ФормаРасшифроватьРасширеннаяПодсказка + ФормаРасшифроватьExtendedTooltip 168 Label true @@ -2660,7 +3033,7 @@ Форма группа шифрование - ФормаГруппаШифрованиеРасширеннаяПодсказка + ФормаГруппаШифрованиеExtendedTooltip 166 Label true @@ -2682,10 +3055,10 @@ ru - + Форма ЭПИШифрование - ФормаЭЦПИШифрованиеРасширеннаяПодсказка + ФормаЭПИШифрованиеРасширеннаяПодсказка 161 Label true @@ -2700,6 +3073,84 @@ Normal + + ФормаСкопироватьФайл + 236 + true + true + + true + + + ФормаСкопироватьФайлРасширеннаяПодсказка + 237 + Label + true + true + + Left + + + Form.StandardCommand.Copy + Normal + Auto + true + true + UserCmds + Auto + + + ФормаИзменитьФайл + 238 + true + true + + true + + + ФормаИзменитьФайлРасширеннаяПодсказка + 239 + Label + true + true + + Left + + + Form.StandardCommand.Change + Normal + Auto + true + true + UserCmds + Auto + + + ФормаУстановитьПометкуУдаленияФайла + 240 + true + true + + true + + + ФормаУстановитьПометкуУдаленияФайлаРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + Form.StandardCommand.SetDeletionMark + Normal + Auto + true + true + UserCmds + Auto + ГруппаКомандФормы 85 @@ -2713,7 +3164,7 @@ false - ИспользоватьИерархиюРасширеннаяПодсказка + ИспользоватьИерархиюExtendedTooltip 170 Label true @@ -2743,7 +3194,7 @@ true - ФормаОбновитьСписокРасширеннаяПодсказка + ФормаОбновитьСписокExtendedTooltip 171 Label true @@ -2775,7 +3226,7 @@ Группа команд формы - ГруппаКомандФормыРасширеннаяПодсказка + ГруппаКомандФормыExtendedTooltip 169 Label true @@ -2797,7 +3248,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 172 Label true @@ -2871,6 +3322,12 @@ Список.Подписан + + Список.ПодписанЭЦП + + + Список.Ref + Список.Автор @@ -2884,7 +3341,7 @@ Список.Кодировка - Список.ПодписанЭЦП + Список.ПодписанЭП Список.Редактирует @@ -2922,7 +3379,7 @@ ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК РедактируетТекущийПользователь, - Файлы.ПодписанЭЦП, + Файлы.ПодписанЭП, Файлы.Зашифрован, Файлы.ТекущаяВерсияДатаМодификацииФайла, КодировкиВерсийФайлов.Кодировка @@ -3060,6 +3517,89 @@ true + + ИзменениеПапок + + <key>ru</key> + <value>Изменение папок</value> + + 7 + + Boolean + + + true + + + true + + + + ИзменениеФайлов + + <key>ru</key> + <value>Изменение файлов</value> + + 8 + + Boolean + + + true + + + true + + + + ДобавлениеФайлов + + <key>ru</key> + <value>Добавление файлов</value> + + 9 + + Boolean + + + true + + + true + + + + ПометкаУдаленияФайлов + + <key>ru</key> + <value>Пометка удаления файлов</value> + + 10 + + Boolean + + + true + + + true + + + + ТекущаяПапка + + <key>ru</key> + <value>Текущая папка</value> + + 11 + + + true + + + true + + ИмпортФайлов @@ -3134,25 +3674,21 @@ <name>СоздатьФайл</name> <title> <key>ru</key> - <value>Создать</value> + <value>Из файла на диске...</value> 3 ru - Создать новый файл (Ins) + Создать файл из файла на диске true - - StdPicture.CreateListItem - СоздатьФайлВыполнить - TextPicture Auto Auto @@ -3494,14 +4030,14 @@ true - CommonPicture.ПодписанЭЦП + CommonPicture.ПодписанЭП Подписать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3527,7 +4063,7 @@ Зашифровать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3550,53 +4086,53 @@ Расшифровать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto - ДобавитьЭЦПИзФайла + ДобавитьПодписьИзФайла <key>ru</key> - <value>Добавить ЭП из файла</value> + <value>Добавить электронную подпись из файла</value> 22 ru - + Добавить электронную подпись из файла true - ДобавитьЭЦПИзФайла + ДобавитьПодписьИзФайла - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto - СохранитьВместеСЭЦП + СохранитьВместеСПодписью <key>ru</key> - <value>Сохранить вместе с ЭП</value> + <value>Сохранить вместе с электронной подписью</value> 23 ru - + Сохранить вместе с электронной подписью true - СохранитьВместеСЭЦП + СохранитьВместеСПодписью - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3626,6 +4162,50 @@ Auto Auto + + СоздатьФайлИзШаблона + + <key>ru</key> + <value>Из шаблона...</value> + + 24 + + ru + Создать файл из шаблона + + + true + + + + СоздатьФайлИзШаблонаВыполнить + + + Auto + Auto + + + СоздатьФайлСоСканера + + <key>ru</key> + <value>Со сканера...</value> + + 25 + + ru + Создать файл со сканера + + + true + + + + СоздатьФайлСоСканераВыполнить + + + Auto + Auto + diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html similarity index 95% rename from SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html rename to SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html index acdbd97bb..df9c63654 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

      Для загрузки файлов с жесткого диска используйте загрузку файлов или загрузку папок.

      diff --git a/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl new file mode 100644 index 000000000..2b6663c11 --- /dev/null +++ b/SSL/src/Catalogs/Файлы/Forms/Файлы/Module.bsl @@ -0,0 +1,1405 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + Если Параметры.Свойство("Папка") = Истина И Параметры.Папка <> Неопределено Тогда + ПапкаПриОткрытии = Параметры.Папка; + Иначе + ПапкаПриОткрытии = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить("Файлы", "ТекущаяПапка"); + Если ПапкаПриОткрытии = Неопределено Тогда // попытка загрузки настроек, сохраненных в предыдущих версиях + ПапкаПриОткрытии = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить("ХранилищеФайлов", "ТекущаяПапка"); + КонецЕсли; + КонецЕсли; + + Если ПапкаПриОткрытии = Справочники.ПапкиФайлов.ПустаяСсылка() Тогда + ПапкаПриОткрытии = Справочники.ПапкиФайлов.Шаблоны; + Иначе + ПапкаПриОткрытииОбъект = Неопределено; + Попытка + ПапкаПриОткрытииОбъект = ПапкаПриОткрытии.ПолучитьОбъект(); + Исключение + КонецПопытки; + + Если ПапкаПриОткрытииОбъект = Неопределено Тогда + ПапкаПриОткрытии = Справочники.ПапкиФайлов.Шаблоны; + КонецЕсли; + КонецЕсли; + + Элементы.Папки.ТекущаяСтрока = ПапкаПриОткрытии; + + Список.Параметры.УстановитьЗначениеПараметра( + "Владелец", ПапкаПриОткрытии); + Список.Параметры.УстановитьЗначениеПараметра( + "ТекущийПользователь", Пользователи.ТекущийПользователь()); + + РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); + + ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); + Если ПоказыватьКолонкуРазмер = Ложь Тогда + Элементы.ТекущаяВерсияРазмер.Видимость = Ложь; + КонецЕсли; + + ИспользоватьИерархию = Истина; + УстановитьИерархию(ИспользоватьИерархию); + + Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеПодписиИШифрование() = Ложь Тогда + Элементы.ПодписанЭП.Видимость = Ложь; + Элементы.Зашифрован.Видимость = Ложь; + КонецЕсли; + + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПравПапки(Элементы.Папки.ТекущаяСтрока)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Элементы.СоздатьФайлСоСканера.Видимость = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); + Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда + Элементы.ФормаЭПИШифрование.Видимость = Ложь; + Элементы.ФормаЭПИШифрованиеКонтекстное.Видимость = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + Если ПапкаПриОткрытии <> Элементы.Папки.ТекущаяСтрока Тогда + ПриЗакрытииНаСервере(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПриЗакрытииНаСервере() + ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить( + "Файлы", + "ТекущаяПапка", + Элементы.Папки.ТекущаяСтрока); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ИмпортФайловЗавершен" Тогда + Элементы.Список.Обновить(); + + Если Параметр <> Неопределено Тогда + Элементы.Список.ТекущаяСтрока = Параметр; + КонецЕсли; + КонецЕсли; + + Если ИмяСобытия = "ИмпортКаталоговЗавершен" Тогда + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если Источник <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = Источник; + КонецЕсли; + КонецЕсли; + + Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда + + Если Параметр <> Неопределено Тогда + ВладелецФайла = Неопределено; + Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда + Если ВладелецФайла = Элементы.Папки.ТекущаяСтрока Тогда + Элементы.Список.Обновить(); + + ФайлСозданный = Неопределено; + Если Параметр.Свойство("Файл", ФайлСозданный) Тогда + Элементы.Список.ТекущаяСтрока = ФайлСозданный; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ДанныеФайлаИзменены" Тогда + УстановитьДоступностьФайловыхКоманд(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) + + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ПапкиФайлов.Форма.ФормаВыбора") Тогда + + Если ВыбранноеЗначение = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; + РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПапку(ВыделенныеСтроки, ВыбранноеЗначение); + + Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ВыделеннаяСтрока); + КонецЦикла; + + Элементы.Список.Обновить(); + + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) + + УстановитьИерархию(Настройки["ИспользоватьИерархию"]); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура ПоискПриИзменении(Элемент) + НайтиФайлыИлиПапки(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Список + +&НаКлиенте +Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат; + КонецЕсли; + + СтандартнаяОбработка = Ложь; + + КакОткрывать = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + + Если КакОткрывать = "ОткрыватьКарточку" Тогда + ПоказатьЗначение(, ВыбраннаяСтрока); + Возврат; + КонецЕсли; + + ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + Если ИмяКаталога = Неопределено Или ПустаяСтрока(ИмяКаталога) Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + ВыбраннаяСтрока, + Неопределено, + УникальныйИдентификатор, + Неопределено, + ПредыдущийАдресФайла); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаРедактирования", ЭтотОбъект, ПараметрыОбработчика); + + ВыбратьРежимИРедактироватьФайл(Обработчик, ДанныеФайла, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + + Если Элементы.Папки.ТекущаяСтрока = Неопределено Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока.Пустая() Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + ВладелецФайла = Элементы.Папки.ТекущаяСтрока; + ФайлОснование = Элементы.Список.ТекущаяСтрока; + + Отказ = Истина; + + Если Копирование Тогда + РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); + Иначе + РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; + ПеретаскиваниеВПапку(Неопределено, ПараметрыПеретаскивания.Значение, ПараметрыПеретаскивания.Действие); +КонецПроцедуры + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Папки + +&НаКлиенте +Процедура ПапкиПриАктивизацииСтроки(Элемент) + + Если Элементы.Папки.ТекущаяСтрока <> ТекущаяПапка Тогда + ТекущаяПапка = Элементы.Папки.ТекущаяСтрока; + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиПравПапки(Элементы.Папки.ТекущаяСтрока)); + Элементы.СоздатьПапку.Доступность = ИзменениеПапок; + Элементы.ПапкиКонтекстноеМенюСоздатьПапку.Доступность = ИзменениеПапок; + Элементы.ПапкиКонтекстноеМенюСкопироватьПапку.Доступность = ИзменениеПапок; + Элементы.ПапкиУстановитьПометкуУдаленияПапки.Доступность = ИзменениеПапок; + Элементы.ПапкиКонтекстноеМенюПеренестиЭлемент.Доступность = ИзменениеПапок; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока = Неопределено Или Элементы.Папки.ТекущаяСтрока.Пустая() Тогда + Элементы.ГруппаСоздать.Доступность = Ложь; + Элементы.СоздатьФайл.Доступность = Ложь; + Элементы.СоздатьФайлИзШаблона.Доступность = Ложь; + Элементы.СоздатьФайлСоСканера.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокСоздатьФайл.Доступность = Ложь; + + Элементы.ФормаСкопироватьФайл.Доступность = Ложь; + Элементы.СписокКонтекстноеМенюСкопироватьФайл.Доступность = Ложь; + + Элементы.ФормаУстановитьПометкуУдаленияФайла.Доступность = Ложь; + Элементы.СписокКонтекстноеМенюУстановитьПометкуУдаленияФайла.Доступность = Ложь; + + Элементы.КонтекстноеМенюПапкиИмпортФайлов.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокИмпортФайлов.Доступность = Ложь; + Элементы.КонтекстноеМенюПапкиИмпортПапки.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокИмпортПапки.Доступность = Ложь; + Иначе + Элементы.ГруппаСоздать.Доступность = ДобавлениеФайлов; + Элементы.СоздатьФайл.Доступность = ДобавлениеФайлов; + Элементы.СоздатьФайлИзШаблона.Доступность = ДобавлениеФайлов; + Элементы.СоздатьФайлСоСканера.Доступность = ДобавлениеФайлов; + Элементы.КонтекстноеМенюСписокСоздатьФайл.Доступность = ДобавлениеФайлов; + + Элементы.ФормаСкопироватьФайл.Доступность = ДобавлениеФайлов; + Элементы.СписокКонтекстноеМенюСкопироватьФайл.Доступность = ДобавлениеФайлов; + + Элементы.ФормаУстановитьПометкуУдаленияФайла.Доступность = ПометкаУдаленияФайлов; + Элементы.СписокКонтекстноеМенюУстановитьПометкуУдаленияФайла.Доступность = ПометкаУдаленияФайлов; + + Элементы.КонтекстноеМенюПапкиИмпортФайлов.Доступность = ДобавлениеФайлов; + Элементы.КонтекстноеМенюСписокИмпортФайлов.Доступность = ДобавлениеФайлов; + Элементы.КонтекстноеМенюПапкиИмпортПапки.Доступность = ДобавлениеФайлов; + Элементы.КонтекстноеМенюСписокИмпортПапки.Доступность = ДобавлениеФайлов; + КонецЕсли; + + Если Элементы.Папки.ТекущаяСтрока <> Неопределено Тогда + ПодключитьОбработчикОжидания("ОбработкаОжиданияПапкиПриАктивизацииСтроки", 0.2, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПапкиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура ПапкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) + СтандартнаяОбработка = Ложь; + ПеретаскиваниеВПапку(Строка, ПараметрыПеретаскивания.Значение, ПараметрыПеретаскивания.Действие); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ИмпортФайловВыполнить() + + Обработчик = Новый ОписаниеОповещения("ИмпортФайловПослеУстановкиРасширения", ЭтотОбъект); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +&НаКлиенте +Процедура ИмпортФайловПослеУстановкиРасширения(Результат, ПараметрыВыполнения) Экспорт + Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + Возврат; + КонецЕсли; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если Не ДиалогОткрытияФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + МассивИменФайлов = Новый Массив; + Для Каждого ИмяФайла Из ДиалогОткрытияФайла.ВыбранныеФайлы Цикл + МассивИменФайлов.Добавить(ИмяФайла); + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); + ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыФормы); +КонецПроцедуры + +&НаКлиенте +Процедура ИмпортПапки(Команда) + #Если ВебКлиент Тогда + ТекстПредупреждения = НСтр("ru = 'В веб-клиенте импорт папок не поддерживается. + |Используйте команду ""Создать"" в списке файлов.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + #КонецЕсли + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); + Если Не ДиалогОткрытияФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); + ПараметрыФормы.Вставить("КаталогНаДиске", ДиалогОткрытияФайла.Каталог); + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаПапки", ПараметрыФормы); +КонецПроцедуры + +&НаКлиенте +Процедура ЭкспортПапкиВыполнить() + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаЭкспорта", Элементы.Папки.ТекущаяСтрока); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаЭкспортаПапки", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура НайтиВыполнить() + + Если СтрокаПоиска = "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не указан текст для поиска.'"), , "СтрокаПоиска"); + Возврат; + КонецЕсли; + + НайтиФайлыИлиПапки(); + +КонецПроцедуры + +&НаКлиенте +Процедура НайтиФайлыИлиПапки() + + Если СтрокаПоиска = "" Тогда + Возврат; + КонецЕсли; + + Результат = НайтиФайлыИлиПапкиСервер(); + + Если Результат = "НичегоНеНайдено" Тогда + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось найти файл или папку, + |наименование или код которых содержит ""%1"".'"), + СтрокаПоиска); + ПоказатьПредупреждение(, ТекстПредупреждения); + Иначе + Если Результат = "НайденФайл" Тогда + ТекущийЭлемент = Элементы.Список; + Иначе + Если Результат = "НайденаПапка" Тогда + ТекущийЭлемент = Элементы.Папки; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); +КонецПроцедуры + +&НаСервере +Функция СтрЗаменитьСпецСимволом(Строка, Символ, СпецСимвол) + СтрокаНовая = СтрЗаменить(Строка, Символ, СпецСимвол + Символ); + Возврат СтрокаНовая; +КонецФункции + +&НаСервере +Функция НайтиФайлыИлиПапкиСервер() + + Перем НайденныйФайл; + Перем НайденнаяПапка; + + Найдено = Ложь; + + Запрос = Новый Запрос; + + СтрокаПоискаНовая = СтрокаПоиска; + + СпецСимвол = "|"; + СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "[", СпецСимвол); + СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "]", СпецСимвол); + + Запрос.Параметры.Вставить("Строка", "%" + СтрокаПоискаНовая + "%"); + + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | Файлы.Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.ПолноеНаименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""|"""; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденныйФайл = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | Файлы.Ссылка + |ИЗ + | Справочник.Файлы КАК Файлы + |ГДЕ + | Файлы.Код ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденныйФайл = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ПапкиФайлов.Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Наименование ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденнаяПапка = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если Не Найдено Тогда + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 + | ПапкиФайлов.Ссылка + |ИЗ + | Справочник.ПапкиФайлов КАК ПапкиФайлов + |ГДЕ + | ПапкиФайлов.Код ПОДОБНО &Строка"; + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + НайденнаяПапка = Выборка.Ссылка; + Найдено = Истина; + КонецЕсли; + КонецЕсли; + + Если НайденныйФайл <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = НайденныйФайл.ВладелецФайла; + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + Элементы.Список.ТекущаяСтрока = НайденныйФайл.Ссылка; + Возврат "НайденФайл"; + КонецЕсли; + + Если НайденнаяПапка <> Неопределено Тогда + Элементы.Папки.ТекущаяСтрока = НайденнаяПапка; + Возврат "НайденаПапка"; + КонецЕсли; + + Возврат "НичегоНеНайдено"; +КонецФункции + +&НаКлиенте +Процедура СоздатьФайлВыполнить(Команда) + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + Если ПодключитьРасширениеРаботыСФайлами() Тогда + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); + Иначе + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыБезРасширения(ПараметрыДобавления); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлИзШаблонаВыполнить(Команда) + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлСоСканераВыполнить(Команда) + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", Элементы.Папки.ТекущаяСтрока); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьПапкуВыполнить() + + ПараметрыСозданияПапки = Новый Структура("Родитель", Элементы.Папки.ТекущаяСтрока); + ОткрытьФорму("Справочник.ПапкиФайлов.ФормаОбъекта", ПараметрыСозданияПапки, Элементы.Папки); + +КонецПроцедуры + +&НаКлиенте +Процедура ИспользоватьИерархию(Команда) + + ИспользоватьИерархию = Не ИспользоватьИерархию; + Если ИспользоватьИерархию И (Элементы.Список.ТекущиеДанные <> Неопределено) Тогда + + Если Элементы.Список.ТекущиеДанные.Свойство("ВладелецФайла") Тогда + Элементы.Папки.ТекущаяСтрока = Элементы.Список.ТекущиеДанные.ВладелецФайла; + Иначе + Элементы.Папки.ТекущаяСтрока = Неопределено; + КонецЕсли; + + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + УстановитьИерархию(ИспользоватьИерархию); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФайлВыполнить() + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор, + Неопределено, + ПредыдущийАдресФайла); + + РаботаСФайламиКлиент.Открыть(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Редактировать(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + +КонецПроцедуры + +&НаКлиенте +Функция ФайловыеКомандыДоступны() + // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка + + Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаКлиенте +Процедура ЗакончитьРедактирование(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + СтрокаТаблицы = Элементы.Список.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением( + Обработчик, + СтрокаТаблицы.Ссылка, + УникальныйИдентификатор, + СтрокаТаблицы.ХранитьВерсии, + СтрокаТаблицы.РедактируетТекущийПользователь, + СтрокаТаблицы.Редактирует, + СтрокаТаблицы.Автор, + СтрокаТаблицы.Кодировка); + +КонецПроцедуры + +&НаКлиенте +Процедура Занять(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Элементы.Список.ТекущаяСтрока); + +КонецПроцедуры + +&НаКлиенте +Процедура Освободить(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением( + Обработчик, + Элементы.Список.ТекущаяСтрока, + Элементы.Список.ТекущиеДанные.ХранитьВерсии, + Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИзменения(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ОпубликоватьФайлСОповещением( + Обработчик, + Элементы.Список.ТекущаяСтрока, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайла(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор, + Неопределено, + ПредыдущийАдресФайла); + + РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьКак(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИзФайлаНаДиске(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( + Элементы.Список.ТекущаяСтрока); + + РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением( + Неопределено, + ДанныеФайла, + УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокПередНачаломИзменения(Элемент, Отказ) + Отказ = Истина; + + ПараметрыОткрытияФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыОткрытияФормы); +КонецПроцедуры + +&НаКлиенте +Процедура ПеренестиВПапку(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Выбор папки'")); + ПараметрыФормы.Вставить("ТекущаяПапка", Элементы.Папки.ТекущаяСтрока); + ПараметрыФормы.Вставить("РежимВыбора", Истина); + + ОткрытьФорму("Справочник.ПапкиФайлов.ФормаВыбора", ПараметрыФормы, ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура Подписать(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, + Команды.Найти("Подписать").Заголовок); + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(Элементы.Список.ТекущаяСтрока); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ПодписатьПослеФормированияПодписи", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.СформироватьПодписьФайла(Обработчик, ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Зашифровать(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, + Команды.Найти("Зашифровать").Заголовок); + Возврат; + КонецЕсли; + + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Зашифровать(Обработчик, ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура Расшифровать(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеРасшифровкиНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Расшифровать( + Обработчик, + ДанныеФайла.Ссылка, + УникальныйИдентификатор, + ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьПодписьИзФайла(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( + Элементы.Список.ТекущаяСтрока); + + Обработчик = Новый ОписаниеОповещения("УстановитьДоступностьФайловыхКоманд", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла(Обработчик, ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСПодписью(Команда) + + Если Не ФайловыеКомандыДоступны() Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( + Элементы.Список.ТекущаяСтрока); + + РаботаСФайламиСлужебныйКлиент.СохранитьСПодписью(Неопределено, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура Обновить(Команда) + + Если ТекущийЭлемент = Элементы.Папки Тогда + Элементы.Папки.Обновить(); + Иначе + Элементы.Список.Обновить(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПеретаскиваниеВПапку(ПапкаДляДобавления, ЗначениеПеретаскивания, Действие) + Если ПапкаДляДобавления = Неопределено Тогда + ПапкаДляДобавления = Элементы.Папки.ТекущаяСтрока; + Если ПапкаДляДобавления = Неопределено Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Если ПапкаДляДобавления.Пустая() Тогда + Возврат; + КонецЕсли; + + ТипЗначения = ТипЗнч(ЗначениеПеретаскивания); + Если ТипЗначения = Тип("Файл") Тогда + Если ЗначениеПеретаскивания.ЭтоФайл() Тогда + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ПолноеИмяФайла", ЗначениеПеретаскивания.ПолноеИмя); + ПараметрыДобавления.Вставить("ВладелецФайла", ПапкаДляДобавления); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Неопределено); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); + Иначе + МассивИменФайлов = Новый Массив; + МассивИменФайлов.Добавить(ЗначениеПеретаскивания.ПолноеИмя); + РаботаСФайламиСлужебныйКлиент.ОткрытьФормуПеретаскиванияИзвне(ПапкаДляДобавления, МассивИменФайлов); + КонецЕсли; + ИначеЕсли ТипЗнч(ЗначениеПеретаскивания) = Тип("Массив") Тогда + ИндексПапки = ЗначениеПеретаскивания.Найти(ПапкаДляДобавления); + Если ИндексПапки <> Неопределено Тогда + ЗначениеПеретаскивания.Удалить(ИндексПапки); + КонецЕсли; + + Если ЗначениеПеретаскивания.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ТипЗначения = ТипЗнч(ЗначениеПеретаскивания[0]); + Если ТипЗначения = Тип("Файл") Тогда + + МассивИменФайлов = Новый Массив; + Для Каждого ФайлПринятый Из ЗначениеПеретаскивания Цикл + МассивИменФайлов.Добавить(ФайлПринятый.ПолноеИмя); + КонецЦикла; + РаботаСФайламиСлужебныйКлиент.ОткрытьФормуПеретаскиванияИзвне(ПапкаДляДобавления, МассивИменФайлов); + + ИначеЕсли ТипЗначения = Тип("СправочникСсылка.Файлы") Тогда + + Если Действие = ДействиеПеретаскивания.Копирование Тогда + + РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлы( + ЗначениеПеретаскивания, + ПапкаДляДобавления); + + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если ЗначениеПеретаскивания.Количество() = 1 Тогда + ОповещениеЗаголовок = НСтр("ru = 'Файл скопирован.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |скопирован в папку ""%2""'"), + ЗначениеПеретаскивания[0], + Строка(ПапкаДляДобавления)); + Иначе + ОповещениеЗаголовок = НСтр("ru = 'Файлы скопированы.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы (%1 шт.) скопированы в папку ""%2""'"), + ЗначениеПеретаскивания.Количество(), + Строка(ПапкаДляДобавления)); + КонецЕсли; + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, , ОповещениеТекст, БиблиотекаКартинок.Информация32); + Иначе + + ВладелецУстановлен = РаботаСФайламиСлужебныйВызовСервера.УстановитьВладельцаФайла(ЗначениеПеретаскивания, ПапкаДляДобавления); + Если ВладелецУстановлен <> Истина Тогда + Возврат; + КонецЕсли; + + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если ЗначениеПеретаскивания.Количество() = 1 Тогда + ОповещениеЗаголовок = НСтр("ru = 'Файл перенесен.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |перенесен в папку ""%2""'"), + Строка(ЗначениеПеретаскивания[0]), + Строка(ПапкаДляДобавления)); + Иначе + ОповещениеЗаголовок = НСтр("ru = 'Файлы перенесены.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы (%1 шт.) перенесены в папку ""%2""'"), + Строка(ЗначениеПеретаскивания.Количество()), + Строка(ПапкаДляДобавления)); + КонецЕсли; + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, , ОповещениеТекст, БиблиотекаКартинок.Информация32); + КонецЕсли; + + ИначеЕсли ТипЗначения = Тип("СправочникСсылка.ПапкиФайлов") Тогда + НайденоЗацикливание = Ложь; + РодительСменен = РаботаСФайламиСлужебныйВызовСервера.СменитьРодителяПапок(ЗначениеПеретаскивания, ПапкаДляДобавления, НайденоЗацикливание); + Если РодительСменен <> Истина Тогда + Если НайденоЗацикливание = Истина Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Зацикливание уровней.'")); + КонецЕсли; + Возврат; + КонецЕсли; + + Элементы.Папки.Обновить(); + Элементы.Список.Обновить(); + + Если ЗначениеПеретаскивания.Количество() = 1 Тогда + Элементы.Папки.ТекущаяСтрока = ЗначениеПеретаскивания[0]; + ОповещениеЗаголовок = НСтр("ru = 'Папка перенесена.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Папка ""%1"" + |перенесена в папку ""%2""'"), + Строка(ЗначениеПеретаскивания[0]), + Строка(ПапкаДляДобавления)); + Иначе + ОповещениеЗаголовок = НСтр("ru = 'Папки перенесены.'"); + ОповещениеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Папки (%1 шт.) перенесены в папку ""%2""'"), + Строка(ЗначениеПеретаскивания.Количество()), + Строка(ПапкаДляДобавления)); + КонецЕсли; + ПоказатьОповещениеПользователя(ОповещениеЗаголовок, , ОповещениеТекст, БиблиотекаКартинок.Информация32); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + Результат.МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, + ПараметрыВыполнения.ОбъектСсылка); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ОбъектСсылка); + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +&НаСервере +Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Истина; + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ОбъектСсылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + +КонецПроцедуры + +&НаКлиенте +Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + РасшифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога, + ПараметрыВыполнения.ОбъектСсылка); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ОбъектСсылка); + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +&НаСервере +Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, + ИмяРабочегоКаталога, ОбъектСсылка) + + Зашифровать = Ложь; + МассивОтпечатков = Новый Массив; + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ОбъектСсылка, + Зашифровать, + МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + МассивОтпечатков); + +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьПослеФормированияПодписи(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.Успех = Истина Тогда + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи(Результат.ДанныеПодписи); + + ЭлектроннаяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + ОповещениеПараметр = Новый Структура("Событие", "ПрисоединенныйФайлПодписан"); + Оповестить("Запись_Файл", ОповещениеПараметр, ПараметрыВыполнения.ДанныеФайла.Владелец); + КонецЕсли; + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОжиданияПапкиПриАктивизацииСтроки() + + // Процедура обновляет правый список и доступность команд по настройкам прав. + Если Элементы.Папки.ТекущаяСтрока <> Список.Параметры.Элементы.Найти("Владелец").Значение Тогда + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция НастройкиПравПапки(Папка) + + НастройкиПрав = Новый Структура; + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Значение = ЗначениеЗаполнено(Папка); + НастройкиПрав.Вставить("ИзменениеПапок", Истина); + НастройкиПрав.Вставить("ИзменениеФайлов", Значение); + НастройкиПрав.Вставить("ДобавлениеФайлов", Значение); + НастройкиПрав.Вставить("ПометкаУдаленияФайлов", Значение); + Возврат НастройкиПрав; + КонецЕсли; + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + НастройкиПрав.Вставить("ИзменениеПапок", + МодульУправлениеДоступом.ЕстьПраво("ИзменениеПапок", Папка)); + + НастройкиПрав.Вставить("ИзменениеФайлов", + МодульУправлениеДоступом.ЕстьПраво("ИзменениеФайлов", Папка)); + + НастройкиПрав.Вставить("ДобавлениеФайлов", + МодульУправлениеДоступом.ЕстьПраво("ДобавлениеФайлов", Папка)); + + НастройкиПрав.Вставить("ПометкаУдаленияФайлов", + МодульУправлениеДоступом.ЕстьПраво("ПометкаУдаленияФайлов", Папка)); + + Возврат НастройкиПрав; + +КонецФункции + +&НаКлиенте +Процедура УстановитьДоступностьФайловыхКоманд(Результат = Неопределено, ПараметрыВыполнения = Неопределено) Экспорт + + Если Элементы.Список.ТекущиеДанные <> Неопределено + И ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + + УстановитьДоступностьКоманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, + Элементы.Список.ТекущиеДанные.Редактирует, Элементы.Список.ТекущиеДанные.ПодписанЭП, + Элементы.Список.ТекущиеДанные.Зашифрован); + Иначе + СделатьКомандыНедоступными(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СделатьКомандыНедоступными() + + Элементы.ЗакончитьРедактирование.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = Ложь; + + Элементы.СохранитьИзменения.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = Ложь; + + Элементы.Освободить.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокОсвободить.Доступность = Ложь; + + Элементы.Занять.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокЗанять.Доступность = Ложь; + + Элементы.Редактировать.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокРедактировать.Доступность = Ложь; + + Элементы.ПеренестиВПапку.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокПеренестиВПапку.Доступность = Ложь; + + Элементы.ФормаПодписать.Доступность = Ложь; + Элементы.ФормаПодписатьКонтекст.Доступность = Ложь; + + Элементы.ФормаСохранитьВместеСПодписью.Доступность = Ложь; + Элементы.ФормаСохранитьВместеСПодписьюКонтекст.Доступность = Ложь; + + Элементы.ФормаЗашифровать.Доступность = Ложь; + Элементы.ФормаЗашифроватьКонтекст.Доступность = Ложь; + + Элементы.ФормаРасшифровать.Доступность = Ложь; + Элементы.ФормаРасшифроватьКонтекст.Доступность = Ложь; + + Элементы.ФормаДобавитьПодписьИзФайла.Доступность = Ложь; + Элементы.ФормаДобавитьПодписьИзФайлаКонтекст.Доступность = Ложь; + + Элементы.ОбновитьИзФайлаНаДиске.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокОбновитьИзФайлаНаДиске.Доступность = Ложь; + + Элементы.СохранитьКак.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокСохранитьКак.Доступность = Ложь; + + Элементы.ОткрытьКаталогФайла.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокОткрытьКаталогФайла.Доступность = Ложь; + + Элементы.ОткрытьФайл.Доступность = Ложь; + Элементы.КонтекстноеМенюСписокОткрытьФайл.Доступность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, ПодписанЭП, Зашифрован) + + РедактируетДругой = Не Редактирует.Пустая() И НЕ РедактируетТекущийПользователь; + + Элементы.ЗакончитьРедактирование.Доступность = ИзменениеФайлов И РедактируетТекущийПользователь; + Элементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = ИзменениеФайлов И РедактируетТекущийПользователь; + + Элементы.СохранитьИзменения.Доступность = ИзменениеФайлов И РедактируетТекущийПользователь; + Элементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = ИзменениеФайлов И РедактируетТекущийПользователь; + + Элементы.Освободить.Доступность = ИзменениеФайлов И Не Редактирует.Пустая(); + Элементы.КонтекстноеМенюСписокОсвободить.Доступность = ИзменениеФайлов И Не Редактирует.Пустая(); + + Элементы.Занять.Доступность = ИзменениеФайлов И Редактирует.Пустая() И НЕ ПодписанЭП; + Элементы.КонтекстноеМенюСписокЗанять.Доступность = ИзменениеФайлов И Редактирует.Пустая() И НЕ ПодписанЭП; + + Элементы.Редактировать.Доступность = ИзменениеФайлов И НЕ ПодписанЭП И НЕ РедактируетДругой; + Элементы.КонтекстноеМенюСписокРедактировать.Доступность = ИзменениеФайлов И НЕ ПодписанЭП И НЕ РедактируетДругой; + + Элементы.ПеренестиВПапку.Доступность = ИзменениеФайлов И НЕ ПодписанЭП; + Элементы.КонтекстноеМенюСписокПеренестиВПапку.Доступность = ИзменениеФайлов И НЕ ПодписанЭП; + + Элементы.ФормаПодписать.Доступность = ИзменениеФайлов И Редактирует.Пустая(); + Элементы.ФормаПодписатьКонтекст.Доступность = ИзменениеФайлов И Редактирует.Пустая(); + + Элементы.ФормаСохранитьВместеСПодписью.Доступность = ПодписанЭП; + Элементы.ФормаСохранитьВместеСПодписьюКонтекст.Доступность = ПодписанЭП; + + Элементы.ФормаЗашифровать.Доступность = ИзменениеФайлов И Редактирует.Пустая() И НЕ Зашифрован; + Элементы.ФормаЗашифроватьКонтекст.Доступность = ИзменениеФайлов И Редактирует.Пустая() И НЕ Зашифрован; + + Элементы.ФормаРасшифровать.Доступность = ИзменениеФайлов И Зашифрован; + Элементы.ФормаРасшифроватьКонтекст.Доступность = ИзменениеФайлов И Зашифрован; + + Элементы.ФормаДобавитьПодписьИзФайла.Доступность = ИзменениеФайлов И Редактирует.Пустая(); + Элементы.ФормаДобавитьПодписьИзФайлаКонтекст.Доступность = ИзменениеФайлов И Редактирует.Пустая(); + + Элементы.ОбновитьИзФайлаНаДиске.Доступность = ИзменениеФайлов И Не ПодписанЭП; + Элементы.КонтекстноеМенюСписокОбновитьИзФайлаНаДиске.Доступность = ИзменениеФайлов И Не ПодписанЭП; + + Элементы.СохранитьКак.Доступность = Истина; + Элементы.КонтекстноеМенюСписокСохранитьКак.Доступность = Истина; + + Элементы.ОткрытьКаталогФайла.Доступность = Истина; + Элементы.КонтекстноеМенюСписокОткрытьКаталогФайла.Доступность = Истина; + + Элементы.ОткрытьФайл.Доступность = Истина; + Элементы.КонтекстноеМенюСписокОткрытьФайл.Доступность = Истина; + +КонецПроцедуры + +&НаСервере +Процедура УстановитьИерархию(Отметка) + + Если Отметка = Неопределено Тогда + Возврат; + КонецЕсли; + + Элементы.ИспользоватьИерархию.Пометка = Отметка; + Если Отметка = Истина Тогда + Элементы.Папки.Видимость = Истина; + Иначе + Элементы.Папки.Видимость = Ложь; + КонецЕсли; + Список.Параметры.УстановитьЗначениеПараметра("ИспользоватьИерархию", Отметка); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьРежимИРедактироватьФайл(ОбработчикРезультата, ДанныеФайла, ДоступностьКомандыРедактировать) Экспорт + // Выбрать режим открытия файла и начать редактирование + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; + РезультатОтмена = "Отмена"; + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + + СпособОткрытия = ПерсональныеНастройки.ТекстовыеФайлыСпособОткрытия; + Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда + + РасширениеВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ПерсональныеНастройки.ТекстовыеФайлыРасширение, + ДанныеФайла.Расширение); + + Если РасширениеВСписке Тогда + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + Возврат; + КонецЕсли; + + КонецЕсли; + + СпособОткрытия = ПерсональныеНастройки.ГрафическиеСхемыСпособОткрытия; + Если СпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда + + РасширениеВСписке = ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( + ПерсональныеНастройки.ГрафическиеСхемыРасширение, + ДанныеФайла.Расширение); + + Если РасширениеВСписке Тогда + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + Возврат; + КонецЕсли; + + КонецЕсли; + + // Если уже занят для редактирования, то не спрашивать - сразу открывать + Если ДанныеФайла.Редактирует.Пустая() + И ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла = Истина + И ДоступностьКомандыРедактировать Тогда + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("ВыбратьРежимИРедактироватьФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ОбработчикРезультата, РезультатОткрыть); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьРежимИРедактироватьФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; + РезультатОтмена = "Отмена"; + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОтмена); + Возврат; + КонецЕсли; + + Если Результат.КакОткрывать = 1 Тогда + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатРедактировать); + Возврат; + КонецЕсли; + + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, РезультатОткрыть); +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборПослеВыбораРежимаРедактирования(Результат, ПараметрыВыполнения) Экспорт + РезультатОткрыть = "Открыть"; + РезультатРедактировать = "Редактировать"; + + Если Результат = РезультатРедактировать Тогда + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеРедактированияФайла", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла); + ИначеЕсли Результат = РезультатОткрыть Тогда + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборПослеРедактированияФайла(Результат, ПараметрыВыполнения) Экспорт + + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + УстановитьДоступностьФайловыхКоманд(); + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form index 3b388ea8d..e445cfa24 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Form.form @@ -13,8 +13,8 @@ false - УдалитьИзЛокальногоКэшаФайловРасширеннаяПодсказка - 32 + УдалитьИзЛокальногоКэшаФайловExtendedTooltip + 30 Label true true @@ -49,8 +49,8 @@ false - ЗакончитьРедактированиеРасширеннаяПодсказка - 33 + ЗакончитьРедактированиеExtendedTooltip + 31 Label true true @@ -76,8 +76,8 @@ false - ОсвободитьРасширеннаяПодсказка - 34 + ОсвободитьExtendedTooltip + 32 Label true true @@ -112,8 +112,8 @@ false - ОткрытьКаталогФайлаРасширеннаяПодсказка - 35 + ОткрытьКаталогФайлаExtendedTooltip + 33 Label true true @@ -138,8 +138,8 @@ true - ФормаОткрытьКарточкуРасширеннаяПодсказка - 36 + ФормаОткрытьКарточкуExtendedTooltip + 34 Label true true @@ -161,8 +161,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 31 + ОсновнаяКоманднаяПанельExtendedTooltip + 29 Label true true @@ -216,8 +216,8 @@ None - КартинкаРасширеннаяПодсказка - 54 + КартинкаExtendedTooltip + 43 Label true true @@ -267,8 +267,8 @@ СписокФайлов.ИмяФайла - ИмяФайлаРасширеннаяПодсказка - 56 + ИмяФайлаExtendedTooltip + 44 Label true true @@ -312,8 +312,8 @@ Имя и картинка - ИмяИКартинкаРасширеннаяПодсказка - 53 + ИмяИКартинкаExtendedTooltip + 42 Label true true @@ -344,8 +344,8 @@ СписокФайлов.Размер - РазмерРасширеннаяПодсказка - 58 + РазмерExtendedTooltip + 45 Label true true @@ -393,8 +393,8 @@ СписокФайлов.ДатаИзмененияФайла - ДатаИзмененияФайлаРасширеннаяПодсказка - 60 + ДатаИзмененияФайлаExtendedTooltip + 46 Label true true @@ -427,7 +427,7 @@
      НаРедактирование - 29 + 17 true true @@ -437,8 +437,8 @@ СписокФайлов.НаРедактирование - НаРедактированиеРасширеннаяПодсказка - 62 + НаРедактированиеExtendedTooltip + 47 Label true true @@ -448,12 +448,12 @@ НаРедактированиеКонтекстноеМеню - 30 + 18 true CheckBoxField true - Auto + Enter true Left true @@ -480,10 +480,10 @@ СписокФайловСтрокаПоиска - 44 + 48 СписокФайловСтрокаПоискаРасширеннаяПодсказка - 46 + 50 Label true true @@ -493,7 +493,7 @@ СписокФайловСтрокаПоискаКонтекстноеМеню - 45 + 49 true СписокФайлов @@ -503,10 +503,10 @@ СписокФайловСостояниеПросмотра - 47 + 51 СписокФайловСостояниеПросмотраРасширеннаяПодсказка - 49 + 53 Label true true @@ -516,7 +516,7 @@ СписокФайловСостояниеПросмотраКонтекстноеМеню - 48 + 52 true ViewStatusAddition @@ -527,10 +527,10 @@ СписокФайловУправлениеПоиском - 50 + 54 СписокФайловУправлениеПоискомРасширеннаяПодсказка - 52 + 56 Label true true @@ -540,7 +540,7 @@ СписокФайловУправлениеПоискомКонтекстноеМеню - 51 + 55 true SearchControlAddition @@ -550,8 +550,8 @@ - СписокФайловРасширеннаяПодсказка - 43 + СписокФайловExtendedTooltip + 41 Label true true @@ -572,8 +572,8 @@ false - КонтекстноеМенюСписокФайловУдалитьИзЛокальногоКэшаФайловРасширеннаяПодсказка - 37 + КонтекстноеМенюСписокФайловУдалитьИзЛокальногоКэшаФайловExtendedTooltip + 35 Label true true @@ -599,8 +599,8 @@ false - КонтекстноеМенюСписокФайловЗакончитьРедактированиеРасширеннаяПодсказка - 38 + КонтекстноеМенюСписокФайловЗакончитьРедактированиеExtendedTooltip + 36 Label true true @@ -626,8 +626,8 @@ false - КонтекстноеМенюСписокФайловОсвободитьРасширеннаяПодсказка - 39 + КонтекстноеМенюСписокФайловОсвободитьExtendedTooltip + 37 Label true true @@ -653,8 +653,8 @@ false - КонтекстноеМенюСписокФайловОткрытьКаталогФайлаРасширеннаяПодсказка - 40 + КонтекстноеМенюСписокФайловОткрытьКаталогФайлаExtendedTooltip + 38 Label true true @@ -679,8 +679,8 @@ true - СписокФайловКонтекстноеМенюОткрытьКарточкуРасширеннаяПодсказка - 41 + СписокФайловКонтекстноеМенюОткрытьКарточкуExtendedTooltip + 39 Label true true @@ -705,8 +705,8 @@ true - СписокФайловКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 42 + СписокФайловКонтекстноеМенюВыделитьВсеExtendedTooltip + 40 Label true true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html index e104ea114..687f636ee 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Help/ru.html @@ -1,4 +1,4 @@ - +

      Файлы в основном рабочем каталоге

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

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

      diff --git a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl index b69579413..6551bb913 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФайлыВОсновномРабочемКаталоге/Module.bsl @@ -69,14 +69,15 @@ &НаКлиенте Процедура ЗакончитьРедактирование(Команда) - Если Элементы.СписокФайлов.ТекущиеДанные <> Неопределено Тогда - Ссылка = Элементы.СписокФайлов.ТекущиеДанные.Версия; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, Ссылка); - РаботаСФайламиКлиент.ЗакончитьРедактирование(ДанныеФайла.Ссылка, УникальныйИдентификатор); - ЗаполнитьСписокФайлов(); - ЗаполнитьСписокФайловВФорме(); + СтрокаТаблицы = Элементы.СписокФайлов.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; КонецЕсли; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, СтрокаТаблицы.Версия); + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением(Обработчик, ДанныеФайла.Ссылка, УникальныйИдентификатор); + КонецПроцедуры &НаКлиенте @@ -87,29 +88,83 @@ &НаКлиенте Процедура ОсвободитьВыполнить() - МассивСсылок = Новый Массив; + Обработчик = Новый ОписаниеОповещения("ОсвободитьПослеУстановкиРасширения", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКаталогФайлаВыполнить() + + СтрокаТаблицы = Элементы.СписокФайлов.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( + Неопределено, + СтрокаТаблицы.Версия); + + РаботаСФайламиСлужебныйКлиент.КаталогФайла(Неопределено, ДанныеФайла); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ЗакончитьРедактированиеЗавершение(Результат, ПараметрыВыполнения) Экспорт + + ЗаполнитьСписокФайлов(); + ЗаполнитьСписокФайловВФорме(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОсвободитьПослеУстановкиРасширения(Результат, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("МассивСсылок", Новый Массив); + Для Каждого Элемент Из Элементы.СписокФайлов.ВыделенныеСтроки Цикл ДанныеСтроки = Элементы.СписокФайлов.ДанныеСтроки(Элемент); Ссылка = ДанныеСтроки.Версия; - МассивСсылок.Добавить(Ссылка); + ПараметрыВыполнения.МассивСсылок.Добавить(Ссылка); КонецЦикла; - Для Каждого Ссылка Из МассивСсылок Цикл - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, Ссылка); + ПараметрыВыполнения.Вставить("Индекс", 0); + ПараметрыВыполнения.Вставить("ВГраница", ПараметрыВыполнения.МассивСсылок.ВГраница()); + + ОсвободитьВЦикле(ПараметрыВыполнения); + +КонецПроцедуры + +&НаКлиенте +Процедура ОсвободитьВЦикле(ПараметрыВыполнения) + + РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОписаниеОбработчика( + ПараметрыВыполнения, ЭтотОбъект, "ОсвободитьВЦиклеПродолжить"); + + ПараметрыВызова = Новый Структура; + ПараметрыВызова.Вставить("ОбработчикРезультата", ПараметрыВыполнения); + ПараметрыВызова.Вставить("ОбъектСсылка", Неопределено); + ПараметрыВызова.Вставить("Версия", Неопределено); + ПараметрыВызова.Вставить("ХранитьВерсии", Неопределено); + ПараметрыВызова.Вставить("РедактируетТекущийПользователь", Неопределено); + ПараметрыВызова.Вставить("Редактирует", Неопределено); + ПараметрыВызова.Вставить("УникальныйИдентификатор", Неопределено); + ПараметрыВызова.Вставить("НеЗадаватьВопрос", Ложь); + + Для Индекс = ПараметрыВыполнения.Индекс По ПараметрыВыполнения.ВГраница Цикл + ПараметрыВыполнения.Индекс = Индекс; + ПараметрыВызова.Версия = ПараметрыВыполнения.МассивСсылок[Индекс]; - // Проверяем возможность освобождения - СтрокаОшибки = ""; - Если Не РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл( - ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - СтрокаОшибки) Тогда - - Предупреждение(СтрокаОшибки); - Продолжить; + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлПослеУстановкиРасширения( + Неопределено, ПараметрыВызова); + + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; КонецЕсли; - - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайл(ДанныеФайла.Ссылка); КонецЦикла; ЗаполнитьСписокФайлов(); @@ -118,17 +173,14 @@ КонецПроцедуры &НаКлиенте -Процедура ОткрытьКаталогФайлаВыполнить() - Если Элементы.СписокФайлов.ТекущиеДанные <> Неопределено Тогда - Ссылка = Элементы.СписокФайлов.ТекущиеДанные.Версия; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, Ссылка); - РаботаСФайламиСлужебныйКлиент.КаталогФайла(ДанныеФайла); - КонецЕсли; +Процедура ОсвободитьВЦиклеПродолжить(Результат, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ПараметрыВыполнения.Индекс = ПараметрыВыполнения.Индекс + 1; + ОсвободитьВЦикле(ПараметрыВыполнения); + КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаКлиенте Процедура ЗаполнитьСписокФайловВФорме() @@ -150,7 +202,6 @@ НоваяСтрока.Редактирует = Строка.Значение.Редактирует; НоваяСтрока.НаРедактирование = ЗначениеЗаполнено(Строка.Значение.Редактирует); КонецЕсли; - КонецЦикла; КонецПроцедуры @@ -186,63 +237,116 @@ &НаКлиенте Процедура УдалитьИзЛокальногоКэшаФайловВыполнить() - Текст = НСтр("ru = 'Удалить выбранные файлы из основного рабочего каталога?'"); - Ответ = Вопрос(Текст, РежимДиалогаВопрос.ДаНет); + ТекстВопроса = НСтр("ru = 'Удалить выбранные файлы из основного рабочего каталога?'"); + Обработчик = Новый ОписаниеОповещения("УдалитьИзЛокальногоКэшаПослеОтветаНаВопрос", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьИзЛокальногоКэшаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; - МассивСсылок = Новый Массив; + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("МассивСсылок", Новый Массив); Для Каждого НомерЦикла Из Элементы.СписокФайлов.ВыделенныеСтроки Цикл ДанныеСтроки = Элементы.СписокФайлов.ДанныеСтроки(НомерЦикла); - МассивСсылок.Добавить(ДанныеСтроки.Версия); + ПараметрыВыполнения.МассивСсылок.Добавить(ДанныеСтроки.Версия); КонецЦикла; - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ЕстьЗанятыеФайлы = Ложь; + ПараметрыВыполнения.Вставить("Индекс", 0); + ПараметрыВыполнения.Вставить("ВГраница", ПараметрыВыполнения.МассивСсылок.ВГраница()); + ПараметрыВыполнения.Вставить("Ссылка", Неопределено); + ПараметрыВыполнения.Вставить("ЕстьЗанятыеФайлы", Ложь); + ПараметрыВыполнения.Вставить("ИмяКаталога", ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + + УдалитьИзЛокальногоКэшаФайловВЦикле(ПараметрыВыполнения); - Для Каждого Ссылка Из МассивСсылок Цикл +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьИзЛокальногоКэшаФайловВЦикле(ПараметрыВыполнения) + + РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОписаниеОбработчика(ПараметрыВыполнения, ЭтотОбъект, "УдалитьИзЛокальногоКэшаФайловВЦиклеПродолжить"); + + Для Индекс = ПараметрыВыполнения.Индекс По ПараметрыВыполнения.ВГраница Цикл + ПараметрыВыполнения.Индекс = Индекс; + ПараметрыВыполнения.Ссылка = ПараметрыВыполнения.МассивСсылок[Индекс]; - Если ФайлЗанят(Ссылка) Тогда - Строки = СписокФайлов.НайтиСтроки(Новый Структура("Версия", Ссылка)); + Если ФайлЗанят(ПараметрыВыполнения.Ссылка) Тогда + Строки = СписокФайлов.НайтиСтроки(Новый Структура("Версия", ПараметрыВыполнения.Ссылка)); Строки[0].НаРедактирование = Истина; - ЕстьЗанятыеФайлы = Истина; + ПараметрыВыполнения.ЕстьЗанятыеФайлы = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ПараметрыВыполнения.Индекс = ПараметрыВыполнения.Индекс + 1; Продолжить; КонецЕсли; - ИмяФайлаСПутем = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемИзРегистра( - Ссылка, ИмяКаталога, Ложь, Ложь); + ПараметрыВыполнения.Вставить("ИмяФайлаСПутем", + РаботаСФайламиСлужебныйВызовСервера.ПолучитьПолноеИмяФайлаИзРегистра( + ПараметрыВыполнения.Ссылка, ПараметрыВыполнения.ИмяКаталога, Ложь, Ложь)); - РаботаСФайламиСлужебныйКлиент.УдалитьФайлИзРабочегоКаталога(Ссылка); + РаботаСФайламиСлужебныйКлиент.УдалитьФайлИзРабочегоКаталога( + ПараметрыВыполнения, ПараметрыВыполнения.Ссылка); - Если ИмяФайлаСПутем <> "" Тогда - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ИмяФайлаСПутем <> "" Тогда + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ИмяФайлаСПутем); Если НЕ ФайлНаДиске.Существует() Тогда - УдалитьПоСсылке(Ссылка); + УдалитьПоСсылке(ПараметрыВыполнения.Ссылка); КонецЕсли; Иначе - УдалитьПоСсылке(Ссылка); + УдалитьПоСсылке(ПараметрыВыполнения.Ссылка); КонецЕсли; КонецЦикла; + Если ПараметрыВыполнения.ЕстьЗанятыеФайлы Тогда + ПоказатьПредупреждение(, + НСтр("ru = 'Нельзя удалять из основного рабочего каталога файлы, + |занятые для редактирования.'")); + КонецЕсли; + Элементы.СписокФайлов.Обновить(); - Если ЕстьЗанятыеФайлы Тогда - Предупреждение(НСтр("ru = 'Нельзя удалять из основного рабочего каталога файлы, - |занятые для редактирования.'")); +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьИзЛокальногоКэшаФайловВЦиклеПродолжить(Результат, ПараметрыВыполнения) Экспорт + + // Завершение операций с файлом. + Если ПараметрыВыполнения.ИмяФайлаСПутем <> "" Тогда + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ИмяФайлаСПутем); + Если НЕ ФайлНаДиске.Существует() Тогда + УдалитьПоСсылке(ПараметрыВыполнения.Ссылка); + КонецЕсли; + Иначе + УдалитьПоСсылке(ПараметрыВыполнения.Ссылка); КонецЕсли; + // Продолжение цикла. + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ПараметрыВыполнения.Индекс = ПараметрыВыполнения.Индекс + 1; + УдалитьИзЛокальногоКэшаФайловВЦикле(ПараметрыВыполнения); + КонецПроцедуры &НаКлиенте Процедура ОткрытьКарточкуВыполнить() - Если Элементы.СписокФайлов.ТекущиеДанные <> Неопределено Тогда - Ссылка = Элементы.СписокФайлов.ТекущиеДанные.Версия; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, Ссылка); - ОткрытьЗначение(ДанныеФайла.Ссылка); + СтрокаТаблицы = Элементы.СписокФайлов.ТекущиеДанные; + Если СтрокаТаблицы = Неопределено Тогда + Возврат; КонецЕсли; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Неопределено, СтрокаТаблицы.Версия); + ПоказатьЗначение(, ДанныеФайла.Ссылка); + КонецПроцедуры &НаСервере diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form index bfc166513..74c53a677 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Form.form @@ -17,7 +17,7 @@ None - ПолноеНаименованиеРасширеннаяПодсказка + ПолноеНаименованиеExtendedTooltip 12 Label true @@ -54,8 +54,8 @@ true - КомментарийКВерсииРасширеннаяПодсказка - 14 + КомментарийКВерсииExtendedTooltip + 13 Label true true @@ -106,8 +106,8 @@ Right - СоздатьНовуюВерсиюРасширеннаяПодсказка - 16 + СоздатьНовуюВерсиюExtendedTooltip + 14 Label true true @@ -132,7 +132,7 @@ ОсновнаяКоманднаяПанель 1 - OK + Сохранить 6 true true @@ -141,8 +141,8 @@ false - OKРасширеннаяПодсказка - 19 + СохранитьРасширеннаяПодсказка + 16 Label true true @@ -150,7 +150,7 @@ Left - Form.Command.ОК + Form.Command.Сохранить Auto true true @@ -181,8 +181,8 @@ false - ЗакрытьРасширеннаяПодсказка - 20 + ЗакрытьExtendedTooltip + 17 Label true true @@ -216,8 +216,8 @@ false - СправкаРасширеннаяПодсказка - 21 + СправкаExtendedTooltip + 18 Label true true @@ -248,8 +248,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 18 + ОсновнаяКоманднаяПанельExtendedTooltip + 15 Label true true @@ -275,7 +275,7 @@ ПриСозданииНаСервере 30 - DontBlock + LockOwner true true Vertical @@ -338,22 +338,22 @@ - ОК + Сохранить <key>ru</key> - <value>ОК</value> + <value>Сохранить</value> 1 ru - ОК + Сохранить версию файла true - ОК + Сохранить Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html index 3d7d4ca12..6cfd6cd04 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Help/ru.html @@ -1,4 +1,4 @@ - +

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

      Если флажок "Создать новую версию" не установлен, то при обновлении в хранилище новая версия запишется поверх предыдущей.

      См. также: Общая информация о файлах, Общая информация о формах.

      diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl index 7907b6e1b..78c2b40d2 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВозвратаФайла/Module.bsl @@ -23,17 +23,25 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) - СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", +Процедура Сохранить(Команда) + + СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", КомментарийКВерсии, СоздатьНовуюВерсию, КодВозвратаДиалога.ОК); + Закрыть(СтруктураВозврата); + + Оповестить("РаботаСФайлами_ЗаписанаНоваяВерсияФайла"); + КонецПроцедуры &НаКлиенте Процедура Отмена(Команда) - СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", + + СтруктураВозврата = Новый Структура("КомментарийКВерсии, СоздатьНовуюВерсию, КодВозврата", КомментарийКВерсии, СоздатьНовуюВерсию, КодВозвратаДиалога.Отмена); + Закрыть(СтруктураВозврата); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -47,5 +55,5 @@ Файл = СтруктураПараметров.ФайлСсылка; СоздатьНовуюВерсию = СтруктураПараметров.СоздатьНовуюВерсию; Элементы.СоздатьНовуюВерсию.Доступность = СтруктураПараметров.СоздатьНовуюВерсиюДоступность; - -КонецПроцедуры + +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form index 1b4c94e1e..5041e927a 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Form.form @@ -13,7 +13,7 @@ None - СообщениеЗаголовокРасширеннаяПодсказка + СообщениеЗаголовокExtendedTooltip 17 Label true @@ -62,8 +62,8 @@ Файлы.Presentation - ПредставлениеРасширеннаяПодсказка - 29 + ПредставлениеExtendedTooltip + 19 Label true true @@ -103,10 +103,10 @@ ФайлыСтрокаПоиска - 20 + 26 ФайлыСтрокаПоискаРасширеннаяПодсказка - 22 + 28 Label true true @@ -116,7 +116,7 @@ ФайлыСтрокаПоискаКонтекстноеМеню - 21 + 27 true Файлы @@ -126,10 +126,10 @@ ФайлыСостояниеПросмотра - 23 + 29 ФайлыСостояниеПросмотраРасширеннаяПодсказка - 25 + 31 Label true true @@ -139,7 +139,7 @@ ФайлыСостояниеПросмотраКонтекстноеМеню - 24 + 30 true ViewStatusAddition @@ -150,10 +150,10 @@ ФайлыУправлениеПоиском - 26 + 32 ФайлыУправлениеПоискомРасширеннаяПодсказка - 28 + 34 Label true true @@ -163,7 +163,7 @@ ФайлыУправлениеПоискомКонтекстноеМеню - 27 + 33 true SearchControlAddition @@ -173,8 +173,8 @@ - ФайлыРасширеннаяПодсказка - 19 + ФайлыExtendedTooltip + 18 Label true true @@ -226,8 +226,8 @@ None - СообщениеВопросРасширеннаяПодсказка - 39 + СообщениеВопросExtendedTooltip + 20 Label true true @@ -267,8 +267,8 @@ false - ДаРасширеннаяПодсказка - 42 + ДаExtendedTooltip + 22 Label true true @@ -298,8 +298,8 @@ false - НетРасширеннаяПодсказка - 43 + НетExtendedTooltip + 23 Label true true @@ -329,8 +329,8 @@ false - СправкаРасширеннаяПодсказка - 44 + СправкаExtendedTooltip + 24 Label true true @@ -356,8 +356,8 @@ Основная командная панель - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 41 + ОсновнаяКоманднаяПанельExtendedTooltip + 21 Label true true @@ -383,7 +383,7 @@ ПриСозданииНаСервере 55 - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl index 51a8a6940..7d5b9027c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопроса/Module.bsl @@ -21,19 +21,23 @@ Процедура ФайлыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ВыбраннаяСтрока = Файлы[ВыбраннаяСтрока].Значение; + ФайлСсылка = Файлы[ВыбраннаяСтрока].Значение; - КакОткрывать = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + КакОткрывать = ПерсональныеНастройки.ДействиеПоДвойномуЩелчкуМыши; Если КакОткрывать = "ОткрыватьКарточку" Тогда ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Ключ", ВыбраннаяСтрока); - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + ПараметрыФормы.Вставить("Ключ", ФайлСсылка); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); Возврат; КонецЕсли; - РаботаСФайламиКлиент.ОткрытьФайл( - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор)); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + ФайлСсылка, + Неопределено, + УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form index fdf37d559..0bacb4281 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВопросаЗакончитьРедактирование/Form.form @@ -13,7 +13,7 @@ None - ИнформацияРасширеннаяПодсказка + ИнформацияExtendedTooltip 9 Label true @@ -52,8 +52,8 @@ Right - ПрименитьКоВсемРасширеннаяПодсказка - 11 + ПрименитьКоВсемExtendedTooltip + 10 Label true true @@ -88,7 +88,7 @@ false - ДаРасширеннаяПодсказка + ДаExtendedTooltip 7 Label true @@ -115,7 +115,7 @@ false - НетРасширеннаяПодсказка + НетExtendedTooltip 8 Label true @@ -139,7 +139,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Группы/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index f487363bc..010cd15f9 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Form.form @@ -17,7 +17,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 46 Label true @@ -34,6 +34,32 @@ UserCmds Auto
      + + ДобавитьФайл + 64 + true + true + + true + + + ДобавитьФайлExtendedTooltip + 65 + Label + true + true + + Left + + + Form.Command.ДобавитьФайл + Normal + Auto + true + true + UserCmds + Auto + Изменить 33 @@ -44,7 +70,7 @@ false - ИзменитьРасширеннаяПодсказка + ИзменитьExtendedTooltip 47 Label true @@ -71,7 +97,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 48 Label true @@ -102,7 +128,7 @@ Основная командная панель - ОсновнаяКоманднаяПанельРасширеннаяПодсказка + ОсновнаяКоманднаяПанельExtendedTooltip 45 Label true @@ -147,8 +173,8 @@ Группы.ИндексКартинки - ИндексКартинкиРасширеннаяПодсказка - 61 + ИндексКартинкиExtendedTooltip + 52 Label true true @@ -196,8 +222,8 @@ Группы.Description - ПапкаРасширеннаяПодсказка - 63 + ПапкаExtendedTooltip + 53 Label true true @@ -242,8 +268,8 @@ Картинка и наименование папок - КартинкаИНаименованиеПапокРасширеннаяПодсказка - 60 + КартинкаИНаименованиеПапокExtendedTooltip + 51 Label true true @@ -271,10 +297,10 @@ ПапкиСтрокаПоиска - 51 + 66 ПапкиСтрокаПоискаРасширеннаяПодсказка - 53 + 68 Label true true @@ -284,7 +310,7 @@ ПапкиСтрокаПоискаКонтекстноеМеню - 52 + 67 true Папки @@ -294,10 +320,10 @@ ПапкиСостояниеПросмотра - 54 + 69 ПапкиСостояниеПросмотраРасширеннаяПодсказка - 56 + 71 Label true true @@ -307,7 +333,7 @@ ПапкиСостояниеПросмотраКонтекстноеМеню - 55 + 70 true ViewStatusAddition @@ -318,10 +344,10 @@ ПапкиУправлениеПоиском - 57 + 72 ПапкиУправлениеПоискомРасширеннаяПодсказка - 59 + 74 Label true true @@ -331,7 +357,7 @@ ПапкиУправлениеПоискомКонтекстноеМеню - 58 + 73 true SearchControlAddition @@ -341,7 +367,7 @@ - ПапкиРасширеннаяПодсказка + ПапкиExtendedTooltip 50 Label true @@ -411,7 +437,7 @@ false None - ПодписанЭЦП + ПодписанЭП 41 <key>ru</key> @@ -423,7 +449,7 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ПодписанЭЦП</segments> + <segments>Список.ПодписанЭП</segments> </dataPath> <titleLocation>None</titleLocation> <toolTip> @@ -431,8 +457,8 @@ <value>Подписан ЭП</value> </toolTip> <extendedTooltip> - <name>ПодписанЭЦПРасширеннаяПодсказка</name> - <id>83</id> + <name>ПодписанЭПРасширеннаяПодсказка</name> + <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -441,7 +467,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПодписанЭЦПКонтекстноеМеню</name> + <name>ПодписанЭПКонтекстноеМеню</name> <id>42</id> <autoFill>true</autoFill> </contextMenu> @@ -449,7 +475,7 @@ <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </headerPicture> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> @@ -459,7 +485,7 @@ <horizontalStretch>true</horizontalStretch> <verticalStretch>true</verticalStretch> <valuesPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </valuesPicture> <border xsi:type="core:BorderDef"> <style>Single</style> @@ -488,8 +514,8 @@ <value>Зашифрован</value> </toolTip> <extendedTooltip> - <name>ЗашифрованРасширеннаяПодсказка</name> - <id>85</id> + <name>ЗашифрованExtendedTooltip</name> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -540,8 +566,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>КартинкаРасширеннаяПодсказка</name> - <id>88</id> + <name>КартинкаExtendedTooltip</name> + <id>58</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -592,8 +618,8 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>90</id> + <name>НаименованиеExtendedTooltip</name> + <id>59</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -638,8 +664,8 @@ <value>Картинка и наименование</value> </toolTip> <extendedTooltip> - <name>КартинкаИНаименованиеРасширеннаяПодсказка</name> - <id>87</id> + <name>КартинкаИНаименованиеExtendedTooltip</name> + <id>57</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -666,8 +692,8 @@ <segments>Список.Описание</segments> </dataPath> <extendedTooltip> - <name>ОписаниеРасширеннаяПодсказка</name> - <id>92</id> + <name>ОписаниеExtendedTooltip</name> + <id>60</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -708,8 +734,8 @@ <segments>Список.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>94</id> + <name>АвторExtendedTooltip</name> + <id>61</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -752,8 +778,8 @@ <segments>Список.ДатаСоздания</segments> </dataPath> <extendedTooltip> - <name>ДатаСозданияРасширеннаяПодсказка</name> - <id>96</id> + <name>ДатаСозданияExtendedTooltip</name> + <id>62</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -794,8 +820,8 @@ <segments>Список.Ref</segments> </dataPath> <extendedTooltip> - <name>СсылкаРасширеннаяПодсказка</name> - <id>98</id> + <name>СсылкаExtendedTooltip</name> + <id>63</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -827,10 +853,10 @@ </autoCommandBar> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>74</id> + <id>85</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>76</id> + <id>87</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -840,7 +866,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>75</id> + <id>86</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -850,10 +876,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>77</id> + <id>88</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>79</id> + <id>90</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -863,7 +889,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>78</id> + <id>89</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -874,10 +900,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>80</id> + <id>91</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>82</id> + <id>93</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -887,7 +913,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>81</id> + <id>92</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -897,8 +923,8 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> - <id>73</id> + <name>СписокExtendedTooltip</name> + <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -961,7 +987,7 @@ <value>Группа списки</value> </toolTip> <extendedTooltip> - <name>ГруппаСпискиРасширеннаяПодсказка</name> + <name>ГруппаСпискиExtendedTooltip</name> <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1014,6 +1040,9 @@ <edit> <common>true</common> </edit> + <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> + <segments>Список.ПодписанЭП</segments> + </notDefaultUseAlwaysAttributes> <main>true</main> <extInfo xsi:type="form:DynamicListExtInfo"> <queryText>ВЫБРАТЬ @@ -1031,7 +1060,7 @@ Файлы.Описание, Файлы.ПолноеНаименование, Файлы.ВладелецФайла, - Файлы.ПодписанЭЦП, + Файлы.ПодписанЭП, Файлы.Зашифрован ИЗ Справочник.Файлы КАК Файлы @@ -1088,6 +1117,32 @@ <getInvisibleFieldPresentations>true</getInvisibleFieldPresentations> </extInfo> </attributes> + <formCommands> + <name>ДобавитьФайл</name> + <title> + <key>ru</key> + <value>Добавить файл</value> + + 1 + + ru + Добавить файл + + + true + + + StdPicture.CreateListItem + + + + ДобавитьФайл + + + Picture + Auto + Auto +
      Параметр1 diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl index 29a251e7e..8aba67cfb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбора/Module.bsl @@ -38,8 +38,8 @@ Элементы.Папки.ТекущаяСтрока = Параметры.ТекущаяСтрока; КонецЕсли; - Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() = Ложь Тогда - Элементы.ПодписанЭЦП.Видимость = Ложь; + Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеПодписиИШифрование() = Ложь Тогда + Элементы.ПодписанЭП.Видимость = Ложь; Элементы.Зашифрован.Видимость = Ложь; КонецЕсли; @@ -53,6 +53,20 @@ ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ДобавитьФайл(Команда) + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form index 72e69609b..364cbadb0 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Form.form @@ -24,7 +24,7 @@ Top - КакОткрыватьРасширеннаяПодсказка + КакОткрыватьExtendedTooltip 20 Label true @@ -72,7 +72,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 19 Label true @@ -104,8 +104,8 @@ true - ДекорацияКартинкаРасширеннаяПодсказка - 23 + ДекорацияКартинкаExtendedTooltip + 22 Label true true @@ -142,8 +142,8 @@ true - ДекорацияНадписьРасширеннаяПодсказка - 24 + ДекорацияНадписьExtendedTooltip + 23 Label true true @@ -175,8 +175,8 @@ Группа информация - ГруппаИнформацияРасширеннаяПодсказка - 22 + ГруппаИнформацияExtendedTooltip + 21 Label true true @@ -207,8 +207,8 @@ Right - БольшеНеСпрашиватьРасширеннаяПодсказка - 25 + БольшеНеСпрашиватьExtendedTooltip + 24 Label true true @@ -234,7 +234,7 @@ ФормаКоманднаяПанель -1 - OK + ОткрытьФайл 3 true true @@ -243,7 +243,7 @@ false - OKРасширеннаяПодсказка + ОткрытьФайлРасширеннаяПодсказка 16 Label true @@ -252,7 +252,7 @@ Left - Form.Command.ОК + Form.Command.ОткрытьФайл Auto true true @@ -279,7 +279,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 17 Label true @@ -306,7 +306,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 18 Label true @@ -378,22 +378,22 @@ - ОК + ОткрытьФайл <key>ru</key> - <value>ОК</value> + <value>Открыть файл</value> 1 ru - ОК + Открыть файл true - ОК + ОткрытьФайл Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html index df9c35681..0a9a856bc 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Help/ru.html @@ -1,4 +1,4 @@ - +

      Для открытия файла используйте:

      • клавишу Enter 
      • двойной щелчок левой кнопкой мыши diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl index 366c4087e..397562908 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаВыбораРежимаОткрытия/Module.bsl @@ -15,7 +15,14 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) +Процедура ОткрытьФайл(Команда) + Если БольшеНеСпрашивать = Истина Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( + "НастройкиОткрытияФайлов", + "СпрашиватьРежимРедактированияПриОткрытииФайла", + Ложь); + КонецЕсли; + РезультатВыбора = Новый Структура; РезультатВыбора.Вставить("БольшеНеСпрашивать", БольшеНеСпрашивать); РезультатВыбора.Вставить("КакОткрывать", КакОткрывать); diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form index 90f284b2a..f256101ff 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаГруповаяОперацияНаПапке/Form.form @@ -13,7 +13,7 @@ None - ИнформацияРасширеннаяПодсказка + ИнформацияExtendedTooltip 9 Label true @@ -50,8 +50,8 @@ Right - СУчетомПодпапокРасширеннаяПодсказка - 11 + СУчетомПодпапокExtendedTooltip + 10 Label true true @@ -86,7 +86,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 7 Label true @@ -113,7 +113,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 8 Label true @@ -138,7 +138,7 @@ ПриСозданииНаСервере 30 - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form index a1721da81..2044f00b9 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Form.form @@ -20,7 +20,7 @@ Каталог - ВыбранныйКаталогРасширеннаяПодсказка + ВыбранныйКаталогExtendedTooltip 31 Label true @@ -76,8 +76,8 @@ ПапкаДляДобавления - ПапкаРасширеннаяПодсказка - 33 + ПапкаExtendedTooltip + 32 Label true true @@ -125,8 +125,8 @@ Right - УдалятьПослеДобавленияРасширеннаяПодсказка - 35 + УдалятьПослеДобавленияExtendedTooltip + 33 Label true true @@ -166,8 +166,8 @@ Описание - ОписаниеРасширеннаяПодсказка - 38 + ОписаниеExtendedTooltip + 35 Label true true @@ -214,8 +214,8 @@ Right - ХранитьВерсииРасширеннаяПодсказка - 40 + ХранитьВерсииExtendedTooltip + 36 Label true true @@ -250,8 +250,8 @@ Группа свойств файлов - ГруппаСвойствФайловРасширеннаяПодсказка - 37 + ГруппаСвойствФайловExtendedTooltip + 34 Label true true @@ -286,8 +286,8 @@ true - ДекорацияКодировкаРасширеннаяПодсказка - 43 + ДекорацияКодировкаExtendedTooltip + 38 Label true true @@ -316,8 +316,8 @@ true - ВыбратьКодировкуРасширеннаяПодсказка - 44 + ВыбратьКодировкуExtendedTooltip + 39 Label true true @@ -348,8 +348,8 @@ Группа кодировка - ГруппаКодировкаРасширеннаяПодсказка - 42 + ГруппаКодировкаExtendedTooltip + 37 Label true true @@ -379,8 +379,8 @@ false - ИмпортРасширеннаяПодсказка - 46 + ИмпортExtendedTooltip + 41 Label true true @@ -388,7 +388,7 @@ Left - Form.Command.Импорт + Form.Command.ЗагрузитьПапку true true true @@ -418,8 +418,8 @@ false - ЗакрытьРасширеннаяПодсказка - 47 + ЗакрытьExtendedTooltip + 42 Label true true @@ -449,8 +449,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 45 + ОсновнаяКоманднаяПанельExtendedTooltip + 40 Label true true @@ -652,15 +652,15 @@ - Импорт + ЗагрузитьПапку <key>ru</key> - <value>Загрузить</value> + <value>Загрузить папку</value> 1 ru - Импорт + Загрузить папку true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html index b559fa7d9..7c926b0c1 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Help/ru.html @@ -1,4 +1,4 @@ - +

        Загрузка папки

        Для загрузки папки с жесткого или сетевого диска просто перетащите его мышкой в нужную папку файлов системы или выполните следующие действия:

        1. diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl index dd9824db4..5e8de2fad 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаПапки/Module.bsl @@ -98,33 +98,38 @@ ВыбранныеФайлы = Новый СписокЗначений; ВыбранныеФайлы.Добавить(Каталог); - ПсевдоФайловаяСистема = Новый Соответствие; // соответствие путь к директории - файлы и папки в ней - ДобавленныеФайлы = Новый Массив; + Обработчик = Новый ОписаниеОповещения("ИмпортЗавершение", ЭтотОбъект); - ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйКлиент.ИмпортФайловВыполнить( - ПапкаДляДобавления, - ВыбранныеФайлы, - Описание, - ХранитьВерсии, - УдалятьФайлыПослеДобавления, - Истина, + РаботаСФайламиСлужебныйКлиент.ИмпортФайловВыполнить( + Обработчик, + ПапкаДляДобавления, + ВыбранныеФайлы, + Описание, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Истина, // Рекурсивно УникальныйИдентификатор, - ПсевдоФайловаяСистема, - ДобавленныеФайлы, - Ложь, + Новый Соответствие, // ПсевдоФайловаяСистема + Новый Массив, // ДобавленныеФайлы + Ложь, // РежимЗагрузки КодировкаТекстаФайла); - +КонецПроцедуры + +&НаКлиенте +Процедура ИмпортЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат = Неопределено Тогда + Возврат; + КонецЕсли; + Закрыть(); - - Оповестить("ИмпортКаталоговЗавершен", Новый Структура, ПапкаДляДобавленияТекущая); - + Оповестить("ИмпортКаталоговЗавершен", Новый Структура, Результат.ПапкаДляДобавленияТекущая); КонецПроцедуры &НаКлиенте Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form index c5ec47aba..f07784129 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Form.form @@ -26,7 +26,7 @@ НадписьФайлы - НадписьФайлыРасширеннаяПодсказка + НадписьФайлыExtendedTooltip 40 Label true @@ -64,8 +64,8 @@ false - ВыбратьФайлыРасширеннаяПодсказка - 42 + ВыбратьФайлыExtendedTooltip + 41 Label true true @@ -102,7 +102,7 @@ Заголовок - ЗаголовокРасширеннаяПодсказка + ЗаголовокExtendedTooltip 39 Label true @@ -156,8 +156,8 @@ ВыбранныеФайлы.ИндексКартинки - ВыбранныеФайлыИндексКартинкиРасширеннаяПодсказка - 54 + ВыбранныеФайлыИндексКартинкиExtendedTooltip + 44 Label true true @@ -201,8 +201,8 @@ ВыбранныеФайлы.Путь - ВыбранныеФайлыПутьРасширеннаяПодсказка - 56 + ВыбранныеФайлыПутьExtendedTooltip + 45 Label true true @@ -244,8 +244,8 @@ Картинка и наименование - КартинкаИНаименованиеРасширеннаяПодсказка - 53 + КартинкаИНаименованиеExtendedTooltip + 43 Label true true @@ -273,10 +273,10 @@ ВыбранныеФайлыСтрокаПоиска - 44 + 57 ВыбранныеФайлыСтрокаПоискаРасширеннаяПодсказка - 46 + 59 Label true true @@ -286,7 +286,7 @@ ВыбранныеФайлыСтрокаПоискаКонтекстноеМеню - 45 + 58 true ВыбранныеФайлы @@ -296,10 +296,10 @@ ВыбранныеФайлыСостояниеПросмотра - 47 + 60 ВыбранныеФайлыСостояниеПросмотраРасширеннаяПодсказка - 49 + 62 Label true true @@ -309,7 +309,7 @@ ВыбранныеФайлыСостояниеПросмотраКонтекстноеМеню - 48 + 61 true ViewStatusAddition @@ -320,10 +320,10 @@ ВыбранныеФайлыУправлениеПоиском - 50 + 63 ВыбранныеФайлыУправлениеПоискомРасширеннаяПодсказка - 52 + 65 Label true true @@ -333,7 +333,7 @@ ВыбранныеФайлыУправлениеПоискомКонтекстноеМеню - 51 + 64 true SearchControlAddition @@ -343,8 +343,8 @@ - ВыбранныеФайлыРасширеннаяПодсказка - 43 + ВыбранныеФайлыExtendedTooltip + 42 Label true true @@ -393,7 +393,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 38 Label true @@ -428,8 +428,8 @@ ПапкаДляДобавления - ПапкаДляДобавленияРасширеннаяПодсказка - 66 + ПапкаДляДобавленияExtendedTooltip + 46 Label true true @@ -475,8 +475,8 @@ Right - УдалятьПослеДобавленияРасширеннаяПодсказка - 68 + УдалятьПослеДобавленияExtendedTooltip + 47 Label true true @@ -513,8 +513,8 @@ Комментарий - ОписаниеРасширеннаяПодсказка - 70 + ОписаниеExtendedTooltip + 48 Label true true @@ -561,8 +561,8 @@ Right - ХранитьВерсииРасширеннаяПодсказка - 72 + ХранитьВерсииExtendedTooltip + 49 Label true true @@ -599,8 +599,8 @@ true - ДекорацияКодировкаРасширеннаяПодсказка - 75 + ДекорацияКодировкаExtendedTooltip + 51 Label true true @@ -629,8 +629,8 @@ true - ВыбратьКодировкуРасширеннаяПодсказка - 76 + ВыбратьКодировкуExtendedTooltip + 52 Label true true @@ -661,8 +661,8 @@ Группа кодировка - ГруппаКодировкаРасширеннаяПодсказка - 74 + ГруппаКодировкаExtendedTooltip + 50 Label true true @@ -692,8 +692,8 @@ false - ДобавитьРасширеннаяПодсказка - 78 + ДобавитьExtendedTooltip + 54 Label true true @@ -701,7 +701,7 @@ Left - Form.Command.Добавить + Form.Command.ЗагрузитьФайл Auto true true @@ -728,8 +728,8 @@ false - ОтменаРасширеннаяПодсказка - 79 + ОтменаExtendedTooltip + 55 Label true true @@ -760,8 +760,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 77 + ОсновнаяКоманднаяПанельExtendedTooltip + 53 Label true true @@ -1032,15 +1032,15 @@ - Добавить + ЗагрузитьФайл <key>ru</key> - <value>Загрузить</value> + <value>Загрузить файл</value> 1 ru - Импорт файлов + Загрузить файл true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html index 8c488e10c..24d1b43d4 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Help/ru.html @@ -1,4 +1,4 @@ - +

          Загрузка файлов

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

          См. также: Загрузка папки.

          \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl index 118505280..558742cf9 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаИмпортаФайлов/Module.bsl @@ -127,60 +127,70 @@ ДобавленныеФайлы = Новый Массив; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДобавленныеФайлы", ДобавленныеФайлы); + Обработчик = Новый ОписаниеОповещения("ДобавитьВыполнитьПослеИмпортаФайлов", ЭтотОбъект, ПараметрыОбработчика); + РаботаСФайламиСлужебныйКлиент.ИмпортФайловВыполнить( - ВладелецФайловДляДобавления, - ВыбранныеФайлыСписокЗначений, - Комментарий, - ХранитьВерсии, - УдалятьФайлыПослеДобавления, + Обработчик, + ВладелецФайловДляДобавления, + ВыбранныеФайлыСписокЗначений, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, Ложь, // Ложь - нерекурсивно УникальныйИдентификатор, ПсевдоФайловаяСистема, ДобавленныеФайлы, Ложь, - КодировкаТекстаФайла); - + КодировкаТекстаФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьВыполнитьПослеИмпортаФайлов(Результат, ПараметрыВыполнения) Экспорт Закрыть(); - ПараметрКоманды = Неопределено; - Если ДобавленныеФайлы.Количество() > 0 Тогда - Индекс = ДобавленныеФайлы.Количество() - 1; - ПараметрКоманды = ДобавленныеФайлы[Индекс].ФайлСсылка; + ОповещениеПараметр = Неопределено; + Если ПараметрыВыполнения.ДобавленныеФайлы.Количество() > 0 Тогда + Индекс = ПараметрыВыполнения.ДобавленныеФайлы.Количество() - 1; + ОповещениеПараметр = ПараметрыВыполнения.ДобавленныеФайлы[Индекс].ФайлСсылка; КонецЕсли; - - Оповестить("ИмпортФайловЗавершен", ПараметрКоманды,); - + Оповестить("ИмпортФайловЗавершен", ОповещениеПараметр); КонецПроцедуры &НаКлиенте Процедура ВыбратьФайлыВыполнить() - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Обработчик = Новый ОписаниеОповещения("ВыбратьФайлыВыполнитьПослеУстановкиРасширения", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры - Если РасширениеПодключено Тогда +&НаКлиенте +Процедура ВыбратьФайлыВыполнитьПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + Возврат; + КонецЕсли; + + Режим = РежимДиалогаВыбораФайла.Открытие; + + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); + ДиалогОткрытияФайла.Фильтр = Фильтр; + ДиалогОткрытияФайла.МножественныйВыбор = Истина; + ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); + Если ДиалогОткрытияФайла.Выбрать() Тогда + ВыбранныеФайлы.Очистить(); - Режим = РежимДиалогаВыбораФайла.Открытие; - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.Фильтр = Фильтр; - ДиалогОткрытияФайла.МножественныйВыбор = Истина; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); - Если ДиалогОткрытияФайла.Выбрать() Тогда - ВыбранныеФайлы.Очистить(); - - МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; - Для Каждого ИмяФайла Из МассивФайлов Цикл - ФайлПеренесенный = Новый Файл(ИмяФайла); - НовыйЭлемент = ВыбранныеФайлы.Добавить(); - НовыйЭлемент.Путь = ИмяФайла; - НовыйЭлемент.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); - КонецЦикла; - КонецЕсли; - - КонецЕсли + МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; + Для Каждого ИмяФайла Из МассивФайлов Цикл + ФайлПеренесенный = Новый Файл(ИмяФайла); + НовыйЭлемент = ВыбранныеФайлы.Добавить(); + НовыйЭлемент.Путь = ИмяФайла; + НовыйЭлемент.ИндексКартинки = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьИндексПиктограммыФайла(ФайлПеренесенный.Расширение); + КонецЦикла; + КонецЕсли; КонецПроцедуры @@ -188,7 +198,7 @@ Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form index 21a69deaa..ffa689f0e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Form.form @@ -2,16 +2,15 @@ <key>ru</key> - <value>Подсказка</value> + <value>Помещение файла</value> ТекстНапоминания 7 <key>ru</key> - <value>Сейчас Вам будет предложено выбрать файл для того, -чтобы поместить его в информационную базу и -закончить редактирование. + <value>Сейчас будет предложено выбрать файл для того, +чтобы поместить его в программу и закончить редактирование. Найдите нужный файл в том каталоге, который вы указывали ранее при начале редактирования. @@ -23,7 +22,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстНапоминанияРасширеннаяПодсказка</name> + <name>ТекстНапоминанияExtendedTooltip</name> <id>11</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -60,7 +59,7 @@ </dataPath> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>ПоказыватьНапоминаниеПриРедактированииРасширеннаяПодсказка</name> + <name>ПоказыватьНапоминаниеПриРедактированииExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -95,7 +94,7 @@ <value>Отступ</value> </toolTip> <extendedTooltip> - <name>ОтступРасширеннаяПодсказка</name> + <name>ОтступExtendedTooltip</name> <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -121,7 +120,7 @@ <name>ФормаКоманднаяПанель</name> <id>-1</id> <items xsi:type="form:Button"> - <name>ФормаОК</name> + <name>ФормаПродолжить</name> <id>6</id> <visible>true</visible> <enabled>true</enabled> @@ -129,7 +128,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОКРасширеннаяПодсказка</name> + <name>ФормаПродолжитьРасширеннаяПодсказка</name> <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -138,7 +137,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ОК</commandName> + <commandName>Form.Command.Продолжить</commandName> <representation>Auto</representation> <defaultButton>true</defaultButton> <autoMaxWidth>true</autoMaxWidth> @@ -152,7 +151,7 @@ <event>OnCreateAtServer</event> <name>ПриСозданииНаСервере</name> </handlers> - <windowOpeningMode>DontBlock</windowOpeningMode> + <windowOpeningMode>LockOwner</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoUrl>true</autoUrl> <group>Vertical</group> @@ -166,7 +165,7 @@ <name>БольшеНеПоказывать</name> <title> <key>ru</key> - <value>Больше не показывать подсказки</value> + <value>Больше не показывать это сообщение</value> 1 @@ -198,22 +197,22 @@ - ОК + Продолжить <key>ru</key> - <value>ОК</value> + <value>Продолжить</value> 1 ru - ОК + Продолжить true - ОК + ПродолжитьВыполнить Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl index 68eb913df..3b1ab5e26 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНапоминанияПередПоместитьФайл/Module.bsl @@ -16,8 +16,12 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) +Процедура ПродолжитьВыполнить(Команда) - Закрыть(БольшеНеПоказывать); + Если БольшеНеПоказывать = Истина Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", Ложь); + КонецЕсли; + + Закрыть(); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form index 90f80811a..7e611428c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Form.form @@ -21,7 +21,7 @@ Top - РежимСозданияРасширеннаяПодсказка + РежимСозданияExtendedTooltip 10 Label true @@ -61,6 +61,15 @@ 2 + + + ru + Со сканера + + + 3 + + Vertical @@ -81,8 +90,8 @@ false - СоздатьФайлРасширеннаяПодсказка - 13 + СоздатьФайлExtendedTooltip + 12 Label true true @@ -117,8 +126,8 @@ false - ОтменаРасширеннаяПодсказка - 14 + ОтменаExtendedTooltip + 13 Label true true @@ -144,8 +153,8 @@ false - СправкаРасширеннаяПодсказка - 15 + СправкаExtendedTooltip + 14 Label true true @@ -167,8 +176,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 12 + ОсновнаяКоманднаяПанельExtendedTooltip + 11 Label true true @@ -195,7 +204,7 @@ ПриСозданииНаСервере 30 - DontBlock + LockOwner true true Vertical @@ -253,6 +262,12 @@ CatalogRef.ПапкиФайлов + + ДоступнаКомандаСканировать + + Boolean + + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html index 986e10124..4ece50887 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Help/ru.html @@ -1,4 +1,4 @@ - +

          Варианты создания нового файла:

          diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl index 2234ceef8..8c1575f07 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаНового/Module.bsl @@ -8,10 +8,8 @@ Возврат; КонецЕсли; - Если Параметры.Свойство("ДоступнаКомандаСканировать") Тогда - Если Параметры.ДоступнаКомандаСканировать Тогда - Элементы.РежимСоздания.СписокВыбора.Добавить(3, "Со сканера"); - КонецЕсли; + Если Не Параметры.ДоступнаКомандаСканировать Тогда + Элементы.РежимСоздания.СписокВыбора.Удалить(2); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form index 6a81650a9..448368188 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаОтчета/Form.form @@ -13,7 +13,7 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка + ОсновнаяКоманднаяПанельExtendedTooltip 4 Label true @@ -41,7 +41,7 @@ None - ОтчетРасширеннаяПодсказка + ОтчетExtendedTooltip 5 Label true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form index 4a721b2cd..d498b9106 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Form.form @@ -26,7 +26,7 @@ НадписьФайлы - НадписьФайлыРасширеннаяПодсказка + НадписьФайлыExtendedTooltip 49 Label true @@ -60,7 +60,7 @@ Заголовок - ЗаголовокРасширеннаяПодсказка + ЗаголовокExtendedTooltip 48 Label true @@ -110,8 +110,8 @@ ДеревоФайловПометкаПриИзменении - ДеревоФайловПометкаРасширеннаяПодсказка - 62 + ДеревоФайловПометкаExtendedTooltip + 52 Label true true @@ -143,8 +143,8 @@ ДеревоФайлов.ИндексКартинки - ДеревоФайловИндексКартинкиРасширеннаяПодсказка - 64 + ДеревоФайловИндексКартинкиExtendedTooltip + 53 Label true true @@ -188,8 +188,8 @@ ДеревоФайлов.ИмяФайла - ДеревоФайловИмяФайлаРасширеннаяПодсказка - 66 + ДеревоФайловИмяФайлаExtendedTooltip + 54 Label true true @@ -223,8 +223,8 @@ true - КартинкаИНаименованиеРасширеннаяПодсказка - 61 + КартинкаИНаименованиеExtendedTooltip + 51 Label true true @@ -248,10 +248,10 @@ ДеревоФайловСтрокаПоиска - 52 + 67 ДеревоФайловСтрокаПоискаРасширеннаяПодсказка - 54 + 69 Label true true @@ -261,7 +261,7 @@ ДеревоФайловСтрокаПоискаКонтекстноеМеню - 53 + 68 true ДеревоФайлов @@ -271,10 +271,10 @@ ДеревоФайловСостояниеПросмотра - 55 + 70 ДеревоФайловСостояниеПросмотраРасширеннаяПодсказка - 57 + 72 Label true true @@ -284,7 +284,7 @@ ДеревоФайловСостояниеПросмотраКонтекстноеМеню - 56 + 71 true ViewStatusAddition @@ -295,10 +295,10 @@ ДеревоФайловУправлениеПоиском - 58 + 73 ДеревоФайловУправлениеПоискомРасширеннаяПодсказка - 60 + 75 Label true true @@ -308,7 +308,7 @@ ДеревоФайловУправлениеПоискомКонтекстноеМеню - 59 + 74 true SearchControlAddition @@ -318,8 +318,8 @@ - ДеревоФайловРасширеннаяПодсказка - 51 + ДеревоФайловExtendedTooltip + 50 Label true true @@ -364,7 +364,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 47 Label true @@ -399,8 +399,8 @@ ПапкаДляДобавления - ПапкаДляДобавленияРасширеннаяПодсказка - 76 + ПапкаДляДобавленияExtendedTooltip + 55 Label true true @@ -444,8 +444,8 @@ Right - УдалятьПослеДобавленияРасширеннаяПодсказка - 78 + УдалятьПослеДобавленияExtendedTooltip + 56 Label true true @@ -485,8 +485,8 @@ Комментарий - ОписаниеРасширеннаяПодсказка - 81 + ОписаниеExtendedTooltip + 58 Label true true @@ -532,8 +532,8 @@ Right - ХранитьВерсииРасширеннаяПодсказка - 83 + ХранитьВерсииExtendedTooltip + 59 Label true true @@ -568,8 +568,8 @@ Реквизиты файлов - РеквизитыФайловРасширеннаяПодсказка - 80 + РеквизитыФайловExtendedTooltip + 57 Label true true @@ -604,8 +604,8 @@ true - ДекорацияКодировкаРасширеннаяПодсказка - 86 + ДекорацияКодировкаExtendedTooltip + 61 Label true true @@ -634,8 +634,8 @@ true - ВыбратьКодировкуРасширеннаяПодсказка - 87 + ВыбратьКодировкуExtendedTooltip + 62 Label true true @@ -666,8 +666,8 @@ Группа кодировка - ГруппаКодировкаРасширеннаяПодсказка - 85 + ГруппаКодировкаExtendedTooltip + 60 Label true true @@ -697,8 +697,8 @@ false - ДобавитьРасширеннаяПодсказка - 89 + ДобавитьExtendedTooltip + 64 Label true true @@ -706,7 +706,7 @@ Left - Form.Command.Добавить + Form.Command.ЗагрузитьФайлы Auto true true @@ -733,8 +733,8 @@ false - ОтменаРасширеннаяПодсказка - 90 + ОтменаExtendedTooltip + 65 Label true true @@ -765,8 +765,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 88 + ОсновнаяКоманднаяПанельExtendedTooltip + 63 Label true true @@ -1060,10 +1060,10 @@ - Добавить + ЗагрузитьФайлы <key>ru</key> - <value>Загрузить</value> + <value>Загрузить файлы</value> 1 @@ -1075,7 +1075,7 @@ - ДобавитьВыполнить + ЗагрузитьФайлы Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl index 8e50906dc..0d141788e 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПеретаскивания/Module.bsl @@ -20,9 +20,10 @@ Процедура ПриОткрытии(Отказ) #Если ВебКлиент Тогда - Предупреждение( + ТекстПредупреждения = НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. - |Используйте команду ""Создать"" в списке файлов.'")); + |Используйте команду ""Создать"" в списке файлов.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); Отказ = Истина; Возврат; #КонецЕсли @@ -67,7 +68,7 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ДобавитьВыполнить() +Процедура ЗагрузитьФайлы() ОчиститьСообщения(); @@ -104,35 +105,38 @@ ДобавленныеФайлы = Новый Массив; - ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйКлиент.ИмпортФайловВыполнить( - ПапкаДляДобавления, - ВыбранныеФайлы, - Комментарий, - ХранитьВерсии, - УдалятьФайлыПослеДобавления, + Обработчик = Новый ОписаниеОповещения("ДобавитьВыполнитьПослеИмпорта", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ИмпортФайловВыполнить( + Обработчик, + ПапкаДляДобавления, + ВыбранныеФайлы, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, Истина, // Истина - рекурсивно УникальныйИдентификатор, ПсевдоФайловаяСистема, ДобавленныеФайлы, Ложь, - КодировкаТекстаФайла); - - Закрыть(); - - Оповестить("ИмпортКаталоговЗавершен", Новый Структура, ПапкаДляДобавленияТекущая); - + КодировкаТекстаФайла); КонецПроцедуры &НаКлиенте Процедура ВыбратьКодировку(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ТекущаяКодировка", КодировкаТекстаФайла); - ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.Файлы.Форма.ВыборКодировки", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ДобавитьВыполнитьПослеИмпорта(Результат, ПараметрыВыполнения) Экспорт + Закрыть(); + Оповестить("ИмпортКаталоговЗавершен", Новый Структура, Результат.ПапкаДляДобавленияТекущая); +КонецПроцедуры + &НаКлиенте Процедура ЗаполнитьСписокФайлов(ПутьФайла, Знач ЭлементыДерева, ЭлементВерхнегоУровня, ТолькоКаталоги = Неопределено) diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Группы/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 96b2c6a8f..7f3461e23 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаПодбора/Form.form @@ -35,8 +35,8 @@ Группы.ИндексКартинки - ИндексКартинкиРасширеннаяПодсказка - 57 + ИндексКартинкиExtendedTooltip + 48 Label true true @@ -84,8 +84,8 @@ Группы.Description - ПапкаРасширеннаяПодсказка - 59 + ПапкаExtendedTooltip + 49 Label true true @@ -130,8 +130,8 @@ Картинка и наименование папок - КартинкаИНаименованиеПапокРасширеннаяПодсказка - 56 + КартинкаИНаименованиеПапокExtendedTooltip + 47 Label true true @@ -159,10 +159,10 @@ ПапкиСтрокаПоиска - 47 + 58 ПапкиСтрокаПоискаРасширеннаяПодсказка - 49 + 60 Label true true @@ -172,7 +172,7 @@ ПапкиСтрокаПоискаКонтекстноеМеню - 48 + 59 true Папки @@ -182,10 +182,10 @@ ПапкиСостояниеПросмотра - 50 + 61 ПапкиСостояниеПросмотраРасширеннаяПодсказка - 52 + 63 Label true true @@ -195,7 +195,7 @@ ПапкиСостояниеПросмотраКонтекстноеМеню - 51 + 62 true ViewStatusAddition @@ -206,10 +206,10 @@ ПапкиУправлениеПоиском - 53 + 64 ПапкиУправлениеПоискомРасширеннаяПодсказка - 55 + 66 Label true true @@ -219,7 +219,7 @@ ПапкиУправлениеПоискомКонтекстноеМеню - 54 + 65 true SearchControlAddition @@ -229,7 +229,7 @@ - ПапкиРасширеннаяПодсказка + ПапкиExtendedTooltip 46 Label true @@ -314,8 +314,8 @@ None - КартинкаРасширеннаяПодсказка - 80 + КартинкаExtendedTooltip + 52 Label true true @@ -366,8 +366,8 @@ true - НаименованиеРасширеннаяПодсказка - 82 + НаименованиеExtendedTooltip + 53 Label true true @@ -412,8 +412,8 @@ Картинка и наименование - КартинкаИНаименованиеРасширеннаяПодсказка - 79 + КартинкаИНаименованиеExtendedTooltip + 51 Label true true @@ -440,8 +440,8 @@ Список.Описание - ОписаниеРасширеннаяПодсказка - 84 + ОписаниеExtendedTooltip + 54 Label true true @@ -482,8 +482,8 @@ Список.Автор - АвторРасширеннаяПодсказка - 86 + АвторExtendedTooltip + 55 Label true true @@ -526,8 +526,8 @@ Список.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 88 + ДатаСозданияExtendedTooltip + 56 Label true true @@ -568,8 +568,8 @@ Список.Ref - СсылкаРасширеннаяПодсказка - 90 + СсылкаExtendedTooltip + 57 Label true true @@ -605,10 +605,10 @@ СписокСтрокаПоиска - 70 + 77 СписокСтрокаПоискаРасширеннаяПодсказка - 72 + 79 Label true true @@ -618,7 +618,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 71 + 78 true Список @@ -628,10 +628,10 @@ СписокСостояниеПросмотра - 73 + 80 СписокСостояниеПросмотраРасширеннаяПодсказка - 75 + 82 Label true true @@ -641,7 +641,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 74 + 81 true ViewStatusAddition @@ -652,10 +652,10 @@ СписокУправлениеПоиском - 76 + 83 СписокУправлениеПоискомРасширеннаяПодсказка - 78 + 85 Label true true @@ -665,7 +665,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 77 + 84 true SearchControlAddition @@ -675,8 +675,8 @@ - СписокРасширеннаяПодсказка - 69 + СписокExtendedTooltip + 50 Label true true @@ -739,7 +739,7 @@ Группа списки - ГруппаСпискиРасширеннаяПодсказка + ГруппаСпискиExtendedTooltip 45 Label true @@ -771,7 +771,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 43 Label true @@ -798,7 +798,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 44 Label true diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 64825da03..0f4f8bb7b 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Form.form @@ -20,7 +20,7 @@ Copy Create - ПодписанЭЦП + ПодписанЭП 86 <key>ru</key> @@ -32,7 +32,7 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ПодписанЭЦП</segments> + <segments>Список.ПодписанЭП</segments> </dataPath> <titleLocation>None</titleLocation> <toolTip> @@ -40,8 +40,8 @@ <value>Подписан ЭП</value> </toolTip> <extendedTooltip> - <name>ПодписанЭЦПРасширеннаяПодсказка</name> - <id>110</id> + <name>ПодписанЭПРасширеннаяПодсказка</name> + <id>101</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -50,7 +50,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПодписанЭЦПКонтекстноеМеню</name> + <name>ПодписанЭПКонтекстноеМеню</name> <id>87</id> <autoFill>true</autoFill> </contextMenu> @@ -58,7 +58,7 @@ <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </headerPicture> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> @@ -68,7 +68,7 @@ <horizontalStretch>true</horizontalStretch> <verticalStretch>true</verticalStretch> <valuesPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </valuesPicture> <border xsi:type="core:BorderDef"> <style>Single</style> @@ -97,8 +97,8 @@ <value>Зашифрован</value> </toolTip> <extendedTooltip> - <name>ЗашифрованРасширеннаяПодсказка</name> - <id>112</id> + <name>ЗашифрованExtendedTooltip</name> + <id>102</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -148,8 +148,8 @@ <segments>Список.ИндексКартинки</segments> </dataPath> <extendedTooltip> - <name>КартинкаРасширеннаяПодсказка</name> - <id>115</id> + <name>КартинкаExtendedTooltip</name> + <id>104</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -198,8 +198,8 @@ <segments>Список.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>117</id> + <name>НаименованиеExtendedTooltip</name> + <id>105</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -232,8 +232,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КартинкаИНаименованиеРасширеннаяПодсказка</name> - <id>114</id> + <name>КартинкаИНаименованиеExtendedTooltip</name> + <id>103</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -260,8 +260,8 @@ <segments>Список.ВладелецФайла</segments> </dataPath> <extendedTooltip> - <name>ВладелецФайлаРасширеннаяПодсказка</name> - <id>119</id> + <name>ВладелецФайлаExtendedTooltip</name> + <id>106</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -296,8 +296,8 @@ <segments>Список.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>121</id> + <name>АвторExtendedTooltip</name> + <id>107</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -340,8 +340,8 @@ <segments>Список.ДатаСоздания</segments> </dataPath> <extendedTooltip> - <name>ДатаСозданияРасширеннаяПодсказка</name> - <id>123</id> + <name>ДатаСозданияExtendedTooltip</name> + <id>108</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -384,8 +384,8 @@ <segments>Список.ТекущаяВерсияРасширение</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияРасширениеРасширеннаяПодсказка</name> - <id>125</id> + <name>ТекущаяВерсияРасширениеExtendedTooltip</name> + <id>109</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -424,8 +424,8 @@ <segments>Список.ТекущаяВерсияРазмер</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияРазмерРасширеннаяПодсказка</name> - <id>127</id> + <name>ТекущаяВерсияРазмерExtendedTooltip</name> + <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -472,8 +472,8 @@ <segments>Список.Редактирует</segments> </dataPath> <extendedTooltip> - <name>РедактируетРасширеннаяПодсказка</name> - <id>129</id> + <name>РедактируетExtendedTooltip</name> + <id>111</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -510,8 +510,8 @@ <segments>Список.Описание</segments> </dataPath> <extendedTooltip> - <name>ОписаниеРасширеннаяПодсказка</name> - <id>131</id> + <name>ОписаниеExtendedTooltip</name> + <id>112</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -553,8 +553,8 @@ <segments>Список.ТекущаяВерсияНомерВерсии</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияНомерВерсииРасширеннаяПодсказка</name> - <id>133</id> + <name>ТекущаяВерсияНомерВерсииExtendedTooltip</name> + <id>113</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -591,8 +591,8 @@ <segments>Список.ТекущаяВерсияАвтор</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияАвторРасширеннаяПодсказка</name> - <id>135</id> + <name>ТекущаяВерсияАвторExtendedTooltip</name> + <id>114</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -633,8 +633,8 @@ <segments>Список.ТекущаяВерсияТом</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияТомРасширеннаяПодсказка</name> - <id>137</id> + <name>ТекущаяВерсияТомExtendedTooltip</name> + <id>115</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -671,8 +671,8 @@ <segments>Список.ТекущаяВерсияПутьКФайлу</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияПутьКФайлуРасширеннаяПодсказка</name> - <id>139</id> + <name>ТекущаяВерсияПутьКФайлуExtendedTooltip</name> + <id>116</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -705,8 +705,8 @@ <segments>Список.Ref</segments> </dataPath> <extendedTooltip> - <name>СсылкаРасширеннаяПодсказка</name> - <id>141</id> + <name>СсылкаExtendedTooltip</name> + <id>117</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -750,10 +750,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>101</id> + <id>118</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>103</id> + <id>120</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -763,7 +763,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>102</id> + <id>119</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -773,10 +773,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>104</id> + <id>121</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>106</id> + <id>123</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -786,7 +786,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>105</id> + <id>122</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -797,10 +797,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>107</id> + <id>124</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>109</id> + <id>126</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -810,7 +810,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>108</id> + <id>125</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -820,7 +820,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>100</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -842,7 +842,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокПросмотретьРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокПросмотретьExtendedTooltip</name> <id>97</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -869,7 +869,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокОсвободитьExtendedTooltip</name> <id>98</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -896,7 +896,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокСохранитьКакExtendedTooltip</name> <id>99</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -964,7 +964,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ПросмотретьРасширеннаяПодсказка</name> + <name>ПросмотретьExtendedTooltip</name> <id>92</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -991,7 +991,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОсвободитьРасширеннаяПодсказка</name> + <name>ОсвободитьExtendedTooltip</name> <id>93</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1022,7 +1022,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>СохранитьКакРасширеннаяПодсказка</name> + <name>СохранитьКакExtendedTooltip</name> <id>94</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1054,7 +1054,7 @@ <value>Группа команд файлов</value> </toolTip> <extendedTooltip> - <name>ГруппаКомандФайловРасширеннаяПодсказка</name> + <name>ГруппаКомандФайловExtendedTooltip</name> <id>91</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1082,7 +1082,7 @@ <value>Группа команд формы</value> </toolTip> <extendedTooltip> - <name>ГруппаКомандФормыРасширеннаяПодсказка</name> + <name>ГруппаКомандФормыExtendedTooltip</name> <id>95</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1104,7 +1104,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>96</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1158,6 +1158,9 @@ <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> <segments>Список.Ref</segments> </notDefaultUseAlwaysAttributes> + <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> + <segments>Список.ПодписанЭП</segments> + </notDefaultUseAlwaysAttributes> <notDefaultUseAlwaysAttributes xsi:type="form:DataPath"> <segments>Список.Редактирует</segments> </notDefaultUseAlwaysAttributes> @@ -1197,7 +1200,7 @@ Файлы.ТекущаяВерсияНомерВерсии, Файлы.ТекущаяВерсияТом, Файлы.ТекущаяВерсияПутьКФайлу, - Файлы.ПодписанЭЦП, + Файлы.ПодписанЭП, Файлы.Зашифрован ИЗ Справочник.Файлы КАК Файлы</queryText> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl index 3da485256..2f5e190e6 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСписка/Module.bsl @@ -13,8 +13,8 @@ РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); - Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() = Ложь Тогда - Элементы.ПодписанЭЦП.Видимость = Ложь; + Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеПодписиИШифрование() = Ложь Тогда + Элементы.ПодписанЭП.Видимость = Ложь; Элементы.Зашифрован.Видимость = Ложь; КонецЕсли; @@ -52,9 +52,12 @@ СтандартнаяОбработка = Ложь; - РаботаСФайламиКлиент.ОткрытьФайл( - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор)); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор); + + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры @@ -93,9 +96,11 @@ КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); + Элементы.Список.ТекущаяСтрока, + Неопределено, + УникальныйИдентификатор); - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры @@ -106,19 +111,24 @@ Возврат; КонецЕсли; - РаботаСФайламиКлиент.ОсвободитьФайл( + Обработчик = Новый ОписаниеОповещения("ОсвободитьЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением( + Обработчик, Элементы.Список.ТекущаяСтрока, Элементы.Список.ТекущиеДанные.ХранитьВерсии, Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, Элементы.Список.ТекущиеДанные.Редактирует); - - УстановитьДоступностьФайловыхКоманд(); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ОсвободитьЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка &НаКлиенте Функция ФайловыеКомандыДоступны() diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ <viewMode>Normal</viewMode> <userSettingID>b75fecce-942b-4aed-abc9-e6a02e460fb3</userSettingID> </conditionalAppearance> + <itemsViewMode>Normal</itemsViewMode> + <itemsUserSettingID>911b6018-f537-43e8-a417-da56b22f9aec</itemsUserSettingID> </Settings> diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form index 768f0b398..440798841 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Form.form @@ -18,7 +18,7 @@ <skipOnInput>false</skipOnInput> <titleLocation>None</titleLocation> <items xsi:type="form:FormField"> - <name>ПодписанЭЦП</name> + <name>ПодписанЭП</name> <id>91</id> <title> <key>ru</key> @@ -30,7 +30,7 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>Список.ПодписанЭЦП</segments> + <segments>Список.ПодписанЭП</segments> </dataPath> <titleLocation>None</titleLocation> <toolTip> @@ -38,8 +38,8 @@ <value>Подписан ЭП</value> </toolTip> <extendedTooltip> - <name>ПодписанЭЦПРасширеннаяПодсказка</name> - <id>170</id> + <name>ПодписанЭПРасширеннаяПодсказка</name> + <id>161</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -48,7 +48,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ПодписанЭЦПКонтекстноеМеню</name> + <name>ПодписанЭПКонтекстноеМеню</name> <id>92</id> <autoFill>true</autoFill> </contextMenu> @@ -56,7 +56,7 @@ <editMode>Enter</editMode> <showInHeader>true</showInHeader> <headerPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </headerPicture> <headerHorizontalAlign>Left</headerHorizontalAlign> <showInFooter>true</showInFooter> @@ -66,7 +66,7 @@ <horizontalStretch>true</horizontalStretch> <verticalStretch>true</verticalStretch> <valuesPicture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </valuesPicture> <border xsi:type="core:BorderDef"> <style>Single</style> @@ -95,8 +95,8 @@ <value>Зашифрован</value> </toolTip> <extendedTooltip> - <name>ЗашифрованРасширеннаяПодсказка</name> - <id>172</id> + <name>ЗашифрованExtendedTooltip</name> + <id>162</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -146,8 +146,8 @@ <segments>Список.ИндексКартинки</segments> </dataPath> <extendedTooltip> - <name>КартинкаРасширеннаяПодсказка</name> - <id>175</id> + <name>КартинкаExtendedTooltip</name> + <id>164</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -196,8 +196,8 @@ <segments>Список.Description</segments> </dataPath> <extendedTooltip> - <name>НаименованиеРасширеннаяПодсказка</name> - <id>177</id> + <name>НаименованиеExtendedTooltip</name> + <id>165</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -230,8 +230,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КартинкаИНаименованиеРасширеннаяПодсказка</name> - <id>174</id> + <name>КартинкаИНаименованиеExtendedTooltip</name> + <id>163</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -258,8 +258,8 @@ <segments>Список.Описание</segments> </dataPath> <extendedTooltip> - <name>ОписаниеРасширеннаяПодсказка</name> - <id>179</id> + <name>ОписаниеExtendedTooltip</name> + <id>166</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -303,8 +303,8 @@ <segments>Список.ДатаСоздания</segments> </dataPath> <extendedTooltip> - <name>ДатаСозданияРасширеннаяПодсказка</name> - <id>181</id> + <name>ДатаСозданияExtendedTooltip</name> + <id>167</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -343,8 +343,8 @@ <segments>Список.Автор</segments> </dataPath> <extendedTooltip> - <name>АвторРасширеннаяПодсказка</name> - <id>183</id> + <name>АвторExtendedTooltip</name> + <id>168</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -381,8 +381,8 @@ <segments>Список.Редактирует</segments> </dataPath> <extendedTooltip> - <name>РедактируетРасширеннаяПодсказка</name> - <id>185</id> + <name>РедактируетExtendedTooltip</name> + <id>169</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -423,8 +423,8 @@ <segments>Список.ТекущаяВерсияРазмер</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияРазмерРасширеннаяПодсказка</name> - <id>187</id> + <name>ТекущаяВерсияРазмерExtendedTooltip</name> + <id>170</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -465,8 +465,8 @@ <segments>Список.ТекущаяВерсияАвтор</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияАвторРасширеннаяПодсказка</name> - <id>189</id> + <name>ТекущаяВерсияАвторExtendedTooltip</name> + <id>171</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -507,8 +507,8 @@ <segments>Список.ТекущаяВерсияДатаСоздания</segments> </dataPath> <extendedTooltip> - <name>ТекущаяВерсияДатаСозданияРасширеннаяПодсказка</name> - <id>191</id> + <name>ТекущаяВерсияДатаСозданияExtendedTooltip</name> + <id>172</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -545,8 +545,8 @@ <segments>Список.ХранитьВерсии</segments> </dataPath> <extendedTooltip> - <name>ХранитьВерсииРасширеннаяПодсказка</name> - <id>193</id> + <name>ХранитьВерсииExtendedTooltip</name> + <id>173</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -576,8 +576,8 @@ <segments>Список.РедактируетТекущийПользователь</segments> </dataPath> <extendedTooltip> - <name>РедактируетТекущийПользовательРасширеннаяПодсказка</name> - <id>195</id> + <name>РедактируетТекущийПользовательExtendedTooltip</name> + <id>174</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -607,8 +607,8 @@ <segments>Список.Ref</segments> </dataPath> <extendedTooltip> - <name>СсылкаРасширеннаяПодсказка</name> - <id>197</id> + <name>СсылкаExtendedTooltip</name> + <id>175</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -660,10 +660,10 @@ </handlers> <searchStringAddition> <name>СписокСтрокаПоиска</name> - <id>161</id> + <id>182</id> <extendedTooltip> <name>СписокСтрокаПоискаРасширеннаяПодсказка</name> - <id>163</id> + <id>184</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -673,7 +673,7 @@ </extendedTooltip> <contextMenu> <name>СписокСтрокаПоискаКонтекстноеМеню</name> - <id>162</id> + <id>183</id> <autoFill>true</autoFill> </contextMenu> <source>Список</source> @@ -683,10 +683,10 @@ </searchStringAddition> <viewStatusAddition> <name>СписокСостояниеПросмотра</name> - <id>164</id> + <id>185</id> <extendedTooltip> <name>СписокСостояниеПросмотраРасширеннаяПодсказка</name> - <id>166</id> + <id>187</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -696,7 +696,7 @@ </extendedTooltip> <contextMenu> <name>СписокСостояниеПросмотраКонтекстноеМеню</name> - <id>165</id> + <id>186</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -707,10 +707,10 @@ </viewStatusAddition> <searchControlAddition> <name>СписокУправлениеПоиском</name> - <id>167</id> + <id>188</id> <extendedTooltip> <name>СписокУправлениеПоискомРасширеннаяПодсказка</name> - <id>169</id> + <id>190</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -720,7 +720,7 @@ </extendedTooltip> <contextMenu> <name>СписокУправлениеПоискомКонтекстноеМеню</name> - <id>168</id> + <id>189</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -730,7 +730,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>СписокРасширеннаяПодсказка</name> + <name>СписокExtendedTooltip</name> <id>160</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -752,7 +752,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокОткрытьФайлРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокОткрытьФайлExtendedTooltip</name> <id>142</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -779,7 +779,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокРедактироватьРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокРедактироватьExtendedTooltip</name> <id>143</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -806,7 +806,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокЗакончитьРедактированиеРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокЗакончитьРедактированиеExtendedTooltip</name> <id>144</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -833,7 +833,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокЗанятьРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокЗанятьExtendedTooltip</name> <id>145</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -860,7 +860,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокСохранитьИзмененияРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокСохранитьИзмененияExtendedTooltip</name> <id>146</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -887,7 +887,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокОткрытьКаталогФайлаРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокОткрытьКаталогФайлаExtendedTooltip</name> <id>147</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -914,7 +914,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокСохранитьКакРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокСохранитьКакExtendedTooltip</name> <id>148</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -945,7 +945,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокОсвободитьРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокОсвободитьExtendedTooltip</name> <id>149</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -975,7 +975,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КонтекстноеМенюСписокИмпортФайловРасширеннаяПодсказка</name> + <name>КонтекстноеМенюСписокИмпортФайловExtendedTooltip</name> <id>151</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1006,7 +1006,7 @@ <value>Группа команд импорта</value> </toolTip> <extendedTooltip> - <name>ГруппаКомандИмпортаРасширеннаяПодсказка</name> + <name>ГруппаКомандИмпортаExtendedTooltip</name> <id>150</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1018,10 +1018,10 @@ <extInfo xsi:type="form:ButtonGroupExtInfo"/> </items> <items xsi:type="form:FormGroup"> - <name>ФормаЭЦПИШифрованиеКонтекстное</name> + <name>ФормаЭПИШифрованиеКонтекстное</name> <id>104</id> <items xsi:type="form:FormGroup"> - <name>ФормаГруппаЭЦПКонтекст</name> + <name>ФормаГруппаЭПКонтекст</name> <id>105</id> <items xsi:type="form:Button"> <name>ФормаПодписатьКонтекст</name> @@ -1032,7 +1032,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаПодписатьКонтекстРасширеннаяПодсказка</name> + <name>ФормаПодписатьКонтекстExtendedTooltip</name> <id>154</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1050,7 +1050,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ФормаДобавитьЭЦПИзФайлаКонтекст</name> + <name>ФормаДобавитьПодписьИзФайлаКонтекст</name> <id>108</id> <visible>true</visible> <enabled>true</enabled> @@ -1058,7 +1058,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаДобавитьЭЦПИзФайлаКонтекстРасширеннаяПодсказка</name> + <name>ФормаДобавитьПодписьИзФайлаКонтекстРасширеннаяПодсказка</name> <id>155</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1067,7 +1067,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ДобавитьЭЦПИзФайла</commandName> + <commandName>Form.Command.ДобавитьПодписьИзФайла</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -1076,7 +1076,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ФормаСохранитьВместеСЭЦПКонтекст</name> + <name>ФормаСохранитьВместеСПодписьюКонтекст</name> <id>109</id> <visible>true</visible> <enabled>true</enabled> @@ -1084,7 +1084,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСохранитьВместеСЭЦПКонтекстРасширеннаяПодсказка</name> + <name>ФормаСохранитьВместеСПодписьюКонтекстРасширеннаяПодсказка</name> <id>156</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1093,7 +1093,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.СохранитьВместеСЭЦП</commandName> + <commandName>Form.Command.СохранитьВместеСПодписью</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -1112,10 +1112,10 @@ ru - + Форма группа ЭП - ФормаГруппаЭЦПКонтекстРасширеннаяПодсказка + ФормаГруппаЭПКонтекстРасширеннаяПодсказка 153 Label true @@ -1138,7 +1138,7 @@ true - ФормаЗашифроватьКонтекстРасширеннаяПодсказка + ФормаЗашифроватьКонтекстExtendedTooltip 158 Label true @@ -1164,7 +1164,7 @@ true - ФормаРасшифроватьКонтекстРасширеннаяПодсказка + ФормаРасшифроватьКонтекстExtendedTooltip 159 Label true @@ -1195,7 +1195,7 @@ Форма группа шифрование - ФормаГруппаШифрованиеКонтекстРасширеннаяПодсказка + ФормаГруппаШифрованиеКонтекстExtendedTooltip 157 Label true @@ -1217,10 +1217,10 @@ ru - + Форма ЭПИШифрование - ФормаЭЦПИШифрованиеКонтекстноеРасширеннаяПодсказка + ФормаЭПИШифрованиеКонтекстноеРасширеннаяПодсказка 152 Label true @@ -1275,15 +1275,11 @@ ФормаКоманднаяПанель -1 - ГруппаКомандФайлов - 77 + ГруппаСоздать + 176 СоздатьФайл 47 - - <key>ru</key> - <value>Создать</value> - true true @@ -1291,7 +1287,7 @@ false - СоздатьФайлРасширеннаяПодсказка + СоздатьФайлExtendedTooltip 114 Label true @@ -1308,6 +1304,89 @@ UserCmds Auto + + СоздатьФайлИзШаблона + 178 + true + true + + true + + + СоздатьФайлИзШаблонаРасширеннаяПодсказка + 179 + Label + true + true + + Left + + + Form.Command.СоздатьФайлИзШаблона + Normal + Auto + true + true + UserCmds + Auto + + + СоздатьФайлСоСканера + 180 + true + true + + true + + + СоздатьФайлСоСканераРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + Form.Command.СоздатьФайлСоСканера + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Создать</value> + + + ГруппаСоздатьРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + Popup + + + StdPicture.CreateListItem + + Auto + Normal + + + + ГруппаКомандФайлов + 77 ОткрытьФайл 73 @@ -1318,7 +1397,7 @@ false - ОткрытьФайлРасширеннаяПодсказка + ОткрытьФайлExtendedTooltip 115 Label true @@ -1345,7 +1424,7 @@ false - РедактироватьРасширеннаяПодсказка + РедактироватьExtendedTooltip 116 Label true @@ -1372,7 +1451,7 @@ false - ЗакончитьРедактированиеРасширеннаяПодсказка + ЗакончитьРедактированиеExtendedTooltip 117 Label true @@ -1399,7 +1478,7 @@ false - ЗанятьРасширеннаяПодсказка + ЗанятьExtendedTooltip 118 Label true @@ -1427,7 +1506,7 @@ false - ОткрытьКаталогФайлаРасширеннаяПодсказка + ОткрытьКаталогФайлаExtendedTooltip 119 Label true @@ -1459,7 +1538,7 @@ false - ОсвободитьРасширеннаяПодсказка + ОсвободитьExtendedTooltip 120 Label true @@ -1487,7 +1566,7 @@ false - СохранитьИзмененияРасширеннаяПодсказка + СохранитьИзмененияExtendedTooltip 121 Label true @@ -1515,7 +1594,7 @@ false - СохранитьКакРасширеннаяПодсказка + СохранитьКакExtendedTooltip 122 Label true @@ -1543,7 +1622,7 @@ false - ИмпортФайловРасширеннаяПодсказка + ИмпортФайловExtendedTooltip 123 Label true @@ -1575,7 +1654,7 @@ Группа команд файлов - ГруппаКомандФайловРасширеннаяПодсказка + ГруппаКомандФайловExtendedTooltip 113 Label true @@ -1587,10 +1666,10 @@ - ФормаЭЦПИШифрование + ФормаЭПИШифрование 103 - ФормаГруппаЭЦП + ФормаГруппаЭП 95 ФормаПодписать @@ -1601,7 +1680,7 @@ true - ФормаПодписатьРасширеннаяПодсказка + ФормаПодписатьExtendedTooltip 126 Label true @@ -1619,7 +1698,7 @@ Auto - ФормаДобавитьЭЦПИзФайла + ФормаДобавитьПодписьИзФайла 99 true true @@ -1627,7 +1706,7 @@ true - ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + ФормаДобавитьПодписьИзФайлаРасширеннаяПодсказка 127 Label true @@ -1636,7 +1715,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьПодписьИзФайла Normal Auto true @@ -1645,7 +1724,7 @@ Auto - ФормаСохранитьВместеСЭЦП + ФормаСохранитьВместеСПодписью 102 true true @@ -1653,7 +1732,7 @@ true - ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + ФормаСохранитьВместеСПодписьюРасширеннаяПодсказка 128 Label true @@ -1662,7 +1741,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСПодписью Normal Auto true @@ -1681,10 +1760,10 @@ ru - + Форма группа ЭП - ФормаГруппаЭЦПРасширеннаяПодсказка + ФормаГруппаЭПРасширеннаяПодсказка 125 Label true @@ -1707,7 +1786,7 @@ true - ФормаЗашифроватьРасширеннаяПодсказка + ФормаЗашифроватьExtendedTooltip 130 Label true @@ -1733,7 +1812,7 @@ true - ФормаРасшифроватьРасширеннаяПодсказка + ФормаРасшифроватьExtendedTooltip 131 Label true @@ -1764,7 +1843,7 @@ Форма группа шифрование - ФормаГруппаШифрованиеРасширеннаяПодсказка + ФормаГруппаШифрованиеExtendedTooltip 129 Label true @@ -1786,10 +1865,10 @@ ru - + Форма ЭПИШифрование - ФормаЭЦПИШифрованиеРасширеннаяПодсказка + ФормаЭПИШифрованиеРасширеннаяПодсказка 124 Label true @@ -1814,7 +1893,7 @@ false - СкопироватьРасширеннаяПодсказка + СкопироватьExtendedTooltip 132 Label true @@ -1841,7 +1920,7 @@ false - ИзменитьРасширеннаяПодсказка + ИзменитьExtendedTooltip 133 Label true @@ -1868,7 +1947,7 @@ false - ПометитьНаУдаление_СнятьПометкуРасширеннаяПодсказка + ПометитьНаУдаление_СнятьПометкуExtendedTooltip 134 Label true @@ -1895,7 +1974,7 @@ false - НайтиРасширеннаяПодсказка + НайтиExtendedTooltip 135 Label true @@ -1923,7 +2002,7 @@ false - ОтменитьПоискРасширеннаяПодсказка + ОтменитьПоискExtendedTooltip 136 Label true @@ -1951,7 +2030,7 @@ false - НастройкаОтображенияДанныхРасширеннаяПодсказка + НастройкаОтображенияДанныхExtendedTooltip 137 Label true @@ -1979,7 +2058,7 @@ false - ВывестиСписокРасширеннаяПодсказка + ВывестиСписокExtendedTooltip 138 Label true @@ -2007,7 +2086,7 @@ false - ОбновитьРасширеннаяПодсказка + ОбновитьExtendedTooltip 139 Label true @@ -2035,7 +2114,7 @@ false - ИзменитьФормуРасширеннаяПодсказка + ИзменитьФормуExtendedTooltip 140 Label true @@ -2062,7 +2141,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 141 Label true @@ -2081,14 +2160,14 @@ Left - - ChoiceProcessing - ОбработкаВыбора - NotificationProcessing ОбработкаОповещения + + OnOpen + ПриОткрытии + OnCreateAtServer ПриСозданииНаСервере @@ -2118,6 +2197,9 @@ Список.Подписан + + Список.ПодписанЭЦП + Список.Ref @@ -2125,7 +2207,7 @@ Список.Зашифрован - Список.ПодписанЭЦП + Список.ПодписанЭП Список.Редактирует @@ -2162,7 +2244,7 @@ ИНАЧЕ ЛОЖЬ КОНЕЦ КАК РедактируетТекущийПользователь, Файлы.Зашифрован, - Файлы.ПодписанЭЦП + Файлы.ПодписанЭП ИЗ Справочник.Файлы КАК Файлы ГДЕ @@ -2197,19 +2279,16 @@ СоздатьФайл <key>ru</key> - <value>Создать файл</value> + <value>Из файла на диске...</value> 1 ru - Создать файл + Создать файл из файла на диске true - - StdPicture.AddListItem - СоздатьФайлВыполнить @@ -2447,25 +2526,21 @@ Auto - ДобавитьЭЦПИзФайла + ДобавитьПодписьИзФайла <key>ru</key> - <value>Добавить ЭП из файла</value> + <value>Добавить электронную подпись из файла</value> 11 - - ru - - true - ДобавитьЭЦПИзФайла + ДобавитьПодписьИзФайла - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -2484,14 +2559,14 @@ true - CommonPicture.ПодписанЭЦП + CommonPicture.ПодписанЭП Подписать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -2514,30 +2589,30 @@ Расшифровать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto - СохранитьВместеСЭЦП + СохранитьВместеСПодписью <key>ru</key> - <value>Сохранить вместе с ЭП</value> + <value>Сохранить вместе с электронной подписью</value> 15 ru - + Сохранить вместе с электронной подписью true - СохранитьВместеСЭЦП + СохранитьВместеСПодписью - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -2563,7 +2638,51 @@ Зашифровать - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи + Auto + Auto + + + СоздатьФайлИзШаблона + + <key>ru</key> + <value>Из шаблона...</value> + + 12 + + ru + Создать файл из шаблона + + + true + + + + СоздатьФайлИзШаблона + + + Auto + Auto + + + СоздатьФайлСоСканера + + <key>ru</key> + <value>Со сканера...</value> + + 17 + + ru + Создать файл со сканера + + + true + + + + СоздатьФайлСоСканера + + Auto Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl index 84dff2d23..15289b44c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаСпискаПрисоединенныхФайлов/Module.bsl @@ -1,6 +1,3 @@ -&НаКлиенте -Перем КонтекстВыбора; - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -11,22 +8,20 @@ Возврат; КонецЕсли; - Если Параметры.Свойство("ЗаголовокФормы") Тогда + Если Параметры.Свойство("ЗаголовокФормы") Тогда Заголовок = Параметры.ЗаголовокФормы; КонецЕсли; Если Параметры.Свойство("ВладелецФайла") Тогда - Список.Параметры.УстановитьЗначениеПараметра( - "Владелец", Параметры.ВладелецФайла); - КонецЕсли; - - Список.Параметры.УстановитьЗначениеПараметра( - "ТекущийПользователь", Пользователи.ТекущийПользователь()); - + Список.Параметры.УстановитьЗначениеПараметра("Владелец", Параметры.ВладелецФайла); + КонецЕсли; + + Список.Параметры.УстановитьЗначениеПараметра("ТекущийПользователь", Пользователи.ТекущийПользователь()); + РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); - Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() = Ложь Тогда - Элементы.ПодписанЭЦП.Видимость = Ложь; + Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеПодписиИШифрование() = Ложь Тогда + Элементы.ПодписанЭП.Видимость = Ложь; Элементы.Зашифрован.Видимость = Ложь; КонецЕсли; @@ -37,6 +32,11 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Элементы.СоздатьФайлСоСканера.Видимость = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); +КонецПроцедуры + &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) @@ -77,56 +77,22 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия") Тогда - - ДанныеФайла = КонтекстВыбора; - КонтекстВыбора = Неопределено; - Если ДанныеФайла = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - БольшеНеСпрашивать = ВыбранноеЗначение.БольшеНеСпрашивать; - Если БольшеНеСпрашивать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", Ложь); - КонецЕсли; - - КакОткрывать = ВыбранноеЗначение.КакОткрывать; - Если КакОткрывать = 1 Тогда - РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(ДанныеФайла, УникальныйИдентификатор); - ОповеститьОбИзменении(ДанныеФайла.Ссылка); - УстановитьДоступностьФайловыхКоманд(); - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор); - - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Список &НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; - КакОткрывать = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + КакОткрывать = ПерсональныеНастройки.ДействиеПоДвойномуЩелчкуМыши; Если КакОткрывать = "ОткрыватьКарточку" Тогда - ОткрытьЗначение(ВыбраннаяСтрока); + ПоказатьЗначение(, ВыбраннаяСтрока); Возврат; КонецЕсли; @@ -136,20 +102,26 @@ КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - ВыбраннаяСтрока, Неопределено, УникальныйИдентификатор, Неопределено, ПредыдущийАдресФайла); + ВыбраннаяСтрока, + Неопределено, + УникальныйИдентификатор, + Неопределено, + ПредыдущийАдресФайла); // Если уже занят для редактирования, то не спрашивать - сразу открывать Если ДанныеФайла.Редактирует.Пустая() Тогда - СпрашиватьРежимРедактированияПриОткрытииФайла = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().СпрашиватьРежимРедактированияПриОткрытииФайла; + СпрашиватьРежимРедактированияПриОткрытииФайла = ПерсональныеНастройки.СпрашиватьРежимРедактированияПриОткрытииФайла; Если СпрашиватьРежимРедактированияПриОткрытииФайла = Истина Тогда - КонтекстВыбора = ДанныеФайла; - ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , ЭтаФорма); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеВыбораРежимаОткрытия", ЭтотОбъект, ПараметрыОбработчика); + ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия", , ЭтотОбъект, , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); Возврат; КонецЕсли; КонецЕсли; - РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор); - + // Для просмотра. + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте @@ -161,40 +133,36 @@ Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) СтандартнаяОбработка = Ложь; - ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - ВладелецФайлаСписка = ВладелецФайла.Значение; - - Если ВладелецФайлаСписка.Пустая() Тогда + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + Если Не ЗначениеЗаполнено(ВладелецФайла) Тогда Возврат; КонецЕсли; - РаботаСФайламиКлиент.ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка, ЭтаФорма); + ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайла); КонецПроцедуры &НаКлиенте Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - + Отказ = Истина; ФайлОснование = Элементы.Список.ТекущаяСтрока; - Если Не Копирование Тогда - - Отказ = Истина; - Попытка - ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла.Значение, ЭтаФорма); - Исключение - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла( - ИнформацияОбОшибке())); - КонецПопытки; - + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; Иначе - - ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла.Значение, ФайлОснование); - Отказ = Истина; - + ВладелецФайла = ЗначениеПараметраКД.Значение; КонецЕсли; + Если Копирование Тогда + РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); + Иначе + РаботаСФайламиСлужебныйКлиент.ДобавитьФайл(Неопределено, ВладелецФайла, ЭтотОбъект); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -210,60 +178,68 @@ &НаКлиенте Процедура ЗакончитьРедактирование(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; + ДанныеФайла = Элементы.Список.ТекущиеДанные; - РаботаСФайламиКлиент.ЗакончитьРедактирование( - Элементы.Список.ТекущаяСтрока, + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеЗавершение", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением( + Обработчик, + ФайлСсылка, УникальныйИдентификатор, - Элементы.Список.ТекущиеДанные.ХранитьВерсии, - Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует); - - УстановитьДоступностьФайловыхКоманд(); + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует); КонецПроцедуры &НаКлиенте Процедура Занять(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; - РаботаСФайламиКлиент.Занять(Элементы.Список.ТекущаяСтрока); - - УстановитьДоступностьФайловыхКоманд(); + Обработчик = Новый ОписаниеОповещения("ЗанятьЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением( + Обработчик, + ФайлСсылка); КонецПроцедуры &НаКлиенте Процедура Освободить(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; + ДанныеФайла = Элементы.Список.ТекущиеДанные; - РаботаСФайламиКлиент.ОсвободитьФайл( - Элементы.Список.ТекущаяСтрока, - Элементы.Список.ТекущиеДанные.ХранитьВерсии, - Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует); - - УстановитьДоступностьФайловыхКоманд(); + Обработчик = Новый ОписаниеОповещения("ОсвободитьЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением( + Обработчик, + ФайлСсылка, + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует); КонецПроцедуры &НаКлиенте Процедура ОткрытьКаталогФайла(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, + ФайлСсылка, Неопределено, УникальныйИдентификатор, Неопределено, @@ -276,12 +252,13 @@ &НаКлиенте Процедура ОткрытьФайл(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, + ФайлСсылка, Неопределено, УникальныйИдентификатор, Неопределено, @@ -294,25 +271,27 @@ &НаКлиенте Процедура Редактировать(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; - РаботаСФайламиКлиент.Редактировать(Элементы.Список.ТекущаяСтрока); - - УстановитьДоступностьФайловыхКоманд(); + Обработчик = Новый ОписаниеОповещения("РедактироватьЗавершение", ЭтотОбъект); + РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, ФайлСсылка); КонецПроцедуры &НаКлиенте Процедура СохранитьИзменения(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; - РаботаСФайламиКлиент.ОпубликоватьФайл( - Элементы.Список.ТекущаяСтрока, + РаботаСФайламиСлужебныйКлиент.ОпубликоватьФайлСОповещением( + Неопределено, + ФайлСсылка, УникальныйИдентификатор); КонецПроцедуры @@ -320,239 +299,354 @@ &НаКлиенте Процедура СохранитьКак(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Элементы.Список.ТекущаяСтрока, + ФайлСсылка, Неопределено, УникальныйИдентификатор); - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры &НаКлиенте Процедура ИмпортФайлов(Команда) - - #Если Не ВебКлиент Тогда - МассивИменФайлов = ФайловыеФункцииСлужебныйКлиент.ПолучитьСписокИмпортируемыхФайлов(); - - Если МассивИменФайлов.Количество() > 0 Тогда - - ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра( - Новый ПараметрКомпоновкиДанных("Владелец")); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПапкаДляДобавления", ВладелецФайла.Значение); - ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыФормы); - КонецЕсли; - #Иначе - Предупреждение(НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. - |Используйте команду ""Создать"" в списке файлов.'")); + #Если ВебКлиент Тогда + ТекстПредупреждения = НСтр("ru = 'В Веб-клиенте импорт файлов не поддерживается. + |Используйте команду ""Создать"" в списке файлов.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; #КонецЕсли + МассивИменФайлов = ФайловыеФункцииСлужебныйКлиент.ПолучитьСписокИмпортируемыхФайлов(); + + Если МассивИменФайлов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", ВладелецФайла); + ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыФормы); КонецПроцедуры &НаКлиенте Процедура Подписать(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, Команды.Найти("Подписать").Заголовок); Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( - Элементы.Список.ТекущаяСтрока); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ФайлСсылка); - ДанныеПодписи = Неопределено; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); - Если РаботаСФайламиКлиент.СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи) Тогда - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи(ДанныеПодписи); - - Оповестить( - "Запись_Файл", - Новый Структура("Событие", "ПрисоединенныйФайлПодписан"), - ДанныеФайла.Владелец); - - ОповеститьОбИзменении(ДанныеФайла.Ссылка); - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ПодписатьЗавершение", ЭтотОбъект, ПараметрыОбработчика); - УстановитьДоступностьФайловыхКоманд(); + РаботаСФайламиСлужебныйКлиент.СформироватьПодписьФайла(Обработчик, ДанныеФайла); КонецПроцедуры &НаКлиенте Процедура Зашифровать(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, Команды.Найти("Зашифровать").Заголовок); Возврат; КонецЕсли; - ФайлСсылка = Элементы.Список.ТекущаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ФайлСсылка); - МассивДанныхДляЗанесенияВБазу = Новый Массив; - МассивОтпечатков = Новый Массив; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ФайлСсылка", ФайлСсылка); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьЗавершение", ЭтотОбъект, ПараметрыОбработчика); - ФайлЗашифрован = РаботаСФайламиКлиент.Зашифровать( - ДанныеФайла, - УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков); - - Если НЕ ФайлЗашифрован Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - Зашифровать = Истина; - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ФайлСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - - РаботаСФайламиКлиент.ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, - ДанныеФайла.Владелец, ФайлСсылка); - - УстановитьДоступностьФайловыхКоманд(); + РаботаСФайламиСлужебныйКлиент.Зашифровать(Обработчик, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура Расшифровать(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; - ОбъектСсылка = Элементы.Список.ТекущаяСтрока; + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ФайлСсылка); - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий( - Элементы.Список.ТекущаяСтрока); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ФайлСсылка", ФайлСсылка); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("РасшифроватьЗавершение", ЭтотОбъект, ПараметрыОбработчика); - МассивДанныхДляЗанесенияВБазу = Новый Массив; - - ФайлРасшифрован = РаботаСФайламиКлиент.Расшифровать( - ДанныеФайла, + РаботаСФайламиСлужебныйКлиент.Расшифровать( + Обработчик, + ДанныеФайла.Ссылка, УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу); - - Если НЕ ФайлРасшифрован Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - - РаботаСФайламиКлиент.ИнформироватьОРасшифровке( - ДанныеФайла.Владелец, ОбъектСсылка); - - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьЭЦПИзФайла(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( - Элементы.Список.ТекущаяСтрока); - - РаботаСФайламиКлиент.ДобавитьЭЦПИзФайла(ДанныеФайла); - - УстановитьДоступностьФайловыхКоманд(); + ДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура СохранитьВместеСЭЦП(Команда) +Процедура ДобавитьПодписьИзФайла(Команда) - Если Не ФайловыеКомандыДоступны() Тогда + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда Возврат; КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Элементы.Список.ТекущаяСтрока); + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ФайлСсылка); - РаботаСФайламиКлиент.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаЗавершение", ЭтотОбъект); - УстановитьДоступностьФайловыхКоманд(); + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла(Обработчик, ДанныеФайла); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСПодписью(Команда) + + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения(ФайлСсылка); + + Обработчик = Новый ОписаниеОповещения("СохранитьВместеСПодписьюЗавершение", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.СохранитьСПодписью(Обработчик, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура СоздатьФайлВыполнить() - Попытка - ВладелецФайла = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); - РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла.Значение, ЭтаФорма); - Исключение - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла( - ИнформацияОбОшибке())); - КонецПопытки; + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + Если ПодключитьРасширениеРаботыСФайлами() Тогда + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); + Иначе + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыБезРасширения(ПараметрыДобавления); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлИзШаблона(Команда) + + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьНаОсновеШаблона(ПараметрыДобавления); + +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьФайлСоСканера(Команда) + + ЗначениеПараметраКД = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Владелец")); + Если ЗначениеПараметраКД = Неопределено Тогда + ВладелецФайла = Неопределено; + Иначе + ВладелецФайла = ЗначениеПараметраКД.Значение; + КонецЕсли; + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьСоСканера(ПараметрыДобавления); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура СписокВыборПослеВыбораРежимаОткрытия(Результат, ПараметрыВыполнения) Экспорт + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если Результат.КакОткрывать = 1 Тогда + // Для редактирования. + Обработчик = Новый ОписаниеОповещения("СписокВыборПослеРедактирования", ЭтотОбъект, ПараметрыВыполнения); + РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); + Возврат; + КонецЕсли; + + // Для просмотра. + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ПараметрыВыполнения.ДанныеФайла, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура СписокВыборПослеРедактирования(Результат, ПараметрыВыполнения) Экспорт + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗанятьЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ОсвободитьЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура РедактироватьЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат.Успех = Истина Тогда + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи(Результат.ДанныеПодписи); + ОповещениеПараметр = Новый Структура("Событие", "ПрисоединенныйФайлПодписан"); + Оповестить("Запись_Файл", ОповещениеПараметр, ПараметрыВыполнения.ДанныеФайла.Владелец); + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + КонецЕсли; + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат.Успех <> Истина Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ПараметрыВыполнения.ФайлСсылка, + Истина, // Зашифровать + Результат.МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + МассивФайловВРабочемКаталогеДляУдаления, + Результат.МассивОтпечатков); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ФайлСсылка); + + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура РасшифроватьЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат.Успех <> Истина Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( + ПараметрыВыполнения.ФайлСсылка, + Ложь, // Зашифровать + Результат.МассивДанныхДляЗанесенияВБазу, + Неопределено, // УникальныйИдентификатор + ИмяРабочегоКаталога, + Новый Массив, // МассивФайловВРабочемКаталогеДляУдаления + Новый Массив); // МассивОтпечатков + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ФайлСсылка); + + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьПодписьИзФайлаЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьВместеСПодписьюЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактированиеЗавершение(Результат, ПараметрыВыполнения) Экспорт + УстановитьДоступностьФайловыхКоманд(); +КонецПроцедуры + &НаКлиенте Процедура УстановитьДоступностьФайловыхКоманд() - Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда - - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - - УстановитьДоступностьКоманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует, Элементы.Список.ТекущиеДанные.ПодписанЭЦП, - Элементы.Список.ТекущиеДанные.Зашифрован); - - КонецЕсли; - + ФайлСсылка = Элементы.Список.ТекущаяСтрока; + Если Не ФайловыеКомандыДоступны(ФайлСсылка) Тогда + Возврат; КонецЕсли; + ДанныеФайла = Элементы.Список.ТекущиеДанные; + + УстановитьДоступностьКоманд( + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + ДанныеФайла.ПодписанЭП, + ДанныеФайла.Зашифрован); КонецПроцедуры &НаКлиенте -Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, ПодписанЭЦП, Зашифрован) +Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, ПодписанЭП, Зашифрован) Элементы.ЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; @@ -563,17 +657,17 @@ Элементы.Освободить.Доступность = Не Редактирует.Пустая(); Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокОсвободить.Доступность = Не Редактирует.Пустая(); - Элементы.Занять.Доступность = Редактирует.Пустая() И НЕ (ПодписанЭЦП ИЛИ Зашифрован); - Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗанять.Доступность = Редактирует.Пустая() И НЕ (ПодписанЭЦП ИЛИ Зашифрован); + Элементы.Занять.Доступность = Редактирует.Пустая() И НЕ (ПодписанЭП ИЛИ Зашифрован); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокЗанять.Доступность = Редактирует.Пустая() И НЕ (ПодписанЭП ИЛИ Зашифрован); - Элементы.Редактировать.Доступность = НЕ (ПодписанЭЦП ИЛИ Зашифрован); - Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокРедактировать.Доступность = НЕ (ПодписанЭЦП ИЛИ Зашифрован); + Элементы.Редактировать.Доступность = НЕ (ПодписанЭП ИЛИ Зашифрован); + Элементы.СписокКонтекстноеМеню.ПодчиненныеЭлементы.КонтекстноеМенюСписокРедактировать.Доступность = НЕ (ПодписанЭП ИЛИ Зашифрован); Элементы.ФормаПодписать.Доступность = Редактирует.Пустая(); Элементы.ФормаПодписатьКонтекст.Доступность = Редактирует.Пустая(); - Элементы.ФормаСохранитьВместеСЭЦП.Доступность = ПодписанЭЦП; - Элементы.ФормаСохранитьВместеСЭЦПКонтекст.Доступность = ПодписанЭЦП; + Элементы.ФормаСохранитьВместеСПодписью.Доступность = ПодписанЭП; + Элементы.ФормаСохранитьВместеСПодписьюКонтекст.Доступность = ПодписанЭП; Элементы.ФормаЗашифровать.Доступность = Редактирует.Пустая() И НЕ Зашифрован; Элементы.ФормаЗашифроватьКонтекст.Доступность = Редактирует.Пустая() И НЕ Зашифрован; @@ -583,18 +677,116 @@ КонецПроцедуры -// Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка &НаКлиенте -Функция ФайловыеКомандыДоступны() +Функция ФайловыеКомандыДоступны(ФайлСсылка) + // Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка - Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда + Если ФайлСсылка = Неопределено Тогда Возврат Ложь; КонецЕсли; - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Если ТипЗнч(ФайлСсылка) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда Возврат Ложь; КонецЕсли; Возврат Истина; КонецФункции + +&НаКлиенте +Процедура ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка) + // Обработчик события Перетаскивание в формах объектов - владельцев Файл (кроме формы Файлы) + // + // Параметры + // ПараметрыПеретаскивания - Параметры перетаскивания + // ВладелецФайлаСписка - ЛюбаяСсылка - владелец файла + + Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПараметрыПеретаскивания.Значение.ПолноеИмя); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайлаСписка); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Неопределено); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Неопределено); + РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления); + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Ложь Тогда + + ПоказатьПредупреждение(, НСтр("ru = 'Выберите только файлы без каталогов.'")); + Возврат; + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("СправочникСсылка.Файлы") Тогда + + РаботаСФайламиСлужебныйКлиент.ПеренестиФайлВПриложенныеФайлы( + ПараметрыПеретаскивания.Значение, + ВладелецФайлаСписка); + + ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда + Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ТипПеретаскиваемого = ТипЗнч(ПараметрыПеретаскивания.Значение[0]); + Если ТипПеретаскиваемого = Тип("СправочникСсылка.Файлы") Тогда + РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПриложенныеФайлы( + ПараметрыПеретаскивания.Значение, + ВладелецФайлаСписка); + Возврат; + КонецЕсли; + + Если ТипПеретаскиваемого <> Тип("Файл") Тогда + ПоказатьПредупреждение(, Нстр("ru = 'Выберите файлы.'")); + Возврат; + КонецЕсли; + + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + Если Не ФайлПринятый.ЭтоФайл() Тогда // только файлы, но не каталоги + ПоказатьПредупреждение(, Нстр("ru = 'Выберите только файлы без каталогов.'")); + Возврат; + КонецЕсли; + КонецЦикла; + + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ОбработчикРезультата", Неопределено); + ПараметрыДобавления.Вставить("ПолноеИмяФайла", Неопределено); + ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайлаСписка); + ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект); + ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", Неопределено); + ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина); + + ТекстыОшибок = Новый Массив; + + Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл + ПараметрыДобавления.ПолноеИмяФайла = ФайлПринятый.ПолноеИмя; + Результат = РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыДобавления); + Если Не Результат.ФайлДобавлен И ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда + ТекстыОшибок.Добавить(Результат.ТекстОшибки); + КонецЕсли; + КонецЦикла; + + // Вывод ошибок. + КоличествоОшибок = ТекстыОшибок.Количество(); + Если КоличествоОшибок > 0 Тогда + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); + Результат.ВыводПредупреждения.Использование = Истина; + Если КоличествоОшибок = 1 Тогда + Результат.ВыводПредупреждения.Текст = ТекстыОшибок[0]; + Иначе + КраткийТекстВсехОшибок = СтрЗаменить(НСтр("ru = 'При выполнении возникли ошибки (%1).'"), "%1", Строка(КоличествоОшибок)); + ПолныйТекстВсехОшибок = ""; + Для Каждого ТекстОшибки Из ТекстыОшибок Цикл + Если ПолныйТекстВсехОшибок <> "" Тогда + ПолныйТекстВсехОшибок = ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС; + КонецЕсли; + ПолныйТекстВсехОшибок = ПолныйТекстВсехОшибок + ТекстОшибки; + КонецЦикла; + Результат.ВыводПредупреждения.Текст = КраткийТекстВсехОшибок; + Результат.ВыводПредупреждения.ТекстОшибок = ПолныйТекстВсехОшибок; + КонецЕсли; + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтотОбъект, Результат); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form index c2946447f..b9d00fff6 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Form.form @@ -28,7 +28,7 @@ ПапкаДляЭкспортаПриИзменении - ПапкаДляЭкспортаРасширеннаяПодсказка + ПапкаДляЭкспортаExtendedTooltip 36 Label true @@ -76,7 +76,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 35 Label true @@ -108,8 +108,8 @@ false - ВыгрузитьРасширеннаяПодсказка - 39 + ВыгрузитьExtendedTooltip + 38 Label true true @@ -117,7 +117,7 @@ Left - Form.Command.Экспорт + Form.Command.СохранитьПапку Auto true true @@ -135,8 +135,8 @@ false - ОтменаРасширеннаяПодсказка - 40 + ОтменаExtendedTooltip + 39 Label true true @@ -162,8 +162,8 @@ false - СправкаРасширеннаяПодсказка - 41 + СправкаExtendedTooltip + 40 Label true true @@ -193,8 +193,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 38 + КоманднаяПанельExtendedTooltip + 37 Label true true @@ -221,7 +221,7 @@ OnCreateAtServer - ПриСоздании + ПриСозданииНаСервере 50 LockOwner @@ -483,22 +483,22 @@ - Экспорт + СохранитьПапку <key>ru</key> - <value>Экспорт</value> + <value>Сохранить папку</value> 1 ru - Экспорт + Сохранить папку true - ВыгрузитьВыполнить + СохранитьПапку Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html index cd99b86b0..1e61251ba 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Help/ru.html @@ -1,3 +1,3 @@ - +

          Сохранение папки

          Команда "Сохранить папку..." позволяет скопировать выбранную папку с файлами из информационной базы на жесткий диск. При этом копируются только активные версии файлов.

          \ No newline at end of file diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl index 5371ced27..219e2c186 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭкспортаПапки/Module.bsl @@ -2,8 +2,7 @@ // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ &НаСервере -Процедура ПриСоздании(Отказ, СтандартнаяОбработка) - +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. Возврат; КонецЕсли; @@ -12,20 +11,14 @@ ЧтоСохраняем = Параметры.ПапкаЭкспорта; КонецЕсли; - РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( - "ЭЦП", "РасширениеДляЗашифрованныхФайлов"); - - Если ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда - РасширениеДляЗашифрованныхФайлов = "p7m"; - КонецЕсли; - + РасширениеДляЗашифрованныхФайлов = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляЗашифрованныхФайлов; КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) #Если ВебКлиент Тогда - Предупреждение(НСтр("ru = 'В Веб-клиенте экспорт каталогов не поддерживается.'")); + ПоказатьПредупреждение(, НСтр("ru = 'В Веб-клиенте экспорт каталогов не поддерживается.'")); Отказ = Истина; Возврат; #КонецЕсли @@ -45,21 +38,23 @@ &НаКлиенте Процедура ПапкаДляЭкспортаОткрытие(Элемент, СтандартнаяОбработка) - #Если НЕ ВебКлиент Тогда - - // Здесь откроем папку для просмотра - вдруг что-то сделать понадобиться - СтандартнаяОбработка = Ложь; - Если Не ПустаяСтрока(ПапкаДляЭкспорта) Тогда - Файл = Новый Файл(ПапкаДляЭкспорта); - Если Файл.Существует() Тогда - ЗапуститьПриложение(ПапкаДляЭкспорта); - Иначе - Предупреждение(НСтр("ru = 'Невозможно открыть папку выгрузки. - |Возможно, папка еще не создана.'")); - КонецЕсли; - КонецЕсли; - + #Если ВебКлиент Тогда + Возврат; #КонецЕсли + + // Здесь откроем папку для просмотра - вдруг что-то сделать понадобиться + СтандартнаяОбработка = Ложь; + Если Не ПустаяСтрока(ПапкаДляЭкспорта) Тогда + Файл = Новый Файл(ПапкаДляЭкспорта); + Если Не Файл.Существует() Тогда + ТекстПредупреждения = НСтр("ru = 'Невозможно открыть папку выгрузки. + |Возможно, папка еще не создана.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); + Возврат; + КонецЕсли; + ЗапуститьПриложение(ПапкаДляЭкспорта); + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -75,8 +70,9 @@ &НаКлиенте Процедура ПапкаДляЭкспортаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - -#Если НЕ ВебКлиент Тогда + #Если ВебКлиент Тогда + Возврат; + #КонецЕсли // Открытие окна выбора папки сохранения. СтандартнаяОбработка = Ложь; @@ -93,8 +89,6 @@ + ОбщегоНазначенияКлиентСервер.РазделительПути(); КонецЕсли; - -#КонецЕсли КонецПроцедуры @@ -102,66 +96,56 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ВыгрузитьВыполнить() - #Если НЕ ВебКлиент Тогда - // Проверим - каталог выгрузки существует? если нет - создадим - КаталогВыгрузки = Новый Файл(ПапкаДляЭкспортаПолная); +Процедура СохранитьПапку() + #Если ВебКлиент Тогда + Возврат; + #КонецЕсли + + // Проверим - каталог выгрузки существует? если нет - создадим + КаталогВыгрузки = Новый Файл(ПапкаДляЭкспортаПолная); + + Если Не КаталогВыгрузки.Существует() Тогда - Если не КаталогВыгрузки.Существует() Тогда - - Попытка - - СоздатьКаталог(ПапкаДляЭкспортаПолная); - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось создать папку выгрузки. - | - |%1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке) )); - Возврат; - - КонецПопытки; - + ТекстОшибки = ""; + Попытка + СоздатьКаталог(ПапкаДляЭкспортаПолная); + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось создать папку выгрузки:'"); + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + Если ТекстОшибки <> "" Тогда + ПоказатьПредупреждение(, ТекстОшибки); + Возврат; КонецЕсли; + КонецЕсли; + + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется экспорт папки ""%1""... + |Пожалуйста, подождите.'"), + Строка(ЧтоСохраняем) )); + + // Получим список выгружаемых файлов + СформироватьДеревоФайлов(ЧтоСохраняем); + + // А теперь начнем выгрузку + Обработчик = Новый ОписаниеОповещения("ВыгрузитьЗавершение", ЭтотОбъект); + ОбойтиДеревоФайлов(Обработчик, ДеревоФайлов, ПапкаДляЭкспортаПолная, ЧтоСохраняем, Неопределено); +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат.Успех = Истина Тогда + СохраняемыйПуть = ПапкаДляЭкспорта; + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", СохраняемыйПуть); + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется экспорт папки ""%1""... - |Пожалуйста, подождите.'"), - Строка(ЧтоСохраняем) )); + НСтр("ru = 'Успешно завершен экспорт папки ""%1"" + |в каталог на диске ""%2"".'"), + Строка(ЧтоСохраняем), Строка(ПапкаДляЭкспорта) ) ); - // Получим список выгружаемых файлов - СформироватьДеревоФайлов(ЧтоСохраняем); - - // Заранее создадим форму, чтобы потом не тратить на это время - ФормаВопроса = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуЭкспортаПапкиФайлСуществует(); - - // А теперь начнем выгрузку - ЕщеНеВстретилиВыгружаемуюПапку = Истина; - Успех = ОбойтиДеревоФайлов( - ФормаВопроса, - ДеревоФайлов, - ПапкаДляЭкспортаПолная, - Ложь, - "", - ЕщеНеВстретилиВыгружаемуюПапку, - ЧтоСохраняем); - - Если Успех Тогда - СохраняемыйПуть = ПапкаДляЭкспорта; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ИмяПапкиВыгрузки", "ИмяПапкиВыгрузки", СохраняемыйПуть); - - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Успешно завершен экспорт папки ""%1"" - |в каталог на диске ""%2"".'"), - Строка(ЧтоСохраняем), Строка(ПапкаДляЭкспорта) ) ); - - Закрыть(); - - КонецЕсли; - #КонецЕсли + Закрыть(); + КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -195,329 +179,536 @@ ЗначениеВРеквизитФормы(ТаблицаВыгрузки, "ДеревоФайлов"); КонецПроцедуры -// Рекурсивная функция, которая собственно и выгружает файлы на локальный диск -// -// Параметры: -// ФормаВопроса - объект типа "УправляемаяФорма", который содержит ссылку на -// созданную в памяти форму вопроса о перезаписи файла с флажком -// "Для всех". Создается для того, чтобы не тратить время на -// регулярное создание формы внутри рекурсивного цикла. -// ТаблицаФайлов - дерево значений с выгружаемыми файлами. -// БазовыйКаталогСохранения - строка с именем папки, в которую сохраняются файлы. -// В ней воссоздается структура папок (как в дереве файлов) -// при необходимости. -// ДляВсехФайлов - тип Булево -// Истина: пользователь выбрал действие при перезаписи файла и -// установил флажок "Для всех". Больше вопросов не задаем. -// Ложь: в каждом случае существования файла на диске, с тем же -// именем, что и в информационной базе будем задавать вопрос. -// БазовоеДействия - тип КодВозвратаДиалога -// при выполнении одного действия для всех конфликтов при -// записи файла (параметр ДляВсехФайлов = Истина) выполняется -// действие, заданное этим параметром). -// .Да - перезаписать -// .Пропустить - пропустить файл -// .Прервать - прервать выгрузку -// -// Возвращаемое значение: -// Истина - можно продолжать выгрузку / выгрузка завершена успешно -// Ложь - действие завершено с ошибками / выгрузка завершена с ошибками &НаКлиенте -Функция ОбойтиДеревоФайлов(ФормаВопроса, - ТаблицаФайлов, - Знач БазовыйКаталогСохранения, - ДляВсехФайлов, - БазовоеДействие, - ЕщеНеВстретилиВыгружаемуюПапку, - РодительскаяПапка) +Процедура ОбойтиДеревоФайлов(ОбработчикРезультата, ТаблицаФайлов, БазовыйКаталогСохранения, РодительскаяПапка, ОбщиеПараметры) + // Рекурсивная функция, которая собственно и выгружает файлы на локальный диск + // + // Параметры: + // ОбработчикРезультата - ОписаниеОповещения, Структура, Неопределено - Описание процедуры, принимающей результат работы метода. + // ТаблицаФайлов - ДанныеФормыДерево, ДанныеФормыЭлементДерева - дерево значений с выгружаемыми файлами. + // БазовыйКаталогСохранения - Строка - строка с именем папки, в которую сохраняются файлы. + // В ней воссоздается структура папок (как в дереве файлов) + // при необходимости. + // РодительскаяПапка - СправочникСсылка.ПапкиФайлов - что сохраняем. + // ОбщиеПараметры - Структура - + // * ФормаВопроса - УправляемаяФорма- Объект, который содержит ссылку на + // созданную в памяти форму вопроса о перезаписи файла с флажком + // "Для всех". Создается для того, чтобы не тратить время на + // регулярное создание формы внутри рекурсивного цикла. + // * ДляВсехФайлов - Булево - + // Истина: пользователь выбрал действие при перезаписи файла и + // установил флажок "Для всех". Больше вопросов не задаем. + // Ложь: в каждом случае существования файла на диске, с тем же + // именем, что и в информационной базе будем задавать вопрос. + // * БазовоеДействие - КодВозвратаДиалога - + // при выполнении одного действия для всех конфликтов при + // записи файла (параметр ДляВсехФайлов = Истина) выполняется + // действие, заданное этим параметром). + // .Да - перезаписать + // .Пропустить - пропустить файл + // .Прервать - прервать выгрузку + // + // Возвращаемое значение: + // Структура - Результат. + // * Успех - Булево - Истина - можно продолжать выгрузку / выгрузка завершена успешно. + // Ложь - действие завершено с ошибками / выгрузка завершена с ошибками. + // - #Если НЕ ВебКлиент Тогда + Если ОбщиеПараметры = Неопределено Тогда + ОбщиеПараметры = Новый Структура; + ОбщиеПараметры.Вставить("ФормаВопроса", РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаЭкспортаПапкиФайлСуществует()); + ОбщиеПараметры.Вставить("БазовоеДействие", КодВозвратаДиалога.Пропустить); + ОбщиеПараметры.Вставить("ДляВсехФайлов", Ложь); + ОбщиеПараметры.Вставить("ЕщеНеВстретилиВыгружаемуюПапку", Истина); + КонецЕсли; - Если БазовоеДействие = "" Тогда - // По умолчанию сделаем минимальный вред - БазовоеДействие = КодВозвратаДиалога.Пропустить; + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ТаблицаФайлов", ТаблицаФайлов); + ПараметрыВыполнения.Вставить("БазовыйКаталогСохранения", БазовыйКаталогСохранения); + ПараметрыВыполнения.Вставить("РодительскаяПапка", РодительскаяПапка); + ПараметрыВыполнения.Вставить("ОбщиеПараметры", ОбщиеПараметры); + + // Параметры результата. + ПараметрыВыполнения.Вставить("Успех", Ложь); + + // Параметры для цикла. + ПараметрыВыполнения.Вставить("Элементы", ПараметрыВыполнения.ТаблицаФайлов.ПолучитьЭлементы()); + ПараметрыВыполнения.Вставить("ВГраница", ПараметрыВыполнения.Элементы.Количество()-1); + ПараметрыВыполнения.Вставить("Индекс", -1); + ПараметрыВыполнения.Вставить("ТребуетсяЗапускЦикла", Истина); + РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОписаниеОбработчика( + ПараметрыВыполнения, + ЭтотОбъект, + "ОбойтиДеревоФайлов2"); + + // Переменные. + ПараметрыВыполнения.Вставить("ЗаписьФайла", Неопределено); + + // Запуск цикла. + ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения) + Если ПараметрыВыполнения.ТребуетсяЗапускЦикла Тогда + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Был открыт еще один диалог - перезапуск цикла не нужен. + КонецЕсли; + ПараметрыВыполнения.Индекс = ПараметрыВыполнения.Индекс + 1; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; + Иначе + Возврат; // Цикл уже запущен. + КонецЕсли; + + Для Индекс = ПараметрыВыполнения.Индекс По ПараметрыВыполнения.ВГраница Цикл + ПараметрыВыполнения.ЗаписьФайла = ПараметрыВыполнения.Элементы[Индекс]; + ПараметрыВыполнения.Индекс = Индекс; + ОбойтиДеревоФайлов1(ПараметрыВыполнения); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. + КонецЕсли; + КонецЦикла; + + ПараметрыВыполнения.Успех = Истина; + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов1(ПараметрыВыполнения) + Если ПараметрыВыполнения.ОбщиеПараметры.ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда + Если ПараметрыВыполнения.ЗаписьФайла.Папка = ЧтоСохраняем Тогда + ПараметрыВыполнения.ОбщиеПараметры.ЕщеНеВстретилиВыгружаемуюПапку = Ложь; + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ОбщиеПараметры.ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда + + РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОписаниеОбработчика( + ПараметрыВыполнения, + ЭтотОбъект, + "ОбойтиДеревоФайлов2"); + + ОбойтиДеревоФайлов( + ПараметрыВыполнения, + ПараметрыВыполнения.ЗаписьФайла, + ПараметрыВыполнения.БазовыйКаталогСохранения, + ПараметрыВыполнения.ЗаписьФайла.Папка, + ПараметрыВыполнения.ОбщиеПараметры); + + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. КонецЕсли; - Для Каждого ЗаписьФайла из ТаблицаФайлов.ПолучитьЭлементы() Цикл - - Если ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда - Если ЗаписьФайла.Папка = ЧтоСохраняем Тогда - ЕщеНеВстретилиВыгружаемуюПапку = Ложь; - КонецЕсли; - КонецЕсли; - - Если ЕщеНеВстретилиВыгружаемуюПапку = Истина Тогда - - Успех = ОбойтиДеревоФайлов( - ФормаВопроса, - ЗаписьФайла, - БазовыйКаталогСохранения, - ДляВсехФайлов, - БазовоеДействие, - ЕщеНеВстретилиВыгружаемуюПапку, - ЗаписьФайла.Папка); - - Если Не Успех Тогда - Возврат Ложь; - КонецЕсли; - - Продолжить; - КонецЕсли; - - // Сформируем путь к каталогу и пойдем дальше. Создавать каталоги будем - БазовыйКаталогСохраненияФайла = БазовыйКаталогСохранения; - Если (ЗаписьФайла.Папка <> ЧтоСохраняем) И ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда - - Если РодительскаяПапка <> ЗаписьФайла.Папка Тогда - БазовыйКаталогСохраненияФайла = БазовыйКаталогСохраненияФайла - + ЗаписьФайла.НаименованиеПапки - + ОбщегоНазначенияКлиентСервер.РазделительПути(); - КонецЕсли; - КонецЕсли; - - // Проверим наличие базового каталога: если нет - создадим - Папка = Новый Файл(БазовыйКаталогСохраненияФайла); - Если Не Папка.Существует() Тогда - Пока Истина Цикл - Попытка - СоздатьКаталог(БазовыйКаталогСохраненияФайла); - Прервать; - Исключение - // По какой-то причине каталог не создан. - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка создания папки ""%1"". - |%2'"), - БазовыйКаталогСохраненияФайла, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); - Если Ответ = КодВозвратаДиалога.Прервать Тогда - // Просто выйдем с ошибкой - Возврат Ложь; - ИначеЕсли Ответ = КодВозвратаДиалога.Пропустить Тогда - // Пропустим данную ветку дерева и пойдем дальше - Возврат Истина; - Иначе - // Попробуем повторить создание папки - Продолжить; - КонецЕсли; - КонецПопытки; - КонецЦикла; - КонецЕсли; - - - // только в том случае, если в этой папке есть хоть один файл - ДочерниеЭлементы = ЗаписьФайла.ПолучитьЭлементы(); - Если ДочерниеЭлементы.Количество() <> 0 Тогда - имяГруппы = БазовыйКаталогСохраненияФайла; - - Успех = ОбойтиДеревоФайлов( - ФормаВопроса, - ЗаписьФайла, - имяГруппы, - ДляВсехФайлов, - БазовоеДействие, - ЕщеНеВстретилиВыгружаемуюПапку, - ЗаписьФайла.Папка); - - Если Не Успех Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - Если ЗаписьФайла.ТекущаяВерсия <> NULL и ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда - // Это элемент справочника Файлы без файла - пропустим - Продолжить; - КонецЕсли; - - // Пишем файл в базовый каталог - ИмяФайлаСРасширением = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ЗаписьФайла.ПолноеНаименование, ЗаписьФайла.Расширение); - - Если ЗаписьФайла.Зашифрован Тогда - ИмяФайлаСРасширением = ИмяФайлаСРасширением + "." + РасширениеДляЗашифрованныхФайлов; - КонецЕсли; - ПолноеИмяФайла = БазовыйКаталогСохраненияФайла + ИмяФайлаСРасширением; - - // Проверка возможности записи файла - Результат = КодВозвратаДиалога.Отмена; - Пока Истина Цикл - ФайлНаДиске = Новый Файл(ПолноеИмяФайла); - Если ФайлНаДиске.Существует() и ФайлНаДиске.ЭтоКаталог() Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вместо файла - |""%1"" - |существует папка с таким же именем. - | - |Повторить экспорт этого файла?'"), - ПолноеИмяФайла); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена, ,КодВозвратаДиалога.Отмена); - Если Ответ = КодВозвратаДиалога.Повторить Тогда - // Данный файл игнорируем - Продолжить; - КонецЕсли; - Иначе - - // Файла нет - идем дальше - Результат = КодВозвратаДиалога.Повторить; - КонецЕсли; - Прервать; - КонецЦикла; - Если Результат = КодВозвратаДиалога.Отмена Тогда - - // Игнорируем файл с именем как у папки - Продолжить; - КонецЕсли; - Результат = КодВозвратаДиалога.Нет; - - // Спросим, а что делать с текущим файлом - Если ФайлНаДиске.Существует() Тогда - - // Если у файла стоит R|O и время изменения меньше, чем в информационной базе - просто перепишем - Если ФайлНаДиске.ПолучитьТолькоЧтение() - И ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения() <= ЗаписьФайла.ДатаМодификацииУниверсальная Тогда - - Результат = КодВозвратаДиалога.Да; - Иначе - Если Не ДляВсехФайлов Тогда - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В папке ""%1"" - |существует файл ""%2"" - |размер существующего файла = %3 байт, дата изменения %4. - |размер сохраняемого файла = %5 байт, дата изменения %6. - | - |Заменить существующий файл файлом из хранилища файлов?'"), - БазовыйКаталогСохраненияФайла, - ИмяФайлаСРасширением, - ФайлНаДиске.Размер(), - МестноеВремя(ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения()), - ЗаписьФайла.Размер, - МестноеВремя(ЗаписьФайла.ДатаМодификацииУниверсальная)); - - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ТекстСообщения", Текст); - СтруктураПараметров.Вставить("ПрименитьДляВсех", ДляВсехФайлов); - СтруктураПараметров.Вставить("БазовоеДействие", БазовоеДействие); - - ФормаВопроса.УстановитьПараметрыИспользования(СтруктураПараметров); - - // Да - перезаписать - // Пропустить - пропустить файл - // Прервать - прервать выгрузку - РезультатДиалога = ФормаВопроса.ОткрытьМодально(); - Результат = РезультатДиалога.КодВозврата; - ДляВсехФайлов = РезультатДиалога.ПрименитьДляВсех; - БазовоеДействие = Результат; - Иначе - Результат = БазовоеДействие; - КонецЕсли; - Если Результат = КодВозвратаДиалога.Прервать Тогда - - // Прерываем выгрузку - Возврат Ложь; - ИначеЕсли Результат = КодВозвратаДиалога.Пропустить Тогда - - // Пропускаем этот файл - Продолжить; - КонецЕсли; - КонецЕсли; - Иначе - - // Файла нет, спрашивать не будем - Результат = КодВозвратаДиалога.Да; - КонецЕсли; - - // Если можно - запишем файл в файловую систему - Если Результат = КодВозвратаДиалога.Да Тогда - Пока Истина Цикл - Попытка - ФайлНаДиске = Новый Файл(ПолноеИмяФайла); - Если ФайлНаДиске.Существует() Тогда - - // Снимем флаг R|O для возможности удаления - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - КонецЕсли; - - // Всегда удалим и потом создадим заново - УдалитьФайлы(ПолноеИмяФайла); - - РазмерВМб = ЗаписьФайла.Размер / (1024 * 1024); - - // Обновим индикатор прогресса - НадписьПодробнее = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется на диск файл - |""%1"" (%2 Мб)...'"), - ФайлНаДиске.Имя, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб) ); - - Состояние( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Экспорт папки ""%1""'"), - ЗаписьФайла.НаименованиеПапки), - , - НадписьПодробнее, - БиблиотекаКартинок.Информация32); - - // Запишем файл заново - стрАдрес = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( - ЗаписьФайла.ТекущаяВерсия, УникальныйИдентификатор); - - ПолучитьФайл(стрАдрес, ПолноеИмяФайла, Ложь); - - // для варианта с хранением файлов на диске (на сервере) удаляем файл из временного хранилища после получения - Если ЭтоАдресВременногоХранилища(стрАдрес) Тогда - УдалитьИзВременногоХранилища(стрАдрес); - КонецЕсли; - - ФайлНаДиске = Новый Файл(ПолноеИмяФайла); - - // Сделаем файл только для чтения - ФайлНаДиске.УстановитьТолькоЧтение(Истина); - - // Поставим время модификации - как в информационной базе - ФайлНаДиске.УстановитьУниверсальноеВремяИзменения( - ЗаписьФайла.ДатаМодификацииУниверсальная); - - Прервать; - Исключение - - // По какой-то случилась файловая ошибка при записи файла и - // изменении его атрибутов. - ИнформацияОбОшибке = ИнформацияОбОшибке(); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка записи файла - |""%1"". - | - |%2.'"), - ПолноеИмяФайла, - КраткоеПредставлениеОшибки(ИнформацияОбОшибке) ); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); - Если Ответ = КодВозвратаДиалога.Прервать Тогда - - // Просто выйдем с ошибкой - Возврат Ложь; - ИначеЕсли Ответ = КодВозвратаДиалога.Пропустить Тогда - - // Пропустим этот файл и пойдем дальше - Прервать; - Иначе - - // Попробуем повторить создание папки - Продолжить; - КонецЕсли; - КонецПопытки; - КонецЦикла; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - - #КонецЕсли -КонецФункции + ОбойтиДеревоФайлов2(ПараметрыВыполнения.АсинхронныйДиалог.РезультатКогдаНеОткрыт, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОбойтиДеревоФайлов3(ПараметрыВыполнения); +КонецПроцедуры +&НаКлиенте +Процедура ОбойтиДеревоФайлов2(Результат, ПараметрыВыполнения) Экспорт + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + КонецЕсли; + + Если Результат.Успех <> Истина Тогда + ПараметрыВыполнения.Успех = Ложь; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; // Цикл перезапускать не требуется. + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов3(ПараметрыВыполнения) + // Сформируем путь к каталогу и пойдем дальше. Создавать каталоги будем + ПараметрыВыполнения.Вставить("БазовыйКаталогСохраненияФайла", ПараметрыВыполнения.БазовыйКаталогСохранения); + Если ПараметрыВыполнения.ЗаписьФайла.Папка <> ЧтоСохраняем + И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия.Пустая() + И ПараметрыВыполнения.ЗаписьФайла.Папка <> ПараметрыВыполнения.РодительскаяПапка Тогда + ПараметрыВыполнения.БазовыйКаталогСохраненияФайла = ( + ПараметрыВыполнения.БазовыйКаталогСохраненияФайла + + ПараметрыВыполнения.ЗаписьФайла.НаименованиеПапки + + ОбщегоНазначенияКлиентСервер.РазделительПути()); + КонецЕсли; + + // Проверим наличие базового каталога: если нет - создадим + Папка = Новый Файл(ПараметрыВыполнения.БазовыйКаталогСохраненияФайла); + Если Не Папка.Существует() Тогда + ОбойтиДеревоФайлов4(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОбойтиДеревоФайлов6(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов4(ПараметрыВыполнения) + ТекстОшибки = ""; + Попытка + СоздатьКаталог(ПараметрыВыполнения.БазовыйКаталогСохраненияФайла); + Исключение + ТекстОшибки = НСтр("ru = 'Ошибка создания папки ""%1"":'"); + ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", ПараметрыВыполнения.БазовыйКаталогСохраненияФайла); + ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + Если ТекстОшибки <> "" Тогда + РаботаСФайламиСлужебныйКлиент.ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения); + Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов5", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстОшибки, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); + Возврат; + КонецЕсли; + + ОбойтиДеревоФайлов6(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов5(Ответ, ПараметрыВыполнения) Экспорт + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + КонецЕсли; + + Если Ответ = КодВозвратаДиалога.Прервать Тогда + // Просто выйдем с ошибкой + ПараметрыВыполнения.Успех = Ложь; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; // Цикл перезапускать не требуется. + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + ИначеЕсли Ответ = КодВозвратаДиалога.Пропустить Тогда + // Пропустим данную ветку дерева и пойдем дальше + ПараметрыВыполнения.Успех = Истина; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; // Цикл перезапускать не требуется. + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Попробуем повторить создание папки. + ОбойтиДеревоФайлов4(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов6(ПараметрыВыполнения) + // только в том случае, если в этой папке есть хоть один файл + ДочерниеЭлементы = ПараметрыВыполнения.ЗаписьФайла.ПолучитьЭлементы(); + Если ДочерниеЭлементы.Количество() > 0 Тогда + + РаботаСФайламиСлужебныйКлиент.ЗарегистрироватьОписаниеОбработчика( + ПараметрыВыполнения, + ЭтотОбъект, + "ОбойтиДеревоФайлов7"); + + ОбойтиДеревоФайлов( + ПараметрыВыполнения, + ПараметрыВыполнения.ЗаписьФайла, + ПараметрыВыполнения.БазовыйКаталогСохраненияФайла, + ПараметрыВыполнения.ЗаписьФайла.Папка, + ПараметрыВыполнения.ОбщиеПараметры); + + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. + КонецЕсли; + + ОбойтиДеревоФайлов7(ПараметрыВыполнения.АсинхронныйДиалог.РезультатКогдаНеОткрыт, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОбойтиДеревоФайлов8(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов7(Результат, ПараметрыВыполнения) Экспорт + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + КонецЕсли; + + Если Результат.Успех <> Истина Тогда + ПараметрыВыполнения.Успех = Ложь; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Продолжение обработки элемента. + ОбойтиДеревоФайлов8(ПараметрыВыполнения); + + // Перезапуск цикла если был открыт асинхронный диалог. + ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов8(ПараметрыВыполнения) + Если ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия <> NULL + И ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия.Пустая() Тогда + // Это элемент справочника Файлы без файла - пропустим + Возврат; + КонецЕсли; + + // Пишем файл в базовый каталог + ПараметрыВыполнения.Вставить("ИмяФайлаСРасширением", Неопределено); + ПараметрыВыполнения.ИмяФайлаСРасширением = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ЗаписьФайла.ПолноеНаименование, + ПараметрыВыполнения.ЗаписьФайла.Расширение); + + Если ПараметрыВыполнения.ЗаписьФайла.Зашифрован Тогда + ПараметрыВыполнения.ИмяФайлаСРасширением = ПараметрыВыполнения.ИмяФайлаСРасширением + "." + РасширениеДляЗашифрованныхФайлов; + КонецЕсли; + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПараметрыВыполнения.БазовыйКаталогСохраненияФайла + ПараметрыВыполнения.ИмяФайлаСРасширением); + + ПараметрыВыполнения.Вставить("Результат", Неопределено); + ОбойтиДеревоФайлов9(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов9(ПараметрыВыполнения) + ПараметрыВыполнения.Вставить("ФайлНаДиске", Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла)); + Если ПараметрыВыполнения.ФайлНаДиске.Существует() И ПараметрыВыполнения.ФайлНаДиске.ЭтоКаталог() Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вместо файла + |""%1"" + |существует папка с таким же именем. + | + |Повторить экспорт этого файла?'"), + ПараметрыВыполнения.ПолноеИмяФайла); + РаботаСФайламиСлужебныйКлиент.ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения); + Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов10", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена, , КодВозвратаДиалога.Отмена); + Возврат; + КонецЕсли; + + // Файла нет - идем дальше + ПараметрыВыполнения.Результат = КодВозвратаДиалога.Повторить; + ОбойтиДеревоФайлов11(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов10(Ответ, ПараметрыВыполнения) Экспорт + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + КонецЕсли; + + Если Ответ = КодВозвратаДиалога.Повторить Тогда + // Данный файл игнорируем + ОбойтиДеревоФайлов9(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Продолжение обработки элемента. + ПараметрыВыполнения.Результат = КодВозвратаДиалога.Отмена; + ОбойтиДеревоФайлов11(ПараметрыВыполнения); + + // Перезапуск цикла если был открыт асинхронный диалог. + ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов11(ПараметрыВыполнения) + Если ПараметрыВыполнения.Результат = КодВозвратаДиалога.Отмена Тогда + // Игнорируем файл с именем как у папки + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Результат = КодВозвратаДиалога.Нет; + + // Спросим, а что делать с текущим файлом + Если ПараметрыВыполнения.ФайлНаДиске.Существует() Тогда + + // Если у файла стоит R|O и время изменения меньше, чем в информационной базе - просто перепишем + Если ПараметрыВыполнения.ФайлНаДиске.ПолучитьТолькоЧтение() + И ПараметрыВыполнения.ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения() <= ПараметрыВыполнения.ЗаписьФайла.ДатаМодификацииУниверсальная Тогда + ПараметрыВыполнения.Результат = КодВозвратаДиалога.Да; + Иначе + Если Не ПараметрыВыполнения.ОбщиеПараметры.ДляВсехФайлов Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В папке ""%1"" + |существует файл ""%2"" + |размер существующего файла = %3 байт, дата изменения %4. + |размер сохраняемого файла = %5 байт, дата изменения %6. + | + |Заменить существующий файл файлом из хранилища файлов?'"), + ПараметрыВыполнения.БазовыйКаталогСохраненияФайла, + ПараметрыВыполнения.ИмяФайлаСРасширением, + ПараметрыВыполнения.ФайлНаДиске.Размер(), + МестноеВремя(ПараметрыВыполнения.ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения()), + ПараметрыВыполнения.ЗаписьФайла.Размер, + МестноеВремя(ПараметрыВыполнения.ЗаписьФайла.ДатаМодификацииУниверсальная)); + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ТекстСообщения", ТекстСообщения); + СтруктураПараметров.Вставить("ПрименитьДляВсех", ПараметрыВыполнения.ОбщиеПараметры.ДляВсехФайлов); + СтруктураПараметров.Вставить("БазовоеДействие", ПараметрыВыполнения.ОбщиеПараметры.БазовоеДействие); + + ФормаВопроса = ПараметрыВыполнения.ОбщиеПараметры.ФормаВопроса; + ФормаВопроса.УстановитьПараметрыИспользования(СтруктураПараметров); + + РаботаСФайламиСлужебныйКлиент.ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения); + Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов12", ЭтотОбъект, ПараметрыВыполнения); + + РаботаСФайламиСлужебныйКлиент.УстановитьОповещениеФормы(ФормаВопроса, Обработчик); + + ФормаВопроса.Открыть(); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Результат = ПараметрыВыполнения.ОбщиеПараметры.БазовоеДействие; + ОбойтиДеревоФайлов13(ПараметрыВыполнения); + Возврат; + КонецЕсли; + КонецЕсли; + + // Файла нет, спрашивать не будем + ПараметрыВыполнения.Результат = КодВозвратаДиалога.Да; + ОбойтиДеревоФайлов14(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов12(Результат, ПараметрыВыполнения) Экспорт + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Истина; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + КонецЕсли; + + ПараметрыВыполнения.Результат = Результат.КодВозврата; + ПараметрыВыполнения.ОбщиеПараметры.ДляВсехФайлов = Результат.ПрименитьДляВсех; + ПараметрыВыполнения.ОбщиеПараметры.БазовоеДействие = ПараметрыВыполнения.Результат; + + // Продолжение обработки элемента. + ОбойтиДеревоФайлов13(ПараметрыВыполнения); + + // Перезапуск цикла если был открыт асинхронный диалог. + ОбойтиДеревоФайловЗапускЦикла(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов13(ПараметрыВыполнения) + Если ПараметрыВыполнения.Результат = КодВозвратаДиалога.Прервать Тогда + // Прерываем выгрузку + ПараметрыВыполнения.Успех = Ложь; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; // Цикл перезапускать не требуется. + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + ИначеЕсли ПараметрыВыполнения.Результат = КодВозвратаДиалога.Пропустить Тогда + // Пропускаем этот файл + Возврат; + КонецЕсли; + + // Если можно - запишем файл в файловую систему + Если ПараметрыВыполнения.Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ОбойтиДеревоФайлов14(ПараметрыВыполнения); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов14(ПараметрыВыполнения) + ПараметрыВыполнения.ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + Если ПараметрыВыполнения.ФайлНаДиске.Существует() Тогда + // Снимем флаг R|O для возможности удаления + ПараметрыВыполнения.ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + КонецЕсли; + + // Всегда удалим и потом создадим заново + ИнформацияОбОшибке = Неопределено; + Попытка + УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КонецПопытки; + Если ИнформацияОбОшибке <> Неопределено Тогда + ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + РазмерВМб = ПараметрыВыполнения.ЗаписьФайла.Размер / (1024 * 1024); + + // Обновим индикатор прогресса + СостояниеЗаголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Экспорт папки ""%1""'"), + ПараметрыВыполнения.ЗаписьФайла.НаименованиеПапки); + СостояниеТекст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сохраняется на диск файл + |""%1"" (%2 Мб)...'"), + ПараметрыВыполнения.ФайлНаДиске.Имя, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + Состояние(СостояниеЗаголовок, , СостояниеТекст, БиблиотекаКартинок.Информация32); + + // Запишем файл заново + АдресФайлаДляОткрытия = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( + ПараметрыВыполнения.ЗаписьФайла.ТекущаяВерсия, + УникальныйИдентификатор); + + Попытка + ПолучитьФайл(АдресФайлаДляОткрытия, ПараметрыВыполнения.ПолноеИмяФайла, Ложь); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КонецПопытки; + Если ИнформацияОбОшибке <> Неопределено Тогда + ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // для варианта с хранением файлов на диске (на сервере) удаляем файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайлаДляОткрытия) Тогда + УдалитьИзВременногоХранилища(АдресФайлаДляОткрытия); + КонецЕсли; + + ПараметрыВыполнения.ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + + Попытка + // Сделаем файл только для чтения + ПараметрыВыполнения.ФайлНаДиске.УстановитьТолькоЧтение(Истина); + // Поставим время модификации - как в информационной базе + ПараметрыВыполнения.ФайлНаДиске.УстановитьУниверсальноеВремяИзменения( + ПараметрыВыполнения.ЗаписьФайла.ДатаМодификацииУниверсальная); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КонецПопытки; + Если ИнформацияОбОшибке <> Неопределено Тогда + ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения); + Возврат; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов15(ИнформацияОбОшибке, ПараметрыВыполнения) + // По какой-то случилась файловая ошибка при записи файла и + // изменении его атрибутов. + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка записи файла + |""%1"". + | + |%2.'"), + ПараметрыВыполнения.ПолноеИмяФайла, + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + РаботаСФайламиСлужебныйКлиент.ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения); + Обработчик = Новый ОписаниеОповещения("ОбойтиДеревоФайлов16", ЭтотОбъект, ПараметрыВыполнения); + + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ПрерватьПовторитьПропустить, , КодВозвратаДиалога.Повторить); +КонецПроцедуры + +&НаКлиенте +Процедура ОбойтиДеревоФайлов16(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = КодВозвратаДиалога.Прервать Тогда + // Просто выйдем с ошибкой + ПараметрыВыполнения.Успех = Ложь; + ПараметрыВыполнения.ТребуетсяЗапускЦикла = Ложь; // Цикл перезапускать не требуется. + РаботаСФайламиСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); // Ложь. + Возврат; + ИначеЕсли Ответ = КодВозвратаДиалога.Пропустить Тогда + // Пропустим этот файл и пойдем дальше + Возврат; + КонецЕсли; + + // Попробуем повторить создание папки + ОбойтиДеревоФайлов14(ПараметрыВыполнения); +КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form index 3beaaf266..1770aa2d3 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Form.form @@ -27,7 +27,7 @@ ПолноеНаименованиеПриИзменении - ПолноеНаименованиеРасширеннаяПодсказка + ПолноеНаименованиеExtendedTooltip 243 Label true @@ -75,8 +75,8 @@ Описание файла - ОписаниеРасширеннаяПодсказка - 245 + ОписаниеExtendedTooltip + 244 Label true true @@ -123,7 +123,7 @@ Группа основные данные - ГруппаОсновныеДанныеРасширеннаяПодсказка + ГруппаОсновныеДанныеExtendedTooltip 242 Label true @@ -155,8 +155,8 @@ false - ОткрытьФайлРасширеннаяПодсказка - 248 + ОткрытьФайлExtendedTooltip + 246 Label true true @@ -183,8 +183,8 @@ false - РедактироватьРасширеннаяПодсказка - 249 + РедактироватьExtendedTooltip + 247 Label true true @@ -211,8 +211,8 @@ false - ЗакончитьРедактированиеРасширеннаяПодсказка - 250 + ЗакончитьРедактированиеExtendedTooltip + 248 Label true true @@ -239,8 +239,8 @@ false - СохранитьИзмененияРасширеннаяПодсказка - 251 + СохранитьИзмененияExtendedTooltip + 249 Label true true @@ -267,8 +267,8 @@ false - ОткрытьКаталогФайлаРасширеннаяПодсказка - 252 + ОткрытьКаталогФайлаExtendedTooltip + 250 Label true true @@ -295,8 +295,8 @@ false - СохранитьКакРасширеннаяПодсказка - 253 + СохранитьКакExtendedTooltip + 251 Label true true @@ -327,8 +327,8 @@ Группа команды - ГруппаКомандыРасширеннаяПодсказка - 247 + ГруппаКомандыExtendedTooltip + 245 Label true true @@ -360,7 +360,7 @@ Группа основная - ГруппаОсновнаяРасширеннаяПодсказка + ГруппаОсновнаяExtendedTooltip 241 Label true @@ -403,8 +403,8 @@ Объект.ДатаСоздания - ДатаСозданияРасширеннаяПодсказка - 257 + ДатаСозданияExtendedTooltip + 255 Label true true @@ -448,8 +448,8 @@ Объект.Автор - АвторРасширеннаяПодсказка - 259 + АвторExtendedTooltip + 256 Label true true @@ -493,8 +493,8 @@ Объект.Редактирует - РедактируетРасширеннаяПодсказка - 262 + РедактируетExtendedTooltip + 258 Label true true @@ -539,8 +539,8 @@ Объект.ДатаЗаема - ДатаЗаемаРасширеннаяПодсказка - 264 + ДатаЗаемаExtendedTooltip + 259 Label true true @@ -583,8 +583,8 @@ Группа редактирует - ГруппаРедактируетРасширеннаяПодсказка - 261 + ГруппаРедактируетExtendedTooltip + 257 Label true true @@ -617,8 +617,8 @@ ВладелецПриИзменении - ВладелецРасширеннаяПодсказка - 266 + ВладелецExtendedTooltip + 260 Label true true @@ -659,8 +659,8 @@ true - КодРасширеннаяПодсказка - 268 + КодExtendedTooltip + 261 Label true true @@ -709,8 +709,8 @@ Объект.ТекущаяВерсияРасширение - ТекущаяВерсияРасширениеРасширеннаяПодсказка - 271 + ТекущаяВерсияРасширениеExtendedTooltip + 263 Label true true @@ -753,8 +753,8 @@ None - ИндексКартинкиРасширеннаяПодсказка - 273 + ИндексКартинкиExtendedTooltip + 264 Label true true @@ -799,8 +799,8 @@ Группа расширение - ГруппаРасширениеРасширеннаяПодсказка - 270 + ГруппаРасширениеExtendedTooltip + 262 Label true true @@ -831,8 +831,8 @@ Группа сведения - ГруппаСведенияРасширеннаяПодсказка - 256 + ГруппаСведенияExtendedTooltip + 254 Label true true @@ -871,8 +871,8 @@ Объект.ТекущаяВерсияНомерВерсии - ТекущаяВерсияНомерРасширеннаяПодсказка - 276 + ТекущаяВерсияНомерExtendedTooltip + 266 Label true true @@ -917,8 +917,8 @@ Объект.ТекущаяВерсияАвтор - ТекущаяВерсияАвторРасширеннаяПодсказка - 278 + ТекущаяВерсияАвторExtendedTooltip + 267 Label true true @@ -967,8 +967,8 @@ Объект.ТекущаяВерсияДатаСоздания - ТекущаяВерсияДатаСозданияРасширеннаяПодсказка - 281 + ТекущаяВерсияДатаСозданияExtendedTooltip + 269 Label true true @@ -1019,8 +1019,8 @@ Дата изменения файла - ТекущаяВерсияДатаМодификацииФайлаРасширеннаяПодсказка - 283 + ТекущаяВерсияДатаМодификацииФайлаExtendedTooltip + 270 Label true true @@ -1064,8 +1064,8 @@ Группа дат - ГруппаДатРасширеннаяПодсказка - 280 + ГруппаДатExtendedTooltip + 268 Label true true @@ -1102,8 +1102,8 @@ Объект.ТекущаяВерсияРазмер - ТекущаяВерсияРазмерРасширеннаяПодсказка - 286 + ТекущаяВерсияРазмерExtendedTooltip + 272 Label true true @@ -1145,8 +1145,8 @@ true - ДекорацияРазмерРасширеннаяПодсказка - 288 + ДекорацияРазмерExtendedTooltip + 273 Label true true @@ -1180,8 +1180,8 @@ Группа размер - ГруппаРазмерРасширеннаяПодсказка - 285 + ГруппаРазмерExtendedTooltip + 271 Label true true @@ -1211,8 +1211,8 @@ Right - ХранитьВерсииРасширеннаяПодсказка - 289 + ХранитьВерсииExtendedTooltip + 274 Label true true @@ -1245,8 +1245,8 @@ Кодировка - КодировкаРасширеннаяПодсказка - 291 + КодировкаExtendedTooltip + 275 Label true true @@ -1283,8 +1283,8 @@ Группа версия - ГруппаВерсияРасширеннаяПодсказка - 275 + ГруппаВерсияExtendedTooltip + 265 Label true true @@ -1318,8 +1318,8 @@ Группа сведения о файле - ГруппаСведенияОФайлеРасширеннаяПодсказка - 255 + ГруппаСведенияОФайлеExtendedTooltip + 253 Label true true @@ -1333,7 +1333,7 @@ - ГруппаЭЦП + ГруппаЭП 189 ТаблицаПодписей @@ -1360,8 +1360,8 @@ ТаблицаПодписей.КомуВыданСертификат - ТаблицаПодписейКомуВыданСертификатРасширеннаяПодсказка - 310 + ТаблицаПодписейКомуВыданСертификатExtendedTooltip + 284 Label true true @@ -1401,8 +1401,8 @@ ТаблицаПодписей.ДатаПодписи - ТаблицаПодписейДатаПодписиРасширеннаяПодсказка - 312 + ТаблицаПодписейДатаПодписиExtendedTooltip + 285 Label true true @@ -1442,8 +1442,8 @@ ТаблицаПодписей.Комментарий - ТаблицаПодписейКомментарийРасширеннаяПодсказка - 314 + ТаблицаПодписейКомментарийExtendedTooltip + 286 Label true true @@ -1483,8 +1483,8 @@ ТаблицаПодписей.Статус - ТаблицаПодписейСтатусРасширеннаяПодсказка - 316 + ТаблицаПодписейСтатусExtendedTooltip + 287 Label true true @@ -1524,8 +1524,8 @@ true - ТаблицаПодписейПодписатьРасширеннаяПодсказка - 294 + ТаблицаПодписейПодписатьExtendedTooltip + 277 Label true true @@ -1549,8 +1549,8 @@ true - ТаблицаПодписейОткрытьСертификатРасширеннаяПодсказка - 295 + ТаблицаПодписейОткрытьСертификатExtendedTooltip + 278 Label true true @@ -1575,8 +1575,8 @@ true - ТаблицаПодписейПроверитьРасширеннаяПодсказка - 296 + ТаблицаПодписейПроверитьExtendedTooltip + 279 Label true true @@ -1601,8 +1601,8 @@ true - ТаблицаПодписейПроверитьВсеРасширеннаяПодсказка - 297 + ТаблицаПодписейПроверитьВсеExtendedTooltip + 280 Label true true @@ -1627,8 +1627,8 @@ true - ТаблицаПодписейСохранитьРасширеннаяПодсказка - 298 + ТаблицаПодписейСохранитьExtendedTooltip + 281 Label true true @@ -1653,8 +1653,8 @@ true - ТаблицаПодписейУдалитьРасширеннаяПодсказка - 299 + ТаблицаПодписейУдалитьExtendedTooltip + 282 Label true true @@ -1678,10 +1678,10 @@ ТаблицаПодписейСтрокаПоиска - 301 + 309 ТаблицаПодписейСтрокаПоискаРасширеннаяПодсказка - 303 + 311 Label true true @@ -1691,7 +1691,7 @@ ТаблицаПодписейСтрокаПоискаКонтекстноеМеню - 302 + 310 true ТаблицаПодписей @@ -1701,10 +1701,10 @@ ТаблицаПодписейСостояниеПросмотра - 304 + 312 ТаблицаПодписейСостояниеПросмотраРасширеннаяПодсказка - 306 + 314 Label true true @@ -1714,7 +1714,7 @@ ТаблицаПодписейСостояниеПросмотраКонтекстноеМеню - 305 + 313 true ViewStatusAddition @@ -1725,10 +1725,10 @@ ТаблицаПодписейУправлениеПоиском - 307 + 315 ТаблицаПодписейУправлениеПоискомРасширеннаяПодсказка - 309 + 317 Label true true @@ -1738,7 +1738,7 @@ ТаблицаПодписейУправлениеПоискомКонтекстноеМеню - 308 + 316 true SearchControlAddition @@ -1748,8 +1748,8 @@ - ТаблицаПодписейРасширеннаяПодсказка - 300 + ТаблицаПодписейExtendedTooltip + 283 Label true true @@ -1800,11 +1800,11 @@ ru - + Группа ЭП - ГруппаЭЦПРасширеннаяПодсказка - 293 + ГруппаЭПРасширеннаяПодсказка + 276 Label true true @@ -1847,8 +1847,8 @@ None - СертификатыШифрованияПредставлениеРасширеннаяПодсказка - 338 + СертификатыШифрованияПредставлениеExtendedTooltip + 291 Label true true @@ -1888,8 +1888,8 @@ true - СертификатыШифрованияОткрытьСертификатШифрованияРасширеннаяПодсказка - 327 + СертификатыШифрованияОткрытьСертификатШифрованияExtendedTooltip + 289 Label true true @@ -1913,10 +1913,10 @@ СертификатыШифрованияСтрокаПоиска - 329 + 330 СертификатыШифрованияСтрокаПоискаРасширеннаяПодсказка - 331 + 332 Label true true @@ -1926,7 +1926,7 @@ СертификатыШифрованияСтрокаПоискаКонтекстноеМеню - 330 + 331 true СертификатыШифрования @@ -1936,10 +1936,10 @@ СертификатыШифрованияСостояниеПросмотра - 332 + 333 СертификатыШифрованияСостояниеПросмотраРасширеннаяПодсказка - 334 + 335 Label true true @@ -1949,7 +1949,7 @@ СертификатыШифрованияСостояниеПросмотраКонтекстноеМеню - 333 + 334 true ViewStatusAddition @@ -1960,10 +1960,10 @@ СертификатыШифрованияУправлениеПоиском - 335 + 336 СертификатыШифрованияУправлениеПоискомРасширеннаяПодсказка - 337 + 338 Label true true @@ -1973,7 +1973,7 @@ СертификатыШифрованияУправлениеПоискомКонтекстноеМеню - 336 + 337 true SearchControlAddition @@ -1983,8 +1983,8 @@ - СертификатыШифрованияРасширеннаяПодсказка - 328 + СертификатыШифрованияExtendedTooltip + 290 Label true true @@ -2037,8 +2037,8 @@ Группа шифрование - ГруппаШифрованиеРасширеннаяПодсказка - 326 + ГруппаШифрованиеExtendedTooltip + 288 Label true true @@ -2066,8 +2066,8 @@ Группа дополнительные данные страницы - ГруппаДополнительныеДанныеСтраницыРасширеннаяПодсказка - 254 + ГруппаДополнительныеДанныеСтраницыExtendedTooltip + 252 Label true true @@ -2094,7 +2094,7 @@ false - ОтменитьРедактированиеРасширеннаяПодсказка + ОтменитьРедактированиеExtendedTooltip 230 Label true @@ -2122,7 +2122,7 @@ false - ЗанятьРасширеннаяПодсказка + ЗанятьExtendedTooltip 231 Label true @@ -2150,7 +2150,7 @@ false - ОбновитьИзФайлаНаДискеРасширеннаяПодсказка + ОбновитьИзФайлаНаДискеExtendedTooltip 232 Label true @@ -2169,10 +2169,10 @@ InAdditionalSubmenu - ФормаЭЦПИШифрование + ФормаЭПИШифрование 155 - ФормаГруппаЭЦП + ФормаГруппаЭП 147 ФормаПодписать @@ -2183,7 +2183,7 @@ true - ФормаПодписатьРасширеннаяПодсказка + ФормаПодписатьExtendedTooltip 235 Label true @@ -2201,7 +2201,7 @@ Auto - ФормаДобавитьЭЦПИзФайла + ФормаДобавитьПодписьИзФайла 152 true true @@ -2209,7 +2209,7 @@ true - ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + ФормаДобавитьПодписьИзФайлаРасширеннаяПодсказка 236 Label true @@ -2218,7 +2218,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьПодписьИзФайла Normal Auto true @@ -2227,7 +2227,7 @@ Auto - ФормаСохранитьВместеСЭЦП + ФормаСохранитьВместеСПодписью 154 true true @@ -2235,7 +2235,7 @@ true - ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + ФормаСохранитьВместеСПодписьюРасширеннаяПодсказка 237 Label true @@ -2244,7 +2244,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСПодписью Normal Auto true @@ -2263,10 +2263,10 @@ ru - + Форма группа ЭП - ФормаГруппаЭЦПРасширеннаяПодсказка + ФормаГруппаЭПРасширеннаяПодсказка 234 Label true @@ -2289,7 +2289,7 @@ true - ФормаЗашифроватьРасширеннаяПодсказка + ФормаЗашифроватьExtendedTooltip 239 Label true @@ -2315,7 +2315,7 @@ true - ФормаРасшифроватьРасширеннаяПодсказка + ФормаРасшифроватьExtendedTooltip 240 Label true @@ -2346,7 +2346,7 @@ Форма группа шифрование - ФормаГруппаШифрованиеРасширеннаяПодсказка + ФормаГруппаШифрованиеExtendedTooltip 238 Label true @@ -2368,10 +2368,10 @@ ru - + Форма ЭПИШифрование - ФормаЭЦПИШифрованиеРасширеннаяПодсказка + ФормаЭПИШифрованиеРасширеннаяПодсказка 233 Label true @@ -2405,16 +2405,12 @@ OnCreateAtServer ПриСозданииНаСервере - - OnClose - ПриЗакрытии - FillCheckProcessingAtServer ОбработкаПроверкиЗаполненияНаСервере 70 - LockOwner + DontBlock true true true @@ -2598,7 +2594,7 @@ - КопироватьПодписиЭЦП + КопироватьПодписиЭП <key>ru</key> <value>Копировать подписи ЭП</value> @@ -2630,7 +2626,7 @@ <edit> <common>true</common> </edit> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> <columns> <name>КомуВыданСертификат</name> <title> @@ -2970,6 +2966,40 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ПолученОтветНаВопросФайлЗанят</name> + <title> + <key>ru</key> + <value>Получен ответ на вопрос файл занят</value> + + 17 + + Boolean + + + true + + + true + + + + ПолученОтветНаВопросОткрытьДляРедактирования + + <key>ru</key> + <value>Получен ответ на вопрос открыть для редактирования</value> + + 18 + + Boolean + + + true + + + true + + Записать @@ -3276,14 +3306,14 @@ <common>true</common> </use> <picture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> <name>Подписать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -3309,7 +3339,7 @@ <name>Зашифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -3332,53 +3362,53 @@ <name>Расшифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ДобавитьЭЦПИзФайла</name> + <name>ДобавитьПодписьИзФайла</name> <title> <key>ru</key> - <value>Добавить ЭП из файла</value> + <value>Добавить электронную подпись из файла</value> 16 ru - + Добавить электронную подпись из файла true - ДобавитьЭЦПИзФайла + ДобавитьПодписьИзФайла - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto - СохранитьВместеСЭЦП + СохранитьВместеСПодписью <key>ru</key> - <value>Сохранить вместе с ЭП</value> + <value>Сохранить вместе с электронной подписью</value> 18 ru - + Сохранить вместе с электронной подписью true - СохранитьВместеСЭЦП + СохранитьВместеСПодписью - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3401,7 +3431,7 @@ ОткрытьПодпись - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto
          @@ -3424,7 +3454,7 @@ Проверить - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3447,7 +3477,7 @@ ПроверитьВсе - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3470,7 +3500,7 @@ Сохранить - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto @@ -3493,7 +3523,7 @@ Удалить - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи Auto Auto diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html index caac654e2..42689459c 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Help/ru.html @@ -1,4 +1,4 @@ - +

          Для открытия карточки файла используйте клавишу F2 или кнопку  ("Изменить текущий элемент") командной панели списка файлов. Карточку можно также открыть из полнотекстового поиска или из отчетов.

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

          Из карточки файла можно перейти к просмотру и редактированию связанных с файлом сведений:

          diff --git a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl index 4a5c508d6..9a76a38cd 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/Файлы/Forms/ФормаЭлемента/Module.bsl @@ -55,7 +55,7 @@ НовыйФайлЗаписан = Ложь; // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПриСозданииНаСервере(ЭтаФорма); + УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект); // Конец СтандартныеПодсистемы.Свойства Если Параметры.Свойство("КарточкаОткрытаПослеСозданияФайла") Тогда @@ -74,10 +74,10 @@ КонецЕсли; Если Не Параметры.ФайлОснование.Пустая() Тогда - ФайлОснованиеПодписан = Параметры.ФайлОснование.ПодписанЭЦП; + ФайлОснованиеПодписан = Параметры.ФайлОснование.ПодписанЭП; КонецЕсли; - Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() = Ложь Тогда + Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеПодписиИШифрование() = Ложь Тогда Элементы.ГруппаДополнительныеДанныеСтраницы.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; Иначе ЗаполнитьСписокПодписей(); @@ -113,6 +113,16 @@ Элементы.Кодировка.Видимость = Ложь; КонецЕсли; + Если ТипЗнч(Объект.ВладелецФайла) = Тип("СправочникСсылка.ПапкиФайлов") + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + Если Не МодульУправлениеДоступом.ЕстьПраво("ИзменениеФайлов", Объект.ВладелецФайла) Тогда + ТолькоПросмотр = Истина; + КонецЕсли; + КонецЕсли; + КонецПроцедуры &НаКлиенте @@ -122,65 +132,46 @@ НаименованиеДоЗаписи = Объект.Наименование; Если Не Параметры.ФайлОснование.Пустая() И ФайлОснованиеПодписан Тогда - - Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" подписан. |Копирование сведений об ЭП в новый файл сделает его недоступным для изменения. | |Скопировать сведения об ЭП в новый файл?'"), Строка(Параметры.ФайлОснование)); - - Ответ = Вопрос(Текст, РежимДиалогаВопрос.ДаНет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - КопироватьПодписиЭЦП = Истина; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ПриОткрытииПослеОтветаНаВопросСкопироватьСведения", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; КонецЕсли; - УстановитьДоступностьКомандСпискаЭЦП(); - УстановитьДоступностьКомандСпискаШифрования(); - + ПриОткрытииЗавершение(); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если ФайлРедактировался И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().АвторизованныйПользователь = Объект.Редактирует Тогда - - Ответ = Вопрос( - НСтр("ru = 'Файл занят вами для редактирования. - | - |Закрыть карточку?'"), - РежимДиалогаВопрос.ДаНет, - , - КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Нет Тогда - Отказ = Истина; + Если ФайлРедактировался И Не ПолученОтветНаВопросФайлЗанят Тогда + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + Если ПараметрыРаботыКлиента.АвторизованныйПользователь = Объект.Редактирует Тогда + ТекстВопроса = НСтр("ru = 'Файл занят для редактирования. + | + |Закрыть карточку?'"); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(ЭтотОбъект, Отказ, ТекстВопроса, "ПолученОтветНаВопросФайлЗанят"); Возврат; КонецЕсли; КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если РежимСоздания = "ИзШаблона" И НЕ Объект.ПодписанЭЦП Тогда - - СтрокаВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Открыть файл ""%1"" для редактирования?'"), - СокрЛП(Объект.ПолноеНаименование) ); - + Если РежимСоздания = "ИзШаблона" И НЕ Объект.ПодписанЭП Тогда Если НовыйФайл И НовыйФайлЗаписан И (Не ФайлРедактировался) Тогда - - Ответ = Вопрос(СтрокаВопроса, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Да Тогда - РаботаСФайламиКлиент.Редактировать(Объект.Ссылка, УникальныйИдентификатор); + Если Не ПолученОтветНаВопросОткрытьДляРедактирования Тогда + Отказ = Истина; + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Открыть файл ""%1"" для редактирования?'"), + СокрЛП(Объект.ПолноеНаименование)); + Обработчик = Новый ОписаниеОповещения("ПередЗакрытиемПослеОтветаНаВопросОткрытьДляРедактирования", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); + Возврат; КонецЕсли; - КонецЕсли; - КонецЕсли; КонецПроцедуры @@ -204,8 +195,12 @@ Прочитать(); КонецЕсли; + Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ВерсияСохранена" И Источник = Объект.Ссылка Тогда + Прочитать(); + КонецЕсли; + // СтандартныеПодсистемы.Свойства - Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтаФорма, ИмяСобытия, Параметр) Тогда + Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда ОбновитьЭлементыДополнительныхРеквизитов(); КонецЕсли; // Конец СтандартныеПодсистемы.Свойства @@ -216,7 +211,7 @@ Процедура ПриЧтенииНаСервере(ТекущийОбъект) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры @@ -232,7 +227,7 @@ Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтаФорма, ТекущийОбъект); + УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры @@ -251,16 +246,18 @@ КонецЕсли; КонецЕсли; - Если НовыйФайл Тогда + Если НовыйФайл Тогда ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Объект.Ссылка); ДанныеФайлаКорректны = Истина; КонецЕсли; Если Не Параметры.ФайлОснование.Пустая() И Объект.ТекущаяВерсия.Пустая() Тогда - СоздатьКопиюВерсии(Объект.Ссылка, Параметры.ФайлОснование, КопироватьПодписиЭЦП); + СоздатьКопиюВерсии(Объект.Ссылка, Параметры.ФайлОснование, КопироватьПодписиЭП); Модифицированность = Ложь; КонецЕсли; + РазблокироватьДанныеДляРедактирования(Объект.Ссылка, УникальныйИдентификатор); + КонецПроцедуры &НаКлиенте @@ -282,7 +279,7 @@ КонецЕсли; УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаЭЦП(); + УстановитьДоступностьКомандСпискаЭП(); УстановитьДоступностьКомандСпискаШифрования(); КонецПроцедуры @@ -290,7 +287,7 @@ Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) // СтандартныеПодсистемы.Свойства - УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтаФорма, Отказ, ПроверяемыеРеквизиты); + УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); // Конец СтандартныеПодсистемы.Свойства КонецПроцедуры @@ -304,7 +301,7 @@ Попытка ФайловыеФункцииСлужебныйКлиент.КорректноеИмяФайла(Объект.ПолноеНаименование, Истина); Исключение - Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Объект.Наименование = СокрЛП(Объект.ПолноеНаименование); @@ -327,7 +324,7 @@ &НаКлиенте Процедура ТаблицаПодписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); + ЭлектроннаяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -348,11 +345,9 @@ Записать(); КонецЕсли; - РаботаСФайламиКлиент.Занять(Объект.Ссылка, УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - Прочитать(); - - УстановитьДоступностьЭлементовФормы(); + РаботаСФайламиСлужебныйКлиент.ЗанятьСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -367,11 +362,9 @@ Записать(); КонецЕсли; - РаботаСФайламиКлиент.Редактировать(Объект.Ссылка, УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - Прочитать(); - - УстановитьДоступностьЭлементовФормы(); + РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -384,16 +377,15 @@ ПолучитьДанныеФайлаЕслиНекорректны(); - РаботаСФайламиКлиент.ОсвободитьФайл( + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлСОповещением( + Обработчик, ДанныеФайла.Ссылка, ДанныеФайла.ХранитьВерсии, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, УникальныйИдентификатор); - - Прочитать(); - - УстановитьДоступностьЭлементовФормы(); КонецПроцедуры @@ -406,16 +398,15 @@ ПолучитьДанныеФайлаЕслиНекорректны(); - РаботаСФайламиКлиент.ЗакончитьРедактирование( + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактированиеСОповещением( + Обработчик, ДанныеФайла.Ссылка, УникальныйИдентификатор, ДанныеФайла.ХранитьВерсии, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует); - - Прочитать(); - - УстановитьДоступностьЭлементовФормы(); КонецПроцедуры @@ -426,11 +417,9 @@ Записать(); КонецЕсли; - РаботаСФайламиКлиент.ОпубликоватьФайл(Объект.Ссылка, УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - Прочитать(); - - УстановитьДоступностьЭлементовФормы(); + РаботаСФайламиСлужебныйКлиент.ОпубликоватьФайлСОповещением(Обработчик, Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -448,9 +437,11 @@ Процедура СохранитьКак(Команда) ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Объект.Ссылка, Неопределено, УникальныйИдентификатор); + Объект.Ссылка, + Неопределено, + УникальныйИдентификатор); - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); + РаботаСФайламиСлужебныйКлиент.СохранитьКак(Неопределено, ДанныеФайла, Неопределено); КонецПроцедуры @@ -463,9 +454,12 @@ ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Объект.Ссылка); - РаботаСФайламиКлиент.ОбновитьИзФайлаНаДиске(ДанныеФайла, УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ПрочитатьИУстановитьДоступностьЭлементовФормы", ЭтотОбъект); - Прочитать(); + РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДискеСОповещением( + Обработчик, + ДанныеФайла, + УникальныйИдентификатор); КонецПроцедуры @@ -473,7 +467,8 @@ Процедура Подписать(Команда) Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, Команды.Найти("Подписать").Заголовок); Возврат; КонецЕсли; @@ -485,21 +480,10 @@ |""Подписать"" возможно только после записи данных. | |Данные будут записаны.'"); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + Обработчик = Новый ОписаниеОповещения("ПодписатьПослеОтветаНаВопросЗаписать", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + Возврат; - Если Результат <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - - Если Не Записать() Тогда - Возврат; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - ПолучитьНавигационнуюСсылку(Объект.Ссылка), - Строка(Объект.Ссылка), - БиблиотекаКартинок.Информация32); Иначе Если Модифицированность Тогда @@ -510,23 +494,7 @@ КонецЕсли; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Объект.Ссылка); - - ДанныеПодписи = Неопределено; - Если РаботаСФайламиКлиент.СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи) Тогда - - ПодписатьЭЦПСервер(ДанныеПодписи); - - ЭлектроннаяЦифроваяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ДанныеФайла.Ссылка); - - Оповестить( - "Запись_Файл", - Новый Структура("Событие", "ПрисоединенныйФайлПодписан"), - ДанныеФайла.Владелец); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаЭЦП(); - КонецЕсли; + ПодписатьПродолжение(); КонецПроцедуры @@ -534,125 +502,74 @@ Процедура Зашифровать(Команда) Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией( + Неопределено, Команды.Найти("Зашифровать").Заголовок); Возврат; КонецЕсли; Если Объект.Ссылка.Пустая() Тогда - ТекстВопроса = НСтр("ru = 'Данные еще не записаны. Выполнение команды |""Зашифровать"" возможно только после записи данных. | |Данные будут записаны.'"); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); - - Если Результат <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - - Если Не Записать() Тогда - Возврат; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - ПолучитьНавигационнуюСсылку(Объект.Ссылка), - Строка(Объект.Ссылка), - БиблиотекаКартинок.Информация32); - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); - - МассивДанныхДляЗанесенияВБазу = Новый Массив; - МассивОтпечатков = Новый Массив; - - ФайлЗашифрован = РаботаСФайламиКлиент.Зашифровать( - ДанныеФайла, - УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков); - - Если НЕ ФайлЗашифрован Тогда + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеОтветаНаВопросЗаписать", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); Возврат; КонецЕсли; - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, - МассивФайловВРабочемКаталогеДляУдаления, - ИмяРабочегоКаталога); - - РаботаСФайламиКлиент.ИнформироватьОШифровании( - МассивФайловВРабочемКаталогеДляУдаления, ДанныеФайла.Владелец, Объект.Ссылка); - - УстановитьДоступностьЭлементовФормы(); - УстановитьДоступностьКомандСпискаШифрования(); - + ЗашифроватьПродолжение(); КонецПроцедуры &НаКлиенте Процедура Расшифровать(Команда) + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); - МассивДанныхДляЗанесенияВБазу = Новый Массив; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеРасшифровкиНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); - ФайлРасшифрован = РаботаСФайламиКлиент.Расшифровать( - ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу); - - Если НЕ ФайлРасшифрован Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога); - - РаботаСФайламиКлиент.ИнформироватьОРасшифровке( - ДанныеФайла.Владелец, Объект.Ссылка); - - УстановитьДоступностьЭлементовФормы(); - - УстановитьДоступностьКомандСпискаШифрования(); + РаботаСФайламиСлужебныйКлиент.Расшифровать( + Обработчик, + ДанныеФайла.Ссылка, + УникальныйИдентификатор, + ДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура ДобавитьЭЦПИзФайла(Команда) +Процедура ДобавитьПодписьИзФайла(Команда) ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Объект.Ссылка); - Если РаботаСФайламиКлиент.ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор) Тогда - УстановитьДоступностьЭлементовФормы(); - ЗаполнитьСписокПодписей(); - УстановитьДоступностьКомандСпискаЭЦП(); - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаЗавершение", ЭтотОбъект); + + РаботаСФайламиСлужебныйКлиент.ДобавитьПодписьИзФайла(Обработчик, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте -Процедура СохранитьВместеСЭЦП(Команда) +Процедура СохранитьВместеСПодписью(Команда) ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения(Объект.Ссылка); - РаботаСФайламиКлиент.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); + РаботаСФайламиСлужебныйКлиент.СохранитьСПодписью(Неопределено, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте Процедура ОткрытьПодпись(Команда) - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); + ЭлектроннаяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); КонецПроцедуры &НаКлиенте Процедура Проверить(Команда) - ВыполнятьПроверкуЭЦПНаСервере = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ВыполнятьПроверкуЭЦПНаСервере; + ВыполнятьПроверкуЭПНаСервере = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ВыполнятьПроверкуЭПНаСервере; - Если ВыполнятьПроверкуЭЦПНаСервере И НЕ Объект.Зашифрован Тогда + Если ВыполнятьПроверкуЭПНаСервере И НЕ Объект.Зашифрован Тогда ДанныеВыделенныхСтрок = Новый Массив; ИменаКолонок = ""; Для Каждого ИмяКолонки Из ОписаниеКолонокТаблицыПодписей Цикл @@ -676,24 +593,16 @@ Индекс = Индекс + 1; КонецЦикла; Иначе - + ПолучитьДанныеФайлаЕслиНекорректны(); - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); - Пароль = ""; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("МенеджерКриптографии", МенеджерКриптографии); + Обработчик = Новый ОписаниеОповещения("ПроверитьПослеПолученияПароля", ЭтотОбъект, ПараметрыОбработчика); - Если Не ПолучитьПарольДляРасшифровки(Пароль) Тогда - Возврат; - КонецЕсли; - - Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл - ДанныеСтроки = Элементы.ТаблицаПодписей.ДанныеСтроки(Элемент); - - Если ДанныеСтроки.Объект <> Неопределено И (НЕ ДанныеСтроки.Объект.Пустая()) Тогда - ПроверитьОднуПодпись(ДанныеСтроки, МенеджерКриптографии, Пароль); - КонецЕсли; - КонецЦикла; + ПолучитьПарольДляРасшифровки(Обработчик); КонецЕсли; @@ -702,9 +611,9 @@ &НаКлиенте Процедура ПроверитьВсе(Команда) - ВыполнятьПроверкуЭЦПНаСервере = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ВыполнятьПроверкуЭЦПНаСервере; + ВыполнятьПроверкуЭПНаСервере = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки().ВыполнятьПроверкуЭПНаСервере; - Если ВыполнятьПроверкуЭЦПНаСервере И НЕ Объект.Зашифрован Тогда + Если ВыполнятьПроверкуЭПНаСервере И НЕ Объект.Зашифрован Тогда ДанныеСтрок = Новый Массив; ИменаКолонок = ""; Для Каждого ИмяКолонки Из ОписаниеКолонокТаблицыПодписей Цикл @@ -728,18 +637,13 @@ КонецЦикла; Иначе - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); - Пароль = ""; - Если Не ПолучитьПарольДляРасшифровки(Пароль) Тогда - Возврат; - КонецЕсли; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("МенеджерКриптографии", МенеджерКриптографии); + Обработчик = Новый ОписаниеОповещения("ПроверитьВсеПослеПолученияПароля", ЭтотОбъект, ПараметрыОбработчика); - Для Каждого Строка Из ТаблицаПодписей Цикл - Если Строка.Объект <> Неопределено И (НЕ Строка.Объект.Пустая()) Тогда - ПроверитьОднуПодпись(Строка, МенеджерКриптографии, Пароль); - КонецЕсли; - КонецЦикла; + ПолучитьПарольДляРасшифровки(Обработчик); КонецЕсли; @@ -753,7 +657,7 @@ КонецЕсли; Если Элементы.ТаблицаПодписей.ТекущиеДанные.Объект <> Неопределено И (НЕ Элементы.ТаблицаПодписей.ТекущиеДанные.Объект.Пустая()) Тогда - ЭлектроннаяЦифроваяПодписьКлиент.СохранитьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные.АдресПодписи); + ЭлектроннаяПодписьКлиент.СохранитьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные.АдресПодписи); КонецЕсли; КонецПроцедуры @@ -761,7 +665,193 @@ &НаКлиенте Процедура Удалить(Команда) - Ответ = Вопрос(НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); + Обработчик = Новый ОписаниеОповещения("УдалитьЗавершение", ЭтотОбъект); + + ПоказатьВопрос(Обработчик, НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСертификатШифрования(Команда) + ОткрытьСертификатШифрованияВыполнить(); +КонецПроцедуры + +// СтандартныеПодсистемы.Свойства + +&НаКлиенте +Процедура Подключаемый_РедактироватьСоставСвойств() + + УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтотОбъект, Объект.Ссылка); + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Свойства + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПередЗакрытиемПослеОтветаНаВопросОткрытьДляРедактирования(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + РаботаСФайламиСлужебныйКлиент.РедактироватьСОповещением(Неопределено, Объект.Ссылка, УникальныйИдентификатор); + КонецЕсли; + ПолученОтветНаВопросОткрытьДляРедактирования = Истина; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытииЗавершение() + УстановитьДоступностьКомандСпискаЭП(); + УстановитьДоступностьКомандСпискаШифрования(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытииПослеОтветаНаВопросСкопироватьСведения(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + КопироватьПодписиЭП = Истина; + КонецЕсли; + ПриОткрытииЗавершение(); +КонецПроцедуры + +&НаКлиенте +Процедура ПрочитатьИУстановитьДоступностьЭлементовФормы(Результат, ПараметрыВыполнения) Экспорт + Прочитать(); + УстановитьДоступностьЭлементовФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьПослеОтветаНаВопросЗаписать(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + Если Не Записать() Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(Объект.Ссылка), + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + + ПодписатьПродолжение(); +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьПродолжение() + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(Объект.Ссылка); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ПодписатьПослеФормированияПодписи", ЭтотОбъект, ПараметрыОбработчика); + РаботаСФайламиСлужебныйКлиент.СформироватьПодписьФайла(Обработчик, ДанныеФайла); +КонецПроцедуры + +&НаКлиенте +Процедура ПодписатьПослеФормированияПодписи(Результат, ПараметрыВыполнения) Экспорт + Если Результат.Успех <> Истина Тогда + Возврат; + КонецЕсли; + + ПодписатьЭПСервер(Результат.ДанныеПодписи); + + ЭлектроннаяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + ОповещениеПараметр = Новый Структура("Событие", "ПрисоединенныйФайлПодписан"); + Оповестить("Запись_Файл", ОповещениеПараметр, ПараметрыВыполнения.ДанныеФайла.Владелец); + + УстановитьДоступностьЭлементовФормы(); + УстановитьДоступностьКомандСпискаЭП(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПослеОтветаНаВопросЗаписать(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + + Если Не Записать() Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(Объект.Ссылка), + Строка(Объект.Ссылка), + БиблиотекаКартинок.Информация32); + + ЗашифроватьПродолжение(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПродолжение() + ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(Объект.Ссылка); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеШифрованияНаКлиенте", ЭтотОбъект, ПараметрыОбработчика); + + РаботаСФайламиСлужебныйКлиент.Зашифровать( + Обработчик, + ДанныеФайла, + УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьПослеШифрованияНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; + + ЗашифроватьСервер( + Результат.МассивДанныхДляЗанесенияВБазу, + Результат.МассивОтпечатков, + МассивФайловВРабочемКаталогеДляУдаления, + ИмяРабочегоКаталога); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОШифровании( + МассивФайловВРабочемКаталогеДляУдаления, + ПараметрыВыполнения.ДанныеФайла.Владелец, + Объект.Ссылка); + + УстановитьДоступностьЭлементовФормы(); + УстановитьДоступностьКомандСпискаШифрования(); + +КонецПроцедуры + +&НаКлиенте +Процедура РасшифроватьПослеРасшифровкиНаКлиенте(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + РасшифроватьСервер(Результат.МассивДанныхДляЗанесенияВБазу, ИмяРабочегоКаталога); + + РаботаСФайламиСлужебныйКлиент.ИнформироватьОРасшифровке( + ПараметрыВыполнения.ДанныеФайла.Владелец, + Объект.Ссылка); + + УстановитьДоступностьЭлементовФормы(); + УстановитьДоступностьКомандСпискаШифрования(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьПодписьИзФайлаЗавершение(Результат, ПараметрыВыполнения) Экспорт + Если Результат = Истина Тогда + УстановитьДоступностьЭлементовФормы(); + ЗаполнитьСписокПодписей(); + УстановитьДоступностьКомандСпискаЭП(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЗавершение(Ответ, ПараметрыВыполнения) Экспорт Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; @@ -776,30 +866,39 @@ Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлПодписан"), Объект.ВладелецФайла); - УстановитьДоступностьКомандСпискаЭЦП(); + УстановитьДоступностьКомандСпискаЭП(); УстановитьДоступностьЭлементовФормы(); КонецПроцедуры &НаКлиенте -Процедура ОткрытьСертификатШифрования(Команда) - ОткрытьСертификатШифрованияВыполнить(); +Процедура ПроверитьПослеПолученияПароля(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + + Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл + ДанныеСтроки = Элементы.ТаблицаПодписей.ДанныеСтроки(Элемент); + + Если ДанныеСтроки.Объект <> Неопределено И Не ДанныеСтроки.Объект.Пустая() Тогда + ПроверитьОднуПодпись(ДанныеСтроки, ПараметрыВыполнения.МенеджерКриптографии, Результат.Пароль); + КонецЕсли; + КонецЦикла; КонецПроцедуры -// СтандартныеПодсистемы.Свойства - &НаКлиенте -Процедура Подключаемый_РедактироватьСоставСвойств() - - УправлениеСвойствамиКлиент.РедактироватьСоставСвойств(ЭтаФорма, Объект.Ссылка); +Процедура ПроверитьВсеПослеПолученияПароля(Результат, ПараметрыВыполнения) Экспорт + Если Не Результат.Успех Тогда + Возврат; + КонецЕсли; + Для Каждого ДанныеСтроки Из ТаблицаПодписей Цикл + Если ДанныеСтроки.Объект <> Неопределено И Не ДанныеСтроки.Объект.Пустая() Тогда + ПроверитьОднуПодпись(ДанныеСтроки, ПараметрыВыполнения.МенеджерКриптографии, Результат.Пароль); + КонецЕсли; + КонецЦикла; КонецПроцедуры -// Конец СтандартныеПодсистемы.Свойства - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаСервереБезКонтекста Процедура ПроверитьПодписиНаСервере(ДанныеВыделенныхСтрок) @@ -814,7 +913,7 @@ // Источник - ссылка на "Файл" откуда копируется прикрепленный Файл. // &НаСервере -Функция СоздатьКопиюВерсии(Приемник, Источник, КопироватьПодписиЭЦП) +Функция СоздатьКопиюВерсии(Приемник, Источник, КопироватьПодписиЭП) Если Не Источник.ТекущаяВерсия.Пустая() Тогда @@ -844,20 +943,20 @@ Прочитать(); - Если КопироватьПодписиЭЦП Тогда + Если КопироватьПодписиЭП Тогда ФайлОбъект = Объект.Ссылка.ПолучитьОбъект(); - ФайлОбъект.ПодписанЭЦП = Истина; + ФайлОбъект.ПодписанЭП = Истина; ФайлОбъект.Записать(); ВерсияОбъект = Объект.ТекущаяВерсия.ПолучитьОбъект(); - Для Каждого Строка Из Источник.ТекущаяВерсия.ЭлектронныеЦифровыеПодписи Цикл - НоваяСтрока = ВерсияОбъект.ЭлектронныеЦифровыеПодписи.Добавить(); + Для Каждого Строка Из Источник.ТекущаяВерсия.ЭлектронныеПодписи Цикл + НоваяСтрока = ВерсияОбъект.ЭлектронныеПодписи.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); КонецЦикла; - ВерсияОбъект.ПодписанЭЦП = Истина; + ВерсияОбъект.ПодписанЭП = Истина; ВерсияОбъект.Записать(); ПрочитатьИЗаполнитьПодписи(); @@ -898,19 +997,19 @@ Элементы.ОткрытьКаталогФайла.Доступность = ДоступныДействияСФайлом; Элементы.СохранитьКак.Доступность = ДоступныДействияСФайлом; - Элементы.Редактировать.Доступность = НЕ Объект.ПодписанЭЦП; + Элементы.Редактировать.Доступность = НЕ Объект.ПодписанЭП; Элементы.ЗакончитьРедактирование.Доступность = Не Объект.Редактирует.Пустая(); Элементы.ПолноеНаименование.ТолькоПросмотр = НЕ Объект.Редактирует.Пустая(); - Элементы.Занять.Доступность = Объект.Редактирует.Пустая() И (ДоступныДействияСФайлом) И НЕ Объект.ПодписанЭЦП; + Элементы.Занять.Доступность = Объект.Редактирует.Пустая() И (ДоступныДействияСФайлом) И НЕ Объект.ПодписанЭП; Элементы.СохранитьИзменения.Доступность = Не Объект.Редактирует.Пустая(); - Элементы.ОбновитьИзФайлаНаДиске.Доступность = ДоступныДействияСФайлом И НЕ Объект.ПодписанЭЦП; + Элементы.ОбновитьИзФайлаНаДиске.Доступность = ДоступныДействияСФайлом И НЕ Объект.ПодписанЭП; Элементы.ФормаПодписать.Доступность = (ДоступныДействияСФайлом И Объект.Редактирует.Пустая()) ИЛИ НЕ ДоступныДействияСФайлом; Элементы.ФормаЗашифровать.Доступность = (ДоступныДействияСФайлом И Объект.Редактирует.Пустая() И НЕ Объект.Зашифрован) ИЛИ НЕ ДоступныДействияСФайлом; - Элементы.ФормаДобавитьЭЦПИзФайла.Доступность = ДоступныДействияСФайлом И Объект.Редактирует.Пустая(); - Элементы.ФормаСохранитьВместеСЭЦП.Доступность = ДоступныДействияСФайлом И Объект.ПодписанЭЦП; + Элементы.ФормаДобавитьПодписьИзФайла.Доступность = ДоступныДействияСФайлом И Объект.Редактирует.Пустая(); + Элементы.ФормаСохранитьВместеСПодписью.Доступность = ДоступныДействияСФайлом И Объект.ПодписанЭП; Элементы.ФормаРасшифровать.Доступность = ДоступныДействияСФайлом И Объект.Зашифрован; КонецПроцедуры @@ -961,22 +1060,22 @@ ТаблицаПодписей.Очистить(); - Если Объект.ПодписанЭЦП Тогда + Если Объект.ПодписанЭП Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ЭлектронныеЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, - | ЭлектронныеЦифровыеПодписи.ДатаПодписи КАК ДатаПодписи, - | ЭлектронныеЦифровыеПодписи.Комментарий КАК Комментарий, - | ЭлектронныеЦифровыеПодписи.Подпись КАК Подпись, - | ЭлектронныеЦифровыеПодписи.Отпечаток КАК Отпечаток, - | ЭлектронныеЦифровыеПодписи.УстановившийПодпись КАК УстановившийПодпись, - | ЭлектронныеЦифровыеПодписи.НомерСтроки КАК НомерСтроки, - | ЭлектронныеЦифровыеПодписи.Сертификат КАК Сертификат + | ЭлектронныеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронныеПодписи.ДатаПодписи КАК ДатаПодписи, + | ЭлектронныеПодписи.Комментарий КАК Комментарий, + | ЭлектронныеПодписи.Подпись КАК Подпись, + | ЭлектронныеПодписи.Отпечаток КАК Отпечаток, + | ЭлектронныеПодписи.УстановившийПодпись КАК УстановившийПодпись, + | ЭлектронныеПодписи.НомерСтроки КАК НомерСтроки, + | ЭлектронныеПодписи.Сертификат КАК Сертификат |ИЗ - | Справочник.ВерсииФайлов.ЭлектронныеЦифровыеПодписи КАК ЭлектронныеЦифровыеПодписи + | Справочник.ВерсииФайлов.ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | ЭлектронныеЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + | ЭлектронныеПодписи.Ссылка = &ОбъектСсылка"; Запрос.Параметры.Вставить("ОбъектСсылка", Объект.ТекущаяВерсия); ВыборкаЗапроса = Запрос.Выполнить().Выбрать(); @@ -1014,7 +1113,7 @@ НСтр("ru = 'ЭП (%1)'"), Формат(ТаблицаПодписей.Количество(), "ЧГ=")); КонецЕсли; - Элементы.ГруппаЭЦП.Заголовок = ТекстЗаголовка; + Элементы.ГруппаЭП.Заголовок = ТекстЗаголовка; КонецПроцедуры @@ -1098,7 +1197,7 @@ КонецПроцедуры &НаСервере -Процедура ПодписатьЭЦПСервер(ДанныеПодписи) +Процедура ПодписатьЭПСервер(ДанныеПодписи) РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи( ДанныеПодписи, УникальныйИдентификатор); @@ -1170,7 +1269,7 @@ ДвоичныеДанныеФайла = МенеджерКриптографии.Расшифровать(ДвоичныеДанныеФайла); КонецЕсли; - ЭлектроннаяЦифроваяПодписьКлиент.ПроверитьПодпись(МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); + ЭлектроннаяПодписьКлиент.ПроверитьПодпись(МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); ДанныеСтроки.Статус = НСтр("ru = 'Верна'"); ДанныеСтроки.Неверна = Ложь; @@ -1184,41 +1283,55 @@ КонецПроцедуры &НаКлиенте -Функция ПолучитьПарольДляРасшифровки(Пароль) - Пароль = ""; +Процедура ПолучитьПарольДляРасшифровки(ОбработчикРезультата) + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("Успех", Ложь); + ПараметрыВыполнения.Вставить("Пароль", ""); - Если Объект.Зашифрован Тогда - - ПредставленияСертификатов = ""; - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Отпечаток = СтруктураСертификата.Отпечаток; - - ТолькоВЛичномХранилище = Истина; - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); - Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом - Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда - ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; - КонецЕсли; - ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; - КонецЕсли; - - КонецЦикла; - - Пароль = ""; - ЗаголовокФормы = НСтр("ru = 'Введите пароль для расшифровки'"); - ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов, Файл", - ЗаголовокФормы, ПредставленияСертификатов, Объект.Ссылка); - КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); - Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда - Пароль = КодВозврата; - Иначе - Возврат Ложь; - КонецЕсли; + Если Не Объект.Зашифрован Тогда + ПараметрыВыполнения.Успех = Истина; + ФайловыеФункцииСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; КонецЕсли; - Возврат Истина; -КонецФункции + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Файл", Объект.Ссылка); + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Введите пароль для расшифровки'")); + ПараметрыФормы.Вставить("ПредставленияСертификатов", ПредставленияСертификатов); + + Обработчик = Новый ОписаниеОповещения("ПолучитьПарольДляРасшифровкиПослеВводаПароля", ЭтотОбъект, ПараметрыВыполнения); + + ОткрытьФорму("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьПарольДляРасшифровкиПослеВводаПароля(Результат, ПараметрыВыполнения) Экспорт + Если ТипЗнч(Результат) <> Тип("Строка") Тогда + ФайловыеФункцииСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + ПараметрыВыполнения.Пароль = Результат; + ПараметрыВыполнения.Успех = Истина; + ФайловыеФункцииСлужебныйКлиент.ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); +КонецПроцедуры &НаСервере Процедура УдалитьПодписиИОбновитьСписок(РеквизитПодписанИзменен) @@ -1249,7 +1362,7 @@ &НаКлиенте -Процедура УстановитьДоступностьКомандСпискаЭЦП() +Процедура УстановитьДоступностьКомандСпискаЭП() ЕстьПодписи = (ТаблицаПодписей.Количество() <> 0); @@ -1284,13 +1397,13 @@ Если НЕ ПустаяСтрока(ТекущиеДанные.АдресСертификата) Тогда ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(ТекущиеДанные.АдресСертификата); Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Иначе - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); + СтруктураСертификата = ЭлектроннаяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); КонецЕсли; Если СтруктураСертификата <> Неопределено Тогда - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьСертификатСоСтруктурой(СтруктураСертификата, Отпечаток, ТекущиеДанные.АдресСертификата); + ЭлектроннаяПодписьКлиент.ОткрытьСертификатСоСтруктурой(СтруктураСертификата, Отпечаток, ТекущиеДанные.АдресСертификата); КонецЕсли; КонецПроцедуры @@ -1300,7 +1413,7 @@ &НаСервере Процедура ОбновитьЭлементыДополнительныхРеквизитов() - УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтаФорма); + УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl b/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl deleted file mode 100644 index e92c14748..000000000 --- a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Module.bsl +++ /dev/null @@ -1,1266 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Если Параметры.Свойство("Папка") = Истина И Параметры.Папка <> Неопределено Тогда - ПапкаПриОткрытии = Параметры.Папка; - Иначе - ПапкаПриОткрытии = ОбщегоНазначения.ХранилищеНастроекДанныхФормЗагрузить("ХранилищеФайлов", "ТекущаяПапка"); - КонецЕсли; - - Если ПапкаПриОткрытии = Справочники.ПапкиФайлов.ПустаяСсылка() Тогда - ПапкаПриОткрытии = Справочники.ПапкиФайлов.Шаблоны; - Иначе - ПапкаПриОткрытииОбъект = Неопределено; - Попытка - ПапкаПриОткрытииОбъект = ПапкаПриОткрытии.ПолучитьОбъект(); - Исключение - КонецПопытки; - - Если ПапкаПриОткрытииОбъект = Неопределено Тогда - ПапкаПриОткрытии = Справочники.ПапкиФайлов.Шаблоны; - КонецЕсли; - КонецЕсли; - - Элементы.Папки.ТекущаяСтрока = ПапкаПриОткрытии; - - Список.Параметры.УстановитьЗначениеПараметра( - "Владелец", ПапкаПриОткрытии); - Список.Параметры.УстановитьЗначениеПараметра( - "ТекущийПользователь", Пользователи.ТекущийПользователь()); - - РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьУсловноеОформлениеСпискаФайлов(Список); - - ПоказыватьКолонкуРазмер = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПоказыватьКолонкуРазмер(); - Если ПоказыватьКолонкуРазмер = Ложь Тогда - Элементы.ТекущаяВерсияРазмер.Видимость = Ложь; - КонецЕсли; - - ИспользоватьИерархию = Истина; - УстановитьИерархию(ИспользоватьИерархию); - - Если РаботаСФайламиСлужебныйВызовСервера.ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() = Ложь Тогда - Элементы.ПодписанЭЦП.Видимость = Ложь; - Элементы.Зашифрован.Видимость = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если ПапкаПриОткрытии <> Элементы.Папки.ТекущаяСтрока Тогда - ПриЗакрытииНаСервере(); - КонецЕсли; -КонецПроцедуры - -&НаСервере -Процедура ПриЗакрытииНаСервере() - ОбщегоНазначения.ХранилищеНастроекДанныхФормСохранить( - "ХранилищеФайлов", - "ТекущаяПапка", - Элементы.Папки.ТекущаяСтрока); -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "ИмпортФайловЗавершен" Тогда - Элементы.Список.Обновить(); - - Если Параметр <> Неопределено Тогда - Элементы.Список.ТекущаяСтрока = Параметр; - КонецЕсли; - КонецЕсли; - - Если ИмяСобытия = "ИмпортКаталоговЗавершен" Тогда - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); - - Если Источник <> Неопределено Тогда - Элементы.Папки.ТекущаяСтрока = Источник; - КонецЕсли; - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "СозданФайл" Тогда - - Если Параметр <> Неопределено Тогда - ВладелецФайла = Неопределено; - Если Параметр.Свойство("Владелец", ВладелецФайла) Тогда - Если ВладелецФайла = Элементы.Папки.ТекущаяСтрока Тогда - Элементы.Список.Обновить(); - - ФайлСозданный = Неопределено; - Если Параметр.Свойство("Файл", ФайлСозданный) Тогда - Элементы.Список.ТекущаяСтрока = ФайлСозданный; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - Если ИмяСобытия = "Запись_Файл" И Параметр.Событие = "ДанныеФайлаИзменены" Тогда - УстановитьДоступностьФайловыхКоманд(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ПапкиФайлов.Форма.ФормаВыбора") Тогда - - Если ВыбранноеЗначение = Неопределено Тогда - Возврат; - КонецЕсли; - - ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; - РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПапку(ВыделенныеСтроки, ВыбранноеЗначение); - - Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ВыделеннаяСтрока); - КонецЦикла; - - Элементы.Список.Обновить(); - - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки) - - УстановитьИерархию(Настройки["ИспользоватьИерархию"]); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаКлиенте -Процедура ПоискПриИзменении(Элемент) - НайтиФайлыИлиПапки(); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Список - -&НаКлиенте -Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - Если ТипЗнч(ВыбраннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат; - КонецЕсли; - - - СтандартнаяОбработка = Ложь; - - КакОткрывать = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ДействиеПоДвойномуЩелчкуМыши; - - Если КакОткрывать = "ОткрыватьКарточку" Тогда - ОткрытьЗначение(ВыбраннаяСтрока); - Возврат; - КонецЕсли; - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - Если ИмяКаталога = Неопределено ИЛИ ПустаяСтрока(ИмяКаталога) Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - ВыбраннаяСтрока, - Неопределено, - УникальныйИдентификатор, - Неопределено, - ПредыдущийАдресФайла); - - ВыбранныйРежим = РаботаСФайламиКлиент.ВыбратьРежимИРедактироватьФайл(ДанныеФайла, Истина); - Если ВыбранныйРежим = "Редактировать" Тогда - УстановитьДоступностьФайловыхКоманд(); - Возврат; - ИначеЕсли ВыбранныйРежим = "Отмена" Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) - - Если Элементы.Папки.ТекущаяСтрока = Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - Если Элементы.Папки.ТекущаяСтрока.Пустая() Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - ВладелецФайла = Элементы.Папки.ТекущаяСтрока; - ФайлОснование = Элементы.Список.ТекущаяСтрока; - - Отказ = Истина; - - Если Не Копирование Тогда - - Попытка - РаботаСФайламиКлиент.СозданиеНовогоФайла(ВладелецФайла, ЭтаФорма); - Исключение - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла( - ИнформацияОбОшибке())); - КонецПопытки; - Иначе - РаботаСФайламиКлиент.СкопироватьФайл(ВладелецФайла, ФайлОснование); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; -КонецПроцедуры - -&НаКлиенте -Процедура СписокПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; - - Если Элементы.Папки.ТекущаяСтрока = Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - Если Элементы.Папки.ТекущаяСтрока.Пустая() Тогда - Возврат; - КонецЕсли; - - МассивИменФайлов = Новый Массив; - ЭтоПеретаскиваниеФайловИзвне = Ложь; - - Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда - РаботаСФайламиКлиент.СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, Элементы.Папки.ТекущаяСтрока, ЭтаФорма); - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда - ЭтоПеретаскиваниеФайловИзвне = Истина; - МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя); - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда - - ЭтоПеретаскиваниеФайловИзвне = Истина; - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - МассивИменФайлов.Добавить(ФайлПринятый.ПолноеИмя); - КонецЦикла; - - ИначеЕсли ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование - И ПараметрыПеретаскивания.Значение.Количество() >= 1 - И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.Файлы") Тогда - - РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлы( - ПараметрыПеретаскивания.Значение, Элементы.Папки.ТекущаяСтрока); - - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); - - Если ПараметрыПеретаскивания.Значение.Количество() = 1 Тогда - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |скопирован в папку ""%2""'"), - ПараметрыПеретаскивания.Значение[0], - Строка(Элементы.Папки.ТекущаяСтрока)); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл скопирован.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - Иначе - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файлы (%1 шт.) скопированы в папку ""%2""'"), - ПараметрыПеретаскивания.Значение.Количество(), - Строка(Элементы.Папки.ТекущаяСтрока)); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файлы скопированы.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - - Если ЭтоПеретаскиваниеФайловИзвне = Истина Тогда - - ПараметрыИмпорта = Новый Структура; - ПараметрыИмпорта.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); - ПараметрыИмпорта.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаПеретаскивания", ПараметрыИмпорта); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура СписокПриАктивизацииСтроки(Элемент) - УстановитьДоступностьФайловыхКоманд(); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Папки - -&НаКлиенте -Процедура ПапкиПриАктивизацииСтроки(Элемент) - - Если Элементы.Папки.ТекущаяСтрока = Неопределено ИЛИ Элементы.Папки.ТекущаяСтрока.Пустая() Тогда - Элементы.СоздатьФайл.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокСоздать.Доступность = Ложь; - Иначе - Элементы.СоздатьФайл.Доступность = Истина; - Элементы.КонтекстноеМенюСписокСоздать.Доступность = Истина; - КонецЕсли; - - Если Элементы.Папки.ТекущаяСтрока <> Неопределено Тогда - ПодключитьОбработчикОжидания("ОбработкаОжидания", 0.2, Истина); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПапкиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; -КонецПроцедуры - -&НаКлиенте -Процедура ПапкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) - СтандартнаяОбработка = Ложь; - - Если Строка = Неопределено Тогда - Возврат; - КонецЕсли; - - МассивИменФайлов = Новый Массив; - ЭтоПеретаскиваниеФайловИзвне = Ложь; - - Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда - РаботаСФайламиКлиент.СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, Элементы.Папки.ТекущаяСтрока, ЭтаФорма); - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда - ЭтоПеретаскиваниеФайловИзвне = Истина; - МассивИменФайлов.Добавить(ПараметрыПеретаскивания.Значение.ПолноеИмя); - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда - ЭтоПеретаскиваниеФайловИзвне = Истина; - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - МассивИменФайлов.Добавить(ФайлПринятый.ПолноеИмя); - КонецЦикла; - КонецЕсли; - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.Файлы") Тогда - - Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование Тогда - - РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлы( - ПараметрыПеретаскивания.Значение, Строка); - - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); - - Если ПараметрыПеретаскивания.Значение.Количество() = 1 Тогда - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |скопирован в папку ""%2""'"), - ПараметрыПеретаскивания.Значение[0], - Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл скопирован.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - Иначе - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файлы (%1 шт.) скопированы в папку ""%2""'"), - ПараметрыПеретаскивания.Значение.Количество(), - Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файлы скопированы.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - КонецЕсли; - Возврат; - - Иначе - - Если РаботаСФайламиСлужебныйВызовСервера.УстановитьВладельцаФайла(ПараметрыПеретаскивания.Значение, Строка) = Истина Тогда - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); - - Если ПараметрыПеретаскивания.Значение.Количество() = 1 Тогда - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |перенесен в папку ""%2""'"), - ПараметрыПеретаскивания.Значение[0], - Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл перенесен.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - Иначе - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файлы (%1 шт.) перенесены в папку ""%2""'"), ПараметрыПеретаскивания.Значение.Количество(), Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файлы перенесены.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - КонецЕсли; - КонецЕсли; - Возврат; - - КонецЕсли; - - КонецЕсли; - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.ПапкиФайлов") Тогда - НайденоЗацикливание = Ложь; - Если РаботаСФайламиСлужебныйВызовСервера.СменитьРодителяПапок(ПараметрыПеретаскивания.Значение, Строка, НайденоЗацикливание) = Истина Тогда - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); - - Если ПараметрыПеретаскивания.Значение.Количество() = 1 Тогда - Элементы.Папки.ТекущаяСтрока = ПараметрыПеретаскивания.Значение[0]; - - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Папка ""%1"" - |перенесена в папку ""%2""'"), - ПараметрыПеретаскивания.Значение[0], - Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Папка перенесена.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - Иначе - ПолноеОписание = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Папки (%1 шт.) перенесены в папку ""%2""'"), - ПараметрыПеретаскивания.Значение.Количество(), - Строка); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Папки перенесены.'"), - , - ПолноеОписание, - БиблиотекаКартинок.Информация32); - КонецЕсли; - - Иначе - Если НайденоЗацикливание = Истина Тогда - Предупреждение(НСтр("ru = 'Зацикливание уровней.'")); - КонецЕсли; - КонецЕсли; - Возврат; - КонецЕсли; - - КонецЕсли; - - Если ЭтоПеретаскиваниеФайловИзвне = Истина Тогда - - ПараметрыИмпорта = Новый Структура; - ПараметрыИмпорта.Вставить("ПапкаДляДобавления", Строка); - ПараметрыИмпорта.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаПеретаскивания", ПараметрыИмпорта); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ИмпортФайловВыполнить() - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если НЕ РасширениеПодключено Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); - Иначе - // заранее выбираем файлы (до открытия диалога импорта) - Режим = РежимДиалогаВыбораФайла.Открытие; - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.Фильтр = Фильтр; - ДиалогОткрытияФайла.МножественныйВыбор = Истина; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите файлы'"); - Если ДиалогОткрытияФайла.Выбрать() Тогда - МассивИменФайлов = Новый Массив; - - МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; - Для Каждого ИмяФайла Из МассивФайлов Цикл - МассивИменФайлов.Добавить(ИмяФайла); - КонецЦикла; - - ПараметрыИмпорта = Новый Структура; - ПараметрыИмпорта.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); - ПараметрыИмпорта.Вставить("МассивИменФайлов", МассивИменФайлов); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаФайлов", ПараметрыИмпорта); - КонецЕсли; - КонецЕсли -КонецПроцедуры - -&НаКлиенте -Процедура ИмпортПапки(Команда) - #Если ВебКлиент Тогда - Предупреждение( - НСтр("ru = 'В веб-клиенте импорт папок не поддерживается. - |Используйте команду ""Создать"" в списке файлов.'")); - #Иначе - - // заранее выбираем каталог на диске (до открытия диалога импорта) - Каталог = ""; - Режим = РежимДиалогаВыбораФайла.ВыборКаталога; - - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - Фильтр = НСтр("ru = 'Все файлы(*.*)|*.*'"); - ДиалогОткрытияФайла.Фильтр = Фильтр; - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите каталог'"); - Если ДиалогОткрытияФайла.Выбрать() Тогда - КаталогНаДиске = ДиалогОткрытияФайла.Каталог; - - ПараметрыИмпорта = Новый Структура; - ПараметрыИмпорта.Вставить("ПапкаДляДобавления", Элементы.Папки.ТекущаяСтрока); - ПараметрыИмпорта.Вставить("КаталогНаДиске", КаталогНаДиске); - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаИмпортаПапки", ПараметрыИмпорта); - КонецЕсли; - - #КонецЕсли -КонецПроцедуры - -&НаКлиенте -Процедура ЭкспортПапкиВыполнить() - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПапкаЭкспорта", Элементы.Папки.ТекущаяСтрока); - ОткрытьФорму("Справочник.Файлы.Форма.ФормаЭкспортаПапки", ПараметрыФормы); - -КонецПроцедуры - -&НаКлиенте -Процедура НайтиВыполнить() - - Если СтрокаПоиска = "" Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Не указан текст для поиска.'"), , "СтрокаПоиска"); - Возврат; - КонецЕсли; - - НайтиФайлыИлиПапки(); - -КонецПроцедуры - -&НаКлиенте -Процедура НайтиФайлыИлиПапки() - - Если СтрокаПоиска = "" Тогда - Возврат; - КонецЕсли; - - Результат = НайтиФайлыИлиПапкиСервер(); - - Если Результат = "НичегоНеНайдено" Тогда - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось найти файл или папку, - |наименование или код которых содержит ""%1"".'"), - СтрокаПоиска )); - Иначе - Если Результат = "НайденФайл" Тогда - ТекущийЭлемент = Элементы.Список; - Иначе - Если Результат = "НайденаПапка" Тогда - ТекущийЭлемент = Элементы.Папки; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Элементы.Папки.Обновить(); - Элементы.Список.Обновить(); -КонецПроцедуры - -&НаСервере -Функция СтрЗаменитьСпецСимволом(Строка, Символ, СпецСимвол) - СтрокаНовая = СтрЗаменить(Строка, Символ, СпецСимвол + Символ); - Возврат СтрокаНовая; -КонецФункции - -&НаСервере -Функция НайтиФайлыИлиПапкиСервер() - - Перем НайденныйФайл; - Перем НайденнаяПапка; - - Найдено = Ложь; - - Запрос = Новый Запрос; - - СтрокаПоискаНовая = СтрокаПоиска; - - СпецСимвол = "|"; - СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "[", СпецСимвол); - СтрокаПоискаНовая = СтрЗаменитьСпецСимволом(СтрокаПоискаНовая, "]", СпецСимвол); - - Запрос.Параметры.Вставить("Строка", "%" + СтрокаПоискаНовая + "%"); - - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | Файлы.Ссылка - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.ПолноеНаименование ПОДОБНО &Строка СПЕЦСИМВОЛ ""|"""; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденныйФайл = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | Файлы.Ссылка - |ИЗ - | Справочник.Файлы КАК Файлы - |ГДЕ - | Файлы.Код ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденныйФайл = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ПапкиФайлов.Ссылка - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Наименование ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденнаяПапка = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если Не Найдено Тогда - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 - | ПапкиФайлов.Ссылка - |ИЗ - | Справочник.ПапкиФайлов КАК ПапкиФайлов - |ГДЕ - | ПапкиФайлов.Код ПОДОБНО &Строка"; - - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - НайденнаяПапка = Выборка.Ссылка; - Найдено = Истина; - КонецЕсли; - КонецЕсли; - - Если НайденныйФайл <> Неопределено Тогда - Элементы.Папки.ТекущаяСтрока = НайденныйФайл.ВладелецФайла; - Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); - Элементы.Список.ТекущаяСтрока = НайденныйФайл.Ссылка; - Возврат "НайденФайл"; - КонецЕсли; - - Если НайденнаяПапка <> Неопределено Тогда - Элементы.Папки.ТекущаяСтрока = НайденнаяПапка; - Возврат "НайденаПапка"; - КонецЕсли; - - Возврат "НичегоНеНайдено"; -КонецФункции - -&НаКлиенте -Процедура СоздатьФайлВыполнить() - - Попытка - РаботаСФайламиКлиент.СозданиеНовогоФайла(Элементы.Папки.ТекущаяСтрока, ЭтаФорма); - Исключение - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла( - ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - -&НаКлиенте -Процедура СоздатьПапкуВыполнить() - - ПараметрыСозданияПапки = Новый Структура("Родитель", Элементы.Папки.ТекущаяСтрока); - ОткрытьФорму("Справочник.ПапкиФайлов.ФормаОбъекта", ПараметрыСозданияПапки, Элементы.Папки); - -КонецПроцедуры - -&НаКлиенте -Процедура ИспользоватьИерархию(Команда) - - ИспользоватьИерархию = Не ИспользоватьИерархию; - Если ИспользоватьИерархию И (Элементы.Список.ТекущиеДанные <> Неопределено) Тогда - - Если Элементы.Список.ТекущиеДанные.Свойство("ВладелецФайла") Тогда - Элементы.Папки.ТекущаяСтрока = Элементы.Список.ТекущиеДанные.ВладелецФайла; - Иначе - Элементы.Папки.ТекущаяСтрока = Неопределено; - КонецЕсли; - - Список.Параметры.УстановитьЗначениеПараметра("Владелец", Элементы.Папки.ТекущаяСтрока); - КонецЕсли; - УстановитьИерархию(ИспользоватьИерархию); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьФайлВыполнить() - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, - Неопределено, - УникальныйИдентификатор, - Неопределено, - ПредыдущийАдресФайла); - - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура Редактировать(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.Редактировать(Элементы.Список.ТекущаяСтрока); - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - - -// Доступны файловые команды - есть хотя бы одна строка в списке и выделена не группировка -&НаКлиенте -Функция ФайловыеКомандыДоступны() - - Если Элементы.Список.ТекущаяСтрока = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Возврат Ложь; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -&НаКлиенте -Процедура ЗакончитьРедактирование(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.ЗакончитьРедактирование( - Элементы.Список.ТекущаяСтрока, - УникальныйИдентификатор, - Элементы.Список.ТекущиеДанные.ХранитьВерсии, - Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует, - Элементы.Список.ТекущиеДанные.Автор, - Элементы.Список.ТекущиеДанные.Кодировка); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура Занять(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.Занять(Элементы.Список.ТекущаяСтрока); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура Освободить(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.ОсвободитьФайл( - Элементы.Список.ТекущаяСтрока, - Элементы.Список.ТекущиеДанные.ХранитьВерсии, - Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьИзменения(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - РаботаСФайламиКлиент.ОпубликоватьФайл(Элементы.Список.ТекущаяСтрока, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьКаталогФайла(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытия( - Элементы.Список.ТекущаяСтрока, - Неопределено, - УникальныйИдентификатор, - Неопределено, - ПредыдущийАдресФайла); - - РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Элементы.Список.ТекущаяСтрока, Неопределено, УникальныйИдентификатор); - - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьИзФайлаНаДиске(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( - Элементы.Список.ТекущаяСтрока); - - РаботаСФайламиКлиент.ОбновитьИзФайлаНаДиске(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура СписокПередНачаломИзменения(Элемент, Отказ) - Отказ = Истина; - - ПараметрыОткрытияФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока); - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыОткрытияФормы); -КонецПроцедуры - -&НаКлиенте -Процедура ПеренестиВПапку(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Выбор папки'")); - ПараметрыФормы.Вставить("ТекущаяПапка", Элементы.Папки.ТекущаяСтрока); - ПараметрыФормы.Вставить("РежимВыбора", Истина); - - ОткрытьФорму("Справочник.ПапкиФайлов.ФормаВыбора", ПараметрыФормы, ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура Подписать(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( - Команды.Найти("Подписать").Заголовок); - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( - Элементы.Список.ТекущаяСтрока); - - ДанныеПодписи = Неопределено; - Если РаботаСФайламиКлиент.СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи) Тогда - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи(ДанныеПодписи); - - ЭлектроннаяЦифроваяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ДанныеФайла.Ссылка); - - Оповестить( - "Запись_Файл", - Новый Структура("Событие", "ПрисоединенныйФайлПодписан"), - ДанныеФайла.Владелец); - - КонецЕсли; - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура Зашифровать(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией( - Команды.Найти("Зашифровать").Заголовок); - Возврат; - КонецЕсли; - - ОбъектСсылка = Элементы.Список.ТекущаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); - - МассивДанныхДляЗанесенияВБазу = Новый Массив; - МассивОтпечатков = Новый Массив; - - ФайлЗашифрован = РаботаСФайламиКлиент.Зашифровать( - ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу, МассивОтпечатков); - - Если НЕ ФайлЗашифрован Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - ЗашифроватьСервер( - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков, - МассивФайловВРабочемКаталогеДляУдаления, - ИмяРабочегоКаталога, - ОбъектСсылка); - - РаботаСФайламиКлиент.ИнформироватьОШифровании( - МассивФайловВРабочемКаталогеДляУдаления, - ДанныеФайла.Владелец, - ОбъектСсылка); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаСервере -Процедура ЗашифроватьСервер(МассивДанныхДляЗанесенияВБазу, МассивОтпечатков, - МассивФайловВРабочемКаталогеДляУдаления, - ИмяРабочегоКаталога, ОбъектСсылка) - - Зашифровать = Истина; - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - -КонецПроцедуры - -&НаКлиенте -Процедура Расшифровать(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ОбъектСсылка = Элементы.Список.ТекущаяСтрока; - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИКоличествоВерсий(ОбъектСсылка); - - МассивДанныхДляЗанесенияВБазу = Новый Массив; - - ФайлРасшифрован = РаботаСФайламиКлиент.Расшифровать( - ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу); - - Если НЕ ФайлРасшифрован Тогда - Возврат; - КонецЕсли; - - ИмяРабочегоКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, - ИмяРабочегоКаталога, ОбъектСсылка); - - РаботаСФайламиКлиент.ИнформироватьОРасшифровке( - ДанныеФайла.Владелец, ОбъектСсылка); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаСервере -Процедура РасшифроватьСервер(МассивДанныхДляЗанесенияВБазу, - ИмяРабочегоКаталога, ОбъектСсылка) - - Зашифровать = Ложь; - МассивОтпечатков = Новый Массив; - МассивФайловВРабочемКаталогеДляУдаления = Новый Массив; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОШифровании( - ОбъектСсылка, - Зашифровать, - МассивДанныхДляЗанесенияВБазу, - Неопределено, // УникальныйИдентификатор - ИмяРабочегоКаталога, - МассивФайловВРабочемКаталогеДляУдаления, - МассивОтпечатков); - -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьЭЦПИзФайла(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог( - Элементы.Список.ТекущаяСтрока); - - РаботаСФайламиКлиент.ДобавитьЭЦПИзФайла(ДанныеФайла); - - УстановитьДоступностьФайловыхКоманд(); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьВместеСЭЦП(Команда) - - Если Не ФайловыеКомандыДоступны() Тогда - Возврат; - КонецЕсли; - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляСохранения( - Элементы.Список.ТекущаяСтрока); - - РаботаСФайламиКлиент.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда - Элементы.ФормаЭЦПИШифрование.Видимость = Ложь; - Элементы.ФормаЭЦПИШифрованиеКонтекстное.Видимость = Ложь; - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура Обновить(Команда) - - Если ТекущийЭлемент = Элементы.Папки Тогда - Элементы.Папки.Обновить(); - Иначе - Элементы.Список.Обновить(); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Процедура обновляет правый список -&НаКлиенте -Процедура ОбработкаОжидания() - Если Элементы.Папки.ТекущаяСтрока <> Список.Параметры.Элементы.Найти("Владелец").Значение Тогда - Список.Параметры.УстановитьЗначениеПараметра( - "Владелец", Элементы.Папки.ТекущаяСтрока); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьФайловыхКоманд() - - Если Элементы.Список.ТекущиеДанные <> Неопределено Тогда - - Если ТипЗнч(Элементы.Список.ТекущаяСтрока) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - - УстановитьДоступностьКоманд(Элементы.Список.ТекущиеДанные.РедактируетТекущийПользователь, - Элементы.Список.ТекущиеДанные.Редактирует, Элементы.Список.ТекущиеДанные.ПодписанЭЦП, - Элементы.Список.ТекущиеДанные.Зашифрован); - Возврат; - - КонецЕсли; - - КонецЕсли; - - СделатьКомандыНедоступными(); - -КонецПроцедуры - -&НаКлиенте -Процедура СделатьКомандыНедоступными() - - Элементы.ЗакончитьРедактирование.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = Ложь; - - Элементы.СохранитьИзменения.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = Ложь; - - Элементы.Освободить.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокОсвободить.Доступность = Ложь; - - Элементы.Занять.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокЗанять.Доступность = Ложь; - - Элементы.Редактировать.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокРедактировать.Доступность = Ложь; - - Элементы.ПеренестиВРаздел.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокПеренестиВРаздел.Доступность = Ложь; - - Элементы.ФормаПодписать.Доступность = Ложь; - Элементы.ФормаПодписатьКонтекст.Доступность = Ложь; - - Элементы.ФормаСохранитьВместеСЭЦП.Доступность = Ложь; - Элементы.ФормаСохранитьВместеСЭЦПКонтекст.Доступность = Ложь; - - Элементы.ФормаЗашифровать.Доступность = Ложь; - Элементы.ФормаЗашифроватьКонтекст.Доступность = Ложь; - - Элементы.ФормаРасшифровать.Доступность = Ложь; - Элементы.ФормаРасшифроватьКонтекст.Доступность = Ложь; - - Элементы.ФормаДобавитьЭЦПИзФайла.Доступность = Ложь; - Элементы.ФормаДобавитьЭЦПИзФайлаКонтекст.Доступность = Ложь; - - Элементы.ОбновитьИзФайлаНаДиске.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокОбновитьИзФайлаНаДиске.Доступность = Ложь; - - Элементы.СохранитьКак.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокСохранитьКак.Доступность = Ложь; - - Элементы.ОткрытьКаталогФайла.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокОткрытьКаталогФайла.Доступность = Ложь; - - Элементы.ОткрытьФайл.Доступность = Ложь; - Элементы.КонтекстноеМенюСписокОткрытьФайл.Доступность = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура УстановитьДоступностьКоманд(РедактируетТекущийПользователь, Редактирует, ПодписанЭЦП, Зашифрован) - - РедактируетДругой = Не Редактирует.Пустая() И НЕ РедактируетТекущийПользователь; - - Элементы.ЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; - Элементы.КонтекстноеМенюСписокЗакончитьРедактирование.Доступность = РедактируетТекущийПользователь; - - Элементы.СохранитьИзменения.Доступность = РедактируетТекущийПользователь; - Элементы.КонтекстноеМенюСписокСохранитьИзменения.Доступность = РедактируетТекущийПользователь; - - Элементы.Освободить.Доступность = Не Редактирует.Пустая(); - Элементы.КонтекстноеМенюСписокОсвободить.Доступность = Не Редактирует.Пустая(); - - Элементы.Занять.Доступность = Редактирует.Пустая() И НЕ ПодписанЭЦП; - Элементы.КонтекстноеМенюСписокЗанять.Доступность = Редактирует.Пустая() И НЕ ПодписанЭЦП; - - Элементы.Редактировать.Доступность = НЕ ПодписанЭЦП И НЕ РедактируетДругой; - Элементы.КонтекстноеМенюСписокРедактировать.Доступность = НЕ ПодписанЭЦП И НЕ РедактируетДругой; - - Элементы.ПеренестиВРаздел.Доступность = НЕ ПодписанЭЦП; - Элементы.КонтекстноеМенюСписокПеренестиВРаздел.Доступность = НЕ ПодписанЭЦП; - - Элементы.ФормаПодписать.Доступность = Редактирует.Пустая(); - Элементы.ФормаПодписатьКонтекст.Доступность = Редактирует.Пустая(); - - Элементы.ФормаСохранитьВместеСЭЦП.Доступность = ПодписанЭЦП; - Элементы.ФормаСохранитьВместеСЭЦПКонтекст.Доступность = ПодписанЭЦП; - - Элементы.ФормаЗашифровать.Доступность = Редактирует.Пустая() И НЕ Зашифрован; - Элементы.ФормаЗашифроватьКонтекст.Доступность = Редактирует.Пустая() И НЕ Зашифрован; - - Элементы.ФормаРасшифровать.Доступность = Зашифрован; - Элементы.ФормаРасшифроватьКонтекст.Доступность = Зашифрован; - - Элементы.ФормаДобавитьЭЦПИзФайла.Доступность = Редактирует.Пустая(); - Элементы.ФормаДобавитьЭЦПИзФайлаКонтекст.Доступность = Редактирует.Пустая(); - - Элементы.ОбновитьИзФайлаНаДиске.Доступность = Не ПодписанЭЦП; - Элементы.КонтекстноеМенюСписокОбновитьИзФайлаНаДиске.Доступность = Не ПодписанЭЦП; - - Элементы.СохранитьКак.Доступность = Истина; - Элементы.КонтекстноеМенюСписокСохранитьКак.Доступность = Истина; - - Элементы.ОткрытьКаталогФайла.Доступность = Истина; - Элементы.КонтекстноеМенюСписокОткрытьКаталогФайла.Доступность = Истина; - - Элементы.ОткрытьФайл.Доступность = Истина; - Элементы.КонтекстноеМенюСписокОткрытьФайл.Доступность = Истина; - -КонецПроцедуры - -&НаСервере -Процедура УстановитьИерархию(Отметка) - - Если Отметка = Неопределено Тогда - Возврат; - КонецЕсли; - - Элементы.ИспользоватьИерархию.Пометка = Отметка; - Если Отметка = Истина Тогда - Элементы.Папки.Видимость = Истина; - Иначе - Элементы.Папки.Видимость = Ложь; - КонецЕсли; - Список.Параметры.УстановитьЗначениеПараметра("ИспользоватьИерархию", Отметка); - -КонецПроцедуры diff --git a/SSL/src/Catalogs/Файлы/Help/ru.html b/SSL/src/Catalogs/Файлы/Help/ru.html index 82b795d86..6da8edbaa 100644 --- a/SSL/src/Catalogs/Файлы/Help/ru.html +++ b/SSL/src/Catalogs/Файлы/Help/ru.html @@ -1,4 +1,4 @@ - +

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

          Создание файлов

          @@ -23,7 +23,7 @@
          - + diff --git a/SSL/src/Catalogs/Файлы/ManagerModule.bsl b/SSL/src/Catalogs/Файлы/ManagerModule.bsl index e69de29bb..cf1211c01 100644 --- a/SSL/src/Catalogs/Файлы/ManagerModule.bsl +++ b/SSL/src/Catalogs/Файлы/ManagerModule.bsl @@ -0,0 +1,19 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + РедактируемыеРеквизиты.Добавить("Описание"); + РедактируемыеРеквизиты.Добавить("Редактирует"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + +#КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/ObjectModule.bsl b/SSL/src/Catalogs/Файлы/ObjectModule.bsl index ba63887a6..5c59eee06 100644 --- a/SSL/src/Catalogs/Файлы/ObjectModule.bsl +++ b/SSL/src/Catalogs/Файлы/ObjectModule.bsl @@ -1,10 +1,5 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - - - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ @@ -40,7 +35,14 @@ КонецЕсли; - Если Не ЭтоНовый() Тогда + Если ЭтоНовый() Тогда + // Проверка права "Добавление". + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ДобавлениеФайлов", ВладелецФайла) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недостаточно прав для добавления файлов в папку ""%1"".'"), + Строка(ВладелецФайла)); + КонецЕсли; + Иначе ЕстьПометкаУдаленияВИБ = ПометкаУдаленияВИБ(); УстановленаПометкаУдаления = ПометкаУдаления И Не ЕстьПометкаУдаленияВИБ; @@ -56,15 +58,15 @@ Если ЗначениеЗаполнено(Ссылка) Тогда - СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "ПодписанЭЦП, Зашифрован"); - СсылкаПодписан = СтруктураРеквизитов.ПодписанЭЦП; + СтруктураРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "ПодписанЭП, Зашифрован"); + СсылкаПодписан = СтруктураРеквизитов.ПодписанЭП; СсылкаЗашифрован = СтруктураРеквизитов.Зашифрован; - Если ПодписанЭЦП И СсылкаПодписан Тогда + Если ПодписанЭП И СсылкаПодписан Тогда ВызватьИсключение НСтр("ru = 'Подписанный файл нельзя редактировать.'"); КонецЕсли; - Если Зашифрован И СсылкаЗашифрован И ПодписанЭЦП И НЕ СсылкаПодписан Тогда + Если Зашифрован И СсылкаЗашифрован И ПодписанЭП И НЕ СсылкаПодписан Тогда ВызватьИсключение НСтр("ru = 'Зашифрованный файл нельзя подписывать.'"); КонецЕсли; @@ -96,14 +98,10 @@ Если ИзмененаПометкаУдаления Тогда // Проверка права "Пометка на удаление". - ПометкаНаУдалениеРазрешена = Истина; - РаботаСФайламиСлужебный.ПриОпределенииПраваПометкиУдаления( - ВладелецФайла, ПометкаНаУдалениеРазрешена); - - Если НЕ ПометкаНаУдалениеРазрешена Тогда + Если НЕ РаботаСФайламиСлужебный.ЕстьПраво("ПометкаУдаленияФайлов", ВладелецФайла) Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'У вас нет права ""Пометка на удаление"" файла ""%1"".'"), - Строка(Ссылка)); + НСтр("ru = 'Недостаточно прав для пометки файлов на удаление в папке ""%1"".'"), + Строка(ВладелецФайла)); КонецЕсли; // Попытка установить пометку удаления @@ -198,4 +196,4 @@ КонецФункции -#КонецЕсли \ No newline at end of file +#КонецЕсли diff --git a/SSL/src/Catalogs/Файлы/Файлы.mdo b/SSL/src/Catalogs/Файлы/Файлы.mdo index c9b580f6b..f2d69dd58 100644 --- a/SSL/src/Catalogs/Файлы/Файлы.mdo +++ b/SSL/src/Catalogs/Файлы/Файлы.mdo @@ -109,33 +109,33 @@ Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеРеквизиты.StandardAttribute.Ref + -1 + -1 Catalog.НаборыДополнительныхРеквизитовИСведений.Справочник_Файлы -1 -1 Catalog.Файлы.TabularSection.ДополнительныеРеквизиты - Catalog.Файлы.TabularSection.ДополнительныеРеквизиты.StandardAttribute.Ref - Catalog.Файлы.TabularSection.ДополнительныеРеквизиты.Attribute.Свойство - Catalog.Файлы.TabularSection.ДополнительныеРеквизиты.Attribute.Значение + -1 + -1 + -1 -1 -1 Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.Attribute.Свойство - Catalog.НаборыДополнительныхРеквизитовИСведений.TabularSection.ДополнительныеСведения.StandardAttribute.Ref + -1 + -1 Catalog.НаборыДополнительныхРеквизитовИСведений.Справочник_Файлы -1 -1 InformationRegister.ДополнительныеСведения - InformationRegister.ДополнительныеСведения.Dimension.Объект - InformationRegister.ДополнительныеСведения.Dimension.Свойство - InformationRegister.ДополнительныеСведения.Resource.Значение + -1 + -1 + -1 -1 -1 @@ -337,11 +337,12 @@ Use - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП + Файл подписан ЭП Boolean @@ -1012,6 +1013,21 @@ PersonalComputer MobileDevice + + Файлы + + ru + Файлы + + true + + + ru + + + PersonalComputer + MobileDevice + ФайлыВОсновномРабочемКаталоге @@ -1219,21 +1235,6 @@ PersonalComputer MobileDevice - - ХранилищеФайлов - - ru - Хранилище файлов - - true - - - ru - - - PersonalComputer - MobileDevice - МакетОтчета @@ -1251,21 +1252,25 @@ Auto - ЗанятыеФайлы + РедактируемыеФайлы ru Редактируемые файлы NavigationPanelOrdinary Auto + + ru + Открывает список редактируемых файлов в папках + - ПапкиФайлов + Файлы ru Файлы - Открывает форму списка файлов в папках + Открывает список файлов в папках NavigationPanelOrdinary Auto diff --git a/SSL/src/Catalogs/ФизическиеЛица/Forms/ФормаГруппы/Form.form b/SSL/src/Catalogs/ФизическиеЛица/Forms/ФормаГруппы/Form.form index 972018148..c84e847f6 100644 --- a/SSL/src/Catalogs/ФизическиеЛица/Forms/ФормаГруппы/Form.form +++ b/SSL/src/Catalogs/ФизическиеЛица/Forms/ФормаГруппы/Form.form @@ -16,7 +16,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 5 Label true @@ -57,8 +57,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 7 + РодительExtendedTooltip + 6 Label true true diff --git a/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html b/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html index 61e949d88..a93bd071d 100644 --- a/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html +++ b/SSL/src/Catalogs/ФизическиеЛица/Help/ru.html @@ -1,4 +1,4 @@ - +

          Справочник предназначен для хранения информации обо всех физических лицах.

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

           

          diff --git a/SSL/src/Catalogs/ФизическиеЛица/ManagerModule.bsl b/SSL/src/Catalogs/ФизическиеЛица/ManagerModule.bsl new file mode 100644 index 000000000..0e1197653 --- /dev/null +++ b/SSL/src/Catalogs/ФизическиеЛица/ManagerModule.bsl @@ -0,0 +1,27 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// СтандартныеПодсистемы.Печать + +//////////////////////////////////////////////////////////////////////////////// +// Интерфейс для работы с подсистемой Печать. + +// Заполняет список команд печати. +// +// Параметры: +// КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати +// +Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗащитаПерсональныхДанных") Тогда + МодульЗащитаПерсональныхДанных = ОбщегоНазначения.ОбщийМодуль("ЗащитаПерсональныхДанных"); + МодульЗащитаПерсональныхДанных.ДобавитьКомандуПечатиСогласияНаОбработкуПерсональныхДанных(КомандыПечати); + КонецЕсли; + +КонецПроцедуры + +// Конец СтандартныеПодсистемы.Печать + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index bf0c34453..26d504269 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаВыбора/Form.form @@ -26,8 +26,8 @@ true - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -62,8 +62,8 @@ Список.Code - КодРасширеннаяПодсказка - 20 + КодExtendedTooltip + 10 Label true true @@ -86,6 +86,40 @@ true + + Ссылка + 11 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 12 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -94,10 +128,10 @@ СписокСтрокаПоиска - 9 + 14 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 16 Label true true @@ -107,7 +141,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 15 true Список @@ -117,10 +151,10 @@ СписокСостояниеПросмотра - 12 + 17 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 19 Label true true @@ -130,7 +164,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 18 true ViewStatusAddition @@ -141,10 +175,10 @@ СписокУправлениеПоиском - 15 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 22 Label true true @@ -154,7 +188,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 21 true SearchControlAddition @@ -164,7 +198,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form index 56b772493..632dd6957 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Form.form @@ -21,7 +21,7 @@ ФормулировкаПриИзменении - ФормулировкаРасширеннаяПодсказка + ФормулировкаExtendedTooltip 147 Label true @@ -65,8 +65,8 @@ None - ИнформацияШапкаРасширеннаяПодсказка - 149 + ИнформацияШапкаExtendedTooltip + 148 Label true true @@ -120,8 +120,8 @@ ТипТабличногоВопросаПриИзменении - ТипТабличногоВопросаРасширеннаяПодсказка - 153 + ТипТабличногоВопросаExtendedTooltip + 151 Label true true @@ -164,8 +164,8 @@ true - КартинкаСоставнойРасширеннаяПодсказка - 157 + КартинкаСоставнойExtendedTooltip + 154 Label true true @@ -203,8 +203,8 @@ Страница картинка составной - СтраницаКартинкаСоставнойРасширеннаяПодсказка - 156 + СтраницаКартинкаСоставнойExtendedTooltip + 153 Label true true @@ -234,8 +234,8 @@ true - КартинкаОтветыВСтрокахРасширеннаяПодсказка - 159 + КартинкаОтветыВСтрокахExtendedTooltip + 156 Label true true @@ -273,8 +273,8 @@ Страница картинка ответы в строках - СтраницаКартинкаОтветыВСтрокахРасширеннаяПодсказка - 158 + СтраницаКартинкаОтветыВСтрокахExtendedTooltip + 155 Label true true @@ -304,8 +304,8 @@ true - КартинкаОтветыВКолонкахРасширеннаяПодсказка - 161 + КартинкаОтветыВКолонкахExtendedTooltip + 158 Label true true @@ -343,8 +343,8 @@ Страница картинка ответы в колонках - СтраницаКартинкаОтветыВКолонкахРасширеннаяПодсказка - 160 + СтраницаКартинкаОтветыВКолонкахExtendedTooltip + 157 Label true true @@ -374,8 +374,8 @@ true - КартинкаОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 163 + КартинкаОтветыВСтрокахИКолонкахExtendedTooltip + 160 Label true true @@ -413,8 +413,8 @@ Страница картинка ответы в строках и колонках - СтраницаКартинкаОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 162 + СтраницаКартинкаОтветыВСтрокахИКолонкахExtendedTooltip + 159 Label true true @@ -444,8 +444,8 @@ true - КартинкаПустаяРасширеннаяПодсказка - 165 + КартинкаПустаяExtendedTooltip + 162 Label true true @@ -477,8 +477,8 @@ Страница картинка пустая - СтраницаКартинкаПустаяРасширеннаяПодсказка - 164 + СтраницаКартинкаПустаяExtendedTooltip + 161 Label true true @@ -506,8 +506,8 @@ Страницы тип табличного вопроса картинки - СтраницыТипТабличногоВопросаКартинкиРасширеннаяПодсказка - 155 + СтраницыТипТабличногоВопросаКартинкиExtendedTooltip + 152 Label true true @@ -534,8 +534,8 @@ Страница тип табличного вопроса - СтраницаТипТабличногоВопросаРасширеннаяПодсказка - 152 + СтраницаТипТабличногоВопросаExtendedTooltip + 150 Label true true @@ -570,8 +570,8 @@ None - ВопросКолонкаОтветыСтрокахИКолонкахРасширеннаяПодсказка - 169 + ВопросКолонкаОтветыСтрокахИКолонкахExtendedTooltip + 166 Label true true @@ -619,8 +619,8 @@ Ответы.Ответ - ОтветыКолонкиОтветыВСтрокахИКолонкахОтветРасширеннаяПодсказка - 182 + ОтветыКолонкиОтветыВСтрокахИКолонкахОтветExtendedTooltip + 169 Label true true @@ -670,8 +670,8 @@ false - ЗаполнитьКолонкиВариантыОтветовОтветыСтрокахИКолонкахРасширеннаяПодсказка - 171 + ЗаполнитьКолонкиВариантыОтветовОтветыСтрокахИКолонкахExtendedTooltip + 167 Label true true @@ -701,10 +701,10 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоиска - 173 + 212 ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоискаРасширеннаяПодсказка - 175 + 214 Label true true @@ -714,7 +714,7 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахСтрокаПоискаКонтекстноеМеню - 174 + 213 true ОтветыКолонкиОтветыВСтрокахИКолонках @@ -724,10 +724,10 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотра - 176 + 215 ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотраРасширеннаяПодсказка - 178 + 217 Label true true @@ -737,7 +737,7 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахСостояниеПросмотраКонтекстноеМеню - 177 + 216 true ViewStatusAddition @@ -748,10 +748,10 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоиском - 179 + 218 ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоискомРасширеннаяПодсказка - 181 + 220 Label true true @@ -761,7 +761,7 @@ ОтветыКолонкиОтветыВСтрокахИКолонкахУправлениеПоискомКонтекстноеМеню - 180 + 219 true SearchControlAddition @@ -771,8 +771,8 @@ - ОтветыКолонкиОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 172 + ОтветыКолонкиОтветыВСтрокахИКолонкахExtendedTooltip + 168 Label true true @@ -827,8 +827,8 @@ Группа состав колонок ответы в строках и колонках - ГруппаСоставКолонокОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 168 + ГруппаСоставКолонокОтветыВСтрокахИКолонкахExtendedTooltip + 165 Label true true @@ -868,8 +868,8 @@ None - ВопросСтрокаОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 193 + ВопросСтрокаОтветыВСтрокахИКолонкахExtendedTooltip + 171 Label true true @@ -917,8 +917,8 @@ Ответы.Ответ - ОтветыСтрокиОтветыВСтрокахИКолонкахОтветРасширеннаяПодсказка - 206 + ОтветыСтрокиОтветыВСтрокахИКолонкахОтветExtendedTooltip + 174 Label true true @@ -968,8 +968,8 @@ false - ЗаполнитьСтрокиВариантыОтветовОтветыСтрокиИКолонкиРасширеннаяПодсказка - 195 + ЗаполнитьСтрокиВариантыОтветовОтветыСтрокиИКолонкиExtendedTooltip + 172 Label true true @@ -999,10 +999,10 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоиска - 197 + 231 ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоискаРасширеннаяПодсказка - 199 + 233 Label true true @@ -1012,7 +1012,7 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахСтрокаПоискаКонтекстноеМеню - 198 + 232 true ОтветыСтрокиОтветыВСтрокахИКолонках @@ -1022,10 +1022,10 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотра - 200 + 234 ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотраРасширеннаяПодсказка - 202 + 236 Label true true @@ -1035,7 +1035,7 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахСостояниеПросмотраКонтекстноеМеню - 201 + 235 true ViewStatusAddition @@ -1046,10 +1046,10 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоиском - 203 + 237 ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоискомРасширеннаяПодсказка - 205 + 239 Label true true @@ -1059,7 +1059,7 @@ ОтветыСтрокиОтветыВСтрокахИКолонкахУправлениеПоискомКонтекстноеМеню - 204 + 238 true SearchControlAddition @@ -1069,8 +1069,8 @@ - ОтветыСтрокиОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 196 + ОтветыСтрокиОтветыВСтрокахИКолонкахExtendedTooltip + 173 Label true true @@ -1125,8 +1125,8 @@ Группа состав строк ответы в строках и колонках - ГруппаСоставСтрокОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 192 + ГруппаСоставСтрокОтветыВСтрокахИКолонкахExtendedTooltip + 170 Label true true @@ -1160,8 +1160,8 @@ Группа общая ответы в строках и колонках - ГруппаОбщаяОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 167 + ГруппаОбщаяОтветыВСтрокахИКолонкахExtendedTooltip + 164 Label true true @@ -1188,8 +1188,8 @@ Страница предопределенные ответы в строках и колонках - СтраницаПредопределенныеОтветыВСтрокахИКолонкахРасширеннаяПодсказка - 166 + СтраницаПредопределенныеОтветыВСтрокахИКолонкахExtendedTooltip + 163 Label true true @@ -1242,8 +1242,8 @@ ВопросыПриИзменении - ВопросыВопросРасширеннаяПодсказка - 228 + ВопросыВопросExtendedTooltip + 178 Label true true @@ -1269,6 +1269,8 @@ true true true + false + true Items true true @@ -1288,10 +1290,10 @@ ВопросыСтрокаПоиска - 219 + 249 ВопросыСтрокаПоискаРасширеннаяПодсказка - 221 + 251 Label true true @@ -1301,7 +1303,7 @@ ВопросыСтрокаПоискаКонтекстноеМеню - 220 + 250 true Вопросы @@ -1311,10 +1313,10 @@ ВопросыСостояниеПросмотра - 222 + 252 ВопросыСостояниеПросмотраРасширеннаяПодсказка - 224 + 254 Label true true @@ -1324,7 +1326,7 @@ ВопросыСостояниеПросмотраКонтекстноеМеню - 223 + 253 true ViewStatusAddition @@ -1335,10 +1337,10 @@ ВопросыУправлениеПоиском - 225 + 255 ВопросыУправлениеПоискомРасширеннаяПодсказка - 227 + 257 Label true true @@ -1348,7 +1350,7 @@ ВопросыУправлениеПоискомКонтекстноеМеню - 226 + 256 true SearchControlAddition @@ -1358,8 +1360,8 @@ - ВопросыРасширеннаяПодсказка - 218 + ВопросыExtendedTooltip + 177 Label true true @@ -1414,8 +1416,8 @@ true - ГруппаВопросыРасширеннаяПодсказка - 217 + ГруппаВопросыExtendedTooltip + 176 Label true true @@ -1445,8 +1447,8 @@ Страница вопросы - СтраницаВопросыРасширеннаяПодсказка - 216 + СтраницаВопросыExtendedTooltip + 175 Label true true @@ -1478,8 +1480,8 @@ None - ВопросКолонкаОтветыВКолонкахРасширеннаяПодсказка - 240 + ВопросКолонкаОтветыВКолонкахExtendedTooltip + 181 Label true true @@ -1527,8 +1529,8 @@ Ответы.Ответ - ОтветыКолонкиОтветыВКолонкахОтветРасширеннаяПодсказка - 253 + ОтветыКолонкиОтветыВКолонкахОтветExtendedTooltip + 184 Label true true @@ -1578,8 +1580,8 @@ false - ЗаполнитьВариантыОтветовОтветыКолонкиРасширеннаяПодсказка - 242 + ЗаполнитьВариантыОтветовОтветыКолонкиExtendedTooltip + 182 Label true true @@ -1609,10 +1611,10 @@ ОтветыКолонкиОтветыВКолонкахСтрокаПоиска - 244 + 268 ОтветыКолонкиОтветыВКолонкахСтрокаПоискаРасширеннаяПодсказка - 246 + 270 Label true true @@ -1622,7 +1624,7 @@ ОтветыКолонкиОтветыВКолонкахСтрокаПоискаКонтекстноеМеню - 245 + 269 true ОтветыКолонкиОтветыВКолонках @@ -1632,10 +1634,10 @@ ОтветыКолонкиОтветыВКолонкахСостояниеПросмотра - 247 + 271 ОтветыКолонкиОтветыВКолонкахСостояниеПросмотраРасширеннаяПодсказка - 249 + 273 Label true true @@ -1645,7 +1647,7 @@ ОтветыКолонкиОтветыВКолонкахСостояниеПросмотраКонтекстноеМеню - 248 + 272 true ViewStatusAddition @@ -1656,10 +1658,10 @@ ОтветыКолонкиОтветыВКолонкахУправлениеПоиском - 250 + 274 ОтветыКолонкиОтветыВКолонкахУправлениеПоискомРасширеннаяПодсказка - 252 + 276 Label true true @@ -1669,7 +1671,7 @@ ОтветыКолонкиОтветыВКолонкахУправлениеПоискомКонтекстноеМеню - 251 + 275 true SearchControlAddition @@ -1679,8 +1681,8 @@ - ОтветыКолонкиОтветыВКолонкахРасширеннаяПодсказка - 243 + ОтветыКолонкиОтветыВКолонкахExtendedTooltip + 183 Label true true @@ -1732,8 +1734,8 @@ ВопросДляКолонок - ВопросДляКолонокРасширеннаяПодсказка - 263 + ВопросДляКолонокExtendedTooltip + 185 Label true true @@ -1775,8 +1777,8 @@ Группа состав колонок ответы в колонках - ГруппаСоставКолонокОтветыВКолонкахРасширеннаяПодсказка - 239 + ГруппаСоставКолонокОтветыВКолонкахExtendedTooltip + 180 Label true true @@ -1810,8 +1812,8 @@ Страница предопределенные ответы в колонках - СтраницаПредопределенныеОтветыВКолонкахРасширеннаяПодсказка - 238 + СтраницаПредопределенныеОтветыВКолонкахExtendedTooltip + 179 Label true true @@ -1843,8 +1845,8 @@ None - ВопросСтрокаОтветыВСтрокахРасширеннаяПодсказка - 267 + ВопросСтрокаОтветыВСтрокахExtendedTooltip + 188 Label true true @@ -1892,8 +1894,8 @@ Ответы.Ответ - ОтветыСтрокиОтветыВСтрокахОтветРасширеннаяПодсказка - 280 + ОтветыСтрокиОтветыВСтрокахОтветExtendedTooltip + 191 Label true true @@ -1943,8 +1945,8 @@ false - ЗаполнитьВариантыОтветовОтветыСтрокиРасширеннаяПодсказка - 269 + ЗаполнитьВариантыОтветовОтветыСтрокиExtendedTooltip + 189 Label true true @@ -1974,10 +1976,10 @@ ОтветыСтрокиОтветыВСтрокахСтрокаПоиска - 271 + 288 ОтветыСтрокиОтветыВСтрокахСтрокаПоискаРасширеннаяПодсказка - 273 + 290 Label true true @@ -1987,7 +1989,7 @@ ОтветыСтрокиОтветыВСтрокахСтрокаПоискаКонтекстноеМеню - 272 + 289 true ОтветыСтрокиОтветыВСтроках @@ -1997,10 +1999,10 @@ ОтветыСтрокиОтветыВСтрокахСостояниеПросмотра - 274 + 291 ОтветыСтрокиОтветыВСтрокахСостояниеПросмотраРасширеннаяПодсказка - 276 + 293 Label true true @@ -2010,7 +2012,7 @@ ОтветыСтрокиОтветыВСтрокахСостояниеПросмотраКонтекстноеМеню - 275 + 292 true ViewStatusAddition @@ -2021,10 +2023,10 @@ ОтветыСтрокиОтветыВСтрокахУправлениеПоиском - 277 + 294 ОтветыСтрокиОтветыВСтрокахУправлениеПоискомРасширеннаяПодсказка - 279 + 296 Label true true @@ -2034,7 +2036,7 @@ ОтветыСтрокиОтветыВСтрокахУправлениеПоискомКонтекстноеМеню - 278 + 295 true SearchControlAddition @@ -2044,8 +2046,8 @@ - ОтветыСтрокиОтветыВСтрокахРасширеннаяПодсказка - 270 + ОтветыСтрокиОтветыВСтрокахExtendedTooltip + 190 Label true true @@ -2097,8 +2099,8 @@ ВопросДляСтрок - ВопросДляСтрокРасширеннаяПодсказка - 290 + ВопросДляСтрокExtendedTooltip + 192 Label true true @@ -2140,8 +2142,8 @@ Группа состав строк ответы в строках - ГруппаСоставСтрокОтветыВСтрокахРасширеннаяПодсказка - 266 + ГруппаСоставСтрокОтветыВСтрокахExtendedTooltip + 187 Label true true @@ -2175,8 +2177,8 @@ Страница предопределенные ответы в строках - СтраницаПредопределенныеОтветыВСтрокахРасширеннаяПодсказка - 265 + СтраницаПредопределенныеОтветыВСтрокахExtendedTooltip + 186 Label true true @@ -2214,10 +2216,10 @@ РезультирующаяТаблицаСтрокаПоиска - 294 + 307 РезультирующаяТаблицаСтрокаПоискаРасширеннаяПодсказка - 296 + 309 Label true true @@ -2227,7 +2229,7 @@ РезультирующаяТаблицаСтрокаПоискаКонтекстноеМеню - 295 + 308 true РезультирующаяТаблица @@ -2237,10 +2239,10 @@ РезультирующаяТаблицаСостояниеПросмотра - 297 + 310 РезультирующаяТаблицаСостояниеПросмотраРасширеннаяПодсказка - 299 + 312 Label true true @@ -2250,7 +2252,7 @@ РезультирующаяТаблицаСостояниеПросмотраКонтекстноеМеню - 298 + 311 true ViewStatusAddition @@ -2261,10 +2263,10 @@ РезультирующаяТаблицаУправлениеПоиском - 300 + 313 РезультирующаяТаблицаУправлениеПоискомРасширеннаяПодсказка - 302 + 315 Label true true @@ -2274,7 +2276,7 @@ РезультирующаяТаблицаУправлениеПоискомКонтекстноеМеню - 301 + 314 true SearchControlAddition @@ -2284,8 +2286,8 @@ - РезультирующаяТаблицаРасширеннаяПодсказка - 293 + РезультирующаяТаблицаExtendedTooltip + 194 Label true true @@ -2340,8 +2342,8 @@ Страница результирующая таблица - СтраницаРезультирующаяТаблицаРасширеннаяПодсказка - 292 + СтраницаРезультирующаяТаблицаExtendedTooltip + 193 Label true true @@ -2370,8 +2372,8 @@ false - СтраницыРасширеннаяПодсказка - 151 + СтраницыExtendedTooltip + 149 Label true true @@ -2397,8 +2399,8 @@ None - ИнформацияПодвалРасширеннаяПодсказка - 311 + ИнформацияПодвалExtendedTooltip + 195 Label true true @@ -2429,12 +2431,54 @@ + + СтраницыПодвал + 202 + true + true + + true + + + <key>ru</key> + <value>Страницы подвал</value> + + + ru + Страницы подвал + + + СтраницыПодвалРасширеннаяПодсказка + 203 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + ГруппаКнопки 10 - Кнопка - 135 + КнопкаНазад + 127 + + <key>ru</key> + <value><Назад</value> + true true @@ -2442,8 +2486,8 @@ false - КнопкаРасширеннаяПодсказка - 314 + КнопкаНазадExtendedTooltip + 199 Label true true @@ -2452,11 +2496,17 @@ UsualButton - Form.StandardCommand.Help + Form.Command.ПредыдущаяСтраница Normal true true UserCmds + + Style.FormBackColor + + + Style.FormBackColor + Auto @@ -2468,8 +2518,8 @@ true - ДекорацияРасширеннаяПодсказка - 315 + ДекорацияExtendedTooltip + 198 Label true true @@ -2491,53 +2541,117 @@ Left - - КнопкаНазад - 127 + + ГруппаДалее + 204 + + КнопкаВперед + 12 + + <key>ru</key> + <value>Далее></value> + + true + true + + true + + false + + КнопкаВпередExtendedTooltip + 200 + Label + true + true + + Left + + + Form.Command.СледующаяСтраница + true + true + true + UserCmds + Auto + + + КнопкаОтмена + 11 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + КнопкаОтменаРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + + Style.FormBackColor + + + Style.FormBackColor + + Auto + + + Справка + 206 + true + true + + true + + + СправкаРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + <key>ru</key> - <value><<Назад</value> + <value>Группа далее</value> - true - true - - true - - false - - КнопкаНазадРасширеннаяПодсказка - 316 - Label - true - true - - Left - - - UsualButton - Form.Command.ПредыдущаяСтраница - Normal - true - true - UserCmds - Auto - - - КнопкаВперед - 12 - + <toolTip> <key>ru</key> - <value>Далее>></value> - - true - true - - true - - false + Группа далее + - КнопкаВпередРасширеннаяПодсказка - 317 + ГруппаДалееРасширеннаяПодсказка + 205 Label true true @@ -2545,40 +2659,10 @@ Left - UsualButton - Form.Command.СледующаяСтраница - Normal - true - true - UserCmds - Auto - - - КнопккаЗакрыть - 11 - true - true - - true - - false - - КнопккаЗакрытьРасширеннаяПодсказка - 318 - Label - true - true - - Left - - - UsualButton - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto + CommandBar + + Right + true true @@ -2591,8 +2675,8 @@ true - ГруппаКнопкиРасширеннаяПодсказка - 313 + ГруппаКнопкиExtendedTooltip + 196 Label true true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html index 2f4f7f23e..d0930a6de 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Help/ru.html @@ -1,4 +1,4 @@ - +

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

           

          На первой странице мастера необходимо выбрать тип табличного вопроса. Табличные вопросы могут быть четырех типов:

          diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl index 7f05296fd..1eee5e6b7 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаМастераТабличныхВопросов/Module.bsl @@ -216,11 +216,13 @@ Если Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаРезультирующаяТаблица Тогда Если ТипТабличногоВопроса = ПредопределенноеЗначение("Перечисление.ТипыТабличныхВопросов.Составной") Тогда - Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы; + Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы; Иначе - УстановитьСтраницуОтветы(); + УстановитьСтраницуОтветы(); КонецЕсли; + Элементы.КнопкаВперед.Заголовок = НСтр("ru = 'Далее'") + ">"; + ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВопросы Тогда Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса; @@ -351,7 +353,7 @@ Элементы.КнопкаВперед.Доступность = (Ответы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ВопросДляКолонок)).Количество() > 0); - ИначеЕсли ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса Тогда + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаТипТабличногоВопроса Тогда Элементы.КнопкаВперед.Доступность = ТипТабличногоВопроса <> ПредопределенноеЗначение("Перечисление.ТипыТабличныхВопросов.ПустаяСсылка"); @@ -377,7 +379,7 @@ КонецЕсли; - ИначеЕсли ТекущаяСтраница = Элементы.СтраницаВопросы Тогда + ИначеЕсли ТекущаяСтраница = Элементы.СтраницаВопросы Тогда Если Вопросы.НайтиСтроки(Новый Структура("ЭлементарныйВопрос",ПредопределенноеЗначение("ПланВидовХарактеристик.ВопросыДляАнкетирования.ПустаяСсылка"))).Количество() <> 0 Тогда Элементы.КнопкаВперед.Доступность = Ложь; @@ -434,14 +436,14 @@ &НаКлиенте Процедура НачалоВыбораСписков(Элемент,СтандартнаяОбработка,ОписаниеДоступныхТипов) - Если ТипЗнч(ЭтаФорма[Элемент.СвязьПоТипу.ПутьКДанным]) = Тип("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования") Тогда + Если ТипЗнч(ЭтотОбъект[Элемент.СвязьПоТипу.ПутьКДанным]) = Тип("ПланВидовХарактеристикСсылка.ВопросыДляАнкетирования") Тогда Если ОписаниеДоступныхТипов.СодержитТип(Тип("СправочникСсылка.ВариантыОтветовАнкет")) И (ОписаниеДоступныхТипов.Типы().Количество() = 1 ) Тогда СтандартнаяОбработка = ЛОЖЬ; МассивОтбора = Новый Массив; - МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"Владелец",ВидСравненияКомпоновкиДанных.Равно,ЭтаФорма[Элемент.СвязьПоТипу.ПутьКДанным])); + МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"Владелец",ВидСравненияКомпоновкиДанных.Равно,ЭтотОбъект[Элемент.СвязьПоТипу.ПутьКДанным])); МассивОтбора.Добавить(АнкетированиеКлиент.СоздатьСтруктуруПараметраОтбора(Тип("ЭлементОтбораКомпоновкиДанных"),"ПометкаУдаления",ВидСравненияКомпоновкиДанных.Равно,ЛОЖЬ)); ОткрытьФорму("Справочник.ВариантыОтветовАнкет.Форма.ФормаВыбора",Новый Структура("МассивОтбора",МассивОтбора),Элемент); @@ -478,7 +480,6 @@ &НаКлиенте Процедура УстановитьСтраницуОтветы() - МассивВопросовДляКоторыйДолжныБытьОтветы = Новый Массив; Если ТипТабличногоВопроса = ПредопределенноеЗначение("Перечисление.ТипыТабличныхВопросов.ПредопределенныеОтветыВСтрокахИКолонках") Тогда @@ -519,7 +520,8 @@ &НаСервере Процедура СформироватьРезультирующуюТаблицу() - Анкетирование.ОбновитьПревьюТабличныйВопрос(РеквизитФормыВЗначение("Вопросы"),Ответы,ТипТабличногоВопроса,ЭтаФорма,"РезультирующаяТаблица",""); + Анкетирование.ОбновитьПревьюТабличныйВопрос(РеквизитФормыВЗначение("Вопросы"),Ответы,ТипТабличногоВопроса,ЭтотОбъект,"РезультирующаяТаблица",""); + Элементы.КнопкаВперед.Заголовок = НСтр("ru = 'Готово'"); КонецПроцедуры diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form index 5e0eddd41..f9db9666e 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Form.form @@ -16,7 +16,7 @@ ЭлементарныйВопрос - ЭлементарныйВопросРасширеннаяПодсказка + ЭлементарныйВопросExtendedTooltip 15 Label true @@ -68,8 +68,8 @@ Формулировка - ФормулировкаРасширеннаяПодсказка - 17 + ФормулировкаExtendedTooltip + 16 Label true true @@ -92,7 +92,6 @@ true true true - true true true true @@ -116,8 +115,8 @@ Right - ОбязательныйРасширеннаяПодсказка - 20 + ОбязательныйExtendedTooltip + 18 Label true true @@ -153,8 +152,8 @@ О - высота устанавливается автоматически, значение отличное от нуля задает высоту элемента в явном виде - ВысотаЭлементаФормулировкиВопросаРасширеннаяПодсказка - 22 + ВысотаЭлементаФормулировкиВопросаExtendedTooltip + 19 Label true true @@ -197,8 +196,8 @@ false - ГруппаВысотаОбязательныйРасширеннаяПодсказка - 19 + ГруппаВысотаОбязательныйExtendedTooltip + 17 Label true true @@ -227,8 +226,8 @@ true - ДекорацияРасширеннаяПодсказка - 25 + ДекорацияExtendedTooltip + 21 Label true true @@ -264,8 +263,8 @@ false - КнопкаГотовоРасширеннаяПодсказка - 26 + КнопкаГотовоExtendedTooltip + 22 Label true true @@ -292,8 +291,8 @@ false - ЗакрытьРасширеннаяПодсказка - 27 + ЗакрытьExtendedTooltip + 23 Label true true @@ -324,8 +323,8 @@ Группа кнопки - ГруппаКнопкиРасширеннаяПодсказка - 24 + ГруппаКнопкиExtendedTooltip + 20 Label true true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl index 2529c1848..019f0ca28 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаПростыхВопросов/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - ЗаполнитьЗначенияСвойств(ЭтаФорма,Параметры); + ЗаполнитьЗначенияСвойств(ЭтотОбъект,Параметры); Если ТипСтрокиДерева = "Раздел" Тогда Элементы.ГруппаВысотаОбязательный.Видимость = Ложь; diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ 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 index 1aec6a35e..aadc2e013 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ true - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -63,8 +63,8 @@ Список.Code - КодРасширеннаяПодсказка - 20 + КодExtendedTooltip + 10 Label true true @@ -87,6 +87,40 @@ true
          + + Ссылка + 11 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 12 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -99,10 +133,10 @@ СписокСтрокаПоиска - 9 + 14 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 16 Label true true @@ -112,7 +146,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 15 true Список @@ -122,10 +156,10 @@ СписокСостояниеПросмотра - 12 + 17 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 19 Label true true @@ -135,7 +169,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 18 true ViewStatusAddition @@ -146,10 +180,10 @@ СписокУправлениеПоиском - 15 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 22 Label true true @@ -159,7 +193,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 21 true SearchControlAddition @@ -169,7 +203,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form index 167a7c6ce..c9b546532 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Form.form @@ -15,7 +15,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 80 Label true @@ -56,8 +56,8 @@ Объект.Code - КодРасширеннаяПодсказка - 82 + КодExtendedTooltip + 81 Label true true @@ -95,7 +95,7 @@ Наименование код - НаименованиеКодРасширеннаяПодсказка + НаименованиеКодExtendedTooltip 79 Label true @@ -131,8 +131,8 @@ Объект.Заголовок - ЗаголовокРасширеннаяПодсказка - 86 + ЗаголовокExtendedTooltip + 84 Label true true @@ -172,8 +172,8 @@ Объект.Вступление - ВступлениеРасширеннаяПодсказка - 88 + ВступлениеExtendedTooltip + 85 Label true true @@ -214,8 +214,8 @@ Объект.Заключение - ЗаключениеРасширеннаяПодсказка - 90 + ЗаключениеExtendedTooltip + 86 Label true true @@ -254,8 +254,8 @@ Заголовки - ЗаголовкиРасширеннаяПодсказка - 85 + ЗаголовкиExtendedTooltip + 83 Label true true @@ -285,8 +285,8 @@ None - ИнформацияДеревоРасширеннаяПодсказка - 93 + ИнформацияДеревоExtendedTooltip + 88 Label true true @@ -346,8 +346,8 @@ None - ДеревоАнкетыПолныйКодРасширеннаяПодсказка - 123 + ДеревоАнкетыПолныйКодExtendedTooltip + 108 Label true true @@ -391,8 +391,8 @@ ДеревоАнкеты.Формулировка - ДеревоАнкетыФормулировкаРасширеннаяПодсказка - 125 + ДеревоАнкетыФормулировкаExtendedTooltip + 109 Label true true @@ -433,8 +433,8 @@ None - ДеревоАнкетыКодКартинкиРасширеннаяПодсказка - 127 + ДеревоАнкетыКодКартинкиExtendedTooltip + 110 Label true true @@ -477,8 +477,8 @@ Наименование - КартинкаПолныйКодРасширеннаяПодсказка - 122 + КартинкаПолныйКодExtendedTooltip + 107 Label true true @@ -505,8 +505,8 @@ ДеревоАнкеты.Обязательный - ДеревоАнкетыОбязательныйРасширеннаяПодсказка - 129 + ДеревоАнкетыОбязательныйExtendedTooltip + 111 Label true true @@ -545,8 +545,8 @@ ДеревоАнкеты.Заметки - ДеревоАнкетыЗаметкиРасширеннаяПодсказка - 131 + ДеревоАнкетыЗаметкиExtendedTooltip + 112 Label true true @@ -587,8 +587,8 @@ false - ФормаДереваАнкетыДобавитьРасширеннаяПодсказка - 103 + ФормаДереваАнкетыДобавитьExtendedTooltip + 97 Label true true @@ -614,8 +614,8 @@ false - ДеревоАнкетыКоманднаяПанельДобавитьРазделРасширеннаяПодсказка - 104 + ДеревоАнкетыКоманднаяПанельДобавитьРазделExtendedTooltip + 98 Label true true @@ -641,8 +641,8 @@ false - ДеревоАнкетыКоманднаяПанельДобавитьВопросРасширеннаяПодсказка - 105 + ДеревоАнкетыКоманднаяПанельДобавитьВопросExtendedTooltip + 99 Label true true @@ -668,8 +668,8 @@ false - ДеревоАнкетыКоманднаяПанельДобавитьТабличныйВопросРасширеннаяПодсказка - 106 + ДеревоАнкетыКоманднаяПанельДобавитьТабличныйВопросExtendedTooltip + 100 Label true true @@ -695,8 +695,8 @@ false - ДеревоАнкетыКоманднаяПанельДобавитьВопросСУсловиемРасширеннаяПодсказка - 107 + ДеревоАнкетыКоманднаяПанельДобавитьВопросСУсловиемExtendedTooltip + 101 Label true true @@ -722,8 +722,8 @@ false - ДеревоАнкетыКоманднаяПанельРедактироватьРасширеннаяПодсказка - 108 + ДеревоАнкетыКоманднаяПанельРедактироватьExtendedTooltip + 102 Label true true @@ -749,8 +749,8 @@ false - ДеревоАнкетыКоманднаяПанельПереместитьВверхРасширеннаяПодсказка - 109 + ДеревоАнкетыКоманднаяПанельПереместитьВверхExtendedTooltip + 103 Label true true @@ -776,8 +776,8 @@ false - ДеревоАнкетыКоманднаяПанельПереместитьВнизРасширеннаяПодсказка - 110 + ДеревоАнкетыКоманднаяПанельПереместитьВнизExtendedTooltip + 104 Label true true @@ -803,8 +803,8 @@ false - ДеревоАнкетыКоманднаяПанельУдалитьРасширеннаяПодсказка - 111 + ДеревоАнкетыКоманднаяПанельУдалитьExtendedTooltip + 105 Label true true @@ -864,10 +864,10 @@ ФормаДереваАнкетыСтрокаПоиска - 113 + 125 ФормаДереваАнкетыСтрокаПоискаРасширеннаяПодсказка - 115 + 127 Label true true @@ -877,7 +877,7 @@ ФормаДереваАнкетыСтрокаПоискаКонтекстноеМеню - 114 + 126 true ФормаДереваАнкеты @@ -887,10 +887,10 @@ ФормаДереваАнкетыСостояниеПросмотра - 116 + 128 ФормаДереваАнкетыСостояниеПросмотраРасширеннаяПодсказка - 118 + 130 Label true true @@ -900,7 +900,7 @@ ФормаДереваАнкетыСостояниеПросмотраКонтекстноеМеню - 117 + 129 true ViewStatusAddition @@ -911,10 +911,10 @@ ФормаДереваАнкетыУправлениеПоиском - 119 + 131 ФормаДереваАнкетыУправлениеПоискомРасширеннаяПодсказка - 121 + 133 Label true true @@ -924,7 +924,7 @@ ФормаДереваАнкетыУправлениеПоискомКонтекстноеМеню - 120 + 132 true SearchControlAddition @@ -934,8 +934,8 @@ - ФормаДереваАнкетыРасширеннаяПодсказка - 112 + ФормаДереваАнкетыExtendedTooltip + 106 Label true true @@ -956,8 +956,8 @@ false - КонтекстноеМенюФормаДереваАнкетыДобавитьРасширеннаяПодсказка - 95 + КонтекстноеМенюФормаДереваАнкетыДобавитьExtendedTooltip + 89 Label true true @@ -983,8 +983,8 @@ false - ДеревоАнкетыКонтекстноеМенюДобавитьРазделРасширеннаяПодсказка - 96 + ДеревоАнкетыКонтекстноеМенюДобавитьРазделExtendedTooltip + 90 Label true true @@ -1013,8 +1013,8 @@ false - ДеревоАнкетыКонтекстноеМенюДобавитьВопросРасширеннаяПодсказка - 97 + ДеревоАнкетыКонтекстноеМенюДобавитьВопросExtendedTooltip + 91 Label true true @@ -1043,8 +1043,8 @@ false - ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловиемРасширеннаяПодсказка - 98 + ДеревоАнкетыКонтекстноеМенюДобавитьВопросСУсловиемExtendedTooltip + 92 Label true true @@ -1073,8 +1073,8 @@ false - ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопросРасширеннаяПодсказка - 99 + ДеревоАнкетыКонтекстноеМенюДобавитьТабличныйВопросExtendedTooltip + 93 Label true true @@ -1103,8 +1103,8 @@ false - ДеревоАнкетыКонтекстноеМенюПереместитьВверхРасширеннаяПодсказка - 100 + ДеревоАнкетыКонтекстноеМенюПереместитьВверхExtendedTooltip + 94 Label true true @@ -1130,8 +1130,8 @@ false - ДеревоАнкетыКонтекстноеМенюПереместитьВнизРасширеннаяПодсказка - 101 + ДеревоАнкетыКонтекстноеМенюПереместитьВнизExtendedTooltip + 95 Label true true @@ -1157,8 +1157,8 @@ false - ДеревоАнкетыКонтекстноеМенюУдалитьРасширеннаяПодсказка - 102 + ДеревоАнкетыКонтекстноеМенюУдалитьExtendedTooltip + 96 Label true true @@ -1227,8 +1227,8 @@ None - ИнформацияРасширеннаяПодсказка - 143 + ИнформацияExtendedTooltip + 115 Label true true @@ -1272,8 +1272,8 @@ Страница информация - СтраницаИнформацияРасширеннаяПодсказка - 142 + СтраницаИнформацияExtendedTooltip + 114 Label true true @@ -1315,8 +1315,8 @@ ПустаяТаблица.ПустаяКолонка - ПустаяТаблицаПустаяКолонкаРасширеннаяПодсказка - 156 + ПустаяТаблицаПустаяКолонкаExtendedTooltip + 118 Label true true @@ -1352,10 +1352,10 @@ ПустаяТаблицаСтрокаПоиска - 147 + 148 ПустаяТаблицаСтрокаПоискаРасширеннаяПодсказка - 149 + 150 Label true true @@ -1365,7 +1365,7 @@ ПустаяТаблицаСтрокаПоискаКонтекстноеМеню - 148 + 149 true ПустаяТаблица @@ -1375,10 +1375,10 @@ ПустаяТаблицаСостояниеПросмотра - 150 + 151 ПустаяТаблицаСостояниеПросмотраРасширеннаяПодсказка - 152 + 153 Label true true @@ -1388,7 +1388,7 @@ ПустаяТаблицаСостояниеПросмотраКонтекстноеМеню - 151 + 152 true ViewStatusAddition @@ -1399,10 +1399,10 @@ ПустаяТаблицаУправлениеПоиском - 153 + 154 ПустаяТаблицаУправлениеПоискомРасширеннаяПодсказка - 155 + 156 Label true true @@ -1412,7 +1412,7 @@ ПустаяТаблицаУправлениеПоискомКонтекстноеМеню - 154 + 155 true SearchControlAddition @@ -1422,8 +1422,8 @@ - ПустаяТаблицаРасширеннаяПодсказка - 146 + ПустаяТаблицаExtendedTooltip + 117 Label true true @@ -1469,8 +1469,8 @@ true - СтраницаПустаяТаблицаРасширеннаяПодсказка - 145 + СтраницаПустаяТаблицаExtendedTooltip + 116 Label true true @@ -1490,8 +1490,8 @@ true - СтраницыИнформацияРасширеннаяПодсказка - 141 + СтраницыИнформацияExtendedTooltip + 113 Label true true @@ -1518,8 +1518,8 @@ Дерево анкеты - ДеревоАнкетыРасширеннаяПодсказка - 92 + ДеревоАнкетыExtendedTooltip + 87 Label true true @@ -1539,8 +1539,8 @@ true - ОсновныеСтраницыРасширеннаяПодсказка - 84 + ОсновныеСтраницыExtendedTooltip + 82 Label true true @@ -1571,7 +1571,7 @@ false - ОткрытьФормуЗаполненияАнкетыРасширеннаяПодсказка + ОткрытьФормуЗаполненияАнкетыExtendedTooltip 77 Label true @@ -1598,7 +1598,7 @@ false - ЗакончитьРедактированиеРасширеннаяПодсказка + ЗакончитьРедактированиеExtendedTooltip 78 Label true diff --git a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl index 2312f737f..b98c411dd 100644 --- a/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныАнкет/Forms/ФормаЭлемента/Module.bsl @@ -10,7 +10,7 @@ КонецЕсли; Анкетирование.УстановитьКорневойЭлементДереваАнкеты(ДеревоАнкеты); - Анкетирование.ЗаполнитьДеревоШаблонаАнкеты(ЭтаФорма,"ДеревоАнкеты",Объект.Ссылка); + Анкетирование.ЗаполнитьДеревоШаблонаАнкеты(ЭтотОбъект,"ДеревоАнкеты",Объект.Ссылка); АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоАнкеты); УстановитьУсловноеОформлениеФормы(); ОпределитьЕстьЛиДанномуШаблонуАнкеты(); @@ -103,7 +103,7 @@ ОпределитьДоступностьДереваШаблона(); Если Объект.РедактированиеШаблонаЗавершено Тогда - ЭтаФорма.ТолькоПросмотр = Истина; + ЭтотОбъект.ТолькоПросмотр = Истина; КонецЕсли; КонецПроцедуры @@ -325,28 +325,8 @@ СписокВыбора.Добавить("Условный вопрос"); СписокВыбора.Добавить("Табличный вопрос"); - ВыбранноеЗначение = СписокВыбора.ВыбратьЭлемент("Выберите тип добавляемого элемента.",СписокВыбора[0]); - Если НЕ ВыбранноеЗначение = Неопределено Тогда - - Если ВыбранноеЗначение.Значение = "Раздел" Тогда - - ДобавитьРаздел(Команды.ДобавитьРаздел); - - ИначеЕсли ВыбранноеЗначение.Значение = "Простой вопрос" Тогда - - ДобавитьПростойВопрос(Команды.ДобавитьПростойВопрос) - - ИначеЕсли ВыбранноеЗначение.Значение = "Условный вопрос" Тогда - - ДобавитьВопросСУсловием(Команды.ДобавитьВопросСУсловием) - - ИначеЕсли ВыбранноеЗначение.Значение = "Табличный вопрос" Тогда - - ДобавитьТабличныйВопрос(Команды.ДобавитьТабличныйВопрос); - - КонецЕсли; - - КонецЕсли; + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВыборТипаДобавляемогоЭлементаПриЗавершении", ЭтотОбъект); + СписокВыбора.ПоказатьВыборЭлемента(ОбработчикОповещенияОЗакрытии, НСтр("ru = 'Выберите тип добавляемого элемента.'"),СписокВыбора[0]); КонецПроцедуры @@ -372,9 +352,11 @@ КонецЕсли; Если (Поле.Имя = "ДеревоАнкетыЗаметки") И (ТекущиеДанные.ТипСтроки <> "Корень") Тогда - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияМногострочногоТекста(Элемент.ДанныеСтроки(ВыбраннаяСтрока).Заметки, + + ДополнительныеПараметры = Новый Структура("СтрокаРедактирования", ВыбраннаяСтрока); + ОбработчикОповещения = Новый ОписаниеОповещения("РедактированиеЗаметокПриОкончании", ЭтаФорма, ДополнительныеПараметры); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(ОбработчикОповещения, Элемент.ДанныеСтроки(ВыбраннаяСтрока).Заметки, - Модифицированность, Нстр("ru='Заметки'")); Иначе Если ТекущиеДанные.ТипСтроки = "Корень" Тогда @@ -475,18 +457,19 @@ КонецЕсли; Если Модифицированность Тогда - Ответ = Вопрос(Нстр("ru = 'Шаблон анкеты был модифицирован. - |Для корректного отображения изменений шаблон необходимо записать. - |Записать?'"),РежимДиалогаВопрос.ДаНет,,КодВозвратаДиалога.Да,Нстр("ru = 'Записать?'")); - Если Ответ = КодВозвратаДиалога.Да Тогда - Записать(); - КонецЕсли; + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОНеобходимостиЗаписиПослеЗавершения", ЭтотОбъект); + ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, + Нстр("ru = 'Шаблон анкеты был модифицирован. + |Для корректного отображения изменений шаблон необходимо записать. + |Записать?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Да, + Нстр("ru = 'Записать?'")); + Иначе + ОткрытьФормуМастераАнкетыПоРазделам(); КонецЕсли; - СтруктураПараметры = Новый Структура; - СтруктураПараметры.Вставить("ШаблонАнкеты",Объект.Ссылка); - ОткрытьФорму("ОбщаяФорма.МастерАнкетыПоРазделам",СтруктураПараметры,ЭтаФорма); - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -676,7 +659,7 @@ КонецЕсли; - Анкетирование.ОбновитьПревьюТабличныйВопрос(СоставТабличногоВопроса,ПредопределенныеОтветы,ТипТабличногоВопроса,ЭтаФорма,ИмяТаблицы,КлючСтроки); + Анкетирование.ОбновитьПревьюТабличныйВопрос(СоставТабличногоВопроса,ПредопределенныеОтветы,ТипТабличногоВопроса,ЭтотОбъект,ИмяТаблицы,КлючСтроки); КонецПроцедуры @@ -776,9 +759,9 @@ Родитель = ПолучитьРодителяДеревоАнкеты(ТекущиеДанные,Ложь,ТипВопроса); Если Родитель.ТипСтроки = "Корень" Тогда - Предупреждение(НСтр("ru = 'Вопросы нельзя добавлять в корень анкеты.'"),15,НСтр("ru = 'Ошибка добавления'")); + ПоказатьПредупреждение(,НСтр("ru = 'Вопросы нельзя добавлять в корень анкеты.'"),15,НСтр("ru = 'Ошибка добавления'")); Возврат; - КонецЕсли; + КонецЕсли; ДобавитьСтрокуДеревоАнкеты(Родитель,"Вопрос",ТипВопроса); КонецПроцедуры @@ -789,7 +772,7 @@ СтрокаКлюч = СтрЗаменить(Строка(ТекущиеДанные.КлючСтроки),"-","_"); ИмяТаблицы = "ПревьюТабличногоВопроса_" + СтрокаКлюч; ИмяРеквизита = "Формулировка_" + ИмяТаблицы; - ЭтаФорма[ИмяРеквизита] = СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные); + ЭтотОбъект[ИмяРеквизита] = СформироватьСтрокуФормулировкиДляПревью(ТекущиеДанные); КонецПроцедуры @@ -840,7 +823,7 @@ Если Объект.РедактированиеШаблонаЗавершено ИЛИ ПоДанномуШаблонуЕстьАнкеты Тогда - ЭтаФорма.ТолькоПросмотр = Истина; + ЭтотОбъект.ТолькоПросмотр = Истина; Элементы.ДеревоАнкеты.ТолькоПросмотр = Истина; Элементы.ФормаДереваАнкеты.ТолькоПросмотр = Истина; Элементы.ФормаДереваАнкеты.КоманднаяПанель.Доступность = Ложь; @@ -870,7 +853,7 @@ СтруктураПараметры.Вставить("ТолькоПросмотр",Ложь); СтруктураПараметры.Вставить("ВысотаЭлементаФормулировкиВопроса",ТекущиеДанные.ВысотаЭлементаФормулировкиВопроса); - ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаПростыхВопросов",СтруктураПараметры,ЭтаФорма); + ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаПростыхВопросов",СтруктураПараметры,ЭтотОбъект); КонецПроцедуры @@ -883,7 +866,7 @@ СтруктураПараметры.Вставить("ПредопределенныеОтветы",ТекущиеДанные.ПредопределенныеОтветы); СтруктураПараметры.Вставить("Формулировка",ТекущиеДанные.Формулировка); - ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов",СтруктураПараметры,ЭтаФорма); + ОткрытьФорму("Справочник.ШаблоныАнкет.Форма.ФормаМастераТабличныхВопросов",СтруктураПараметры,ЭтотОбъект); КонецПроцедуры @@ -917,3 +900,62 @@ КонецЕсли; КонецПроцедуры + +&НаКлиенте +Процедура ВыборТипаДобавляемогоЭлементаПриЗавершении(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + + Если НЕ ВыбранныйЭлемент = Неопределено Тогда + + Если ВыбранныйЭлемент.Значение = "Раздел" Тогда + + ДобавитьРаздел(Команды.ДобавитьРаздел); + + ИначеЕсли ВыбранныйЭлемент.Значение = "Простой вопрос" Тогда + + ДобавитьПростойВопрос(Команды.ДобавитьПростойВопрос) + + ИначеЕсли ВыбранныйЭлемент.Значение = "Условный вопрос" Тогда + + ДобавитьВопросСУсловием(Команды.ДобавитьВопросСУсловием) + + ИначеЕсли ВыбранныйЭлемент.Значение = "Табличный вопрос" Тогда + + ДобавитьТабличныйВопрос(Команды.ДобавитьТабличныйВопрос); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВопросОНеобходимостиЗаписиПослеЗавершения(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + Записать(); + КонецЕсли; + + ОткрытьФормуМастераАнкетыПоРазделам(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуМастераАнкетыПоРазделам() + + СтруктураПараметры = Новый Структура; + СтруктураПараметры.Вставить("ШаблонАнкеты",Объект.Ссылка); + ОткрытьФорму("ОбщаяФорма.МастерАнкетыПоРазделам",СтруктураПараметры,ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура РедактированиеЗаметокПриОкончании(ИзмененныйТекст, ДополнительныеПараметры) Экспорт + + ДанныеСтроки = Элементы.ФормаДереваАнкеты.ДанныеСтроки(ДополнительныеПараметры.СтрокаРедактирования); + + Если ДанныеСтроки.Заметки <> ИзмененныйТекст Тогда + ДанныеСтроки.Заметки = ИзмененныйТекст; + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form index 85bd73199..b4b8dc84b 100644 --- a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Идентификатор - ИдентификаторРасширеннаяПодсказка + ИдентификаторExtendedTooltip 19 Label true @@ -54,8 +54,8 @@ Объект.Description - НаименованиеРасширеннаяПодсказка - 21 + НаименованиеExtendedTooltip + 20 Label true true @@ -96,8 +96,8 @@ Объект.Имя - ИмяРасширеннаяПодсказка - 23 + ИмяExtendedTooltip + 21 Label true true @@ -138,8 +138,8 @@ Объект.Использование - ИспользованиеРасширеннаяПодсказка - 25 + ИспользованиеExtendedTooltip + 22 Label true true @@ -172,8 +172,8 @@ Объект.ИмяМетода - ИмяМетодаРасширеннаяПодсказка - 27 + ИмяМетодаExtendedTooltip + 23 Label true true @@ -214,8 +214,8 @@ Объект.Ключ - КлючРасширеннаяПодсказка - 29 + КлючExtendedTooltip + 24 Label true true @@ -256,8 +256,8 @@ Объект.КоличествоПовторовПриАварийномЗавершении - КоличествоПовторовПриАварийномЗавершенииРасширеннаяПодсказка - 31 + КоличествоПовторовПриАварийномЗавершенииExtendedTooltip + 25 Label true true @@ -298,8 +298,8 @@ Объект.ИнтервалПовтораПриАварийномЗавершении - ИнтервалПовтораПриАварийномЗавершенииРасширеннаяПодсказка - 33 + ИнтервалПовтораПриАварийномЗавершенииExtendedTooltip + 26 Label true true @@ -340,7 +340,7 @@ true - ФормаРасписаниеРасширеннаяПодсказка + ФормаРасписаниеExtendedTooltip 18 Label true diff --git a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl index 2cb11d3fe..97ab20fe3 100644 --- a/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/Catalogs/ШаблоныЗаданийОчереди/Forms/ФормаЭлемента/Module.bsl @@ -39,11 +39,18 @@ Процедура ОткрытьРасписаниеЗадания(Команда) Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - Если НЕ Диалог.ОткрытьМодально() Тогда + Диалог.Показать(Новый ОписаниеОповещения("ОткрытьРасписаниеЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьРасписаниеЗавершение(НовоеРасписание, ТекущиеДанные) Экспорт + + Если НовоеРасписание = Неопределено Тогда Возврат; КонецЕсли; - Расписание = Диалог.Расписание; + Расписание = НовоеРасписание; ЗаблокироватьДанныеФормыДляРедактирования(); Модифицированность = Истина; diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo index 49ed2f1cb..acc963cec 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы/ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.mdo @@ -288,7 +288,7 @@ Use
          - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП @@ -298,7 +298,7 @@ ru - Флажок, означающий что файл подписан с помощью ЭП + Признак того, что файл подписан с помощью ЭП @@ -523,10 +523,10 @@ - ЭлектронныеЦифровыеПодписи + ЭлектронныеПодписи ru - Электронные подписи + электронные подписи ru diff --git a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo index 8f384cee1..e8dd616dd 100644 --- a/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo +++ b/SSL/src/Catalogs/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы/ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.mdo @@ -288,7 +288,7 @@ Use - ПодписанЭЦП + ПодписанЭП ru Подписан ЭП @@ -298,7 +298,7 @@ ru - Флажок, означающий что файл подписан с помощью ЭП + Признак того, что файл подписан с помощью ЭП @@ -522,10 +522,10 @@ - ЭлектронныеЦифровыеПодписи + ЭлектронныеПодписи ru - Электронные подписи + электронные подписи ru diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form deleted file mode 100644 index 06e9bdfd3..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Form.form +++ /dev/null @@ -1,242 +0,0 @@ - - - - Список - 1 - true - true - - true - - - Список - - true - false - None - Change - Copy - Create - SetDeletionMark - - Наименование - 4 - true - true - - true - - - Список.Description - - true - - НаименованиеРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - - НаименованиеКонтекстноеМеню - 5 - true - - LabelField - Enter - true - Left - true - - true - true - - - None - - СписокКоманднаяПанель - 3 - Left - - - СписокСтрокаПоиска - 7 - - СписокСтрокаПоискаРасширеннаяПодсказка - 9 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 8 - true - - Список - - true - - - - СписокСостояниеПросмотра - 10 - - СписокСостояниеПросмотраРасширеннаяПодсказка - 12 - Label - true - true - - Left - - - - СписокСостояниеПросмотраКонтекстноеМеню - 11 - true - - ViewStatusAddition - Список - - true - - - - СписокУправлениеПоиском - 13 - - СписокУправлениеПоискомРасширеннаяПодсказка - 15 - Label - true - true - - Left - - - - СписокУправлениеПоискомКонтекстноеМеню - 14 - true - - SearchControlAddition - Список - - true - - - - СписокРасширеннаяПодсказка - 6 - Label - true - true - - Left - - - - СписокКонтекстноеМеню - 2 - true - - true - true - true - true - true - true - MultiRow - 1 - 1 - AutoUse - AutoUse - true - true - Auto - Auto - ExpandTopLevel - true - true - true - - Список.DefaultPicture - - None - None - None - true - - 60 - - 0001-01-01T00:00:00 - 0001-01-01T00:00:00 - - - true - true - - - - ФормаКоманднаяПанель - -1 - Left - true - - - OnCreateAtServer - ПриСозданииНаСервере - - Change - Copy - Create - SetDeletionMark - 45 - LockOwner - true - true - true - Vertical - true - true - true - UseIfNecessary - auto - true - - Список - 1 - - DynamicList - - - true - - - true - - - Список.Ref - -
          true
          - - ChartOfCharacteristicTypes.ВидыДоступа - true - true - true - true - -
          - - - - - -
          diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl deleted file mode 100644 index 7cc2f108a..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаВыбора/Module.bsl +++ /dev/null @@ -1,57 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - НедоступныеВидыДоступа = Новый СписокЗначений; - НеиспользуемыеВидыДоступа = Новый СписокЗначений; - - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл - - Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда - // Технологические виды доступа всегда недоступны. - НедоступныеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - - ИначеЕсли НЕ УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваВидаДоступа.ВидДоступа) Тогда - Если НЕ Параметры.Свойство("ПоказыватьНеиспользуемыеВидыДоступа") Тогда - НедоступныеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЕсли; - НеиспользуемыеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЕсли; - КонецЦикла; - - // Скрытие недоступных видов доступа. - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "Ссылка", НедоступныеВидыДоступа, ВидСравненияКомпоновкиДанных.НеВСписке, , Истина); - - // Оформление неиспользуемых видов доступа. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); - - ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); - ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.НедоступныеДанныеЦвет.Значение; - ЭлементЦветаОформления.Использование = Истина; - - ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Ссылка"); - ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; - ЭлементОтбораДанных.ПравоеЗначение = НеиспользуемыеВидыДоступа; - ЭлементОтбораДанных.Использование = Истина; - - ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Список"); - ЭлементОформляемогоПоля.Использование = Истина; - - // Скрытие помеченных на удаление. - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "ПометкаУдаления", Ложь, , , Истина, - РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ); - -КонецПроцедуры - diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss deleted file mode 100644 index 91027f589..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ /dev/null @@ -1,15 +0,0 @@ - - - - Normal - dfcece9d-5077-440b-b6b3-45a5cb4538eb - - - Normal - 88619765-ccb3-46c6-ac52-38e9c992ebd4 - - - Normal - b75fecce-942b-4aed-abc9-e6a02e460fb3 - - diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl deleted file mode 100644 index 03d1b7cd0..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаСписка/Module.bsl +++ /dev/null @@ -1,47 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - ТехнологическиеВидыДоступа = Новый СписокЗначений; - НеиспользуемыеВидыДоступа = Новый СписокЗначений; - - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл - - Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда - ТехнологическиеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - - ИначеЕсли НЕ УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваВидаДоступа.ВидДоступа) Тогда - НеиспользуемыеВидыДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЕсли; - КонецЦикла; - - // Скрытие технологических видов доступа. - ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка( - Список, "Ссылка", ТехнологическиеВидыДоступа, ВидСравненияКомпоновкиДанных.НеВСписке, , Истина); - - // Оформление неиспользуемых видов доступа. - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); - - ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); - ЭлементЦветаОформления.Значение = Метаданные.ЭлементыСтиля.НедоступныеДанныеЦвет.Значение; - ЭлементЦветаОформления.Использование = Истина; - - ЭлементОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Список.Ссылка"); - ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; - ЭлементОтбораДанных.ПравоеЗначение = НеиспользуемыеВидыДоступа; - ЭлементОтбораДанных.Использование = Истина; - - ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("Список"); - ЭлементОформляемогоПоля.Использование = Истина; - -КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form deleted file mode 100644 index f54006636..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Form.form +++ /dev/null @@ -1,140 +0,0 @@ - - - - Наименование - 1 - - <key>ru</key> - <value>Наименование вида доступа</value> - - true - true - - true - - - Объект.Description - - - НаименованиеРасширеннаяПодсказка - 5 - Label - true - true - - Left - - - - НаименованиеКонтекстноеМеню - 2 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - Normal - - - - ТипЗначения - 3 - - <key>ru</key> - <value>Тип значения или группы</value> - - true - true - - true - - - Объект.ValueType - - - ТипЗначенияРасширеннаяПодсказка - 7 - Label - true - true - - Left - - - - ТипЗначенияКонтекстноеМеню - 4 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - Normal - - - - ФормаКоманднаяПанель - -1 - Left - true - - Copy - Delete - SetDeletionMark - Write - WriteAndClose - LockOwner - true - true - true - Vertical - true - true - true - UseIfNecessary - auto - true - - Объект - 1 - - ChartOfCharacteristicTypesObject.ВидыДоступа - - - true - - - true - -
          true
          - true -
          - - - - - - - AfterWrite - ПослеЗаписи - - -
          diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Module.bsl deleted file mode 100644 index 2d99d65b1..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/Forms/ФормаЭлемента/Module.bsl +++ /dev/null @@ -1,9 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаКлиенте -Процедура ПослеЗаписи(ПараметрыЗаписи) - - Оповестить("Запись_ВидыДоступа", Новый Структура, Объект.Ссылка); - -КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl deleted file mode 100644 index a1f0d9b13..000000000 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ManagerModule.bsl +++ /dev/null @@ -1,300 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Процедура Обновляет описание свойств видов доступа в -// параметрах ограничения доступа при изменении конфигурации. -// -// Параметры: -// ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, -// устанавливается Истина, иначе не изменяется. -// -Процедура ОбновитьОписаниеСвойств(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; - - СвойстваВидовДоступа = СвойстваВидовДоступа(); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Параметры = СтандартныеПодсистемыСервер.ПараметрыРаботыПрограммы( - "ПараметрыОграниченияДоступа"); - - Сохраненные = Неопределено; - - Если Параметры.Свойство("СвойстваВидовДоступа") Тогда - Сохраненные = Параметры.СвойстваВидовДоступа; - - Если НЕ ОбщегоНазначения.ДанныеСовпадают(СвойстваВидовДоступа, Сохраненные) Тогда - Сохраненные = Неопределено; - КонецЕсли; - КонецЕсли; - - Если Сохраненные = Неопределено Тогда - ЕстьИзменения = Истина; - Если ТолькоПроверка Тогда - ЗафиксироватьТранзакцию(); - Возврат; - КонецЕсли; - СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "СвойстваВидовДоступа", - СвойстваВидовДоступа); - КонецЕсли; - - СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", - "СвойстваВидовДоступа"); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Возвращает таблицу свойств видов доступа, созданную на основе данных, -// заполняемых в процедуре, подготовленной прикладным разработчиком: -// УправлениеДоступомПереопределяемый.ЗаполнитьСвойстваВидаДоступа(ВидДоступа). -// -// Свойства вида доступа, заполняемые автоматически: -// -// Имя - Строка - имя предопределенного элемента. -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа. -// ВидДоступаИспользуетсяВсегда - Булево - используется для управления интерфейсом. -// -// Свойства вида доступа, переопределяемые прикладным разработчиком: -// -// Таблицы - Массив - полные имена таблиц значений доступа -// в формате метода объекта метаданных ПолноеИмя(). -// ВидДоступаЧерезПраваПоЗначениямДоступа - Булево (начальное значение Ложь). -// ВидДоступаБезГруппЗначенияДоступа - Булево (начальное значение Истина). -// ВидДоступаСОднойГруппойЗначенияДоступа - Булево (начальное значение Истина). -// -Функция СвойстваВидовДоступа() - - // Подготовка свойств всех видов доступа. - ТаблицаСвойств = Новый ТаблицаЗначений; - ТаблицаСвойств.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыДоступа")); - ТаблицаСвойств.Колонки.Добавить("Таблицы", Новый ОписаниеТипов("Массив")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступаЧерезПраваПоЗначениямДоступа", Новый ОписаниеТипов("Булево")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступаЕдинственныйДляТипаЗначенияДоступа", Новый ОписаниеТипов("Булево")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступаБезГруппЗначенияДоступа", Новый ОписаниеТипов("Булево")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступаСОднойГруппойЗначенияДоступа", Новый ОписаниеТипов("Булево")); - ТаблицаСвойств.Колонки.Добавить("ВидДоступаИспользуетсяВсегда", Новый ОписаниеТипов("Булево")); - - ПоИменам = Новый Соответствие; - ПоСсылкам = Новый Соответствие; - - ВидыДоступаЗначенийДоступа = Новый Структура; - ВидыДоступаЗначенийДоступа.Вставить("ПоТипам", Новый Соответствие); - ВидыДоступаЗначенийДоступа.Вставить("ПоТипамСсылок", Новый Соответствие); - ВидыДоступаЗначенийДоступа.Вставить("ПоПолнымИменам", Новый Соответствие); - - ЗначенияДоступаСГруппами = Новый Структура; - ЗначенияДоступаСГруппами.Вставить("ПоТипам", Новый Соответствие); - ЗначенияДоступаСГруппами.Вставить("ПоТипамСсылок", Новый Соответствие); - ЗначенияДоступаСГруппами.Вставить("ПоПолнымИменам", Новый Соответствие); - - ТипыИзмеренияЗначениеДоступаРегистраГрупп = - УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы( - "РегистрСведений.ГруппыЗначенийДоступа", "Измерения", "ЗначениеДоступа"); - - ТипыПодпискиОбновитьГруппыЗначенийДоступа = - УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( - "ОбновитьГруппыЗначенийДоступа"); - - ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ЗаполнитьСвойстваВидаДоступа - |общего модуля УправлениеДоступомПереопределяемый. - | - |'"); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВидыДоступа.Ссылка КАК ВидДоступа, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных - |ИЗ - | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа - |ГДЕ - | ВидыДоступа.Предопределенный = ИСТИНА - | - |УПОРЯДОЧИТЬ ПО - | ВидыДоступа.Ссылка"; - - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ВидыДоступа.ИмяПредопределенныхДанных"); - КонецЕсли; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - Свойства = Новый Структура; - Свойства.Вставить("ВидДоступа", Выборка.ВидДоступа); - Свойства.Вставить("Таблицы", Новый Массив); - Свойства.Вставить("ВидДоступаЧерезПраваПоЗначениямДоступа", Ложь); - Свойства.Вставить("ВидДоступаЕдинственныйДляТипаЗначенияДоступа", Истина); - Свойства.Вставить("ВидДоступаБезГруппЗначенияДоступа", Истина); - Свойства.Вставить("ВидДоступаСОднойГруппойЗначенияДоступа", Истина); - - - Если Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения ИЛИ - Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления ИЛИ - Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения Тогда - - Свойства.Вставить("ВидДоступаИспользуетсяВсегда", Истина); - Иначе - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииСвойствВидаДоступа(Свойства); - КонецЦикла; - - УправлениеДоступомПереопределяемый.ЗаполнитьСвойстваВидаДоступа(Свойства); - - // Неизменяемые свойства вида доступа Пользователи и вида доступа ВнешниеПользователи. - Если Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.Пользователи Тогда - Если Свойства.Таблицы.Найти("Справочник.Пользователи") = Неопределено Тогда - Свойства.Таблицы.Добавить("Справочник.Пользователи"); - КонецЕсли; - Если Свойства.Таблицы.Найти("Справочник.ГруппыПользователей") = Неопределено Тогда - Свойства.Таблицы.Добавить("Справочник.ГруппыПользователей"); - КонецЕсли; - Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина; - Свойства.ВидДоступаБезГруппЗначенияДоступа = Ложь; - Свойства.ВидДоступаСОднойГруппойЗначенияДоступа = Ложь; - - ИначеЕсли Свойства.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи Тогда - Если Свойства.Таблицы.Найти("Справочник.ВнешниеПользователи") = Неопределено Тогда - Свойства.Таблицы.Добавить("Справочник.ВнешниеПользователи"); - КонецЕсли; - Если Свойства.Таблицы.Найти("Справочник.ГруппыВнешнихПользователей") = Неопределено Тогда - Свойства.Таблицы.Добавить("Справочник.ГруппыВнешнихПользователей"); - КонецЕсли; - Свойства.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина; - Свойства.ВидДоступаБезГруппЗначенияДоступа = Ложь; - Свойства.ВидДоступаСОднойГруппойЗначенияДоступа = Ложь; - КонецЕсли; - - Свойства.Вставить("ВидДоступаИспользуетсяВсегда", Ложь); - КонецЕсли; - - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Свойства.Вставить("Имя", Выборка.ИмяПредопределенныхДанных); - Иначе - Свойства.Вставить("Имя", ПолучитьИмяПредопределенного(Свойства.ВидДоступа)); - КонецЕсли; - - Для каждого Таблица Из Свойства.Таблицы Цикл - МетаданныеТаблицы = Метаданные.НайтиПоПолномуИмени(Таблица); - - // Проверка имен таблиц. - Если МетаданныеТаблицы = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + - НСтр("ru = 'Не найдена таблица ""%1"", - |указанная для вида доступа ""%2"".'"), - Таблица, - Свойства.ВидДоступа); - КонецЕсли; - - ТипСсылки = СтандартныеПодсистемыСервер.ТипСсылкиИлиКлючаЗаписиОбъектаМетаданных( - МетаданныеТаблицы); - - ТипОбъекта = СтандартныеПодсистемыСервер.ТипОбъектаИлиНабораЗаписейОбъектаМетаданных( - МетаданныеТаблицы); - - // Заполнение видов доступа значений доступа. - ВидыДоступа = ВидыДоступаЗначенийДоступа.ПоПолнымИменам[Таблица]; - Если ВидыДоступа = Неопределено Тогда - - ВидыДоступа = Новый Массив; - ВидыДоступа.Добавить(Свойства.ВидДоступа); - - ВидыДоступаЗначенийДоступа.ПоПолнымИменам.Вставить(Таблица, ВидыДоступа); - ВидыДоступаЗначенийДоступа.ПоТипамСсылок.Вставить(ТипСсылки, ВидыДоступа); - ВидыДоступаЗначенийДоступа.ПоТипам.Вставить(ТипСсылки, ВидыДоступа); - ВидыДоступаЗначенийДоступа.ПоТипам.Вставить(ТипОбъекта, ВидыДоступа); - - ИначеЕсли ВидыДоступа.Найти(Свойства.ВидДоступа) = Неопределено Тогда - ВидыДоступа.Добавить(Свойства.ВидДоступа); - КонецЕсли; - - // Заполнение типов значений доступа с группами значений доступа. - Если Свойства.ВидДоступа <> ПланыВидовХарактеристик.ВидыДоступа.Пользователи - И Свойства.ВидДоступа <> ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи - И НЕ Свойства.ВидДоступаБезГруппЗначенияДоступа Тогда - - ЗначенияДоступаСГруппами.ПоПолнымИменам.Вставить(Таблица, ТипСсылки); - ЗначенияДоступаСГруппами.ПоТипамСсылок.Вставить(ТипСсылки, Таблица); - ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипСсылки, Таблица); - ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипОбъекта, Таблица); - - // Проверка наличия типа ссылки в измерениях используемых регистров. - - Если ТипыИзмеренияЗначениеДоступаРегистраГрупп.Получить(ТипСсылки) = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + - НСтр("ru = 'Тип значения доступа с группами ""%1"" - |не указан в измерении ""Значение доступа"" - |регистра сведений ""Группы значений доступа"".'"), - Строка(ТипСсылки)); - КонецЕсли; - - Если ТипыПодпискиОбновитьГруппыЗначенийДоступа.Получить(ТипОбъекта) = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + - НСтр("ru = 'Тип значения доступа с группами ""%1"" - |не указан в подписке на событие ""Обновить группы значений доступа"".'"), - Строка(ТипОбъекта)); - КонецЕсли; - КонецЕсли; - КонецЦикла; - - ПоИменам.Вставить (Свойства.Имя, Свойства); - ПоСсылкам.Вставить(Свойства.ВидДоступа, Свойства); - ЗаполнитьЗначенияСвойств(ТаблицаСвойств.Добавить(), Свойства); - КонецЦикла; - - СвойстваВидовДоступа = Новый Структура; - СвойстваВидовДоступа.Вставить("ПоИменам", ПоИменам); - СвойстваВидовДоступа.Вставить("ПоСсылкам", ПоСсылкам); - СвойстваВидовДоступа.Вставить("Таблица", Новый ХранилищеЗначения(ТаблицаСвойств)); - - СвойстваВидовДоступа.Вставить("ВидыДоступаЗначенийДоступа", ВидыДоступаЗначенийДоступа); - СвойстваВидовДоступа.Вставить("ЗначенияДоступаСГруппами", ЗначенияДоступаСГруппами); - - Возврат ОбщегоНазначения.ФиксированныеДанные(СвойстваВидовДоступа); - -КонецФункции - -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form index 4d861bb3a..cb50e8a06 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаВыбора/Form.form @@ -27,8 +27,8 @@ true - КодРасширеннаяПодсказка - 18 + КодExtendedTooltip + 9 Label true true @@ -65,8 +65,8 @@ true - НаименованиеРасширеннаяПодсказка - 20 + НаименованиеExtendedTooltip + 10 Label true true @@ -90,6 +90,40 @@ true + + Ссылка + 11 + true + true + + + Список.Ref + + + СсылкаРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + СсылкаКонтекстноеМеню + 12 + true + + LabelField + Enter + true + Left + true + + true + true + + None СписокКоманднаяПанель @@ -98,10 +132,10 @@ СписокСтрокаПоиска - 9 + 14 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 16 Label true true @@ -111,7 +145,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 15 true Список @@ -121,10 +155,10 @@ СписокСостояниеПросмотра - 12 + 17 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 19 Label true true @@ -134,7 +168,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 18 true ViewStatusAddition @@ -145,10 +179,10 @@ СписокУправлениеПоиском - 15 + 20 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 22 Label true true @@ -158,7 +192,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 21 true SearchControlAddition @@ -168,7 +202,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form index 7d89afc03..ba38324ed 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаСписка/Form.form @@ -27,8 +27,8 @@ true - КодРасширеннаяПодсказка - 20 + КодExtendedTooltip + 11 Label true true @@ -65,8 +65,8 @@ true - НаименованиеРасширеннаяПодсказка - 22 + НаименованиеExtendedTooltip + 12 Label true true @@ -103,8 +103,8 @@ true - ФормулировкаРасширеннаяПодсказка - 24 + ФормулировкаExtendedTooltip + 13 Label true true @@ -128,40 +128,17 @@ true - None - - СписокКоманднаяПанель - 3 - Left - - - СписокСтрокаПоиска - 11 - - СписокСтрокаПоискаРасширеннаяПодсказка - 13 - Label - true - true - - Left - - - - СписокСтрокаПоискаКонтекстноеМеню - 12 - true - - Список - - true - - - - СписокСостояниеПросмотра + + Ссылка 14 + true + true + + + Список.Ref + - СписокСостояниеПросмотраРасширеннаяПодсказка + СсылкаРасширеннаяПодсказка 16 Label true @@ -171,10 +148,67 @@ - СписокСостояниеПросмотраКонтекстноеМеню + СсылкаКонтекстноеМеню 15 true + LabelField + Enter + true + Left + true + + true + true + + + None + + СписокКоманднаяПанель + 3 + Left + + + СписокСтрокаПоиска + 17 + + СписокСтрокаПоискаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 18 + true + + Список + + true + + + + СписокСостояниеПросмотра + 20 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 21 + true + ViewStatusAddition Список @@ -183,10 +217,10 @@ СписокУправлениеПоиском - 17 + 23 СписокУправлениеПоискомРасширеннаяПодсказка - 19 + 25 Label true true @@ -196,7 +230,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 18 + 24 true SearchControlAddition @@ -206,7 +240,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 10 Label true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss index 47e7d6fec..3c82ef846 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Attributes/ВариантыОтветов/ExtInfo/ListSettings.dcss @@ -16,4 +16,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form index 2d99d4b5d..2be1aac6d 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Form.form @@ -19,7 +19,7 @@ НаименованиеПриИзменении - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 94 Label true @@ -60,8 +60,8 @@ Объект.Code - КодРасширеннаяПодсказка - 96 + КодExtendedTooltip + 95 Label true true @@ -99,7 +99,7 @@ Наименование код
          - НаименованиеКодРасширеннаяПодсказка + НаименованиеКодExtendedTooltip 93 Label true @@ -129,8 +129,8 @@ Объект.Parent - РодительРасширеннаяПодсказка - 98 + РодительExtendedTooltip + 96 Label true true @@ -170,8 +170,8 @@ Объект.Формулировка - ПредставлениеРасширеннаяПодсказка - 100 + ПредставлениеExtendedTooltip + 97 Label true true @@ -219,8 +219,8 @@ ТребуетсяКомментарийПриИзменении - ТребуетсяКомментарийРасширеннаяПодсказка - 103 + ТребуетсяКомментарийExtendedTooltip + 99 Label true true @@ -252,8 +252,8 @@ Объект.ПояснениеКомментария - ПояснениеКомментарияРасширеннаяПодсказка - 105 + ПояснениеКомментарияExtendedTooltip + 100 Label true true @@ -291,8 +291,8 @@ Комментарий - КомментарийРасширеннаяПодсказка - 102 + КомментарийExtendedTooltip + 98 Label true true @@ -328,8 +328,8 @@ ТипОтветаПриИзменении - ТипОтветаРасширеннаяПодсказка - 108 + ТипОтветаExtendedTooltip + 102 Label true true @@ -352,6 +352,7 @@ true true true + true true true true @@ -370,8 +371,8 @@ Объект.ЗаполнятьАвтоматически - ЗаполнятьАвтоматическиРасширеннаяПодсказка - 110 + ЗаполнятьАвтоматическиExtendedTooltip + 103 Label true true @@ -405,8 +406,8 @@ Тип заполнение - ТипЗаполнениеРасширеннаяПодсказка - 107 + ТипЗаполнениеExtendedTooltip + 101 Label true true @@ -448,8 +449,8 @@ ДлинаПриИзменении - ДлинаРасширеннаяПодсказка - 115 + ДлинаExtendedTooltip + 107 Label true true @@ -493,8 +494,8 @@ ТочностьПриИзменении - ТочностьРасширеннаяПодсказка - 117 + ТочностьExtendedTooltip + 108 Label true true @@ -534,8 +535,8 @@ Объект.МинимальноеЗначение - МинимальноеЗначениеРасширеннаяПодсказка - 119 + МинимальноеЗначениеExtendedTooltip + 109 Label true true @@ -576,8 +577,8 @@ Объект.МаксимальноеЗначение - МаксимальноеЗначениеРасширеннаяПодсказка - 121 + МаксимальноеЗначениеExtendedTooltip + 110 Label true true @@ -620,8 +621,8 @@ Реквизиты числа - РеквизитыЧислаРасширеннаяПодсказка - 114 + РеквизитыЧислаExtendedTooltip + 106 Label true true @@ -651,8 +652,8 @@ Right - АгрегироватьСуммуВОтчетахРасширеннаяПодсказка - 123 + АгрегироватьСуммуВОтчетахExtendedTooltip + 111 Label true true @@ -686,8 +687,8 @@ Страница число - СтраницаЧислоРасширеннаяПодсказка - 113 + СтраницаЧислоExtendedTooltip + 105 Label true true @@ -716,8 +717,8 @@ ДлинаСтроки - ДлинаСтрокиРасширеннаяПодсказка - 126 + ДлинаСтрокиExtendedTooltip + 113 Label true true @@ -764,87 +765,8 @@ Страница строка - СтраницаСтрокаРасширеннаяПодсказка - 125 - Label - true - true - - Left - - - Page - - auto - - - - КонтактнаяИнформация - 28 - - ВидКонтактнойИнформации - 31 - true - true - - true - - - Объект.ВидКонтактнойИнформации - - - ВидКонтактнойИнформацииРасширеннаяПодсказка - 129 - Label - true - true - - Left - - - - ВидКонтактнойИнформацииКонтекстноеМеню - 32 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - - Отбор.ПометкаУдаления - - - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Контактная информация</value> - - - ru - Контактная информация - - - КонтактнаяИнформацияРасширеннаяПодсказка - 128 + СтраницаСтрокаExtendedTooltip + 112 Label true true @@ -876,8 +798,8 @@ None - ИнформацияВариантыОтветовРасширеннаяПодсказка - 133 + ИнформацияВариантыОтветовExtendedTooltip + 118 Label true true @@ -920,8 +842,8 @@ true false - ВариантыОтветовИнформацияРасширеннаяПодсказка - 132 + ВариантыОтветовИнформацияExtendedTooltip + 117 Label true true @@ -963,8 +885,8 @@ ВариантыОтветов.Owner - ВладелецРасширеннаяПодсказка - 147 + ВладелецExtendedTooltip + 122 Label true true @@ -998,8 +920,8 @@ ВариантыОтветов.РеквизитДопУпорядочивания - ВариантыОтветовРеквизитДопУпорядочиванияРасширеннаяПодсказка - 149 + ВариантыОтветовРеквизитДопУпорядочиванияExtendedTooltip + 123 Label true true @@ -1038,8 +960,8 @@ ВариантыОтветов.Description - ОтветРасширеннаяПодсказка - 151 + ОтветExtendedTooltip + 124 Label true true @@ -1079,8 +1001,8 @@ ВариантыОтветов.ТребуетОткрытогоОтвета - ТребуетОткрытогоОтветаРасширеннаяПодсказка - 153 + ТребуетОткрытогоОтветаExtendedTooltip + 125 Label true true @@ -1100,6 +1022,40 @@ true + + ТаблицаВариантыОтветовСсылка + 129 + true + true + + + ВариантыОтветов.Ref + + + ТаблицаВариантыОтветовСсылкаРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + ТаблицаВариантыОтветовСсылкаКонтекстноеМеню + 130 + true + + LabelField + Enter + true + Left + true + + true + true + + ТаблицаВариантыОтветовКоманднаяПанель 57 @@ -1113,8 +1069,8 @@ false - ТаблицаВариантыОтветовПереместитьВариантОтветаВверхРасширеннаяПодсказка - 135 + ТаблицаВариантыОтветовПереместитьВариантОтветаВверхExtendedTooltip + 119 Label true true @@ -1143,8 +1099,8 @@ false - ТаблицаВариантыОтветовПереместитьВариантОтветаВнизРасширеннаяПодсказка - 136 + ТаблицаВариантыОтветовПереместитьВариантОтветаВнизExtendedTooltip + 120 Label true true @@ -1180,10 +1136,10 @@ ТаблицаВариантыОтветовСтрокаПоиска - 138 + 147 ТаблицаВариантыОтветовСтрокаПоискаРасширеннаяПодсказка - 140 + 149 Label true true @@ -1193,7 +1149,7 @@ ТаблицаВариантыОтветовСтрокаПоискаКонтекстноеМеню - 139 + 148 true ТаблицаВариантыОтветов @@ -1203,10 +1159,10 @@ ТаблицаВариантыОтветовСостояниеПросмотра - 141 + 150 ТаблицаВариантыОтветовСостояниеПросмотраРасширеннаяПодсказка - 143 + 152 Label true true @@ -1216,7 +1172,7 @@ ТаблицаВариантыОтветовСостояниеПросмотраКонтекстноеМеню - 142 + 151 true ViewStatusAddition @@ -1227,10 +1183,10 @@ ТаблицаВариантыОтветовУправлениеПоиском - 144 + 153 ТаблицаВариантыОтветовУправлениеПоискомРасширеннаяПодсказка - 146 + 155 Label true true @@ -1240,7 +1196,7 @@ ТаблицаВариантыОтветовУправлениеПоискомКонтекстноеМеню - 145 + 154 true SearchControlAddition @@ -1250,8 +1206,8 @@ - ТаблицаВариантыОтветовРасширеннаяПодсказка - 137 + ТаблицаВариантыОтветовExtendedTooltip + 121 Label true true @@ -1314,8 +1270,8 @@ Варианты ответов - ВариантыОтветовРасширеннаяПодсказка - 131 + ВариантыОтветовExtendedTooltip + 116 Label true true @@ -1346,8 +1302,8 @@ Значение информационной базы - ЗначениеИнформационнойБазыРасширеннаяПодсказка - 163 + ЗначениеИнформационнойБазыExtendedTooltip + 126 Label true true @@ -1373,8 +1329,8 @@ true - ДекорацияРасширеннаяПодсказка - 165 + ДекорацияExtendedTooltip + 128 Label true true @@ -1409,8 +1365,8 @@ Пустая - ПустаяРасширеннаяПодсказка - 164 + ПустаяExtendedTooltip + 127 Label true true @@ -1438,8 +1394,8 @@ Зависимые параметры - ЗависимыеПараметрыРасширеннаяПодсказка - 112 + ЗависимыеПараметрыExtendedTooltip + 104 Label true true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl index cc9a81e2d..b9ba320ff 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/Forms/ФормаЭлемента/Module.bsl @@ -16,11 +16,7 @@ КонецЕсли; //установим отбор по владельцу на динамическом списке справочника "Варианты ответов анкет" - ЭлементОтбораДанных = ВариантыОтветов.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец"); - ЭлементОтбораДанных.Использование = Истина; - ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбораДанных.ПравоеЗначение = Объект.Ссылка; + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ВариантыОтветов,"Владелец", Объект.Ссылка, ВидСравненияКомпоновкиДанных.Равно, ,Истина); УстановитьТипОтвета(); @@ -86,7 +82,7 @@ Процедура ПослеЗаписи(ПараметрыЗаписи) ДоступностьТаблицыВариантыОтветов(); - ВариантыОтветов.Отбор.Элементы[0].ПравоеЗначение = Объект.Ссылка; + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(ВариантыОтветов,"Владелец", Объект.Ссылка, ВидСравненияКомпоновкиДанных.Равно, ,Истина); КонецПроцедуры @@ -172,7 +168,8 @@ &НаКлиенте Процедура УправлениеВидимостью() - ВозможенКомментарий = НЕ (Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз") ИЛИ Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.Текст")); + ВозможенКомментарий = НЕ (Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз") + ИЛИ Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.Текст")); Элементы.ТребуетсяКомментарий.Доступность = ВозможенКомментарий; Элементы.Комментарий.Доступность = ВозможенКомментарий; Если НЕ ВозможенКомментарий Тогда @@ -194,10 +191,6 @@ ИначеЕсли Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы") Тогда Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.Пустая; - - ИначеЕсли Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ВидКонтактнойИнформации") Тогда - - Элементы.ЗависимыеПараметры.ТекущаяСтраница = Элементы.КонтактнаяИнформация; ИначеЕсли Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.ОдинВариантИз") ИЛИ Объект.ТипОтвета = ПредопределенноеЗначение("Перечисление.ТипыОтветовНаВопрос.НесколькоВариантовИз") Тогда @@ -293,6 +286,10 @@ ТипОтвета = Объект.ТипЗначения; + ИначеЕсли Объект.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ПустаяСсылка() Тогда + + ТипОтвета = Элементы.ТипОтвета.СписокВыбора[0].Значение; + Иначе ТипОтвета = Объект.ТипОтвета; diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl index 30eca3b7f..a9fce43d0 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ObjectModule.bsl @@ -23,9 +23,6 @@ Если ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда МассивНепроверяемыхРеквизитов.Добавить("ТипЗначения"); КонецЕсли; - Если ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда - МассивНепроверяемыхРеквизитов.Добавить("ВидКонтактнойИнформации"); - КонецЕсли; ОбщегоНазначения.УдалитьНепроверяемыеРеквизитыИзМассива(ПроверяемыеРеквизиты, МассивНепроверяемыхРеквизитов); @@ -50,14 +47,7 @@ // Процедура очищает значения ненужных реквизитов, // Такая ситуация возникает, когда пользователь изменяет тип ответа при редактировании. Процедура ОчиститьНенужныеРеквизиты() - - Если (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации) - И (НЕ ВидКонтактнойИнформации.Пустая()) Тогда - - ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.ПустаяСсылка(); - - КонецЕсли; - + Если ((ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Число) И (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Строка) И (ТипОтвета <> Перечисления.ТипыОтветовНаВопрос.Текст)) И (Длина <> 0)Тогда @@ -99,32 +89,28 @@ Если ТипОтвета = ТипыОтветовНаВопрос.Строка Тогда - ТипЗначения = ОписаниеТиповСтрока; + ТипЗначения = ОписаниеТиповСтрока; ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Текст Тогда - ТипЗначения = ОписаниеТиповСтрока; + ТипЗначения = ОписаниеТиповСтрока; ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Число Тогда - ТипЗначения = ОписаниеТиповЧисло; + ТипЗначения = ОписаниеТиповЧисло; ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Дата Тогда - ТипЗначения = ОписаниеТиповДата; + ТипЗначения = ОписаниеТиповДата; ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.Булево Тогда - ТипЗначения = ОписаниеТиповБулево; - - ИначеЕсли ТипОтвета = ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда - - ТипЗначения = ОписаниеТиповСтрока; + ТипЗначения = ОписаниеТиповБулево; ИначеЕсли ТипОтвета =ТипыОтветовНаВопрос.ОдинВариантИз ИЛИ ТипОтвета = ТипыОтветовНаВопрос.НесколькоВариантовИз Тогда - ТипЗначения = ОписаниеТиповВО; + ТипЗначения = ОписаниеТиповВО; КонецЕсли; diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo index d829e0ac1..9a6047fba 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo +++ b/SSL/src/ChartsOfCharacteristicTypes/ВопросыДляАнкетирования/ВопросыДляАнкетирования.mdo @@ -326,28 +326,6 @@ Use Use
          - - ВидКонтактнойИнформации - - ru - Вид контактной информации - - - CatalogRef.ВидыКонтактнойИнформации - - - ru - Вид контактной информации, который будет дан как ответ - - - - ShowError - - Catalog.ВидыКонтактнойИнформации.EmptyRef - - Use - Use - Точность diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form index 1da46e384..d9c6553cf 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Form.form @@ -26,7 +26,7 @@ true - РеквизитПредупреждениеКартинкаРасширеннаяПодсказка + РеквизитПредупреждениеКартинкаExtendedTooltip 64 Label true @@ -67,7 +67,7 @@ true - РеквизитПредупреждениеКомментарийРасширеннаяПодсказка + РеквизитПредупреждениеКомментарийExtendedTooltip 65 Label true @@ -102,7 +102,7 @@ Реквизит предупреждение - РеквизитПредупреждениеРасширеннаяПодсказка + РеквизитПредупреждениеExtendedTooltip 63 Label true @@ -137,7 +137,7 @@ ВидПриИзменении - ОтдельныеЗначенияРеквизитаРасширеннаяПодсказка + ОтдельныеЗначенияРеквизитаExtendedTooltip 66 Label true @@ -182,8 +182,8 @@ true - ОтдельныеЗначенияРеквизитаКомментарийРасширеннаяПодсказка - 68 + ОтдельныеЗначенияРеквизитаКомментарийExtendedTooltip + 67 Label true true @@ -229,8 +229,8 @@ ВидПриИзменении - ОбщиеЗначенияРеквизитовРасширеннаяПодсказка - 71 + ОбщиеЗначенияРеквизитовExtendedTooltip + 70 Label true true @@ -276,8 +276,8 @@ true - ОбщиеЗначенияРеквизитовКомментарийРасширеннаяПодсказка - 73 + ОбщиеЗначенияРеквизитовКомментарийExtendedTooltip + 71 Label true true @@ -314,8 +314,8 @@ Вид общие значения реквизитов - ВидОбщиеЗначенияРеквизитовРасширеннаяПодсказка - 70 + ВидОбщиеЗначенияРеквизитовExtendedTooltip + 69 Label true true @@ -349,8 +349,8 @@ ВидПриИзменении - ОбщийРеквизитРасширеннаяПодсказка - 75 + ОбщийРеквизитExtendedTooltip + 73 Label true true @@ -397,8 +397,8 @@ true - ОбщийРеквизитКомментарийРасширеннаяПодсказка - 77 + ОбщийРеквизитКомментарийExtendedTooltip + 74 Label true true @@ -435,8 +435,8 @@ Вид общий реквизит - ВидОбщийРеквизитРасширеннаяПодсказка - 74 + ВидОбщийРеквизитExtendedTooltip + 72 Label true true @@ -460,8 +460,8 @@ Виды реквизита - ВидыРеквизитаРасширеннаяПодсказка - 69 + ВидыРеквизитаExtendedTooltip + 68 Label true true @@ -488,7 +488,7 @@ Реквизит - РеквизитРасширеннаяПодсказка + РеквизитExtendedTooltip 62 Label true @@ -522,8 +522,8 @@ true - СведениеПредупреждениеКартинкаРасширеннаяПодсказка - 80 + СведениеПредупреждениеКартинкаExtendedTooltip + 77 Label true true @@ -563,8 +563,8 @@ true - СведениеПредупреждениеКомментарийРасширеннаяПодсказка - 81 + СведениеПредупреждениеКомментарийExtendedTooltip + 78 Label true true @@ -602,8 +602,8 @@ Сведение предупреждение - СведениеПредупреждениеРасширеннаяПодсказка - 79 + СведениеПредупреждениеExtendedTooltip + 76 Label true true @@ -637,8 +637,8 @@ ВидПриИзменении - ОтдельныеЗначенияСведенияРасширеннаяПодсказка - 82 + ОтдельныеЗначенияСведенияExtendedTooltip + 79 Label true true @@ -682,8 +682,8 @@ true - ОтдельныеЗначенияСведенияКомментарийРасширеннаяПодсказка - 84 + ОтдельныеЗначенияСведенияКомментарийExtendedTooltip + 80 Label true true @@ -729,8 +729,8 @@ ВидПриИзменении - ОбщиеЗначенияСведенийРасширеннаяПодсказка - 87 + ОбщиеЗначенияСведенийExtendedTooltip + 83 Label true true @@ -776,8 +776,8 @@ true - ОбщиеЗначенияСведенийКомментарийРасширеннаяПодсказка - 89 + ОбщиеЗначенияСведенийКомментарийExtendedTooltip + 84 Label true true @@ -814,8 +814,8 @@ Вид общие значения сведений - ВидОбщиеЗначенияСведенийРасширеннаяПодсказка - 86 + ВидОбщиеЗначенияСведенийExtendedTooltip + 82 Label true true @@ -849,8 +849,8 @@ ВидПриИзменении - ОбщееСведениеРасширеннаяПодсказка - 91 + ОбщееСведениеExtendedTooltip + 86 Label true true @@ -897,8 +897,8 @@ true - ОбщееСведениеКомментарийРасширеннаяПодсказка - 93 + ОбщееСведениеКомментарийExtendedTooltip + 87 Label true true @@ -935,8 +935,8 @@ Вид общее сведение - ВидОбщееСведениеРасширеннаяПодсказка - 90 + ВидОбщееСведениеExtendedTooltip + 85 Label true true @@ -964,8 +964,8 @@ Виды сведения - ВидыСведенияРасширеннаяПодсказка - 85 + ВидыСведенияExtendedTooltip + 81 Label true true @@ -992,8 +992,8 @@ Сведение - СведениеРасширеннаяПодсказка - 78 + СведениеExtendedTooltip + 75 Label true true @@ -1021,7 +1021,7 @@ Типы свойства - ТипыСвойстваРасширеннаяПодсказка + ТипыСвойстваExtendedTooltip 61 Label true @@ -1047,7 +1047,7 @@ true - ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + ФормаЗаписатьИЗакрытьExtendedTooltip 60 Label true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl index 0865fd18e..c877fd5dc 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ИзменениеНастройкиСвойства/Module.bsl @@ -59,7 +59,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность); + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьЗавершение", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры @@ -80,7 +81,7 @@ ОтдельноеСвойствоСОтдельнымСпискомЗначений = 0; ОбщееСвойство = 0; - ЭтаФорма[Элементы[ИмяЭлемента].ПутьКДанным] = 1; + ЭтотОбъект[Элементы[ИмяЭлемента].ПутьКДанным] = 1; КонецПроцедуры @@ -90,6 +91,16 @@ &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) + ЗаписатьИЗакрытьЗавершение(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ЗаписатьИЗакрытьЗавершение(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + Если ОтдельноеСвойствоСОтдельнымСпискомЗначений = 1 Тогда ЗаписатьНачало(); Иначе @@ -98,9 +109,6 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаКлиенте Процедура ЗаписатьНачало() @@ -122,7 +130,7 @@ ПараметрыДлительнойОперацииКлиент.Вставить("ФормаДлительнойОперации", ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации( - ЭтаФорма, ПараметрыДлительнойОперации.ИдентификаторЗадания)); + ЭтотОбъект, ПараметрыДлительнойОперации.ИдентификаторЗадания)); КонецЕсли; КонецПроцедуры @@ -179,7 +187,6 @@ Процедура ЗаписатьЗавершение(ОткрытьСвойство) Модифицированность = Ложь; - Закрыть(); Оповестить("Запись_ДополнительныеРеквизитыИСведения", Новый Структура("Ссылка", Свойство), Свойство); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form index 2915c7b7b..3a40dcc79 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Form.form @@ -27,7 +27,7 @@ true - ТекстПоясненияДополнительногоРеквизитаРасширеннаяПодсказка + ТекстПоясненияДополнительногоРеквизитаExtendedTooltip 32 Label true @@ -65,7 +65,7 @@ Пояснение дополнительного реквизита - ПояснениеДополнительногоРеквизитаРасширеннаяПодсказка + ПояснениеДополнительногоРеквизитаExtendedTooltip 31 Label true @@ -97,7 +97,7 @@ true - ТекстПоясненияДополнительногоСведенияРасширеннаяПодсказка + ТекстПоясненияДополнительногоСведенияExtendedTooltip 34 Label true @@ -135,7 +135,7 @@ Пояснение дополнительного сведения - ПояснениеДополнительногоСведенияРасширеннаяПодсказка + ПояснениеДополнительногоСведенияExtendedTooltip 33 Label true @@ -163,7 +163,7 @@ Пояснения - ПоясненияРасширеннаяПодсказка + ПоясненияExtendedTooltip 30 Label true @@ -194,7 +194,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 36 Label true @@ -204,8 +204,8 @@ Form.Command.РазрешитьРедактирование - Normal Auto + true true true UserCmds @@ -225,7 +225,7 @@ Кнопки пояснения - КнопкиПоясненияРасширеннаяПодсказка + КнопкиПоясненияExtendedTooltip 35 Label true @@ -253,7 +253,7 @@ Объект не используется - ОбъектНеИспользуетсяРасширеннаяПодсказка + ОбъектНеИспользуетсяExtendedTooltip 29 Label true @@ -292,7 +292,7 @@ true - ТекстПредупрежденияДополнительногоРеквизитаРасширеннаяПодсказка + ТекстПредупрежденияДополнительногоРеквизитаExtendedTooltip 40 Label true @@ -330,7 +330,7 @@ Предупреждение дополнительного реквизита - ПредупреждениеДополнительногоРеквизитаРасширеннаяПодсказка + ПредупреждениеДополнительногоРеквизитаExtendedTooltip 39 Label true @@ -363,7 +363,7 @@ true - ТекстПредупрежденияДополнительногоСведенияРасширеннаяПодсказка + ТекстПредупрежденияДополнительногоСведенияExtendedTooltip 42 Label true @@ -401,7 +401,7 @@ Предупреждение дополнительного сведения - ПредупреждениеДополнительногоСведенияРасширеннаяПодсказка + ПредупреждениеДополнительногоСведенияExtendedTooltip 41 Label true @@ -429,7 +429,7 @@ Предупреждения - ПредупрежденияРасширеннаяПодсказка + ПредупрежденияExtendedTooltip 38 Label true @@ -456,7 +456,7 @@ false - РазрешитьРедактированиеРасширеннаяПодсказка + РазрешитьРедактированиеExtendedTooltip 44 Label true @@ -483,7 +483,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 45 Label true @@ -514,7 +514,7 @@ Кнопки предупреждения - КнопкиПредупрежденияРасширеннаяПодсказка + КнопкиПредупрежденияExtendedTooltip 43 Label true @@ -542,7 +542,7 @@ Объект используется - ОбъектИспользуетсяРасширеннаяПодсказка + ОбъектИспользуетсяExtendedTooltip 37 Label true @@ -570,7 +570,7 @@ Диалоги пользователя - ДиалогиПользователяРасширеннаяПодсказка + ДиалогиПользователяExtendedTooltip 28 Label true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl index 6ced34348..cc02fb2b0 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/РазблокированиеРеквизитов/Module.bsl @@ -37,8 +37,12 @@ &НаКлиенте Процедура РазрешитьРедактирование(Команда) - Результат = Новый Массив; - Результат.Добавить("ТипЗначения"); - ОповеститьОВыборе(Результат); + РазблокируемыеРеквизиты = Новый Массив; + РазблокируемыеРеквизиты.Добавить("ТипЗначения"); + + Закрыть(); + + ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы( + ВладелецФормы, РазблокируемыеРеквизиты); КонецПроцедуры diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form index ea0eb67a1..e97bf41d4 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Form.form @@ -27,8 +27,8 @@ true - ПредставлениеРасширеннаяПодсказка - 42 + ПредставлениеExtendedTooltip + 33 Label true true @@ -71,10 +71,10 @@ СписокСтрокаПоиска - 33 + 35 СписокСтрокаПоискаРасширеннаяПодсказка - 35 + 37 Label true true @@ -84,7 +84,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 34 + 36 true Список @@ -94,10 +94,10 @@ СписокСостояниеПросмотра - 36 + 38 СписокСостояниеПросмотраРасширеннаяПодсказка - 38 + 40 Label true true @@ -107,7 +107,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 37 + 39 true ViewStatusAddition @@ -118,10 +118,10 @@ СписокУправлениеПоиском - 39 + 41 СписокУправлениеПоискомРасширеннаяПодсказка - 41 + 43 Label true true @@ -131,7 +131,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 40 + 42 true SearchControlAddition @@ -141,7 +141,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 32 Label true @@ -162,7 +162,7 @@ true - СписокКонтекстноеМенюСоздатьРасширеннаяПодсказка + СписокКонтекстноеМенюСоздатьExtendedTooltip 26 Label true @@ -188,7 +188,7 @@ true - СписокКонтекстноеМенюСкопироватьРасширеннаяПодсказка + СписокКонтекстноеМенюСкопироватьExtendedTooltip 27 Label true @@ -214,7 +214,7 @@ true - СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка + СписокКонтекстноеМенюИзменитьExtendedTooltip 28 Label true @@ -240,7 +240,7 @@ true - СписокКонтекстноеМенюУстановитьПометкуУдаленияРасширеннаяПодсказка + СписокКонтекстноеМенюУстановитьПометкуУдаленияExtendedTooltip 29 Label true @@ -266,7 +266,7 @@ true - СписокКонтекстноеМенюНайтиРасширеннаяПодсказка + СписокКонтекстноеМенюНайтиExtendedTooltip 30 Label true @@ -292,7 +292,7 @@ true - СписокКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка + СписокКонтекстноеМенюОтменитьПоискExtendedTooltip 31 Label true @@ -364,8 +364,8 @@ Items.Список.CurrentData.Комментарий - КомментарийРасширеннаяПодсказка - 52 + КомментарийExtendedTooltip + 34 Label true true @@ -407,7 +407,7 @@ true - ФормаСоздатьРасширеннаяПодсказка + ФормаСоздатьExtendedTooltip 20 Label true @@ -433,7 +433,7 @@ true - ФормаСкопироватьРасширеннаяПодсказка + ФормаСкопироватьExtendedTooltip 21 Label true @@ -459,7 +459,7 @@ true - ФормаИзменитьРасширеннаяПодсказка + ФормаИзменитьExtendedTooltip 22 Label true @@ -485,7 +485,7 @@ true - ФормаУстановитьПометкуУдаленияРасширеннаяПодсказка + ФормаУстановитьПометкуУдаленияExtendedTooltip 23 Label true @@ -512,7 +512,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 24 Label true @@ -539,7 +539,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 25 Label true @@ -624,6 +624,8 @@ ТОГДА 2 ИНАЧЕ 1 КОНЕЦ + ВЫБОР + КОГДА Свойства.Предопределенный + ТОГДА 6 КОГДА Свойства.ПометкаУдаления ТОГДА 3 ИНАЧЕ 0 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl index 7a889b0b7..930c222de 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаВыбора/Module.bsl @@ -71,14 +71,11 @@ Истина); // Группировка свойств по наборам. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ГруппировкаСвойствПоНаборам"; - ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; - Иначе - ПоляГруппировки = Список.Группировка; - КонецЕсли; + ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ГруппировкаСвойствПоНаборам"; + ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + + ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; ЭлементГруппировкиДанных = ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЭлементГруппировкиДанных.Поле = Новый ПолеКомпоновкиДанных("НаборСвойствГруппировка"); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form index 8f6ac7ac6..0af3afea8 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Form.form @@ -30,8 +30,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 18 + НаименованиеExtendedTooltip + 9 Label true true @@ -75,8 +75,8 @@ true - ТипЗначенияРасширеннаяПодсказка - 20 + ТипЗначенияExtendedTooltip + 10 Label true true @@ -112,10 +112,10 @@ СписокСтрокаПоиска - 9 + 11 СписокСтрокаПоискаРасширеннаяПодсказка - 11 + 13 Label true true @@ -125,7 +125,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 10 + 12 true Список @@ -135,10 +135,10 @@ СписокСостояниеПросмотра - 12 + 14 СписокСостояниеПросмотраРасширеннаяПодсказка - 14 + 16 Label true true @@ -148,7 +148,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 13 + 15 true ViewStatusAddition @@ -159,10 +159,10 @@ СписокУправлениеПоиском - 15 + 17 СписокУправлениеПоискомРасширеннаяПодсказка - 17 + 19 Label true true @@ -172,7 +172,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 16 + 18 true SearchControlAddition @@ -182,7 +182,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 8 Label true @@ -304,6 +304,8 @@ ТОГДА 2 ИНАЧЕ 1 КОНЕЦ + ВЫБОР + КОГДА Свойства.Предопределенный + ТОГДА 6 КОГДА Свойства.ПометкаУдаления ТОГДА 3 ИНАЧЕ 0 diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Module.bsl index d3291d78f..cfe5b2782 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаСписка/Module.bsl @@ -15,14 +15,11 @@ Истина); // Группировка свойств по наборам. - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); - ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ГруппировкаСвойствПоНаборам"; - ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; - ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; - Иначе - ПоляГруппировки = Список.Группировка; - КонецЕсли; + ГруппировкаДанных = Список.КомпоновщикНастроек.Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаДанных.ИдентификаторПользовательскойНастройки = "ГруппировкаСвойствПоНаборам"; + ГруппировкаДанных.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; + + ПоляГруппировки = ГруппировкаДанных.ПоляГруппировки; ЭлементГруппировкиДанных = ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ЭлементГруппировкиДанных.Поле = Новый ПолеКомпоновкиДанных("НаборСвойствГруппировка"); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Attributes/Значения/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Attributes/Значения/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Attributes/Значения/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Attributes/Значения/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form index f1165bae4..83340a092 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Form.form @@ -24,7 +24,7 @@ выводится в формах редактирования его значения. - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 116 Label true @@ -55,7 +55,7 @@ Вертикальная группа 3 - ВертикальнаяГруппа3РасширеннаяПодсказка + ВертикальнаяГруппа3ExtendedTooltip 115 Label true @@ -91,7 +91,7 @@ true None - ЗаголовокРасширеннаяПодсказка + ЗаголовокExtendedTooltip 118 Label true @@ -135,8 +135,8 @@ ЭтоДополнительноеСведениеПриИзменении - ЭтоДополнительноеСведениеРасширеннаяПодсказка - 120 + ЭтоДополнительноеСведениеExtendedTooltip + 119 Label true true @@ -190,8 +190,8 @@ Right - ЗаполнятьОбязательноРасширеннаяПодсказка - 122 + ЗаполнятьОбязательноExtendedTooltip + 120 Label true true @@ -221,7 +221,7 @@ Вертикальная группа 4 - ВертикальнаяГруппа4РасширеннаяПодсказка + ВертикальнаяГруппа4ExtendedTooltip 117 Label true @@ -250,7 +250,7 @@ Горизонтальная группа 2 - ГоризонтальнаяГруппа2РасширеннаяПодсказка + ГоризонтальнаяГруппа2ExtendedTooltip 114 Label true @@ -287,8 +287,8 @@ true - Декорация1РасширеннаяПодсказка - 126 + Декорация1ExtendedTooltip + 123 Label true true @@ -318,8 +318,8 @@ Вертикальная группа 1 - ВертикальнаяГруппа1РасширеннаяПодсказка - 125 + ВертикальнаяГруппа1ExtendedTooltip + 122 Label true true @@ -360,8 +360,8 @@ ТипЗначенияПриИзменении - ТипЗначенияРасширеннаяПодсказка - 129 + ТипЗначенияExtendedTooltip + 126 Label true true @@ -397,8 +397,8 @@ true - РедактироватьФорматЗначенияРасширеннаяПодсказка - 131 + РедактироватьФорматЗначенияExtendedTooltip + 127 Label true true @@ -425,8 +425,8 @@ Тип значения формат - ТипЗначенияФорматРасширеннаяПодсказка - 128 + ТипЗначенияФорматExtendedTooltip + 125 Label true true @@ -456,8 +456,8 @@ true - Декорация2РасширеннаяПодсказка - 132 + Декорация2ExtendedTooltip + 128 Label true true @@ -490,8 +490,8 @@ Вертикальная группа 2 - ВертикальнаяГруппа2РасширеннаяПодсказка - 127 + ВертикальнаяГруппа2ExtendedTooltip + 124 Label true true @@ -519,8 +519,8 @@ Горизонтальная группа 1 - ГоризонтальнаяГруппа1РасширеннаяПодсказка - 124 + ГоризонтальнаяГруппа1ExtendedTooltip + 121 Label true true @@ -557,8 +557,8 @@ Right - МногострочноеПолеВводаРасширеннаяПодсказка - 135 + МногострочноеПолеВводаExtendedTooltip + 131 Label true true @@ -599,8 +599,8 @@ МногострочноеПолеВводаЧислоПриИзменении - МногострочноеПолеВводаЧислоРасширеннаяПодсказка - 137 + МногострочноеПолеВводаЧислоExtendedTooltip + 132 Label true true @@ -644,13 +644,9 @@ ru Группа многострочное поле ввода настройки - - ru - Группа многострочное поле ввода настройки - - ГруппаМногострочноеПолеВводаНастройкиРасширеннаяПодсказка - 134 + ГруппаМногострочноеПолеВводаНастройкиExtendedTooltip + 130 Label true true @@ -677,8 +673,8 @@ Группа многострочность - ГруппаМногострочностьРасширеннаяПодсказка - 133 + ГруппаМногострочностьExtendedTooltip + 129 Label true true @@ -725,8 +721,8 @@ Значения.Description - ЗначенияНаименованиеРасширеннаяПодсказка - 163 + ЗначенияНаименованиеExtendedTooltip + 148 Label true true @@ -761,8 +757,8 @@ Значения.Вес - ЗначенияВесРасширеннаяПодсказка - 165 + ЗначенияВесExtendedTooltip + 149 Label true true @@ -800,8 +796,8 @@ true - ЗначенияСоздатьРасширеннаяПодсказка - 147 + ЗначенияСоздатьExtendedTooltip + 141 Label true true @@ -826,8 +822,8 @@ true - ЗначенияСоздатьГруппуРасширеннаяПодсказка - 148 + ЗначенияСоздатьГруппуExtendedTooltip + 142 Label true true @@ -852,8 +848,8 @@ true - ЗначенияИзменитьРасширеннаяПодсказка - 149 + ЗначенияИзменитьExtendedTooltip + 143 Label true true @@ -878,8 +874,8 @@ true - ЗначенияУстановитьПометкуУдаленияРасширеннаяПодсказка - 150 + ЗначенияУстановитьПометкуУдаленияExtendedTooltip + 144 Label true true @@ -904,13 +900,9 @@ ru Значения командная панель редактирования - - ru - Значения командная панель редактирования - - ЗначенияКоманднаяПанельРедактированияРасширеннаяПодсказка - 146 + ЗначенияКоманднаяПанельРедактированияExtendedTooltip + 140 Label true true @@ -929,8 +921,8 @@ true - ЗначенияНайтиРасширеннаяПодсказка - 151 + ЗначенияНайтиExtendedTooltip + 145 Label true true @@ -955,8 +947,8 @@ true - ЗначенияОтменитьПоискРасширеннаяПодсказка - 152 + ЗначенияОтменитьПоискExtendedTooltip + 146 Label true true @@ -988,10 +980,10 @@ ЗначенияСтрокаПоиска - 154 + 169 ЗначенияСтрокаПоискаРасширеннаяПодсказка - 156 + 171 Label true true @@ -1001,7 +993,7 @@ ЗначенияСтрокаПоискаКонтекстноеМеню - 155 + 170 true Значения @@ -1011,10 +1003,10 @@ ЗначенияСостояниеПросмотра - 157 + 172 ЗначенияСостояниеПросмотраРасширеннаяПодсказка - 159 + 174 Label true true @@ -1024,7 +1016,7 @@ ЗначенияСостояниеПросмотраКонтекстноеМеню - 158 + 173 true ViewStatusAddition @@ -1035,10 +1027,10 @@ ЗначенияУправлениеПоиском - 160 + 175 ЗначенияУправлениеПоискомРасширеннаяПодсказка - 162 + 177 Label true true @@ -1048,7 +1040,7 @@ ЗначенияУправлениеПоискомКонтекстноеМеню - 161 + 176 true SearchControlAddition @@ -1058,8 +1050,8 @@ - ЗначенияРасширеннаяПодсказка - 153 + ЗначенияExtendedTooltip + 147 Label true true @@ -1082,8 +1074,8 @@ true - ЗначенияСоздать1РасширеннаяПодсказка - 141 + ЗначенияСоздать1ExtendedTooltip + 135 Label true true @@ -1108,8 +1100,8 @@ true - ЗначенияСоздатьГруппу1РасширеннаяПодсказка - 142 + ЗначенияСоздатьГруппу1ExtendedTooltip + 136 Label true true @@ -1134,8 +1126,8 @@ true - ЗначенияИзменить1РасширеннаяПодсказка - 143 + ЗначенияИзменить1ExtendedTooltip + 137 Label true true @@ -1160,8 +1152,8 @@ true - ЗначенияУстановитьПометкуУдаления1РасширеннаяПодсказка - 144 + ЗначенияУстановитьПометкуУдаления1ExtendedTooltip + 138 Label true true @@ -1190,8 +1182,8 @@ Значения контекстное меню стандартные команды - ЗначенияКонтекстноеМенюСтандартныеКомандыРасширеннаяПодсказка - 145 + ЗначенияКонтекстноеМенюСтандартныеКомандыExtendedTooltip + 139 Label true true @@ -1213,8 +1205,8 @@ Значения контекстное меню редактирования - ЗначенияКонтекстноеМенюРедактированияРасширеннаяПодсказка - 140 + ЗначенияКонтекстноеМенюРедактированияExtendedTooltip + 134 Label true true @@ -1281,8 +1273,8 @@ ДополнительныеЗначенияСВесомПриИзменении - ДополнительныеЗначенияСВесомРасширеннаяПодсказка - 175 + ДополнительныеЗначенияСВесомExtendedTooltip + 150 Label true true @@ -1326,8 +1318,8 @@ Переход к редактированию списка значений. - УточнениеСпискаЗначенийКомментарийРасширеннаяПодсказка - 178 + УточнениеСпискаЗначенийКомментарийExtendedTooltip + 152 Label true true @@ -1361,8 +1353,8 @@ true - УточнениеСпискаЗначенийИзменитьРасширеннаяПодсказка - 179 + УточнениеСпискаЗначенийИзменитьExtendedTooltip + 153 Label true true @@ -1384,9 +1376,17 @@ true + + <key>ru</key> + <value>Уточнение списка значений</value> + + + ru + Уточнение списка значений + - УточнениеСпискаЗначенийРасширеннаяПодсказка - 177 + УточнениеСпискаЗначенийExtendedTooltip + 151 Label true true @@ -1413,8 +1413,8 @@ Дополнительные значения: - ДополнительныеЗначенияРасширеннаяПодсказка - 139 + ДополнительныеЗначенияExtendedTooltip + 133 Label true true @@ -1453,8 +1453,8 @@ Объект.Подсказка - ПодсказкаРасширеннаяПодсказка - 181 + ПодсказкаExtendedTooltip + 155 Label true true @@ -1501,8 +1501,8 @@ Используется в заголовке формы дополнительного значения свойства. - ЗаголовокФормыЗначенияРасширеннаяПодсказка - 184 + ЗаголовокФормыЗначенияExtendedTooltip + 157 Label true true @@ -1547,8 +1547,8 @@ Используется в заголовке формы выбора дополнительного значения свойства. - ЗаголовокФормыВыбораЗначенияРасширеннаяПодсказка - 186 + ЗаголовокФормыВыбораЗначенияExtendedTooltip + 158 Label true true @@ -1584,12 +1584,12 @@ <key>ru</key> - <value>Представление предмета для пользователя при открытии и выборе значения</value> + <value>Группа заголовки форм значений</value> false - ГруппаЗаголовкиФормЗначенийРасширеннаяПодсказка - 183 + ГруппаЗаголовкиФормЗначенийExtendedTooltip + 156 Label true true @@ -1620,8 +1620,8 @@ Left - КомментарийРасширеннаяПодсказка - 188 + КомментарийExtendedTooltip + 159 Label true true @@ -1667,8 +1667,8 @@ Остальные реквизиты - ОстальныеРеквизитыРасширеннаяПодсказка - 180 + ОстальныеРеквизитыExtendedTooltip + 154 Label true true @@ -1707,8 +1707,8 @@ Переход к набору. - УточнениеНаборовКомментарийРасширеннаяПодсказка - 191 + УточнениеНаборовКомментарийExtendedTooltip + 161 Label true true @@ -1742,8 +1742,8 @@ true - УточнениеНаборовИзменитьРасширеннаяПодсказка - 192 + УточнениеНаборовИзменитьExtendedTooltip + 162 Label true true @@ -1769,9 +1769,13 @@ ru Уточнение наборов + + ru + Уточнение наборов + - УточнениеНаборовРасширеннаяПодсказка - 190 + УточнениеНаборовExtendedTooltip + 160 Label true true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl index 2c903961e..c91e06a8b 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Forms/ФормаЭлемента/Module.bsl @@ -1,3 +1,6 @@ +&НаКлиенте +Перем ОбработкаПродолженияПриОшибкеЗаписи; + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -9,7 +12,7 @@ КонецЕсли; // Обработчик подсистемы запрета редактирования реквизитов объектов. - ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект); ТекущийНаборСвойств = Параметры.ТекущийНаборСвойств; @@ -47,13 +50,7 @@ &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) - = ВРег("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.РазблокированиеРеквизитов") Тогда - - ЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы( - ЭтаФорма, ВыбранноеЗначение); - - ИначеЕсли ТипЗнч(ВыбранноеЗначение) = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда + Если ТипЗнч(ВыбранноеЗначение) = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда Закрыть(); // Открытие формы свойства. @@ -68,25 +65,34 @@ КонецПроцедуры &НаКлиенте -Процедура ПередЗаписью(Отказ) +Процедура ПередЗаписью(Отказ, ПараметрыЗаписи) - // Заполнение наименования по набору свойств - // и проверка есть ли свойство с тем же наименованием. - ТекстВопроса = НаименованиеУжеИспользуется( - Объект.Заголовок, Объект.Ссылка, Объект.НаборСвойств, Объект.Наименование); + Если НЕ ПараметрыЗаписи.Свойство("КогдаНаименованиеУжеИспользуется") Тогда - Если ЗначениеЗаполнено(ТекстВопроса) Тогда - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("ПродолжитьЗапись", НСтр("ru = 'Продолжить запись'")); - Кнопки.Добавить("ВернутьсяКВводуНаименования", НСтр("ru = 'Вернуться к вводу наименования'")); + // Заполнение наименования по набору свойств + // и проверка есть ли свойство с тем же наименованием. + ТекстВопроса = НаименованиеУжеИспользуется( + Объект.Заголовок, Объект.Ссылка, Объект.НаборСвойств, Объект.Наименование); - Ответ = Вопрос(ТекстВопроса, Кнопки, , "ВернутьсяКВводуНаименования"); - Если Ответ <> "ПродолжитьЗапись" Тогда + Если ЗначениеЗаполнено(ТекстВопроса) Тогда + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("ПродолжитьЗапись", НСтр("ru = 'Продолжить запись'")); + Кнопки.Добавить("ВернутьсяКВводуНаименования", НСтр("ru = 'Вернуться к вводу наименования'")); + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеОтветаНаВопросКогдаНаименованиеУжеИспользуется", ЭтотОбъект, ПараметрыЗаписи), + ТекстВопроса, Кнопки, , "ВернутьсяКВводуНаименования"); + Отказ = Истина; - ТекущийЭлемент = Элементы.Заголовок; + Возврат; КонецЕсли; КонецЕсли; + Если ПараметрыЗаписи.Свойство("ОбработкаПродолжения") Тогда + ОбработкаПродолженияПриОшибкеЗаписи = ПараметрыЗаписи.ОбработкаПродолжения; + ПодключитьОбработчикОжидания("ПослеОшибкиЗаписи", 0.1, Истина); + КонецЕсли; + КонецПроцедуры &НаСервере @@ -122,7 +128,7 @@ КонецПроцедуры &НаСервере -Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект) +Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) Если ЗначениеЗаполнено(ТекущийОбъект.НаборСвойств) Тогда ДобавитьВНабор = ТекущийОбъект.НаборСвойств; @@ -149,13 +155,17 @@ КонецЕсли; КонецЕсли; + Если ПараметрыЗаписи.Свойство("ОчиститьВведенныеВесовыеКоэффициенты") Тогда + ОчиститьВведенныеВесовыеКоэффициенты(); + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) // Обработчик подсистемы запрета редактирования реквизитов объектов. - ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтаФорма); + ЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(ЭтотОбъект); ОбновитьСоставЭлементовФормы(); @@ -177,6 +187,15 @@ Новый Структура("Ссылка", ПараметрыЗаписи.ИзмененныйНабор), ПараметрыЗаписи.ИзмененныйНабор); КонецЕсли; + Если ПараметрыЗаписи.Свойство("ОбработкаПродолжения") Тогда + ОбработкаПродолженияПриОшибкеЗаписи = Неопределено; + ОтключитьОбработчикОжидания("ПослеОшибкиЗаписи"); + ВыполнитьОбработкуОповещения( + Новый ОписаниеОповещения(ПараметрыЗаписи.ОбработкаПродолжения.ИмяПроцедуры, + ЭтотОбъект, ПараметрыЗаписи.ОбработкаПродолжения.Параметры), + Ложь); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -194,47 +213,16 @@ &НаКлиенте Процедура УточнениеСпискаЗначенийКомментарийНажатие(Элемент) - Если ЗаписатьОбъект("ПереходКСпискуЗначений") Тогда - Закрыть(); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПоказатьУточнениеНабора", Истина); - ПараметрыФормы.Вставить("Ключ", Объект.ВладелецДополнительныхЗначений); - ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНаборСвойств); - - ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта", - ПараметрыФормы, ВладелецФормы); - КонецЕсли; + ЗаписатьОбъект("ПереходКСпискуЗначений", + "УточнениеСпискаЗначенийКомментарийНажатиеЗавершение"); КонецПроцедуры &НаКлиенте Процедура УточнениеНаборовКомментарийНажатие(Элемент) - Если НЕ ЗаписатьОбъект("ПереходКСпискуЗначений") Тогда - Возврат; - КонецЕсли; - - ВыбранныйНабор = Неопределено; - - Если СписокНаборов.Количество() > 1 Тогда - ВыбранныйЭлемент = ВыбратьИзСписка(СписокНаборов, Элементы.УточнениеНаборовКомментарий); - Если ВыбранныйЭлемент <> Неопределено Тогда - ВыбранныйНабор = ВыбранныйЭлемент.Значение; - КонецЕсли; - Иначе - ВыбранныйНабор = СписокНаборов[0].Значение; - КонецЕсли; - - Если ВыбранныйНабор <> Неопределено Тогда - Закрыть(); - - ЗначениеВыбора = Новый Структура; - ЗначениеВыбора.Вставить("Набор", ВыбранныйНабор); - ЗначениеВыбора.Вставить("Свойство", Объект.Ссылка); - ЗначениеВыбора.Вставить("ЭтоДополнительноеСведение", Объект.ЭтоДополнительноеСведение); - ОповеститьОВыборе(ЗначениеВыбора); - КонецЕсли; + ЗаписатьОбъект("ПереходКСпискуЗначений", + "УточнениеНаборовКомментарийНажатиеПродолжение"); КонецПроцедуры @@ -245,7 +233,7 @@ ОбновитьСоставЭлементовФормы(ТекстПредупреждения); Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(, ТекстПредупреждения); КонецЕсли; КонецПроцедуры @@ -264,35 +252,13 @@ Кнопки = Новый СписокЗначений; Кнопки.Добавить("ОчиститьИЗаписать", НСтр("ru = 'Очистить и записать'")); Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); - Ответ = Вопрос(ТекстВопроса, Кнопки, , "ОчиститьИЗаписать"); - Если Ответ <> "ОчиститьИЗаписать" Тогда - Объект.ДополнительныеЗначенияСВесом = Истина; - Возврат; - КонецЕсли; - Попытка - ОчиститьВведенныеВесовыеКоэффициенты(); - Исключение - Объект.ДополнительныеЗначенияСВесом = Истина; - ВызватьИсключение; - КонецПопытки; + + ПоказатьВопрос( + Новый ОписаниеОповещения("ПослеПодтвержденияОчисткиВесовыхКоэффициентов", ЭтотОбъект), + ТекстВопроса, Кнопки, , "ОчиститьИЗаписать"); Иначе - Попытка - Успех = ЗаписатьОбъект("ИзменениеИспользованияВеса"); - Исключение - Объект.ДополнительныеЗначенияСВесом = Ложь; - ВызватьИсключение; - КонецПопытки; - Если Не Успех Тогда - Объект.ДополнительныеЗначенияСВесом = Ложь; - Возврат; - КонецЕсли; - КонецЕсли; - - Если ЗначениеЗаполнено(Объект.Ссылка) Тогда - Оповестить( - "Изменение_ЗначениеХарактеризуетсяВесовымКоэффициентом", - Объект.ДополнительныеЗначенияСВесом, - Объект.Ссылка); + ЗаписатьОбъект("ИзменениеИспользованияВеса", + "ДополнительныеЗначенияСВесомПриИзмененииЗавершение"); КонецЕсли; КонецПроцедуры @@ -309,10 +275,8 @@ СтандартнаяОбработка = Ложь; - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария( - Элемент.ТекстРедактирования, - Объект.Комментарий, - Модифицированность); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария( + Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); КонецПроцедуры @@ -343,37 +307,13 @@ Отказ = Истина; - Если НЕ ЗаписатьОбъект("ПереходКСпискуЗначений") Тогда - Возврат; - КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Копирование", Копирование); + ДополнительныеПараметры.Вставить("Родитель", Родитель); + ДополнительныеПараметры.Вставить("Группа", Группа); - Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда - ИмяТаблицыЗначений = "Справочник.ЗначенияСвойствОбъектов"; - Иначе - ИмяТаблицыЗначений = "Справочник.ЗначенияСвойствОбъектовИерархия"; - КонецЕсли; - - ЗначенияЗаполнения = Новый Структура; - ЗначенияЗаполнения.Вставить("Родитель", Родитель); - ЗначенияЗаполнения.Вставить("Владелец", Объект.Ссылка); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("СкрытьВладельца", Истина); - ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения); - - Если Группа Тогда - ПараметрыФормы.Вставить("ЭтоГруппа", Истина); - - ОткрытьФорму(ИмяТаблицыЗначений + ".ФормаГруппы", ПараметрыФормы, Элементы.Значения); - Иначе - ПараметрыФормы.Вставить("ПоказатьВес", Объект.ДополнительныеЗначенияСВесом); - - Если Копирование Тогда - ПараметрыФормы.Вставить("ЗначениеКопирования", Элементы.Значения.ТекущаяСтрока); - КонецЕсли; - - ОткрытьФорму(ИмяТаблицыЗначений + ".ФормаОбъекта", ПараметрыФормы, Элементы.Значения); - КонецЕсли; + ЗаписатьОбъект("ПереходКСпискуЗначений", + "ЗначенияПередНачаломДобавленияЗавершение", ДополнительныеПараметры); КонецПроцедуры @@ -386,7 +326,217 @@ Возврат; КонецЕсли; - Если НЕ ЗаписатьОбъект("ПереходКСпискуЗначений") Тогда + ЗаписатьОбъект("ПереходКСпискуЗначений", + "ЗначенияПередНачаломИзмененияЗавершение"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура РедактироватьФорматЗначения(Команда) + + Конструктор = Новый КонструкторФорматнойСтроки(Объект.ФорматСвойства); + + Конструктор.ДоступныеТипы = Объект.ТипЗначения; + + Конструктор.Показать( + Новый ОписаниеОповещения("РедактироватьФорматЗначенияЗавершение", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура УточнениеСпискаЗначенийИзменить(Команда) + + ЗаписатьОбъект("ИзменениеВидаРеквизита", + "УточнениеСпискаЗначенийИзменитьЗавершение"); + +КонецПроцедуры + +&НаКлиенте +Процедура УточнениеНаборовИзменить(Команда) + + ЗаписатьОбъект("ИзменениеВидаРеквизита", + "УточнениеНаборовИзменитьЗавершение"); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда) + + ЗаблокированныеРеквизиты = ЗапретРедактированияРеквизитовОбъектовКлиент.Реквизиты(ЭтотОбъект); + + Если ЗаблокированныеРеквизиты.Количество() > 0 Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Ссылка", Объект.Ссылка); + ПараметрыФормы.Вставить("ЭтоДополнительныйРеквизит", Объект.ЭтоДополнительноеСведение); + + ОткрытьФорму( + "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.РазблокированиеРеквизитов", + ПараметрыФормы, + ЭтотОбъект); + Иначе + ЗапретРедактированияРеквизитовОбъектовКлиент.ПоказатьПредупреждениеВсеВидимыеРеквизитыРазблокированы(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПослеОтветаНаВопросКогдаНаименованиеУжеИспользуется(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ <> "ПродолжитьЗапись" Тогда + ТекущийЭлемент = Элементы.Заголовок; + Если ПараметрыЗаписи.Свойство("ОбработкаПродолжения") Тогда + ВыполнитьОбработкуОповещения( + Новый ОписаниеОповещения(ПараметрыЗаписи.ОбработкаПродолжения.ИмяПроцедуры, + ЭтотОбъект, ПараметрыЗаписи.ОбработкаПродолжения.Параметры), + Истина); + КонецЕсли; + Иначе + ПараметрыЗаписи.Вставить("КогдаНаименованиеУжеИспользуется"); + Записать(ПараметрыЗаписи); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеПодтвержденияОчисткиВесовыхКоэффициентов(Ответ, Неопределен) Экспорт + + Если Ответ <> "ОчиститьИЗаписать" Тогда + Объект.ДополнительныеЗначенияСВесом = НЕ Объект.ДополнительныеЗначенияСВесом; + Возврат; + КонецЕсли; + + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("ОчиститьВведенныеВесовыеКоэффициенты"); + + ЗаписатьОбъект("ИзменениеИспользованияВеса", + "ДополнительныеЗначенияСВесомПриИзмененииЗавершение", + , + ПараметрыЗаписи); + +КонецПроцедуры + +&НаКлиенте +Процедура ДополнительныеЗначенияСВесомПриИзмененииЗавершение(Отказ, Неопределен) Экспорт + + Если Отказ Тогда + Объект.ДополнительныеЗначенияСВесом = НЕ Объект.ДополнительныеЗначенияСВесом; + Возврат; + КонецЕсли; + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + Оповестить( + "Изменение_ЗначениеХарактеризуетсяВесовымКоэффициентом", + Объект.ДополнительныеЗначенияСВесом, + Объект.Ссылка); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УточнениеСпискаЗначенийКомментарийНажатиеЗавершение(Отказ, Неопределен) Экспорт + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Закрыть(); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПоказатьУточнениеНабора", Истина); + ПараметрыФормы.Вставить("Ключ", Объект.ВладелецДополнительныхЗначений); + ПараметрыФормы.Вставить("ТекущийНаборСвойств", ТекущийНаборСвойств); + + ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.ФормаОбъекта", + ПараметрыФормы, ВладелецФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура УточнениеНаборовКомментарийНажатиеПродолжение(Отказ, Неопределен) Экспорт + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ВыбранныйНабор = Неопределено; + + Если СписокНаборов.Количество() > 1 Тогда + ПоказатьВыборИзСписка( + Новый ОписаниеОповещения("УточнениеНаборовКомментарийНажатиеЗавершение", ЭтотОбъект), + СписокНаборов, Элементы.УточнениеНаборовКомментарий); + Иначе + УточнениеНаборовКомментарийНажатиеЗавершение(, СписокНаборов[0].Значение); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УточнениеНаборовКомментарийНажатиеЗавершение(ВыбранныйЭлемент, ВыбранныйНабор) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + ВыбранныйНабор = ВыбранныйЭлемент.Значение; + КонецЕсли; + + Если ВыбранныйНабор <> Неопределено Тогда + Закрыть(); + + ЗначениеВыбора = Новый Структура; + ЗначениеВыбора.Вставить("Набор", ВыбранныйНабор); + ЗначениеВыбора.Вставить("Свойство", Объект.Ссылка); + ЗначениеВыбора.Вставить("ЭтоДополнительноеСведение", Объект.ЭтоДополнительноеСведение); + ОповеститьОВыборе(ЗначениеВыбора); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияПередНачаломДобавленияЗавершение(Отказ, ПараметрыОбработки) Экспорт + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Если Объект.ТипЗначения.СодержитТип(Тип("СправочникСсылка.ЗначенияСвойствОбъектов")) Тогда + ИмяТаблицыЗначений = "Справочник.ЗначенияСвойствОбъектов"; + Иначе + ИмяТаблицыЗначений = "Справочник.ЗначенияСвойствОбъектовИерархия"; + КонецЕсли; + + ЗначенияЗаполнения = Новый Структура; + ЗначенияЗаполнения.Вставить("Родитель", ПараметрыОбработки.Родитель); + ЗначенияЗаполнения.Вставить("Владелец", Объект.Ссылка); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СкрытьВладельца", Истина); + ПараметрыФормы.Вставить("ЗначенияЗаполнения", ЗначенияЗаполнения); + + Если ПараметрыОбработки.Группа Тогда + ПараметрыФормы.Вставить("ЭтоГруппа", Истина); + + ОткрытьФорму(ИмяТаблицыЗначений + ".ФормаГруппы", ПараметрыФормы, Элементы.Значения); + Иначе + ПараметрыФормы.Вставить("ПоказатьВес", Объект.ДополнительныеЗначенияСВесом); + + Если ПараметрыОбработки.Копирование Тогда + ПараметрыФормы.Вставить("ЗначениеКопирования", Элементы.Значения.ТекущаяСтрока); + КонецЕсли; + + ОткрытьФорму(ИмяТаблицыЗначений + ".ФормаОбъекта", ПараметрыФормы, Элементы.Значения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияПередНачаломИзмененияЗавершение(Отказ, Неопределен) Экспорт + + Если Отказ Тогда Возврат; КонецЕсли; @@ -408,27 +558,10 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - &НаКлиенте -Процедура РедактироватьФорматЗначения(Команда) +Процедура УточнениеСпискаЗначенийИзменитьЗавершение(Отказ, Неопределен) Экспорт - Конструктор = Новый КонструкторФорматнойСтроки(Объект.ФорматСвойства); - - Конструктор.ДоступныеТипы = Объект.ТипЗначения; - - Если Конструктор.ОткрытьМодально() Тогда - Объект.ФорматСвойства = Конструктор.Текст; - УстановитьЗаголовокКнопкиФормата(ЭтаФорма); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура УточнениеСпискаЗначенийИзменить(Команда) - - Если НЕ ЗаписатьОбъект("ИзменениеВидаРеквизита") Тогда + Если Отказ Тогда Возврат; КонецЕсли; @@ -440,14 +573,14 @@ ПараметрыФормы.Вставить("ЭтоДополнительноеСведение", Объект.ЭтоДополнительноеСведение); ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ИзменениеНастройкиСвойства", - ПараметрыФормы, ЭтаФорма); + ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте -Процедура УточнениеНаборовИзменить(Команда) +Процедура УточнениеНаборовИзменитьЗавершение(Отказ, Неопределен) Экспорт - Если НЕ ЗаписатьОбъект("ИзменениеВидаРеквизита") Тогда + Если Отказ Тогда Возврат; КонецЕсли; @@ -459,65 +592,134 @@ ПараметрыФормы.Вставить("ЭтоДополнительноеСведение", Объект.ЭтоДополнительноеСведение); ОткрытьФорму("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.ИзменениеНастройкиСвойства", - ПараметрыФормы, ЭтаФорма); + ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте -Процедура Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта(Команда) +Процедура ЗаписатьОбъект(ВариантТекстаВопроса, ИмяПроцедурыПродолжения, ДополнительныеПараметры = Неопределено, ПараметрыЗаписи = Неопределено) - ЗаблокированныеРеквизиты = ЗапретРедактированияРеквизитовОбъектовКлиент.РеквизитыКромеНевидимых(ЭтаФорма); + Если НЕ Модифицированность Тогда + ВыполнитьОбработкуОповещения(Новый ОписаниеОповещения( + ИмяПроцедурыПродолжения, ЭтотОбъект, ДополнительныеПараметры), Ложь); + Возврат; + КонецЕсли; - Если ЗаблокированныеРеквизиты.Количество() > 0 Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Ссылка", Объект.Ссылка); - ПараметрыФормы.Вставить("ЭтоДополнительныйРеквизит", Объект.ЭтоДополнительноеСведение); - - ОткрытьФорму( - "ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Форма.РазблокированиеРеквизитов", - ПараметрыФормы, - ЭтаФорма); + Если ПараметрыЗаписи = Неопределено Тогда + ПараметрыЗаписи = Новый Структура; + КонецЕсли; + + ОбработкаПродолжения = Новый Структура; + ОбработкаПродолжения.Вставить("ИмяПроцедуры", ИмяПроцедурыПродолжения); + ОбработкаПродолжения.Вставить("Параметры", ДополнительныеПараметры); + + ПараметрыЗаписи.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); + + Если ЗначениеЗаполнено(Объект.Ссылка) Тогда + ЗаписатьОбъектПродолжение("Записать", ПараметрыЗаписи); + Возврат; + КонецЕсли; + + Если ВариантТекстаВопроса = "ПереходКСпискуЗначений" Тогда + ТекстВопроса = + НСтр("ru = 'Переход к работе со списком значений + |возможен только после записи данных. + | + |Данные будут записаны.'"); Иначе - ЗапретРедактированияРеквизитовОбъектовКлиент.ПредупреждениеВсеВидимыеРеквизитыРазблокированы(); + ТекстВопроса = + НСтр("ru = 'Данные будут записаны.'") + КонецЕсли; + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Записать", НСтр("ru = 'Записать'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + + ПоказатьВопрос( + Новый ОписаниеОповещения( + "ЗаписатьОбъектПродолжение", ЭтотОбъект, ПараметрыЗаписи), + ТекстВопроса, Кнопки, , "Записать"); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьОбъектПродолжение(Ответ, ПараметрыЗаписи) Экспорт + + Если Ответ <> "Записать" Тогда + Возврат; + КонецЕсли; + + Записать(ПараметрыЗаписи); + +КонецПроцедуры + +&НаКлиенте +Процедура ПослеОшибкиЗаписи() + + Если ОбработкаПродолженияПриОшибкеЗаписи <> Неопределено Тогда + ВыполнитьОбработкуОповещения( + Новый ОписаниеОповещения(ОбработкаПродолженияПриОшибкеЗаписи.ИмяПроцедуры, + ЭтотОбъект, ОбработкаПродолженияПриОшибкеЗаписи.Параметры), + Истина); КонецЕсли; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаКлиенте -Функция ЗаписатьОбъект(ВариантТекстаВопроса) +Процедура РедактироватьФорматЗначенияЗавершение(Текст, Неопределен) Экспорт - Если ЗначениеЗаполнено(Объект.Ссылка) И НЕ Модифицированность Тогда - Возврат Истина; - КонецЕсли; - - Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда - Если ВариантТекстаВопроса = "ПереходКСпискуЗначений" Тогда - ТекстВопроса = - НСтр("ru = 'Переход к работе со списком значений - |возможен только после записи данных. - | - |Данные будут записаны.'"); - Иначе - ТекстВопроса = - НСтр("ru = 'Данные будут записаны.'") - КонецЕсли; + Если Текст <> Неопределено Тогда + Объект.ФорматСвойства = Текст; + УстановитьЗаголовокКнопкиФормата(ЭтотОбъект); - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("Записать", НСтр("ru = 'Записать'")); - Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); - Ответ = Вопрос(ТекстВопроса, Кнопки, , "Записать"); - Если Ответ <> "Записать" Тогда - Возврат Ложь; + ТекстПредупреждения = ""; + Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Текст, ";"); + + Для каждого Подстрока Из Массив Цикл + Если Найти(Подстрока, "ДП=") > 0 ИЛИ Найти(Подстрока, "DE=") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Представление пустой даты не поддерживается в полях ввода.'"); + Продолжить; + КонецЕсли; + Если Найти(Подстрока, "ЧН=") > 0 ИЛИ Найти(Подстрока, "NZ=") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Представление пустого числа не поддерживается в полях ввода.'"); + Продолжить; + КонецЕсли; + Если Найти(Подстрока, "ДФ=") > 0 ИЛИ Найти(Подстрока, "DF=") > 0 Тогда + Если Найти(Подстрока, "ддд") > 0 ИЛИ Найти(Подстрока, "ddd") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Кратное название дня недели не поддерживается в полях ввода.'"); + КонецЕсли; + Если Найти(Подстрока, "дддд") > 0 ИЛИ Найти(Подстрока, "dddd") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Полное название дня недели не поддерживается в полях ввода.'"); + КонецЕсли; + Если Найти(Подстрока, "МММ") > 0 ИЛИ Найти(Подстрока, "MMM") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Кратное название месяца не поддерживается в полях ввода.'"); + КонецЕсли; + Если Найти(Подстрока, "ММММ") > 0 ИЛИ Найти(Подстрока, "MMMM") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Полное название месяца не поддерживается в полях ввода.'"); + КонецЕсли; + КонецЕсли; + Если Найти(Подстрока, "ДЛФ=") > 0 ИЛИ Найти(Подстрока, "DLF=") > 0 Тогда + Если Найти(Подстрока, "ДД") > 0 ИЛИ Найти(Подстрока, "DD") > 0 Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'Длинная дата (месяц прописью) не поддерживается в полях ввода.'"); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ЗначениеЗаполнено(ТекстПредупреждения) Тогда + ТекстПредупреждения = ТекстПредупреждения + Символы.ПС + + НСтр("ru = 'В местах использования полей надписей ограничений нет.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); КонецЕсли; КонецЕсли; - Возврат Записать(); - -КонецФункции +КонецПроцедуры &НаСервере Процедура ОбновитьСоставЭлементовФормы(ТекстПредупреждения = "") @@ -531,7 +733,7 @@ Объект.ФорматСвойства = ""; КонецЕсли; - УстановитьЗаголовокКнопкиФормата(ЭтаФорма); + УстановитьЗаголовокКнопкиФормата(ЭтотОбъект); Если Объект.ЭтоДополнительноеСведение ИЛИ НЕ ( Объект.ТипЗначения.СодержитТип(Тип("Число" )) @@ -873,7 +1075,6 @@ ЗначениеОбъект.Записать(); КонецЦикла; - Записать(); ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); @@ -882,6 +1083,7 @@ КонецПроцедуры +&НаСервере Процедура ОбновитьСписокНаборов() СписокНаборов.Очистить(); diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html index e24d6c088..d6af27ee7 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

          • Дополнительные реквизиты являются неотъемлемой частью «объекта со свойствами». Они хранятся в табличной части объекта и доступны тем же пользователям, которым доступен и сам «объект со свойствами». Дополнительные реквизиты редактируются в форме объекта наряду с его остальными реквизитами. diff --git a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl index b15c27cf1..dbd247a61 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl +++ b/SSL/src/ChartsOfCharacteristicTypes/ДополнительныеРеквизитыИСведения/ManagerModule.bsl @@ -19,6 +19,24 @@ КонецФункции +// Возвращает список реквизитов, которые разрешается редактировать +// с помощью обработки группового изменения объектов. +// +Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт + + РедактируемыеРеквизиты = Новый Массив; + + РедактируемыеРеквизиты.Добавить("МногострочноеПолеВвода"); + РедактируемыеРеквизиты.Добавить("ЗаголовокФормыЗначения"); + РедактируемыеРеквизиты.Добавить("ЗаголовокФормыВыбораЗначения"); + РедактируемыеРеквизиты.Добавить("ФорматСвойства"); + РедактируемыеРеквизиты.Добавить("Комментарий"); + РедактируемыеРеквизиты.Добавить("Подсказка"); + + Возврат РедактируемыеРеквизиты; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form index 29e282102..32ba7c61f 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаСписка/Form.form @@ -30,8 +30,8 @@ Список.Description - НаименованиеРасширеннаяПодсказка - 20 + НаименованиеExtendedTooltip + 11 Label true true @@ -76,8 +76,8 @@ true - ТипЗначенияРасширеннаяПодсказка - 22 + ТипЗначенияExtendedTooltip + 12 Label true true @@ -113,10 +113,10 @@ СписокСтрокаПоиска - 11 + 13 СписокСтрокаПоискаРасширеннаяПодсказка - 13 + 15 Label true true @@ -126,7 +126,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 12 + 14 true Список @@ -136,10 +136,10 @@ СписокСостояниеПросмотра - 14 + 16 СписокСостояниеПросмотраРасширеннаяПодсказка - 16 + 18 Label true true @@ -149,7 +149,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 15 + 17 true ViewStatusAddition @@ -160,10 +160,10 @@ СписокУправлениеПоиском - 17 + 19 СписокУправлениеПоискомРасширеннаяПодсказка - 19 + 21 Label true true @@ -173,7 +173,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 18 + 20 true SearchControlAddition @@ -183,7 +183,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 10 Label true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form index 225bf1022..0a5478780 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Forms/ФормаЭлемента/Form.form @@ -12,7 +12,7 @@ Объект.Description - НаименованиеРасширеннаяПодсказка + НаименованиеExtendedTooltip 7 Label true @@ -52,8 +52,8 @@ Объект.ValueType - ТипЗначенияРасширеннаяПодсказка - 9 + ТипЗначенияExtendedTooltip + 8 Label true true diff --git a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html index 770d3b66a..cd72584ed 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html +++ b/SSL/src/ChartsOfCharacteristicTypes/ОбъектыАдресацииЗадач/Help/ru.html @@ -1,3 +1,3 @@ - +

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

            Предопределенный элемент "Все объекты адресации" обозначает все доступные объекты адресации информационной системы.

            \ No newline at end of file diff --git a/SSL/src/Constants/КаталогВременныхФайловДляWindows/ValueManagerModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/ManagerModule.bsl similarity index 100% rename from SSL/src/Constants/КаталогВременныхФайловДляWindows/ValueManagerModule.bsl rename to SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/ManagerModule.bsl diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl b/SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/ObjectModule.bsl similarity index 100% rename from SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ObjectModule.bsl rename to SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/ObjectModule.bsl diff --git a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo b/SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/УдалитьВидыДоступа.mdo similarity index 65% rename from SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo rename to SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/УдалитьВидыДоступа.mdo index 267320db0..c9133cc46 100644 --- a/SSL/src/ChartsOfCharacteristicTypes/ВидыДоступа/ВидыДоступа.mdo +++ b/SSL/src/ChartsOfCharacteristicTypes/УдалитьВидыДоступа/УдалитьВидыДоступа.mdo @@ -8,13 +8,13 @@ - ВидыДоступа + УдалитьВидыДоступа ru - Виды доступа + (не используется) Виды доступа true - ChartOfCharacteristicTypes.ВидыДоступа.StandardAttribute.Description + ChartOfCharacteristicTypes.УдалитьВидыДоступа.StandardAttribute.Description DontUse Use @@ -101,7 +101,7 @@ Use ru - Вид доступа + (Не используется) Вид доступа CatalogRef.ФизическиеЛица @@ -127,6 +127,36 @@ CatalogRef.ГруппыВнешнихПользователей + + ГруппыНоменклатуры + Группы номенклатуры + + CatalogRef.ФизическиеЛица + CatalogRef.ПапкиФайлов + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + CatalogRef.Пользователи + CatalogRef.Организации + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + + + ГруппыПартнеров + Группы партнеров + + CatalogRef.ФизическиеЛица + CatalogRef.ПапкиФайлов + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + CatalogRef.Пользователи + CatalogRef.Организации + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + ДополнительныеСведения Дополнительные сведения @@ -134,6 +164,21 @@ ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + МестаХранения + Места хранения + + CatalogRef.ФизическиеЛица + CatalogRef.ПапкиФайлов + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + CatalogRef.Пользователи + CatalogRef.Организации + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + Организации Организации @@ -184,37 +229,29 @@ CatalogRef.УчетныеЗаписиЭлектроннойПочты + + ФизическиеЛица + Физические лица + + CatalogRef.ФизическиеЛица + + + + ХозяйственныеОперации + Хозяйственные операции + + CatalogRef.ФизическиеЛица + CatalogRef.ПапкиФайлов + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + CatalogRef.Пользователи + CatalogRef.Организации + CatalogRef.УчетныеЗаписиЭлектроннойПочты + + InDialog BothWays - ChartOfCharacteristicTypes.ВидыДоступа.Form.ФормаЭлемента - ChartOfCharacteristicTypes.ВидыДоступа.Form.ФормаСписка - ChartOfCharacteristicTypes.ВидыДоступа.Form.ФормаВыбора - - ФормаСписка - - ru - Форма списка - - PersonalComputer - MobileDevice - - - ФормаЭлемента - - ru - Форма элемента - - PersonalComputer - MobileDevice - - - ФормаВыбора - - ru - Форма выбора - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo index 806dba97e..e21f960c3 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхВспомогательныеДанные/ОбластьДанныхВспомогательныеДанные.mdo @@ -56,6 +56,10 @@ Catalog.ОчередьЗаданий DontUse + + DocumentJournal.Взаимодействия + DontUse + ScheduledJob.ЭкспортОценкиПроизводительности DontUse @@ -120,10 +124,6 @@ InformationRegister.БлокировкиСеансовОбластейДанных Use - - DocumentJournal.Взаимодействия - DontUse - DontUse IndependentlyAndSimultaneously SessionParameter.ОбластьДанныхЗначение diff --git a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo index d9f9b4f49..50957908c 100644 --- a/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo +++ b/SSL/src/CommonAttributes/ОбластьДанныхОсновныеДанные/ОбластьДанныхОсновныеДанные.mdo @@ -149,7 +149,7 @@ DontUse - Constant.ОбщийКаталогВременныхФайлов + Constant.КаталогОбменаФайламиВМоделиСервиса DontUse @@ -253,7 +253,7 @@ DontUse - Constant.ОбщийКаталогВременныхФайловLinux + Constant.КаталогОбменаФайламиВМоделиСервисаLinux DontUse @@ -296,6 +296,10 @@ ScheduledJob.ОбновлениеАгрегатов DontUse + + DocumentJournal.Взаимодействия + DontUse + Constant.МаксимальноеКоличествоИсполняющихФоновыхЗаданий DontUse @@ -320,10 +324,6 @@ Constant.ПрефиксОбластиДанных DontUse - - InformationRegister.НеразделенныеПользователи - DontUse - Constant.МинимальныйИнтервалРегламентныхЗаданийДополнительныхОтчетовИОбработокВМоделиСервиса DontUse @@ -353,7 +353,7 @@ DontUse - Constant.КаталогВременныхФайловДляWindows + Constant.КаталогСообщенийОбменаДаннымиДляWindows DontUse @@ -364,12 +364,16 @@ Constant.НеИспользоватьРазделениеПоОбластямДанных DontUse + + ScheduledJob.УдалениеПомеченных + DontUse + ScheduledJob.ПересчетТекущихЗначенийОтносительныхДатЗапретаИзменения DontUse - Constant.КаталогВременныхФайловДляLinux + Constant.КаталогСообщенийОбменаДаннымиДляLinux DontUse @@ -509,7 +513,7 @@ DontUse - ChartOfCharacteristicTypes.ВидыДоступа + ChartOfCharacteristicTypes.УдалитьВидыДоступа DontUse @@ -608,10 +612,6 @@ InformationRegister.БлокировкиСеансовОбластейДанных DontUse - - DocumentJournal.Взаимодействия - DontUse - SessionParameter.ОбластьДанныхЗначение SessionParameter.ОбластьДанныхИспользование Constant.ИспользоватьРазделениеПоОбластямДанных diff --git a/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/CommandModule.bsl b/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/CommandModule.bsl deleted file mode 100644 index a324e38f2..000000000 --- a/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/CommandModule.bsl +++ /dev/null @@ -1,10 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ОткрытьФормуМодально("ОбщаяФорма.ВыгрузкаДанных", , ПараметрыВыполненияКоманды.Источник); - -КонецПроцедуры diff --git a/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/ВыгрузитьДанныеВЛокальнуюВерсию.mdo b/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/ВыгрузитьДанныеВЛокальнуюВерсию.mdo deleted file mode 100644 index 9d934dc60..000000000 --- a/SSL/src/CommonCommands/ВыгрузитьДанныеВЛокальнуюВерсию/ВыгрузитьДанныеВЛокальнуюВерсию.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ВыгрузитьДанныеВЛокальнуюВерсию - - ru - Выгрузить данные в локальную версию - - ActionsPanelTools - Auto - diff --git a/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/CommandModule.bsl b/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/CommandModule.bsl deleted file mode 100644 index 58330884f..000000000 --- a/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/CommandModule.bsl +++ /dev/null @@ -1,11 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ОткрытьФормуМодально("ОбщаяФорма.ВыгрузкаДанных", , ПараметрыВыполненияКоманды.Источник); - -КонецПроцедуры - diff --git a/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/ВыгрузитьДанныеДляПереходаВСервис.mdo b/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/ВыгрузитьДанныеДляПереходаВСервис.mdo deleted file mode 100644 index 559c6090d..000000000 --- a/SSL/src/CommonCommands/ВыгрузитьДанныеДляПереходаВСервис/ВыгрузитьДанныеДляПереходаВСервис.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ВыгрузитьДанныеДляПереходаВСервис - - ru - Выгрузить данные для перехода в сервис - - ActionsPanelTools - Auto - diff --git a/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/CommandModule.bsl deleted file mode 100644 index 16646cc5e..000000000 --- a/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/CommandModule.bsl +++ /dev/null @@ -1,11 +0,0 @@ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( - ПараметрКоманды, - ПараметрыВыполненияКоманды, - ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(), - "НастройкаИАдминистрирование"); - -КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/ДополнительныеОбработкиАдминистрирование.mdo b/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/ДополнительныеОбработкиАдминистрирование.mdo deleted file mode 100644 index 86581b35b..000000000 --- a/SSL/src/CommonCommands/ДополнительныеОбработкиАдминистрирование/ДополнительныеОбработкиАдминистрирование.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ДополнительныеОбработкиАдминистрирование - - ru - Дополнительные обработки - - ActionsPanelTools - Auto - diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/CommandModule.bsl deleted file mode 100644 index e26ae58c1..000000000 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/CommandModule.bsl +++ /dev/null @@ -1,11 +0,0 @@ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок( - ПараметрКоманды, - ПараметрыВыполненияКоманды, - ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет(), - "НастройкаИАдминистрирование"); - -КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/ДополнительныеОтчетыАдминистрирование.mdo b/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/ДополнительныеОтчетыАдминистрирование.mdo deleted file mode 100644 index f404161ef..000000000 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыАдминистрирование/ДополнительныеОтчетыАдминистрирование.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ДополнительныеОтчетыАдминистрирование - - ru - Дополнительные отчеты - - ActionsPanelReports - Auto - diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl b/SSL/src/CommonCommands/ДополнительныеПечатныеФормыОбъекта/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/CommandModule.bsl rename to SSL/src/CommonCommands/ДополнительныеПечатныеФормыОбъекта/CommandModule.bsl diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo b/SSL/src/CommonCommands/ДополнительныеПечатныеФормыОбъекта/ДополнительныеПечатныеФормыОбъекта.mdo similarity index 85% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo rename to SSL/src/CommonCommands/ДополнительныеПечатныеФормыОбъекта/ДополнительныеПечатныеФормыОбъекта.mdo index 690da1c3a..3f3faff58 100644 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиПечатныеФормы/ДополнительныеОтчетыИОбработкиПечатныеФормы.mdo +++ b/SSL/src/CommonCommands/ДополнительныеПечатныеФормыОбъекта/ДополнительныеПечатныеФормыОбъекта.mdo @@ -1,6 +1,6 @@ - ДополнительныеОтчетыИОбработкиПечатныеФормы + ДополнительныеПечатныеФормыОбъекта ru Дополнительные печатные формы... diff --git a/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/CommandModule.bsl b/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/CommandModule.bsl deleted file mode 100644 index 84d487909..000000000 --- a/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/CommandModule.bsl +++ /dev/null @@ -1,12 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - - ОткрытьФорму("ОбщаяФорма.ЗагрузкаДанныхВОбласть", , ПараметрыВыполненияКоманды.Источник, - ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно); - -КонецПроцедуры - diff --git a/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/ЗагрузитьДанныеВОбласть.mdo b/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/ЗагрузитьДанныеВОбласть.mdo deleted file mode 100644 index 781291742..000000000 --- a/SSL/src/CommonCommands/ЗагрузитьДанныеВОбласть/ЗагрузитьДанныеВОбласть.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ЗагрузитьДанныеВОбласть - - ru - Загрузить данные в область - - ActionsPanelTools - Auto - diff --git a/SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/ЗагрузитьДанныеИзСервиса.mdo b/SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/ЗагрузитьДанныеИзСервиса.mdo deleted file mode 100644 index 9d9e726aa..000000000 --- a/SSL/src/CommonCommands/ЗагрузитьДанныеИзСервиса/ЗагрузитьДанныеИзСервиса.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ЗагрузитьДанныеИзСервиса - - ru - Загрузить данные из сервиса - - ActionsPanelTools - Auto - diff --git a/SSL/src/CommonCommands/ЗагрузитьКурсыВалют/CommandModule.bsl b/SSL/src/CommonCommands/ЗагрузитьКурсыВалют/CommandModule.bsl index 1ddcea123..dcb36e83c 100644 --- a/SSL/src/CommonCommands/ЗагрузитьКурсыВалют/CommandModule.bsl +++ b/SSL/src/CommonCommands/ЗагрузитьКурсыВалют/CommandModule.bsl @@ -1,9 +1,19 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - Если Вопрос("Будет произведена загрузка файла с полной информацией по курсами всех валют за все время из менеджера сервиса. - |Курсы валют, помеченных в областях данных для загрузки из сети Интернет, будут заменены в фоновом задании. Продолжить?", - РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Нет Тогда + + ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьКурсыКлиент", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, + НСтр("ru = 'Будет произведена загрузка файла с полной информацией по курсами всех валют за все время из менеджера сервиса. + |Курсы валют, помеченных в областях данных для загрузки из сети Интернет, будут заменены в фоновом задании. Продолжить?'"), + РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьКурсыКлиент(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl b/SSL/src/CommonCommands/ЗаполнениеОбъекта/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/CommandModule.bsl rename to SSL/src/CommonCommands/ЗаполнениеОбъекта/CommandModule.bsl diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo b/SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo similarity index 84% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo rename to SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo index 01ef1c598..54ad56606 100644 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта/ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.mdo +++ b/SSL/src/CommonCommands/ЗаполнениеОбъекта/ЗаполнениеОбъекта.mdo @@ -1,6 +1,6 @@ - ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта + ЗаполнениеОбъекта ru Заполнение... diff --git a/SSL/src/CommonCommands/ЗаметкиПоПредмету/CommandModule.bsl b/SSL/src/CommonCommands/МоиЗаметкиПоПредмету/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/ЗаметкиПоПредмету/CommandModule.bsl rename to SSL/src/CommonCommands/МоиЗаметкиПоПредмету/CommandModule.bsl diff --git a/SSL/src/CommonCommands/ЗаметкиПоПредмету/ЗаметкиПоПредмету.mdo b/SSL/src/CommonCommands/МоиЗаметкиПоПредмету/МоиЗаметкиПоПредмету.mdo similarity index 86% rename from SSL/src/CommonCommands/ЗаметкиПоПредмету/ЗаметкиПоПредмету.mdo rename to SSL/src/CommonCommands/МоиЗаметкиПоПредмету/МоиЗаметкиПоПредмету.mdo index f5989cab5..e680dacc3 100644 --- a/SSL/src/CommonCommands/ЗаметкиПоПредмету/ЗаметкиПоПредмету.mdo +++ b/SSL/src/CommonCommands/МоиЗаметкиПоПредмету/МоиЗаметкиПоПредмету.mdo @@ -1,6 +1,6 @@ - ЗаметкиПоПредмету + МоиЗаметкиПоПредмету ru Мои заметки diff --git a/SSL/src/CommonCommands/УстановитьНапоминаниеПоПредмету/CommandModule.bsl b/SSL/src/CommonCommands/Напомнить/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/УстановитьНапоминаниеПоПредмету/CommandModule.bsl rename to SSL/src/CommonCommands/Напомнить/CommandModule.bsl diff --git a/SSL/src/CommonCommands/УстановитьНапоминаниеПоПредмету/УстановитьНапоминаниеПоПредмету.mdo b/SSL/src/CommonCommands/Напомнить/Напомнить.mdo similarity index 92% rename from SSL/src/CommonCommands/УстановитьНапоминаниеПоПредмету/УстановитьНапоминаниеПоПредмету.mdo rename to SSL/src/CommonCommands/Напомнить/Напомнить.mdo index 4c100e9e5..f12bc44a7 100644 --- a/SSL/src/CommonCommands/УстановитьНапоминаниеПоПредмету/УстановитьНапоминаниеПоПредмету.mdo +++ b/SSL/src/CommonCommands/Напомнить/Напомнить.mdo @@ -1,6 +1,6 @@ - УстановитьНапоминаниеПоПредмету + Напомнить ru Напомнить... diff --git a/SSL/src/CommonCommands/ПраваПоЗначениямДоступа/CommandModule.bsl b/SSL/src/CommonCommands/НастроитьПрава/CommandModule.bsl similarity index 68% rename from SSL/src/CommonCommands/ПраваПоЗначениямДоступа/CommandModule.bsl rename to SSL/src/CommonCommands/НастроитьПрава/CommandModule.bsl index a13413b8f..be7ce2785 100644 --- a/SSL/src/CommonCommands/ПраваПоЗначениямДоступа/CommandModule.bsl +++ b/SSL/src/CommonCommands/НастроитьПрава/CommandModule.bsl @@ -7,7 +7,7 @@ КонецЕсли; ПараметрыФормы = Новый Структура("СсылкаНаОбъект", СсылкаНаОбъект); - ОткрытьФорму("ОбщаяФорма.ПраваПоЗначениямДоступа", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник); + ОткрытьФорму("ОбщаяФорма.НастройкиПравОбъектов", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник); КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo b/SSL/src/CommonCommands/НастроитьПрава/НастроитьПрава.mdo similarity index 70% rename from SSL/src/CommonCommands/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo rename to SSL/src/CommonCommands/НастроитьПрава/НастроитьПрава.mdo index 42db4456c..1878e567b 100644 --- a/SSL/src/CommonCommands/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo +++ b/SSL/src/CommonCommands/НастроитьПрава/НастроитьПрава.mdo @@ -1,9 +1,9 @@ - ПраваПоЗначениямДоступа + НастроитьПрава ru - Права доступа + Настроить права FormCommandBarImportant @@ -12,6 +12,6 @@ Auto ru - Установить права доступа к объекту + Настроить права доступа к объекту diff --git a/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo index 53b4f9bcb..9a887f0a3 100644 --- a/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo +++ b/SSL/src/CommonCommands/ОткрытьСценарииОбменовДанными/ОткрытьСценарииОбменовДанными.mdo @@ -3,7 +3,7 @@ ОткрытьСценарииОбменовДанными ru - Сценарии + Сценарии синхронизации данных FormNavigationPanelImportant Auto diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl b/SSL/src/CommonCommands/ОтчетыОбъекта/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/CommandModule.bsl rename to SSL/src/CommonCommands/ОтчетыОбъекта/CommandModule.bsl diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo b/SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo similarity index 85% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo rename to SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo index 19f0b6269..110eea359 100644 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиОтчеты/ДополнительныеОтчетыИОбработкиОтчеты.mdo +++ b/SSL/src/CommonCommands/ОтчетыОбъекта/ОтчетыОбъекта.mdo @@ -1,6 +1,6 @@ - ДополнительныеОтчетыИОбработкиОтчеты + ОтчетыОбъекта ru Отчеты... diff --git a/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/CommandModule.bsl b/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/CommandModule.bsl deleted file mode 100644 index 947658660..000000000 --- a/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/CommandModule.bsl +++ /dev/null @@ -1,7 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ - -&НаКлиенте -Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполнения) - ВариантыОтчетовКлиент.ПоказатьПанельОтчетов("НастройкаИАдминистрирование", ПараметрыВыполнения); -КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/ПанельОтчетовНастройкаИАдминистрирование.mdo b/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/ПанельОтчетовНастройкаИАдминистрирование.mdo deleted file mode 100644 index 423dbaabf..000000000 --- a/SSL/src/CommonCommands/ПанельОтчетовНастройкаИАдминистрирование/ПанельОтчетовНастройкаИАдминистрирование.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ПанельОтчетовНастройкаИАдминистрирование - - ru - Отчеты для администратора - - NavigationPanelSeeAlso - Auto - diff --git a/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl index 2a7f78a19..8ecf83ecc 100644 --- a/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПерсональнаяНастройкаПроксиСервера/CommandModule.bsl @@ -5,10 +5,10 @@ Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) #Если ВебКлиент Тогда - Предупреждение(НСтр("ru = 'В веб-клиенте параметры прокси-сервера необходимо задавать в настройках браузера.'")); + ПоказатьПредупреждение(, НСтр("ru = 'В веб-клиенте параметры прокси-сервера необходимо задавать в настройках браузера.'")); Возврат; -#КонецЕсли - +#КонецЕсли + ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", Новый Структура("НастройкаПроксиНаКлиенте", Истина)); КонецПроцедуры diff --git a/SSL/src/CommonCommands/ПолучитьНастройкиОбменаДаннымиДляВторойИнформационнойБазы/CommandModule.bsl b/SSL/src/CommonCommands/ПолучитьНастройкиОбменаДаннымиДляВторойИнформационнойБазы/CommandModule.bsl index 7c4783bf2..0f263de5b 100644 --- a/SSL/src/CommonCommands/ПолучитьНастройкиОбменаДаннымиДляВторойИнформационнойБазы/CommandModule.bsl +++ b/SSL/src/CommonCommands/ПолучитьНастройкиОбменаДаннымиДляВторойИнформационнойБазы/CommandModule.bsl @@ -12,7 +12,7 @@ Если Отказ Тогда - Предупреждение(НСтр("ru = 'Возникли ошибки при получении настроек обмена данными.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Возникли ошибки при получении настроек обмена данными.'")); Иначе diff --git a/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl b/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl index 460270ef3..1aecfbccb 100644 --- a/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl +++ b/SSL/src/CommonCommands/РазместитьФайлыНачальногоОбраза/CommandModule.bsl @@ -2,7 +2,7 @@ Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) Если НЕ ЕстьФайлыВТомах() Тогда - Предупреждение(НСтр("ru = 'Файлы в томах отсутствуют.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Файлы в томах отсутствуют.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonCommands/СведенияОПользователе/CommandModule.bsl b/SSL/src/CommonCommands/СведенияОПользователе/CommandModule.bsl index 06b25e0e4..cae5aa340 100644 --- a/SSL/src/CommonCommands/СведенияОПользователе/CommandModule.bsl +++ b/SSL/src/CommonCommands/СведенияОПользователе/CommandModule.bsl @@ -1,4 +1,6 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - ОткрытьЗначение(ПользователиКлиентСервер.АвторизованныйПользователь()); + + ПоказатьЗначение(, ПользователиКлиентСервер.АвторизованныйПользователь()); + КонецПроцедуры diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl b/SSL/src/CommonCommands/СозданиеСвязанныхОбъектов/CommandModule.bsl similarity index 100% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/CommandModule.bsl rename to SSL/src/CommonCommands/СозданиеСвязанныхОбъектов/CommandModule.bsl diff --git a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo b/SSL/src/CommonCommands/СозданиеСвязанныхОбъектов/СозданиеСвязанныхОбъектов.mdo similarity index 84% rename from SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo rename to SSL/src/CommonCommands/СозданиеСвязанныхОбъектов/СозданиеСвязанныхОбъектов.mdo index c7ae3a535..7d44720a8 100644 --- a/SSL/src/CommonCommands/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов/ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.mdo +++ b/SSL/src/CommonCommands/СозданиеСвязанныхОбъектов/СозданиеСвязанныхОбъектов.mdo @@ -1,6 +1,6 @@ - ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов + СозданиеСвязанныхОбъектов ru Создание связанных объектов... diff --git a/SSL/src/CommonCommands/СоставОтправляемыхДанных/СоставОтправляемыхДанных.mdo b/SSL/src/CommonCommands/СоставОтправляемыхДанных/СоставОтправляемыхДанных.mdo index a11f50bb6..594a88364 100644 --- a/SSL/src/CommonCommands/СоставОтправляемыхДанных/СоставОтправляемыхДанных.mdo +++ b/SSL/src/CommonCommands/СоставОтправляемыхДанных/СоставОтправляемыхДанных.mdo @@ -1,5 +1,5 @@ - + СоставОтправляемыхДанных ru @@ -7,4 +7,7 @@ CommandGroup.ПараметрыОбменаДанными Auto + + StdPicture.InputFieldOpen + diff --git a/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl index bb295bfd5..224e9b4cd 100644 --- a/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl +++ b/SSL/src/CommonCommands/УстановитьРасширениеРаботыСФайлами/CommandModule.bsl @@ -2,6 +2,6 @@ &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) - УстановитьРасширениеРаботыСФайлами(); + НачатьУстановкуРасширенияРаботыСФайлами(); КонецПроцедуры diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Form.form b/SSL/src/CommonForms/АвтономнаяРабота/Form.form index 022a6dc4c..343ac31c4 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРабота/Form.form @@ -18,7 +18,7 @@ true - Декорация5РасширеннаяПодсказка + Декорация5ExtendedTooltip 71 Label true @@ -55,7 +55,7 @@ true - Декорация4РасширеннаяПодсказка + Декорация4ExtendedTooltip 72 Label true @@ -82,7 +82,7 @@ true - Группа3РасширеннаяПодсказка + Группа3ExtendedTooltip 70 Label true @@ -116,7 +116,7 @@ true - ВыполнитьСинхронизациюДанныхРасширеннаяПодсказка + ВыполнитьСинхронизациюДанныхExtendedTooltip 75 Label true @@ -147,7 +147,7 @@ true - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 76 Label true @@ -174,7 +174,7 @@ true - Группа7РасширеннаяПодсказка + Группа7ExtendedTooltip 74 Label true @@ -208,7 +208,7 @@ true - ИнформацияОПоследнейСинхронизацииРасширеннаяПодсказка + ИнформацияОПоследнейСинхронизацииExtendedTooltip 78 Label true @@ -241,7 +241,7 @@ true - ПерейтиККонфликтамРасширеннаяПодсказка + ПерейтиККонфликтамExtendedTooltip 79 Label true @@ -265,7 +265,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 77 Label true @@ -289,7 +289,7 @@ true - Группа2РасширеннаяПодсказка + Группа2ExtendedTooltip 73 Label true @@ -332,7 +332,7 @@ СинхронизироватьДанныеПриНачалеРаботыПрограммыПриИзменении - СинхронизироватьДанныеПриНачалеРаботыПрограммыРасширеннаяПодсказка + СинхронизироватьДанныеПриНачалеРаботыПрограммыExtendedTooltip 82 Label true @@ -370,8 +370,8 @@ СинхронизироватьДанныеПриЗавершенииРаботыПрограммыПриИзменении - СинхронизироватьДанныеПриЗавершенииРаботыПрограммыРасширеннаяПодсказка - 84 + СинхронизироватьДанныеПриЗавершенииРаботыПрограммыExtendedTooltip + 83 Label true true @@ -406,8 +406,8 @@ true - Декорация9РасширеннаяПодсказка - 86 + Декорация9ExtendedTooltip + 84 Label true true @@ -436,7 +436,7 @@ true - Группа10РасширеннаяПодсказка + Группа10ExtendedTooltip 81 Label true @@ -482,8 +482,8 @@ СинхронизироватьДанныеПоРасписаниюПриИзменении - СинхронизироватьДанныеПоРасписаниюРасширеннаяПодсказка - 90 + СинхронизироватьДанныеПоРасписаниюExtendedTooltip + 88 Label true true @@ -520,8 +520,8 @@ ВариантРасписанияСинхронизацииДанныхПриИзменении - ВариантРасписанияСинхронизацииДанныхРасширеннаяПодсказка - 92 + ВариантРасписанияСинхронизацииДанныхExtendedTooltip + 89 Label true true @@ -559,8 +559,8 @@ true - ИзменитьРасписаниеСинхронизацииДанныхРасширеннаяПодсказка - 94 + ИзменитьРасписаниеСинхронизацииДанныхExtendedTooltip + 90 Label true true @@ -583,8 +583,8 @@ true - Группа4РасширеннаяПодсказка - 89 + Группа4ExtendedTooltip + 87 Label true true @@ -615,8 +615,8 @@ true - Декорация11РасширеннаяПодсказка - 95 + Декорация11ExtendedTooltip + 91 Label true true @@ -648,8 +648,8 @@ true - НастроитьПодключениеРасширеннаяПодсказка - 96 + НастроитьПодключениеExtendedTooltip + 92 Label true true @@ -680,8 +680,8 @@ Настройка автоматической синхронизации - НастройкаАвтоматическойСинхронизацииРасширеннаяПодсказка - 88 + НастройкаАвтоматическойСинхронизацииExtendedTooltip + 86 Label true true @@ -705,8 +705,8 @@ true - Группа11РасширеннаяПодсказка - 87 + Группа11ExtendedTooltip + 85 Label true true @@ -739,7 +739,7 @@ Настройка синхронизации данных - НастройкаСинхронизацииДанныхРасширеннаяПодсказка + НастройкаСинхронизацииДанныхExtendedTooltip 80 Label true @@ -774,7 +774,7 @@ Синхронизация данных - СинхронизацияДанныхРасширеннаяПодсказка + СинхронизацияДанныхExtendedTooltip 69 Label true @@ -804,8 +804,8 @@ true - Декорация2РасширеннаяПодсказка - 99 + Декорация2ExtendedTooltip + 95 Label true true @@ -842,8 +842,8 @@ true - ПоясняющаяНадписьПолученоОбновлениеРасширеннаяПодсказка - 100 + ПоясняющаяНадписьПолученоОбновлениеExtendedTooltip + 96 Label true true @@ -870,8 +870,8 @@ true - Группа6РасширеннаяПодсказка - 98 + Группа6ExtendedTooltip + 94 Label true true @@ -897,8 +897,8 @@ true - УстановитьОбновлениеРасширеннаяПодсказка - 101 + УстановитьОбновлениеExtendedTooltip + 97 Label true true @@ -931,8 +931,8 @@ true - ИнформацияОПоследнейСинхронизации1РасширеннаяПодсказка - 103 + ИнформацияОПоследнейСинхронизации1ExtendedTooltip + 99 Label true true @@ -964,8 +964,8 @@ true - ПерейтиККонфликтам1РасширеннаяПодсказка - 104 + ПерейтиККонфликтам1ExtendedTooltip + 100 Label true true @@ -988,8 +988,8 @@ true - Группа5РасширеннаяПодсказка - 102 + Группа5ExtendedTooltip + 98 Label true true @@ -1020,8 +1020,8 @@ Получено обновление конфигурации - ПолученоОбновлениеКонфигурацииРасширеннаяПодсказка - 97 + ПолученоОбновлениеКонфигурацииExtendedTooltip + 93 Label true true @@ -1049,7 +1049,7 @@ Автономная работа - АвтономнаяРаботаРасширеннаяПодсказка + АвтономнаяРаботаExtendedTooltip 68 Label true diff --git a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl index 43459a896..84d35ab3a 100644 --- a/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРабота/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Тогда + Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; @@ -33,6 +33,8 @@ АдресДляВосстановленияПароляУчетнойЗаписи = АвтономнаяРаботаСлужебный.АдресДляВосстановленияПароляУчетнойЗаписи(); + УстановитьПривилегированныйРежим(Ложь); + ОбновитьВидимостьНаСервере(); КонецПроцедуры @@ -75,7 +77,7 @@ &НаКлиенте Процедура ВыполнитьСинхронизациюДанных(Команда) - ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ПриложениеВСервисе, ЭтаФорма, АдресДляВосстановленияПароляУчетнойЗаписи); + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(ПриложениеВСервисе, ЭтотОбъект, АдресДляВосстановленияПароляУчетнойЗаписи); КонецПроцедуры @@ -83,10 +85,17 @@ Процедура ИзменитьРасписаниеСинхронизацииДанных(Команда) Диалог = Новый ДиалогРасписанияРегламентногоЗадания(РасписаниеСинхронизацииДанных); + ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьРасписаниеСинхронизацииДанныхЗавершение", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещения); - Если Диалог.ОткрытьМодально() Тогда +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРасписаниеСинхронизацииДанныхЗавершение(Расписание, ДополнительныеПараметры) + + Если Расписание <> Неопределено Тогда - РасписаниеСинхронизацииДанных = Диалог.Расписание; + РасписаниеСинхронизацииДанных = Расписание; ИзменитьРасписаниеСинхронизацииДанныхНаСервере(); @@ -186,8 +195,8 @@ ТребуетсяУстановкаОбновления = ОбменДаннымиСервер.ТребуетсяУстановкаОбновления(); Элементы.АвтономнаяРабота.ТекущаяСтраница = ?(ТребуетсяУстановкаОбновления, - Элементы.ПолученоОбновлениеКонфигурации, - Элементы.СинхронизацияДанных); + Элементы.ПолученоОбновлениеКонфигурации, + Элементы.СинхронизацияДанных); Элементы.ВыполнитьСинхронизациюДанных.КнопкаПоУмолчанию = Не ТребуетсяУстановкаОбновления; Элементы.ВыполнитьСинхронизациюДанных.АктивизироватьПоУмолчанию = Не ТребуетсяУстановкаОбновления; @@ -195,7 +204,7 @@ Элементы.УстановитьОбновление.КнопкаПоУмолчанию = ТребуетсяУстановкаОбновления; Элементы.УстановитьОбновление.АктивизироватьПоУмолчанию = ТребуетсяУстановкаОбновления; - // + НастройкиТранспортаWS = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаWS(ПриложениеВСервисе); ПарольПользователяСохраняется = НастройкиТранспортаWS.WSЗапомнитьПароль; @@ -206,6 +215,8 @@ Элементы.ВариантРасписанияСинхронизацииДанных.Доступность = СинхронизироватьДанныеПоРасписанию; Элементы.ИзменитьРасписаниеСинхронизацииДанных.Доступность = СинхронизироватьДанныеПоРасписанию; + УстановитьПривилегированныйРежим(Ложь); + // Устанавливаем видимость по ролям РольДоступнаНастройкаСинхронизацииДанных = Пользователи.РолиДоступны("НастройкаСинхронизацииДанных"); Элементы.НастройкаСинхронизацииДанных.Видимость = РольДоступнаНастройкаСинхронизацииДанных; @@ -340,7 +351,7 @@ ПараметрыФормы.Вставить("НастройкаАвтоматическойСинхронизации", НастройкаАвтоматическойСинхронизации); ОбменДаннымиКлиент.ОткрытьФормуЗаписиРегистраСведенийПоОтбору(Отбор, ЗначенияЗаполнения, "НастройкиТранспортаОбмена", - ЭтаФорма, "НастройкаПодключенияКСервису", ПараметрыФормы); + ЭтотОбъект, "НастройкаПодключенияКСервису", ПараметрыФормы); ОбновитьВидимостьНаСервере(); @@ -351,14 +362,6 @@ УстановитьИспользованиеРегламентногоЗадания(СинхронизироватьДанныеПоРасписанию); - Если СинхронизироватьДанныеПоРасписанию Тогда - - Состояние(НСтр("ru = 'Запуск отдельного сеанса для автоматического выполнения синхронизации данных.'"),, - НСтр("ru = 'Пожалуйста, подождите...'")); - ПодключитьОбработчикОжидания("ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийЧерезОбработчикОжидания", 1, Истина); - - КонецЕсли; - Элементы.НастроитьПодключение.Доступность = СинхронизироватьДанныеПоРасписанию; Элементы.ВариантРасписанияСинхронизацииДанных.Доступность = СинхронизироватьДанныеПоРасписанию; Элементы.ИзменитьРасписаниеСинхронизацииДанных.Доступность = СинхронизироватьДанныеПоРасписанию; diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form index fd9ec3e06..0df00b60c 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Form.form @@ -18,7 +18,7 @@ true - Декорация2РасширеннаяПодсказка + Декорация2ExtendedTooltip 119 Label true @@ -59,7 +59,7 @@ true - Декорация1РасширеннаяПодсказка + Декорация1ExtendedTooltip 121 Label true @@ -94,7 +94,7 @@ true - Декорация4РасширеннаяПодсказка + Декорация4ExtendedTooltip 122 Label true @@ -124,7 +124,7 @@ true - КакУстановитьИлиОбновитьВерсиюПлатформы1СПредприятиеРасширеннаяПодсказка + КакУстановитьИлиОбновитьВерсиюПлатформы1СПредприятиеExtendedTooltip 123 Label true @@ -148,7 +148,7 @@ true - Группа4РасширеннаяПодсказка + Группа4ExtendedTooltip 120 Label true @@ -173,7 +173,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 118 Label true @@ -203,7 +203,7 @@ true - СоздатьАвтономноеРабочееМестоРасширеннаяПодсказка + СоздатьАвтономноеРабочееМестоExtendedTooltip 125 Label true @@ -234,7 +234,7 @@ true - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 126 Label true @@ -261,7 +261,7 @@ true - Группа8РасширеннаяПодсказка + Группа8ExtendedTooltip 124 Label true @@ -289,7 +289,7 @@ true - КакНастроитьАвтономноеРабочееМестоРасширеннаяПодсказка + КакНастроитьАвтономноеРабочееМестоExtendedTooltip 127 Label true @@ -321,7 +321,7 @@ Автономная работа не настроена - АвтономнаяРаботаНеНастроенаРасширеннаяПодсказка + АвтономнаяРаботаНеНастроенаExtendedTooltip 117 Label true @@ -358,7 +358,7 @@ true - Декорация5РасширеннаяПодсказка + Декорация5ExtendedTooltip 131 Label true @@ -392,7 +392,7 @@ None - АвтономноеРабочееМестоРасширеннаяПодсказка + АвтономноеРабочееМестоExtendedTooltip 132 Label true @@ -430,7 +430,7 @@ true - Группа5РасширеннаяПодсказка + Группа5ExtendedTooltip 130 Label true @@ -464,8 +464,8 @@ true - ИнформацияОПоследнейСинхронизацииРасширеннаяПодсказка - 135 + ИнформацияОПоследнейСинхронизацииExtendedTooltip + 134 Label true true @@ -497,8 +497,8 @@ true - ПерейтиККонфликтамРасширеннаяПодсказка - 136 + ПерейтиККонфликтамExtendedTooltip + 135 Label true true @@ -521,8 +521,8 @@ true - Группа3РасширеннаяПодсказка - 134 + Группа3ExtendedTooltip + 133 Label true true @@ -551,8 +551,8 @@ true - ИзменитьАвтономноеРабочееМестоРасширеннаяПодсказка - 138 + ИзменитьАвтономноеРабочееМестоExtendedTooltip + 137 Label true true @@ -583,8 +583,8 @@ true - ОписаниеОграниченийПередачиДанныхРасширеннаяПодсказка - 139 + ОписаниеОграниченийПередачиДанныхExtendedTooltip + 138 Label true true @@ -610,8 +610,8 @@ true - Группа2РасширеннаяПодсказка - 137 + Группа2ExtendedTooltip + 136 Label true true @@ -640,8 +640,8 @@ true - ПрекратитьСинхронизациюСАвтономнымРабочимМестомРасширеннаяПодсказка - 141 + ПрекратитьСинхронизациюСАвтономнымРабочимМестомExtendedTooltip + 140 Label true true @@ -672,8 +672,8 @@ true - Декорация8РасширеннаяПодсказка - 142 + Декорация8ExtendedTooltip + 141 Label true true @@ -699,8 +699,8 @@ true - Группа6РасширеннаяПодсказка - 140 + Группа6ExtendedTooltip + 139 Label true true @@ -724,7 +724,7 @@ true - Группа9РасширеннаяПодсказка + Группа9ExtendedTooltip 129 Label true @@ -756,8 +756,8 @@ true - СоздатьАвтономноеРабочееМесто1РасширеннаяПодсказка - 144 + СоздатьАвтономноеРабочееМесто1ExtendedTooltip + 143 Label true true @@ -787,8 +787,8 @@ true - Декорация7РасширеннаяПодсказка - 145 + Декорация7ExtendedTooltip + 144 Label true true @@ -814,8 +814,8 @@ true - Группа7РасширеннаяПодсказка - 143 + Группа7ExtendedTooltip + 142 Label true true @@ -842,8 +842,8 @@ true - КакНастроитьАвтономноеРабочееМесто1РасширеннаяПодсказка - 146 + КакНастроитьАвтономноеРабочееМесто1ExtendedTooltip + 145 Label true true @@ -874,7 +874,7 @@ Одно автономное рабочее место - ОдноАвтономноеРабочееМестоРасширеннаяПодсказка + ОдноАвтономноеРабочееМестоExtendedTooltip 128 Label true @@ -901,8 +901,8 @@ true - ПерейтиККонфликтам1РасширеннаяПодсказка - 148 + ПерейтиККонфликтам1ExtendedTooltip + 147 Label true true @@ -952,8 +952,8 @@ СписокАвтономныхРабочихМест.АвтономноеРабочееМесто - СписокАвтономныхРабочихМестАвтономноеРабочееМестоРасширеннаяПодсказка - 177 + СписокАвтономныхРабочихМестАвтономноеРабочееМестоExtendedTooltip + 167 Label true true @@ -993,8 +993,8 @@ СписокАвтономныхРабочихМест.ПредставлениеДатыСинхронизации - СписокАвтономныхРабочихМестПредставлениеДатыСинхронизацииРасширеннаяПодсказка - 179 + СписокАвтономныхРабочихМестПредставлениеДатыСинхронизацииExtendedTooltip + 168 Label true true @@ -1042,8 +1042,8 @@ true - СписокАвтономныхРабочихМестСоздатьАвтономноеРабочееМестоРасширеннаяПодсказка - 155 + СписокАвтономныхРабочихМестСоздатьАвтономноеРабочееМестоExtendedTooltip + 154 Label true true @@ -1068,8 +1068,8 @@ true - СписокАвтономныхРабочихМестИзменитьАвтономноеРабочееМестоВСпискеРасширеннаяПодсказка - 156 + СписокАвтономныхРабочихМестИзменитьАвтономноеРабочееМестоВСпискеExtendedTooltip + 155 Label true true @@ -1098,8 +1098,8 @@ true - СписокАвтономныхРабочихМестПрекратитьСинхронизациюСАвтономнымРабочимМестомРасширеннаяПодсказка - 157 + СписокАвтономныхРабочихМестПрекратитьСинхронизациюСАвтономнымРабочимМестомExtendedTooltip + 156 Label true true @@ -1131,8 +1131,8 @@ true - СписокАвтономныхРабочихМестОбновитьРасширеннаяПодсказка - 159 + СписокАвтономныхРабочихМестОбновитьExtendedTooltip + 158 Label true true @@ -1155,8 +1155,8 @@ true - СписокАвтономныхРабочихМестГруппа3РасширеннаяПодсказка - 158 + СписокАвтономныхРабочихМестГруппа3ExtendedTooltip + 157 Label true true @@ -1178,8 +1178,8 @@ true - СписокАвтономныхРабочихМестНайтиРасширеннаяПодсказка - 161 + СписокАвтономныхРабочихМестНайтиExtendedTooltip + 160 Label true true @@ -1205,8 +1205,8 @@ true - СписокАвтономныхРабочихМестОтменитьПоискРасширеннаяПодсказка - 162 + СписокАвтономныхРабочихМестОтменитьПоискExtendedTooltip + 161 Label true true @@ -1229,8 +1229,8 @@ true - СписокАвтономныхРабочихМестГруппа1РасширеннаяПодсказка - 160 + СписокАвтономныхРабочихМестГруппа1ExtendedTooltip + 159 Label true true @@ -1252,8 +1252,8 @@ true - СписокАвтономныхРабочихМестКопироватьВБуферОбменаРасширеннаяПодсказка - 164 + СписокАвтономныхРабочихМестКопироватьВБуферОбменаExtendedTooltip + 163 Label true true @@ -1279,8 +1279,8 @@ true - СписокАвтономныхРабочихМестВывестиСписокРасширеннаяПодсказка - 165 + СписокАвтономныхРабочихМестВывестиСписокExtendedTooltip + 164 Label true true @@ -1303,8 +1303,8 @@ true - СписокАвтономныхРабочихМестГруппа2РасширеннаяПодсказка - 163 + СписокАвтономныхРабочихМестГруппа2ExtendedTooltip + 162 Label true true @@ -1323,8 +1323,8 @@ true - СписокАвтономныхРабочихМестКнопка1РасширеннаяПодсказка - 166 + СписокАвтономныхРабочихМестКнопка1ExtendedTooltip + 165 Label true true @@ -1348,32 +1348,9 @@ СписокАвтономныхРабочихМестСтрокаПоиска - 168 - - СписокАвтономныхРабочихМестСтрокаПоискаРасширеннаяПодсказка - 170 - Label - true - true - - Left - - - - СписокАвтономныхРабочихМестСтрокаПоискаКонтекстноеМеню - 169 - true - - СписокАвтономныхРабочихМест - - true - - - - СписокАвтономныхРабочихМестСостояниеПросмотра 171 - СписокАвтономныхРабочихМестСостояниеПросмотраРасширеннаяПодсказка + СписокАвтономныхРабочихМестСтрокаПоискаРасширеннаяПодсказка 173 Label true @@ -1383,10 +1360,33 @@ - СписокАвтономныхРабочихМестСостояниеПросмотраКонтекстноеМеню + СписокАвтономныхРабочихМестСтрокаПоискаКонтекстноеМеню 172 true + СписокАвтономныхРабочихМест + + true + + + + СписокАвтономныхРабочихМестСостояниеПросмотра + 174 + + СписокАвтономныхРабочихМестСостояниеПросмотраРасширеннаяПодсказка + 176 + Label + true + true + + Left + + + + СписокАвтономныхРабочихМестСостояниеПросмотраКонтекстноеМеню + 175 + true + ViewStatusAddition СписокАвтономныхРабочихМест @@ -1395,10 +1395,10 @@ СписокАвтономныхРабочихМестУправлениеПоиском - 174 + 177 СписокАвтономныхРабочихМестУправлениеПоискомРасширеннаяПодсказка - 176 + 179 Label true true @@ -1408,7 +1408,7 @@ СписокАвтономныхРабочихМестУправлениеПоискомКонтекстноеМеню - 175 + 178 true SearchControlAddition @@ -1418,8 +1418,8 @@ - СписокАвтономныхРабочихМестРасширеннаяПодсказка - 167 + СписокАвтономныхРабочихМестExtendedTooltip + 166 Label true true @@ -1439,8 +1439,8 @@ true - СписокАвтономныхРабочихМестСоздатьАвтономноеРабочееМесто1РасширеннаяПодсказка - 149 + СписокАвтономныхРабочихМестСоздатьАвтономноеРабочееМесто1ExtendedTooltip + 148 Label true true @@ -1465,8 +1465,8 @@ true - СписокАвтономныхРабочихМестИзменитьАвтономноеРабочееМестоВСписке1РасширеннаяПодсказка - 150 + СписокАвтономныхРабочихМестИзменитьАвтономноеРабочееМестоВСписке1ExtendedTooltip + 149 Label true true @@ -1495,8 +1495,8 @@ true - СписокАвтономныхРабочихМестПрекратитьСинхронизациюСАвтономнымРабочимМестом1РасширеннаяПодсказка - 151 + СписокАвтономныхРабочихМестПрекратитьСинхронизациюСАвтономнымРабочимМестом1ExtendedTooltip + 150 Label true true @@ -1528,8 +1528,8 @@ true - СписокАвтономныхРабочихМестКопироватьВБуферОбмена1РасширеннаяПодсказка - 153 + СписокАвтономныхРабочихМестКопироватьВБуферОбмена1ExtendedTooltip + 152 Label true true @@ -1555,8 +1555,8 @@ true - СписокАвтономныхРабочихМестВывестиСписок1РасширеннаяПодсказка - 154 + СписокАвтономныхРабочихМестВывестиСписок1ExtendedTooltip + 153 Label true true @@ -1579,8 +1579,8 @@ true - СписокАвтономныхРабочихМестГруппа4РасширеннаяПодсказка - 152 + СписокАвтономныхРабочихМестГруппа4ExtendedTooltip + 151 Label true true @@ -1626,8 +1626,8 @@ true - КакНастроитьАвтономноеРабочееМесто2РасширеннаяПодсказка - 189 + КакНастроитьАвтономноеРабочееМесто2ExtendedTooltip + 169 Label true true @@ -1658,8 +1658,8 @@ Несколько автономных рабочих мест - НесколькоАвтономныхРабочихМестРасширеннаяПодсказка - 147 + НесколькоАвтономныхРабочихМестExtendedTooltip + 146 Label true true @@ -1680,7 +1680,7 @@ true - АвтономнаяРаботаРасширеннаяПодсказка + АвтономнаяРаботаExtendedTooltip 116 Label true diff --git a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl index 8029b4c32..cf47c92e0 100644 --- a/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonForms/АвтономнаяРаботаВМоделиСервиса/Module.bsl @@ -9,13 +9,13 @@ КонецЕсли; // Создавать и отключать автономные рабочие места может только администратор абонента. - Если Не Пользователи.РолиДоступны("ПолныеПрава") Тогда + Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Нарушение прав доступа!'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для настройки автономной работы.'"); ИначеЕсли Не АвтономнаяРаботаСлужебный.АвтономнаяРаботаПоддерживается() Тогда - ВызватьИсключение НСтр("ru = 'Автономная работа для конфигурации не поддерживается!'"); + ВызватьИсключение НСтр("ru = 'Возможность автономной работы в программе не предусмотрена.'"); КонецЕсли; @@ -53,7 +53,7 @@ &НаКлиенте Процедура СоздатьАвтономноеРабочееМесто(Команда) - ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.НастройкаНаСторонеСервиса",, ЭтаФорма, "1"); + ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.НастройкаНаСторонеСервиса",, ЭтотОбъект, "1"); КонецПроцедуры @@ -82,7 +82,7 @@ Если АвтономноеРабочееМесто <> Неопределено Тогда - ОткрытьЗначение(АвтономноеРабочееМесто); + ПоказатьЗначение(, АвтономноеРабочееМесто); КонецЕсли; @@ -95,7 +95,7 @@ Если ТекущиеДанные <> Неопределено Тогда - ОткрытьЗначение(ТекущиеДанные.АвтономноеРабочееМесто); + ПоказатьЗначение(, ТекущиеДанные.АвтономноеРабочееМесто); КонецЕсли; @@ -111,7 +111,7 @@ &НаКлиенте Процедура СписокАвтономныхРабочихМестВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ОткрытьЗначение(Элементы.СписокАвтономныхРабочихМест.ТекущиеДанные.АвтономноеРабочееМесто); + ПоказатьЗначение(, Элементы.СписокАвтономныхРабочихМест.ТекущиеДанные.АвтономноеРабочееМесто); КонецПроцедуры @@ -122,7 +122,7 @@ ПараметрыФормы.Вставить("ИмяМакета", "КакУстановитьИлиОбновитьВерсиюПлатформы1СПредприятие"); ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Как установить или обновить версию платформы 1С:Предприятие'")); - ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтаФорма, "КакУстановитьИлиОбновитьВерсиюПлатформы1СПредприятие"); + ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтотОбъект, "КакУстановитьИлиОбновитьВерсиюПлатформы1СПредприятие"); КонецПроцедуры @@ -133,7 +133,7 @@ ПараметрыФормы.Вставить("ИмяМакета", "ИнструкцияПоНастройкеАвтономногоРабочегоМеста"); ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Как настроить автономное рабочее место'")); - ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтаФорма, "ИнструкцияПоНастройкеАвтономногоРабочегоМеста"); + ОткрытьФорму("Обработка.ПомощникСозданияАвтономногоРабочегоМеста.Форма.ДополнительноеОписание", ПараметрыФормы, ЭтотОбъект, "ИнструкцияПоНастройкеАвтономногоРабочегоМеста"); КонецПроцедуры @@ -229,7 +229,7 @@ Если ТекущиеДанные <> Неопределено Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Индекс(ТекущиеДанные); + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Индекс(ТекущиеДанные); КонецЕсли; @@ -242,16 +242,16 @@ Если ИндексСтроки <> Неопределено Тогда // выполняем проверки позиционирования курсора после получения новых данных - Если ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + Если ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Если ИндексСтроки > ЭтаФорма[ИмяТаблицы].Количество() - 1 Тогда + Если ИндексСтроки > ЭтотОбъект[ИмяТаблицы].Количество() - 1 Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Количество() - 1; + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Количество() - 1; КонецЕсли; // позиционируем курсор - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); КонецЕсли; @@ -259,9 +259,9 @@ // если спозиционировать строку не удалось, то устанавливаем текущей первую строку Если Элементы[ИмяТаблицы].ТекущаяСтрока = Неопределено - И ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + И ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][0].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][0].ПолучитьИдентификатор(); КонецЕсли; @@ -301,6 +301,6 @@ ПараметрыФормы = Новый Структура("АвтономноеРабочееМесто", ОтключаемоеАвтономноеРабочееМесто); - ОткрытьФорму("ОбщаяФорма.ОтключениеАвтономногоРабочегоМеста", ПараметрыФормы, ЭтаФорма, ОтключаемоеАвтономноеРабочееМесто); + ОткрытьФорму("ОбщаяФорма.ОтключениеАвтономногоРабочегоМеста", ПараметрыФормы, ЭтотОбъект, ОтключаемоеАвтономноеРабочееМесто); КонецПроцедуры diff --git a/SSL/src/CommonForms/АдреснаяКнига/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/АдреснаяКнига/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/АдреснаяКнига/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/АдреснаяКнига/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/АдреснаяКнига/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/АдреснаяКнига/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/АдреснаяКнига/Form.form b/SSL/src/CommonForms/АдреснаяКнига/Form.form index 1dc31688e..cab2587b5 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Form.form +++ b/SSL/src/CommonForms/АдреснаяКнига/Form.form @@ -25,7 +25,7 @@ None - ВариантыПоискаРасширеннаяПодсказка + ВариантыПоискаExtendedTooltip 186 Label true @@ -68,8 +68,8 @@ None - СтрокаПоискаРасширеннаяПодсказка - 188 + СтрокаПоискаExtendedTooltip + 187 Label true true @@ -106,8 +106,8 @@ false - НайтиРасширеннаяПодсказка - 190 + НайтиExtendedTooltip + 188 Label true true @@ -139,7 +139,7 @@ true - ГруппаСтрокаПоискаРасширеннаяПодсказка + ГруппаСтрокаПоискаExtendedTooltip 185 Label true @@ -190,8 +190,8 @@ НайденныеКонтакты.НаименованиеКонтакта - НаименованиеКонтактаРасширеннаяПодсказка - 202 + НаименованиеКонтактаExtendedTooltip + 191 Label true true @@ -230,8 +230,8 @@ НайденныеКонтакты.Представление - АдресЭПРасширеннаяПодсказка - 204 + АдресЭПExtendedTooltip + 192 Label true true @@ -271,10 +271,10 @@ НайденныеКонтактыСтрокаПоиска - 193 + 247 НайденныеКонтактыСтрокаПоискаРасширеннаяПодсказка - 195 + 249 Label true true @@ -284,7 +284,7 @@ НайденныеКонтактыСтрокаПоискаКонтекстноеМеню - 194 + 248 true НайденныеКонтакты @@ -294,10 +294,10 @@ НайденныеКонтактыСостояниеПросмотра - 196 + 250 НайденныеКонтактыСостояниеПросмотраРасширеннаяПодсказка - 198 + 252 Label true true @@ -307,7 +307,7 @@ НайденныеКонтактыСостояниеПросмотраКонтекстноеМеню - 197 + 251 true ViewStatusAddition @@ -318,10 +318,10 @@ НайденныеКонтактыУправлениеПоиском - 199 + 253 НайденныеКонтактыУправлениеПоискомРасширеннаяПодсказка - 201 + 255 Label true true @@ -331,7 +331,7 @@ НайденныеКонтактыУправлениеПоискомКонтекстноеМеню - 200 + 254 true SearchControlAddition @@ -341,8 +341,8 @@ - НайденныеКонтактыРасширеннаяПодсказка - 192 + НайденныеКонтактыExtendedTooltip + 190 Label true true @@ -363,8 +363,8 @@ false - НайтиВСпискеИзСпискаНайденныхРасширеннаяПодсказка - 191 + НайтиВСпискеИзСпискаНайденныхExtendedTooltip + 189 Label true true @@ -423,8 +423,8 @@ None - ИнформацияОбАктуальностиИндексаППДРасширеннаяПодсказка - 215 + ИнформацияОбАктуальностиИндексаППДExtendedTooltip + 194 Label true true @@ -457,8 +457,8 @@ false - КомандаОбновитьИндексППДРасширеннаяПодсказка - 217 + КомандаОбновитьИндексППДExtendedTooltip + 195 Label true true @@ -489,8 +489,8 @@ Группа по строке - ГруппаПоСтрокеРасширеннаяПодсказка - 214 + ГруппаПоСтрокеExtendedTooltip + 193 Label true true @@ -521,7 +521,7 @@ Страница поиск контактов - СтраницаПоискКонтактовРасширеннаяПодсказка + СтраницаПоискКонтактовExtendedTooltip 184 Label true @@ -564,8 +564,8 @@ КонтактыПоПредмету.ПредставлениеНаименования - ПредставлениеНаименованияРасширеннаяПодсказка - 232 + ПредставлениеНаименованияExtendedTooltip + 201 Label true true @@ -604,8 +604,8 @@ КонтактыПоПредмету.Адрес - АдресКонтактаРасширеннаяПодсказка - 234 + АдресКонтактаExtendedTooltip + 202 Label true true @@ -645,10 +645,10 @@ КонтактыПоПредметуСтрокаПоиска - 223 + 267 КонтактыПоПредметуСтрокаПоискаРасширеннаяПодсказка - 225 + 269 Label true true @@ -658,7 +658,7 @@ КонтактыПоПредметуСтрокаПоискаКонтекстноеМеню - 224 + 268 true КонтактыПоПредмету @@ -668,10 +668,10 @@ КонтактыПоПредметуСостояниеПросмотра - 226 + 270 КонтактыПоПредметуСостояниеПросмотраРасширеннаяПодсказка - 228 + 272 Label true true @@ -681,7 +681,7 @@ КонтактыПоПредметуСостояниеПросмотраКонтекстноеМеню - 227 + 271 true ViewStatusAddition @@ -692,10 +692,10 @@ КонтактыПоПредметуУправлениеПоиском - 229 + 273 КонтактыПоПредметуУправлениеПоискомРасширеннаяПодсказка - 231 + 275 Label true true @@ -705,7 +705,7 @@ КонтактыПоПредметуУправлениеПоискомКонтекстноеМеню - 230 + 274 true SearchControlAddition @@ -715,8 +715,8 @@ - КонтактыПоПредметуРасширеннаяПодсказка - 222 + КонтактыПоПредметуExtendedTooltip + 200 Label true true @@ -737,8 +737,8 @@ false - ДобавитьИзСпискаПредметовРасширеннаяПодсказка - 219 + ДобавитьИзСпискаПредметовExtendedTooltip + 197 Label true true @@ -764,8 +764,8 @@ false - УстановитьКонтактИзСпискаПредметовРасширеннаяПодсказка - 220 + УстановитьКонтактИзСпискаПредметовExtendedTooltip + 198 Label true true @@ -791,8 +791,8 @@ false - НайтиВСпискеИзСпискаПредметовРасширеннаяПодсказка - 221 + НайтиВСпискеИзСпискаПредметовExtendedTooltip + 199 Label true true @@ -849,8 +849,8 @@ Страница все контакты по предмету - СтраницаВсеКонтактыПоПредметуРасширеннаяПодсказка - 218 + СтраницаВсеКонтактыПоПредметуExtendedTooltip + 196 Label true true @@ -906,8 +906,8 @@ ГруппыПользователей.Description - НаименованиеГруппыРасширеннаяПодсказка - 255 + НаименованиеГруппыExtendedTooltip + 205 Label true true @@ -943,10 +943,10 @@ ГруппыПользователейСтрокаПоиска - 246 + 286 ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка - 248 + 288 Label true true @@ -956,7 +956,7 @@ ГруппыПользователейСтрокаПоискаКонтекстноеМеню - 247 + 287 true ГруппыПользователей @@ -966,10 +966,10 @@ ГруппыПользователейСостояниеПросмотра - 249 + 289 ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка - 251 + 291 Label true true @@ -979,7 +979,7 @@ ГруппыПользователейСостояниеПросмотраКонтекстноеМеню - 250 + 290 true ViewStatusAddition @@ -990,10 +990,10 @@ ГруппыПользователейУправлениеПоиском - 252 + 292 ГруппыПользователейУправлениеПоискомРасширеннаяПодсказка - 254 + 294 Label true true @@ -1003,7 +1003,7 @@ ГруппыПользователейУправлениеПоискомКонтекстноеМеню - 253 + 293 true SearchControlAddition @@ -1013,8 +1013,8 @@ - ГруппыПользователейРасширеннаяПодсказка - 245 + ГруппыПользователейExtendedTooltip + 204 Label true true @@ -1100,8 +1100,8 @@ СписокПользователей.Ref - ПользовательРасширеннаяПодсказка - 275 + ПользовательExtendedTooltip + 207 Label true true @@ -1140,10 +1140,10 @@ СписокПользователейСтрокаПоиска - 266 + 304 СписокПользователейСтрокаПоискаРасширеннаяПодсказка - 268 + 306 Label true true @@ -1153,7 +1153,7 @@ СписокПользователейСтрокаПоискаКонтекстноеМеню - 267 + 305 true СписокПользователей @@ -1163,10 +1163,10 @@ СписокПользователейСостояниеПросмотра - 269 + 307 СписокПользователейСостояниеПросмотраРасширеннаяПодсказка - 271 + 309 Label true true @@ -1176,7 +1176,7 @@ СписокПользователейСостояниеПросмотраКонтекстноеМеню - 270 + 308 true ViewStatusAddition @@ -1187,10 +1187,10 @@ СписокПользователейУправлениеПоиском - 272 + 310 СписокПользователейУправлениеПоискомРасширеннаяПодсказка - 274 + 312 Label true true @@ -1200,7 +1200,7 @@ СписокПользователейУправлениеПоискомКонтекстноеМеню - 273 + 311 true SearchControlAddition @@ -1210,8 +1210,8 @@ - СписокПользователейРасширеннаяПодсказка - 265 + СписокПользователейExtendedTooltip + 206 Label true true @@ -1272,8 +1272,8 @@ Пользователи - СтраницаПользователейРасширеннаяПодсказка - 244 + СтраницаПользователейExtendedTooltip + 203 Label true true @@ -1301,7 +1301,7 @@ Страницы списки - СтраницыСпискиРасширеннаяПодсказка + СтраницыСпискиExtendedTooltip 183 Label true @@ -1338,8 +1338,8 @@ true - ДекорацияПереместитьВерхняяРасширеннаяПодсказка - 288 + ДекорацияПереместитьВерхняяExtendedTooltip + 211 Label true true @@ -1369,8 +1369,8 @@ true - ПереместитьИзСпискаВВыбранноеРасширеннаяПодсказка - 289 + ПереместитьИзСпискаВВыбранноеExtendedTooltip + 212 Label true true @@ -1397,8 +1397,8 @@ true - ДекорацияПереместитьЦентрРасширеннаяПодсказка - 290 + ДекорацияПереместитьЦентрExtendedTooltip + 213 Label true true @@ -1427,8 +1427,8 @@ true - ПереместитьИзВыбранногоВСписокВсеРасширеннаяПодсказка - 291 + ПереместитьИзВыбранногоВСписокВсеExtendedTooltip + 214 Label true true @@ -1455,8 +1455,8 @@ true - ПереместитьИзВыбранногоВСписокРасширеннаяПодсказка - 292 + ПереместитьИзВыбранногоВСписокExtendedTooltip + 215 Label true true @@ -1483,8 +1483,8 @@ true - ДекорацияПереместитьНижняяРасширеннаяПодсказка - 293 + ДекорацияПереместитьНижняяExtendedTooltip + 216 Label true true @@ -1519,8 +1519,8 @@ Страница переместить одна таблица - СтраницаПереместитьОднаТаблицаРасширеннаяПодсказка - 287 + СтраницаПереместитьОднаТаблицаExtendedTooltip + 210 Label true true @@ -1546,8 +1546,8 @@ true - ДекорацияПереместитьВерхняяДвеТаблицыРасширеннаяПодсказка - 295 + ДекорацияПереместитьВерхняяДвеТаблицыExtendedTooltip + 218 Label true true @@ -1577,8 +1577,8 @@ true - ПереместитьИзВерхнегоСпискаВВыбранноеРасширеннаяПодсказка - 296 + ПереместитьИзВерхнегоСпискаВВыбранноеExtendedTooltip + 219 Label true true @@ -1604,8 +1604,8 @@ true - ДекорацияПромежутокВерхняяРасширеннаяПодсказка - 297 + ДекорацияПромежутокВерхняяExtendedTooltip + 220 Label true true @@ -1634,8 +1634,8 @@ true - ПереместитьИзВыбранногоВСписокДвеТаблицыРасширеннаяПодсказка - 298 + ПереместитьИзВыбранногоВСписокДвеТаблицыExtendedTooltip + 221 Label true true @@ -1661,8 +1661,8 @@ true - ПереместитьИзВыбранногоВСписокВсеДвеТаблицыРасширеннаяПодсказка - 299 + ПереместитьИзВыбранногоВСписокВсеДвеТаблицыExtendedTooltip + 222 Label true true @@ -1688,8 +1688,8 @@ true - ДекорацияПромежутокНижняяРасширеннаяПодсказка - 300 + ДекорацияПромежутокНижняяExtendedTooltip + 223 Label true true @@ -1718,8 +1718,8 @@ true - ПереместитьИзНижнегоСпискаВВыбранноеРасширеннаяПодсказка - 301 + ПереместитьИзНижнегоСпискаВВыбранноеExtendedTooltip + 224 Label true true @@ -1745,8 +1745,8 @@ true - ДекорацияПереместитьНижняяДвеТаблицыРасширеннаяПодсказка - 302 + ДекорацияПереместитьНижняяДвеТаблицыExtendedTooltip + 225 Label true true @@ -1781,8 +1781,8 @@ Страница переместить две таблицы - СтраницаПереместитьДвеТаблицыРасширеннаяПодсказка - 294 + СтраницаПереместитьДвеТаблицыExtendedTooltip + 217 Label true true @@ -1811,8 +1811,8 @@ 3 - СтраницыПереместитьРасширеннаяПодсказка - 286 + СтраницыПереместитьExtendedTooltip + 209 Label true true @@ -1853,8 +1853,8 @@ ПолучателиПисьма.Группа - ГруппаРасширеннаяПодсказка - 327 + ГруппаExtendedTooltip + 241 Label true true @@ -1876,7 +1876,6 @@ 12 true true - true true true @@ -1918,8 +1917,8 @@ ПолучателиПисьма.Адрес - АдресРасширеннаяПодсказка - 329 + АдресExtendedTooltip + 242 Label true true @@ -1940,7 +1939,6 @@ true true - true true true true @@ -1969,8 +1967,8 @@ ПолучателиПисьма.Представление - ПредставлениеРасширеннаяПодсказка - 331 + ПредставлениеExtendedTooltip + 243 Label true true @@ -2009,8 +2007,8 @@ ПолучателиПисьма.Контакт - КонтактРасширеннаяПодсказка - 333 + КонтактExtendedTooltip + 244 Label true true @@ -2054,8 +2052,8 @@ false - ДобавитьРасширеннаяПодсказка - 313 + ДобавитьExtendedTooltip + 236 Label true true @@ -2081,8 +2079,8 @@ false - УдалитьРасширеннаяПодсказка - 314 + УдалитьExtendedTooltip + 237 Label true true @@ -2108,8 +2106,8 @@ false - ПереместитьВверхРасширеннаяПодсказка - 315 + ПереместитьВверхExtendedTooltip + 238 Label true true @@ -2135,8 +2133,8 @@ false - ПереместитьВнизРасширеннаяПодсказка - 316 + ПереместитьВнизExtendedTooltip + 239 Label true true @@ -2164,10 +2162,10 @@ ПолучателиПисьмаСтрокаПоиска - 318 + 322 ПолучателиПисьмаСтрокаПоискаРасширеннаяПодсказка - 320 + 324 Label true true @@ -2177,7 +2175,7 @@ ПолучателиПисьмаСтрокаПоискаКонтекстноеМеню - 319 + 323 true ПолучателиПисьма @@ -2187,10 +2185,10 @@ ПолучателиПисьмаСостояниеПросмотра - 321 + 325 ПолучателиПисьмаСостояниеПросмотраРасширеннаяПодсказка - 323 + 327 Label true true @@ -2200,7 +2198,7 @@ ПолучателиПисьмаСостояниеПросмотраКонтекстноеМеню - 322 + 326 true ViewStatusAddition @@ -2211,10 +2209,10 @@ ПолучателиПисьмаУправлениеПоиском - 324 + 328 ПолучателиПисьмаУправлениеПоискомРасширеннаяПодсказка - 326 + 330 Label true true @@ -2224,7 +2222,7 @@ ПолучателиПисьмаУправлениеПоискомКонтекстноеМеню - 325 + 329 true SearchControlAddition @@ -2234,8 +2232,8 @@ - ПолучателиПисьмаРасширеннаяПодсказка - 317 + ПолучателиПисьмаExtendedTooltip + 240 Label true true @@ -2256,8 +2254,8 @@ false - НайтиВСпискеИзСпискаПолучателейРасширеннаяПодсказка - 304 + НайтиВСпискеИзСпискаПолучателейExtendedTooltip + 227 Label true true @@ -2286,8 +2284,8 @@ false - НайтиПоАдресуРасширеннаяПодсказка - 306 + НайтиПоАдресуExtendedTooltip + 229 Label true true @@ -2313,8 +2311,8 @@ false - НайтиПоПредставлениюРасширеннаяПодсказка - 307 + НайтиПоПредставлениюExtendedTooltip + 230 Label true true @@ -2340,8 +2338,8 @@ false - УстановитьАдресКонтактаРасширеннаяПодсказка - 308 + УстановитьАдресКонтактаExtendedTooltip + 231 Label true true @@ -2371,8 +2369,8 @@ Найти контакт - НайтиКонтактРасширеннаяПодсказка - 305 + НайтиКонтактExtendedTooltip + 228 Label true true @@ -2395,8 +2393,8 @@ false - ИзменитьГруппуКомуРасширеннаяПодсказка - 310 + ИзменитьГруппуКомуExtendedTooltip + 233 Label true true @@ -2422,8 +2420,8 @@ false - ИзменитьГруппуКопииРасширеннаяПодсказка - 311 + ИзменитьГруппуКопииExtendedTooltip + 234 Label true true @@ -2449,8 +2447,8 @@ false - ИзменитьГруппуСкрытыеРасширеннаяПодсказка - 312 + ИзменитьГруппуСкрытыеExtendedTooltip + 235 Label true true @@ -2480,8 +2478,8 @@ Изменить группу - ИзменитьГруппуРасширеннаяПодсказка - 309 + ИзменитьГруппуExtendedTooltip + 232 Label true true @@ -2532,8 +2530,8 @@ true - ГруппаПолучателиРасширеннаяПодсказка - 303 + ГруппаПолучателиExtendedTooltip + 226 Label true true @@ -2565,8 +2563,8 @@ Группа получатели переместить - ГруппаПолучателиПереместитьРасширеннаяПодсказка - 285 + ГруппаПолучателиПереместитьExtendedTooltip + 208 Label true true @@ -2597,7 +2595,7 @@ Группа списки - ГруппаСпискиРасширеннаяПодсказка + ГруппаСпискиExtendedTooltip 182 Label true @@ -2629,7 +2627,7 @@ false - КомандаВыбратьРасширеннаяПодсказка + КомандаВыбратьExtendedTooltip 181 Label true @@ -2696,6 +2694,7 @@ 1 + CatalogRef.ФизическиеЛица CatalogRef.Пользователи @@ -2844,6 +2843,7 @@ 3 + CatalogRef.ФизическиеЛица CatalogRef.Пользователи @@ -3003,6 +3003,7 @@ 1 + CatalogRef.ФизическиеЛица CatalogRef.Пользователи diff --git a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl index d5501c7b5..0c4808e22 100644 --- a/SSL/src/CommonForms/АдреснаяКнига/Module.bsl +++ b/SSL/src/CommonForms/АдреснаяКнига/Module.bsl @@ -120,7 +120,7 @@ КонецЕсли; Адрес = Результат.Адреса[0]; - СписокАдресов = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Результат.Адреса, ";"); + СписокАдресов = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Результат.Адреса, ";"); ДобавитьПолучателя(Адрес, Результат.Наименование, ВыбраннаяСтрока, СписокАдресов); @@ -144,7 +144,7 @@ Результат = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); Если Результат <> Неопределено И Результат.Адреса.Количество() > 0 Тогда - СписокАдресов = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Результат.Адреса, ";"); + СписокАдресов = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Результат.Адреса, ";"); Иначе СписокАдресов = ""; КонецЕсли; @@ -224,7 +224,7 @@ Процедура КомандаНайтиВыполнить() Если ПустаяСтрока(СтрокаПоиска) Тогда - Предупреждение(НСтр("ru = 'Не задана строка поиска!'")); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Не задана строка поиска!'"),,"СтрокаПоиска"); Возврат; КонецЕсли; @@ -243,7 +243,7 @@ Если Не ПустаяСтрока(Результат) Тогда - Предупреждение(Результат); + ПоказатьПредупреждение(,Результат); КонецЕсли; @@ -337,7 +337,7 @@ Если Не ПустаяСтрока(СтрокаПоиска) Тогда Результат = КонтактыНайденныеПоСтроке(); Если Не ПустаяСтрока(Результат) Тогда - Предупреждение(Результат); + ПоказатьПредупреждение(,Результат); КонецЕсли; КонецЕсли; @@ -361,6 +361,7 @@ Если Результат.Количество() = 1 Тогда Адрес = Результат[0].АдресЭП; Представление = Результат[0].Представление; + УстановитьАдресИПредставлениеВыбранногоКонтакта(ТекущиеДанные, Представление, Адрес); Иначе СписокВыбора = Новый СписокЗначений; Номер = 0; @@ -369,22 +370,13 @@ Номер = Номер + 1; КонецЦикла; - ВыбранныйЭлемент = СписокВыбора.ВыбратьЭлемент(); - Если ВыбранныйЭлемент = Неопределено Тогда - Возврат; - КонецЕсли; - - Индекс = ВыбранныйЭлемент.Значение; - Адрес = Результат[Индекс].АдресЭП; - Представление = Результат[Индекс].Представление; - КонецЕсли; + ПараметрыОбработкиВыбора = Новый Структура; + ПараметрыОбработкиВыбора.Вставить("Результат", Результат); + ПараметрыОбработкиВыбора.Вставить("ТекущиеДанные", ТекущиеДанные); - Позиция = Найти(Представление, "<"); - Представление = ?(Позиция= 0, "", СокрЛП(Лев(Представление, Позиция-1))); + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("СписокВыбораАдресаЭППослеЗавершения", ЭтотОбъект, ПараметрыОбработкиВыбора); - ТекущиеДанные.Адрес = Адрес; - Если Не ПустаяСтрока(Представление) Тогда - ТекущиеДанные.Представление = Представление; + СписокВыбора.ПоказатьВыборЭлемента(ОбработчикОповещенияОЗакрытии); КонецЕсли; КонецПроцедуры @@ -602,7 +594,7 @@ Результат = ВзаимодействияВызовСервера.ПолучитьНаименованиеИАдресаЭлектроннойПочтыКонтакта(ТекущиеДанные.Ссылка); Если Результат <> Неопределено И Результат.Адреса.Количество() > 0 Тогда - СписокАдресов = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Результат.Адреса, ";"); + СписокАдресов = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Результат.Адреса, ";"); Иначе СписокАдресов = ""; КонецЕсли; @@ -637,11 +629,6 @@ КонецПроцедуры -//Изменяет группу получателей письма. -// -//Параметры -// ИмяГруппы - Строка - имя группы, которое будет установлено выделенным получателям письма. -// &НаКлиенте Процедура ИзменитьГруппу(ИмяГруппы) @@ -657,7 +644,9 @@ Результат = Взаимодействия.ПолучитьАдресаЭлектроннойПочтыДляМассиваКонтактов(ВыделенныеСтроки, ГруппаПоУмолчанию); - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Результат, ПолучателиПисьма); + Если Результат <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(Результат, ПолучателиПисьма); + КонецЕсли; КонецПроцедуры @@ -673,7 +662,6 @@ КонецПроцедуры -// Управляет доступностью элементов формы &НаКлиенте Процедура УправлениеДоступностью() @@ -699,3 +687,31 @@ КонецЕсли; КонецПроцедуры + +&НаКлиенте +Процедура СписокВыбораАдресаЭППослеЗавершения(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + + Если ВыбранныйЭлемент = Неопределено Тогда + Возврат; + КонецЕсли; + + Индекс = ВыбранныйЭлемент.Значение; + Адрес = ДополнительныеПараметры.Результат[Индекс].АдресЭП; + Представление = ДополнительныеПараметры.Результат[Индекс].Представление; + УстановитьАдресИПредставлениеВыбранногоКонтакта(ДополнительныеПараметры.ТекущиеДанные, Представление, Адрес); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьАдресИПредставлениеВыбранногоКонтакта(ТекущиеДанные, Представление, Адрес) + + Позиция = Найти(Представление, "<"); + Представление = ?(Позиция= 0, "", СокрЛП(Лев(Представление, Позиция-1))); + + ТекущиеДанные.Адрес = Адрес; + Если Не ПустаяСтрока(Представление) Тогда + ТекущиеДанные.Представление = Представление; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/АутентификацияВСервисе/Form.form b/SSL/src/CommonForms/АутентификацияВСервисе/Form.form index 3383e0fd5..04b60c719 100644 --- a/SSL/src/CommonForms/АутентификацияВСервисе/Form.form +++ b/SSL/src/CommonForms/АутентификацияВСервисе/Form.form @@ -13,7 +13,7 @@ true - ДекорацияИнформационнаяНадписьРасширеннаяПодсказка + ДекорацияИнформационнаяНадписьExtendedTooltip 10 Label true @@ -49,7 +49,7 @@ Пароль - ПарольРасширеннаяПодсказка + ПарольExtendedTooltip 11 Label true @@ -91,8 +91,8 @@ true - ДекорацияЗаполнятельМестаРасширеннаяПодсказка - 14 + ДекорацияЗаполнятельМестаExtendedTooltip + 13 Label true true @@ -122,8 +122,8 @@ true - ОКРасширеннаяПодсказка - 15 + ОКExtendedTooltip + 14 Label true true @@ -149,8 +149,8 @@ true - ОтменаРасширеннаяПодсказка - 16 + ОтменаExtendedTooltip + 15 Label true true @@ -181,8 +181,8 @@ Группа кнопки - ГруппаКнопкиРасширеннаяПодсказка - 13 + ГруппаКнопкиExtendedTooltip + 12 Label true true @@ -207,6 +207,10 @@ Left true + + OnOpen + ПриОткрытии + OnClose ПриЗакрытии diff --git a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl index ed25757d4..b9a2c1693 100644 --- a/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl +++ b/SSL/src/CommonForms/АутентификацияВСервисе/Module.bsl @@ -1,11 +1,21 @@ &НаКлиенте -Процедура Отмена(Команда) +Процедура ПриОткрытии(Отказ) - Закрыть(); + Если ВладелецФормы = Неопределено Тогда + РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; + КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытии() + + ОповеститьОВыборе(ПарольПользователяСервиса); + +КонецПроцедуры + + &НаКлиенте Процедура ОК(Команда) @@ -15,8 +25,8 @@ КонецПроцедуры &НаКлиенте -Процедура ПриЗакрытии() +Процедура Отмена(Команда) - ОповеститьОВыборе(ПарольПользователяСервиса); + Закрыть(); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВводПароляСОписаниями/Form.form b/SSL/src/CommonForms/ВводПароляСОписаниями/Form.form index bc49f1946..302f071f1 100644 --- a/SSL/src/CommonForms/ВводПароляСОписаниями/Form.form +++ b/SSL/src/CommonForms/ВводПароляСОписаниями/Form.form @@ -17,7 +17,7 @@ true - ПарольРасширеннаяПодсказка + ПарольExtendedTooltip 13 Label true @@ -62,8 +62,8 @@ Файл - ФайлРасширеннаяПодсказка - 16 + ФайлExtendedTooltip + 15 Label true true @@ -105,8 +105,8 @@ ПредставленияСертификатов - ПредставленияСертификатовРасширеннаяПодсказка - 18 + ПредставленияСертификатовExtendedTooltip + 16 Label true true @@ -150,8 +150,8 @@ Группа файл - ГруппаФайлРасширеннаяПодсказка - 15 + ГруппаФайлExtendedTooltip + 14 Label true true @@ -184,7 +184,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 11 Label true @@ -210,7 +210,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 12 Label true @@ -234,7 +234,7 @@ ПриСозданииНаСервере 40 - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/CommonForms/ВводПароляСОписаниями/Help/ru.html b/SSL/src/CommonForms/ВводПароляСОписаниями/Help/ru.html index fffb68fa4..00aa8d1ab 100644 --- a/SSL/src/CommonForms/ВводПароляСОписаниями/Help/ru.html +++ b/SSL/src/CommonForms/ВводПароляСОписаниями/Help/ru.html @@ -1,7 +1,7 @@ - +

            В форме вводится пароль при расшифровке файла.

            В поле описания ("Файл зашифроован для:") указывается, для каких персональных сертификатов электронной подписи (ЭП) зашифрован файл.

             

            См. также:

            -

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file +

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Form.form b/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Form.form deleted file mode 100644 index 8d0078e2a..000000000 --- a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Form.form +++ /dev/null @@ -1,392 +0,0 @@ - - - - <key>ru</key> - <value>Включение журнала регистрации</value> - - - ГруппаПоясненияОшибки - 9 - - ДекорацияПредупреждение - 10 - - <key>ru</key> - <value>Декорация предупреждение</value> - - true - true - - true - - - ДекорацияПредупреждениеРасширеннаяПодсказка - 17 - Label - true - true - - Left - - - - ДекорацияПредупреждениеКонтекстноеМеню - 11 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - - Группа - 13 - - НадписьНеудачнойУстановкиМонопольногоДоступа - 1 - - <key>ru</key> - <value>Не удалось установить монопольный доступ к информационной базе. -Для включения журнала регистрации необходимо, -чтобы с базой работал только один (текущий) пользователь.</value> - - true - true - - true - - - НадписьНеудачнойУстановкиМонопольногоДоступаРасширеннаяПодсказка - 19 - Label - true - true - - Left - - - - НадписьНеудачнойУстановкиМонопольногоДоступаКонтекстноеМеню - 2 - true - - Label - true - 2 - true - false - - Left - Center - - - - ГруппаАктивныхПользователей - 3 - - НадписьАктивныхПользователей - 4 - - <key>ru</key> - <value>Активных пользователей:</value> - - true - true - - true - - - НадписьАктивныхПользователейРасширеннаяПодсказка - 21 - Label - true - true - - Left - - - - НадписьАктивныхПользователейКонтекстноеМеню - 5 - true - - Label - true - true - - Left - - - - КнопкаАктивныхПользователей - 6 - - <key>ru</key> - <value> </value> - - true - true - - true - - - КнопкаАктивныхПользователейРасширеннаяПодсказка - 22 - Label - true - true - - Left - - - Hyperlink - Form.Command.ОткрытьФормуАктивныхПользователей - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа активных пользователей</value> - - - ru - Группа активных пользователей - - - ГруппаАктивныхПользователейРасширеннаяПодсказка - 20 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа</value> - - - ГруппаРасширеннаяПодсказка - 18 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа пояснения ошибки</value> - - - ru - Группа пояснения ошибки - - - ГруппаПоясненияОшибкиРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - Повторить - 7 - true - true - - true - - - ПовторитьРасширеннаяПодсказка - 14 - Label - true - true - - Left - - - Form.Command.Повторить - Auto - true - true - true - UserCmds - Auto - - - ФормаОтмена - 12 - true - true - - true - - - ФормаОтменаРасширеннаяПодсказка - 15 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - Right - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - DontBlock - true - true - Vertical - true - true - UseIfNecessary - auto - true - - СписокПроверок - - <key>ru</key> - <value>Список проверок</value> - - 1 - - String - - - - true - - - true - - - - ОткрытьФормуАктивныхПользователей - - <key>ru</key> - <value>Открыть форму активных пользователей</value> - - 1 - - ru - Открыть форму активных пользователей - - - true - - - - ОткрытьФормуАктивныхПользователей - - - Auto - Auto - - - Повторить - - <key>ru</key> - <value>Повторить</value> - - 2 - - ru - Повторить - - - true - - - - Повторить - - - Auto - Auto - - - - - - diff --git a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Module.bsl b/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Module.bsl deleted file mode 100644 index bf4629cd6..000000000 --- a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/Module.bsl +++ /dev/null @@ -1,60 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ОбновитьКоличествоАктивныхПользователейСервер(); - СписокПроверок = Параметры.СписокПроверок; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - ПодключитьОбработчикОжидания("ОбновитьКоличествоАктивныхПользователей", 5 * 60); // раз в 5 минут - -КонецПроцедуры - - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ОткрытьФормуАктивныхПользователей(Команда) - - СтандартныеПодсистемыКлиент.ОткрытьСписокАктивныхПользователей(); - ОбновитьКоличествоАктивныхПользователей(); - -КонецПроцедуры - -&НаКлиенте -Процедура Повторить(Команда) - Закрыть(); - ОбщегоНазначенияКлиент.ПроверитьВключениеЖурналаРегистрации(СписокПроверок, Ложь); -КонецПроцедуры - - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаКлиенте -Процедура ОбновитьКоличествоАктивныхПользователей() - ОбновитьКоличествоАктивныхПользователейСервер(); -КонецПроцедуры - -&НаСервере -Процедура ОбновитьКоличествоАктивныхПользователейСервер() - СеансыИнфоБазы = ПолучитьСеансыИнформационнойБазы(); - - Если СеансыИнфоБазы = Неопределено Тогда - Элементы.КнопкаАктивныхПользователей.Заголовок = 1; - Иначе - Элементы.КнопкаАктивныхПользователей.Заголовок = СеансыИнфоБазы.Количество(); - КонецЕсли; -КонецПроцедуры - diff --git a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/ВключениеЖурналаРегистрации.mdo b/SSL/src/CommonForms/ВключениеЖурналаРегистрации/ВключениеЖурналаРегистрации.mdo deleted file mode 100644 index 9cbe62e7f..000000000 --- a/SSL/src/CommonForms/ВключениеЖурналаРегистрации/ВключениеЖурналаРегистрации.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ВключениеЖурналаРегистрации - - ru - Включение журнала регистрации - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonForms/Вопрос/Form.form b/SSL/src/CommonForms/Вопрос/Form.form index e33213740..14f4b9993 100644 --- a/SSL/src/CommonForms/Вопрос/Form.form +++ b/SSL/src/CommonForms/Вопрос/Form.form @@ -16,7 +16,7 @@ true - ПредупреждениеРасширеннаяПодсказка + ПредупреждениеExtendedTooltip 18 Label true @@ -56,7 +56,7 @@ true - ТекстСообщенияРасширеннаяПодсказка + ТекстСообщенияExtendedTooltip 20 Label true @@ -91,7 +91,7 @@ true None - МногострочныйТекстСообщенияРасширеннаяПодсказка + МногострочныйТекстСообщенияExtendedTooltip 21 Label true @@ -136,8 +136,8 @@ Right - БольшеНеЗадаватьЭтотВопросРасширеннаяПодсказка - 23 + БольшеНеЗадаватьЭтотВопросExtendedTooltip + 22 Label true true @@ -171,7 +171,7 @@ Строки - СтрокиРасширеннаяПодсказка + СтрокиExtendedTooltip 19 Label true @@ -204,7 +204,7 @@ Колонки - КолонкиРасширеннаяПодсказка + КолонкиExtendedTooltip 17 Label true @@ -241,8 +241,8 @@ true true - КоманднаяПанельРасширеннаяПодсказка - 25 + КоманднаяПанельExtendedTooltip + 23 Label true true @@ -280,7 +280,7 @@ Retry SaveValues Yes - DontBlock + LockOwner DefaultButton true true @@ -447,6 +447,18 @@ + + БлокироватьВесьИнтерфейс + + Boolean + + + + Картинка + + Picture + + diff --git a/SSL/src/CommonForms/Вопрос/Module.bsl b/SSL/src/CommonForms/Вопрос/Module.bsl index 46ef3bda3..dc4013144 100644 --- a/SSL/src/CommonForms/Вопрос/Module.bsl +++ b/SSL/src/CommonForms/Вопрос/Module.bsl @@ -3,6 +3,7 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; @@ -16,6 +17,15 @@ КонецЕсли; КонецЕсли; + Если Параметры.БлокироватьВесьИнтерфейс Тогда + РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; + КонецЕсли; + + // Картинка + Если Параметры.Картинка.Вид <> ВидКартинки.Пустая Тогда + Элементы.Предупреждение.Картинка = Параметры.Картинка; + КонецЕсли; + // Размещение текста. Если СтрЧислоСтрок(Параметры.ТекстСообщения) < 15 Тогда // Можно вывести все строки в виде надписи. diff --git a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form index 16d6fcdf5..ad4f08b1c 100644 --- a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form +++ b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Form.form @@ -9,7 +9,7 @@ 6 <key>ru</key> - <value>Для удобной работы с файловыми функциями предлагается установить расширение работы с файлами. + <value>Для удобной работы с программой предлагается установить расширение работы с файлами. Установить?</value> true @@ -18,7 +18,7 @@ true - ДекорацияПояснениеРасширеннаяПодсказка + ДекорацияПояснениеExtendedTooltip 14 Label true @@ -34,13 +34,13 @@ Label true - 2 true true - false + true false Left + Top Bottom @@ -49,7 +49,7 @@ ФормаКоманднаяПанель -1 - УстановитьСейчас + УстановитьИПродолжить 8 true true @@ -58,7 +58,7 @@ false - УстановитьСейчасРасширеннаяПодсказка + УстановитьИПродолжитьРасширеннаяПодсказка 11 Label true @@ -67,7 +67,7 @@ Left - Form.Command.УстановитьСейчас + Form.Command.УстановитьИПродолжить Auto true true @@ -76,7 +76,7 @@ Auto - УстановитьПозже + ПродолжитьБезУстановки 9 true true @@ -85,7 +85,7 @@ false - УстановитьПозжеРасширеннаяПодсказка + ПродолжитьБезУстановкиРасширеннаяПодсказка 12 Label true @@ -94,7 +94,7 @@ Left - Form.Command.УстановитьПозже + Form.Command.ПродолжитьБезУстановки Normal Auto true @@ -103,7 +103,7 @@ Auto - НеУстанавливать + БольшеНеНапоминать 10 true true @@ -112,7 +112,7 @@ false - НеУстанавливатьРасширеннаяПодсказка + БольшеНеНапоминатьРасширеннаяПодсказка 13 Label true @@ -121,7 +121,7 @@ Left - Form.Command.НеУстанавливать + Form.Command.БольшеНеНапоминать Normal Auto true @@ -147,7 +147,7 @@ Retry SaveValues Yes - DontBlock + LockOwner true true Vertical @@ -175,7 +175,7 @@ - УстановитьСейчас + УстановитьИПродолжить <key>ru</key> <value>Установить и продолжить</value> @@ -190,14 +190,14 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>УстановитьСейчас</name> + <name>УстановитьИПродолжить</name> </handler> </action> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>УстановитьПозже</name> + <name>ПродолжитьБезУстановки</name> <title> <key>ru</key> <value>Продолжить без установки</value> @@ -212,14 +212,14 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>УстановитьПозже</name> + <name>ПродолжитьБезУстановки</name> </handler> </action> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>НеУстанавливать</name> + <name>БольшеНеНапоминать</name> <title> <key>ru</key> <value>Больше не напоминать</value> @@ -234,12 +234,20 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>НеУстанавливать</name> + <name>БольшеНеНапоминать</name> </handler> </action> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <parameters> + <name>ТекстПредложения</name> + <valueType> + <types>String</types> + <stringQualifiers/> + </valueType> + <keyParameter>true</keyParameter> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl index bf0739f0b..dd9972953 100644 --- a/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl +++ b/SSL/src/CommonForms/ВопросОбУстановкеРасширенияРаботыСФайлами/Module.bsl @@ -8,10 +8,20 @@ Возврат; КонецЕсли; - Если Параметры.Свойство("Сообщение") Тогда - Если Параметры.Сообщение <> Неопределено Тогда - Элементы.ДекорацияПояснение.Заголовок = Параметры.Сообщение + Символы.ПС + НСтр("ru = ' Установить?'"); - КонецЕсли; + Если Не ПустаяСтрока(Параметры.ТекстПредложения) Тогда + Элементы.ДекорацияПояснение.Заголовок = Параметры.ТекстПредложения + + Символы.ПС + + НСтр("ru = 'Установить?'"); + + ИначеЕсли Не Параметры.ВозможноПродолжениеБезУстановки Тогда + Элементы.ДекорацияПояснение.Заголовок = + НСтр("ru = 'Для выполнения действия требуется установить расширение работы с файлами. + |Установить?'"); + КонецЕсли; + + Если Не Параметры.ВозможноПродолжениеБезУстановки Тогда + Элементы.ПродолжитьБезУстановки.Заголовок = НСтр("ru = 'Отмена'"); + Элементы.БольшеНеНапоминать.Видимость = Ложь; КонецЕсли; КонецПроцедуры @@ -21,25 +31,30 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура НеУстанавливать(Команда) - Закрыть(Ложь); // не предлагать +Процедура УстановитьИПродолжить(Команда) + + Оповещение = Новый ОписаниеОповещения("УстановитьИПродолжитьЗавершение", ЭтотОбъект); + НачатьУстановкуРасширенияРаботыСФайлами(Оповещение); + КонецПроцедуры &НаКлиенте -Процедура УстановитьПозже(Команда) - Закрыть(Истина); // предлагать позже - в другом сеансе +Процедура ПродолжитьБезУстановки(Команда) + Закрыть("ПродолжитьБезУстановки"); КонецПроцедуры &НаКлиенте -Процедура УстановитьСейчас(Команда) +Процедура БольшеНеНапоминать(Команда) + Закрыть("БольшеНеПредлагать"); +КонецПроцедуры + + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура УстановитьИПродолжитьЗавершение(ДополнительныеПараметры) Экспорт - УстановитьРасширениеРаботыСФайлами(); - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если НЕ РасширениеПодключено Тогда - Закрыть(Истина); // предлагать позже - в другом сеансе - Иначе - Закрыть(Ложь); // не предлагать - КонецЕсли; + Закрыть(?(ПодключитьРасширениеРаботыСФайлами(), "БольшеНеПредлагать", "ПродолжитьБезУстановки")); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВходВОбластьДанных/Form.form b/SSL/src/CommonForms/ВходВОбластьДанных/Form.form index c983d7217..0594c6e61 100644 --- a/SSL/src/CommonForms/ВходВОбластьДанных/Form.form +++ b/SSL/src/CommonForms/ВходВОбластьДанных/Form.form @@ -13,7 +13,7 @@ </dataPath> <defaultItem>true</defaultItem> <extendedTooltip> - <name>ЗначениеРазделителяРасширеннаяПодсказка</name> + <name>ЗначениеРазделителяExtendedTooltip</name> <id>6</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -54,8 +54,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВойтиВОбластьДанныхРасширеннаяПодсказка</name> - <id>9</id> + <name>ФормаВойтиВОбластьДанныхExtendedTooltip</name> + <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -80,8 +80,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВыйтиИзОбластиДанныхРасширеннаяПодсказка</name> - <id>10</id> + <name>ФормаВыйтиИзОбластиДанныхExtendedTooltip</name> + <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -111,8 +111,8 @@ <value>Группа вход в область</value> </toolTip> <extendedTooltip> - <name>ГруппаВходВОбластьРасширеннаяПодсказка</name> - <id>8</id> + <name>ГруппаВходВОбластьExtendedTooltip</name> + <id>7</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -133,7 +133,7 @@ <horizontalAlign>Left</horizontalAlign> <autoFill>true</autoFill> </autoCommandBar> - <windowOpeningMode>LockOwner</windowOpeningMode> + <windowOpeningMode>LockWholeInterface</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoTitle>true</autoTitle> <autoUrl>true</autoUrl> diff --git a/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl b/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl index 083c2caaf..a72627080 100644 --- a/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl +++ b/SSL/src/CommonForms/ВходВОбластьДанных/Module.bsl @@ -1,3 +1,5 @@ +&НаКлиенте +Перем ОбновитьИнтерфейс; //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ @@ -5,59 +7,17 @@ &НаКлиенте Процедура ВойтиВОбластьДанных(Команда) - ОбновитьИнтерфейс = Ложь; - - ВыполнитьВходВОбластьДанных(ОбновитьИнтерфейс); - - Если ОбновитьИнтерфейс Тогда - ОбновитьИнтерфейс(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВыполнитьВходВОбластьДанных(ОбновитьИнтерфейс) - Если ОсуществленВходВОбластьДанных() Тогда - Отказ = Ложь; + ОбработкаЗавершения = Новый ОписаниеОповещения( + "ПродолжениеВходаВОбластьДанныхПослеДействийПередЗавершениемРаботыСистемы", ЭтотОбъект); + ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - - ВыйтиИзОбластиДанныхНаСервере(); - ОбновитьИнтерфейс = Истина; - СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); - + СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы(, ОбработкаЗавершения); + Иначе + ВойтиВОбластьДанныхПослеВыхода(); КонецЕсли; - Если НЕ УказаннаяОбластьДанныхЗаполнена(ОбластьДанных) Тогда - Ответ = Вопрос(НСтр("ru = 'Выбранная область данных не используется, продолжить вход?'"), - РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - ВойтиВОбластьДанныхНаСервере(ОбластьДанных); - - ОбновитьИнтерфейс = Истина; - Отказ = Ложь; - СтандартныеПодсистемыКлиент.ДействияПередНачаломРаботыСистемы(Отказ); - - Если Отказ Тогда - - ВыйтиИзОбластиДанныхНаСервере(); - ОбновитьИнтерфейс = Истина; - СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); - Возврат; - КонецЕсли; - - СтандартныеПодсистемыКлиент.ДействияПриНачалеРаботыСистемы(); - КонецПроцедуры &НаКлиенте @@ -65,17 +25,11 @@ Если ОсуществленВходВОбластьДанных() Тогда - Отказ = Ложь; + ОбработкаЗавершения = Новый ОписаниеОповещения( + "ПродолжениеВыходаИзОбластиДанныхПослеДействийПередЗавершениемРаботыСистемы", ЭтотОбъект); + ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - - ВыйтиИзОбластиДанныхНаСервере(); - СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); - ОбновитьИнтерфейс(); - + СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы(, ОбработкаЗавершения); КонецЕсли; КонецПроцедуры @@ -83,6 +37,115 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ОбновитьИнтерфейсПриНеобходимости() + + Если ОбновитьИнтерфейс Тогда + ОбновитьИнтерфейс = Ложь; + ОбновитьИнтерфейс(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПередЗавершениемРаботыСистемы(Результат, Неопределен) Экспорт + + Если Результат.Отказ Тогда + Активизировать(); + ОбновитьИнтерфейсПриНеобходимости(); + Возврат; + КонецЕсли; + + ВыйтиИзОбластиДанныхНаСервере(); + ОбновитьИнтерфейс = Истина; + СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); + + ВойтиВОбластьДанныхПослеВыхода(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВойтиВОбластьДанныхПослеВыхода() + + Если НЕ УказаннаяОбластьДанныхЗаполнена(ОбластьДанных) Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ВойтиВОбластьДанныхПослеВыхода2", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Выбранная область данных не используется, продолжить вход?'"), + РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + Возврат; + КонецЕсли; + + ВойтиВОбластьДанныхПослеВыхода2(); + +КонецПроцедуры + +&НаКлиенте +Процедура ВойтиВОбластьДанныхПослеВыхода2(Ответ = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + ОбновитьИнтерфейсПриНеобходимости(); + Возврат; + КонецЕсли; + + ВойтиВОбластьДанныхНаСервере(ОбластьДанных); + + ОбновитьИнтерфейс = Истина; + + ОбработкаЗавершения = Новый ОписаниеОповещения( + "ПродолжениеВходаВОбластьДанныхПослеДействийПередНачаломРаботыСистемы", ЭтотОбъект); + + СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы(ОбработкаЗавершения); + +КонецПроцедуры + + +&НаКлиенте +Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПередНачаломРаботыСистемы(Результат, Неопределен) Экспорт + + Если Результат.Отказ Тогда + ВыйтиИзОбластиДанныхНаСервере(); + ОбновитьИнтерфейс = Истина; + СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); + ОбновитьИнтерфейсПриНеобходимости(); + Активизировать(); + Иначе + ОбработкаЗавершения = Новый ОписаниеОповещения( + "ПродолжениеВходаВОбластьДанныхПослеДействийПриНачалеРаботыСистемы", ЭтотОбъект); + + СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы(ОбработкаЗавершения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПродолжениеВходаВОбластьДанныхПослеДействийПриНачалеРаботыСистемы(Результат, Неопределен) Экспорт + + Если Результат.Отказ Тогда + ВыйтиИзОбластиДанныхНаСервере(); + ОбновитьИнтерфейс = Истина; + СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); + КонецЕсли; + + ОбновитьИнтерфейсПриНеобходимости(); + Активизировать(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПродолжениеВыходаИзОбластиДанныхПослеДействийПередЗавершениемРаботыСистемы(Результат, Неопределен) Экспорт + + Если Результат.Отказ Тогда + Возврат; + КонецЕсли; + + ВыйтиИзОбластиДанныхНаСервере(); + ОбновитьИнтерфейс(); + СтандартныеПодсистемыКлиент.УстановитьРасширенныйЗаголовокПриложения(Истина); + + Активизировать(); + +КонецПроцедуры + + &НаСервереБезКонтекста Функция УказаннаяОбластьДанныхЗаполнена(Знач ОбластьДанных) diff --git a/SSL/src/CommonForms/ВыборДаты/Form.form b/SSL/src/CommonForms/ВыборДаты/Form.form index 11aaf7a11..c4102586e 100644 --- a/SSL/src/CommonForms/ВыборДаты/Form.form +++ b/SSL/src/CommonForms/ВыборДаты/Form.form @@ -1,20 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> <form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> - <items xsi:type="form:FormField"> + <items xsi:type="form:Decoration"> <name>ПоясняющийТекст</name> - <id>6</id> + <id>13</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> - <dataPath xsi:type="form:DataPath"> - <segments>ПоясняющийТекст</segments> - </dataPath> - <titleLocation>None</titleLocation> <extendedTooltip> <name>ПоясняющийТекстРасширеннаяПодсказка</name> - <id>11</id> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -24,21 +20,17 @@ </extendedTooltip> <contextMenu> <name>ПоясняющийТекстКонтекстноеМеню</name> - <id>7</id> + <id>14</id> <autoFill>true</autoFill> </contextMenu> - <type>LabelField</type> - <editMode>Enter</editMode> - <showInHeader>true</showInHeader> - <headerHorizontalAlign>Left</headerHorizontalAlign> - <showInFooter>true</showInFooter> - <extInfo xsi:type="form:LabelFieldExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - <height>2</height> - <autoMaxHeight>true</autoMaxHeight> - <textColor xsi:type="core:ColorRef"> - <color>Style.ПоясняющийТекст</color> - </textColor> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <textColor xsi:type="core:ColorRef"> + <color>Style.ПоясняющийТекст</color> + </textColor> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> </extInfo> </items> <items xsi:type="form:FormField"> @@ -54,8 +46,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>КалендарьРасширеннаяПодсказка</name> - <id>13</id> + <name>КалендарьExtendedTooltip</name> + <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -107,7 +99,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОКРасширеннаяПодсказка</name> + <name>ФормаОКExtendedTooltip</name> <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -133,7 +125,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОтменаРасширеннаяПодсказка</name> + <name>ФормаОтменаExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -159,7 +151,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -212,24 +204,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ПоясняющийТекст</name> - <title> - <key>ru</key> - <value>Поясняющий текст</value> - - 2 - - String - - - - true - - - true - - ОК diff --git a/SSL/src/CommonForms/ВыборДаты/Module.bsl b/SSL/src/CommonForms/ВыборДаты/Module.bsl index 5af020340..0a8ef747c 100644 --- a/SSL/src/CommonForms/ВыборДаты/Module.bsl +++ b/SSL/src/CommonForms/ВыборДаты/Module.bsl @@ -19,9 +19,14 @@ Календарь = НачальноеЗначение; - Параметры.Свойство("ПоясняющийТекст", ПоясняющийТекст); Параметры.Свойство("Заголовок", Заголовок); + Если Параметры.Свойство("ПоясняющийТекст") Тогда + Элементы.ПоясняющийТекст.Заголовок = Параметры.ПоясняющийТекст; + Иначе + Элементы.ПоясняющийТекст.Видимость = Ложь; + КонецЕсли; + КонецПроцедуры /////////////////////////////////////////////////////////////////////////////// @@ -43,7 +48,7 @@ ВыделенныеДаты = Элементы.Календарь.ВыделенныеДаты; Если ВыделенныеДаты.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Дата не выбрана.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Дата не выбрана.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form index 690c6435e..bfbb728e5 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Form.form @@ -16,7 +16,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗначокСообщенияРасширеннаяПодсказка</name> + <name>ЗначокСообщенияExtendedTooltip</name> <id>43</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -55,7 +55,7 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>СообщениеРасширеннаяПодсказка</name> + <name>СообщениеExtendedTooltip</name> <id>44</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -96,7 +96,7 @@ <value>Сообщение для пользователя</value> </toolTip> <extendedTooltip> - <name>СообщениеДляПользователяРасширеннаяПодсказка</name> + <name>СообщениеДляПользователяExtendedTooltip</name> <id>42</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -131,8 +131,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьФайлВРабочемКаталогеРасширеннаяПодсказка</name> - <id>47</id> + <name>НадписьФайлВРабочемКаталогеExtendedTooltip</name> + <id>46</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -157,7 +157,7 @@ <name>ФайлИКнопка</name> <id>19</id> <items xsi:type="form:FormField"> - <name>ИмяФайлаСПутемВРабочемКаталоге</name> + <name>ПолноеИмяФайлаВРабочемКаталоге</name> <id>1</id> <visible>true</visible> <enabled>true</enabled> @@ -165,12 +165,12 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>ИмяФайлаСПутемВРабочемКаталоге</segments> + <segments>ПолноеИмяФайлаВРабочемКаталоге</segments> </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ИмяФайлаСПутемВРабочемКаталогеРасширеннаяПодсказка</name> - <id>49</id> + <name>ПолноеИмяФайлаВРабочемКаталогеРасширеннаяПодсказка</name> + <id>48</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -179,7 +179,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ИмяФайлаСПутемВРабочемКаталогеКонтекстноеМеню</name> + <name>ПолноеИмяФайлаВРабочемКаталогеКонтекстноеМеню</name> <id>2</id> <autoFill>true</autoFill> </contextMenu> @@ -209,8 +209,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОткрытьКаталогРасширеннаяПодсказка</name> - <id>51</id> + <name>ОткрытьКаталогExtendedTooltip</name> + <id>49</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -241,8 +241,8 @@ <value>Файл и кнопка</value> </toolTip> <extendedTooltip> - <name>ФайлИКнопкаРасширеннаяПодсказка</name> - <id>48</id> + <name>ФайлИКнопкаExtendedTooltip</name> + <id>47</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -273,8 +273,8 @@ <value>Описание файла в рабочем каталоге</value> </toolTip> <extendedTooltip> - <name>ОписаниеФайлаВРабочемКаталогеРасширеннаяПодсказка</name> - <id>46</id> + <name>ОписаниеФайлаВРабочемКаталогеExtendedTooltip</name> + <id>45</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -311,8 +311,8 @@ <segments>ДатаИзмененияВРабочемКаталоге</segments> </dataPath> <extendedTooltip> - <name>ДатаИзмененияВРабочемКаталогеРасширеннаяПодсказка</name> - <id>54</id> + <name>ДатаИзмененияВРабочемКаталогеExtendedTooltip</name> + <id>52</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -354,8 +354,8 @@ <segments>ДатаИзмененияВХранилищеФайлов</segments> </dataPath> <extendedTooltip> - <name>ДатаИзмененияВХранилищеФайловРасширеннаяПодсказка</name> - <id>56</id> + <name>ДатаИзмененияВХранилищеФайловExtendedTooltip</name> + <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -400,8 +400,8 @@ </toolTip> <horizontalStretch>true</horizontalStretch> <extendedTooltip> - <name>ДатаИзмененияРасширеннаяПодсказка</name> - <id>53</id> + <name>ДатаИзмененияExtendedTooltip</name> + <id>51</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -436,8 +436,8 @@ <segments>РазмерВРабочемКаталоге</segments> </dataPath> <extendedTooltip> - <name>РазмерВРабочемКаталогеРасширеннаяПодсказка</name> - <id>59</id> + <name>РазмерВРабочемКаталогеExtendedTooltip</name> + <id>55</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -479,8 +479,8 @@ <segments>РазмерВХранилищеФайлов</segments> </dataPath> <extendedTooltip> - <name>РазмерВХранилищеФайловРасширеннаяПодсказка</name> - <id>61</id> + <name>РазмерВХранилищеФайловExtendedTooltip</name> + <id>56</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -525,8 +525,8 @@ </toolTip> <horizontalStretch>true</horizontalStretch> <extendedTooltip> - <name>РазмерРасширеннаяПодсказка</name> - <id>58</id> + <name>РазмерExtendedTooltip</name> + <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -560,8 +560,8 @@ <value>Свойства файлов</value> </toolTip> <extendedTooltip> - <name>СвойстваФайловРасширеннаяПодсказка</name> - <id>52</id> + <name>СвойстваФайловExtendedTooltip</name> + <id>50</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -592,7 +592,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОткрытьСуществующийРасширеннаяПодсказка</name> + <name>ФормаОткрытьСуществующийExtendedTooltip</name> <id>37</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -618,7 +618,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаПоместитьРасширеннаяПодсказка</name> + <name>ФормаПоместитьExtendedTooltip</name> <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -644,7 +644,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВзятьИзХранилищаРасширеннаяПодсказка</name> + <name>ФормаВзятьИзХранилищаExtendedTooltip</name> <id>39</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -670,7 +670,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаНеПомещатьРасширеннаяПодсказка</name> + <name>ФормаНеПомещатьExtendedTooltip</name> <id>40</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -697,7 +697,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ОтменитьРасширеннаяПодсказка</name> + <name>ОтменитьExtendedTooltip</name> <id>41</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -722,7 +722,7 @@ <name>ПриСозданииНаСервере</name> </handlers> <excludedCommands>Help</excludedCommands> - <windowOpeningMode>DontBlock</windowOpeningMode> + <windowOpeningMode>LockOwner</windowOpeningMode> <saveWindowSettings>true</saveWindowSettings> <autoUrl>true</autoUrl> <group>Vertical</group> @@ -732,10 +732,10 @@ <showTitle>auto</showTitle> <showCloseButton>true</showCloseButton> <attributes> - <name>ИмяФайлаСПутемВРабочемКаталоге</name> + <name>ПолноеИмяФайлаВРабочемКаталоге</name> <title> <key>ru</key> - <value>Имя файла с путем в рабочем каталоге</value> + <value>Полное имя файла в рабочем каталоге</value> 1 diff --git a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl index 7d7e99953..96b0c30bb 100644 --- a/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl +++ b/SSL/src/CommonForms/ВыборДействияПриОбнаруженииОтличийФайла/Module.bsl @@ -9,11 +9,11 @@ КонецЕсли; ЗаполнитьЗначенияСвойств( - ЭтаФорма, + ЭтотОбъект, Параметры, "ДатаИзмененияВРабочемКаталоге, |ДатаИзмененияВХранилищеФайлов, - |ИмяФайлаСПутемВРабочемКаталоге, + |ПолноеИмяФайлаВРабочемКаталоге, |РазмерВРабочемКаталоге, |РазмерВХранилищеФайлов, |Сообщение, @@ -70,7 +70,7 @@ &НаКлиенте Процедура ОткрытьКаталог(Команда) - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ИмяФайлаСПутемВРабочемКаталоге); + ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайлаВРабочемКаталоге); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокПользователи/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокПользователи/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокПользователи/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокПользователи/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокРоли/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокРоли/ExtInfo/ListSettings.dcss index 1dad03ad2..79c7f6c09 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокРоли/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Attributes/СписокРоли/ExtInfo/ListSettings.dcss @@ -39,4 +39,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form index 815391154..bbe4a2e17 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Form.form @@ -23,7 +23,7 @@ Командная панель пользователи - КоманднаяПанельПользователиРасширеннаяПодсказка + КоманднаяПанельПользователиExtendedTooltip 58 Label true @@ -70,8 +70,8 @@ true - НаименованиеРасширеннаяПодсказка - 69 + НаименованиеExtendedTooltip + 60 Label true true @@ -108,10 +108,10 @@ СписокПользователиСтрокаПоиска - 60 + 65 СписокПользователиСтрокаПоискаРасширеннаяПодсказка - 62 + 67 Label true true @@ -121,7 +121,7 @@ СписокПользователиСтрокаПоискаКонтекстноеМеню - 61 + 66 true СписокПользователи @@ -131,10 +131,10 @@ СписокПользователиСостояниеПросмотра - 63 + 68 СписокПользователиСостояниеПросмотраРасширеннаяПодсказка - 65 + 70 Label true true @@ -144,7 +144,7 @@ СписокПользователиСостояниеПросмотраКонтекстноеМеню - 64 + 69 true ViewStatusAddition @@ -155,10 +155,10 @@ СписокПользователиУправлениеПоиском - 66 + 71 СписокПользователиУправлениеПоискомРасширеннаяПодсказка - 68 + 73 Label true true @@ -168,7 +168,7 @@ СписокПользователиУправлениеПоискомКонтекстноеМеню - 67 + 72 true SearchControlAddition @@ -178,7 +178,7 @@ - СписокПользователиРасширеннаяПодсказка + СписокПользователиExtendedTooltip 59 Label true @@ -249,7 +249,7 @@ Пользователи - ПользователиРасширеннаяПодсказка + ПользователиExtendedTooltip 57 Label true @@ -298,8 +298,8 @@ СписокРоли.Description - НаименованиеРолиРасширеннаяПодсказка - 90 + НаименованиеРолиExtendedTooltip + 63 Label true true @@ -334,10 +334,10 @@ СписокРолиСтрокаПоиска - 81 + 83 СписокРолиСтрокаПоискаРасширеннаяПодсказка - 83 + 85 Label true true @@ -347,7 +347,7 @@ СписокРолиСтрокаПоискаКонтекстноеМеню - 82 + 84 true СписокРоли @@ -357,10 +357,10 @@ СписокРолиСостояниеПросмотра - 84 + 86 СписокРолиСостояниеПросмотраРасширеннаяПодсказка - 86 + 88 Label true true @@ -370,7 +370,7 @@ СписокРолиСостояниеПросмотраКонтекстноеМеню - 85 + 87 true ViewStatusAddition @@ -381,10 +381,10 @@ СписокРолиУправлениеПоиском - 87 + 89 СписокРолиУправлениеПоискомРасширеннаяПодсказка - 89 + 91 Label true true @@ -394,7 +394,7 @@ СписокРолиУправлениеПоискомКонтекстноеМеню - 88 + 90 true SearchControlAddition @@ -404,8 +404,8 @@ - СписокРолиРасширеннаяПодсказка - 80 + СписокРолиExtendedTooltip + 62 Label true true @@ -470,8 +470,8 @@ Left - СписокРолиКомментарийРасширеннаяПодсказка - 100 + СписокРолиКомментарийExtendedTooltip + 64 Label true true @@ -514,8 +514,8 @@ Роли - РолиРасширеннаяПодсказка - 79 + РолиExtendedTooltip + 61 Label true true @@ -543,7 +543,7 @@ Страницы - СтраницыРасширеннаяПодсказка + СтраницыExtendedTooltip 56 Label true @@ -571,7 +571,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 55 Label true diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Help/ru.html b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Help/ru.html index d7b5c3058..5e4c89706 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Help/ru.html +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

            См. также: Общая информация о формах.

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl index 8d7fc028e..5390ee1f7 100644 --- a/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl +++ b/SSL/src/CommonForms/ВыборИсполнителяБизнесПроцесса/Module.bsl @@ -90,7 +90,7 @@ ПараметрыФормы.Вставить("ОсновнойОбъектАдресации", Неопределено); ПараметрыФормы.Вставить("ДополнительныйОбъектАдресации", Неопределено); ПараметрыФормы.Вставить("ВыборОбъектаАдресации", Истина); - ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборРолиИсполнителя", ПараметрыФормы, ЭтотОбъект); Иначе ВыбранноеЗначение = Новый Структура("РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации", ТекущиеДанные.Ссылка, Неопределено, Неопределено); ОповеститьОВыборе(ВыбранноеЗначение); diff --git a/SSL/src/CommonForms/ВыборКонтакта/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ВыборКонтакта/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ВыборКонтакта/Attributes/ГруппыПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ВыборКонтакта/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ВыборКонтакта/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ВыборКонтакта/Attributes/СписокПользователей/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ВыборКонтакта/Form.form b/SSL/src/CommonForms/ВыборКонтакта/Form.form index 0cacf12ee..a8aff44bc 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Form.form +++ b/SSL/src/CommonForms/ВыборКонтакта/Form.form @@ -26,7 +26,7 @@ ВариантыПоискаПриИзменении - ВариантыПоискаРасширеннаяПодсказка + ВариантыПоискаExtendedTooltip 109 Label true @@ -70,8 +70,8 @@ None - СтрокаПоискаРасширеннаяПодсказка - 111 + СтрокаПоискаExtendedTooltip + 110 Label true true @@ -108,8 +108,8 @@ false - КомандаНайтиРасширеннаяПодсказка - 113 + КомандаНайтиExtendedTooltip + 111 Label true true @@ -140,7 +140,7 @@ Группа строка поиска - ГруппаСтрокаПоискаРасширеннаяПодсказка + ГруппаСтрокаПоискаExtendedTooltip 108 Label true @@ -187,8 +187,8 @@ НайденныеКонтакты.НаименованиеКонтакта - КонтактРасширеннаяПодсказка - 125 + КонтактExtendedTooltip + 114 Label true true @@ -227,8 +227,8 @@ НайденныеКонтакты.Представление - ПредставлениеРасширеннаяПодсказка - 127 + ПредставлениеExtendedTooltip + 115 Label true true @@ -269,10 +269,10 @@ НайденныеКонтактыСтрокаПоиска - 116 + 130 НайденныеКонтактыСтрокаПоискаРасширеннаяПодсказка - 118 + 132 Label true true @@ -282,7 +282,7 @@ НайденныеКонтактыСтрокаПоискаКонтекстноеМеню - 117 + 131 true НайденныеКонтакты @@ -292,10 +292,10 @@ НайденныеКонтактыСостояниеПросмотра - 119 + 133 НайденныеКонтактыСостояниеПросмотраРасширеннаяПодсказка - 121 + 135 Label true true @@ -305,7 +305,7 @@ НайденныеКонтактыСостояниеПросмотраКонтекстноеМеню - 120 + 134 true ViewStatusAddition @@ -316,10 +316,10 @@ НайденныеКонтактыУправлениеПоиском - 122 + 136 НайденныеКонтактыУправлениеПоискомРасширеннаяПодсказка - 124 + 138 Label true true @@ -329,7 +329,7 @@ НайденныеКонтактыУправлениеПоискомКонтекстноеМеню - 123 + 137 true SearchControlAddition @@ -339,8 +339,8 @@ - НайденныеКонтактыРасширеннаяПодсказка - 115 + НайденныеКонтактыExtendedTooltip + 113 Label true true @@ -361,8 +361,8 @@ false - НайтиВСпискеИзСпискаНайденныхРасширеннаяПодсказка - 114 + НайтиВСпискеИзСпискаНайденныхExtendedTooltip + 112 Label true true @@ -418,8 +418,8 @@ None - ИнформацияОбАктуальностиИндексаППДРасширеннаяПодсказка - 138 + ИнформацияОбАктуальностиИндексаППДExtendedTooltip + 117 Label true true @@ -453,8 +453,8 @@ false - КомандаОбновитьИндексППДРасширеннаяПодсказка - 140 + КомандаОбновитьИндексППДExtendedTooltip + 118 Label true true @@ -485,8 +485,8 @@ Группа по строке - ГруппаПоСтрокеРасширеннаяПодсказка - 137 + ГруппаПоСтрокеExtendedTooltip + 116 Label true true @@ -517,7 +517,7 @@ Страница поиск контактов - СтраницаПоискКонтактовРасширеннаяПодсказка + СтраницаПоискКонтактовExtendedTooltip 107 Label true @@ -560,8 +560,8 @@ КонтактыПоПредмету.ПредставлениеНаименования - ПредставлениеНаименованияРасширеннаяПодсказка - 153 + ПредставлениеНаименованияExtendedTooltip + 122 Label true true @@ -600,10 +600,10 @@ КонтактыПоПредметуСтрокаПоиска - 144 + 150 КонтактыПоПредметуСтрокаПоискаРасширеннаяПодсказка - 146 + 152 Label true true @@ -613,7 +613,7 @@ КонтактыПоПредметуСтрокаПоискаКонтекстноеМеню - 145 + 151 true КонтактыПоПредмету @@ -623,10 +623,10 @@ КонтактыПоПредметуСостояниеПросмотра - 147 + 153 КонтактыПоПредметуСостояниеПросмотраРасширеннаяПодсказка - 149 + 155 Label true true @@ -636,7 +636,7 @@ КонтактыПоПредметуСостояниеПросмотраКонтекстноеМеню - 148 + 154 true ViewStatusAddition @@ -647,10 +647,10 @@ КонтактыПоПредметуУправлениеПоиском - 150 + 156 КонтактыПоПредметуУправлениеПоискомРасширеннаяПодсказка - 152 + 158 Label true true @@ -660,7 +660,7 @@ КонтактыПоПредметуУправлениеПоискомКонтекстноеМеню - 151 + 157 true SearchControlAddition @@ -670,8 +670,8 @@ - КонтактыПоПредметуРасширеннаяПодсказка - 143 + КонтактыПоПредметуExtendedTooltip + 121 Label true true @@ -692,8 +692,8 @@ false - НайтиВСпискеИзСпискаПредметовРасширеннаяПодсказка - 142 + НайтиВСпискеИзСпискаПредметовExtendedTooltip + 120 Label true true @@ -747,8 +747,8 @@ Страница все контакты по предмету - СтраницаВсеКонтактыПоПредметуРасширеннаяПодсказка - 141 + СтраницаВсеКонтактыПоПредметуExtendedTooltip + 119 Label true true @@ -804,8 +804,8 @@ ГруппыПользователей.Description - НаименованиеГруппыРасширеннаяПодсказка - 174 + НаименованиеГруппыExtendedTooltip + 125 Label true true @@ -841,32 +841,9 @@ ГруппыПользователейСтрокаПоиска - 165 - - ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка - 167 - Label - true - true - - Left - - - - ГруппыПользователейСтрокаПоискаКонтекстноеМеню - 166 - true - - ГруппыПользователей - - true - - - - ГруппыПользователейСостояниеПросмотра 168 - ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка + ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка 170 Label true @@ -876,10 +853,33 @@ - ГруппыПользователейСостояниеПросмотраКонтекстноеМеню + ГруппыПользователейСтрокаПоискаКонтекстноеМеню 169 true + ГруппыПользователей + + true + + + + ГруппыПользователейСостояниеПросмотра + 171 + + ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + + ГруппыПользователейСостояниеПросмотраКонтекстноеМеню + 172 + true + ViewStatusAddition ГруппыПользователей @@ -888,10 +888,10 @@ ГруппыПользователейУправлениеПоиском - 171 + 174 ГруппыПользователейУправлениеПоискомРасширеннаяПодсказка - 173 + 176 Label true true @@ -901,7 +901,7 @@ ГруппыПользователейУправлениеПоискомКонтекстноеМеню - 172 + 175 true SearchControlAddition @@ -911,8 +911,8 @@ - ГруппыПользователейРасширеннаяПодсказка - 164 + ГруппыПользователейExtendedTooltip + 124 Label true true @@ -999,8 +999,8 @@ СписокПользователей.Ref - ПользовательРасширеннаяПодсказка - 194 + ПользовательExtendedTooltip + 127 Label true true @@ -1043,10 +1043,10 @@ СписокПользователейСтрокаПоиска - 185 + 186 СписокПользователейСтрокаПоискаРасширеннаяПодсказка - 187 + 188 Label true true @@ -1056,7 +1056,7 @@ СписокПользователейСтрокаПоискаКонтекстноеМеню - 186 + 187 true СписокПользователей @@ -1066,10 +1066,10 @@ СписокПользователейСостояниеПросмотра - 188 + 189 СписокПользователейСостояниеПросмотраРасширеннаяПодсказка - 190 + 191 Label true true @@ -1079,7 +1079,7 @@ СписокПользователейСостояниеПросмотраКонтекстноеМеню - 189 + 190 true ViewStatusAddition @@ -1090,10 +1090,10 @@ СписокПользователейУправлениеПоиском - 191 + 192 СписокПользователейУправлениеПоискомРасширеннаяПодсказка - 193 + 194 Label true true @@ -1103,7 +1103,7 @@ СписокПользователейУправлениеПоискомКонтекстноеМеню - 192 + 193 true SearchControlAddition @@ -1113,8 +1113,8 @@ - СписокПользователейРасширеннаяПодсказка - 184 + СписокПользователейExtendedTooltip + 126 Label true true @@ -1171,8 +1171,8 @@ Пользователи - СтраницаПользователейРасширеннаяПодсказка - 163 + СтраницаПользователейExtendedTooltip + 123 Label true true @@ -1200,7 +1200,7 @@ Страницы списки - СтраницыСпискиРасширеннаяПодсказка + СтраницыСпискиExtendedTooltip 106 Label true @@ -1231,7 +1231,7 @@ true - ФормаКомандаВыбратьРасширеннаяПодсказка + ФормаКомандаВыбратьExtendedTooltip 105 Label true @@ -1349,6 +1349,7 @@ 3 + CatalogRef.ФизическиеЛица CatalogRef.Пользователи @@ -1419,6 +1420,7 @@ 1 + CatalogRef.ФизическиеЛица CatalogRef.Пользователи diff --git a/SSL/src/CommonForms/ВыборКонтакта/Module.bsl b/SSL/src/CommonForms/ВыборКонтакта/Module.bsl index 3a221effb..f1c8e58ea 100644 --- a/SSL/src/CommonForms/ВыборКонтакта/Module.bsl +++ b/SSL/src/CommonForms/ВыборКонтакта/Module.bsl @@ -132,7 +132,7 @@ Процедура КомандаНайтиВыполнить() Если ПустаяСтрока(СтрокаПоиска) Тогда - Предупреждение(НСтр("ru = 'Не задана строка поиска!'")); + ПоказатьПредупреждение(, НСтр("ru = 'Не задана строка поиска!'")); Возврат; КонецЕсли; @@ -152,7 +152,7 @@ КонецЕсли; Если Не ПустаяСтрока(Результат) Тогда - Предупреждение(Результат); + ПоказатьПредупреждение(, Результат); КонецЕсли; КонецПроцедуры @@ -453,12 +453,7 @@ КонецЕсли; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяКнопки = "КнопкаВыпадающегоСписка"; - Иначе - ИмяКнопки = "КнопкаСпискаВыбора"; - КонецЕсли; - Элементы.СтрокаПоиска[ИмяКнопки] = ЭтоСписок; + Элементы.СтрокаПоиска.КнопкаВыпадающегоСписка = ЭтоСписок; Если ЭтоСписок Тогда Элементы.СтрокаПоиска.СписокВыбора.Очистить(); diff --git a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form index 61e7a5f13..122a7f257 100644 --- a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form +++ b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Form.form @@ -31,8 +31,8 @@ Список.Представление - СписокПредставлениеРасширеннаяПодсказка - 32 + СписокПредставлениеExtendedTooltip + 23 Label true true @@ -73,7 +73,7 @@ true - СписокВыбратьЗначениеРасширеннаяПодсказка + СписокВыбратьЗначениеExtendedTooltip 21 Label true @@ -99,10 +99,10 @@ СписокСтрокаПоиска - 23 + 24 СписокСтрокаПоискаРасширеннаяПодсказка - 25 + 26 Label true true @@ -112,7 +112,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 24 + 25 true Список @@ -122,10 +122,10 @@ СписокСостояниеПросмотра - 26 + 27 СписокСостояниеПросмотраРасширеннаяПодсказка - 28 + 29 Label true true @@ -135,7 +135,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 27 + 28 true ViewStatusAddition @@ -146,10 +146,10 @@ СписокУправлениеПоиском - 29 + 30 СписокУправлениеПоискомРасширеннаяПодсказка - 31 + 32 Label true true @@ -159,7 +159,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 30 + 31 true SearchControlAddition @@ -169,7 +169,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 22 Label true @@ -193,7 +193,7 @@ true - СписокКонтекстноеМенюВыбратьЗначениеРасширеннаяПодсказка + СписокКонтекстноеМенюВыбратьЗначениеExtendedTooltip 17 Label true @@ -216,7 +216,7 @@ true - СписокКонтекстноеМенюГруппа1РасширеннаяПодсказка + СписокКонтекстноеМенюГруппа1ExtendedTooltip 16 Label true @@ -236,7 +236,7 @@ true - СписокКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + СписокКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip 18 Label true @@ -262,7 +262,7 @@ true - СписокКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка + СписокКонтекстноеМенюВыделитьВсеExtendedTooltip 19 Label true @@ -288,7 +288,7 @@ true - СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + СписокКонтекстноеМенюВывестиСписокExtendedTooltip 20 Label true diff --git a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl index 8ffdeb341..62f3dae4e 100644 --- a/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовИнформационнойБазыКорреспондента/Module.bsl @@ -15,9 +15,9 @@ Если Параметры.ПараметрыВнешнегоСоединения.ТипСоединения = "ВнешнееСоединение" Тогда - СтрокаСообщенияОбОшибке = ""; - - ВнешнееСоединение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединение(Параметры.ПараметрыВнешнегоСоединения, СтрокаСообщенияОбОшибке); + Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(Параметры.ПараметрыВнешнегоСоединения); + СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; + ВнешнееСоединение = Подключение.Соединение; Если ВнешнееСоединение = Неопределено Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке,,,, Отказ); diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form index 6d7be3989..7e6509c0b 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Form.form @@ -50,8 +50,8 @@ ПометкаПриИзменении - ПометкаРасширеннаяПодсказка - 30 + ПометкаExtendedTooltip + 21 Label true true @@ -86,8 +86,8 @@ None - КартинкаРасширеннаяПодсказка - 32 + КартинкаExtendedTooltip + 22 Label true true @@ -131,8 +131,8 @@ ДеревоОбъектовМетаданных.Представление - ПредставлениеРасширеннаяПодсказка - 34 + ПредставлениеExtendedTooltip + 23 Label true true @@ -166,8 +166,8 @@ true - ГруппаРасширеннаяПодсказка - 29 + ГруппаExtendedTooltip + 20 Label true true @@ -195,10 +195,10 @@ ДеревоОбъектовМетаданныхСтрокаПоиска - 20 + 24 ДеревоОбъектовМетаданныхСтрокаПоискаРасширеннаяПодсказка - 22 + 26 Label true true @@ -208,7 +208,7 @@ ДеревоОбъектовМетаданныхСтрокаПоискаКонтекстноеМеню - 21 + 25 true ДеревоОбъектовМетаданных @@ -218,10 +218,10 @@ ДеревоОбъектовМетаданныхСостояниеПросмотра - 23 + 27 ДеревоОбъектовМетаданныхСостояниеПросмотраРасширеннаяПодсказка - 25 + 29 Label true true @@ -231,7 +231,7 @@ ДеревоОбъектовМетаданныхСостояниеПросмотраКонтекстноеМеню - 24 + 28 true ViewStatusAddition @@ -242,10 +242,10 @@ ДеревоОбъектовМетаданныхУправлениеПоиском - 26 + 30 ДеревоОбъектовМетаданныхУправлениеПоискомРасширеннаяПодсказка - 28 + 32 Label true true @@ -255,7 +255,7 @@ ДеревоОбъектовМетаданныхУправлениеПоискомКонтекстноеМеню - 27 + 31 true SearchControlAddition @@ -265,7 +265,7 @@ - ДеревоОбъектовМетаданныхРасширеннаяПодсказка + ДеревоОбъектовМетаданныхExtendedTooltip 19 Label true @@ -319,7 +319,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 16 Label true @@ -346,7 +346,7 @@ false - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 17 Label true @@ -373,7 +373,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 18 Label true @@ -652,6 +652,23 @@ true + + ТолькоПодсистемыСКИ + + <key>ru</key> + <value>Только подсистемы СКИ</value> + + 8 + + Boolean + + + true + + + true + + Выбрать diff --git a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl index 5b8c37041..88024a899 100644 --- a/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl +++ b/SSL/src/CommonForms/ВыборОбъектовМетаданных/Module.bsl @@ -52,6 +52,7 @@ Если Параметры.Свойство("ТолькоПодсистемыСКИ") И Параметры.ТолькоПодсистемыСКИ Тогда СписокПодсистем = Метаданные.Подсистемы; ЗаполнитьСписокПодсистем(СписокПодсистем); + ТолькоПодсистемыСКИ = Истина; КонецЕсли; Если Параметры.Свойство("ВыборЕдинственного", ВыборЕдинственного) И ВыборЕдинственного Тогда @@ -71,8 +72,8 @@ Элементы.ДеревоОбъектовМетаданных.НачальноеОтображениеДерева = НачальноеОтображениеДерева.РаскрыватьВсеУровни; КонецЕсли; - НачальнаяПометкаКоллекций(); - + НачальнаяПометкаКоллекций(ДеревоОбъектовМетаданных); + КонецПроцедуры &НаКлиенте @@ -431,21 +432,17 @@ Возврат; КонецЕсли; - Если НЕ Родитель.ЭтоОбъектМетаданных Тогда - - ЭлементыРодителя = Родитель.ПолучитьЭлементы(); - Если ЭлементыРодителя.Количество() = 0 Тогда - Родитель.Пометка = 0; - ИначеЕсли Элемент.Пометка = 2 Тогда - Родитель.Пометка = 2; - Иначе - Родитель.Пометка = ЗначениеПометкиЭлементов(ЭлементыРодителя); - КонецЕсли; - + ЭлементыРодителя = Родитель.ПолучитьЭлементы(); + Если ЭлементыРодителя.Количество() = 0 Тогда + Родитель.Пометка = 0; + ИначеЕсли Элемент.Пометка = 2 Тогда + Родитель.Пометка = 2; + Иначе + Родитель.Пометка = ЗначениеПометкиЭлементов(ЭлементыРодителя); КонецЕсли; ПометитьЭлементыРодителей(Родитель); - + КонецПроцедуры &НаКлиенте @@ -474,7 +471,19 @@ КонецЕсли; КонецЦикла; - Возврат ?(ЕстьПомеченные И ЕстьНепомеченные, 2, ?(ЕстьПомеченные, 1, 0)); + Если ЕстьПомеченные Тогда + Если ЕстьНепомеченные Тогда + Возврат 2; + Иначе + Если ТолькоПодсистемыСКИ Тогда + Возврат 2; + Иначе + Возврат 1; + КонецЕсли; + КонецЕсли; + Иначе + Возврат 0; + КонецЕсли; КонецФункции @@ -487,17 +496,13 @@ Возврат; КонецЕсли; - Если НЕ Родитель.ЭтоОбъектМетаданных Тогда - - ЭлементыРодителя = Родитель.ПолучитьЭлементы(); - Если ЭлементыРодителя.Количество() = 0 Тогда - Родитель.Пометка = 0; - ИначеЕсли Элемент.Пометка = 2 Тогда - Родитель.Пометка = 2; - Иначе - Родитель.Пометка = ЗначениеПометкиЭлементовНаСервере(ЭлементыРодителя); - КонецЕсли; - + ЭлементыРодителя = Родитель.ПолучитьЭлементы(); + Если ЭлементыРодителя.Количество() = 0 Тогда + Родитель.Пометка = 0; + ИначеЕсли Элемент.Пометка = 2 Тогда + Родитель.Пометка = 2; + Иначе + Родитель.Пометка = ЗначениеПометкиЭлементовНаСервере(ЭлементыРодителя); КонецЕсли; ПометитьЭлементыРодителейНаСервере(Родитель); @@ -534,7 +539,6 @@ КонецФункции - // Процедура НачальнаяПометкаКоллекций устанавливает пометку для коллекций // объектов метаданных, которые не имеют объектов метаданных (истина) и // которые имеют объекты метаданных с заданной пометкой. @@ -542,29 +546,17 @@ // Параметры: // Элемент - ДанныеФормыКоллекцияЭлементовДерева // -&НаСервере -Процедура НачальнаяПометкаКоллекций(Родитель = Неопределено) - - Если Родитель = Неопределено Тогда - Родитель = ДеревоОбъектовМетаданных.ПолучитьЭлементы()[0]; - КонецЕсли; +Процедура НачальнаяПометкаКоллекций(Родитель) - Если НЕ Родитель.ЭтоОбъектМетаданных Тогда - - ВложенныеЭлементы = Родитель.ПолучитьЭлементы(); + ВложенныеЭлементы = Родитель.ПолучитьЭлементы(); - Если ВложенныеЭлементы.Количество() = 0 Тогда - Родитель.Пометка = 0; - ИначеЕсли ВложенныеЭлементы[0].ЭтоОбъектМетаданных Тогда - ПометитьЭлементыРодителейНаСервере(ВложенныеЭлементы[0]); - Иначе - Для каждого ВложенныйЭлемент ИЗ ВложенныеЭлементы Цикл - НачальнаяПометкаКоллекций(ВложенныйЭлемент); - КонецЦикла; + Для каждого ВложенныйЭлемент ИЗ ВложенныеЭлементы Цикл + Если ВложенныйЭлемент.Пометка Тогда + ПометитьЭлементыРодителейНаСервере(ВложенныйЭлемент); КонецЕсли; - - КонецЕсли; - + НачальнаяПометкаКоллекций(ВложенныйЭлемент); + КонецЦикла; + КонецПроцедуры // Процедура рекурсивно устанавливает/снимает пометку для вложенных элементов начиная @@ -584,7 +576,9 @@ КонецЕсли; Иначе Для Каждого ВложенныйЭлемент ИЗ ВложенныеЭлементы Цикл - ВложенныйЭлемент.Пометка = Элемент.Пометка; + Если Не ТолькоПодсистемыСКИ Тогда + ВложенныйЭлемент.Пометка = Элемент.Пометка; + КонецЕсли; ПометитьВложенныеЭлементы(ВложенныйЭлемент); КонецЦикла; КонецЕсли; @@ -605,7 +599,7 @@ КоллекцияЭлементов = Родитель.ПолучитьЭлементы(); Для каждого Элемент ИЗ КоллекцияЭлементов Цикл - Если Элемент.Пометка И НЕ ПустаяСтрока(Элемент.ПолноеИмя) Тогда + Если Элемент.Пометка = 1 И НЕ ПустаяСтрока(Элемент.ПолноеИмя) Тогда ВыбранныеОбъектыМетаданных.Добавить(Элемент.ПолноеИмя); КонецЕсли; ПолучениеДанных(Элемент); diff --git a/SSL/src/CommonForms/ВыборПодписей/Form.form b/SSL/src/CommonForms/ВыборПодписей/Form.form index 06150c26c..ef39d055e 100644 --- a/SSL/src/CommonForms/ВыборПодписей/Form.form +++ b/SSL/src/CommonForms/ВыборПодписей/Form.form @@ -36,8 +36,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ТаблицаПодписейПометкаРасширеннаяПодсказка</name> - <id>76</id> + <name>ТаблицаПодписейПометкаExtendedTooltip</name> + <id>67</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -69,8 +69,8 @@ <segments>ТаблицаПодписей.КомуВыданСертификат</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейАвторПодписиРасширеннаяПодсказка</name> - <id>78</id> + <name>ТаблицаПодписейАвторПодписиExtendedTooltip</name> + <id>68</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -110,8 +110,8 @@ <segments>ТаблицаПодписей.ДатаПодписи</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейДатаПодписиРасширеннаяПодсказка</name> - <id>80</id> + <name>ТаблицаПодписейДатаПодписиExtendedTooltip</name> + <id>69</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -151,8 +151,8 @@ <segments>ТаблицаПодписей.Комментарий</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейКомментарийРасширеннаяПодсказка</name> - <id>82</id> + <name>ТаблицаПодписейКомментарийExtendedTooltip</name> + <id>70</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -189,10 +189,10 @@ </autoCommandBar> <searchStringAddition> <name>ТаблицаПодписейСтрокаПоиска</name> - <id>67</id> + <id>72</id> <extendedTooltip> <name>ТаблицаПодписейСтрокаПоискаРасширеннаяПодсказка</name> - <id>69</id> + <id>74</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -202,7 +202,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейСтрокаПоискаКонтекстноеМеню</name> - <id>68</id> + <id>73</id> <autoFill>true</autoFill> </contextMenu> <source>ТаблицаПодписей</source> @@ -212,10 +212,10 @@ </searchStringAddition> <viewStatusAddition> <name>ТаблицаПодписейСостояниеПросмотра</name> - <id>70</id> + <id>75</id> <extendedTooltip> <name>ТаблицаПодписейСостояниеПросмотраРасширеннаяПодсказка</name> - <id>72</id> + <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -225,7 +225,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейСостояниеПросмотраКонтекстноеМеню</name> - <id>71</id> + <id>76</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -236,10 +236,10 @@ </viewStatusAddition> <searchControlAddition> <name>ТаблицаПодписейУправлениеПоиском</name> - <id>73</id> + <id>78</id> <extendedTooltip> <name>ТаблицаПодписейУправлениеПоискомРасширеннаяПодсказка</name> - <id>75</id> + <id>80</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -249,7 +249,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейУправлениеПоискомКонтекстноеМеню</name> - <id>74</id> + <id>79</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -259,7 +259,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ТаблицаПодписейРасширеннаяПодсказка</name> + <name>ТаблицаПодписейExtendedTooltip</name> <id>66</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -312,8 +312,8 @@ </dataPath> <titleLocation>Right</titleLocation> <extendedTooltip> - <name>БольшеНеСпрашиватьРасширеннаяПодсказка</name> - <id>92</id> + <name>БольшеНеСпрашиватьExtendedTooltip</name> + <id>71</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -347,7 +347,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОКРасширеннаяПодсказка</name> + <name>ФормаОКExtendedTooltip</name> <id>64</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -356,7 +356,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ОК</commandName> + <commandName>Form.Command.Выбрать</commandName> <representation>Auto</representation> <defaultButton>true</defaultButton> <autoMaxWidth>true</autoMaxWidth> @@ -373,7 +373,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОтменаРасширеннаяПодсказка</name> + <name>ФормаОтменаExtendedTooltip</name> <id>65</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -646,7 +646,7 @@ 3 - EnumRef.ДействияПриСохраненииСЭЦП + EnumRef.ДействияПриСохраненииСЭП true @@ -656,22 +656,22 @@ - ОК + Выбрать <key>ru</key> - <value>ОК</value> + <value>Выбрать</value> 1 ru - ОК + Выбрать подпись true - ОК + ВыбратьПодпись Auto diff --git a/SSL/src/CommonForms/ВыборПодписей/Help/ru.html b/SSL/src/CommonForms/ВыборПодписей/Help/ru.html index 1da52152e..4f123b663 100644 --- a/SSL/src/CommonForms/ВыборПодписей/Help/ru.html +++ b/SSL/src/CommonForms/ВыборПодписей/Help/ru.html @@ -1,9 +1,9 @@ - +

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

            -

            При выполнении команды "Сохранить с ЭП", если персональная настройка "Действия при сохранении с ЭП" установлена в "Спрашивать", открывается данная форма.

            +

            При выполнении команды "Сохранить с ЭП", если персональная настройка "Действия при сохранении с ЭП" установлена в "Спрашивать", открывается данная форма.

            Установите флажки для подписей, которые надо сохранить вместе с файлом, и нажмите "OK".

            Чтобы не видеть эту форму и всегда сохранять все подписи, установите галочку "Больше не спрашивать".

             

            См. также:

            -

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file +

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборПодписей/Module.bsl b/SSL/src/CommonForms/ВыборПодписей/Module.bsl index ed4fd4e5f..05410695f 100644 --- a/SSL/src/CommonForms/ВыборПодписей/Module.bsl +++ b/SSL/src/CommonForms/ВыборПодписей/Module.bsl @@ -9,7 +9,7 @@ КонецЕсли; Если Параметры.Свойство("Объект") Тогда - Если Параметры.Объект.ПодписанЭЦП Тогда + Если Параметры.Объект.ПодписанЭП Тогда ЗаполнитьСписокПодписейОдногоОбъекта(Параметры.Объект, Параметры.УникальныйИдентификатор); КонецЕсли; КонецЕсли; @@ -19,7 +19,7 @@ КонецЕсли; БольшеНеСпрашивать = Ложь; - СохранятьВсеПодписи = Перечисления.ДействияПриСохраненииСЭЦП.СохранятьВсеПодписи; + СохранятьВсеПодписи = Перечисления.ДействияПриСохраненииСЭП.СохранятьВсеПодписи; КонецПроцедуры @@ -27,7 +27,7 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) +Процедура ВыбратьПодпись(Команда) МассивВозврата = Новый Массив; @@ -42,7 +42,7 @@ КонецЦикла; Если БольшеНеСпрашивать Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ЭЦП", "ДействияПриСохраненииСЭЦП", СохранятьВсеПодписи); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ЭЦП", "ДействияПриСохраненииСЭП", СохранятьВсеПодписи); ОбновитьПовторноИспользуемыеЗначения(); КонецЕсли; @@ -56,23 +56,23 @@ &НаСервере Процедура ЗаполнитьСписокПодписейОдногоОбъекта(ОбъектСсылка, УникальныйИдентификаторВызывающейФормы) - ПолноеИмяОбъектаСЭЦП = ОбъектСсылка.Метаданные().ПолноеИмя(); + ПолноеИмяОбъектаСЭП = ОбъектСсылка.Метаданные().ПолноеИмя(); ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ЭлектронныеЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, - | ЭлектронныеЦифровыеПодписи.ДатаПодписи КАК ДатаПодписи, - | ЭлектронныеЦифровыеПодписи.Комментарий КАК Комментарий, - | ЭлектронныеЦифровыеПодписи.Подпись КАК Подпись, - | ЭлектронныеЦифровыеПодписи.Отпечаток КАК Отпечаток, - | ЭлектронныеЦифровыеПодписи.УстановившийПодпись КАК УстановившийПодпись, - | ЭлектронныеЦифровыеПодписи.НомерСтроки КАК НомерСтроки, - | ЭлектронныеЦифровыеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи + | ЭлектронныеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронныеПодписи.ДатаПодписи КАК ДатаПодписи, + | ЭлектронныеПодписи.Комментарий КАК Комментарий, + | ЭлектронныеПодписи.Подпись КАК Подпись, + | ЭлектронныеПодписи.Отпечаток КАК Отпечаток, + | ЭлектронныеПодписи.УстановившийПодпись КАК УстановившийПодпись, + | ЭлектронныеПодписи.НомерСтроки КАК НомерСтроки, + | ЭлектронныеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи |ИЗ - | [ПолноеИмяОбъектаСЭЦП].ЭлектронныеЦифровыеПодписи КАК ЭлектронныеЦифровыеПодписи + | [ПолноеИмяОбъектаСЭП].ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | ЭлектронныеЦифровыеПодписи.Ссылка = &СсылкаНаОбъект"; + | ЭлектронныеПодписи.Ссылка = &СсылкаНаОбъект"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъектаСЭЦП]", ПолноеИмяОбъектаСЭЦП); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъектаСЭП]", ПолноеИмяОбъектаСЭП); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; Запрос.Параметры.Вставить("СсылкаНаОбъект", ОбъектСсылка); diff --git a/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Form.form b/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Form.form index 79f895411..942c6a52d 100644 --- a/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Form.form +++ b/SSL/src/CommonForms/ВыборПрисоединенныхФайлов/Form.form @@ -102,7 +102,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 20 Label true @@ -123,7 +123,7 @@ true - СписокКонтекстноеМенюВыбратьРасширеннаяПодсказка + СписокКонтекстноеМенюВыбратьExtendedTooltip 16 Label true @@ -149,7 +149,7 @@ true - СписокКонтекстноеМенюНайтиРасширеннаяПодсказка + СписокКонтекстноеМенюНайтиExtendedTooltip 17 Label true @@ -175,7 +175,7 @@ true - СписокКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка + СписокКонтекстноеМенюОтменитьПоискExtendedTooltip 18 Label true @@ -201,7 +201,7 @@ true - СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + СписокКонтекстноеМенюВывестиСписокExtendedTooltip 19 Label true @@ -267,7 +267,7 @@ true - ФормаСтандартнаяКомандаВыбратьРасширеннаяПодсказка + ФормаСтандартнаяКомандаВыбратьExtendedTooltip 12 Label true @@ -293,7 +293,7 @@ true - ФормаСтандартнаяКомандаСвойстваОбъектаРасширеннаяПодсказка + ФормаСтандартнаяКомандаСвойстваОбъектаExtendedTooltip 13 Label true @@ -319,7 +319,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 14 Label true @@ -345,7 +345,7 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка + ФормаИзменитьФормуExtendedTooltip 15 Label true diff --git a/SSL/src/CommonForms/ВыборПроизвольногоПериода/Form.form b/SSL/src/CommonForms/ВыборПроизвольногоПериода/Form.form index 82fcba7be..427fd4b34 100644 --- a/SSL/src/CommonForms/ВыборПроизвольногоПериода/Form.form +++ b/SSL/src/CommonForms/ВыборПроизвольногоПериода/Form.form @@ -12,7 +12,7 @@ НачалоПериода - НачалоПериодаРасширеннаяПодсказка + НачалоПериодаExtendedTooltip 15 Label true @@ -53,8 +53,8 @@ КонецПериода - КонецПериодаРасширеннаяПодсказка - 17 + КонецПериодаExtendedTooltip + 16 Label true true @@ -97,7 +97,7 @@ false - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 13 Label true @@ -123,7 +123,7 @@ false - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 14 Label true diff --git a/SSL/src/CommonForms/ВыборПроизвольногоПериода/Module.bsl b/SSL/src/CommonForms/ВыборПроизвольногоПериода/Module.bsl index 4d3e5ac77..8496be7f0 100644 --- a/SSL/src/CommonForms/ВыборПроизвольногоПериода/Module.bsl +++ b/SSL/src/CommonForms/ВыборПроизвольногоПериода/Module.bsl @@ -31,7 +31,7 @@ КонецЕсли; РезультатВыбора = Новый Структура("НачалоПериода, КонецПериода, ИмяЭлемента"); - ЗаполнитьЗначенияСвойств(РезультатВыбора, ЭтаФорма); + ЗаполнитьЗначенияСвойств(РезультатВыбора, ЭтотОбъект); ОповеститьОВыборе(РезультатВыбора); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form index 30ffe5328..52601ac20 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Form.form @@ -24,7 +24,7 @@ Top - ПутьКАрхивуWindowsРасширеннаяПодсказка + ПутьКАрхивуWindowsExtendedTooltip 9 Label true @@ -75,8 +75,8 @@ Top - ПутьКАрхивуLinuxРасширеннаяПодсказка - 11 + ПутьКАрхивуLinuxExtendedTooltip + 10 Label true true @@ -118,7 +118,7 @@ Группа путь файловой базы - ГруппаПутьФайловойБазыРасширеннаяПодсказка + ГруппаПутьФайловойБазыExtendedTooltip 8 Label true @@ -154,7 +154,7 @@ false - РазместитьРасширеннаяПодсказка + РазместитьExtendedTooltip 7 Label true diff --git a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl index 87bc950bd..c50ccc9c4 100644 --- a/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl +++ b/SSL/src/CommonForms/ВыборПутиКАрхивуФайловТомов/Module.bsl @@ -25,22 +25,22 @@ СтандартнаяОбработка = Ложь; Если Не ПодключитьРасширениеРаботыСФайлами() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); Возврат; КонецЕсли; Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = НСтр("ru = 'Выберите файл'"); - Диалог.ПолноеИмяФайла = ?(ЭтаФорма.ПутьКАрхивуWindows = "", "files.zip", ЭтаФорма.ПутьКАрхивуWindows); + Диалог.ПолноеИмяФайла = ?(ЭтотОбъект.ПутьКАрхивуWindows = "", "files.zip", ЭтотОбъект.ПутьКАрхивуWindows); Диалог.МножественныйВыбор = Ложь; Диалог.ПредварительныйПросмотр = Ложь; Диалог.ПроверятьСуществованиеФайла = Истина; - Диалог.Фильтр = "Архивы zip(*.zip)|*.zip"; + Диалог.Фильтр = НСтр("ru = 'Архивы zip(*.zip)|*.zip'"); Если Диалог.Выбрать() Тогда - ЭтаФорма.ПутьКАрхивуWindows = Диалог.ПолноеИмяФайла; + ЭтотОбъект.ПутьКАрхивуWindows = Диалог.ПолноеИмяФайла; КонецЕсли; @@ -82,8 +82,9 @@ ДобавитьФайлыВТома(); - Предупреждение(НСтр("ru = 'Размещение файлов из архива с файлами - |начального образа успешно завершено.'")); + ТекстОповещения = НСтр("ru = 'Размещение файлов из архива с файлами + |начального образа успешно завершено.'"); + ПоказатьОповещениеПользователя(ТекстОповещения); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form index 664d7f29b..033d0749b 100644 --- a/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form +++ b/SSL/src/CommonForms/ВыборРолиИсполнителя/Form.form @@ -16,7 +16,7 @@ ИсполнительПриИзменении - РольРасширеннаяПодсказка + РольExtendedTooltip 21 Label true @@ -59,8 +59,8 @@ ОсновнойОбъектАдресации - ОсновнойОбъектАдресацииРасширеннаяПодсказка - 23 + ОсновнойОбъектАдресацииExtendedTooltip + 22 Label true true @@ -99,8 +99,8 @@ ДополнительныйОбъектАдресации - ДополнительныйОбъектАдресацииРасширеннаяПодсказка - 25 + ДополнительныйОбъектАдресацииExtendedTooltip + 23 Label true true @@ -140,8 +140,8 @@ true - ПояснениеРасширеннаяПодсказка - 27 + ПояснениеExtendedTooltip + 24 Label true true @@ -179,7 +179,7 @@ false - OKРасширеннаяПодсказка + OKExtendedTooltip 19 Label true @@ -206,7 +206,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 20 Label true diff --git a/SSL/src/CommonForms/ВыборСертификатовШифрования/Form.form b/SSL/src/CommonForms/ВыборСертификатовШифрования/Form.form index e6331bb15..b40aa6794 100644 --- a/SSL/src/CommonForms/ВыборСертификатовШифрования/Form.form +++ b/SSL/src/CommonForms/ВыборСертификатовШифрования/Form.form @@ -7,6 +7,10 @@ ТаблицаСертификатов 3 + + <key>ru</key> + <value>Сертификаты ЭП</value> + true true @@ -32,8 +36,8 @@ None - ТаблицаСертификатовПометкаРасширеннаяПодсказка - 36 + ТаблицаСертификатовПометкаExtendedTooltip + 27 Label true true @@ -65,8 +69,8 @@ ТаблицаСертификатов.КомуВыдан - ТаблицаСертификатовКомуВыданРасширеннаяПодсказка - 38 + ТаблицаСертификатовКомуВыданExtendedTooltip + 28 Label true true @@ -107,8 +111,8 @@ ТаблицаСертификатов.КемВыдан - ТаблицаСертификатовКемВыданРасширеннаяПодсказка - 40 + ТаблицаСертификатовКемВыданExtendedTooltip + 29 Label true true @@ -149,8 +153,8 @@ ТаблицаСертификатов.ДействителенДо - ТаблицаСертификатовДействителенДоРасширеннаяПодсказка - 42 + ТаблицаСертификатовДействителенДоExtendedTooltip + 30 Label true true @@ -191,8 +195,8 @@ ТаблицаСертификатов.Назначение - ТаблицаСертификатовНазначениеРасширеннаяПодсказка - 44 + ТаблицаСертификатовНазначениеExtendedTooltip + 31 Label true true @@ -230,10 +234,10 @@ ТаблицаСертификатовСтрокаПоиска - 27 + 32 ТаблицаСертификатовСтрокаПоискаРасширеннаяПодсказка - 29 + 34 Label true true @@ -243,7 +247,7 @@ ТаблицаСертификатовСтрокаПоискаКонтекстноеМеню - 28 + 33 true ТаблицаСертификатов @@ -253,10 +257,10 @@ ТаблицаСертификатовСостояниеПросмотра - 30 + 35 ТаблицаСертификатовСостояниеПросмотраРасширеннаяПодсказка - 32 + 37 Label true true @@ -266,7 +270,7 @@ ТаблицаСертификатовСостояниеПросмотраКонтекстноеМеню - 31 + 36 true ViewStatusAddition @@ -277,10 +281,10 @@ ТаблицаСертификатовУправлениеПоиском - 33 + 38 ТаблицаСертификатовУправлениеПоискомРасширеннаяПодсказка - 35 + 40 Label true true @@ -290,7 +294,7 @@ ТаблицаСертификатовУправлениеПоискомКонтекстноеМеню - 34 + 39 true SearchControlAddition @@ -300,7 +304,7 @@ - ТаблицаСертификатовРасширеннаяПодсказка + ТаблицаСертификатовExtendedTooltip 26 Label true @@ -321,7 +325,7 @@ true - ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатРасширеннаяПодсказка + ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатExtendedTooltip 25 Label true @@ -379,7 +383,7 @@ true - ФормаВыбратьРасширеннаяПодсказка + ФормаВыбратьExtendedTooltip 23 Label true @@ -405,7 +409,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 24 Label true @@ -429,7 +433,8 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + 75 + LockOwner true true Vertical @@ -442,7 +447,7 @@ ТаблицаСертификатов <key>ru</key> - <value>Сертификаты ЭП</value> + <value>Таблица сертификатов</value> 2 diff --git a/SSL/src/CommonForms/ВыборСертификатовШифрования/Help/ru.html b/SSL/src/CommonForms/ВыборСертификатовШифрования/Help/ru.html index 4fe60dc21..06ebcede8 100644 --- a/SSL/src/CommonForms/ВыборСертификатовШифрования/Help/ru.html +++ b/SSL/src/CommonForms/ВыборСертификатовШифрования/Help/ru.html @@ -1,8 +1,8 @@ - +

            Шифрование

            В форме выбираются сертификаты электронной подписи (ЭП) для шифрования файла.

            Для шифрования можно выбрать несколько сертификатов, установив пометки для нужных сертификатов.

             

            См. также:

            -

            Настройка ЭП и шифрования
            Персональные настройки ЭП
            Настройка программы 

            \ No newline at end of file +

            Настройка ЭП и шифрования
            Персональные настройки ЭП
            Настройка программы 

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборСертификатовШифрования/Module.bsl b/SSL/src/CommonForms/ВыборСертификатовШифрования/Module.bsl index 4b57b5459..a605827d7 100644 --- a/SSL/src/CommonForms/ВыборСертификатовШифрования/Module.bsl +++ b/SSL/src/CommonForms/ВыборСертификатовШифрования/Module.bsl @@ -43,7 +43,7 @@ НоваяСтрока.Пометка = Истина; КонецЕсли; - ЭлектроннаяЦифроваяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); + ЭлектроннаяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); КонецЦикла; @@ -66,12 +66,12 @@ Возврат; КонецЕсли; - ВыбранныйСертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + ВыбранныйСертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); Если СтруктураСертификата <> Неопределено Тогда ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, ТекущиеДанные.Отпечаток); - ОткрытьФорму("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.СертификатЭП", ПараметрыФормы, ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -85,13 +85,13 @@ МассивВозврата = Новый Массив; Для Каждого СтрокаТаблицыЗначений Из ТаблицаСертификатов Цикл Если СтрокаТаблицыЗначений.Пометка Тогда - ВыбранныйСертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаТаблицыЗначений.Отпечаток); + ВыбранныйСертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаТаблицыЗначений.Отпечаток); МассивВозврата.Добавить(ВыбранныйСертификат); КонецЕсли; КонецЦикла; Если МассивВозврата.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Не выбран ни один сертификат.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Не выбран ни один сертификат.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form index 345db516c..0e2627b74 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Form.form @@ -37,8 +37,8 @@ УзлыПлановОбмена.ПланОбменаПредставление - УзлыПлановОбменаПланОбменаПредставлениеРасширеннаяПодсказка - 40 + УзлыПлановОбменаПланОбменаПредставлениеExtendedTooltip + 31 Label true true @@ -78,8 +78,8 @@ УзлыПлановОбмена.УзелПредставление - УзлыПлановОбменаУзелПредставлениеРасширеннаяПодсказка - 42 + УзлыПлановОбменаУзелПредставлениеExtendedTooltip + 32 Label true true @@ -120,10 +120,10 @@ УзлыПлановОбменаСтрокаПоиска - 31 + 33 УзлыПлановОбменаСтрокаПоискаРасширеннаяПодсказка - 33 + 35 Label true true @@ -133,7 +133,7 @@ УзлыПлановОбменаСтрокаПоискаКонтекстноеМеню - 32 + 34 true УзлыПлановОбмена @@ -143,10 +143,10 @@ УзлыПлановОбменаСостояниеПросмотра - 34 + 36 УзлыПлановОбменаСостояниеПросмотраРасширеннаяПодсказка - 36 + 38 Label true true @@ -156,7 +156,7 @@ УзлыПлановОбменаСостояниеПросмотраКонтекстноеМеню - 35 + 37 true ViewStatusAddition @@ -167,10 +167,10 @@ УзлыПлановОбменаУправлениеПоиском - 37 + 39 УзлыПлановОбменаУправлениеПоискомРасширеннаяПодсказка - 39 + 41 Label true true @@ -180,7 +180,7 @@ УзлыПлановОбменаУправлениеПоискомКонтекстноеМеню - 38 + 40 true SearchControlAddition @@ -190,7 +190,7 @@ - УзлыПлановОбменаРасширеннаяПодсказка + УзлыПлановОбменаExtendedTooltip 30 Label true @@ -243,7 +243,7 @@ true - ФормаВыбратьРасширеннаяПодсказка + ФормаВыбратьExtendedTooltip 28 Label true @@ -273,7 +273,7 @@ Команды списка узлов - КомандыСпискаУзловРасширеннаяПодсказка + КомандыСпискаУзловExtendedTooltip 29 Label true diff --git a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl index d92378036..ca0d695a7 100644 --- a/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl +++ b/SSL/src/CommonForms/ВыборУзловПлановОбмена/Module.bsl @@ -94,7 +94,7 @@ Иначе ТекущиеДанные = Элементы.УзлыПлановОбмена.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда - Предупреждение(НСтр("ru = 'Узел не выбран.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Узел не выбран.'")); Иначе ОповеститьОВыборе(ТекущиеДанные.Узел); КонецЕсли; diff --git a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form index d23c0b540..ce6a0b2bd 100644 --- a/SSL/src/CommonForms/ВыборФорматаВложений/Form.form +++ b/SSL/src/CommonForms/ВыборФорматаВложений/Form.form @@ -38,8 +38,8 @@ ВыбранныеФорматыСохранения.Check - ВыбранныеФорматыСохраненияПометкаРасширеннаяПодсказка - 55 + ВыбранныеФорматыСохраненияПометкаExtendedTooltip + 46 Label true true @@ -71,8 +71,8 @@ ВыбранныеФорматыСохранения.Value - ВыбранныеФорматыСохраненияЗначениеРасширеннаяПодсказка - 57 + ВыбранныеФорматыСохраненияЗначениеExtendedTooltip + 47 Label true true @@ -108,10 +108,10 @@ ВыбранныеФорматыСтрокаПоиска - 46 + 50 ВыбранныеФорматыСтрокаПоискаРасширеннаяПодсказка - 48 + 52 Label true true @@ -121,7 +121,7 @@ ВыбранныеФорматыСтрокаПоискаКонтекстноеМеню - 47 + 51 true ВыбранныеФорматы @@ -131,10 +131,10 @@ ВыбранныеФорматыСостояниеПросмотра - 49 + 53 ВыбранныеФорматыСостояниеПросмотраРасширеннаяПодсказка - 51 + 55 Label true true @@ -144,7 +144,7 @@ ВыбранныеФорматыСостояниеПросмотраКонтекстноеМеню - 50 + 54 true ViewStatusAddition @@ -155,10 +155,10 @@ ВыбранныеФорматыУправлениеПоиском - 52 + 56 ВыбранныеФорматыУправлениеПоискомРасширеннаяПодсказка - 54 + 58 Label true true @@ -168,7 +168,7 @@ ВыбранныеФорматыУправлениеПоискомКонтекстноеМеню - 53 + 57 true SearchControlAddition @@ -178,7 +178,7 @@ - ВыбранныеФорматыРасширеннаяПодсказка + ВыбранныеФорматыExtendedTooltip 45 Label true @@ -233,7 +233,7 @@ Группа выбор форматов - ГруппаВыборФорматовРасширеннаяПодсказка + ГруппаВыборФорматовExtendedTooltip 44 Label true @@ -274,8 +274,8 @@ Right - УпаковатьВАрхивРасширеннаяПодсказка - 68 + УпаковатьВАрхивExtendedTooltip + 49 Label true true @@ -309,8 +309,8 @@ Группа дополнительные параметры - ГруппаДополнительныеПараметрыРасширеннаяПодсказка - 67 + ГруппаДополнительныеПараметрыExtendedTooltip + 48 Label true true @@ -344,7 +344,7 @@ false - КнопкаПрикрепитьРасширеннаяПодсказка + КнопкаПрикрепитьExtendedTooltip 42 Label true @@ -370,7 +370,7 @@ true - КнопкаОтменаРасширеннаяПодсказка + КнопкаОтменаExtendedTooltip 43 Label true @@ -405,6 +405,7 @@ Abort Close CustomizeForm + Help Ignore No OK diff --git a/SSL/src/CommonForms/ВыгрузкаДанных/Form.form b/SSL/src/CommonForms/ВыгрузкаДанных/Form.form deleted file mode 100644 index 0bb167e2e..000000000 --- a/SSL/src/CommonForms/ВыгрузкаДанных/Form.form +++ /dev/null @@ -1,561 +0,0 @@ - - - - ГруппаСтраницы - 18 - - Предупреждение - 19 - - ГруппаОповещения - 9 - - ДекорацияВнимание - 7 - - <key>ru</key> - <value>Внимание!</value> - - true - true - - true - - - ДекорацияВниманиеРасширеннаяПодсказка - 32 - Label - true - true - - Left - - - - ДекорацияВниманиеКонтекстноеМеню - 8 - true - - Label - true - true - - Left - - - - ДекорацияПредупреждение - 1 - true - true - - true - - - ДекорацияПредупреждениеРасширеннаяПодсказка - 33 - Label - true - true - - Left - - - - ДекорацияПредупреждениеКонтекстноеМеню - 2 - true - - Label - true - true - - Left - - - - ДекорацияПредупреждение1 - 16 - - <key>ru</key> - <value>Процесс выгрузки данных может занять продолжительное время.</value> - - true - true - - true - - - ДекорацияПредупреждение1РасширеннаяПодсказка - 34 - Label - true - true - - Left - - - - ДекорацияПредупреждение1КонтекстноеМеню - 17 - true - - Label - true - true - - Left - - - - ДекорацияПредупреждение2 - 12 - - <key>ru</key> - <value>Выгрузка не сможет начаться, пока другие пользователи работают с информационной базой. -Полный список пользователей работающих сейчас с информационной базой можно увидеть здесь:</value> - - true - true - - true - - - ДекорацияПредупреждение2РасширеннаяПодсказка - 35 - Label - true - true - - Left - - - - ДекорацияПредупреждение2КонтекстноеМеню - 13 - true - - Label - true - true - - Left - - - - СписокАктивныхПользователей - 27 - - <key>ru</key> - <value>Список активных пользователей</value> - - true - true - - true - - - СписокАктивныхПользователейРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - - СписокАктивныхПользователейКонтекстноеМеню - 28 - true - - Label - true - true - true - - - Click - ОткрытьФормуАктивныхПользователей - - true - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа оповещения</value> - - - ru - Группа оповещения - - - ГруппаОповещенияРасширеннаяПодсказка - 31 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаКнопки - 6 - - Продолжить - 3 - true - true - - true - - - ПродолжитьРасширеннаяПодсказка - 38 - Label - true - true - - Left - - - Form.Command.Продолжить - Auto - true - true - true - UserCmds - Auto - - - Отмена - 4 - true - true - - true - - - ОтменаРасширеннаяПодсказка - 39 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Кнопки</value> - - - ru - Группа кнопки - - - ГруппаКнопкиРасширеннаяПодсказка - 37 - Label - true - true - - Left - - - CommandBar - - Right - - - true - true - - true - - - <key>ru</key> - <value>Предупреждение</value> - - - ПредупреждениеРасширеннаяПодсказка - 30 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - Выгрузка - 20 - - ДекорацияПрогресс - 22 - - <key>ru</key> - <value>Декорация прогресс</value> - - true - true - - true - - - ДекорацияПрогрессРасширеннаяПодсказка - 41 - Label - true - true - - Left - - - - ДекорацияПрогрессКонтекстноеМеню - 23 - true - - true - true - - - CommonPicture.ДлительнаяОперация48 - - - - - ДекорацияПодготавливаетсяФайлВыгрузки - 24 - - <key>ru</key> - <value>Пожалуйста, подождите. -Выполняется подготовка файла выгрузки. Операция может занять длительное время.</value> - - true - true - - true - - - ДекорацияПодготавливаетсяФайлВыгрузкиРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - - ДекорацияПодготавливаетсяФайлВыгрузкиКонтекстноеМеню - 25 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Выгрузка</value> - - - ru - Выгрузка - - - ВыгрузкаРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Группа страницы</value> - - - ГруппаСтраницыРасширеннаяПодсказка - 29 - Label - true - true - - Left - - - Pages - - Auto - - - None - false - - ФормаКоманднаяПанель - -1 - Left - true - - - OnCreateAtServer - ПриСозданииНаСервере - - - OnClose - ПриЗакрытии - - DontBlock - true - true - Vertical - true - true - true - UseIfNecessary - auto - true - - АдресХранилища - - <key>ru</key> - <value>Адрес хранилища</value> - - 1 - - String - - - - true - - - true - - - - ИдентификаторЗадания - - <key>ru</key> - <value>Идентификатор задания</value> - - 2 - - UUID - - - true - - - true - - - - Продолжить - - <key>ru</key> - <value>Продолжить</value> - - 1 - - ru - Продолжить - - - true - - - - ВыгрузитьДанные - - - Auto - Auto - - - ОткрытьФормуАктивныхПользователей - - <key>ru</key> - <value>Открыть форму активных пользователей</value> - - 3 - - ru - Открыть форму активных пользователей - - - true - - - - ОткрытьФормуАктивныхПользователей - - - Auto - Auto - - - - - - diff --git a/SSL/src/CommonForms/ВыгрузкаДанных/Module.bsl b/SSL/src/CommonForms/ВыгрузкаДанных/Module.bsl deleted file mode 100644 index fea9e98b3..000000000 --- a/SSL/src/CommonForms/ВыгрузкаДанных/Module.bsl +++ /dev/null @@ -1,254 +0,0 @@ -&НаКлиенте -Перем ИтерацияПроверки; - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ТекстЗаголовкаФормы = НСтр("ru = 'Выгрузить данные в локальную версию'"); - ТекстСообщения = НСтр("ru = 'Данные из сервиса будут выгружены в файл для последующей их загрузки - |и использования в локальной версии.'"); - Иначе - ТекстЗаголовкаФормы = НСтр("ru = 'Выгрузить данные для перехода в сервис'"); - ТекстСообщения = НСтр("ru = 'Данные из локальной версии будут выгружены в файл для последующей их загрузки - |и использования в режиме сервиса.'"); - КонецЕсли; - Элементы.ДекорацияПредупреждение.Заголовок = ТекстСообщения; - Заголовок = ТекстЗаголовкаФормы; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаКлиенте -Процедура ОткрытьФормуАктивныхПользователей(Команда) - - ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ВыгрузитьДанные(Команда) - - Если Не ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда - - ПодготовитьВыгрузкуДанных(); - СохранитьФайлВыгрузки(); - - Иначе - - ЗапуститьВыгрузкуДанных(); - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Процедура ПодготовитьВыгрузкуДанных() - - АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); - - ВыгрузкаЗагрузкаДанных.ВыгрузитьТекущуюОбластьВоВременноеХранилище(АдресХранилища); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьФайлВыгрузки() - - НазваниеФайла = "data_dump.zip"; - - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ПолучаемыеФайлы = Новый Массив; - - ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ДиалогВыбора.Фильтр = "ZIP архив(*.zip)|*.zip"; - ДиалогВыбора.Расширение = "zip"; - ДиалогВыбора.ПолноеИмяФайла = НазваниеФайла; - - Если ДиалогВыбора.Выбрать() Тогда - ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ДиалогВыбора.ПолноеИмяФайла, АдресХранилища); - ПолучаемыеФайлы.Добавить(ОписаниеФайла); - - ПолучитьФайлы(ПолучаемыеФайлы, , , Ложь); - - КонецЕсли; - - Иначе - - ПолучитьФайл(АдресХранилища, НазваниеФайла, Истина); - - КонецЕсли; - - Закрыть(); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗапуститьВыгрузкуДанных() - - ЗапуститьВыгрузкуДанныхНаСервере(); - - Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Выгрузка; - - ИтерацияПроверки = 1; - - ПодключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки", 15); - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверитьГотовностьВыгрузки() - - Попытка - ГотовностьВыгрузки = ВыгрузкаГотова(); - Исключение - - СнятьМонопольныйРежим(); - ОтключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки"); - - ВызватьИсключение; - - КонецПопытки; - - Если ГотовностьВыгрузки Тогда - - СнятьМонопольныйРежим(); - ОтключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки"); - - СохранитьФайлВыгрузки(); - - Иначе - - ИтерацияПроверки = ИтерацияПроверки + 1; - - Если ИтерацияПроверки = 3 Тогда - ОтключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки"); - ПодключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки", 30); - ИначеЕсли ИтерацияПроверки = 4 Тогда - ОтключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки"); - ПодключитьОбработчикОжидания("ПроверитьГотовностьВыгрузки", 60); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция НайтиЗаданиеПоИдентификатору(Идентификатор) - - Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор); - - Возврат Задание; - -КонецФункции - -&НаСервере -Функция ВыгрузкаГотова() - - Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); - - Если Задание <> Неопределено - И Задание.Состояние = СостояниеФоновогоЗадания.Активно Тогда - - Возврат Ложь; - КонецЕсли; - - Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.Предупреждение; - - Если Задание = Неопределено Тогда - ВызватьИсключение(НСтр("ru = 'При подготовке выгрузки произошла ошибка - не найдено задание подготавливающее выгрузку.'")); - КонецЕсли; - - Если Задание.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда - ОшибкаЗадания = Задание.ИнформацияОбОшибке; - Если ОшибкаЗадания <> Неопределено Тогда - ВызватьИсключение(ПодробноеПредставлениеОшибки(ОшибкаЗадания)); - Иначе - ВызватьИсключение(НСтр("ru = 'При подготовке выгрузки произошла ошибка - задание подготавливающее выгрузку завершилось с неизвестной ошибкой.'")); - КонецЕсли; - ИначеЕсли Задание.Состояние = СостояниеФоновогоЗадания.Отменено Тогда - ВызватьИсключение(НСтр("ru = 'При подготовке выгрузки произошла ошибка - задание подготавливающее выгрузку было отменено администратором.'")); - Иначе - ИдентификаторЗадания = Неопределено; - Возврат Истина; - КонецЕсли; - -КонецФункции - -&НаСервере -Процедура ЗапуститьВыгрузкуДанныхНаСервере() - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбщегоНазначения.ЗаблокироватьИБ(Ложь); - КонецЕсли; - - АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); - - ПараметрыЗадания = Новый Массив; - ПараметрыЗадания.Добавить(АдресХранилища); - - Задание = ФоновыеЗадания.Выполнить("ВыгрузкаЗагрузкаДанных.ВыгрузитьТекущуюОбластьВоВременноеХранилище", - ПараметрыЗадания, - , - НСтр("ru = 'Подготовка выгрузки области данных'")); - - ИдентификаторЗадания = Задание.УникальныйИдентификатор; - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура СнятьМонопольныйРежим() - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - - Если ЗначениеЗаполнено(ИдентификаторЗадания) Тогда - ОтменитьЗаданиеПодготовки(ИдентификаторЗадания); - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ОтменитьЗаданиеПодготовки(Знач ИдентификаторЗадания) - - СнятьМонопольныйРежим(); - - Задание = НайтиЗаданиеПоИдентификатору(ИдентификаторЗадания); - Если Задание = Неопределено - ИЛИ Задание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - - Возврат; - КонецЕсли; - - Попытка - Задание.Отменить(); - Исключение - // Возможно задание как раз в этот момент закончилось и ошибки нет - ЗаписьЖурналаРегистрации(НСтр("ru = 'Отмена выполнения задания подготовки выгрузки области данных'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыгрузкаДанных/ВыгрузкаДанных.mdo b/SSL/src/CommonForms/ВыгрузкаДанных/ВыгрузкаДанных.mdo deleted file mode 100644 index 2fd724ab4..000000000 --- a/SSL/src/CommonForms/ВыгрузкаДанных/ВыгрузкаДанных.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ВыгрузкаДанных - - ru - Выгрузка данных - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonForms/ГруппыПользователей/Form.form b/SSL/src/CommonForms/ГруппыПользователей/Form.form index ad762c972..904531188 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Form.form +++ b/SSL/src/CommonForms/ГруппыПользователей/Form.form @@ -22,7 +22,7 @@ true - ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + ФормаЗаписатьИЗакрытьExtendedTooltip 30 Label true @@ -48,7 +48,7 @@ true - ФормаИсключитьИзВсехГруппРасширеннаяПодсказка + ФормаИсключитьИзВсехГруппExtendedTooltip 31 Label true @@ -74,7 +74,7 @@ true - ВывестиСписокРасширеннаяПодсказка + ВывестиСписокExtendedTooltip 32 Label true @@ -100,7 +100,7 @@ true - ИзменитьФормуРасширеннаяПодсказка + ИзменитьФормуExtendedTooltip 33 Label true @@ -126,7 +126,7 @@ true - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 34 Label true @@ -153,7 +153,7 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка + КоманднаяПанельExtendedTooltip 29 Label true @@ -205,9 +205,13 @@ ДеревоГрупп.Пометка + + OnChange + ДеревоГруппПометкаПриИзменении + - ДеревоГруппПометкаРасширеннаяПодсказка - 46 + ДеревоГруппПометкаExtendedTooltip + 37 Label true true @@ -240,8 +244,8 @@ ДеревоГрупп.Картинка - ДеревоГруппКартинкаРасширеннаяПодсказка - 48 + ДеревоГруппКартинкаExtendedTooltip + 38 Label true true @@ -286,8 +290,8 @@ ДеревоГрупп.Группа - ДеревоГруппГруппаРасширеннаяПодсказка - 50 + ДеревоГруппГруппаExtendedTooltip + 39 Label true true @@ -335,8 +339,8 @@ Группа пометка картинка - ГруппаПометкаКартинкаРасширеннаяПодсказка - 45 + ГруппаПометкаКартинкаExtendedTooltip + 36 Label true true @@ -362,10 +366,10 @@ ДеревоГруппСтрокаПоиска - 36 + 43 ДеревоГруппСтрокаПоискаРасширеннаяПодсказка - 38 + 45 Label true true @@ -375,7 +379,7 @@ ДеревоГруппСтрокаПоискаКонтекстноеМеню - 37 + 44 true ДеревоГрупп @@ -385,10 +389,10 @@ ДеревоГруппСостояниеПросмотра - 39 + 46 ДеревоГруппСостояниеПросмотраРасширеннаяПодсказка - 41 + 48 Label true true @@ -398,7 +402,7 @@ ДеревоГруппСостояниеПросмотраКонтекстноеМеню - 40 + 47 true ViewStatusAddition @@ -409,10 +413,10 @@ ДеревоГруппУправлениеПоиском - 42 + 49 ДеревоГруппУправлениеПоискомРасширеннаяПодсказка - 44 + 51 Label true true @@ -422,7 +426,7 @@ ДеревоГруппУправлениеПоискомКонтекстноеМеню - 43 + 50 true SearchControlAddition @@ -432,7 +436,7 @@ - ДеревоГруппРасширеннаяПодсказка + ДеревоГруппExtendedTooltip 35 Label true @@ -483,7 +487,7 @@ Группа - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 28 Label true @@ -514,8 +518,8 @@ true - КартинкаПредупрежденияРасширеннаяПодсказка - 61 + КартинкаПредупрежденияExtendedTooltip + 41 Label true true @@ -551,8 +555,8 @@ true - ТекстПредупрежденияРасширеннаяПодсказка - 62 + ТекстПредупрежденияExtendedTooltip + 42 Label true true @@ -583,8 +587,8 @@ Предупреждение - ПредупреждениеРасширеннаяПодсказка - 60 + ПредупреждениеExtendedTooltip + 40 Label true true @@ -607,7 +611,7 @@ Группы или предупреждение - ГруппыИлиПредупреждениеРасширеннаяПодсказка + ГруппыИлиПредупреждениеExtendedTooltip 27 Label true @@ -626,6 +630,10 @@ -1 Left + + BeforeClose + ПередЗакрытием + OnCreateAtServer ПриСозданииНаСервере diff --git a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl index 69398c457..c69281b85 100644 --- a/SSL/src/CommonForms/ГруппыПользователей/Module.bsl +++ b/SSL/src/CommonForms/ГруппыПользователей/Module.bsl @@ -25,6 +25,22 @@ КонецЕсли; КоличествоПользователей = МассивПользователей.Количество(); + ОбщегоНазначенияКлиентСервер.Проверить(КоличествоПользователей > 0, + НСтр("ru = 'Не выбрано ни одного пользователя.'")); + + ТипПользователей = Неопределено; + Для каждого ПользовательИзМассива Из МассивПользователей Цикл + Если ТипПользователей = Неопределено Тогда + ТипПользователей = ТипЗнч(ПользовательИзМассива); + КонецЕсли; + ТипПользователяИзМассива = ТипЗнч(ПользовательИзМассива); + ОбщегоНазначенияКлиентСервер.Проверить(ТипПользователяИзМассива = Тип("СправочникСсылка.Пользователи") + Или ТипПользователяИзМассива = Тип("СправочникСсылка.ВнешниеПользователи"), + НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ОбщегоНазначенияКлиентСервер.Проверить(ТипПользователей = ТипПользователяИзМассива, + НСтр("ru = 'Команда не может быть выполнена сразу для двух разных видов пользователей.'")); + КонецЦикла; + Если КоличествоПользователей > 1 И Параметры.Пользователь = Неопределено Тогда Заголовок = НСтр("ru = 'Группы пользователей'"); @@ -43,6 +59,16 @@ КонецПроцедуры +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Не РежимОткрытияИзКарточкиПользователя Тогда + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьНачало", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ДеревоГрупп @@ -50,15 +76,36 @@ Процедура ДеревоГруппВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОткрытьЗначение(Элемент.ТекущиеДанные.Группа); + ПоказатьЗначение(,Элемент.ТекущиеДанные.Группа); КонецПроцедуры +&НаКлиенте +Процедура ДеревоГруппПометкаПриИзменении(Элемент) + Модифицированность = Истина; +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) + ЗаписатьИЗакрытьНачало(); +КонецПроцедуры + +&НаКлиенте +Процедура СнятьФлажки(Команда) + + ЗаполнитьДеревоГрупп(Истина); + РазвернутьДеревоЗначений(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ЗаписатьИЗакрытьНачало(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт УведомлениеПользователя = Новый Структура; УведомлениеПользователя.Вставить("Сообщение"); @@ -80,49 +127,23 @@ ТекстВопроса = УведомлениеПользователя.Сообщение; КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='ОК'")); - КнопкиВопроса.Добавить(НСтр("ru='Показать отчет'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - Возврат; - Иначе - Отчет.Показать(НСтр("ru = 'Пользователи, не включенные в группы'")); - Возврат; - КонецЕсли; + КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьОбработкаВопроса", ЭтотОбъект, Отчет); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); Иначе - Предупреждение(УведомлениеПользователя.Сообщение); + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьОбработкаПредупреждения", ЭтотОбъект); + ПоказатьПредупреждение(Оповещение, УведомлениеПользователя.Сообщение); КонецЕсли; + Возврат; КонецЕсли; - Оповестить("РазмещениеПользователейВГруппах"); - Если ВнешниеПользователи Тогда - Оповестить("Запись_ГруппыВнешнихПользователей"); - Иначе - Оповестить("Запись_ГруппыПользователей"); - КонецЕсли; - - Если Не РежимОткрытияИзКарточкиПользователя Тогда - Закрыть(); - Иначе - ЗаполнитьДеревоГрупп(); - РазвернутьДеревоЗначений(); - КонецЕсли; + Модифицированность = Ложь; + ЗаписатьИЗакрытьЗавершение(); КонецПроцедуры -&НаКлиенте -Процедура СнятьФлажки(Команда) - - ЗаполнитьДеревоГрупп(Истина); - РазвернутьДеревоЗначений(); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаСервере Процедура ЗаполнитьДеревоГрупп(ТолькоСнятьФлажки = Ложь) @@ -133,18 +154,25 @@ Если ТолькоСнятьФлажки Тогда + БылиИзменения = Ложь; Найденные = ДеревоГруппПриемник.Строки.НайтиСтроки(Новый Структура("Пометка", 1), Истина); Для Каждого СтрокаДерева Из Найденные Цикл Если Не СтрокаДерева.ГруппаНеИзменяется Тогда СтрокаДерева.Пометка = 0; + БылиИзменения = Истина; КонецЕсли; КонецЦикла; Найденные = ДеревоГруппПриемник.Строки.НайтиСтроки(Новый Структура("Пометка", 2), Истина); Для Каждого СтрокаДерева Из Найденные Цикл СтрокаДерева.Пометка = 0; + БылиИзменения = Истина; КонецЦикла; + Если БылиИзменения Тогда + Модифицированность = Истина; + КонецЕсли; + ЗначениеВРеквизитФормы(ДеревоГруппПриемник, "ДеревоГрупп"); Возврат; КонецЕсли; @@ -398,7 +426,7 @@ |т.к. у них различается тип или у групп установлен признак ""Все пользователи заданного типа"".'"); Для Каждого НеПеремещенныйПользователь Из НеПеремещенныеПользователи Цикл СтрокаПользователей = СтрокаПользователей + Строка(НеПеремещенныйПользователь.Ключ) + " : " + - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(НеПеремещенныйПользователь.Значение) + Символы.ПС; + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(НеПеремещенныйПользователь.Значение) + Символы.ПС; КонецЦикла; УведомлениеПользователя.ПолныйТекстСообщения = НСтр("ru = 'Следующие пользователи не были включены в группы:'") + Символы.ПС + Символы.ПС + СтрокаПользователей; @@ -436,3 +464,43 @@ КонецПроцедуры +&НаКлиенте +Процедура ЗаписатьИЗакрытьОбработкаВопроса(Ответ, Отчет) Экспорт + + Если Ответ = "Ок" Тогда + Возврат; + Иначе + Отчет.Показать(НСтр("ru = 'Пользователи, не включенные в группы'")); + Возврат; + КонецЕсли; + + Модифицированность = Ложь; + ЗаписатьИЗакрытьЗавершение(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрытьОбработкаПредупреждения(ДополнительныеПараметры) Экспорт + + ЗаписатьИЗакрытьЗавершение(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИЗакрытьЗавершение() + + Оповестить("РазмещениеПользователейВГруппах"); + Если ВнешниеПользователи Тогда + Оповестить("Запись_ГруппыВнешнихПользователей"); + Иначе + Оповестить("Запись_ГруппыПользователей"); + КонецЕсли; + + Если Не РежимОткрытияИзКарточкиПользователя Тогда + Закрыть(); + Иначе + ЗаполнитьДеревоГрупп(); + РазвернутьДеревоЗначений(); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ДлительнаяОперация/Form.form b/SSL/src/CommonForms/ДлительнаяОперация/Form.form index 780756e3e..2e6d454ed 100644 --- a/SSL/src/CommonForms/ДлительнаяОперация/Form.form +++ b/SSL/src/CommonForms/ДлительнаяОперация/Form.form @@ -13,7 +13,7 @@ true - ДекорацияДлительнаяОперацияРасширеннаяПодсказка + ДекорацияДлительнаяОперацияExtendedTooltip 10 Label true @@ -52,7 +52,7 @@ true - ДекорацияПоясняющийТекстДлительнойОперацииРасширеннаяПодсказка + ДекорацияПоясняющийТекстДлительнойОперацииExtendedTooltip 11 Label true @@ -91,7 +91,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 9 Label true diff --git a/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Form.form b/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Form.form index 52c82b950..a1a319e0f 100644 --- a/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Form.form +++ b/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Form.form @@ -16,7 +16,7 @@ true - ДлительнаяОперацияРасширеннаяПодсказка + ДлительнаяОперацияExtendedTooltip 13 Label true @@ -53,7 +53,7 @@ None - СопровождающийТекстРасширеннаяПодсказка + СопровождающийТекстExtendedTooltip 14 Label true @@ -86,7 +86,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 12 Label true @@ -118,7 +118,7 @@ true - ФормаОтменитьРасширеннаяПодсказка + ФормаОтменитьExtendedTooltip 10 Label true @@ -146,7 +146,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 11 Label true diff --git a/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Module.bsl b/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Module.bsl index 5bc87baae..a2bc6028f 100644 --- a/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Module.bsl +++ b/SSL/src/CommonForms/ДлительнаяОперацияДополнительныхОтчетовИОбработок/Module.bsl @@ -94,23 +94,8 @@ ОтключитьОбработчикОжидания("ПроверитьВыполнение"); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1); - - ПрерватьЕслиНеВыполнено = (Ответ = КодВозвратаДиалога.Прервать); - - РезультатПроверки = ПроверитьВыполнениеНаСервере(ФоновоеЗаданиеИдентификатор, ФоновоеЗаданиеАдресХранилища, ПрерватьЕслиНеВыполнено); - - Если РезультатПроверки.ЗаданиеВыполнено ИЛИ ПрерватьЕслиНеВыполнено Тогда - ФоновоеЗаданиеПроверитьПриЗакрытии = Ложь; - ОповеститьОВыборе(РезультатПроверки.Значение); - Возврат; - КонецЕсли; - - Если ИнтервалПроверки < 15 Тогда - ИнтервалПроверки = ИнтервалПроверки + 0.7; - КонецЕсли; - - ПодключитьОбработчикОжидания("ПроверитьВыполнение", ИнтервалПроверки, Истина); + Обработчик = Новый ОписаниеОповещения("ОтменитьЗавершение", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, 1); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -143,4 +128,21 @@ Возврат РезультатПроверки; КонецФункции - +&НаКлиенте +Процедура ОтменитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт + ПрерватьЕслиНеВыполнено = (Ответ = КодВозвратаДиалога.Прервать); + + РезультатПроверки = ПроверитьВыполнениеНаСервере(ФоновоеЗаданиеИдентификатор, ФоновоеЗаданиеАдресХранилища, ПрерватьЕслиНеВыполнено); + + Если РезультатПроверки.ЗаданиеВыполнено ИЛИ ПрерватьЕслиНеВыполнено Тогда + ФоновоеЗаданиеПроверитьПриЗакрытии = Ложь; + ОповеститьОВыборе(РезультатПроверки.Значение); + Возврат; + КонецЕсли; + + Если ИнтервалПроверки < 15 Тогда + ИнтервалПроверки = ИнтервалПроверки + 0.7; + КонецЕсли; + + ПодключитьОбработчикОжидания("ПроверитьВыполнение", ИнтервалПроверки, Истина); +КонецПроцедуры diff --git a/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Form.form b/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Form.form index b733014d7..e998dea6e 100644 --- a/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Form.form +++ b/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Form.form @@ -39,8 +39,8 @@ Подписи.ПутьКФайлу - ПодписиПутьКФайлуРасширеннаяПодсказка - 24 + ПодписиПутьКФайлуExtendedTooltip + 15 Label true true @@ -85,8 +85,8 @@ Подписи.Комментарий - ПодписиКомментарийРасширеннаяПодсказка - 26 + ПодписиКомментарийExtendedTooltip + 16 Label true true @@ -122,10 +122,10 @@ ПодписиСтрокаПоиска - 15 + 17 ПодписиСтрокаПоискаРасширеннаяПодсказка - 17 + 19 Label true true @@ -135,7 +135,7 @@ ПодписиСтрокаПоискаКонтекстноеМеню - 16 + 18 true Подписи @@ -145,10 +145,10 @@ ПодписиСостояниеПросмотра - 18 + 20 ПодписиСостояниеПросмотраРасширеннаяПодсказка - 20 + 22 Label true true @@ -158,7 +158,7 @@ ПодписиСостояниеПросмотраКонтекстноеМеню - 19 + 21 true ViewStatusAddition @@ -169,10 +169,10 @@ ПодписиУправлениеПоиском - 21 + 23 ПодписиУправлениеПоискомРасширеннаяПодсказка - 23 + 25 Label true true @@ -182,7 +182,7 @@ ПодписиУправлениеПоискомКонтекстноеМеню - 22 + 24 true SearchControlAddition @@ -192,7 +192,7 @@ - ПодписиРасширеннаяПодсказка + ПодписиExtendedTooltip 14 Label true @@ -247,7 +247,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 12 Label true @@ -273,7 +273,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 13 Label true @@ -293,7 +293,7 @@ Right true - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Help/ru.html b/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Help/ru.html index 51db3e07d..d2e97e226 100644 --- a/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Help/ru.html +++ b/SSL/src/CommonForms/ДобавлениеПодписиИзФайла/Help/ru.html @@ -1,7 +1,7 @@ - +

            Форма открывается командой "Все действия - ЭП и шифрование - Добавить ЭП из файла" карточки файла.

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

             

            См. также:

            -

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file +

            Настройка ЭП и шифрования
            Персональные настройки ЭП

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ДополнительноеОписание/Form.form b/SSL/src/CommonForms/ДополнительноеОписание/Form.form index 52d608fe1..ffb7561a7 100644 --- a/SSL/src/CommonForms/ДополнительноеОписание/Form.form +++ b/SSL/src/CommonForms/ДополнительноеОписание/Form.form @@ -14,7 +14,7 @@ true None - ПолеHTMLДокументаРасширеннаяПодсказка + ПолеHTMLДокументаExtendedTooltip 5 Label true @@ -56,7 +56,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 4 Label true diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form index 10ffe6f7f..e5c13f7e1 100644 --- a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Form.form @@ -40,8 +40,8 @@ ТаблицаКоманд.Представление - ОбработкиПредставлениеРасширеннаяПодсказка - 66 + ОбработкиПредставлениеExtendedTooltip + 57 Label true true @@ -82,10 +82,10 @@
            ТаблицаКомандСтрокаПоиска - 57 + 70 ТаблицаКомандСтрокаПоискаРасширеннаяПодсказка - 59 + 72 Label true true @@ -95,7 +95,7 @@ ТаблицаКомандСтрокаПоискаКонтекстноеМеню - 58 + 71 true ТаблицаКоманд @@ -105,10 +105,10 @@ ТаблицаКомандСостояниеПросмотра - 60 + 73 ТаблицаКомандСостояниеПросмотраРасширеннаяПодсказка - 62 + 75 Label true true @@ -118,7 +118,7 @@ ТаблицаКомандСостояниеПросмотраКонтекстноеМеню - 61 + 74 true ViewStatusAddition @@ -129,10 +129,10 @@ ТаблицаКомандУправлениеПоиском - 63 + 76 ТаблицаКомандУправлениеПоискомРасширеннаяПодсказка - 65 + 78 Label true true @@ -142,7 +142,7 @@ ТаблицаКомандУправлениеПоискомКонтекстноеМеню - 64 + 77 true SearchControlAddition @@ -152,7 +152,7 @@ - ТаблицаКомандРасширеннаяПодсказка + ТаблицаКомандExtendedTooltip 56 Label true @@ -207,7 +207,7 @@ Страница открыть обработку - СтраницаОткрытьОбработкуРасширеннаяПодсказка + СтраницаОткрытьОбработкуExtendedTooltip 55 Label true @@ -238,8 +238,8 @@ true - ДекорацияДлительнаяОперацияРасширеннаяПодсказка - 77 + ДекорацияДлительнаяОперацияExtendedTooltip + 59 Label true true @@ -274,8 +274,8 @@ true - ПоясняющаяДекорацияРасширеннаяПодсказка - 78 + ПоясняющаяДекорацияExtendedTooltip + 60 Label true true @@ -314,8 +314,8 @@ Страница выполнения обработки - СтраницаВыполненияОбработкиРасширеннаяПодсказка - 76 + СтраницаВыполненияОбработкиExtendedTooltip + 58 Label true true @@ -342,7 +342,7 @@ Страницы - СтраницыРасширеннаяПодсказка + СтраницыExtendedTooltip 54 Label true @@ -372,8 +372,8 @@ false - НастроитьСписокРасширеннаяПодсказка - 81 + НастроитьСписокExtendedTooltip + 63 Label true true @@ -404,8 +404,8 @@ true false - ВыполнитьОбработкуРасширеннаяПодсказка - 83 + ВыполнитьОбработкуExtendedTooltip + 65 Label true true @@ -431,8 +431,8 @@ false - ОтменаРасширеннаяПодсказка - 84 + ОтменаExtendedTooltip + 66 Label true true @@ -462,8 +462,8 @@ Командная панель страницы открыть обработку - КоманднаяПанельСтраницыОткрытьОбработкуРасширеннаяПодсказка - 82 + КоманднаяПанельСтраницыОткрытьОбработкуExtendedTooltip + 64 Label true true @@ -490,8 +490,8 @@ Страница командная панель страницы открыть обработку - СтраницаКоманднаяПанельСтраницыОткрытьОбработкуРасширеннаяПодсказка - 80 + СтраницаКоманднаяПанельСтраницыОткрытьОбработкуExtendedTooltip + 62 Label true true @@ -520,8 +520,8 @@ false - ОтменитьВыполнениеОбработкиРасширеннаяПодсказка - 87 + ОтменитьВыполнениеОбработкиExtendedTooltip + 69 Label true true @@ -551,8 +551,8 @@ Командная панель - КоманднаяПанельСтраницыВыполненияОбработкиРасширеннаяПодсказка - 86 + КоманднаяПанельСтраницыВыполненияОбработкиExtendedTooltip + 68 Label true true @@ -579,8 +579,8 @@ Командная панель страницы открыть обработку - СтраницаКоманднаяПанельСтраницыВыполненияОбработкиРасширеннаяПодсказка - 85 + СтраницаКоманднаяПанельСтраницыВыполненияОбработкиExtendedTooltip + 67 Label true true @@ -608,8 +608,8 @@ Страницы командные панели - СтраницыКомандныеПанелиРасширеннаяПодсказка - 79 + СтраницыКомандныеПанелиExtendedTooltip + 61 Label true true diff --git a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl index 3fef30e60..301e07256 100644 --- a/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonForms/ДополнительныеОтчетыИОбработки/Module.bsl @@ -14,7 +14,7 @@ КонецЕсли; Если Параметры.Свойство("РежимОткрытияОкна") Тогда - ЭтаФорма.РежимОткрытияОкна = Параметры.РежимОткрытияОкна; + ЭтотОбъект.РежимОткрытияОкна = Параметры.РежимОткрытияОкна; КонецЕсли; Если ЗначениеЗаполнено(Параметры.ИмяРаздела) @@ -50,6 +50,10 @@ ДополнительныеОтчетыИОбработки.ПредставлениеРаздела(СсылкаРаздела)); КонецЕсли; + Если Параметры.Свойство("Заголовок") Тогда + Заголовок = Параметры.Заголовок; + КонецЕсли; + Если ЭтоНазначаемыеОбработки Тогда Элементы.НастроитьСписок.Видимость = Ложь; @@ -118,7 +122,7 @@ Открытие = Новый Структура("Имя, Параметры, Владелец, Уникальность, Окно"); Открытие.Имя = "ОбщаяФорма.НастройкаМоихОтчетовИОбработок"; - Открытие.Владелец = ЭтаФорма; + Открытие.Владелец = ЭтотОбъект; Открытие.Уникальность = Ложь; Открытие.Параметры = Новый Структура("ВидОбработок, ЭтоГлобальныеОбработки, ТекущийРаздел"); @@ -270,20 +274,18 @@ КонецЕсли; Если Результат <> Неопределено И Результат.ВызваноИсключение Тогда - // Изменение элементов формы + // Переключение на страницу со списком команд. Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаОткрытьОбработку; Элементы.СтраницыКомандныеПанели.ТекущаяСтраница = Элементы.СтраницаКоманднаяПанельСтраницыОткрытьОбработку; - // Вывод сообщения об ошибке - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось выполнить команду ""%1"". - |Подробности см. в журнале регистрации.'"), - ВыполняемаяКоманда.Представление)); + // Вывод сообщения об ошибке. + ТекстПредупреждения = НСтр("ru = 'Не удалось выполнить команду ""%1"". + |Подробности см. в журнале регистрации.'"); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ВыполняемаяКоманда.Представление); + ПоказатьПредупреждение(, ТекстПредупреждения); + // Отмена закрытия. + Возврат; КонецЕсли; - // Вывод результата выполнения. - СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ВладелецФормы, РезультатВыполнения); - // Обновить форму владельца Если ЭтоФормаОбъекта Тогда Попытка @@ -300,6 +302,9 @@ Если ЗакрытьЭтуФорму = Истина Тогда Закрыть(); КонецЕсли; + + // Вывод результата выполнения. + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ВладелецФормы, РезультатВыполнения); КонецПроцедуры &НаКлиенте diff --git a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form index 51ece8258..f35e7134a 100644 --- a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Form.form @@ -21,7 +21,7 @@ ОдинПроксиДляВсехПротоколовПриИзменении - ОдинПроксиДляВсехПротоколовРасширеннаяПодсказка + ОдинПроксиДляВсехПротоколовExtendedTooltip 32 Label true @@ -64,8 +64,8 @@ СерверHTTPПриИзменении - СерверHTTPРасширеннаяПодсказка - 36 + СерверHTTPExtendedTooltip + 35 Label true true @@ -105,8 +105,8 @@ ПортHTTP - ПортHTTPРасширеннаяПодсказка - 38 + ПортHTTPExtendedTooltip + 36 Label true true @@ -154,8 +154,8 @@ Группа HTTP - ГруппаHTTPРасширеннаяПодсказка - 35 + ГруппаHTTPExtendedTooltip + 34 Label true true @@ -191,8 +191,8 @@ СерверHTTPПриИзменении - СерверHTTPSРасширеннаяПодсказка - 41 + СерверHTTPSExtendedTooltip + 38 Label true true @@ -232,8 +232,8 @@ ПортHTTPS - ПортHTTPSРасширеннаяПодсказка - 43 + ПортHTTPSExtendedTooltip + 39 Label true true @@ -281,8 +281,8 @@ Группа HTTP - ГруппаHTTPSРасширеннаяПодсказка - 40 + ГруппаHTTPSExtendedTooltip + 37 Label true true @@ -318,8 +318,8 @@ СерверHTTPПриИзменении - СерверFTPРасширеннаяПодсказка - 46 + СерверFTPExtendedTooltip + 41 Label true true @@ -359,8 +359,8 @@ ПортFTP - ПортFTPРасширеннаяПодсказка - 48 + ПортFTPExtendedTooltip + 42 Label true true @@ -408,8 +408,8 @@ Группа HTTP - ГруппаFTPРасширеннаяПодсказка - 45 + ГруппаFTPExtendedTooltip + 40 Label true true @@ -440,8 +440,8 @@ Группа прокси серверы - ГруппаПроксиСерверыРасширеннаяПодсказка - 34 + ГруппаПроксиСерверыExtendedTooltip + 33 Label true true @@ -489,8 +489,8 @@ АдресаИсключений.АдресСервера - АдресаИсключенийАдресСервераРасширеннаяПодсказка - 61 + АдресаИсключенийАдресСервераExtendedTooltip + 45 Label true true @@ -526,10 +526,10 @@ АдресаИсключенийСтрокаПоиска - 52 + 54 АдресаИсключенийСтрокаПоискаРасширеннаяПодсказка - 54 + 56 Label true true @@ -539,7 +539,7 @@ АдресаИсключенийСтрокаПоискаКонтекстноеМеню - 53 + 55 true АдресаИсключений @@ -549,10 +549,10 @@ АдресаИсключенийСостояниеПросмотра - 55 + 57 АдресаИсключенийСостояниеПросмотраРасширеннаяПодсказка - 57 + 59 Label true true @@ -562,7 +562,7 @@ АдресаИсключенийСостояниеПросмотраКонтекстноеМеню - 56 + 58 true ViewStatusAddition @@ -573,10 +573,10 @@ АдресаИсключенийУправлениеПоиском - 58 + 60 АдресаИсключенийУправлениеПоискомРасширеннаяПодсказка - 60 + 62 Label true true @@ -586,7 +586,7 @@ АдресаИсключенийУправлениеПоискомКонтекстноеМеню - 59 + 61 true SearchControlAddition @@ -596,8 +596,8 @@ - АдресаИсключенийРасширеннаяПодсказка - 51 + АдресаИсключенийExtendedTooltip + 44 Label true true @@ -649,8 +649,8 @@ true - ДекорацияПредупреждениеДляСервераРасширеннаяПодсказка - 71 + ДекорацияПредупреждениеДляСервераExtendedTooltip + 46 Label true true @@ -688,8 +688,8 @@ Группа адресов исключений - ГруппаАдресовИсключенийРасширеннаяПодсказка - 50 + ГруппаАдресовИсключенийExtendedTooltip + 43 Label true true @@ -723,7 +723,7 @@ true - ФормаКнопкаОКРасширеннаяПодсказка + ФормаКнопкаОКExtendedTooltip 30 Label true @@ -749,7 +749,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 31 Label true diff --git a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl index 506e47fd8..166c6a031 100644 --- a/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl +++ b/SSL/src/CommonForms/ДополнительныеПараметрыПроксиСервера/Module.bsl @@ -23,7 +23,7 @@ ОдинПроксиДляВсехПротоколов = Параметры.ОдинПроксиДляВсехПротоколов; - ИнициализироватьЭлементыФормы(ЭтаФорма); + ИнициализироватьЭлементыФормы(ЭтотОбъект); Для каждого ЭлементСпискаИсключений Из Параметры.НеИспользоватьПроксиДляАдресов Цикл СтрИсключения = АдресаИсключений.Добавить(); @@ -38,7 +38,7 @@ &НаКлиенте Процедура ОдинПроксиДляВсехПротоколовПриИзменении(Элемент) - ИнициализироватьЭлементыФормы(ЭтаФорма); + ИнициализироватьЭлементыФормы(ЭтотОбъект); КонецПроцедуры @@ -46,8 +46,8 @@ Процедура СерверHTTPПриИзменении(Элемент) // Если сервер не указан, то обнулить соответствующий порт - Если ПустаяСтрока(ЭтаФорма[Элемент.Имя]) Тогда - ЭтаФорма[СтрЗаменить(Элемент.Имя, "Сервер", "Порт")] = 0; + Если ПустаяСтрока(ЭтотОбъект[Элемент.Имя]) Тогда + ЭтотОбъект[СтрЗаменить(Элемент.Имя, "Сервер", "Порт")] = 0; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Module.bsl b/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Module.bsl deleted file mode 100644 index 07912b8ad..000000000 --- a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/Module.bsl +++ /dev/null @@ -1,103 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ПродолжитьЗагрузкуДанных(Команда) - - Если РазделительСуществует(ЗначениеРазделителя) Тогда - - Текст = НСтр("ru = 'Указанная область данных существует. Загрузка может привести к повреждению текущих данных. - |Продолжить загрузку?'"); - Если Вопрос(Текст, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - - КонецЕсли; - - АдресВХранилище = Неопределено; - Если Не ПоместитьФайл(АдресВХранилище) Тогда - Возврат; - КонецЕсли; - - Состояние(НСтр("ru = 'Выполняется загрузка данных в область'")); - ЗагрузитьДанныеНаСервере(АдресВХранилище, ЗначениеРазделителя); - - Отказ = Ложь; - СтандартныеПодсистемыКлиент.ДействияПередНачаломРаботыСистемы(Отказ); - - Если Отказ Тогда - Предупреждение(НСтр("ru = 'Загрузка данных завершена с ошибками'")); - Возврат; - КонецЕсли; - - СтандартныеПодсистемыКлиент.ДействияПриНачалеРаботыСистемы(); - Состояние(НСтр("ru = 'Загрузка данных завершена успешно'")); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Процедура ЗагрузитьДанныеНаСервере(Знач АдресВХранилище, ЗначениеРазделителя) - - ДанныеАрхива = ПолучитьИзВременногоХранилища(АдресВХранилище); - ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); - ДанныеАрхива.Записать(ИмяАрхива); - ДанныеАрхива = Неопределено; - - УстановитьПривилегированныйРежим(Истина); - - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); - - ОбщегоНазначения.ЗаблокироватьИБ(); - - Если НЕ РазделительСуществует(ЗначениеРазделителя) Тогда - - МенеджерЗаписи = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные = ЗначениеРазделителя; - МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется; - МенеджерЗаписи.Записать(); - - МенеджерЗаписи = Константы.ПредставлениеОбластиДанных.СоздатьМенеджерЗначения(); - МенеджерЗаписи.ОбластьДанныхВспомогательныеДанные = ЗначениеРазделителя; - МенеджерЗаписи.Значение = ЗначениеРазделителя; - МенеджерЗаписи.Записать(); - - КонецЕсли; - - ВыгрузкаЗагрузкаДанных.ЗагрузитьТекущуюОбластьИзАрхива(ИмяАрхива); - - Попытка - УдалитьФайлы(ИмяАрхива); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Удаление временных файлов'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - ПользователиСлужебный.АвторизоватьТекущегоПользователя(); - - ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы(); - - ОбщегоНазначения.РазблокироватьИБ(); - -КонецПроцедуры - -&НаСервере -Функция РазделительСуществует(ЗначениеРазделителя) - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ОбластиДанных.ОбластьДанныхВспомогательныеДанные КАК ОбластьДанных - |ИЗ - | РегистрСведений.ОбластиДанных КАК ОбластиДанных - |ГДЕ - | ОбластиДанных.ОбластьДанныхВспомогательныеДанные = &ОбластьДанных"; - Запрос.УстановитьПараметр("ОбластьДанных", ЗначениеРазделителя); - - Возврат Не Запрос.Выполнить().Пустой(); - -КонецФункции diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/ЗагрузкаДанныхВОбласть.mdo b/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/ЗагрузкаДанныхВОбласть.mdo deleted file mode 100644 index b011964dd..000000000 --- a/SSL/src/CommonForms/ЗагрузкаДанныхВОбласть/ЗагрузкаДанныхВОбласть.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ЗагрузкаДанныхВОбласть - - ru - Загрузка данных в область - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Form.form b/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Form.form deleted file mode 100644 index 8cd50501d..000000000 --- a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Form.form +++ /dev/null @@ -1,480 +0,0 @@ - - - - <key>ru</key> - <value>Загрузить данные из сервиса</value> - - - ГруппаОсновнаяПередЗагрузкой - 55 - - ДекорацияВопросПередЗагрузкой - 47 - - <key>ru</key> - <value>Декорация вопрос перед загрузкой</value> - - true - true - - true - - - ДекорацияВопросПередЗагрузкойРасширеннаяПодсказка - 73 - Label - true - true - - Left - - - - ДекорацияВопросПередЗагрузкойКонтекстноеМеню - 48 - true - - 5 - true - 2 - true - - - CommonPicture.Вопрос32 - - - - - ГруппаИнформацияПередЗагрузкой - 32 - - ДекорацияВнимание - 33 - - <key>ru</key> - <value>Внимание!</value> - - true - true - - true - - - ДекорацияВниманиеРасширеннаяПодсказка - 75 - Label - true - true - - Left - - - - ДекорацияВниманиеКонтекстноеМеню - 34 - true - - Label - true - true - - System.DefaultGUIFont - true - false - false - false - - - Left - - - - ДекорацияПредупреждения - 37 - - <key>ru</key> - <value>Процесс загрузки данных может занять продолжительное время. -Все текущие данные в информационной базе будут удалены. -После окончания загрузки программа будет автоматически перезапущена.</value> - - true - true - - true - - - ДекорацияПредупрежденияРасширеннаяПодсказка - 76 - Label - true - true - - Left - - - - ДекорацияПредупрежденияКонтекстноеМеню - 38 - true - - Label - true - true - - Left - - - - ЗагружатьИнформацияОПользователях - 70 - true - true - - true - - - ЗагружатьИнформациюОПользователях - - Right - - ЗагружатьИнформацияОПользователяхРасширеннаяПодсказка - 77 - Label - true - true - - Left - - - - ЗагружатьИнформацияОПользователяхКонтекстноеМеню - 71 - true - - CheckBoxField - Enter - true - Left - true - - - - ДекорацияАктивныеПользователи - 39 - - <key>ru</key> - <value>Загрузка не сможет начаться, пока другие пользователи работают с информационной базой. -Полный список пользователей работающих сейчас с информационной базой можно увидеть здесь:</value> - - true - true - - true - - - ДекорацияАктивныеПользователиРасширеннаяПодсказка - 79 - Label - true - true - - Left - - - - ДекорацияАктивныеПользователиКонтекстноеМеню - 40 - true - - Label - true - true - - Left - Bottom - - - - СписокАктивныхПользователей - 41 - - <key>ru</key> - <value>Список активных пользователей</value> - - true - true - - true - - - СписокАктивныхПользователейРасширеннаяПодсказка - 80 - Label - true - true - - Left - - - - СписокАктивныхПользователейКонтекстноеМеню - 42 - true - - Label - true - true - true - - - Click - ОткрытьФормуАктивныхПользователей - - true - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа информация перед загрузкой</value> - - - ru - Группа информация перед загрузкой - - - ГруппаИнформацияПередЗагрузкойРасширеннаяПодсказка - 74 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа основная перед загрузкой</value> - - - ru - Группа основная перед загрузкой - - - ГруппаОсновнаяПередЗагрузкойРасширеннаяПодсказка - 72 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаКомандыПередЗагрузкой - 56 - - Продолжить - 27 - true - true - - true - - - ПродолжитьРасширеннаяПодсказка - 82 - Label - true - true - - Left - - - Form.Command.Продолжить - Auto - true - true - true - UserCmds - Auto - - - Закрыть - 31 - - <key>ru</key> - <value>Закрыть</value> - - true - true - - true - - - ЗакрытьРасширеннаяПодсказка - 83 - Label - true - true - - Left - - - Form.StandardCommand.No - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Группа команды перед загрузкой</value> - - - ru - Группа команды перед загрузкой - - - ГруппаКомандыПередЗагрузкойРасширеннаяПодсказка - 81 - Label - true - true - - Left - - - CommandBar - - Right - Form - - - Bottom - true - - ФормаКоманднаяПанель - -1 - Right - true - - Abort - Cancel - Close - CustomizeForm - Help - Ignore - OK - RestoreValues - Retry - SaveValues - 55 - DontBlock - true - true - Vertical - true - true - true - UseIfNecessary - auto - true - - ЗагружатьИнформациюОПользователях - - <key>ru</key> - <value>Загружать информацию о пользователях</value> - - 1 - - Boolean - - - true - - - true - - - - АдресХранилища - - <key>ru</key> - <value>Адрес хранилища</value> - - 2 - - String - - - - true - - - true - - - - Продолжить - - <key>ru</key> - <value>Продолжить</value> - - 1 - - ru - Продолжить - - - true - - - - Загрузить - - - Auto - Auto - - - - - - diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Module.bsl b/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Module.bsl deleted file mode 100644 index ecaabd884..000000000 --- a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/Module.bsl +++ /dev/null @@ -1,57 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаКлиенте -Процедура ОткрытьФормуАктивныхПользователей(Элемент) - - ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура Загрузить(Команда) - - АдресХранилища = ""; - Если ПоместитьФайл(АдресХранилища, "data_dump.zip") Тогда - - Состояние( - НСтр("ru = 'Выполняется загрузка данных из сервиса. - |Операция может занять продолжительное время, пожалуйста, подождите...'"),); - - ВыполнитьЗагрузку(АдресХранилища, ЗагружатьИнформациюОПользователях); - ПрекратитьРаботуСистемы(Истина); - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервереБезКонтекста -Процедура ВыполнитьЗагрузку(Знач АдресФайла, Знач ЗагружатьИнформацияОПользователях) - - ДанныеАрхива = ПолучитьИзВременногоХранилища(АдресФайла); - ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); - ДанныеАрхива.Записать(ИмяАрхива); - ДанныеАрхива = Неопределено; - - ОбщегоНазначения.ЗаблокироватьИБ(); - - ВыгрузкаЗагрузкаДанных.ЗагрузитьТекущуюОбластьИзАрхива(ИмяАрхива, ЗагружатьИнформацияОПользователях); - - ОбщегоНазначения.РазблокироватьИБ(); - - Попытка - УдалитьФайлы(ИмяАрхива); - Исключение - // Дополнительная обработка не требуется, возможно возникновение исключения при удалении временного файла - КонецПопытки; - -КонецПроцедуры - - - diff --git a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/ЗагрузкаДанныхИзСервиса.mdo b/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/ЗагрузкаДанныхИзСервиса.mdo deleted file mode 100644 index 669502a05..000000000 --- a/SSL/src/CommonForms/ЗагрузкаДанныхИзСервиса/ЗагрузкаДанныхИзСервиса.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ЗагрузкаДанныхИзСервиса - - ru - Загрузка данных из сервиса - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Form.form b/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Form.form deleted file mode 100644 index e4c8ff74e..000000000 --- a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Form.form +++ /dev/null @@ -1,312 +0,0 @@ - - - - <key>ru</key> - <value>Загрузка сообщения обмена с изменениями конфигурации</value> - - - Группировка - 9 - - ДекорацияЗнакПредупреждение32 - 7 - true - true - - true - - - ДекорацияЗнакПредупреждение32РасширеннаяПодсказка - 12 - Label - true - true - - Left - - - - ДекорацияЗнакПредупреждение32КонтекстноеМеню - 8 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - - ПояснениеФормы - 5 - - <key>ru</key> - <value>Для продолжения работы системы необходимо повторно -получить данные из главного узла.</value> - - true - true - - true - - - ПояснениеФормыРасширеннаяПодсказка - 13 - Label - true - true - - Left - - - - ПояснениеФормыКонтекстноеМеню - 6 - true - - Label - true - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - ГруппировкаРасширеннаяПодсказка - 11 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ВидТранспортаСообщенийОбмена - 1 - true - true - - true - - - ВидТранспортаСообщенийОбмена - - Top - - ВидТранспортаСообщенийОбменаРасширеннаяПодсказка - 14 - Label - true - true - - Left - - - - ВидТранспортаСообщенийОбменаКонтекстноеМеню - 2 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - true - true - true - Normal - - - - ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных - 4 - true - true - - true - - - ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - Hyperlink - Form.Command.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных - Normal - Auto - true - true - UserCmds - Auto - - - ФормаКоманднаяПанель - -1 - - ФормаВыполнитьЗагрузкуДанных - 3 - true - true - - true - - - ФормаВыполнитьЗагрузкуДанныхРасширеннаяПодсказка - 10 - Label - true - true - - Left - - - Form.Command.ВыполнитьЗагрузкуДанных - Auto - true - true - true - UserCmds - Auto - - Left - true - - - OnCreateAtServer - ПриСозданииНаСервере - - 50 - DontBlock - true - true - Vertical - true - true - UseIfNecessary - auto - true - - ВидТранспортаСообщенийОбмена - - <key>ru</key> - <value>Укажите способ обмена данными</value> - - 1 - - EnumRef.ВидыТранспортаСообщенийОбмена - - - true - - - true - - - - УзелИнформационнойБазы - - <key>ru</key> - <value>Узел информационной базы</value> - - 2 - - ExchangePlanRef - - - true - - - true - - - - ВыполнитьЗагрузкуДанных - - <key>ru</key> - <value>Получить данные</value> - - 1 - - ru - Получить данные - - - true - - - StdPicture.GenerateReport - - - - ВыполнитьЗагрузкуДанных - - - TextPicture - Auto - Auto - - - ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных - - <key>ru</key> - <value>События получения данных</value> - - 2 - - ru - Перейти в журнал регистрации событий получения данных - - - true - - - StdPicture.EventLog - - - - ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных - - - Auto - Auto - - - - - - diff --git a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Module.bsl b/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Module.bsl deleted file mode 100644 index a68da0fd2..000000000 --- a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/Module.bsl +++ /dev/null @@ -1,67 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - УзелИнформационнойБазы = ОбменДаннымиСервер.ГлавныйУзел(); - - Если УзелИнформационнойБазы = Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - // получаем вид транспорта сообщений обмена по умолчанию для узла; - // если значение по умолчанию не задано, то устанавливаем значение FILE - ВидТранспортаСообщенийОбмена = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); - Если Не ЗначениеЗаполнено(ВидТранспортаСообщенийОбмена) Тогда - ВидТранспортаСообщенийОбмена = Перечисления.ВидыТранспортаСообщенийОбмена.FILE; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ВыполнитьЗагрузкуДанных(Команда) - - Отказ = Ложь; - - Состояние(НСтр("ru = 'Выполняется загрузка данных...'")); - - // выполняем загрузку данных - ОбменДаннымиВызовСервера.ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Истина, Ложь, ВидТранспортаСообщенийОбмена); - - Если Отказ Тогда - - НСтрока = НСтр("ru = 'При загрузке данных возникли ошибки. - |Перейти в журнал регистрации?'"); - // - Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Да Тогда - - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); - - КонецЕсли; - - Иначе - - Предупреждение(НСтр("ru = 'Загрузка данных успешно завершена.'"), 30); - - Закрыть(Истина); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных(Команда) - - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); - -КонецПроцедуры diff --git a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации.mdo b/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации.mdo deleted file mode 100644 index 8bf7f8bfa..000000000 --- a/SSL/src/CommonForms/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации/ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации.mdo +++ /dev/null @@ -1,10 +0,0 @@ - - - ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации - - ru - Загрузка сообщения обмена с изменениями конфигурации - - PersonalComputer - MobileDevice - diff --git a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form b/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form deleted file mode 100644 index a30c8367a..000000000 --- a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Form.form +++ /dev/null @@ -1,108 +0,0 @@ - - - - <key>ru</key> - <value>Служебный пользователь</value> - - - НеразделенныйПользователь - 1 - - <key>ru</key> - <value>Неразделенный пользователь</value> - - true - true - - true - - - НеразделенныйПользовательРасширеннаяПодсказка - 3 - Label - true - true - - Left - - - - НеразделенныйПользовательКонтекстноеМеню - 2 - true - - Label - true - true - - Left - - - None - false - - ФормаКоманднаяПанель - -1 - Left - true - - - OnCreateAtServer - ПриСозданииНаСервере - - LockOwner - true - true - Vertical - true - true - UseIfNecessary - auto - true - - - - DocumentJournal.Взаимодействия.Command.ВзаимодействияПоПредмету - - - - CommonCommand.ЗадачиПоПредмету - - - - 0 - - - - 0 - - - - - - 0 - - - - BusinessProcess.Задание.StandardCommand.CreateBasedOn - - - - DocumentJournal.Взаимодействия.Command.ЗапланироватьВзаимодействие - - - - DocumentJournal.Взаимодействия.Command.ЗапланироватьВстречу - - - - DocumentJournal.Взаимодействия.Command.НаписатьЭлектронноеПисьмо - - - - DocumentJournal.Взаимодействия.Command.Позвонить - - - - - diff --git a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Module.bsl b/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Module.bsl deleted file mode 100644 index 2e41c5919..000000000 --- a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/Module.bsl +++ /dev/null @@ -1,17 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ШаблонСообщения = НСтр("ru = 'Просмотр сведений о пользователе %1 не доступен, т.к. это - |служебная учетная запись, предусмотренная для администраторов сервиса.'"); - Элементы.НеразделенныйПользователь.Заголовок = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Параметры.Ключ.Наименование); - -КонецПроцедуры diff --git a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/ИнформацияНеразделенногоПользователя.mdo b/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/ИнформацияНеразделенногоПользователя.mdo deleted file mode 100644 index c03a4f2cf..000000000 --- a/SSL/src/CommonForms/ИнформацияНеразделенногоПользователя/ИнформацияНеразделенногоПользователя.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - ИнформацияНеразделенногоПользователя - - ru - Информация неразделенного пользователя - - PersonalComputer - MobileDevice - true - diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form index 78103bcfc..60407cae2 100644 --- a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Form.form @@ -17,7 +17,7 @@ false - СкрытьПоказатьДеревоРазделовРасширеннаяПодсказка + СкрытьПоказатьДеревоРазделовExtendedTooltip 99 Label true @@ -45,7 +45,7 @@ true - ДекорацияКнопкиШапкаРасширеннаяПодсказка + ДекорацияКнопкиШапкаExtendedTooltip 100 Label true @@ -82,7 +82,7 @@ false - ПредыдущийРазделРасширеннаяПодсказка + ПредыдущийРазделExtendedTooltip 101 Label true @@ -115,7 +115,7 @@ false - СледующийРазделРасширеннаяПодсказка + СледующийРазделExtendedTooltip 102 Label true @@ -140,7 +140,7 @@ true - ГруппаКнопкиШапкаРасширеннаяПодсказка + ГруппаКнопкиШапкаExtendedTooltip 98 Label true @@ -210,8 +210,8 @@ Top - ДеревоРазделовНаименованиеРасширеннаяПодсказка - 118 + ДеревоРазделовНаименованиеExtendedTooltip + 109 Label true true @@ -253,8 +253,8 @@ Раздел - ГруппаПолныйКодНаименованиеРасширеннаяПодсказка - 117 + ГруппаПолныйКодНаименованиеExtendedTooltip + 108 Label true true @@ -280,10 +280,10 @@ ДеревоРазделовСтрокаПоиска - 108 + 124 ДеревоРазделовСтрокаПоискаРасширеннаяПодсказка - 110 + 126 Label true true @@ -293,7 +293,7 @@ ДеревоРазделовСтрокаПоискаКонтекстноеМеню - 109 + 125 true ДеревоРазделов @@ -303,10 +303,10 @@ ДеревоРазделовСостояниеПросмотра - 111 + 127 ДеревоРазделовСостояниеПросмотраРасширеннаяПодсказка - 113 + 129 Label true true @@ -316,7 +316,7 @@ ДеревоРазделовСостояниеПросмотраКонтекстноеМеню - 112 + 128 true ViewStatusAddition @@ -327,10 +327,10 @@ ДеревоРазделовУправлениеПоиском - 114 + 130 ДеревоРазделовУправлениеПоискомРасширеннаяПодсказка - 116 + 132 Label true true @@ -340,7 +340,7 @@ ДеревоРазделовУправлениеПоискомКонтекстноеМеню - 115 + 131 true SearchControlAddition @@ -350,7 +350,7 @@ - ДеревоРазделовРасширеннаяПодсказка + ДеревоРазделовExtendedTooltip 107 Label true @@ -376,7 +376,7 @@ false - КонтекстноеМенюДеревоРазделовВыборРазделаРасширеннаяПодсказка + КонтекстноеМенюДеревоРазделовВыборРазделаExtendedTooltip 105 Label true @@ -403,7 +403,7 @@ false - КонтекстноеМенюДеревоРазделовКопироватьРасширеннаяПодсказка + КонтекстноеМенюДеревоРазделовКопироватьExtendedTooltip 106 Label true @@ -464,7 +464,7 @@ 25 true - ГруппаДеревоРазделовРасширеннаяПодсказка + ГруппаДеревоРазделовExtendedTooltip 104 Label true @@ -501,8 +501,8 @@ true - ДекорацияОжиданиеОтступРасширеннаяПодсказка - 131 + ДекорацияОжиданиеОтступExtendedTooltip + 113 Label true true @@ -538,8 +538,8 @@ Группа ожидание отступ - ГруппаОжиданиеОтступРасширеннаяПодсказка - 130 + ГруппаОжиданиеОтступExtendedTooltip + 112 Label true true @@ -573,8 +573,8 @@ true - ДекорацияОжиданиеЭлементыРасширеннаяПодсказка - 133 + ДекорацияОжиданиеЭлементыExtendedTooltip + 115 Label true true @@ -602,8 +602,8 @@ true - КартинкаДлительныйПроцессРасширеннаяПодсказка - 134 + КартинкаДлительныйПроцессExtendedTooltip + 116 Label true true @@ -642,8 +642,8 @@ true - НадписьПодождитеРасширеннаяПодсказка - 135 + НадписьПодождитеExtendedTooltip + 117 Label true true @@ -681,8 +681,8 @@ Группа ожидание элементы - ГруппаОжиданиеЭлементыРасширеннаяПодсказка - 132 + ГруппаОжиданиеЭлементыExtendedTooltip + 114 Label true true @@ -715,8 +715,8 @@ false false - СтраницаОжиданиеРасширеннаяПодсказка - 129 + СтраницаОжиданиеExtendedTooltip + 111 Label true true @@ -742,8 +742,8 @@ true - НадписьВступлениеРасширеннаяПодсказка - 137 + НадписьВступлениеExtendedTooltip + 119 Label true true @@ -780,8 +780,8 @@ true - ГруппаТелоАнкетыРасширеннаяПодсказка - 136 + ГруппаТелоАнкетыExtendedTooltip + 118 Label true true @@ -805,8 +805,8 @@ Группа страницы форма заполнения - ГруппаСтраницыФормаЗаполненияРасширеннаяПодсказка - 128 + ГруппаСтраницыФормаЗаполненияExtendedTooltip + 110 Label true true @@ -833,7 +833,7 @@ Дерево форма заполнения - ДеревоФормаЗаполненияРасширеннаяПодсказка + ДеревоФормаЗаполненияExtendedTooltip 103 Label true @@ -864,8 +864,8 @@ true - ДекорацияКнопкиПодвалРасширеннаяПодсказка - 139 + ДекорацияКнопкиПодвалExtendedTooltip + 121 Label true true @@ -901,8 +901,8 @@ false - ПредыдущийРазделПодвалРасширеннаяПодсказка - 140 + ПредыдущийРазделПодвалExtendedTooltip + 122 Label true true @@ -934,8 +934,8 @@ false - СледующийРазделПодвалРасширеннаяПодсказка - 141 + СледующийРазделПодвалExtendedTooltip + 123 Label true true @@ -963,8 +963,8 @@ Группа кнопки подвал - ГруппаКнопкиПодвалРасширеннаяПодсказка - 138 + ГруппаКнопкиПодвалExtendedTooltip + 120 Label true true @@ -1000,7 +1000,7 @@ false - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 96 Label true @@ -1026,7 +1026,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 97 Label true diff --git a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl index 341d6b0fa..89b531fef 100644 --- a/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl +++ b/SSL/src/CommonForms/МастерАнкетыПоРазделам/Module.bsl @@ -17,7 +17,7 @@ УстановитьЗначенияРеквизитовФормыСогласноШаблонаАнкеты(); Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Вступление"); - Анкетирование.ЗаполнитьДеревоРазделов(ЭтаФорма,ДеревоРазделов); + Анкетирование.ЗаполнитьДеревоРазделов(ЭтотОбъект,ДеревоРазделов); Анкетирование.УстановитьЭлементДереваРазделовАнкетыВступлениеЗаключение(ДеревоРазделов,"Заключение"); АнкетированиеКлиентСервер.СформироватьНумерациюДерева(ДеревоРазделов,Истина); @@ -103,8 +103,8 @@ КонецЕсли; НомерТекущегоРаздела = Элементы.ДеревоРазделов.ТекущаяСтрока; - Анкетирование.ПостроениеФормыЗаполненияПоРазделу(ЭтаФорма,ТекущиеДанныеДеревоРазделов); - Анкетирование.СформироватьТаблицуПодчиненияВопросов(ЭтаФорма); + Анкетирование.ПостроениеФормыЗаполненияПоРазделу(ЭтотОбъект,ТекущиеДанныеДеревоРазделов); + Анкетирование.СформироватьТаблицуПодчиненияВопросов(ЭтотОбъект); Элементы.ПредыдущийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); Элементы.СледующийРазделПодвал.Видимость = (ТаблицаВопросовРаздела.Количество() > 0); @@ -176,12 +176,12 @@ Для каждого ПодчиненныйВопрос Из ЭлементКоллекции.Подчиненные Цикл - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтаФорма[ИмяВопроса]); + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].ТолькоПросмотр = (НЕ ЭтотОбъект[ИмяВопроса]); Если СтрЧислоВхождений(ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса,"Реквизит") = 0 Тогда //У флажка и переключателя нет свойства АвтоОтметкаНезаполненного. Попытка - Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоОтметкаНезаполненного = (ЭтаФорма[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); + Элементы[ПодчиненныйВопрос.ИмяЭлементаПодчиненногоВопроса].АвтоОтметкаНезаполненного = (ЭтотОбъект[ИмяВопроса] И ПодчиненныйВопрос.Обязательный); Исключение КонецПопытки; @@ -197,6 +197,6 @@ Процедура УстановитьЗначенияРеквизитовФормыСогласноШаблонаАнкеты() РеквизитыШаблонАнкеты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ШаблонАнкеты,"Заголовок,Вступление,Заключение"); - ЗаполнитьЗначенияСвойств(ЭтаФорма,РеквизитыШаблонАнкеты); + ЗаполнитьЗначенияСвойств(ЭтотОбъект,РеквизитыШаблонАнкеты); КонецПроцедуры diff --git a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form index bc7b3fdd5..5ad9e4f3b 100644 --- a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Form.form @@ -33,8 +33,8 @@ СписокСостоянияУзлов.ОбластьДанных - СписокСостоянияУзловОбластьДанныхРасширеннаяПодсказка - 82 + СписокСостоянияУзловОбластьДанныхExtendedTooltip + 73 Label true true @@ -75,8 +75,8 @@ СписокСостоянияУзлов.ИмяПланаОбмена - СписокСостоянияУзловИмяПланаОбменаРасширеннаяПодсказка - 84 + СписокСостоянияУзловИмяПланаОбменаExtendedTooltip + 74 Label true true @@ -117,8 +117,8 @@ СписокСостоянияУзлов.УзелИнформационнойБазы - СписокСостоянияУзловУзелИнформационнойБазыРасширеннаяПодсказка - 86 + СписокСостоянияУзловУзелИнформационнойБазыExtendedTooltip + 75 Label true true @@ -166,8 +166,8 @@ None - СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхРасширеннаяПодсказка - 90 + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхExtendedTooltip + 78 Label true true @@ -211,8 +211,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейВыгрузки - СписокСостоянияУзловДатаПоследнейВыгрузкиРасширеннаяПодсказка - 92 + СписокСостоянияУзловДатаПоследнейВыгрузкиExtendedTooltip + 79 Label true true @@ -262,8 +262,8 @@ Группа состояния выгрузки - ГруппаСостоянияВыгрузкиРасширеннаяПодсказка - 89 + ГруппаСостоянияВыгрузкиExtendedTooltip + 77 Label true true @@ -289,8 +289,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойВыгрузки - СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиРасширеннаяПодсказка - 94 + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиExtendedTooltip + 80 Label true true @@ -341,8 +341,8 @@ true - ГруппаВыгрузкиРасширеннаяПодсказка - 88 + ГруппаВыгрузкиExtendedTooltip + 76 Label true true @@ -376,8 +376,8 @@ None - СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхРасширеннаяПодсказка - 98 + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхExtendedTooltip + 83 Label true true @@ -421,8 +421,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейЗагрузки - СписокСостоянияУзловДатаПоследнейЗагрузкиРасширеннаяПодсказка - 100 + СписокСостоянияУзловДатаПоследнейЗагрузкиExtendedTooltip + 84 Label true true @@ -472,8 +472,8 @@ Группа состояния загрузки - ГруппаСостоянияЗагрузкиРасширеннаяПодсказка - 97 + ГруппаСостоянияЗагрузкиExtendedTooltip + 82 Label true true @@ -499,8 +499,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойЗагрузки - СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиРасширеннаяПодсказка - 102 + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиExtendedTooltip + 85 Label true true @@ -551,8 +551,8 @@ true - ГруппаЗагрузкиРасширеннаяПодсказка - 96 + ГруппаЗагрузкиExtendedTooltip + 81 Label true true @@ -582,7 +582,7 @@ true - СписокСостоянияУзловНайтиРасширеннаяПодсказка + СписокСостоянияУзловНайтиExtendedTooltip 62 Label true @@ -609,7 +609,7 @@ true - СписокСостоянияУзловОтменитьПоискРасширеннаяПодсказка + СписокСостоянияУзловОтменитьПоискExtendedTooltip 63 Label true @@ -641,7 +641,7 @@ Список состояния узлов группа найти - СписокСостоянияУзловГруппаНайтиРасширеннаяПодсказка + СписокСостоянияУзловГруппаНайтиExtendedTooltip 61 Label true @@ -664,7 +664,7 @@ true - СписокСостоянияУзловОбновитьМониторРасширеннаяПодсказка + СписокСостоянияУзловОбновитьМониторExtendedTooltip 65 Label true @@ -696,7 +696,7 @@ Список состояния узлов группа обновить монитор - СписокСостоянияУзловГруппаОбновитьМониторРасширеннаяПодсказка + СписокСостоянияУзловГруппаОбновитьМониторExtendedTooltip 64 Label true @@ -716,7 +716,7 @@ true - СписокСостоянияУзловПодробноРасширеннаяПодсказка + СписокСостоянияУзловПодробноExtendedTooltip 66 Label true @@ -745,7 +745,7 @@ true - СписокСостоянияУзловКопироватьВБуферОбменаРасширеннаяПодсказка + СписокСостоянияУзловКопироватьВБуферОбменаExtendedTooltip 68 Label true @@ -772,7 +772,7 @@ true - СписокСостоянияУзловВывестиСписокРасширеннаяПодсказка + СписокСостоянияУзловВывестиСписокExtendedTooltip 69 Label true @@ -804,7 +804,7 @@ Список состояния узлов группа вывести список - СписокСостоянияУзловГруппаВывестиСписокРасширеннаяПодсказка + СписокСостоянияУзловГруппаВывестиСписокExtendedTooltip 67 Label true @@ -824,7 +824,7 @@ true - СписокСостоянияУзловИзменитьФормуРасширеннаяПодсказка + СписокСостоянияУзловИзменитьФормуExtendedTooltip 70 Label true @@ -850,7 +850,7 @@ true - СписокСостоянияУзловСправкаРасширеннаяПодсказка + СписокСостоянияУзловСправкаExtendedTooltip 71 Label true @@ -871,10 +871,10 @@ СписокСостоянияУзловСтрокаПоиска - 73 + 86 СписокСостоянияУзловСтрокаПоискаРасширеннаяПодсказка - 75 + 88 Label true true @@ -884,7 +884,7 @@ СписокСостоянияУзловСтрокаПоискаКонтекстноеМеню - 74 + 87 true СписокСостоянияУзлов @@ -894,10 +894,10 @@ СписокСостоянияУзловСостояниеПросмотра - 76 + 89 СписокСостоянияУзловСостояниеПросмотраРасширеннаяПодсказка - 78 + 91 Label true true @@ -907,7 +907,7 @@ СписокСостоянияУзловСостояниеПросмотраКонтекстноеМеню - 77 + 90 true ViewStatusAddition @@ -918,10 +918,10 @@ СписокСостоянияУзловУправлениеПоиском - 79 + 92 СписокСостоянияУзловУправлениеПоискомРасширеннаяПодсказка - 81 + 94 Label true true @@ -931,7 +931,7 @@ СписокСостоянияУзловУправлениеПоискомКонтекстноеМеню - 80 + 93 true SearchControlAddition @@ -941,7 +941,7 @@ - СписокСостоянияУзловРасширеннаяПодсказка + СписокСостоянияУзловExtendedTooltip 72 Label true @@ -965,7 +965,7 @@ true - СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхExtendedTooltip 56 Label true @@ -991,7 +991,7 @@ true - СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхExtendedTooltip 57 Label true @@ -1014,7 +1014,7 @@ true - СписокСостоянияУзловКонтекстноеМенюГруппа2РасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюГруппа2ExtendedTooltip 55 Label true @@ -1037,7 +1037,7 @@ true - СписокСостоянияУзловКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюВывестиСписокExtendedTooltip 59 Label true @@ -1063,7 +1063,7 @@ true - СписокСостоянияУзловКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip 60 Label true @@ -1086,7 +1086,7 @@ true - СписокСостоянияУзловКонтекстноеМенюГруппа1РасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюГруппа1ExtendedTooltip 58 Label true diff --git a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Module.bsl b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Module.bsl index ebdcc7f7d..1c77e7263 100644 --- a/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonForms/МониторСинхронизацииДанныхВМоделиСервиса/Module.bsl @@ -30,7 +30,7 @@ Возврат; КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ВыгрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект, "ВыгрузкаДанных"); КонецПроцедуры @@ -43,7 +43,7 @@ Возврат; КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект, "ЗагрузкаДанных"); КонецПроцедуры @@ -98,7 +98,7 @@ Если ТекущиеДанные <> Неопределено Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Индекс(ТекущиеДанные); + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Индекс(ТекущиеДанные); КонецЕсли; @@ -111,16 +111,16 @@ Если ИндексСтроки <> Неопределено Тогда // выполняем проверки позиционирования курсора после получения новых данных - Если ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + Если ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Если ИндексСтроки > ЭтаФорма[ИмяТаблицы].Количество() - 1 Тогда + Если ИндексСтроки > ЭтотОбъект[ИмяТаблицы].Количество() - 1 Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Количество() - 1; + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Количество() - 1; КонецЕсли; // позиционируем курсор - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); КонецЕсли; diff --git a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form index 9a8291e97..eb29e89f6 100644 --- a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form +++ b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Form.form @@ -2,14 +2,14 @@ <key>ru</key> - <value>Подсказка</value> + <value>Получение файла для просмотра или редактирования</value> ТекстНапоминания 9 <key>ru</key> - <value>Сейчас браузер предложит Вам открыть или сохранить файл. + <value>Сейчас будет предложено открыть или сохранить файл. 1. Нажмите кнопку "Сохранить" ("Save"). @@ -25,7 +25,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстНапоминанияРасширеннаяПодсказка</name> + <name>ТекстНапоминанияExtendedTooltip</name> <id>20</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -42,6 +42,7 @@ <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> + <verticalStretch>false</verticalStretch> <extInfo xsi:type="form:LabelDecorationExtInfo"> <horizontalAlign>Left</horizontalAlign> </extInfo> @@ -49,64 +50,6 @@ <items xsi:type="form:FormGroup"> <name>Дополнения</name> <id>12</id> - <items xsi:type="form:FormGroup"> - <name>Пустая</name> - <id>16</id> - <items xsi:type="form:Decoration"> - <name>ПустаяНадпись</name> - <id>17</id> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <extendedTooltip> - <name>ПустаяНадписьРасширеннаяПодсказка</name> - <id>23</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>ПустаяНадписьКонтекстноеМеню</name> - <id>18</id> - <autoFill>true</autoFill> - </contextMenu> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </items> - <visible>true</visible> - <enabled>true</enabled> - <userVisible> - <common>true</common> - </userVisible> - <title> - <key>ru</key> - <value>Пустая</value> - - - ПустаяРасширеннаяПодсказка - 22 - Label - true - true - - Left - - - Page - - Vertical - auto - - MozillaFireFox 13 @@ -123,7 +66,7 @@ true - ДополнениеMozillaFireFoxРасширеннаяПодсказка + ДополнениеMozillaFireFoxExtendedTooltip 25 Label true @@ -154,7 +97,7 @@ Mozilla Firefox - MozillaFireFoxРасширеннаяПодсказка + MozillaFireFoxExtendedTooltip 24 Label true @@ -169,6 +112,64 @@ auto + + Пустая + 16 + + ПустаяНадпись + 17 + true + true + + true + + + ПустаяНадписьExtendedTooltip + 23 + Label + true + true + + Left + + + + ПустаяНадписьКонтекстноеМеню + 18 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Пустая</value> + + + ПустаяExtendedTooltip + 22 + Label + true + true + + Left + + + Page + + Vertical + auto + + true true @@ -182,8 +183,9 @@ ru Дополнения + true - ДополненияРасширеннаяПодсказка + ДополненияExtendedTooltip 21 Label true @@ -214,7 +216,7 @@ Right 1 - ПоказыватьНапоминаниеПриРедактированииРасширеннаяПодсказка + ПоказыватьНапоминаниеПриРедактированииExtendedTooltip 27 Label true @@ -249,7 +251,7 @@ Отступ - ОтступРасширеннаяПодсказка + ОтступExtendedTooltip 26 Label true @@ -274,7 +276,7 @@ ФормаКоманднаяПанель -1 - ФормаОК + ФормаПродолжить 8 true true @@ -282,7 +284,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаПродолжитьРасширеннаяПодсказка 19 Label true @@ -291,7 +293,7 @@ Left - Form.Command.ОК + Form.Command.Продолжить Auto true true @@ -309,7 +311,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical @@ -323,7 +325,7 @@ БольшеНеПоказывать <key>ru</key> - <value>Больше не показывать подсказки</value> + <value>Больше не показывать это сообщение</value> 1 @@ -355,22 +357,22 @@ - ОК + Продолжить <key>ru</key> - <value>ОК</value> + <value>Продолжить</value> 1 ru - ОК + Продолжить true - ОК + ПродолжитьВыполнить Auto diff --git a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl index ebcfe15ee..925ffdced 100644 --- a/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl +++ b/SSL/src/CommonForms/НапоминаниеПриРедактировании/Module.bsl @@ -27,8 +27,12 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура ОК(Команда) - +Процедура ПродолжитьВыполнить(Команда) + Если БольшеНеПоказывать = Истина Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( + "НастройкиПрограммы", + "ПоказыватьПодсказкиПриРедактированииФайлов", + Ложь); + КонецЕсли; Закрыть(БольшеНеПоказывать); - КонецПроцедуры diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form index 1780a8529..400a85813 100644 --- a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Form.form @@ -44,8 +44,8 @@ КомандыИсточник.Наименование - ВсеКомандыНаименованиеРасширеннаяПодсказка - 32 + ВсеКомандыНаименованиеExtendedTooltip + 23 Label true true @@ -83,10 +83,10 @@ КомандыИсточникСтрокаПоиска - 23 + 31 КомандыИсточникСтрокаПоискаРасширеннаяПодсказка - 25 + 33 Label true true @@ -96,7 +96,7 @@ КомандыИсточникСтрокаПоискаКонтекстноеМеню - 24 + 32 true КомандыИсточник @@ -106,10 +106,10 @@ КомандыИсточникСостояниеПросмотра - 26 + 34 КомандыИсточникСостояниеПросмотраРасширеннаяПодсказка - 28 + 36 Label true true @@ -119,7 +119,7 @@ КомандыИсточникСостояниеПросмотраКонтекстноеМеню - 27 + 35 true ViewStatusAddition @@ -130,10 +130,10 @@ КомандыИсточникУправлениеПоиском - 29 + 37 КомандыИсточникУправлениеПоискомРасширеннаяПодсказка - 31 + 39 Label true true @@ -143,7 +143,7 @@ КомандыИсточникУправлениеПоискомКонтекстноеМеню - 30 + 38 true SearchControlAddition @@ -153,7 +153,7 @@ - КомандыИсточникРасширеннаяПодсказка + КомандыИсточникExtendedTooltip 22 Label true @@ -205,8 +205,8 @@ false - ДобавитьКомандуРасширеннаяПодсказка - 43 + ДобавитьКомандуExtendedTooltip + 25 Label true true @@ -232,8 +232,8 @@ false - ДобавитьВсеКомандыРасширеннаяПодсказка - 44 + ДобавитьВсеКомандыExtendedTooltip + 26 Label true true @@ -260,8 +260,8 @@ false - УдалитьВсеКомандыРасширеннаяПодсказка - 45 + УдалитьВсеКомандыExtendedTooltip + 27 Label true true @@ -288,8 +288,8 @@ false - УдалитьКомандуРасширеннаяПодсказка - 46 + УдалитьКомандуExtendedTooltip + 28 Label true true @@ -317,8 +317,8 @@ true - КомандыУправленияСпискомРасширеннаяПодсказка - 42 + КомандыУправленияСпискомExtendedTooltip + 24 Label true true @@ -379,8 +379,8 @@ МоиКоманды.Наименование - МоиКомандыНаименованиеРасширеннаяПодсказка - 57 + МоиКомандыНаименованиеExtendedTooltip + 30 Label true true @@ -416,10 +416,10 @@ МоиКомандыСтрокаПоиска - 48 + 49 МоиКомандыСтрокаПоискаРасширеннаяПодсказка - 50 + 51 Label true true @@ -429,7 +429,7 @@ МоиКомандыСтрокаПоискаКонтекстноеМеню - 49 + 50 true МоиКоманды @@ -439,10 +439,10 @@ МоиКомандыСостояниеПросмотра - 51 + 52 МоиКомандыСостояниеПросмотраРасширеннаяПодсказка - 53 + 54 Label true true @@ -452,7 +452,7 @@ МоиКомандыСостояниеПросмотраКонтекстноеМеню - 52 + 53 true ViewStatusAddition @@ -463,10 +463,10 @@ МоиКомандыУправлениеПоиском - 54 + 55 МоиКомандыУправлениеПоискомРасширеннаяПодсказка - 56 + 57 Label true true @@ -476,7 +476,7 @@ МоиКомандыУправлениеПоискомКонтекстноеМеню - 55 + 56 true SearchControlAddition @@ -486,8 +486,8 @@ - МоиКомандыРасширеннаяПодсказка - 47 + МоиКомандыExtendedTooltip + 29 Label true true @@ -539,7 +539,7 @@ Общая группа - ОбщаяГруппаРасширеннаяПодсказка + ОбщаяГруппаExtendedTooltip 21 Label true @@ -573,7 +573,7 @@ true false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 19 Label true @@ -600,7 +600,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 20 Label true @@ -627,10 +627,6 @@ OnCreateAtServer ПриСозданииНаСервере - - OnClose - ПриЗакрытии - LockOwner true true diff --git a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl index 2ac20c7db..712909bb4 100644 --- a/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl +++ b/SSL/src/CommonForms/НастройкаМоихОтчетовИОбработок/Module.bsl @@ -3,12 +3,11 @@ &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Если Параметры.Свойство("АвтоТест") Тогда Возврат; КонецЕсли; - ЗаполнитьЗначенияСвойств(ЭтаФорма, Параметры, "ВидОбработок, ЭтоГлобальныеОбработки, ТекущийРаздел"); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры, "ВидОбработок, ЭтоГлобальныеОбработки, ТекущийРаздел"); ЗаполнитьДеревоОбработок(Истина, "МоиКоманды"); ЗаполнитьДеревоОбработок(Ложь, "КомандыИсточник"); @@ -17,18 +16,10 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если ДополнительныеОтчетыИОбработкиКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность, Отказ) Тогда - ЗаписатьНаборОбработокПользователя(); - ОповеститьОВыборе("ВыполненаНастройкаМоихОтчетовИОбработок"); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если ДополнительныеОтчетыИОбработкиКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность) Тогда - ЗаписатьНаборОбработокПользователя(); - ОповеститьОВыборе("ВыполненаНастройкаМоихОтчетовИОбработок"); - КонецЕсли; + ТекстВопроса = НСтр("ru = 'Список выводимых команд был изменен. + |Сохранить изменения?'"); + Обработчик = Новый ОписаниеОповещения("СохранитьИОповеститьОВыборе", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Обработчик, Отказ, ТекстВопроса); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -92,6 +83,14 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура СохранитьИОповеститьОВыборе(Результат, ДополнительныеПараметры) Экспорт + + ЗаписатьНаборОбработокПользователя(); + ОповеститьОВыборе("ВыполненаНастройкаМоихОтчетовИОбработок"); + +КонецПроцедуры + &НаСервере Функция ЗаполнитьДеревоОбработок(КомандыПользователя, ИмяЭлементыРеквизитаДерева) diff --git a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form index 9e2fb7fee..e139905d4 100644 --- a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form +++ b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Form.form @@ -38,8 +38,8 @@ None - СписокСостоянияУзловВедущаяРасширеннаяПодсказка - 88 + СписокСостоянияУзловВедущаяExtendedTooltip + 79 Label true true @@ -83,8 +83,8 @@ СписокСостоянияУзлов.УзелИнформационнойБазы - СписокСостоянияУзловУзелИнформационнойБазыРасширеннаяПодсказка - 90 + СписокСостоянияУзловУзелИнформационнойБазыExtendedTooltip + 80 Label true true @@ -122,8 +122,8 @@ Список состояния узлов группа основная - СписокСостоянияУзловГруппаОсновнаяРасширеннаяПодсказка - 87 + СписокСостоянияУзловГруппаОсновнаяExtendedTooltip + 78 Label true true @@ -157,8 +157,8 @@ None - СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхРасширеннаяПодсказка - 94 + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхExtendedTooltip + 83 Label true true @@ -202,8 +202,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойЗагрузки - СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиРасширеннаяПодсказка - 96 + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиExtendedTooltip + 84 Label true true @@ -245,8 +245,8 @@ Группа состояния загрузки - ГруппаСостоянияЗагрузкиРасширеннаяПодсказка - 93 + ГруппаСостоянияЗагрузкиExtendedTooltip + 82 Label true true @@ -272,8 +272,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейЗагрузки - СписокСостоянияУзловДатаПоследнейЗагрузкиРасширеннаяПодсказка - 98 + СписокСостоянияУзловДатаПоследнейЗагрузкиExtendedTooltip + 85 Label true true @@ -308,8 +308,8 @@ true - ГруппаЗагрузкиРасширеннаяПодсказка - 92 + ГруппаЗагрузкиExtendedTooltip + 81 Label true true @@ -343,8 +343,8 @@ None - СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхРасширеннаяПодсказка - 102 + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхExtendedTooltip + 88 Label true true @@ -388,8 +388,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойВыгрузки - СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиРасширеннаяПодсказка - 104 + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиExtendedTooltip + 89 Label true true @@ -431,8 +431,8 @@ Группа состояния выгрузки - ГруппаСостоянияВыгрузкиРасширеннаяПодсказка - 101 + ГруппаСостоянияВыгрузкиExtendedTooltip + 87 Label true true @@ -458,8 +458,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейВыгрузки - СписокСостоянияУзловДатаПоследнейВыгрузкиРасширеннаяПодсказка - 106 + СписокСостоянияУзловДатаПоследнейВыгрузкиExtendedTooltip + 90 Label true true @@ -494,8 +494,8 @@ true - ГруппаВыгрузкиРасширеннаяПодсказка - 100 + ГруппаВыгрузкиExtendedTooltip + 86 Label true true @@ -525,7 +525,7 @@ true - СписокСостоянияУзловОтправитьИПолучитьСообщенияРасширеннаяПодсказка + СписокСостоянияУзловОтправитьИПолучитьСообщенияExtendedTooltip 62 Label true @@ -552,7 +552,7 @@ Список состояния узлов отправить и получить сообщения сейчас - СписокСостоянияУзловОтправитьИПолучитьСообщенияСейчасРасширеннаяПодсказка + СписокСостоянияУзловОтправитьИПолучитьСообщенияСейчасExtendedTooltip 61 Label true @@ -575,7 +575,7 @@ true - СписокСостоянияУзловВключитьОтключитьРасписаниеОтправкиИПолученияСообщенийСистемыРасширеннаяПодсказка + СписокСостоянияУзловВключитьОтключитьРасписаниеОтправкиИПолученияСообщенийСистемыExtendedTooltip 64 Label true @@ -601,7 +601,7 @@ true - СписокСостоянияУзловНастроитьРасписаниеОтправкиИПолученияСообщенийСистемыРасширеннаяПодсказка + СписокСостоянияУзловНастроитьРасписаниеОтправкиИПолученияСообщенийСистемыExtendedTooltip 65 Label true @@ -628,7 +628,7 @@ Расписание отправки и получения - СписокСостоянияУзловРасписаниеОтправкиИПолученияРасширеннаяПодсказка + СписокСостоянияУзловРасписаниеОтправкиИПолученияExtendedTooltip 63 Label true @@ -655,7 +655,7 @@ true - СписокСостоянияУзловПодключитьКонечнуюТочкуРасширеннаяПодсказка + СписокСостоянияУзловПодключитьКонечнуюТочкуExtendedTooltip 66 Label true @@ -681,7 +681,7 @@ true - СписокСостоянияУзловИзменитьКонечнуюТочкуРасширеннаяПодсказка + СписокСостоянияУзловИзменитьКонечнуюТочкуExtendedTooltip 67 Label true @@ -711,7 +711,7 @@ true - СписокСостоянияУзловОбновитьМониторРасширеннаяПодсказка + СписокСостоянияУзловОбновитьМониторExtendedTooltip 69 Label true @@ -735,7 +735,7 @@ true - СписокСостоянияУзловГруппа2РасширеннаяПодсказка + СписокСостоянияУзловГруппа2ExtendedTooltip 68 Label true @@ -755,7 +755,7 @@ true - СписокСостоянияУзловНастроитьПодпискиРасширеннаяПодсказка + СписокСостоянияУзловНастроитьПодпискиExtendedTooltip 70 Label true @@ -785,7 +785,7 @@ true - СписокСостоянияУзловНайтиРасширеннаяПодсказка + СписокСостоянияУзловНайтиExtendedTooltip 72 Label true @@ -812,7 +812,7 @@ true - СписокСостоянияУзловОтменитьПоискРасширеннаяПодсказка + СписокСостоянияУзловОтменитьПоискExtendedTooltip 73 Label true @@ -839,7 +839,7 @@ true - СписокСостоянияУзловВывестиСписокРасширеннаяПодсказка + СписокСостоянияУзловВывестиСписокExtendedTooltip 74 Label true @@ -866,7 +866,7 @@ true - СписокСостоянияУзловКопироватьВБуферОбменаРасширеннаяПодсказка + СписокСостоянияУзловКопироватьВБуферОбменаExtendedTooltip 75 Label true @@ -890,7 +890,7 @@ true - СписокСостоянияУзловГруппа1РасширеннаяПодсказка + СписокСостоянияУзловГруппа1ExtendedTooltip 71 Label true @@ -910,7 +910,7 @@ true - СписокСостоянияУзловПодробноРасширеннаяПодсказка + СписокСостоянияУзловПодробноExtendedTooltip 76 Label true @@ -935,10 +935,10 @@ СписокСостоянияУзловСтрокаПоиска - 78 + 91 СписокСостоянияУзловСтрокаПоискаРасширеннаяПодсказка - 80 + 93 Label true true @@ -948,7 +948,7 @@ СписокСостоянияУзловСтрокаПоискаКонтекстноеМеню - 79 + 92 true СписокСостоянияУзлов @@ -958,10 +958,10 @@ СписокСостоянияУзловСостояниеПросмотра - 81 + 94 СписокСостоянияУзловСостояниеПросмотраРасширеннаяПодсказка - 83 + 96 Label true true @@ -971,7 +971,7 @@ СписокСостоянияУзловСостояниеПросмотраКонтекстноеМеню - 82 + 95 true ViewStatusAddition @@ -982,10 +982,10 @@ СписокСостоянияУзловУправлениеПоиском - 84 + 97 СписокСостоянияУзловУправлениеПоискомРасширеннаяПодсказка - 86 + 99 Label true true @@ -995,7 +995,7 @@ СписокСостоянияУзловУправлениеПоискомКонтекстноеМеню - 85 + 98 true SearchControlAddition @@ -1005,7 +1005,7 @@ - СписокСостоянияУзловРасширеннаяПодсказка + СписокСостоянияУзловExtendedTooltip 77 Label true @@ -1026,7 +1026,7 @@ true - СписокСостоянияУзловКонтекстноеМенюИзменитьКонечнуюТочкуРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюИзменитьКонечнуюТочкуExtendedTooltip 54 Label true @@ -1055,7 +1055,7 @@ true - СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхExtendedTooltip 56 Label true @@ -1081,7 +1081,7 @@ true - СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхExtendedTooltip 57 Label true @@ -1104,7 +1104,7 @@ true - СписокСостоянияУзловКонтекстноеМенюГруппа2РасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюГруппа2ExtendedTooltip 55 Label true @@ -1127,7 +1127,7 @@ true - СписокСостоянияУзловКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюВывестиСписокExtendedTooltip 59 Label true @@ -1153,7 +1153,7 @@ true - СписокСостоянияУзловКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip 60 Label true @@ -1176,7 +1176,7 @@ true - СписокСостоянияУзловКонтекстноеМенюГруппа1РасширеннаяПодсказка + СписокСостоянияУзловКонтекстноеМенюГруппа1ExtendedTooltip 58 Label true diff --git a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl index e2ad7de8f..68b38657d 100644 --- a/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl +++ b/SSL/src/CommonForms/НастройкаОбменаСообщениями/Module.bsl @@ -57,14 +57,14 @@ &НаКлиенте Процедура ПодключитьКонечнуюТочку(Команда) - ОткрытьФорму("ОбщаяФорма.ПодключениеКонечнойТочки",, ЭтаФорма, 1); + ОткрытьФорму("ОбщаяФорма.ПодключениеКонечнойТочки",, ЭтотОбъект, 1); КонецПроцедуры &НаКлиенте Процедура НастроитьПодписки(Команда) - ОткрытьФорму("РегистрСведений.ПодпискиПолучателей.Форма.НастройкаПодписокЭтойКонечнойТочки",, ЭтаФорма); + ОткрытьФорму("РегистрСведений.ПодпискиПолучателей.Форма.НастройкаПодписокЭтойКонечнойТочки",, ЭтотОбъект); КонецПроцедуры @@ -84,7 +84,7 @@ Возврат; КонецЕсли; - ОткрытьЗначение(ТекущиеДанные.УзелИнформационнойБазы); + ПоказатьЗначение(, ТекущиеДанные.УзелИнформационнойБазы); КонецПроцедуры @@ -97,7 +97,7 @@ Возврат; КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ВыгрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект, "ВыгрузкаДанных"); КонецПроцедуры @@ -110,7 +110,7 @@ Возврат; КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма, "ЗагрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект, "ЗагрузкаДанных"); КонецПроцедуры @@ -118,10 +118,17 @@ Процедура НастроитьРасписаниеОтправкиИПолученияСообщенийСистемы(Команда) Диалог = Новый ДиалогРасписанияРегламентногоЗадания(ПолучитьРасписание()); + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьРасписаниеОтправкиИПолученияСообщенийСистемы", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещения); - Если Диалог.ОткрытьМодально() Тогда +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьРасписаниеОтправкиИПолученияСообщенийСистемы(Расписание, ДополнительныеПараметры) Экспорт + + Если Расписание <> Неопределено Тогда - УстановитьРасписание(Диалог.Расписание); + УстановитьРасписание(Расписание); КонецЕсли; @@ -234,7 +241,7 @@ Если ТекущиеДанные <> Неопределено Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Индекс(ТекущиеДанные); + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Индекс(ТекущиеДанные); КонецЕсли; @@ -247,16 +254,16 @@ Если ИндексСтроки <> Неопределено Тогда // выполняем проверки позиционирования курсора после получения новых данных - Если ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + Если ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Если ИндексСтроки > ЭтаФорма[ИмяТаблицы].Количество() - 1 Тогда + Если ИндексСтроки > ЭтотОбъект[ИмяТаблицы].Количество() - 1 Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Количество() - 1; + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Количество() - 1; КонецЕсли; // позиционируем курсор - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); КонецЕсли; diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form index f097af560..f59203018 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Form.form @@ -23,8 +23,8 @@ РабочийКаталогПользователя - РабочийКаталогПользователяРасширеннаяПодсказка - 30 + РабочийКаталогПользователяExtendedTooltip + 31 Label true true @@ -70,7 +70,7 @@ false - ПутьКРабочемуКаталогуПоУмолчаниюРасширеннаяПодсказка + ПутьКРабочемуКаталогуПоУмолчаниюExtendedTooltip 32 Label true @@ -98,8 +98,8 @@ Группа расположение - ГруппаРасположениеРасширеннаяПодсказка - 29 + ГруппаРасположениеExtendedTooltip + 30 Label true true @@ -136,7 +136,7 @@ МаксимальныйРазмерЛокальногоКэшаФайловПриИзменении - МаксимальныйРазмерЛокальногоКэшаФайловРасширеннаяПодсказка + МаксимальныйРазмерЛокальногоКэшаФайловExtendedTooltip 33 Label true @@ -189,8 +189,8 @@ ПодтверждатьПриУдаленииИзЛокальногоКэшаФайловПриИзменении - ПодтверждатьПриУдаленииИзЛокальногоКэшаФайловРасширеннаяПодсказка - 35 + ПодтверждатьПриУдаленииИзЛокальногоКэшаФайловExtendedTooltip + 34 Label true true @@ -227,8 +227,8 @@ УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактированияПриИзменении - УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактированияРасширеннаяПодсказка - 37 + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактированияExtendedTooltip + 35 Label true true @@ -267,8 +267,8 @@ КоличествоСуммарное - КоличествоСуммарноеРасширеннаяПодсказка - 40 + КоличествоСуммарноеExtendedTooltip + 37 Label true true @@ -316,8 +316,8 @@ РазмерФайловВРабочемКаталоге - РазмерФайловВРабочемКаталогеРасширеннаяПодсказка - 42 + РазмерФайловВРабочемКаталогеExtendedTooltip + 38 Label true true @@ -363,8 +363,8 @@ Текущее состояние: - СейчасВЛокальномКэшеФайловРасширеннаяПодсказка - 39 + СейчасВЛокальномКэшеФайловExtendedTooltip + 36 Label true true @@ -393,8 +393,8 @@ false - СписокФайловРасширеннаяПодсказка - 44 + СписокФайловExtendedTooltip + 39 Label true true @@ -430,8 +430,8 @@ false - ОчиститьРабочийКаталогРасширеннаяПодсказка - 45 + ОчиститьРабочийКаталогExtendedTooltip + 40 Label true true diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html index 274c6a30c..e497afecd 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Help/ru.html @@ -1,4 +1,4 @@ - +

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

          Из шаблона Новый файл будет создан на основе выбранного шаблона 
          Из файла Снимает с файла пометку занятости для редактирования
           Открыть Открывает файл внешним приложением для просмотра или редактирования, в зависимости от того, помечен ли файл как занятый текущим пользователем для редактирования.
           Сохранить как Сохраняет файл файл в указанный каталог на жестком или сетевом диске 
           Обновить из файла на дискеОбновляет файл в информационной базе выбранным файлом на жестком диске.
           ПодписатьОбновляет файл в информационной базе выбранным файлом на жестком диске.
           Подписать Открывает диалог для выбора сертификата и установки подписи.
          Добавить ЭП из файла Добавляет выбранный файл подписи к подписям файла
          Сохранить вместе с ЭП Сохраняет файл в указанный каталог на жестком или сетевом диске, а также сохраняет подписи файла - все или выбранные, в зависимости от настройки "Действия при сохранении с ЭП"
          Открыть подпись
          diff --git a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl index fec99d2dc..e2b7be541 100644 --- a/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl +++ b/SSL/src/CommonForms/НастройкаОсновногоРабочегоКаталога/Module.bsl @@ -8,21 +8,20 @@ Возврат; КонецЕсли; - ЗаполнитьПараметрыНаСервере(); - Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда Элементы.СейчасВЛокальномКэшеФайлов.Видимость = Ложь; Элементы.ОчиститьРабочийКаталог.Видимость = Ложь; КонецЕсли; + ЗаполнитьПараметрыНаСервере(); + КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если НЕ РасширениеПодключено Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); + Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда + ПодключитьОбработчикОжидания("ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами", 0.1, Истина); Отказ = Истина; Возврат; КонецЕсли; @@ -81,13 +80,43 @@ // ОБРАБОТЧИКИ КОМАНД ФОРМЫ &НаКлиенте -Процедура СписокФайловВыполнить() +Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами() - ОткрытьФормуМодально("Справочник.Файлы.Форма.ФайлыВОсновномРабочемКаталоге", , ЭтаФорма); - ОбновитьТекущееСостояниеРабочегоКаталога(); + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); КонецПроцедуры +&НаКлиенте +Процедура СписокФайловВыполнить() + + ОткрытьФорму("Справочник.Файлы.Форма.ФайлыВОсновномРабочемКаталоге", , ЭтотОбъект,,,, + Новый ОписаниеОповещения("СписокФайловЗакрытие", ЭтотОбъект)); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьЛокальныйКэшФайлов(Команда) + + ТекстВопроса = + НСтр("ru = 'Из основного рабочего каталога будут удалены все файлы, + |кроме занятых вами для редактирования. + | + |Продолжить?'"); + Обработчик = Новый ОписаниеОповещения("ОчиститьЛокальныйКэшФайловПослеОтветаНаВопросПродолжить", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура ПутьКРабочемуКаталогуПоУмолчанию(Команда) + + УстановитьНовыйРабочийКаталог(ФайловыеФункцииСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя()); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + &НаКлиенте Процедура СохранитьПараметры() @@ -123,15 +152,8 @@ КонецПроцедуры &НаКлиенте -Процедура ОчиститьЛокальныйКэшФайлов(Команда) - - ТекстВопроса = - НСтр("ru = 'Из основного рабочего каталога будут удалены все файлы, - |кроме занятых вами для редактирования. - | - |Продолжить?'"); +Процедура ОчиститьЛокальныйКэшФайловПослеОтветаНаВопросПродолжить(Ответ, ПараметрыВыполнения) Экспорт - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); Если Ответ = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; @@ -139,8 +161,14 @@ Состояние(НСтр("ru = 'Выполняется очистка основного рабочего каталога... |Пожалуйста, подождите.'")); + Обработчик = Новый ОписаниеОповещения("ОчиститьЛокальныйКэшФайловЗавершение", ЭтотОбъект); // ОчищатьВсе = Истина. - РаботаСФайламиСлужебныйКлиент.ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, 0, Истина); + РаботаСФайламиСлужебныйКлиент.ОчиститьРабочийКаталог(Обработчик, РазмерФайловВРабочемКаталоге, 0, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьЛокальныйКэшФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт ОбновитьТекущееСостояниеРабочегоКаталога(); @@ -149,15 +177,12 @@ КонецПроцедуры &НаКлиенте -Процедура ПутьКРабочемуКаталогуПоУмолчанию(Команда) +Процедура СписокФайловЗакрытие(Результат, ДополнительныеПараметры) Экспорт - УстановитьНовыйРабочийКаталог(ФайловыеФункцииСлужебныйКлиент.ВыбратьПутьККаталогуДанныхПользователя()); + ОбновитьТекущееСостояниеРабочегоКаталога(); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаСервере Процедура ЗаполнитьПараметрыНаСервере() @@ -214,12 +239,26 @@ КонецЕсли; #Если Не ВебКлиент Тогда - Если НЕ РаботаСФайламиСлужебныйКлиент.ПеренестиСодержимоеРабочегоКаталога( - РабочийКаталогПользователя, НовыйКаталог) Тогда - Возврат; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения( + "УстановитьНовыйРабочийКаталогЗавершение", ЭтотОбъект, НовыйКаталог); + + РаботаСФайламиСлужебныйКлиент.ПеренестиСодержимоеРабочегоКаталога( + Обработчик, РабочийКаталогПользователя, НовыйКаталог); +#Иначе + УстановитьНовыйРабочийКаталогЗавершение(-1, НовыйКаталог); #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьНовыйРабочийКаталогЗавершение(Результат, НовыйКаталог) Экспорт + + Если Результат <> -1 Тогда + Если Результат <> Истина Тогда + Возврат; + КонецЕсли; + КонецЕсли; + РабочийКаталогПользователя = НовыйКаталог; СохранитьПараметры(); diff --git a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form index 19780209b..9ab366a7f 100644 --- a/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form +++ b/SSL/src/CommonForms/НастройкаОтправкиSMS/Form.form @@ -16,7 +16,7 @@ НаборКонстант.ПровайдерSMS - ПровайдерSMSРасширеннаяПодсказка + ПровайдерSMSExtendedTooltip 11 Label true @@ -64,8 +64,8 @@ НаборКонстант.ЛогинДляОтправкиSMS - ЛогинДляОтправкиSMSРасширеннаяПодсказка - 13 + ЛогинДляОтправкиSMSExtendedTooltip + 12 Label true true @@ -111,8 +111,8 @@ НаборКонстант.ПарольДляОтправкиSMS - ПарольДляОтправкиSMSРасширеннаяПодсказка - 15 + ПарольДляОтправкиSMSExtendedTooltip + 13 Label true true @@ -155,8 +155,8 @@ true - ОписаниеУслугиБилайнРасширеннаяПодсказка - 17 + ОписаниеУслугиБилайнExtendedTooltip + 14 Label true true @@ -195,8 +195,8 @@ true - ОписаниеУслугиМТСРасширеннаяПодсказка - 18 + ОписаниеУслугиМТСExtendedTooltip + 15 Label true true diff --git a/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html b/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html index 7e8bb6040..66f55af97 100644 --- a/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html +++ b/SSL/src/CommonForms/НастройкаОтправкиSMS/Help/ru.html @@ -1,4 +1,4 @@ - +

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

          Описание услуги «Корпоративные SMS-сервисы» (Билайн)
          Описание услуги «МТС Коммуникатор» (МТС)

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

          diff --git a/SSL/src/CommonForms/НастройкиАгентаСервиса/Form.form b/SSL/src/CommonForms/НастройкиАгентаСервиса/Form.form index 890ae85fc..8ef459746 100644 --- a/SSL/src/CommonForms/НастройкиАгентаСервиса/Form.form +++ b/SSL/src/CommonForms/НастройкиАгентаСервиса/Form.form @@ -12,7 +12,7 @@ НаборКонстант.АдресАгентаСервиса - АдресАгентаСервисаРасширеннаяПодсказка + АдресАгентаСервисаExtendedTooltip 13 Label true @@ -58,8 +58,8 @@ НаборКонстант.ИмяПользователяАгентаСервиса - ИмяПользователяАгентаСервисаРасширеннаяПодсказка - 15 + ИмяПользователяАгентаСервисаExtendedTooltip + 14 Label true true @@ -104,8 +104,8 @@ НаборКонстант.ПарольПользователяАгентаСервиса - ПарольПользователяАгентаСервисаРасширеннаяПодсказка - 17 + ПарольПользователяАгентаСервисаExtendedTooltip + 15 Label true true diff --git a/SSL/src/CommonForms/НастройкиЭЦП/Form.form b/SSL/src/CommonForms/НастройкиКриптографии/Form.form similarity index 56% rename from SSL/src/CommonForms/НастройкиЭЦП/Form.form rename to SSL/src/CommonForms/НастройкиКриптографии/Form.form index b3bb2fdf7..040a11d0a 100644 --- a/SSL/src/CommonForms/НастройкиЭЦП/Form.form +++ b/SSL/src/CommonForms/НастройкиКриптографии/Form.form @@ -1,7 +1,7 @@ - ПровайдерЭЦП + ПровайдерЭП 1 true true @@ -9,14 +9,14 @@ true - ПровайдерЭЦП + ПровайдерЭП OnChange - ПровайдерЭЦППриИзменении + ПровайдерЭППриИзменении - ПровайдерЭЦПРасширеннаяПодсказка + ПровайдерЭПРасширеннаяПодсказка 28 Label true @@ -26,7 +26,7 @@ - ПровайдерЭЦПКонтекстноеМеню + ПровайдерЭПКонтекстноеМеню 2 true @@ -38,13 +38,13 @@ ChoiceProcessing - ПровайдерЭЦПОбработкаВыбора + ПровайдерЭПОбработкаВыбора 50 true true true - true + true true true true @@ -56,7 +56,7 @@ - ТипПровайдераЭЦП + ТипПровайдераЭП 3 true true @@ -64,15 +64,15 @@ true - ТипПровайдераЭЦП + ТипПровайдераЭП OnChange - ТипПровайдераЭЦППриИзменении + ТипПровайдераЭППриИзменении - ТипПровайдераЭЦПРасширеннаяПодсказка - 30 + ТипПровайдераЭПРасширеннаяПодсказка + 29 Label true true @@ -81,7 +81,7 @@ - ТипПровайдераЭЦПКонтекстноеМеню + ТипПровайдераЭПКонтекстноеМеню 4 true @@ -115,8 +115,8 @@ АлгоритмПодписи - АлгоритмПодписиРасширеннаяПодсказка - 32 + АлгоритмПодписиExtendedTooltip + 30 Label true true @@ -159,8 +159,8 @@ АлгоритмХеширования - АлгоритмХешированияРасширеннаяПодсказка - 34 + АлгоритмХешированияExtendedTooltip + 31 Label true true @@ -203,8 +203,8 @@ АлгоритмШифрования - АлгоритмШифрованияРасширеннаяПодсказка - 36 + АлгоритмШифрованияExtendedTooltip + 32 Label true true @@ -236,7 +236,7 @@ - ВыполнятьПроверкуЭЦПНаСервере + ВыполнятьПроверкуЭПНаСервере 11 true true @@ -244,16 +244,16 @@ true - ВыполнятьПроверкуЭЦПНаСервере + ВыполнятьПроверкуЭПНаСервере Right OnChange - ВыполнятьПроверкуЭЦПНаСервереПриИзменении + ВыполнятьПроверкуЭПНаСервереПриИзменении - ВыполнятьПроверкуЭЦПНаСервереРасширеннаяПодсказка - 38 + ВыполнятьПроверкуЭПНаСервереРасширеннаяПодсказка + 33 Label true true @@ -262,7 +262,7 @@ - ВыполнятьПроверкуЭЦПНаСервереКонтекстноеМеню + ВыполнятьПроверкуЭПНаСервереКонтекстноеМеню 12 true @@ -273,35 +273,310 @@ true - - ПутиМодулейКриптографииСерверовLinux - 17 - - <key>ru</key> - <value>Пути модулей криптографии для серверов 1С:Предприятия под управлением ОС Linux</value> - - true - true - - true - - - ПутиМодулейКриптографииСерверовLinux - - Top - - ПутиМодулейКриптографииСерверовLinuxИмяКомпьютера - 20 + + ГруппаПутиМодулейКриптографииСерверовLinux + 38 + + ПутиМодулейКриптографииСерверовLinux + 17 true true true - ПутиМодулейКриптографииСерверовLinux.ИмяКомпьютера + ПутиМодулейКриптографииСерверовLinux + None + + ПутиМодулейКриптографииСерверовLinuxИмяКомпьютера + 20 + true + true + + true + + + ПутиМодулейКриптографииСерверовLinux.ИмяКомпьютера + + + ПутиМодулейКриптографииСерверовLinuxИмяКомпьютераExtendedTooltip + 35 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxИмяКомпьютераКонтекстноеМеню + 21 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографии + 22 + true + true + + true + + + ПутиМодулейКриптографииСерверовLinux.ПутьМодуляКриптографии + + + ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографииExtendedTooltip + 36 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографииКонтекстноеМеню + 23 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовLinuxКомментарий + 24 + true + true + + true + + + ПутиМодулейКриптографииСерверовLinux.Комментарий + + + ПутиМодулейКриптографииСерверовLinuxКомментарийExtendedTooltip + 37 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxКомментарийКонтекстноеМеню + 25 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель + 19 + Left + true + + + ПутиМодулейКриптографииСерверовLinuxСтрокаПоиска + 57 + + ПутиМодулейКриптографииСерверовLinuxСтрокаПоискаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxСтрокаПоискаКонтекстноеМеню + 58 + true + + ПутиМодулейКриптографииСерверовLinux + + true + + + + ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотра + 60 + + ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотраРасширеннаяПодсказка + 62 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотраКонтекстноеМеню + 61 + true + + ViewStatusAddition + ПутиМодулейКриптографииСерверовLinux + + true + + + + ПутиМодулейКриптографииСерверовLinuxУправлениеПоиском + 63 + + ПутиМодулейКриптографииСерверовLinuxУправлениеПоискомРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxУправлениеПоискомКонтекстноеМеню + 64 + true + + SearchControlAddition + ПутиМодулейКриптографииСерверовLinux + + true + + - ПутиМодулейКриптографииСерверовLinuxИмяКомпьютераРасширеннаяПодсказка + ПутиМодулейКриптографииСерверовLinuxExtendedTooltip + 34 + Label + true + true + + Left + + + + ПутиМодулейКриптографииСерверовLinuxКонтекстноеМеню + 18 + true + + true + true + true + true + MultiRow +
          true
          + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + +
          + true + true + + true + + + <key>ru</key> + <value>Пути модулей криптографии для серверов 1С:Предприятия под управлением ОС Linux</value> + + + ru + + + + ГруппаПутиМодулейКриптографииСерверовLinuxРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + +
          + + ГруппаСправочникНазначенияСертификатовЭП + 42 + + СправочникНазначенияСертификатовЭП + 49 + true + true + + true + + + СправочникНазначенияСертификатовЭПРасширеннаяПодсказка 50 Label true @@ -310,188 +585,69 @@ Left - - ПутиМодулейКриптографииСерверовLinuxИмяКомпьютераКонтекстноеМеню - 21 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - + Hyperlink + Catalog.НазначенияСертификатовЭП.StandardCommand.OpenList + Normal + Auto + true + true + UserCmds + Auto - - ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографии - 22 + + ПояснениеСправочникНазначенияСертификатовЭП + 46 + + <key>ru</key> + <value>Настройка представлений для кодов назначений сертификатов ЭП.</value> + true true true - - ПутиМодулейКриптографииСерверовLinux.ПутьМодуляКриптографии - - ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографииРасширеннаяПодсказка - 52 - Label - true - true - - Left - - - - ПутиМодулейКриптографииСерверовLinuxПутьМодуляКриптографииКонтекстноеМеню - 23 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПутиМодулейКриптографииСерверовLinuxКомментарий - 24 - true - true - - true - - - ПутиМодулейКриптографииСерверовLinux.Комментарий - - - ПутиМодулейКриптографииСерверовLinuxКомментарийРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - - ПутиМодулейКриптографииСерверовLinuxКомментарийКонтекстноеМеню - 25 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель - 19 - Left - true - - - ПутиМодулейКриптографииСерверовLinuxСтрокаПоиска - 41 - - ПутиМодулейКриптографииСерверовLinuxСтрокаПоискаРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - - ПутиМодулейКриптографииСерверовLinuxСтрокаПоискаКонтекстноеМеню - 42 - true - - ПутиМодулейКриптографииСерверовLinux - - true - - - - ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотра - 44 - - ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотраРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - - ПутиМодулейКриптографииСерверовLinuxСостояниеПросмотраКонтекстноеМеню - 45 - true - - ViewStatusAddition - ПутиМодулейКриптографииСерверовLinux - - true - - - - ПутиМодулейКриптографииСерверовLinuxУправлениеПоиском - 47 - - ПутиМодулейКриптографииСерверовLinuxУправлениеПоискомРасширеннаяПодсказка - 49 - Label - true - true - - Left - - - - ПутиМодулейКриптографииСерверовLinuxУправлениеПоискомКонтекстноеМеню + ПояснениеСправочникНазначенияСертификатовЭПРасширеннаяПодсказка 48 + Label + true + true + + Left + +
          + + ПояснениеСправочникНазначенияСертификатовЭПКонтекстноеМеню + 47 true - SearchControlAddition - ПутиМодулейКриптографииСерверовLinux - - true + Label + true + true + + Style.ПоясняющийТекст + + + Left + Top - + + true + true + + true + + + <key>ru</key> + <value> </value> + + + ru + + - ПутиМодулейКриптографииСерверовLinuxРасширеннаяПодсказка - 40 + ГруппаСправочникНазначенияСертификатовЭПРасширеннаяПодсказка + 43 Label true true @@ -499,36 +655,16 @@ Left
          - - ПутиМодулейКриптографииСерверовLinuxКонтекстноеМеню - 18 - true - - true - true - true - true - MultiRow -
          true
          - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - None - None - None - true - + UsualGroup + + Vertical + Auto + NormalSeparation + true + true + Auto + Auto + Bottom true @@ -544,7 +680,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 26 Label true @@ -570,7 +706,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 27 Label true @@ -613,7 +749,7 @@ auto true - ПровайдерЭЦП + ПровайдерЭП <key>ru</key> <value>Провайдер ЭП</value> @@ -631,7 +767,7 @@ </edit> </attributes> <attributes> - <name>ТипПровайдераЭЦП</name> + <name>ТипПровайдераЭП</name> <title> <key>ru</key> <value>Тип провайдера ЭП</value> @@ -689,7 +825,7 @@ <fillChecking>ShowError</fillChecking> </attributes> <attributes> - <name>ВыполнятьПроверкуЭЦПНаСервере</name> + <name>ВыполнятьПроверкуЭПНаСервере</name> <title> <key>ru</key> <value>Выполнять проверку ЭП на сервере</value> diff --git a/SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html b/SSL/src/CommonForms/НастройкиКриптографии/Help/ru.html similarity index 98% rename from SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html rename to SSL/src/CommonForms/НастройкиКриптографии/Help/ru.html index b465a55c0..6fe6c8867 100644 --- a/SSL/src/CommonForms/НастройкиЭЦП/Help/ru.html +++ b/SSL/src/CommonForms/НастройкиКриптографии/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>В форме выполняется настройка параметров для использования средств криптографии: электронной подписи (ЭП) и шифрования. <br>Для работы с криптографией вам потребуется установить стороннюю программу - криптопровайдер.</p> <p>В случае распределенной информационной базы эти настройки могут быть изменены только в главном узле. </p> <p></p> diff --git a/SSL/src/CommonForms/НастройкиЭЦП/Module.bsl b/SSL/src/CommonForms/НастройкиКриптографии/Module.bsl similarity index 76% rename from SSL/src/CommonForms/НастройкиЭЦП/Module.bsl rename to SSL/src/CommonForms/НастройкиКриптографии/Module.bsl index 4f958c364..36b76638f 100644 --- a/SSL/src/CommonForms/НастройкиЭЦП/Module.bsl +++ b/SSL/src/CommonForms/НастройкиКриптографии/Module.bsl @@ -15,15 +15,15 @@ ЭтоПодчиненныйУзел = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ(); Если ЭтоПодчиненныйУзел Тогда // мы в не главном узле - Элементы.ПровайдерЭЦП.ТолькоПросмотр = Истина; - Элементы.ТипПровайдераЭЦП.ТолькоПросмотр = Истина; + Элементы.ПровайдерЭП.ТолькоПросмотр = Истина; + Элементы.ТипПровайдераЭП.ТолькоПросмотр = Истина; Элементы.АлгоритмПодписи.ТолькоПросмотр = Истина; Элементы.АлгоритмХеширования.ТолькоПросмотр = Истина; Элементы.АлгоритмШифрования.ТолькоПросмотр = Истина; КонецЕсли; Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Элементы.ВыполнятьПроверкуЭЦПНаСервере.Видимость = Ложь; + Элементы.ВыполнятьПроверкуЭПНаСервере.Видимость = Ложь; Элементы.ПутиМодулейКриптографииСерверовLinux.Видимость = Ложь; КонецЕсли; @@ -46,31 +46,41 @@ Строка.Комментарий = Выборка.Комментарий; КонецЦикла; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Элементы.ПровайдерЭЦП.КнопкаВыпадающегоСписка = Истина; - КонецЕсли; - КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - ПодключитьМодульКриптографии(Отказ); + + Если ПодключитьРасширениеРаботыСКриптографией() Тогда + + ДействияПриОткрытии(); + + Иначе + + Отказ = Истина; + Обработчик = Новый ОписаниеОповещения("ОткрытьФормуПослеУстановкиРасширения", ЭтотОбъект); + ТекстВопроса = НСтр("ru = 'Для настройки ЭП необходимо установить + |расширение работы с криптографией.'"); + ЭлектроннаяПодписьКлиент.УстановитьРасширение(Обработчик, ТекстВопроса); + + КонецЕсли; + КонецПроцедуры &НаСервере Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - Если ЗначениеЗаполнено(ПровайдерЭЦП) И НЕ СпискиАлгоритмовУспешноЗаполнены Тогда + Если ЗначениеЗаполнено(ПровайдерЭП) И НЕ СпискиАлгоритмовУспешноЗаполнены Тогда Отказ = Истина; ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Не удалось подключить провайдера ЭП. |Укажите Провайдера и его Тип согласно инструкции фирмы-производителя криптопровайдера.'"), , - "ТипПровайдераЭЦП"); + "ТипПровайдераЭП"); КонецЕсли; ИсключаемыеРеквизиты = Новый Массив; - Если НЕ ЗначениеЗаполнено(ПровайдерЭЦП) ИЛИ ЭтоПодчиненныйУзел Тогда + Если НЕ ЗначениеЗаполнено(ПровайдерЭП) ИЛИ ЭтоПодчиненныйУзел Тогда ИсключаемыеРеквизиты.Добавить("АлгоритмПодписи"); ИсключаемыеРеквизиты.Добавить("АлгоритмХеширования"); @@ -89,29 +99,29 @@ // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ &НаКлиенте -Процедура ВыполнятьПроверкуЭЦПНаСервереПриИзменении(Элемент) +Процедура ВыполнятьПроверкуЭПНаСервереПриИзменении(Элемент) - Элементы.ПутиМодулейКриптографииСерверовLinux.Доступность = ВыполнятьПроверкуЭЦПНаСервере; - Элементы.ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовLinux.Доступность = ВыполнятьПроверкуЭПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель.Доступность = ВыполнятьПроверкуЭПНаСервере; КонецПроцедуры &НаКлиенте -Процедура ТипПровайдераЭЦППриИзменении(Элемент) +Процедура ТипПровайдераЭППриИзменении(Элемент) ЗаполнитьСпискиВыбораНаКлиенте(); КонецПроцедуры &НаКлиенте -Процедура ПровайдерЭЦППриИзменении(Элемент) +Процедура ПровайдерЭППриИзменении(Элемент) ЗаполнитьСпискиВыбораНаКлиенте(); КонецПроцедуры &НаКлиенте -Процедура ПровайдерЭЦПОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) +Процедура ПровайдерЭПОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) СтрокаТипаПровайдера = ""; Пока Прав(ВыбранноеЗначение, 1) <> "/" Цикл СтрокаТипаПровайдера = Прав(ВыбранноеЗначение, 1) + СтрокаТипаПровайдера; @@ -119,7 +129,7 @@ КонецЦикла; ВыбранноеЗначение = Лев(ВыбранноеЗначение, СтрДлина(ВыбранноеЗначение) - 1); - ТипПровайдераЭЦП = Число(СтрокаТипаПровайдера); + ТипПровайдераЭП = Число(СтрокаТипаПровайдера); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -140,53 +150,23 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаКлиенте -Процедура ПодключитьМодульКриптографии(Отказ) - - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - - ЗаголовокВопроса = НСтр("ru = 'Расширение работы с криптографией'"); - - ТекстВопроса = НСтр("ru = 'Для настройки ЭП необходимо установить - |расширение работы с криптографией.'"); - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Установить'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1, ЗаголовокВопроса); - - Если Ответ <> 1 Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - УстановитьРасширениеРаботыСКриптографией(); - - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - КонецЕсли; - - ПерсональныеНастройкиРаботыСЭЦП = - ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП(); +Процедура ДействияПриОткрытии() ЗаполнитьЗначенияСвойств( - ЭтаФорма, - ПерсональныеНастройкиРаботыСЭЦП, - "ПровайдерЭЦП, - |ТипПровайдераЭЦП, + ЭтотОбъект, + ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(), + "ПровайдерЭП, + |ТипПровайдераЭП, |АлгоритмПодписи, |АлгоритмХеширования, |АлгоритмШифрования, - |ВыполнятьПроверкуЭЦПНаСервере"); + |ВыполнятьПроверкуЭПНаСервере"); - Элементы.ПутиМодулейКриптографииСерверовLinux.Доступность = ВыполнятьПроверкуЭЦПНаСервере; - Элементы.ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель.Доступность = ВыполнятьПроверкуЭЦПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовLinux.Доступность = ВыполнятьПроверкуЭПНаСервере; + Элементы.ПутиМодулейКриптографииСерверовLinuxКоманднаяПанель.Доступность = ВыполнятьПроверкуЭПНаСервере; - Если ТипПровайдераЭЦП = 0 Тогда - ТипПровайдераЭЦП = 75; + Если ТипПровайдераЭП = 0 Тогда + ТипПровайдераЭП = 75; КонецЕсли; ДобавитьМенеджераКриптографииВСписок("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider", "", 75); @@ -196,14 +176,9 @@ ДобавитьМенеджераКриптографииВСписок("Microsoft Strong Cryptographic Provider", "", 1); ДобавитьМенеджераКриптографииВСписок("", "", 75); - Если Элементы.ПровайдерЭЦП.СписокВыбора.Количество() = 0 Тогда - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяКнопки = "КнопкаВыпадающегоСписка"; - Иначе - ИмяКнопки = "КнопкаСпискаВыбора"; - КонецЕсли; - Элементы.ПровайдерЭЦП[ИмяКнопки] = Ложь; - Элементы.ПровайдерЭЦП.КнопкаОчистки = Ложь; + Если Элементы.ПровайдерЭП.СписокВыбора.Количество() = 0 Тогда + Элементы.ПровайдерЭП.КнопкаВыпадающегоСписка = Ложь; + Элементы.ПровайдерЭП.КнопкаОчистки = Ложь; КонецЕсли; ЗаполнитьСпискиВыбораНаКлиенте(); @@ -219,8 +194,8 @@ Элементы.АлгоритмХеширования.СписокВыбора.Очистить(); Элементы.АлгоритмШифрования.СписокВыбора.Очистить(); - Если ЗначениеЗаполнено(ПровайдерЭЦП) Тогда - ИнформацияМенеджера = СкомпоноватьИнформациюМенеджераКриптографии(ПровайдерЭЦП, Неопределено, ТипПровайдераЭЦП); + Если ЗначениеЗаполнено(ПровайдерЭП) Тогда + ИнформацияМенеджера = СкомпоноватьИнформациюМенеджераКриптографии(ПровайдерЭП, Неопределено, ТипПровайдераЭП); Иначе ИнформацияМенеджера = Неопределено; КонецЕсли; @@ -283,7 +258,7 @@ СообщатьОшибки = Истина) Если ПутьМодуляКриптографии = Неопределено Тогда - ПутьМодуляКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ПутьМодуляКриптографии; + ПутьМодуляКриптографии = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().ПутьМодуляКриптографии; КонецЕсли; ИнформацияМенеджера = Неопределено; @@ -307,7 +282,7 @@ ПредставлениеОшибки ), , - "ТипПровайдераЭЦП"); + "ТипПровайдераЭП"); КонецЕсли; КонецПопытки; @@ -316,8 +291,8 @@ ЗначениеСпискаВыбора = ИнформацияМенеджера.Имя + "/" + ТипМодуляКриптографии; - Если Элементы.ПровайдерЭЦП.СписокВыбора.НайтиПоЗначению(ЗначениеСпискаВыбора) = Неопределено Тогда - Элементы.ПровайдерЭЦП.СписокВыбора.Добавить(ЗначениеСпискаВыбора, ИнформацияМенеджера.Имя); + Если Элементы.ПровайдерЭП.СписокВыбора.НайтиПоЗначению(ЗначениеСпискаВыбора) = Неопределено Тогда + Элементы.ПровайдерЭП.СписокВыбора.Добавить(ЗначениеСпискаВыбора, ИнформацияМенеджера.Имя); КонецЕсли; КонецЕсли; @@ -343,12 +318,12 @@ Возврат Ложь; КонецЕсли; - Константы.ПровайдерЭЦП.Установить(ПровайдерЭЦП); - Константы.ТипПровайдераЭЦП.Установить(ТипПровайдераЭЦП); + Константы.ПровайдерЭП.Установить(ПровайдерЭП); + Константы.ТипПровайдераЭП.Установить(ТипПровайдераЭП); Константы.АлгоритмХеширования.Установить(АлгоритмХеширования); Константы.АлгоритмПодписи.Установить(АлгоритмПодписи); Константы.АлгоритмШифрования.Установить(АлгоритмШифрования); - Константы.ВыполнятьПроверкуЭЦПНаСервере.Установить(ВыполнятьПроверкуЭЦПНаСервере); + Константы.ВыполнятьПроверкуЭПНаСервере.Установить(ВыполнятьПроверкуЭПНаСервере); Для Каждого Строка Из ПутиМодулейКриптографииСерверовLinux Цикл НаборЗаписей = РегистрыСведений.ПутиМодулейКриптографииСерверовLinux.СоздатьНаборЗаписей(); @@ -367,3 +342,15 @@ Возврат Истина; КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Служебные обработчики асинхронных диалогов + +&НаКлиенте +Процедура ОткрытьФормуПослеУстановкиРасширения(РасширениеУстановлено, ДополнительныеПараметры) Экспорт + Если РасширениеУстановлено = Истина Тогда + Если Не Открыта() Тогда + Открыть(); + КонецЕсли; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo b/SSL/src/CommonForms/НастройкиКриптографии/НастройкиКриптографии.mdo similarity index 89% rename from SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo rename to SSL/src/CommonForms/НастройкиКриптографии/НастройкиКриптографии.mdo index 42bf98b1a..9cc5b965a 100644 --- a/SSL/src/CommonForms/НастройкиЭЦП/НастройкиЭЦП.mdo +++ b/SSL/src/CommonForms/НастройкиКриптографии/НастройкиКриптографии.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6c34eef9-9405-4de0-9177-1bae85251ae4"> - <name>НастройкиЭЦП</name> + <name>НастройкиКриптографии</name> <synonym> <key>ru</key> <value>Настройки криптографии</value> diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca b/SSL/src/CommonForms/НастройкиПравОбъектов/ConditionalAppearance.dcssca similarity index 86% rename from SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca rename to SSL/src/CommonForms/НастройкиПравОбъектов/ConditionalAppearance.dcssca index 36a341a38..7530a9c9a 100644 --- a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ConditionalAppearance.dcssca +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/ConditionalAppearance.dcssca @@ -8,7 +8,7 @@ </selection> <filter> <item xsi:type="FilterItemComparison"> - <left xsi:type="dcscor:Field">ГруппыПрав.Запрещено</left> + <left xsi:type="dcscor:Field">ГруппыПрав.НастройкаРодителя</left> <comparisonType>Equal</comparisonType> <right xsi:type="xs:boolean">true</right> </item> @@ -16,7 +16,7 @@ <appearance> <dcscor:item xsi:type="SettingsParameterValue"> <dcscor:parameter>ЦветТекста</dcscor:parameter> - <dcscor:value xsi:type="v8ui:Color">style:ЗапрещенноеПравоДоступа</dcscor:value> + <dcscor:value xsi:type="v8ui:Color">web:Gray</dcscor:value> </dcscor:item> </appearance> </item> diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form similarity index 70% rename from SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form rename to SSL/src/CommonForms/НастройкиПравОбъектов/Form.form index 310f3d445..e6b92f3fe 100644 --- a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Form.form +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Form.form @@ -17,98 +17,23 @@ </dataPath> <skipOnInput>false</skipOnInput> <titleLocation>None</titleLocation> - <excludedCommands>OutputList</excludedCommands> <items xsi:type="form:FormField"> - <name>ГруппыПравРаспространяетсяВИерархии</name> + <name>ГруппыПравПользователь</name> <id>19</id> - <title> - <key>ru</key> - <value>Распр</value> - true true true - ГруппыПрав.РаспространяетсяВИерархии + ГруппыПрав.Пользователь - - ru - Распространяется в иерархии (значения доступа) - + + OnChange + ГруппыПравПользовательПриИзменении + - ГруппыПравРаспространяетсяВИерархииРасширеннаяПодсказка - 61 - Label - true - true - - Left - - - - ГруппыПравРаспространяетсяВИерархииКонтекстноеМеню - 20 - true - - CheckBoxField - Auto - true - - CommonPicture.РаспространяетсяВИерархии - - Left - true - - - None - - ГруппыПравКоманднаяПанель - 3 - Left - true - - - BeforeDeleteRow - ГруппыПравПередУдалением - - - BeforeRowChange - ГруппыПравПередНачаломИзменения - - - OnStartEdit - ГруппыПравПриНачалеРедактирования - - - ГруппыПравСтрокаПоиска - 52 - - ГруппыПравСтрокаПоискаРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - - ГруппыПравСтрокаПоискаКонтекстноеМеню - 53 - true - - ГруппыПрав - - true - - - - ГруппыПравСостояниеПросмотра - 55 - - ГруппыПравСостояниеПросмотраРасширеннаяПодсказка + ГруппыПравПользовательExtendedTooltip 57 Label true @@ -117,9 +42,119 @@ Left + + ГруппыПравПользовательКонтекстноеМеню + 20 + true + + InputField + true + Auto + true + Center + true + + + AutoComplete + ГруппыПравПользовательАвтоПодбор + + + StartChoice + ГруппыПравПользовательНачалоВыбора + + + Clearing + ГруппыПравПользовательОчистка + + + TextEditEnd + ГруппыПравПользовательОкончаниеВводаТекста + + 35 + true + true + true + true + true + true + true + Normal + + + None + + ГруппыПравКоманднаяПанель + 3 + Left + true + + + Selection + ГруппыПравВыбор + + + BeforeDeleteRow + ГруппыПравПередУдалением + + + OnActivateRow + ГруппыПравПриАктивизацииСтроки + + + OnActivateField + ГруппыПравПриАктивизацииПоля + + + BeforeRowChange + ГруппыПравПередНачаломИзменения + + + OnStartEdit + ГруппыПравПриНачалеРедактирования + + + OnChange + ГруппыПравПриИзменении + + + ГруппыПравСтрокаПоиска + 61 + + ГруппыПравСтрокаПоискаРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + + ГруппыПравСтрокаПоискаКонтекстноеМеню + 62 + true + + ГруппыПрав + + true + + + + ГруппыПравСостояниеПросмотра + 64 + + ГруппыПравСостояниеПросмотраРасширеннаяПодсказка + 66 + Label + true + true + + Left + + ГруппыПравСостояниеПросмотраКонтекстноеМеню - 56 + 65 true ViewStatusAddition @@ -130,10 +165,10 @@ ГруппыПравУправлениеПоиском - 58 + 67 ГруппыПравУправлениеПоискомРасширеннаяПодсказка - 60 + 69 Label true true @@ -143,7 +178,7 @@ ГруппыПравУправлениеПоискомКонтекстноеМеню - 59 + 68 true SearchControlAddition @@ -153,8 +188,8 @@ - ГруппыПравРасширеннаяПодсказка - 51 + ГруппыПравExtendedTooltip + 56 Label true true @@ -166,7 +201,7 @@ ГруппыПравКонтекстноеМеню 2 - КонтекстноеМенюГруппыПравДобавить + ГруппыПравКонтекстноеМенюДобавить 23 true true @@ -175,8 +210,8 @@ false - КонтекстноеМенюГруппыПравДобавитьРасширеннаяПодсказка - 48 + ГруппыПравКонтекстноеМенюДобавитьExtendedTooltip + 50 Label true true @@ -193,7 +228,7 @@ Auto - КонтекстноеМенюГруппыПравСкопировать + ГруппыПравКонтекстноеМенюСкопировать 24 true true @@ -202,8 +237,8 @@ false - КонтекстноеМенюГруппыПравСкопироватьРасширеннаяПодсказка - 49 + ГруппыПравКонтекстноеМенюСкопироватьExtendedTooltip + 51 Label true true @@ -220,7 +255,7 @@ Auto - КонтекстноеМенюГруппыПравУдалить + ГруппыПравКонтекстноеМенюУдалить 25 true true @@ -229,8 +264,8 @@ false - КонтекстноеМенюГруппыПравУдалитьРасширеннаяПодсказка - 50 + ГруппыПравКонтекстноеМенюУдалитьExtendedTooltip + 52 Label true true @@ -246,6 +281,84 @@ UserCmds Auto + + ГруппыПравКонтекстноеМенюСнятьУстановкуПрава + 39 + true + false + + true + + + ГруппыПравКонтекстноеМенюСнятьУстановкуПраваExtendedTooltip + 53 + Label + true + true + + Left + + + Form.Command.СнятьУстановкуПрава + Normal + Auto + true + true + UserCmds + Auto + + + ГруппыПравКонтекстноеМенюУстановитьЗапретПрава + 40 + true + false + + true + + + ГруппыПравКонтекстноеМенюУстановитьЗапретПраваExtendedTooltip + 54 + Label + true + true + + Left + + + Form.Command.УстановитьЗапретПрава + Normal + Auto + true + true + UserCmds + Auto + + + ГруппыПравКонтекстноеМенюУстановитьРазрешениеПрава + 41 + true + false + + true + + + ГруппыПравКонтекстноеМенюУстановитьРазрешениеПраваExtendedTooltip + 55 + Label + true + true + + Left + + + Form.Command.УстановитьРазрешениеПрава + Normal + Auto + true + true + UserCmds + Auto + true true @@ -268,6 +381,9 @@ true true true + + ГруппыПрав.НомерКартинки + CommonPicture.СостоянияПользователей @@ -280,6 +396,10 @@ НаследоватьПраваРодителей 15 + + <key>ru</key> + <value>Наследовать права от вышестоящих папок</value> + true true @@ -294,8 +414,8 @@ НаследоватьПраваРодителейПриИзменении - НаследоватьПраваРодителейРасширеннаяПодсказка - 71 + НаследоватьПраваРодителейExtendedTooltip + 58 Label true true @@ -319,7 +439,7 @@ ФормаКоманднаяПанель -1 - ЗаписатьИЗакрыть + ФормаЗаписатьИЗакрыть 12 true true @@ -328,8 +448,8 @@ false - ЗаписатьИЗакрытьРасширеннаяПодсказка - 37 + ФормаЗаписатьИЗакрытьExtendedTooltip + 42 Label true true @@ -345,7 +465,7 @@ Auto - Записать + ФормаЗаписать 21 true true @@ -354,8 +474,8 @@ false - ЗаписатьРасширеннаяПодсказка - 38 + ФормаЗаписатьExtendedTooltip + 43 Label true true @@ -375,7 +495,7 @@ Auto - Добавить + ФормаДобавить 31 true true @@ -384,8 +504,8 @@ false - ДобавитьРасширеннаяПодсказка - 39 + ФормаДобавитьExtendedTooltip + 44 Label true true @@ -402,34 +522,7 @@ Auto - Скопировать - 32 - true - true - - true - - false - - СкопироватьРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.Copy - Normal - Auto - true - true - UserCmds - Auto - - - Удалить + ФормаУдалить 33 true true @@ -438,8 +531,8 @@ false - УдалитьРасширеннаяПодсказка - 41 + ФормаУдалитьExtendedTooltip + 45 Label true true @@ -456,126 +549,15 @@ Auto - Найти - 34 + ФормаПереместитьВверх + 37 true true true - false - НайтиРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ОтменитьПоиск - 35 - true - true - - true - - false - - ОтменитьПоискРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - СортироватьПоВозрастанию - 13 - true - true - - true - - false - - СортироватьПоВозрастаниюРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.SortListAsc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СортироватьПоУбыванию - 14 - true - true - - true - - false - - СортироватьПоУбываниюРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - Form.Item.ГруппыПрав.StandardCommand.SortListDesc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - Справка - 30 - true - true - - true - - false - - СправкаРасширеннаяПодсказка + ФормаПереместитьВверхExtendedTooltip 46 Label true @@ -584,6 +566,58 @@ Left + Form.Item.ГруппыПрав.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto + + + ФормаПереместитьВниз + 38 + true + true + + true + + + ФормаПереместитьВнизExtendedTooltip + 47 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + ФормаСправка + 30 + true + + true + + false + + ФормаСправкаExtendedTooltip + 48 + Label + true + true + + Left + + Form.StandardCommand.Help Normal Auto @@ -593,7 +627,7 @@ Auto - ИзменитьФорму + ФормаИзменитьФорму 36 true true @@ -602,8 +636,8 @@ false - ИзменитьФормуРасширеннаяПодсказка - 47 + ФормаИзменитьФормуExtendedTooltip + 49 Label true true @@ -619,6 +653,33 @@ UserCmds Auto + + ФормаВывестиСписок + 59 + true + true + + true + + + ФормаВывестиСписокРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + Form.Item.ГруппыПрав.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + Left @@ -629,10 +690,6 @@ OnCreateAtServer ПриСозданииНаСервере - - FillCheckProcessingAtServer - ОбработкаПроверкиЗаполненияНаСервере - Abort Cancel Ignore @@ -670,10 +727,47 @@ true - Запрещено + Пользователь <key>ru</key> - <value>Запрещено</value> + <value>Пользователь</value> + + 1 + + CatalogRef.ВнешниеПользователи + CatalogRef.ГруппыВнешнихПользователей + CatalogRef.ГруппыПользователей + CatalogRef.Пользователи + + + true + + + true + + + + ВладелецНастройки + + <key>ru</key> + <value>Владелец настройки</value> + + 3 + + AnyRef + + + true + + + true + + + + НастройкаРодителя + + <key>ru</key> + <value>Настройка родителя</value> 2 @@ -687,12 +781,8 @@ - РаспространяетсяВИерархии - - <key>ru</key> - <value>Распространяется в иерархии</value> - - 1 + НаследованиеРазрешено + 4 Boolean @@ -703,58 +793,26 @@ true - - - ВидДоступа - - <key>ru</key> - <value>Вид доступа</value> - - 2 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - НастройкаПоЗначениюДоступа - - <key>ru</key> - <value>Настройка по значению доступа</value> - - 3 - - Boolean - - - true - - - true - - - - ТаблицаЗначенийДоступа - - <key>ru</key> - <value>Таблица значений доступа</value> - - 4 - - String - - - - true - - - true - + + НомерКартинки + + <key>ru</key> + <value>Номер картинки</value> + + 5 + + Number + + 10 + + + + true + + + true + + ПрямыеЗависимостиПрав @@ -801,23 +859,6 @@ true - - НастройкаПоГруппеПользователей - - <key>ru</key> - <value>Настройка по группе пользователей</value> - - 8 - - Boolean - - - true - - - true - - НаследоватьПраваРодителей @@ -836,72 +877,6 @@ </edit> <savedData>true</savedData> </attributes> - <attributes> - <name>ДобавленныеРеквизиты</name> - <title> - <key>ru</key> - <value>Добавленные реквизиты</value> - - 9 - - - true - - - true - - - - ДобавленныеЭлементы - - <key>ru</key> - <value>Добавленные элементы</value> - - 10 - - - true - - - true - - - - НазваниеЗначенийДоступа - - <key>ru</key> - <value>Название значений доступа</value> - - 12 - - String - - - - true - - - true - - - - НаименованиеНастройки - - <key>ru</key> - <value>Наименование настройки</value> - - 13 - - String - - - - true - - - true - - ВнешнийПользовательИлиГруппа @@ -956,6 +931,38 @@ <itemValueType/> </extInfo> </attributes> + <attributes> + <name>ДобавленныеРеквизиты</name> + <title> + <key>ru</key> + <value>Добавленные реквизиты</value> + + 2 + + + true + + + true + + + + РодительЗаполнен + + <key>ru</key> + <value>Родитель заполнен</value> + + 3 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть @@ -979,7 +986,6 @@ </handler> </action> <representation>TextPicture</representation> - <modifiesStoredData>true</modifiesStoredData> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -1002,7 +1008,6 @@ <name>Записать</name> </handler> </action> - <modifiesStoredData>true</modifiesStoredData> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -1031,6 +1036,72 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>УстановитьРазрешениеПрава</name> + <title> + <key>ru</key> + <value>Установить разрешение права "Да"</value> + + 4 + + ru + Установить разрешение права + + + true + + + + УстановитьРазрешениеПрава + + + Auto + Auto + + + УстановитьЗапретПрава + + <key>ru</key> + <value>Установить запрет права "Нет"</value> + + 5 + + ru + Установить запрет права + + + true + + + + УстановитьЗапретПрава + + + Auto + Auto + + + СнятьУстановкуПрава + + <key>ru</key> + <value>Снять установку права " "</value> + + 6 + + ru + Снять установку права + + + true + + + + СнятьУстановкуПрава + + + Auto + Auto + СсылкаНаОбъект diff --git a/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl new file mode 100644 index 000000000..ba798100d --- /dev/null +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/Module.bsl @@ -0,0 +1,897 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + СсылкаНаОбъект = Параметры.СсылкаНаОбъект; + ВозможныеПрава = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).ВозможныеПраваДляНастройкиПравОбъектов; + + Если ВозможныеПрава.ПоТипамСсылок[ТипЗнч(СсылкаНаОбъект)] = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Права доступа не настраиваются + |для объектов типа ""%1"".'"), + Строка(ТипЗнч(СсылкаНаОбъект))); + КонецЕсли; + + // Проверка разрешения на открытие формы. + ПроверитьРазрешениеНаУправлениеПравами(); + + ИспользоватьВнешнихПользователей = + ВнешниеПользователи.ИспользоватьВнешнихПользователей() + И ПравоДоступа("Просмотр", Метаданные.Справочники.ВнешниеПользователи); + + УстановитьПривилегированныйРежим(Истина); + + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.Пользователи"), + Метаданные.Справочники.Пользователи.Синоним); + + СписокТиповПользователей.Добавить(Тип("СправочникСсылка.ВнешниеПользователи"), + Метаданные.Справочники.ВнешниеПользователи.Синоним); + + РодительЗаполнен = + Параметры.СсылкаНаОбъект.Метаданные().Иерархический + И ЗначениеЗаполнено(ОбщегоНазначения.ПолучитьЗначениеРеквизита(Параметры.СсылкаНаОбъект, "Родитель")); + + Элементы.НаследоватьПраваРодителей.Видимость = РодительЗаполнен; + + НастройкиПрав = РегистрыСведений.НастройкиПравОбъектов.Прочитать(Параметры.СсылкаНаОбъект); + + ЗаполнитьПрава(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьОповещение", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура НаследоватьПраваРодителейПриИзменении(Элемент) + + НаследоватьПраваРодителейПриИзмененииНаСервере(); + +КонецПроцедуры + +&НаСервере +Процедура НаследоватьПраваРодителейПриИзмененииНаСервере() + + Если НаследоватьПраваРодителей Тогда + ДобавитьНаследуемыеПрава(); + ЗаполнитьНомераКартинокПользователей(); + Иначе + // Очистка настроек, наследуемых от родителей по иерархии. + Индекс = ГруппыПрав.Количество()-1; + Пока Индекс >= 0 Цикл + Если ГруппыПрав.Получить(Индекс).НастройкаРодителя Тогда + ГруппыПрав.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ГруппыПрав + +&НаКлиенте +Процедура ГруппыПравПриИзменении(Элемент) + + ГруппыПрав.Сортировать("НастройкаРодителя Убыв"); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если Поле.Имя = "ГруппыПравПользователь" Тогда + Возврат; + КонецЕсли; + + Отказ = Ложь; + ПроверкаВозможностиИзмененияПрав(Отказ); + + Если НЕ Отказ Тогда + ТекущееПраво = Сред(Поле.Имя, СтрДлина("ГруппыПрав") + 1); + ТекущиеДанные = Элементы.ГруппыПрав.ТекущиеДанные; + + Если ТекущееПраво = "НаследованиеРазрешено" Тогда + ТекущиеДанные[ТекущееПраво] = НЕ ТекущиеДанные[ТекущееПраво]; + Модифицированность = Истина; + + ИначеЕсли ВозможныеПрава.Свойство(ТекущееПраво) Тогда + СтароеЗначение = ТекущиеДанные[ТекущееПраво]; + + Если ТекущиеДанные[ТекущееПраво] = Истина Тогда + ТекущиеДанные[ТекущееПраво] = Ложь; + + ИначеЕсли ТекущиеДанные[ТекущееПраво] = Ложь Тогда + ТекущиеДанные[ТекущееПраво] = Неопределено; + Иначе + ТекущиеДанные[ТекущееПраво] = Истина; + КонецЕсли; + Модифицированность = Истина; + + ОбновитьЗависимыеПрава(ТекущиеДанные, ТекущееПраво, СтароеЗначение); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПриАктивизацииСтроки(Элемент) + + ТекущиеДанные = Элементы.ГруппыПрав.ТекущиеДанные; + + ДоступностьКоманд = ?(ТекущиеДанные = Неопределено, Ложь, НЕ ТекущиеДанные.НастройкаРодителя); + Элементы.ГруппыПравКонтекстноеМенюУдалить.Доступность = ДоступностьКоманд; + Элементы.ФормаУдалить.Доступность = ДоступностьКоманд; + Элементы.ФормаПереместитьВверх.Доступность = ДоступностьКоманд; + Элементы.ФормаПереместитьВниз.Доступность = ДоступностьКоманд; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПриАктивизацииПоля(Элемент) + + ДоступностьКоманд = ВозможныеПрава.Свойство(Сред(Элемент.ТекущийЭлемент.Имя, СтрДлина("ГруппыПрав") + 1)); + Элементы.ГруппыПравКонтекстноеМенюСнятьУстановкуПрава.Доступность = ДоступностьКоманд; + Элементы.ГруппыПравКонтекстноеМенюУстановитьРазрешениеПрава.Доступность = ДоступностьКоманд; + Элементы.ГруппыПравКонтекстноеМенюУстановитьЗапретПрава.Доступность = ДоступностьКоманд; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПередНачаломИзменения(Элемент, Отказ) + + ПроверкаВозможностиИзмененияПрав(Отказ); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПередУдалением(Элемент, Отказ) + + ПроверкаВозможностиИзмененияПрав(Отказ, Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + Если НоваяСтрока Тогда + + // Установка начальных значений. + Элементы.ГруппыПрав.ТекущиеДанные.ВладелецНастройки = Параметры.СсылкаНаОбъект; + Элементы.ГруппыПрав.ТекущиеДанные.НаследованиеРазрешено = Истина; + Элементы.ГруппыПрав.ТекущиеДанные.НастройкаРодителя = Ложь; + + Для каждого ДобавленныйРеквизит Из ДобавленныеРеквизиты Цикл + Элементы.ГруппыПрав.ТекущиеДанные[ДобавленныйРеквизит.Ключ] = ДобавленныйРеквизит.Значение; + КонецЦикла; + КонецЕсли; + + Если Элементы.ГруппыПрав.ТекущиеДанные.Пользователь = Неопределено Тогда + Элементы.ГруппыПрав.ТекущиеДанные.Пользователь = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = -1; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательПриИзменении(Элемент) + + Если ЗначениеЗаполнено(Элементы.ГруппыПрав.ТекущиеДанные.Пользователь) Тогда + ЗаполнитьНомераКартинокПользователей(Элементы.ГруппыПрав.ТекущаяСтрока); + Иначе + Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = -1; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ВыбратьПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательОчистка(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Элементы.ГруппыПрав.ТекущиеДанные.Пользователь = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка"); + Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = -1; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ГруппыПравПользовательАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + + ЗаписатьНачало(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура Записать(Команда) + + ЗаписатьНачало(); + +КонецПроцедуры + +&НаКлиенте +Процедура Перечитать(Команда) + + Если НЕ Модифицированность Тогда + ПрочитатьПрава(); + Иначе + ПоказатьВопрос( + Новый ОписаниеОповещения("ПеречитатьЗавершение", ЭтотОбъект), + НСтр("ru = 'Данные изменены. Прочитать без сохранения?'"), + РежимДиалогаВопрос.ДаНет, + 5, + КодВозвратаДиалога.Нет); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СнятьУстановкуПрава(Команда) + + УстановитьЗначениеТекущегоПрава(Неопределено); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьЗапретПрава(Команда) + + УстановитьЗначениеТекущегоПрава(Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьРазрешениеПрава(Команда) + + УстановитьЗначениеТекущегоПрава(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьЗначениеТекущегоПрава(НовоеЗначение) + + Отказ = Ложь; + ПроверкаВозможностиИзмененияПрав(Отказ); + + Если Не Отказ Тогда + ТекущееПраво = Сред(Элементы.ГруппыПрав.ТекущийЭлемент.Имя, СтрДлина("ГруппыПрав") + 1); + ТекущиеДанные = Элементы.ГруппыПрав.ТекущиеДанные; + + Если ВозможныеПрава.Свойство(ТекущееПраво) + И ТекущиеДанные <> Неопределено Тогда + + СтароеЗначение = ТекущиеДанные[ТекущееПраво]; + ТекущиеДанные[ТекущееПраво] = НовоеЗначение; + + Модифицированность = Истина; + + ОбновитьЗависимыеПрава(ТекущиеДанные, ТекущееПраво, СтароеЗначение); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ЗаписатьИЗакрытьОповещение(Результат = Неопределено, Неопределен = Неопределено) Экспорт + + ЗаписатьНачало(Истина); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьНачало(Закрыть = Ложь) Экспорт + + Отказ = Ложь; + ОбработкаПроверкиЗаполнения(Отказ); + + Если Отказ Тогда + Возврат; + КонецЕсли; + + ПодтвердитьОтказОтУправленияПравами = Неопределено; + ЗаписатьПрава(ПодтвердитьОтказОтУправленияПравами); + + Если ПодтвердитьОтказОтУправленияПравами = Истина Тогда + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("ЗаписатьИЗакрыть", НСтр("ru = 'Записать и закрыть'")); + Кнопки.Добавить("Отмена", НСтр("ru = 'Отмена'")); + ПоказатьВопрос( + Новый ОписаниеОповещения("ЗаписатьПослеПодтверждения", ЭтотОбъект), + НСтр("ru = 'После записи настройка прав станет недоступной.'"), + Кнопки,, "Отмена"); + Иначе + Если Закрыть Тогда + Закрыть(); + Иначе + ОчиститьСообщения(); + КонецЕсли; + ЗаписатьЗавершение(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьПослеПодтверждения(Ответ, Неопределен) Экспорт + + Если Ответ = "ЗаписатьИЗакрыть" Тогда + ПодтвердитьОтказОтУправленияПравами = Ложь; + ЗаписатьПрава(ПодтвердитьОтказОтУправленияПравами); + Закрыть(); + КонецЕсли; + + ЗаписатьЗавершение(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьЗавершение() + + Оповестить("Запись_НастройкиПравОбъектов", , Параметры.СсылкаНаОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПеречитатьЗавершение(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПрочитатьПрава(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +&НаКлиенте +Процедура ОбновитьЗависимыеПрава(Знач Данные, Знач Право, Знач СтароеЗначение, Знач ГлубинаРекурсии = 0) + + Если Данные[Право] = СтароеЗначение Тогда + Возврат; + КонецЕсли; + + Если ГлубинаРекурсии > 100 Тогда + Возврат; + Иначе + ГлубинаРекурсии = ГлубинаРекурсии + 1; + КонецЕсли; + + ЗависимыеПрава = Неопределено; + + Если Данные[Право] = Истина Тогда + + // Увеличены разрешения (с Неопределено или Ложь на Истина) + // Требуется повысить разрешения на ведущие права + ПрямыеЗависимостиПрав.Свойство(Право, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Истина; + + ИначеЕсли Данные[Право] = Ложь Тогда + + // Увеличены запрещения (с Истина или Неопределено на Ложь) + // Требуется повысить запрещения на зависимые права + ОбратныеЗависимостиПрав.Свойство(Право, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Ложь; + Иначе + Если СтароеЗначение = Ложь Тогда + // Уменьшены запрещения (с Ложь на Неопределено) + // Требуется уменьшить запрещения на ведущие права + ПрямыеЗависимостиПрав.Свойство(Право, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Неопределено; + Иначе + // Уменьшены разрешения (с Истина на Неопределено) + // Требуется уменьшить разрешения на зависимые права + ОбратныеЗависимостиПрав.Свойство(Право, ЗависимыеПрава); + ЗначениеЗависимогоПрава = Неопределено; + КонецЕсли; + КонецЕсли; + + Если ЗависимыеПрава <> Неопределено Тогда + Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл + Если ТипЗнч(ЗависимоеПраво) = Тип("Массив") Тогда + УстановитьЗависимоеПраво = Истина; + Для каждого ОдноИзЗависимыхПрав Из ЗависимоеПраво Цикл + Если Данные[ОдноИзЗависимыхПрав] = ЗначениеЗависимогоПрава Тогда + УстановитьЗависимоеПраво = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если УстановитьЗависимоеПраво Тогда + Если НЕ (ЗначениеЗависимогоПрава = Неопределено И Данные[ЗависимоеПраво[0]] <> СтароеЗначение) Тогда + ТекущееСтароеЗначение = Данные[ЗависимоеПраво[0]]; + Данные[ЗависимоеПраво[0]] = ЗначениеЗависимогоПрава; + ОбновитьЗависимыеПрава(Данные, ЗависимоеПраво[0], ТекущееСтароеЗначение); + КонецЕсли; + КонецЕсли; + Иначе + Если НЕ (ЗначениеЗависимогоПрава = Неопределено И Данные[ЗависимоеПраво] <> СтароеЗначение) Тогда + ТекущееСтароеЗначение = Данные[ЗависимоеПраво]; + Данные[ЗависимоеПраво] = ЗначениеЗависимогоПрава; + ОбновитьЗависимыеПрава(Данные, ЗависимоеПраво, ТекущееСтароеЗначение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьРеквизит(НовыеРеквизиты, Реквизит, НачальноеЗначение) + + НовыеРеквизиты.Добавить(Реквизит); + ДобавленныеРеквизиты.Вставить(Реквизит.Имя, НачальноеЗначение); + +КонецПроцедуры + +&НаСервере +Функция ДобавитьЭлемент(Имя, Тип, Родитель) + + Элемент = Элементы.Добавить(Имя, Тип, Родитель); + Элемент.ФиксацияВТаблице = ФиксацияВТаблице.Нет; + + Возврат Элемент; + +КонецФункции + +&НаСервере +Процедура ДобавитьРеквизитыИлиЭлементыФормы(НовыеРеквизиты = Неопределено) + + ОписанияВозможныхПрав = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок.Получить( + ТипЗнч(Параметры.СсылкаНаОбъект)); + + ОписаниеТиповПсевдоФлажка = Новый ОписаниеТипов("Булево, Число", + Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)); + + // Добавление возможных прав, настраиваемых по владельцу (таблице значений доступа). + Для каждого ОписаниеПрава Из ОписанияВозможныхПрав Цикл + + Если НовыеРеквизиты <> Неопределено Тогда + + ДобавитьРеквизит(НовыеРеквизиты, Новый РеквизитФормы(ОписаниеПрава.Имя, ОписаниеТиповПсевдоФлажка, + "ГруппыПрав", ОписаниеПрава.Заголовок), ОписаниеПрава.НачальноеЗначение); + + ВозможныеПрава.Вставить(ОписаниеПрава.Имя); + + // Добавление прямых и обратных зависимостей прав. + ПрямыеЗависимостиПрав.Вставить(ОписаниеПрава.Имя, ОписаниеПрава.ТребуемыеПрава); + Для каждого ЗависимоеПраво Из ОписаниеПрава.ТребуемыеПрава Цикл + Если ТипЗнч(ЗависимоеПраво) = Тип("Массив") Тогда + ЗависимыеПрава = ЗависимоеПраво; + Иначе + ЗависимыеПрава = Новый Массив; + ЗависимыеПрава.Добавить(ЗависимоеПраво); + КонецЕсли; + Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл + Если ОбратныеЗависимостиПрав.Свойство(ЗависимоеПраво) Тогда + ЗависимыеПрава = ОбратныеЗависимостиПрав[ЗависимоеПраво]; + Иначе + ЗависимыеПрава = Новый Массив; + ОбратныеЗависимостиПрав.Вставить(ЗависимоеПраво, ЗависимыеПрава); + КонецЕсли; + Если ЗависимыеПрава.Найти(ОписаниеПрава.Имя) = Неопределено Тогда + ЗависимыеПрава.Добавить(ОписаниеПрава.Имя); + КонецЕсли; + КонецЦикла; + КонецЦикла; + Иначе + Элемент = ДобавитьЭлемент("ГруппыПрав" + ОписаниеПрава.Имя, Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.ТолькоПросмотр = Истина; + Элемент.Формат = "ЧЦ=1; ЧН=; БЛ=Нет; БИ=Да"; + Элемент.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Центр; + Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр; + Элемент.ПутьКДанным = "ГруппыПрав." + ОписаниеПрава.Имя; + + Элемент.Подсказка = ОписаниеПрава.Подсказка; + // Расчет оптимальной ширины элемента + ШиринаЭлемента = 0; + Для НомерСтроки = 1 По СтрЧислоСтрок(ОписаниеПрава.Заголовок) Цикл + ШиринаЭлемента = Макс(ШиринаЭлемента, СтрДлина(СтрПолучитьСтроку(ОписаниеПрава.Заголовок, НомерСтроки))); + КонецЦикла; + Элемент.Ширина = ШиринаЭлемента; + КонецЕсли; + + Если Элементы.ГруппыПрав.ВысотаШапки < СтрЧислоСтрок(ОписаниеПрава.Заголовок) Тогда + Элементы.ГруппыПрав.ВысотаШапки = СтрЧислоСтрок(ОписаниеПрава.Заголовок); + КонецЕсли; + КонецЦикла; + + Если НовыеРеквизиты = Неопределено И Параметры.СсылкаНаОбъект.Метаданные().Иерархический Тогда + Элемент = ДобавитьЭлемент("ГруппыПравНаследованиеРазрешено", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.ТолькоПросмотр = Истина; + Элемент.Формат = "ЧЦ=1; ЧН=; БЛ=Нет; БИ=Да"; + Элемент.ГоризонтальноеПоложениеВШапке = ГоризонтальноеПоложениеЭлемента.Центр; + Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Центр; + Элемент.ПутьКДанным = "ГруппыПрав.НаследованиеРазрешено"; + + Элемент.Заголовок = НСтр("ru = 'Для + |подпапок'"); + Элемент.Подсказка = НСтр("ru = 'Права не только для текущей папки, + |но и для ее нижестоящих папок'"); + + Элемент = ДобавитьЭлемент("ГруппыПравВладелецНастройки", Тип("ПолеФормы"), Элементы.ГруппыПрав); + Элемент.ТолькоПросмотр = Истина; + Элемент.ПутьКДанным = "ГруппыПрав.ВладелецНастройки"; + Элемент.Заголовок = НСтр("ru = 'Наследуется от'"); + Элемент.Подсказка = НСтр("ru = 'Папка, от которой наследуются настройка прав'"); + Элемент.Видимость = РодительЗаполнен; + + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления.Использование = Истина; + ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Text", ""); + + ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить( + Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.Использование = Истина; + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ГруппыПрав.НастройкаРодителя"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Ложь; + + ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ОформляемоеПоле.Использование = Истина; + ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ГруппыПравВладелецНастройки"); + + Если Элементы.ГруппыПрав.ВысотаШапки = 1 Тогда + Элементы.ГруппыПрав.ВысотаШапки = 2; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьПрава() + + ПрямыеЗависимостиПрав = Новый Структура; + ОбратныеЗависимостиПрав = Новый Структура; + ВозможныеПрава = Новый Структура; + + ДобавленныеРеквизиты = Новый Структура; + НовыеРеквизиты = Новый Массив; + ДобавитьРеквизитыИлиЭлементыФормы(НовыеРеквизиты); + + // Добавление реквизитов формы + ИзменитьРеквизиты(НовыеРеквизиты); + + // Добавление элементов формы + ДобавитьРеквизитыИлиЭлементыФормы(); + + ПрочитатьПрава(); + +КонецПроцедуры + +&НаСервере +Процедура ПрочитатьПрава() + + ГруппыПрав.Очистить(); + + УстановитьПривилегированныйРежим(Истина); + НастройкиПрав = РегистрыСведений.НастройкиПравОбъектов.Прочитать(Параметры.СсылкаНаОбъект); + + НаследоватьПраваРодителей = НастройкиПрав.Наследовать; + + Для каждого Настройка Из НастройкиПрав.Настройки Цикл + Если НаследоватьПраваРодителей ИЛИ НЕ Настройка.НастройкаРодителя Тогда + ЗаполнитьЗначенияСвойств(ГруппыПрав.Добавить(), Настройка); + КонецЕсли; + КонецЦикла; + ЗаполнитьНомераКартинокПользователей(); + + Модифицированность = Ложь; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьНаследуемыеПрава() + + УстановитьПривилегированныйРежим(Истина); + НастройкиПрав = РегистрыСведений.НастройкиПравОбъектов.Прочитать(Параметры.СсылкаНаОбъект); + + Индекс = 0; + Для каждого Настройка Из НастройкиПрав.Настройки Цикл + Если Настройка.НастройкаРодителя Тогда + ЗаполнитьЗначенияСвойств(ГруппыПрав.Вставить(Индекс), Настройка); + Индекс = Индекс + 1; + КонецЕсли; + КонецЦикла; + + ЗаполнитьНомераКартинокПользователей(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаПроверкиЗаполнения(Отказ) + + ОчиститьСообщения(); + + НомерСтроки = ГруппыПрав.Количество()-1; + + Пока НЕ Отказ И НомерСтроки >= 0 Цикл + ТекущаяСтрока = ГруппыПрав.Получить(НомерСтроки); + + // Проверка заполнения флажков прав. + НетЗаполненногоПрава = Истина; + ИмяПервогоПрава = ""; + Для каждого ВозможноеПраво Из ВозможныеПрава Цикл + Если НЕ ЗначениеЗаполнено(ИмяПервогоПрава) Тогда + ИмяПервогоПрава = ВозможноеПраво.Ключ; + КонецЕсли; + Если ТипЗнч(ТекущаяСтрока[ВозможноеПраво.Ключ]) = Тип("Булево") Тогда + НетЗаполненногоПрава = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + Если НетЗаполненногоПрава Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнено ни одно право доступа.'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "]." + ИмяПервогоПрава, + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка заполнения пользователей/групп пользователей, + // значений доступа и их дублей + + // Проверка заполнения + Если НЕ ЗначениеЗаполнено(ТекущаяСтрока["Пользователь"]) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Не заполнен пользователь или группа.'"), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + // Проверка дублей + Отбор = Новый Структура("ВладелецНастройки, Пользователь", + ТекущаяСтрока["ВладелецНастройки"], + ТекущаяСтрока["Пользователь"]); + Если ГруппыПрав.НайтиСтроки(Отбор).Количество() > 1 Тогда + Если ТипЗнч(Отбор.Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда + ТекстСообщения = НСтр("ru = 'Настройка для пользователя ""%1"" уже есть.'"); + Иначе + ТекстСообщения = НСтр("ru = 'Настройка для группы пользователей ""%1"" уже есть.'"); + КонецЕсли; + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Отбор.Пользователь), + , + "ГруппыПрав[" + Формат(НомерСтроки, "ЧГ=0") + "].Пользователь", + , + Отказ); + Возврат; + КонецЕсли; + + НомерСтроки = НомерСтроки - 1; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьПрава(ПодтвердитьОтказОтУправленияПравами) + + ПроверитьРазрешениеНаУправлениеПравами(); + + НачатьТранзакцию(); + Попытка + УстановитьПривилегированныйРежим(Истина); + РегистрыСведений.НастройкиПравОбъектов.Записать(Параметры.СсылкаНаОбъект, ГруппыПрав, НаследоватьПраваРодителей); + УстановитьПривилегированныйРежим(Ложь); + + Если ПодтвердитьОтказОтУправленияПравами = Ложь + ИЛИ УправлениеДоступом.ЕстьПраво("УправлениеПравами", Параметры.СсылкаНаОбъект) Тогда + + ЗафиксироватьТранзакцию(); + Модифицированность = Ложь; + Иначе + ОтменитьТранзакцию(); + ПодтвердитьОтказОтУправленияПравами = Истина; + КонецЕсли; + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаВозможностиИзмененияПрав(Отказ, ПроверкаУдаления = Ложь) + + ТекущийВладелецНастройки = Элементы.ГруппыПрав.ТекущиеДанные["ВладелецНастройки"]; + + Если ЗначениеЗаполнено(ТекущийВладелецНастройки) + И ТекущийВладелецНастройки <> Параметры.СсылкаНаОбъект Тогда + + Отказ = Истина; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Эти права унаследованы, их можно изменить в форме настройки прав + |вышестоящей папки ""%1"".'"), + ТекущийВладелецНастройки); + + Если ПроверкаУдаления Тогда + ТекстСообщения = ТекстСообщения + Символы.ПС + Символы.ПС + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для удаления всех унаследованных прав следует + |снять флажок ""%1"".'"), + Элементы.НаследоватьПраваРодителей.Заголовок); + КонецЕсли; + КонецЕсли; + + Если Отказ Тогда + ПоказатьПредупреждение(, ТекстСообщения); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция СформироватьДанныеВыбораПользователя(Текст) + + Возврат Пользователи.СформироватьДанныеВыбораПользователя(Текст); + +КонецФункции + +&НаКлиенте +Процедура ПоказатьВыборТипаПользователиИлиВнешниеПользователи(ОбработкаПродолжения) + + ВыборИПодборВнешнихПользователей = Ложь; + + Если ИспользоватьВнешнихПользователей Тогда + + СписокТиповПользователей.ПоказатьВыборЭлемента( + Новый ОписаниеОповещения( + "ПоказатьВыборТипаПользователиИлиВнешниеПользователиЗавершение", + ЭтотОбъект, + ОбработкаПродолжения), + НСтр("ru = 'Выбор типа данных'"), + СписокТиповПользователей[0]); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьВыборТипаПользователиИлиВнешниеПользователиЗавершение(ВыбранныйЭлемент, ОбработкаПродолжения) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + ВыборИПодборВнешнихПользователей = + ВыбранныйЭлемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); + + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ВыборИПодборВнешнихПользователей); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, Неопределено); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьПользователей() + + ТекущийПользователь = ?(Элементы.ГруппыПрав.ТекущиеДанные = Неопределено, + Неопределено, Элементы.ГруппыПрав.ТекущиеДанные.Пользователь); + + Если ЗначениеЗаполнено(ТекущийПользователь) + И ( ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.Пользователи") + ИЛИ ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Ложь; + + ИначеЕсли ИспользоватьВнешнихПользователей + И ЗначениеЗаполнено(ТекущийПользователь) + И ( ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ВнешниеПользователи") + ИЛИ ТипЗнч(ТекущийПользователь) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда + + ВыборИПодборВнешнихПользователей = Истина; + Иначе + ПоказатьВыборТипаПользователиИлиВнешниеПользователи( + Новый ОписаниеОповещения("ВыбратьПользователейЗавершение", ЭтотОбъект)); + Возврат; + КонецЕсли; + + ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей); + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьПользователейЗавершение(ВыборИПодборВнешнихПользователей, Неопределен = Неопределено) Экспорт + + Если ВыборИПодборВнешнихПользователей = Неопределено Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ?( + Элементы.ГруппыПрав.ТекущиеДанные = Неопределено, + Неопределено, + Элементы.ГруппыПрав.ТекущиеДанные.Пользователь)); + + Если ВыборИПодборВнешнихПользователей Тогда + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + Иначе + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + КонецЕсли; + + Если ВыборИПодборВнешнихПользователей Тогда + + ОткрытьФорму( + "Справочник.ВнешниеПользователи.ФормаВыбора", + ПараметрыФормы, + Элементы.ГруппыПравПользователь); + Иначе + ОткрытьФорму( + "Справочник.Пользователи.ФормаВыбора", + ПараметрыФормы, + Элементы.ГруппыПравПользователь); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьНомераКартинокПользователей(ИдентификаторСтроки = Неопределено) + + Пользователи.ЗаполнитьНомераКартинокПользователей(ГруппыПрав, "Пользователь", "НомерКартинки", ИдентификаторСтроки); + +КонецПроцедуры + +&НаСервере +Процедура ПроверитьРазрешениеНаУправлениеПравами() + + Если УправлениеДоступом.ЕстьПраво("УправлениеПравами", Параметры.СсылкаНаОбъект) Тогда + Возврат; + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Настройка прав недоступна.'"); + +КонецПроцедуры + diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo b/SSL/src/CommonForms/НастройкиПравОбъектов/НастройкиПравОбъектов.mdo similarity index 70% rename from SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo rename to SSL/src/CommonForms/НастройкиПравОбъектов/НастройкиПравОбъектов.mdo index 009bec033..8d6c4911f 100644 --- a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/ПраваПоЗначениямДоступа.mdo +++ b/SSL/src/CommonForms/НастройкиПравОбъектов/НастройкиПравОбъектов.mdo @@ -1,9 +1,9 @@ - ПраваПоЗначениямДоступа + НастройкиПравОбъектов ru - Права по значениям доступа + Настройки прав объектов PersonalComputer MobileDevice diff --git a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form index ba0f1a025..fdbd013c2 100644 --- a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form +++ b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Form.form @@ -20,10 +20,10 @@ ОбластиПерсональныхДанныхСтрокаПоиска - 12 + 13 ОбластиПерсональныхДанныхСтрокаПоискаРасширеннаяПодсказка - 14 + 15 Label true true @@ -33,7 +33,7 @@ ОбластиПерсональныхДанныхСтрокаПоискаКонтекстноеМеню - 13 + 14 true ОбластиПерсональныхДанных @@ -43,10 +43,10 @@ ОбластиПерсональныхДанныхСостояниеПросмотра - 15 + 16 ОбластиПерсональныхДанныхСостояниеПросмотраРасширеннаяПодсказка - 17 + 18 Label true true @@ -56,7 +56,7 @@ ОбластиПерсональныхДанныхСостояниеПросмотраКонтекстноеМеню - 16 + 17 true ViewStatusAddition @@ -67,10 +67,10 @@ ОбластиПерсональныхДанныхУправлениеПоиском - 18 + 19 ОбластиПерсональныхДанныхУправлениеПоискомРасширеннаяПодсказка - 20 + 21 Label true true @@ -80,7 +80,7 @@ ОбластиПерсональныхДанныхУправлениеПоискомКонтекстноеМеню - 19 + 20 true SearchControlAddition @@ -90,7 +90,7 @@ - ОбластиПерсональныхДанныхРасширеннаяПодсказка + ОбластиПерсональныхДанныхExtendedTooltip 11 Label true @@ -144,8 +144,8 @@ true - ДекорацияРегистрацияСобытияДоступНадписьРасширеннаяПодсказка - 29 + ДекорацияРегистрацияСобытияДоступНадписьExtendedTooltip + 12 Label true true @@ -181,7 +181,7 @@ true - ФормаЗаписатьИЗакрытьРасширеннаяПодсказка + ФормаЗаписатьИЗакрытьExtendedTooltip 10 Label true @@ -209,10 +209,6 @@ OnCreateAtServer ПриСозданииНаСервере - - OnClose - ПриЗакрытии - 60 LockOwner true diff --git a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Module.bsl b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Module.bsl index 6cf579398..67a015613 100644 --- a/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Module.bsl +++ b/SSL/src/CommonForms/НастройкиРегистрацииСобытийДоступаКПерсональнымДанным/Module.bsl @@ -12,22 +12,16 @@ Отказ = Истина; КонецЕсли; - ЗащитаПерсональныхДанных.ПриСозданииФормыНастройкиРегистрацииСобытий(ЭтаФорма); + ЗащитаПерсональныхДанных.ПриСозданииФормыНастройкиРегистрацииСобытий(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если СохранитьДанныеПроизвольнойФормы(Отказ) Тогда - ЗаписатьНаСервере(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если СохранитьДанныеПроизвольнойФормы() Тогда - ЗаписатьНаСервере(); - КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -35,8 +29,7 @@ &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) - ЗаписатьНаСервере(); - Закрыть(); + ВыбратьИЗакрыть(); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -44,51 +37,15 @@ &НаСервере Процедура ЗаписатьНаСервере() - ЗащитаПерсональныхДанных.ПриЗаписиФормыНастройкиРегистрацииСобытий(ЭтаФорма); + ЗащитаПерсональныхДанных.ПриЗаписиФормыНастройкиРегистрацииСобытий(ЭтотОбъект); Модифицированность = Ложь; КонецПроцедуры &НаКлиенте -Функция СохранитьДанныеПроизвольнойФормы(Отказ = Неопределено) - // Вызывает диалог сохранения редактируемых данных произвольной формы - // Вызывается из обработчиков "ПередЗакрытием" и "ПриЗакрытии". - // - // Параметры: - // Отказ - (...) Флаг отказа от закрытия формы. - // |- (Булево) для обработчика "ПередЗакрытием", используется для толстого и тонкого клиентов - // |- (Неопределено) для обработчика "ПриЗакрытии", используется для веб клиента - // - // Возвращаемое значение: - // (Булево) Необходимость сохранения данных формы. +Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт - // Изменение сохраняемых данных должно устанавливать модифицированность формы - Если Модифицированность <> Истина Тогда - Возврат Ложь; - КонецЕсли; + ЗаписатьНаСервере(); + Модифицированность = Ложь; + Закрыть(); - // Определение клиента - #Если ВебКлиент Тогда - ЭтоВебКлиент = Истина; - #Иначе - ЭтоВебКлиент = Ложь; - #КонецЕсли - - // Предупреждение необходимо вызвать только один раз для одного клиента - Если ЭтоВебКлиент <> (Отказ = Неопределено) Тогда - Возврат Ложь; - КонецЕсли; - - ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); - Кнопки = ?(ЭтоВебКлиент, РежимДиалогаВопрос.ДаНет, РежимДиалогаВопрос.ДаНетОтмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - Возврат Истина; - КонецЕсли; - - Если НЕ ЭтоВебКлиент И Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - КонецЕсли; - - Возврат Ложь; -КонецФункции +КонецПроцедуры diff --git a/SSL/src/CommonForms/ОбменыДанными/Form.form b/SSL/src/CommonForms/ОбменыДанными/Form.form index fc1ee844e..748ad1999 100644 --- a/SSL/src/CommonForms/ОбменыДанными/Form.form +++ b/SSL/src/CommonForms/ОбменыДанными/Form.form @@ -22,7 +22,7 @@ true - Декорация2РасширеннаяПодсказка + Декорация2ExtendedTooltip 395 Label true @@ -69,7 +69,7 @@ true - ИнформацияОСинхронизацииЕстьПраваРасширеннаяПодсказка + ИнформацияОСинхронизацииЕстьПраваExtendedTooltip 399 Label true @@ -98,7 +98,7 @@ true - ЕстьПраваНаСинхронизациюРасширеннаяПодсказка + ЕстьПраваНаСинхронизациюExtendedTooltip 398 Label true @@ -130,7 +130,7 @@ true - ИнформацияОСинхронизацииНетПравРасширеннаяПодсказка + ИнформацияОСинхронизацииНетПравExtendedTooltip 401 Label true @@ -159,7 +159,7 @@ true - НетПравНаСинхронизациюРасширеннаяПодсказка + НетПравНаСинхронизациюExtendedTooltip 400 Label true @@ -180,7 +180,7 @@ true - ИнформационнаяНадписьРасширеннаяПодсказка + ИнформационнаяНадписьExtendedTooltip 397 Label true @@ -203,7 +203,7 @@ true - НастроитьСинхронизациюДанныхНеНастроенаРасширеннаяПодсказка + НастроитьСинхронизациюДанныхНеНастроенаExtendedTooltip 402 Label true @@ -230,7 +230,7 @@ true - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 403 Label true @@ -275,7 +275,7 @@ они были введены, и избежать дублирования данных - ПрефиксСинхронизацияНеНастроенаРасширеннаяПодсказка + ПрефиксСинхронизацияНеНастроенаExtendedTooltip 404 Label true @@ -311,7 +311,7 @@ true - Группа10РасширеннаяПодсказка + Группа10ExtendedTooltip 396 Label true @@ -336,7 +336,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 394 Label true @@ -369,7 +369,7 @@ Синхронизация не настроена - СинхронизацияНеНастроенаРасширеннаяПодсказка + СинхронизацияНеНастроенаExtendedTooltip 393 Label true @@ -409,8 +409,8 @@ true - КартинкаПредупреждение1РасширеннаяПодсказка - 410 + КартинкаПредупреждение1ExtendedTooltip + 409 Label true true @@ -452,8 +452,8 @@ true - НадписьОбменДаннымиПриостановленЕстьПравоОбновления1РасширеннаяПодсказка - 413 + НадписьОбменДаннымиПриостановленЕстьПравоОбновления1ExtendedTooltip + 412 Label true true @@ -483,8 +483,8 @@ true - УстановитьОбновление1РасширеннаяПодсказка - 414 + УстановитьОбновление1ExtendedTooltip + 413 Label true true @@ -515,8 +515,8 @@ Информация обмен данными приостановлен есть право обновления - ИнформацияОбменДаннымиПриостановленЕстьПравоОбновления1РасширеннаяПодсказка - 412 + ИнформацияОбменДаннымиПриостановленЕстьПравоОбновления1ExtendedTooltip + 411 Label true true @@ -547,8 +547,8 @@ true - НадписьОбменДаннымиПриостановленНетПраваОбновления1РасширеннаяПодсказка - 416 + НадписьОбменДаннымиПриостановленНетПраваОбновления1ExtendedTooltip + 415 Label true true @@ -585,8 +585,8 @@ Информация обмен данными приостановлен нет права обновления - ИнформацияОбменДаннымиПриостановленНетПраваОбновления1РасширеннаяПодсказка - 415 + ИнформацияОбменДаннымиПриостановленНетПраваОбновления1ExtendedTooltip + 414 Label true true @@ -614,8 +614,8 @@ Право обновления страницы - ПравоОбновленияСтраницыРасширеннаяПодсказка - 411 + ПравоОбновленияСтраницыExtendedTooltip + 410 Label true true @@ -644,8 +644,8 @@ 45 false - ИнформационнаяПанельТребуетсяОбновление1РасширеннаяПодсказка - 409 + ИнформационнаяПанельТребуетсяОбновление1ExtendedTooltip + 408 Label true true @@ -681,8 +681,8 @@ true - ДекорацияСтатусЗагрузкиРасширеннаяПодсказка - 419 + ДекорацияСтатусЗагрузкиExtendedTooltip + 418 Label true true @@ -714,8 +714,8 @@ true - ДекорацияСтатусПустойРасширеннаяПодсказка - 420 + ДекорацияСтатусПустойExtendedTooltip + 419 Label true true @@ -750,8 +750,8 @@ true - ДекорацияСтатусВыгрузкиРасширеннаяПодсказка - 421 + ДекорацияСтатусВыгрузкиExtendedTooltip + 420 Label true true @@ -780,8 +780,8 @@ true - Группа12РасширеннаяПодсказка - 418 + Группа12ExtendedTooltip + 417 Label true true @@ -815,8 +815,8 @@ true - ДекорацияУспешнаяЗагрузкаРасширеннаяПодсказка - 423 + ДекорацияУспешнаяЗагрузкаExtendedTooltip + 422 Label true true @@ -849,8 +849,8 @@ true - ДекорацияУспешнаяВыгрузкаРасширеннаяПодсказка - 424 + ДекорацияУспешнаяВыгрузкаExtendedTooltip + 423 Label true true @@ -876,8 +876,8 @@ true - Группа16РасширеннаяПодсказка - 422 + Группа16ExtendedTooltip + 421 Label true true @@ -911,8 +911,8 @@ true - ДатаУспешнойЗагрузкиРасширеннаяПодсказка - 426 + ДатаУспешнойЗагрузкиExtendedTooltip + 425 Label true true @@ -942,8 +942,8 @@ true - ДатаУспешнойВыгрузкиРасширеннаяПодсказка - 427 + ДатаУспешнойВыгрузкиExtendedTooltip + 426 Label true true @@ -974,8 +974,8 @@ Группа полноправный пользователь - ГруппаПолноправныйПользовательРасширеннаяПодсказка - 425 + ГруппаПолноправныйПользовательExtendedTooltip + 424 Label true true @@ -1005,8 +1005,8 @@ true - НадписьДатаПолученияРасширеннаяПодсказка - 429 + НадписьДатаПолученияExtendedTooltip + 428 Label true true @@ -1038,8 +1038,8 @@ true - НадписьДатаОтправкиРасширеннаяПодсказка - 430 + НадписьДатаОтправкиExtendedTooltip + 429 Label true true @@ -1068,8 +1068,8 @@ true - ГруппаНеполноправныйПользовательРасширеннаяПодсказка - 428 + ГруппаНеполноправныйПользовательExtendedTooltip + 427 Label true true @@ -1093,8 +1093,8 @@ true - Группа5РасширеннаяПодсказка - 417 + Группа5ExtendedTooltip + 416 Label true true @@ -1123,8 +1123,8 @@ true - ВыполнитьОбменДанными2РасширеннаяПодсказка - 432 + ВыполнитьОбменДанными2ExtendedTooltip + 431 Label true true @@ -1150,8 +1150,8 @@ true - ВыполнитьОбменДаннымиИнтерактивно2РасширеннаяПодсказка - 433 + ВыполнитьОбменДаннымиИнтерактивно2ExtendedTooltip + 432 Label true true @@ -1178,8 +1178,8 @@ true - ОткрытьРезультатыОднаСинхронизацияРасширеннаяПодсказка - 434 + ОткрытьРезультатыОднаСинхронизацияExtendedTooltip + 433 Label true true @@ -1202,8 +1202,8 @@ true - Группа2РасширеннаяПодсказка - 431 + Группа2ExtendedTooltip + 430 Label true true @@ -1226,8 +1226,8 @@ true - Группа3РасширеннаяПодсказка - 408 + Группа3ExtendedTooltip + 407 Label true true @@ -1265,8 +1265,8 @@ true - Декорация5РасширеннаяПодсказка - 437 + Декорация5ExtendedTooltip + 436 Label true true @@ -1300,8 +1300,8 @@ true - ИзменитьУзелИнформационнойБазыРасширеннаяПодсказка - 438 + ИзменитьУзелИнформационнойБазыExtendedTooltip + 437 Label true true @@ -1327,8 +1327,8 @@ true - СоставОтправляемыхДанныхРасширеннаяПодсказка - 439 + СоставОтправляемыхДанныхExtendedTooltip + 438 Label true true @@ -1352,8 +1352,8 @@ true - Группа18РасширеннаяПодсказка - 436 + Группа18ExtendedTooltip + 435 Label true true @@ -1383,8 +1383,8 @@ None - ОписаниеПравилСинхронизацииДанныхРасширеннаяПодсказка - 440 + ОписаниеПравилСинхронизацииДанныхExtendedTooltip + 439 Label true true @@ -1422,8 +1422,8 @@ true - ГруппаНастройкиСинхронизацииРасширеннаяПодсказка - 435 + ГруппаНастройкиСинхронизацииExtendedTooltip + 434 Label true true @@ -1461,8 +1461,8 @@ true - РасписаниеСинхронизацииДанныхДекорацияРасширеннаяПодсказка - 444 + РасписаниеСинхронизацииДанныхДекорацияExtendedTooltip + 442 Label true true @@ -1496,8 +1496,8 @@ true - НастроитьСценарииОбменаДаннымиРасширеннаяПодсказка - 445 + НастроитьСценарииОбменаДаннымиExtendedTooltip + 443 Label true true @@ -1524,8 +1524,8 @@ true - Группа19РасширеннаяПодсказка - 443 + Группа19ExtendedTooltip + 441 Label true true @@ -1555,8 +1555,8 @@ None - РасписаниеСинхронизацииДанныхРасширеннаяПодсказка - 446 + РасписаниеСинхронизацииДанныхExtendedTooltip + 444 Label true true @@ -1593,8 +1593,8 @@ true - ГруппаСценарииСинхронизацииРасширеннаяПодсказка - 442 + ГруппаСценарииСинхронизацииExtendedTooltip + 440 Label true true @@ -1622,8 +1622,8 @@ true - ИнформацияПоОбменуРасширеннаяПодсказка - 448 + ИнформацияПоОбменуExtendedTooltip + 445 Label true true @@ -1662,8 +1662,8 @@ они были введены, и избежать дублирования данных - ПрефиксОднаСинхронизацияРасширеннаяПодсказка - 449 + ПрефиксОднаСинхронизацияExtendedTooltip + 446 Label true true @@ -1701,8 +1701,8 @@ true - УдалитьНастройкуСинхронизацииРасширеннаяПодсказка - 451 + УдалитьНастройкуСинхронизацииExtendedTooltip + 447 Label true true @@ -1735,8 +1735,8 @@ false false - СинхронизацияРасширеннаяПодсказка - 407 + СинхронизацияExtendedTooltip + 406 Label true true @@ -1764,8 +1764,8 @@ true - Декорация4РасширеннаяПодсказка - 452 + Декорация4ExtendedTooltip + 448 Label true true @@ -1797,8 +1797,8 @@ true - НастроитьСинхронизациюДанныхОднаРасширеннаяПодсказка - 454 + НастроитьСинхронизациюДанныхОднаExtendedTooltip + 450 Label true true @@ -1828,8 +1828,8 @@ true - Декорация10РасширеннаяПодсказка - 455 + Декорация10ExtendedTooltip + 451 Label true true @@ -1855,8 +1855,8 @@ true - ГруппаНастройкаСинхронизацииРасширеннаяПодсказка - 453 + ГруппаНастройкаСинхронизацииExtendedTooltip + 449 Label true true @@ -1889,8 +1889,8 @@ false - ОднаСинхронизацияРасширеннаяПодсказка - 406 + ОднаСинхронизацияExtendedTooltip + 405 Label true true @@ -1923,8 +1923,8 @@ true - КартинкаПредупреждениеРасширеннаяПодсказка - 458 + КартинкаПредупреждениеExtendedTooltip + 454 Label true true @@ -1964,8 +1964,8 @@ true - НадписьОбменДаннымиПриостановленНетПраваОбновленияРасширеннаяПодсказка - 460 + НадписьОбменДаннымиПриостановленНетПраваОбновленияExtendedTooltip + 456 Label true true @@ -1999,8 +1999,8 @@ Информация обмен данными приостановлен нет права обновления - ИнформацияОбменДаннымиПриостановленНетПраваОбновленияРасширеннаяПодсказка - 459 + ИнформацияОбменДаннымиПриостановленНетПраваОбновленияExtendedTooltip + 455 Label true true @@ -2034,8 +2034,8 @@ true - НадписьОбменДаннымиПриостановленЕстьПравоОбновленияРасширеннаяПодсказка - 462 + НадписьОбменДаннымиПриостановленЕстьПравоОбновленияExtendedTooltip + 458 Label true true @@ -2065,8 +2065,8 @@ true - УстановитьОбновлениеРасширеннаяПодсказка - 463 + УстановитьОбновлениеExtendedTooltip + 459 Label true true @@ -2097,8 +2097,8 @@ Информация обмен данными приостановлен есть право обновления - ИнформацияОбменДаннымиПриостановленЕстьПравоОбновленияРасширеннаяПодсказка - 461 + ИнформацияОбменДаннымиПриостановленЕстьПравоОбновленияExtendedTooltip + 457 Label true true @@ -2130,8 +2130,8 @@ Информационная панель требуется обновление - ИнформационнаяПанельТребуетсяОбновлениеРасширеннаяПодсказка - 457 + ИнформационнаяПанельТребуетсяОбновлениеExtendedTooltip + 453 Label true true @@ -2160,8 +2160,8 @@ true - ОткрытьРезультатыСинхронизацииДанныхРасширеннаяПодсказка - 465 + ОткрытьРезультатыСинхронизацииДанныхExtendedTooltip + 461 Label true true @@ -2195,8 +2195,8 @@ Группа результатов синхронизации данных - ГруппаРезультатовСинхронизацииДанныхРасширеннаяПодсказка - 464 + ГруппаРезультатовСинхронизацииДанныхExtendedTooltip + 460 Label true true @@ -2236,8 +2236,8 @@ Подменю прочее - ПодменюПрочееРасширеннаяПодсказка - 468 + ПодменюПрочееExtendedTooltip + 464 Label true true @@ -2264,8 +2264,8 @@ Подменю РИБ - ПодменюРИБРасширеннаяПодсказка - 469 + ПодменюРИБExtendedTooltip + 465 Label true true @@ -2289,8 +2289,8 @@ Настроить синхронизацию данных с другой программой - ПодменюСоздатьРасширеннаяПодсказка - 467 + ПодменюСоздатьExtendedTooltip + 463 Label true true @@ -2320,8 +2320,8 @@ false - ВыполнитьОбменДаннымиПанельСпискаРасширеннаяПодсказка - 471 + ВыполнитьОбменДаннымиПанельСпискаExtendedTooltip + 467 Label true true @@ -2347,8 +2347,8 @@ true - ВыполнитьОбменДаннымиИнтерактивноПанельСпискаРасширеннаяПодсказка - 472 + ВыполнитьОбменДаннымиИнтерактивноПанельСпискаExtendedTooltip + 468 Label true true @@ -2378,8 +2378,8 @@ Список состояния узлов группа кнопок выполнения обмена данными - СписокСостоянияУзловГруппаКнопокВыполненияОбменаДаннымиРасширеннаяПодсказка - 470 + СписокСостоянияУзловГруппаКнопокВыполненияОбменаДаннымиExtendedTooltip + 466 Label true true @@ -2406,8 +2406,8 @@ false - СписокСостоянияУзловИзменитьУзелИнформационнойБазыРасширеннаяПодсказка - 474 + СписокСостоянияУзловИзменитьУзелИнформационнойБазыExtendedTooltip + 470 Label true true @@ -2432,8 +2432,8 @@ true - СписокСостоянияУзловСоставОтправляемыхДанныхРасширеннаяПодсказка - 475 + СписокСостоянияУзловСоставОтправляемыхДанныхExtendedTooltip + 471 Label true true @@ -2456,8 +2456,8 @@ true - СписокСостоянияУзловГруппа3РасширеннаяПодсказка - 473 + СписокСостоянияУзловГруппа3ExtendedTooltip + 469 Label true true @@ -2479,8 +2479,8 @@ true - СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка - 477 + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхExtendedTooltip + 473 Label true true @@ -2506,8 +2506,8 @@ true - СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка - 478 + СписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхExtendedTooltip + 474 Label true true @@ -2538,8 +2538,8 @@ Настройка обмена данными - НастройкаРасширеннаяПодсказка - 476 + НастройкаExtendedTooltip + 472 Label true true @@ -2558,8 +2558,8 @@ true - НастроитьРасписаниеВыполненияОбменаРасширеннаяПодсказка - 479 + НастроитьРасписаниеВыполненияОбменаExtendedTooltip + 475 Label true true @@ -2588,8 +2588,8 @@ true - СписокСостоянияУзловНайтиРасширеннаяПодсказка - 481 + СписокСостоянияУзловНайтиExtendedTooltip + 477 Label true true @@ -2615,8 +2615,8 @@ true - СписокСостоянияУзловОтменитьПоискРасширеннаяПодсказка - 482 + СписокСостоянияУзловОтменитьПоискExtendedTooltip + 478 Label true true @@ -2639,8 +2639,8 @@ true - СписокСостоянияУзловГруппа2РасширеннаяПодсказка - 480 + СписокСостоянияУзловГруппа2ExtendedTooltip + 476 Label true true @@ -2663,8 +2663,8 @@ false - ОбновитьМониторРасширеннаяПодсказка - 484 + ОбновитьМониторExtendedTooltip + 480 Label true true @@ -2690,8 +2690,8 @@ true - СписокСостоянияУзловСкрыватьУспешныеРасширеннаяПодсказка - 485 + СписокСостоянияУзловСкрыватьУспешныеExtendedTooltip + 481 Label true true @@ -2716,8 +2716,8 @@ true - ФормаВывестиСписокРасширеннаяПодсказка - 486 + ФормаВывестиСписокExtendedTooltip + 482 Label true true @@ -2742,8 +2742,8 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка - 487 + ФормаИзменитьФормуExtendedTooltip + 483 Label true true @@ -2768,8 +2768,8 @@ true - СписокСостоянияУзловИнформацияПоОбменуРасширеннаяПодсказка - 488 + СписокСостоянияУзловИнформацияПоОбменуExtendedTooltip + 484 Label true true @@ -2792,8 +2792,8 @@ true - СписокСостоянияУзловГруппа1РасширеннаяПодсказка - 483 + СписокСостоянияУзловГруппа1ExtendedTooltip + 479 Label true true @@ -2815,8 +2815,8 @@ true - СписокСостоянияУзловУдалитьНастройкуСинхронизацииРасширеннаяПодсказка - 490 + СписокСостоянияУзловУдалитьНастройкуСинхронизацииExtendedTooltip + 486 Label true true @@ -2839,8 +2839,8 @@ true - СписокСостоянияУзловГруппа4РасширеннаяПодсказка - 489 + СписокСостоянияУзловГруппа4ExtendedTooltip + 485 Label true true @@ -2859,8 +2859,8 @@ true - ФормаСправкаРасширеннаяПодсказка - 491 + ФормаСправкаExtendedTooltip + 487 Label true true @@ -2890,8 +2890,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 466 + КоманднаяПанельExtendedTooltip + 462 Label true true @@ -2944,8 +2944,8 @@ Данные синхронизируются по расписанию - СписокСостоянияУзловРасписаниеНастроеноРасширеннаяПодсказка - 513 + СписокСостоянияУзловРасписаниеНастроеноExtendedTooltip + 500 Label true true @@ -2992,8 +2992,8 @@ СписокСостоянияУзлов.ИмяПланаОбмена - СписокСостоянияУзловИмяПланаОбменаРасширеннаяПодсказка - 515 + СписокСостоянияУзловИмяПланаОбменаExtendedTooltip + 501 Label true true @@ -3033,8 +3033,8 @@ СписокСостоянияУзлов.УзелИнформационнойБазы - СписокСостоянияУзловУзелИнформационнойБазыРасширеннаяПодсказка - 517 + СписокСостоянияУзловУзелИнформационнойБазыExtendedTooltip + 502 Label true true @@ -3076,8 +3076,8 @@ Префикс информационной базы - СписокСостоянияУзловПрефиксИнформационнойБазыРасширеннаяПодсказка - 519 + СписокСостоянияУзловПрефиксИнформационнойБазыExtendedTooltip + 503 Label true true @@ -3128,8 +3128,8 @@ Состояние отправки данных - СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхРасширеннаяПодсказка - 523 + СписокСостоянияУзловРезультатПоследнейВыгрузкиДанныхExtendedTooltip + 506 Label true true @@ -3176,8 +3176,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойВыгрузки - СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиРасширеннаяПодсказка - 525 + СписокСостоянияУзловДатаПоследнейУспешнойВыгрузкиExtendedTooltip + 507 Label true true @@ -3227,8 +3227,8 @@ Список состояния узлов группа успешной выгрузки - СписокСостоянияУзловГруппаУспешнойВыгрузкиРасширеннаяПодсказка - 522 + СписокСостоянияУзловГруппаУспешнойВыгрузкиExtendedTooltip + 505 Label true true @@ -3253,8 +3253,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейВыгрузки - СписокСостоянияУзловДатаПоследнейВыгрузкиРасширеннаяПодсказка - 527 + СписокСостоянияУзловДатаПоследнейВыгрузкиExtendedTooltip + 508 Label true true @@ -3297,8 +3297,8 @@ Группа выгрузки - ГруппаВыгрузкиРасширеннаяПодсказка - 521 + ГруппаВыгрузкиExtendedTooltip + 504 Label true true @@ -3336,8 +3336,8 @@ Состояние получения данных - СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхРасширеннаяПодсказка - 531 + СписокСостоянияУзловРезультатПоследнейЗагрузкиДанныхExtendedTooltip + 511 Label true true @@ -3384,8 +3384,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейУспешнойЗагрузки - СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиРасширеннаяПодсказка - 533 + СписокСостоянияУзловДатаПоследнейУспешнойЗагрузкиExtendedTooltip + 512 Label true true @@ -3435,8 +3435,8 @@ Список состояния узлов группа успешной загрузки - СписокСостоянияУзловГруппаУспешнойЗагрузкиРасширеннаяПодсказка - 530 + СписокСостоянияУзловГруппаУспешнойЗагрузкиExtendedTooltip + 510 Label true true @@ -3461,8 +3461,8 @@ СписокСостоянияУзлов.ПредставлениеДатыПоследнейЗагрузки - СписокСостоянияУзловДатаПоследнейЗагрузкиРасширеннаяПодсказка - 535 + СписокСостоянияУзловДатаПоследнейЗагрузкиExtendedTooltip + 513 Label true true @@ -3505,8 +3505,8 @@ Группа загрузки - ГруппаЗагрузкиРасширеннаяПодсказка - 529 + ГруппаЗагрузкиExtendedTooltip + 509 Label true true @@ -3538,10 +3538,10 @@ СписокСостоянияУзловСтрокаПоиска - 504 + 521 СписокСостоянияУзловСтрокаПоискаРасширеннаяПодсказка - 506 + 523 Label true true @@ -3551,7 +3551,7 @@ СписокСостоянияУзловСтрокаПоискаКонтекстноеМеню - 505 + 522 true СписокСостоянияУзлов @@ -3561,10 +3561,10 @@ СписокСостоянияУзловСостояниеПросмотра - 507 + 524 СписокСостоянияУзловСостояниеПросмотраРасширеннаяПодсказка - 509 + 526 Label true true @@ -3574,7 +3574,7 @@ СписокСостоянияУзловСостояниеПросмотраКонтекстноеМеню - 508 + 525 true ViewStatusAddition @@ -3585,10 +3585,10 @@ СписокСостоянияУзловУправлениеПоиском - 510 + 527 СписокСостоянияУзловУправлениеПоискомРасширеннаяПодсказка - 512 + 529 Label true true @@ -3598,7 +3598,7 @@ СписокСостоянияУзловУправлениеПоискомКонтекстноеМеню - 511 + 528 true SearchControlAddition @@ -3608,8 +3608,8 @@ - СписокСостоянияУзловРасширеннаяПодсказка - 503 + СписокСостоянияУзловExtendedTooltip + 499 Label true true @@ -3633,8 +3633,8 @@ false - ВыполнитьОбменДаннымиМенюСпискаРасширеннаяПодсказка - 493 + ВыполнитьОбменДаннымиМенюСпискаExtendedTooltip + 489 Label true true @@ -3659,8 +3659,8 @@ true - ВыполнитьОбменДаннымиИнтерактивноМенюСпискаРасширеннаяПодсказка - 494 + ВыполнитьОбменДаннымиИнтерактивноМенюСпискаExtendedTooltip + 490 Label true true @@ -3690,8 +3690,8 @@ Группа кнопок выполнения обмена данными - ГруппаКнопокВыполненияОбменаДаннымиРасширеннаяПодсказка - 492 + ГруппаКнопокВыполненияОбменаДаннымиExtendedTooltip + 488 Label true true @@ -3710,8 +3710,8 @@ true - СписокСостоянияУзловКонтекстноеМенюИзменитьУзелИнформационнойБазыРасширеннаяПодсказка - 495 + СписокСостоянияУзловКонтекстноеМенюИзменитьУзелИнформационнойБазыExtendedTooltip + 491 Label true true @@ -3736,8 +3736,8 @@ true - СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанныхРасширеннаяПодсказка - 496 + СписокСостоянияУзловКонтекстноеМенюСоставОтправляемыхДанныхExtendedTooltip + 492 Label true true @@ -3766,8 +3766,8 @@ false - КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхРасширеннаяПодсказка - 498 + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийЗагрузкиДанныхExtendedTooltip + 494 Label true true @@ -3793,8 +3793,8 @@ false - КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхРасширеннаяПодсказка - 499 + КонтекстноеМенюСписокСостоянияУзловПерейтиВЖурналРегистрацииСобытийВыгрузкиДанныхExtendedTooltip + 495 Label true true @@ -3820,8 +3820,8 @@ Диагностика - КонтекстноеМенюСписокСостоянияДиагностикаРасширеннаяПодсказка - 497 + КонтекстноеМенюСписокСостоянияДиагностикаExtendedTooltip + 493 Label true true @@ -3843,8 +3843,8 @@ true - НастроитьРасписаниеВыполненияОбмена1РасширеннаяПодсказка - 501 + НастроитьРасписаниеВыполненияОбмена1ExtendedTooltip + 497 Label true true @@ -3874,8 +3874,8 @@ Группа кнопок настройки расписания - ГруппаКнопокНастройкиРасписанияРасширеннаяПодсказка - 500 + ГруппаКнопокНастройкиРасписанияExtendedTooltip + 496 Label true true @@ -3894,8 +3894,8 @@ true - СписокСостоянияУзловКонтекстноеМенюИнформацияПоОбменуРасширеннаяПодсказка - 502 + СписокСостоянияУзловКонтекстноеМенюИнформацияПоОбменуExtendedTooltip + 498 Label true true @@ -3966,8 +3966,8 @@ они были введены, и избежать дублирования данных - ПрефиксИБРасширеннаяПодсказка - 546 + ПрефиксИБExtendedTooltip + 515 Label true true @@ -4005,8 +4005,8 @@ true - Декорация6РасширеннаяПодсказка - 548 + Декорация6ExtendedTooltip + 516 Label true true @@ -4041,8 +4041,8 @@ Группа префикса - ГруппаПрефиксаРасширеннаяПодсказка - 545 + ГруппаПрефиксаExtendedTooltip + 514 Label true true @@ -4073,8 +4073,8 @@ Несколько синхронизаций - НесколькоСинхронизацийРасширеннаяПодсказка - 456 + НесколькоСинхронизацийExtendedTooltip + 452 Label true true @@ -4102,7 +4102,7 @@ Синхронизация данных - СинхронизацияДанныхРасширеннаяПодсказка + СинхронизацияДанныхExtendedTooltip 392 Label true diff --git a/SSL/src/CommonForms/ОбменыДанными/Help/ru.html b/SSL/src/CommonForms/ОбменыДанными/Help/ru.html index d9709d046..14506ba9d 100644 --- a/SSL/src/CommonForms/ОбменыДанными/Help/ru.html +++ b/SSL/src/CommonForms/ОбменыДанными/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

          diff --git a/SSL/src/CommonForms/ОбменыДанными/Module.bsl b/SSL/src/CommonForms/ОбменыДанными/Module.bsl index 09b4b986e..d4b0b2889 100644 --- a/SSL/src/CommonForms/ОбменыДанными/Module.bsl +++ b/SSL/src/CommonForms/ОбменыДанными/Module.bsl @@ -8,7 +8,7 @@ Возврат; КонецЕсли; - Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Тогда + Если Не ОбщегоНазначения.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка) Тогда Возврат; КонецЕсли; @@ -98,7 +98,13 @@ &НаКлиенте Процедура НастроитьСинхронизациюДанных(Элемент) - ВыбраннаяСинхронизация = ВыбратьИзМеню(НастраиваемыеСинхронизации, Элемент); + ОписаниеОповещения = Новый ОписаниеОповещения("НастроитьСинхронизациюДанныхЗавершение", ЭтотОбъект); + ПоказатьВыборИзМеню(ОписаниеОповещения, НастраиваемыеСинхронизации, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьСинхронизациюДанныхЗавершение(ВыбраннаяСинхронизация, ДополнительныеПараметры) Экспорт Если ВыбраннаяСинхронизация <> Неопределено Тогда @@ -114,7 +120,13 @@ &НаКлиенте Процедура СписокСостоянияУзловВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - Ответ = Вопрос(НСтр("ru = 'Выполнить синхронизацию данных?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); + ОписаниеОповещения = Новый ОписаниеОповещения("СписокСостоянияУзловВыборЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Выполнить синхронизацию данных?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); + +КонецПроцедуры + +&НаКлиенте +Процедура СписокСостоянияУзловВыборЗавершение(Ответ, ДополнительныеПараметры) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда @@ -122,7 +134,7 @@ Получатель = Элементы.СписокСостоянияУзлов.ТекущиеДанные.УзелИнформационнойБазы; - ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(Получатель, ЭтаФорма,, АвтоматическаяСинхронизация); + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(Получатель, ЭтотОбъект,, АвтоматическаяСинхронизация); КонецЕсли; @@ -149,7 +161,7 @@ Процедура ВыполнитьОбменДанными(Команда) ОбновитьДанныеМонитора(); - + Если КоличествоСинхронизаций = 1 Тогда УзелОбмена = СписокСостоянияУзлов[0].УзелИнформационнойБазы; @@ -168,7 +180,7 @@ КонецЕсли; - ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(УзелОбмена, ЭтаФорма,, АвтоматическаяСинхронизация); + ОбменДаннымиКлиент.ВыполнитьОбменДаннымиОбработкаКоманды(УзелОбмена, ЭтотОбъект,, АвтоматическаяСинхронизация); КонецПроцедуры @@ -194,7 +206,7 @@ КонецЕсли; ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; - ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(УзелОбмена, ЭтаФорма); + ОбменДаннымиКлиент.ОткрытьПомощникСопоставленияОбъектовОбработкаКоманды(УзелОбмена, ЭтотОбъект); КонецПроцедуры @@ -203,7 +215,7 @@ ТекущиеДанные = Элементы.СписокСостоянияУзлов.ТекущиеДанные; - ОбменДаннымиКлиент.ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(ТекущиеДанные.УзелИнформационнойБазы, ЭтаФорма); + ОбменДаннымиКлиент.ОбработкаКомандыНастроитьРасписаниеВыполненияОбмена(ТекущиеДанные.УзелИнформационнойБазы, ЭтотОбъект); КонецПроцедуры @@ -228,7 +240,7 @@ КонецЕсли; - ОткрытьЗначение(УзелОбмена); + ПоказатьЗначение(, УзелОбмена); КонецПроцедуры @@ -246,7 +258,7 @@ КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелОбмена, ЭтаФорма, "ЗагрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелОбмена, ЭтотОбъект, "ЗагрузкаДанных"); КонецПроцедуры @@ -264,7 +276,7 @@ КонецЕсли; - ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелОбмена, ЭтаФорма, "ВыгрузкаДанных"); + ОбменДаннымиКлиент.ПерейтиВЖурналРегистрацииСобытийДанныхМодально(УзелОбмена, ЭтотОбъект, "ВыгрузкаДанных"); КонецПроцедуры @@ -312,7 +324,7 @@ КонецЕсли; - ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.СценарииОбменовДанными.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -425,16 +437,20 @@ &НаСервере Процедура ОбновитьСписокСостоянияУзлов(ТолькоОбновлениеСписка = Ложь) + ПланыОбменаБСП = ОбменДаннымиПовтИсп.ПланыОбменаБСП(); + // обновляем данные в списке состояния узлов - СписокСостоянияУзлов.Загрузить(ОбменДаннымиСервер.ТаблицаМонитораОбменаДанными(ОбменДаннымиПовтИсп.ПланыОбменаБСП(), "Код", СкрыватьУспешные)); + СписокСостоянияУзлов.Загрузить(ОбменДаннымиСервер.ТаблицаМонитораОбменаДанными(ПланыОбменаБСП, "Код", СкрыватьУспешные)); + + КоличествоНастроенныхОбменов = ОбменДаннымиСервер.КоличествоНастроенныхОбменов(ПланыОбменаБСП); Если Не ТолькоОбновлениеСписка Тогда ПроверитьСостояниеОбменаСГлавнымУзлом(); - Если КоличествоСинхронизаций <> СписокСостоянияУзлов.Количество() Тогда + Если КоличествоСинхронизаций <> КоличествоНастроенныхОбменов Тогда - ОбновитьКоличествоСинхронизаций(); + ОбновитьКоличествоСинхронизаций(КоличествоНастроенныхОбменов); ИначеЕсли КоличествоСинхронизаций = 1 Тогда @@ -449,9 +465,9 @@ КонецПроцедуры &НаСервере -Процедура ОбновитьКоличествоСинхронизаций() +Процедура ОбновитьКоличествоСинхронизаций(КоличествоНастроенныхОбменов) - КоличествоСинхронизаций = СписокСостоянияУзлов.Количество(); + КоличествоСинхронизаций = КоличествоНастроенныхОбменов; ПанельСинхронизации = Элементы.СинхронизацияДанных; ЕстьПравоОбновления = ПравоДоступа("ОбновлениеКонфигурацииБазыДанных", Метаданные); @@ -700,7 +716,7 @@ Если ТекущиеДанные <> Неопределено Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Индекс(ТекущиеДанные); + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Индекс(ТекущиеДанные); КонецЕсли; @@ -713,16 +729,16 @@ Если ИндексСтроки <> Неопределено Тогда // выполняем проверки позиционирования курсора после получения новых данных - Если ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + Если ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Если ИндексСтроки > ЭтаФорма[ИмяТаблицы].Количество() - 1 Тогда + Если ИндексСтроки > ЭтотОбъект[ИмяТаблицы].Количество() - 1 Тогда - ИндексСтроки = ЭтаФорма[ИмяТаблицы].Количество() - 1; + ИндексСтроки = ЭтотОбъект[ИмяТаблицы].Количество() - 1; КонецЕсли; // позиционируем курсор - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][ИндексСтроки].ПолучитьИдентификатор(); КонецЕсли; @@ -730,9 +746,9 @@ // если спозиционировать строку не удалось, то устанавливаем текущей первую строку Если Элементы[ИмяТаблицы].ТекущаяСтрока = Неопределено - И ЭтаФорма[ИмяТаблицы].Количество() <> 0 Тогда + И ЭтотОбъект[ИмяТаблицы].Количество() <> 0 Тогда - Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтаФорма[ИмяТаблицы][0].ПолучитьИдентификатор(); + Элементы[ИмяТаблицы].ТекущаяСтрока = ЭтотОбъект[ИмяТаблицы][0].ПолучитьИдентификатор(); КонецЕсли; diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form index ef1fe8e52..cd0cd286a 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Form.form @@ -20,7 +20,7 @@ true - ОтложенноеОбновлениеДанныхРасширеннаяПодсказка + ОтложенноеОбновлениеДанныхExtendedTooltip 29 Label true @@ -54,7 +54,7 @@ true - ОтложенноеОбновлениеДанныхПояснениеРасширеннаяПодсказка + ОтложенноеОбновлениеДанныхПояснениеExtendedTooltip 30 Label true @@ -86,7 +86,7 @@ true - ОтложенноеОбновлениеРасширеннаяПодсказка + ОтложенноеОбновлениеExtendedTooltip 28 Label true @@ -122,7 +122,7 @@ true - НайтиРасширеннаяПодсказка + НайтиExtendedTooltip 32 Label true @@ -149,7 +149,7 @@ true - ИзменитьФормуРасширеннаяПодсказка + ИзменитьФормуExtendedTooltip 33 Label true @@ -179,7 +179,7 @@ true - СохранитьРасширеннаяПодсказка + СохранитьExtendedTooltip 34 Label true @@ -205,7 +205,7 @@ true - РазвернутьВсеГруппыРасширеннаяПодсказка + РазвернутьВсеГруппыExtendedTooltip 35 Label true @@ -232,7 +232,7 @@ true - ПечатьРасширеннаяПодсказка + ПечатьExtendedTooltip 36 Label true @@ -259,7 +259,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 37 Label true @@ -290,7 +290,7 @@ Командная панель списка - КоманднаяПанельСпискаРасширеннаяПодсказка + КоманднаяПанельСпискаExtendedTooltip 31 Label true @@ -322,7 +322,7 @@ None - ОписаниеОбновленийРасширеннаяПодсказка + ОписаниеОбновленийExtendedTooltip 38 Label true @@ -377,8 +377,8 @@ true - АдресФормыВПрограммеРасширеннаяПодсказка - 41 + АдресФормыВПрограммеExtendedTooltip + 40 Label true true @@ -419,8 +419,8 @@ - ТехническаяИнформацияОРезультатахОбновленияРасширеннаяПодсказка - 43 + ТехническаяИнформацияОРезультатахОбновленияExtendedTooltip + 42 Label true true @@ -460,8 +460,8 @@ true false - ЗакрытьРасширеннаяПодсказка - 45 + ЗакрытьExtendedTooltip + 44 Label true true @@ -491,8 +491,8 @@ 5 - КоманднаяПанельФормыРасширеннаяПодсказка - 44 + КоманднаяПанельФормыExtendedTooltip + 43 Label true true @@ -520,8 +520,8 @@ false - ГруппаТехническаяИнформацияИЗакрытьРасширеннаяПодсказка - 42 + ГруппаТехническаяИнформацияИЗакрытьExtendedTooltip + 41 Label true true @@ -554,8 +554,8 @@ true - ГруппаРасширеннаяПодсказка - 40 + ГруппаExtendedTooltip + 39 Label true true diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html index 133d057d3..d8fbfa5ac 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Help/ru.html @@ -1,3 +1,3 @@ - +

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

          Описание обновлений можно просмотреть позднее, пройдя в панель Информация на рабочем столе.

          \ No newline at end of file diff --git a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl index 5eca7b943..c3682ff91 100644 --- a/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl +++ b/SSL/src/CommonForms/ОписаниеИзмененийСистемы/Module.bsl @@ -8,6 +8,10 @@ Возврат; КонецЕсли; + Если Не Параметры.ПоказыватьТолькоИзменения Тогда + Элементы.АдресФормыВПрограмме.Видимость = Ложь; + КонецЕсли; + Заголовок = НСтр("ru = 'Что нового в конфигурации %1'"); Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Заголовок, Метаданные.Синоним); @@ -45,7 +49,7 @@ Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда Продолжить; КонецЕсли; - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); Модуль.ПриПодготовкеМакетаОписанияОбновлений(ДокументОписаниеОбновлений); КонецЦикла; ОбновлениеИнформационнойБазыПереопределяемый.ПриПодготовкеМакетаОписанияОбновлений(ДокументОписаниеОбновлений); diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form index 792e95f38..ccc5bcd56 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Form.form @@ -22,7 +22,7 @@ true - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 34 Label true @@ -62,7 +62,7 @@ true - Декорация1РасширеннаяПодсказка + Декорация1ExtendedTooltip 35 Label true @@ -90,7 +90,7 @@ true - Группа7РасширеннаяПодсказка + Группа7ExtendedTooltip 33 Label true @@ -123,7 +123,7 @@ Начало - НачалоРасширеннаяПодсказка + НачалоExtendedTooltip 32 Label true @@ -153,7 +153,7 @@ true - Декорация4РасширеннаяПодсказка + Декорация4ExtendedTooltip 38 Label true @@ -191,7 +191,7 @@ true - Декорация5РасширеннаяПодсказка + Декорация5ExtendedTooltip 39 Label true @@ -220,7 +220,7 @@ true - Группа8РасширеннаяПодсказка + Группа8ExtendedTooltip 37 Label true @@ -252,7 +252,7 @@ Ожидание - ОжиданиеРасширеннаяПодсказка + ОжиданиеExtendedTooltip 36 Label true @@ -282,7 +282,7 @@ true - Декорация6РасширеннаяПодсказка + Декорация6ExtendedTooltip 42 Label true @@ -321,7 +321,7 @@ true - Декорация2РасширеннаяПодсказка + Декорация2ExtendedTooltip 43 Label true @@ -349,7 +349,7 @@ true - Группа9РасширеннаяПодсказка + Группа9ExtendedTooltip 41 Label true @@ -382,7 +382,7 @@ Завершение - ЗавершениеРасширеннаяПодсказка + ЗавершениеExtendedTooltip 40 Label true @@ -411,7 +411,7 @@ Панель основная - ПанельОсновнаяРасширеннаяПодсказка + ПанельОсновнаяExtendedTooltip 31 Label true @@ -443,7 +443,7 @@ true - ПрекратитьСинхронизациюДанныхРасширеннаяПодсказка + ПрекратитьСинхронизациюДанныхExtendedTooltip 47 Label true @@ -469,7 +469,7 @@ true - ОтменитьРасширеннаяПодсказка + ОтменитьExtendedTooltip 48 Label true @@ -492,7 +492,7 @@ true - Группа5РасширеннаяПодсказка + Группа5ExtendedTooltip 46 Label true @@ -520,7 +520,7 @@ Страница навигации начало - СтраницаНавигацииНачалоРасширеннаяПодсказка + СтраницаНавигацииНачалоExtendedTooltip 45 Label true @@ -550,7 +550,7 @@ true - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 51 Label true @@ -574,7 +574,7 @@ true - Группа6РасширеннаяПодсказка + Группа6ExtendedTooltip 50 Label true @@ -604,7 +604,7 @@ true true - СтраницаНавигацииОжиданиеРасширеннаяПодсказка + СтраницаНавигацииОжиданиеExtendedTooltip 49 Label true @@ -634,7 +634,7 @@ true - Закрыть1РасширеннаяПодсказка + Закрыть1ExtendedTooltip 54 Label true @@ -658,7 +658,7 @@ true - Группа14РасширеннаяПодсказка + Группа14ExtendedTooltip 53 Label true @@ -687,7 +687,7 @@ true - СтраницаНавигацииОкончаниеРасширеннаяПодсказка + СтраницаНавигацииОкончаниеExtendedTooltip 52 Label true @@ -716,7 +716,7 @@ Панель навигации - ПанельНавигацииРасширеннаяПодсказка + ПанельНавигацииExtendedTooltip 44 Label true @@ -746,7 +746,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl index 50ef504ac..bcdf097c6 100644 --- a/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl +++ b/SSL/src/CommonForms/ОтключениеАвтономногоРабочегоМеста/Module.bsl @@ -79,7 +79,7 @@ ДлительнаяОперация = Ложь; ПерейтиНазад(); - Предупреждение(НСтр("ru = 'В процессе работы возникли ошибки.'")); + ПоказатьПредупреждение(,НСтр("ru = 'В процессе работы возникли ошибки.'")); КонецПопытки; @@ -476,7 +476,7 @@ Если Отказ Тогда - Предупреждение(НСтр("ru = 'В процессе работы возникли ошибки.'")); + ПоказатьПредупреждение(, НСтр("ru = 'В процессе работы возникли ошибки.'")); ИначеЕсли Не ДлительнаяОперация Тогда diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Form.form b/SSL/src/CommonForms/ОтправкаСообщения/Form.form index 07d6a551a..c334d33c9 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Form.form +++ b/SSL/src/CommonForms/ОтправкаСообщения/Form.form @@ -23,7 +23,7 @@ Адреса электронной почты получателей сообщения - ЭлектронныйАдресКомуРасширеннаяПодсказка + ЭлектронныйАдресКомуExtendedTooltip 52 Label true @@ -69,8 +69,8 @@ Тема отправляемого сообщения - ТемаПисьмаРасширеннаяПодсказка - 54 + ТемаПисьмаExtendedTooltip + 53 Label true true @@ -114,8 +114,8 @@ Тело сообщения - ТелоПисьмаРасширеннаяПодсказка - 56 + ТелоПисьмаExtendedTooltip + 54 Label true true @@ -179,8 +179,8 @@ ПредставлениеВложений.Вложение1 - Вложение1РасширеннаяПодсказка - 74 + Вложение1ExtendedTooltip + 62 Label true true @@ -219,8 +219,8 @@ ПредставлениеВложений.Вложение2 - Вложение2РасширеннаяПодсказка - 76 + Вложение2ExtendedTooltip + 63 Label true true @@ -260,8 +260,8 @@ false - ПриложитьФайлРасширеннаяПодсказка - 63 + ПриложитьФайлExtendedTooltip + 60 Label true true @@ -301,10 +301,10 @@ ВложенияСтрокаПоиска - 65 + 70 ВложенияСтрокаПоискаРасширеннаяПодсказка - 67 + 72 Label true true @@ -314,7 +314,7 @@ ВложенияСтрокаПоискаКонтекстноеМеню - 66 + 71 true Вложения @@ -324,10 +324,10 @@ ВложенияСостояниеПросмотра - 68 + 73 ВложенияСостояниеПросмотраРасширеннаяПодсказка - 70 + 75 Label true true @@ -337,7 +337,7 @@ ВложенияСостояниеПросмотраКонтекстноеМеню - 69 + 74 true ViewStatusAddition @@ -348,10 +348,10 @@ ВложенияУправлениеПоиском - 71 + 76 ВложенияУправлениеПоискомРасширеннаяПодсказка - 73 + 78 Label true true @@ -361,7 +361,7 @@ ВложенияУправлениеПоискомКонтекстноеМеню - 72 + 77 true SearchControlAddition @@ -371,8 +371,8 @@ - ВложенияРасширеннаяПодсказка - 64 + ВложенияExtendedTooltip + 61 Label true true @@ -396,8 +396,8 @@ false - КонтекстноеМенюВложенияПриложитьФайлРасширеннаяПодсказка - 60 + КонтекстноеМенюВложенияПриложитьФайлExtendedTooltip + 57 Label true true @@ -423,8 +423,8 @@ false - КонтекстноеМенюВложенияУдалитьРасширеннаяПодсказка - 61 + КонтекстноеМенюВложенияУдалитьExtendedTooltip + 58 Label true true @@ -454,8 +454,8 @@ Группа приложить файл - ГруппаПриложитьФайлРасширеннаяПодсказка - 59 + ГруппаПриложитьФайлExtendedTooltip + 56 Label true true @@ -475,8 +475,8 @@ false - КонтекстноеМенюВложенияОткрытьФайлРасширеннаяПодсказка - 62 + КонтекстноеМенюВложенияОткрытьФайлExtendedTooltip + 59 Label true true @@ -531,8 +531,8 @@ - ГруппаВложенияРасширеннаяПодсказка - 58 + ГруппаВложенияExtendedTooltip + 55 Label true true @@ -560,7 +560,7 @@ Основная группа тела письма - ОсновнаяГруппаТелаПисьмаРасширеннаяПодсказка + ОсновнаяГруппаТелаПисьмаExtendedTooltip 51 Label true @@ -599,8 +599,8 @@ Учетная запись электронной почты, через которую будет отправлено электронное сообщение - УчетнаяЗаписьРасширеннаяПодсказка - 87 + УчетнаяЗаписьExtendedTooltip + 65 Label true true @@ -663,8 +663,8 @@ Введите адрес электронной почты на который вы хотите получить ответ на это письмо - АдресОтветаРасширеннаяПодсказка - 89 + АдресОтветаExtendedTooltip + 66 Label true true @@ -717,8 +717,8 @@ Группа учетная запись - ГруппаУчетнаяЗаписьРасширеннаяПодсказка - 86 + ГруппаУчетнаяЗаписьExtendedTooltip + 64 Label true true @@ -752,7 +752,7 @@ false - ОтправитьПисьмоРасширеннаяПодсказка + ОтправитьПисьмоExtendedTooltip 49 Label true @@ -779,7 +779,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 50 Label true diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Help/ru.html b/SSL/src/CommonForms/ОтправкаСообщения/Help/ru.html index 177152143..e0707fc0c 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Help/ru.html +++ b/SSL/src/CommonForms/ОтправкаСообщения/Help/ru.html @@ -1,4 +1,4 @@ - +

          В поле Адрес получателя можно указать сразу несколько получателей электронного сообщения.

          В поле Адрес ответа можно задать e-mail адрес, на который получатели письма будут отправлять ответ. Это поле нужно заполнять в том случае, если входящая корреспонденция системной учетной записи не просматривается (например, если учетная запись предназначена только для отправки).

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

          diff --git a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl index 7348e40a5..123953afb 100644 --- a/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаСообщения/Module.bsl @@ -150,12 +150,7 @@ УчетнаяЗапись = НаборУчетныхЗаписей[0].Значение; // для переданного списка учетных записей выбираем их из списка выбора - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяКнопки = "КнопкаВыпадающегоСписка"; - Иначе - ИмяКнопки = "КнопкаСпискаВыбора"; - КонецЕсли; - Элементы.УчетнаяЗапись[ИмяКнопки] = Истина; + Элементы.УчетнаяЗапись.КнопкаВыпадающегоСписка = Истина; УчетнаяЗаписьУказана = Истина; @@ -197,12 +192,7 @@ Элементы.АдресОтвета.СписокВыбора.Добавить(ЭлементаАдресОтвета.Значение, ЭлементаАдресОтвета.Представление); КонецЦикла; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяКнопки = "КнопкаВыпадающегоСписка"; - Иначе - ИмяКнопки = "КнопкаСпискаВыбора"; - КонецЕсли; - Элементы.АдресОтвета[ИмяКнопки] = Истина; + Элементы.АдресОтвета.КнопкаВыпадающегоСписка = Истина; КонецЕсли; Если ЗначениеЗаполнено(АдресОтвета) Тогда @@ -316,14 +306,8 @@ СтандартнаяОбработка = Ложь; Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") Тогда - АдресВременногоХранилища = ""; - Если ПоместитьФайл(АдресВременногоХранилища, ПараметрыПеретаскивания.Значение.ПолноеИмя, , Ложь) Тогда - Файлы = Новый Массив; - ПередаваемыйФайл = Новый ОписаниеПередаваемогоФайла(ПараметрыПеретаскивания.Значение.Имя, АдресВременногоХранилища); - Файлы.Добавить(ПередаваемыйФайл); - ДобавитьФайлыВСписок(Файлы); - ОбновитьПредставлениеВложений(); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ВложенияПеретаскиваниеЗавершение", ЭтотОбъект, Новый Структура("Имя", ПараметрыПеретаскивания.Значение.Имя)); + НачатьПомещениеФайла(ОписаниеОповещения, , ПараметрыПеретаскивания.Значение.ПолноеИмя, Ложь); КонецЕсли; КонецПроцедуры @@ -419,7 +403,7 @@ Или (ТипЗнч(ПарольЗадан) = Тип("ФиксированныйМассив") И ПарольЗадан.Найти(УчетнаяЗапись) = Неопределено)) Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("УчетнаяЗапись", УчетнаяЗапись); - ОткрытьФорму("ОбщаяФорма.ПодтверждениеПароляУчетнойЗаписи", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ПодтверждениеПароляУчетнойЗаписи", ПараметрыФормы, ЭтотОбъект); Иначе ПродолжитьОтправкуПисьмаСПаролем(); КонецЕсли; @@ -441,14 +425,14 @@ // &НаСервереБезКонтекста -Функция ОтправитьПочтовоеСообщение(знач УчетнаяЗапись, знач ПараметрыПисьма) +Функция ОтправитьПочтовоеСообщение(Знач УчетнаяЗапись, Знач ПараметрыПисьма) Возврат ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма); КонецФункции &НаСервереБезКонтекста -Функция ПолучитьПочтовыйАдресПоУчетнойЗаписи(знач УчетнаяЗапись) +Функция ПолучитьПочтовыйАдресПоУчетнойЗаписи(Знач УчетнаяЗапись) Возврат СокрЛП(УчетнаяЗапись.ИмяПользователя) + ? (ПустаяСтрока(СокрЛП(УчетнаяЗапись.ИмяПользователя)), @@ -533,7 +517,7 @@ ОбновитьПредставлениеВложений(); КонецЕсли; Иначе - Предупреждение(НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами добавление файлов не поддерживается.'")); + ПоказатьПредупреждение(,НСтр("ru = 'В Веб-клиенте без установленного расширения работы с файлами добавление файлов не поддерживается.'")); КонецЕсли; КонецПроцедуры @@ -619,7 +603,7 @@ // Добавляет адрес ответа в список сохраняемых значений // &НаСервереБезКонтекста -Функция СохранитьАдресОтвета(знач АдресОтвета) +Функция СохранитьАдресОтвета(Знач АдресОтвета) АктуализироватьАдресОтветаВХранимомСписке(АдресОтвета); @@ -628,8 +612,8 @@ // Добавляет адрес ответа в список сохраняемых значений // &НаСервереБезКонтекста -Функция АктуализироватьАдресОтветаВХранимомСписке(знач АдресОтвета, - знач ДобавлятьАдресВСписок = Истина) +Функция АктуализироватьАдресОтветаВХранимомСписке(Знач АдресОтвета, + Знач ДобавлятьАдресВСписок = Истина) // Получаем список адресов, которые пользователь использовал ранее СписокАдресовОтвета = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( @@ -721,8 +705,24 @@ КонецПопытки; СохранитьАдресОтвета(АдресОтвета); - Предупреждение(НСтр("ru = 'Сообщение успешно отправлено'")); + ОписаниеОповещения = Новый ОписаниеОповещения("ПродолжитьОтправкуПисьмаСПаролемЗавершение", ЭтотОбъект); + ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Сообщение успешно отправлено'")); + +КонецПроцедуры + +&НаКлиенте +Процедура ПродолжитьОтправкуПисьмаСПаролемЗавершение(ДополнительныеПараметры) Экспорт Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ВложенияПеретаскиваниеЗавершение(Результат, АдресВременногоХранилища, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + Файлы = Новый Массив; + ПередаваемыйФайл = Новый ОписаниеПередаваемогоФайла(ДополнительныеПараметры.Имя, АдресВременногоХранилища); + Файлы.Добавить(ПередаваемыйФайл); + ДобавитьФайлыВСписок(Файлы); + ОбновитьПредставлениеВложений(); КонецПроцедуры diff --git a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form index 2aaede799..8de7a854d 100644 --- a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form +++ b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Form.form @@ -35,8 +35,8 @@ ФорматыСохранения.Check - ФорматыСохраненияПометкаРасширеннаяПодсказка - 54 + ФорматыСохраненияПометкаExtendedTooltip + 45 Label true true @@ -68,8 +68,8 @@ ФорматыСохранения.Value - ФорматыСохраненияЗначениеРасширеннаяПодсказка - 56 + ФорматыСохраненияЗначениеExtendedTooltip + 46 Label true true @@ -104,32 +104,9 @@ ФорматыСохраненияСтрокаПоиска - 45 - - ФорматыСохраненияСтрокаПоискаРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - - ФорматыСохраненияСтрокаПоискаКонтекстноеМеню - 46 - true - - ФорматыСохранения - - true - - - - ФорматыСохраненияСостояниеПросмотра 48 - ФорматыСохраненияСостояниеПросмотраРасширеннаяПодсказка + ФорматыСохраненияСтрокаПоискаРасширеннаяПодсказка 50 Label true @@ -139,10 +116,33 @@ - ФорматыСохраненияСостояниеПросмотраКонтекстноеМеню + ФорматыСохраненияСтрокаПоискаКонтекстноеМеню 49 true + ФорматыСохранения + + true + + + + ФорматыСохраненияСостояниеПросмотра + 51 + + ФорматыСохраненияСостояниеПросмотраРасширеннаяПодсказка + 53 + Label + true + true + + Left + + + + ФорматыСохраненияСостояниеПросмотраКонтекстноеМеню + 52 + true + ViewStatusAddition ФорматыСохранения @@ -151,10 +151,10 @@ ФорматыСохраненияУправлениеПоиском - 51 + 54 ФорматыСохраненияУправлениеПоискомРасширеннаяПодсказка - 53 + 56 Label true true @@ -164,7 +164,7 @@ ФорматыСохраненияУправлениеПоискомКонтекстноеМеню - 52 + 55 true SearchControlAddition @@ -174,7 +174,7 @@ - ФорматыСохраненияРасширеннаяПодсказка + ФорматыСохраненияExtendedTooltip 44 Label true @@ -232,8 +232,8 @@ Right - УпаковатьВАрхивРасширеннаяПодсказка - 66 + УпаковатьВАрхивExtendedTooltip + 47 Label true true @@ -268,7 +268,7 @@ false - КнопкаПрикрепитьРасширеннаяПодсказка + КнопкаПрикрепитьExtendedTooltip 42 Label true @@ -293,7 +293,7 @@ true - КнопкаОтменаРасширеннаяПодсказка + КнопкаОтменаExtendedTooltip 43 Label true diff --git a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Module.bsl b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Module.bsl index a2b9bee77..e212141b7 100644 --- a/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Module.bsl +++ b/SSL/src/CommonForms/ОтправкаТабличныхДокументовПоПочте/Module.bsl @@ -65,7 +65,7 @@ КонецЦикла; Если ВыбранныеФорматыСохранения.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо указать как минимум один из предложенных форматов.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Необходимо указать как минимум один из предложенных форматов.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonForms/ОтчетОСохраненииФайлов/Form.form b/SSL/src/CommonForms/ОтчетОСохраненииФайлов/Form.form index 62aa09d77..6a0a06e0d 100644 --- a/SSL/src/CommonForms/ОтчетОСохраненииФайлов/Form.form +++ b/SSL/src/CommonForms/ОтчетОСохраненииФайлов/Form.form @@ -17,7 +17,7 @@ None - ТекстРасширеннаяПодсказка + ТекстExtendedTooltip 5 Label true @@ -64,7 +64,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 4 Label true diff --git a/SSL/src/CommonForms/ПанельОтчетов/Form.form b/SSL/src/CommonForms/ПанельОтчетов/Form.form index 48b7b9aa8..034fe2e13 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Form.form +++ b/SSL/src/CommonForms/ПанельОтчетов/Form.form @@ -24,7 +24,7 @@ ОтборНаименованиеПриИзменении - ОтборНаименованиеРасширеннаяПодсказка + ОтборНаименованиеExtendedTooltip 266 Label true @@ -49,7 +49,7 @@ true false true - true + true true true true @@ -77,8 +77,8 @@ ОтборАвторПриИзменении - ОтборАвторРасширеннаяПодсказка - 268 + ОтборАвторExtendedTooltip + 267 Label true true @@ -125,8 +125,8 @@ true - НастроитьРасширеннаяПодсказка - 271 + НастроитьExtendedTooltip + 269 Label true true @@ -153,8 +153,8 @@ true - СохранитьИзмененияРасширеннаяПодсказка - 272 + СохранитьИзмененияExtendedTooltip + 270 Label true true @@ -180,8 +180,8 @@ true - ОтменитьИзмененияРасширеннаяПодсказка - 273 + ОтменитьИзмененияExtendedTooltip + 271 Label true true @@ -207,8 +207,8 @@ true - ФормаОбновитьРасширеннаяПодсказка - 274 + ФормаОбновитьExtendedTooltip + 272 Label true true @@ -234,8 +234,8 @@ true - СброситьМоиНастройкиРасширеннаяПодсказка - 275 + СброситьМоиНастройкиExtendedTooltip + 273 Label true true @@ -261,8 +261,8 @@ true - ВсеОтчетыРасширеннаяПодсказка - 276 + ВсеОтчетыExtendedTooltip + 274 Label true true @@ -287,8 +287,8 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка - 277 + ФормаИзменитьФормуExtendedTooltip + 275 Label true true @@ -318,8 +318,8 @@ - РежимПросмотраКоманднаяПанельРасширеннаяПодсказка - 270 + РежимПросмотраКоманднаяПанельExtendedTooltip + 268 Label true true @@ -347,7 +347,7 @@ - ВерхняяПанельСтрока1РасширеннаяПодсказка + ВерхняяПанельСтрока1ExtendedTooltip 265 Label true @@ -377,8 +377,8 @@ true - СохранитьИзменения1РасширеннаяПодсказка - 279 + СохранитьИзменения1ExtendedTooltip + 277 Label true true @@ -407,8 +407,8 @@ true - ОтменитьИзменения1РасширеннаяПодсказка - 281 + ОтменитьИзменения1ExtendedTooltip + 279 Label true true @@ -439,8 +439,8 @@ - ГруппаОтменитьИзмененияРасширеннаяПодсказка - 280 + ГруппаОтменитьИзмененияExtendedTooltip + 278 Label true true @@ -471,8 +471,8 @@ true - ВерхняяПанельКартинкаРасширеннаяПодсказка - 282 + ВерхняяПанельКартинкаExtendedTooltip + 280 Label true true @@ -505,8 +505,8 @@ true - ВерхняяПанельНадписьРасширеннаяПодсказка - 283 + ВерхняяПанельНадписьExtendedTooltip + 281 Label true true @@ -545,8 +545,8 @@ - ВерхняяПанельСтрока2РасширеннаяПодсказка - 278 + ВерхняяПанельСтрока2ExtendedTooltip + 276 Label true true @@ -572,8 +572,8 @@ true - ВерхняяПанельОтступРасширеннаяПодсказка - 284 + ВерхняяПанельОтступExtendedTooltip + 282 Label true true @@ -619,8 +619,8 @@ true false - БыстрыйДоступКолонка1РасширеннаяПодсказка - 287 + БыстрыйДоступКолонка1ExtendedTooltip + 285 Label true true @@ -657,8 +657,8 @@ true false - БыстрыйДоступКолонка2РасширеннаяПодсказка - 288 + БыстрыйДоступКолонка2ExtendedTooltip + 286 Label true true @@ -695,8 +695,8 @@ true false - БыстрыйДоступКолонка3РасширеннаяПодсказка - 289 + БыстрыйДоступКолонка3ExtendedTooltip + 287 Label true true @@ -729,8 +729,8 @@ false - БыстрыйДоступРасширеннаяПодсказка - 286 + БыстрыйДоступExtendedTooltip + 284 Label true true @@ -757,8 +757,8 @@ true - БыстрыйДоступДекорацияРасширеннаяПодсказка - 290 + БыстрыйДоступДекорацияExtendedTooltip + 288 Label true true @@ -802,8 +802,8 @@ true false - БезГруппыКолонка1РасширеннаяПодсказка - 292 + БезГруппыКолонка1ExtendedTooltip + 290 Label true true @@ -840,8 +840,8 @@ true false - БезГруппыКолонка2РасширеннаяПодсказка - 293 + БезГруппыКолонка2ExtendedTooltip + 291 Label true true @@ -878,8 +878,8 @@ true false - БезГруппыКолонка3РасширеннаяПодсказка - 294 + БезГруппыКолонка3ExtendedTooltip + 292 Label true true @@ -912,8 +912,8 @@ false - БезГруппыРасширеннаяПодсказка - 291 + БезГруппыExtendedTooltip + 289 Label true true @@ -940,8 +940,8 @@ true - БезГруппыДекорацияРасширеннаяПодсказка - 295 + БезГруппыДекорацияExtendedTooltip + 293 Label true true @@ -985,8 +985,8 @@ true false - СГруппойКолонка1РасширеннаяПодсказка - 297 + СГруппойКолонка1ExtendedTooltip + 295 Label true true @@ -1023,8 +1023,8 @@ true false - СГруппойКолонка2РасширеннаяПодсказка - 298 + СГруппойКолонка2ExtendedTooltip + 296 Label true true @@ -1061,8 +1061,8 @@ true false - СГруппойКолонка3РасширеннаяПодсказка - 299 + СГруппойКолонка3ExtendedTooltip + 297 Label true true @@ -1095,8 +1095,8 @@ false - СГруппойРасширеннаяПодсказка - 296 + СГруппойExtendedTooltip + 294 Label true true @@ -1123,8 +1123,8 @@ true - СГруппойДекорацияРасширеннаяПодсказка - 300 + СГруппойДекорацияExtendedTooltip + 298 Label true true @@ -1168,8 +1168,8 @@ true false - СмТакжеКолонка1РасширеннаяПодсказка - 302 + СмТакжеКолонка1ExtendedTooltip + 300 Label true true @@ -1206,8 +1206,8 @@ true false - СмТакжеКолонка2РасширеннаяПодсказка - 303 + СмТакжеКолонка2ExtendedTooltip + 301 Label true true @@ -1244,8 +1244,8 @@ true false - СмТакжеКолонка3РасширеннаяПодсказка - 304 + СмТакжеКолонка3ExtendedTooltip + 302 Label true true @@ -1285,8 +1285,8 @@ false - СмТакжеРасширеннаяПодсказка - 301 + СмТакжеExtendedTooltip + 299 Label true true @@ -1315,8 +1315,8 @@ true - СмТакжеДекорацияРасширеннаяПодсказка - 305 + СмТакжеДекорацияExtendedTooltip + 303 Label true true @@ -1347,8 +1347,8 @@ true - СсылкаВсеОтчетыРасширеннаяПодсказка - 306 + СсылкаВсеОтчетыExtendedTooltip + 304 Label true true @@ -1376,8 +1376,8 @@ true false - КолонкиРасширеннаяПодсказка - 285 + КолонкиExtendedTooltip + 283 Label true true @@ -1426,10 +1426,6 @@ OnCreateAtServer ПриСозданииНаСервере - - OnClose - ПриЗакрытии - Abort Cancel Close diff --git a/SSL/src/CommonForms/ПанельОтчетов/Help/ru.html b/SSL/src/CommonForms/ПанельОтчетов/Help/ru.html index 8ed735ea3..f2fd5bae4 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Help/ru.html +++ b/SSL/src/CommonForms/ПанельОтчетов/Help/ru.html @@ -1,4 +1,4 @@ - +

          Выводит варианты отчетов, размещенные в разделе или группах раздела.

          Для открытия необходимо кликнуть левой кнопкой мыши на варианте отчета.

          Команды в режиме просмотра:

          diff --git a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl index 1dc35e53e..05c611b41 100644 --- a/SSL/src/CommonForms/ПанельОтчетов/Module.bsl +++ b/SSL/src/CommonForms/ПанельОтчетов/Module.bsl @@ -21,7 +21,7 @@ РазделМетаданные.Представление()); КонецЕсли; - ЭтаФорма.КлючНазначенияИспользования = "Раздел_" + Строка(РазделСсылка.УникальныйИдентификатор()); + ЭтотОбъект.КлючНазначенияИспользования = "Раздел_" + Строка(РазделСсылка.УникальныйИдентификатор()); ВсеПодсистемы = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя(); Найденные = ВсеПодсистемы.Строки.НайтиСтроки(Новый Структура("РазделСсылка", РазделСсылка), Истина); @@ -100,15 +100,10 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если ВариантыОтчетовКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность, Отказ) Тогда - СохранитьПользовательскиеНастройки(); - КонецЕсли; -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - Если ВариантыОтчетовКлиент.СохранитьДанныеПроизвольнойФормы(Модифицированность) Тогда - СохранитьПользовательскиеНастройки(); + Если РежимНастройки Тогда + ТекстВопроса = ТекстВопросаОСохраненииИзменений(); + Обработчик = Новый ОписаниеОповещения("СохранитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Обработчик, Отказ, ТекстВопроса); КонецЕсли; КонецПроцедуры @@ -134,10 +129,8 @@ ИначеЕсли Не ЗначениеЗаполнено(Вариант.ИмяОтчета) Тогда - Предупреждение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не заполнено имя отчета для варианта ""%1"".'"), - Вариант.Наименование)); + ТекстПредупреждения = СтрЗаменить(НСтр("ru = 'Не заполнено имя отчета для варианта ""%1"".'"), "%1", Вариант.Наименование); + ПоказатьПредупреждение(, ТекстПредупреждения); Иначе @@ -160,7 +153,7 @@ &НаКлиенте Процедура ВидимостьВариантаПриИзменении(Элемент) Флажок = Элемент; - Показать = ЭтаФорма[Флажок.Имя]; + Показать = ЭтотОбъект[Флажок.Имя]; НадписьИмя = Сред(Флажок.Имя, СтрДлина("Флажок_")+1); Элемент = Элементы.Найти(НадписьИмя); @@ -205,19 +198,15 @@ &НаКлиенте Процедура Настроить(Команда) - РежимНастройки = НЕ РежимНастройки; - СохранитьНастройки = Ложь; - Если НЕ РежимНастройки И Модифицированность Тогда - ТекстВопроса = НСтр("ru = 'Настройки расположения отчетов были изменены. - |Сохранить изменения?'"); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Да Тогда - СохранитьНастройки = Истина; - КонецЕсли; + Если РежимНастройки И Модифицированность Тогда + ТекстВопроса = ТекстВопросаОСохраненииИзменений(); + ЗаголовокВопроса = СтрЗаменить(Заголовок, "*", ""); + Обработчик = Новый ОписаниеОповещения("НастроитьЗавершение", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, 60, КодВозвратаДиалога.Да, ЗаголовокВопроса); + Иначе + РежимНастройки = НЕ РежимНастройки; + ОбновитьПанельОтчетов(Ложь, Ложь); КонецЕсли; - - ОбновитьПанельОтчетов(СохранитьНастройки, Ложь); КонецПроцедуры &НаКлиенте @@ -289,18 +278,14 @@ КонецЕсли; Вариант = Найденные[0]; - ОткрытьЗначение(Вариант.Ссылка); + ПоказатьЗначение(, Вариант.Ссылка); КонецПроцедуры &НаКлиенте Процедура СброситьНастройки(Команда) ТекстВопроса = НСтр("ru = 'Сбросить настройки расположения отчетов?'"); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - СброситьНастройкиИОбновитьПанельОтчетов(); - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("СброситьНастройкиЗавершение", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Нет); КонецПроцедуры &НаКлиенте @@ -316,6 +301,12 @@ ОбновитьПанельОтчетов(СохранитьНастройки, ОставитьИзмененияВНастройках); КонецПроцедуры +&НаКлиенте +Функция ТекстВопросаОСохраненииИзменений() + Возврат НСтр("ru = 'Настройки расположения отчетов были изменены. + |Сохранить изменения?'"); +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -329,7 +320,7 @@ Вариант.ИзмененПользователем = Истина; Вариант.СвоиНастройки = Истина; Элемент.ЦветТекста = ?(Показать, ЦветВидимыхВариантов, ЦветСкрытыхВариантов); - ЭтаФорма["Флажок_"+ Вариант.НадписьИмя] = Показать; + ЭтотОбъект["Флажок_"+ Вариант.НадписьИмя] = Показать; Если Вариант.Важный Тогда Если Показать Тогда Элемент.Шрифт = ШрифтЖирный; @@ -360,6 +351,30 @@ ПереместитьВариантБыстрогоДоступа(Вариант.ПолучитьИдентификатор(), БыстрыйДоступ); КонецПроцедуры +&НаКлиенте +Процедура СброситьНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + СброситьНастройкиИОбновитьПанельОтчетов(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НастроитьЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + СохранитьИзменения(Неопределено); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда + ОтменитьИзменения(Неопределено); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИЗакрыть(Результат, ДополнительныеПараметры) Экспорт + + СохранитьПользовательскиеНастройки(); + Закрыть(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вызов сервера @@ -586,7 +601,7 @@ Найденные = ДобавленныеВарианты.НайтиСтроки(Новый Структура("НадписьИмя", НадписьИмя)); Если Найденные.Количество() > 0 Тогда Вариант = Найденные[0]; - ЭтаФорма[Реквизит.Имя] = Вариант.Видимость; + ЭтотОбъект[Реквизит.Имя] = Вариант.Видимость; КонецЕсли; КонецЦикла; КонецЕсли; @@ -628,6 +643,7 @@ ИзмененныеНастройки.Колонки.Ссылка.Имя = "Вариант"; ИзмененныеНастройки.Колонки.Подсистема.Имя = "РазделИлиГруппа"; РегистрыСведений.НастройкиВариантовОтчетов.СохранитьНастройкиПользователяВРазделе(ИзмененныеНастройки); + Модифицированность = Ложь; КонецПроцедуры &НаСервере diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form index 667b6068d..50c777d81 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Form.form @@ -25,7 +25,7 @@ НеразделенныйАдминистраторИБ - НеразделенныйАдминистраторИБРасширеннаяПодсказка + НеразделенныйАдминистраторИБExtendedTooltip 46 Label true @@ -71,8 +71,8 @@ ПарольАдминистратораИБ - ПарольНеразделенногоАдминистратораИБРасширеннаяПодсказка - 48 + ПарольНеразделенногоАдминистратораИБExtendedTooltip + 47 Label true true @@ -114,7 +114,7 @@ Разделение данных - РазделениеДанныхРасширеннаяПодсказка + РазделениеДанныхExtendedTooltip 45 Label true @@ -151,8 +151,8 @@ Администратор информационной базы, от имени которого выполняется принудительное отключение сеансов - АдминистраторИБРасширеннаяПодсказка - 51 + АдминистраторИБExtendedTooltip + 49 Label true true @@ -201,8 +201,8 @@ Пароль администратора информационной базы, от имени которого выполняется принудительное отключение сеансов - ПарольАдминистратораИБРасширеннаяПодсказка - 53 + ПарольАдминистратораИБExtendedTooltip + 50 Label true true @@ -240,8 +240,8 @@ Нет разделения данных - НетРазделенияДанныхРасширеннаяПодсказка - 50 + НетРазделенияДанныхExtendedTooltip + 48 Label true true @@ -261,7 +261,7 @@ true - РежимРаботыРасширеннаяПодсказка + РежимРаботыExtendedTooltip 44 Label true @@ -285,7 +285,7 @@ Администратор информационной базы: - ГруппаАдминистрированиеРасширеннаяПодсказка + ГруппаАдминистрированиеExtendedTooltip 43 Label true @@ -325,8 +325,8 @@ КластерТребуетАвторизацииПриИзменении - КластерТребуетАвторизацииРасширеннаяПодсказка - 56 + КластерТребуетАвторизацииExtendedTooltip + 52 Label true true @@ -361,8 +361,8 @@ ИмяАдминистратораКластера - ИмяАдминистратораКластераРасширеннаяПодсказка - 59 + ИмяАдминистратораКластераExtendedTooltip + 54 Label true true @@ -403,8 +403,8 @@ ПарольАдминистратораКластера - ПарольАдминистратораКластераРасширеннаяПодсказка - 61 + ПарольАдминистратораКластераExtendedTooltip + 55 Label true true @@ -444,8 +444,8 @@ Параметры авторизации кластера серверов - ГруппаАвторизацияКластераРасширеннаяПодсказка - 58 + ГруппаАвторизацияКластераExtendedTooltip + 53 Label true true @@ -469,8 +469,8 @@ true - ГруппаКластерТребуетАвторизацииРасширеннаяПодсказка - 55 + ГруппаКластерТребуетАвторизацииExtendedTooltip + 51 Label true true @@ -510,8 +510,8 @@ НестандартныеПортыПриИзменении - НестандартныеПортыРасширеннаяПодсказка - 64 + НестандартныеПортыExtendedTooltip + 57 Label true true @@ -546,8 +546,8 @@ ПортКластераСерверов - ПортКластераСерверовРасширеннаяПодсказка - 67 + ПортКластераСерверовExtendedTooltip + 59 Label true true @@ -586,8 +586,8 @@ ПортАгентаСервера - ПортАгентаСервераРасширеннаяПодсказка - 69 + ПортАгентаСервераExtendedTooltip + 60 Label true true @@ -624,8 +624,8 @@ Порты - ГруппаПортыРасширеннаяПодсказка - 66 + ГруппаПортыExtendedTooltip + 58 Label true true @@ -649,8 +649,8 @@ true - ГруппаНестандартныеПортыРасширеннаяПодсказка - 63 + ГруппаНестандартныеПортыExtendedTooltip + 56 Label true true @@ -684,7 +684,7 @@ true - ФормаOKРасширеннаяПодсказка + ФормаOKExtendedTooltip 40 Label true @@ -710,7 +710,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 41 Label true @@ -737,7 +737,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 42 Label true diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Help/ru.html b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Help/ru.html index 3e0379b4c..c3763f873 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Help/ru.html +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Help/ru.html @@ -1,4 +1,4 @@ - +

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

          • имя и пароль администратора информационной базы для выполнения блокировки регламентных и фоновых заданий от его имени;
          • имя и пароль одного из администратора кластера серверов, от имени которого выполняется принудительное завершение (отключение) сеансов пользователей; не задается, если в кластере серверов не задан ни один администратор; diff --git a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl index 9e0aeba77..92dff3b43 100644 --- a/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl +++ b/SSL/src/CommonForms/ПараметрыАдминистрированияСервернойИБ/Module.bsl @@ -22,28 +22,12 @@ ИдентификаторАдминистратораИБ = ПользовательИБ.УникальныйИдентификатор; КонецЕсли; - Иначе - Администраторы = РегистрыСведений.НеразделенныеПользователи.СписокАдминистраторов(); - Для каждого ЭлементСписка Из Администраторы Цикл - Если ЭлементСписка.Представление = ПараметрыАдминистрирования.ИмяАдминистратораИБ Тогда - ИдентификаторАдминистратораИБ = ЭлементСписка.Значение; - КонецЕсли; - КонецЦикла; КонецЕсли; Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Элементы.РежимРаботы.ТекущаяСтраница = Элементы.НетРазделенияДанных; Пользователи.НайтиНеоднозначныхПользователейИБ(, ИдентификаторАдминистратораИБ); АдминистраторИБ = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторАдминистратораИБ); - Иначе - Элементы.РежимРаботы.ТекущаяСтраница = Элементы.РазделениеДанных; - НеразделенныйАдминистраторИБ = Строка(ИдентификаторАдминистратораИБ); - СписокВыбора = Элементы.НеразделенныйАдминистраторИБ.СписокВыбора; - СписокВыбора.Очистить(); - Администраторы = РегистрыСведений.НеразделенныеПользователи.СписокАдминистраторов(); - Для каждого ЭлементСписка Из Администраторы Цикл - СписокВыбора.Добавить(Строка(ЭлементСписка.Значение), ЭлементСписка.Представление); - КонецЦикла; КонецЕсли; ПарольАдминистратораИБ = ПараметрыАдминистрирования.ПарольАдминистратораИБ; @@ -172,6 +156,7 @@ КонецФункции +&НаСервере Функция ПолучитьАдминистратораИБ() Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не ЗначениеЗаполнено(АдминистраторИБ) Тогда diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form index a67ee071d..a4646bbb5 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Form.form @@ -17,7 +17,7 @@ ВариантыИспользованияПроксиСервераПриИзменении - ВариантыИспользованияПроксиСервераРасширеннаяПодсказка + ВариантыИспользованияПроксиСервераExtendedTooltip 45 Label true @@ -90,8 +90,8 @@ IP адрес или имя прокси сервера - ПроксиСерверРасширеннаяПодсказка - 49 + ПроксиСерверExtendedTooltip + 48 Label true true @@ -134,8 +134,8 @@ Порт прокси сервера - ПортРасширеннаяПодсказка - 51 + ПортExtendedTooltip + 49 Label true true @@ -182,8 +182,8 @@ Группа адрес сервера - ГруппаАдресСервераРасширеннаяПодсказка - 48 + ГруппаАдресСервераExtendedTooltip + 47 Label true true @@ -219,8 +219,8 @@ Логин для авторизации на прокси сервере - ПользовательРасширеннаяПодсказка - 54 + ПользовательExtendedTooltip + 51 Label true true @@ -263,8 +263,8 @@ Пароль для авторизации на прокси сервере - ПарольРасширеннаяПодсказка - 56 + ПарольExtendedTooltip + 52 Label true true @@ -306,8 +306,8 @@ Группа пользователь пароль - ГруппаПользовательПарольРасширеннаяПодсказка - 53 + ГруппаПользовательПарольExtendedTooltip + 50 Label true true @@ -341,8 +341,8 @@ Right - НеИспользоватьПроксиДляЛокальныхАдресовРасширеннаяПодсказка - 59 + НеИспользоватьПроксиДляЛокальныхАдресовExtendedTooltip + 54 Label true true @@ -371,8 +371,8 @@ true - ДекорацияОтступРасширеннаяПодсказка - 61 + ДекорацияОтступExtendedTooltip + 55 Label true true @@ -403,8 +403,8 @@ true - ДополнительныеПараметрыПроксиСервераРасширеннаяПодсказка - 62 + ДополнительныеПараметрыПроксиСервераExtendedTooltip + 56 Label true true @@ -435,8 +435,8 @@ Группа дополнительных параметров - ГруппаДополнительныхПараметровРасширеннаяПодсказка - 58 + ГруппаДополнительныхПараметровExtendedTooltip + 53 Label true true @@ -467,8 +467,8 @@ Параметры прокси - ПараметрыПроксиРасширеннаяПодсказка - 47 + ПараметрыПроксиExtendedTooltip + 46 Label true true @@ -487,165 +487,6 @@ Auto - - ГруппаИнформацияДляВебСервисов - 35 - - ДекорацияПредупреждениеОшибкиДоступаКФайлу1 - 38 - - <key>ru</key> - <value>Чтобы настроить параметры прокси-сервера для механизмов, расчитанных на работу с -веб-сервисами, необходимо записать текущие настройки прокси-сервера в файл -конфигурации сети. Подробнее см. в справке.</value> - - true - true - - true - - - ДекорацияПредупреждениеОшибкиДоступаКФайлу1РасширеннаяПодсказка - 64 - Label - true - true - - Left - - - - ДекорацияПредупреждениеОшибкиДоступаКФайлу1КонтекстноеМеню - 39 - true - - Label - true - true - true - true - - Style.ПоясняющийТекст - - - Left - Top - - - - Обертка - 42 - - ЗаписатьВФайл - 40 - true - true - - true - - - ЗаписатьВФайлРасширеннаяПодсказка - 66 - Label - true - true - - Left - - - UsualButton - Form.Command.ЗаписатьВФайл - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Обертка</value> - - - ru - Обертка - - - ОберткаРасширеннаяПодсказка - 65 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - СохранитьКак - 41 - true - true - - true - - - СохранитьКакРасширеннаяПодсказка - 67 - Label - true - true - - Left - - - UsualButton - Form.Command.СохранитьКак - Normal - true - true - UserCmds - Auto - - true - true - - true - - - ГруппаИнформацияДляВебСервисовРасширеннаяПодсказка - 63 - Label - true - true - - Left - - - UsualGroup - - Auto - StrongSeparation - true - true - Auto - Auto - - Bottom true @@ -661,7 +502,7 @@ false - ОкРасширеннаяПодсказка + ОкExtendedTooltip 43 Label true @@ -687,7 +528,7 @@ true - КнопкаОтменаРасширеннаяПодсказка + КнопкаОтменаExtendedTooltip 44 Label true @@ -1147,54 +988,6 @@ Auto Auto - - СохранитьКак - - <key>ru</key> - <value>Сохранить как...</value> - - 4 - - ru - Сохранить настройки прокси-сервера в файле - - - true - - - - СохранитьКак - - - Auto - Auto - - - ЗаписатьВФайл - - <key>ru</key> - <value>Записать в файл конфигурации сети</value> - - 5 - - ru - Записать настройки прокси-сервера в файл конфигурации сети - - - true - - - StdPicture.Write - - - - ЗаписатьВФайл - - - Picture - Auto - Auto - НастройкаПроксиНаКлиенте diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html b/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html index 0ab944612..bb872ceb6 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Help/ru.html @@ -1,6 +1,3 @@ - +

            Для доступа в Интернет с клиентских компьютеров параметры прокси‑сервера задаются на каждом клиентском рабочем месте (по команде Персональные настройки в разделе Настройка и администрирование).

            -

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

            -

            Настройка параметров прокси-сервера для механизмов, расчитанных на работу с веб-сервисами
            При обращении к веб-сервисам параметры прокси-сервера зачитываются автоматически из специального конфигурационного файла "inetcfg.xml", расположенного в каталоге конфигурационных файлов платформы 1С:Предприятие. Каталог конфигурационных файлов платформы 1С:Предприятие, как правило, располагается по адресу "<Каталог установки платформы 1С:Предприятие>\conf\", например "C:\Program Files\1cv82\8.2.16.362\bin\conf\". Если в файле "<Каталог установки платформы 1С:Предприятие\conf\conf.cfg" задан параметр "ConfLocation=<Каталог конфигурационных файлов>", то конфигурационные файлы платформы 1С:Предприятие располагаются в каталоге <Каталог конфигурационных файлов> (как правило, это "C:\Program Files\1cv82\conf\" или "C:\Program Files\1cv8\conf\").

            -

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

            -

            Особенности использования конфигурационного файла "inetcfg.xml":
            1) настройки из файла "inetcfg.xml" действуют для всех информационных баз, работа с которыми осуществляется на версиях платформы 1С:Предприятия, использующих один файл inetcfg.xml;
            2) имя пользователя и пароль от прокси-сервера хранятся в открытом виде;
            3) настройки, заданные в файле, будут по умолчанию использованы другими механизмами платформы 1С:Предприятия, если для этих механизмов не указаны явные настройки прокси-сервера;
            4) при необходимости использования платформой 1С:Предприятие системных настроек прокси-сервера файл "inetcfg.xml" необходимо удалить из соответствующего каталога.

            \ No newline at end of file +

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

            \ No newline at end of file diff --git a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl index 0a3262612..7c3c5e62f 100644 --- a/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl +++ b/SSL/src/CommonForms/ПараметрыПроксиСервера/Module.bsl @@ -22,6 +22,8 @@ НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); КонецЕсли; + ИспользоватьПрокси = Истина; + ИспользоватьСистемныеНастройки = Истина; Если ТипЗнч(НастройкаПроксиСервера) = Тип("Соответствие") Тогда ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); @@ -52,8 +54,8 @@ Для каждого ПротоколСервер Из ДополнительныеПрокси Цикл Протокол = ПротоколСервер.Ключ; НастройкаПоПротоколу = ПротоколСервер.Значение; - ЭтаФорма["Сервер" + Протокол] = НастройкаПоПротоколу.Адрес; - ЭтаФорма["Порт" + Протокол] = НастройкаПоПротоколу.Порт; + ЭтотОбъект["Сервер" + Протокол] = НастройкаПоПротоколу.Адрес; + ЭтотОбъект["Порт" + Протокол] = НастройкаПоПротоколу.Порт; КонецЦикла; КонецЕсли; @@ -69,15 +71,13 @@ // Для последнего становятся доступно ручное изменение параметров прокси-сервера ВариантИспользованияПроксиСервера = ?(ИспользоватьПрокси, ?(ИспользоватьСистемныеНастройки = Истина, 1, 2), 0); Если ВариантИспользованияПроксиСервера = 0 Тогда - ИнициализироватьЭлементыФормы(ЭтаФорма, ПустыеНастройкиПроксиСервера()); + ИнициализироватьЭлементыФормы(ЭтотОбъект, ПустыеНастройкиПроксиСервера()); ИначеЕсли ВариантИспользованияПроксиСервера = 1 И Не НастройкаПроксиНаКлиенте Тогда - ИнициализироватьЭлементыФормы(ЭтаФорма, СистемныеНастройкиПроксиСервера()); + ИнициализироватьЭлементыФормы(ЭтотОбъект, СистемныеНастройкиПроксиСервера()); КонецЕсли; // Управление видимостью дополнительных элементов формы ФайловыйРежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый; - Элементы.ГруппаИнформацияДляВебСервисов.Видимость = (НастройкаПроксиНаКлиенте И ФайловыйРежимРаботы) - ИЛИ (НЕ НастройкаПроксиНаКлиенте И НЕ ФайловыйРежимРаботы); КонецПроцедуры @@ -86,13 +86,13 @@ Если НастройкаПроксиНаКлиенте Тогда #Если ВебКлиент Тогда - Предупреждение(НСтр("ru = 'В веб-клиенте параметры прокси-сервера необходимо задавать в настройках браузера.'")); + ПоказатьПредупреждение(, НСтр("ru = 'В веб-клиенте параметры прокси-сервера необходимо задавать в настройках браузера.'")); Отказ = Истина; Возврат; #КонецЕсли Если ВариантИспользованияПроксиСервера = 1 Тогда - ИнициализироватьЭлементыФормы(ЭтаФорма, СистемныеНастройкиПроксиСервера()); + ИнициализироватьЭлементыФормы(ЭтотОбъект, СистемныеНастройкиПроксиСервера()); КонецЕсли; КонецЕсли; @@ -110,7 +110,7 @@ Для Каждого КлючИЗначение Из ВыбранноеЗначение Цикл Если КлючИЗначение.Ключ <> "НеИспользоватьПроксиДляАдресов" Тогда - ЭтаФорма[КлючИЗначение.Ключ] = КлючИЗначение.Значение; + ЭтотОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение; КонецЕсли; КонецЦикла; @@ -125,18 +125,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если Модифицированность Тогда - - КодВозврата = Вопрос(НСтр("ru = 'Параметры прокси-сервера были изменены. Сохранить изменения?'"), - РежимДиалогаВопрос.ДаНетОтмена); - Если КодВозврата = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - ИначеЕсли КодВозврата = КодВозвратаДиалога.Да Тогда - Отказ = Истина; // При закрытии форма должна возвратить настройки прокси-сервера. - СохранитьНастройкиПроксиСервера(); - КонецЕсли; - - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры @@ -163,7 +153,7 @@ СистемныеНастройкиПроксиСервераНаСервере()); КонецЕсли; - ИнициализироватьЭлементыФормы(ЭтаФорма, НастройкиПрокси); + ИнициализироватьЭлементыФормы(ЭтотОбъект, НастройкиПрокси); КонецПроцедуры @@ -188,52 +178,7 @@ ПараметрыФормы.Вставить("НеИспользоватьПроксиДляАдресов", СерверыИсключений); - ОткрытьФорму("ОбщаяФорма.ДополнительныеПараметрыПроксиСервера", ПараметрыФормы, ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗаписатьВФайл(Команда) - - Если Модифицированность Тогда - - КодВозврата = Вопрос(НСтр("ru = 'Для продолжения требуется сохранить изменения параметров прокси-сервера. - |Сохранить изменения?'"), - РежимДиалогаВопрос.ДаНет); - Если КодВозврата <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - СохранитьНастройкиПроксиСервера(Ложь); - - КонецЕсли; - - СохранитьНастройкиПроксиВФайлеКонфигурацииСетиПоУмолчанию(); - -КонецПроцедуры - -&НаКлиенте -Процедура СохранитьКак(Команда) - -#Если ВебКлиент Тогда - - КодВозврата = Вопрос(НСтр("ru = 'Сохранить настройки прокси-сервера в файл?'"), РежимДиалогаВопрос.ДаНет); - Если КодВозврата = КодВозвратаДиалога.Да Тогда - АдресФайла = ДанныеФайлаКонфигурацииСетиИзДанныхФормыВоВременномХранилище(); - ПолучитьФайл(АдресФайла, "inetcfg.xml", Истина); - КонецЕсли; - -#Иначе - - ДиалогСохранения = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ДиалогСохранения.Фильтр = НСтр("ru = 'Документ XML(*.xml)|*.xml'"); - ДиалогСохранения.ПолноеИмяФайла = "inetcfg.xml"; - Если ДиалогСохранения.Выбрать() Тогда - АдресФайла = ДанныеФайлаКонфигурацииСетиИзДанныхФормыВоВременномХранилище(); - ПолучитьФайл(АдресФайла, ДиалогСохранения.ПолноеИмяФайла, Ложь); - КонецЕсли; - -#КонецЕсли + ОткрытьФорму("ОбщаяФорма.ДополнительныеПараметрыПроксиСервера", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -289,7 +234,6 @@ // Изменяем доступность группы редактирования параметров прокси в зависимости // от варианта использования прокси-сервера Форма.Элементы.ПараметрыПрокси.Доступность = (Форма.ВариантИспользованияПроксиСервера = 2); - Форма.Элементы.СохранитьКак.Доступность = (Форма.ВариантИспользованияПроксиСервера <> 1); КонецПроцедуры @@ -339,34 +283,10 @@ ЗаписатьНастройкиПроксиСервераВИнформационнуюБазу(НастройкаПроксиНаКлиенте, НастройкаПроксиСервера); - ТребуетсяВыполнитьПопыткуЗаписиНастроекВФайл = Модифицированность ИЛИ НЕ ВыполненаПопыткаСохраненияНастроекВФайл; Модифицированность = Ложь; Если ЗакрытьФорму Тогда - Если ТребуетсяВыполнитьПопыткуЗаписиНастроекВФайл Тогда - - ЭтоФайловаяИБ = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый; - ТекстВопроса = ""; - Если ЭтоФайловаяИБ И НастройкаПроксиНаКлиенте Тогда - ТекстВопроса = НСтр("ru = 'Возможно применить настройки параметров прокси-сервера для механизмов, рассчитанных на работу с веб-сервисами. - |Для этого необходимо сохранить настройки параметров прокси-сервера в файле конфигурации сети на этом компьютере. - |Сохранить настройки параметров прокси-сервера в файле конфигурации сети на этом компьютере (подробнее см. в справке)?'"); - ИначеЕсли НЕ ЭтоФайловаяИБ И НЕ НастройкаПроксиНаКлиенте Тогда - ТекстВопроса = НСтр("ru = 'Возможно применить настройки параметров прокси-сервера для механизмов, рассчитанных на работу с веб-сервисами. - |Для этого необходимо сохранить настройки параметров прокси-сервера в файле конфигурации сети на компьютере сервера 1С:Предприятия. - |Сохранить настройки параметров прокси-сервера в файле конфигурации сети на компьютере сервера 1С:Предприятия (подробнее см. в справке)?'"); - КонецЕсли; - - Если НЕ ПустаяСтрока(ТекстВопроса) Тогда - КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если КодВозврата = КодВозвратаДиалога.Да Тогда - СохранитьНастройкиПроксиВФайлеКонфигурацииСетиПоУмолчанию(); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - Закрыть(НастройкаПроксиСервера); КонецЕсли; @@ -472,313 +392,9 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Служебные процедуры и функции для формирования и записи конфигурационного -// файла с настройками прокси-сервера - &НаКлиенте -Процедура СохранитьНастройкиПроксиВФайлеКонфигурацииСетиПоУмолчанию() +Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт - // Выбор подробного текста предупреждения, чтобы пользователь - // четко осознавал, какие действия произойдут - - ЭтоФайловаяИБ = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый; - Если ЭтоФайловаяИБ И НастройкаПроксиНаКлиенте Тогда - - ПутьККонфФайлу = ПутьКФайлуКонфигурацииСети(); - Если ВариантИспользованияПроксиСервера = 1 Тогда - ТекстПредупреждения = НСтр("ru = 'Для применения системных настроек требуется удаление файла ""%1"" на - |этом компьютере (подробнее см. в справке). - |Удалить указанный файл?'"); - Иначе - ТекстПредупреждения = НСтр("ru = 'Настройки прокси-сервера будут записаны в файл ""%1"" на этом компьютере (подробнее см. в справке). - |Записать настройки прокси-сервера в указанный файл?'"); - КонецЕсли; - - ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстПредупреждения, - ПутьККонфФайлу); - - Иначе - - // Это клиент-серверная ИБ и настройки для сервера 1С:Предприятия. - // В предупреждении отсутствует путь файла на сервере, т.к. в кластере - // может присутствовать несколько серверов 1С:Предприятия и после обращения - // к серверу за путем файла, в следующий раз вызов может быть обработан на - // другом сервере 1С:Предприятия. - Если ВариантИспользованияПроксиСервера = 1 Тогда - ТекстПредупреждения = НСтр("ru = 'Для применения системных настроек требуется удаление файла ""inetcfg.xml"" на сервере 1С:Предприятия. - |Удалить указанный файл?'"); - Иначе - ТекстПредупреждения = НСтр("ru = 'Настройки прокси-сервера будут записаны в файл ""inetcfg.xml"" на сервере 1С:Предприятия. - |Записать настройки прокси-сервера в указанный файл?'"); - КонецЕсли; - - КонецЕсли; - - КодВозврата = Вопрос(ТекстПредупреждения, РежимДиалогаВопрос.ДаНет); - - Если КодВозврата <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ВыполненаПопыткаСохраненияНастроекВФайл = Истина; - РезультатЗаписиВФайл = ЗаписатьНастройкиПроксиВДействующийФайлКонфигурацииСети(?(ЭтоФайловаяИБ, ПутьККонфФайлу, "")); - Предупреждение(РезультатЗаписиВФайл); + СохранитьНастройкиПроксиСервера(); КонецПроцедуры - -// Формирует двоичные данные конфигурационного файла настроек сети из -// данных формы. -// Возвращаемое значение: Строка - адрес двоичных данных конфигурационного -// файла во временном хранилище. -&НаСервере -Функция ДанныеФайлаКонфигурацииСетиИзДанныхФормыВоВременномХранилище() - - ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml"); - ЗаписатьНастройкиПроксиИзДанныхФормыВФайлНаДиске(ИмяВременногоФайла); - - АдресФайла = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла)); - - Попытка - УдалитьФайлы(ИмяВременногоФайла); - Исключение - КонецПопытки; - - Возврат АдресФайла; - -КонецФункции - -&НаСервере -Функция ЗаписатьНастройкиПроксиВДействующийФайлКонфигурацииСети(знач ПутьККонфФайлу = "") - - Если ПустаяСтрока(ПутьККонфФайлу) Тогда - ПутьККонфФайлу = ПутьКФайлуКонфигурацииСети(); - КонецЕсли; - - ЭтоФайловаяИБ = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый; - Если ВариантИспользованияПроксиСервера = 1 Тогда - - // При системных настройках файл "inetcfg.xml" должен отсутствовать - ОписательФайлаКонфигурации = Новый Файл(ПутьККонфФайлу); - Если ОписательФайлаКонфигурации.Существует() Тогда - Попытка - УдалитьФайлы(ПутьККонфФайлу); - Исключение - - Если ЭтоФайловаяИБ Тогда - ТекстСообщения = НСтр("ru = 'Не удалось удалить файл ""%1"" на этом компьютере. - |Возможно, у текущего пользователя недостаточно прав для выполнения файловой операции. Требуется обратиться к администратору.'"); - Иначе - ТекстСообщения = НСтр("ru = 'Не удалось удалить файл ""%1"" на сервере 1С:Предприятия. - |Возможно, у пользователя, от имени которого запущен рабочий процесс, недостаточно прав на выполнение файловой операции. - |Требуется войти на сервер 1С:Предприятия от имени пользователя с административными правами и удалить указанный файл. - |Если в кластере задействовано несколько рабочих серверов, то необходимо вручную на каждом рабочем сервере удалить - |указанный файл (подробнее см. в справке)'"); - КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПутьККонфФайлу); - - КонецПопытки; - КонецЕсли; - - Если ЭтоФайловаяИБ Тогда - ТекстСообщения = НСтр("ru = 'Файл ""%1"" удален на этом компьютере.'"); - Иначе - ТекстСообщения = НСтр("ru = 'Файл ""%1"" удален на сервере 1С:Предприятия. - |Если в кластере задействовано несколько рабочих серверов, то необходимо вручную на каждом рабочем сервере - |удалить указанный файл (подробнее см. в справке)'"); - КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПутьККонфФайлу); - - Иначе - - Попытка - - ЗаписатьНастройкиПроксиИзДанныхФормыВФайлНаДиске(ПутьККонфФайлу); - - Если ЭтоФайловаяИБ Тогда - ТекстСообщения = НСтр("ru = 'Настройки прокси-сервера записаны в файл ""%1"" на этом компьютере.'"); - Иначе - ТекстСообщения = НСтр("ru = 'Настройки прокси-сервера записаны в файл ""%1"" на сервере 1С:Предприятия. - |Если в кластере задействовано несколько рабочих серверов, то необходимо сохранить настройки в файл (Сохранить как...), - |войти на каждый рабочий сервер 1С:Предприятия с административными правами и скопировать сохраненный в файл в - |соответствующий каталог (подробнее см. в справке)'"); - КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПутьККонфФайлу); - - Исключение - - Если ЭтоФайловаяИБ Тогда - ТекстСообщения = НСтр("ru = 'Не удалось записать настройки прокси-сервера в файл ""%1"" на этом компьютере. - |Возможно, у текущего пользователя недостаточно прав. Требуется обратиться к администратору.'"); - Иначе - ТекстСообщения = НСтр("ru = 'Не удалось записать настройки прокси-сервера в файл ""%1"" на сервере 1С:Предприятия. - |Возможно, у пользователя, от имени которого запущен рабочий процесс, недостаточно прав на выполнение файловой операции. - |Требуется сохранить настройки в файле (Сохранить как...), войти на сервер 1С:Предприятия с административными правами - |и скопировать сохраненный файл в соответствующий каталог. Если в кластере задействовано несколько рабочих серверов, - |то сохраненный файл требуется поместить в соответствующий каталог на каждом рабочем сервере (подробнее см. в справке).'"); - КонецЕсли; - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ПутьККонфФайлу); - - КонецПопытки; - - КонецЕсли; - -КонецФункции - -&НаСервере -Процедура ЗаписатьНастройкиПроксиИзДанныхФормыВФайлНаДиске(ПутьКФайлу) - - // Последовательная запись настроек конфигурации в файл конфигурации - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "utf-8"); - ЗаписьXML.ЗаписатьОбъявлениеXML(); - ЗаписьXML.ЗаписатьНачалоЭлемента("InternetProxy"); - - Если НЕ ИспользоватьПрокси Тогда - - // Если не использовать прокси-сервер, то содержимое файла должно иметь вид: - // - ЗаписьXML.ЗаписатьАтрибут("ntlm", "false"); - - иначе - - СтрокаПротоколов = ""; - Если НЕ ОдинПроксиДляВсехПротоколов Тогда - ДобавитьПротоколКСтрокеПротоколов("http" , СтрокаПротоколов); - ДобавитьПротоколКСтрокеПротоколов("https", СтрокаПротоколов); - ДобавитьПротоколКСтрокеПротоколов("ftp" , СтрокаПротоколов); - КонецЕсли; - ДобавитьПротоколКСтрокеПротоколов("", СтрокаПротоколов); - - Если НЕ ПустаяСтрока(СтрокаПротоколов) Тогда - ЗаписьXML.ЗаписатьАтрибут("protocols", СтрокаПротоколов); - КонецЕсли; - - Если НЕ ПустаяСтрока(Пользователь) Тогда - ЗаписьXML.ЗаписатьАтрибут("user", Пользователь); - Если НЕ ПустаяСтрока(Пароль) Тогда - ЗаписьXML.ЗаписатьАтрибут("password", Пароль); - КонецЕсли; - КонецЕсли; - - ЗаписьXML.ЗаписатьАтрибут("bypassOnLocal", XMLСтрока(НеИспользоватьПроксиДляЛокальныхАдресов)); - - СтрокаАдресовСерверовИсключений = ""; - Для каждого ЭлементСпискаСерверовИсключений Из СерверыИсключений Цикл - СтрокаАдресовСерверовИсключений = СтрокаАдресовСерверовИсключений - + ?(ПустаяСтрока(СтрокаАдресовСерверовИсключений), "", " ") - + ЭлементСпискаСерверовИсключений.Значение; - РазделитьПробелом = Истина; - КонецЦикла; - Если НЕ ПустаяСтрока(СтрокаАдресовСерверовИсключений) Тогда - ЗаписьXML.ЗаписатьАтрибут("bypassOnAddresses", СтрокаАдресовСерверовИсключений); - КонецЕсли; - - КонецЕсли; - - ЗаписьXML.ЗаписатьКонецЭлемента(); - ЗаписьXML.Закрыть(); - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьПротоколКСтрокеПротоколов(Протокол, СтрокаПротоколов) - - ИмяРеквизитаАдреса = "Сервер" + Протокол; - ИмяРеквизитаПорта = "Порт" + Протокол; - - Если НЕ ПустаяСтрока(ЭтаФорма[ИмяРеквизитаАдреса]) Тогда - - СтрокаПротоколов = СтрокаПротоколов - + ?(ПустаяСтрока(СтрокаПротоколов), "", " ") - + Протокол - + ?(ПустаяСтрока(Протокол), "", "=") - + НормализованныйАдресПроксиСервера(ЭтаФорма[ИмяРеквизитаАдреса]) - + ?(ЭтаФорма[ИмяРеквизитаПорта] = 0, - "", - ":" + СтрЗаменить(Строка(ЭтаФорма[ИмяРеквизитаПорта]), Символ(160), "")); - - КонецЕсли; - -КонецПроцедуры - -// Определяет путь к файлу конфигурации сети платформы "inetcfg.xml". -// Возвращаемое значение: Строка - путь к файлу конфигурации сети -// на клиенте или на сервере - в зависимости -// от контекста вызова -// -&НаСервереБезКонтекста -Функция ПутьКФайлуКонфигурацииСети() - - КаталогКонфФайловВерсии = КаталогПрограммы() + "conf\"; - ПутьККонфФайлуСетиВерсии = КаталогКонфФайловВерсии + "inetcfg.xml"; - - Результат = КаталогКонфФайловВерсии; - - // 1. Проверить, существует ли файл inetcfg.xml в каталоге "...\bin\conf\", - // т.к. этот файл имеет больший приоритет, чем файл в каталоге общих - // настроечных файлов версий платформы. - ОписательКонфФайла = Новый Файл(ПутьККонфФайлуСетиВерсии); - Если ОписательКонфФайла.Существует() Тогда - Возврат Результат; - КонецЕсли; - - // 2. Определить из конфигурационного файла платформы путь к каталогу общих - // конфигурационных файлов версий платформы. - - ПутьККонфФайлуВерсии = КаталогКонфФайловВерсии + "conf.cfg"; - ОписательКонфФайла = Новый Файл(ПутьККонфФайлуВерсии); - Если НЕ ОписательКонфФайла.Существует() Тогда - Возврат Результат; - КонецЕсли; - - // 3. Разбор содержимого файла "conf.cfg" для определения - // пути конфигурационного файла "inetcfg.xml" - ПутьККаталогуКонфФайлов = ""; - Попытка - - ЧтениеФайла = Новый ЧтениеТекста(ПутьККонфФайлуВерсии); - ПрочитаннаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - Пока ПрочитаннаяСтрока <> Неопределено Цикл - СтрокаКонфигурации = СокрЛП(ПрочитаннаяСтрока); - Если Найти(ВРег(СтрокаКонфигурации), "CONFLOCATION") = 1 Тогда - ПраваяЧастьСтрокиКонфигурации = СокрЛП(Сред(СтрокаКонфигурации, 13)); - Если Лев(ПраваяЧастьСтрокиКонфигурации, 1) = "=" Тогда - ПутьККаталогуКонфФайлов = СокрЛП(Сред(ПраваяЧастьСтрокиКонфигурации, 2)); - КонецЕсли; - КонецЕсли; - Если НЕ ПустаяСтрока(ПутьККаталогуКонфФайлов) Тогда - Прервать; - КонецЕсли; - ПрочитаннаяСтрока = ЧтениеФайла.ПрочитатьСтроку(); - КонецЦикла; - ЧтениеФайла.Закрыть(); - - Исключение - Возврат Результат; - КонецПопытки; - - Если ПустаяСтрока(ПутьККаталогуКонфФайлов) Тогда - Возврат Результат; - КонецЕсли; - - ПравыйСимвол = Прав(ПутьККаталогуКонфФайлов, 1); - Если ПравыйСимвол <> "\" И ПравыйСимвол <> "/" Тогда - ПутьККаталогуКонфФайлов = ПутьККаталогуКонфФайлов + "\"; - КонецЕсли; - - ОписательКаталогаОбщихКонфФайлов = Новый Файл(ПутьККаталогуКонфФайлов); - Если ОписательКаталогаОбщихКонфФайлов.Существует() - И ОписательКаталогаОбщихКонфФайлов.ЭтоКаталог() Тогда - Результат = ПутьККаталогуКонфФайлов + "inetcfg.xml"; - КонецЕсли; - - Возврат Результат; - -КонецФункции - diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Form.form similarity index 68% rename from SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form rename to SSL/src/CommonForms/ПерсональныеНастройкиЭП/Form.form index ea38b1f5c..c233adb20 100644 --- a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Form.form +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Form.form @@ -1,7 +1,7 @@ - ДействияПриСохраненииСЭЦП + ДействияПриСохраненииСЭП 3 true true @@ -9,11 +9,11 @@ true - ДействияПриСохраненииСЭЦП + ДействияПриСохраненииСЭП Left - ДействияПриСохраненииСЭЦПРасширеннаяПодсказка + ДействияПриСохраненииСЭПРасширеннаяПодсказка 18 Label true @@ -23,7 +23,7 @@ - ДействияПриСохраненииСЭЦПКонтекстноеМеню + ДействияПриСохраненииСЭПКонтекстноеМеню 4 true @@ -35,12 +35,12 @@ - Enum.ДействияПриСохраненииСЭЦП.EnumValue.Спрашивать + Enum.ДействияПриСохраненииСЭП.EnumValue.Спрашивать - Enum.ДействияПриСохраненииСЭЦП.EnumValue.СохранятьВсеПодписи + Enum.ДействияПриСохраненииСЭП.EnumValue.СохранятьВсеПодписи Vertical @@ -58,8 +58,8 @@ РасширениеДляЗашифрованныхФайлов - РасширениеДляЗашифрованныхФайловРасширеннаяПодсказка - 20 + РасширениеДляЗашифрованныхФайловExtendedTooltip + 19 Label true true @@ -99,8 +99,8 @@ РасширениеДляФайловПодписи - РасширениеДляФайловПодписиРасширеннаяПодсказка - 22 + РасширениеДляФайловПодписиExtendedTooltip + 20 Label true true @@ -140,8 +140,8 @@ ЛичныйСертификатДляШифрования - ЛичныйСертификатДляШифрованияРасширеннаяПодсказка - 24 + ЛичныйСертификатДляШифрованияExtendedTooltip + 21 Label true true @@ -202,8 +202,8 @@ Путь модуля криптографии для веб клиента под управлением Linux. - ПутьМодуляКриптографииРасширеннаяПодсказка - 27 + ПутьМодуляКриптографииExtendedTooltip + 23 Label true true @@ -245,8 +245,149 @@ Параметры веб клиента под управлением linux - ПараметрыВебКлиентаПодУправлениемLinuxРасширеннаяПодсказка - 26 + ПараметрыВебКлиентаПодУправлениемLinuxExtendedTooltip + 22 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + + СмТакже + 31 + + ГруппаОбщаяФормаНастройкиЭП + 38 + + ОбщаяФормаНастройкиЭП + 33 + true + true + + true + + + ОбщаяФормаНастройкиЭПРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОбщаяФормаНастройкиКриптографии + Normal + Auto + true + true + UserCmds + Auto + + + ПояснениеОбщаяФормаНастройкиЭП + 35 + + <key>ru</key> + <value>Настройка параметров для использования средств криптографии: электронной подписи и шифрования.</value> + + true + true + + true + + + ПояснениеОбщаяФормаНастройкиЭПРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + ПояснениеОбщаяФормаНастройкиЭПКонтекстноеМеню + 36 + true + + Label + 43 + true + true + + Style.ПоясняющийТекст + + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value> </value> + + + ru + + + + ГруппаОбщаяФормаНастройкиЭПРасширеннаяПодсказка + 39 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>См. также</value> + + + ru + + + true + + СмТакжеРасширеннаяПодсказка + 32 Label true true @@ -280,7 +421,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 16 Label true @@ -306,7 +447,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 17 Label true @@ -350,14 +491,14 @@ auto true - ДействияПриСохраненииСЭЦП + ДействияПриСохраненииСЭП <key>ru</key> <value>Действия при сохранении с ЭП</value> 1 - EnumRef.ДействияПриСохраненииСЭЦП + EnumRef.ДействияПриСохраненииСЭП true @@ -459,6 +600,24 @@ ShowError + + ТекстОшибки + + <key>ru</key> + <value>Текст ошибки</value> + + 7 + + String + + + + true + + + true + + ОК @@ -481,6 +640,28 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ОбщаяФормаНастройкиКриптографии</name> + <title> + <key>ru</key> + <value>Настройки криптографии</value> + + 3 + + ru + Общая форма настройки криптографии + + + true + + + + ОбщаяФормаНастройкиКриптографии + + + Auto + Auto + diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Help/ru.html similarity index 92% rename from SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html rename to SSL/src/CommonForms/ПерсональныеНастройкиЭП/Help/ru.html index cde5f2d32..984fdc498 100644 --- a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Help/ru.html +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Help/ru.html @@ -1,4 +1,4 @@ - +

            В форме выполняются персональные настройки электронной подписи (ЭП).

          Настройка
          @@ -13,4 +13,4 @@

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

          Настройка

           

          См. также:

          -

          Настройка ЭП и шифрования

          \ No newline at end of file +

          Настройка ЭП и шифрования

          \ No newline at end of file diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Module.bsl b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Module.bsl new file mode 100644 index 000000000..b82157964 --- /dev/null +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/Module.bsl @@ -0,0 +1,152 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + ТекстОшибки = НСтр("ru = 'Отсутствует право сохранения данных. Обратитесь к администратору.'"); // Отказ устанавливается в ПриОткрытии. + Возврат; + КонецЕсли; + + РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); + + ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки(); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПерсональныеНастройки); + + // Настройки видимости при запуске + Элементы.ПараметрыВебКлиентаПодУправлениемLinux.Видимость = РежимРаботы.ЭтоВебКлиент И РежимРаботы.ЭтоLinuxКлиент; + Элементы.ГруппаОбщаяФормаНастройкиЭП.Видимость = РежимРаботы.ЭтоАдминистраторПрограммы; + + Если НЕ Параметры.Свойство("ПоказыватьНастройкиШифрования") Тогда + Элементы.ЛичныйСертификатДляШифрования.Видимость = Ложь; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если ЗначениеЗаполнено(ТекстОшибки) Тогда + Отказ = Истина; + ПоказатьПредупреждение(, ТекстОшибки); + Возврат; + КонецЕсли; + + Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные + Если Сертификат = Неопределено Тогда + ОтпечатокЛичногоСертификатаДляШифрования = ""; + Иначе + СтруктураСертификата = ЭлектроннаяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования); + ЛичныйСертификатДляШифрования = СтруктураСертификата.КомуВыдан; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) + + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ВыборСертификата") Тогда + + Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + ОтпечатокЛичногоСертификатаДляШифрования = ВыбранноеЗначение.Отпечаток; + СтруктураСертификата = ЭлектроннаяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования); + ЛичныйСертификатДляШифрования = СтруктураСертификата.КомуВыдан; + + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура ЛичныйСертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ПодключитьРасширениеРаботыСКриптографией() Тогда + ВыбратьСертификатПослеУстановкиРасширения(Истина, Неопределено); + Иначе + Обработчик = Новый ОписаниеОповещения("ВыбратьСертификатПослеУстановкиРасширения", ЭтотОбъект); + ТекстВопроса = НСтр("ru = 'Для выбора сертификата необходимо установить расширение работы с криптографией.'"); + ЭлектроннаяПодписьКлиент.УстановитьРасширение(Обработчик, ТекстВопроса); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЛичныйСертификатОткрытие(Элемент, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда + ЭлектроннаяПодписьКлиент.ОткрытьСертификат(ОтпечатокЛичногоСертификатаДляШифрования); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЛичныйСертификатОчистка(Элемент, СтандартнаяОбработка) + ОтпечатокЛичногоСертификатаДляШифрования = ""; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ОК(Команда) + + ОчиститьСообщения(); + + Если НЕ СохранитьНастройки() Тогда + Возврат; + КонецЕсли; + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбщаяФормаНастройкиКриптографии(Команда) + ОткрытьФорму("ОбщаяФорма.НастройкиКриптографии", , ЭтотОбъект); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция СохранитьНастройки() + + Если Не ПроверитьЗаполнение() Тогда + Возврат Ложь; + КонецЕсли; + + ПерсональныеНастройки = ЭлектроннаяПодпись.ПерсональныеНастройки(Истина); + ЗаполнитьЗначенияСвойств(ПерсональныеНастройки, ЭтаФорма); + ЭлектроннаяПодпись.СохранитьПерсональныеНастройки(ПерсональныеНастройки); + + Возврат Истина; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Служебные обработчики асинхронных диалогов + +&НаКлиенте +Процедура ВыбратьСертификатПослеУстановкиРасширения(РасширениеУстановлено, ДополнительныеПараметры) Экспорт + Если РасширениеУстановлено = Истина Тогда + МассивСтруктурЛичныхСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурЛичныхСертификатов); + ОткрытьФорму("ОбщаяФорма.ПерсональныеСертификатыДляШифрования", ПараметрыФормы, ЭтотОбъект); + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/ПерсональныеНастройкиЭП.mdo similarity index 88% rename from SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo rename to SSL/src/CommonForms/ПерсональныеНастройкиЭП/ПерсональныеНастройкиЭП.mdo index 1ce384580..9c5ed557d 100644 --- a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/ПерсональныеНастройкиЭЦП.mdo +++ b/SSL/src/CommonForms/ПерсональныеНастройкиЭП/ПерсональныеНастройкиЭП.mdo @@ -1,6 +1,6 @@ - ПерсональныеНастройкиЭЦП + ПерсональныеНастройкиЭП ru Персональные настройки ЭП diff --git a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl b/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl deleted file mode 100644 index 9725fdc78..000000000 --- a/SSL/src/CommonForms/ПерсональныеНастройкиЭЦП/Module.bsl +++ /dev/null @@ -1,171 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - ДействияПриСохраненииСЭЦП = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ДействияПриСохраненииСЭЦП"); - Если НЕ ЗначениеЗаполнено(ДействияПриСохраненииСЭЦП) Тогда - ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать; - КонецЕсли; - - РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); - Если НЕ ЗначениеЗаполнено(РасширениеДляЗашифрованныхФайлов) Тогда - РасширениеДляЗашифрованныхФайлов = "p7m"; - КонецЕсли; - - РасширениеДляФайловПодписи = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляФайловПодписи"); - Если НЕ ЗначениеЗаполнено(РасширениеДляФайловПодписи) Тогда - РасширениеДляФайловПодписи = "p7s"; - КонецЕсли; - - ПутьМодуляКриптографии = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ПутьМодуляКриптографии"); - - Элементы.ПараметрыВебКлиентаПодУправлениемLinux.Видимость = ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() И ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент(); - - ОтпечатокЛичногоСертификатаДляШифрования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ОтпечатокЛичногоСертификатаДляШифрования"); - - Если НЕ Параметры.Свойство("ПоказыватьНастройкиШифрования") Тогда - Элементы.ЛичныйСертификатДляШифрования.Видимость = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные - Если Сертификат = Неопределено Тогда - ОтпечатокЛичногоСертификатаДляШифрования = ""; - Иначе - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования); - ЛичныйСертификатДляШифрования = СтруктураСертификата.КомуВыдан; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ВыборСертификата") Тогда - - Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - ОтпечатокЛичногоСертификатаДляШифрования = ВыбранноеЗначение.Отпечаток; - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования); - ЛичныйСертификатДляШифрования = СтруктураСертификата.КомуВыдан; - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаКлиенте -Процедура ЛичныйСертификатНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - Предупреждение( - НСтр("ru='Для выбора сертификата необходимо - |установить расширение работы с криптографией.'")); - Возврат; - КонецЕсли; - - СтандартнаяОбработка = Ложь; - - МассивСтруктурЛичныхСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурЛичныхСертификатов); - ОткрытьФорму("ОбщаяФорма.ВыборСертификата", ПараметрыФормы, ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ЛичныйСертификатОткрытие(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьСертификат(ОтпечатокЛичногоСертификатаДляШифрования); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЛичныйСертификатОчистка(Элемент, СтандартнаяОбработка) - ОтпечатокЛичногоСертификатаДляШифрования = ""; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ОК(Команда) - - ОчиститьСообщения(); - - Если НЕ СохранитьНастройки() Тогда - Возврат; - КонецЕсли; - - Закрыть(); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Функция СохранитьНастройки() - - Если Не ПроверитьЗаполнение() Тогда - Возврат Ложь; - КонецЕсли; - - МассивСтруктур = Новый Массив; - - Элемент = Новый Структура; - Элемент.Вставить("Объект", "ЭЦП"); - Элемент.Вставить("Настройка", "ДействияПриСохраненииСЭЦП"); - Элемент.Вставить("Значение", ДействияПриСохраненииСЭЦП); - МассивСтруктур.Добавить(Элемент); - - Элемент = Новый Структура; - Элемент.Вставить("Объект", "ЭЦП"); - Элемент.Вставить("Настройка", "ПутьМодуляКриптографии"); - Элемент.Вставить("Значение", ПутьМодуляКриптографии); - МассивСтруктур.Добавить(Элемент); - - Элемент = Новый Структура; - Элемент.Вставить("Объект", "ЭЦП"); - Элемент.Вставить("Настройка", "РасширениеДляЗашифрованныхФайлов"); - Элемент.Вставить("Значение", РасширениеДляЗашифрованныхФайлов); - МассивСтруктур.Добавить(Элемент); - - Элемент = Новый Структура; - Элемент.Вставить("Объект", "ЭЦП"); - Элемент.Вставить("Настройка", "ОтпечатокЛичногоСертификатаДляШифрования"); - Элемент.Вставить("Значение", ОтпечатокЛичногоСертификатаДляШифрования); - МассивСтруктур.Добавить(Элемент); - - Элемент = Новый Структура; - Элемент.Вставить("Объект", "ЭЦП"); - Элемент.Вставить("Настройка", "РасширениеДляФайловПодписи"); - Элемент.Вставить("Значение", РасширениеДляФайловПодписи); - МассивСтруктур.Добавить(Элемент); - - ОбщегоНазначения.ХранилищеОбщихНастроекСохранитьМассив(МассивСтруктур); - - Возврат Истина; - -КонецФункции diff --git a/SSL/src/CommonForms/ВыборСертификата/Form.form b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Form.form similarity index 82% rename from SSL/src/CommonForms/ВыборСертификата/Form.form rename to SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Form.form index 1f432852f..58cd61e60 100644 --- a/SSL/src/CommonForms/ВыборСертификата/Form.form +++ b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Form.form @@ -1,7 +1,7 @@ - СертификатыЭЦП + СертификатыЭП 3 true true @@ -9,14 +9,14 @@ true - СертификатыЭЦП + СертификатыЭП None Change Copy CopyToClipboard - СертификатыЭЦПКомуВыдан + СертификатыЭПКомуВыдан 6 true true @@ -24,11 +24,11 @@ true - СертификатыЭЦП.КомуВыдан + СертификатыЭП.КомуВыдан - СертификатыЭЦПКомуВыданРасширеннаяПодсказка - 41 + СертификатыЭПКомуВыданРасширеннаяПодсказка + 32 Label true true @@ -37,7 +37,7 @@ - СертификатыЭЦПКомуВыданКонтекстноеМеню + СертификатыЭПКомуВыданКонтекстноеМеню 7 true @@ -58,7 +58,7 @@ - СертификатыЭЦПКемВыдан + СертификатыЭПКемВыдан 8 true true @@ -66,11 +66,11 @@ true - СертификатыЭЦП.КемВыдан + СертификатыЭП.КемВыдан - СертификатыЭЦПКемВыданРасширеннаяПодсказка - 43 + СертификатыЭПКемВыданРасширеннаяПодсказка + 33 Label true true @@ -79,7 +79,7 @@ - СертификатыЭЦПКемВыданКонтекстноеМеню + СертификатыЭПКемВыданКонтекстноеМеню 9 true @@ -100,7 +100,7 @@ - СертификатыЭЦПДействителенДо + СертификатыЭПДействителенДо 10 true true @@ -108,11 +108,11 @@ true - СертификатыЭЦП.ДействителенДо + СертификатыЭП.ДействителенДо - СертификатыЭЦПДействителенДоРасширеннаяПодсказка - 45 + СертификатыЭПДействителенДоРасширеннаяПодсказка + 34 Label true true @@ -121,7 +121,7 @@ - СертификатыЭЦПДействителенДоКонтекстноеМеню + СертификатыЭПДействителенДоКонтекстноеМеню 11 true @@ -142,7 +142,7 @@ - СертификатыЭЦПНазначение + СертификатыЭПНазначение 12 true true @@ -150,11 +150,11 @@ true - СертификатыЭЦП.Назначение + СертификатыЭП.Назначение - СертификатыЭЦПНазначениеРасширеннаяПодсказка - 47 + СертификатыЭПНазначениеРасширеннаяПодсказка + 35 Label true true @@ -163,7 +163,7 @@ - СертификатыЭЦПНазначениеКонтекстноеМеню + СертификатыЭПНазначениеКонтекстноеМеню 13 true @@ -185,25 +185,25 @@ None - СертификатыЭЦПКоманднаяПанель + СертификатыЭПКоманднаяПанель 5 Left true ValueChoice - СертификатыЭЦПВыборЗначения + СертификатыЭПВыборЗначения Selection - СертификатыЭЦПВыбор + СертификатыЭПВыбор - СертификатыЭЦПСтрокаПоиска - 32 + СертификатыЭПСтрокаПоиска + 36 - СертификатыЭЦПСтрокаПоискаРасширеннаяПодсказка - 34 + СертификатыЭПСтрокаПоискаРасширеннаяПодсказка + 38 Label true true @@ -212,21 +212,21 @@ - СертификатыЭЦПСтрокаПоискаКонтекстноеМеню - 33 + СертификатыЭПСтрокаПоискаКонтекстноеМеню + 37 true - СертификатыЭЦП + СертификатыЭП true - СертификатыЭЦПСостояниеПросмотра - 35 + СертификатыЭПСостояниеПросмотра + 39 - СертификатыЭЦПСостояниеПросмотраРасширеннаяПодсказка - 37 + СертификатыЭПСостояниеПросмотраРасширеннаяПодсказка + 41 Label true true @@ -235,22 +235,22 @@ - СертификатыЭЦПСостояниеПросмотраКонтекстноеМеню - 36 + СертификатыЭПСостояниеПросмотраКонтекстноеМеню + 40 true ViewStatusAddition - СертификатыЭЦП + СертификатыЭП true - СертификатыЭЦПУправлениеПоиском - 38 + СертификатыЭПУправлениеПоиском + 42 - СертификатыЭЦПУправлениеПоискомРасширеннаяПодсказка - 40 + СертификатыЭПУправлениеПоискомРасширеннаяПодсказка + 44 Label true true @@ -259,18 +259,18 @@ - СертификатыЭЦПУправлениеПоискомКонтекстноеМеню - 39 + СертификатыЭПУправлениеПоискомКонтекстноеМеню + 43 true SearchControlAddition - СертификатыЭЦП + СертификатыЭП true - СертификатыЭЦПРасширеннаяПодсказка + СертификатыЭПРасширеннаяПодсказка 31 Label true @@ -280,7 +280,7 @@ - СертификатыЭЦПКонтекстноеМеню + СертификатыЭПКонтекстноеМеню 4 ОткрытьСертификат @@ -291,7 +291,7 @@ true - ОткрытьСертификатРасширеннаяПодсказка + ОткрытьСертификатExtendedTooltip 30 Label true @@ -349,7 +349,7 @@ true - ФормаВыбратьРасширеннаяПодсказка + ФормаВыбратьExtendedTooltip 25 Label true @@ -358,7 +358,7 @@ Left - Form.Item.СертификатыЭЦП.StandardCommand.Choose + Form.Item.СертификатыЭП.StandardCommand.Choose Auto true true @@ -375,7 +375,7 @@ true - ФормаОткрытьСертификатРасширеннаяПодсказка + ФормаОткрытьСертификатExtendedTooltip 26 Label true @@ -401,7 +401,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 27 Label true @@ -410,7 +410,7 @@ Left - Form.Item.СертификатыЭЦП.StandardCommand.Find + Form.Item.СертификатыЭП.StandardCommand.Find Normal Auto true @@ -428,7 +428,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 28 Label true @@ -437,7 +437,7 @@ Left - Form.Item.СертификатыЭЦП.StandardCommand.CancelSearch + Form.Item.СертификатыЭП.StandardCommand.CancelSearch Normal Auto true @@ -455,7 +455,7 @@ true - ФормаВывестиСписокРасширеннаяПодсказка + ФормаВывестиСписокExtendedTooltip 29 Label true @@ -464,7 +464,7 @@ Left - Form.Item.СертификатыЭЦП.StandardCommand.OutputList + Form.Item.СертификатыЭП.StandardCommand.OutputList Normal Auto true @@ -490,7 +490,7 @@ auto true - СертификатыЭЦП + СертификатыЭП <key>ru</key> <value>Сертификаты ЭП</value> diff --git a/SSL/src/CommonForms/ВыборСертификата/Help/ru.html b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Help/ru.html similarity index 62% rename from SSL/src/CommonForms/ВыборСертификата/Help/ru.html rename to SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Help/ru.html index 4889d51d3..73dc42651 100644 --- a/SSL/src/CommonForms/ВыборСертификата/Help/ru.html +++ b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>В этой форме осуществляется выбор персонального сертификата электронной подписи (ЭП) для шифрования данных.</p> <p>Персональный сертификат будет отмечен при выборе сертификатов для шифрования.</p> -<p>См. также: <a href="CommonForm.НастройкиЭЦП/Help">Настройка ЭП и шифрования</a>, <a href="../idn0">Настройка программы</a>, <a href="v8help://frame/form_common">Общая информация о формах</a>.</p></body></html> \ No newline at end of file +<p>См. также: <a href="CommonForm.НастройкиКриптографии/Help">Настройка ЭП и шифрования</a>, <a href="../idn0">Настройка программы</a>, <a href="v8help://frame/form_common">Общая информация о формах</a>.</p></body></html> \ No newline at end of file diff --git a/SSL/src/CommonForms/ВыборСертификата/Module.bsl b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Module.bsl similarity index 67% rename from SSL/src/CommonForms/ВыборСертификата/Module.bsl rename to SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Module.bsl index c6380fbba..270ac0df8 100644 --- a/SSL/src/CommonForms/ВыборСертификата/Module.bsl +++ b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/Module.bsl @@ -10,24 +10,24 @@ МассивСтруктурСертификатов = Параметры.МассивСтруктурСертификатов; Для Каждого СтруктураСертификата Из МассивСтруктурСертификатов Цикл - НоваяСтрока = СертификатыЭЦП.Добавить(); + НоваяСтрока = СертификатыЭП.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураСертификата, "КомуВыдан, КемВыдан, ДействителенДо, Отпечаток"); - ЭлектроннаяЦифроваяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); + ЭлектроннаяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СертификатыЭЦП +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СертификатыЭП &НаКлиенте -Процедура СертификатыЭЦПВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) +Процедура СертификатыЭПВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ВыбратьИЗакрыть(); КонецПроцедуры &НаКлиенте -Процедура СертификатыЭЦПВыборЗначения(Элемент, Значение, СтандартнаяОбработка) +Процедура СертификатыЭПВыборЗначения(Элемент, Значение, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ВыбратьИЗакрыть(); КонецПроцедуры @@ -38,17 +38,17 @@ &НаКлиенте Процедура ОткрытьСертификат(Команда) - ТекущиеДанные = Элементы.СертификатыЭЦП.ТекущиеДанные; + ТекущиеДанные = Элементы.СертификатыЭП.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; - ВыбранныйСертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); + ВыбранныйСертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ТекущиеДанные.Отпечаток); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); Если СтруктураСертификата <> Неопределено Тогда ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, ТекущиеДанные.Отпечаток); - ОткрытьФорму("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.СертификатЭП", ПараметрыФормы, ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -59,13 +59,18 @@ &НаКлиенте Процедура ВыбратьИЗакрыть() - ТекущиеДанные = Элементы.СертификатыЭЦП.ТекущиеДанные; + ТекущиеДанные = Элементы.СертификатыЭП.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда Возврат; КонецЕсли; РезультатВыбора = Новый Структура("Отпечаток", ТекущиеДанные.Отпечаток); + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( + "ЭЦП", + "ОтпечатокЛичногоСертификатаДляШифрования", + РезультатВыбора.Отпечаток); + ОповеститьОВыборе(РезультатВыбора); КонецПроцедуры diff --git a/SSL/src/CommonForms/ВыборСертификата/ВыборСертификата.mdo b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/ПерсональныеСертификатыДляШифрования.mdo similarity index 70% rename from SSL/src/CommonForms/ВыборСертификата/ВыборСертификата.mdo rename to SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/ПерсональныеСертификатыДляШифрования.mdo index 710f92b0d..f994fb909 100644 --- a/SSL/src/CommonForms/ВыборСертификата/ВыборСертификата.mdo +++ b/SSL/src/CommonForms/ПерсональныеСертификатыДляШифрования/ПерсональныеСертификатыДляШифрования.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="7e089889-cf8d-4f5f-879c-0a1bcca1c19b"> - <name>ВыборСертификата</name> + <name>ПерсональныеСертификатыДляШифрования</name> <synonym> <key>ru</key> - <value>Выбор персонального сертификата для шифрования</value> + <value>Персональные сертификаты для шифрования</value> </synonym> <help> <pages> diff --git a/SSL/src/CommonForms/ПечатьДокументов/Form.form b/SSL/src/CommonForms/ПечатьДокументов/Form.form index 9f23d05ce..92ffca574 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Form.form +++ b/SSL/src/CommonForms/ПечатьДокументов/Form.form @@ -16,7 +16,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КнопкаПечатьКоманднаяПанельРасширеннаяПодсказка</name> + <name>КнопкаПечатьКоманднаяПанельExtendedTooltip</name> <id>145</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -45,7 +45,7 @@ <width>10</width> <horizontalStretch>false</horizontalStretch> <extendedTooltip> - <name>КоманднаяПанельЛеваяЧастьРасширеннаяПодсказка</name> + <name>КоманднаяПанельЛеваяЧастьExtendedTooltip</name> <id>144</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -79,7 +79,7 @@ <name>КопийПриИзменении</name> </handlers> <extendedTooltip> - <name>КопийРасширеннаяПодсказка</name> + <name>КопийExtendedTooltip</name> <id>146</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -128,8 +128,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КнопкаПечатьВсеДействияРасширеннаяПодсказка</name> - <id>149</id> + <name>КнопкаПечатьВсеДействияExtendedTooltip</name> + <id>148</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -155,8 +155,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаПоказатьСкрытьНастройкуКомплектаРасширеннаяПодсказка</name> - <id>150</id> + <name>КнопкаПоказатьСкрытьНастройкуКомплектаExtendedTooltip</name> + <id>149</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -184,8 +184,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаУстановитьФлажкиПодменюРасширеннаяПодсказка</name> - <id>152</id> + <name>КнопкаУстановитьФлажкиПодменюExtendedTooltip</name> + <id>151</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -210,8 +210,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаСнятьФлажкиПодменюРасширеннаяПодсказка</name> - <id>153</id> + <name>КнопкаСнятьФлажкиПодменюExtendedTooltip</name> + <id>152</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -236,8 +236,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаПереместитьВверхПодменюРасширеннаяПодсказка</name> - <id>154</id> + <name>КнопкаПереместитьВверхПодменюExtendedTooltip</name> + <id>153</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -262,8 +262,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаПереместитьВнизПодменюРасширеннаяПодсказка</name> - <id>155</id> + <name>КнопкаПереместитьВнизПодменюExtendedTooltip</name> + <id>154</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -288,8 +288,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КнопкаСброситьНастройкиПодменюРасширеннаяПодсказка</name> - <id>156</id> + <name>КнопкаСброситьНастройкиПодменюExtendedTooltip</name> + <id>155</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -315,8 +315,8 @@ <value>Настройка комплекта</value> - ГруппаНастройкаКомплектаПодменюРасширеннаяПодсказка - 151 + ГруппаНастройкаКомплектаПодменюExtendedTooltip + 150 Label true true @@ -345,8 +345,8 @@ true - КнопкаРедактированиеРасширеннаяПодсказка - 158 + КнопкаРедактированиеExtendedTooltip + 157 Label true true @@ -376,8 +376,8 @@ Группа редактирование печатной формы - ГруппаРедактированиеПечатнойФормыРасширеннаяПодсказка - 157 + ГруппаРедактированиеПечатнойФормыExtendedTooltip + 156 Label true true @@ -399,8 +399,8 @@ true - КнопкаСохранитьРасширеннаяПодсказка - 160 + КнопкаСохранитьExtendedTooltip + 159 Label true true @@ -425,8 +425,8 @@ true - КнопкаОтправитьРасширеннаяПодсказка - 161 + КнопкаОтправитьExtendedTooltip + 160 Label true true @@ -452,8 +452,8 @@ Группа сохранить отправить - ГруппаСохранитьОтправитьРасширеннаяПодсказка - 159 + ГруппаСохранитьОтправитьExtendedTooltip + 158 Label true true @@ -476,8 +476,8 @@ false - КнопкаПерейтиКДокументуРасширеннаяПодсказка - 163 + КнопкаПерейтиКДокументуExtendedTooltip + 162 Label true true @@ -507,8 +507,8 @@ Группа навигация - ГруппаНавигацияРасширеннаяПодсказка - 162 + ГруппаНавигацияExtendedTooltip + 161 Label true true @@ -530,8 +530,8 @@ true - КнопкаИзменитьМакетРасширеннаяПодсказка - 165 + КнопкаИзменитьМакетExtendedTooltip + 164 Label true true @@ -557,8 +557,8 @@ false - КнопкаПерейтиКУправлениюМакетамиРасширеннаяПодсказка - 166 + КнопкаПерейтиКУправлениюМакетамиExtendedTooltip + 165 Label true true @@ -589,8 +589,8 @@ Группа редактирование макета - ГруппаРедактированиеМакетаРасширеннаяПодсказка - 164 + ГруппаРедактированиеМакетаExtendedTooltip + 163 Label true true @@ -610,8 +610,8 @@ Командная панель правая часть - КоманднаяПанельПраваяЧастьРасширеннаяПодсказка - 148 + КоманднаяПанельПраваяЧастьExtendedTooltip + 147 Label true true @@ -635,7 +635,7 @@ Группа командная панель - ГруппаКоманднаяПанельРасширеннаяПодсказка + ГруппаКоманднаяПанельExtendedTooltip 143 Label true @@ -668,9 +668,11 @@ НастройкиПечатныхФорм None + Add CancelSearch Change Copy + Delete EndEdit Find OutputList @@ -694,8 +696,8 @@ НастройкиПечатныхФормПечататьПриИзменении - НастройкиПечатныхФормПечататьРасширеннаяПодсказка - 185 + НастройкиПечатныхФормПечататьExtendedTooltip + 175 Label true true @@ -730,8 +732,8 @@ НастройкиПечатныхФорм.Представление - НастройкиПечатныхФормПредставлениеРасширеннаяПодсказка - 187 + НастройкиПечатныхФормПредставлениеExtendedTooltip + 176 Label true true @@ -776,8 +778,8 @@ НастройкиПечатныхФормКоличествоПриИзменении - НастройкиПечатныхФормКоличествоРасширеннаяПодсказка - 189 + НастройкиПечатныхФормКоличествоExtendedTooltip + 177 Label true true @@ -819,6 +821,10 @@ 88 Left + + BeforeAddRow + НастройкиПечатныхФормПередНачаломДобавления + OnActivateRow НастройкиПечатныхФормПриАктивизацииСтроки @@ -829,10 +835,10 @@ НастройкиПечатныхФормСтрокаПоиска - 176 + 186 НастройкиПечатныхФормСтрокаПоискаРасширеннаяПодсказка - 178 + 188 Label true true @@ -842,7 +848,7 @@ НастройкиПечатныхФормСтрокаПоискаКонтекстноеМеню - 177 + 187 true НастройкиПечатныхФорм @@ -852,10 +858,10 @@ НастройкиПечатныхФормСостояниеПросмотра - 179 + 189 НастройкиПечатныхФормСостояниеПросмотраРасширеннаяПодсказка - 181 + 191 Label true true @@ -865,7 +871,7 @@ НастройкиПечатныхФормСостояниеПросмотраКонтекстноеМеню - 180 + 190 true ViewStatusAddition @@ -876,10 +882,10 @@ НастройкиПечатныхФормУправлениеПоиском - 182 + 192 НастройкиПечатныхФормУправлениеПоискомРасширеннаяПодсказка - 184 + 194 Label true true @@ -889,7 +895,7 @@ НастройкиПечатныхФормУправлениеПоискомКонтекстноеМеню - 183 + 193 true SearchControlAddition @@ -899,8 +905,8 @@ - НастройкиПечатныхФормРасширеннаяПодсказка - 175 + НастройкиПечатныхФормExtendedTooltip + 174 Label true true @@ -923,8 +929,8 @@ true - КнопкаУстановитьФлажкиКонтекстноеМенюРасширеннаяПодсказка - 169 + КнопкаУстановитьФлажкиКонтекстноеМенюExtendedTooltip + 168 Label true true @@ -949,8 +955,8 @@ true - КнопкаСнятьФлажкиКонтекстноеМенюРасширеннаяПодсказка - 170 + КнопкаСнятьФлажкиКонтекстноеМенюExtendedTooltip + 169 Label true true @@ -975,8 +981,8 @@ true - КнопкаПереместитьВверхКонтекстноеМенюРасширеннаяПодсказка - 171 + КнопкаПереместитьВверхКонтекстноеМенюExtendedTooltip + 170 Label true true @@ -1001,8 +1007,8 @@ true - КнопкаПереместитьВнизКонтекстноеМенюРасширеннаяПодсказка - 172 + КнопкаПереместитьВнизКонтекстноеМенюExtendedTooltip + 171 Label true true @@ -1027,8 +1033,8 @@ true - КнопкаСброситьНастройкиКонтекстноеМенюРасширеннаяПодсказка - 173 + КнопкаСброситьНастройкиКонтекстноеМенюExtendedTooltip + 172 Label true true @@ -1058,8 +1064,8 @@ Группа настройка комплекта контекстное меню - ГруппаНастройкаКомплектаКонтекстноеМенюРасширеннаяПодсказка - 168 + ГруппаНастройкаКомплектаКонтекстноеМенюExtendedTooltip + 167 Label true true @@ -1078,8 +1084,8 @@ true - НастройкиПечатныхФормКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 174 + НастройкиПечатныхФормКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 173 Label true true @@ -1142,8 +1148,8 @@ None - ПечатнаяФормаОбразецРасширеннаяПодсказка - 201 + ПечатнаяФормаОбразецExtendedTooltip + 180 Label true true @@ -1184,8 +1190,8 @@ true - СтраницаПечатнаяФормаОбразецРасширеннаяПодсказка - 200 + СтраницаПечатнаяФормаОбразецExtendedTooltip + 179 Label true true @@ -1221,8 +1227,8 @@ true - КартинкаПечатнаяФормаНедоступнаРасширеннаяПодсказка - 205 + КартинкаПечатнаяФормаНедоступнаExtendedTooltip + 183 Label true true @@ -1259,8 +1265,8 @@ true - НадписьПечатнаяФормаНедоступнаРасширеннаяПодсказка - 206 + НадписьПечатнаяФормаНедоступнаExtendedTooltip + 184 Label true true @@ -1293,8 +1299,8 @@ true true - ГруппаПечатнаяФормаНедоступнаРасширеннаяПодсказка - 204 + ГруппаПечатнаяФормаНедоступнаExtendedTooltip + 182 Label true true @@ -1324,8 +1330,8 @@ true true - СтраницаПечатнаяФормаНедоступнаРасширеннаяПодсказка - 203 + СтраницаПечатнаяФормаНедоступнаExtendedTooltip + 181 Label true true @@ -1348,8 +1354,8 @@ true true - СтраницыРасширеннаяПодсказка - 199 + СтраницыExtendedTooltip + 178 Label true true @@ -1372,8 +1378,8 @@ Группа печатные формы - ГруппаПечатныеФормыРасширеннаяПодсказка - 167 + ГруппаПечатныеФормыExtendedTooltip + 166 Label true true @@ -1514,7 +1520,8 @@ Number - 10 + 3 + true @@ -1782,6 +1789,7 @@ Number 3 + true diff --git a/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html new file mode 100644 index 000000000..a71da645c --- /dev/null +++ b/SSL/src/CommonForms/ПечатьДокументов/Help/ru.html @@ -0,0 +1,4 @@ + +

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

          +

           

          +

           

          \ No newline at end of file diff --git a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl index ac9b39d5c..5c6595ec6 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/Module.bsl +++ b/SSL/src/CommonForms/ПечатьДокументов/Module.bsl @@ -107,17 +107,17 @@ НастройкаПечатнойФормы = ТекущаяНастройкаПечатнойФормы(); Если ИмяСобытия = "Запись_ПользовательскиеМакетыПечати" - И Источник.ВладелецФормы = ЭтаФорма + И Источник.ВладелецФормы = ЭтотОбъект И Параметр.ИмяОбъектаМетаданныхМакета = НастройкаПечатнойФормы.ПутьКМакету Тогда ПодключитьОбработчикОжидания("ОбновитьТекущуюПечатнуюФорму",0.1,Истина); ИначеЕсли (ИмяСобытия = "ОтказОтИзмененияМакета" Или Имясобытия = "ОтменаРедактированияТабличногоДокумента" И Параметр.ИмяОбъектаМетаданныхМакета = НастройкаПечатнойФормы.ПутьКМакету) - И Источник.ВладелецФормы = ЭтаФорма Тогда + И Источник.ВладелецФормы = ЭтотОбъект Тогда ОтобразитьСостояниеТекущейПечатнойФормы(); ИначеЕсли ИмяСобытия = "Запись_ТабличныйДокумент" И Параметр.ИмяОбъектаМетаданныхМакета = НастройкаПечатнойФормы.ПутьКМакету - И Источник.ВладелецФормы = ЭтаФорма Тогда + И Источник.ВладелецФормы = ЭтотОбъект Тогда Макет = Параметр.ТабличныйДокумент; АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет); ЗаписатьМакет(Параметр.ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище); @@ -133,7 +133,7 @@ Процедура КопийПриИзменении(Элемент) Если НастройкиПечатныхФорм.Количество() = 1 Тогда НастройкиПечатныхФорм[0].Количество = Копий; - ЭтаФорма[НастройкиПечатныхФорм[0].ИмяРеквизита].КоличествоЭкземпляров = НастройкиПечатныхФорм[0].Количество; + ЭтотОбъект[НастройкиПечатныхФорм[0].ИмяРеквизита].КоличествоЭкземпляров = НастройкиПечатныхФорм[0].Количество; КонецЕсли; КонецПроцедуры @@ -147,7 +147,7 @@ МожноСохранять = Ложь; Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл - ПечатнаяФорма = ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита]; + ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита]; ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита]; МожноПечатать = МожноПечатать Или НастройкаПечатнойФормы.Печатать И ПечатнаяФорма.ВысотаТаблицы > 0 @@ -172,7 +172,7 @@ &НаКлиенте Процедура НастройкиПечатныхФормКоличествоПриИзменении(Элемент) НастройкаПечатнойФормы = ТекущаяНастройкаПечатнойФормы(); - ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита].КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество; + ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество; КонецПроцедуры &НаКлиенте @@ -189,6 +189,11 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура НастройкиПечатныхФормПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ @@ -196,7 +201,7 @@ Процедура Сохранить(Команда) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати); - ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -209,7 +214,7 @@ ИмяОткрываемойФормы = "ОбщаяФорма.ПодготовкаНовогоПисьма"; КонецЕсли; - ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтаФорма); + ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -221,22 +226,8 @@ СписокВыбора.Добавить(ОбъектПечати.Представление, Строка(ОбъектПечати.Значение)); КонецЦикла; - ВыбранныйЭлемент = СписокВыбора.ВыбратьЭлемент(НСтр("ru = 'Перейти к печатной форме'")); - Если ВыбранныйЭлемент = Неопределено Тогда - Возврат; - КонецЕсли; - - Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл - ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита]; - ТабличныйДокумент = ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита]; - ОбластьВыбранногоДокумента = ТабличныйДокумент.Области.Найти(ВыбранныйЭлемент.Значение); - - ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область("R1C1"); // переход к началу - - Если ОбластьВыбранногоДокумента <> Неопределено Тогда - ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область(ОбластьВыбранногоДокумента.Верх,,ОбластьВыбранногоДокумента.Низ,); - КонецЕсли; - КонецЦикла; + ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКДокументуЗавершение", ЭтотОбъект); + СписокВыбора.ПоказатьВыборЭлемента(ОписаниеОповещения, НСтр("ru = 'Перейти к печатной форме'")); КонецПроцедуры @@ -252,7 +243,7 @@ Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл Если Элементы[НастройкаПечатнойФормы.ИмяРеквизита].Вывод = ИспользованиеВывода.Разрешить И НастройкаПечатнойФормы.Печатать Тогда - ТабличныеДокументы.Добавить(ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита], НастройкаПечатнойФормы.Представление); + ТабличныеДокументы.Добавить(ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита], НастройкаПечатнойФормы.Представление); КонецЕсли; КонецЦикла; @@ -299,8 +290,8 @@ // формирование табличных документов Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику(Параметры.ИсточникДанных, Параметры.ПараметрыИсточника, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); Иначе @@ -336,12 +327,14 @@ Если ИспользоватьСохраненныеНастройки И Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда ИменаМакетов = Параметры.ИменаМакетов; Если ТипЗнч(ИменаМакетов) = Тип("Массив") Тогда - ИменаМакетов = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ИменаМакетов); + ИменаМакетов = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ИменаМакетов); КонецЕсли; КлючНастроек = Параметры.ИмяМенеджераПечати + "-" + ИменаМакетов; Если СтрДлина(КлючНастроек) > 128 Тогда // ключ более 128 символов вызовет исключение при обращении к хранилищу настроек - КлючНастроек = Параметры.ИмяМенеджераПечати + "-" + СтроковыеФункцииКлиентСервер.ВычислитьХешСтрокиПоАлгоритмуMD5(ИменаМакетов); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(ИменаМакетов); + КлючНастроек = Параметры.ИмяМенеджераПечати + "-" + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); КонецЕсли; СохраненныеНастройкиПечатныхФорм = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПечатныхФорм", КлючНастроек, Новый Массив); КонецЕсли; @@ -390,7 +383,7 @@ Если РанееДобавленнаяНастройкаПечатнойФормы = Неопределено Тогда // копирование табличного документа в реквизит формы ИмяРеквизита = РеквизитФормы.Имя; - ЭтаФорма[ИмяРеквизита] = ОписаниеПечатнойФормы.ТабличныйДокумент; + ЭтотОбъект[ИмяРеквизита] = ОписаниеПечатнойФормы.ТабличныйДокумент; // создание страниц для табличных документов ИмяСтраницы = "Страница" + ИмяРеквизита; @@ -399,7 +392,7 @@ Страница.Картинка = БиблиотекаКартинок.ТабличныйДокументВставитьРазрывСтраницы; Страница.Заголовок = ОписаниеПечатнойФормы.СинонимМакета; Страница.Подсказка = ОписаниеПечатнойФормы.СинонимМакета; - Страница.Видимость = ЭтаФорма[ИмяРеквизита].ВысотаТаблицы > 0; + Страница.Видимость = ЭтотОбъект[ИмяРеквизита].ВысотаТаблицы > 0; // создание элементов под табличные документы НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Страница); @@ -513,9 +506,9 @@ &НаСервере Процедура УстановитьИмяПринтераВПодсказкеКнопкиПечать() Если НастройкиПечатныхФорм.Количество() > 0 Тогда - ИмяПринтера = ЭтаФорма[НастройкиПечатныхФорм[0].ИмяРеквизита].ИмяПринтера; + ИмяПринтера = ЭтотОбъект[НастройкиПечатныхФорм[0].ИмяРеквизита].ИмяПринтера; Если Не ПустаяСтрока(ИмяПринтера) Тогда - ЭтаФорма.Команды["Печать"].Подсказка = НСтр("ru = 'Напечатать на принтере'") + " (" + ИмяПринтера + ")"; + ЭтотОбъект.Команды["Печать"].Подсказка = НСтр("ru = 'Напечатать на принтере'") + " (" + ИмяПринтера + ")"; КонецЕсли; КонецЕсли; КонецПроцедуры @@ -547,7 +540,7 @@ НастройкаПечатнойФормы = ТекущаяНастройкаПечатнойФормы(); ТекущаяСтраница = Элементы.СтраницаПечатнаяФормаНедоступна; - Если НастройкаПечатнойФормы <> Неопределено И ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0 Тогда + Если НастройкаПечатнойФормы <> Неопределено И ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0 Тогда ТекущаяСтраница = Элементы[НастройкаПечатнойФормы.ИмяСтраницы]; КонецЕсли; @@ -598,7 +591,7 @@ ИндексСтроки = НастройкиПечатныхФорм.Индекс(НастройкаПечатнойФормы); НастройкиПечатныхФорм.Сдвинуть(ИндексСтроки, НастройкиПечатныхФорм.Количество()-1 - ИндексСтроки); // сдвиг в конец НастройкаПечатнойФормы.Количество = СохраненнаяНастройка.Количество; - ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита].КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество; + ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество; НастройкаПечатнойФормы.Печатать = НастройкаПечатнойФормы.Количество > 0; КонецЦикла; КонецЦикла; @@ -632,7 +625,7 @@ Продолжить; КонецЕсли; - ПечатнаяФорма = ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита]; + ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита]; Если ОбработанныеПечатныеФормы.Найти(ПечатнаяФорма) = Неопределено Тогда ОбработанныеПечатныеФормы.Добавить(ПечатнаяФорма); Иначе @@ -667,7 +660,7 @@ ЗаписьZipФайла.Добавить(ПолноеИмяФайла); Иначе ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла); - ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтотОбъект.УникальныйИдентификатор); Результат.Добавить(ПутьВоВременномХранилище, ИмяФайла); КонецЕсли; КонецЦикла; @@ -679,7 +672,7 @@ ЗаписьZipФайла.Записать(); ФайлАрхива = Новый Файл(ИмяАрхива); ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива); - ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор); + ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтотОбъект.УникальныйИдентификатор); Результат.Добавить(ПутьВоВременномХранилище, ПолучитьИмяФайлаДляАрхива()); КонецЕсли; @@ -755,7 +748,7 @@ Продолжить; КонецЕсли; - ПечатнаяФорма = ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита]; + ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита]; Если ВычислитьИспользованиеВывода(ПечатнаяФорма) = ИспользованиеВывода.Запретить Тогда Продолжить; @@ -804,6 +797,7 @@ Возврат; #КонецЕсли + ДополнительныеПараметры = Новый Структура("СписокФайловВоВременномХранилище, Папка", СписокФайловВоВременномХранилище, Папка); Если НайтиФайлы(Папка,"*").Количество() > 0 Тогда ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Папка ""%1"" не пустая. @@ -812,11 +806,26 @@ Кнопки = Новый СписокЗначений; Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Перезаписывать'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена); - Если Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена, НСтр("ru = 'Сохранение печатной формы'")) = КодВозвратаДиалога.Отмена Тогда - Возврат; - КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьПечатныеФормыВПапкуЗавершение", ЭтотОбъект, ДополнительныеПараметры); + + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Отмена, НСтр("ru = 'Сохранение печатной формы'")); + Иначе + СохранитьПечатныеФормыВПапкуЗавершение(КодВозвратаДиалога.Да, ДополнительныеПараметры); КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьПечатныеФормыВПапкуЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + СписокФайловВоВременномХранилище = ДополнительныеПараметры.СписокФайловВоВременномХранилище; + Папка = ДополнительныеПараметры.Папка; + Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Папка) + ФайлДляЗаписи.Представление; @@ -879,7 +888,7 @@ Функция ЕстьДанныеДляПечати() Результат = Ложь; Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл - Результат = Результат Или ЭтаФорма[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0; + Результат = Результат Или ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0; КонецЦикла; Возврат Результат; КонецФункции @@ -908,7 +917,7 @@ ПараметрыОткрытия.Вставить("ТипМакета", "MXL"); ПараметрыОткрытия.Вставить("ЭтоВебКлиент", Истина); - ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтаФорма); + ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыОткрытия, ЭтотОбъект); #Иначе ПараметрыОткрытия = Новый Структура; @@ -917,7 +926,7 @@ ПараметрыОткрытия.Вставить("ИмяДокумента", НастройкаПечатнойФормы.Представление); ПараметрыОткрытия.Вставить("Редактирование", Истина); - ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия, ЭтотОбъект); #КонецЕсли КонецПроцедуры @@ -1007,7 +1016,7 @@ Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл Если ПечатнаяФорма.ИмяМакета = ИмяМакета Тогда - ЭтаФорма[ИмяРеквизита] = ПечатнаяФорма.ТабличныйДокумент; + ЭтотОбъект[ИмяРеквизита] = ПечатнаяФорма.ТабличныйДокумент; КонецЕсли; КонецЦикла; @@ -1026,3 +1035,24 @@ Процедура ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище) УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище); КонецПроцедуры + +&НаКлиенте +Процедура ПерейтиКДокументуЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + + Если ВыбранныйЭлемент = Неопределено Тогда + Возврат; + КонецЕсли; + + Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл + ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита]; + ТабличныйДокумент = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита]; + ОбластьВыбранногоДокумента = ТабличныйДокумент.Области.Найти(ВыбранныйЭлемент.Значение); + + ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область("R1C1"); // переход к началу + + Если ОбластьВыбранногоДокумента <> Неопределено Тогда + ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область(ОбластьВыбранногоДокумента.Верх,,ОбластьВыбранногоДокумента.Низ,); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo b/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo index 05f4eaf8d..b26115dba 100644 --- a/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo +++ b/SSL/src/CommonForms/ПечатьДокументов/ПечатьДокументов.mdo @@ -5,6 +5,11 @@ ru Печать документов
          + + + ru + + PersonalComputer MobileDevice true diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form index 816543f0e..2964651c6 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Form.form @@ -36,8 +36,8 @@ None - ПолучателиВыбранРасширеннаяПодсказка - 83 + ПолучателиВыбранExtendedTooltip + 74 Label true true @@ -78,8 +78,8 @@ Получатели.Представление - ПолучателиПредставлениеРасширеннаяПодсказка - 87 + ПолучателиПредставлениеExtendedTooltip + 77 Label true true @@ -119,8 +119,8 @@ Получатели.ПредставлениеАдреса - ПолучателиПредставлениеАдресаРасширеннаяПодсказка - 89 + ПолучателиПредставлениеАдресаExtendedTooltip + 78 Label true true @@ -162,8 +162,8 @@ Получатели группа представление - ПолучателиГруппаПредставлениеРасширеннаяПодсказка - 86 + ПолучателиГруппаПредставлениеExtendedTooltip + 76 Label true true @@ -192,8 +192,8 @@ Получатели.Пояснение - ПолучателиПояснениеРасширеннаяПодсказка - 92 + ПолучателиПояснениеExtendedTooltip + 80 Label true true @@ -239,8 +239,8 @@ Получатели группа пояснение - ПолучателиГруппаПояснениеРасширеннаяПодсказка - 91 + ПолучателиГруппаПояснениеExtendedTooltip + 79 Label true true @@ -269,8 +269,8 @@ Получатели группа - ПолучателиГруппаРасширеннаяПодсказка - 85 + ПолучателиГруппаExtendedTooltip + 75 Label true true @@ -296,10 +296,10 @@ ПолучателиСтрокаПоиска - 74 + 88 ПолучателиСтрокаПоискаРасширеннаяПодсказка - 76 + 90 Label true true @@ -309,7 +309,7 @@ ПолучателиСтрокаПоискаКонтекстноеМеню - 75 + 89 true Получатели @@ -319,10 +319,10 @@ ПолучателиСостояниеПросмотра - 77 + 91 ПолучателиСостояниеПросмотраРасширеннаяПодсказка - 79 + 93 Label true true @@ -332,7 +332,7 @@ ПолучателиСостояниеПросмотраКонтекстноеМеню - 78 + 92 true ViewStatusAddition @@ -343,10 +343,10 @@ ПолучателиУправлениеПоиском - 80 + 94 ПолучателиУправлениеПоискомРасширеннаяПодсказка - 82 + 96 Label true true @@ -356,7 +356,7 @@ ПолучателиУправлениеПоискомКонтекстноеМеню - 81 + 95 true SearchControlAddition @@ -366,7 +366,7 @@ - ПолучателиРасширеннаяПодсказка + ПолучателиExtendedTooltip 73 Label true @@ -390,7 +390,7 @@ true - ПолучателиКонтекстноеМенюВыбратьВсехРасширеннаяПодсказка + ПолучателиКонтекстноеМенюВыбратьВсехExtendedTooltip 70 Label true @@ -416,7 +416,7 @@ true - ПолучателиКонтекстноеМенюОтменитьВыборДляВсехРасширеннаяПодсказка + ПолучателиКонтекстноеМенюОтменитьВыборДляВсехExtendedTooltip 71 Label true @@ -447,7 +447,7 @@ Получатели контекстное меню группа управление выбором - ПолучателиКонтекстноеМенюГруппаУправлениеВыборомРасширеннаяПодсказка + ПолучателиКонтекстноеМенюГруппаУправлениеВыборомExtendedTooltip 69 Label true @@ -467,7 +467,7 @@ true - ПолучателиКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + ПолучателиКонтекстноеМенюВывестиСписокExtendedTooltip 72 Label true @@ -551,8 +551,8 @@ ВыбранныеФорматыСохранения.Check - ВыбранныеФорматыСохраненияПометкаРасширеннаяПодсказка - 113 + ВыбранныеФорматыСохраненияПометкаExtendedTooltip + 83 Label true true @@ -584,8 +584,8 @@ ВыбранныеФорматыСохранения.Value - ВыбранныеФорматыСохраненияЗначениеРасширеннаяПодсказка - 115 + ВыбранныеФорматыСохраненияЗначениеExtendedTooltip + 84 Label true true @@ -620,10 +620,10 @@ ВыбранныеФорматыСохраненияСтрокаПоиска - 104 + 109 ВыбранныеФорматыСохраненияСтрокаПоискаРасширеннаяПодсказка - 106 + 111 Label true true @@ -633,7 +633,7 @@ ВыбранныеФорматыСохраненияСтрокаПоискаКонтекстноеМеню - 105 + 110 true ВыбранныеФорматыСохранения @@ -643,10 +643,10 @@ ВыбранныеФорматыСохраненияСостояниеПросмотра - 107 + 112 ВыбранныеФорматыСохраненияСостояниеПросмотраРасширеннаяПодсказка - 109 + 114 Label true true @@ -656,7 +656,7 @@ ВыбранныеФорматыСохраненияСостояниеПросмотраКонтекстноеМеню - 108 + 113 true ViewStatusAddition @@ -667,10 +667,10 @@ ВыбранныеФорматыСохраненияУправлениеПоиском - 110 + 115 ВыбранныеФорматыСохраненияУправлениеПоискомРасширеннаяПодсказка - 112 + 117 Label true true @@ -680,7 +680,7 @@ ВыбранныеФорматыСохраненияУправлениеПоискомКонтекстноеМеню - 111 + 116 true SearchControlAddition @@ -690,8 +690,8 @@ - ВыбранныеФорматыСохраненияРасширеннаяПодсказка - 103 + ВыбранныеФорматыСохраненияExtendedTooltip + 82 Label true true @@ -744,8 +744,8 @@ Группа выбор форматов - ГруппаВыборФорматовРасширеннаяПодсказка - 102 + ГруппаВыборФорматовExtendedTooltip + 81 Label true true @@ -780,8 +780,8 @@ ФорматВложений - ФорматВложенийРасширеннаяПодсказка - 126 + ФорматВложенийExtendedTooltip + 86 Label true true @@ -826,8 +826,8 @@ Right - УпаковатьВАрхивРасширеннаяПодсказка - 128 + УпаковатьВАрхивExtendedTooltip + 87 Label true true @@ -861,8 +861,8 @@ Группа дополнительные параметры - ГруппаДополнительныеПараметрыРасширеннаяПодсказка - 125 + ГруппаДополнительныеПараметрыExtendedTooltip + 85 Label true true @@ -896,7 +896,7 @@ false - КнопкаПодготовитьРасширеннаяПодсказка + КнопкаПодготовитьExtendedTooltip 67 Label true @@ -922,7 +922,7 @@ true - КнопкаОтменаРасширеннаяПодсказка + КнопкаОтменаExtendedTooltip 68 Label true @@ -961,6 +961,7 @@ Abort Close CustomizeForm + Help Ignore No OK diff --git a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl index 4196607a4..7a03af336 100644 --- a/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl +++ b/SSL/src/CommonForms/ПодготовкаНовогоПисьма/Module.bsl @@ -86,7 +86,7 @@ СтандартнаяОбработка = Ложь; ПараметрыОткрытия = Новый Структура; ПараметрыОткрытия.Вставить("НастройкиФормата", ВыбранныеНастройкиФормата()); - ОткрытьФорму("ОбщаяФорма.ВыборФорматаВложений", ПараметрыОткрытия, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ВыборФорматаВложений", ПараметрыОткрытия, ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form index b6ba85bab..a918a799c 100644 --- a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form +++ b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Form.form @@ -1,5 +1,5 @@ - + <key>ru</key> <value>Подключение конечной точки</value> @@ -19,7 +19,7 @@ <segments>НастройкиОтправителяWSURLВебСервиса</segments> </dataPath> <extendedTooltip> - <name>НастройкиОтправителяWSURLВебСервисаРасширеннаяПодсказка</name> + <name>НастройкиОтправителяWSURLВебСервисаExtendedTooltip</name> <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -48,6 +48,43 @@ <textSize>Normal</textSize> </extInfo> </items> + <items xsi:type="form:Decoration"> + <name>Декорация1</name> + <id>35</id> + <title> + <key>ru</key> + <value>Веб-адрес публикации информационной базы (конечной точки), например: http://myserver/infobase</value> + + true + true + + true + + + Декорация1РасширеннаяПодсказка + 37 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 36 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + НастройкиОтправителяWSИмяПользователя 21 @@ -60,8 +97,8 @@ НастройкиОтправителяWSИмяПользователя - НастройкиОтправителяWSИмяПользователяРасширеннаяПодсказка - 30 + НастройкиОтправителяWSИмяПользователяExtendedTooltip + 29 Label true true @@ -80,8 +117,10 @@ Left true + 30 true true + false true true true @@ -101,8 +140,8 @@ НастройкиОтправителяWSПароль - НастройкиОтправителяWSПарольРасширеннаяПодсказка - 32 + НастройкиОтправителяWSПарольExtendedTooltip + 30 Label true true @@ -121,8 +160,10 @@ Left true + 30 true true + false true true true @@ -131,6 +172,43 @@ Normal + + Декорация3 + 41 + + <key>ru</key> + <value>Имя и пароль служебного пользователя с ролью "Удаленный доступ (Обмен сообщениями)"</value> + + true + true + + true + + + Декорация3РасширеннаяПодсказка + 43 + Label + true + true + + Left + + + + Декорация3КонтекстноеМеню + 42 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + true true @@ -145,7 +223,7 @@ Настройки подключения отправителя - НастройкиПодключенияОтправителяРасширеннаяПодсказка + НастройкиПодключенияОтправителяExtendedTooltip 27 Label true @@ -181,8 +259,8 @@ НастройкиПолучателяWSURLВебСервиса - НастройкиПолучателяWSURLВебСервисаРасширеннаяПодсказка - 35 + НастройкиПолучателяWSURLВебСервисаExtendedTooltip + 32 Label true true @@ -210,6 +288,43 @@ Normal + + Декорация2 + 38 + + <key>ru</key> + <value>Веб-адрес публикации этой информационной базы, например: http://myserver/thisinfobase</value> + + true + true + + true + + + Декорация2РасширеннаяПодсказка + 40 + Label + true + true + + Left + + + + Декорация2КонтекстноеМеню + 39 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + НастройкиПолучателяWSИмяПользователя 15 @@ -222,8 +337,8 @@ НастройкиПолучателяWSИмяПользователя - НастройкиПолучателяWSИмяПользователяРасширеннаяПодсказка - 37 + НастройкиПолучателяWSИмяПользователяExtendedTooltip + 33 Label true true @@ -242,8 +357,10 @@ Left true + 30 true true + false true true true @@ -263,8 +380,8 @@ НастройкиПолучателяWSПароль - НастройкиПолучателяWSПарольРасширеннаяПодсказка - 39 + НастройкиПолучателяWSПарольExtendedTooltip + 34 Label true true @@ -283,8 +400,10 @@ Left true + 30 true true + false true true true @@ -293,6 +412,44 @@ Normal + + Декорация4 + 44 + + <key>ru</key> + <value>Имя и пароль служебного пользователя с ролью "Удаленный доступ (Обмен сообщениями)" +в этой информационной базе.</value> + + true + true + + true + + + Декорация4РасширеннаяПодсказка + 46 + Label + true + true + + Left + + + + Декорация4КонтекстноеМеню + 45 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + + true true @@ -307,8 +464,8 @@ Настройки подключения получателя - НастройкиПодключенияПолучателяРасширеннаяПодсказка - 34 + НастройкиПодключенияПолучателяExtendedTooltip + 31 Label true true @@ -342,7 +499,7 @@ true - ФормаПодключитьКонечнуюТочкуРасширеннаяПодсказка + ФормаПодключитьКонечнуюТочкуExtendedTooltip 25 Label true @@ -372,7 +529,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 26 Label true @@ -390,10 +547,6 @@ Right - - OnOpen - ПриОткрытии - BeforeClose ПередЗакрытием @@ -404,7 +557,7 @@ CustomizeForm Help - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl index 6da30053c..83b2d3970 100644 --- a/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl +++ b/SSL/src/CommonForms/ПодключениеКонечнойТочки/Module.bsl @@ -1,6 +1,3 @@ -&НаКлиенте -Перем ЗакрытьФормуБезусловно; - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -15,21 +12,12 @@ КонецПроцедуры -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - ЗакрытьФормуБезусловно = Ложь; - -КонецПроцедуры - &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы( - Отказ, - , - ЗакрытьФормуБезусловно, - НСтр("ru = 'Отменить подключение конечной точки?'")); + ТекстПредупреждения = НСтр("ru = 'Отменить подключение конечной точки?'"); + Оповещение = Новый ОписаниеОповещения("ПодключитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ, ТекстПредупреждения); КонецПроцедуры @@ -39,6 +27,16 @@ &НаКлиенте Процедура ПодключитьКонечнуюТочку(Команда) + ПодключитьИЗакрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПодключитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + Состояние(НСтр("ru = 'Выполняется подключение конечной точки. Пожалуйста, подождите...'")); Отказ = Ложь; @@ -54,29 +52,33 @@ НСтрока = НСтр("ru = 'При подключении конечной точки возникли ошибки. |Перейти в журнал регистрации?'"); - Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); - Если Ответ = КодВозвратаДиалога.Да Тогда - - Отбор = Новый Структура; - Отбор.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрацииПодключениеКонечнойТочки); - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Отбор, ЭтаФорма); - - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьЖурналРегистрации", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); Возврат; КонецЕсли; Оповестить(ОбменСообщениямиКлиент.ИмяСобытияДобавленаКонечнаяТочка()); - Предупреждение(НСтр("ru = 'Подключение конечной точки успешно завершено.'")); + ПоказатьОповещениеПользователя(,,НСтр("ru = 'Подключение конечной точки успешно завершено.'")); - ЗакрытьФормуБезусловно = Истина; + Модифицированность = Ложь; Закрыть(); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ОткрытьЖурналРегистрации(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + Отбор = Новый Структура; + Отбор.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрацииПодключениеКонечнойТочки); + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Отбор, ЭтотОбъект); + + КонецЕсли; + +КонецПроцедуры &НаСервере Процедура ПодключитьКонечнуюТочкуНаСервере(Отказ, ОшибкаЗаполнения) @@ -97,4 +99,3 @@ КонецПроцедуры - diff --git a/SSL/src/CommonForms/ПодписьЭЦП/Form.form b/SSL/src/CommonForms/ПодписьЭП/Form.form similarity index 95% rename from SSL/src/CommonForms/ПодписьЭЦП/Form.form rename to SSL/src/CommonForms/ПодписьЭП/Form.form index 9bc7e13c2..bd2b20c7d 100644 --- a/SSL/src/CommonForms/ПодписьЭЦП/Form.form +++ b/SSL/src/CommonForms/ПодписьЭП/Form.form @@ -13,7 +13,7 @@ true - КомуВыданРасширеннаяПодсказка + КомуВыданExtendedTooltip 24 Label true @@ -54,8 +54,8 @@ УстановившийПодписьСтрока - УстановившийПодписьСтрокаРасширеннаяПодсказка - 26 + УстановившийПодписьСтрокаExtendedTooltip + 25 Label true true @@ -97,8 +97,8 @@ true - УстановившийПодписьРасширеннаяПодсказка - 28 + УстановившийПодписьExtendedTooltip + 26 Label true true @@ -142,8 +142,8 @@ true - ДатаПодписиРасширеннаяПодсказка - 30 + ДатаПодписиExtendedTooltip + 27 Label true true @@ -185,8 +185,8 @@ true - КомментарийРасширеннаяПодсказка - 32 + КомментарийExtendedTooltip + 28 Label true true @@ -227,7 +227,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 21 Label true @@ -252,7 +252,7 @@ true - ФормаВыгрузитьРасширеннаяПодсказка + ФормаВыгрузитьExtendedTooltip 22 Label true @@ -278,7 +278,7 @@ true - ФормаОткрытьСертификатРасширеннаяПодсказка + ФормаОткрытьСертификатExtendedTooltip 23 Label true diff --git a/SSL/src/CommonForms/ПодписьЭЦП/Help/ru.html b/SSL/src/CommonForms/ПодписьЭП/Help/ru.html similarity index 73% rename from SSL/src/CommonForms/ПодписьЭЦП/Help/ru.html rename to SSL/src/CommonForms/ПодписьЭП/Help/ru.html index 67d3492ce..fe7ab77da 100644 --- a/SSL/src/CommonForms/ПодписьЭЦП/Help/ru.html +++ b/SSL/src/CommonForms/ПодписьЭП/Help/ru.html @@ -1,8 +1,8 @@ - +

          Форма предназначена для просмотра основных свойств электронной подписи (ЭП).

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

          По команде "Открыть сертификат" открывается форма просмотра сертификата.

           

          См. также:

          -

          Настройка ЭП и шифрования
          Персональные настройки ЭП

          \ No newline at end of file +

          Настройка ЭП и шифрования
          Персональные настройки ЭП

          \ No newline at end of file diff --git a/SSL/src/CommonForms/ПодписьЭЦП/Module.bsl b/SSL/src/CommonForms/ПодписьЭП/Module.bsl similarity index 86% rename from SSL/src/CommonForms/ПодписьЭЦП/Module.bsl rename to SSL/src/CommonForms/ПодписьЭП/Module.bsl index d3623075e..b2fcf7788 100644 --- a/SSL/src/CommonForms/ПодписьЭЦП/Module.bsl +++ b/SSL/src/CommonForms/ПодписьЭП/Module.bsl @@ -35,10 +35,10 @@ &НаКлиенте Процедура Выгрузить(Команда) - ЭлектроннаяЦифроваяПодписьКлиент.СохранитьПодпись(АдресПодписи); + ЭлектроннаяПодписьКлиент.СохранитьПодпись(АдресПодписи); КонецПроцедуры &НаКлиенте Процедура ОткрытьСертификат(Команда) - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьСертификатПоОтпечаткуИАдресу(Отпечаток, АдресСертификата); + ЭлектроннаяПодписьКлиент.ОткрытьСертификатПоОтпечаткуИАдресу(Отпечаток, АдресСертификата); КонецПроцедуры diff --git a/SSL/src/CommonForms/ПодписьЭЦП/ПодписьЭЦП.mdo b/SSL/src/CommonForms/ПодписьЭП/ПодписьЭП.mdo similarity index 92% rename from SSL/src/CommonForms/ПодписьЭЦП/ПодписьЭЦП.mdo rename to SSL/src/CommonForms/ПодписьЭП/ПодписьЭП.mdo index 9bd887c0c..f15d7a397 100644 --- a/SSL/src/CommonForms/ПодписьЭЦП/ПодписьЭЦП.mdo +++ b/SSL/src/CommonForms/ПодписьЭП/ПодписьЭП.mdo @@ -1,6 +1,6 @@ - ПодписьЭЦП + ПодписьЭП ru Подпись ЭП diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form index 6b9f61e05..11fe3813e 100644 --- a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Form.form @@ -16,7 +16,7 @@ Введите пароль учетной записи - ПарольРасширеннаяПодсказка + ПарольExtendedTooltip 13 Label true @@ -65,8 +65,8 @@ Введите пароль учетной записи ещё раз - ПодтверждениеПароляРасширеннаяПодсказка - 15 + ПодтверждениеПароляExtendedTooltip + 14 Label true true @@ -111,8 +111,8 @@ Сохранять пароль в информационной базе - СохранятьПарольРасширеннаяПодсказка - 17 + СохранятьПарольExtendedTooltip + 15 Label true true @@ -147,7 +147,7 @@ false - СохранитьПарольИПродолжитьРасширеннаяПодсказка + СохранитьПарольИПродолжитьExtendedTooltip 10 Label true @@ -174,7 +174,7 @@ false - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 11 Label true @@ -201,7 +201,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 12 Label true diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html index 7d73364bb..962483d6a 100644 --- a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Help/ru.html @@ -1,4 +1,4 @@ - +

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

          Командная панель формы содержит следующие кнопки:

          • Продолжить - эта форма закрывается и письмо отправляется diff --git a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl index 092a17460..5559555fc 100644 --- a/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl +++ b/SSL/src/CommonForms/ПодтверждениеПароляУчетнойЗаписи/Module.bsl @@ -75,11 +75,12 @@ КонецЕсли; Если ПроверитьВозможностьОтправкиИПолучения Тогда - РаботаСПочтовымиСообщениямиКлиент.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, Пароль); + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьПарольИПродолжитьВыполнитьЗавершение", ЭтотОбъект, Пароль); + РаботаСПочтовымиСообщениямиКлиент.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(ОписаниеОповещения, УчетнаяЗапись, Пароль); + Возврат; КонецЕсли; - ОповеститьОВыборе(Пароль); - + СохранитьПарольИПродолжитьВыполнитьЗавершение(Пароль); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -101,3 +102,10 @@ Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ФормаПодтвержденияПароляУчетнойЗаписи", УчетнаяЗапись); КонецФункции + +&НаКлиенте +Процедура СохранитьПарольИПродолжитьВыполнитьЗавершение(Пароль) Экспорт + + ОповеститьОВыборе(Пароль); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonForms/ПоискПоИндексу/Form.form b/SSL/src/CommonForms/ПоискПоИндексу/Form.form deleted file mode 100644 index 0f5a2636a..000000000 --- a/SSL/src/CommonForms/ПоискПоИндексу/Form.form +++ /dev/null @@ -1,1082 +0,0 @@ - - - - <key>ru</key> - <value>Выберите улицу и населенный пункт</value> - - - НадписьОРегионеИРайоне - 13 - - true - true - - true - - - НадписьОРегионеИРайоне - - None - - НадписьОРегионеИРайонеРасширеннаяПодсказка - 32 - Label - true - true - - Left - - - - НадписьОРегионеИРайонеКонтекстноеМеню - 14 - true - - LabelField - Enter - true - Left - true - - true - true - - System.DefaultGUIFont - true - false - false - false - - - - - НайденныеЗаписиПоИндексу - 1 - true - true - - true - - - НайденныеЗаписиПоИндексу - - true - false - None - Add - Change - Copy - Delete - EndEdit - MoveDown - MoveUp - SortListAsc - SortListDesc - - Улица - 4 - true - true - - true - - - НайденныеЗаписиПоИндексу.Улица - - - УлицаРасширеннаяПодсказка - 58 - Label - true - true - - Left - - - - УлицаКонтекстноеМеню - 5 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - - - - Описание - 6 - - <key>ru</key> - <value>Населенный пункт</value> - - true - true - - true - - - НайденныеЗаписиПоИндексу.Описание - - - ОписаниеРасширеннаяПодсказка - 60 - Label - true - true - - Left - - - - ОписаниеКонтекстноеМеню - 7 - true - - InputField - true - Enter - true - Left - true - - true - true - true - true - true - - Style.BorderColor - - Normal - - - - ПризнакАктуальности - 29 - true - - true - - - НайденныеЗаписиПоИндексу.ПризнакАктуальности - - - ПризнакАктуальностиРасширеннаяПодсказка - 62 - Label - true - true - - Left - - - - ПризнакАктуальностиКонтекстноеМеню - 30 - true - - InputField - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - НайденныеЗаписиПоИндексуКоманднаяПанель - 3 - - НайденныеЗаписиПоИндексуКомандаВыбрать - 15 - true - true - - true - - - НайденныеЗаписиПоИндексуКомандаВыбратьРасширеннаяПодсказка - 39 - Label - true - true - - Left - - - Form.Command.КомандаВыбрать - Auto - true - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуПоиск - 23 - - НайденныеЗаписиПоИндексуНайти - 18 - true - true - - true - - - НайденныеЗаписиПоИндексуНайтиРасширеннаяПодсказка - 41 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуОтменитьПоиск - 19 - true - true - - true - - - НайденныеЗаписиПоИндексуОтменитьПоискРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Найденные записи по индексу поиск</value> - - - ru - Найденные записи по индексу поиск - - - НайденныеЗаписиПоИндексуПоискРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - - - - СкрыватьНеактуальныеАдреса - 31 - true - true - - true - - - СкрыватьНеактуальныеАдресаРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - Form.Command.СкрыватьНеактуальныеАдреса - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - - - НайденныеЗаписиПоИндексуНастройка - 22 - - НайденныеЗаписиПоИндексуВывестиСписок - 20 - true - true - - true - - - НайденныеЗаписиПоИндексуВывестиСписокРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.OutputList - Normal - Auto - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуИзменитьФорму - 16 - true - true - - true - - - НайденныеЗаписиПоИндексуИзменитьФормуРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - Form.StandardCommand.CustomizeForm - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Найденные записи по индексу настройка</value> - - - ru - Найденные записи по индексу настройка - - - НайденныеЗаписиПоИндексуНастройкаРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - - - - НайденныеЗаписиПоИндексуСправка - 17 - true - true - - true - - - НайденныеЗаписиПоИндексуСправкаРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - - Left - - - Selection - НайденныеЗаписиПоИндексуВыбор - - - НайденныеЗаписиПоИндексуСтрокаПоиска - 49 - - НайденныеЗаписиПоИндексуСтрокаПоискаРасширеннаяПодсказка - 51 - Label - true - true - - Left - - - - НайденныеЗаписиПоИндексуСтрокаПоискаКонтекстноеМеню - 50 - true - - НайденныеЗаписиПоИндексу - - true - - - - НайденныеЗаписиПоИндексуСостояниеПросмотра - 52 - - НайденныеЗаписиПоИндексуСостояниеПросмотраРасширеннаяПодсказка - 54 - Label - true - true - - Left - - - - НайденныеЗаписиПоИндексуСостояниеПросмотраКонтекстноеМеню - 53 - true - - ViewStatusAddition - НайденныеЗаписиПоИндексу - - true - - - - НайденныеЗаписиПоИндексуУправлениеПоиском - 55 - - НайденныеЗаписиПоИндексуУправлениеПоискомРасширеннаяПодсказка - 57 - Label - true - true - - Left - - - - НайденныеЗаписиПоИндексуУправлениеПоискомКонтекстноеМеню - 56 - true - - SearchControlAddition - НайденныеЗаписиПоИндексу - - true - - - - НайденныеЗаписиПоИндексуРасширеннаяПодсказка - 48 - Label - true - true - - Left - - - - НайденныеЗаписиПоИндексуКонтекстноеМеню - 2 - - НайденныеЗаписиПоИндексуМенюВыбрать - 24 - true - true - - true - - - НайденныеЗаписиПоИндексуМенюВыбратьРасширеннаяПодсказка - 34 - Label - true - true - - Left - - - Form.Command.КомандаВыбрать - Auto - true - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуМенюКопироватьВБуферОбмена - 25 - true - true - - true - - - НайденныеЗаписиПоИндексуМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 35 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.CopyToClipboard - Normal - Auto - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуМенюПоиск - 26 - - НайденныеЗаписиПоИндексуМенюНайти - 27 - true - true - - true - - - НайденныеЗаписиПоИндексуМенюНайтиРасширеннаяПодсказка - 37 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - НайденныеЗаписиПоИндексуМенюОтменитьПоиск - 28 - true - true - - true - - - НайденныеЗаписиПоИндексуМенюОтменитьПоискРасширеннаяПодсказка - 38 - Label - true - true - - Left - - - Form.Item.НайденныеЗаписиПоИндексу.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Найденные записи по индексу поиск</value> - - - ru - Найденные записи по индексу поиск - - - НайденныеЗаписиПоИндексуМенюПоискРасширеннаяПодсказка - 36 - Label - true - true - - Left - - - - - - true - true - true - true - true -
            true
            - 1 - 1 - AutoUse - AutoUse - true - true - false - Auto - true - true - - Style.BorderColor - - None - None - None - true - -
            - None - false - - ФормаКоманднаяПанель - -1 - Left - true - - - OnOpen - ПриОткрытии - - - BeforeClose - ПередЗакрытием - - - OnCreateAtServer - ПриСозданииНаСервере - - DontBlock - true - true - Vertical - true - true - true - UseIfNecessary - 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 - - - - Код - - <key>ru</key> - <value>Код</value> - - 3 - - Number - - 21 - - - - true - - - true - - - - ПризнакАктуальности - - <key>ru</key> - <value>Признак актуальности</value> - - 4 - - Number - - 10 - - - - true - - - true - - - - - НадписьОРегионеИРайоне - - <key>ru</key> - <value>Надпись о регионе и районе</value> - - 2 - - String - - - - true - - - true - - - - ЕстьОписание - - <key>ru</key> - <value>Есть описание</value> - - 3 - - Boolean - - - true - - - true - - - - СкрыватьНеактуальныеАдреса - - <key>ru</key> - <value>Скрывать неактуальные адреса</value> - - 4 - - Boolean - - - true - - - true - - - - ВсеНайденныеЗаписиПоИндексу - - <key>ru</key> - <value>Все найденные записи по индексу</value> - - 5 - - ValueTable - - - true - - - true - - - Улица - - <key>ru</key> - <value>Улица</value> - - 1 - - String - - - - true - - - true - - - - Описание - - <key>ru</key> - <value>Описание</value> - - 2 - - String - - - - true - - - true - - - - Код - - <key>ru</key> - <value>Код</value> - - 3 - - Number - - 21 - - - - true - - - true - - - - ПризнакАктуальности - - <key>ru</key> - <value>Признак актуальности</value> - - 4 - - Number - - 10 - - - - true - - - true - - - - - Индекс - - <key>ru</key> - <value>Индекс</value> - - 6 - - String - - 6 - - - - true - - - true - - - - КомандаВыбрать - - <key>ru</key> - <value>Выбрать</value> - - 1 - - ru - Выбрать - - - true - - - StdPicture.ChooseValue - - - - КомандаВыбратьВыполнить - - - TextPicture - Auto - Auto - - - СкрыватьНеактуальныеАдреса - - <key>ru</key> - <value>Скрывать неактуальные адреса</value> - - 2 - - ru - Скрывать неактуальные адреса - - - true - - - - СкрыватьНеактуальныеАдреса - - - Auto - Auto - - - НайденныйРегион - - String - - - - - НайденныйРайон - - String - - - - - АдресВХранилище - - String - - - - - Индекс - - String - - 6 - - - - - ПризнакАктуальности - - Number - - 10 - - - - - СкрыватьНеактуальныеАдреса - - Boolean - - - - - - -
            diff --git a/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl b/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl deleted file mode 100644 index fecdd9f75..000000000 --- a/SSL/src/CommonForms/ПоискПоИндексу/Module.bsl +++ /dev/null @@ -1,236 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Заголовок = ?(ЕстьОписание, НСтр("ru = 'Выберите улицу и населенный пункт'"), НСтр("ru = 'Выберите улицу'")); - Элементы.НайденныеЗаписиПоИндексу.Шапка = ЕстьОписание; - Элементы.СкрыватьНеактуальныеАдреса.Пометка = СкрыватьНеактуальныеАдреса; - -КонецПроцедуры - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - Индекс = Параметры.Индекс; - - НайденоПоИндексу = Неопределено; - УправлениеКонтактнойИнформацией.ПриОпределенииЗаписейПоИндексу(Параметры.Индекс, НайденоПоИндексу); - - Если НайденоПоИндексу = Неопределено Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - Найдено = НайденоПоИндексу.Количество; - Если Найдено = 0 Тогда - Отказ = Истина; - Возврат; - ИначеЕсли Найдено > 1 Тогда - Параметры.НайденныйРегион = НайденоПоИндексу.НайденныйРегион; - Параметры.НайденныйРайон = НайденоПоИндексу.НайденныйРайон; - Параметры.ПризнакАктуальности = НайденоПоИндексу.ПризнакАктуальности; - Параметры.АдресВХранилище = НайденоПоИндексу.АдресВХранилище; - СкрыватьНеактуальныеАдреса = Параметры.СкрыватьНеактуальныеАдреса; - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("КонтактнаяИнформация.ВводАдреса", "СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); - КонецЕсли; - - ЗначениеВРеквизитФормы(ПолучитьИзВременногоХранилища(Параметры.АдресВХранилище), "НайденныеЗаписиПоИндексу"); - УдалитьИзВременногоХранилища(Параметры.АдресВХранилище); - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(НайденныеЗаписиПоИндексу, ВсеНайденныеЗаписиПоИндексу); - - НадписьОРегионеИРайоне = "" + Параметры.Индекс - + ?(ЗначениеЗаполнено(Параметры.НайденныйРегион), ", ", "") + Параметры.НайденныйРегион - + ?(ЗначениеЗаполнено(Параметры.НайденныйРегион) И ЗначениеЗаполнено(Параметры.НайденныйРайон), ", ", "") - + Параметры.НайденныйРайон; - - ЕстьОписание = Ложь; - Для Каждого Стр Из НайденныеЗаписиПоИндексу Цикл - Если Не ПустаяСтрока(Стр.Описание) Тогда - ЕстьОписание = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Элементы.НайденныеЗаписиПоИндексу.ПодчиненныеЭлементы.Описание.Видимость = ЕстьОписание; - - // Восстанавливаем значение флага "Скрывать неактуальные адреса" - Значение = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КонтактнаяИнформация.ВводАдреса", "СкрыватьНеактуальныеАдреса"); - Если Значение = Неопределено Тогда - СкрыватьНеактуальныеАдреса = Ложь; - Иначе - СкрыватьНеактуальныеАдреса = Значение; - КонецЕсли; - - Если СкрыватьНеактуальныеАдреса Тогда - - МассивНеактуальныхАдресов = Новый Массив; - Для Каждого Стр Из НайденныеЗаписиПоИндексу Цикл - Если Стр.ПризнакАктуальности <> 0 Тогда - МассивНеактуальныхАдресов.Добавить(Стр); - КонецЕсли; - КонецЦикла; - - Для Каждого ЭлементМассива Из МассивНеактуальныхАдресов Цикл - НайденныеЗаписиПоИндексу.Удалить(ЭлементМассива); - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("КонтактнаяИнформация.ВводАдреса", "СкрыватьНеактуальныеАдреса", СкрыватьНеактуальныеАдреса); - -КонецПроцедуры - - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ - -&НаКлиенте -Процедура КомандаВыбратьВыполнить() - ОбработатьВыбор(); -КонецПроцедуры - -&НаКлиенте -Процедура НайденныеЗаписиПоИндексуВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ОбработатьВыбор(); -КонецПроцедуры - -&НаКлиенте -Процедура СкрыватьНеактуальныеАдреса(Команда) - - СкрыватьНеактуальныеАдреса = Не СкрыватьНеактуальныеАдреса; - Элементы.СкрыватьНеактуальныеАдреса.Пометка = СкрыватьНеактуальныеАдреса; - ИзменитьВидимостьНеактуальныхАдресов(); - ЭтаФорма.ОбновитьОтображениеДанных(); - -КонецПроцедуры - - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаКлиенте -Процедура ОбработатьВыбор() - - Если Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные.ПризнакАктуальности <> 0 Тогда - СписокКнопок = Новый СписокЗначений; - СписокКнопок.Добавить("Выбрать"); - СписокКнопок.Добавить("Отмена"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1, %2 не актуален. - |Выбрать его?'"), - Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные.Улица, - Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные.Описание); - Ответ = Вопрос(ТекстВопроса, СписокКнопок); - Если Ответ = "Отмена" Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - КодАдресногоЭлемента = Элементы.НайденныеЗаписиПоИндексу.ТекущиеДанные.Код; - Результат = ОбработатьРезультатПоискаПоИндексу(КодАдресногоЭлемента); - Закрыть(Результат); - -КонецПроцедуры - -&НаСервере -Процедура ИзменитьВидимостьНеактуальныхАдресов() - - Если СкрыватьНеактуальныеАдреса Тогда - - МассивНеактуальныхАдресов = Новый Массив; - Для Каждого Стр Из НайденныеЗаписиПоИндексу Цикл - Если Стр.ПризнакАктуальности <> 0 Тогда - МассивНеактуальныхАдресов.Добавить(Стр); - КонецЕсли; - КонецЦикла; - - Для Каждого ЭлементМассива Из МассивНеактуальныхАдресов Цикл - НайденныеЗаписиПоИндексу.Удалить(ЭлементМассива); - КонецЦикла; - - Иначе - - ОбщегоНазначенияКлиентСервер.ДополнитьТаблицу(ВсеНайденныеЗаписиПоИндексу, НайденныеЗаписиПоИндексу); - - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ОбработатьРезультатПоискаПоИндексу(КодАдресногоЭлемента) - - // Восстанавливаем значение флага "Скрывать неактуальные адреса" - Значение = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КонтактнаяИнформация.ВводАдреса", "СкрыватьНеактуальныеАдреса"); - Если Значение = Неопределено Тогда - Результат = Новый Структура("СкрыватьНеактуальныеАдреса", Ложь); - Иначе - Результат = Новый Структура("СкрыватьНеактуальныеАдреса", Значение); - КонецЕсли; - - // Заполняем адресные элементы - Если КодАдресногоЭлемента = Неопределено Тогда - Результат.Вставить("ПризнакАктуальности", 0); - Результат.Вставить("Регион", ""); - Результат.Вставить("Результат", ""); - Результат.Вставить("Город", ""); - Результат.Вставить("НаселенныйПункт", ""); - Результат.Вставить("Улица", ""); - Иначе - УправлениеКонтактнойИнформацией.ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты( - КодАдресногоЭлемента, Результат); - - ПризнакАктуальности = Результат.ПризнакАктуальности; - Регион = Результат.Регион; - Район = Результат.Район; - Город = Результат.Город; - НаселенныйПункт = Результат.НаселенныйПункт; - Улица = Результат.Улица; - - СтруктураАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураПолейАдреса();; - УправлениеКонтактнойИнформацией.ПриОпределенииСтруктурыАдреса(СтруктураАдреса, КодАдресногоЭлемента); - КонецЕсли; - - // Заполняем структуру загруженных по региону - СтруктураЗагруженных = ЗагруженныеПоляПоРегиону(СтруктураАдреса); - Результат.Вставить("СтруктураЗагруженных", СтруктураЗагруженных); - Результат.Вставить("СтруктураАдреса", СтруктураАдреса); - - Возврат Результат; - -КонецФункции - -&НаСервереБезКонтекста -Функция ЗагруженныеПоляПоРегиону(СтруктураАдреса) - - РегионЗагружен = Ложь; - УправлениеКонтактнойИнформацией.ПриОпределенииЗагруженностиАдресногоЭлемента(РегионЗагружен, СтруктураАдреса.Регион); - - Если РегионЗагружен Тогда - - СтруктураЗагруженных = Неопределено; - УправлениеКонтактнойИнформацией.ПриОпределенииСтруктурыЗагруженныхЭлементовАдреса(СтруктураЗагруженных, - СтруктураАдреса.Регион, СтруктураАдреса.Район, СтруктураАдреса.Город, СтруктураАдреса.НаселенныйПункт, СтруктураАдреса.Улица); - - Возврат СтруктураЗагруженных; - - Иначе - - Возврат Новый Структура("Регион", Ложь); - - КонецЕсли; - -КонецФункции diff --git a/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo b/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo deleted file mode 100644 index 6efa68826..000000000 --- a/SSL/src/CommonForms/ПоискПоИндексу/ПоискПоИндексу.mdo +++ /dev/null @@ -1,11 +0,0 @@ - - - ПоискПоИндексу - - ru - Поиск по индексу - - PersonalComputer - MobileDevice - true - diff --git a/SSL/src/CommonForms/ПользователиСервиса/Form.form b/SSL/src/CommonForms/ПользователиСервиса/Form.form index a055024c1..6be283eba 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Form.form +++ b/SSL/src/CommonForms/ПользователиСервиса/Form.form @@ -35,8 +35,8 @@ None - ПользователиСервисаДобавитьРасширеннаяПодсказка - 35 + ПользователиСервисаДобавитьExtendedTooltip + 26 Label true true @@ -68,8 +68,8 @@ ПользователиСервиса.Имя - ПользователиСервисаИмяРасширеннаяПодсказка - 37 + ПользователиСервисаИмяExtendedTooltip + 27 Label true true @@ -104,8 +104,8 @@ ПользователиСервиса.ПолноеИмя - ПользователиСервисаПолноеИмяРасширеннаяПодсказка - 39 + ПользователиСервисаПолноеИмяExtendedTooltip + 28 Label true true @@ -139,8 +139,8 @@ ПользователиСервиса.Идентификатор - ПользователиСервисаИдентификаторРасширеннаяПодсказка - 41 + ПользователиСервисаИдентификаторExtendedTooltip + 29 Label true true @@ -175,8 +175,8 @@ ПользователиСервиса.Доступ - ПользователиСервисаДоступРасширеннаяПодсказка - 43 + ПользователиСервисаДоступExtendedTooltip + 30 Label true true @@ -209,7 +209,7 @@ true - ПользователиСервисаУстановитьВсеРасширеннаяПодсказка + ПользователиСервисаУстановитьВсеExtendedTooltip 23 Label true @@ -235,7 +235,7 @@ true - ПользователиСервисаСнятьВсеРасширеннаяПодсказка + ПользователиСервисаСнятьВсеExtendedTooltip 24 Label true @@ -257,10 +257,10 @@ ПользователиСервисаСтрокаПоиска - 26 + 34 ПользователиСервисаСтрокаПоискаРасширеннаяПодсказка - 28 + 36 Label true true @@ -270,7 +270,7 @@ ПользователиСервисаСтрокаПоискаКонтекстноеМеню - 27 + 35 true ПользователиСервиса @@ -280,10 +280,10 @@ ПользователиСервисаСостояниеПросмотра - 29 + 37 ПользователиСервисаСостояниеПросмотраРасширеннаяПодсказка - 31 + 39 Label true true @@ -293,7 +293,7 @@ ПользователиСервисаСостояниеПросмотраКонтекстноеМеню - 30 + 38 true ViewStatusAddition @@ -304,10 +304,10 @@ ПользователиСервисаУправлениеПоиском - 32 + 40 ПользователиСервисаУправлениеПоискомРасширеннаяПодсказка - 34 + 42 Label true true @@ -317,7 +317,7 @@ ПользователиСервисаУправлениеПоискомКонтекстноеМеню - 33 + 41 true SearchControlAddition @@ -327,7 +327,7 @@ - ПользователиСервисаРасширеннаяПодсказка + ПользователиСервисаExtendedTooltip 25 Label true @@ -379,8 +379,8 @@ true - ДобавитьВыбранныхПользователейРасширеннаяПодсказка - 54 + ДобавитьВыбранныхПользователейExtendedTooltip + 32 Label true true @@ -405,8 +405,8 @@ true - ОтменаРасширеннаяПодсказка - 55 + ОтменаExtendedTooltip + 33 Label true true @@ -435,8 +435,8 @@ Группа кнопки действий - ГруппаКнопкиДействийРасширеннаяПодсказка - 53 + ГруппаКнопкиДействийExtendedTooltip + 31 Label true true @@ -457,10 +457,6 @@ Left true - - ChoiceProcessing - ОбработкаВыбора - OnOpen ПриОткрытии diff --git a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl index 8fd9ec57f..ada89a4ee 100644 --- a/SSL/src/CommonForms/ПользователиСервиса/Module.bsl +++ b/SSL/src/CommonForms/ПользователиСервиса/Module.bsl @@ -22,20 +22,11 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) - ПодключитьОбработчикОжидания("ОткрытьФормуАутентификацияВСервисе", 0.1, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АутентификацияВСервисе") Тогда - Если ВыбранноеЗначение = Неопределено Тогда - ПодключитьОбработчикОжидания("ЗакрытьЭтуФорму", 0.1, Истина); - Иначе - ПарольПользователяСервиса = ВыбранноеЗначение; - ПодготовитьФорму(); - КонецЕсли; + Если ПарольПользователяСервиса = Неопределено Тогда + Отказ = Истина; + ПодключитьОбработчикОжидания("ЗапроситьПарольДляАутентификацииВСервисе", 0.1, Истина); + Иначе + ПодготовитьФорму(); КонецЕсли; КонецПроцедуры @@ -75,16 +66,20 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаКлиенте -Процедура ОткрытьФормуАутентификацияВСервисе() +Процедура ЗапроситьПарольДляАутентификацииВСервисе() - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе(ЭтаФорма); + СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + Новый ОписаниеОповещения("ПриОткрытииПродолжение", ЭтотОбъект)); КонецПроцедуры &НаКлиенте -Процедура ЗакрытьЭтуФорму() +Процедура ПриОткрытииПродолжение(НовыйПарольПользователяСервиса, Неопределен) Экспорт - Закрыть(); + Если НовыйПарольПользователяСервиса <> Неопределено Тогда + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; + Открыть(); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/ПраваДоступа/Form.form b/SSL/src/CommonForms/ПраваДоступа/Form.form index 1b76a040f..a68b720ba 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Form.form +++ b/SSL/src/CommonForms/ПраваДоступа/Form.form @@ -12,7 +12,7 @@ true - НедостаточноПравНаПросмотрРасширеннаяПодсказка + НедостаточноПравНаПросмотрExtendedTooltip 116 Label true @@ -73,8 +73,8 @@ ГруппыДоступа.Наименование - ГруппыДоступаНаименованиеРасширеннаяПодсказка - 134 + ГруппыДоступаНаименованиеExtendedTooltip + 125 Label true true @@ -114,8 +114,8 @@ ГруппыДоступа.ПрофильНаименование - ГруппыДоступаПрофильПредставлениеРасширеннаяПодсказка - 136 + ГруппыДоступаПрофильПредставлениеExtendedTooltip + 126 Label true true @@ -155,8 +155,8 @@ ГруппыДоступа.Ответственный - ГруппыДоступаОтветственныйРасширеннаяПодсказка - 138 + ГруппыДоступаОтветственныйExtendedTooltip + 127 Label true true @@ -196,7 +196,7 @@ true - ГруппыДоступаВключитьВГруппуРасширеннаяПодсказка + ГруппыДоступаВключитьВГруппуExtendedTooltip 121 Label true @@ -222,7 +222,7 @@ true - ГруппыДоступаИсключитьИзГруппыРасширеннаяПодсказка + ГруппыДоступаИсключитьИзГруппыExtendedTooltip 122 Label true @@ -248,7 +248,7 @@ true - ГруппыДоступаИзменитьГруппуРасширеннаяПодсказка + ГруппыДоступаИзменитьГруппуExtendedTooltip 123 Label true @@ -277,10 +277,10 @@ ГруппыДоступаСтрокаПоиска - 125 + 138 ГруппыДоступаСтрокаПоискаРасширеннаяПодсказка - 127 + 140 Label true true @@ -290,7 +290,7 @@ ГруппыДоступаСтрокаПоискаКонтекстноеМеню - 126 + 139 true ГруппыДоступа @@ -300,10 +300,10 @@ ГруппыДоступаСостояниеПросмотра - 128 + 141 ГруппыДоступаСостояниеПросмотраРасширеннаяПодсказка - 130 + 143 Label true true @@ -313,7 +313,7 @@ ГруппыДоступаСостояниеПросмотраКонтекстноеМеню - 129 + 142 true ViewStatusAddition @@ -324,10 +324,10 @@ ГруппыДоступаУправлениеПоиском - 131 + 144 ГруппыДоступаУправлениеПоискомРасширеннаяПодсказка - 133 + 146 Label true true @@ -337,7 +337,7 @@ ГруппыДоступаУправлениеПоискомКонтекстноеМеню - 132 + 145 true SearchControlAddition @@ -347,7 +347,7 @@ - ГруппыДоступаРасширеннаяПодсказка + ГруппыДоступаExtendedTooltip 124 Label true @@ -368,7 +368,7 @@ true - ГруппыДоступаКонтекстноеМенюИзменитьГруппуРасширеннаяПодсказка + ГруппыДоступаКонтекстноеМенюИзменитьГруппуExtendedTooltip 119 Label true @@ -401,7 +401,7 @@ Группы доступа контекстное авто меню - ГруппыДоступаКонтекстноеАвтоМенюРасширеннаяПодсказка + ГруппыДоступаКонтекстноеАвтоМенюExtendedTooltip 120 Label true @@ -468,8 +468,8 @@ Описание выбранной группы доступа - ГруппыДоступаОписаниеПредставлениеРасширеннаяПодсказка - 148 + ГруппыДоступаОписаниеПредставлениеExtendedTooltip + 128 Label true true @@ -482,16 +482,23 @@ 82 true - LabelField + InputField + true Enter true Left true - + true 2 true false + true + true + true + true + true + Normal @@ -510,8 +517,8 @@ true - ЕстьЗапрещенныеГруппыКартинкаРасширеннаяПодсказка - 151 + ЕстьЗапрещенныеГруппыКартинкаExtendedTooltip + 130 Label true true @@ -549,8 +556,8 @@ true - ЕстьЗапрещенныеГруппыТекстРасширеннаяПодсказка - 152 + ЕстьЗапрещенныеГруппыТекстExtendedTooltip + 131 Label true true @@ -581,8 +588,8 @@ Предупреждение есть скрытые группы доступа - ПредупреждениеЕстьСкрытыеГруппыДоступаРасширеннаяПодсказка - 150 + ПредупреждениеЕстьСкрытыеГруппыДоступаExtendedTooltip + 129 Label true true @@ -609,7 +616,7 @@ Группы доступа - ГруппыДоступаПользователяРасширеннаяПодсказка + ГруппыДоступаПользователяExtendedTooltip 118 Label true @@ -667,8 +674,8 @@ Роли.Пометка - РолиПометкаРасширеннаяПодсказка - 166 + РолиПометкаExtendedTooltip + 136 Label true true @@ -698,8 +705,8 @@ Роли.Синоним - РолиСинонимРасширеннаяПодсказка - 168 + РолиСинонимExtendedTooltip + 137 Label true true @@ -742,8 +749,8 @@ Роли колонок - РолиКолонокРасширеннаяПодсказка - 165 + РолиКолонокExtendedTooltip + 135 Label true true @@ -770,8 +777,8 @@ true - РолиПоказатьПодсистемыРолейРасширеннаяПодсказка - 154 + РолиПоказатьПодсистемыРолейExtendedTooltip + 133 Label true true @@ -791,32 +798,9 @@ РолиСтрокаПоиска - 156 - - РолиСтрокаПоискаРасширеннаяПодсказка - 158 - Label - true - true - - Left - - - - РолиСтрокаПоискаКонтекстноеМеню - 157 - true - - Роли - - true - - - - РолиСостояниеПросмотра 159 - РолиСостояниеПросмотраРасширеннаяПодсказка + РолиСтрокаПоискаРасширеннаяПодсказка 161 Label true @@ -826,10 +810,33 @@ - РолиСостояниеПросмотраКонтекстноеМеню + РолиСтрокаПоискаКонтекстноеМеню 160 true + Роли + + true + + + + РолиСостояниеПросмотра + 162 + + РолиСостояниеПросмотраРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + РолиСостояниеПросмотраКонтекстноеМеню + 163 + true + ViewStatusAddition Роли @@ -838,10 +845,10 @@ РолиУправлениеПоиском - 162 + 165 РолиУправлениеПоискомРасширеннаяПодсказка - 164 + 167 Label true true @@ -851,7 +858,7 @@ РолиУправлениеПоискомКонтекстноеМеню - 163 + 166 true SearchControlAddition @@ -861,8 +868,8 @@ - РолиРасширеннаяПодсказка - 155 + РолиExtendedTooltip + 134 Label true true @@ -915,8 +922,8 @@ 48 - ОтображениеРолейРасширеннаяПодсказка - 153 + ОтображениеРолейExtendedTooltip + 132 Label true true @@ -944,7 +951,7 @@ Группы доступа и роли - ГруппыДоступаИРолиРасширеннаяПодсказка + ГруппыДоступаИРолиExtendedTooltip 117 Label true @@ -970,7 +977,7 @@ true - ФормаВключитьВГруппуРасширеннаяПодсказка + ФормаВключитьВГруппуExtendedTooltip 109 Label true @@ -995,7 +1002,7 @@ true - ФормаИсключитьИзГруппыРасширеннаяПодсказка + ФормаИсключитьИзГруппыExtendedTooltip 110 Label true @@ -1020,7 +1027,7 @@ true - ФормаИзменитьГруппуРасширеннаяПодсказка + ФормаИзменитьГруппуExtendedTooltip 111 Label true @@ -1046,7 +1053,7 @@ true - ФормаОтчетПраваДоступаРасширеннаяПодсказка + ФормаОтчетПраваДоступаExtendedTooltip 112 Label true @@ -1080,7 +1087,7 @@ Панель формы - ПанельФормыРасширеннаяПодсказка + ПанельФормыExtendedTooltip 113 Label true @@ -1102,7 +1109,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 114 Label true @@ -1128,7 +1135,7 @@ true - ФормаОбновитьРасширеннаяПодсказка + ФормаОбновитьExtendedTooltip 115 Label true @@ -1148,10 +1155,6 @@ Left - - ChoiceProcessing - ОбработкаВыбора - NotificationProcessing ОбработкаОповещения @@ -1528,23 +1531,6 @@ true - - ПолучениеПароляВключитьВГруппуДоступаАдминистраторы - - <key>ru</key> - <value>Получение пароля включить в группу доступа администраторы</value> - - 8 - - Boolean - - - true - - - true - - ВключитьВГруппу diff --git a/SSL/src/CommonForms/ПраваДоступа/Module.bsl b/SSL/src/CommonForms/ПраваДоступа/Module.bsl index c6266e294..42b249e1f 100644 --- a/SSL/src/CommonForms/ПраваДоступа/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступа/Module.bsl @@ -77,7 +77,7 @@ ИЛИ ВРег(ИмяСобытия) = ВРег("Запись_ГруппыВнешнихПользователей") Тогда ВывестиГруппыДоступа(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -89,63 +89,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Справочник.ГруппыДоступа.Форма.ВыборПоОтветственному") Тогда - - Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.ГруппыДоступа") - И ЗначениеЗаполнено(ВыбранноеЗначение) Тогда - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено - И ВыбранноеЗначение = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - - ПарольЕщеНеВведен = Ложь; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); - - Если ПарольЕщеНеВведен Тогда - ПолучениеПароляВключитьВГруппуДоступаАдминистраторы = Истина; - Возврат; - КонецЕсли; - КонецЕсли; - - ОписаниеОшибки = ""; - ИзменитьСоставГруппы(ВыбранноеЗначение, Истина, ОписаниеОшибки); - Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда - Предупреждение(ОписаниеОшибки); - Иначе - ОповеститьОбИзменении(ВыбранноеЗначение); - Оповестить("Запись_ГруппыДоступа", Новый Структура, ВыбранноеЗначение); - КонецЕсли; - - КонецЕсли; - - ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АутентификацияВСервисе") Тогда - - Если ВыбранноеЗначение <> Неопределено Тогда - ПарольПользователяСервиса = ВыбранноеЗначение; - - ОписаниеОшибки = ""; - ИзменитьСоставГруппы( - ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы"), - ПолучениеПароляВключитьВГруппуДоступаАдминистраторы, - ОписаниеОшибки); - - Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда - Предупреждение(ОписаниеОшибки); - Иначе - ОповеститьОбИзменении( - ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы")); - - Оповестить("Запись_ГруппыДоступа", Новый Структура, ВыбранноеЗначение); - КонецЕсли; - - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ГруппыДоступа @@ -199,7 +142,8 @@ ПараметрыФормы.Вставить("Выбранные", Выбранные); ПараметрыФормы.Вставить("ПользовательГрупп", Параметры.Пользователь); - ОткрытьФорму("Справочник.ГруппыДоступа.Форма.ВыборПоОтветственному", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Справочник.ГруппыДоступа.Форма.ВыборПоОтветственному", ПараметрыФормы, ЭтотОбъект, + ,,, Новый ОписаниеОповещения("ВключитьИсключитьИзГруппы", ЭтотОбъект, Истина)); КонецПроцедуры @@ -207,31 +151,11 @@ Процедура ИсключитьИзГруппы(Команда) Если НЕ ЗначениеЗаполнено(ТекущаяГруппаДоступа) Тогда - Предупреждение(НСтр("ru = 'Группа доступа не выбрана.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Группа доступа не выбрана.'")); Возврат; КонецЕсли; - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено - И ТекущаяГруппаДоступа = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда - - ПарольЕщеНеВведен = Ложь; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); - - Если ПарольЕщеНеВведен Тогда - ПолучениеПароляВключитьВГруппуДоступаАдминистраторы = Ложь; - Возврат; - КонецЕсли; - КонецЕсли; - - ОписаниеОшибки = ""; - ИзменитьСоставГруппы(ТекущаяГруппаДоступа, Ложь, ОписаниеОшибки); - Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда - Предупреждение(ОписаниеОшибки); - Иначе - ОповеститьОбИзменении(ТекущаяГруппаДоступа); - Оповестить("Запись_ГруппыДоступа", Новый Структура, ТекущаяГруппаДоступа); - КонецЕсли; + ВключитьИсключитьИзГруппы(ТекущаяГруппаДоступа, Ложь); КонецПроцедуры @@ -241,7 +165,7 @@ ПараметрыФормы = Новый Структура; Если НЕ ЗначениеЗаполнено(ТекущаяГруппаДоступа) Тогда - Предупреждение(НСтр("ru = 'Группа доступа не выбрана.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Группа доступа не выбрана.'")); Возврат; ИначеЕсли ПользовательИБПолноправный @@ -251,10 +175,9 @@ ПараметрыФормы.Вставить("Ключ", ТекущаяГруппаДоступа); ОткрытьФорму("Справочник.ГруппыДоступа.ФормаОбъекта", ПараметрыФормы); Иначе - Предупреждение(НСтр("ru = 'Невозможно изменить группу доступа, - |так как текущий пользователь - |не ответственный за участников группы доступа и - |не полноправный администратор.'")); + ПоказатьПредупреждение(, + НСтр("ru = 'Недостаточно прав для редактирования группы доступа. + |Редактировать группу доступа могут ответственный за участников группы доступа и администратор.'")); Возврат; КонецЕсли; @@ -264,7 +187,7 @@ Процедура Обновить(Команда) ВывестиГруппыДоступа(); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры @@ -285,13 +208,67 @@ Процедура ГруппировкаРолейПоПодсистемам(Команда) ОбработатьИнтерфейсРолей("ГруппировкаПоПодсистемам"); - ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтаФорма); + ПользователиСлужебныйКлиент.РазвернутьПодсистемыРолей(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ВключитьИсключитьИзГруппы(ГруппаДоступа, ВключитьВГруппуДоступа) Экспорт + + Если ТипЗнч(ГруппаДоступа) <> Тип("СправочникСсылка.ГруппыДоступа") + ИЛИ НЕ ЗначениеЗаполнено(ГруппаДоступа) Тогда + + Возврат; + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ГруппаДоступа", ГруппаДоступа); + ДополнительныеПараметры.Вставить("ВключитьВГруппуДоступа", ВключитьВГруппуДоступа); + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + И ГруппаДоступа = ПредопределенноеЗначение("Справочник.ГруппыДоступа.Администраторы") Тогда + + СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + Новый ОписаниеОповещения( + "ВключитьИсключитьИзГруппыЗавершение", ЭтотОбъект, ДополнительныеПараметры), + ЭтотОбъект, + ПарольПользователяСервиса); + Возврат; + Иначе + ВключитьИсключитьИзГруппыЗавершение("", ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВключитьИсключитьИзГруппыЗавершение(НовыйПарольПользователяСервиса, ДополнительныеПараметры) Экспорт + + Если НовыйПарольПользователяСервиса = Неопределено Тогда + Возврат; + КонецЕсли; + + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; + + ОписаниеОшибки = ""; + + ИзменитьСоставГруппы( + ДополнительныеПараметры.ГруппаДоступа, + ДополнительныеПараметры.ВключитьВГруппуДоступа, + ОписаниеОшибки); + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ПоказатьПредупреждение(, ОписаниеОшибки); + Иначе + ОповеститьОбИзменении(ДополнительныеПараметры.ГруппаДоступа); + Оповестить("Запись_ГруппыДоступа", Новый Структура, ДополнительныеПараметры.ГруппаДоступа); + КонецЕсли; + +КонецПроцедуры + + &НаСервере Процедура ВывестиГруппыДоступа() @@ -463,7 +440,12 @@ КонецЕсли; КонецЕсли; - ГруппаДоступаОбъект.Записать(); + Попытка + ГруппаДоступаОбъект.Записать(); + Исключение + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + КонецПопытки; РазблокироватьДанныеДляРедактирования(ГруппаДоступаОбъект.Ссылка); @@ -581,16 +563,13 @@ ПараметрыДействия = Новый Структура; ПараметрыДействия.Вставить("ОсновнойПараметр", ОсновнойПараметр); - ПараметрыДействия.Вставить("Форма", ЭтаФорма); + ПараметрыДействия.Вставить("Форма", ЭтотОбъект); ПараметрыДействия.Вставить("КоллекцияРолей", ПрочитанныеРоли); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательОбластиДанных); - Иначе - ПараметрыДействия.Вставить("ТипПользователей", - Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); - КонецЕсли; + ТипПользователей = ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), + Перечисления.ТипыПользователей.ПользовательОбластиДанных, + Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); + ПараметрыДействия.Вставить("ТипПользователей", ТипПользователей); ПользователиСлужебный.ОбработатьИнтерфейсРолей(Действие, ПараметрыДействия); diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form index 84778893b..943d5e3ee 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Form.form @@ -12,7 +12,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НедостаточноПравНаПросмотрРасширеннаяПодсказка</name> + <name>НедостаточноПравНаПросмотрExtendedTooltip</name> <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -76,8 +76,8 @@ <name>ПрофилиПометкаПриИзменении</name> </handlers> <extendedTooltip> - <name>ПрофилиПометкаРасширеннаяПодсказка</name> - <id>89</id> + <name>ПрофилиПометкаExtendedTooltip</name> + <id>80</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -108,8 +108,8 @@ <segments>Профили.ПрофильПредставление</segments> </dataPath> <extendedTooltip> - <name>ПрофилиПрофильПредставлениеРасширеннаяПодсказка</name> - <id>91</id> + <name>ПрофилиПрофильПредставлениеExtendedTooltip</name> + <id>81</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -149,10 +149,10 @@ </handlers> <searchStringAddition> <name>ПрофилиСтрокаПоиска</name> - <id>80</id> + <id>112</id> <extendedTooltip> <name>ПрофилиСтрокаПоискаРасширеннаяПодсказка</name> - <id>82</id> + <id>114</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -162,7 +162,7 @@ </extendedTooltip> <contextMenu> <name>ПрофилиСтрокаПоискаКонтекстноеМеню</name> - <id>81</id> + <id>113</id> <autoFill>true</autoFill> </contextMenu> <source>Профили</source> @@ -172,10 +172,10 @@ </searchStringAddition> <viewStatusAddition> <name>ПрофилиСостояниеПросмотра</name> - <id>83</id> + <id>115</id> <extendedTooltip> <name>ПрофилиСостояниеПросмотраРасширеннаяПодсказка</name> - <id>85</id> + <id>117</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -185,7 +185,7 @@ </extendedTooltip> <contextMenu> <name>ПрофилиСостояниеПросмотраКонтекстноеМеню</name> - <id>84</id> + <id>116</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -196,10 +196,10 @@ </viewStatusAddition> <searchControlAddition> <name>ПрофилиУправлениеПоиском</name> - <id>86</id> + <id>118</id> <extendedTooltip> <name>ПрофилиУправлениеПоискомРасширеннаяПодсказка</name> - <id>88</id> + <id>120</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -209,7 +209,7 @@ </extendedTooltip> <contextMenu> <name>ПрофилиУправлениеПоискомКонтекстноеМеню</name> - <id>87</id> + <id>119</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -219,7 +219,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ПрофилиРасширеннаяПодсказка</name> + <name>ПрофилиExtendedTooltip</name> <id>79</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -274,8 +274,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>НадписьПрофильРасширеннаяПодсказка</name> - <id>102</id> + <name>НадписьПрофильExtendedTooltip</name> + <id>83</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -334,7 +334,7 @@ <excludedCommands>SortListAsc</excludedCommands> <excludedCommands>SortListDesc</excludedCommands> <items xsi:type="form:FormField"> - <name>ВидыДоступаВидДоступа</name> + <name>ВидыДоступаВидДоступаПредставление</name> <id>56</id> <visible>true</visible> <enabled>true</enabled> @@ -342,15 +342,15 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>ВидыДоступа.ВидДоступа</segments> + <segments>ВидыДоступа.ВидДоступаПредставление</segments> </dataPath> <toolTip> <key>ru</key> <value>Вид доступа изменяется только в профиле</value> </toolTip> <extendedTooltip> - <name>ВидыДоступаВидДоступаРасширеннаяПодсказка</name> - <id>118</id> + <name>ВидыДоступаВидДоступаПредставлениеРасширеннаяПодсказка</name> + <id>89</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -359,7 +359,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ВидыДоступаВидДоступаКонтекстноеМеню</name> + <name>ВидыДоступаВидДоступаПредставлениеКонтекстноеМеню</name> <id>57</id> <autoFill>true</autoFill> </contextMenu> @@ -372,6 +372,7 @@ <extInfo xsi:type="form:InputFieldExtInfo"> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> + <listChoiceMode>true</listChoiceMode> <chooseType>true</chooseType> <typeDomainEnabled>true</typeDomainEnabled> <textEdit>true</textEdit> @@ -379,19 +380,15 @@ </extInfo> </items> <items xsi:type="form:FormField"> - <name>ВидыДоступаИспользование</name> + <name>ВидыДоступаВсеРазрешеныПредставление</name> <id>58</id> - <title> - <key>ru</key> - <value>Значения доступа</value> - true true true - ВидыДоступа.Использование + ВидыДоступа.ВсеРазрешеныПредставление ru @@ -399,11 +396,11 @@ OnChange - ВидыДоступаИспользованиеПриИзменении + ВидыДоступаВсеРазрешеныПредставлениеПриИзменении - ВидыДоступаИспользованиеРасширеннаяПодсказка - 120 + ВидыДоступаВсеРазрешеныПредставлениеРасширеннаяПодсказка + 90 Label true true @@ -412,7 +409,7 @@ - ВидыДоступаИспользованиеКонтекстноеМеню + ВидыДоступаВсеРазрешеныПредставлениеКонтекстноеМеню 59 true @@ -422,42 +419,18 @@ Left true - - StartChoice - ВидыДоступаИспользованиеНачалоВыбора - - - Clearing - ВидыДоступаИспользованиеОчистка - ChoiceProcessing - ВидыДоступаИспользованиеОбработкаВыбора + ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора 30 true true true + true true true - - - ru - Все запрещены - - - ВсеЗапрещены - - - - - ru - Все разрешены - - - ВсеРазрешены - - + true Normal @@ -474,8 +447,8 @@ true - ВидыДоступаИзменитьРасширеннаяПодсказка - 106 + ВидыДоступаИзменитьExtendedTooltip + 86 Label true true @@ -500,8 +473,8 @@ true - ВидыДоступаЗакончитьРедактированиеРасширеннаяПодсказка - 107 + ВидыДоступаЗакончитьРедактированиеExtendedTooltip + 87 Label true true @@ -531,16 +504,20 @@ OnActivateRow ВидыДоступаПриАктивизацииСтроки + + OnStartEdit + ВидыДоступаПриНачалеРедактирования + OnActivateCell ВидыДоступаПриАктивизацииЯчейки ВидыДоступаСтрокаПоиска - 109 + 132 ВидыДоступаСтрокаПоискаРасширеннаяПодсказка - 111 + 134 Label true true @@ -550,7 +527,7 @@ ВидыДоступаСтрокаПоискаКонтекстноеМеню - 110 + 133 true ВидыДоступа @@ -560,10 +537,10 @@ ВидыДоступаСостояниеПросмотра - 112 + 135 ВидыДоступаСостояниеПросмотраРасширеннаяПодсказка - 114 + 137 Label true true @@ -573,7 +550,7 @@ ВидыДоступаСостояниеПросмотраКонтекстноеМеню - 113 + 136 true ViewStatusAddition @@ -584,10 +561,10 @@ ВидыДоступаУправлениеПоиском - 115 + 138 ВидыДоступаУправлениеПоискомРасширеннаяПодсказка - 117 + 140 Label true true @@ -597,7 +574,7 @@ ВидыДоступаУправлениеПоискомКонтекстноеМеню - 116 + 139 true SearchControlAddition @@ -607,8 +584,8 @@ - ВидыДоступаРасширеннаяПодсказка - 108 + ВидыДоступаExtendedTooltip + 88 Label true true @@ -628,8 +605,8 @@ true - ВидыДоступаКонтекстноеМенюИзменитьРасширеннаяПодсказка - 104 + ВидыДоступаКонтекстноеМенюИзменитьExtendedTooltip + 84 Label true true @@ -654,8 +631,8 @@ true - ВидыДоступаКонтекстноеМенюЗакончитьРедактированиеРасширеннаяПодсказка - 105 + ВидыДоступаКонтекстноеМенюЗакончитьРедактированиеExtendedTooltip + 85 Label true true @@ -672,6 +649,7 @@ Auto + 45 true 10 true @@ -703,25 +681,117 @@ ЗначенияДоступаПоВидуДоступа 21 - - ГоризонтальнаяГруппа - 22 + + НадписьВидДоступа + 23 + true + true + + true + + + НадписьВидДоступа + + None + Ctrl+S + + НадписьВидДоступаExtendedTooltip + 93 + Label + true + true + + Left + + + + НадписьВидДоступаКонтекстноеМеню + 24 + true + + LabelField + Enter + true + Left + true + + true + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ТекстВидДоступаНеИспользуется + 107 + + <key>ru</key> + <value>В данный момент не используется, т.к. эта возможность отключена в программе.</value> + + true + + true + + + ТекстВидДоступаНеИспользуетсяExtendedTooltip + 109 + Label + true + true + + Left + + + + ТекстВидДоступаНеИспользуетсяКонтекстноеМеню + 108 + true + + Label + true + true + + Left + + + + ЗначенияДоступа + 27 + true + true + + true + + + ЗначенияДоступа + + false + None + Copy + CopyToClipboard + EndEdit + OutputList + SelectAll - НадписьВидДоступа - 23 + ЗначенияДоступаНомерСтрокиПоВиду + 62 true true true - НадписьВидДоступа + ЗначенияДоступа.НомерСтрокиПоВиду - None - Ctrl+S - НадписьВидДоступаРасширеннаяПодсказка - 132 + ЗначенияДоступаНомерСтрокиПоВидуРасширеннаяПодсказка + 105 Label true true @@ -730,428 +800,96 @@ - НадписьВидДоступаКонтекстноеМеню - 24 + ЗначенияДоступаНомерСтрокиПоВидуКонтекстноеМеню + 63 true LabelField - Enter + Auto true Left true + 3 true true - true - - System.DefaultGUIFont - true - false - false - false - - true - true - - true - - - <key>ru</key> - <value>Горизонтальная группа</value> - - - ГоризонтальнаяГруппаРасширеннаяПодсказка - 131 - Label - true - true - - Left + + ЗначенияДоступаЗначениеДоступа + 64 + true + true + + true + + + ЗначенияДоступа.ЗначениеДоступа + + + ЗначенияДоступаЗначениеДоступаРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + ЗначенияДоступаЗначениеДоступаКонтекстноеМеню + 65 + true + + InputField + Auto + true + Left + true + + + AutoComplete + ЗначениеДоступаАвтоПодбор + + + StartChoice + ЗначениеДоступаНачалоВыбора + + + Clearing + ЗначениеДоступаОчистка + + + TextEditEnd + ЗначениеДоступаОкончаниеВводаТекста + + + ChoiceProcessing + ЗначениеДоступаОбработкаВыбора + + true + true + true + true + true + Normal - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ТипыВидовДоступа - 25 - - ОбычныйВидДоступа - 26 - - ЗначенияДоступа - 27 + + + ЗначенияДоступаКоманднаяПанель + 29 + + ЗначенияДоступаДобавить + 36 true true true - - ЗначенияДоступа - false - None - Copy - CopyToClipboard - EndEdit - OutputList - SelectAll - - НомерСтрокиПоВиду - 62 - true - true - - true - - - ЗначенияДоступа.НомерСтрокиПоВиду - - - НомерСтрокиПоВидуРасширеннаяПодсказка - 154 - Label - true - true - - Left - - - - НомерСтрокиПоВидуКонтекстноеМеню - 63 - true - - LabelField - Auto - true - Left - true - - 3 - true - true - - - - ЗначениеДоступа - 64 - true - true - - true - - - ЗначенияДоступа.ЗначениеДоступа - - - ЗначениеДоступаРасширеннаяПодсказка - 156 - Label - true - true - - Left - - - - ЗначениеДоступаКонтекстноеМеню - 65 - true - - InputField - Auto - true - Left - true - - - AutoComplete - ЗначениеДоступаАвтоПодбор - - - StartChoice - ЗначениеДоступаНачалоВыбора - - - Clearing - ЗначениеДоступаОчистка - - - TextEditEnd - ЗначениеДоступаОкончаниеВводаТекста - - - ChoiceProcessing - ЗначениеДоступаОбработкаВыбора - - true - true - true - true - true - Normal - - - - ЗначенияДоступаКоманднаяПанель - 29 - - ЗначенияДоступаДобавить - 36 - true - true - - true - - false - - ЗначенияДоступаДобавитьРасширеннаяПодсказка - 138 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Add - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаУдалить - 37 - true - true - - true - - false - - ЗначенияДоступаУдалитьРасширеннаяПодсказка - 139 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Delete - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаПереместитьВверх - 40 - true - true - - true - - false - - ЗначенияДоступаПереместитьВверхРасширеннаяПодсказка - 140 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.MoveUp - Normal - Auto - true - true - UserCmds - Auto - - - ЗначенияДоступаПереместитьВниз - 41 - true - true - - true - - false - - ЗначенияДоступаПереместитьВнизРасширеннаяПодсказка - 141 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.MoveDown - Normal - Auto - true - true - UserCmds - Auto - - - СортироватьСписокПоВозрастанию - 42 - true - true - - true - - false - - СортироватьСписокПоВозрастаниюРасширеннаяПодсказка - 142 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - - СортироватьСписокПоУбыванию - 43 - true - true - - true - - false - - СортироватьСписокПоУбываниюРасширеннаяПодсказка - 143 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - - Left - - - OnStartEdit - ЗначенияДоступаПриНачалеРедактирования - - - OnChange - ЗначенияДоступаПриИзменении - - - ЗначенияДоступаСтрокаПоиска - 145 - - ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка - 147 - Label - true - true - - Left - - - - ЗначенияДоступаСтрокаПоискаКонтекстноеМеню - 146 - true - - ЗначенияДоступа - - true - - - - ЗначенияДоступаСостояниеПросмотра - 148 - - ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка - 150 - Label - true - true - - Left - - - - ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню - 149 - true - - ViewStatusAddition - ЗначенияДоступа - - true - - - - ЗначенияДоступаУправлениеПоиском - 151 - - ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка - 153 - Label - true - true - - Left - - - - ЗначенияДоступаУправлениеПоискомКонтекстноеМеню - 152 - true - - SearchControlAddition - ЗначенияДоступа - - true - - - ЗначенияДоступаРасширеннаяПодсказка - 144 + ЗначенияДоступаДобавитьExtendedTooltip + 98 Label true true @@ -1159,210 +897,26 @@ Left - - ЗначенияДоступаКонтекстноеМеню - 28 - - КонтекстноеМенюЗначенияДоступаДобавить - 34 - true - true - - true - - false - - КонтекстноеМенюЗначенияДоступаДобавитьРасширеннаяПодсказка - 136 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Add - Normal - Auto - true - true - UserCmds - Auto - - - КонтекстноеМенюЗначенияДоступаУдалить - 35 - true - true - - true - - false - - КонтекстноеМенюЗначенияДоступаУдалитьРасширеннаяПодсказка - 137 - Label - true - true - - Left - - - Form.Item.ЗначенияДоступа.StandardCommand.Delete - Normal - Auto - true - true - UserCmds - Auto - - - true - true + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto true true - true - MultiRow - 1 - 1 - AutoUse - AutoUse - true - true - false - true - Auto - Auto - true - true - true - true - None - None - None - true - + UserCmds + Auto - true - true - - true - - - <key>ru</key> - <value>Обычный вид доступа</value> - - - ru - Обычный вид доступа - - - ОбычныйВидДоступаРасширеннаяПодсказка - 135 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - ВидДоступаЧерезПраваПоЗначениямДоступаИнформация - 44 - - Информация - 45 - - КартинкаИнформации - 46 - - <key>ru</key> - <value>Картинка информации</value> - - true - true - - true - - - КартинкаИнформацииРасширеннаяПодсказка - 168 - Label - true - true - - Left - - - - КартинкаИнформацииКонтекстноеМеню - 47 - true - - 3 - true - 2 - true - false - - - CommonPicture.Информация32 - - AutoSize - - - - ТекстИнформации - 48 - - <key>ru</key> - <value>Для настройки используется -команда "Права доступа" -в форме значения. - </value> - - true - true - - true - - - ТекстИнформацииРасширеннаяПодсказка - 169 - Label - true - true - - Left - - - - ТекстИнформацииКонтекстноеМеню - 49 - true - - Label - true - true - false - - Left - - + + ЗначенияДоступаУдалить + 37 true true true + false - ИнформацияРасширеннаяПодсказка - 167 + ЗначенияДоступаУдалитьExtendedTooltip + 99 Label true true @@ -1370,125 +924,26 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - ВидДоступаЧерезПраваПоЗначениямДоступаИнформацияРасширеннаяПодсказка - 166 - Label + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto true true - - Left - - - Page - - Vertical - - - - ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждение - 50 - - Предупреждение - 51 - - КартинкаПредупреждения - 52 - - <key>ru</key> - <value>Картинка предупреждения</value> - - true - true - - true - - - КартинкаПредупрежденияРасширеннаяПодсказка - 172 - Label - true - true - - Left - - - - КартинкаПредупрежденияКонтекстноеМеню - 53 - true - - 3 - true - 2 - true - false - - - CommonPicture.Предупреждение32 - - AutoSize - - - - ТекстПредупреждения - 54 - - <key>ru</key> - <value>Когда задано "Все разрешены" хотя бы в одной группе доступа, -для участников группы все права разрешены -независимо от настройки прав по значениям.</value> - - true - true - - true - - - ТекстПредупрежденияРасширеннаяПодсказка - 173 - Label - true - true - - Left - - - - ТекстПредупрежденияКонтекстноеМеню - 55 - true - - Label - true - true - false - - Left - - + UserCmds + Auto + + + ЗначенияДоступаПереместитьВверх + 40 true true true + false - ПредупреждениеРасширеннаяПодсказка - 171 + ЗначенияДоступаПереместитьВверхExtendedTooltip + 100 Label true true @@ -1496,23 +951,117 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - + Form.Item.ЗначенияДоступа.StandardCommand.MoveUp + Normal + Auto + true + true + UserCmds + Auto - true - true - - true - + + ЗначенияДоступаПереместитьВниз + 41 + true + true + + true + + false + + ЗначенияДоступаПереместитьВнизExtendedTooltip + 101 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.MoveDown + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьСписокПоВозрастанию + 42 + true + true + + true + + false + + СортироватьСписокПоВозрастаниюExtendedTooltip + 102 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьСписокПоУбыванию + 43 + true + true + + true + + false + + СортироватьСписокПоУбываниюExtendedTooltip + 103 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + Left + + + OnEditEnd + ЗначенияДоступаПриОкончанииРедактирования + + + OnStartEdit + ЗначенияДоступаПриНачалеРедактирования + + + OnChange + ЗначенияДоступаПриИзменении + + + ЗначенияДоступаСтрокаПоиска + 152 - ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждениеРасширеннаяПодсказка - 170 + ЗначенияДоступаСтрокаПоискаРасширеннаяПодсказка + 154 Label true true @@ -1520,23 +1069,67 @@ Left - Page - - Vertical + + ЗначенияДоступаСтрокаПоискаКонтекстноеМеню + 153 + true + + ЗначенияДоступа + + true - - true - true - - true - - - <key>ru</key> - <value>Типы видов доступа</value> - + + + ЗначенияДоступаСостояниеПросмотра + 155 + + ЗначенияДоступаСостояниеПросмотраРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + + ЗначенияДоступаСостояниеПросмотраКонтекстноеМеню + 156 + true + + ViewStatusAddition + ЗначенияДоступа + + true + + + + ЗначенияДоступаУправлениеПоиском + 158 + + ЗначенияДоступаУправлениеПоискомРасширеннаяПодсказка + 160 + Label + true + true + + Left + + + + ЗначенияДоступаУправлениеПоискомКонтекстноеМеню + 159 + true + + SearchControlAddition + ЗначенияДоступа + + true + + - ТипыВидовДоступаРасширеннаяПодсказка - 134 + ЗначенияДоступаExtendedTooltip + 104 Label true true @@ -1544,10 +1137,89 @@ Left - Pages - - Auto - + + ЗначенияДоступаКонтекстноеМеню + 28 + + КонтекстноеМенюЗначенияДоступаДобавить + 34 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаДобавитьExtendedTooltip + 96 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + КонтекстноеМенюЗначенияДоступаУдалить + 35 + true + true + + true + + false + + КонтекстноеМенюЗначенияДоступаУдалитьExtendedTooltip + 97 + Label + true + true + + Left + + + Form.Item.ЗначенияДоступа.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + None + None + None + true + true true @@ -1563,8 +1235,8 @@ Значения доступа по виду доступа - ЗначенияДоступаПоВидуДоступаРасширеннаяПодсказка - 130 + ЗначенияДоступаПоВидуДоступаExtendedTooltip + 91 Label true true @@ -1591,8 +1263,8 @@ Style.TextFont - ДоступРасширеннаяПодсказка - 101 + ДоступExtendedTooltip + 82 Label true true @@ -1624,7 +1296,7 @@ Права и ограничения - ПраваИОграниченияРасширеннаяПодсказка + ПраваИОграниченияExtendedTooltip 78 Label true @@ -1654,7 +1326,7 @@ true - ФормаЗаписатьРасширеннаяПодсказка + ФормаЗаписатьExtendedTooltip 75 Label true @@ -1680,7 +1352,7 @@ true - ФормаОтчетПраваДоступаРасширеннаяПодсказка + ФормаОтчетПраваДоступаExtendedTooltip 76 Label true @@ -1697,13 +1369,36 @@ UserCmds Auto + + ПоказыватьНеиспользуемыеВидыДоступа + 110 + true + true + + true + + + ПоказыватьНеиспользуемыеВидыДоступаExtendedTooltip + 111 + Label + true + true + + Left + + + Form.Command.ПоказыватьНеиспользуемыеВидыДоступа + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + Left true - - ChoiceProcessing - ОбработкаВыбора - BeforeClose ПередЗакрытием @@ -1796,6 +1491,23 @@ true + + ГруппаДоступа + + <key>ru</key> + <value>Группа доступа</value> + + 4 + + CatalogRef.ГруппыДоступа + + + true + + + true + + ВидыДоступа @@ -1815,13 +1527,14 @@ true - Профиль + ГруппаДоступа <key>ru</key> - <value>Профиль</value> + <value>Группа доступа</value> 1 + CatalogRef.ГруппыДоступа CatalogRef.ПрофилиГруппДоступа @@ -1839,7 +1552,7 @@ 2 - ChartOfCharacteristicTypesRef.ВидыДоступа + DefinedType.ЗначениеДоступа true @@ -1849,10 +1562,10 @@ - ДоступРазрешен + ВсеРазрешены <key>ru</key> - <value>Доступ разрешен</value> + <value>Все разрешены</value> 3 @@ -1866,12 +1579,12 @@ - Использование + ВидДоступаПредставление <key>ru</key> - <value>Использование</value> + <value>Вид доступа</value> - 4 + 6 String @@ -1884,14 +1597,15 @@ - ТекущийТипЗначенияДоступа + ВсеРазрешеныПредставление <key>ru</key> - <value>Текущий тип значения доступа</value> + <value>Значения доступа</value> - 5 + 7 - AnyRef + String + true @@ -1919,34 +1633,14 @@ true - НомерСтрокиПоВиду + ГруппаДоступа <key>ru</key> - <value>Номер строки по виду</value> - - 4 - - Number - - 10 - true - - - - true - - - true - - - - Профиль - - <key>ru</key> - <value>Профиль</value> + <value>Группа доступа</value> 5 + CatalogRef.ГруппыДоступа CatalogRef.ПрофилиГруппДоступа @@ -1964,7 +1658,7 @@ 6 - ChartOfCharacteristicTypesRef.ВидыДоступа + DefinedType.ЗначениеДоступа true @@ -1981,7 +1675,28 @@ 7 - Characteristic.ВидыДоступа + DefinedType.ЗначениеДоступа + + + true + + + true + + + + НомерСтрокиПоВиду + + <key>ru</key> + <value>Номер строки по виду</value> + + 1 + + Number + + 10 + true + true @@ -2009,77 +1724,6 @@ true - - ВидыДоступаЧерезПраваПоЗначениямДоступа - - <key>ru</key> - <value>Виды доступа через права по значениям доступа</value> - - 6 - - ValueList - - - true - - - true - - - - - - - ВидДоступаВнешниеПользователи - - <key>ru</key> - <value>Вид доступа внешние пользователи</value> - - 7 - - ChartOfCharacteristicTypesRef - - - true - - - true - - - - ВидДоступаПользователи - - <key>ru</key> - <value>Вид доступа пользователи</value> - - 8 - - ChartOfCharacteristicTypesRef - - - true - - - true - - - - ИспользоватьВнешнихПользователей - - <key>ru</key> - <value>Использовать внешних пользователей</value> - - 9 - - Boolean - - - true - - - true - - ПрофильАдминистратор @@ -2097,146 +1741,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>СправочникВнешниеПользователиДоступен</name> - <title> - <key>ru</key> - <value>Справочник внешние пользователи доступен</value> - - 11 - - Boolean - - - true - - - true - - - - ТекущиеТипыЗначенийДоступа - - <key>ru</key> - <value>Текущие типы значений доступа</value> - - 12 - - ValueList - - - true - - - true - - - - - - - ТекущийВидДоступа - - <key>ru</key> - <value>Текущий вид доступа</value> - - 13 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - ТекущийТипЗначенияДоступа - - <key>ru</key> - <value>Текущий тип значения доступа</value> - - 14 - - AnyRef - - - true - - - true - - - - ТипыЗначенийДоступаВидовДоступа - - <key>ru</key> - <value>Типы значений доступа видов доступа</value> - - 15 - - ValueTable - - - true - - - true - - - ВидДоступа - - <key>ru</key> - <value>Вид доступа</value> - - 1 - - ChartOfCharacteristicTypesRef.ВидыДоступа - - - true - - - true - - - - ТипЗначенияДоступа - - <key>ru</key> - <value>Тип значения доступа</value> - - 2 - - AnyRef - - - true - - - true - - - - ПредставлениеТипа - - <key>ru</key> - <value>Представление типа</value> - - 3 - - String - - - - true - - - true - - - ТекущийПрофиль @@ -2254,74 +1758,6 @@ <common>true</common> </edit> </attributes> - <attributes> - <name>ПользовательПустаяСсылка</name> - <title> - <key>ru</key> - <value>Пользователь пустая ссылка</value> - - 17 - - CatalogRef.Пользователи - - - true - - - true - - - - ВнешнийПользовательПустаяСсылка - - <key>ru</key> - <value>Внешний пользователь пустая ссылка</value> - - 18 - - CatalogRef.ВнешниеПользователи - - - true - - - true - - - - ГруппаВнешнихПользователейПустаяСсылка - - <key>ru</key> - <value>Группа внешних пользователей пустая ссылка</value> - - 19 - - CatalogRef.ГруппыВнешнихПользователей - - - true - - - true - - - - ГруппаПользователейПустаяСсылка - - <key>ru</key> - <value>Группа пользователей пустая ссылка</value> - - 20 - - CatalogRef.ГруппыПользователей - - - true - - - true - - РедактированиеТекущихОграничений @@ -2388,6 +1824,36 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ТекущаяГруппаДоступа</name> + <title> + <key>ru</key> + <value>Текущая группа доступа</value> + + 6 + + + true + + + true + + + + ТекущаяСтрокаЗначенияДоступаПриОшибке + + <key>ru</key> + <value>Текущая строка значения доступа при ошибке</value> + + 7 + + + true + + + true + + Записать @@ -2436,6 +1902,28 @@ <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> + <formCommands> + <name>ПоказыватьНеиспользуемыеВидыДоступа</name> + <title> + <key>ru</key> + <value>Показывать неиспользуемые виды доступа</value> + + 1 + + ru + Показывать неиспользуемые виды доступа + + + true + + + + ПоказыватьНеиспользуемыеВидыДоступа + + + Auto + Auto + Пользователь diff --git a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl index e645c7011..f83756587 100644 --- a/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl +++ b/SSL/src/CommonForms/ПраваДоступаУпрощенно/Module.bsl @@ -33,57 +33,371 @@ Возврат; КонецЕсли; - // Заполнение вспомогательных данных. - Если ТипЗнч(Параметры.Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда Элементы.Профили.Заголовок = НСтр("ru = 'Профили внешнего пользователя'"); Иначе Элементы.Профили.Заголовок = НСтр("ru = 'Профили пользователя'"); КонецЕсли; - // Заполнение списка видов доступа через права по значениям доступа. - Отбор = Новый Структура("ВидДоступаЧерезПраваПоЗначениямДоступа", Истина); - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа().НайтиСтроки(Отбор) Цикл - ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(СвойстваВидаДоступа.ВидДоступа); - КонецЦикла; + ЗагрузитьДанные(ОтборПрофилейТолькоТекущегоПользователя); - // Заполнение типов значений доступа всех видов доступа. - Для каждого СвойстваВидаДоступа Из УправлениеДоступомСлужебный.СвойстваВидаДоступа() Цикл + // Подготовка вспомогательных данных. + УправлениеДоступомСлужебный.ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений(ЭтотОбъект, , ""); + + Для каждого СвойстваПрофиля Из Профили Цикл + ТекущаяГруппаДоступа = СвойстваПрофиля.Профиль; + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(ЭтотОбъект); + КонецЦикла; + ТекущаяГруппаДоступа = ""; + + ПрофильАдминистратор = Справочники.ПрофилиГруппДоступа.Администратор; + + // Определение необходимости настройки ограничений доступа. + Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Элементы.Доступ.Видимость = Ложь; + КонецЕсли; + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + ДействияСПользователемСервиса = Неопределено; + УправлениеДоступомСлужебный.ПриПолученииДействийСПользователемСервиса( + ДействияСПользователемСервиса, Параметры.Пользователь); + ЗапретИзмененияАдминистративногоДоступа = НЕ ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы( + Новый ОписаниеОповещения("ПередЗакрытиемПродолжение", ЭтотОбъект), Отказ); + +КонецПроцедуры + +&НаСервере +Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) + + // Проверка незаполненных и повторяющихся значений доступа. + Ошибки = Неопределено; + + Для каждого СвойстваПрофиля Из Профили Цикл + + ТекущаяГруппаДоступа = СвойстваПрофиля.Профиль; + УправлениеДоступомСлужебныйКлиентСервер.ОбработкаПроверкиЗаполненияНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, Отказ, Новый Массив, Ошибки); + + Если Отказ Тогда + Прервать; + КонецЕсли; - Для каждого Тип Из СвойстваВидаДоступа.ВидДоступа.ТипЗначения.Типы() Цикл - МассивТипов = Новый Массив; - МассивТипов.Добавить(Тип); - ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); - - МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); - Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда - - ПредставлениеТипа = МетаданныеТипа.Представление(); - Иначе - ПредставлениеТипа = - ?(ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), - МетаданныеТипа.ПредставлениеОбъекта, - МетаданныеТипа.Представление()); - КонецЕсли; - - НоваяСтрока = ТипыЗначенийДоступаВидовДоступа.Добавить(); - НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.ВидДоступа; - НоваяСтрока.ТипЗначенияДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); - НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; - КонецЦикла; КонецЦикла; - ПрофильАдминистратор = Справочники.ПрофилиГруппДоступа.Администратор; - ГруппаДоступаАдминистраторы = Справочники.ГруппыДоступа.Администраторы; + Если Отказ Тогда + ТекущаяСтрокаВидаДоступа = Элементы.ВидыДоступа.ТекущаяСтрока; + ТекущаяСтрокаЗначенияДоступаПриОшибке = Элементы.ЗначенияДоступа.ТекущаяСтрока; + + Элементы.Профили.ТекущаяСтрока = СвойстваПрофиля.ПолучитьИдентификатор(); + ПриИзмененииТекущегоПрофиля(ЭтотОбъект); + + Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа; + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(ЭтотОбъект); + + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); + Иначе + ТекущаяГруппаДоступа = ТекущийПрофиль; + КонецЕсли; - ВидДоступаПользователи = ПланыВидовХарактеристик.ВидыДоступа.Пользователи; - ВидДоступаВнешниеПользователи = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи; +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьТекущуюСтрокуЗначенияДоступаПриОшибке() - ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); - СправочникВнешниеПользователиДоступен = - ПравоДоступа("Просмотр", Метаданные.Справочники.ВнешниеПользователи); + Если ТекущаяСтрокаЗначенияДоступаПриОшибке <> Неопределено Тогда + Элементы.ЗначенияДоступа.ТекущаяСтрока = ТекущаяСтрокаЗначенияДоступаПриОшибке; + ТекущаяСтрокаЗначенияДоступаПриОшибке = Неопределено; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Профили + +&НаКлиенте +Процедура ПрофилиПриАктивизацииСтроки(Элемент) + + ПриИзмененииТекущегоПрофиля(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПрофилиПометкаПриИзменении(Элемент) + + Отказ = Ложь; + ТекущиеДанные = Элементы.Профили.ТекущиеДанные; + + Если ТекущиеДанные <> Неопределено + И НЕ ТекущиеДанные.Пометка Тогда + // Проверка незаполненных и повторяющихся значений доступа + // перед отключением профиля и отключением доступности его настройки. + ОчиститьСообщения(); + Ошибки = Неопределено; + УправлениеДоступомСлужебныйКлиентСервер.ОбработкаПроверкиЗаполненияНаСервереФормыРедактированияРазрешенныхЗначений( + ЭтотОбъект, Отказ, Новый Массив, Ошибки); + ТекущаяСтрокаЗначенияДоступаПриОшибке = Элементы.ЗначенияДоступа.ТекущаяСтрока; + ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); + ПодключитьОбработчикОжидания("УстановитьТекущуюСтрокуЗначенияДоступаПриОшибке", Истина, 0.1); + КонецЕсли; + + Если Отказ Тогда + ТекущиеДанные.Пометка = Истина; + Иначе + ПриИзмененииТекущегоПрофиля(ЭтотОбъект); + КонецЕсли; + + Если ТекущиеДанные <> Неопределено + И ТекущиеДанные.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда + + ТребуетсяСинхронизацияССервисом = Истина; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ВидыДоступа + +&НаКлиенте +Процедура ВидыДоступаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + + Если РедактированиеТекущихОграничений Тогда + Элементы.ВидыДоступа.ИзменитьСтроку(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриАктивизацииСтроки( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриАктивизацииЯчейки(Элемент) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриАктивизацииЯчейки( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий элемента ВсеРазрешеныПредставление таблицы формы ВидыДоступа + +&НаКлиенте +Процедура ВидыДоступаВсеРазрешеныПредставлениеПриИзменении(Элемент) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеПриИзменении( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ЗначенияДоступа + +&НаКлиенте +Процедура ЗначенияДоступаПриИзменении(Элемент) + + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриИзменении( + ЭтотОбъект, Элемент); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриНачалеРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, Копирование); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначенияДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + + УправлениеДоступомСлужебныйКлиент.ЗначенияДоступаПриОкончанииРедактирования( + ЭтотОбъект, Элемент, НоваяСтрока, ОтменаРедактирования); + +КонецПроцедуры + + +&НаКлиенте +Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаНачалоВыбора( + ЭтотОбъект, Элемент, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОбработкаВыбора( + ЭтотОбъект, Элемент, ВыбранноеЗначение, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОчистка( + ЭтотОбъект, Элемент, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаАвтоПодбор( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + + УправлениеДоступомСлужебныйКлиент.ЗначениеДоступаОкончаниеВводаТекста( + ЭтотОбъект, Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура Записать(Команда) + + ЗаписатьИзменения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ОтчетПоПравамДоступа(Команда) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Пользователь", Параметры.Пользователь); + + ОткрытьФорму("Отчет.ПраваДоступа.Форма", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьНеиспользуемыеВидыДоступа(Команда) + + ПоказыватьНеИспользуемыеВидыДоступаНаСервере(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Продолжение обработчика события ПередЗакрытием +&НаКлиенте +Процедура ПередЗакрытиемПродолжение(Ответ, Неопределен) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ЗаписатьИзменения(Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект)); + Иначе + Модифицированность = Ложь; + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +// Продолжение обработчика события ПередЗакрытием +&НаКлиенте +Процедура ПередЗакрытиемЗавершение(Отказ, Неопределен) Экспорт + + Если Отказ Тогда + Возврат; + КонецЕсли; + + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИзменения(ОбработкаПродолжения = Неопределено) + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено + И ТребуетсяСинхронизацияССервисом Тогда + + СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( + Новый ОписаниеОповещения("ЗаписатьИзмененияЗавершение", ЭтотОбъект, ОбработкаПродолжения), + ЭтотОбъект, + ПарольПользователяСервиса); + Иначе + ЗаписатьИзмененияЗавершение("", ОбработкаПродолжения); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаписатьИзмененияЗавершение(НовыйПарольПользователяСервиса, ОбработкаПродолжения) Экспорт + + Если НовыйПарольПользователяСервиса = Неопределено Тогда + Возврат; + КонецЕсли; + + ПарольПользователяСервиса = НовыйПарольПользователяСервиса; + + ОчиститьСообщения(); + + Отказ = Ложь; + ЗаписатьИзмененияНаСервере(Отказ); + + ПодключитьОбработчикОжидания("УстановитьТекущуюСтрокуЗначенияДоступаПриОшибке", Истина, 0.1); + + Если Отказ ИЛИ ОбработкаПродолжения = Неопределено Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ОбработкаПродолжения); + +КонецПроцедуры + +&НаСервере +Процедура ПоказыватьНеИспользуемыеВидыДоступаНаСервере() + + УправлениеДоступомСлужебный.ОбновитьОтображениеНеиспользуемыхВидовДоступа(ЭтотОбъект); + +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьДанные(ОтборПрофилейТолькоТекущегоПользователя) - // Заполнение данных. Запрос = Новый Запрос; Запрос.УстановитьПараметр("Пользователь", Параметры.Пользователь); Запрос.УстановитьПараметр("ОтборПрофилейТолькоТекущегоПользователя", @@ -117,7 +431,8 @@ |ВЫБРАТЬ | Профили.Ссылка КАК Профиль, | Профили.Ссылка.Наименование КАК ПрофильПредставление, - | Профили.Пометка + | Профили.Пометка, + | Профили.ПерсональнаяГруппаДоступа КАК ГруппаДоступа |ИЗ | Профили КАК Профили | @@ -127,11 +442,11 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | Профили.Ссылка КАК Профиль, + | Профили.Ссылка КАК ГруппаДоступа, | ПрофилиВидыДоступа.ВидДоступа, - | ЕСТЬNULL(ГруппыДоступаВидыДоступа.ДоступРазрешен, ПрофилиВидыДоступа.ДоступРазрешен) КАК ДоступРазрешен, - | """" КАК Использование, - | НЕОПРЕДЕЛЕНО КАК ТекущийТипЗначенияДоступа + | ЕСТЬNULL(ГруппыДоступаВидыДоступа.ВсеРазрешены, ПрофилиВидыДоступа.ВсеРазрешены) КАК ВсеРазрешены, + | """" КАК ВидДоступаПредставление, + | """" КАК ВсеРазрешеныПредставление |ИЗ | Профили КАК Профили | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиВидыДоступа @@ -145,7 +460,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | Профили.Ссылка КАК Профиль, + | Профили.Ссылка КАК ГруппаДоступа, | ПрофилиВидыДоступа.ВидДоступа, | 0 КАК НомерСтрокиПоВиду, | ГруппыДоступаЗначенияДоступа.ЗначениеДоступа @@ -167,399 +482,6 @@ ЗначениеВРеквизитФормы(РезультатыЗапроса[2].Выгрузить(), "ВидыДоступа"); ЗначениеВРеквизитФормы(РезультатыЗапроса[3].Выгрузить(), "ЗначенияДоступа"); - - // Определение необходимости настройки ограничений доступа. - Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда - Элементы.Доступ.Видимость = Ложь; - КонецЕсли; - - Для каждого СвойстваПрофиля Из Профили Цикл - - Отбор = Новый Структура("Профиль", СвойстваПрофиля.Профиль); - Для каждого ОписаниеВидаДоступа Из ВидыДоступа.НайтиСтроки(Отбор) Цикл - - ОбновитьПредставлениеИспользованияВидаДоступа(ЭтаФорма, СвойстваПрофиля, ОписаниеВидаДоступа); - ОбновитьНомерСтрокиПоВиду(ЭтаФорма, СвойстваПрофиля, ОписаниеВидаДоступа); - КонецЦикла; - КонецЦикла; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ДействияСПользователемСервиса = Неопределено; - УправлениеДоступомСлужебный.ПриПолученииДействийСПользователемСервиса( - ДействияСПользователемСервиса, Параметры.Пользователь); - ЗапретИзмененияАдминистративногоДоступа = НЕ ДействияСПользователемСервиса.ИзменениеАдминистративногоДоступа; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность); - -КонецПроцедуры - -&НаКлиенте -Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.АутентификацияВСервисе") - И ВыбранноеЗначение <> Неопределено Тогда - - ПарольПользователяСервиса = ВыбранноеЗначение; - ЗаписатьИзменения(); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - - Ошибки = Неопределено; - - Для каждого СвойстваПрофиля Из Профили Цикл - - ПроверитьЗаполнениеПрофиля(ЭтаФорма, СвойстваПрофиля, Ошибки, Отказ); - - Если Отказ Тогда - Прервать; - КонецЕсли; - - КонецЦикла; - - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Профили - -&НаКлиенте -Процедура ПрофилиПриАктивизацииСтроки(Элемент) - - ПриИзмененииТекущегоПрофиля(ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ПрофилиПометкаПриИзменении(Элемент) - - Отказ = Ложь; - ТекущиеДанные = Элементы.Профили.ТекущиеДанные; - - Если ТекущиеДанные <> Неопределено - И НЕ ТекущиеДанные.Пометка Тогда - // Проверка незаполненных и повторяющихся значений доступа - // перед отключением профиля и отключением доступности его настройки. - ОчиститьСообщения(); - СвойстваПрофиля = Профили.НайтиПоИдентификатору(Элементы.Профили.ТекущаяСтрока); - Ошибки = Неопределено; - ПроверитьЗаполнениеПрофиля(ЭтаФорма, СвойстваПрофиля, Ошибки, Отказ); - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); - КонецЕсли; - - Если Отказ Тогда - ТекущиеДанные.Пометка = Истина; - Иначе - ПриИзмененииТекущегоПрофиля(ЭтаФорма); - КонецЕсли; - - Если ТекущиеДанные <> Неопределено - И ТекущиеДанные.Профиль = ПредопределенноеЗначение("Справочник.ПрофилиГруппДоступа.Администратор") Тогда - - ТребуетсяСинхронизацияССервисом = Истина; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ВидыДоступа - -&НаКлиенте -Процедура ВидыДоступаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - Если РедактированиеТекущихОграничений Тогда - Элементы.ВидыДоступа.ИзменитьСтроку(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаПриАктивизацииСтроки(Элемент) - - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаПриАктивизацииЯчейки(Элемент) - - Если Элементы.ВидыДоступа.ТекущийЭлемент <> Элементы.ВидыДоступаИспользование Тогда - Элементы.ВидыДоступа.ТекущийЭлемент = Элементы.ВидыДоступаИспользование; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) - - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий элемента Использование таблицы формы ВидыДоступа - -&НаКлиенте -Процедура ВидыДоступаИспользованиеПриИзменении(Элемент) - - Элементы.ВидыДоступа.ЗакончитьРедактированиеСтроки(Ложь); - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - ДанныеВыбора = Элемент.СписокВыбора; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ВидыДоступаИспользованиеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Элементы.ВидыДоступа.ТекущиеДанные.ДоступРазрешен = (ВыбранноеЗначение = "ВсеРазрешены"); - - Модифицированность = Истина; - ПриИзмененииТекущегоВидаДоступа(ЭтаФорма); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ЗначенияДоступа - -&НаКлиенте -Процедура ЗначенияДоступаПриИзменении(Элемент) - - Если Элемент.ТекущиеДанные <> Неопределено - И НЕ ЗначениеЗаполнено(Элемент.ТекущиеДанные.ВидДоступа) Тогда - - Элемент.ТекущиеДанные.Профиль = ТекущийПрофиль; - Элемент.ТекущиеДанные.ВидДоступа = ТекущийВидДоступа; - - Отбор = Новый Структура("Профиль, ВидДоступа", ТекущийПрофиль, ТекущийВидДоступа); - Элемент.ТекущиеДанные.НомерСтрокиПоВиду = ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - КонецЕсли; - - ОбновитьНомерСтрокиПоВиду( - ЭтаФорма, - Элементы.Профили.ТекущиеДанные, - Элементы.ВидыДоступа.ТекущиеДанные); - - ОбновитьПредставлениеИспользованияВидаДоступа( - ЭтаФорма, - Элементы.Профили.ТекущиеДанные, - Элементы.ВидыДоступа.ТекущиеДанные); - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначенияДоступаПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - - Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда - Элемент.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - Если НЕ ВыбранТипЗначенияДоступа(ТекущиеТипыЗначенийДоступа) Тогда - СтандартнаяОбработка = Ложь; - Возврат; - КонецЕсли; - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) - И ТекущиеДанные.ЗначениеДоступа <> ТекущийТипЗначенияДоступа Тогда - - ТекущиеДанные.ЗначениеДоступа = ТекущийТипЗначенияДоступа; - КонецЕсли; - - Элементы.ЗначениеДоступа.КнопкаОчистки - = ТекущийТипЗначенияДоступа <> Неопределено - И ТекущиеТипыЗначенийДоступа.Количество() > 1; - - Если ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка ИЛИ - ТекущийТипЗначенияДоступа = ГруппаПользователейПустаяСсылка Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Ложь); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка ИЛИ - ТекущийТипЗначенияДоступа = ГруппаВнешнихПользователейПустаяСсылка Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Ложь); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - - ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; - - Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - - ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); - - ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ - ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда - - СтандартнаяОбработка = Ложь; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - - ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - ТекущийТипЗначенияДоступа = Неопределено; - - Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = ТекущиеТипыЗначенийДоступа[0].Значение; - Элементы.ЗначениеДоступа.КнопкаОчистки = Ложь; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи - ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = ВидДоступаВнешниеПользователи, - ТекущийВидДоступа <> ВидДоступаПользователи); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ЗначениеДоступаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - - Если ТекущийВидДоступа = ВидДоступаВнешниеПользователи - ИЛИ ТекущийВидДоступа = ВидДоступаПользователи Тогда - - ДанныеВыбора = СформироватьДанныеВыбораПользователя( - Текст, - , - ТекущийВидДоступа = ВидДоступаВнешниеПользователи, - ТекущийВидДоступа <> ВидДоступаПользователи); - Иначе - ДанныеВыбора = СформироватьДанныеВыбораЗначенияДоступа( - Текст, ТекущийВидДоступа, Ложь); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура Записать(Команда) - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено - И ТребуетсяСинхронизацияССервисом Тогда - - ПарольЕщеНеВведен = Ложь; - СтандартныеПодсистемыКлиент.ПриЗапросеПароляДляАутентификацииВСервисе( - ЭтаФорма, ПарольПользователяСервиса, ПарольЕщеНеВведен); - - Если ПарольЕщеНеВведен Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - ЗаписатьИзменения(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОтчетПоПравамДоступа(Команда) - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Пользователь", Параметры.Пользователь); - - ОткрытьФорму("Отчет.ПраваДоступа.Форма", ПараметрыФормы); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаКлиенте -Процедура ЗаписатьИзменения(Отказ = Ложь) - - ОчиститьСообщения(); - ЗаписатьИзмененияНаСервере(Отказ); - КонецПроцедуры &НаСервере @@ -581,10 +503,10 @@ "Профили", Профили.Выгрузить(, "Профиль, Пометка")); Запрос.УстановитьПараметр( - "ВидыДоступа", ВидыДоступа.Выгрузить(, "Профиль, ВидДоступа, ДоступРазрешен")); + "ВидыДоступа", ВидыДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ВсеРазрешены")); Запрос.УстановитьПараметр( - "ЗначенияДоступа", ЗначенияДоступа.Выгрузить(, "Профиль, ВидДоступа, ЗначениеДоступа")); + "ЗначенияДоступа", ЗначенияДоступа.Выгрузить(, "ГруппаДоступа, ВидДоступа, ЗначениеДоступа")); Запрос.Текст = "ВЫБРАТЬ @@ -597,9 +519,9 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ВидыДоступа.Профиль, + | ВидыДоступа.ГруппаДоступа КАК Профиль, | ВидыДоступа.ВидДоступа, - | ВидыДоступа.ДоступРазрешен + | ВидыДоступа.ВсеРазрешены |ПОМЕСТИТЬ ВидыДоступа |ИЗ | &ВидыДоступа КАК ВидыДоступа @@ -607,7 +529,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ЗначенияДоступа.Профиль, + | ЗначенияДоступа.ГруппаДоступа КАК Профиль, | ЗначенияДоступа.ВидДоступа, | ЗначенияДоступа.ЗначениеДоступа |ПОМЕСТИТЬ ЗначенияДоступа @@ -642,7 +564,7 @@ |ВЫБРАТЬ | Профили.Ссылка КАК Профиль, | ГруппыДоступаВидыДоступа.ВидДоступа, - | ГруппыДоступаВидыДоступа.ДоступРазрешен + | ГруппыДоступаВидыДоступа.ВсеРазрешены |ПОМЕСТИТЬ ТекущиеВидыДоступа |ИЗ | ТекущиеПрофили КАК Профили @@ -685,7 +607,7 @@ | ЛЕВОЕ СОЕДИНЕНИЕ ТекущиеВидыДоступа КАК ТекущиеВидыДоступа | ПО ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль | И ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа - | И ВидыДоступа.ДоступРазрешен = ТекущиеВидыДоступа.ДоступРазрешен + | И ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены | ГДЕ | ТекущиеВидыДоступа.ВидДоступа ЕСТЬ NULL | @@ -698,7 +620,7 @@ | ЛЕВОЕ СОЕДИНЕНИЕ ВидыДоступа КАК ВидыДоступа | ПО (ВидыДоступа.Профиль = ТекущиеВидыДоступа.Профиль) | И (ВидыДоступа.ВидДоступа = ТекущиеВидыДоступа.ВидДоступа) - | И (ВидыДоступа.ДоступРазрешен = ТекущиеВидыДоступа.ДоступРазрешен) + | И (ВидыДоступа.ВсеРазрешены = ТекущиеВидыДоступа.ВсеРазрешены) | ГДЕ | ВидыДоступа.ВидДоступа ЕСТЬ NULL | @@ -807,15 +729,21 @@ ГруппаДоступаОбъект.Пользователи.Добавить().Пользователь = Параметры.Пользователь; КонецЕсли; - Отбор = Новый Структура("Профиль", Выборка.Профиль); + Отбор = Новый Структура("ГруппаДоступа", Выборка.Профиль); ГруппаДоступаОбъект.ВидыДоступа.Загрузить( - ВидыДоступа.Выгрузить(Отбор, "ВидДоступа, ДоступРазрешен")); + ВидыДоступа.Выгрузить(Отбор, "ВидДоступа, ВсеРазрешены")); ГруппаДоступаОбъект.ЗначенияДоступа.Загрузить( ЗначенияДоступа.Выгрузить(Отбор, "ВидДоступа, ЗначениеДоступа")); КонецЕсли; - ГруппаДоступаОбъект.Записать(); + + Попытка + ГруппаДоступаОбъект.Записать(); + Исключение + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + КонецПопытки; Если ЗначениеЗаполнено(Выборка.ПерсональнаяГруппаДоступа) Тогда РазблокироватьДанныеДляРедактирования(Выборка.ПерсональнаяГруппаДоступа); @@ -862,344 +790,23 @@ Элементы.ВидыДоступаИзменить.Доступность = РедактированиеТекущихОграничений; Элементы.ВидыДоступаКонтекстноеМенюИзменить.Доступность = РедактированиеТекущихОграничений; + Если Форма.ТекущийПрофиль = Неопределено Тогда + Форма.ТекущаяГруппаДоступа = ""; + Иначе + Форма.ТекущаяГруппаДоступа = Форма.ТекущийПрофиль; + КонецЕсли; + Если Элементы.ВидыДоступа.ОтборСтрок = Неопределено - ИЛИ Элементы.ВидыДоступа.ОтборСтрок.Профиль <> Форма.ТекущийПрофиль Тогда - // - Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура("Профиль", Форма.ТекущийПрофиль); - ТекущиеВидыДоступа = ВидыДоступа.НайтиСтроки(Новый Структура("Профиль", Форма.ТекущийПрофиль)); + ИЛИ Элементы.ВидыДоступа.ОтборСтрок.ГруппаДоступа <> Форма.ТекущаяГруппаДоступа Тогда + + Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура("ГруппаДоступа", Форма.ТекущаяГруппаДоступа); + ТекущиеВидыДоступа = ВидыДоступа.НайтиСтроки(Новый Структура("ГруппаДоступа", Форма.ТекущаяГруппаДоступа)); Если ТекущиеВидыДоступа.Количество() = 0 Тогда - Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура("Профиль, ВидДоступа", Форма.ТекущийПрофиль, Неопределено); - ПриИзмененииТекущегоВидаДоступа(Форма); + Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура("ГруппаДоступа, ВидДоступа", Форма.ТекущаяГруппаДоступа, ""); + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); Иначе Элементы.ВидыДоступа.ТекущаяСтрока = ТекущиеВидыДоступа[0].ПолучитьИдентификатор(); КонецЕсли; КонецЕсли; КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ПриИзмененииТекущегоВидаДоступа(Знач Форма) - - Элементы = Форма.Элементы; - ВидыДоступа = Форма.ВидыДоступа; - ЗначенияДоступа = Форма.ЗначенияДоступа; - - ЗначенияЗадаются = Ложь; - - #Если Клиент Тогда - ТекущиеДанные = Элементы.ВидыДоступа.ТекущиеДанные; - #Иначе - ТекущиеДанные = ВидыДоступа.НайтиПоИдентификатору( - ?(Элементы.ВидыДоступа.ТекущаяСтрока = Неопределено, - -1, - Элементы.ВидыДоступа.ТекущаяСтрока)); - #КонецЕсли - - Если ТекущиеДанные <> Неопределено Тогда - - Форма.ТекущийВидДоступа = ТекущиеДанные.ВидДоступа; - - Если Форма.ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - ТекущиеДанные.ВидДоступа) = Неопределено Тогда - - ЗначенияЗадаются = Истина; - Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ОбычныйВидДоступа; - // Установка отбора значений. - Если Элементы.ЗначенияДоступа.ОтборСтрок = Неопределено - ИЛИ Элементы.ЗначенияДоступа.ОтборСтрок.Профиль <> Форма.ТекущийПрофиль - ИЛИ Элементы.ЗначенияДоступа.ОтборСтрок.ВидДоступа <> ТекущиеДанные.ВидДоступа Тогда - - Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура( - "Профиль, ВидДоступа", Форма.ТекущийПрофиль, ТекущиеДанные.ВидДоступа); - КонецЕсли; - Иначе - Элементы.ТипыВидовДоступа.ТекущаяСтраница = - ?(ТекущиеДанные.ДоступРазрешен, - Элементы.ВидДоступаЧерезПраваПоЗначениямДоступаПредупреждение, - Элементы.ВидДоступаЧерезПраваПоЗначениямДоступаИнформация); - КонецЕсли; - - // Обновление поля НадписьВидДоступа. - Форма.НадписьВидДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ?(ТекущиеДанные.ВидДоступа = Форма.ВидДоступаПользователи, - ?(ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'"), - НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'") ), - ?(ТекущиеДанные.ВидДоступа = Форма.ВидДоступаВнешниеПользователи, - ?(ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'"), - НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'") ), - ?(ТекущиеДанные.ДоступРазрешен, - НСтр("ru = 'Запрещенные значения (%1)'"), - НСтр("ru = 'Разрешенные значения (%1)'") )) - ), - Строка(ТекущиеДанные.ВидДоступа)); - - ОбновитьПредставлениеИспользованияВидаДоступа( - Форма, Элементы.Профили.ТекущиеДанные, ТекущиеДанные); - Иначе - Форма.НадписьВидДоступа = ""; - Форма.ТекущийВидДоступа = Неопределено; - - Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура( - "Профиль, ВидДоступа", Форма.ТекущийПрофиль, Неопределено); - - Если ВидыДоступа.Количество() = 0 Тогда - ЗначенияДоступа.Очистить(); - КонецЕсли; - КонецЕсли; - - Форма.ТекущийТипЗначенияДоступа = - ?(ТекущиеДанные = Неопределено, - Неопределено, - ТекущиеДанные.ТекущийТипЗначенияДоступа); - - Форма.ТекущиеТипыЗначенийДоступа = Новый СписокЗначений; - - Если ЗначенияЗадаются Тогда - - Отбор = Новый Структура("ВидДоступа", ТекущиеДанные.ВидДоступа); - ОписанияТиповВидовДоступа = Форма.ТипыЗначенийДоступаВидовДоступа.НайтиСтроки(Отбор); - - Для каждого ОписаниеТипаВидаДоступа Из ОписанияТиповВидовДоступа Цикл - Форма.ТекущиеТипыЗначенийДоступа.Добавить( - ОписаниеТипаВидаДоступа.ТипЗначенияДоступа, - ОписаниеТипаВидаДоступа.ПредставлениеТипа); - КонецЦикла; - Иначе - Если ТекущиеДанные <> Неопределено Тогда - - Отбор = Новый Структура; - Отбор.Вставить("Профиль", Форма.ТекущийПрофиль); - Отбор.Вставить("ВидДоступа", Форма.ТекущийВидДоступа); - - Для каждого Строка Из ЗначенияДоступа.НайтиСтроки(Отбор) Цикл - ЗначенияДоступа.Удалить(Строка); - КонецЦикла - КонецЕсли; - КонецЕсли; - - Если Форма.ТекущиеТипыЗначенийДоступа.Количество() = 0 Тогда - Форма.ТекущиеТипыЗначенийДоступа.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); - КонецЕсли; - - Элементы.ЗначенияДоступа.Доступность = ЗначенияЗадаются; - - Элементы.ЗначенияДоступа.КоманднаяПанель.ПодчиненныеЭлементы.ЗначенияДоступаДобавить.Доступность = - ЗначенияЗадаются; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьПредставлениеИспользованияВидаДоступа(Форма, СвойстваПрофиля, ОписаниеВидаДоступа) - - Элементы = Форма.Элементы; - ЗначенияДоступа = Форма.ЗначенияДоступа; - ВидыДоступаЧерезПраваПоЗначениямДоступа = Форма.ВидыДоступаЧерезПраваПоЗначениямДоступа; - - Если СвойстваПрофиля = Неопределено - ИЛИ ОписаниеВидаДоступа = Неопределено Тогда - - ОписаниеВидаДоступа.Использование = ""; - Возврат; - КонецЕсли; - - Отбор = Новый Структура; - Отбор.Вставить("Профиль", СвойстваПрофиля.Профиль); - Отбор.Вставить("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - КоличествоЗначений = ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); - - Если КоличествоЗначений > 0 Тогда - - ПрописьЧисла = ЧислоПрописью( - КоличествоЗначений, "Л = ru_RU", НСтр("ru = ',,,,,,,,0'")); - - ПрописьЧислаИПредмета = ЧислоПрописью( - КоличествоЗначений, - "Л = ru_RU", - НСтр("ru = '-го значения,-х значений,-и значений,,,,,,0'")); - - ЧислоИПредмет = СтрЗаменить( - ПрописьЧислаИПредмета, - ПрописьЧисла, - Формат(КоличествоЗначений, "ЧГ=")); - - ОписаниеВидаДоступа.Использование = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, кроме %1'"), - НСтр("ru = 'Все запрещены, кроме %1'") ), - ЧислоИПредмет); - - ИначеЕсли ВидыДоступаЧерезПраваПоЗначениямДоступа.НайтиПоЗначению( - ОписаниеВидаДоступа.ВидДоступа) = Неопределено Тогда - - ОписаниеВидаДоступа.Использование = - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, без исключений'"), - НСтр("ru = 'Все запрещены, без исключений'") ); - Иначе - ОписаниеВидаДоступа.Использование = - ?(ОписаниеВидаДоступа.ДоступРазрешен, - НСтр("ru = 'Все разрешены, без исключений'"), - НСтр("ru = 'Все запрещены, кроме исключений'") ); - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ОбновитьНомерСтрокиПоВиду(Форма, СвойстваПрофиля, ОписаниеВидаДоступа) - - ЗначенияДоступа = Форма.ЗначенияДоступа; - - Отбор = Новый Структура("Профиль", СвойстваПрофиля.Профиль); - Отбор = Новый Структура("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); - ЗначенияДоступаПоВиду = ЗначенияДоступа.НайтиСтроки(Отбор); - - ТекущийНомер = 1; - Для каждого Строка Из ЗначенияДоступаПоВиду Цикл - Строка.НомерСтрокиПоВиду = ТекущийНомер; - ТекущийНомер = ТекущийНомер + 1; - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Функция ВыбранТипЗначенияДоступа(Знач ТипыЗначенияДоступа) - - Если ТекущийТипЗначенияДоступа <> Неопределено Тогда - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() = 1 Тогда - - ТекущийТипЗначенияДоступа = ТипыЗначенияДоступа[0].Значение; - Возврат Истина; - - ИначеЕсли ТипыЗначенияДоступа.Количество() > 0 Тогда - - Если ТипыЗначенияДоступа.Количество() = 2 Тогда - - Если ТипыЗначенияДоступа.НайтиПоЗначению(ПользовательПустаяСсылка) <> Неопределено - И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаПользователейПустаяСсылка) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ПользовательПустаяСсылка; - Возврат Истина; - КонецЕсли; - - Если ТипыЗначенияДоступа.НайтиПоЗначению(ВнешнийПользовательПустаяСсылка) <> Неопределено - И ТипыЗначенияДоступа.НайтиПоЗначению(ГруппаВнешнихПользователейПустаяСсылка) <> Неопределено Тогда - - ТекущийТипЗначенияДоступа = ВнешнийПользовательПустаяСсылка; - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Элемент = ТипыЗначенияДоступа.ВыбратьЭлемент( - НСтр("ru = 'Выбор типа данных'"), - ТипыЗначенияДоступа[0]); - - Если Элемент <> Неопределено Тогда - ТекущийТипЗначенияДоступа = Элемент.Значение; - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Процедура ПроверитьЗаполнениеПрофиля(Знач Форма, Знач СвойстваПрофиля, Ошибки, Отказ) - - ВидыДоступа = Форма.ВидыДоступа; - ЗначенияДоступа = Форма.ЗначенияДоступа; - Элементы = Форма.Элементы; - - ВидыДоступаПрофиля = ВидыДоступа.НайтиСтроки(Новый Структура("Профиль", СвойстваПрофиля.Профиль)); - НомерСтрокиВидаДоступа = ВидыДоступаПрофиля.Количество()-1; - - Пока НЕ Отказ И НомерСтрокиВидаДоступа >= 0 Цикл - ТекущаяСтрокаВидаДоступа = ВидыДоступаПрофиля[НомерСтрокиВидаДоступа]; - - Отбор = Новый Структура; - Отбор.Вставить("Профиль", СвойстваПрофиля.Профиль); - Отбор.Вставить("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа); - ЗначенияДоступаВидаДоступа = ЗначенияДоступа.НайтиСтроки(Отбор); - - НомерСтроки = ЗначенияДоступаВидаДоступа.Количество()-1; - - Пока НомерСтроки >= 0 Цикл - - ТекущаяСтрока = ЗначенияДоступаВидаДоступа[НомерСтроки]; - - // Проверка заполнения значения. - Если НЕ ЗначениеЗаполнено(ТекущаяСтрока.ЗначениеДоступа) Тогда - - Элементы.Профили.ТекущаяСтрока = СвойстваПрофиля.ПолучитьИдентификатор(); - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение не выбрано.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 не выбрано.'")); - - Отказ = Истина; - Прервать; - КонецЕсли; - - // Проверка наличия повторяющихся значений. - Отбор = Новый Структура; - Отбор.Вставить("Профиль", СвойстваПрофиля.Профиль); - Отбор.Вставить("ВидДоступа", ТекущаяСтрокаВидаДоступа.ВидДоступа); - Отбор.Вставить("ЗначениеДоступа", ТекущаяСтрока.ЗначениеДоступа); - - НайденныеЗначения = ЗначенияДоступа.НайтиСтроки(Отбор); - - Если НайденныеЗначения.Количество() > 1 Тогда - - Элементы.Профили.ТекущаяСтрока = СвойстваПрофиля.ПолучитьИдентификатор(); - Элементы.ВидыДоступа.ТекущаяСтрока = ТекущаяСтрокаВидаДоступа.ПолучитьИдентификатор(); - - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "Объект.ЗначенияДоступа[%1].ЗначениеДоступа", - НСтр("ru = 'Значение повторяется.'"), - "ЗначенияДоступа", - НомерСтроки, - НСтр("ru = 'Значение в строке %1 повторяется.'")); - - Отказ = Истина; - Прервать; - КонецЕсли; - - НомерСтроки = НомерСтроки - 1; - КонецЦикла; - - НомерСтрокиВидаДоступа = НомерСтрокиВидаДоступа - 1; - КонецЦикла; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораПользователя(Знач Текст, - Знач ВключаяГруппы = Истина, - Знач ВключаяВнешнихПользователей = Неопределено, - Знач БезПользователей = Ложь) - - Возврат Пользователи.СформироватьДанныеВыбораПользователя( - Текст, - ВключаяГруппы, - ВключаяВнешнихПользователей, - БезПользователей); - -КонецФункции - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) - - Возврат УправлениеДоступомСлужебный.СформироватьДанныеВыбораЗначенияДоступа( - Текст, - ВидДоступа, - ВключаяГруппы); - -КонецФункции diff --git a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl b/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl deleted file mode 100644 index bf4dd0117..000000000 --- a/SSL/src/CommonForms/ПраваПоЗначениямДоступа/Module.bsl +++ /dev/null @@ -1,986 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. - Возврат; - КонецЕсли; - - СсылкаНаОбъект = Параметры.СсылкаНаОбъект; - ПараметрыОграниченияДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ВозможныеПрава = ПараметрыОграниченияДоступа.ВозможныеПраваПоЗначениямДоступа; - - Если ВозможныеПрава.ПоТипамСсылок[ТипЗнч(СсылкаНаОбъект)] = Неопределено Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Права доступа не настраиваются - |для значений типа ""%1"".'"), - Строка(ТипЗнч(СсылкаНаОбъект))); - КонецЕсли; - - // Проверка разрешения на открытие формы. - ОписаниеОшибки = ""; - Если НЕ УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа( - СсылкаНаОбъект, ОписаниеОшибки, ТолькоПросмотр) Тогда - - ВызватьИсключение ОписаниеОшибки; - КонецЕсли; - - ИспользоватьВнешнихПользователей - = ВнешниеПользователи.ИспользоватьВнешнихПользователей() - И ПравоДоступа("Просмотр", Метаданные.Справочники.ВнешниеПользователи); - - УстановитьПривилегированныйРежим(Истина); - - СписокТиповПользователей.Добавить( - Тип("СправочникСсылка.Пользователи"), - "Пользователи"); - - СписокТиповПользователей.Добавить( - Тип("СправочникСсылка.ВнешниеПользователи"), - "ВнешниеПользователи"); - - МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); - - НазваниеЗначенийДоступа = УправлениеДоступомСлужебный.НазваниеОбъектаИзМетаданных(МетаданныеОбъекта); - ТаблицаЗначенийДоступа = МетаданныеОбъекта.ПолноеИмя(); - - ВидыДоступаЗначенийДоступа = ПараметрыОграниченияДоступа.СвойстваВидовДоступа.ВидыДоступаЗначенийДоступа; - ВидыДоступа = ВидыДоступаЗначенийДоступа.ПоПолнымИменам.Получить(ТаблицаЗначенийДоступа); - - Если ВидыДоступа.Количество() <> 1 - ИЛИ НЕ УправлениеДоступомСлужебный.СвойстваВидаДоступа( - ВидыДоступа[0]).ВидДоступаЧерезПраваПоЗначениямДоступа Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для значений доступа ""%1"" не найдено вида доступа - |через права по значениям доступа.'"), - Метаданные.НайтиПоПолномуИмени(ТаблицаЗначенийДоступа).Синоним); - КонецЕсли; - - ВидДоступа = ВидыДоступа[0]; - - ЗаполнитьПрава(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность); - -КонецПроцедуры - -&НаСервере -Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) - - Ошибки = Неопределено; - - // Проверка незаполненных прав. - ИмяПервогоПрава = ""; - Для каждого ВозможноеПраво Из ВозможныеПрава Цикл - ИмяПервогоПрава = ВозможноеПраво.Ключ; - Прервать; - КонецЦикла; - - Для каждого ТекущаяСтрока Из ГруппыПрав Цикл - НомерСтроки = ГруппыПрав.Индекс(ТекущаяСтрока); - - // Проверка заполнения флажков прав. - НетЗаполненногоПрава = Истина; - Для каждого ВозможноеПраво Из ВозможныеПрава Цикл - Если ТекущаяСтрока[ВозможноеПраво.Ключ] Тогда - НетЗаполненногоПрава = Ложь; - Прервать; - КонецЕсли; - КонецЦикла; - - Если НетЗаполненногоПрава Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "ГруппыПрав[%1]." + ИмяПервогоПрава, - НСтр("ru = 'Необходимо заполнить не менее одного права доступа.'"), - "ГруппыПрав", - НомерСтроки, - НСтр("ru = 'В строке %1 необходимо заполнить не менее одного права доступа.'")); - КонецЕсли; - - // Проверка заполнения. - Если НЕ ЗначениеЗаполнено(ТекущаяСтрока["Пользователь"]) Тогда - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "ГруппыПрав[%1].Пользователь", - НСтр("ru = 'Пользователь не выбран.'"), - "ГруппыПрав", - НомерСтроки, - НСтр("ru = 'Пользователь в строке %1 не выбран.'")); - Продолжить; - КонецЕсли; - - // Проверка наличия повторяющихся значений. - Отбор = Новый Структура; - Отбор.Вставить("НаследуетсяОт" , ТекущаяСтрока["НаследуетсяОт"]); - Отбор.Вставить("Пользователь", ТекущаяСтрока["Пользователь"]); - - Если ГруппыПрав.НайтиСтроки(Отбор).Количество() > 1 Тогда - - Если ТипЗнч(Отбор.Пользователь) = Тип("СправочникСсылка.Пользователи") Тогда - ТекстДляОднойОшибки = НСтр("ru = 'Пользователь повторяется.'"); - ТекстДляНесколькихОшибок = НСтр("ru = 'Пользователь в строке %1 повторяется.'"); - - ИначеЕсли ТипЗнч(Отбор.Пользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - ТекстДляОднойОшибки = НСтр("ru = 'Внешний пользователь повторяется.'"); - ТекстДляНесколькихОшибок = НСтр("ru = 'Внешний пользователь в строке %1 повторяется.'"); - - ИначеЕсли ТипЗнч(Отбор.Пользователь) = Тип("СправочникСсылка.ГруппыПользователей") Тогда - ТекстДляОднойОшибки = НСтр("ru = 'Группа пользователей повторяется.'"); - ТекстДляНесколькихОшибок = НСтр("ru = 'Группа пользователей в строке %1 повторяется.'"); - Иначе - ТекстДляОднойОшибки = НСтр("ru = 'Группа внешних пользователей повторяется.'"); - ТекстДляНесколькихОшибок = НСтр("ru = 'Группа внешних пользователей в строке %1 повторяется.'"); - КонецЕсли; - - ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, - "ГруппыПрав[%1].Пользователь", - ТекстДляОднойОшибки, - "ГруппыПрав", - НомерСтроки, - ТекстДляНесколькихОшибок); - КонецЕсли; - КонецЦикла; - - ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаКлиенте -Процедура НаследоватьПраваРодителейПриИзменении(Элемент) - - НаследоватьПраваРодителейПриИзмененииНаСервере(); - -КонецПроцедуры - -&НаСервере -Процедура НаследоватьПраваРодителейПриИзмененииНаСервере() - - Если НаследоватьПраваРодителей Тогда - ДобавитьПраваНаследуемыеПоИерархии(); - ЗаполнитьНомераКартинокПользователей(); - Иначе - // Очистка настроек, наследуемых от родителей по иерархии. - Индекс = ГруппыПрав.Количество()-1; - Пока Индекс >= 0 Цикл - Если ТипЗнч(ГруппыПрав.Получить(Индекс).НаследуетсяОт) <> Тип("Строка") Тогда - ГруппыПрав.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - КонецЕсли; - - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ГруппыПрав - -&НаКлиенте -Процедура ГруппыПравПередНачаломИзменения(Элемент, Отказ) - - ПроверкаВозможностиИзмененияПрав(Отказ); - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПередУдалением(Элемент, Отказ) - - ПроверкаВозможностиИзмененияПрав(Отказ, Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) - - Если НоваяСтрока Тогда - - // Установка начальных значений. - Если Копирование Тогда - Если Элементы.Найти("ГруппыПравНаследуетсяОт") <> Неопределено Тогда - Элементы.ГруппыПрав.ТекущиеДанные.НаследуетсяОт = ДобавленныеРеквизиты.НаследуетсяОт; - КонецЕсли; - Если Элементы.Найти("ГруппыПравГруппаПользователей") <> Неопределено Тогда - Элементы.ГруппыПрав.ТекущиеДанные.ГруппаПользователей = - ДобавленныеРеквизиты.ГруппаПользователей; - КонецЕсли; - Иначе - Элементы.ГруппыПрав.ТекущиеДанные.РаспространяетсяВИерархии = Истина; - - Для каждого ДобавленныйРеквизит Из ДобавленныеРеквизиты Цикл - - Элементы.ГруппыПрав.ТекущиеДанные[ДобавленныйРеквизит.Ключ] = - ДобавленныйРеквизит.Значение; - - КонецЦикла; - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - - -&НаКлиенте -Процедура ГруппыПравПользовательПриИзменении(Элемент) - - Если ЗначениеЗаполнено(Элементы.ГруппыПрав.ТекущиеДанные.Пользователь) Тогда - ЗаполнитьНомераКартинокПользователей(Элементы.ГруппыПрав.ТекущаяСтрока); - Иначе - Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = ДобавленныеРеквизиты.НомерКартинки; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПользовательНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - ВыбратьПользователей(); - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПользовательОчистка(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - Элементы.ГруппыПрав.ТекущиеДанные.Пользователь = ДобавленныеРеквизиты.Пользователь; - Элементы.ГруппыПрав.ТекущиеДанные.НомерКартинки = ДобавленныеРеквизиты.НомерКартинки; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПользовательОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) - - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПользовательАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - Если ЗначениеЗаполнено(Текст) Тогда - СтандартнаяОбработка = Ложь; - ДанныеВыбора = СформироватьДанныеВыбораПользователя(Текст); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравЗапрещеноПриИзменении(Элемент) - - // При изменении вида настройки необходимо сбросить флажки прав. - Для каждого ВозможноеПраво Из ВозможныеПрава Цикл - Элементы.ГруппыПрав.ТекущиеДанные[ВозможноеПраво.Ключ] = Ложь; - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура ГруппыПравПравоПриИзменении(Элемент) - - // Обновить зависимости прав. - ЗависимыеПрава = Неопределено; - ТекущееПраво = Сред(Элемент.Имя, СтрДлина("ГруппыПрав")+1); - Если Элементы.ГруппыПрав.ТекущиеДанные[ТекущееПраво] Тогда - Если Элементы.ГруппыПрав.ТекущиеДанные.Запрещено Тогда - // Увеличены запрещения. - ОбратныеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); - ЗначениеЗависимогоПрава = Истина; - Иначе - // Увеличены разрешения. - ПрямыеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); - ЗначениеЗависимогоПрава = Истина; - КонецЕсли; - Иначе - Если Элементы.ГруппыПрав.ТекущиеДанные.Запрещено Тогда - // Уменьшены запрещения. - ПрямыеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); - ЗначениеЗависимогоПрава = Ложь; - Иначе - // Уменьшены разрешения. - ОбратныеЗависимостиПрав.Свойство(ТекущееПраво, ЗависимыеПрава); - ЗначениеЗависимогоПрава = Ложь; - КонецЕсли; - КонецЕсли; - - Если ЗависимыеПрава <> Неопределено Тогда - Для каждого ЗависимоеПраво Из ЗависимыеПрава Цикл - Элементы.ГруппыПрав.ТекущиеДанные[ЗависимоеПраво] = ЗначениеЗависимогоПрава; - КонецЦикла; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура ЗаписатьИЗакрыть(Команда) - - Отказ = Ложь; - ОчиститьСообщения(); - ЗаписатьПрава(Отказ); - - Если НЕ Отказ Тогда - Закрыть(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Записать(Команда) - - Отказ = Ложь; - РазрешеноУправлениеПравамиПослеЗаписи = Ложь; - ОписаниеПредупреждения = ""; - ОчиститьСообщения(); - ЗаписатьПрава(Отказ, РазрешеноУправлениеПравамиПослеЗаписи, ОписаниеПредупреждения); - - Если НЕ Отказ И НЕ РазрешеноУправлениеПравамиПослеЗаписи Тогда - Предупреждение(ОписаниеПредупреждения, 7, НСтр("ru = 'После успешной записи'")); - Закрыть(); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Перечитать(Команда) - - Если НЕ Модифицированность Тогда - ПрочитатьПрава(); - Иначе - Ответ = Вопрос(НСтр("ru = 'Данные изменены. Прочитать без сохранения?'"), - РежимДиалогаВопрос.ДаНет, - 5, - КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - ПрочитатьПрава(); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Подготовка таблиц прав, проверяемых в стандартных шаблонах ограничения доступа по возможным правам. -&НаСервере -Функция ПолучитьПраваТаблицДляШаблонов(ТаблицаЗначенийДоступа, Право) - - ПраваТаблицДляШаблонов = Новый Соответствие; - - ОписаниеПрава = УправлениеДоступомСлужебныйПовтИсп.Параметры( - ).ВозможныеПраваПоЗначениямДоступа.ПоПолнымИменам[ТаблицаЗначенийДоступа][Право]; - - Для каждого Таблица Из ОписаниеПрава.ЧтениеВТаблицах Цикл - ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); - Если ПраваТаблицы = Неопределено Тогда - ПраваТаблицы = СтруктураПрав(); - ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); - КонецЕсли; - ПраваТаблицы.Чтение = Истина; - КонецЦикла; - - Для каждого Таблица Из ОписаниеПрава.ДобавлениеВТаблицах Цикл - ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); - Если ПраваТаблицы = Неопределено Тогда - ПраваТаблицы = СтруктураПрав(); - ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); - КонецЕсли; - ПраваТаблицы.Добавление = Истина; - КонецЦикла; - - Для каждого Таблица Из ОписаниеПрава.ИзменениеВТаблицах Цикл - ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); - Если ПраваТаблицы = Неопределено Тогда - ПраваТаблицы = СтруктураПрав(); - ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); - КонецЕсли; - ПраваТаблицы.Изменение = Истина; - КонецЦикла; - - Для каждого Таблица Из ОписаниеПрава.УдалениеВТаблицах Цикл - ПраваТаблицы = ПраваТаблицДляШаблонов.Получить(Таблица); - Если ПраваТаблицы = Неопределено Тогда - ПраваТаблицы = СтруктураПрав(); - ПраваТаблицДляШаблонов.Вставить(Таблица, ПраваТаблицы); - КонецЕсли; - ПраваТаблицы.Удаление = Истина; - КонецЦикла; - - Если ПраваТаблицДляШаблонов.Количество() = 0 Тогда - ПраваТаблицДляШаблонов.Вставить("", СтруктураПрав()); - КонецЕсли; - - Возврат ПраваТаблицДляШаблонов; - -КонецФункции - -&НаСервере -Функция СтруктураПрав() - - Возврат Новый Структура("Чтение, Добавление, Изменение, Удаление", Ложь, Ложь, Ложь, Ложь); - -КонецФункции - -&НаСервере -Процедура ДобавитьРеквизит(НовыеРеквизиты, Реквизит, НачальноеЗначение) - - НовыеРеквизиты.Добавить(Реквизит); - ДобавленныеРеквизиты.Вставить(Реквизит.Имя, НачальноеЗначение); - -КонецПроцедуры - -&НаСервере -Функция ДобавитьЭлемент(Имя, Тип, Родитель) - - Элемент = Элементы.Добавить(Имя, Тип, Родитель); - Элемент.ФиксацияВТаблице = ФиксацияВТаблице.Нет; - ДобавленныеЭлементы.Вставить(Имя); - Возврат Элемент; - -КонецФункции - -&НаСервере -Процедура ДобавитьРеквизитыЭлементыФормы(НовыеРеквизиты = Неопределено) - - ОписанияВозможныхПрав = УправлениеДоступомСлужебныйПовтИсп.Параметры( - ).ВозможныеПраваПоЗначениямДоступа.ПоПолнымИменам[ТаблицаЗначенийДоступа]; - - Если НовыеРеквизиты <> Неопределено Тогда - - // Добавление реквизита формы Пользователь. - МассивТипов = Новый Массив; - МассивТипов.Добавить(Тип("СправочникСсылка.Пользователи")); - МассивТипов.Добавить(Тип("СправочникСсылка.ГруппыПользователей")); - МассивТипов.Добавить(Тип("СправочникСсылка.ВнешниеПользователи")); - МассивТипов.Добавить(Тип("СправочникСсылка.ГруппыВнешнихПользователей")); - ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); - - РеквизитФормы = Новый РеквизитФормы( - "Пользователь", - ОписаниеТипов, - "ГруппыПрав", - НСтр("ru = 'Пользователь'")); - - ДобавитьРеквизит(НовыеРеквизиты, РеквизитФормы, Справочники.Пользователи.ПустаяСсылка()); - - // Добавление реквизита формы НомерКартинки. - РеквизитФормы = Новый РеквизитФормы( - "НомерКартинки", - Новый ОписаниеТипов("Число"), - "ГруппыПрав"); - - ДобавитьРеквизит(НовыеРеквизиты, РеквизитФормы, -1); - Иначе - Элемент = ДобавитьЭлемент("ГруппыПравПользователь", Тип("ПолеФормы"), Элементы.ГруппыПрав); - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.ПутьКДанным = "ГруппыПрав.Пользователь"; - Элемент.ТолькоПросмотр = Ложь; - Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравПользовательПриИзменении"); - Элемент.УстановитьДействие("НачалоВыбора", "ГруппыПравПользовательНачалоВыбора"); - Элемент.УстановитьДействие("Очистка", "ГруппыПравПользовательОчистка"); - Элемент.УстановитьДействие("ОкончаниеВводаТекста", "ГруппыПравПользовательОкончаниеВводаТекста"); - Элемент.УстановитьДействие("АвтоПодбор", "ГруппыПравПользовательАвтоПодбор"); - - Элементы.ГруппыПрав.ПутьКДаннымКартинкиСтроки = "ГруппыПрав.НомерКартинки"; - КонецЕсли; - - // Добавление возможных прав, настраиваемых по владельцу (таблице значений доступа). - Для каждого КлючИЗначение Из ОписанияВозможныхПрав Цикл - ОписаниеПрава = КлючИЗначение.Значение; - - Если НовыеРеквизиты <> Неопределено Тогда - // Добавление реквизита формы права. - РеквизитФормы = Новый РеквизитФормы( - ОписаниеПрава.Имя, - Новый ОписаниеТипов("Булево"), - "ГруппыПрав", - ОписаниеПрава.Синоним); - - ДобавитьРеквизит(НовыеРеквизиты, РеквизитФормы, ОписаниеПрава.НачальноеЗначение); - - ВозможныеПрава.Вставить(ОписаниеПрава.Имя); - - // Добавление прямых и обратных зависимостей прав. - ПрямыеЗависимостиПрав.Вставить(ОписаниеПрава.Имя, ОписаниеПрава.ТребуемыеПрава); - Для каждого ЗависимоеПраво Из ОписаниеПрава.ТребуемыеПрава Цикл - Если ОбратныеЗависимостиПрав.Свойство(ЗависимоеПраво) Тогда - ЗависимыеПрава = ОбратныеЗависимостиПрав[ЗависимоеПраво]; - Иначе - ЗависимыеПрава = Новый Массив; - ОбратныеЗависимостиПрав.Вставить(ЗависимоеПраво, ЗависимыеПрава); - КонецЕсли; - Если ЗависимыеПрава.Найти(ОписаниеПрава.Имя) = Неопределено Тогда - ЗависимыеПрава.Добавить(ОписаниеПрава.Имя); - КонецЕсли; - КонецЦикла; - Иначе - Элемент = ДобавитьЭлемент( - "ГруппыПрав" + ОписаниеПрава.Имя, - Тип("ПолеФормы"), - Элементы.ГруппыПрав); - - Элемент.Вид = ВидПоляФормы.ПолеФлажка; - Элемент.ПутьКДанным = "ГруппыПрав."+ ОписаниеПрава.Имя; - Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравПравоПриИзменении"); - Если ЗначениеЗаполнено(ОписаниеПрава.Заголовок) Тогда - Элемент.Заголовок = ОписаниеПрава.Заголовок; - ИначеЕсли ЗначениеЗаполнено(ОписаниеПрава.Сокращение) Тогда - Элемент.Заголовок = ОписаниеПрава.Сокращение; - Иначе - Элемент.Заголовок = ОписаниеПрава.Имя; - КонецЕсли; - Элемент.Подсказка = ОписаниеПрава.Синоним; - КонецЕсли; - КонецЦикла; - - Если НовыеРеквизиты <> Неопределено Тогда - - ТипыНаследуетсяОт = Метаданные.РегистрыСведений.ПраваПоЗначениямДоступа - .Измерения.ЗначениеДоступа.Тип.Типы(); - - ТипыНаследуетсяОт.Добавить(Тип("Строка")); - - // Добавление реквизита формы НаследуетсяОт. - РеквизитФормы = Новый РеквизитФормы( - "НаследуетсяОт", - Новый ОписаниеТипов(ТипыНаследуетсяОт), - "ГруппыПрав", - НСтр("ru = 'Наследуется от'")); - - ДобавитьРеквизит(НовыеРеквизиты, РеквизитФормы, НСтр("ru = '<не наследуется>'")); - Иначе - Элемент = ДобавитьЭлемент( - "ГруппыПравНаследуетсяОт", - Тип("ПолеФормы"), - Элементы.ГруппыПрав); - - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.ПутьКДанным = "ГруппыПрав.НаследуетсяОт"; - Элемент.ТолькоПросмотр = Истина; - Элемент.Подсказка = НСтр("ru = 'Наследуется от (значения доступа)'"); - КонецЕсли; - - Если НовыеРеквизиты = Неопределено Тогда - Элемент = ДобавитьЭлемент("ГруппыПравЗапрещено", Тип("ПолеФормы"), Элементы.ГруппыПрав); - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.ПутьКДанным = "ГруппыПрав.Запрещено"; - Элемент.Заголовок = НСтр("ru = 'Тип прав'"); - Элемент.Формат = НСтр("ru = 'БЛ=Разрешить; БИ=Запретить'"); - Элемент.Подсказка = НСтр("ru = 'Запретить/Разрешить'"); - Элемент.УстановитьДействие("ПриИзменении", "ГруппыПравЗапрещеноПриИзменении"); - Элемент.ФорматРедактирования = Элемент.Формат; - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьПрава() - - ПрямыеЗависимостиПрав = Новый Структура; - ОбратныеЗависимостиПрав = Новый Структура; - ВозможныеПрава = Новый Структура; - - Если ДобавленныеЭлементы = Неопределено Тогда - ДобавленныеЭлементы = Новый Структура; - Иначе - // Удаление ранее добавленных элементов. - Для каждого ОписаниеЭлемента Из ДобавленныеЭлементы Цикл - Элементы.Удалить(Элементы[ОписаниеЭлемента.Ключ]); - КонецЦикла; - ДобавленныеЭлементы.Очистить(); - КонецЕсли; - - УдаляемыеРеквизиты = Новый Массив; - Если ДобавленныеРеквизиты = Неопределено Тогда - ДобавленныеРеквизиты = Новый Структура; - Иначе - // Подготовка массива удаляемых реквизитов. - Для каждого ОписаниеРеквизита Из ДобавленныеРеквизиты Цикл - УдаляемыеРеквизиты.Добавить("ГруппыПрав." + ОписаниеРеквизита.Ключ); - КонецЦикла; - ДобавленныеРеквизиты.Очистить(); - КонецЕсли; - - // Подготовка новых реквизитов формы. - НовыеРеквизиты = Новый Массив; - ДобавитьРеквизитыЭлементыФормы(НовыеРеквизиты); - - // Обновление реквизитов формы. - ИзменитьРеквизиты(НовыеРеквизиты, УдаляемыеРеквизиты); - - // Добавление новых элементов формы. - ДобавитьРеквизитыЭлементыФормы(); - - ПрочитатьПрава(); - -КонецПроцедуры - -&НаСервере -Процедура ПрочитатьПрава() - - УстановитьПривилегированныйРежим(Истина); - - ГруппыПрав.Очистить(); - Запрос = Новый Запрос; - - // Чтение прав по значению доступа (флажок НаследоватьПраваРодителей). - Запрос.УстановитьПараметр("ВидДоступа", ВидДоступа); - Запрос.УстановитьПараметр("ЗначениеДоступа", Параметры.СсылкаНаОбъект); - Запрос.Текст = - "ВЫБРАТЬ - | ИерархияЗначений.НаследоватьПраваРодителей - |ИЗ - | РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - |ГДЕ - | ИерархияЗначений.ГруппаЗначенийДоступа = &ЗначениеДоступа - | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа"; - Выборка = Запрос.Выполнить().Выбрать(); - НаследоватьПраваРодителей = ?(Выборка.Следующий(), Выборка.НаследоватьПраваРодителей, Ложь); - - // Чтение прав по значению доступа (без прав, наследуемых по иерархии). - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПраваПоЗначениямДоступа.Пользователь, - | ПраваПоЗначениямДоступа.Право, - | ПраваПоЗначениямДоступа.Запрещено, - | ПраваПоЗначениямДоступа.РаспространяетсяВИерархии - |ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа - |ГДЕ - | ПраваПоЗначениямДоступа.ЗначениеДоступа = &ЗначениеДоступа - | - |УПОРЯДОЧИТЬ ПО - | ПраваПоЗначениямДоступа.Пользователь"; - Выборка = Запрос.Выполнить().Выбрать(); - ТекущийПользователь = Неопределено; - Пока Выборка.Следующий() Цикл - Если ТекущийПользователь <> Выборка.Пользователь Тогда - ТекущийПользователь = Выборка.Пользователь; - ГруппаПрав = ГруппыПрав.Добавить(); - ГруппаПрав.НаследуетсяОт = НСтр("ru = '<не наследуется>'"); - ГруппаПрав.Пользователь = Выборка.Пользователь; - ГруппаПрав.Запрещено = Выборка.Запрещено; - ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; - КонецЕсли; - Если ВозможныеПрава.Свойство(Выборка.Право) Тогда - ГруппаПрав[Выборка.Право] = Истина; - КонецЕсли; - КонецЦикла; - - Если НаследоватьПраваРодителей Тогда - ДобавитьПраваНаследуемыеПоИерархии(); - КонецЕсли; - - ЗаполнитьНомераКартинокПользователей(); - - Модифицированность = Ложь; - -КонецПроцедуры - -&НаСервере -Процедура ДобавитьПраваНаследуемыеПоИерархии() - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ЗначениеДоступа", Параметры.СсылкаНаОбъект); - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ПраваПоЗначениямДоступа.ЗначениеДоступа КАК ВладелецПрава, - | ПраваПоЗначениямДоступа.Пользователь КАК Пользователь, - | ПраваПоЗначениямДоступа.Право, - | МАКСИМУМ(ПраваПоЗначениямДоступа.Запрещено) КАК Запрещено, - | МАКСИМУМ(ПраваПоЗначениямДоступа.РаспространяетсяВИерархии) КАК РаспространяетсяВИерархии - |ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениямДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - | ПО ПраваПоЗначениямДоступа.ЗначениеДоступа = ИерархияЗначений.ГруппаЗначенийДоступа - | И (ПраваПоЗначениямДоступа.ЗначениеДоступа <> &ЗначениеДоступа) - | И (ПраваПоЗначениямДоступа.РаспространяетсяВИерархии) - | И (ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа) - | - |СГРУППИРОВАТЬ ПО - | ПраваПоЗначениямДоступа.ЗначениеДоступа, - | ПраваПоЗначениямДоступа.Пользователь, - | ПраваПоЗначениямДоступа.Право - | - |УПОРЯДОЧИТЬ ПО - | ВладелецПрава, - | Пользователь"; - - Выборка = Запрос.Выполнить().Выбрать(); - ТекущийВладелецПрава = Неопределено; - ТекущийПользователь = Неопределено; - - Пока Выборка.Следующий() Цикл - - Если ТекущийВладелецПрава <> Выборка.ВладелецПрава - ИЛИ ТекущийПользователь <> Выборка.Пользователь Тогда - - ТекущийВладелецПрава = Выборка.ВладелецПрава; - ТекущийПользователь = Выборка.Пользователь; - ГруппаПрав = ГруппыПрав.Добавить(); - ГруппаПрав.НаследуетсяОт = Выборка.ВладелецПрава; - ГруппаПрав.Пользователь = Выборка.Пользователь; - ГруппаПрав.Запрещено = Выборка.Запрещено; - ГруппаПрав.РаспространяетсяВИерархии = Выборка.РаспространяетсяВИерархии; - КонецЕсли; - - Если ВозможныеПрава.Свойство(Выборка.Право) Тогда - ГруппаПрав[Выборка.Право] = Истина; - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура ЗаписатьПрава(Отказ = Ложь, РазрешеноУправлениеПравамиПослеЗаписи = Ложь, ОписаниеПредупреждения = "") - - Если НЕ ПроверитьЗаполнение() Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - ОписаниеОшибки = ""; - Если НЕ УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа( - Параметры.СсылкаНаОбъект, ОписаниеОшибки) Тогда - - ВызватьИсключение(ОписаниеОшибки); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - НачатьТранзакцию(); - Попытка - // Запись флажка "Наследовать права родителей". - НаборЗаписей = РегистрыСведений.ГруппыЗначенийДоступа.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ВидДоступа.Установить(ВидДоступа); - НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Параметры.СсылкаНаОбъект); - НаборЗаписей.Прочитать(); - - Если НаборЗаписей.Количество() = 0 Тогда - Запись = НаборЗаписей.Добавить(); - Запись.ВидДоступа = ВидДоступа; - Запись.ЗначениеДоступа = Параметры.СсылкаНаОбъект; - Запись.ГруппаЗначенийДоступа = Параметры.СсылкаНаОбъект; - КонецЕсли; - - Для каждого Запись Из НаборЗаписей Цикл - - Запись.ТолькоВидДоступа = Ложь; - Запись.СвязьСРодителем = Запись.ГруппаЗначенийДоступа <> Запись.ЗначениеДоступа; - - Запись.НаследоватьПраваРодителей = - ?(Запись.СвязьСРодителем, Ложь, НаследоватьПраваРодителей); - - Запись.ИспользоватьПраваСсылки = - ?(Запись.СвязьСРодителем, НаследоватьПраваРодителей, Истина); - КонецЦикла; - - НаборЗаписей.Записать(); - - // Подготовка новых прав в формате регистра, исключая права, наследуемые от родителей по иерархии. - НаборЗаписей = РегистрыСведений.ПраваПоЗначениямДоступа.СоздатьНаборЗаписей(); - - Для каждого ГруппаПрав ИЗ ГруппыПрав Цикл - Если ТипЗнч(ГруппаПрав.НаследуетсяОт) = Тип("Строка") Тогда - - Для каждого ВозможноеПраво Из ВозможныеПрава Цикл - Если ГруппаПрав[ВозможноеПраво.Ключ] Тогда - - ОписанияТаблиц = ПолучитьПраваТаблицДляШаблонов( - ТаблицаЗначенийДоступа, ВозможноеПраво.Ключ); - - Для каждого ОписаниеТаблицы Из ОписанияТаблиц Цикл - - Право = НаборЗаписей.Добавить(); - Право.ЗначениеДоступа = Параметры.СсылкаНаОбъект; - Право.Пользователь = ГруппаПрав.Пользователь; - Право.Право = ВозможноеПраво.Ключ; - Право.Запрещено = ГруппаПрав.Запрещено; - Право.РаспространяетсяВИерархии = ГруппаПрав.РаспространяетсяВИерархии; - - // Заполнение данных для стандартных шаблонов ограничения доступа. - Право.Таблица = ОписаниеТаблицы.Ключ; - Если Право.Запрещено Тогда - Право.ЧтениеЗапрещено = ОписаниеТаблицы.Значение.Чтение; - Право.ДобавлениеЗапрещено = ОписаниеТаблицы.Значение.Добавление; - Право.ИзменениеЗапрещено = ОписаниеТаблицы.Значение.Изменение; - Право.УдалениеЗапрещено = ОписаниеТаблицы.Значение.Удаление; - Иначе - Право.Чтение = ОписаниеТаблицы.Значение.Чтение; - Право.Добавление = ОписаниеТаблицы.Значение.Добавление; - Право.Изменение = ОписаниеТаблицы.Значение.Изменение; - Право.Удаление = ОписаниеТаблицы.Значение.Удаление; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - КонецЦикла; - - КонецЕсли; - КонецЦикла; - - НаборЗаписей.Отбор.ЗначениеДоступа.Установить(Параметры.СсылкаНаОбъект); - НаборЗаписей.Записать(); - - РазрешеноУправлениеПравамиПослеЗаписи - = УправлениеДоступом.РазрешеноУправлениеПравамиПоЗначениямДоступа( - Параметры.СсылкаНаОбъект, - ОписаниеПредупреждения); - - Модифицированность = Ложь; - ЗафиксироватьТранзакцию(); - - Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ОтменитьТранзакцию(); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Ошибка при записи прав:'") + Символы.ПС + ПредставлениеОшибки, , , , Отказ); - КонецПопытки; - -КонецПроцедуры - -&НаКлиенте -Процедура ПроверкаВозможностиИзмененияПрав(Отказ, ПроверкаУдаления = Ложь) - - Если ТипЗнч(Элементы.ГруппыПрав.ТекущиеДанные["НаследуетсяОт"]) <> Тип("Строка") Тогда - - Отказ = Истина; - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Эта наследуемая настройка редактируется только в форме - |""Права доступа: %1 (%2)"" .'"), - Элементы.ГруппыПрав.ТекущиеДанные["НаследуетсяОт"], - НазваниеЗначенийДоступа); - - ТекстСообщения = ТекстСообщения + ?( - ПроверкаУдаления, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = ' - | - |Для удаления всех наследуемых настроек для ""%1"" - |можно снять флажок ""Наследовать права родителей""."), - НаименованиеНастройки), - ""); - КонецЕсли; - - Если Отказ Тогда - Предупреждение(ТекстСообщения); - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) - - ВыборИПодборВнешнихПользователей = Ложь; - - Если ИспользоватьВнешнихПользователей Тогда - - Элемент = СписокТиповПользователей.ВыбратьЭлемент( - "Выбор типа данных", СписокТиповПользователей[0]); - - Если Элемент <> Неопределено Тогда - ВыборИПодборВнешнихПользователей = - Элемент.Значение = Тип("СправочникСсылка.ВнешниеПользователи"); - Иначе - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -&НаКлиенте -Процедура ВыбратьПользователей() - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ?( - Элементы.ГруппыПрав.ТекущиеДанные = Неопределено, - Неопределено, - Элементы.ГруппыПрав.ТекущиеДанные.Пользователь)); - - Если ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) - И ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.Пользователи") - ИЛИ ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыПользователей") ) Тогда - - ВыборИПодборВнешнихПользователей = Ложь; - - ИначеЕсли ИспользоватьВнешнихПользователей - И ЗначениеЗаполнено(ПараметрыФормы.ТекущаяСтрока) - И ( ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ВнешниеПользователи") - ИЛИ ТипЗнч(ПараметрыФормы.ТекущаяСтрока) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") ) Тогда - - ВыборИПодборВнешнихПользователей = Истина; - Иначе - Если НЕ ВыбранТипПользователиИлиВнешниеПользователи(ВыборИПодборВнешнихПользователей) Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Если ВыборИПодборВнешнихПользователей Тогда - ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); - Иначе - ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); - КонецЕсли; - - Если ВыборИПодборВнешнихПользователей Тогда - - ОткрытьФорму( - "Справочник.ВнешниеПользователи.ФормаВыбора", - ПараметрыФормы, - Элементы.ГруппыПравПользователь); - Иначе - ОткрытьФорму( - "Справочник.Пользователи.ФормаВыбора", - ПараметрыФормы, - Элементы.ГруппыПравПользователь); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьНомераКартинокПользователей(ИдентификаторСтроки = Неопределено) - - Если Элементы.Найти("ГруппыПравПользователь") = Неопределено Тогда - Возврат; - КонецЕсли; - - Пользователи.ЗаполнитьНомераКартинокПользователей( - ГруппыПрав, "Пользователь", "НомерКартинки", ИдентификаторСтроки); - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция СформироватьДанныеВыбораПользователя(Знач Текст, - Знач ВключаяГруппы = Истина, - Знач ВключаяВнешнихПользователей = Неопределено, - Знач БезПользователей = Ложь) - - Возврат Пользователи.СформироватьДанныеВыбораПользователя( - Текст, - ВключаяГруппы, - ВключаяВнешнихПользователей, - БезПользователей); - - -КонецФункции diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form index 791dab912..c28a34f42 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Form.form @@ -20,7 +20,7 @@ true - КартинкаПредупрежденияРасширеннаяПодсказка + КартинкаПредупрежденияExtendedTooltip 34 Label true @@ -61,7 +61,7 @@ true - Декорация1РасширеннаяПодсказка + Декорация1ExtendedTooltip 36 Label true @@ -103,7 +103,7 @@ Основная группа - ОсновнаяГруппаРасширеннаяПодсказка + ОсновнаяГруппаExtendedTooltip 35 Label true @@ -136,7 +136,7 @@ Верхняя группа - ВерхняяГруппаРасширеннаяПодсказка + ВерхняяГруппаExtendedTooltip 33 Label true @@ -168,7 +168,7 @@ true - ФормаДаРасширеннаяПодсказка + ФормаДаExtendedTooltip 31 Label true @@ -194,7 +194,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 32 Label true @@ -229,7 +229,7 @@ Retry SaveValues 55 - DontBlock + LockWholeInterface true true Vertical diff --git a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl index 8ff9ddd13..018014d42 100644 --- a/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl +++ b/SSL/src/CommonForms/ПредупрежденияПриЗавершенииРаботы/Module.bsl @@ -27,7 +27,7 @@ ПараметрыФормы = Неопределено; Если СтрокаВопроса.Значение.Свойство("ПараметрыФормы", ПараметрыФормы) Тогда КонецЕсли; - ОткрытьФорму(Форма, ПараметрыФормы, ЭтаФорма); + ОткрытьФорму(Форма, ПараметрыФормы, ЭтотОбъект); КонецЕсли; Прервать; КонецЕсли; @@ -45,7 +45,7 @@ Возврат; КонецЕсли; - ЗначениеЭлемента = ЭтаФорма[ИмяЭлемента]; + ЗначениеЭлемента = ЭтотОбъект[ИмяЭлемента]; Если ТипЗнч(ЗначениеЭлемента) <> Тип("Булево") Тогда Возврат; КонецЕсли; @@ -72,7 +72,6 @@ Процедура Завершить(Команда) ВыполнениеЗадачПриЗакрытии(); - Закрыть(Ложь); КонецПроцедуры @@ -280,7 +279,7 @@ НовыйРеквизит = Новый РеквизитФормы(ИмяФлажка, Описание, , ИмяФлажка, Ложь); ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); ИзменитьРеквизиты(ДобавляемыеРеквизиты); - ЭтаФорма[ИмяФлажка] = ЗначениеПоУмолчанию; + ЭтотОбъект[ИмяФлажка] = ЗначениеПоУмолчанию; НовоеПолеФормы = Элементы.Добавить(ИмяФлажка, ТипФлажка, РодительФлажка); НовоеПолеФормы.ПутьКДанным = ИмяФлажка; @@ -369,10 +368,15 @@ // Выполняет необходимые задачи. // &НаКлиенте -Процедура ВыполнениеЗадачПриЗакрытии() +Процедура ВыполнениеЗадачПриЗакрытии(Результат = Неопределено, НачальныйНомерЗадачи = Неопределено) Экспорт - Для каждого ЭлементМассива из МассивЗадачНаВыполнениеПослеЗакрытия цикл + Если НачальныйНомерЗадачи = Неопределено Тогда + НачальныйНомерЗадачи = 0; + КонецЕсли; + + Для НомерЗадачи = НачальныйНомерЗадачи По МассивЗадачНаВыполнениеПослеЗакрытия.Количество() - 1 Цикл + ЭлементМассива = МассивЗадачНаВыполнениеПослеЗакрытия[НомерЗадачи]; Использование = Неопределено; Если Не ЭлементМассива.Значение.Свойство("Использование", Использование) Тогда Продолжить; @@ -388,12 +392,16 @@ Если ЭлементМассива.Значение.Свойство("Форма", Форма) Тогда ПараметрыФормы = Неопределено; Если ЭлементМассива.Значение.Свойство("ПараметрыФормы", ПараметрыФормы) Тогда - ОткрытьФормуМодально(Форма, СтруктураИзФиксированнойСтруктуры(ПараметрыФормы)); + Оповещение = Новый ОписаниеОповещения("ВыполнениеЗадачПриЗакрытии", ЭтотОбъект, НомерЗадачи + 1); + ОткрытьФорму(Форма, СтруктураИзФиксированнойСтруктуры(ПараметрыФормы),,,,,Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + Возврат; КонецЕсли; КонецЕсли; КонецЦикла; -КонецПроцедуры + Закрыть(Ложь); + +КонецПроцедуры &НаКлиенте Функция СтруктураИзФиксированнойСтруктуры(Источник) diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ПрисоединенныеФайлы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form b/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form index a3d02100a..02c7dda93 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form +++ b/SSL/src/CommonForms/ПрисоединенныеФайлы/Form.form @@ -19,7 +19,7 @@ Delete SetDeletionMark - СписокПодписанЭЦП + СписокПодписанЭП 88 true true @@ -27,12 +27,12 @@ true - Список.ПодписанЭЦП + Список.ПодписанЭП None - СписокПодписанЭЦПРасширеннаяПодсказка - 166 + СписокПодписанЭПРасширеннаяПодсказка + 157 Label true true @@ -41,7 +41,7 @@ - СписокПодписанЭЦПКонтекстноеМеню + СписокПодписанЭПКонтекстноеМеню 89 true @@ -49,7 +49,7 @@ Enter true - CommonPicture.ПодписанЭЦП + CommonPicture.ПодписанЭП Left true @@ -59,7 +59,7 @@ true true - CommonPicture.ПодписанЭЦП + CommonPicture.ПодписанЭП @@ -80,8 +80,8 @@ None - СписокЗашифрованРасширеннаяПодсказка - 168 + СписокЗашифрованExtendedTooltip + 158 Label true true @@ -128,8 +128,8 @@ Список.Наименование - СписокНаименованиеРасширеннаяПодсказка - 170 + СписокНаименованиеExtendedTooltip + 159 Label true true @@ -164,8 +164,8 @@ Список.Описание - СписокОписаниеРасширеннаяПодсказка - 172 + СписокОписаниеExtendedTooltip + 160 Label true true @@ -200,8 +200,8 @@ Список.ДатаСоздания - СписокДатаСозданияРасширеннаяПодсказка - 174 + СписокДатаСозданияExtendedTooltip + 161 Label true true @@ -240,8 +240,8 @@ Местная дата изменения файла. - СписокДатаИзмененияРасширеннаяПодсказка - 176 + СписокДатаИзмененияExtendedTooltip + 162 Label true true @@ -276,8 +276,8 @@ Список.Автор - СписокАвторРасширеннаяПодсказка - 178 + СписокАвторExtendedTooltip + 163 Label true true @@ -316,8 +316,8 @@ Список.Размер - СписокРазмерРасширеннаяПодсказка - 180 + СписокРазмерExtendedTooltip + 164 Label true true @@ -373,10 +373,10 @@ СписокСтрокаПоиска - 157 + 165 СписокСтрокаПоискаРасширеннаяПодсказка - 159 + 167 Label true true @@ -386,7 +386,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 158 + 166 true Список @@ -396,10 +396,10 @@ СписокСостояниеПросмотра - 160 + 168 СписокСостояниеПросмотраРасширеннаяПодсказка - 162 + 170 Label true true @@ -409,7 +409,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 161 + 169 true ViewStatusAddition @@ -420,10 +420,10 @@ СписокУправлениеПоиском - 163 + 171 СписокУправлениеПоискомРасширеннаяПодсказка - 165 + 173 Label true true @@ -433,7 +433,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 164 + 172 true SearchControlAddition @@ -443,7 +443,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 156 Label true @@ -464,7 +464,7 @@ true - СписокКонтекстноеМенюСоздатьРасширеннаяПодсказка + СписокКонтекстноеМенюСоздатьExtendedTooltip 132 Label true @@ -493,7 +493,7 @@ true - СписокКонтекстноеМенюОткрытьФайлДляПросмотраРасширеннаяПодсказка + СписокКонтекстноеМенюОткрытьФайлДляПросмотраExtendedTooltip 134 Label true @@ -524,7 +524,7 @@ Список контекстное меню группа команд важное - СписокКонтекстноеМенюГруппаКомандВажноеРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандВажноеExtendedTooltip 133 Label true @@ -547,7 +547,7 @@ true - СписокКонтекстноеМенюРедактироватьРасширеннаяПодсказка + СписокКонтекстноеМенюРедактироватьExtendedTooltip 136 Label true @@ -573,7 +573,7 @@ true - СписокКонтекстноеМенюЗакончитьРедактированиеРасширеннаяПодсказка + СписокКонтекстноеМенюЗакончитьРедактированиеExtendedTooltip 137 Label true @@ -599,7 +599,7 @@ true - СписокКонтекстноеМенюОсвободитьРасширеннаяПодсказка + СписокКонтекстноеМенюОсвободитьExtendedTooltip 138 Label true @@ -630,7 +630,7 @@ Список контекстное меню группа команд совместный доступ - СписокКонтекстноеМенюГруппаКомандСовместныйДоступРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандСовместныйДоступExtendedTooltip 135 Label true @@ -653,7 +653,7 @@ true - СписокКонтекстноеМенюСкопироватьРасширеннаяПодсказка + СписокКонтекстноеМенюСкопироватьExtendedTooltip 140 Label true @@ -679,7 +679,7 @@ true - СписокКонтекстноеМенюУстановитьПометкуУдаленияРасширеннаяПодсказка + СписокКонтекстноеМенюУстановитьПометкуУдаленияExtendedTooltip 141 Label true @@ -705,7 +705,7 @@ true - СписокКонтекстноеМенюСохранитьКакРасширеннаяПодсказка + СписокКонтекстноеМенюСохранитьКакExtendedTooltip 142 Label true @@ -731,7 +731,7 @@ true - СписокКонтекстноеМенюОбновитьИзФайлаНаДискеРасширеннаяПодсказка + СписокКонтекстноеМенюОбновитьИзФайлаНаДискеExtendedTooltip 143 Label true @@ -761,7 +761,7 @@ true - СписокКонтекстноеМенюИзменитьРасширеннаяПодсказка + СписокКонтекстноеМенюИзменитьExtendedTooltip 144 Label true @@ -795,7 +795,7 @@ Список контекстное меню группа команд стандартные - СписокКонтекстноеМенюГруппаКомандСтандартныеРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандСтандартныеExtendedTooltip 139 Label true @@ -815,7 +815,7 @@ true - СписокКонтекстноеМенюОткрытьКаталогФайлаРасширеннаяПодсказка + СписокКонтекстноеМенюОткрытьКаталогФайлаExtendedTooltip 145 Label true @@ -844,7 +844,7 @@ true - СписокКонтекстноеМенюНайтиРасширеннаяПодсказка + СписокКонтекстноеМенюНайтиExtendedTooltip 147 Label true @@ -870,7 +870,7 @@ true - СписокКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка + СписокКонтекстноеМенюОтменитьПоискExtendedTooltip 148 Label true @@ -901,7 +901,7 @@ Список контекстное меню группа команд от списка - СписокКонтекстноеМенюГруппаКомандОтСпискаРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандОтСпискаExtendedTooltip 146 Label true @@ -913,10 +913,10 @@ - СписокКонтекстноеМенюГруппаКомандЭЦП + СписокКонтекстноеМенюГруппаКомандЭП 79 - СписокКонтекстноеМенюЭЦППодписать + СписокКонтекстноеМенюЭППодписать 80 true true @@ -924,7 +924,7 @@ true - СписокКонтекстноеМенюЭЦППодписатьРасширеннаяПодсказка + СписокКонтекстноеМенюЭППодписатьРасширеннаяПодсказка 150 Label true @@ -933,7 +933,7 @@ Left - Form.Command.ЭЦППодписать + Form.Command.ЭППодписать Normal Auto true @@ -942,7 +942,7 @@ Auto - СписокКонтекстноеМенюДобавитьЭЦПИзФайла + СписокКонтекстноеМенюДобавитьЭПИзФайла 81 true true @@ -950,7 +950,7 @@ true - СписокКонтекстноеМенюДобавитьЭЦПИзФайлаРасширеннаяПодсказка + СписокКонтекстноеМенюДобавитьЭПИзФайлаРасширеннаяПодсказка 151 Label true @@ -959,7 +959,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true @@ -968,7 +968,7 @@ Auto - СписокКонтекстноеМенюСохранитьВместеСЭЦП + СписокКонтекстноеМенюСохранитьВместеСЭП 82 true true @@ -976,7 +976,7 @@ true - СписокКонтекстноеМенюСохранитьВместеСЭЦПРасширеннаяПодсказка + СписокКонтекстноеМенюСохранитьВместеСЭПРасширеннаяПодсказка 152 Label true @@ -985,7 +985,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСЭП Normal Auto true @@ -1005,7 +1005,7 @@ true - СписокКонтекстноеМенюЗашифроватьРасширеннаяПодсказка + СписокКонтекстноеМенюЗашифроватьExtendedTooltip 154 Label true @@ -1031,7 +1031,7 @@ true - СписокКонтекстноеМенюРасшифроватьРасширеннаяПодсказка + СписокКонтекстноеМенюРасшифроватьExtendedTooltip 155 Label true @@ -1062,7 +1062,7 @@ Список контекстное меню группа команд шифрования - СписокКонтекстноеМенюГруппаКомандШифрованияРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандШифрованияExtendedTooltip 153 Label true @@ -1078,7 +1078,7 @@ true - Role.ИспользованиеЭЦП + Role.ИспользованиеЭП true @@ -1091,10 +1091,10 @@ ru - + Список контекстное меню группа команд ЭП - СписокКонтекстноеМенюГруппаКомандЭЦПРасширеннаяПодсказка + СписокКонтекстноеМенюГруппаКомандЭПРасширеннаяПодсказка 149 Label true @@ -1163,7 +1163,7 @@ true - ФормаСоздатьРасширеннаяПодсказка + ФормаСоздатьExtendedTooltip 103 Label true @@ -1192,7 +1192,7 @@ true - ФормаОткрытьФайлДляПросмотраРасширеннаяПодсказка + ФормаОткрытьФайлДляПросмотраExtendedTooltip 105 Label true @@ -1223,7 +1223,7 @@ Группа команд важное - ГруппаКомандВажноеРасширеннаяПодсказка + ГруппаКомандВажноеExtendedTooltip 104 Label true @@ -1246,7 +1246,7 @@ true - ФормаРедактироватьРасширеннаяПодсказка + ФормаРедактироватьExtendedTooltip 107 Label true @@ -1272,7 +1272,7 @@ true - ФормаЗакончитьРедактированиеРасширеннаяПодсказка + ФормаЗакончитьРедактированиеExtendedTooltip 108 Label true @@ -1298,7 +1298,7 @@ true - ФормаОсвободитьРасширеннаяПодсказка + ФормаОсвободитьExtendedTooltip 109 Label true @@ -1326,7 +1326,7 @@ Группа команд важное - ГруппаКомандСовместныйДоступРасширеннаяПодсказка + ГруппаКомандСовместныйДоступExtendedTooltip 106 Label true @@ -1338,10 +1338,10 @@ - ГруппаКомандЭЦП + ГруппаКомандЭП 72 - ФормаЭЦППодписать + ФормаЭППодписать 75 true true @@ -1349,7 +1349,7 @@ true - ФормаЭЦППодписатьРасширеннаяПодсказка + ФормаЭППодписатьРасширеннаяПодсказка 111 Label true @@ -1358,7 +1358,7 @@ Left - Form.Command.ЭЦППодписать + Form.Command.ЭППодписать Normal Auto true @@ -1367,7 +1367,7 @@ Auto - ФормаСохранитьВместеСЭЦП + ФормаСохранитьВместеСЭП 73 true true @@ -1375,7 +1375,7 @@ true - ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + ФормаСохранитьВместеСЭПРасширеннаяПодсказка 112 Label true @@ -1384,7 +1384,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСЭП Normal Auto true @@ -1393,7 +1393,7 @@ Auto - ФормаДобавитьЭЦПИзФайла + ФормаДобавитьЭПИзФайла 74 true true @@ -1401,7 +1401,7 @@ true - ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + ФормаДобавитьЭПИзФайлаРасширеннаяПодсказка 113 Label true @@ -1410,7 +1410,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true @@ -1430,7 +1430,7 @@ true - ФормаЗашифроватьРасширеннаяПодсказка + ФормаЗашифроватьExtendedTooltip 115 Label true @@ -1456,7 +1456,7 @@ true - ФормаРасшифроватьРасширеннаяПодсказка + ФормаРасшифроватьExtendedTooltip 116 Label true @@ -1487,7 +1487,7 @@ Группа кнопок шифрования - ГруппаКнопокШифрованияРасширеннаяПодсказка + ГруппаКнопокШифрованияExtendedTooltip 114 Label true @@ -1503,7 +1503,7 @@ true - Role.ИспользованиеЭЦП + Role.ИспользованиеЭП true @@ -1516,10 +1516,10 @@ ru - + Группа команд ЭП - ГруппаКомандЭЦПРасширеннаяПодсказка + ГруппаКомандЭПРасширеннаяПодсказка 110 Label true @@ -1546,7 +1546,7 @@ true - ФормаСкопироватьРасширеннаяПодсказка + ФормаСкопироватьExtendedTooltip 118 Label true @@ -1572,7 +1572,7 @@ true - ФормаУстановитьПометкуУдаленияРасширеннаяПодсказка + ФормаУстановитьПометкуУдаленияExtendedTooltip 119 Label true @@ -1599,7 +1599,7 @@ true - ФормаСохранитьКакРасширеннаяПодсказка + ФормаСохранитьКакExtendedTooltip 120 Label true @@ -1625,7 +1625,7 @@ true - ФормаОбновитьИзФайлаНаДискеРасширеннаяПодсказка + ФормаОбновитьИзФайлаНаДискеExtendedTooltip 121 Label true @@ -1652,7 +1652,7 @@ true - ФормаОткрытьСвойстваФайлаРасширеннаяПодсказка + ФормаОткрытьСвойстваФайлаExtendedTooltip 122 Label true @@ -1683,7 +1683,7 @@ Группа команд важное - ГруппаКомандСтандартныеРасширеннаяПодсказка + ГруппаКомандСтандартныеExtendedTooltip 117 Label true @@ -1703,7 +1703,7 @@ true - ФормаОткрытьКаталогФайлаРасширеннаяПодсказка + ФормаОткрытьКаталогФайлаExtendedTooltip 123 Label true @@ -1733,7 +1733,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 125 Label true @@ -1760,7 +1760,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 126 Label true @@ -1787,7 +1787,7 @@ true - ФормаНастройкаСпискаРасширеннаяПодсказка + ФормаНастройкаСпискаExtendedTooltip 127 Label true @@ -1813,7 +1813,7 @@ true - ФормаВывестиСписокРасширеннаяПодсказка + ФормаВывестиСписокExtendedTooltip 128 Label true @@ -1839,7 +1839,7 @@ true - ФормаОбновитьРасширеннаяПодсказка + ФормаОбновитьExtendedTooltip 129 Label true @@ -1865,7 +1865,7 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка + ФормаИзменитьФормуExtendedTooltip 130 Label true @@ -1897,7 +1897,7 @@ Группа команд от списка - ГруппаКомандОтСпискаРасширеннаяПодсказка + ГруппаКомандОтСпискаExtendedTooltip 124 Label true @@ -1917,7 +1917,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 131 Label true @@ -1983,11 +1983,14 @@ Список.Ref + + Список.ПодписанЭЦП + Список.Зашифрован - Список.ПодписанЭЦП + Список.ПодписанЭП Список.Ссылка @@ -2010,7 +2013,7 @@ ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК ДатаИзменения, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) КАК Автор, 0 КАК Размер, - ЛОЖЬ КАК ПодписанЭЦП, + ЛОЖЬ КАК ПодписанЭП, ЛОЖЬ КАК Зашифрован, ЛОЖЬ КАК ФайлРедактируется, ЛОЖЬ КАК ФайлРедактируетТекущийПользователь @@ -2132,7 +2135,7 @@ Auto - ЭЦППодписать + ЭППодписать <key>ru</key> <value>Подписать...</value> @@ -2146,14 +2149,14 @@ <common>true</common> </use> <picture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ЭЦППодписать</name> + <name>ЭППодписать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <representation>TextPicture</representation> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> @@ -2286,7 +2289,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>СохранитьВместеСЭЦП</name> + <name>СохранитьВместеСЭП</name> <title> <key>ru</key> <value>Сохранить вместе с ЭП...</value> @@ -2301,15 +2304,15 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СохранитьВместеСЭЦП</name> + <name>СохранитьВместеСЭП</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ДобавитьЭЦПИзФайла</name> + <name>ДобавитьЭПИзФайла</name> <title> <key>ru</key> <value>Добавить ЭП из файла...</value> @@ -2324,10 +2327,10 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ДобавитьЭЦПИзФайла</name> + <name>ДобавитьЭПИзФайла</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2353,7 +2356,7 @@ <name>Зашифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2376,7 +2379,7 @@ <name>Расшифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> diff --git a/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl b/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl index cc262bb52..6ce5f37e3 100644 --- a/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/CommonForms/ПрисоединенныеФайлы/Module.bsl @@ -247,28 +247,18 @@ КонецЕсли; ТекущиеДанные = Элементы.Список.ТекущиеДанные; - - Если ТекущиеДанные.Зашифрован - ИЛИ ТекущиеДанные.ПодписанЭЦП - ИЛИ ТекущиеДанные.ФайлРедактируется Тогда + Если ТекущиеДанные.Зашифрован Или ТекущиеДанные.ПодписанЭП Или ТекущиеДанные.ФайлРедактируется Тогда Возврат; КонецЕсли; ДанныеФайла = ПолучитьДанныеФайла(ТекущиеДанные.Ссылка, , Ложь); - - Если ДанныеФайла.Зашифрован - ИЛИ ДанныеФайла.ПодписанЭЦП - ИЛИ ДанныеФайла.ФайлРедактируется Тогда + Если ДанныеФайла.Зашифрован Или ДанныеФайла.ПодписанЭП Или ДанныеФайла.ФайлРедактируется Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; КонецЕсли; - Если ПрисоединенныеФайлыКлиент.ОбновитьПрисоединенныйФайл( - ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор) Тогда - - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); - КонецЕсли; + ПрисоединенныеФайлыСлужебныйКлиент.ОбновитьПрисоединенныйФайл(ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -338,20 +328,25 @@ КонецЕсли; ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ТекущиеДанные.Ссылка); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); - Если Результат = КодВозвратаДиалога.Да Тогда - УстановитьЗначениеПометкиУдаления(ТекущиеДанные.Ссылка, НЕ ТекущиеДанные.ПометкаУдаления); - Элементы.Список.Обновить(); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьПометкуУдаленияОтветПолучен", ЭтотОбъект, ТекущиеДанные); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); КонецПроцедуры +&НаКлиенте +Процедура УстановитьПометкуУдаленияОтветПолучен(РезультатВопроса, ТекущиеДанные) Экспорт + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + УстановитьЗначениеПометкиУдаления(ТекущиеДанные.Ссылка, НЕ ТекущиеДанные.ПометкаУдаления); + Элементы.Список.Обновить(); + КонецЕсли; +КонецПроцедуры + /////////////////////////////////////////////////////////////////////////////////// -// Обработчики команд для поддержки ЭЦП и шифрования +// Обработчики команд для поддержки ЭП и шифрования &НаКлиенте -Процедура ЭЦППодписать(Команда) +Процедура ЭППодписать(Команда) Если НЕ ПроверитьДействиеРазрешено() Тогда Возврат; @@ -373,16 +368,22 @@ Возврат; КонецЕсли; - Если ПрисоединенныеФайлыСлужебныйКлиент.СформироватьПодписьФайла(ТекущиеДанные.Ссылка, ДанныеФайла) Тогда - - ЭлектроннаяЦифроваяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ТекущиеДанные.Ссылка); - УстановитьДоступностьКнопок(); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ЭППодписатьПодписьСформирована", ЭтотОбъект, ТекущиеДанные); + ПрисоединенныеФайлыСлужебныйКлиент.СформироватьПодписьФайла(ОписаниеОповещения, ТекущиеДанные.Ссылка, ДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура СохранитьВместеСЭЦП(Команда) +Процедура ЭППодписатьПодписьСформирована(ПодписьСформирована, ТекущиеДанные) Экспорт + Если ПодписьСформирована Тогда + ЭлектроннаяПодписьКлиент.ИнформироватьОПодписанииОбъекта(ТекущиеДанные.Ссылка); + УстановитьДоступностьКнопок(); + КонецЕсли; +КонецПроцедуры + + +&НаКлиенте +Процедура СохранитьВместеСЭП(Команда) Если НЕ ПроверитьДействиеРазрешено() Тогда Возврат; @@ -402,12 +403,12 @@ Возврат; КонецЕсли; - ПрисоединенныеФайлыКлиент.СохранитьВместеСЭЦП(ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); + ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП(ТекущиеДанные.Ссылка, ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры &НаКлиенте -Процедура ДобавитьЭЦПИзФайла(Команда) +Процедура ДобавитьЭПИзФайла(Команда) Если НЕ ПроверитьДействиеРазрешено() Тогда Возврат; @@ -420,7 +421,7 @@ Возврат; КонецЕсли; - ПрисоединенныеФайлыСлужебныйКлиент.ДобавитьЭЦПИзФайла( + ПрисоединенныеФайлыСлужебныйКлиент.ДобавитьЭПИзФайла( ТекущиеДанные.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -497,7 +498,7 @@ Если (ТекущиеДанные.ФайлРедактируется И НЕ ТекущиеДанные.ФайлРедактируетТекущийПользователь) ИЛИ ТекущиеДанные.Зашифрован - ИЛИ ТекущиеДанные.ПодписанЭЦП Тогда + ИЛИ ТекущиеДанные.ПодписанЭП Тогда Возврат; КонецЕсли; @@ -506,7 +507,7 @@ Если ( ДанныеФайла.ФайлРедактируется И НЕ ДанныеФайла.ФайлРедактируетТекущийПользователь) ИЛИ ДанныеФайла.Зашифрован - ИЛИ ДанныеФайла.ПодписанЭЦП Тогда + ИЛИ ДанныеФайла.ПодписанЭП Тогда // Файл может быть изменен в другом сеансе. ОповеститьОбИзменении(ТекущиеДанные.Ссылка); Возврат; @@ -545,13 +546,16 @@ Возврат; КонецЕсли; - ИнформацияОФайле = Новый Структура; + ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьРедактированиеВыполненоПомещение", ЭтотОбъект, ТекущиеДанные); + ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище(ОписаниеОповещения, ДанныеФайла, УникальныйИдентификатор); - Если ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище( - ДанныеФайла, ИнформацияОФайле, УникальныйИдентификатор) Тогда - +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактированиеВыполненоПомещение(ИнформацияОФайле, ТекущиеДанные) Экспорт + + Если ИнформацияОФайле <> Неопределено Тогда ПоместитьФайлВХранилищеИОсвободить(ТекущиеДанные.Ссылка, ИнформацияОФайле); - ОповеститьОбИзменении(ТекущиеДанные.Ссылка); УстановитьДоступностьКнопок(); КонецЕсли; @@ -626,14 +630,14 @@ |другим пользователем.'"); КонецЕсли; - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(, ТекстПредупреждения); Возврат Ложь; КонецЕсли; Если ТипЗнч(Элементы.Список.ТекущаяСтрока) = ТипСправочникаСФайлами Тогда Возврат Истина; Иначе - Предупреждение(НСтр("ru = 'Действие недоступно для строки группировки списка.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Действие недоступно для строки группировки списка.'")); Возврат Ложь; КонецЕсли; @@ -693,7 +697,7 @@ ИменаКоманд = ПолучитьДоступныеКоманды( ТекущиеДанные.ФайлРедактируется, ТекущиеДанные.ФайлРедактируетТекущийПользователь, - ТекущиеДанные.ПодписанЭЦП, + ТекущиеДанные.ПодписанЭП, ТекущиеДанные.Зашифрован); КонецЕсли; @@ -773,7 +777,7 @@ | ДОБАВИТЬКДАТЕ(Файлы.ДатаМодификацииУниверсальная, СЕКУНДА, &СекундДоМестногоВремени) КАК ДатаИзменения, | Файлы.Автор, | Файлы.Размер КАК Размер, - | Файлы.ПодписанЭЦП, + | Файлы.ПодписанЭП, | Файлы.Зашифрован, | ВЫБОР | КОГДА Файлы.Редактирует = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) @@ -828,9 +832,9 @@ ИменаКоманд.Добавить("Освободить"); ИменаКоманд.Добавить("Редактировать"); - ИменаКоманд.Добавить("ЭЦППодписать"); - ИменаКоманд.Добавить("ДобавитьЭЦПИзФайла"); - ИменаКоманд.Добавить("СохранитьВместеСЭЦП"); + ИменаКоманд.Добавить("ЭППодписать"); + ИменаКоманд.Добавить("ДобавитьЭПИзФайла"); + ИменаКоманд.Добавить("СохранитьВместеСЭП"); ИменаКоманд.Добавить("Зашифровать"); ИменаКоманд.Добавить("Расшифровать"); @@ -877,7 +881,7 @@ УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); КонецЕсли; - УдалитьКомандыЭЦП(ИменаКоманд); + УдалитьКомандыЭП(ИменаКоманд); УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьКак"); @@ -897,7 +901,7 @@ КонецЕсли; Если ФайлЗашифрован Тогда - УдалитьКомандыЭЦП(ИменаКоманд); + УдалитьКомандыЭП(ИменаКоманд); УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); @@ -918,11 +922,11 @@ КонецФункции &НаКлиентеНаСервереБезКонтекста -Процедура УдалитьКомандыЭЦП(ИменаКоманд) +Процедура УдалитьКомандыЭП(ИменаКоманд) - УдалитьКомандуИзМассива(ИменаКоманд, "ЭЦППодписать"); - УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭЦПИзФайла"); - УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭЦП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ЭППодписать"); + УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭПИзФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); КонецПроцедуры diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form b/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form index ef4a5f20a..949ab4d31 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form +++ b/SSL/src/CommonForms/ПрисоединенныйФайл/Form.form @@ -17,7 +17,7 @@ <value>Группа общая информация</value> </toolTip> <extendedTooltip> - <name>ГруппаОбщаяИнформацияРасширеннаяПодсказка</name> + <name>ГруппаОбщаяИнформацияExtendedTooltip</name> <id>77</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -51,7 +51,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаСведенияЧасть1РасширеннаяПодсказка</name> + <name>ГруппаСведенияЧасть1ExtendedTooltip</name> <id>80</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -79,7 +79,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаСведенияЧасть2РасширеннаяПодсказка</name> + <name>ГруппаСведенияЧасть2ExtendedTooltip</name> <id>81</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -112,7 +112,7 @@ <value>Сведения о файле</value> </toolTip> <extendedTooltip> - <name>ГруппаСведенияОФайлеРасширеннаяПодсказка</name> + <name>ГруппаСведенияОФайлеExtendedTooltip</name> <id>79</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -127,7 +127,7 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>ГруппаЭЦП</name> + <name>ГруппаЭП</name> <id>27</id> <items xsi:type="form:Table"> <name>ТаблицаПодписей</name> @@ -163,8 +163,8 @@ <segments>ТаблицаПодписей.КомуВыданСертификат</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейКомуВыданСертификатРасширеннаяПодсказка</name> - <id>99</id> + <name>ТаблицаПодписейКомуВыданСертификатExtendedTooltip</name> + <id>90</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -204,8 +204,8 @@ <segments>ТаблицаПодписей.ДатаПодписи</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейДатаПодписиРасширеннаяПодсказка</name> - <id>101</id> + <name>ТаблицаПодписейДатаПодписиExtendedTooltip</name> + <id>91</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -245,8 +245,8 @@ <segments>ТаблицаПодписей.Комментарий</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейКомментарийРасширеннаяПодсказка</name> - <id>103</id> + <name>ТаблицаПодписейКомментарийExtendedTooltip</name> + <id>92</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -286,8 +286,8 @@ <segments>ТаблицаПодписей.Статус</segments> </dataPath> <extendedTooltip> - <name>ТаблицаПодписейСтатусРасширеннаяПодсказка</name> - <id>105</id> + <name>ТаблицаПодписейСтатусExtendedTooltip</name> + <id>93</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -319,7 +319,7 @@ <name>ТаблицаПодписейКоманднаяПанель</name> <id>34</id> <items xsi:type="form:Button"> - <name>ТаблицаПодписейПодписатьФайлЭЦП</name> + <name>ТаблицаПодписейПодписатьФайлЭП</name> <id>43</id> <visible>true</visible> <enabled>true</enabled> @@ -327,7 +327,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейПодписатьФайлЭЦПРасширеннаяПодсказка</name> + <name>ТаблицаПодписейПодписатьФайлЭПРасширеннаяПодсказка</name> <id>83</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -336,7 +336,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ПодписатьФайлЭЦП</commandName> + <commandName>Form.Command.ПодписатьФайлЭП</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -345,7 +345,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ТаблицаПодписейКомандаЭЦПСписокОткрытьСертификат</name> + <name>ТаблицаПодписейКомандаЭПСписокОткрытьСертификат</name> <id>44</id> <visible>true</visible> <enabled>true</enabled> @@ -353,7 +353,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейКомандаЭЦПСписокОткрытьСертификатРасширеннаяПодсказка</name> + <name>ТаблицаПодписейКомандаЭПСписокОткрытьСертификатРасширеннаяПодсказка</name> <id>84</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -371,7 +371,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ТаблицаПодписейПроверитьЭЦП</name> + <name>ТаблицаПодписейПроверитьЭП</name> <id>46</id> <visible>true</visible> <enabled>true</enabled> @@ -379,7 +379,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейПроверитьЭЦПРасширеннаяПодсказка</name> + <name>ТаблицаПодписейПроверитьЭПРасширеннаяПодсказка</name> <id>85</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -388,7 +388,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.ПроверитьЭЦП</commandName> + <commandName>Form.Command.ПроверитьЭП</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -405,7 +405,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейПроверитьВсеРасширеннаяПодсказка</name> + <name>ТаблицаПодписейПроверитьВсеExtendedTooltip</name> <id>86</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -431,7 +431,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейСохранитьПодписьРасширеннаяПодсказка</name> + <name>ТаблицаПодписейСохранитьПодписьExtendedTooltip</name> <id>87</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -449,7 +449,7 @@ <representationInContextMenu>Auto</representationInContextMenu> </items> <items xsi:type="form:Button"> - <name>ТаблицаПодписейУдалитьЭЦП</name> + <name>ТаблицаПодписейУдалитьЭП</name> <id>45</id> <visible>true</visible> <enabled>true</enabled> @@ -457,7 +457,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаПодписейУдалитьЭЦПРасширеннаяПодсказка</name> + <name>ТаблицаПодписейУдалитьЭПРасширеннаяПодсказка</name> <id>88</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -466,7 +466,7 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <commandName>Form.Command.УдалитьЭЦП</commandName> + <commandName>Form.Command.УдалитьЭП</commandName> <buttonImportance>Normal</buttonImportance> <representation>Auto</representation> <autoMaxWidth>true</autoMaxWidth> @@ -482,10 +482,10 @@ </handlers> <searchStringAddition> <name>ТаблицаПодписейСтрокаПоиска</name> - <id>90</id> + <id>98</id> <extendedTooltip> <name>ТаблицаПодписейСтрокаПоискаРасширеннаяПодсказка</name> - <id>92</id> + <id>100</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -495,7 +495,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейСтрокаПоискаКонтекстноеМеню</name> - <id>91</id> + <id>99</id> <autoFill>true</autoFill> </contextMenu> <source>ТаблицаПодписей</source> @@ -505,10 +505,10 @@ </searchStringAddition> <viewStatusAddition> <name>ТаблицаПодписейСостояниеПросмотра</name> - <id>93</id> + <id>101</id> <extendedTooltip> <name>ТаблицаПодписейСостояниеПросмотраРасширеннаяПодсказка</name> - <id>95</id> + <id>103</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -518,7 +518,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейСостояниеПросмотраКонтекстноеМеню</name> - <id>94</id> + <id>102</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -529,10 +529,10 @@ </viewStatusAddition> <searchControlAddition> <name>ТаблицаПодписейУправлениеПоиском</name> - <id>96</id> + <id>104</id> <extendedTooltip> <name>ТаблицаПодписейУправлениеПоискомРасширеннаяПодсказка</name> - <id>98</id> + <id>106</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -542,7 +542,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаПодписейУправлениеПоискомКонтекстноеМеню</name> - <id>97</id> + <id>105</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -552,7 +552,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ТаблицаПодписейРасширеннаяПодсказка</name> + <name>ТаблицаПодписейExtendedTooltip</name> <id>89</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -599,7 +599,7 @@ <userVisible> <for> <value>true</value> - <role>Role.ИспользованиеЭЦП</role> + <role>Role.ИспользованиеЭП</role> </for> <for> <value>true</value> @@ -612,10 +612,10 @@ ru - + Группа ЭП - ГруппаЭЦПРасширеннаяПодсказка + ГруппаЭПРасширеннаяПодсказка 82 Label true @@ -657,8 +657,8 @@ СертификатыШифрования.Представление - СертификатыШифрованияПредставлениеРасширеннаяПодсказка - 127 + СертификатыШифрованияПредставлениеExtendedTooltip + 97 Label true true @@ -698,8 +698,8 @@ true - СертификатыШифрованияОткрытьСертификатШифрованияРасширеннаяПодсказка - 116 + СертификатыШифрованияОткрытьСертификатШифрованияExtendedTooltip + 95 Label true true @@ -723,10 +723,10 @@ СертификатыШифрованияСтрокаПоиска - 118 + 119 СертификатыШифрованияСтрокаПоискаРасширеннаяПодсказка - 120 + 121 Label true true @@ -736,7 +736,7 @@ СертификатыШифрованияСтрокаПоискаКонтекстноеМеню - 119 + 120 true СертификатыШифрования @@ -746,10 +746,10 @@ СертификатыШифрованияСостояниеПросмотра - 121 + 122 СертификатыШифрованияСостояниеПросмотраРасширеннаяПодсказка - 123 + 124 Label true true @@ -759,7 +759,7 @@ СертификатыШифрованияСостояниеПросмотраКонтекстноеМеню - 122 + 123 true ViewStatusAddition @@ -770,10 +770,10 @@ СертификатыШифрованияУправлениеПоиском - 124 + 125 СертификатыШифрованияУправлениеПоискомРасширеннаяПодсказка - 126 + 127 Label true true @@ -783,7 +783,7 @@ СертификатыШифрованияУправлениеПоискомКонтекстноеМеню - 125 + 126 true SearchControlAddition @@ -793,8 +793,8 @@ - СертификатыШифрованияРасширеннаяПодсказка - 117 + СертификатыШифрованияExtendedTooltip + 96 Label true true @@ -838,7 +838,7 @@ true - Role.ИспользованиеЭЦП + Role.ИспользованиеЭП true @@ -854,8 +854,8 @@ Шифрование - ГруппаШифрованиеРасширеннаяПодсказка - 115 + ГруппаШифрованиеExtendedTooltip + 94 Label true true @@ -882,7 +882,7 @@ Группа дополнительные данные страницы - ГруппаДополнительныеДанныеСтраницыРасширеннаяПодсказка + ГруппаДополнительныеДанныеСтраницыExtendedTooltip 78 Label true @@ -909,7 +909,7 @@ true - ФормаСтандартнаяЗаписатьИЗакрытьРасширеннаяПодсказка + ФормаСтандартнаяЗаписатьИЗакрытьExtendedTooltip 57 Label true @@ -934,7 +934,7 @@ true - ФормаСтандартнаяЗаписатьРасширеннаяПодсказка + ФормаСтандартнаяЗаписатьExtendedTooltip 58 Label true @@ -960,7 +960,7 @@ true - ФормаСтандартнаяПеречитатьРасширеннаяПодсказка + ФормаСтандартнаяПеречитатьExtendedTooltip 59 Label true @@ -987,7 +987,7 @@ true - ФормаСтандартныеСкопироватьРасширеннаяПодсказка + ФормаСтандартныеСкопироватьExtendedTooltip 60 Label true @@ -1014,7 +1014,7 @@ true - ФормаСтандартныеУстановитьПометкуУдаленияРасширеннаяПодсказка + ФормаСтандартныеУстановитьПометкуУдаленияExtendedTooltip 61 Label true @@ -1044,7 +1044,7 @@ true - ФормаОткрытьФайлДляПросмотраРасширеннаяПодсказка + ФормаОткрытьФайлДляПросмотраExtendedTooltip 63 Label true @@ -1070,7 +1070,7 @@ true - ФормаРедактироватьРасширеннаяПодсказка + ФормаРедактироватьExtendedTooltip 64 Label true @@ -1096,7 +1096,7 @@ true - ФормаЗакончитьРедактированиеРасширеннаяПодсказка + ФормаЗакончитьРедактированиеExtendedTooltip 65 Label true @@ -1122,7 +1122,7 @@ true - ФормаОсвободитьРасширеннаяПодсказка + ФормаОсвободитьExtendedTooltip 66 Label true @@ -1149,7 +1149,7 @@ true - ФормаСохранитьКакРасширеннаяПодсказка + ФормаСохранитьКакExtendedTooltip 67 Label true @@ -1175,7 +1175,7 @@ true - ФормаОбновитьИзФайлаНаДискеРасширеннаяПодсказка + ФормаОбновитьИзФайлаНаДискеExtendedTooltip 68 Label true @@ -1202,7 +1202,7 @@ true - ФормаОткрытьКаталогФайлаРасширеннаяПодсказка + ФормаОткрытьКаталогФайлаExtendedTooltip 69 Label true @@ -1234,7 +1234,7 @@ Файловые функции - ГруппаФайловыеФункцииРасширеннаяПодсказка + ГруппаФайловыеФункцииExtendedTooltip 62 Label true @@ -1246,10 +1246,10 @@ - ГруппаЭЦПИШифрование + ГруппаЭПИШифрование 17 - ФормаПодписатьФайлЭЦП + ФормаПодписатьФайлЭП 19 true true @@ -1257,7 +1257,7 @@ true - ФормаПодписатьФайлЭЦПРасширеннаяПодсказка + ФормаПодписатьФайлЭПРасширеннаяПодсказка 71 Label true @@ -1266,7 +1266,7 @@ Left - Form.Command.ПодписатьФайлЭЦП + Form.Command.ПодписатьФайлЭП Normal Auto true @@ -1275,7 +1275,7 @@ Auto - ФормаДобавитьЭЦПИзФайла + ФормаДобавитьЭПИзФайла 20 true true @@ -1283,7 +1283,7 @@ true - ФормаДобавитьЭЦПИзФайлаРасширеннаяПодсказка + ФормаДобавитьЭПИзФайлаРасширеннаяПодсказка 72 Label true @@ -1292,7 +1292,7 @@ Left - Form.Command.ДобавитьЭЦПИзФайла + Form.Command.ДобавитьЭПИзФайла Normal Auto true @@ -1301,7 +1301,7 @@ Auto - ФормаСохранитьВместеСЭЦП + ФормаСохранитьВместеСЭП 21 true true @@ -1309,7 +1309,7 @@ true - ФормаСохранитьВместеСЭЦПРасширеннаяПодсказка + ФормаСохранитьВместеСЭПРасширеннаяПодсказка 73 Label true @@ -1318,7 +1318,7 @@ Left - Form.Command.СохранитьВместеСЭЦП + Form.Command.СохранитьВместеСЭП Normal Auto true @@ -1338,7 +1338,7 @@ true - ФормаЗашифроватьРасширеннаяПодсказка + ФормаЗашифроватьExtendedTooltip 75 Label true @@ -1364,7 +1364,7 @@ true - ФормаРасшифроватьРасширеннаяПодсказка + ФормаРасшифроватьExtendedTooltip 76 Label true @@ -1395,7 +1395,7 @@ Группу шифрование - ГруппуШифрованиеРасширеннаяПодсказка + ГруппуШифрованиеExtendedTooltip 74 Label true @@ -1411,7 +1411,7 @@ true - Role.ИспользованиеЭЦП + Role.ИспользованиеЭП true @@ -1424,10 +1424,10 @@ ru - + Группа ЭПИШифрование - ГруппаЭЦПИШифрованиеРасширеннаяПодсказка + ГруппаЭПИШифрованиеРасширеннаяПодсказка 70 Label true @@ -1572,7 +1572,7 @@ true - FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи + FunctionalOption.ИспользоватьЭлектронныеПодписи КомуВыданСертификат @@ -1855,10 +1855,10 @@ </edit> </attributes> <attributes> - <name>ПерсональныеНастройкиРаботыСЭЦП</name> + <name>ПерсональныеНастройкиРаботыСЭП</name> <title> <key>ru</key> - <value>Персональные настройки работы с ЭП</value> + <value>Персональные настройки работы СЭП</value> 10 @@ -1997,7 +1997,7 @@ Auto - ПодписатьФайлЭЦП + ПодписатьФайлЭП <key>ru</key> <value>Подписать...</value> @@ -2011,14 +2011,14 @@ <common>true</common> </use> <picture xsi:type="core:PictureRef"> - <picture>CommonPicture.ПодписанЭЦП</picture> + <picture>CommonPicture.ПодписанЭП</picture> </picture> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ПодписатьФайлЭЦП</name> + <name>ПодписатьФайлЭП</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <representation>TextPicture</representation> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> @@ -2180,7 +2180,7 @@ <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ДобавитьЭЦПИзФайла</name> + <name>ДобавитьЭПИзФайла</name> <title> <key>ru</key> <value>Добавить ЭП из файла...</value> @@ -2188,17 +2188,17 @@ <id>6</id> <toolTip> <key>ru</key> - <value> </value> + <value>Добавить ЭПИз файла</value> </toolTip> <use> <common>true</common> </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ДобавитьЭЦПИзФайла</name> + <name>ДобавитьЭПИзФайла</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2224,7 +2224,7 @@ <name>Зашифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2247,12 +2247,12 @@ <name>Расшифровать</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>СохранитьВместеСЭЦП</name> + <name>СохранитьВместеСЭП</name> <title> <key>ru</key> <value>Сохранить вместе с ЭП...</value> @@ -2260,17 +2260,17 @@ <id>16</id> <toolTip> <key>ru</key> - <value> </value> + <value>Сохранить вместе СЭП</value> </toolTip> <use> <common>true</common> </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>СохранитьВместеСЭЦП</name> + <name>СохранитьВместеСЭП</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2313,15 +2313,15 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>КомандаЭЦПСписокОткрытьПодпись</name> + <name>КомандаЭПСписокОткрытьПодпись</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>ПроверитьЭЦП</name> + <name>ПроверитьЭП</name> <title> <key>ru</key> <value>Проверить</value> @@ -2336,15 +2336,15 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>ПроверитьЭЦП</name> + <name>ПроверитьЭП</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> <formCommands> - <name>УдалитьЭЦП</name> + <name>УдалитьЭП</name> <title> <key>ru</key> <value>Удалить</value> @@ -2359,10 +2359,10 @@ </use> <action xsi:type="form:FormCommandHandlerContainer"> <handler> - <name>УдалитьЭЦП</name> + <name>УдалитьЭП</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2385,7 +2385,7 @@ <name>ПроверитьВсе</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2408,7 +2408,7 @@ <name>СохранитьПодпись</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> @@ -2431,7 +2431,7 @@ <name>ОткрытьСертификатШифрования</name> </handler> </action> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <currentRowUse>Auto</currentRowUse> <selectedRowsUse>Auto</selectedRowsUse> </formCommands> diff --git a/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl b/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl index 13adec57f..c12973365 100644 --- a/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl +++ b/SSL/src/CommonForms/ПрисоединенныйФайл/Module.bsl @@ -32,16 +32,16 @@ |ДатаСоздания, |Зашифрован, |Описание, - |ПодписанЭЦП, + |ПодписанЭП, |Размер, |Расширение, |ТекстХранилище, |ВладелецФайла, |ПометкаУдаления"); - Для Каждого ЭлементЭЦП Из КопируемыйОбъект.ЭлектронныеЦифровыеПодписи Цикл - НоваяСтрока = ОбъектЗначение.ЭлектронныеЦифровыеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементЭЦП); + Для Каждого ЭлементЭП Из КопируемыйОбъект.ЭлектронныеПодписи Цикл + НоваяСтрока = ОбъектЗначение.ЭлектронныеПодписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементЭП); КонецЦикла; Для Каждого ЭлементШифрования Из КопируемыйОбъект.СертификатыШифрования Цикл @@ -67,36 +67,36 @@ ЗаполнитьСписокШифрования(); Если ТолькоПросмотр - ИЛИ НЕ ПравоДоступа("Изменение", ЭтаФорма.Объект.ВладелецФайла.Метаданные()) Тогда + ИЛИ НЕ ПравоДоступа("Изменение", ЭтотОбъект.Объект.ВладелецФайла.Метаданные()) Тогда УстановитьКнопкиИзмененияНевидимыми(Элементы); КонецЕсли; Если НЕ ТолькоПросмотр - И НЕ ЭтаФорма.Объект.Ссылка.Пустая() Тогда + И НЕ ЭтотОбъект.Объект.Ссылка.Пустая() Тогда - ЗаблокироватьДанныеДляРедактирования(ЭтаФорма.Объект.Ссылка, , УникальныйИдентификатор); + ЗаблокироватьДанныеДляРедактирования(ЭтотОбъект.Объект.Ссылка, , УникальныйИдентификатор); КонецЕсли; - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); - ПерсональныеНастройкиРаботыСЭЦП = ЭлектроннаяЦифроваяПодпись.ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер(); + ПерсональныеНастройкиРаботыСЭП = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) - ДатаМодификации = МестноеВремя(ЭтаФорма.Объект.ДатаМодификацииУниверсальная); + ДатаМодификации = МестноеВремя(ЭтотОбъект.Объект.ДатаМодификацииУниверсальная); - ПрочитатьЭЦП(); + ПрочитатьЭП(); КонецПроцедуры &НаКлиенте Процедура ПриЗакрытии() - РазблокироватьОбъект(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + РазблокироватьОбъект(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); КонецПроцедуры @@ -106,7 +106,7 @@ &НаКлиенте Процедура ТаблицаПодписейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); + ЭлектроннаяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); КонецПроцедуры @@ -134,13 +134,13 @@ Перем НовоеРасширение; Если ЭтоНовый() - ИЛИ ЭтаФорма.Объект.Зашифрован - ИЛИ ЭтаФорма.Объект.ПодписанЭЦП - ИЛИ НЕ ЭтаФорма.Объект.Редактирует.Пустая() Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован + ИЛИ ЭтотОбъект.Объект.ПодписанЭП + ИЛИ НЕ ЭтотОбъект.Объект.Редактирует.Пустая() Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, , Ложь); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, , Ложь); ИнформацияОФайле = Новый Структура; @@ -148,8 +148,8 @@ ДанныеФайла, ИнформацияОФайле, УникальныйИдентификатор) Тогда ОбновитьДвоичныеДанныеФайлаНаСервере(ИнформацияОФайле); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецЕсли; КонецПроцедуры @@ -178,7 +178,7 @@ КонецЕсли; Если Модифицированность Тогда - Если ЭтаФорма.Объект.ПометкаУдаления Тогда + Если ЭтотОбъект.Объект.ПометкаУдаления Тогда ТекстВопроса = НСтр( "ru = 'Для выполнения действия требуется записать изменения файла. |Записать изменения и снять пометку на удаление с файла @@ -190,7 +190,7 @@ |""%1""?'"); КонецЕсли; Иначе - Если ЭтаФорма.Объект.ПометкаУдаления Тогда + Если ЭтотОбъект.Объект.ПометкаУдаления Тогда ТекстВопроса = НСтр("ru = 'Снять пометку на удаление с файла |""%1""?'"); Иначе @@ -200,12 +200,17 @@ КонецЕсли; ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса, ЭтаФорма.Объект.Ссылка); + ТекстВопроса, ЭтотОбъект.Объект.Ссылка); + + ОписаниеОповещения = Новый ОписаниеОповещения("СтандартныеУстановитьПометкуУдаленияОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +КонецПроцедуры + +&НаКлиенте +Процедура СтандартныеУстановитьПометкуУдаленияОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); - - Если Результат = КодВозвратаДиалога.Да Тогда - ЭтаФорма.Объект.ПометкаУдаления = НЕ ЭтаФорма.Объект.ПометкаУдаления; + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ЭтотОбъект.Объект.ПометкаУдаления = НЕ ЭтотОбъект.Объект.ПометкаУдаления; ОбработатьКомандуЗаписиФайла(); КонецЕсли; @@ -224,9 +229,15 @@ ТекстВопроса = НСтр("ru = 'Данные изменены. Перечитать данные?'"); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); + ОписаниеОповещения = Новый ОписаниеОповещения("СтандартнаяПеречитатьОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); - Если Результат = КодВозвратаДиалога.Да Тогда +КонецПроцедуры + +&НаКлиенте +Процедура СтандартнаяПеречитатьОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда ПеречитатьДанныеССервера(); Модифицированность = Ложь; КонецЕсли; @@ -240,89 +251,101 @@ Возврат; КонецЕсли; - ПараметрыФормы = Новый Структура("ЗначениеКопирования", ЭтаФорма.Объект.Ссылка); + ПараметрыФормы = Новый Структура("ЗначениеКопирования", ЭтотОбъект.Объект.Ссылка); ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы); КонецПроцедуры /////////////////////////////////////////////////////////////////////////////////// -// Обработчики команд ЭЦП и шифрования +// Обработчики команд ЭП и шифрования &НаКлиенте -Процедура ПодписатьФайлЭЦП(Команда) +Процедура ПодписатьФайлЭП(Команда) - Если ЭтоНовый() - ИЛИ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + Если ЭтоНовый() Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); - - ДанныеПодписи = Неопределено; - - Если ПрисоединенныеФайлыСлужебныйКлиент.ВыбратьСертификатыЭЦПИСформироватьДанныеПодписи( - ЭтаФорма.Объект.Ссылка, ДанныеФайла, ДанныеПодписи) Тогда - - ЗанестиИнформациюОднойПодписи(ДанныеПодписи); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); - КонецЕсли; + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + ОписаниеОповещения = Новый ОписаниеОповещения("ПодписатьФайлЭППодписьПолучена", ЭтотОбъект); + ПрисоединенныеФайлыСлужебныйКлиент.ВыбратьСертификатыЭПИСформироватьДанныеПодписи( + ОписаниеОповещения, ЭтотОбъект.Объект.Ссылка, ДанныеФайла); КонецПроцедуры &НаКлиенте -Процедура ДобавитьЭЦПИзФайла(Команда) +Процедура ПодписатьФайлЭППодписьПолучена(ДанныеПодписи, ДополнительныеПараметры) Экспорт -#Если ВебКлиент Тогда - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(); + Если ДанныеПодписи = Неопределено Тогда Возврат; КонецЕсли; -#КонецЕсли + + ЗанестиИнформациюОднойПодписи(ДанныеПодписи); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); + +КонецПроцедуры - Если ЭтоНовый() - ИЛИ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда +&НаКлиенте +Процедура ДобавитьЭПИзФайла(Команда) + + #Если ВебКлиент Тогда + Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(Неопределено); + Возврат; + КонецЕсли; + #КонецЕсли + + Если ЭтоНовый() Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьЭПИзФайлаРасширениеПредложено", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); - Если ПодключитьРасширениеРаботыСФайлами() Тогда - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЭПИзФайлаРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + Если РасширениеРаботыСФайламиПодключено Тогда + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - МассивПодписей = ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьМассивПодписей( - ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); - - Если МассивПодписей.Количество() > 0 Тогда - ЗанестиИнформациюОПодписях(МассивПодписей); - - ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОДобавленииПодписиИзФайла( - ЭтаФорма.Объект.Ссылка, МассивПодписей.Количество()); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьЭПИзФайлаПодписиПолучены", ЭтотОбъект); + ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьМассивПодписей(ОписаниеОповещения, + ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); Иначе #Если ВебКлиент Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); #КонецЕсли КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура СохранитьВместеСЭЦП(Команда) +Процедура ДобавитьЭПИзФайлаПодписиПолучены(МассивПодписей, ДополнительныеПараметры) Экспорт + Если МассивПодписей.Количество() > 0 Тогда + ЗанестиИнформациюОПодписях(МассивПодписей); + ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОДобавленииПодписиИзФайла( + ЭтотОбъект.Объект.Ссылка, МассивПодписей.Количество()); + КонецЕсли; +КонецПроцедуры + + +&НаКлиенте +Процедура СохранитьВместеСЭП(Команда) Если ЭтоНовый() - ИЛИ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + ИЛИ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ПрисоединенныеФайлыКлиент.СохранитьВместеСЭЦП( - ЭтаФорма.Объект.Ссылка, + ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП( + ЭтотОбъект.Объект.Ссылка, ДанныеФайла, УникальныйИдентификатор); @@ -331,78 +354,78 @@ &НаКлиенте Процедура Зашифровать(Команда) - Если ЭтоНовый() - ИЛИ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + Если ЭтоНовый() Или ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Или ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ЗашифрованныеДанные = Неопределено; - МассивОтпечатков = Новый Массив; - - Если НЕ ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьЗашифрованныеДанные( - ЭтаФорма.Объект.Ссылка, - ДанныеФайла, - УникальныйИдентификатор, - ЗашифрованныеДанные, - МассивОтпечатков) Тогда - + ОписаниеОповещения = Новый ОписаниеОповещения("ЗашифроватьДанныеПолучены", ЭтотОбъект, ДанныеФайла); + ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьЗашифрованныеДанные(ОписаниеОповещения, ЭтотОбъект.Объект.Ссылка, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗашифроватьДанныеПолучены(РезультатПолучения, ДанныеФайла) Экспорт + Если РезультатПолучения = Неопределено Тогда Возврат; КонецЕсли; + ЗашифрованныеДанные = РезультатПолучения.ЗашифрованныеДанные; + МассивОтпечатков = РезультатПолучения.МассивОтпечатков; + ЗашифроватьСервер(ЗашифрованныеДанные, МассивОтпечатков); ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге( - ЭтаФорма.Объект.Ссылка, ДанныеФайла); + ЭтотОбъект.Объект.Ссылка, ДанныеФайла); ЗаполнитьСписокШифрования(); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецПроцедуры &НаКлиенте Процедура Расшифровать(Команда) - Если ЭтоНовый() - ИЛИ НЕ ЭтаФорма.Объект.Зашифрован Тогда + Если ЭтоНовый() Или Не ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); + ОписаниеОповещения = Новый ОписаниеОповещения("РасшифроватьДанныеПолучены", ЭтотОбъект); - РасшифрованныеДанные = Неопределено; - Если НЕ ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьРасшифрованныеДанные( - ЭтаФорма.Объект.Ссылка, - ДанныеФайла, - РасшифрованныеДанные, - УникальныйИдентификатор) Тогда + ПрисоединенныеФайлыСлужебныйКлиент.ПолучитьРасшифрованныеДанные(ОписаниеОповещения, + ЭтотОбъект.Объект.Ссылка, ДанныеФайла, УникальныйИдентификатор); + +КонецПроцедуры + +&НаКлиенте +Процедура РасшифроватьДанныеПолучены(РасшифрованныеДанные, ДополнительныеПараметры) Экспорт + + Если РасшифрованныеДанные = Неопределено Тогда Возврат; КонецЕсли; РасшифроватьСервер(РасшифрованныеДанные); - - ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОРасшифровкеФайла(ЭтаФорма.Объект.Ссылка); - + ПрисоединенныеФайлыСлужебныйКлиент.ОповеститьОРасшифровкеФайла(ЭтотОбъект.Объект.Ссылка); ЗаполнитьСписокШифрования(); КонецПроцедуры &НаКлиенте -Процедура КомандаЭЦПСписокОткрытьПодпись(Команда) +Процедура КомандаЭПСписокОткрытьПодпись(Команда) - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); + ЭлектроннаяПодписьКлиент.ОткрытьПодпись(Элементы.ТаблицаПодписей.ТекущиеДанные); КонецПроцедуры &НаКлиенте -Процедура ПроверитьЭЦП(Команда) +Процедура ПроверитьЭП(Команда) - ПерсональныеНастройкиРаботыСЭЦП = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП(); + ПерсональныеНастройкиРаботыСЭП = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); - Если ПерсональныеНастройкиРаботыСЭЦП.ВыполнятьПроверкуЭЦПНаСервере Тогда + Если ПерсональныеНастройкиРаботыСЭП.ВыполнятьПроверкуЭПНаСервере Тогда ДанныеВыделенныхСтрок = Новый Массив; ИменаКолонок = ""; @@ -427,10 +450,10 @@ Индекс = Индекс + 1; КонецЦикла; Иначе - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); ДвоичныеДанные = ПолучитьИзВременногоХранилища( - ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка).СсылкаНаДвоичныеДанныеФайла); + ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка).СсылкаНаДвоичныеДанныеФайла); Для Каждого Элемент Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл ДанныеСтроки = Элементы.ТаблицаПодписей.ДанныеСтроки(Элемент); @@ -447,9 +470,9 @@ &НаКлиенте Процедура ПроверитьВсе(Команда) - ПерсональныеНастройкиРаботыСЭЦП = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП(); + ПерсональныеНастройкиРаботыСЭП = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); - Если ПерсональныеНастройкиРаботыСЭЦП.ВыполнятьПроверкуЭЦПНаСервере Тогда + Если ПерсональныеНастройкиРаботыСЭП.ВыполнятьПроверкуЭПНаСервере Тогда ДанныеСтрок = Новый Массив; ИменаКолонок = ""; @@ -474,9 +497,9 @@ КонецЦикла; Иначе ДвоичныеДанные = ПолучитьИзВременногоХранилища( - ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка).СсылкаНаДвоичныеДанныеФайла); + ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка).СсылкаНаДвоичныеДанныеФайла); - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); Для Каждого Строка Из ТаблицаПодписей Цикл Если Строка.Объект <> Неопределено И (НЕ Строка.Объект.Пустая()) Тогда @@ -497,22 +520,29 @@ ТекущиеДанные = Элементы.ТаблицаПодписей.ТекущиеДанные; Если ТекущиеДанные.Объект <> Неопределено И (НЕ ТекущиеДанные.Объект.Пустая()) Тогда - ЭлектроннаяЦифроваяПодписьКлиент.СохранитьПодпись(ТекущиеДанные.АдресПодписи); + ЭлектроннаяПодписьКлиент.СохранитьПодпись(ТекущиеДанные.АдресПодписи); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура УдалитьЭЦП(Команда) +Процедура УдалитьЭП(Команда) - Ответ = Вопрос(НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьЭПОтветПолучен", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Удалить выделенные подписи?'"), РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +&НаКлиенте +Процедура УдалитьЭПОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; УдалитьИзСпискаПодписейИЗаписатьФайл(); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецПроцедуры @@ -533,14 +563,14 @@ ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(ТекущиеДанные.АдресСертификата); Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Иначе - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); + СтруктураСертификата = ЭлектроннаяПодписьКлиент.ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); КонецЕсли; Если СтруктураСертификата <> Неопределено Тогда - ЭлектроннаяЦифроваяПодписьКлиент.ОткрытьСертификатСоСтруктурой( + ЭлектроннаяПодписьКлиент.ОткрытьСертификатСоСтруктурой( СтруктураСертификата, Отпечаток, ТекущиеДанные.АдресСертификата); КонецЕсли; @@ -553,25 +583,25 @@ Процедура Редактировать(Команда) Если ЭтоНовый() - ИЛИ ЭтаФорма.Объект.ПодписанЭЦП - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + ИЛИ ЭтотОбъект.Объект.ПодписанЭП + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - Если ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - И ЭтаФорма.Объект.Редактирует <> ТекущийПользователь Тогда + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + И ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - Если ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) Тогда + Если ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) Тогда ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); Иначе ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, Истина); ЗанятьФайлДляРедактированияСервер(); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецЕсли; КонецПроцедуры @@ -580,26 +610,28 @@ Процедура ЗакончитьРедактирование(Команда) Если ЭтоНовый() - ИЛИ НЕ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Редактирует <> ТекущийПользователь Тогда - Возврат; + Или Не ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + Или ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда + Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, , Ложь); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, , Ложь); - ИнформацияОФайле = Новый Структура; + ОписаниеОповещения = Новый ОписаниеОповещения("ЗакончитьРедактированиеВыполненоПомещение", ЭтотОбъект); + ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище(ОписаниеОповещения,ДанныеФайла, УникальныйИдентификатор); - Если ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьРедактируемыйФайлНаДискеВХранилище( - ДанныеФайла, - ИнформацияОФайле, - УникальныйИдентификатор) Тогда - +КонецПроцедуры + +&НаКлиенте +Процедура ЗакончитьРедактированиеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт + + Если ИнформацияОФайле <> Неопределено Тогда ПоместитьФайлВХранилищеИОсвободить(ИнформацияОФайле); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецЕсли; - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -607,14 +639,14 @@ Процедура Освободить(Команда) Если ЭтоНовый() - ИЛИ НЕ ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - ИЛИ ЭтаФорма.Объект.Редактирует <> ТекущийПользователь Тогда + ИЛИ НЕ ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + ИЛИ ЭтотОбъект.Объект.Редактирует <> ТекущийПользователь Тогда Возврат; КонецЕсли; ОсвободитьФайл(); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтаФорма.Объект.Ссылка); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ЭтотОбъект.Объект.Ссылка); КонецПроцедуры @@ -643,14 +675,14 @@ Процедура ОткрытьФайлДляПросмотра() Если ЭтоНовый() - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); - ФайлРедактируется = ЗначениеЗаполнено(ЭтаФорма.Объект.Редактирует) - И ЭтаФорма.Объект.Редактирует = ТекущийПользователь; + ФайлРедактируется = ЗначениеЗаполнено(ЭтотОбъект.Объект.Редактирует) + И ЭтотОбъект.Объект.Редактирует = ТекущийПользователь; ПрисоединенныеФайлыКлиент.ОткрытьФайл(ДанныеФайла, ФайлРедактируется); @@ -660,11 +692,11 @@ Процедура ОткрытьКаталогФайла() Если ЭтоНовый() - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); ПрисоединенныеФайлыСлужебныйКлиент.ОткрытьКаталогСФайлом(ДанныеФайла); @@ -674,11 +706,11 @@ Процедура СохранитьКак() Если ЭтоНовый() - ИЛИ ЭтаФорма.Объект.Зашифрован Тогда + ИЛИ ЭтотОбъект.Объект.Зашифрован Тогда Возврат; КонецЕсли; - ДанныеФайла = ПолучитьДанныеФайла(ЭтаФорма.Объект.Ссылка, УникальныйИдентификатор); + ДанныеФайла = ПолучитьДанныеФайла(ЭтотОбъект.Объект.Ссылка, УникальныйИдентификатор); ПрисоединенныеФайлыКлиент.СохранитьФайлКак(ДанныеФайла); @@ -716,7 +748,7 @@ СертификатыШифрования.Очистить(); - Если ЭтаФорма.Объект.Зашифрован Тогда + Если ЭтотОбъект.Объект.Зашифрован Тогда Для Каждого СтруктураСертификата Из РеквизитФормыВЗначение("Объект").СертификатыШифрования Цикл НоваяСтрока = СертификатыШифрования.Добавить(); @@ -755,7 +787,7 @@ ДвоичныеДанныеПодписи = ПолучитьИзВременногоХранилища(ДанныеСтроки.АдресПодписи); Попытка - ЭлектроннаяЦифроваяПодписьКлиент.ПроверитьПодпись( + ЭлектроннаяПодписьКлиент.ПроверитьПодпись( МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); @@ -776,23 +808,23 @@ ТаблицаПодписей.Очистить(); - Если ЭтаФорма.Объект.ПодписанЭЦП Тогда + Если ЭтотОбъект.Объект.ПодписанЭП Тогда - Для Каждого ЭлементЭЦП Из РеквизитФормыВЗначение("Объект").ЭлектронныеЦифровыеПодписи Цикл + Для Каждого ЭлементЭП Из РеквизитФормыВЗначение("Объект").ЭлектронныеПодписи Цикл НоваяСтрока = ТаблицаПодписей.Добавить(); - НоваяСтрока.КомуВыданСертификат = ЭлементЭЦП.КомуВыданСертификат; - НоваяСтрока.ДатаПодписи = ЭлементЭЦП.ДатаПодписи; - НоваяСтрока.Комментарий = ЭлементЭЦП.Комментарий; - НоваяСтрока.Объект = ЭтаФорма.Объект.Ссылка; - НоваяСтрока.Отпечаток = ЭлементЭЦП.Отпечаток; - НоваяСтрока.УстановившийПодпись = ЭлементЭЦП.УстановившийПодпись; + НоваяСтрока.КомуВыданСертификат = ЭлементЭП.КомуВыданСертификат; + НоваяСтрока.ДатаПодписи = ЭлементЭП.ДатаПодписи; + НоваяСтрока.Комментарий = ЭлементЭП.Комментарий; + НоваяСтрока.Объект = ЭтотОбъект.Объект.Ссылка; + НоваяСтрока.Отпечаток = ЭлементЭП.Отпечаток; + НоваяСтрока.УстановившийПодпись = ЭлементЭП.УстановившийПодпись; НоваяСтрока.Неверна = Ложь; НоваяСтрока.АдресПодписи = ПоместитьВоВременноеХранилище( - ЭлементЭЦП.Подпись.Получить(), УникальныйИдентификатор); + ЭлементЭП.Подпись.Получить(), УникальныйИдентификатор); - ДвоичныеДанныеСертификата = ЭлементЭЦП.Сертификат.Получить(); + ДвоичныеДанныеСертификата = ЭлементЭП.Сертификат.Получить(); Если ДвоичныеДанныеСертификата <> Неопределено Тогда НоваяСтрока.АдресСертификата = ПоместитьВоВременноеХранилище( @@ -808,32 +840,30 @@ ТекстЗаголовка = ТекстЗаголовка + " (" + Строка(ТаблицаПодписей.Количество()) + ")"; КонецЕсли; - Элементы.ГруппаЭЦП.Заголовок = ТекстЗаголовка; + Элементы.ГруппаЭП.Заголовок = ТекстЗаголовка; КонецПроцедуры &НаСервере Процедура УдалитьИзСпискаПодписейИЗаписатьФайл() + ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); Для Каждого НомерВыделеннойСтроки Из Элементы.ТаблицаПодписей.ВыделенныеСтроки Цикл - - ТаблицаПодписей.Удалить(ТаблицаПодписей.Индекс( - ТаблицаПодписей.НайтиПоИдентификатору(НомерВыделеннойСтроки))); + УдаляемаяСтрока = ТаблицаПодписей.НайтиПоИдентификатору(НомерВыделеннойСтроки); + ИндексУдаляемойСтроки = ТаблицаПодписей.Индекс(УдаляемаяСтрока); + ТаблицаПодписей.Удалить(ИндексУдаляемойСтроки); + ЗаписываемыйОбъект.ЭлектронныеПодписи.Удалить(ИндексУдаляемойСтроки); КонецЦикла; - ЗаписываемыйОбъект = РеквизитФормыВЗначение("Объект"); - ЗаписываемыйОбъект.ЭлектронныеЦифровыеПодписи.Очистить(); - ЗаписываемыйОбъект.ЭлектронныеЦифровыеПодписи.Загрузить(РеквизитФормыВЗначение("ТаблицаПодписей")); - - Если ЗаписываемыйОбъект.ЭлектронныеЦифровыеПодписи.Количество() = 0 Тогда - ЗаписываемыйОбъект.ПодписанЭЦП = Ложь; + Если ЗаписываемыйОбъект.ЭлектронныеПодписи.Количество() = 0 Тогда + ЗаписываемыйОбъект.ПодписанЭП = Ложь; КонецЕсли; ЗаписатьФайл(ЗаписываемыйОбъект); ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); ЗаполнитьСписокПодписей(); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -844,7 +874,7 @@ ПрисоединенныеФайлыСлужебный.Расшифровать(ЗаписываемыйОбъект, РасшифрованныеДанные); ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -858,7 +888,7 @@ ИменаКоманд = ПолучитьДоступныеКоманды( ФайлРедактируется, ФайлРедактируетТекущийПользователь, - Форма.Объект.ПодписанЭЦП, + Форма.Объект.ПодписанЭП, Форма.Объект.Зашифрован, Форма.Объект.Ссылка.Пустая()); @@ -905,11 +935,11 @@ ИменаКоманд = Новый Массив; // Простые команды, которые доступны любому пользователю читающему файлы. - ИменаКоманд.Добавить("СохранитьВместеСЭЦП"); + ИменаКоманд.Добавить("СохранитьВместеСЭП"); ИменаКоманд.Добавить("ОткрытьСертификат"); ИменаКоманд.Добавить("ОткрытьПодпись"); - ИменаКоманд.Добавить("ПроверитьЭЦП"); + ИменаКоманд.Добавить("ПроверитьЭП"); ИменаКоманд.Добавить("ПроверитьВсе"); ИменаКоманд.Добавить("СохранитьПодпись"); @@ -926,10 +956,10 @@ ИменаКоманд = Новый Массив; - ИменаКоманд.Добавить("ПодписатьФайлЭЦП"); - ИменаКоманд.Добавить("ДобавитьЭЦПИзФайла"); + ИменаКоманд.Добавить("ПодписатьФайлЭП"); + ИменаКоманд.Добавить("ДобавитьЭПИзФайла"); - ИменаКоманд.Добавить("УдалитьЭЦП"); + ИменаКоманд.Добавить("УдалитьЭП"); ИменаКоманд.Добавить("Редактировать"); ИменаКоманд.Добавить("ЗакончитьРедактирование"); @@ -974,7 +1004,7 @@ УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); КонецЕсли; - УдалитьКомандыЭЦП(ИменаКоманд); + УдалитьКомандыЭП(ИменаКоманд); УдалитьКомандуИзМассива(ИменаКоманд, "ОбновитьИзФайлаНаДиске"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьКак"); @@ -994,15 +1024,15 @@ Иначе УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьСертификат"); УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьПодпись"); - УдалитьКомандуИзМассива(ИменаКоманд, "ПроверитьЭЦП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПроверитьЭП"); УдалитьКомандуИзМассива(ИменаКоманд, "ПроверитьВсе"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьПодпись"); - УдалитьКомандуИзМассива(ИменаКоманд, "УдалитьЭЦП"); - УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭЦП"); + УдалитьКомандуИзМассива(ИменаКоманд, "УдалитьЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); КонецЕсли; Если ФайлЗашифрован Тогда - УдалитьКомандыЭЦП(ИменаКоманд); + УдалитьКомандыЭП(ИменаКоманд); УдалитьКомандуИзМассива(ИменаКоманд, "ЗакончитьРедактирование"); УдалитьКомандуИзМассива(ИменаКоманд, "Освободить"); УдалитьКомандуИзМассива(ИменаКоманд, "Редактировать"); @@ -1015,7 +1045,7 @@ УдалитьКомандуИзМассива(ИменаКоманд, "ОткрытьФайлДляПросмотра"); УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьКак"); - УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭЦП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭП"); Иначе УдалитьКомандуИзМассива(ИменаКоманд, "Расшифровать"); КонецЕсли; @@ -1025,11 +1055,11 @@ КонецФункции &НаКлиентеНаСервереБезКонтекста -Процедура УдалитьКомандыЭЦП(Знач ИменаКоманд) +Процедура УдалитьКомандыЭП(Знач ИменаКоманд) - УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭЦП"); - УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭЦПИзФайла"); - УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭЦП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ПодписатьФайлЭП"); + УдалитьКомандуИзМассива(ИменаКоманд, "ДобавитьЭПИзФайла"); + УдалитьКомандуИзМассива(ИменаКоманд, "СохранитьВместеСЭП"); КонецПроцедуры @@ -1055,7 +1085,7 @@ ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -1070,7 +1100,7 @@ ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); ЗаполнитьСписокПодписей(); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -1083,7 +1113,7 @@ ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); ЗаполнитьСписокПодписей(); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -1094,7 +1124,7 @@ ПрисоединенныеФайлыСлужебный.ЗанятьФайлДляРедактированияСервер(ЗаписываемыйОбъект); ЗначениеВРеквизитФормы(ЗаписываемыйОбъект, "Объект"); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); КонецПроцедуры @@ -1119,14 +1149,14 @@ &НаКлиенте Функция ОбработатьКомандуЗаписиФайла() - Если ПустаяСтрока(ЭтаФорма.Объект.Наименование) Тогда + Если ПустаяСтрока(ЭтотОбъект.Объект.Наименование) Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Для продолжения укажите имя файла.'"), , "Наименование", "Объект"); Возврат Ложь; КонецЕсли; Попытка - ФайловыеФункцииСлужебныйКлиент.КорректноеИмяФайла(ЭтаФорма.Объект.Наименование); + ФайловыеФункцииСлужебныйКлиент.КорректноеИмяФайла(ЭтотОбъект.Объект.Наименование); Исключение ОбщегоНазначенияКлиентСервер.СообщитьПользователю( КраткоеПредставлениеОшибки(ИнформацияОбОшибке()), ,"Наименование", "Объект"); @@ -1138,12 +1168,12 @@ КонецЕсли; Модифицированность = Ложь; - ОтобразитьИзменениеДанных(ЭтаФорма.Объект.Ссылка, ВидИзмененияДанных.Изменение); - ОповеститьОбИзменении(ЭтаФорма.Объект.Ссылка); + ОтобразитьИзменениеДанных(ЭтотОбъект.Объект.Ссылка, ВидИзмененияДанных.Изменение); + ОповеститьОбИзменении(ЭтотОбъект.Объект.Ссылка); Оповестить("Запись_ПрисоединенныйФайл", Новый Структура("ЭтоНовый", ФайлБылСоздан), - ЭтаФорма.Объект.Ссылка); + ЭтотОбъект.Объект.Ссылка); Возврат Истина; @@ -1152,7 +1182,7 @@ &НаСервере Процедура ПеречитатьДанныеССервера() - ФайлОбъект = ЭтаФорма.Объект.Ссылка.ПолучитьОбъект(); + ФайлОбъект = ЭтотОбъект.Объект.Ссылка.ПолучитьОбъект(); ЗначениеВРеквизитФормы(ФайлОбъект, "Объект"); КонецПроцедуры @@ -1220,7 +1250,7 @@ КонецЕсли; ЗначениеКопирования = Справочники[ИмяСправочника].ПустаяСсылка(); - УстановитьДоступностьКнопок(ЭтаФорма, Элементы, ТекущийПользователь); + УстановитьДоступностьКнопок(ЭтотОбъект, Элементы, ТекущийПользователь); Возврат Истина; КонецФункции @@ -1271,13 +1301,13 @@ КонецПроцедуры &НаКлиенте -Процедура ПрочитатьЭЦП() +Процедура ПрочитатьЭП() Если ТаблицаПодписей.Количество() = 0 Тогда Возврат; КонецЕсли; - Если ПерсональныеНастройкиРаботыСЭЦП.ВыполнятьПроверкуЭЦПНаСервере Тогда + Если ПерсональныеНастройкиРаботыСЭП.ВыполнятьПроверкуЭПНаСервере Тогда Возврат; КонецЕсли; @@ -1287,14 +1317,14 @@ Попытка МенеджерКриптографии = Новый МенеджерКриптографии( - ПерсональныеНастройкиРаботыСЭЦП.ПровайдерЭЦП, - ПерсональныеНастройкиРаботыСЭЦП.ПутьМодуляКриптографии, - ПерсональныеНастройкиРаботыСЭЦП.ТипПровайдераЭЦП); + ПерсональныеНастройкиРаботыСЭП.ПровайдерЭП, + ПерсональныеНастройкиРаботыСЭП.ПутьМодуляКриптографии, + ПерсональныеНастройкиРаботыСЭП.ТипПровайдераЭП); Исключение Возврат; КонецПопытки; - ЗаполнитьЗначенияСвойств(МенеджерКриптографии, ПерсональныеНастройкиРаботыСЭЦП); + ЗаполнитьЗначенияСвойств(МенеджерКриптографии, ПерсональныеНастройкиРаботыСЭП); Для каждого СтрокаТаблицы Из ТаблицаПодписей Цикл @@ -1311,7 +1341,7 @@ СтрокаТаблицы.Отпечаток = Base64Строка(Сертификат.Отпечаток); - СтрокаТаблицы.КомуВыданСертификат = ЭлектроннаяЦифроваяПодписьКлиентСервер + СтрокаТаблицы.КомуВыданСертификат = ЭлектроннаяПодписьКлиентСервер .ПолучитьПредставлениеПользователя(Сертификат.Субъект); КонецЕсли; @@ -1323,7 +1353,7 @@ &НаКлиенте Функция ЭтоНовый() - Возврат ЭтаФорма.Объект.Ссылка.Пустая(); + Возврат ЭтотОбъект.Объект.Ссылка.Пустая(); КонецФункции @@ -1337,7 +1367,7 @@ Знач Ширина = 0) Если Контейнер = Неопределено Тогда - Контейнер = ЭтаФорма; + Контейнер = ЭтотОбъект; КонецЕсли; Элемент = Элементы.Добавить("Элемент" + ИмяРеквизита, Тип("ПолеФормы"), Контейнер); @@ -1367,7 +1397,7 @@ Процедура ДобавитьПолеНаФорму(Знач ИмяРеквизита, Знач Контейнер = Неопределено) Если Контейнер = Неопределено Тогда - Контейнер = ЭтаФорма; + Контейнер = ЭтотОбъект; КонецЕсли; Элемент = Элементы.Добавить("Элемент" + ИмяРеквизита, Тип("ПолеФормы"), Контейнер); diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form index 5b74ec643..28ffda855 100644 --- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form +++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Form.form @@ -34,8 +34,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ТаблицаЗначенийСвойствНомерКартинкиРасширеннаяПодсказка</name> - <id>36</id> + <name>ТаблицаЗначенийСвойствНомерКартинкиExtendedTooltip</name> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -81,8 +81,8 @@ <segments>ТаблицаЗначенийСвойств.Наименование</segments> </dataPath> <extendedTooltip> - <name>ТаблицаЗначенийСвойствНаименованиеРасширеннаяПодсказка</name> - <id>38</id> + <name>ТаблицаЗначенийСвойствНаименованиеExtendedTooltip</name> + <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -117,8 +117,8 @@ <readOnly>true</readOnly> <horizontalStretch>false</horizontalStretch> <extendedTooltip> - <name>ТаблицаЗначенийСвойствКартинкаИСвойствоРасширеннаяПодсказка</name> - <id>35</id> + <name>ТаблицаЗначенийСвойствКартинкаИСвойствоExtendedTooltip</name> + <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -149,8 +149,8 @@ <segments>ТаблицаЗначенийСвойств.Значение</segments> </dataPath> <extendedTooltip> - <name>ТаблицаЗначенийСвойствЗначениеРасширеннаяПодсказка</name> - <id>40</id> + <name>ТаблицаЗначенийСвойствЗначениеExtendedTooltip</name> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -213,10 +213,10 @@ </handlers> <searchStringAddition> <name>ТаблицаЗначенийСвойствСтрокаПоиска</name> - <id>26</id> + <id>30</id> <extendedTooltip> <name>ТаблицаЗначенийСвойствСтрокаПоискаРасширеннаяПодсказка</name> - <id>28</id> + <id>32</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -226,7 +226,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаЗначенийСвойствСтрокаПоискаКонтекстноеМеню</name> - <id>27</id> + <id>31</id> <autoFill>true</autoFill> </contextMenu> <source>ТаблицаЗначенийСвойств</source> @@ -236,10 +236,10 @@ </searchStringAddition> <viewStatusAddition> <name>ТаблицаЗначенийСвойствСостояниеПросмотра</name> - <id>29</id> + <id>33</id> <extendedTooltip> <name>ТаблицаЗначенийСвойствСостояниеПросмотраРасширеннаяПодсказка</name> - <id>31</id> + <id>35</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -249,7 +249,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаЗначенийСвойствСостояниеПросмотраКонтекстноеМеню</name> - <id>30</id> + <id>34</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -260,10 +260,10 @@ </viewStatusAddition> <searchControlAddition> <name>ТаблицаЗначенийСвойствУправлениеПоиском</name> - <id>32</id> + <id>36</id> <extendedTooltip> <name>ТаблицаЗначенийСвойствУправлениеПоискомРасширеннаяПодсказка</name> - <id>34</id> + <id>38</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -273,7 +273,7 @@ </extendedTooltip> <contextMenu> <name>ТаблицаЗначенийСвойствУправлениеПоискомКонтекстноеМеню</name> - <id>33</id> + <id>37</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -283,7 +283,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>ТаблицаЗначенийСвойствРасширеннаяПодсказка</name> + <name>ТаблицаЗначенийСвойствExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -333,7 +333,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаЗаписатьИЗакрытьРасширеннаяПодсказка</name> + <name>ФормаЗаписатьИЗакрытьExtendedTooltip</name> <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -359,7 +359,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаЗаписатьРасширеннаяПодсказка</name> + <name>ФормаЗаписатьExtendedTooltip</name> <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -386,7 +386,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ИзменитьСоставДополнительныхСведенийРасширеннаяПодсказка</name> + <name>ИзменитьСоставДополнительныхСведенийExtendedTooltip</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl index cd17b5a3a..a6b2c0223 100644 --- a/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеДополнительныхСведений/Module.bsl @@ -32,7 +32,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность); + Оповещение = Новый ОписаниеОповещения("ЗаписатьИЗакрытьЗавершение", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры @@ -97,9 +98,7 @@ &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) - ЗаписатьЗначенияСвойств(); - - Закрыть(); + ЗаписатьИЗакрытьЗавершение(); КонецПроцедуры @@ -109,7 +108,7 @@ Если ДоступныеНаборыСвойств.Количество() = 0 ИЛИ НЕ ЗначениеЗаполнено(ДоступныеНаборыСвойств[0].Значение) Тогда - Предупреждение( + ПоказатьПредупреждение(, НСтр("ru = 'Не удалось получить наборы дополнительных сведений объекта. | |Возможно у объекта не заполнены необходимые реквизиты.'")); @@ -137,6 +136,15 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ЗаписатьИЗакрытьЗавершение(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + ЗаписатьЗначенияСвойств(); + Модифицированность = Ложь; + Закрыть(); + +КонецПроцедуры + &НаСервере Процедура ЗаполнитьТаблицуЗначенийСвойств(ИзОбработчикаПриСоздании) diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form index 3cfc8276e..59a4553db 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Form.form @@ -19,7 +19,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗаписатьИЗакрытьРасширеннаяПодсказка</name> + <name>ЗаписатьИЗакрытьExtendedTooltip</name> <id>96</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -45,7 +45,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗаписатьРасширеннаяПодсказка</name> + <name>ЗаписатьExtendedTooltip</name> <id>97</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -71,7 +71,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>РедактированиеРасширеннаяПодсказка</name> + <name>РедактированиеExtendedTooltip</name> <id>98</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -102,7 +102,7 @@ <value>Действия с документом</value> </toolTip> <extendedTooltip> - <name>ДействияСДокументомРасширеннаяПодсказка</name> + <name>ДействияСДокументомExtendedTooltip</name> <id>95</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -131,7 +131,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИзменениеШрифтаРасширеннаяПодсказка</name> + <name>ИзменениеШрифтаExtendedTooltip</name> <id>102</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -157,7 +157,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УвеличитьРазмерШрифтаРасширеннаяПодсказка</name> + <name>УвеличитьРазмерШрифтаExtendedTooltip</name> <id>103</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -183,7 +183,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>УменьшитьРазмерШрифтаРасширеннаяПодсказка</name> + <name>УменьшитьРазмерШрифтаExtendedTooltip</name> <id>104</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -214,7 +214,7 @@ <value>Шрифт</value> </toolTip> <extendedTooltip> - <name>ШрифтРасширеннаяПодсказка</name> + <name>ШрифтExtendedTooltip</name> <id>101</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -237,7 +237,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПолужирныйРасширеннаяПодсказка</name> + <name>ПолужирныйExtendedTooltip</name> <id>106</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -263,7 +263,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КурсивРасширеннаяПодсказка</name> + <name>КурсивExtendedTooltip</name> <id>107</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -289,7 +289,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПодчеркиваниеРасширеннаяПодсказка</name> + <name>ПодчеркиваниеExtendedTooltip</name> <id>108</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -315,7 +315,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЗачеркиваниеРасширеннаяПодсказка</name> + <name>ЗачеркиваниеExtendedTooltip</name> <id>109</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -347,7 +347,7 @@ <value>Начертание</value> </toolTip> <extendedTooltip> - <name>НачертаниеРасширеннаяПодсказка</name> + <name>НачертаниеExtendedTooltip</name> <id>105</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -370,7 +370,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЦветФонаРасширеннаяПодсказка</name> + <name>ЦветФонаExtendedTooltip</name> <id>111</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -396,7 +396,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ЦветТекстаРасширеннаяПодсказка</name> + <name>ЦветТекстаExtendedTooltip</name> <id>112</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -427,7 +427,7 @@ <value>Цвет</value> </toolTip> <extendedTooltip> - <name>ЦветРасширеннаяПодсказка</name> + <name>ЦветExtendedTooltip</name> <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -450,7 +450,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВлевоРасширеннаяПодсказка</name> + <name>ВлевоExtendedTooltip</name> <id>114</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -476,7 +476,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПоЦентруРасширеннаяПодсказка</name> + <name>ПоЦентруExtendedTooltip</name> <id>115</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -502,7 +502,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВправоРасширеннаяПодсказка</name> + <name>ВправоExtendedTooltip</name> <id>116</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -528,7 +528,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПоШиринеРасширеннаяПодсказка</name> + <name>ПоШиринеExtendedTooltip</name> <id>117</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -559,7 +559,7 @@ <value>Выравнивание</value> </toolTip> <extendedTooltip> - <name>ВыравниваниеРасширеннаяПодсказка</name> + <name>ВыравниваниеExtendedTooltip</name> <id>113</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -584,7 +584,7 @@ <value>Форматирование текста</value> </toolTip> <extendedTooltip> - <name>ФорматированиеТекстаРасширеннаяПодсказка</name> + <name>ФорматированиеТекстаExtendedTooltip</name> <id>100</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -607,7 +607,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаСлеваРасширеннаяПодсказка</name> + <name>ГраницаСлеваExtendedTooltip</name> <id>119</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -633,7 +633,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаСверхуРасширеннаяПодсказка</name> + <name>ГраницаСверхуExtendedTooltip</name> <id>120</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -659,7 +659,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаСправаРасширеннаяПодсказка</name> + <name>ГраницаСправаExtendedTooltip</name> <id>121</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -685,7 +685,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаСнизуРасширеннаяПодсказка</name> + <name>ГраницаСнизуExtendedTooltip</name> <id>122</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -711,7 +711,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаВездеРасширеннаяПодсказка</name> + <name>ГраницаВездеExtendedTooltip</name> <id>123</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -737,7 +737,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаВокругРасширеннаяПодсказка</name> + <name>ГраницаВокругExtendedTooltip</name> <id>124</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -763,7 +763,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГраницаВнутриРасширеннаяПодсказка</name> + <name>ГраницаВнутриExtendedTooltip</name> <id>125</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -789,7 +789,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТолстаяГраницаВокругРасширеннаяПодсказка</name> + <name>ТолстаяГраницаВокругExtendedTooltip</name> <id>126</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -815,7 +815,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТолстаяГраницаСверхуРасширеннаяПодсказка</name> + <name>ТолстаяГраницаСверхуExtendedTooltip</name> <id>127</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -841,7 +841,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТолстаяГраницаСнизуРасширеннаяПодсказка</name> + <name>ТолстаяГраницаСнизуExtendedTooltip</name> <id>128</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -867,7 +867,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НетГраницыРасширеннаяПодсказка</name> + <name>НетГраницыExtendedTooltip</name> <id>129</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -898,7 +898,7 @@ <value>Границы</value> </toolTip> <extendedTooltip> - <name>ГраницыРасширеннаяПодсказка</name> + <name>ГраницыExtendedTooltip</name> <id>118</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -928,7 +928,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОбъединитьРасширеннаяПодсказка</name> + <name>ОбъединитьExtendedTooltip</name> <id>131</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -954,7 +954,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>РазъединитьРасширеннаяПодсказка</name> + <name>РазъединитьExtendedTooltip</name> <id>132</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -981,7 +981,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВставитьПримечаниеРасширеннаяПодсказка</name> + <name>ВставитьПримечаниеExtendedTooltip</name> <id>133</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1012,7 +1012,7 @@ <value>Действия с ячейками</value> </toolTip> <extendedTooltip> - <name>ДействияСЯчейкамиРасширеннаяПодсказка</name> + <name>ДействияСЯчейкамиExtendedTooltip</name> <id>130</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1037,7 +1037,7 @@ <value>Команды редактирования</value> </toolTip> <extendedTooltip> - <name>КомандыРедактированияРасширеннаяПодсказка</name> + <name>КомандыРедактированияExtendedTooltip</name> <id>99</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1063,7 +1063,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ОтображатьГруппировкиРасширеннаяПодсказка</name> + <name>ОтображатьГруппировкиExtendedTooltip</name> <id>136</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1089,7 +1089,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СвернутьВсеГруппыРасширеннаяПодсказка</name> + <name>СвернутьВсеГруппыExtendedTooltip</name> <id>137</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1115,7 +1115,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>РазвернутьВсеГруппыРасширеннаяПодсказка</name> + <name>РазвернутьВсеГруппыExtendedTooltip</name> <id>138</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1146,7 +1146,7 @@ <value>Действия с группами</value> </toolTip> <extendedTooltip> - <name>ДействияСГруппамиРасширеннаяПодсказка</name> + <name>ДействияСГруппамиExtendedTooltip</name> <id>135</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1166,7 +1166,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИзменитьФормуРасширеннаяПодсказка</name> + <name>ИзменитьФормуExtendedTooltip</name> <id>139</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1197,7 +1197,7 @@ <value>Все действия</value> </toolTip> <extendedTooltip> - <name>ВсеДействияРасширеннаяПодсказка</name> + <name>ВсеДействияExtendedTooltip</name> <id>134</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1217,7 +1217,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СправкаРасширеннаяПодсказка</name> + <name>СправкаExtendedTooltip</name> <id>140</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1248,7 +1248,7 @@ <value>Командная панель</value> </toolTip> <extendedTooltip> - <name>КоманднаяПанельРасширеннаяПодсказка</name> + <name>КоманднаяПанельExtendedTooltip</name> <id>94</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1278,7 +1278,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КартинкаПредупрежденияРасширеннаяПодсказка</name> + <name>КартинкаПредупрежденияExtendedTooltip</name> <id>142</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1315,7 +1315,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстПредупрежденияРасширеннаяПодсказка</name> + <name>ТекстПредупрежденияExtendedTooltip</name> <id>143</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1350,7 +1350,7 @@ true - ПредупреждениеРасширеннаяПодсказка + ПредупреждениеExtendedTooltip 141 Label true @@ -1382,7 +1382,7 @@ None - ТабличныйДокументРасширеннаяПодсказка + ТабличныйДокументExtendedTooltip 144 Label true @@ -1531,6 +1531,23 @@ true + + ЗаписьВыполнена + + <key>ru</key> + <value>Запись выполнена</value> + + 5 + + Boolean + + + true + + + true + + ЗаписатьИЗакрыть diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html index 4d1538c60..6b6620caf 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Help/ru.html @@ -1,3 +1,3 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Программа позволяет редактировать табличные документы и макеты. </p> <p><strong>Важно: </strong>при редактировании макетов печатных форм необходимо иметь в виду, что изменение имен областей, а также параметров макета может привести к потере работоспособности печатной формы. Восстановление стандартной печатной формы выполняется в списке <a href="InformationRegister.ПользовательскиеМакетыПечати.Form.МакетыПечатныхФорм/Help">Макеты печатных форм</a>.</p></body></html> \ No newline at end of file diff --git a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl index 96a3efff6..9c1766529 100644 --- a/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl +++ b/SSL/src/CommonForms/РедактированиеТабличногоДокумента/Module.bsl @@ -1,5 +1,3 @@ - - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -47,7 +45,7 @@ Если ПустаяСтрока(ИмяДокумента) Тогда ИспользованныеИмена = Новый Массив; - Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтаФорма); + Оповестить("ЗапросИменРедактируемыхТабличныхДокументов", ИспользованныеИмена, ЭтотОбъект); Индекс = 1; Пока ИспользованныеИмена.Найти(ИмяНовогоДокумента() + Индекс) <> Неопределено Цикл @@ -68,32 +66,36 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если Модифицированность Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Сохранить изменения в %1?'"), ИмяДокумента); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена); - Если Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда - ЗаписатьТабличныйДокумент(Отказ); - Иначе - Модифицированность = Ложь; - КонецЕсли; - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(ОписаниеОповещения, Отказ, ТекстВопроса); Если Не Модифицированность Тогда - ИмяСобытия = "ОтменаРедактированияТабличногоДокумента"; ПараметрыОповещения = Новый Структура; ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу); ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", Параметры.ИмяОбъектаМетаданныхМакета); - Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтаФорма); + Если ЗаписьВыполнена Тогда + ИмяСобытия = "Запись_ТабличныйДокумент"; + ПараметрыОповещения.Вставить("ТабличныйДокумент", ТабличныйДокумент); + Иначе + ИмяСобытия = "ОтменаРедактированияТабличногоДокумента"; + КонецЕсли; + Оповестить(ИмяСобытия, ПараметрыОповещения, ЭтотОбъект); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + Если ЗаписатьТабличныйДокумент() Тогда + Закрыть(); + КонецЕсли; +КонецПроцедуры + &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "ЗапросИменРедактируемыхТабличныхДокументов" И Источник <> ЭтаФорма Тогда + Если ИмяСобытия = "ЗапросИменРедактируемыхТабличныхДокументов" И Источник <> ЭтотОбъект Тогда Параметр.Добавить(ИмяДокумента); ИначеЕсли ИмяСобытия = "ЗакрытиеФормыВладельца" И Источник = ВладелецФормы Тогда Закрыть(); @@ -119,9 +121,7 @@ &НаКлиенте Процедура ЗаписатьИЗакрыть(Команда) - Отказ = Ложь; - ЗаписатьТабличныйДокумент(Отказ); - Если Не Отказ Тогда + Если ЗаписатьТабличныйДокумент() Тогда Закрыть(); КонецЕсли; КонецПроцедуры @@ -169,13 +169,8 @@ ДиалогВыбораШрифта.Шрифт = ОбщийШрифт; #КонецЕсли - Если ДиалогВыбораШрифта.Выбрать() Тогда - Для Каждого Область Из ОбрабатываемыеОбласти Цикл - Область.Шрифт = ДиалогВыбораШрифта.Шрифт; - КонецЦикла; - КонецЕсли; - - ОбновитьПометкиКнопокКоманднойПанели(); + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииВыбораШрифта", ЭтотОбъект, ОбрабатываемыеОбласти); + ДиалогВыбораШрифта.Показать(ОписаниеОповещения); КонецПроцедуры @@ -210,7 +205,7 @@ УстанавливаемоеЗначение = Неопределено; Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл Если УстанавливаемоеЗначение = Неопределено Тогда - УстанавливаемоеЗначение = Не Область.Шрифт.Жирный; + УстанавливаемоеЗначение = Не Область.Шрифт.Жирный = Истина; КонецЕсли; Область.Шрифт = Новый Шрифт(Область.Шрифт,,,УстанавливаемоеЗначение); КонецЦикла; @@ -225,7 +220,7 @@ УстанавливаемоеЗначение = Неопределено; Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл Если УстанавливаемоеЗначение = Неопределено Тогда - УстанавливаемоеЗначение = Не Область.Шрифт.Наклонный; + УстанавливаемоеЗначение = Не Область.Шрифт.Наклонный = Истина; КонецЕсли; Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,УстанавливаемоеЗначение); КонецЦикла; @@ -240,7 +235,7 @@ УстанавливаемоеЗначение = Неопределено; Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл Если УстанавливаемоеЗначение = Неопределено Тогда - УстанавливаемоеЗначение = Не Область.Шрифт.Подчеркивание; + УстанавливаемоеЗначение = Не Область.Шрифт.Подчеркивание = Истина; КонецЕсли; Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,УстанавливаемоеЗначение); КонецЦикла; @@ -255,7 +250,7 @@ УстанавливаемоеЗначение = Неопределено; Для Каждого Область Из СписокОбластейДляИзмененияШрифта() Цикл Если УстанавливаемоеЗначение = Неопределено Тогда - УстанавливаемоеЗначение = Не Область.Шрифт.Зачеркивание; + УстанавливаемоеЗначение = Не Область.Шрифт.Зачеркивание = Истина; КонецЕсли; Область.Шрифт = Новый Шрифт(Область.Шрифт,,,,,,УстанавливаемоеЗначение); КонецЦикла; @@ -270,9 +265,9 @@ #Если Не ВебКлиент Тогда ДиалогВыбораЦвета.Цвет = Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветФона; #КонецЕсли - Если ДиалогВыбораЦвета.Выбрать() Тогда - Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветФона = ДиалогВыбораЦвета.Цвет; - КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииВыбораЦветаФона", ЭтотОбъект); + ДиалогВыбораЦвета.Показать(ОписаниеОповещения); КонецПроцедуры &НаКлиенте @@ -281,12 +276,11 @@ #Если Не ВебКлиент Тогда ДиалогВыбораЦвета.Цвет = Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветТекста; #КонецЕсли - Если ДиалогВыбораЦвета.Выбрать() Тогда - Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветТекста = ДиалогВыбораЦвета.Цвет; - КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗавершенииВыбораЦветаТекста", ЭтотОбъект); + ДиалогВыбораЦвета.Показать(ОписаниеОповещения); КонецПроцедуры - // Выравнивание &НаКлиенте @@ -542,8 +536,8 @@ &НаКлиенте Процедура ВставитьПримечание(Команда) Примечание = Элементы.ТабличныйДокумент.ТекущаяОбласть.Примечание.Текст; - ВвестиСтроку(Примечание, НСтр("ru = 'Примечание'"), , Истина); - Элементы.ТабличныйДокумент.ТекущаяОбласть.Примечание.Текст = Примечание; + ОписаниеОповещения = Новый ОписаниеОповещения("ВставитьПримечаниеЗавершение", ЭтотОбъект); + ПоказатьВводСтроки(ОписаниеОповещения, Примечание, НСтр("ru = 'Примечание'"), , Истина); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -551,8 +545,8 @@ &НаСервере Процедура ЗагрузитьТабличныйДокументИзМетаданных() - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеПечатью"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); ТабличныйДокумент = МодульУправлениеПечатью.ПолучитьМакет(Параметры.ИмяОбъектаМетаданныхМакета); КонецЕсли; КонецПроцедуры @@ -591,15 +585,19 @@ &НаКлиенте Функция ШагИзмененияРазмераШрифтаУвеличение(Размер) + Если Размер = -1 Тогда + Возврат 10; + КонецЕсли; + Если Размер < 10 Тогда Возврат 1; - ИначеЕсли 10 <= Размер и Размер < 20 Тогда + ИначеЕсли 10 <= Размер И Размер < 20 Тогда Возврат 2; - ИначеЕсли 20 <= Размер и Размер < 48 Тогда + ИначеЕсли 20 <= Размер И Размер < 48 Тогда Возврат 4; - ИначеЕсли 48 <= Размер и Размер < 72 Тогда + ИначеЕсли 48 <= Размер И Размер < 72 Тогда Возврат 6; - ИначеЕсли 72 <= Размер и Размер < 96 Тогда + ИначеЕсли 72 <= Размер И Размер < 96 Тогда Возврат 8; Иначе Возврат Окр(Размер / 10); @@ -608,6 +606,10 @@ &НаКлиенте Функция ШагИзмененияРазмераШрифтаУменьшение(Размер) + Если Размер = -1 Тогда + Возврат -8; + КонецЕсли; + Если Размер <= 11 Тогда Возврат 1; ИначеЕсли 11 < Размер и Размер <= 23 Тогда @@ -684,13 +686,12 @@ КонецФункции &НаКлиенте -Процедура ЗаписатьТабличныйДокумент(Отказ = Ложь) +Функция ЗаписатьТабличныйДокумент() Если ЭтоНовый() Или РедактированиеЗапрещено Тогда ДиалогСохраненияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); ДиалогСохраненияФайла.ПолноеИмяФайла = ИмяДокумента; ДиалогСохраненияФайла.Фильтр = НСтр("ru = 'Табличный документ'") + " (*.mxl)|*.mxl"; - //ДиалогСохраненияФайла.Заголовок = ""; Если ДиалогСохраненияФайла.Выбрать() Тогда Параметры.ПутьКФайлу = ДиалогСохраненияФайла.ПолноеИмяФайла; ИмяДокумента = Сред(ДиалогСохраненияФайла.ПолноеИмяФайла, СтрДлина(ДиалогСохраненияФайла.Каталог) + 1); @@ -698,8 +699,7 @@ ИмяДокумента = Лев(ИмяДокумента, СтрДлина(ИмяДокумента) - 4); КонецЕсли; Иначе - Отказ = Истина; - Возврат; + Возврат Ложь; КонецЕсли; КонецЕсли; @@ -708,17 +708,13 @@ РедактированиеЗапрещено = Ложь; КонецЕсли; - ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("ТабличныйДокумент", ТабличныйДокумент); - ПараметрыОповещения.Вставить("ПутьКФайлу", Параметры.ПутьКФайлу); - ПараметрыОповещения.Вставить("ИмяОбъектаМетаданныхМакета", Параметры.ИмяОбъектаМетаданныхМакета); - - Оповестить("Запись_ТабличныйДокумент", ПараметрыОповещения, ЭтаФорма); - + ЗаписьВыполнена = Истина; Модифицированность = Ложь; УстановитьЗаголовок(); -КонецПроцедуры + Возврат Истина; + +КонецФункции &НаКлиенте Функция ИмяНовогоДокумента() @@ -808,3 +804,39 @@ Область.ГраницаСнизу = Линия; КонецПроцедуры + +&НаКлиенте +Процедура ВставитьПримечаниеЗавершение(Строка, ДополнительныеПараметры) Экспорт + Если Строка <> Неопределено Тогда + Элементы.ТабличныйДокумент.ТекущаяОбласть.Примечание.Текст = Строка; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииВыбораШрифта(ВыбранныйШрифт, ОбрабатываемыеОбласти) Экспорт + + Если ВыбранныйШрифт = Неопределено Тогда + Возврат; + КонецЕсли; + + Для Каждого Область Из ОбрабатываемыеОбласти Цикл + Область.Шрифт = ВыбранныйШрифт; + КонецЦикла; + + ОбновитьПометкиКнопокКоманднойПанели(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииВыбораЦветаФона(ВыбранныйЦвет, ДополнительныеПараметры) Экспорт + Если ВыбранныйЦвет <> Неопределено Тогда + Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветФона = ВыбранныйЦвет; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗавершенииВыбораЦветаТекста(ВыбранныйЦвет, ДополнительныеПараметры) Экспорт + Если ВыбранныйЦвет <> Неопределено Тогда + Элементы.ТабличныйДокумент.ТекущаяОбласть.ЦветТекста = ВыбранныйЦвет; + КонецЕсли; +КонецПроцедуры diff --git a/SSL/src/CommonForms/СертификатЭЦП/Form.form b/SSL/src/CommonForms/СертификатЭП/Form.form similarity index 95% rename from SSL/src/CommonForms/СертификатЭЦП/Form.form rename to SSL/src/CommonForms/СертификатЭП/Form.form index 1f17d58a7..9514b8f67 100644 --- a/SSL/src/CommonForms/СертификатЭЦП/Form.form +++ b/SSL/src/CommonForms/СертификатЭП/Form.form @@ -13,7 +13,7 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>КомуВыданРасширеннаяПодсказка</name> + <name>КомуВыданExtendedTooltip</name> <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -56,8 +56,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>КемВыданРасширеннаяПодсказка</name> - <id>18</id> + <name>КемВыданExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -99,8 +99,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>СрокДействияРасширеннаяПодсказка</name> - <id>20</id> + <name>СрокДействияExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -142,8 +142,8 @@ </dataPath> <skipOnInput>true</skipOnInput> <extendedTooltip> - <name>НазначениеРасширеннаяПодсказка</name> - <id>22</id> + <name>НазначениеExtendedTooltip</name> + <id>19</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -186,7 +186,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаЗакрытьРасширеннаяПодсказка</name> + <name>ФормаЗакрытьExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -211,7 +211,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСохранитьРасширеннаяПодсказка</name> + <name>ФормаСохранитьExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -237,7 +237,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаПроверитьРасширеннаяПодсказка</name> + <name>ФормаПроверитьExtendedTooltip</name> <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/CommonForms/СертификатЭЦП/Help/ru.html b/SSL/src/CommonForms/СертификатЭП/Help/ru.html similarity index 72% rename from SSL/src/CommonForms/СертификатЭЦП/Help/ru.html rename to SSL/src/CommonForms/СертификатЭП/Help/ru.html index 5d592baa8..62e6cefe5 100644 --- a/SSL/src/CommonForms/СертификатЭЦП/Help/ru.html +++ b/SSL/src/CommonForms/СертификатЭП/Help/ru.html @@ -1,8 +1,8 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Форма предназначена для просмотра основных свойств сертификата электронной подписи (ЭП). </p> <p>В ней можно посмотреть основные свойства сертификата: кому выдан, кем выдан, действителен до, назначение. </p> <p>По команде "<strong>Проверить</strong>" выполняется проверка сертификата.</p> <p> </p> <p><strong><font color="#b22222">См. также:</font></strong></p> <blockquote style="MARGIN-RIGHT: 0px" dir="ltr"> -<p><a href="CommonForm.НастройкиЭЦП/Help">Настройка ЭП и шифрования</a><br><a href="CommonForm.ПерсональныеНастройкиЭЦП/Help">Персональные настройки ЭП</a> </p></blockquote></body></html> \ No newline at end of file +<p><a href="CommonForm.НастройкиКриптографии/Help">Настройка ЭП и шифрования</a><br><a href="CommonForm.ПерсональныеНастройкиЭП/Help">Персональные настройки ЭП</a> </p></blockquote></body></html> \ No newline at end of file diff --git a/SSL/src/CommonForms/СертификатЭЦП/Module.bsl b/SSL/src/CommonForms/СертификатЭП/Module.bsl similarity index 91% rename from SSL/src/CommonForms/СертификатЭЦП/Module.bsl rename to SSL/src/CommonForms/СертификатЭП/Module.bsl index af4f0ad65..a83d17757 100644 --- a/SSL/src/CommonForms/СертификатЭЦП/Module.bsl +++ b/SSL/src/CommonForms/СертификатЭП/Module.bsl @@ -22,7 +22,7 @@ НовоеНазначение = ""; ДобавлятьКодНазначения = Истина; - ЭлектроннаяЦифроваяПодпись.ЗаполнитьНазначениеСертификата(Назначение, НовоеНазначение, ДобавлятьКодНазначения); + ЭлектроннаяПодпись.ЗаполнитьНазначениеСертификата(Назначение, НовоеНазначение, ДобавлятьКодНазначения); Назначение = НовоеНазначение; КонецПроцедуры @@ -74,10 +74,10 @@ МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.ИгнорироватьВремяДействия); МассивРежимовПроверки.Добавить(РежимПроверкиСертификатаКриптографии.РазрешитьТестовыеСертификаты); МенеджерКриптографии.ПроверитьСертификат(Сертификат, МассивРежимовПроверки); - Предупреждение(НСтр("ru = 'Сертификат действителен'")); + ПоказатьПредупреждение(, НСтр("ru = 'Сертификат действителен'")); Исключение Текст = НСтр("ru = 'Сертификат недействителен.'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Предупреждение(Текст); + ПоказатьПредупреждение(, Текст); КонецПопытки; КонецПроцедуры @@ -89,7 +89,7 @@ Функция ПолучитьСертификат(МенеджерКриптографии) ДвоичныеДанныеОтпечатка = Base64Значение(Отпечаток); - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); Если ЗначениеЗаполнено(АдресСертификата) И ЭтоАдресВременногоХранилища(АдресСертификата) Тогда ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата); @@ -103,7 +103,7 @@ КонецЕсли; Если Сертификат = Неопределено Тогда - Предупреждение(НСтр("ru = 'Сертификат не найден'")); + ПоказатьПредупреждение(, НСтр("ru = 'Сертификат не найден'")); КонецЕсли; Возврат Сертификат; diff --git a/SSL/src/CommonForms/СертификатЭЦП/СертификатЭЦП.mdo b/SSL/src/CommonForms/СертификатЭП/СертификатЭП.mdo similarity index 91% rename from SSL/src/CommonForms/СертификатЭЦП/СертификатЭЦП.mdo rename to SSL/src/CommonForms/СертификатЭП/СертификатЭП.mdo index 141fd3caf..49739c672 100644 --- a/SSL/src/CommonForms/СертификатЭЦП/СертификатЭЦП.mdo +++ b/SSL/src/CommonForms/СертификатЭП/СертификатЭП.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonForm xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b322b047-16eb-4500-826a-6dfebb7d997a"> - <name>СертификатЭЦП</name> + <name>СертификатЭП</name> <synonym> <key>ru</key> <value>Сертификат ЭП</value> diff --git a/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Form.form b/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Form.form index 242daf499..4dd511285 100644 --- a/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Form.form +++ b/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Form.form @@ -25,7 +25,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация1РасширеннаяПодсказка</name> + <name>Декорация1ExtendedTooltip</name> <id>89</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -64,7 +64,7 @@ <value>Группа картинки</value> </toolTip> <extendedTooltip> - <name>ГруппаКартинкиРасширеннаяПодсказка</name> + <name>ГруппаКартинкиExtendedTooltip</name> <id>88</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -99,7 +99,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>Декорация2РасширеннаяПодсказка</name> + <name>Декорация2ExtendedTooltip</name> <id>91</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -137,7 +137,7 @@ <value>Группа сообщения</value> </toolTip> <extendedTooltip> - <name>ГруппаСообщенияРасширеннаяПодсказка</name> + <name>ГруппаСообщенияExtendedTooltip</name> <id>90</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -166,7 +166,7 @@ <value>Группировка сообщения</value> </toolTip> <extendedTooltip> - <name>ГруппировкаСообщенияРасширеннаяПодсказка</name> + <name>ГруппировкаСообщенияExtendedTooltip</name> <id>87</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -199,7 +199,7 @@ <value>Страница 14</value> </toolTip> <extendedTooltip> - <name>ОжиданиеПолученияДанныхРасширеннаяПодсказка</name> + <name>ОжиданиеПолученияДанныхExtendedTooltip</name> <id>86</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -235,7 +235,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВыполнитьСинхронизациюДанныхРасширеннаяПодсказка</name> + <name>ВыполнитьСинхронизациюДанныхExtendedTooltip</name> <id>96</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -266,7 +266,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПредставлениеДатыСинхронизацииРасширеннаяПодсказка</name> + <name>ПредставлениеДатыСинхронизацииExtendedTooltip</name> <id>97</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -299,7 +299,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПерейтиККонфликтамРасширеннаяПодсказка</name> + <name>ПерейтиККонфликтамExtendedTooltip</name> <id>98</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -331,7 +331,7 @@ <value>Группировка элементов</value> </toolTip> <extendedTooltip> - <name>ГруппировкаЭлементовРасширеннаяПодсказка</name> + <name>ГруппировкаЭлементовExtendedTooltip</name> <id>95</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -363,7 +363,7 @@ <value>Состояние синхронизации</value> </toolTip> <extendedTooltip> - <name>СостояниеСинхронизацииРасширеннаяПодсказка</name> + <name>СостояниеСинхронизацииExtendedTooltip</name> <id>94</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -393,7 +393,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ВыполнитьСинхронизациюДанных1РасширеннаяПодсказка</name> + <name>ВыполнитьСинхронизациюДанных1ExtendedTooltip</name> <id>101</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -424,7 +424,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КартинкаДлительнойОперацииРасширеннаяПодсказка</name> + <name>КартинкаДлительнойОперацииExtendedTooltip</name> <id>102</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -461,7 +461,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПредставлениеВыполненияСинхронизацииРасширеннаяПодсказка</name> + <name>ПредставлениеВыполненияСинхронизацииExtendedTooltip</name> <id>103</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -499,7 +499,7 @@ <value>Группировка элементов</value> </toolTip> <extendedTooltip> - <name>ГруппировкаЭлементов1РасширеннаяПодсказка</name> + <name>ГруппировкаЭлементов1ExtendedTooltip</name> <id>100</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -531,7 +531,7 @@ <value>Выполнение синхронизации</value> </toolTip> <extendedTooltip> - <name>ВыполнениеСинхронизацииРасширеннаяПодсказка</name> + <name>ВыполнениеСинхронизацииExtendedTooltip</name> <id>99</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -560,7 +560,7 @@ <value>Панель синхронизации данных</value> </toolTip> <extendedTooltip> - <name>ПанельСинхронизацииДанныхРасширеннаяПодсказка</name> + <name>ПанельСинхронизацииДанныхExtendedTooltip</name> <id>93</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -601,8 +601,8 @@ <segments>НастройкиСинхронизацииДанных.НаименованиеПриложения</segments> </dataPath> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхНаименованиеПриложенияРасширеннаяПодсказка</name> - <id>137</id> + <name>НастройкиСинхронизацииДанныхНаименованиеПриложенияExtendedTooltip</name> + <id>128</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -646,8 +646,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхСтатусСинхронизацииРасширеннаяПодсказка</name> - <id>140</id> + <name>НастройкиСинхронизацииДанныхСтатусСинхронизацииExtendedTooltip</name> + <id>130</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -691,8 +691,8 @@ <segments>НастройкиСинхронизацииДанных.Состояние</segments> </dataPath> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхСостояниеРасширеннаяПодсказка</name> - <id>142</id> + <name>НастройкиСинхронизацииДанныхСостояниеExtendedTooltip</name> + <id>131</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -726,8 +726,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхГруппа1РасширеннаяПодсказка</name> - <id>139</id> + <name>НастройкиСинхронизацииДанныхГруппа1ExtendedTooltip</name> + <id>129</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -754,7 +754,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастроитьСинхронизациюДанныхРасширеннаяПодсказка</name> + <name>НастроитьСинхронизациюДанныхExtendedTooltip</name> <id>115</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -780,7 +780,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхОтключитьСинхронизациюДанныхРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхОтключитьСинхронизациюДанныхExtendedTooltip</name> <id>116</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -810,7 +810,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхНайтиРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхНайтиExtendedTooltip</name> <id>118</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -837,7 +837,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхОтменитьПоискРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхОтменитьПоискExtendedTooltip</name> <id>119</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -861,7 +861,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхГруппа2РасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхГруппа2ExtendedTooltip</name> <id>117</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -884,7 +884,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхВывестиСписокРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхВывестиСписокExtendedTooltip</name> <id>121</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -911,7 +911,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКопироватьВБуферОбменаРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКопироватьВБуферОбменаExtendedTooltip</name> <id>122</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -935,7 +935,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхГруппа3РасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхГруппа3ExtendedTooltip</name> <id>120</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -955,7 +955,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхИзменитьФормуРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхИзменитьФормуExtendedTooltip</name> <id>123</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -982,7 +982,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхСправкаРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхСправкаExtendedTooltip</name> <id>124</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1008,7 +1008,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхОбновитьРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхОбновитьExtendedTooltip</name> <id>125</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1035,7 +1035,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхПодготовитьДанныеРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхПодготовитьДанныеExtendedTooltip</name> <id>126</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1064,10 +1064,10 @@ </handlers> <searchStringAddition> <name>НастройкиСинхронизацииДанныхСтрокаПоиска</name> - <id>128</id> + <id>145</id> <extendedTooltip> <name>НастройкиСинхронизацииДанныхСтрокаПоискаРасширеннаяПодсказка</name> - <id>130</id> + <id>147</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1077,7 +1077,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиСинхронизацииДанныхСтрокаПоискаКонтекстноеМеню</name> - <id>129</id> + <id>146</id> <autoFill>true</autoFill> </contextMenu> <source>НастройкиСинхронизацииДанных</source> @@ -1087,10 +1087,10 @@ </searchStringAddition> <viewStatusAddition> <name>НастройкиСинхронизацииДанныхСостояниеПросмотра</name> - <id>131</id> + <id>148</id> <extendedTooltip> <name>НастройкиСинхронизацииДанныхСостояниеПросмотраРасширеннаяПодсказка</name> - <id>133</id> + <id>150</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1100,7 +1100,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиСинхронизацииДанныхСостояниеПросмотраКонтекстноеМеню</name> - <id>132</id> + <id>149</id> <autoFill>true</autoFill> </contextMenu> <type>ViewStatusAddition</type> @@ -1111,10 +1111,10 @@ </viewStatusAddition> <searchControlAddition> <name>НастройкиСинхронизацииДанныхУправлениеПоиском</name> - <id>134</id> + <id>151</id> <extendedTooltip> <name>НастройкиСинхронизацииДанныхУправлениеПоискомРасширеннаяПодсказка</name> - <id>136</id> + <id>153</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1124,7 +1124,7 @@ </extendedTooltip> <contextMenu> <name>НастройкиСинхронизацииДанныхУправлениеПоискомКонтекстноеМеню</name> - <id>135</id> + <id>152</id> <autoFill>true</autoFill> </contextMenu> <type>SearchControlAddition</type> @@ -1134,7 +1134,7 @@ </extInfo> </searchControlAddition> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхExtendedTooltip</name> <id>127</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1155,7 +1155,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюНастроитьСинхронизациюДанныхРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюНастроитьСинхронизациюДанныхExtendedTooltip</name> <id>105</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1181,7 +1181,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтключитьСинхронизациюДанныхРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтключитьСинхронизациюДанныхExtendedTooltip</name> <id>106</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1210,7 +1210,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтправитьДанныеРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтправитьДанныеExtendedTooltip</name> <id>108</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1233,7 +1233,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа3РасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа3ExtendedTooltip</name> <id>107</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1256,7 +1256,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюНайтиРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюНайтиExtendedTooltip</name> <id>110</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1282,7 +1282,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюОтменитьПоискExtendedTooltip</name> <id>111</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1305,7 +1305,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа1РасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа1ExtendedTooltip</name> <id>109</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1328,7 +1328,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюВывестиСписокРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюВывестиСписокExtendedTooltip</name> <id>113</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1354,7 +1354,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip</name> <id>114</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1377,7 +1377,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа2РасширеннаяПодсказка</name> + <name>НастройкиСинхронизацииДанныхКонтекстноеМенюГруппа2ExtendedTooltip</name> <id>112</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -1429,8 +1429,8 @@ <segments>НастройкиСинхронизацииДанныхОписание</segments> </dataPath> <extendedTooltip> - <name>НастройкиСинхронизацииДанныхОписаниеРасширеннаяПодсказка</name> - <id>152</id> + <name>НастройкиСинхронизацииДанныхОписаниеExtendedTooltip</name> + <id>132</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1471,7 +1471,7 @@ <value>Группа монитора синхронизации</value> - ГруппаМонитораСинхронизацииРасширеннаяПодсказка + ГруппаМонитораСинхронизацииExtendedTooltip 104 Label true @@ -1504,7 +1504,7 @@ Настройка синхронизации данных - НастройкаСинхронизацииДанныхРасширеннаяПодсказка + НастройкаСинхронизацииДанныхExtendedTooltip 92 Label true @@ -1537,8 +1537,8 @@ true - Декорация3РасширеннаяПодсказка - 157 + Декорация3ExtendedTooltip + 136 Label true true @@ -1576,8 +1576,8 @@ Группа картинки - ГруппаКартинки1РасширеннаяПодсказка - 156 + ГруппаКартинки1ExtendedTooltip + 135 Label true true @@ -1611,8 +1611,8 @@ true - Декорация4РасширеннаяПодсказка - 159 + Декорация4ExtendedTooltip + 138 Label true true @@ -1649,8 +1649,8 @@ Группа сообщения - ГруппаСообщения1РасширеннаяПодсказка - 158 + ГруппаСообщения1ExtendedTooltip + 137 Label true true @@ -1678,8 +1678,8 @@ Группировка сообщения - ГруппировкаСообщения1РасширеннаяПодсказка - 155 + ГруппировкаСообщения1ExtendedTooltip + 134 Label true true @@ -1711,8 +1711,8 @@ Ошибка получения данных - ОшибкаПолученияДанныхРасширеннаяПодсказка - 154 + ОшибкаПолученияДанныхExtendedTooltip + 133 Label true true @@ -1744,8 +1744,8 @@ true - Декорация5РасширеннаяПодсказка - 163 + Декорация5ExtendedTooltip + 142 Label true true @@ -1783,8 +1783,8 @@ Группа картинки - ГруппаКартинки2РасширеннаяПодсказка - 162 + ГруппаКартинки2ExtendedTooltip + 141 Label true true @@ -1818,8 +1818,8 @@ true - Декорация6РасширеннаяПодсказка - 165 + Декорация6ExtendedTooltip + 144 Label true true @@ -1856,8 +1856,8 @@ Группа сообщения - ГруппаСообщения2РасширеннаяПодсказка - 164 + ГруппаСообщения2ExtendedTooltip + 143 Label true true @@ -1885,8 +1885,8 @@ Группировка сообщения - ГруппировкаСообщения2РасширеннаяПодсказка - 161 + ГруппировкаСообщения2ExtendedTooltip + 140 Label true true @@ -1918,8 +1918,8 @@ Нет приложений для синхронизации - НетПриложенийДляСинхронизацииРасширеннаяПодсказка - 160 + НетПриложенийДляСинхронизацииExtendedTooltip + 139 Label true true @@ -1949,7 +1949,7 @@ true true - ПанельОсновнаяРасширеннаяПодсказка + ПанельОсновнаяExtendedTooltip 85 Label true diff --git a/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Module.bsl b/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Module.bsl index bd0f2bd8b..a9121f1b3 100644 --- a/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonForms/СинхронизацияДанныхВМоделиСервиса/Module.bsl @@ -96,7 +96,7 @@ ОткрытьФорму("Обработка.ПомощникИнтерактивногоОбменаДаннымиВМоделиСервиса.Форма.Форма", Новый Структура("ЗапретитьВыгрузкуТолькоИзмененного, УзелИнформационнойБазы", Истина, ДанныеПриложения.Корреспондент - ), ЭтаФорма); + ), ЭтотОбъект); КонецПроцедуры @@ -124,7 +124,7 @@ Если ТекущиеДанные.НастройкаСинхронизацииВМенеджереСервиса Тогда - Предупреждение(НСтр("ru = 'Для отключения синхронизации данных перейдите в менеджер сервиса. + ПоказатьПредупреждение(, НСтр("ru = 'Для отключения синхронизации данных перейдите в менеджер сервиса. |В менеджере сервиса воспользуйтесь командой ""Синхронизация данных"".'")); Иначе @@ -133,7 +133,7 @@ ПараметрыФормы.Вставить("ОбластьДанныхКорреспондента", ТекущиеДанные.ОбластьДанных); ПараметрыФормы.Вставить("НаименованиеКорреспондента", ТекущиеДанные.НаименованиеПриложения); - ОткрытьФорму("Обработка.ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете.Форма.ОтключениеСинхронизацииДанных", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Обработка.ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете.Форма.ОтключениеСинхронизацииДанных", ПараметрыФормы, ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецЕсли; @@ -511,11 +511,11 @@ Если ТекущиеДанные.СинхронизацияНастроена Тогда - ОткрытьЗначение(ТекущиеДанные.Корреспондент); + ПоказатьЗначение(, ТекущиеДанные.Корреспондент); ИначеЕсли ТекущиеДанные.НастройкаСинхронизацииВМенеджереСервиса Тогда - Предупреждение(НСтр("ru = 'Для настройки синхронизации данных перейдите в менеджер сервиса. + ПоказатьПредупреждение(, НСтр("ru = 'Для настройки синхронизации данных перейдите в менеджер сервиса. |В менеджере сервиса воспользуйтесь командой ""Синхронизация данных"".'")); Иначе @@ -531,7 +531,7 @@ Уникальность = ТекущиеДанные.ПланОбмена + Формат(ТекущиеДанные.ОбластьДанных, "ЧЦ=7; ЧВН=; ЧГ=0"); ОткрытьФорму("Обработка.ПомощникНастройкиСинхронизацииДанныхМеждуПриложениямиВИнтернете.Форма.Форма", - ПараметрыФормы, ЭтаФорма, Уникальность, ВариантОткрытияОкна.ОтдельноеОкно); + ПараметрыФормы, ЭтотОбъект, Уникальность,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form index 49a694668..bed943587 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Form.form @@ -21,7 +21,7 @@ ВидБазыПриИзменении - ВидБазыРасширеннаяПодсказка + ВидБазыExtendedTooltip 51 Label true @@ -83,8 +83,8 @@ Язык - ЯзыкФайловойБазыРасширеннаяПодсказка - 56 + ЯзыкФайловойБазыExtendedTooltip + 55 Label true true @@ -132,8 +132,8 @@ Top 1 - ПолноеИмяФайловойБазыРасширеннаяПодсказка - 59 + ПолноеИмяФайловойБазыExtendedTooltip + 57 Label true true @@ -183,8 +183,8 @@ Top - ПолноеИмяФайловойБазыLinuxРасширеннаяПодсказка - 61 + ПолноеИмяФайловойБазыLinuxExtendedTooltip + 58 Label true true @@ -226,8 +226,8 @@ Группа путь файловой базы - ГруппаПутьФайловойБазыРасширеннаяПодсказка - 58 + ГруппаПутьФайловойБазыExtendedTooltip + 56 Label true true @@ -261,8 +261,8 @@ Заполнить параметры файловой базы - ЗаполнитьПараметрыФайловойБазыРасширеннаяПодсказка - 55 + ЗаполнитьПараметрыФайловойБазыExtendedTooltip + 54 Label true true @@ -291,8 +291,8 @@ Сервер - СерверРасширеннаяПодсказка - 64 + СерверExtendedTooltip + 60 Label true true @@ -332,8 +332,8 @@ ИмяБазы - ИмяБазыРасширеннаяПодсказка - 66 + ИмяБазыExtendedTooltip + 61 Label true true @@ -373,8 +373,8 @@ ЗащищенноеСоединение - ЗащищенноеСоединениеРасширеннаяПодсказка - 68 + ЗащищенноеСоединениеExtendedTooltip + 62 Label true true @@ -443,8 +443,8 @@ ТипСУБД - ТипСУБДРасширеннаяПодсказка - 70 + ТипСУБДExtendedTooltip + 63 Label true true @@ -520,8 +520,8 @@ СерверБазыДанных - СерверБазыДанныхРасширеннаяПодсказка - 72 + СерверБазыДанныхExtendedTooltip + 64 Label true true @@ -561,8 +561,8 @@ ИмяБазыДанных - ИмяБазыДанныхРасширеннаяПодсказка - 74 + ИмяБазыДанныхExtendedTooltip + 65 Label true true @@ -601,8 +601,8 @@ ПользовательБазыДанных - ПользовательБазыДанныхРасширеннаяПодсказка - 76 + ПользовательБазыДанныхExtendedTooltip + 66 Label true true @@ -641,8 +641,8 @@ ПарольПользователя - ПарольПользователяРасширеннаяПодсказка - 78 + ПарольПользователяExtendedTooltip + 67 Label true true @@ -682,8 +682,8 @@ СмещениеДат - СмещениеДатРасширеннаяПодсказка - 80 + СмещениеДатExtendedTooltip + 68 Label true true @@ -741,8 +741,8 @@ Язык - ЯзыкБазыСервераРасширеннаяПодсказка - 82 + ЯзыкБазыСервераExtendedTooltip + 69 Label true true @@ -782,8 +782,8 @@ Right - УстановитьБлокировкуРегламентныхЗаданийРасширеннаяПодсказка - 84 + УстановитьБлокировкуРегламентныхЗаданийExtendedTooltip + 70 Label true true @@ -817,8 +817,8 @@ Заполнить параметры серверной базы - ЗаполнитьПараметрыСервернойБазыРасширеннаяПодсказка - 63 + ЗаполнитьПараметрыСервернойБазыExtendedTooltip + 59 Label true true @@ -846,8 +846,8 @@ Страницы - СтраницыРасширеннаяПодсказка - 54 + СтраницыExtendedTooltip + 53 Label true true @@ -874,8 +874,8 @@ Параметры - ПараметрыРасширеннаяПодсказка - 53 + ПараметрыExtendedTooltip + 52 Label true true @@ -915,8 +915,8 @@ Top - ПутьКАрхивуСФайламиТомовРасширеннаяПодсказка - 87 + ПутьКАрхивуСФайламиТомовExtendedTooltip + 72 Label true true @@ -966,8 +966,8 @@ Top - ПутьКАрхивуСФайламиТомовLinuxРасширеннаяПодсказка - 89 + ПутьКАрхивуСФайламиТомовLinuxExtendedTooltip + 73 Label true true @@ -1009,8 +1009,8 @@ Группа путь к архиву с файлами томов - ГруппаПутьКАрхивуСФайламиТомовРасширеннаяПодсказка - 86 + ГруппаПутьКАрхивуСФайламиТомовExtendedTooltip + 71 Label true true @@ -1047,8 +1047,8 @@ Панель действий - ПанельДействийРасширеннаяПодсказка - 91 + ПанельДействийExtendedTooltip + 74 Label true true @@ -1076,7 +1076,7 @@ false - СоздатьНачальныйОбразРасширеннаяПодсказка + СоздатьНачальныйОбразExtendedTooltip 48 Label true @@ -1107,7 +1107,7 @@ false - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 49 Label true @@ -1133,7 +1133,7 @@ false - СправкаРасширеннаяПодсказка + СправкаExtendedTooltip 50 Label true @@ -1157,7 +1157,7 @@ ПриСозданииНаСервере 75 - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html index 1fe591eea..909af6c2f 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Help/ru.html @@ -1,2 +1,2 @@ - +

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

            \ No newline at end of file diff --git a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl index c662143ed..d60867acd 100644 --- a/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl +++ b/SSL/src/CommonForms/СозданиеНачальногоОбразаСФайлами/Module.bsl @@ -83,7 +83,7 @@ Страницы = Элементы.Найти("Страницы"); Страницы.ТекущаяСтраница = Страницы.ПодчиненныеЭлементы[ВидБазы]; - Если ЭтаФорма.ВидБазы = 0 Тогда + Если ЭтотОбъект.ВидБазы = 0 Тогда Элементы.ПутьКАрхивуСФайламиТомов.Заголовок = НСтр("ru = 'Для сервера 1С:Предприятия под управлением Microsoft Windows'"); @@ -155,15 +155,18 @@ КонецЕсли; - Предупреждение(НСтр("ru = 'Создание начального образа успешно завершено.'")); - - Закрыть(); - + Обработчик = Новый ОписаниеОповещения("СоздатьНачальныйОбразЗавершение", ЭтотОбъект); + ПоказатьПредупреждение(Обработчик, НСтр("ru = 'Создание начального образа успешно завершено.'")); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура СоздатьНачальныйОбразЗавершение(ПараметрыВыполнения) Экспорт + Закрыть(); +КонецПроцедуры + &НаКлиенте Процедура ОбработчикСохраненияФайла(ИмяСвойства, СтандартнаяОбработка, @@ -173,7 +176,7 @@ СтандартнаяОбработка = Ложь; Если Не ПодключитьРасширениеРаботыСФайлами() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); Возврат; КонецЕсли; @@ -184,10 +187,10 @@ Диалог.ПредварительныйПросмотр = Ложь; Диалог.Фильтр = Фильтр; Диалог.ПолноеИмяФайла = - ?(ЭтаФорма[ИмяСвойства] = "", ИмяФайла, ЭтаФорма[ИмяСвойства]); + ?(ЭтотОбъект[ИмяСвойства] = "", ИмяФайла, ЭтотОбъект[ИмяСвойства]); Если Диалог.Выбрать() Тогда - ЭтаФорма[ИмяСвойства] = Диалог.ПолноеИмяФайла; + ЭтотОбъект[ИмяСвойства] = Диалог.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form b/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form index 3ec0f9275..3d459b262 100644 --- a/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form +++ b/SSL/src/CommonForms/СозданиеРезервнойКопии/Form.form @@ -22,7 +22,7 @@ true - ДекорацияСообщениеДоВыгрузкиРасширеннаяПодсказка + ДекорацияСообщениеДоВыгрузкиExtendedTooltip 32 Label true @@ -53,7 +53,7 @@ До выгрузки - СтраницаДоВыгрузкиРасширеннаяПодсказка + СтраницаДоВыгрузкиExtendedTooltip 31 Label true @@ -83,7 +83,7 @@ true - ДекорацияСообщениеПослеВыгрузкиУспехРасширеннаяПодсказка + ДекорацияСообщениеПослеВыгрузкиУспехExtendedTooltip 34 Label true @@ -121,7 +121,7 @@ true - ДекорацияФайлРасширеннаяПодсказка + ДекорацияФайлExtendedTooltip 36 Label true @@ -152,7 +152,7 @@ Группа файл - ГруппаФайлРасширеннаяПодсказка + ГруппаФайлExtendedTooltip 35 Label true @@ -181,7 +181,7 @@ После выгрузки Успех - СтраницаПослеВыгрузкиУспехРасширеннаяПодсказка + СтраницаПослеВыгрузкиУспехExtendedTooltip 33 Label true @@ -215,7 +215,7 @@ Top - СообщениеОбОшибкеРасширеннаяПодсказка + СообщениеОбОшибкеExtendedTooltip 38 Label true @@ -254,7 +254,7 @@ После выгрузки Ошибка - СтраницаПослеВыгрузкиОшибкаРасширеннаяПодсказка + СтраницаПослеВыгрузкиОшибкаExtendedTooltip 37 Label true @@ -280,7 +280,7 @@ true true - ГруппаСтраницыРасширеннаяПодсказка + ГруппаСтраницыExtendedTooltip 30 Label true @@ -308,7 +308,7 @@ true - ФормаСоздатьКопиюОбластиРасширеннаяПодсказка + ФормаСоздатьКопиюОбластиExtendedTooltip 27 Label true @@ -334,7 +334,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 28 Label true @@ -359,7 +359,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 29 Label true diff --git a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl index eb7808cbc..cd5e387ce 100644 --- a/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl +++ b/SSL/src/CommonForms/СозданиеРезервнойКопии/Module.bsl @@ -17,7 +17,7 @@ ВызватьИсключение(НСтр("ru = 'Не установлено значение разделителя'")); КонецЕсли; - ПереключитьСтраницу(ЭтаФорма); + ПереключитьСтраницу(ЭтотОбъект); КонецПроцедуры @@ -34,7 +34,7 @@ Попытка Результат = СоздатьКопиюОбластиНаСервере(); Исключение - ПереключитьСтраницу(ЭтаФорма, "СтраницаПослеВыгрузкиОшибка"); + ПереключитьСтраницу(ЭтотОбъект, "СтраницаПослеВыгрузкиОшибка"); КонецПопытки; Если Результат.ЗаданиеВыполнено Тогда @@ -42,7 +42,7 @@ Иначе ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина); - ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтаФорма, ИдентификаторЗадания); + ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(ЭтотОбъект, ИдентификаторЗадания); КонецЕсли; КонецПроцедуры @@ -71,7 +71,7 @@ Исключение ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации); - ПереключитьСтраницу(ЭтаФорма, "СтраницаПослеВыгрузкиОшибка"); + ПереключитьСтраницу(ЭтотОбъект, "СтраницаПослеВыгрузкиОшибка"); ЗаписатьИсключениеНаСервере(ПредставлениеОшибки); КонецПопытки; @@ -80,13 +80,11 @@ &НаКлиенте Процедура ОбработатьРезультатВыполненияЗадания() - СнятьМонопольныйРежим(); - Если Не ПустаяСтрока(АдресХранилища) Тогда УдалитьИзВременногоХранилища(АдресХранилища); АдресХранилища = ""; // Перейти на страницу результата - ПереключитьСтраницу(ЭтаФорма, "СтраницаПослеВыгрузкиУспех"); + ПереключитьСтраницу(ЭтотОбъект, "СтраницаПослеВыгрузкиУспех"); КонецЕсли; КонецПроцедуры @@ -107,8 +105,6 @@ &НаСервере Процедура ЗаписатьИсключениеНаСервере(Знач ПредставлениеОшибки) - СнятьМонопольныйРежим(); - Событие = РезервноеКопированиеОбластейДанныхПовтИсп.НаименованиеФоновогоРезервногоКопирования(); ЗаписьЖурналаРегистрации(Событие, УровеньЖурналаРегистрации.Ошибка, , , ПредставлениеОшибки); СообщениеОбОшибке = ПредставлениеОшибки; @@ -120,10 +116,6 @@ ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбщегоНазначения.ЗаблокироватьИБ(); - КонецЕсли; - ПараметрыЗадания = РезервноеКопированиеОбластейДанных.СоздатьПустыеПараметрыВыгрузки(); ПараметрыЗадания.ОбластьДанных = ОбластьДанных; ПараметрыЗадания.ИДКопии = Новый УникальныйИдентификатор; @@ -131,7 +123,6 @@ ПараметрыЗадания.ПоТребованию = Истина; Попытка - Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне( УникальныйИдентификатор, РезервноеКопированиеОбластейДанныхПовтИсп.ИмяМетодаФоновогоРезервногоКопирования(), @@ -139,10 +130,8 @@ РезервноеКопированиеОбластейДанныхПовтИсп.НаименованиеФоновогоРезервногоКопирования()); Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); ЗаписатьИсключениеНаСервере(ПредставлениеОшибки); - КонецПопытки; АдресХранилища = Результат.АдресХранилища; @@ -157,12 +146,3 @@ Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания); КонецФункции - -&НаСервереБезКонтекста -Процедура СнятьМонопольныйРежим() - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - -КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form index a2a3a8f46..cd31ea33e 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Form.form @@ -20,7 +20,7 @@ ВариантСохраненияПриИзменении - ВариантСохраненияРасширеннаяПодсказка + ВариантСохраненияExtendedTooltip 83 Label true @@ -80,8 +80,8 @@ None - ПапкаДляСохраненияФайловРасширеннаяПодсказка - 87 + ПапкаДляСохраненияФайловExtendedTooltip + 86 Label true true @@ -130,8 +130,8 @@ Страница сохранение в папку - СтраницаСохранениеВПапкуРасширеннаяПодсказка - 86 + СтраницаСохранениеВПапкуExtendedTooltip + 85 Label true true @@ -161,8 +161,8 @@ None - ВыбранныйОбъектРасширеннаяПодсказка - 90 + ВыбранныйОбъектExtendedTooltip + 88 Label true true @@ -189,9 +189,10 @@ true true false + false true + true true - true Normal
            @@ -209,8 +210,8 @@ Страница присоединение к объекту - СтраницаПрисоединениеКОбъектуРасширеннаяПодсказка - 89 + СтраницаПрисоединениеКОбъектуExtendedTooltip + 87 Label true true @@ -238,8 +239,8 @@ Группа места сохранения - ГруппаМестаСохраненияРасширеннаяПодсказка - 85 + ГруппаМестаСохраненияExtendedTooltip + 84 Label true true @@ -266,7 +267,7 @@ Выбор места сохранения файла - ВыборМестаСохраненияФайлаРасширеннаяПодсказка + ВыборМестаСохраненияФайлаExtendedTooltip 82 Label true @@ -324,8 +325,8 @@ ВыбранныеФорматыСохранения.Check - ВыбранныеФорматыСохраненияПометкаРасширеннаяПодсказка - 103 + ВыбранныеФорматыСохраненияПометкаExtendedTooltip + 91 Label true true @@ -357,8 +358,8 @@ ВыбранныеФорматыСохранения.Value - ВыбранныеФорматыСохраненияЗначениеРасширеннаяПодсказка - 105 + ВыбранныеФорматыСохраненияЗначениеExtendedTooltip + 92 Label true true @@ -394,10 +395,10 @@ ВыбранныеФорматыСохраненияСтрокаПоиска - 94 + 98 ВыбранныеФорматыСохраненияСтрокаПоискаРасширеннаяПодсказка - 96 + 100 Label true true @@ -407,7 +408,7 @@ ВыбранныеФорматыСохраненияСтрокаПоискаКонтекстноеМеню - 95 + 99 true ВыбранныеФорматыСохранения @@ -417,10 +418,10 @@ ВыбранныеФорматыСохраненияСостояниеПросмотра - 97 + 101 ВыбранныеФорматыСохраненияСостояниеПросмотраРасширеннаяПодсказка - 99 + 103 Label true true @@ -430,7 +431,7 @@ ВыбранныеФорматыСохраненияСостояниеПросмотраКонтекстноеМеню - 98 + 102 true ViewStatusAddition @@ -441,10 +442,10 @@ ВыбранныеФорматыСохраненияУправлениеПоиском - 100 + 104 ВыбранныеФорматыСохраненияУправлениеПоискомРасширеннаяПодсказка - 102 + 106 Label true true @@ -454,7 +455,7 @@ ВыбранныеФорматыСохраненияУправлениеПоискомКонтекстноеМеню - 101 + 105 true SearchControlAddition @@ -464,8 +465,8 @@ - ВыбранныеФорматыСохраненияРасширеннаяПодсказка - 93 + ВыбранныеФорматыСохраненияExtendedTooltip + 90 Label true true @@ -518,8 +519,8 @@ Группа выбор форматов - ГруппаВыборФорматовРасширеннаяПодсказка - 92 + ГруппаВыборФорматовExtendedTooltip + 89 Label true true @@ -559,8 +560,8 @@ Right - УпаковатьВАрхивРасширеннаяПодсказка - 116 + УпаковатьВАрхивExtendedTooltip + 94 Label true true @@ -594,8 +595,8 @@ Группа дополнительные параметры - ГруппаДополнительныеПараметрыРасширеннаяПодсказка - 115 + ГруппаДополнительныеПараметрыExtendedTooltip + 93 Label true true @@ -633,7 +634,7 @@ false - КнопкаСохранитьРасширеннаяПодсказка + КнопкаСохранитьExtendedTooltip 80 Label true @@ -659,7 +660,7 @@ true - КнопкаОтменаРасширеннаяПодсказка + КнопкаОтменаExtendedTooltip 81 Label true @@ -694,6 +695,7 @@ Abort Close CustomizeForm + Help Ignore No OK diff --git a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl index 4d9098e73..9bfbe4777 100644 --- a/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl +++ b/SSL/src/CommonForms/СохранениеПечатнойФормы/Module.bsl @@ -110,7 +110,7 @@ КонецЦикла; Если ФорматыСохранения.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо указать как минимум один из предложенных форматов.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Необходимо указать как минимум один из предложенных форматов.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Form.form b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form index fa491c6da..efbcc028b 100644 --- a/SSL/src/CommonForms/СтруктураПодчиненности/Form.form +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Form.form @@ -20,7 +20,7 @@ None - ТаблицаОтчетаРасширеннаяПодсказка + ТаблицаОтчетаExtendedTooltip 20 Label true @@ -61,7 +61,7 @@ true - ГруппаОтчетРасширеннаяПодсказка + ГруппаОтчетExtendedTooltip 19 Label true @@ -95,7 +95,7 @@ false - ОбновитьРасширеннаяПодсказка + ОбновитьExtendedTooltip 17 Label true @@ -125,7 +125,7 @@ false - ВывестиДляТекущегоРасширеннаяПодсказка + ВывестиДляТекущегоExtendedTooltip 18 Label true diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html index 15a012fdb..72af55e26 100644 --- a/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Help/ru.html @@ -1,4 +1,4 @@ - +

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

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

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

            diff --git a/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl b/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl index 757cd4f47..ec057e7cb 100644 --- a/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl +++ b/SSL/src/CommonForms/СтруктураПодчиненности/Module.bsl @@ -445,8 +445,8 @@ |ГДЕ | Ссылка = &Ссылка |"; - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Сумма", "СуммаДокумента"); - ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Валюта", "Валюта"); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Сумма", ИмяРеквизитаДокумента(МетаданныеДокумента.Имя, "СуммаДокумента"), "СуммаДокумента"); + ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, "#Валюта", ИмяРеквизитаДокумента(МетаданныеДокумента.Имя, "Валюта"), "Валюта"); МассивДопРеквизитов = СтруктураПодчиненностиПереопределяемый.МассивДополнительныхРеквизитовДокумента(МетаданныеДокумента.Имя); @@ -593,14 +593,13 @@ КонецФункции - &НаСервере -Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, ЧтоЗаменять, ИмяРеквизита) +Процедура ЗаменитьТекстЗапроса(ТекстЗапроса, МетаданныеДокумента, ЧтоЗаменять, ИмяРеквизита, Представление) Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, ИмяРеквизита + " КАК " + ИмяРеквизита); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, ИмяРеквизита + " КАК " + Представление); Иначе - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, " NULL КАК " + ИмяРеквизита); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЧтоЗаменять, " NULL КАК " + Представление); КонецЕсли; КонецПроцедуры @@ -610,10 +609,22 @@ РеквизитыДокумента = КэшРеквизитовДокумента[ИмяДокумента]; Если РеквизитыДокумента = Неопределено Тогда - + РеквизитыДокумента = Новый Соответствие; - РеквизитыДокумента.Вставить("СуммаДокумента", МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено); - РеквизитыДокумента.Вставить("Валюта", МетаданныеДокумента.Реквизиты.Найти("Валюта") <> Неопределено); + + ИмяРеквизитаСуммаДокумента = ИмяРеквизитаДокумента(МетаданныеДокумента.Имя, "СуммаДокумента"); + Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизитаСуммаДокумента) <> Неопределено Тогда + РеквизитыДокумента.Вставить("СуммаДокумента", ИмяРеквизитаСуммаДокумента); + Иначе + РеквизитыДокумента.Вставить("СуммаДокумента", "NULL"); + КонецЕсли; + + ИмяРеквизитаВалюта = ИмяРеквизитаДокумента(МетаданныеДокумента.Имя, "Валюта"); + Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизитаВалюта) <> Неопределено Тогда + РеквизитыДокумента.Вставить("Валюта", ИмяРеквизитаВалюта); + Иначе + РеквизитыДокумента.Вставить("Валюта", "NULL"); + КонецЕсли; КэшРеквизитовДокумента.Вставить(ИмяДокумента, РеквизитыДокумента); @@ -694,8 +705,8 @@ | Ссылка, | Проведен, | ПометкаУдаления, - |" + ?(КэшРеквизитовДокумента[КлючИЗначение.Ключ]["СуммаДокумента"], "СуммаДокумента", "NULL") + " КАК СуммаДокумента, - |" + ?(КэшРеквизитовДокумента[КлючИЗначение.Ключ]["Валюта"], "Валюта", "NULL") + " КАК Валюта, + |" + КэшРеквизитовДокумента[КлючИЗначение.Ключ]["СуммаДокумента"] + " КАК СуммаДокумента, + |" + КэшРеквизитовДокумента[КлючИЗначение.Ключ]["Валюта"] + " КАК Валюта, | #Представление |ИЗ | Документ." + КлючИЗначение.Ключ + " @@ -750,7 +761,7 @@ Для Инд = 1 По 3 Цикл ТекстПредставление = ТекстПредставление + ", - | " + ?(МассивРеквизитов.Количество() >= Инд,МассивРеквизитов[инд - 1],"NULL") + " Как ДополнительныйРеквизит" + Инд; + | " + ?(МассивРеквизитов.Количество() >= Инд,МассивРеквизитов[инд - 1],"NULL") + " Как ДополнительныйРеквизит" + Инд; КонецЦикла; @@ -758,4 +769,15 @@ КонецПроцедуры +Функция ИмяРеквизитаДокумента(ИмяДокумента, Реквизит) + + ИмяРеквизитаДокумента = СтруктураПодчиненностиПереопределяемый.ИмяРеквизитаДокумента(ИмяДокумента, Реквизит); + + Если Реквизит = "СуммаДокумента" Тогда + Возврат ?(ИмяРеквизитаДокумента = Неопределено,"СуммаДокумента",ИмяРеквизитаДокумента); + ИначеЕсли Реквизит = "Валюта" Тогда + Возврат ?(ИмяРеквизитаДокумента = Неопределено,"Валюта",ИмяРеквизитаДокумента); + КонецЕсли; + +КонецФункции diff --git a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form index ba48eb4fd..57950281b 100644 --- a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form +++ b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Form.form @@ -19,7 +19,7 @@ WSURLВебСервиса - WSURLВебСервисаРасширеннаяПодсказка + WSURLВебСервисаExtendedTooltip 15 Label true @@ -60,8 +60,8 @@ WSИмяПользователя - WSИмяПользователяРасширеннаяПодсказка - 17 + WSИмяПользователяExtendedTooltip + 16 Label true true @@ -101,8 +101,8 @@ WSПароль - WSПарольРасширеннаяПодсказка - 19 + WSПарольExtendedTooltip + 17 Label true true @@ -145,7 +145,7 @@ Настройки подключения - НастройкиПодключенияРасширеннаяПодсказка + НастройкиПодключенияExtendedTooltip 14 Label true @@ -180,7 +180,7 @@ true - ФормаУстановитьРасширеннаяПодсказка + ФормаУстановитьExtendedTooltip 12 Label true @@ -210,7 +210,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 13 Label true @@ -342,6 +342,23 @@ true + + ЗакрытьФормуБезусловно + + <key>ru</key> + <value>Закрыть форму безусловно</value> + + 6 + + Boolean + + + true + + + true + + Установить diff --git a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl index 8fcc53793..c3db0f6ee 100644 --- a/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl +++ b/SSL/src/CommonForms/УстановкаВедущейКонечнойТочки/Module.bsl @@ -1,6 +1,3 @@ -&НаКлиенте -Перем ЗакрытьФормуБезусловно; - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -16,7 +13,7 @@ КонечнаяТочка = Параметры.КонечнаяТочка; // Зачитываем значения настроек подключения - ЗаполнитьЗначенияСвойств(ЭтаФорма, РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаWS(КонечнаяТочка)); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаWS(КонечнаяТочка)); Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Установка ведущей конечной точки для ""%1""'"), @@ -27,11 +24,9 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы( - Отказ, - , - ЗакрытьФормуБезусловно, - НСтр("ru = 'Отменить выполнение операции?'")); + ТекстПредупреждения = НСтр("ru = 'Отменить выполнение операции?'"); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы( + ЭтотОбъект, Отказ, ТекстПредупреждения, "ЗакрытьФормуБезусловно"); КонецПроцедуры @@ -56,20 +51,14 @@ НСтрока = НСтр("ru = 'При установке ведущей конечной точки возникли ошибки. |Перейти в журнал регистрации?'"); - Ответ = Вопрос(НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); - Если Ответ = КодВозвратаДиалога.Да Тогда - - Отбор = Новый Структура; - Отбор.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрацииУстановкаВедущейКонечнойТочки); - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Отбор, ЭтаФорма); - - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьЖурналРегистрации", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтрока, РежимДиалогаВопрос.ДаНет, ,КодВозвратаДиалога.Нет); Возврат; КонецЕсли; Оповестить(ОбменСообщениямиКлиент.ИмяСобытияУстановленаВедущаяКонечнаяТочка()); - Предупреждение(НСтр("ru = 'Установка ведущей конечной точки успешно завершена.'")); + ПоказатьОповещениеПользователя(,, НСтр("ru = 'Установка ведущей конечной точки успешно завершена.'")); ЗакрытьФормуБезусловно = Истина; @@ -77,6 +66,19 @@ КонецПроцедуры +&НаКлиенте +Процедура ОткрытьЖурналРегистрации(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + Отбор = Новый Структура; + Отбор.Вставить("СобытиеЖурналаРегистрации", СобытиеЖурналаРегистрацииУстановкаВедущейКонечнойТочки); + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Отбор, ЭтотОбъект); + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -90,7 +92,7 @@ НастройкиПодключенияWS = ОбменДаннымиСервер.СтруктураПараметровWS(); - ЗаполнитьЗначенияСвойств(НастройкиПодключенияWS, ЭтаФорма); + ЗаполнитьЗначенияСвойств(НастройкиПодключенияWS, ЭтотОбъект); ОбменСообщениямиВнутренний.УстановитьВедущуюКонечнуюТочкуНаСторонеОтправителя(Отказ, НастройкиПодключенияWS, КонечнаяТочка); diff --git a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Form.form b/SSL/src/CommonForms/УстановкаПодписиЭП/Form.form similarity index 88% rename from SSL/src/CommonForms/УстановкаПодписиЭЦП/Form.form rename to SSL/src/CommonForms/УстановкаПодписиЭП/Form.form index 3ee02f90f..edaccbbde 100644 --- a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Form.form +++ b/SSL/src/CommonForms/УстановкаПодписиЭП/Form.form @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> <items xsi:type="form:Table"> - <name>СертификатыЭЦП</name> + <name>СертификатыЭП</name> <id>3</id> <visible>true</visible> <enabled>true</enabled> @@ -9,7 +9,7 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СертификатыЭЦП</segments> + <segments>СертификатыЭП</segments> </dataPath> <titleLocation>Top</titleLocation> <excludedCommands>Change</excludedCommands> @@ -24,11 +24,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СертификатыЭЦП.КомуВыдан</segments> + <segments>СертификатыЭП.КомуВыдан</segments> </dataPath> <extendedTooltip> - <name>ТаблицаСертификатовКомуВыданРасширеннаяПодсказка</name> - <id>34</id> + <name>ТаблицаСертификатовКомуВыданExtendedTooltip</name> + <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -66,11 +66,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СертификатыЭЦП.КемВыдан</segments> + <segments>СертификатыЭП.КемВыдан</segments> </dataPath> <extendedTooltip> - <name>ТаблицаСертификатовКемВыданРасширеннаяПодсказка</name> - <id>36</id> + <name>ТаблицаСертификатовКемВыданExtendedTooltip</name> + <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -108,11 +108,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СертификатыЭЦП.ДействителенДо</segments> + <segments>СертификатыЭП.ДействителенДо</segments> </dataPath> <extendedTooltip> - <name>ТаблицаСертификатовДействителенДоРасширеннаяПодсказка</name> - <id>38</id> + <name>ТаблицаСертификатовДействителенДоExtendedTooltip</name> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -150,11 +150,11 @@ <common>true</common> </userVisible> <dataPath xsi:type="form:DataPath"> - <segments>СертификатыЭЦП.Назначение</segments> + <segments>СертификатыЭП.Назначение</segments> </dataPath> <extendedTooltip> - <name>ТаблицаСертификатовНазначениеРасширеннаяПодсказка</name> - <id>40</id> + <name>ТаблицаСертификатовНазначениеExtendedTooltip</name> + <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -185,67 +185,20 @@ </items> <commandBarLocation>None</commandBarLocation> <autoCommandBar> - <name>СертификатыЭЦПКоманднаяПанель</name> + <name>СертификатыЭПКоманднаяПанель</name> <id>5</id> <horizontalAlign>Left</horizontalAlign> <autoFill>true</autoFill> </autoCommandBar> <handlers> <event>Selection</event> - <name>СертификатыЭЦПВыбор</name> + <name>СертификатыЭПВыбор</name> </handlers> <searchStringAddition> - <name>СертификатыЭЦПСтрокаПоиска</name> - <id>25</id> - <extendedTooltip> - <name>СертификатыЭЦПСтрокаПоискаРасширеннаяПодсказка</name> - <id>27</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СертификатыЭЦПСтрокаПоискаКонтекстноеМеню</name> - <id>26</id> - <autoFill>true</autoFill> - </contextMenu> - <source>СертификатыЭЦП</source> - <extInfo xsi:type="form:SearchStringAdditionExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - </extInfo> - </searchStringAddition> - <viewStatusAddition> - <name>СертификатыЭЦПСостояниеПросмотра</name> - <id>28</id> - <extendedTooltip> - <name>СертификатыЭЦПСостояниеПросмотраРасширеннаяПодсказка</name> - <id>30</id> - <type>Label</type> - <autoMaxWidth>true</autoMaxWidth> - <autoMaxHeight>true</autoMaxHeight> - <extInfo xsi:type="form:LabelDecorationExtInfo"> - <horizontalAlign>Left</horizontalAlign> - </extInfo> - </extendedTooltip> - <contextMenu> - <name>СертификатыЭЦПСостояниеПросмотраКонтекстноеМеню</name> - <id>29</id> - <autoFill>true</autoFill> - </contextMenu> - <type>ViewStatusAddition</type> - <source>СертификатыЭЦП</source> - <extInfo xsi:type="form:ViewStatusAdditionExtInfo"> - <autoMaxWidth>true</autoMaxWidth> - </extInfo> - </viewStatusAddition> - <searchControlAddition> - <name>СертификатыЭЦПУправлениеПоиском</name> + <name>СертификатыЭПСтрокаПоиска</name> <id>31</id> <extendedTooltip> - <name>СертификатыЭЦПУправлениеПоискомРасширеннаяПодсказка</name> + <name>СертификатыЭПСтрокаПоискаРасширеннаяПодсказка</name> <id>33</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -255,18 +208,65 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СертификатыЭЦПУправлениеПоискомКонтекстноеМеню</name> + <name>СертификатыЭПСтрокаПоискаКонтекстноеМеню</name> <id>32</id> <autoFill>true</autoFill> </contextMenu> + <source>СертификатыЭП</source> + <extInfo xsi:type="form:SearchStringAdditionExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + </extInfo> + </searchStringAddition> + <viewStatusAddition> + <name>СертификатыЭПСостояниеПросмотра</name> + <id>34</id> + <extendedTooltip> + <name>СертификатыЭПСостояниеПросмотраРасширеннаяПодсказка</name> + <id>36</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СертификатыЭПСостояниеПросмотраКонтекстноеМеню</name> + <id>35</id> + <autoFill>true</autoFill> + </contextMenu> + <type>ViewStatusAddition</type> + <source>СертификатыЭП</source> + <extInfo xsi:type="form:ViewStatusAdditionExtInfo"> + <autoMaxWidth>true</autoMaxWidth> + </extInfo> + </viewStatusAddition> + <searchControlAddition> + <name>СертификатыЭПУправлениеПоиском</name> + <id>37</id> + <extendedTooltip> + <name>СертификатыЭПУправлениеПоискомРасширеннаяПодсказка</name> + <id>39</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>СертификатыЭПУправлениеПоискомКонтекстноеМеню</name> + <id>38</id> + <autoFill>true</autoFill> + </contextMenu> <type>SearchControlAddition</type> - <source>СертификатыЭЦП</source> + <source>СертификатыЭП</source> <extInfo xsi:type="form:SearchControlAdditionExtInfo"> <autoMaxWidth>true</autoMaxWidth> </extInfo> </searchControlAddition> <extendedTooltip> - <name>СертификатыЭЦПРасширеннаяПодсказка</name> + <name>СертификатыЭПРасширеннаяПодсказка</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -276,7 +276,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>СертификатыЭЦПКонтекстноеМеню</name> + <name>СертификатыЭПКонтекстноеМеню</name> <id>4</id> <items xsi:type="form:Button"> <name>ТаблицаСертификатовКонтекстноеМенюОткрытьСертификат</name> @@ -287,7 +287,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатРасширеннаяПодсказка</name> + <name>ТаблицаСертификатовКонтекстноеМенюОткрытьСертификатExtendedTooltip</name> <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -344,8 +344,8 @@ <segments>Пароль</segments> </dataPath> <extendedTooltip> - <name>ПарольРасширеннаяПодсказка</name> - <id>50</id> + <name>ПарольExtendedTooltip</name> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -388,8 +388,8 @@ <segments>Комментарий</segments> </dataPath> <extendedTooltip> - <name>КомментарийРасширеннаяПодсказка</name> - <id>52</id> + <name>КомментарийExtendedTooltip</name> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -432,7 +432,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаВыбратьРасширеннаяПодсказка</name> + <name>ФормаВыбратьExtendedTooltip</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -458,7 +458,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаОтменаРасширеннаяПодсказка</name> + <name>ФормаОтменаExtendedTooltip</name> <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -510,10 +510,10 @@ </edit> </attributes> <attributes> - <name>СертификатыЭЦП</name> + <name>СертификатыЭП</name> <title> <key>ru</key> - <value>Сертификаты ЭП</value> + <value>Выберите сертификат электронной подписи</value> 2 diff --git a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Help/ru.html b/SSL/src/CommonForms/УстановкаПодписиЭП/Help/ru.html similarity index 79% rename from SSL/src/CommonForms/УстановкаПодписиЭЦП/Help/ru.html rename to SSL/src/CommonForms/УстановкаПодписиЭП/Help/ru.html index 7a1905de7..07cfeec55 100644 --- a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Help/ru.html +++ b/SSL/src/CommonForms/УстановкаПодписиЭП/Help/ru.html @@ -1,4 +1,4 @@ - +

            В форме выбирается сертификат электронной подписи (ЭП) для подписания данных.

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

            Для выполнения подписи следует нажать кнопку "Подписать".

            @@ -6,4 +6,4 @@

             

            См. также:

            -

            Настройка ЭП и шифрования
            Настройка программы 

            \ No newline at end of file +

            Настройка ЭП и шифрования
            Настройка программы 

            \ No newline at end of file diff --git a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Module.bsl b/SSL/src/CommonForms/УстановкаПодписиЭП/Module.bsl similarity index 77% rename from SSL/src/CommonForms/УстановкаПодписиЭЦП/Module.bsl rename to SSL/src/CommonForms/УстановкаПодписиЭП/Module.bsl index 0e513ad7e..d8c623050 100644 --- a/SSL/src/CommonForms/УстановкаПодписиЭЦП/Module.bsl +++ b/SSL/src/CommonForms/УстановкаПодписиЭП/Module.bsl @@ -18,18 +18,18 @@ Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подписать ""%1""'"), Строка(ОбъектСсылка)); Для Каждого СтруктураСертификата Из МассивСтруктурСертификатов Цикл - НоваяСтрока = СертификатыЭЦП.Добавить(); + НоваяСтрока = СертификатыЭП.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураСертификата, "КомуВыдан, КемВыдан, ДействителенДо, Отпечаток"); - ЭлектроннаяЦифроваяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); + ЭлектроннаяПодпись.ЗаполнитьНазначениеСертификата(СтруктураСертификата.Назначение, НоваяСтрока.Назначение); КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СертификатыЭЦП +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СертификатыЭП &НаКлиенте -Процедура СертификатыЭЦПВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) +Процедура СертификатыЭПВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ОбработкаВыбора(); КонецПроцедуры @@ -44,17 +44,17 @@ &НаКлиенте Процедура ОткрытьСертификат(Команда) - СтрокаСертификата = Элементы.СертификатыЭЦП.ТекущиеДанные; + СтрокаСертификата = Элементы.СертификатыЭП.ТекущиеДанные; Если СтрокаСертификата = Неопределено Тогда Возврат; КонецЕсли; - ВыбранныйСертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаСертификата.Отпечаток); + ВыбранныйСертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаСертификата.Отпечаток); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(ВыбранныйСертификат); Если СтруктураСертификата <> Неопределено Тогда ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, СтрокаСертификата.Отпечаток); - ОткрытьФорму("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.СертификатЭП", ПараметрыФормы, ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -65,14 +65,14 @@ &НаКлиенте Процедура ОбработкаВыбора() - СтрокаСертификата = Элементы.СертификатыЭЦП.ТекущиеДанные; + СтрокаСертификата = Элементы.СертификатыЭП.ТекущиеДанные; Если СтрокаСертификата = Неопределено Тогда Возврат; КонецЕсли; ВыбранныйПароль = ?(ЗначениеЗаполнено(Пароль), Пароль, Элементы.Пароль.ТекстРедактирования); - ВыбранныйСертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаСертификата.Отпечаток); + ВыбранныйСертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтрокаСертификата.Отпечаток); РезультатВыбора = Новый Структура; РезультатВыбора.Вставить("Сертификат", ВыбранныйСертификат); diff --git a/SSL/src/CommonForms/УстановкаПодписиЭЦП/УстановкаПодписиЭЦП.mdo b/SSL/src/CommonForms/УстановкаПодписиЭП/УстановкаПодписиЭП.mdo similarity index 90% rename from SSL/src/CommonForms/УстановкаПодписиЭЦП/УстановкаПодписиЭЦП.mdo rename to SSL/src/CommonForms/УстановкаПодписиЭП/УстановкаПодписиЭП.mdo index 1589c3dfe..9cddfe2ad 100644 --- a/SSL/src/CommonForms/УстановкаПодписиЭЦП/УстановкаПодписиЭЦП.mdo +++ b/SSL/src/CommonForms/УстановкаПодписиЭП/УстановкаПодписиЭП.mdo @@ -1,6 +1,6 @@ - УстановкаПодписиЭЦП + УстановкаПодписиЭП ru Установка подписи ЭП diff --git a/SSL/src/CommonForms/УточнениеКонтактов/Form.form b/SSL/src/CommonForms/УточнениеКонтактов/Form.form index d9de2527b..a33691f68 100644 --- a/SSL/src/CommonForms/УточнениеКонтактов/Form.form +++ b/SSL/src/CommonForms/УточнениеКонтактов/Form.form @@ -47,8 +47,8 @@ Установить в качестве адреса электронной почты контакта адрес содержащийся в письме - ТаблицаКонтактовИзменятьРасширеннаяПодсказка - 44 + ТаблицаКонтактовИзменятьExtendedTooltip + 35 Label true true @@ -84,8 +84,8 @@ ТаблицаКонтактов.ПолноеПредставление - ТаблицаКонтактовПолноеПредставлениеРасширеннаяПодсказка - 46 + ТаблицаКонтактовПолноеПредставлениеExtendedTooltip + 36 Label true true @@ -137,8 +137,8 @@ ТаблицаКонтактовКонтактПриИзменении - ТаблицаКонтактовКонтактРасширеннаяПодсказка - 49 + ТаблицаКонтактовКонтактExtendedTooltip + 38 Label true true @@ -172,7 +172,6 @@ true true true - true true true true @@ -195,8 +194,8 @@ ТаблицаКонтактов.ТекущийАдресКонтактаПредставление - ТаблицаКонтактовТекущийАдресКонтактаРасширеннаяПодсказка - 51 + ТаблицаКонтактовТекущийАдресКонтактаExtendedTooltip + 39 Label true true @@ -226,7 +225,6 @@ true true true - true false false false @@ -249,8 +247,8 @@ Таблица контактов группа контакт вид электронной почты - ТаблицаКонтактовГруппаКонтактВидЭлектроннойПочтыРасширеннаяПодсказка - 48 + ТаблицаКонтактовГруппаКонтактВидЭлектроннойПочтыExtendedTooltip + 37 Label true true @@ -280,10 +278,10 @@ ТаблицаКонтактовСтрокаПоиска - 35 + 40 ТаблицаКонтактовСтрокаПоискаРасширеннаяПодсказка - 37 + 42 Label true true @@ -293,7 +291,7 @@ ТаблицаКонтактовСтрокаПоискаКонтекстноеМеню - 36 + 41 true ТаблицаКонтактов @@ -303,10 +301,10 @@ ТаблицаКонтактовСостояниеПросмотра - 38 + 43 ТаблицаКонтактовСостояниеПросмотраРасширеннаяПодсказка - 40 + 45 Label true true @@ -316,7 +314,7 @@ ТаблицаКонтактовСостояниеПросмотраКонтекстноеМеню - 39 + 44 true ViewStatusAddition @@ -327,10 +325,10 @@ ТаблицаКонтактовУправлениеПоиском - 41 + 46 ТаблицаКонтактовУправлениеПоискомРасширеннаяПодсказка - 43 + 48 Label true true @@ -340,7 +338,7 @@ ТаблицаКонтактовУправлениеПоискомКонтекстноеМеню - 42 + 47 true SearchControlAddition @@ -350,7 +348,7 @@ - ТаблицаКонтактовРасширеннаяПодсказка + ТаблицаКонтактовExtendedTooltip 34 Label true @@ -404,7 +402,7 @@ false - КомандаОКРасширеннаяПодсказка + КомандаОКExtendedTooltip 33 Label true diff --git a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl index 25e014d63..7163c00c4 100644 --- a/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl +++ b/SSL/src/CommonForms/УточнениеКонтактов/Module.bsl @@ -35,7 +35,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность, ВыполненаКомандаЗакрытия); + Оповещение = Новый ОписаниеОповещения("СохранитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры @@ -218,6 +219,16 @@ &НаКлиенте Процедура КомандаОКВыполнить() + СохранитьИЗакрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура СохранитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + РезультатВыбора = Новый Массив; ЕстьКонтактнаяИнформацияДляИзменения = Ложь; Для каждого СтрокаТаблицыКонтактов Из ТаблицаКонтактов Цикл @@ -245,15 +256,14 @@ Если Не Модифицированность Тогда Закрыть(); Возврат; + Иначе + Модифицированность = Ложь; КонецЕсли; ОповеститьОВыборе(РезультатВыбора); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - &НаСервере Процедура ЗаполнитьСпискиНайденныхКонтактовПоEmail() diff --git a/SSL/src/CommonForms/ФайлыВТоме/Attributes/ФайлыВТомах/ExtInfo/ListSettings.dcss b/SSL/src/CommonForms/ФайлыВТоме/Attributes/ФайлыВТомах/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Attributes/ФайлыВТомах/ExtInfo/ListSettings.dcss +++ b/SSL/src/CommonForms/ФайлыВТоме/Attributes/ФайлыВТомах/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/CommonForms/ФайлыВТоме/Form.form b/SSL/src/CommonForms/ФайлыВТоме/Form.form index 6226391e1..e6c912279 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Form.form +++ b/SSL/src/CommonForms/ФайлыВТоме/Form.form @@ -16,7 +16,7 @@ ПредставлениеХранилищаФайлов - ПредставлениеХранилищаФайловРасширеннаяПодсказка + ПредставлениеХранилищаФайловExtendedTooltip 22 Label true @@ -75,8 +75,8 @@ ФайлыВТомах.ПутьКФайлу - ПутьКФайлуРасширеннаяПодсказка - 34 + ПутьКФайлуExtendedTooltip + 24 Label true true @@ -111,8 +111,8 @@ ФайлыВТомах.Размер - РазмерРасширеннаяПодсказка - 36 + РазмерExtendedTooltip + 25 Label true true @@ -147,8 +147,8 @@ ФайлыВТомах.Автор - АвторРасширеннаяПодсказка - 38 + АвторExtendedTooltip + 26 Label true true @@ -186,32 +186,9 @@ ФайлыВТомахСтрокаПоиска - 25 - - ФайлыВТомахСтрокаПоискаРасширеннаяПодсказка - 27 - Label - true - true - - Left - - - - ФайлыВТомахСтрокаПоискаКонтекстноеМеню - 26 - true - - ФайлыВТомах - - true - - - - ФайлыВТомахСостояниеПросмотра 28 - ФайлыВТомахСостояниеПросмотраРасширеннаяПодсказка + ФайлыВТомахСтрокаПоискаРасширеннаяПодсказка 30 Label true @@ -221,10 +198,33 @@ - ФайлыВТомахСостояниеПросмотраКонтекстноеМеню + ФайлыВТомахСтрокаПоискаКонтекстноеМеню 29 true + ФайлыВТомах + + true + + + + ФайлыВТомахСостояниеПросмотра + 31 + + ФайлыВТомахСостояниеПросмотраРасширеннаяПодсказка + 33 + Label + true + true + + Left + + + + ФайлыВТомахСостояниеПросмотраКонтекстноеМеню + 32 + true + ViewStatusAddition ФайлыВТомах @@ -233,10 +233,10 @@ ФайлыВТомахУправлениеПоиском - 31 + 34 ФайлыВТомахУправлениеПоискомРасширеннаяПодсказка - 33 + 36 Label true true @@ -246,7 +246,7 @@ ФайлыВТомахУправлениеПоискомКонтекстноеМеню - 32 + 35 true SearchControlAddition @@ -256,8 +256,8 @@ - ФайлыВТомахРасширеннаяПодсказка - 24 + ФайлыВТомахExtendedTooltip + 23 Label true true diff --git a/SSL/src/CommonForms/ФайлыВТоме/Module.bsl b/SSL/src/CommonForms/ФайлыВТоме/Module.bsl index 7690860ea..afe8a43c7 100644 --- a/SSL/src/CommonForms/ФайлыВТоме/Module.bsl +++ b/SSL/src/CommonForms/ФайлыВТоме/Module.bsl @@ -59,12 +59,16 @@ &НаКлиенте Процедура ПредставлениеХранилищаФайловНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ТекущееХранилище = ВыбратьИзСписка(ИменаХранилищФайлов, - Элементы.ПредставлениеХранилищаФайлов, - ИменаХранилищФайлов.НайтиПоЗначению(ИмяХранилищаФайлов)); + ОписаниеОповещения = Новый ОписаниеОповещения("ПредставлениеХранилищаФайловНачалоВыбораВыборСделан", ЭтотОбъект); + ПоказатьВыборИзСписка(ОписаниеОповещения, ИменаХранилищФайлов, Элементы.ПредставлениеХранилищаФайлов, + ИменаХранилищФайлов.НайтиПоЗначению(ИмяХранилищаФайлов)); + +КонецПроцедуры + +&НаКлиенте +Процедура ПредставлениеХранилищаФайловНачалоВыбораВыборСделан(ТекущееХранилище, ДополнительныеПараметры) Экспорт Если ТипЗнч(ТекущееХранилище) = Тип("ЭлементСпискаЗначений") Тогда - ИмяХранилищаФайлов = ТекущееХранилище.Значение; ПредставлениеХранилищаФайлов = ТекущееХранилище.Представление; НастроитьДинамическийСписок(ИмяХранилищаФайлов); @@ -159,7 +163,7 @@ Если ТекущиеДанные.ЭтоПрисоединенныеФайлы Тогда ПрисоединенныеФайлыКлиент.ОткрытьФормуПрисоединенногоФайла(ТекущиеДанные.Ссылка); Иначе - ОткрытьЗначение(ТекущиеДанные.Ссылка); + ПоказатьЗначение(, ТекущиеДанные.Ссылка); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form index 2eba21c64..a6c3a7f1a 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Form.form @@ -32,10 +32,10 @@ КомпоновщикНастроекНастройкиСтрокаПоиска - 131 + 201 КомпоновщикНастроекНастройкиСтрокаПоискаРасширеннаяПодсказка - 133 + 203 Label true true @@ -45,7 +45,7 @@ КомпоновщикНастроекНастройкиСтрокаПоискаКонтекстноеМеню - 132 + 202 true КомпоновщикНастроекНастройки @@ -55,10 +55,10 @@ КомпоновщикНастроекНастройкиСостояниеПросмотра - 134 + 204 КомпоновщикНастроекНастройкиСостояниеПросмотраРасширеннаяПодсказка - 136 + 206 Label true true @@ -68,7 +68,7 @@ КомпоновщикНастроекНастройкиСостояниеПросмотраКонтекстноеМеню - 135 + 205 true ViewStatusAddition @@ -79,10 +79,10 @@ КомпоновщикНастроекНастройкиУправлениеПоиском - 137 + 207 КомпоновщикНастроекНастройкиУправлениеПоискомРасширеннаяПодсказка - 139 + 209 Label true true @@ -92,7 +92,7 @@ КомпоновщикНастроекНастройкиУправлениеПоискомКонтекстноеМеню - 138 + 208 true SearchControlAddition @@ -102,7 +102,7 @@ - КомпоновщикНастроекНастройкиРасширеннаяПодсказка + КомпоновщикНастроекНастройкиExtendedTooltip 130 Label true @@ -174,10 +174,10 @@ КомпоновщикНастроекНастройкиПараметрыДанныхСтрокаПоиска - 151 + 218 КомпоновщикНастроекНастройкиПараметрыДанныхСтрокаПоискаРасширеннаяПодсказка - 153 + 220 Label true true @@ -187,7 +187,7 @@ КомпоновщикНастроекНастройкиПараметрыДанныхСтрокаПоискаКонтекстноеМеню - 152 + 219 true КомпоновщикНастроекНастройкиПараметрыДанных @@ -197,10 +197,10 @@ КомпоновщикНастроекНастройкиПараметрыДанныхСостояниеПросмотра - 154 + 221 КомпоновщикНастроекНастройкиПараметрыДанныхСостояниеПросмотраРасширеннаяПодсказка - 156 + 223 Label true true @@ -210,7 +210,7 @@ КомпоновщикНастроекНастройкиПараметрыДанныхСостояниеПросмотраКонтекстноеМеню - 155 + 222 true ViewStatusAddition @@ -221,10 +221,10 @@ КомпоновщикНастроекНастройкиПараметрыДанныхУправлениеПоиском - 157 + 224 КомпоновщикНастроекНастройкиПараметрыДанныхУправлениеПоискомРасширеннаяПодсказка - 159 + 226 Label true true @@ -234,7 +234,7 @@ КомпоновщикНастроекНастройкиПараметрыДанныхУправлениеПоискомКонтекстноеМеню - 158 + 225 true SearchControlAddition @@ -244,8 +244,8 @@ - КомпоновщикНастроекНастройкиПараметрыДанныхРасширеннаяПодсказка - 150 + КомпоновщикНастроекНастройкиПараметрыДанныхExtendedTooltip + 133 Label true true @@ -295,8 +295,8 @@ Параметры - СтраницаПараметровДанныхРасширеннаяПодсказка - 149 + СтраницаПараметровДанныхExtendedTooltip + 132 Label true true @@ -340,10 +340,10 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляСтрокаПоиска - 170 + 235 КомпоновщикНастроекНастройкиПользовательскиеПоляСтрокаПоискаРасширеннаяПодсказка - 172 + 237 Label true true @@ -353,7 +353,7 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляСтрокаПоискаКонтекстноеМеню - 171 + 236 true КомпоновщикНастроекНастройкиПользовательскиеПоля @@ -363,10 +363,10 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляСостояниеПросмотра - 173 + 238 КомпоновщикНастроекНастройкиПользовательскиеПоляСостояниеПросмотраРасширеннаяПодсказка - 175 + 240 Label true true @@ -376,7 +376,7 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляСостояниеПросмотраКонтекстноеМеню - 174 + 239 true ViewStatusAddition @@ -387,10 +387,10 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляУправлениеПоиском - 176 + 241 КомпоновщикНастроекНастройкиПользовательскиеПоляУправлениеПоискомРасширеннаяПодсказка - 178 + 243 Label true true @@ -400,7 +400,7 @@ КомпоновщикНастроекНастройкиПользовательскиеПоляУправлениеПоискомКонтекстноеМеню - 177 + 242 true SearchControlAddition @@ -410,8 +410,8 @@ - КомпоновщикНастроекНастройкиПользовательскиеПоляРасширеннаяПодсказка - 169 + КомпоновщикНастроекНастройкиПользовательскиеПоляExtendedTooltip + 135 Label true true @@ -460,8 +460,8 @@ Пользовательские поля - СтраницаПользовательскихПолейРасширеннаяПодсказка - 168 + СтраницаПользовательскихПолейExtendedTooltip + 134 Label true true @@ -510,10 +510,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСтрокаПоиска - 191 + 252 КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСтрокаПоискаРасширеннаяПодсказка - 193 + 254 Label true true @@ -523,7 +523,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСтрокаПоискаКонтекстноеМеню - 192 + 253 true КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировок @@ -533,10 +533,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСостояниеПросмотра - 194 + 255 КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСостояниеПросмотраРасширеннаяПодсказка - 196 + 257 Label true true @@ -546,7 +546,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокСостояниеПросмотраКонтекстноеМеню - 195 + 256 true ViewStatusAddition @@ -557,10 +557,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокУправлениеПоиском - 197 + 258 КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокУправлениеПоискомРасширеннаяПодсказка - 199 + 260 Label true true @@ -570,7 +570,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокУправлениеПоискомКонтекстноеМеню - 198 + 259 true SearchControlAddition @@ -580,8 +580,8 @@ - КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокРасширеннаяПодсказка - 190 + КомпоновщикНастроекНастройкиПоляГруппировкиДоступныеПоляПолейГруппировокExtendedTooltip + 139 Label true true @@ -650,10 +650,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиСтрокаПоиска - 209 + 269 КомпоновщикНастроекНастройкиПоляГруппировкиСтрокаПоискаРасширеннаяПодсказка - 211 + 271 Label true true @@ -663,7 +663,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиСтрокаПоискаКонтекстноеМеню - 210 + 270 true КомпоновщикНастроекНастройкиПоляГруппировки @@ -673,10 +673,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиСостояниеПросмотра - 212 + 272 КомпоновщикНастроекНастройкиПоляГруппировкиСостояниеПросмотраРасширеннаяПодсказка - 214 + 274 Label true true @@ -686,7 +686,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиСостояниеПросмотраКонтекстноеМеню - 213 + 273 true ViewStatusAddition @@ -697,10 +697,10 @@ КомпоновщикНастроекНастройкиПоляГруппировкиУправлениеПоиском - 215 + 275 КомпоновщикНастроекНастройкиПоляГруппировкиУправлениеПоискомРасширеннаяПодсказка - 217 + 277 Label true true @@ -710,7 +710,7 @@ КомпоновщикНастроекНастройкиПоляГруппировкиУправлениеПоискомКонтекстноеМеню - 216 + 276 true SearchControlAddition @@ -720,8 +720,8 @@ - КомпоновщикНастроекНастройкиПоляГруппировкиРасширеннаяПодсказка - 208 + КомпоновщикНастроекНастройкиПоляГруппировкиExtendedTooltip + 140 Label true true @@ -770,8 +770,8 @@ Страница группируемых полей - НастройкиПолейГруппировкиРасширеннаяПодсказка - 189 + НастройкиПолейГруппировкиExtendedTooltip + 138 Label true true @@ -802,8 +802,8 @@ true - НадписьНедоступныхПолейГруппировкиРасширеннаяПодсказка - 227 + НадписьНедоступныхПолейГруппировкиExtendedTooltip + 142 Label true true @@ -836,8 +836,8 @@ Страница недоступных группируемых полей - НедоступныеНастройкиПолейГруппировкиРасширеннаяПодсказка - 226 + НедоступныеНастройкиПолейГруппировкиExtendedTooltip + 141 Label true true @@ -861,8 +861,8 @@ Страницы группируемых полей - СтраницыПолейГруппировкиРасширеннаяПодсказка - 188 + СтраницыПолейГруппировкиExtendedTooltip + 137 Label true true @@ -885,8 +885,8 @@ Группируемые поля - СтраницаПолейГруппировкиРасширеннаяПодсказка - 187 + СтраницаПолейГруппировкиExtendedTooltip + 136 Label true true @@ -927,8 +927,8 @@ ЛокальныеВыбранныеПоляПриИзменении - ЛокальныеВыбранныеПоляРасширеннаяПодсказка - 229 + ЛокальныеВыбранныеПоляExtendedTooltip + 144 Label true true @@ -978,10 +978,10 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСтрокаПоиска - 234 + 287 КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСтрокаПоискаРасширеннаяПодсказка - 236 + 289 Label true true @@ -991,7 +991,7 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСтрокаПоискаКонтекстноеМеню - 235 + 288 true КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбора @@ -1001,10 +1001,10 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСостояниеПросмотра - 237 + 290 КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСостояниеПросмотраРасширеннаяПодсказка - 239 + 292 Label true true @@ -1014,7 +1014,7 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораСостояниеПросмотраКонтекстноеМеню - 238 + 291 true ViewStatusAddition @@ -1025,10 +1025,10 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораУправлениеПоиском - 240 + 293 КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораУправлениеПоискомРасширеннаяПодсказка - 242 + 295 Label true true @@ -1038,7 +1038,7 @@ КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораУправлениеПоискомКонтекстноеМеню - 241 + 294 true SearchControlAddition @@ -1048,8 +1048,8 @@ - КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораРасширеннаяПодсказка - 233 + КомпоновщикНастроекНастройкиВыборДоступныеПоляВыбораExtendedTooltip + 147 Label true true @@ -1118,10 +1118,10 @@ КомпоновщикНастроекНастройкиВыборСтрокаПоиска - 252 + 304 КомпоновщикНастроекНастройкиВыборСтрокаПоискаРасширеннаяПодсказка - 254 + 306 Label true true @@ -1131,7 +1131,7 @@ КомпоновщикНастроекНастройкиВыборСтрокаПоискаКонтекстноеМеню - 253 + 305 true КомпоновщикНастроекНастройкиВыбор @@ -1141,10 +1141,10 @@ КомпоновщикНастроекНастройкиВыборСостояниеПросмотра - 255 + 307 КомпоновщикНастроекНастройкиВыборСостояниеПросмотраРасширеннаяПодсказка - 257 + 309 Label true true @@ -1154,7 +1154,7 @@ КомпоновщикНастроекНастройкиВыборСостояниеПросмотраКонтекстноеМеню - 256 + 308 true ViewStatusAddition @@ -1165,10 +1165,10 @@ КомпоновщикНастроекНастройкиВыборУправлениеПоиском - 258 + 310 КомпоновщикНастроекНастройкиВыборУправлениеПоискомРасширеннаяПодсказка - 260 + 312 Label true true @@ -1178,7 +1178,7 @@ КомпоновщикНастроекНастройкиВыборУправлениеПоискомКонтекстноеМеню - 259 + 311 true SearchControlAddition @@ -1188,8 +1188,8 @@ - КомпоновщикНастроекНастройкиВыборРасширеннаяПодсказка - 251 + КомпоновщикНастроекНастройкиВыборExtendedTooltip + 148 Label true true @@ -1240,8 +1240,8 @@ Страница полей - НастройкиВыбранныхПолейРасширеннаяПодсказка - 232 + НастройкиВыбранныхПолейExtendedTooltip + 146 Label true true @@ -1273,8 +1273,8 @@ true - НадписьЛокальныхВыбранныхПолейРасширеннаяПодсказка - 270 + НадписьЛокальныхВыбранныхПолейExtendedTooltip + 150 Label true true @@ -1310,8 +1310,8 @@ true - ПереходКВыбраннымПолямОтчетаРасширеннаяПодсказка - 271 + ПереходКВыбраннымПолямОтчетаExtendedTooltip + 151 Label true true @@ -1346,8 +1346,8 @@ Страница отключенных полей - ОтключенныеНастройкиВыбранныхПолейРасширеннаяПодсказка - 269 + ОтключенныеНастройкиВыбранныхПолейExtendedTooltip + 149 Label true true @@ -1378,8 +1378,8 @@ true - НадписьНедоступныхВыбранныхПолейРасширеннаяПодсказка - 273 + НадписьНедоступныхВыбранныхПолейExtendedTooltip + 153 Label true true @@ -1415,8 +1415,8 @@ true - ПереходКВыбраннымПолямОтчета1РасширеннаяПодсказка - 274 + ПереходКВыбраннымПолямОтчета1ExtendedTooltip + 154 Label true true @@ -1451,8 +1451,8 @@ Страница недоступных полей - НедоступныеНастройкиВыбранныхПолейРасширеннаяПодсказка - 272 + НедоступныеНастройкиВыбранныхПолейExtendedTooltip + 152 Label true true @@ -1476,8 +1476,8 @@ Страницы полей - СтраницыПолейВыбораРасширеннаяПодсказка - 231 + СтраницыПолейВыбораExtendedTooltip + 145 Label true true @@ -1500,8 +1500,8 @@ Поля - СтраницаПолейВыбораРасширеннаяПодсказка - 228 + СтраницаПолейВыбораExtendedTooltip + 143 Label true true @@ -1542,8 +1542,8 @@ ЛокальныйОтборПриИзменении - ЛокальныйОтборРасширеннаяПодсказка - 276 + ЛокальныйОтборExtendedTooltip + 156 Label true true @@ -1593,10 +1593,10 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСтрокаПоиска - 281 + 322 КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСтрокаПоискаРасширеннаяПодсказка - 283 + 324 Label true true @@ -1606,7 +1606,7 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСтрокаПоискаКонтекстноеМеню - 282 + 323 true КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбора @@ -1616,10 +1616,10 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСостояниеПросмотра - 284 + 325 КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСостояниеПросмотраРасширеннаяПодсказка - 286 + 327 Label true true @@ -1629,7 +1629,7 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораСостояниеПросмотраКонтекстноеМеню - 285 + 326 true ViewStatusAddition @@ -1640,10 +1640,10 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораУправлениеПоиском - 287 + 328 КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораУправлениеПоискомРасширеннаяПодсказка - 289 + 330 Label true true @@ -1653,7 +1653,7 @@ КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораУправлениеПоискомКонтекстноеМеню - 288 + 329 true SearchControlAddition @@ -1663,8 +1663,8 @@ - КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораРасширеннаяПодсказка - 280 + КомпоновщикНастроекНастройкиОтборДоступныеПоляОтбораExtendedTooltip + 159 Label true true @@ -1733,10 +1733,10 @@ КомпоновщикНастроекНастройкиОтборСтрокаПоиска - 299 + 339 КомпоновщикНастроекНастройкиОтборСтрокаПоискаРасширеннаяПодсказка - 301 + 341 Label true true @@ -1746,7 +1746,7 @@ КомпоновщикНастроекНастройкиОтборСтрокаПоискаКонтекстноеМеню - 300 + 340 true КомпоновщикНастроекНастройкиОтбор @@ -1756,10 +1756,10 @@ КомпоновщикНастроекНастройкиОтборСостояниеПросмотра - 302 + 342 КомпоновщикНастроекНастройкиОтборСостояниеПросмотраРасширеннаяПодсказка - 304 + 344 Label true true @@ -1769,7 +1769,7 @@ КомпоновщикНастроекНастройкиОтборСостояниеПросмотраКонтекстноеМеню - 303 + 343 true ViewStatusAddition @@ -1780,10 +1780,10 @@ КомпоновщикНастроекНастройкиОтборУправлениеПоиском - 305 + 345 КомпоновщикНастроекНастройкиОтборУправлениеПоискомРасширеннаяПодсказка - 307 + 347 Label true true @@ -1793,7 +1793,7 @@ КомпоновщикНастроекНастройкиОтборУправлениеПоискомКонтекстноеМеню - 306 + 346 true SearchControlAddition @@ -1803,8 +1803,8 @@ - КомпоновщикНастроекНастройкиОтборРасширеннаяПодсказка - 298 + КомпоновщикНастроекНастройкиОтборExtendedTooltip + 160 Label true true @@ -1857,8 +1857,8 @@ Страница полей - НастройкиОтбораРасширеннаяПодсказка - 279 + НастройкиОтбораExtendedTooltip + 158 Label true true @@ -1890,8 +1890,8 @@ true - НадписьЛокальногоОтбораРасширеннаяПодсказка - 317 + НадписьЛокальногоОтбораExtendedTooltip + 162 Label true true @@ -1927,8 +1927,8 @@ true - ПереходКОтборуОтчетаРасширеннаяПодсказка - 318 + ПереходКОтборуОтчетаExtendedTooltip + 163 Label true true @@ -1963,8 +1963,8 @@ Страница отключенного отбора - ОтключенныеНастройкиОтбораРасширеннаяПодсказка - 316 + ОтключенныеНастройкиОтбораExtendedTooltip + 161 Label true true @@ -1995,8 +1995,8 @@ true - НадписьНедоступногоОтбораРасширеннаяПодсказка - 320 + НадписьНедоступногоОтбораExtendedTooltip + 165 Label true true @@ -2032,8 +2032,8 @@ true - ПереходКОтборуОтчета1РасширеннаяПодсказка - 321 + ПереходКОтборуОтчета1ExtendedTooltip + 166 Label true true @@ -2068,8 +2068,8 @@ Страница недоступного отбора - НедоступныеНастройкиОтбораРасширеннаяПодсказка - 319 + НедоступныеНастройкиОтбораExtendedTooltip + 164 Label true true @@ -2093,8 +2093,8 @@ Страницы отбора - СтраницыОтбораРасширеннаяПодсказка - 278 + СтраницыОтбораExtendedTooltip + 157 Label true true @@ -2117,8 +2117,8 @@ Отбор - СтраницаОтбораРасширеннаяПодсказка - 275 + СтраницаОтбораExtendedTooltip + 155 Label true true @@ -2159,8 +2159,8 @@ ЛокальныйПорядокПриИзменении - ЛокальныйПорядокРасширеннаяПодсказка - 323 + ЛокальныйПорядокExtendedTooltip + 168 Label true true @@ -2210,10 +2210,10 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСтрокаПоиска - 328 + 357 КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСтрокаПоискаРасширеннаяПодсказка - 330 + 359 Label true true @@ -2223,7 +2223,7 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСтрокаПоискаКонтекстноеМеню - 329 + 358 true КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядка @@ -2233,10 +2233,10 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСостояниеПросмотра - 331 + 360 КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСостояниеПросмотраРасширеннаяПодсказка - 333 + 362 Label true true @@ -2246,7 +2246,7 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаСостояниеПросмотраКонтекстноеМеню - 332 + 361 true ViewStatusAddition @@ -2257,10 +2257,10 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаУправлениеПоиском - 334 + 363 КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаУправлениеПоискомРасширеннаяПодсказка - 336 + 365 Label true true @@ -2270,7 +2270,7 @@ КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаУправлениеПоискомКонтекстноеМеню - 335 + 364 true SearchControlAddition @@ -2280,8 +2280,8 @@ - КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаРасширеннаяПодсказка - 327 + КомпоновщикНастроекНастройкиПорядокДоступныеПоляПорядкаExtendedTooltip + 171 Label true true @@ -2350,10 +2350,10 @@ КомпоновщикНастроекНастройкиПорядокСтрокаПоиска - 346 + 374 КомпоновщикНастроекНастройкиПорядокСтрокаПоискаРасширеннаяПодсказка - 348 + 376 Label true true @@ -2363,7 +2363,7 @@ КомпоновщикНастроекНастройкиПорядокСтрокаПоискаКонтекстноеМеню - 347 + 375 true КомпоновщикНастроекНастройкиПорядок @@ -2373,10 +2373,10 @@ КомпоновщикНастроекНастройкиПорядокСостояниеПросмотра - 349 + 377 КомпоновщикНастроекНастройкиПорядокСостояниеПросмотраРасширеннаяПодсказка - 351 + 379 Label true true @@ -2386,7 +2386,7 @@ КомпоновщикНастроекНастройкиПорядокСостояниеПросмотраКонтекстноеМеню - 350 + 378 true ViewStatusAddition @@ -2397,10 +2397,10 @@ КомпоновщикНастроекНастройкиПорядокУправлениеПоиском - 352 + 380 КомпоновщикНастроекНастройкиПорядокУправлениеПоискомРасширеннаяПодсказка - 354 + 382 Label true true @@ -2410,7 +2410,7 @@ КомпоновщикНастроекНастройкиПорядокУправлениеПоискомКонтекстноеМеню - 353 + 381 true SearchControlAddition @@ -2420,8 +2420,8 @@ - КомпоновщикНастроекНастройкиПорядокРасширеннаяПодсказка - 345 + КомпоновщикНастроекНастройкиПорядокExtendedTooltip + 172 Label true true @@ -2470,8 +2470,8 @@ Страница сортировки - НастройкиПорядкаРасширеннаяПодсказка - 326 + НастройкиПорядкаExtendedTooltip + 170 Label true true @@ -2503,8 +2503,8 @@ true - НадписьЛокальногоПорядкаРасширеннаяПодсказка - 364 + НадписьЛокальногоПорядкаExtendedTooltip + 174 Label true true @@ -2540,8 +2540,8 @@ true - ПереходКПорядкуОтчетаРасширеннаяПодсказка - 365 + ПереходКПорядкуОтчетаExtendedTooltip + 175 Label true true @@ -2576,8 +2576,8 @@ Страница отключенной сортировки - ОтключенныеНастройкиПорядкаРасширеннаяПодсказка - 363 + ОтключенныеНастройкиПорядкаExtendedTooltip + 173 Label true true @@ -2608,8 +2608,8 @@ true - НадписьНедоступногоПорядкаРасширеннаяПодсказка - 367 + НадписьНедоступногоПорядкаExtendedTooltip + 177 Label true true @@ -2645,8 +2645,8 @@ true - ПереходКПорядкуОтчета1РасширеннаяПодсказка - 368 + ПереходКПорядкуОтчета1ExtendedTooltip + 178 Label true true @@ -2681,8 +2681,8 @@ Страница недоступной сортировки - НедоступныеНастройкиПорядкаРасширеннаяПодсказка - 366 + НедоступныеНастройкиПорядкаExtendedTooltip + 176 Label true true @@ -2706,8 +2706,8 @@ Страницы сортировки - СтраницыПорядкаРасширеннаяПодсказка - 325 + СтраницыПорядкаExtendedTooltip + 169 Label true true @@ -2730,8 +2730,8 @@ Сортировка - СтраницаПорядкаРасширеннаяПодсказка - 322 + СтраницаПорядкаExtendedTooltip + 167 Label true true @@ -2772,8 +2772,8 @@ ЛокальноеУсловноеОформлениеПриИзменении - ЛокальноеУсловноеОформлениеРасширеннаяПодсказка - 370 + ЛокальноеУсловноеОформлениеExtendedTooltip + 180 Label true true @@ -2823,10 +2823,10 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеСтрокаПоиска - 375 + 392 КомпоновщикНастроекНастройкиУсловноеОформлениеСтрокаПоискаРасширеннаяПодсказка - 377 + 394 Label true true @@ -2836,7 +2836,7 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеСтрокаПоискаКонтекстноеМеню - 376 + 393 true КомпоновщикНастроекНастройкиУсловноеОформление @@ -2846,10 +2846,10 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеСостояниеПросмотра - 378 + 395 КомпоновщикНастроекНастройкиУсловноеОформлениеСостояниеПросмотраРасширеннаяПодсказка - 380 + 397 Label true true @@ -2859,7 +2859,7 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеСостояниеПросмотраКонтекстноеМеню - 379 + 396 true ViewStatusAddition @@ -2870,10 +2870,10 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеУправлениеПоиском - 381 + 398 КомпоновщикНастроекНастройкиУсловноеОформлениеУправлениеПоискомРасширеннаяПодсказка - 383 + 400 Label true true @@ -2883,7 +2883,7 @@ КомпоновщикНастроекНастройкиУсловноеОформлениеУправлениеПоискомКонтекстноеМеню - 382 + 399 true SearchControlAddition @@ -2893,8 +2893,8 @@ - КомпоновщикНастроекНастройкиУсловноеОформлениеРасширеннаяПодсказка - 374 + КомпоновщикНастроекНастройкиУсловноеОформлениеExtendedTooltip + 183 Label true true @@ -2944,8 +2944,8 @@ Страница условного оформления - НастройкиУсловногоОформленияРасширеннаяПодсказка - 373 + НастройкиУсловногоОформленияExtendedTooltip + 182 Label true true @@ -2976,8 +2976,8 @@ true - НадписьЛокальногоУсловногоОформленияРасширеннаяПодсказка - 393 + НадписьЛокальногоУсловногоОформленияExtendedTooltip + 185 Label true true @@ -3013,8 +3013,8 @@ true - ПереходКУсловномуОформлениюОтчетаРасширеннаяПодсказка - 394 + ПереходКУсловномуОформлениюОтчетаExtendedTooltip + 186 Label true true @@ -3049,8 +3049,8 @@ Страница отключенного условного оформления - ОтключенныеНастройкиУсловногоОформленияРасширеннаяПодсказка - 392 + ОтключенныеНастройкиУсловногоОформленияExtendedTooltip + 184 Label true true @@ -3081,8 +3081,8 @@ true - НадписьНедоступногоУсловногоОформленияРасширеннаяПодсказка - 396 + НадписьНедоступногоУсловногоОформленияExtendedTooltip + 188 Label true true @@ -3118,8 +3118,8 @@ true - ПереходКУсловномуОформлениюОтчета1РасширеннаяПодсказка - 397 + ПереходКУсловномуОформлениюОтчета1ExtendedTooltip + 189 Label true true @@ -3154,8 +3154,8 @@ Страница недоступного условного оформления - НедоступныеНастройкиУсловногоОформленияРасширеннаяПодсказка - 395 + НедоступныеНастройкиУсловногоОформленияExtendedTooltip + 187 Label true true @@ -3179,8 +3179,8 @@ Страницы условного оформления - СтраницыУсловногоОформленияРасширеннаяПодсказка - 372 + СтраницыУсловногоОформленияExtendedTooltip + 181 Label true true @@ -3203,8 +3203,8 @@ Условное оформление - СтраницаУсловногоОформленияРасширеннаяПодсказка - 369 + СтраницаУсловногоОформленияExtendedTooltip + 179 Label true true @@ -3245,8 +3245,8 @@ ЛокальныеПараметрыВыводаПриИзменении - ЛокальныеПараметрыВыводаРасширеннаяПодсказка - 399 + ЛокальныеПараметрыВыводаExtendedTooltip + 191 Label true true @@ -3296,10 +3296,10 @@ КомпоновщикНастроекНастройкиПараметрыВыводаСтрокаПоиска - 404 + 410 КомпоновщикНастроекНастройкиПараметрыВыводаСтрокаПоискаРасширеннаяПодсказка - 406 + 412 Label true true @@ -3309,7 +3309,7 @@ КомпоновщикНастроекНастройкиПараметрыВыводаСтрокаПоискаКонтекстноеМеню - 405 + 411 true КомпоновщикНастроекНастройкиПараметрыВывода @@ -3319,10 +3319,10 @@ КомпоновщикНастроекНастройкиПараметрыВыводаСостояниеПросмотра - 407 + 413 КомпоновщикНастроекНастройкиПараметрыВыводаСостояниеПросмотраРасширеннаяПодсказка - 409 + 415 Label true true @@ -3332,7 +3332,7 @@ КомпоновщикНастроекНастройкиПараметрыВыводаСостояниеПросмотраКонтекстноеМеню - 408 + 414 true ViewStatusAddition @@ -3343,10 +3343,10 @@ КомпоновщикНастроекНастройкиПараметрыВыводаУправлениеПоиском - 410 + 416 КомпоновщикНастроекНастройкиПараметрыВыводаУправлениеПоискомРасширеннаяПодсказка - 412 + 418 Label true true @@ -3356,7 +3356,7 @@ КомпоновщикНастроекНастройкиПараметрыВыводаУправлениеПоискомКонтекстноеМеню - 411 + 417 true SearchControlAddition @@ -3366,8 +3366,8 @@ - КомпоновщикНастроекНастройкиПараметрыВыводаРасширеннаяПодсказка - 403 + КомпоновщикНастроекНастройкиПараметрыВыводаExtendedTooltip + 194 Label true true @@ -3417,8 +3417,8 @@ Страница дополнительных настроек - НастройкиПараметровВыводаРасширеннаяПодсказка - 402 + НастройкиПараметровВыводаExtendedTooltip + 193 Label true true @@ -3449,8 +3449,8 @@ true - НадписьЛокальныхПараметровВыводаРасширеннаяПодсказка - 422 + НадписьЛокальныхПараметровВыводаExtendedTooltip + 196 Label true true @@ -3486,8 +3486,8 @@ true - ПереходКПараметрамВыводаОтчетаРасширеннаяПодсказка - 423 + ПереходКПараметрамВыводаОтчетаExtendedTooltip + 197 Label true true @@ -3522,8 +3522,8 @@ Страница отключенных дополнительных настроек - ОтключенныеНастройкиПараметровВыводаРасширеннаяПодсказка - 421 + ОтключенныеНастройкиПараметровВыводаExtendedTooltip + 195 Label true true @@ -3554,8 +3554,8 @@ true - НадписьНедоступныхПараметровВыводаРасширеннаяПодсказка - 425 + НадписьНедоступныхПараметровВыводаExtendedTooltip + 199 Label true true @@ -3591,8 +3591,8 @@ true - ПереходКПараметрамВыводаОтчета1РасширеннаяПодсказка - 426 + ПереходКПараметрамВыводаОтчета1ExtendedTooltip + 200 Label true true @@ -3627,8 +3627,8 @@ Страница недоступных дополнительных настроек - НедоступныеНастройкиПараметровВыводаРасширеннаяПодсказка - 424 + НедоступныеНастройкиПараметровВыводаExtendedTooltip + 198 Label true true @@ -3652,8 +3652,8 @@ Страницы дополнительных настроек - СтраницыПараметровВыводаРасширеннаяПодсказка - 401 + СтраницыПараметровВыводаExtendedTooltip + 192 Label true true @@ -3676,8 +3676,8 @@ Дополнительные настройки - СтраницаПараметровВыводаРасширеннаяПодсказка - 398 + СтраницаПараметровВыводаExtendedTooltip + 190 Label true true @@ -3704,8 +3704,8 @@ Группа настроек - СтраницыНастроекРасширеннаяПодсказка - 148 + СтраницыНастроекExtendedTooltip + 131 Label true true @@ -3733,7 +3733,7 @@ true - ЗавершитьРедактированиеРасширеннаяПодсказка + ЗавершитьРедактированиеExtendedTooltip 127 Label true @@ -3758,7 +3758,7 @@ true - ФормаЗакончитьРедактированиеРасширеннаяПодсказка + ФормаЗакончитьРедактированиеExtendedTooltip 128 Label true @@ -3784,7 +3784,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 129 Label true diff --git a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl index 051677678..6f0a70ba2 100644 --- a/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаВариантаОтчета/Module.bsl @@ -372,7 +372,9 @@ &НаКлиенте Процедура ЗавершитьРедактирование(Команда) - Если ВладелецФормы = Неопределено Тогда + Если МодальныйРежим + Или РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс + Или ВладелецФормы = Неопределено Тогда Закрыть(Истина); Иначе ОповеститьОВыборе(Отчет.КомпоновщикНастроек); diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form index edf29b8b2..32a0260bf 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Form.form @@ -98,7 +98,7 @@ - КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + КомпоновщикНастроекПользовательскиеНастройкиExtendedTooltip 10 Label true @@ -153,7 +153,7 @@ true - ЗавершитьРедактированиеРасширеннаяПодсказка + ЗавершитьРедактированиеExtendedTooltip 7 Label true @@ -178,7 +178,7 @@ true - ФормаЗавершитьРедактированиеРасширеннаяПодсказка + ФормаЗавершитьРедактированиеExtendedTooltip 8 Label true @@ -204,7 +204,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 9 Label true diff --git a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl index dc359978f..a3788bc78 100644 --- a/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаНастроекОтчета/Module.bsl @@ -21,7 +21,9 @@ &НаКлиенте Процедура ЗавершитьРедактирование(Команда) - Если ВладелецФормы = Неопределено Тогда + Если МодальныйРежим + Или РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс + Или ВладелецФормы = Неопределено Тогда Закрыть(Истина); Иначе ОповеститьОВыборе(Отчет.КомпоновщикНастроек); diff --git a/SSL/src/CommonForms/ФормаОтчета/Form.form b/SSL/src/CommonForms/ФормаОтчета/Form.form index 3a1b3539b..5a828cea1 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Form.form +++ b/SSL/src/CommonForms/ФормаОтчета/Form.form @@ -16,8 +16,8 @@ Left - ОтчетНаименованиеТекущегоВариантаРасширеннаяПодсказка - 114 + ОтчетНаименованиеТекущегоВариантаExtendedTooltip + 113 Label true true @@ -55,8 +55,8 @@ true - ЗагрузитьВариантРасширеннаяПодсказка - 116 + ЗагрузитьВариантExtendedTooltip + 114 Label true true @@ -86,8 +86,8 @@ Выбор варианта отчета - ВыборВариантаОтчетаРасширеннаяПодсказка - 113 + ВыборВариантаОтчетаExtendedTooltip + 112 Label true true @@ -119,8 +119,8 @@ true - СформироватьОтчетРасширеннаяПодсказка - 119 + СформироватьОтчетExtendedTooltip + 117 Label true true @@ -144,8 +144,8 @@ true - КнопкаСформироватьРасширеннаяПодсказка - 120 + КнопкаСформироватьExtendedTooltip + 118 Label true true @@ -173,8 +173,8 @@ true - НайтиРасширеннаяПодсказка - 122 + НайтиExtendedTooltip + 120 Label true true @@ -200,8 +200,8 @@ true - СвернутьВсеГруппыРасширеннаяПодсказка - 123 + СвернутьВсеГруппыExtendedTooltip + 121 Label true true @@ -227,8 +227,8 @@ true - РазвернутьВсеГруппыРасширеннаяПодсказка - 124 + РазвернутьВсеГруппыExtendedTooltip + 122 Label true true @@ -259,8 +259,8 @@ Кнопки табличного документа - КнопкиТабличногоДокументаРасширеннаяПодсказка - 121 + КнопкиТабличногоДокументаExtendedTooltip + 119 Label true true @@ -282,8 +282,8 @@ true - ПечатьРасширеннаяПодсказка - 126 + ПечатьExtendedTooltip + 124 Label true true @@ -309,8 +309,8 @@ true - ПредварительныйПросмотрРасширеннаяПодсказка - 127 + ПредварительныйПросмотрExtendedTooltip + 125 Label true true @@ -341,8 +341,8 @@ - ГруппаПечатьРасширеннаяПодсказка - 125 + ГруппаПечатьExtendedTooltip + 123 Label true true @@ -365,8 +365,8 @@ true - СохранитьРасширеннаяПодсказка - 128 + СохранитьExtendedTooltip + 126 Label true true @@ -395,8 +395,8 @@ true - ОтправитьПоЭлектроннойПочтеРасширеннаяПодсказка - 130 + ОтправитьПоЭлектроннойПочтеExtendedTooltip + 128 Label true true @@ -427,8 +427,8 @@ Отправить отчет по электронной почте - ОтправитьРасширеннаяПодсказка - 129 + ОтправитьExtendedTooltip + 127 Label true true @@ -459,8 +459,8 @@ Левая часть командной панели - ЛеваяЧастьКоманднойПанелиРасширеннаяПодсказка - 118 + ЛеваяЧастьКоманднойПанелиExtendedTooltip + 116 Label true true @@ -485,8 +485,8 @@ true - ВычислитьСуммуРасширеннаяПодсказка - 132 + ВычислитьСуммуExtendedTooltip + 130 Label true true @@ -520,8 +520,8 @@ Сумма чисел выделенных ячеек - СуммаРасширеннаяПодсказка - 133 + СуммаExtendedTooltip + 131 Label true true @@ -575,8 +575,8 @@ - ГруппаСуммаРасширеннаяПодсказка - 131 + ГруппаСуммаExtendedTooltip + 129 Label true true @@ -601,8 +601,8 @@ true - ПустаяДекорация1РасширеннаяПодсказка - 135 + ПустаяДекорация1ExtendedTooltip + 132 Label true true @@ -639,8 +639,8 @@ true - ФормаОтчетСкомпоноватьРезультатРасширеннаяПодсказка - 138 + ФормаОтчетСкомпоноватьРезультатExtendedTooltip + 135 Label true true @@ -665,8 +665,8 @@ true - ФормаСформироватьРасширеннаяПодсказка - 139 + ФормаСформироватьExtendedTooltip + 136 Label true true @@ -695,8 +695,8 @@ true - ФормаПечатьРасширеннаяПодсказка - 141 + ФормаПечатьExtendedTooltip + 138 Label true true @@ -721,8 +721,8 @@ true - ФормаПредварительныйПросмотрРасширеннаяПодсказка - 142 + ФормаПредварительныйПросмотрExtendedTooltip + 139 Label true true @@ -748,8 +748,8 @@ true - ФормаПараметрыСтраницыРасширеннаяПодсказка - 143 + ФормаПараметрыСтраницыExtendedTooltip + 140 Label true true @@ -780,8 +780,8 @@ - ФормаГруппаПечатьРасширеннаяПодсказка - 140 + ФормаГруппаПечатьExtendedTooltip + 137 Label true true @@ -804,8 +804,8 @@ true - ФормаСохранитьРасширеннаяПодсказка - 144 + ФормаСохранитьExtendedTooltip + 141 Label true true @@ -834,8 +834,8 @@ true - ОтправитьПоЭлектроннойПочтеВсеДействияРасширеннаяПодсказка - 146 + ОтправитьПоЭлектроннойПочтеВсеДействияExtendedTooltip + 143 Label true true @@ -866,8 +866,8 @@ Отправить отчет по электронной почте - ОтправитьВсеДействияРасширеннаяПодсказка - 145 + ОтправитьВсеДействияExtendedTooltip + 142 Label true true @@ -898,8 +898,8 @@ Команды важные - КомандыВажныеРасширеннаяПодсказка - 137 + КомандыВажныеExtendedTooltip + 134 Label true true @@ -921,8 +921,8 @@ true - СкрытьПоказатьБыстрыеНастройкиРасширеннаяПодсказка - 148 + СкрытьПоказатьБыстрыеНастройкиExtendedTooltip + 145 Label true true @@ -952,8 +952,8 @@ - ГруппаСкрытьПоказатьБыстрыеНастройкиРасширеннаяПодсказка - 147 + ГруппаСкрытьПоказатьБыстрыеНастройкиExtendedTooltip + 144 Label true true @@ -963,56 +963,21 @@
            - - ГруппаНастроитьОтчет - 112 - - НастроитьОтчет - 12 - - <key>ru</key> - <value>Все настройки...</value> - - true - true - - true - - - НастроитьОтчетРасширеннаяПодсказка - 150 - Label - true - true - - Left - - - Form.Command.НастроитьОтчет - Normal - Picture - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - + + НастроитьОтчет + 12 + + <key>ru</key> + <value>Все настройки...</value> + true true true - - <key>ru</key> - <value>Группа настроить отчет</value> - - - ru - Группа настроить отчет - - ГруппаНастроитьОтчетРасширеннаяПодсказка - 149 + НастроитьОтчетExtendedTooltip + 147 Label true true @@ -1020,7 +985,14 @@ Left - + Form.Command.НастроитьОтчет + Normal + Picture + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu КомандыВариантовПользовательскихНастроек @@ -1038,8 +1010,8 @@ true - ФормаЗагрузитьНастройкиОтчетаРасширеннаяПодсказка - 152 + ФормаЗагрузитьНастройкиОтчетаExtendedTooltip + 148 Label true true @@ -1069,8 +1041,8 @@ true - ФормаСохранитьНастройкиОтчетаРасширеннаяПодсказка - 153 + ФормаСохранитьНастройкиОтчетаExtendedTooltip + 149 Label true true @@ -1102,8 +1074,8 @@ true - ФормаСтандартныеНастройкиРасширеннаяПодсказка - 155 + ФормаСтандартныеНастройкиExtendedTooltip + 151 Label true true @@ -1129,8 +1101,8 @@ true - СброситьНастройкиРасширеннаяПодсказка - 156 + СброситьНастройкиExtendedTooltip + 152 Label true true @@ -1161,8 +1133,8 @@ - ДополнительныеКомандыВариантовПользовательскихНастроекРасширеннаяПодсказка - 154 + ДополнительныеКомандыВариантовПользовательскихНастроекExtendedTooltip + 150 Label true true @@ -1186,8 +1158,8 @@ Команды вариантов пользовательских настроек - КомандыВариантовПользовательскихНастроекРасширеннаяПодсказка - 151 + КомандыВариантовПользовательскихНастроекExtendedTooltip + 146 Label true true @@ -1209,8 +1181,8 @@ true - ИзменитьВариантОтчетаРасширеннаяПодсказка - 158 + ИзменитьВариантОтчетаExtendedTooltip + 154 Label true true @@ -1239,8 +1211,8 @@ true - ФормаИзменитьВариантРасширеннаяПодсказка - 159 + ФормаИзменитьВариантExtendedTooltip + 155 Label true true @@ -1270,8 +1242,8 @@ true - ФормаЗагрузитьВариантРасширеннаяПодсказка - 160 + ФормаЗагрузитьВариантExtendedTooltip + 156 Label true true @@ -1301,8 +1273,8 @@ true - ФормаСохранитьВариантРасширеннаяПодсказка - 161 + ФормаСохранитьВариантExtendedTooltip + 157 Label true true @@ -1333,8 +1305,8 @@ Команды вариантов отчета - КомандыВариантовОтчетаРасширеннаяПодсказка - 157 + КомандыВариантовОтчетаExtendedTooltip + 153 Label true true @@ -1356,8 +1328,8 @@ true - ФормаНовоеОкноРасширеннаяПодсказка - 163 + ФормаНовоеОкноExtendedTooltip + 159 Label true true @@ -1383,8 +1355,8 @@ true - ФормаИзменитьФормуРасширеннаяПодсказка - 164 + ФормаИзменитьФормуExtendedTooltip + 160 Label true true @@ -1415,8 +1387,8 @@ Команды см также - КомандыСмТакжеРасширеннаяПодсказка - 162 + КомандыСмТакжеExtendedTooltip + 158 Label true true @@ -1435,8 +1407,8 @@ true - ФормаСправкаРасширеннаяПодсказка - 165 + ФормаСправкаExtendedTooltip + 161 Label true true @@ -1470,8 +1442,8 @@ false false - ПраваяЧастьКоманднойПанелиРасширеннаяПодсказка - 136 + ПраваяЧастьКоманднойПанелиExtendedTooltip + 133 Label true true @@ -1499,8 +1471,8 @@ Основная командная панель - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 117 + ОсновнаяКоманднаяПанельExtendedTooltip + 115 Label true true @@ -1533,8 +1505,8 @@ None - ОтчетТабличныйДокументРасширеннаяПодсказка - 167 + ОтчетТабличныйДокументExtendedTooltip + 163 Label true true @@ -1545,6 +1517,32 @@ ОтчетТабличныйДокументКонтекстноеМеню 8 + + ОтчетТабличныйДокументКонтекстноеМенюОтчетСкомпоноватьРезультат + 168 + true + true + + true + + + ОтчетТабличныйДокументКонтекстноеМенюОтчетСкомпоноватьРезультатРасширеннаяПодсказка + 169 + Label + true + true + + Left + + + Form.Command.ОтчетСкомпоноватьРезультат + Normal + Auto + true + true + UserCmds + Auto + true SpreadsheetDocumentField @@ -1601,8 +1599,8 @@ - ПериодыРасширеннаяПодсказка - 170 + ПериодыExtendedTooltip + 165 Label true true @@ -1638,8 +1636,8 @@ true - ПараметрыИОтборыРасширеннаяПодсказка - 171 + ПараметрыИОтборыExtendedTooltip + 166 Label true true @@ -1675,8 +1673,8 @@ Таблицы с флажками - ТаблицыСФлажкамиРасширеннаяПодсказка - 172 + ТаблицыСФлажкамиExtendedTooltip + 167 Label true true @@ -1708,9 +1706,11 @@ 42 + true + true - БыстрыеНастройкиРасширеннаяПодсказка - 169 + БыстрыеНастройкиExtendedTooltip + 164 Label true true @@ -1742,8 +1742,8 @@ - РезультатИБыстрыеНастройкиРасширеннаяПодсказка - 166 + РезультатИБыстрыеНастройкиExtendedTooltip + 162 Label true true @@ -1775,6 +1775,10 @@ NotificationProcessing ОбработкаОповещения + + OnOpen + ПриОткрытии + OnCreateAtServer ПриСозданииНаСервере @@ -2077,9 +2081,7 @@ Фоновое задание идентификатор 16 - - UUID - + true @@ -2213,6 +2215,23 @@ true + + ЕстьБыстрыеНастройки + + <key>ru</key> + <value>Есть быстрые настройки</value> + + 26 + + Boolean + + + true + + + true + + НастроитьОтчет diff --git a/SSL/src/CommonForms/ФормаОтчета/Module.bsl b/SSL/src/CommonForms/ФормаОтчета/Module.bsl index 91bad7054..a887981f3 100644 --- a/SSL/src/CommonForms/ФормаОтчета/Module.bsl +++ b/SSL/src/CommonForms/ФормаОтчета/Module.bsl @@ -100,11 +100,11 @@ ВидимостьДоступностьКорректность(); // Механизмы расширения - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - МодульРассылкаОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РассылкаОтчетов"); - МодульРассылкаОтчетов.ФормаОтчетаДобавитьКоманды(ЭтаФорма, Отказ, СтандартнаяОбработка); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетов = ОбщегоНазначения.ОбщийМодуль("РассылкаОтчетов"); + МодульРассылкаОтчетов.ФормаОтчетаДобавитьКоманды(ЭтотОбъект, Отказ, СтандартнаяОбработка); КонецЕсли; - ФормаОтчетаПереопределяемый.ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка); + ФормаОтчетаПереопределяемый.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка); // Если в подменю одна команда, то выпадающий список не отображается. Если Элементы.Отправить.ПодчиненныеЭлементы.Количество() = 1 Тогда @@ -118,6 +118,11 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриОткрытии(Отказ) + ПеременныеКлиента = Новый Структура; +КонецПроцедуры + &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) Результат = Ложь; @@ -147,11 +152,11 @@ КонецЕсли; // Механизмы расширения - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РассылкаОтчетовКлиент"); - МодульРассылкаОтчетовКлиент.ФормаОтчетаОбработкаВыбора(ЭтаФорма, ВыбранноеЗначение, ИсточникВыбора, Результат); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РассылкаОтчетовКлиент"); + МодульРассылкаОтчетовКлиент.ФормаОтчетаОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, ИсточникВыбора, Результат); КонецЕсли; - ФормаОтчетаКлиентПереопределяемый.ОбработкаВыбора(ЭтаФорма, ВыбранноеЗначение, ИсточникВыбора, Результат); + ФормаОтчетаКлиентПереопределяемый.ОбработкаВыбора(ЭтотОбъект, ВыбранноеЗначение, ИсточникВыбора, Результат); КонецПроцедуры &НаКлиенте @@ -166,7 +171,7 @@ КонецЕсли; // Вызов переопределяемого модуля - ФормаОтчетаПереопределяемый.ПередЗагрузкойВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД); + ФормаОтчетаПереопределяемый.ПередЗагрузкойВариантаНаСервере(ЭтотОбъект, НовыеНастройкиКД); // Загрузка фиксированных настроек для режима расшифровки. Если РежимРасшифровки Тогда @@ -186,7 +191,7 @@ БыстрыеНастройкиЗаполнить(); // Вызов переопределяемого модуля - ФормаОтчетаПереопределяемый.ПриЗагрузкеВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД); + ФормаОтчетаПереопределяемый.ПриЗагрузкеВариантаНаСервере(ЭтотОбъект, НовыеНастройкиКД); КонецПроцедуры &НаСервере @@ -200,7 +205,7 @@ &НаСервере Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(НовыеПользовательскиеНастройкиКД) // Вызов переопределяемого модуля - ФормаОтчетаПереопределяемый.ПередЗагрузкойПользовательскихНастроекНаСервере(ЭтаФорма, НовыеПользовательскиеНастройкиКД); + ФормаОтчетаПереопределяемый.ПередЗагрузкойПользовательскихНастроекНаСервере(ЭтотОбъект, НовыеПользовательскиеНастройкиКД); Если РежимВариантаОтчета Тогда БыстрыеНастройкиЗагрузитьСхемуИОчиститьФорму(НовыеПользовательскиеНастройкиКД, Неопределено); @@ -208,7 +213,7 @@ КонецЕсли; // Вызов переопределяемого модуля - ФормаОтчетаПереопределяемый.ПриЗагрузкеПользовательскихНастроекНаСервере(ЭтаФорма, НовыеПользовательскиеНастройкиКД); + ФормаОтчетаПереопределяемый.ПриЗагрузкеПользовательскихНастроекНаСервере(ЭтотОбъект, НовыеПользовательскиеНастройкиКД); КонецПроцедуры &НаКлиенте @@ -227,12 +232,12 @@ &НаКлиенте Процедура ОтчетТабличныйДокументОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) - ФормаОтчетаКлиентПереопределяемый.ОбработкаРасшифровки(ЭтаФорма, Элемент, Расшифровка, СтандартнаяОбработка); + ФормаОтчетаКлиентПереопределяемый.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте Процедура ОтчетТабличныйДокументОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) - ФормаОтчетаКлиентПереопределяемый.ОбработкаДополнительнойРасшифровки(ЭтаФорма, Элемент, Расшифровка, СтандартнаяОбработка); + ФормаОтчетаКлиентПереопределяемый.ОбработкаДополнительнойРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка); КонецПроцедуры &НаКлиенте @@ -251,7 +256,7 @@ ИдентификаторЭлемента = Прав(Элемент.Имя, 32); ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); - ПользовательскаяНастройкаКД.Использование = ЭтаФорма[Элемент.Имя]; + ПользовательскаяНастройкаКД.Использование = ЭтотОбъект[Элемент.Имя]; ВсеСвязиВедущего = БыстрыйПоискОтключаемыхСвязей.Получить(ИдентификаторЭлемента); Если ВсеСвязиВедущего <> Неопределено Тогда @@ -271,7 +276,7 @@ ШаблонГенерацииПрефикс = Лев(ЗначениеИмя, Найти(ЗначениеИмя, "_Значение_")-1); ИспользованиеИмя = ШаблонГенерацииПрефикс + "_Использование_" + ИдентификаторЭлемента; - Значение = ЭтаФорма[ЗначениеИмя]; + Значение = ЭтотОбъект[ЗначениеИмя]; Если ТипЗнч(Значение) = Тип("ОписаниеТипов") Тогда МассивТипов = Значение.Типы(); @@ -290,7 +295,7 @@ Если ЗначениеЗаполнено(Значение) И Не ПользовательскаяНастройкаКД.Использование Тогда ПользовательскаяНастройкаКД.Использование = Истина; Если Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; + ЭтотОбъект[ИспользованиеИмя] = Истина; КонецЕсли; КонецЕсли; @@ -333,7 +338,7 @@ // Отражение изменений флажка элемента таблицы в соответствующей пользовательской настройке. Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("СтруктураНастроекКомпоновкиДанных") Тогда - ИндексСтрокиТаблицы = ЭтаФорма[ТаблицаИмя].Индекс(СтрокаТаблицы); + ИндексСтрокиТаблицы = ЭтотОбъект[ТаблицаИмя].Индекс(СтрокаТаблицы); ПолеГруппировки = ПользовательскаяНастройкаКД.Структура.Получить(ИндексСтрокиТаблицы); ПолеГруппировки.Использование = СтрокаТаблицы.Использование; ПолеГруппировки.Состояние = СостояниеЭлементаНастройкиКомпоновкиДанных[?(СтрокаТаблицы.Использование, "Включен", "Отключен")]; @@ -361,9 +366,9 @@ ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; ПериодПредставлениеИмя = ШаблонГенерацииПрефикс + "_Представление_" + ИдентификаторЭлемента; - Значение = ЭтаФорма[ПериодЗначениеИмя]; + Значение = ЭтотОбъект[ПериодЗначениеИмя]; - ВидПериода = ЭтаФорма[ВидПериодаИмя]; + ВидПериода = ЭтотОбъект[ВидПериодаИмя]; Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод") Тогда @@ -393,8 +398,8 @@ КонецЕсли; Представление = ФункцииОтчетовКлиентСервер.ПредставлениеСтандартногоПериода(Значение, ВидПериода); - ЭтаФорма[ПериодПредставлениеИмя] = Представление; - ЭтаФорма[ПериодЗначениеИмя] = Значение; + ЭтотОбъект[ПериодПредставлениеИмя] = Представление; + ЭтотОбъект[ПериодЗначениеИмя] = Значение; ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); Если ШаблонГенерацииПрефикс = "Параметр" Тогда @@ -404,15 +409,14 @@ КонецЕсли; Если Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; + ЭтотОбъект[ИспользованиеИмя] = Истина; ПользовательскаяНастройкаКД.Использование = Истина; КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура Подключаемый_СтандартныйПериод_Значение_НачалоВыбораИзСписка(Элемент, СтандартнаяОбработка) - +Процедура Подключаемый_СтандартныйПериод_Значение_НачалоВыбора(Элемент, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; // Формирование сведений по элементу. @@ -421,137 +425,31 @@ ШаблонГенерацииПрефикс = Лев(ПериодПредставлениеИмя, Найти(ПериодПредставлениеИмя, "_Представление_")-1); ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; - ВидПериодаИмя = ШаблонГенерацииПрефикс + "_Вид_" + ИдентификаторЭлемента; + ВидПериодаИмя = ШаблонГенерацииПрефикс + "_Вид_" + ИдентификаторЭлемента; ИспользованиеИмя = ШаблонГенерацииПрефикс + "_Использование_" + ИдентификаторЭлемента; - Значение = ЭтаФорма[ПериодЗначениеИмя]; - ВидПериода = ЭтаФорма[ВидПериодаИмя]; + Значение = ЭтотОбъект[ПериодЗначениеИмя]; + ВидПериода = ЭтотОбъект[ВидПериодаИмя]; НачалоПериода = Значение.ДатаНачала; Если НачалоПериода = '00010101' тогда НачалоПериода = ФункцииОтчетовКлиентСервер.НачалоПериодаОтчета(ВидПериода, ОбщегоНазначенияКлиент.ДатаСеанса()); КонецЕсли; - // Выбор периода из выпадающего списка. - РезультатВыбора = ВыбратьПериодИзВыпадающегоСписка(Элемент, ВидПериода, НачалоПериода, Значение.Вариант, Неопределено); - Если РезультатВыбора = Неопределено Тогда - Возврат; - КонецЕсли; - - // Запись результата выбора в данные формы и пользовательские настройки КД. - Если ТипЗнч(РезультатВыбора.Значение) = Тип("ВариантСтандартногоПериода") Тогда - ЭтаФорма[ПериодПредставлениеИмя] = ?(ПустаяСтрока(РезультатВыбора.Представление), Строка(РезультатВыбора.Значение), РезультатВыбора.Представление); - Значение.Вариант = РезультатВыбора.Значение; - Иначе - НачалоПериода = ФункцииОтчетовКлиентСервер.НачалоПериодаОтчета(ВидПериода, РезультатВыбора.Значение); - КонецПериода = ФункцииОтчетовКлиентСервер.КонецПериодаОтчета(ВидПериода, РезультатВыбора.Значение); - - ЭтаФорма[ПериодПредставлениеИмя] = РезультатВыбора.Представление; - - Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; - Значение.ДатаНачала = НачалоПериода; - Значение.ДатаОкончания = КонецПериода; - КонецЕсли; - - ЭтаФорма[ПериодЗначениеИмя] = Значение; - - ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); - Если ШаблонГенерацииПрефикс = "Параметр" Тогда - ПользовательскаяНастройкаКД.Значение = Значение; - Иначе - ПользовательскаяНастройкаКД.ПравоеЗначение = Значение; - КонецЕсли; - - Если Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; - ПользовательскаяНастройкаКД.Использование = Истина; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_СтандартныйПериод_Значение_НачалоВыбора(Элемент, СтандартнаяОбработка) - - СтандартнаяОбработка = Ложь; - - // Формирование сведений по элементу. - ПериодПредставлениеИмя = Элемент.Имя; - ИдентификаторЭлемента = Прав(ПериодПредставлениеИмя, 32); - ШаблонГенерацииПрефикс = Лев(ПериодПредставлениеИмя, Найти(ПериодПредставлениеИмя, "_Представление_")-1); - - ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; - ВидПериодаИмя = ШаблонГенерацииПрефикс + "_Вид_" + ИдентификаторЭлемента; - - Значение = ЭтаФорма[ПериодЗначениеИмя]; - ВидПериода = ЭтаФорма[ВидПериодаИмя]; - МинимальнаяПериодичность = Элементы[ВидПериодаИмя].СписокВыбора[0].Значение; - - // Выбор периода из отдельной формы. - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("НачалоПериода", Значение.ДатаНачала); - ПараметрыФормы.Вставить("КонецПериода", Значение.ДатаОкончания); - ПараметрыФормы.Вставить("МинимальныйПериод", МинимальнаяПериодичность); - ПараметрыФормы.Вставить("ВидПериода", ВидПериода); - ПараметрыФормы.Вставить("ИмяЭлемента", ПериодПредставлениеИмя); - ПараметрыФормы.Вставить("РежимВыбора", Истина); - - ОткрытьФорму("ОбщаяФорма.ВыборПроизвольногоПериода", ПараметрыФормы, Элемент); - -КонецПроцедуры - -&НаКлиенте -Процедура Подключаемый_СтандартныйПериод_Значение_ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - - // Формирование сведений по элементу. - ПериодПредставлениеИмя = Элемент.Имя; - ИдентификаторЭлемента = Прав(ПериодПредставлениеИмя, 32); - ШаблонГенерацииПрефикс = Лев(ПериодПредставлениеИмя, Найти(ПериодПредставлениеИмя, "_Представление_")-1); - - ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; - ВидПериодаИмя = ШаблонГенерацииПрефикс + "_Вид_" + ИдентификаторЭлемента; - ИспользованиеИмя = ШаблонГенерацииПрефикс + "_Использование_" + ИдентификаторЭлемента; - - // Запись результата выбора... - НачалоПериода = ВыбранноеЗначение.НачалоПериода; - КонецПериода = ВыбранноеЗначение.КонецПериода; - Если НачалоПериода <> '00010101' Тогда - НачалоПериода = НачалоДня(НачалоПериода); - КонецЕсли; - Если КонецПериода <> '00010101' Тогда - КонецПериода = КонецДня(КонецПериода); - КонецЕсли; - - Значение = ЭтаФорма[ПериодЗначениеИмя]; - Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; - Значение.ДатаНачала = НачалоПериода; - Значение.ДатаОкончания = КонецПериода; - - // ... в данные формы. - ЭтаФорма[ПериодЗначениеИмя] = Значение; - ЭтаФорма[ВидПериодаИмя] = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод"); - - // ... в пользовательские настройки компоновки данных. - ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ИдентификаторЭлемента); - Если ШаблонГенерацииПрефикс = "Параметр" Тогда - ПользовательскаяНастройкаКД.Значение = Значение; - Иначе - ПользовательскаяНастройкаКД.ПравоеЗначение = Значение; - КонецЕсли; - - Если Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; - ПользовательскаяНастройкаКД.Использование = Истина; - КонецЕсли; - - // Переключение страницы. - Если ТипЗнч(ПеременныеКлиента) <> Тип("Структура") Тогда - ПеременныеКлиента = Новый Структура; - КонецЕсли; - ПеременныеКлиента.Вставить("ИмяГруппыСтраниц", ШаблонГенерацииПрефикс + "_Страницы_" + ИдентификаторЭлемента); - ПеременныеКлиента.Вставить("ИмяТекущейСтраницы", ШаблонГенерацииПрефикс + "_СтраницаПроизвольный_" + ИдентификаторЭлемента); - ПодключитьОбработчикОжидания("Подключаемый_ПереключитьСтраницу", 0.1, Истина); + // Параметры для чтения из обработчиков: + ПараметрыВыбора = Новый Структура; + // Для выбора значения: + ПараметрыВыбора.Вставить("Значение", Значение); + ПараметрыВыбора.Вставить("Элемент", Элемент); + // Для загрузки значения: + ПараметрыВыбора.Вставить("ИдентификаторЭлемента", ИдентификаторЭлемента); + ПараметрыВыбора.Вставить("ПериодПредставлениеИмя", ПериодПредставлениеИмя); + ПараметрыВыбора.Вставить("ПериодЗначениеИмя", ПериодЗначениеИмя); + ПараметрыВыбора.Вставить("ИспользованиеИмя", ИспользованиеИмя); + ПараметрыВыбора.Вставить("ВидПериода", ВидПериода); + ПараметрыВыбора.Вставить("ЭтоПараметр", (ШаблонГенерацииПрефикс = "Параметр")); + ВыборПериодаИзВыпадающегоСписка(-1, ПараметрыВыбора); КонецПроцедуры &НаКлиенте @@ -564,7 +462,7 @@ ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; ИспользованиеИмя = ШаблонГенерацииПрефикс + "_Использование_" + ИдентификаторЭлемента; - Значение = ЭтаФорма[ПериодЗначениеИмя]; + Значение = ЭтотОбъект[ПериодЗначениеИмя]; Если Значение.ДатаНачала <> '00010101' Тогда Значение.ДатаНачала = НачалоДня(Значение.ДатаНачала); @@ -579,7 +477,7 @@ КонецЕсли; Если Значение.ДатаНачала <> '00010101' И Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; + ЭтотОбъект[ИспользованиеИмя] = Истина; ПользовательскаяНастройкаКД.Использование = Истина; КонецЕсли; @@ -596,7 +494,7 @@ ПериодЗначениеИмя = ШаблонГенерацииПрефикс + "_Значение_" + ИдентификаторЭлемента; ИспользованиеИмя = ШаблонГенерацииПрефикс + "_Использование_" + ИдентификаторЭлемента; - Значение = ЭтаФорма[ПериодЗначениеИмя]; + Значение = ЭтотОбъект[ПериодЗначениеИмя]; Если Значение.ДатаОкончания <> '00010101' Тогда Значение.ДатаОкончания = КонецДня(Значение.ДатаОкончания); @@ -611,7 +509,7 @@ КонецЕсли; Если Значение.ДатаОкончания <> '00010101' И Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; + ЭтотОбъект[ИспользованиеИмя] = Истина; ПользовательскаяНастройкаКД.Использование = Истина; КонецЕсли; @@ -630,9 +528,9 @@ ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(Элемент.Имя); Если ТипЗнч(ПользовательскаяНастройкаКД) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - ПользовательскаяНастройкаКД.Значение = ЭтаФорма[Элемент.Имя]; + ПользовательскаяНастройкаКД.Значение = ЭтотОбъект[Элемент.Имя]; Иначе - ПользовательскаяНастройкаКД.ПравоеЗначение = ЭтаФорма[Элемент.Имя]; + ПользовательскаяНастройкаКД.ПравоеЗначение = ЭтотОбъект[Элемент.Имя]; КонецЕсли; КонецПроцедуры @@ -642,7 +540,7 @@ СтандартнаяОбработка = Ложь; // Добавление выбранных элементов с контролем уникальности. - СписокЗначений = ЭтаФорма[Элемент.Имя]; + СписокЗначений = ЭтотОбъект[Элемент.Имя]; Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда Для Каждого ЭлементМассива Из ВыбранноеЗначение Цикл Если СписокЗначений.НайтиПоЗначению(ЭлементМассива) = Неопределено Тогда @@ -666,7 +564,7 @@ // Включение флажка Использование. ИспользованиеИмя = СтрЗаменить(Элемент.Имя, "_СписокЗначений_", "_Использование_"); Если Элементы.Найти(ИспользованиеИмя) <> Неопределено Тогда - ЭтаФорма[ИспользованиеИмя] = Истина; + ЭтотОбъект[ИспользованиеИмя] = Истина; КонецЕсли; ПользовательскаяНастройкаКД.Использование = Истина; @@ -753,7 +651,7 @@ ПараметрыФормы.Вставить("ПредставлениеВарианта", Строка(ОтчетНаименованиеТекущегоВарианта)); ПараметрыФормы.Вставить("ПредставлениеПользовательскихНастроек", ""); - ОткрытьФорму(КлючОбъекта + ".ФормаНастроек", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму(КлючОбъекта + ".ФормаНастроек", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры @@ -770,14 +668,14 @@ ПараметрыФормы.Вставить("ПредставлениеВарианта", Строка(ОтчетНаименованиеТекущегоВарианта)); ПараметрыФормы.Вставить("ПредставлениеПользовательскихНастроек", ""); - ОткрытьФорму(КлючОбъекта + ".ФормаВарианта", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму(КлючОбъекта + ".ФормаВарианта", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура СброситьНастройки(Команда) Если ВариантМодифицирован = Истина Тогда - Предупреждение(НСтр("ru = 'Перед сбросом пользовательских настроек необходимо сохранить вариант отчета.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Перед сбросом пользовательских настроек необходимо сохранить вариант отчета.'")); Возврат; КонецЕсли; @@ -792,28 +690,12 @@ ОтображениеСостояния = Элементы.ОтчетТабличныйДокумент.ОтображениеСостояния; Если ОтображениеСостояния.Видимость = Истина И ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.Неактуальность Тогда - ТекстВопроса = НСтр("ru = 'Отчет не сформирован. Сформировать?'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); - Если Ответ <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - СформироватьНепосредственно(); + Обработчик = Новый ОписаниеОповещения("ОтправитьПоЭлектроннойПочтеЗавершение", ЭтотОбъект); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да); + Иначе + ПоказатьДиалогОтправкиПоЭлектроннойПочте(); КонецЕсли; - - ТабличныеДокументы = Новый СписокЗначений; - ТабличныеДокументы.Добавить(ЭтаФорма.ОтчетТабличныйДокумент, ЭтаФорма.ОтчетНаименованиеТекущегоВарианта); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТабличныеДокументы", ТабличныеДокументы); - ПараметрыФормы.Вставить("Тема", ЭтаФорма.ОтчетНаименованиеТекущегоВарианта); - ПараметрыФормы.Вставить("Заголовок", СтрЗаменить( - НСтр("ru = 'Отправка отчета ""%1"" по почте'"), - "%1", - ЭтаФорма.ОтчетНаименованиеТекущегоВарианта)); - - ОткрытьФорму("ОбщаяФорма.ОтправкаТабличныхДокументовПоПочте", ПараметрыФормы, , ); КонецПроцедуры &НаКлиенте @@ -847,11 +729,11 @@ Процедура Подключаемый_Команда(Команда) // Механизмы расширения Результат = Ложь; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда - МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РассылкаОтчетовКлиент"); - МодульРассылкаОтчетовКлиент.ФормаОтчетаОбработчикКоманды(ЭтаФорма, Команда, Результат); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") Тогда + МодульРассылкаОтчетовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РассылкаОтчетовКлиент"); + МодульРассылкаОтчетовКлиент.ФормаОтчетаОбработчикКоманды(ЭтотОбъект, Команда, Результат); КонецЕсли; - ФормаОтчетаКлиентПереопределяемый.ОбработчикКоманды(ЭтаФорма, Команда, Результат); + ФормаОтчетаКлиентПереопределяемый.ОбработчикКоманды(ЭтотОбъект, Команда, Результат); КонецПроцедуры &НаКлиенте @@ -866,125 +748,68 @@ КолонкаЗначениеИмя = ШаблонГенерацииПрефикс + "_Колонка_Значение_" + ИдентификаторЭлемента; КоманднаяПанельИмя = ШаблонГенерацииПрефикс + "_КоманднаяПанель_" + ИдентификаторЭлемента; - ТаблицаЭлемент = Элементы[ТаблицаИмя]; - ТаблицаЗначение = ЭтаФорма[ТаблицаИмя]; + ТаблицаЗначение = ЭтотОбъект[ТаблицаИмя]; КолонкаЗначениеЭлемент = Элементы[КолонкаЗначениеИмя]; - // Тип выбираемого значения. - СписокВыбора = Новый СписокЗначений; + ПараметрыЭлемента = Новый Структура; + ПараметрыЭлемента.Вставить("ИдентификаторЭлемента", ИдентификаторЭлемента); + ПараметрыЭлемента.Вставить("ВыбранныйТип", Неопределено); + ПараметрыЭлемента.Вставить("КолонкаЗначениеЭлемент", КолонкаЗначениеЭлемент); + ПараметрыЭлемента.Вставить("ТаблицаЭлемент", Элементы[ТаблицаИмя]); + ПараметрыЭлемента.Вставить("ВыборТолькоГрупп", КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы); - ТипОпределенВедущим = Ложь; Если ЗначениеЗаполнено(КолонкаЗначениеЭлемент.СвязьПоТипу.ПутьКДанным) Тогда - ЗначениеВедущего = ЭтаФорма[КолонкаЗначениеЭлемент.СвязьПоТипу.ПутьКДанным]; + ЗначениеВедущего = ЭтотОбъект[КолонкаЗначениеЭлемент.СвязьПоТипу.ПутьКДанным]; Если ЗначениеЗаполнено(ЗначениеВедущего) Тогда ТипВедущего = ТипЗнч(ЗначениеВедущего); Если ТаблицаЗначение.ТипЗначения.СодержитТип(ТипВедущего) Тогда - ТипОпределенВедущим = Истина; - ВыбранныйТип = ТипВедущего; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - ВыборТолькоГрупп = (КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы); - Если Не ТипОпределенВедущим Тогда - - ПростыеТипы = Новый Соответствие; - ПростыеТипы.Вставить(Тип("Строка"), Истина); - ПростыеТипы.Вставить(Тип("Дата"), Истина); - ПростыеТипы.Вставить(Тип("Число"), Истина); - - МассивТипов = ТаблицаЗначение.ТипЗначения.Типы(); - Для Каждого Тип Из МассивТипов Цикл - // Исключение типов, для которых нет групп. - Если ВыборТолькоГрупп Тогда - ИмяОбъектаМетаданных = БыстрыйПоискИменОбъектовМетаданных.Получить(Тип); - ВидОбъектаМетаданных = ВРег(Лев(ИмяОбъектаМетаданных, Найти(ИмяОбъектаМетаданных, ".")-1)); - Если ВидОбъектаМетаданных <> "СПРАВОЧНИК" И ВидОбъектаМетаданных <> "ПЛАНВИДОВХАРАКТЕРИСТИК" И ВидОбъектаМетаданных <> "ПЛАНСЧЕТОВ" Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - // Исключение простых типов. - Если ПростыеТипы[Тип] = Истина Тогда - Продолжить; - КонецЕсли; - // Добавление типа в список выбора. - СписокВыбора.Добавить(Тип, Строка(Тип)); - КонецЦикла; - - Если СписокВыбора.Количество() = 0 Тогда - ТаблицаЭлемент.ДобавитьСтроку(); - Возврат; - ИначеЕсли СписокВыбора.Количество() = 1 Тогда - ВыбранныйТип = СписокВыбора[0].Значение; - Иначе - ВыбранныйЭлемент = ВыбратьИзМеню(СписокВыбора, Элементы[КоманднаяПанельИмя]); - Если ВыбранныйЭлемент = Неопределено Тогда + // Тип определен ведущим. + ПараметрыЭлемента.ВыбранныйТип = ТипВедущего; + ПоказатьДиалогПодбораДляСписка(ПараметрыЭлемента); Возврат; КонецЕсли; - ВыбранныйТип = ВыбранныйЭлемент.Значение; КонецЕсли; - КонецЕсли; - // Полное имя формы выбора. - // Свойство "ФормаВыбора" недоступно на клиенте даже для чтения, - // поэтому для хранения предустановленных имен форм выбора используется коллекция БыстрыйПоискИменОбъектовМетаданных. - ПутьКФорме = БыстрыйПоискИменОбъектовМетаданных.Получить(ИдентификаторЭлемента); - Если Не ЗначениеЗаполнено(ПутьКФорме) Тогда - ИмяОбъектаМетаданных = БыстрыйПоискИменОбъектовМетаданных.Получить(ВыбранныйТип); - Если ВыборТолькоГрупп Тогда + // Выбор типа из списка. + СписокВыбора = Новый СписокЗначений; + + ПростыеТипы = Новый Соответствие; + ПростыеТипы.Вставить(Тип("Строка"), Истина); + ПростыеТипы.Вставить(Тип("Дата"), Истина); + ПростыеТипы.Вставить(Тип("Число"), Истина); + + МассивТипов = ТаблицаЗначение.ТипЗначения.Типы(); + Для Каждого Тип Из МассивТипов Цикл + // Исключение типов, для которых нет групп. + Если ПараметрыЭлемента.ВыборТолькоГрупп Тогда + ИмяОбъектаМетаданных = БыстрыйПоискИменОбъектовМетаданных.Получить(Тип); ВидОбъектаМетаданных = ВРег(Лев(ИмяОбъектаМетаданных, Найти(ИмяОбъектаМетаданных, ".")-1)); - Если ВидОбъектаМетаданных = "СПРАВОЧНИК" Или ВидОбъектаМетаданных = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбораГруппы"; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; + Если ВидОбъектаМетаданных <> "СПРАВОЧНИК" И ВидОбъектаМетаданных <> "ПЛАНВИДОВХАРАКТЕРИСТИК" И ВидОбъектаМетаданных <> "ПЛАНСЧЕТОВ" Тогда + Продолжить; КонецЕсли; - Иначе - ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; КонецЕсли; + // Исключение простых типов. + Если ПростыеТипы[Тип] = Истина Тогда + Продолжить; + КонецЕсли; + // Добавление типа в список выбора. + СписокВыбора.Добавить(Тип, Строка(Тип)); + КонецЦикла; + + Если СписокВыбора.Количество() = 0 Тогда + ПараметрыЭлемента.ТаблицаЭлемент.ДобавитьСтроку(); + Возврат; + ИначеЕсли СписокВыбора.Количество() = 1 Тогда + // Один тип - выбор не требуется. + ПараметрыЭлемента.ВыбранныйТип = СписокВыбора[0].Значение; + ПоказатьДиалогПодбораДляСписка(ПараметрыЭлемента); + Иначе + // Более одного типа. + Обработчик = Новый ОписаниеОповещения("ПоказатьДиалогПодбораДляСпискаПослеВыбораТипа", ЭтотОбъект, ПараметрыЭлемента); + ПоказатьВыборИзМеню(Обработчик, СписокВыбора, Элементы[КоманднаяПанельИмя]); КонецЕсли; - ПараметрыФормыВыбора = Новый Структура; - // Стандартные параметры формы. - ПараметрыФормыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь); - ПараметрыФормыВыбора.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина); - ПараметрыФормыВыбора.Вставить("Отбор", Новый Структура); - // Стандартные параметры формы выбора (см. Расширение управляемой формы для динамического списка). - ПараметрыФормыВыбора.Вставить("ВыборГруппИЭлементов", ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(КолонкаЗначениеЭлемент.ВыборГруппИЭлементов)); - ПараметрыФормыВыбора.Вставить("МножественныйВыбор", Истина); - ПараметрыФормыВыбора.Вставить("РежимВыбора", Истина); - // Предполагаемые реквизиты. - ПараметрыФормыВыбора.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); - ПараметрыФормыВыбора.Вставить("РазрешитьНачалоПеретаскивания", Ложь); - - // Добавление фиксированных параметров выбора. - Для Каждого ПараметрВыбора Из КолонкаЗначениеЭлемент.ПараметрыВыбора Цикл - Если ПустаяСтрока(ПараметрВыбора.Имя) Тогда - Продолжить; - КонецЕсли; - Если ЗначениеЗаполнено(ПараметрВыбора.Имя) Тогда - Если ВРег(Лев(ПараметрВыбора.Имя, 6)) = ВРег("Отбор.") Тогда - ПараметрыФормыВыбора.Отбор.Вставить(Сред(ПараметрВыбора.Имя, 7), ПараметрВыбора.Значение); - Иначе - ПараметрыФормыВыбора.Вставить(ПараметрВыбора.Имя, ПараметрВыбора.Значение); - КонецЕсли; - КонецЕсли; - КонецЦикла; - - // Добавление динамических параметров выбора (от ведущих). - Для Каждого СвязьПараметраВыбора Из КолонкаЗначениеЭлемент.СвязиПараметровВыбора Цикл - Если ПустаяСтрока(СвязьПараметраВыбора.Имя) Тогда - Продолжить; - КонецЕсли; - ВедущийЗначение = ЭтаФорма[СвязьПараметраВыбора.ПутьКДанным]; - Если ВРег(Лев(СвязьПараметраВыбора.Имя, 6)) = ВРег("Отбор.") Тогда - ПараметрыФормыВыбора.Отбор.Вставить(Сред(СвязьПараметраВыбора.Имя, 7), ВедущийЗначение); - Иначе - ПараметрыФормыВыбора.Вставить(СвязьПараметраВыбора.Имя, ВедущийЗначение); - КонецЕсли; - КонецЦикла; - - ОткрытьФорму(ПутьКФорме, ПараметрыФормыВыбора, ТаблицаЭлемент); КонецПроцедуры &НаКлиенте @@ -993,7 +818,7 @@ КнопкаПодборИмя = Команда.Имя; ИдентификаторЭлемента = Прав(КнопкаПодборИмя, 32); - ШаблонГенерацииПрефикс = Лев(КнопкаПодборИмя, Найти(КнопкаПодборИмя, "_Подбор_")-1); + ШаблонГенерацииПрефикс = Лев(КнопкаПодборИмя, Найти(КнопкаПодборИмя, "_Подбор_") - 1); ТаблицаИмя = ШаблонГенерацииПрефикс + "_СписокЗначений_" + ИдентификаторЭлемента; @@ -1038,46 +863,133 @@ // Клиент &НаКлиенте -Функция ВыбратьПериодИзВыпадающегоСписка(Элемент, ВидПериода, НачалоПериода, Вариант, ИндексНачальногоЗначения) - - Если Вариант = Неопределено Или Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда - СписокПериодов = ФункцииОтчетовКлиентСервер.СписокФиксированныхПериодов(НачалоПериода, ВидПериода); - СписокПериодов.Добавить("ВыборАвтоматическиВычисляемогоПериода", НСтр("ru = 'Относительный...'")); - Если ИндексНачальногоЗначения = Неопределено Тогда - ИндексНачальногоЗначения = СписокПериодов.НайтиПоЗначению(НачалоПериода); - КонецЕсли; - Иначе - СписокПериодов = ФункцииОтчетовКлиентСервер.СписокВычисляемыхПериодов(ВидПериода); - СписокПериодов.Добавить("ВыборФиксированногоПериода", НСтр("ru = 'Фиксированный...'")); - Если ИндексНачальногоЗначения = Неопределено Тогда - ИндексНачальногоЗначения = СписокПериодов.НайтиПоЗначению(Вариант); - КонецЕсли; +Процедура ВыборПериодаИзВыпадающегоСписка(Результат, ПараметрыВыбора) Экспорт + Если Результат = Неопределено Тогда + Возврат; // Отмена выбора. КонецЕсли; + + Если Результат = -1 Тогда // Начало выбора. + // Чтение параметров для формирования списка из сохраненного значения периода. + ПараметрыВыбора.Вставить("НачалоПериода", ПараметрыВыбора.Значение.ДатаНачала); + ПараметрыВыбора.Вставить("Вариант", ПараметрыВыбора.Значение.Вариант); + ИндексНачальногоЗначения = Неопределено; + ИначеЕсли ТипЗнч(Результат.Значение) = Тип("Структура") Тогда + // Чтение параметров для формирования списка из выбранного значения. + ПараметрыВыбора.Вставить("НачалоПериода", Результат.Значение.НачалоПериода); + ПараметрыВыбора.Вставить("Вариант", Результат.Значение.Вариант); + ИндексНачальногоЗначения = Результат.Значение.ИндексНачальногоЗначения; + Иначе + // Загрузка результата выбора. + ЗагрузитьРезультатВыбораПериодаИзВыпадающегоСписка(Результат, ПараметрыВыбора); + Возврат; + КонецЕсли; + + // Формирование списка выбора. + Если ПараметрыВыбора.Вариант = Неопределено Или ПараметрыВыбора.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда + + СписокПериодов = ФункцииОтчетовКлиентСервер.СписокФиксированныхПериодов(ПараметрыВыбора.НачалоПериода, ПараметрыВыбора.ВидПериода); + + Если ИндексНачальногоЗначения = Неопределено Тогда + ИндексНачальногоЗначения = СписокПериодов.НайтиПоЗначению(ПараметрыВыбора.НачалоПериода); + КонецЕсли; + + ОписаниеНавигационногоЭлемента = Новый Структура; + ОписаниеНавигационногоЭлемента.Вставить("НачалоПериода", СписокПериодов[0].Значение); + ОписаниеНавигационногоЭлемента.Вставить("Вариант", Неопределено); + ОписаниеНавигационногоЭлемента.Вставить("ИндексНачальногоЗначения", 0); + СписокПериодов[0].Значение = ОписаниеНавигационногоЭлемента; + + ОписаниеНавигационногоЭлемента = Новый Структура; + ОписаниеНавигационногоЭлемента.Вставить("НачалоПериода", СписокПериодов[8].Значение); + ОписаниеНавигационногоЭлемента.Вставить("Вариант", Неопределено); + ОписаниеНавигационногоЭлемента.Вставить("ИндексНачальногоЗначения", 8); + СписокПериодов[8].Значение = ОписаниеНавигационногоЭлемента; + + Если Не ПараметрыВыбора.Свойство("ВариантСтандартногоПериодаПоВиду") Тогда + ПараметрыВыбора.Вставить("ВариантСтандартногоПериодаПоВиду", ВариантСтандартногоПериодаПоВиду(ПараметрыВыбора.ВидПериода)); + КонецЕсли; + + ОписаниеНавигационногоЭлемента = Новый Структура; + ОписаниеНавигационногоЭлемента.Вставить("НачалоПериода", ПараметрыВыбора.НачалоПериода); + ОписаниеНавигационногоЭлемента.Вставить("Вариант", ПараметрыВыбора.ВариантСтандартногоПериодаПоВиду); + ОписаниеНавигационногоЭлемента.Вставить("ИндексНачальногоЗначения", Неопределено); + СписокПериодов.Добавить(ОписаниеНавигационногоЭлемента, НСтр("ru = 'Относительный...'")); + + Иначе + + СписокПериодов = ФункцииОтчетовКлиентСервер.СписокВычисляемыхПериодов(ПараметрыВыбора.ВидПериода); + + Если ИндексНачальногоЗначения = Неопределено Тогда + ИндексНачальногоЗначения = СписокПериодов.НайтиПоЗначению(ПараметрыВыбора.Вариант); + КонецЕсли; + + ОписаниеНавигационногоЭлемента = Новый Структура; + ОписаниеНавигационногоЭлемента.Вставить("НачалоПериода", ПараметрыВыбора.НачалоПериода); + ОписаниеНавигационногоЭлемента.Вставить("Вариант", Неопределено); + ОписаниеНавигационногоЭлемента.Вставить("ИндексНачальногоЗначения", Неопределено); + СписокПериодов.Добавить(ОписаниеНавигационногоЭлемента, НСтр("ru = 'Фиксированный...'")); + + КонецЕсли; + Если ИндексНачальногоЗначения = Неопределено Тогда ИндексНачальногоЗначения = СписокПериодов.Количество() - 1; КонецЕсли; - РезультатВыбора = ВыбратьИзСписка(СписокПериодов, Элемент, ИндексНачальногоЗначения); - Если РезультатВыбора = Неопределено Тогда - Возврат Неопределено; - ИначеЕсли ТипЗнч(РезультатВыбора.Значение) = Тип("ВариантСтандартногоПериода") Тогда - Возврат РезультатВыбора; - ИначеЕсли РезультатВыбора.Значение = "ВыборАвтоматическиВычисляемогоПериода" Тогда - ВариантКопия = ВариантСтандартногоПериодаПоВиду(ВидПериода); - Возврат ВыбратьПериодИзВыпадающегоСписка(Элемент, ВидПериода, НачалоПериода, ВариантКопия, Неопределено); - ИначеЕсли РезультатВыбора.Значение = "ВыборФиксированногоПериода" Тогда - Возврат ВыбратьПериодИзВыпадающегоСписка(Элемент, ВидПериода, НачалоПериода, Неопределено, Неопределено); + ПеременныеКлиента.Вставить("ВыборПериодаИзВыпадающегоСписка", Новый Структура); + ПеременныеКлиента.ВыборПериодаИзВыпадающегоСписка.Вставить("ПараметрыВыбора", ПараметрыВыбора); + ПеременныеКлиента.ВыборПериодаИзВыпадающегоСписка.Вставить("СписокПериодов", СписокПериодов); + ПеременныеКлиента.ВыборПериодаИзВыпадающегоСписка.Вставить("ИндексНачальногоЗначения", ИндексНачальногоЗначения); + Если Результат = -1 Тогда + НачатьВыборПериодаИзВыпадающегоСписка(); + Иначе + ПодключитьОбработчикОжидания("НачатьВыборПериодаИзВыпадающегоСписка", 0.1, Истина); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НачатьВыборПериодаИзВыпадающегоСписка() + Если ПеременныеКлиента.Свойство("ВыборПериодаИзВыпадающегоСписка") Тогда + Контекст = ПеременныеКлиента.ВыборПериодаИзВыпадающегоСписка; + ПеременныеКлиента.Удалить("ВыборПериодаИзВыпадающегоСписка"); + Обработчик = Новый ОписаниеОповещения("ВыборПериодаИзВыпадающегоСписка", ЭтотОбъект, Контекст.ПараметрыВыбора); + ПоказатьВыборИзСписка(Обработчик, Контекст.СписокПериодов, Контекст.ПараметрыВыбора.Элемент, Контекст.ИндексНачальногоЗначения); + КонецЕслИ; +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьРезультатВыбораПериодаИзВыпадающегоСписка(Результат, ПараметрыВыбора) + Значение = ПараметрыВыбора.Значение; + + // Запись результата выбора в данные формы и пользовательские настройки КД. + Если ТипЗнч(Результат.Значение) = Тип("ВариантСтандартногоПериода") Тогда + ЭтотОбъект[ПараметрыВыбора.ПериодПредставлениеИмя] = ?(ПустаяСтрока(Результат.Представление), Строка(Результат.Значение), Результат.Представление); + Значение.Вариант = Результат.Значение; + Иначе + НачалоПериода = ФункцииОтчетовКлиентСервер.НачалоПериодаОтчета(ПараметрыВыбора.ВидПериода, Результат.Значение); + КонецПериода = ФункцииОтчетовКлиентСервер.КонецПериодаОтчета(ПараметрыВыбора.ВидПериода, Результат.Значение); + + ЭтотОбъект[ПараметрыВыбора.ПериодПредставлениеИмя] = Результат.Представление; + + Значение.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод; + Значение.ДатаНачала = НачалоПериода; + Значение.ДатаОкончания = КонецПериода; КонецЕсли; - // Листание вверх-вниз. - Индекс = СписокПериодов.Индекс(РезультатВыбора); - Если Индекс = 0 Или Индекс = СписокПериодов.Количество() - 2 Тогда - Возврат ВыбратьПериодИзВыпадающегоСписка(Элемент, ВидПериода, РезультатВыбора.Значение, Вариант, Индекс); + ЭтотОбъект[ПараметрыВыбора.ПериодЗначениеИмя] = Значение; + + ПользовательскаяНастройкаКД = НайтиПользовательскуюНастройкуЭлемента(ПараметрыВыбора.ИдентификаторЭлемента); + Если ПараметрыВыбора.ЭтоПараметр Тогда + ПользовательскаяНастройкаКД.Значение = Значение; + Иначе + ПользовательскаяНастройкаКД.ПравоеЗначение = Значение; КонецЕсли; - Возврат РезультатВыбора; + Если Элементы.Найти(ПараметрыВыбора.ИспользованиеИмя) <> Неопределено Тогда + ЭтотОбъект[ПараметрыВыбора.ИспользованиеИмя] = Истина; + ПользовательскаяНастройкаКД.Использование = Истина; + КонецЕсли; -КонецФункции +КонецПроцедуры &НаКлиенте Функция ВариантСтандартногоПериодаПоВиду(ВидПериода) @@ -1106,7 +1018,7 @@ Возврат; КонецЕсли; - Таблица = ЭтаФорма[ТаблицаИмя]; + Таблица = ЭтотОбъект[ТаблицаИмя]; ИндексСтрокиТаблицы = Таблица.Индекс(СтрокаТаблицы); Если ИндексСтрокиТаблицы + Направление < 0 ИЛИ ИндексСтрокиТаблицы + Направление >= Таблица.Количество() Тогда Возврат; @@ -1186,26 +1098,6 @@ КонецЕсли; КонецПроцедуры -&НаКлиенте -Процедура Подключаемый_ПереключитьСтраницу() - // Подключается из Подключаемый_СтандартныйПериод_Значение_ОбработкаВыбора. - - Если ТипЗнч(ПеременныеКлиента) = Тип("Структура") - И ПеременныеКлиента.Свойство("ИмяГруппыСтраниц") - И ПеременныеКлиента.Свойство("ИмяТекущейСтраницы") Тогда - Элементы[ПеременныеКлиента.ИмяГруппыСтраниц].ТекущаяСтраница = Элементы[ПеременныеКлиента.ИмяТекущейСтраницы]; - ПеременныеКлиента.Удалить("ИмяГруппыСтраниц"); - ПеременныеКлиента.Удалить("ИмяТекущейСтраницы"); - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция ВычислитьСуммуСервер(Знач ОтчетТабличныйДокумент, Знач ВыделенныеОбласти) - Сумма = РассчитатьСуммуВыделенныхЯчеек(ОтчетТабличныйДокумент, ВыделенныеОбласти); - Возврат Формат(Сумма, "ЧН=0"); -КонецФункции - &НаКлиенте Процедура Подключаемый_РассчитатьСуммуЯчеек() Сумма = РассчитатьСуммуВыделенныхЯчеек(ОтчетТабличныйДокумент, Неопределено); @@ -1230,6 +1122,105 @@ Возврат Результат; КонецФункции +&НаКлиенте +Процедура ОтправитьПоЭлектроннойПочтеЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + СформироватьНепосредственно(); + ПоказатьДиалогОтправкиПоЭлектроннойПочте(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДиалогОтправкиПоЭлектроннойПочте() + ТабличныеДокументы = Новый СписокЗначений; + ТабличныеДокументы.Добавить(ЭтотОбъект.ОтчетТабличныйДокумент, ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта); + + ФормаЗаголовок = СтрЗаменить(НСтр("ru = 'Отправка отчета ""%1"" по почте'"), "%1", ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТабличныеДокументы", ТабличныеДокументы); + ПараметрыФормы.Вставить("Тема", ЭтотОбъект.ОтчетНаименованиеТекущегоВарианта); + ПараметрыФормы.Вставить("Заголовок", ФормаЗаголовок); + + ОткрытьФорму("ОбщаяФорма.ОтправкаТабличныхДокументовПоПочте", ПараметрыФормы, , ); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДиалогПодбораДляСпискаПослеВыбораТипа(ВыбранныйЭлемент, ПараметрыЭлемента) Экспорт + Если ВыбранныйЭлемент <> Неопределено Тогда + ПараметрыЭлемента.ВыбранныйТип = ВыбранныйЭлемент.Значение; + ПоказатьДиалогПодбораДляСписка(ПараметрыЭлемента); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьДиалогПодбораДляСписка(ПараметрыЭлемента) + КолонкаЗначениеЭлемент = ПараметрыЭлемента.КолонкаЗначениеЭлемент; + + // Полное имя формы выбора. + // Свойство "ФормаВыбора" недоступно на клиенте даже для чтения, + // поэтому для хранения предустановленных имен форм выбора используется коллекция БыстрыйПоискИменОбъектовМетаданных. + ПутьКФорме = БыстрыйПоискИменОбъектовМетаданных.Получить(ПараметрыЭлемента.ИдентификаторЭлемента); + Если Не ЗначениеЗаполнено(ПутьКФорме) Тогда + ИмяОбъектаМетаданных = БыстрыйПоискИменОбъектовМетаданных.Получить(ПараметрыЭлемента.ВыбранныйТип); + Если ПараметрыЭлемента.ВыборТолькоГрупп Тогда + ВидОбъектаМетаданных = ВРег(Лев(ИмяОбъектаМетаданных, Найти(ИмяОбъектаМетаданных, ".")-1)); + Если ВидОбъектаМетаданных = "СПРАВОЧНИК" Или ВидОбъектаМетаданных = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда + ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбораГруппы"; + Иначе + ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; + КонецЕсли; + Иначе + ПутьКФорме = ИмяОбъектаМетаданных + ".ФормаВыбора"; + КонецЕсли; + КонецЕсли; + + ВыборГруппИЭлементов = ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуИспользованиеГруппИЭлементов(КолонкаЗначениеЭлемент.ВыборГруппИЭлементов); + + ПараметрыФормыВыбора = Новый Структура; + // Стандартные параметры формы. + ПараметрыФормыВыбора.Вставить("ЗакрыватьПриВыборе", Ложь); + ПараметрыФормыВыбора.Вставить("ЗакрыватьПриЗакрытииВладельца", Истина); + ПараметрыФормыВыбора.Вставить("Отбор", Новый Структура); + // Стандартные параметры формы выбора (см. Расширение управляемой формы для динамического списка). + ПараметрыФормыВыбора.Вставить("ВыборГруппИЭлементов", ВыборГруппИЭлементов); + ПараметрыФормыВыбора.Вставить("МножественныйВыбор", Истина); + ПараметрыФормыВыбора.Вставить("РежимВыбора", Истина); + // Предполагаемые реквизиты. + ПараметрыФормыВыбора.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); + ПараметрыФормыВыбора.Вставить("РазрешитьНачалоПеретаскивания", Ложь); + + // Добавление фиксированных параметров выбора. + Для Каждого ПараметрВыбора Из КолонкаЗначениеЭлемент.ПараметрыВыбора Цикл + Если ПустаяСтрока(ПараметрВыбора.Имя) Тогда + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ПараметрВыбора.Имя) Тогда + Если ВРег(Лев(ПараметрВыбора.Имя, 6)) = ВРег("Отбор.") Тогда + ПараметрыФормыВыбора.Отбор.Вставить(Сред(ПараметрВыбора.Имя, 7), ПараметрВыбора.Значение); + Иначе + ПараметрыФормыВыбора.Вставить(ПараметрВыбора.Имя, ПараметрВыбора.Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // Добавление динамических параметров выбора (от ведущих). + Для Каждого СвязьПараметраВыбора Из КолонкаЗначениеЭлемент.СвязиПараметровВыбора Цикл + Если ПустаяСтрока(СвязьПараметраВыбора.Имя) Тогда + Продолжить; + КонецЕсли; + ВедущийЗначение = ЭтотОбъект[СвязьПараметраВыбора.ПутьКДанным]; + Если ВРег(Лев(СвязьПараметраВыбора.Имя, 6)) = ВРег("Отбор.") Тогда + ПараметрыФормыВыбора.Отбор.Вставить(Сред(СвязьПараметраВыбора.Имя, 7), ВедущийЗначение); + Иначе + ПараметрыФормыВыбора.Вставить(СвязьПараметраВыбора.Имя, ВедущийЗначение); + КонецЕсли; + КонецЦикла; + + ОткрытьФорму(ПутьКФорме, ПараметрыФормыВыбора, ПараметрыЭлемента.ТаблицаЭлемент); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Клиент или сервер @@ -1311,7 +1302,8 @@ КонецЕсли; Если Ячейка.Видимость = Истина Тогда - Если Ячейка.СодержитЗначение И ТипЗнч(Ячейка.Значение) = Тип("Число") Тогда + Если Ячейка.ТипОбласти <> ТипОбластиЯчеекТабличногоДокумента.Колонки + И Ячейка.СодержитЗначение И ТипЗнч(Ячейка.Значение) = Тип("Число") Тогда Сумма = Сумма + Ячейка.Значение; ИначеЕсли ЗначениеЗаполнено(Ячейка.Текст) Тогда Сумма = Сумма + СтрокаВЧисло(Ячейка.Текст); @@ -1337,12 +1329,15 @@ КодСимвола = КодСимвола(ИсходнаяСтрока, НомерСимвола); Если КодСимвола = 32 Или КодСимвола = 160 Тогда // Пробел или неразрывный пробел. // Пропуск (действие не требуется). - ИначеЕсли КодСимвола = 45 Тогда // Минус + ИначеЕсли КодСимвола = 45 Тогда // Минус. Если Результат <> 0 Тогда Возврат 0; КонецЕсли; ЗнакОтрицательный = Истина; ИначеЕсли КодСимвола = 44 Или КодСимвола = 46 Тогда // Запятая или точка. + Если ЗнаковПослеЗапятой <> -1 Тогда + Возврат 0; // Разделитель уже был, следовательно это не число. + КонецЕсли; ЗнаковПослеЗапятой = 0; // Запуск отсчета знаков после запятой. ИначеЕсли КодСимвола > 47 И КодСимвола < 58 Тогда // Число. Если ЗнаковПослеЗапятой <> -1 Тогда @@ -1372,26 +1367,41 @@ Процедура ВидимостьДоступностьКорректность(Изменения = "") // Быстрые настройки Если Изменения = "" ИЛИ Изменения = "СкрытьПоказатьБыстрыеНастройки" Тогда - Элементы.КомандыВариантовПользовательскихНастроек.Видимость = Ложь; - Элементы.КомандыВариантовОтчета.Видимость = РежимВариантаОтчета И ВидимостьКомандВариантовОтчетов; - Элементы.БыстрыеНастройки.Видимость = РежимВариантаОтчета И НЕ РежимРасшифровки; + + // Вычисление параметров отображения. ПользовательскиеНастройкиКД = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки; - Если РежимВариантаОтчета И ПользовательскиеНастройкиКД.Элементы.Количество() > 0 Тогда - Элементы.КомандыВариантовПользовательскихНастроек.Видимость = ВидимостьКомандВариантовОтчетов; - Если Элементы.ГруппаСкрытьПоказатьБыстрыеНастройки.Видимость = Истина Тогда - ВидимостьБыстрыхНастроек = Неопределено; - ПользовательскиеНастройкиКД.ДополнительныеСвойства.Свойство("ВидимостьБыстрыхНастроек", ВидимостьБыстрыхНастроек); - Если ВидимостьБыстрыхНастроек <> Ложь Тогда - Элементы.БыстрыеНастройки.Видимость = Истина; - Элементы.СкрытьПоказатьБыстрыеНастройки.Пометка = Истина; - Команды.СкрытьПоказатьБыстрыеНастройки.Подсказка = НСтр("ru = 'Скрыть быстрые настройки'"); - Иначе - Элементы.БыстрыеНастройки.Видимость = Ложь; - Элементы.СкрытьПоказатьБыстрыеНастройки.Пометка = Ложь; - Команды.СкрытьПоказатьБыстрыеНастройки.Подсказка = НСтр("ru = 'Показать быстрые настройки'"); - КонецЕсли; + ПоказыватьКомандыВариантовОтчетов = РежимВариантаОтчета И ВидимостьКомандВариантовОтчетов; + ЕстьМедленныеНастройки = РежимВариантаОтчета И ПользовательскиеНастройкиКД.Элементы.Количество() > 0; + + Если ЕстьБыстрыеНастройки Тогда + ВидимостьБыстрыхНастроек = Неопределено; + ПользовательскиеНастройкиКД.ДополнительныеСвойства.Свойство("ВидимостьБыстрыхНастроек", ВидимостьБыстрыхНастроек); + Если ТипЗнч(ВидимостьБыстрыхНастроек) = Тип("Булево") Тогда + // Видимость определена пользователем. + ПоказыватьГруппуБыстрыхНастроек = ВидимостьБыстрыхНастроек; + Иначе + // По умолчанию: для отчета - Истина (Показывать), для расшифровки - Ложь (Не показывать). + ПоказыватьГруппуБыстрыхНастроек = Не РежимРасшифровки; КонецЕсли; + Иначе + // Нет быстрых настроек - нечего показывать. + ПоказыватьГруппуБыстрыхНастроек = Ложь; КонецЕсли; + + // Применение параметров отображения. + Элементы.НастроитьОтчет.Видимость = ЕстьМедленныеНастройки; + + Элементы.КомандыВариантовПользовательскихНастроек.Видимость = ПоказыватьКомандыВариантовОтчетов И ЕстьМедленныеНастройки; + + Элементы.СкрытьПоказатьБыстрыеНастройки.Видимость = ЕстьБыстрыеНастройки; + Элементы.СкрытьПоказатьБыстрыеНастройки.Пометка = ПоказыватьГруппуБыстрыхНастроек; + Элементы.БыстрыеНастройки.Видимость = ПоказыватьГруппуБыстрыхНастроек; + Если ПоказыватьГруппуБыстрыхНастроек Тогда + Команды.СкрытьПоказатьБыстрыеНастройки.Подсказка = НСтр("ru = 'Скрыть быстрые настройки'"); + Иначе + Команды.СкрытьПоказатьБыстрыеНастройки.Подсказка = НСтр("ru = 'Показать быстрые настройки'"); + КонецЕсли; + КонецЕсли; // Заголовок @@ -1493,16 +1503,6 @@ Элементы.Удалить(УдаляемыйЭлемент); КонецЦикла; - // Удаление реквизитов - УдаляемыеРеквизиты = Новый Массив; - НаборРеквизитов = ПолучитьРеквизиты(); - Для Каждого Реквизит Из НаборРеквизитов Цикл - Если ПостоянныеРеквизиты.НайтиПоЗначению(Реквизит.Имя) = Неопределено Тогда - УдаляемыеРеквизиты.Добавить(Реквизит.Имя); - КонецЕсли; - КонецЦикла; - ИзменитьРеквизиты(Новый Массив, УдаляемыеРеквизиты); - // Удаление команд УдаляемыеКоманды = Новый Массив; Для Каждого Команда Из Команды Цикл @@ -1525,14 +1525,14 @@ ВидимостьДоступностьКорректность(); // Вызов переопределяемого модуля - ФормаОтчетаПереопределяемый.ПослеЗаполненияПанелиБыстрыхНастроек(ЭтаФорма); + ФормаОтчетаПереопределяемый.ПослеЗаполненияПанелиБыстрыхНастроек(ЭтотОбъект); КонецПроцедуры &НаСервере Функция КонтекстныйВызовСервера(КлючОперации, ПараметрыОперации) РезультатВызова = Новый Структура; - ФормаОтчетаПереопределяемый.КонтекстныйВызовСервера(ЭтаФорма, КлючОперации, ПараметрыОперации, РезультатВызова); + ФормаОтчетаПереопределяемый.КонтекстныйВызовСервера(ЭтотОбъект, КлючОперации, ПараметрыОперации, РезультатВызова); Возврат РезультатВызова; КонецФункции @@ -1645,6 +1645,12 @@ ДлительныеОперации.ОтменитьВыполнениеЗадания(ФоновоеЗаданиеИдентификатор); КонецПроцедуры +&НаСервереБезКонтекста +Функция ВычислитьСуммуСервер(Знач ОтчетТабличныйДокумент, Знач ВыделенныеОбласти) + Сумма = РассчитатьСуммуВыделенныхЯчеек(ОтчетТабличныйДокумент, ВыделенныеОбласти); + Возврат Формат(Сумма, "ЧН=0"); +КонецФункции + &НаСервере Процедура ОбновитьСвязиВедущегоСПодчиненными(ИдентификаторЭлемента, Значение, Использование, ВсеСвязиВедущего, ЗначениеИзменено) @@ -1663,13 +1669,13 @@ ПодчиненныйЭлемент = Элементы[СтрокаСвязиОтбора.ПодчиненныйИмяЭлемента]; УстановитьСвязьПараметровВыбора(ПодчиненныйЭлемент, СтрокаСвязиОтбора, Использование); Если ЗначениеИзменено = Истина И СтрокаСвязиОтбора.Действие = РежимИзмененияСвязанногоЗначения.Очищать Тогда - Если ТипЗнч(ЭтаФорма[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита]) = Тип("СписокЗначений") Тогда - ЭтаФорма[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита].Очистить(); + Если ТипЗнч(ЭтотОбъект[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита]) = Тип("СписокЗначений") Тогда + ЭтотОбъект[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита].Очистить(); Иначе - ЭтаФорма[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита] = Неопределено; + ЭтотОбъект[СтрокаСвязиОтбора.ПодчиненныйИмяРеквизита] = Неопределено; КонецЕсли; Если Не ПустаяСтрока(СтрокаСвязиОтбора.ПодчиненныйИмяФлажка) Тогда - ЭтаФорма[СтрокаСвязиОтбора.ПодчиненныйИмяФлажка] = Ложь; + ЭтотОбъект[СтрокаСвязиОтбора.ПодчиненныйИмяФлажка] = Ложь; КонецЕсли; КонецЕсли; КонецЦикла; @@ -1687,12 +1693,14 @@ СоответствиеИменОбъектовМетаданных = Новый Соответствие; СоответствиеОтключаемыхСвязей = Новый Соответствие; + ЕстьБыстрыеНастройки = Ложь; + ДобавляемыеРеквизиты = Новый Массив; // Локальные переменные для установки значений и свойств после создания реквизитов. - ДобавленныеПоляВвода = Новый Структура; - ДобавленныеСпискиЗначений = Новый Массив; - ДобавленныеТаблицыСФлажками = Новый Массив; + ДобавленныеПоляВвода = Новый Структура; + ДобавленныеСпискиЗначений = Новый Массив; + ДобавленныеТаблицыСФлажками = Новый Массив; ДобавленныеСтандартныеПериоды = Новый Массив; // Структура связей. @@ -1708,825 +1716,847 @@ ПользовательскиеНастройкиКД = КомпоновщикНастроекКД.ПользовательскиеНастройки; НастройкиКД = КомпоновщикНастроекКД.ПолучитьНастройки(); - ПолеВводаВключатьКнопкуВыбора = Неопределено; - ТипНеопределено = Тип("Неопределено"); - ТипТип = Тип("Тип"); Режимы = РежимОтображенияЭлементаНастройкиКомпоновкиДанных; - Для Каждого ПользовательскаяНастройка Из ПользовательскиеНастройкиКД.Элементы Цикл - Если ПользовательскаяНастройка.РежимОтображения = Режимы.Недоступный ИЛИ ПользовательскаяНастройка.РежимОтображения = Режимы.Обычный Тогда - Продолжить; + + // Перебор коллекций пользовательских настроек. + // Отдельный цикл верхнего уровня нужен для поддержки сценария, + // когда коллекция отборов выведена в пользовательские настройки + // и можно добавлять новые отборы не меняя настроек варианта. + НаборыПользовательскихНастроек = Новый Массив; + НаборыПользовательскихНастроек.Добавить(ПользовательскиеНастройкиКД.Элементы); + Пока Истина Цикл + Если НаборыПользовательскихНастроек.Количество() = 0 Тогда + Прервать; КонецЕсли; + НаборПользовательскихНастроек = НаборыПользовательскихНастроек[0]; + НаборыПользовательскихНастроек.Удалить(0); + ЭтоНаборОтбора = (ТипЗнч(НаборПользовательскихНастроек) = Тип("КоллекцияЭлементовОтбораКомпоновкиДанных")); - ИдентификаторСКД = ПользовательскаяНастройка.ИдентификаторПользовательскойНастройки; - ИдентификаторЭлемента = ПривестиИдентификаторКИмени(ИдентификаторСКД); - - СоответствиеПользовательскихНастроек.Вставить(ИдентификаторЭлемента, ПользовательскиеНастройкиКД.ПолучитьИдентификаторПоОбъекту(ПользовательскаяНастройка)); - - ОбщаяНастройка = ФункцииОтчетовКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору(НастройкиКД, ИдентификаторСКД); - Если ОбщаяНастройка = Неопределено Тогда - Продолжить; - ИначеЕсли ПользовательскаяНастройка.РежимОтображения = Режимы.Авто И ОбщаяНастройка.РежимОтображения <> Режимы.БыстрыйДоступ Тогда - Продолжить; - КонецЕсли; - ТипОбщейНастройки = ТипЗнч(ОбщаяНастройка); - ДоступнаяНастройка = ФункцииОтчетовКлиентСервер.НайтиДоступнуюНастройку(НастройкиКД, ОбщаяНастройка); - - СтруктураПредставлений = Новый Структура("Представление, ПредставлениеПользовательскойНастройки", "", ""); - ЗаполнитьЗначенияСвойств(СтруктураПредставлений, ОбщаяНастройка); - Если ЗначениеЗаполнено(СтруктураПредставлений.ПредставлениеПользовательскойНастройки) Тогда - ЭлементЗаголовок = СтруктураПредставлений.ПредставлениеПользовательскойНастройки; - ИначеЕсли ЗначениеЗаполнено(СтруктураПредставлений.Представление) Тогда - ЭлементЗаголовок = СтруктураПредставлений.Представление; - ИначеЕсли ДоступнаяНастройка <> Неопределено И ЗначениеЗаполнено(ДоступнаяНастройка.Заголовок) Тогда - ЭлементЗаголовок = ДоступнаяНастройка.Заголовок; - Иначе - ЭлементЗаголовок = ПредставлениеПользовательскойНастройки(ПользовательскаяНастройка, ОбщаяНастройка, ТипОбщейНастройки); - КонецЕсли; - - СменитьТипНаГруппуЭлементовОтбора = ЗначениеЗаполнено(СтруктураПредставлений.Представление); - - Если ТипОбщейНастройки = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") - ИЛИ ТипОбщейНастройки = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") - ИЛИ СменитьТипНаГруппуЭлементовОтбора Тогда + // Перебор пользовательских настроек. + Для Каждого ПользовательскаяНастройка Из НаборПользовательскихНастроек Цикл - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); - ШаблонГенерации.Вставить("Префикс", "ГруппаОтбора"); - - ИначеЕсли ТипОбщейНастройки = Тип("ГруппировкаКомпоновкиДанных") - ИЛИ ТипОбщейНастройки = Тип("ТаблицаКомпоновкиДанных") - ИЛИ ТипОбщейНастройки = Тип("ГруппировкаТаблицыКомпоновкиДанных") - ИЛИ ТипОбщейНастройки = Тип("ДиаграммаКомпоновкиДанных") - ИЛИ ТипОбщейНастройки = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); - ШаблонГенерации.Вставить("Префикс", "ЭлементСтруктуры"); - - ИначеЕсли ТипОбщейНастройки = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); - ШаблонГенерации.Вставить("Префикс", "УсловноеОформление"); - - ИначеЕсли ТипОбщейНастройки = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); - ШаблонГенерации.Вставить("Префикс", "ВыбранныеПоляКомпоновкиДанных"); - ШаблонГенерации.Вставить("Иерархия", Истина); - - ИначеЕсли ТипОбщейНастройки = Тип("ПорядокКомпоновкиДанных") Тогда - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); - ШаблонГенерации.Вставить("Префикс", "ПорядокКомпоновкиДанных"); - ШаблонГенерации.Вставить("Иерархия", Ложь); - - ИначеЕсли ТипОбщейНастройки = Тип("СтруктураНастроекКомпоновкиДанных") Тогда - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); - ШаблонГенерации.Вставить("Префикс", "СтруктураНастроекКомпоновкиДанных"); - ШаблонГенерации.Вставить("Иерархия", Ложь); - - ИначеЕсли ТипОбщейНастройки = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - - Если ДоступнаяНастройка = Неопределено Тогда - Продолжить; // Имя параметра изменилось или параметр был удален. + Если ПользовательскаяНастройка.РежимОтображения = Режимы.Недоступный + Или ПользовательскаяНастройка.РежимОтображения = Режимы.Обычный Тогда + Продолжить; КонецЕсли; - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Префикс", "Параметр"); + ИдентификаторСКД = ПользовательскаяНастройка.ИдентификаторПользовательскойНастройки; + ИдентификаторЭлемента = ПривестиИдентификаторКИмени(ИдентификаторСКД); - АнализТиповИСвязей(ИдентификаторЭлемента, ДоступнаяНастройка, ШаблонГенерации, СоответствиеИменОбъектовМетаданных, Связи); // Определение типа значения настройки. + СоответствиеПользовательскихНастроек.Вставить(ИдентификаторЭлемента, ПользовательскиеНастройкиКД.ПолучитьИдентификаторПоОбъекту(ПользовательскаяНастройка)); - ШаблонГенерации.Вставить("ФлажокИспользование", ДоступнаяНастройка.Использование <> ИспользованиеПараметраКомпоновкиДанных.Всегда); - Если ТипЗнч(ПользовательскаяНастройка.Значение) = Тип("СтандартныйПериод") Тогда - ШаблонГенерации.Вставить("Тип", "СтандартныйПериод"); - ИначеЕсли ДоступнаяНастройка.ДоступенСписокЗначений Тогда - ШаблонГенерации.Вставить("Тип", "СписокСПодбором"); - НастройкиСВидомСравненияРавно.Вставить(ИдентификаторЭлемента, Истина); - ИначеЕсли Не ШаблонГенерации.ФлажокИспользование И ШаблонГенерации.СодержитТипБулево И ШаблонГенерации.КоличествоТипов = 1 Тогда - ШаблонГенерации.Вставить("Тип", "ТолькоФлажокЗначения"); // Замена поля "Да/Нет" на флажок. + Если ЭтоНаборОтбора Тогда + ОбщаяНастройка = ПользовательскаяНастройка; Иначе - ШаблонГенерации.Вставить("Тип", "ПолеВвода"); - НастройкиСВидомСравненияРавно.Вставить(ИдентификаторЭлемента, Истина); - КонецЕсли; - - Если ТипЗнч(ДоступнаяНастройка.ДоступныеЗначения) = Тип("СписокЗначений") И ДоступнаяНастройка.ДоступныеЗначения.Количество() > 0 Тогда - ШаблонГенерации.Вставить("ВыборИзСписка", Истина); - Иначе - ШаблонГенерации.Вставить("ВыборИзСписка", Ложь); - КонецЕсли; - - Если Не ШаблонГенерации.ФлажокИспользование Тогда - ПользовательскаяНастройка.Использование = Истина; - КонецЕсли; - - ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных." + Строка(ОбщаяНастройка.Параметр)); - ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Вставить(ПолеКД, ИдентификаторЭлемента); - - ИначеЕсли ТипОбщейНастройки = Тип("ЭлементОтбораКомпоновкиДанных") Тогда - - Если ДоступнаяНастройка = Неопределено Тогда - Продолжить; // Имя поля изменилось или поле было удалено. - КонецЕсли; - - ШаблонГенерации = Новый Структура; - ШаблонГенерации.Вставить("Префикс", "Отбор"); - ШаблонГенерации.Вставить("ФлажокИспользование", Истина); - - АнализТиповИСвязей(ИдентификаторЭлемента, ДоступнаяНастройка, ШаблонГенерации, СоответствиеИменОбъектовМетаданных, Связи); // Определение типа значения настройки. - - Если ТипЗнч(ПользовательскаяНастройка.ПравоеЗначение) = Тип("СтандартныйПериод") Тогда - ШаблонГенерации.Вставить("Тип", "СтандартныйПериод"); - ИначеЕсли ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено Тогда - ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); - ЭлементЗаголовок = ЭлементЗаголовок + ": " + НРег(Строка(ПользовательскаяНастройка.ВидСравнения)); - ИначеЕсли ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда - ШаблонГенерации.Вставить("Тип", "СписокСПодбором"); - Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда - ЭлементЗаголовок = ЭлементЗаголовок + " (" + НСтр("ru = 'за исключением выбранных'") + ")"; + ОбщаяНастройка = ФункцииОтчетовКлиентСервер.ПолучитьОбъектПоПользовательскомуИдентификатору(НастройкиКД, ИдентификаторСКД); + Если ОбщаяНастройка = Неопределено Тогда + Продолжить; + ИначеЕсли ПользовательскаяНастройка.РежимОтображения = Режимы.Авто + И ОбщаяНастройка.РежимОтображения <> Режимы.БыстрыйДоступ Тогда + Продолжить; КонецЕсли; - ШаблонГенерации.Вставить("ВыборГруппИЭлементов", ГруппыИЭлементы.ГруппыИЭлементы); + КонецЕсли; + + ТипОбщейНастройки = ТипЗнч(ОбщаяНастройка); + ДоступнаяНастройка = ФункцииОтчетовКлиентСервер.НайтиДоступнуюНастройку(НастройкиКД, ОбщаяНастройка); + + СтруктураПредставлений = Новый Структура("Представление, ПредставлениеПользовательскойНастройки", "", ""); + ЗаполнитьЗначенияСвойств(СтруктураПредставлений, ОбщаяНастройка); + Если ЗначениеЗаполнено(СтруктураПредставлений.ПредставлениеПользовательскойНастройки) Тогда + ЭлементЗаголовок = СтруктураПредставлений.ПредставлениеПользовательскойНастройки; + ИначеЕсли ЗначениеЗаполнено(СтруктураПредставлений.Представление) Тогда + ЭлементЗаголовок = СтруктураПредставлений.Представление; + ИначеЕсли ДоступнаяНастройка <> Неопределено И ЗначениеЗаполнено(ДоступнаяНастройка.Заголовок) Тогда + ЭлементЗаголовок = ДоступнаяНастройка.Заголовок; Иначе - ШаблонГенерации.Вставить("Тип", "ПолеВвода"); - Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда + ЭлементЗаголовок = ПредставлениеПользовательскойНастройки(ПользовательскаяНастройка, ОбщаяНастройка, ТипОбщейНастройки); + КонецЕсли; + + СменитьТипНаГруппуЭлементовОтбора = ЗначениеЗаполнено(СтруктураПредставлений.Представление); + + Если ТипОбщейНастройки = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") + ИЛИ ТипОбщейНастройки = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") + ИЛИ СменитьТипНаГруппуЭлементовОтбора Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); + ШаблонГенерации.Вставить("Префикс", "ГруппаОтбора"); + + ИначеЕсли ТипОбщейНастройки = Тип("ГруппировкаКомпоновкиДанных") + ИЛИ ТипОбщейНастройки = Тип("ТаблицаКомпоновкиДанных") + ИЛИ ТипОбщейНастройки = Тип("ГруппировкаТаблицыКомпоновкиДанных") + ИЛИ ТипОбщейНастройки = Тип("ДиаграммаКомпоновкиДанных") + ИЛИ ТипОбщейНастройки = Тип("ГруппировкаДиаграммыКомпоновкиДанных") Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); + ШаблонГенерации.Вставить("Префикс", "ЭлементСтруктуры"); + + ИначеЕсли ТипОбщейНастройки = Тип("ЭлементУсловногоОформленияКомпоновкиДанных") Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); + ШаблонГенерации.Вставить("Префикс", "УсловноеОформление"); + + ИначеЕсли ТипОбщейНастройки = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); + ШаблонГенерации.Вставить("Префикс", "ВыбранныеПоляКомпоновкиДанных"); + ШаблонГенерации.Вставить("Иерархия", Истина); + + ИначеЕсли ТипОбщейНастройки = Тип("ПорядокКомпоновкиДанных") Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); + ШаблонГенерации.Вставить("Префикс", "ПорядокКомпоновкиДанных"); + ШаблонГенерации.Вставить("Иерархия", Ложь); + + ИначеЕсли ТипОбщейНастройки = Тип("СтруктураНастроекКомпоновкиДанных") Тогда + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Тип", "ТаблицаПорядкаСФлажками"); + ШаблонГенерации.Вставить("Префикс", "СтруктураНастроекКомпоновкиДанных"); + ШаблонГенерации.Вставить("Иерархия", Ложь); + + ИначеЕсли ТипОбщейНастройки = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + + Если ДоступнаяНастройка = Неопределено Тогда + Продолжить; // Имя параметра изменилось или параметр был удален. + КонецЕсли; + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Префикс", "Параметр"); + + АнализТиповИСвязей(ИдентификаторЭлемента, ДоступнаяНастройка, ШаблонГенерации, СоответствиеИменОбъектовМетаданных, Связи); // Определение типа значения настройки. + + ШаблонГенерации.Вставить("ФлажокИспользование", ДоступнаяНастройка.Использование <> ИспользованиеПараметраКомпоновкиДанных.Всегда); + Если ТипЗнч(ПользовательскаяНастройка.Значение) = Тип("СтандартныйПериод") Тогда + ШаблонГенерации.Вставить("Тип", "СтандартныйПериод"); + ИначеЕсли ДоступнаяНастройка.ДоступенСписокЗначений Тогда + ШаблонГенерации.Вставить("Тип", "СписокСПодбором"); + НастройкиСВидомСравненияРавно.Вставить(ИдентификаторЭлемента, Истина); + ИначеЕсли Не ШаблонГенерации.ФлажокИспользование И ШаблонГенерации.СодержитТипБулево И ШаблонГенерации.КоличествоТипов = 1 Тогда + ШаблонГенерации.Вставить("Тип", "ТолькоФлажокЗначения"); // Замена поля "Да/Нет" на флажок. + Иначе + ШаблонГенерации.Вставить("Тип", "ПолеВвода"); НастройкиСВидомСравненияРавно.Вставить(ИдентификаторЭлемента, Истина); КонецЕсли; - Если ПользовательскаяНастройка.ВидСравнения <> ВидСравненияКомпоновкиДанных.Равно - И ПользовательскаяНастройка.ВидСравнения <> ВидСравненияКомпоновкиДанных.Содержит Тогда - ЭлементЗаголовок = ЭлементЗаголовок + " (" + НРег(Строка(ПользовательскаяНастройка.ВидСравнения)) + ")"; + + Если ТипЗнч(ДоступнаяНастройка.ДоступныеЗначения) = Тип("СписокЗначений") И ДоступнаяНастройка.ДоступныеЗначения.Количество() > 0 Тогда + ШаблонГенерации.Вставить("ВыборИзСписка", Истина); + Иначе + ШаблонГенерации.Вставить("ВыборИзСписка", Ложь); КонецЕсли; - Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии - Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда - ШаблонГенерации.Вставить("ВыборГруппИЭлементов", ГруппыИЭлементы.Группы); + + Если Не ШаблонГенерации.ФлажокИспользование Тогда + ПользовательскаяНастройка.Использование = Истина; КонецЕсли; - КонецЕсли; - - ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Вставить(ОбщаяНастройка.ЛевоеЗначение, ИдентификаторЭлемента); - - Если ТипЗнч(ДоступнаяНастройка.ДоступныеЗначения) = Тип("СписокЗначений") И ДоступнаяНастройка.ДоступныеЗначения.Количество() > 0 Тогда - ШаблонГенерации.Вставить("ВыборИзСписка", Истина); - Иначе - ШаблонГенерации.Вставить("ВыборИзСписка", Ложь); - КонецЕсли; - Иначе - - Продолжить; - - КонецЕсли; - - //////////////////////////////////////////////////////////////////////////////// - // Генерация - // - Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Или ШаблонГенерации.Тип = "ТолькоФлажокЗначения" Тогда - - Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Тогда - ФлажокИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; - ДействиеПриИзменении = "Подключаемый_ФлажокИспользование_ПриИзменении"; - Иначе - ФлажокИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; - ДействиеПриИзменении = "Подключаемый_ПолеВвода_ПриИзменении"; - КонецЕсли; - - // Реквизиты. - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ФлажокИмя, Новый ОписаниеТипов("Булево"))); - - // Флажок. - ИспользованиеОтбора = Элементы.Добавить(ФлажокИмя, Тип("ПолеФормы"), Элементы.ПараметрыИОтборы); - ИспользованиеОтбора.Вид = ВидПоляФормы.ПолеФлажка; - ИспользованиеОтбора.Заголовок = ЭлементЗаголовок; - ИспользованиеОтбора.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; - ИспользованиеОтбора.УстановитьДействие("ПриИзменении", ДействиеПриИзменении); - - // Значения. - Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Тогда - ДобавленныеПоляВвода.Вставить(ФлажокИмя, ПользовательскаяНастройка.Использование); - Иначе - ДобавленныеПоляВвода.Вставить(ФлажокИмя, ПользовательскаяНастройка.Значение); - КонецЕсли; - - ИначеЕсли ШаблонГенерации.Тип = "СтандартныйПериод" Тогда - - ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; - ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; - ВидПериодаИмя = ШаблонГенерации.Префикс + "_Вид_" + ИдентификаторЭлемента; - ПериодЗначениеИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; - ПериодПредставлениеИмя = ШаблонГенерации.Префикс + "_Представление_" + ИдентификаторЭлемента; - ПериодНачалоИмя = ШаблонГенерации.Префикс + "_Начало_" + ИдентификаторЭлемента; - ПериодОкончаниеИмя = ШаблонГенерации.Префикс + "_Окончание_" + ИдентификаторЭлемента; - СтраницыИмя = ШаблонГенерации.Префикс + "_Страницы_" + ИдентификаторЭлемента; - СтраницаСтандартныйИмя = ШаблонГенерации.Префикс + "_СтраницаСтандартный_" + ИдентификаторЭлемента; - СтраницаПроизвольныйИмя = ШаблонГенерации.Префикс + "_СтраницаПроизвольный_" + ИдентификаторЭлемента; - - // Реквизиты - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ВидПериодаИмя, Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"))); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ПериодПредставлениеИмя, Новый ОписаниеТипов("Строка"))); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ПериодЗначениеИмя, Новый ОписаниеТипов("СтандартныйПериод"))); - - // Основная Группа - ГруппаСтрок = ?(ШаблонГенерации.Префикс = "Параметр", Элементы.Периоды, Элементы.ПараметрыИОтборы); - Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), ГруппаСтрок); - Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; - Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; - Группа.Отображение = ОтображениеОбычнойГруппы.Нет; - Группа.ОтображатьЗаголовок = Ложь; - Группа.Заголовок = ЭлементЗаголовок; - - Если ШаблонГенерации.ФлажокИспользование Тогда - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + ПолеКД = Новый ПолеКомпоновкиДанных("ПараметрыДанных." + Строка(ОбщаяНастройка.Параметр)); + ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Вставить(ПолеКД, ИдентификаторЭлемента); - // Флажок - ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), Группа); - ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; - ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; - ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); - ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; + ИначеЕсли ТипОбщейНастройки = Тип("ЭлементОтбораКомпоновкиДанных") Тогда - // Значение флажка. - ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + Если ДоступнаяНастройка = Неопределено Тогда + Продолжить; // Имя поля изменилось или поле было удалено. + КонецЕсли; + + ШаблонГенерации = Новый Структура; + ШаблонГенерации.Вставить("Префикс", "Отбор"); + ШаблонГенерации.Вставить("ФлажокИспользование", Истина); + + АнализТиповИСвязей(ИдентификаторЭлемента, ДоступнаяНастройка, ШаблонГенерации, СоответствиеИменОбъектовМетаданных, Связи); // Определение типа значения настройки. + + Если ТипЗнч(ПользовательскаяНастройка.ПравоеЗначение) = Тип("СтандартныйПериод") Тогда + ШаблонГенерации.Вставить("Тип", "СтандартныйПериод"); + ИначеЕсли ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.Заполнено + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено Тогда + ШаблонГенерации.Вставить("Тип", "ТолькоФлажокИспользование"); + ЭлементЗаголовок = ЭлементЗаголовок + ": " + НРег(Строка(ПользовательскаяНастройка.ВидСравнения)); + ИначеЕсли ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда + ШаблонГенерации.Вставить("Тип", "СписокСПодбором"); + Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСпискеПоИерархии Тогда + ЭлементЗаголовок = ЭлементЗаголовок + " (" + НСтр("ru = 'за исключением выбранных'") + ")"; + КонецЕсли; + ШаблонГенерации.Вставить("ВыборГруппИЭлементов", ГруппыИЭлементы.ГруппыИЭлементы); + Иначе + ШаблонГенерации.Вставить("Тип", "ПолеВвода"); + Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда + НастройкиСВидомСравненияРавно.Вставить(ИдентификаторЭлемента, Истина); + КонецЕсли; + Если ПользовательскаяНастройка.ВидСравнения <> ВидСравненияКомпоновкиДанных.Равно + И ПользовательскаяНастройка.ВидСравнения <> ВидСравненияКомпоновкиДанных.Содержит Тогда + ЭлементЗаголовок = ЭлементЗаголовок + " (" + НРег(Строка(ПользовательскаяНастройка.ВидСравнения)) + ")"; + КонецЕсли; + Если ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии + Или ПользовательскаяНастройка.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВИерархии Тогда + ШаблонГенерации.Вставить("ВыборГруппИЭлементов", ГруппыИЭлементы.Группы); + КонецЕсли; + КонецЕсли; + + ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Вставить(ОбщаяНастройка.ЛевоеЗначение, ИдентификаторЭлемента); + + Если ТипЗнч(ДоступнаяНастройка.ДоступныеЗначения) = Тип("СписокЗначений") И ДоступнаяНастройка.ДоступныеЗначения.Количество() > 0 Тогда + ШаблонГенерации.Вставить("ВыборИзСписка", Истина); + Иначе + ШаблонГенерации.Вставить("ВыборИзСписка", Ложь); + КонецЕсли; + + ИначеЕсли ТипОбщейНастройки = Тип("ОтборКомпоновкиДанных") Тогда + + НаборыПользовательскихНастроек.Добавить(ПользовательскаяНастройка.Элементы); + Продолжить; + + Иначе + + Продолжить; КонецЕсли; - // Вид периода - Элемент. - ВидПериодаЭлемент = Элементы.Добавить(ВидПериодаИмя, Тип("ПолеФормы"), Группа); - ВидПериодаЭлемент.Вид = ВидПоляФормы.ПолеВвода; - ВидПериодаЭлемент.Заголовок = ЭлементЗаголовок; - ВидПериодаЭлемент.РежимВыбораИзСписка = Истина; - ВидПериодаЭлемент.РастягиватьПоГоризонтали = Ложь; - ВидПериодаЭлемент.Ширина = 12; - ВидПериодаЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_Вид_ПриИзменении"); + ЕстьБыстрыеНастройки = Истина; - Если ШаблонГенерации.ФлажокИспользование Тогда - ВидПериодаЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - Иначе - ВидПериодаЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево; - КонецЕсли; - - // Вид периода - Список выбора. - Если ШаблонГенерации.Префикс = "Параметр" Тогда - МинимальнаяПериодичность = НастройкиОтчета.СоответствиеПериодичностиПараметров[ОбщаяНастройка.Параметр]; - Иначе - МинимальнаяПериодичность = НастройкиОтчета.СоответствиеПериодичностиПараметров[ОбщаяНастройка.ЛевоеЗначение]; - КонецЕсли; - Если МинимальнаяПериодичность = Неопределено Тогда - МинимальнаяПериодичность = Перечисления.ДоступныеПериодыОтчета.День; - КонецЕсли; - - ДоступныеПериоды = ФункцииОтчетовКлиентСервер.ПолучитьСписокДоступныхПериодов(); - Для Индекс = ДоступныеПериоды.Найти(МинимальнаяПериодичность) По ДоступныеПериоды.ВГраница() Цикл - ВидПериодаЭлемент.СписокВыбора.Добавить(ДоступныеПериоды[Индекс]); - КонецЦикла; - - // Страницы. - ГруппаСтраниц = Элементы.Добавить(СтраницыИмя, Тип("ГруппаФормы"), Группа); - ГруппаСтраниц.Вид = ВидГруппыФормы.Страницы; - ГруппаСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; - - // Страница СтандартныйПериод. - СтраницаСтандартныйПериод = Элементы.Добавить(СтраницаСтандартныйИмя, Тип("ГруппаФормы"), ГруппаСтраниц); - СтраницаСтандартныйПериод.Вид = ВидГруппыФормы.Страница; - СтраницаСтандартныйПериод.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; - СтраницаСтандартныйПериод.ОтображатьЗаголовок = Ложь; - - // Страница Произвольный. - СтраницаПроизвольныйПериод = Элементы.Добавить(СтраницаПроизвольныйИмя, Тип("ГруппаФормы"), ГруппаСтраниц); - СтраницаПроизвольныйПериод.Вид = ВидГруппыФормы.Страница; - СтраницаПроизвольныйПериод.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; - СтраницаПроизвольныйПериод.ОтображатьЗаголовок = Ложь; - - // Стандартный период. - Период = Элементы.Добавить(ПериодПредставлениеИмя, Тип("ПолеФормы"), СтраницаСтандартныйПериод); - Период.Вид = ВидПоляФормы.ПолеВвода; - Период.Заголовок = НСтр("ru = 'Период'"); - Период.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - Период.КнопкаВыбора = Истина; - Период.КнопкаОткрытия = Ложь; - Период.КнопкаОчистки = Ложь; - Период.КнопкаРегулирования = Ложь; - Период.РедактированиеТекста = Ложь; - Период.УстановитьДействие("Очистка", "Подключаемый_СтандартныйПериод_Значение_Очистка"); - Период.УстановитьДействие("ОбработкаВыбора", "Подключаемый_СтандартныйПериод_Значение_ОбработкаВыбора"); - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Период.КнопкаСпискаВыбора = Ложь; - Период.УстановитьДействие("НачалоВыбора", "Подключаемый_СтандартныйПериод_Значение_НачалоВыбораИзСписка"); - Иначе - Период.КнопкаСпискаВыбора = Истина; - Период.УстановитьДействие("НачалоВыбораИзСписка", "Подключаемый_СтандартныйПериод_Значение_НачалоВыбораИзСписка"); - Период.УстановитьДействие("НачалоВыбора", "Подключаемый_СтандартныйПериод_Значение_НачалоВыбора"); - КонецЕсли; - - // Начало произвольного периода - ПериодНачало = Элементы.Добавить(ПериодНачалоИмя, Тип("ПолеФормы"), СтраницаПроизвольныйПериод); - ПериодНачало.Вид = ВидПоляФормы.ПолеВвода; - ПериодНачало.РастягиватьПоГоризонтали = Истина; - ПериодНачало.КнопкаВыбора = Истина; - ПериодНачало.КнопкаОткрытия = Ложь; - ПериодНачало.КнопкаОчистки = Ложь; - ПериодНачало.КнопкаРегулирования = Ложь; - ПериодНачало.КнопкаСпискаВыбора = Ложь; - ПериодНачало.РедактированиеТекста = Истина; - ПериодНачало.Заголовок = НСтр("ru = 'с'"); - ПериодНачало.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_НачалоПериода_ПриИзменении"); - - Если ШаблонГенерации.Префикс = "Параметр" Тогда - ПериодНачало.АвтоОтметкаНезаполненного = ДоступнаяНастройка.ЗапрещатьНезаполненныеЗначения; - КонецЕсли; - - // Окончание произвольного периода. - ПериодОкончание = Элементы.Добавить(ПериодОкончаниеИмя, Тип("ПолеФормы"), СтраницаПроизвольныйПериод); - ПериодОкончание.Вид = ВидПоляФормы.ПолеВвода; - ЗаполнитьЗначенияСвойств(ПериодОкончание, ПериодНачало, "РастягиватьПоГоризонтали, РедактированиеТекста, - |КнопкаВыбора, КнопкаОткрытия, КнопкаОчистки, КнопкаРегулирования, КнопкаСпискаВыбора, АвтоОтметкаНезаполненного"); - ПериодОкончание.Заголовок = НСтр("ru = 'по'"); - ПериодОкончание.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_КонецПериода_ПриИзменении"); - - // Значения. - Если ШаблонГенерации.Префикс = "Параметр" Тогда - Значение = ПользовательскаяНастройка.Значение; - Иначе - Значение = ПользовательскаяНастройка.ПравоеЗначение; - КонецЕсли; - НачалоПериода = Значение.ДатаНачала; - КонецПериода = Значение.ДатаОкончания; - ВидПериода = ФункцииОтчетовКлиентСервер.ПолучитьВидСтандартногоПериода(Значение, ВидПериодаЭлемент.СписокВыбора); - Представление = ФункцииОтчетовКлиентСервер.ПредставлениеСтандартногоПериода(Значение, ВидПериода); - - ОписаниеРеквизита = Новый Структура; - ОписаниеРеквизита.Вставить("ПериодЗначениеИмя", ПериодЗначениеИмя); - ОписаниеРеквизита.Вставить("ВидПериодаИмя", ВидПериодаИмя); - ОписаниеРеквизита.Вставить("ПериодНачалоИмя", ПериодНачалоИмя); - ОписаниеРеквизита.Вставить("ПериодОкончаниеИмя", ПериодОкончаниеИмя); - ОписаниеРеквизита.Вставить("ПериодПредставлениеИмя", ПериодПредставлениеИмя); - ОписаниеРеквизита.Вставить("Значение", Значение); - ОписаниеРеквизита.Вставить("ВидПериода", ВидПериода); - ОписаниеРеквизита.Вставить("Представление", Представление); - ДобавленныеСтандартныеПериоды.Добавить(ОписаниеРеквизита); - - // Активация страницы. - Если ВидПериода = Перечисления.ДоступныеПериодыОтчета.ПроизвольныйПериод Тогда - ГруппаСтраниц.ТекущаяСтраница = СтраницаПроизвольныйПериод; - Иначе - ГруппаСтраниц.ТекущаяСтраница = СтраницаСтандартныйПериод; - КонецЕсли; - - ИначеЕсли ШаблонГенерации.Тип = "ПолеВвода" Тогда - - ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; - ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; - ЗначениеИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; - - ИменаОсновныхРеквизитовФормы.Вставить(ИдентификаторЭлемента, ЗначениеИмя); - ИменаЭлементовДляУстановкиСвязей.Вставить(ИдентификаторЭлемента, ЗначениеИмя); - ИменаФлажковИспользование.Вставить(ИдентификаторЭлемента, ?(ШаблонГенерации.ФлажокИспользование, ИспользованиеИмя, "")); - - // Группа с флажком. - Если ШаблонГенерации.ФлажокИспользование Тогда + //////////////////////////////////////////////////////////////////////////////// + // Генерация + // + Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Или ШаблонГенерации.Тип = "ТолькоФлажокЗначения" Тогда + + Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Тогда + ФлажокИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; + ДействиеПриИзменении = "Подключаемый_ФлажокИспользование_ПриИзменении"; + Иначе + ФлажокИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; + ДействиеПриИзменении = "Подключаемый_ПолеВвода_ПриИзменении"; + КонецЕсли; + + // Реквизиты. + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ФлажокИмя, Новый ОписаниеТипов("Булево"))); + + // Флажок. + ИспользованиеОтбора = Элементы.Добавить(ФлажокИмя, Тип("ПолеФормы"), Элементы.ПараметрыИОтборы); + ИспользованиеОтбора.Вид = ВидПоляФормы.ПолеФлажка; + ИспользованиеОтбора.Заголовок = ЭлементЗаголовок; + ИспользованиеОтбора.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ИспользованиеОтбора.УстановитьДействие("ПриИзменении", ДействиеПриИзменении); + + // Значения. + Если ШаблонГенерации.Тип = "ТолькоФлажокИспользование" Тогда + ДобавленныеПоляВвода.Вставить(ФлажокИмя, ПользовательскаяНастройка.Использование); + Иначе + ДобавленныеПоляВвода.Вставить(ФлажокИмя, ПользовательскаяНастройка.Значение); + КонецЕсли; + + ИначеЕсли ШаблонГенерации.Тип = "СтандартныйПериод" Тогда + + ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; + ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; + ВидПериодаИмя = ШаблонГенерации.Префикс + "_Вид_" + ИдентификаторЭлемента; + ПериодЗначениеИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; + ПериодПредставлениеИмя = ШаблонГенерации.Префикс + "_Представление_" + ИдентификаторЭлемента; + ПериодНачалоИмя = ШаблонГенерации.Префикс + "_Начало_" + ИдентификаторЭлемента; + ПериодОкончаниеИмя = ШаблонГенерации.Префикс + "_Окончание_" + ИдентификаторЭлемента; + СтраницыИмя = ШаблонГенерации.Префикс + "_Страницы_" + ИдентификаторЭлемента; + СтраницаСтандартныйИмя = ШаблонГенерации.Префикс + "_СтраницаСтандартный_" + ИдентификаторЭлемента; + СтраницаПроизвольныйИмя = ШаблонГенерации.Префикс + "_СтраницаПроизвольный_" + ИдентификаторЭлемента; + + // Реквизиты + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ВидПериодаИмя, Новый ОписаниеТипов("ПеречислениеСсылка.ДоступныеПериодыОтчета"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ПериодПредставлениеИмя, Новый ОписаниеТипов("Строка"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ПериодЗначениеИмя, Новый ОписаниеТипов("СтандартныйПериод"))); + + // Основная Группа + ГруппаСтрок = ?(ШаблонГенерации.Префикс = "Параметр", Элементы.Периоды, Элементы.ПараметрыИОтборы); + Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), ГруппаСтрок); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + Группа.Отображение = ОтображениеОбычнойГруппы.Нет; + Группа.ОтображатьЗаголовок = Ложь; + Группа.Заголовок = ЭлементЗаголовок; + + Если ШаблонГенерации.ФлажокИспользование Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + + // Флажок + ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), Группа); + ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; + ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); + ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; + + // Значение флажка. + ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + + КонецЕсли; + + // Вид периода - Элемент. + ВидПериодаЭлемент = Элементы.Добавить(ВидПериодаИмя, Тип("ПолеФормы"), Группа); + ВидПериодаЭлемент.Вид = ВидПоляФормы.ПолеВвода; + ВидПериодаЭлемент.Заголовок = ЭлементЗаголовок; + ВидПериодаЭлемент.РежимВыбораИзСписка = Истина; + ВидПериодаЭлемент.РастягиватьПоГоризонтали = Ложь; + ВидПериодаЭлемент.Ширина = 12; + ВидПериодаЭлемент.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_Вид_ПриИзменении"); + + Если ШаблонГенерации.ФлажокИспользование Тогда + ВидПериодаЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Иначе + ВидПериодаЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево; + КонецЕсли; + + // Вид периода - Список выбора. + Если ШаблонГенерации.Префикс = "Параметр" Тогда + МинимальнаяПериодичность = НастройкиОтчета.СоответствиеПериодичностиПараметров[ОбщаяНастройка.Параметр]; + Иначе + МинимальнаяПериодичность = НастройкиОтчета.СоответствиеПериодичностиПараметров[ОбщаяНастройка.ЛевоеЗначение]; + КонецЕсли; + Если МинимальнаяПериодичность = Неопределено Тогда + МинимальнаяПериодичность = Перечисления.ДоступныеПериодыОтчета.День; + КонецЕсли; + + ДоступныеПериоды = ФункцииОтчетовКлиентСервер.ПолучитьСписокДоступныхПериодов(); + Для Индекс = ДоступныеПериоды.Найти(МинимальнаяПериодичность) По ДоступныеПериоды.ВГраница() Цикл + ВидПериодаЭлемент.СписокВыбора.Добавить(ДоступныеПериоды[Индекс]); + КонецЦикла; + + // Страницы. + ГруппаСтраниц = Элементы.Добавить(СтраницыИмя, Тип("ГруппаФормы"), Группа); + ГруппаСтраниц.Вид = ВидГруппыФормы.Страницы; + ГруппаСтраниц.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + + // Страница СтандартныйПериод. + СтраницаСтандартныйПериод = Элементы.Добавить(СтраницаСтандартныйИмя, Тип("ГруппаФормы"), ГруппаСтраниц); + СтраницаСтандартныйПериод.Вид = ВидГруппыФормы.Страница; + СтраницаСтандартныйПериод.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + СтраницаСтандартныйПериод.ОтображатьЗаголовок = Ложь; + + // Страница Произвольный. + СтраницаПроизвольныйПериод = Элементы.Добавить(СтраницаПроизвольныйИмя, Тип("ГруппаФормы"), ГруппаСтраниц); + СтраницаПроизвольныйПериод.Вид = ВидГруппыФормы.Страница; + СтраницаПроизвольныйПериод.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + СтраницаПроизвольныйПериод.ОтображатьЗаголовок = Ложь; + + // Стандартный период. + Период = Элементы.Добавить(ПериодПредставлениеИмя, Тип("ПолеФормы"), СтраницаСтандартныйПериод); + Период.Вид = ВидПоляФормы.ПолеВвода; + Период.Заголовок = НСтр("ru = 'Период'"); + Период.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Период.КнопкаВыбора = Истина; + Период.КнопкаОткрытия = Ложь; + Период.КнопкаОчистки = Ложь; + Период.КнопкаРегулирования = Ложь; + Период.РедактированиеТекста = Ложь; + Период.УстановитьДействие("Очистка", "Подключаемый_СтандартныйПериод_Значение_Очистка"); + Период.УстановитьДействие("НачалоВыбора", "Подключаемый_СтандартныйПериод_Значение_НачалоВыбора"); + + // Начало произвольного периода + ПериодНачало = Элементы.Добавить(ПериодНачалоИмя, Тип("ПолеФормы"), СтраницаПроизвольныйПериод); + ПериодНачало.Вид = ВидПоляФормы.ПолеВвода; + ПериодНачало.РастягиватьПоГоризонтали = Истина; + ПериодНачало.КнопкаВыбора = Истина; + ПериодНачало.КнопкаОткрытия = Ложь; + ПериодНачало.КнопкаОчистки = Ложь; + ПериодНачало.КнопкаРегулирования = Ложь; + ПериодНачало.РедактированиеТекста = Истина; + ПериодНачало.Заголовок = НСтр("ru = 'с'"); + ПериодНачало.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_НачалоПериода_ПриИзменении"); + + Если ШаблонГенерации.Префикс = "Параметр" Тогда + ПериодНачало.АвтоОтметкаНезаполненного = ДоступнаяНастройка.ЗапрещатьНезаполненныеЗначения; + КонецЕсли; + + // Окончание произвольного периода. + ПериодОкончание = Элементы.Добавить(ПериодОкончаниеИмя, Тип("ПолеФормы"), СтраницаПроизвольныйПериод); + ПериодОкончание.Вид = ВидПоляФормы.ПолеВвода; + ЗаполнитьЗначенияСвойств(ПериодОкончание, ПериодНачало, "РастягиватьПоГоризонтали, РедактированиеТекста, + |КнопкаВыбора, КнопкаОткрытия, КнопкаОчистки, КнопкаРегулирования, АвтоОтметкаНезаполненного"); + ПериодОкончание.Заголовок = НСтр("ru = 'по'"); + ПериодОкончание.УстановитьДействие("ПриИзменении", "Подключаемый_СтандартныйПериод_КонецПериода_ПриИзменении"); + + // Значения. + Если ШаблонГенерации.Префикс = "Параметр" Тогда + Значение = ПользовательскаяНастройка.Значение; + Иначе + Значение = ПользовательскаяНастройка.ПравоеЗначение; + КонецЕсли; + НачалоПериода = Значение.ДатаНачала; + КонецПериода = Значение.ДатаОкончания; + ВидПериода = ФункцииОтчетовКлиентСервер.ПолучитьВидСтандартногоПериода(Значение, ВидПериодаЭлемент.СписокВыбора); + Представление = ФункцииОтчетовКлиентСервер.ПредставлениеСтандартногоПериода(Значение, ВидПериода); + + ОписаниеРеквизита = Новый Структура; + ОписаниеРеквизита.Вставить("ПериодЗначениеИмя", ПериодЗначениеИмя); + ОписаниеРеквизита.Вставить("ВидПериодаИмя", ВидПериодаИмя); + ОписаниеРеквизита.Вставить("ПериодНачалоИмя", ПериодНачалоИмя); + ОписаниеРеквизита.Вставить("ПериодОкончаниеИмя", ПериодОкончаниеИмя); + ОписаниеРеквизита.Вставить("ПериодПредставлениеИмя", ПериодПредставлениеИмя); + ОписаниеРеквизита.Вставить("Значение", Значение); + ОписаниеРеквизита.Вставить("ВидПериода", ВидПериода); + ОписаниеРеквизита.Вставить("Представление", Представление); + ДобавленныеСтандартныеПериоды.Добавить(ОписаниеРеквизита); + + // Активация страницы. + Если ВидПериода = Перечисления.ДоступныеПериодыОтчета.ПроизвольныйПериод Тогда + ГруппаСтраниц.ТекущаяСтраница = СтраницаПроизвольныйПериод; + Иначе + ГруппаСтраниц.ТекущаяСтраница = СтраницаСтандартныйПериод; + КонецЕсли; + + ИначеЕсли ШаблонГенерации.Тип = "ПолеВвода" Тогда + + ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; + ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; + ЗначениеИмя = ШаблонГенерации.Префикс + "_Значение_" + ИдентификаторЭлемента; + + ИменаОсновныхРеквизитовФормы.Вставить(ИдентификаторЭлемента, ЗначениеИмя); + ИменаЭлементовДляУстановкиСвязей.Вставить(ИдентификаторЭлемента, ЗначениеИмя); + ИменаФлажковИспользование.Вставить(ИдентификаторЭлемента, ?(ШаблонГенерации.ФлажокИспользование, ИспользованиеИмя, "")); + + // Группа с флажком. + Если ШаблонГенерации.ФлажокИспользование Тогда + + // Добавление основной группы + Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), Элементы.ПараметрыИОтборы); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + Группа.Отображение = ОтображениеОбычнойГруппы.Нет; + Группа.Заголовок = ЭлементЗаголовок; + Группа.ОтображатьЗаголовок = Ложь; + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + + // Флажок + ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), Группа); + ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; + ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); + ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; + + // Значение флажка. + ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + + Иначе + + Группа = Элементы.ПараметрыИОтборы; + + КонецЕсли; + + // Реквизит + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ЗначениеИмя, ШаблонГенерации.ОписаниеТипов)); + + ПолеВвода = Элементы.Добавить(ЗначениеИмя, Тип("ПолеФормы"), Группа); + ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; + ПолеВвода.Заголовок = ЭлементЗаголовок; + ПолеВвода.КнопкаОткрытия = Ложь; + ПолеВвода.КнопкаРегулирования = Ложь; + ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПолеВвода_ПриИзменении"); + + ЗаполнитьЗначенияСвойств(ПолеВвода, ДоступнаяНастройка, "БыстрыйВыбор, Маска, ФормаВыбора, ФорматРедактирования"); + + Если ШаблонГенерации.ФлажокИспользование Тогда + ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + Иначе + ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; + КонецЕсли; + + Если ШаблонГенерации.Свойство("ВыборГруппИЭлементов") Тогда + ПолеВвода.ВыборГруппИЭлементов = ШаблонГенерации.ВыборГруппИЭлементов; + Иначе + ПолеВвода.ВыборГруппИЭлементов = ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ДоступнаяНастройка.ВыборГруппИЭлементов); + КонецЕсли; + + Если ШаблонГенерации.Префикс = "Параметр" Тогда + ПолеВвода.АвтоОтметкаНезаполненного = ДоступнаяНастройка.ЗапрещатьНезаполненныеЗначения; + КонецЕсли; + + // Поля ввода следующих типов не растягиваются по горизонтали и не имеют кнопки очистки: + // Дата, Булево, Число, Тип. + ПолеВвода.КнопкаОчистки = ШаблонГенерации.СодержитДругиеТипы; + ПолеВвода.РастягиватьПоГоризонтали = ШаблонГенерации.СодержитДругиеТипы; + + Если ШаблонГенерации.ВыборИзСписка Тогда + ПолеВвода.РежимВыбораИзСписка = Истина; + ПолеВвода.РастягиватьПоГоризонтали = Истина; + Для Каждого ЭлементСписка Из ДоступнаяНастройка.ДоступныеЗначения Цикл + Если ЭлементСписка.Значение = Тип("Неопределено") Тогда + Продолжить; // Запрет пустых значений для типа "Тип". + КонецЕсли; + ЭлементСпискаВыбора = ПолеВвода.СписокВыбора.Добавить(); + ЗаполнитьЗначенияСвойств(ЭлементСпискаВыбора, ЭлементСписка); + Если ТипЗнч(ЭлементСпискаВыбора.Значение) = Тип("Тип") Тогда + МассивТипов = Новый Массив; + МассивТипов.Добавить(ЭлементСпискаВыбора.Значение); + ЭлементСпискаВыбора.Значение = Новый ОписаниеТипов(МассивТипов); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Фиксированные параметры выбора. + Если ШаблонГенерации.Свойство("ПараметрыВыбора") Тогда + ПолеВвода.ПараметрыВыбора = Новый ФиксированныйМассив(ШаблонГенерации.ПараметрыВыбора); + КонецЕсли; + + // Значение реквизита. + Если ШаблонГенерации.Префикс = "Параметр" Тогда + Значение = ПользовательскаяНастройка.Значение; + Иначе + Значение = ПользовательскаяНастройка.ПравоеЗначение; + КонецЕсли; + Если ТипЗнч(Значение) = Тип("СтандартнаяДатаНачала") Тогда + Значение = Дата(Значение); + ИначеЕсли ТипЗнч(Значение) = Тип("Тип") Тогда + МассивТипов = Новый Массив; + МассивТипов.Добавить(Значение); + Значение = Новый ОписаниеТипов(МассивТипов); + КонецЕсли; + ДобавленныеПоляВвода.Вставить(ЗначениеИмя, Значение); + + ИначеЕсли ШаблонГенерации.Тип = "СписокСПодбором" Тогда + + ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; + ГруппаЗаголовокИмя = ШаблонГенерации.Префикс + "_ГруппаЗаголовка_" + ИдентификаторЭлемента; + ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; + ДекорацияИмя = ШаблонГенерации.Префикс + "_Декорация_" + ИдентификаторЭлемента; + ТаблицаИмя = ШаблонГенерации.Префикс + "_СписокЗначений_" + ИдентификаторЭлемента; + КолонкаЗначениеИмя = ШаблонГенерации.Префикс + "_Колонка_Значение_" + ИдентификаторЭлемента; + КоманднаяПанельИмя = ШаблонГенерации.Префикс + "_КоманднаяПанель_" + ИдентификаторЭлемента; + КнопкаПодборИмя = ШаблонГенерации.Префикс + "_Подбор_" + ИдентификаторЭлемента; + + ИменаОсновныхРеквизитовФормы.Вставить(ИдентификаторЭлемента, ТаблицаИмя); + ИменаЭлементовДляУстановкиСвязей.Вставить(ИдентификаторЭлемента, КолонкаЗначениеИмя); + ИменаФлажковИспользование.Вставить(ИдентификаторЭлемента, ?(ШаблонГенерации.ФлажокИспользование, ИспользованиеИмя, "")); // Добавление основной группы Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), Элементы.ПараметрыИОтборы); Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; - Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; Группа.Отображение = ОтображениеОбычнойГруппы.Нет; Группа.Заголовок = ЭлементЗаголовок; Группа.ОтображатьЗаголовок = Ложь; - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + // Группа-строка для заголовка и командной панели таблицы. + ГруппаЗаголовокТаблицы = Элементы.Добавить(ГруппаЗаголовокИмя, Тип("ГруппаФормы"), Группа); + ГруппаЗаголовокТаблицы.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ГруппаЗаголовокТаблицы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + ГруппаЗаголовокТаблицы.Отображение = ОтображениеОбычнойГруппы.Нет; + ГруппаЗаголовокТаблицы.ОтображатьЗаголовок = Ложь; - // Флажок - ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), Группа); - ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; - ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; - ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); - ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; + // Флажок. + Если ШаблонГенерации.ФлажокИспользование Тогда + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + + ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), ГруппаЗаголовокТаблицы); + ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; + ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; + ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; + ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); + + // Значение флажка + ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + + КонецЕсли; - // Значение флажка. - ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + // Заголовок / Пустая декорация. + ПустаяДекорация = Элементы.Добавить(ДекорацияИмя, Тип("ДекорацияФормы"), ГруппаЗаголовокТаблицы); + ПустаяДекорация.Вид = ВидДекорацииФормы.Надпись; + ПустаяДекорация.Заголовок = ?(ШаблонГенерации.ФлажокИспользование, " ", ЭлементЗаголовок + ":"); + ПустаяДекорация.РастягиватьПоГоризонтали = Истина; - Иначе + // Подбор. + ТаблицаКоманднаяПанель = Элементы.Добавить(КоманднаяПанельИмя, Тип("ГруппаФормы"), ГруппаЗаголовокТаблицы); + ТаблицаКоманднаяПанель.Вид = ВидГруппыФормы.КоманднаяПанель; + ТаблицаКоманднаяПанель.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право; + ТаблицаКоманднаяПанель.РастягиватьПоГоризонтали = Ложь; + ТаблицаКоманднаяПанель.Ширина = 10; - Группа = Элементы.ПараметрыИОтборы; + Если ШаблонГенерации.СодержитСсылочныеТипы Тогда + КомандаПодбор = Команды.Добавить(КнопкаПодборИмя); + КомандаПодбор.Действие = "Подключаемый_СписокСПодбором_Подбор"; + КомандаПодбор.Заголовок = НСтр("ru = 'Подбор'"); + КомандаПодбор.Отображение = ОтображениеКнопки.Текст; + Иначе + КомандаПодбор = Команды.Добавить(КнопкаПодборИмя); + КомандаПодбор.Действие = "Подключаемый_СписокСПодбором_Добавить"; + КомандаПодбор.Заголовок = НСтр("ru = 'Добавить'"); + КомандаПодбор.Отображение = ОтображениеКнопки.Текст; + КомандаПодбор.Картинка = БиблиотекаКартинок.СоздатьЭлементСписка; + КонецЕсли; - КонецЕсли; - - // Реквизит - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ЗначениеИмя, ШаблонГенерации.ОписаниеТипов)); - - ПолеВвода = Элементы.Добавить(ЗначениеИмя, Тип("ПолеФормы"), Группа); - ПолеВвода.Вид = ВидПоляФормы.ПолеВвода; - ПолеВвода.Заголовок = ЭлементЗаголовок; - ПолеВвода.КнопкаОткрытия = Ложь; - ПолеВвода.КнопкаРегулирования = Ложь; - ПолеВвода.КнопкаСпискаВыбора = Ложь; - ПолеВвода.УстановитьДействие("ПриИзменении", "Подключаемый_ПолеВвода_ПриИзменении"); - - Если ПолеВводаВключатьКнопкуВыбора = Неопределено Тогда - ПолеВводаВключатьКнопкуВыбора = Не ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости(); - КонецЕсли; - Если ПолеВводаВключатьКнопкуВыбора Тогда - ПолеВвода.КнопкаВыбора = Истина; - КонецЕсли; - - ЗаполнитьЗначенияСвойств(ПолеВвода, ДоступнаяНастройка, "БыстрыйВыбор, Маска, ФормаВыбора, ФорматРедактирования"); - - Если ШаблонГенерации.ФлажокИспользование Тогда - ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - Иначе - ПолеВвода.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто; - КонецЕсли; - - Если ШаблонГенерации.Свойство("ВыборГруппИЭлементов") Тогда - ПолеВвода.ВыборГруппИЭлементов = ШаблонГенерации.ВыборГруппИЭлементов; - Иначе - ПолеВвода.ВыборГруппИЭлементов = ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ДоступнаяНастройка.ВыборГруппИЭлементов); - КонецЕсли; - - Если ШаблонГенерации.Префикс = "Параметр" Тогда - ПолеВвода.АвтоОтметкаНезаполненного = ДоступнаяНастройка.ЗапрещатьНезаполненныеЗначения; - КонецЕсли; - - // Поля ввода следующих типов не растягиваются по горизонтали и не имеют кнопки очистки: - // Дата, Булево, Число, Тип. - ПолеВвода.КнопкаОчистки = ШаблонГенерации.СодержитДругиеТипы; - ПолеВвода.РастягиватьПоГоризонтали = ШаблонГенерации.СодержитДругиеТипы; - - Если ШаблонГенерации.ВыборИзСписка Тогда - ПолеВвода.РежимВыбораИзСписка = Истина; - ПолеВвода.РастягиватьПоГоризонтали = Истина; - Для Каждого ЭлементСписка Из ДоступнаяНастройка.ДоступныеЗначения Цикл - Если ЭлементСписка.Значение = ТипНеопределено Тогда - Продолжить; // Запрет пустых значений для типа "Тип". - КонецЕсли; - ЭлементСпискаВыбора = ПолеВвода.СписокВыбора.Добавить(); - ЗаполнитьЗначенияСвойств(ЭлементСпискаВыбора, ЭлементСписка); - Если ТипЗнч(ЭлементСпискаВыбора.Значение) = ТипТип Тогда - МассивТипов = Новый Массив; - МассивТипов.Добавить(ЭлементСпискаВыбора.Значение); - ЭлементСпискаВыбора.Значение = Новый ОписаниеТипов(МассивТипов); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Фиксированные параметры выбора. - Если ШаблонГенерации.Свойство("ПараметрыВыбора") Тогда - ПолеВвода.ПараметрыВыбора = Новый ФиксированныйМассив(ШаблонГенерации.ПараметрыВыбора); - КонецЕсли; - - // Значение реквизита. - Если ШаблонГенерации.Префикс = "Параметр" Тогда - Значение = ПользовательскаяНастройка.Значение; - Иначе - Значение = ПользовательскаяНастройка.ПравоеЗначение; - КонецЕсли; - Если ТипЗнч(Значение) = Тип("СтандартнаяДатаНачала") Тогда - Значение = Дата(Значение); - ИначеЕсли ТипЗнч(Значение) = ТипТип Тогда - МассивТипов = Новый Массив; - МассивТипов.Добавить(Значение); - Значение = Новый ОписаниеТипов(МассивТипов); - КонецЕсли; - ДобавленныеПоляВвода.Вставить(ЗначениеИмя, Значение); - - ИначеЕсли ШаблонГенерации.Тип = "СписокСПодбором" Тогда - - ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; - ГруппаЗаголовокИмя = ШаблонГенерации.Префикс + "_ГруппаЗаголовка_" + ИдентификаторЭлемента; - ИспользованиеИмя = ШаблонГенерации.Префикс + "_Использование_" + ИдентификаторЭлемента; - ДекорацияИмя = ШаблонГенерации.Префикс + "_Декорация_" + ИдентификаторЭлемента; - ТаблицаИмя = ШаблонГенерации.Префикс + "_СписокЗначений_" + ИдентификаторЭлемента; - КолонкаЗначениеИмя = ШаблонГенерации.Префикс + "_Колонка_Значение_" + ИдентификаторЭлемента; - КоманднаяПанельИмя = ШаблонГенерации.Префикс + "_КоманднаяПанель_" + ИдентификаторЭлемента; - КнопкаПодборИмя = ШаблонГенерации.Префикс + "_Подбор_" + ИдентификаторЭлемента; - - ИменаОсновныхРеквизитовФормы.Вставить(ИдентификаторЭлемента, ТаблицаИмя); - ИменаЭлементовДляУстановкиСвязей.Вставить(ИдентификаторЭлемента, КолонкаЗначениеИмя); - ИменаФлажковИспользование.Вставить(ИдентификаторЭлемента, ?(ШаблонГенерации.ФлажокИспользование, ИспользованиеИмя, "")); - - // Добавление основной группы - Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), Элементы.ПараметрыИОтборы); - Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; - Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; - Группа.Отображение = ОтображениеОбычнойГруппы.Нет; - Группа.Заголовок = ЭлементЗаголовок; - Группа.ОтображатьЗаголовок = Ложь; - - // Группа-строка для заголовка и командной панели таблицы. - ГруппаЗаголовокТаблицы = Элементы.Добавить(ГруппаЗаголовокИмя, Тип("ГруппаФормы"), Группа); - ГруппаЗаголовокТаблицы.Вид = ВидГруппыФормы.ОбычнаяГруппа; - ГруппаЗаголовокТаблицы.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; - ГруппаЗаголовокТаблицы.Отображение = ОтображениеОбычнойГруппы.Нет; - ГруппаЗаголовокТаблицы.ОтображатьЗаголовок = Ложь; - - // Флажок. - Если ШаблонГенерации.ФлажокИспользование Тогда + КнопкаПодбор = Элементы.Добавить(КнопкаПодборИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); + КнопкаПодбор.ИмяКоманды = КнопкаПодборИмя; - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИспользованиеИмя, Новый ОписаниеТипов("Булево"))); + // Таблица. + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТаблицаИмя, Новый ОписаниеТипов("СписокЗначений"))); - ПолеФлажка = Элементы.Добавить(ИспользованиеИмя, Тип("ПолеФормы"), ГруппаЗаголовокТаблицы); - ПолеФлажка.Вид = ВидПоляФормы.ПолеФлажка; - ПолеФлажка.Заголовок = ЭлементЗаголовок + ":"; - ПолеФлажка.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Право; - ПолеФлажка.УстановитьДействие("ПриИзменении", "Подключаемый_ФлажокИспользование_ПриИзменении"); + ТаблицаФормы = Элементы.Добавить(ТаблицаИмя, Тип("ТаблицаФормы"), Группа); + ТаблицаФормы.Отображение = ОтображениеТаблицы.Список; + ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + ТаблицаФормы.ВертикальныеЛинии = Ложь; + ТаблицаФормы.ГоризонтальныеЛинии = Ложь; + ТаблицаФормы.Шапка = Ложь; + ТаблицаФормы.Подвал = Ложь; + ТаблицаФормы.ИзменятьПорядокСтрок = Истина; + ТаблицаФормы.РастягиватьПоГоризонтали = Истина; + ТаблицаФормы.РастягиватьПоВертикали = Истина; + ТаблицаФормы.Высота = 3; - // Значение флажка - ДобавленныеПоляВвода.Вставить(ИспользованиеИмя, ПользовательскаяНастройка.Использование); + // Колонка "Значение". + КолонкаЗначениеЭлемент = Элементы.Добавить(КолонкаЗначениеИмя, Тип("ПолеФормы"), ТаблицаФормы); + КолонкаЗначениеЭлемент.Вид = ВидПоляФормы.ПолеВвода; - КонецЕсли; - - // Заголовок / Пустая декорация. - ПустаяДекорация = Элементы.Добавить(ДекорацияИмя, Тип("ДекорацияФормы"), ГруппаЗаголовокТаблицы); - ПустаяДекорация.Вид = ВидДекорацииФормы.Надпись; - ПустаяДекорация.Заголовок = ?(ШаблонГенерации.ФлажокИспользование, " ", ЭлементЗаголовок + ":"); - ПустаяДекорация.РастягиватьПоГоризонтали = Истина; - - // Подбор. - ТаблицаКоманднаяПанель = Элементы.Добавить(КоманднаяПанельИмя, Тип("ГруппаФормы"), ГруппаЗаголовокТаблицы); - ТаблицаКоманднаяПанель.Вид = ВидГруппыФормы.КоманднаяПанель; - ТаблицаКоманднаяПанель.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право; - ТаблицаКоманднаяПанель.РастягиватьПоГоризонтали = Ложь; - ТаблицаКоманднаяПанель.Ширина = 10; - - Если ШаблонГенерации.СодержитСсылочныеТипы Тогда - КомандаПодбор = Команды.Добавить(КнопкаПодборИмя); - КомандаПодбор.Действие = "Подключаемый_СписокСПодбором_Подбор"; - КомандаПодбор.Заголовок = НСтр("ru = 'Подбор'"); - КомандаПодбор.Отображение = ОтображениеКнопки.Текст; - Иначе - КомандаПодбор = Команды.Добавить(КнопкаПодборИмя); - КомандаПодбор.Действие = "Подключаемый_СписокСПодбором_Добавить"; - КомандаПодбор.Заголовок = НСтр("ru = 'Добавить'"); - КомандаПодбор.Отображение = ОтображениеКнопки.Текст; - КомандаПодбор.Картинка = БиблиотекаКартинок.СоздатьЭлементСписка; - КонецЕсли; - - КнопкаПодбор = Элементы.Добавить(КнопкаПодборИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); - КнопкаПодбор.ИмяКоманды = КнопкаПодборИмя; - - // Таблица. - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТаблицаИмя, Новый ОписаниеТипов("СписокЗначений"))); - - ТаблицаФормы = Элементы.Добавить(ТаблицаИмя, Тип("ТаблицаФормы"), Группа); - ТаблицаФормы.Отображение = ОтображениеТаблицы.Список; - ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; - ТаблицаФормы.ВертикальныеЛинии = Ложь; - ТаблицаФормы.ГоризонтальныеЛинии = Ложь; - ТаблицаФормы.Шапка = Ложь; - ТаблицаФормы.Подвал = Ложь; - ТаблицаФормы.ИзменятьПорядокСтрок = Истина; - ТаблицаФормы.РастягиватьПоГоризонтали = Истина; - ТаблицаФормы.РастягиватьПоВертикали = Истина; - ТаблицаФормы.Высота = 3; - - // Колонка "Значение". - КолонкаЗначениеЭлемент = Элементы.Добавить(КолонкаЗначениеИмя, Тип("ПолеФормы"), ТаблицаФормы); - КолонкаЗначениеЭлемент.Вид = ВидПоляФормы.ПолеВвода; - - ЗаполнитьЗначенияСвойств(КолонкаЗначениеЭлемент, ДоступнаяНастройка, "БыстрыйВыбор, Маска, ФормаВыбора, ФорматРедактирования"); - - Если ШаблонГенерации.Свойство("ВыборГруппИЭлементов") Тогда - КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ШаблонГенерации.ВыборГруппИЭлементов; - Иначе - КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ДоступнаяНастройка.ВыборГруппИЭлементов); - КонецЕсли; - - Если ШаблонГенерации.ВыборИзСписка Тогда - КолонкаЗначениеЭлемент.РежимВыбораИзСписка = Истина; - Для Каждого ЭлементСписка Из ДоступнаяНастройка.ДоступныеЗначения Цикл - Если ЭлементСписка.Значение = ТипНеопределено Тогда - Продолжить; // Запрет пустых значений для типа "Тип". - КонецЕсли; - ЭлементСпискаВыбора = КолонкаЗначениеЭлемент.СписокВыбора.Добавить(); - ЗаполнитьЗначенияСвойств(ЭлементСпискаВыбора, ЭлементСписка); - Если ТипЗнч(ЭлементСпискаВыбора.Значение) = ТипТип Тогда - МассивТипов = Новый Массив; - МассивТипов.Добавить(ЭлементСпискаВыбора.Значение); - ЭлементСпискаВыбора.Значение = Новый ОписаниеТипов(МассивТипов); - КонецЕсли; - КонецЦикла; - КонецЕсли; - - // Заполнение имен объектов метаданных в разрезах типов и идентификаторов элементов (для предустановленных). - // Используется при клике по кнопке "Подбор" для получения имени формы подбора. - Если ЗначениеЗаполнено(КолонкаЗначениеЭлемент.ФормаВыбора) Тогда - СоответствиеИменОбъектовМетаданных.Вставить(ИдентификаторЭлемента, КолонкаЗначениеЭлемент.ФормаВыбора); - КонецЕсли; - - // Фиксированные параметры выбора. - Если ШаблонГенерации.Свойство("ПараметрыВыбора") Тогда - КолонкаЗначениеЭлемент.ПараметрыВыбора = Новый ФиксированныйМассив(ШаблонГенерации.ПараметрыВыбора); - КонецЕсли; - - // Некоторые обработчики событий можно подключить только после установки связи элементов с данными. - СобытияТаблицы = Новый Структура; - Если ШаблонГенерации.СодержитТипТип Тогда - СобытияТаблицы.Вставить("ПередОкончаниемРедактирования", "Подключаемый_СписокСТипомТип_ПередОкончаниемРедактирования"); - СобытияТаблицы.Вставить("ПриИзменении", "Подключаемый_СписокСТипомТип_ПриИзменении"); - Иначе - СобытияТаблицы.Вставить("ПриИзменении", "Подключаемый_СписокСПодбором_ПриИзменении"); - СобытияТаблицы.Вставить("ОбработкаВыбора", "Подключаемый_СписокСПодбором_ОбработкаВыбора"); - КонецЕсли; - - // Значение списка. - Если ШаблонГенерации.Префикс = "Параметр" Тогда - СписокЗначений = ПользовательскаяНастройка.Значение; - Иначе - СписокЗначений = ПользовательскаяНастройка.ПравоеЗначение; - КонецЕсли; - - ОписаниеРеквизита = Новый Структура; - ОписаниеРеквизита.Вставить("ИмяТаблицы", ТаблицаИмя); - ОписаниеРеквизита.Вставить("СобытияТаблицы", СобытияТаблицы); - ОписаниеРеквизита.Вставить("ИмяКолонкиЗначение", КолонкаЗначениеИмя); - ОписаниеРеквизита.Вставить("Значение", СписокЗначений); - ОписаниеРеквизита.Вставить("ОписаниеТипов", ШаблонГенерации.ОписаниеТипов); - ОписаниеРеквизита.Вставить("СодержитТипТип", ШаблонГенерации.СодержитТипТип); - ДобавленныеСпискиЗначений.Добавить(ОписаниеРеквизита); - - ИначеЕсли ШаблонГенерации.Тип = "ТаблицаПорядкаСФлажками" Тогда - - ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; - ТаблицаИмя = ШаблонГенерации.Префикс + "_Таблица_" + ИдентификаторЭлемента; - КолонкаИспользованиеИмя = ШаблонГенерации.Префикс + "_КолонкаИспользование_" + ИдентификаторЭлемента; - КолонкаПредставлениеИмя = ШаблонГенерации.Префикс + "_КолонкаПредставление_" + ИдентификаторЭлемента; - КолонкаПорядокИмя = ШаблонГенерации.Префикс + "_КолонкаПорядок_" + ИдентификаторЭлемента; - КоманднаяПанельИмя = ШаблонГенерации.Префикс + "_КоманднаяПанель_" + ИдентификаторЭлемента; - КомандаПереместитьВверхИмя = ШаблонГенерации.Префикс + "_Команда_ПереместитьВверх_" + ИдентификаторЭлемента; - КомандаПереместитьВнизИмя = ШаблонГенерации.Префикс + "_Команда_ПереместитьВниз_" + ИдентификаторЭлемента; - КомандаСортироватьПоВозрастаниюИмя = ШаблонГенерации.Префикс + "_Команда_СортироватьПоВозрастанию_" + ИдентификаторЭлемента; - КомандаСортироватьПоУбываниюИмя = ШаблонГенерации.Префикс + "_Команда_СортироватьПоУбыванию_" + ИдентификаторЭлемента; - - // Реквизиты. - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТаблицаИмя, Новый ОписаниеТипов("ТаблицаЗначений"))); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ТаблицаИмя)); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Использование", Новый ОписаниеТипов("Булево"), ТаблицаИмя)); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ТаблицаИмя)); - - Если ШаблонГенерации.Префикс = "ПорядокКомпоновкиДанных" Тогда - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Направление", Новый ОписаниеТипов("НаправлениеСортировкиКомпоновкиДанных"), ТаблицаИмя)); - ИначеЕсли ШаблонГенерации.Префикс = "ВыбранныеПоляКомпоновкиДанных" Тогда - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоГруппа", Новый ОписаниеТипов("Булево"), ТаблицаИмя)); - КонецЕсли; - - // Группы и элементы - Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), Элементы.ТаблицыСФлажками); - Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; - Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; - Группа.Отображение = ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыЛиния(); - Группа.ОтображатьЗаголовок = Истина; - Группа.РастягиватьПоГоризонтали = Истина; - Группа.Заголовок = ЭлементЗаголовок + ":"; - - ТаблицаФормы = Элементы.Добавить(ТаблицаИмя, Тип("ТаблицаФормы"), Группа); - ТаблицаФормы.Отображение = ОтображениеТаблицы.Список; - ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; - ТаблицаФормы.ВертикальныеЛинии = Ложь; - ТаблицаФормы.ГоризонтальныеЛинии = Ложь; - ТаблицаФормы.Шапка = Ложь; - ТаблицаФормы.Подвал = Ложь; - ТаблицаФормы.ИзменятьПорядокСтрок = Истина; - ТаблицаФормы.РастягиватьПоГоризонтали = Истина; - ТаблицаФормы.РастягиватьПоВертикали = Истина; - ТаблицаФормы.Высота = 3; - ТаблицаФормы.ИзменятьСоставСтрок = Ложь; - ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; - ТаблицаФормы.РежимВыделения = РежимВыделенияТаблицы.Одиночный; - - КолонкаИспользование = Элементы.Добавить(КолонкаИспользованиеИмя, Тип("ПолеФормы"), ТаблицаФормы); - КолонкаИспользование.Вид = ВидПоляФормы.ПолеФлажка; - КолонкаИспользование.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; - КолонкаИспользование.УстановитьДействие("ПриИзменении", "Подключаемый_ТаблицаПорядка_КолонкаИспользование_ПриИзменении"); - - КолонкаПредставление = Элементы.Добавить(КолонкаПредставлениеИмя, Тип("ПолеФормы"), ТаблицаФормы); - КолонкаПредставление.Вид = ВидПоляФормы.ПолеВвода; - КолонкаПредставление.ТолькоПросмотр = Истина; - - // Командная панель - ТаблицаКоманднаяПанель = Элементы.Добавить(КоманднаяПанельИмя, Тип("ГруппаФормы"), Группа); - ТаблицаКоманднаяПанель.Вид = ВидГруппыФормы.ОбычнаяГруппа; - ТаблицаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; - ТаблицаКоманднаяПанель.Отображение = ОтображениеОбычнойГруппы.Нет; - ТаблицаКоманднаяПанель.ОтображатьЗаголовок = Ложь; - - // Команды - КомандаПереместитьВверх = Команды.Добавить(КомандаПереместитьВверхИмя); - КомандаПереместитьВверх.Действие = "Подключаемый_ТаблицаПорядка_ПереместитьВверх"; - КомандаПереместитьВверх.Картинка = БиблиотекаКартинок.ПереместитьВверх; - КомандаПереместитьВверх.Отображение = ОтображениеКнопки.Картинка; - - КомандаПереместитьВниз = Команды.Добавить(КомандаПереместитьВнизИмя); - КомандаПереместитьВниз.Действие = "Подключаемый_ТаблицаПорядка_ПереместитьВниз"; - КомандаПереместитьВниз.Картинка = БиблиотекаКартинок.ПереместитьВниз; - КомандаПереместитьВниз.Отображение = ОтображениеКнопки.Картинка; - - // Кнопки - КнопкаПереместитьВверх = Элементы.Добавить(КомандаПереместитьВверхИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); - КнопкаПереместитьВверх.ИмяКоманды = КомандаПереместитьВверхИмя; - КнопкаПереместитьВверх.Заголовок = НСтр("ru = 'Переместить строку вверх'"); - - КнопкаПереместитьВниз = Элементы.Добавить(КомандаПереместитьВнизИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); - КнопкаПереместитьВниз.ИмяКоманды = КомандаПереместитьВнизИмя; - КнопкаПереместитьВниз.Заголовок = НСтр("ru = 'Переместить строку вниз'"); - - Если ШаблонГенерации.Префикс = "ПорядокКомпоновкиДанных" Тогда + ЗаполнитьЗначенияСвойств(КолонкаЗначениеЭлемент, ДоступнаяНастройка, "БыстрыйВыбор, Маска, ФормаВыбора, ФорматРедактирования"); - КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Поднять приоритет сортировки по колонке'"); - КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Понизить приоритет сортировки по колонке'"); + Если ШаблонГенерации.Свойство("ВыборГруппИЭлементов") Тогда + КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ШаблонГенерации.ВыборГруппИЭлементов; + Иначе + КолонкаЗначениеЭлемент.ВыборГруппИЭлементов = ФункцииОтчетовКлиентСервер.ПривестиЗначениеКТипуГруппыИЭлементы(ДоступнаяНастройка.ВыборГруппИЭлементов); + КонецЕсли; - КолонкаПорядок = Элементы.Добавить(КолонкаПорядокИмя, Тип("ПолеФормы"), ТаблицаФормы); - КолонкаПорядок.Вид = ВидПоляФормы.ПолеВвода; - КолонкаПорядок.ТолькоПросмотр = Истина; - КолонкаПорядок.РастягиватьПоГоризонтали = Ложь; - КолонкаПорядок.Ширина = 11; - КолонкаПорядок.ГиперссылкаЯчейки = Истина; + Если ШаблонГенерации.ВыборИзСписка Тогда + КолонкаЗначениеЭлемент.РежимВыбораИзСписка = Истина; + Для Каждого ЭлементСписка Из ДоступнаяНастройка.ДоступныеЗначения Цикл + Если ЭлементСписка.Значение = Тип("Неопределено") Тогда + Продолжить; + КонецЕсли; + ЭлементСпискаВыбора = КолонкаЗначениеЭлемент.СписокВыбора.Добавить(); + ЗаполнитьЗначенияСвойств(ЭлементСпискаВыбора, ЭлементСписка); + Если ТипЗнч(ЭлементСпискаВыбора.Значение) = Тип("Тип") Тогда + МассивТипов = Новый Массив; + МассивТипов.Добавить(ЭлементСпискаВыбора.Значение); + ЭлементСпискаВыбора.Значение = Новый ОписаниеТипов(МассивТипов); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + // Заполнение имен объектов метаданных в разрезах типов и идентификаторов элементов (для предустановленных). + // Используется при клике по кнопке "Подбор" для получения имени формы подбора. + Если ЗначениеЗаполнено(КолонкаЗначениеЭлемент.ФормаВыбора) Тогда + СоответствиеИменОбъектовМетаданных.Вставить(ИдентификаторЭлемента, КолонкаЗначениеЭлемент.ФормаВыбора); + КонецЕсли; + + // Фиксированные параметры выбора. + Если ШаблонГенерации.Свойство("ПараметрыВыбора") Тогда + КолонкаЗначениеЭлемент.ПараметрыВыбора = Новый ФиксированныйМассив(ШаблонГенерации.ПараметрыВыбора); + КонецЕсли; + + // Некоторые обработчики событий можно подключить только после установки связи элементов с данными. + СобытияТаблицы = Новый Структура; + Если ШаблонГенерации.СодержитТипТип Тогда + СобытияТаблицы.Вставить("ПередОкончаниемРедактирования", "Подключаемый_СписокСТипомТип_ПередОкончаниемРедактирования"); + СобытияТаблицы.Вставить("ПриИзменении", "Подключаемый_СписокСТипомТип_ПриИзменении"); + Иначе + СобытияТаблицы.Вставить("ПриИзменении", "Подключаемый_СписокСПодбором_ПриИзменении"); + СобытияТаблицы.Вставить("ОбработкаВыбора", "Подключаемый_СписокСПодбором_ОбработкаВыбора"); + КонецЕсли; + + // Значение списка. + Если ШаблонГенерации.Префикс = "Параметр" Тогда + СписокЗначений = ПользовательскаяНастройка.Значение; + Иначе + СписокЗначений = ПользовательскаяНастройка.ПравоеЗначение; + КонецЕсли; + + ОписаниеРеквизита = Новый Структура; + ОписаниеРеквизита.Вставить("ИмяТаблицы", ТаблицаИмя); + ОписаниеРеквизита.Вставить("СобытияТаблицы", СобытияТаблицы); + ОписаниеРеквизита.Вставить("ИмяКолонкиЗначение", КолонкаЗначениеИмя); + ОписаниеРеквизита.Вставить("Значение", СписокЗначений); + ОписаниеРеквизита.Вставить("ОписаниеТипов", ШаблонГенерации.ОписаниеТипов); + ОписаниеРеквизита.Вставить("СодержитТипТип", ШаблонГенерации.СодержитТипТип); + ДобавленныеСпискиЗначений.Добавить(ОписаниеРеквизита); + + ИначеЕсли ШаблонГенерации.Тип = "ТаблицаПорядкаСФлажками" Тогда + + ГруппаИмя = ШаблонГенерации.Префикс + "_Группа_" + ИдентификаторЭлемента; + ТаблицаИмя = ШаблонГенерации.Префикс + "_Таблица_" + ИдентификаторЭлемента; + КолонкаИспользованиеИмя = ШаблонГенерации.Префикс + "_КолонкаИспользование_" + ИдентификаторЭлемента; + КолонкаПредставлениеИмя = ШаблонГенерации.Префикс + "_КолонкаПредставление_" + ИдентификаторЭлемента; + КолонкаПорядокИмя = ШаблонГенерации.Префикс + "_КолонкаПорядок_" + ИдентификаторЭлемента; + КоманднаяПанельИмя = ШаблонГенерации.Префикс + "_КоманднаяПанель_" + ИдентификаторЭлемента; + КомандаПереместитьВверхИмя = ШаблонГенерации.Префикс + "_Команда_ПереместитьВверх_" + ИдентификаторЭлемента; + КомандаПереместитьВнизИмя = ШаблонГенерации.Префикс + "_Команда_ПереместитьВниз_" + ИдентификаторЭлемента; + КомандаСортироватьПоВозрастаниюИмя = ШаблонГенерации.Префикс + "_Команда_СортироватьПоВозрастанию_" + ИдентификаторЭлемента; + КомандаСортироватьПоУбываниюИмя = ШаблонГенерации.Префикс + "_Команда_СортироватьПоУбыванию_" + ИдентификаторЭлемента; + + // Реквизиты. + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ТаблицаИмя, Новый ОписаниеТипов("ТаблицаЗначений"))); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ТаблицаИмя)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Использование", Новый ОписаниеТипов("Булево"), ТаблицаИмя)); + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Представление", Новый ОписаниеТипов("Строка"), ТаблицаИмя)); + + Если ШаблонГенерации.Префикс = "ПорядокКомпоновкиДанных" Тогда + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Направление", Новый ОписаниеТипов("НаправлениеСортировкиКомпоновкиДанных"), ТаблицаИмя)); + ИначеЕсли ШаблонГенерации.Префикс = "ВыбранныеПоляКомпоновкиДанных" Тогда + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоГруппа", Новый ОписаниеТипов("Булево"), ТаблицаИмя)); + КонецЕсли; + + // Группы и элементы + Группа = Элементы.Добавить(ГруппаИмя, Тип("ГруппаФормы"), Элементы.ТаблицыСФлажками); + Группа.Вид = ВидГруппыФормы.ОбычнаяГруппа; + Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; + Группа.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение; + Группа.ОтображатьЗаголовок = Истина; + Группа.РастягиватьПоГоризонтали = Истина; + Группа.Заголовок = ЭлементЗаголовок + ":"; + + ТаблицаФормы = Элементы.Добавить(ТаблицаИмя, Тип("ТаблицаФормы"), Группа); + ТаблицаФормы.Отображение = ОтображениеТаблицы.Список; + ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + ТаблицаФормы.ВертикальныеЛинии = Ложь; + ТаблицаФормы.ГоризонтальныеЛинии = Ложь; + ТаблицаФормы.Шапка = Ложь; + ТаблицаФормы.Подвал = Ложь; + ТаблицаФормы.ИзменятьПорядокСтрок = Истина; + ТаблицаФормы.РастягиватьПоГоризонтали = Истина; + ТаблицаФормы.РастягиватьПоВертикали = Истина; + ТаблицаФормы.Высота = 3; + ТаблицаФормы.ИзменятьСоставСтрок = Ложь; + ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; + ТаблицаФормы.РежимВыделения = РежимВыделенияТаблицы.Одиночный; + + КолонкаИспользование = Элементы.Добавить(КолонкаИспользованиеИмя, Тип("ПолеФормы"), ТаблицаФормы); + КолонкаИспользование.Вид = ВидПоляФормы.ПолеФлажка; + КолонкаИспользование.РежимРедактирования = РежимРедактированияКолонки.Непосредственно; + КолонкаИспользование.УстановитьДействие("ПриИзменении", "Подключаемый_ТаблицаПорядка_КолонкаИспользование_ПриИзменении"); + + КолонкаПредставление = Элементы.Добавить(КолонкаПредставлениеИмя, Тип("ПолеФормы"), ТаблицаФормы); + КолонкаПредставление.Вид = ВидПоляФормы.ПолеВвода; + КолонкаПредставление.ТолькоПросмотр = Истина; + + // Командная панель + ТаблицаКоманднаяПанель = Элементы.Добавить(КоманднаяПанельИмя, Тип("ГруппаФормы"), Группа); + ТаблицаКоманднаяПанель.Вид = ВидГруппыФормы.ОбычнаяГруппа; + ТаблицаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная; + ТаблицаКоманднаяПанель.Отображение = ОтображениеОбычнойГруппы.Нет; + ТаблицаКоманднаяПанель.ОтображатьЗаголовок = Ложь; // Команды - КомандаПереместитьВверх = Команды.Добавить(КомандаСортироватьПоВозрастаниюИмя); - КомандаПереместитьВверх.Действие = "Подключаемый_ТаблицаПорядка_СортироватьПоВозрастанию"; - КомандаПереместитьВверх.Картинка = БиблиотекаКартинок.СортироватьСписокПоВозрастанию; + КомандаПереместитьВверх = Команды.Добавить(КомандаПереместитьВверхИмя); + КомандаПереместитьВверх.Действие = "Подключаемый_ТаблицаПорядка_ПереместитьВверх"; + КомандаПереместитьВверх.Картинка = БиблиотекаКартинок.ПереместитьВверх; КомандаПереместитьВверх.Отображение = ОтображениеКнопки.Картинка; - КомандаПереместитьВниз = Команды.Добавить(КомандаСортироватьПоУбываниюИмя); - КомандаПереместитьВниз.Действие = "Подключаемый_ТаблицаПорядка_СортироватьПоУбыванию"; - КомандаПереместитьВниз.Картинка = БиблиотекаКартинок.СортироватьСписокПоУбыванию; + КомандаПереместитьВниз = Команды.Добавить(КомандаПереместитьВнизИмя); + КомандаПереместитьВниз.Действие = "Подключаемый_ТаблицаПорядка_ПереместитьВниз"; + КомандаПереместитьВниз.Картинка = БиблиотекаКартинок.ПереместитьВниз; КомандаПереместитьВниз.Отображение = ОтображениеКнопки.Картинка; // Кнопки - КнопкаПереместитьВверх = Элементы.Добавить(КомандаСортироватьПоВозрастаниюИмя, Тип("КнопкаФормы"), ТаблицаФормы.КонтекстноеМеню); - КнопкаПереместитьВверх.ИмяКоманды = КомандаСортироватьПоВозрастаниюИмя; - КнопкаПереместитьВверх.Заголовок = НСтр("ru = 'Сортировать по возрастанию'"); + КнопкаПереместитьВверх = Элементы.Добавить(КомандаПереместитьВверхИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); + КнопкаПереместитьВверх.ИмяКоманды = КомандаПереместитьВверхИмя; + КнопкаПереместитьВверх.Заголовок = НСтр("ru = 'Переместить строку вверх'"); - КнопкаПереместитьВниз = Элементы.Добавить(КомандаСортироватьПоУбываниюИмя, Тип("КнопкаФормы"), ТаблицаФормы.КонтекстноеМеню); - КнопкаПереместитьВниз.ИмяКоманды = КомандаСортироватьПоУбываниюИмя; - КнопкаПереместитьВниз.Заголовок = НСтр("ru = 'Сортировать по убыванию'"); + КнопкаПереместитьВниз = Элементы.Добавить(КомандаПереместитьВнизИмя, Тип("КнопкаФормы"), ТаблицаКоманднаяПанель); + КнопкаПереместитьВниз.ИмяКоманды = КомандаПереместитьВнизИмя; + КнопкаПереместитьВниз.Заголовок = НСтр("ru = 'Переместить строку вниз'"); - ИначеЕсли ШаблонГенерации.Префикс = "ВыбранныеПоляКомпоновкиДанных" Тогда + Если ШаблонГенерации.Префикс = "ПорядокКомпоновкиДанных" Тогда + + КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Поднять приоритет сортировки по колонке'"); + КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Понизить приоритет сортировки по колонке'"); + + КолонкаПорядок = Элементы.Добавить(КолонкаПорядокИмя, Тип("ПолеФормы"), ТаблицаФормы); + КолонкаПорядок.Вид = ВидПоляФормы.ПолеВвода; + КолонкаПорядок.ТолькоПросмотр = Истина; + КолонкаПорядок.РастягиватьПоГоризонтали = Ложь; + КолонкаПорядок.Ширина = 11; + КолонкаПорядок.ГиперссылкаЯчейки = Истина; + + // Команды + КомандаПереместитьВверх = Команды.Добавить(КомандаСортироватьПоВозрастаниюИмя); + КомандаПереместитьВверх.Действие = "Подключаемый_ТаблицаПорядка_СортироватьПоВозрастанию"; + КомандаПереместитьВверх.Картинка = БиблиотекаКартинок.СортироватьСписокПоВозрастанию; + КомандаПереместитьВверх.Отображение = ОтображениеКнопки.Картинка; + + КомандаПереместитьВниз = Команды.Добавить(КомандаСортироватьПоУбываниюИмя); + КомандаПереместитьВниз.Действие = "Подключаемый_ТаблицаПорядка_СортироватьПоУбыванию"; + КомандаПереместитьВниз.Картинка = БиблиотекаКартинок.СортироватьСписокПоУбыванию; + КомандаПереместитьВниз.Отображение = ОтображениеКнопки.Картинка; + + // Кнопки + КнопкаПереместитьВверх = Элементы.Добавить(КомандаСортироватьПоВозрастаниюИмя, Тип("КнопкаФормы"), ТаблицаФормы.КонтекстноеМеню); + КнопкаПереместитьВверх.ИмяКоманды = КомандаСортироватьПоВозрастаниюИмя; + КнопкаПереместитьВверх.Заголовок = НСтр("ru = 'Сортировать по возрастанию'"); + + КнопкаПереместитьВниз = Элементы.Добавить(КомандаСортироватьПоУбываниюИмя, Тип("КнопкаФормы"), ТаблицаФормы.КонтекстноеМеню); + КнопкаПереместитьВниз.ИмяКоманды = КомандаСортироватьПоУбываниюИмя; + КнопкаПереместитьВниз.Заголовок = НСтр("ru = 'Сортировать по убыванию'"); + + ИначеЕсли ШаблонГенерации.Префикс = "ВыбранныеПоляКомпоновкиДанных" Тогда + + КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Переместить поле выше или левее'"); + КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Переместить поле ниже или правее'"); + + // Условное оформление для групп + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + ЭлементУсловногоОформления.Использование = Истина; + + ОтборОформления = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ОтборОформления.Использование = Истина; + ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ТаблицаИмя + ".ЭтоГруппа"); + ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ОтборОформления.ПравоеЗначение = Истина; + + ПолеОформление = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ПолеОформление.Использование = Истина; + ПолеОформление.Поле = Новый ПолеКомпоновкиДанных(ТаблицаИмя); + + ШрифтОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Шрифт")); + ШрифтОформления.Значение = Новый Шрифт(ШрифтОформления.Значение, , , Истина, , Истина, ); + ШрифтОформления.Использование = Истина; + + ИначеЕсли ШаблонГенерации.Префикс = "СтруктураНастроекКомпоновкиДанных" Тогда + + КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Переместить поле вверх'"); + КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Переместить поле вниз'"); + + КонецЕсли; - КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Переместить поле выше или левее'"); - КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Переместить поле ниже или правее'"); - - // Условное оформление для групп - ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); - ЭлементУсловногоОформления.Использование = Истина; - - ОтборОформления = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); - ОтборОформления.Использование = Истина; - ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ТаблицаИмя + ".ЭтоГруппа"); - ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ОтборОформления.ПравоеЗначение = Истина; - - ПолеОформление = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); - ПолеОформление.Использование = Истина; - ПолеОформление.Поле = Новый ПолеКомпоновкиДанных(ТаблицаИмя); - - ШрифтОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Шрифт")); - ШрифтОформления.Значение = Новый Шрифт(ШрифтОформления.Значение, , , Истина, , Истина, ); - ШрифтОформления.Использование = Истина; - - - ИначеЕсли ШаблонГенерации.Префикс = "СтруктураНастроекКомпоновкиДанных" Тогда - - КомандаПереместитьВверх.Подсказка = НСтр("ru = 'Переместить поле вверх'"); - КомандаПереместитьВниз.Подсказка = НСтр("ru = 'Переместить поле вниз'"); + // Значения. + ОписаниеРеквизита = Новый Структура; + ОписаниеРеквизита.Вставить("ИмяГруппы", ГруппаИмя); + ОписаниеРеквизита.Вставить("ИмяТаблицы", ТаблицаИмя); + ОписаниеРеквизита.Вставить("ИмяКолонкиИспользование", КолонкаИспользованиеИмя); + ОписаниеРеквизита.Вставить("ИмяКолонкиПредставление", КолонкаПредставлениеИмя); + ОписаниеРеквизита.Вставить("ИмяКолонкиПорядок", КолонкаПорядокИмя); + ОписаниеРеквизита.Вставить("ПользовательскаяНастройка", ПользовательскаяНастройка); + ДобавленныеТаблицыСФлажками.Добавить(ОписаниеРеквизита); КонецЕсли; - - // Значения. - ОписаниеРеквизита = Новый Структура; - ОписаниеРеквизита.Вставить("ИмяГруппы", ГруппаИмя); - ОписаниеРеквизита.Вставить("ИмяТаблицы", ТаблицаИмя); - ОписаниеРеквизита.Вставить("ИмяКолонкиИспользование", КолонкаИспользованиеИмя); - ОписаниеРеквизита.Вставить("ИмяКолонкиПредставление", КолонкаПредставлениеИмя); - ОписаниеРеквизита.Вставить("ИмяКолонкиПорядок", КолонкаПорядокИмя); - ОписаниеРеквизита.Вставить("ПользовательскаяНастройка", ПользовательскаяНастройка); - ДобавленныеТаблицыСФлажками.Добавить(ОписаниеРеквизита); - + КонецЦикла; + КонецЦикла; + + // Регистрация старых реквизитов к удалению. + УдаляемыеРеквизиты = Новый Массив; + НаборРеквизитов = ПолучитьРеквизиты(); + Для Каждого Реквизит Из НаборРеквизитов Цикл + Если ПостоянныеРеквизиты.НайтиПоЗначению(Реквизит.Имя) = Неопределено Тогда + УдаляемыеРеквизиты.Добавить(Реквизит.Имя); КонецЕсли; КонецЦикла; - ИзменитьРеквизиты(ДобавляемыеРеквизиты, Новый Массив); + // Изменение реквизитов. + ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты); // Установка значений и связей полей ввода. Для Каждого КлючИЗначение Из ДобавленныеПоляВвода Цикл ИмяРеквизита = КлючИЗначение.Ключ; - ЭтаФорма[ИмяРеквизита] = КлючИЗначение.Значение; + ЭтотОбъект[ИмяРеквизита] = КлючИЗначение.Значение; Элементы[ИмяРеквизита].ПутьКДанным = ИмяРеквизита; КонецЦикла; // Установка значений и связей списков значений. Для Каждого ОписаниеРеквизита Из ДобавленныеСтандартныеПериоды Цикл - ЭтаФорма[ОписаниеРеквизита.ПериодЗначениеИмя] = ОписаниеРеквизита.Значение; - ЭтаФорма[ОписаниеРеквизита.ВидПериодаИмя] = ОписаниеРеквизита.ВидПериода; - ЭтаФорма[ОписаниеРеквизита.ПериодПредставлениеИмя] = ОписаниеРеквизита.Представление; + ЭтотОбъект[ОписаниеРеквизита.ПериодЗначениеИмя] = ОписаниеРеквизита.Значение; + ЭтотОбъект[ОписаниеРеквизита.ВидПериодаИмя] = ОписаниеРеквизита.ВидПериода; + ЭтотОбъект[ОписаниеРеквизита.ПериодПредставлениеИмя] = ОписаниеРеквизита.Представление; Элементы[ОписаниеРеквизита.ВидПериодаИмя].ПутьКДанным = ОписаниеРеквизита.ВидПериодаИмя; Элементы[ОписаниеРеквизита.ПериодПредставлениеИмя].ПутьКДанным = ОписаниеРеквизита.ПериодПредставлениеИмя; Элементы[ОписаниеРеквизита.ПериодНачалоИмя].ПутьКДанным = ОписаниеРеквизита.ПериодЗначениеИмя + ".ДатаНачала"; @@ -2542,7 +2572,7 @@ Для Каждого ЭлементСпискаСКД Из ОписаниеРеквизита.Значение Цикл ЭлементСписка = СписокЗначений.Добавить(); ЗаполнитьЗначенияСвойств(ЭлементСписка, ЭлементСпискаСКД); - Если ТипЗнч(ЭлементСписка.Значение) = ТипТип Тогда + Если ТипЗнч(ЭлементСписка.Значение) = Тип("Тип") Тогда МассивТипов = Новый Массив; МассивТипов.Добавить(ЭлементСписка.Значение); ЭлементСписка.Значение = Новый ОписаниеТипов(МассивТипов); @@ -2565,13 +2595,13 @@ Для Каждого ОписаниеРеквизита Из ДобавленныеТаблицыСФлажками Цикл ИмяТаблицы = ОписаниеРеквизита.ИмяТаблицы; - Таблица = ЭтаФорма[ИмяТаблицы]; + Таблица = ЭтотОбъект[ИмяТаблицы]; ПользовательскаяНастройка = ОписаниеРеквизита.ПользовательскаяНастройка; ТипОбщейНастройки = ТипЗнч(ПользовательскаяНастройка); Если ТипОбщейНастройки = Тип("ВыбранныеПоляКомпоновкиДанных") Тогда - ФункцииОтчетовКлиентСервер.ДобавитьЭлементыНастройки(ЭтаФорма, Таблица, ПользовательскаяНастройка, ПользовательскаяНастройка, Истина); + ФункцииОтчетовКлиентСервер.ДобавитьЭлементыНастройки(ЭтотОбъект, Таблица, ПользовательскаяНастройка, ПользовательскаяНастройка, Истина); ИначеЕсли ТипОбщейНастройки = Тип("ПорядокКомпоновкиДанных") Тогда @@ -2683,7 +2713,7 @@ // Если ведущий используется, тогда связь регистрируется в элементе подчиненного в соответствии с выбранным типом. Если ВедущийПользовательскаяНастройкаКД.Использование - И ТипЗнч(ЭтаФорма[ОписаниеСвязи.ВедущийИмяРеквизита]) = ОписаниеСвязи.ВедущийТип Тогда + И ТипЗнч(ЭтотОбъект[ОписаниеСвязи.ВедущийИмяРеквизита]) = ОписаниеСвязи.ВедущийТип Тогда ПодчиненныйЭлемент = Элементы.Найти(ОписаниеСвязи.ПодчиненныйИмяЭлемента); Если ПодчиненныйЭлемент <> Неопределено Тогда УстановитьСвязьПараметровВыбора(ПодчиненныйЭлемент, ОписаниеСвязи, Истина); @@ -2705,14 +2735,12 @@ ВедущийИдентификатор = ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Получить(СтрокаТаблицы.ВедущийПолеКД); ПодчиненныйИдентификатор = СтрокаТаблицы.ПодчиненныйИдентификатор; ПодчиненныйИмяЭлемента = ИменаЭлементовДляУстановкиСвязей[ПодчиненныйИдентификатор]; - Если Не ЗначениеЗаполнено(ПодчиненныйИмяЭлемента) Тогда Продолжить; // Подчиненный имеет такой вид сравнения ("Заполнено" или "Не заполнено"), при котором его связи отключаются. КонецЕсли; - ПодчиненныйЭлемент = Элементы[ПодчиненныйИмяЭлемента]; - Если ВедущийИдентификатор = Неопределено Тогда + Если ВедущийИдентификатор = Неопределено Тогда // Ведущий не выведен в быстрые настройки. // Инициализация соответствия для быстрого поиска значений обычных настроек. Если ПоискЗначенийОбычныхНастроекПоПолюКомпоновкиДанных = Неопределено Тогда @@ -2731,7 +2759,7 @@ МассивТипов.Добавить(ТипЗнч(ВедущийЗначение)); ПодчиненныйЭлемент.ОграничениеТипа = Новый ОписаниеТипов(МассивТипов); - Иначе + Иначе // Ведущий выведен в быстрые настройки. // Регистрация отключаемой связи ведущего с подчиненным (по типу). ВсеСвязиВедущего = СоответствиеОтключаемыхСвязей.Получить(ВедущийИдентификатор); @@ -2779,11 +2807,9 @@ ВедущийИдентификатор = ПоискИдентификаторовБыстрыхНастроекПоПолюКомпоновкиДанных.Получить(СтрокаТаблицы.ВедущийПолеКД); ПодчиненныйИдентификатор = СтрокаТаблицы.ПодчиненныйИдентификатор; ПодчиненныйИмяЭлемента = ИменаЭлементовДляУстановкиСвязей[ПодчиненныйИдентификатор]; - Если Не ЗначениеЗаполнено(ПодчиненныйИмяЭлемента) Тогда Продолжить; // Подчиненный имеет такой вид сравнения ("Заполнено" или "Не заполнено"), при котором его связи отключаются. КонецЕсли; - ПодчиненныйЭлемент = Элементы[ПодчиненныйИмяЭлемента]; Если ВедущийИдентификатор = Неопределено Тогда // Ведущий не выведен в быстрые настройки. @@ -2850,7 +2876,7 @@ КонецЦикла; Если Элементы.Периоды.ПодчиненныеЭлементы.Количество() > 0 Тогда - Элементы.ПараметрыИОтборы.Отображение = ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыЛиния(); + Элементы.ПараметрыИОтборы.Отображение = ОтображениеОбычнойГруппы.СлабоеВыделение; Иначе Элементы.ПараметрыИОтборы.Отображение = ОтображениеОбычнойГруппы.Нет; КонецЕсли; diff --git a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl index e484b94fd..d875e7956 100644 --- a/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/АвтономнаяРаботаСлужебный/Module.bsl @@ -6,6 +6,28 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Объявляет служебные события подсистемы ОбменДанными: +// +// Серверные события: +// ПриВыгрузкеДанных, +// ПриЗагрузкеДанных. +// +// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. +Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт + + // СЕРВЕРНЫЕ СОБЫТИЯ. + + // Вызывается в момент начала создания пользователем автономного рабочего места. + // В обработчиках события могут быть реализованы дополнительные проверки возможности + // создания автономного рабочего места (при невозможности - сгенерировано исключение). + // + // Синтаксис: + // Процедура ПриСозданииАвтономногоРабочегоМеста() Экспорт + // + СерверныеСобытия.Добавить("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса\ПриСозданииАвтономногоРабочегоМеста"); + +КонецПроцедуры + // Переопределяет действие перед авторизацией пользователя, // выполняемой при начале работы системы (в процессе получения // параметров работы клиента при запуске). @@ -41,8 +63,6 @@ ЗаполнитьЗначенияСвойств(ПомощникСозданияАвтономногоРабочегоМеста, Параметры); - УстановитьПривилегированныйРежим(Истина); - ПомощникСозданияАвтономногоРабочегоМеста.СоздатьНачальныйОбразАвтономногоРабочегоМеста( Параметры.НастройкаОтборовНаУзле, Параметры.ВыбранныеПользователиСинхронизации, @@ -322,7 +342,7 @@ КонецЦикла; - Реквизиты = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Реквизиты); + Реквизиты = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Реквизиты); ЗначенияРеквизитов = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(АвтономноеРабочееМесто, Реквизиты); @@ -507,7 +527,7 @@ // Для внутреннего использования // -Процедура ВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске() +Процедура ВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске() Экспорт Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ВызватьИсключение НСтр("ru = 'Первый запуск автономного рабочего места должен выполняться diff --git a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl index 67ce0c940..5634e6651 100644 --- a/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификатор/Module.bsl @@ -121,7 +121,7 @@ // Параметры: // МассивАдресныхОбъектов - Массив - каждый элемент - строка, номер адресного объекта в формате NN // -Процедура УдалитьАдресныеСведения(знач МассивАдресныхОбъектов) Экспорт +Процедура УдалитьАдресныеСведения(Знач МассивАдресныхОбъектов) Экспорт Для Каждого КодАдресногоОбъекта Из МассивАдресныхОбъектов Цикл НаборАдресныхСведений = РегистрыСведений.АдресныйКлассификатор.СоздатьНаборЗаписей(); @@ -148,11 +148,44 @@ |ГДЕ | Регион.ТипАдресногоЭлемента = 1 | И 1 В ( - | ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 + | ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + | ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Уровень2 + | ГДЕ + | Уровень2.КодАдресногоОбъектаВКоде = Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 + | + | ОБЪЕДИНИТЬ ВСЕ + | ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + | ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Уровень3 + | ГДЕ + | Уровень3.КодАдресногоОбъектаВКоде = Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 + | + | ОБЪЕДИНИТЬ ВСЕ + | ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + | ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Уровень4 + | ГДЕ + | Уровень4.КодАдресногоОбъектаВКоде = Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 + | + | ОБЪЕДИНИТЬ ВСЕ + | ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + | ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Уровень5 + | ГДЕ + | Уровень5.КодАдресногоОбъектаВКоде = Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 + | + | ОБЪЕДИНИТЬ ВСЕ + | ВЫБРАТЬ ПЕРВЫЕ 1 + | 1 + | ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Уровень6 + | ГДЕ + | Уровень6.КодАдресногоОбъектаВКоде = Регион.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 | ) |"); @@ -660,7 +693,7 @@ Если Загружен.Улица И Не ПустаяСтрока(НазваниеУлицы) Тогда Возврат ""; Иначе - // Если улица не указа - то пытаемся вместо неё подставить что-нибудь + // Если улица не указана - то пытаемся вместо неё подставить что-нибудь // из более высокого уровня Если НаселенныйПункт.Код > 0 Тогда Улица = НаселенныйПункт; @@ -724,7 +757,7 @@ КонецФункции -// Проверяет соответствие адреса КЛАДРу по переданным индексу, региону, району, городу, населенному пункту, +// Проверяет соответствие адреса КЛАДР по переданным индексу, региону, району, городу, населенному пункту, // улице, дому и корпусу, при этом выводит все поля по каждому найденному элементу адреса // // Параметры: @@ -1041,9 +1074,6 @@ Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл Дом.Вставить(Колонка.Имя, Выборка[Колонка.Имя]); КонецЦикла; - - НомерИндекса = Дом.Индекс; - КонецЕсли; КонецЕсли; @@ -1055,9 +1085,6 @@ Если ДополнительнаяПроверка.ЕстьЗдания Тогда Если ДополнительнаяПроверка.Код<>Неопределено Тогда // Нашли КодДома = ДополнительнаяПроверка.Код; - - НомерИндекса = ДополнительнаяПроверка.Индекс; - КонецЕсли; Иначе ЕстьДома = Ложь; @@ -1069,18 +1096,18 @@ Если КодДома = 0 И ЕстьДома Тогда ЕстьОшибки = Истина; Если ПустаяСтрока(НомерДома) Тогда - СообщениеОбОшибке = НСтр("ru='Корпус ""%НомерКорпуса%"" не найден в адресном классификаторе.'"); + СообщениеОбОшибке = НСтр("ru='Корпус (строение и т.п.) ""%НомерКорпуса%"" не найден в адресном классификаторе.'"); СообщениеОбОшибке = СтрЗаменить(СообщениеОбОшибке, "%НомерКорпуса%", НомерКорпуса); СтруктураОшибок.Вставить("Корпус", СообщениеОбОшибке); ИначеЕсли ПустаяСтрока(НомерКорпуса) ТОгда - СообщениеОбОшибке = НСтр("ru='Дом ""%НомерДома%"" не найден в адресном классификаторе.'"); + СообщениеОбОшибке = НСтр("ru='Дом (владение и.т.п.) ""%НомерДома%"" не найден в адресном классификаторе.'"); СообщениеОбОшибке = СтрЗаменить(СообщениеОбОшибке, "%НомерДома%", НомерДома); СтруктураОшибок.Вставить("Дом", СообщениеОбОшибке); Иначе - СообщениеОбОшибке = НСтр("ru='Дом ""%НомерДома%"" не найден в адресном классификаторе.'"); + СообщениеОбОшибке = НСтр("ru='Дом (владение и.т.п.) ""%НомерДома%"" не найден в адресном классификаторе.'"); СообщениеОбОшибке = СтрЗаменить(СообщениеОбОшибке, "%НомерДома%", НомерДома); СтруктураОшибок.Вставить("Дом", СообщениеОбОшибке); - СообщениеОбОшибке = НСтр("ru='Корпус ""%НомерКорпуса%"" не найден в адресном классификаторе.'"); + СообщениеОбОшибке = НСтр("ru='Корпус (строение и т.п.) ""%НомерКорпуса%"" не найден в адресном классификаторе.'"); СообщениеОбОшибке = СтрЗаменить(СообщениеОбОшибке, "%НомерКорпуса%", НомерКорпуса); СтруктураОшибок.Вставить("Корпус", СообщениеОбОшибке); КонецЕсли; @@ -1088,18 +1115,32 @@ КонецЕсли; - // Проверка индекса - // Только в случае, если смогли определить по классификатору, иначе, то что введено вручную - корректно - Если Не ПустаяСтрока(УказанныйИндекс) И Не ПустаяСтрока(НомерИндекса) И НомерИндекса <> УказанныйИндекс Тогда - СтруктураОшибок.Вставить("Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Индекс ""%1"" не соответствует введенному адресу.'"), УказанныйИндекс)); - ЕстьОшибки = Истина; - - КонецЕсли; + // Проверка индекса + Если Не ПустаяСтрока(УказанныйИндекс) Тогда + Запрос = Новый Запрос(" + |ВЫБРАТЬ ПЕРВЫЕ 1 + | АдресныйКлассификатор.Индекс КАК Индекс + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + |ГДЕ + | АдресныйКлассификатор.Индекс = &УказанныйИндекс + |"); + Запрос.УстановитьПараметр("УказанныйИндекс", УказанныйИндекс); + Если Запрос.Выполнить().Пустой() Тогда + СтруктураОшибок.Вставить("Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Индекс ""%1"" не найден в адресном классификаторе.'"), УказанныйИндекс)); + ЕстьОшибки = Истина; + + ИначеЕсли НомерИндекса <> УказанныйИндекс Тогда + СтруктураОшибок.Вставить("Индекс", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Индекс ""%1"" не соответствует введенному адресу.'"), УказанныйИндекс)); + ЕстьОшибки = Истина; + + КонецЕсли; + КонецЕсли; СтруктураПроверки.Вставить("ЕстьОшибки", ЕстьОшибки); СтруктураПроверки.Вставить("СтруктураОшибок", СтруктураОшибок); - Возврат СтруктураПроверки; КонецФункции @@ -1583,7 +1624,7 @@ Возврат НСтр("ru='Адресный классификатор'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка() ); КонецФункции - + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -1601,25 +1642,17 @@ // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; + Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "1.0.1.1"; + Обработчик.Процедура = "АдресныйКлассификатор.ЗагрузитьАдресныеОбъектыПервогоУровня"; + Обработчик.НачальноеЗаполнение = Истина; КонецЕсли; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.0.1.1"; - Обработчик.Процедура = "АдресныйКлассификатор.ЗагрузитьАдресныеОбъектыПервогоУровня"; - Обработчик.НачальноеЗаполнение = Истина; - + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.0.1.11"; Обработчик.Процедура = "АдресныйКлассификатор.РазложитьАдресныеОбъектыПоЭлементам"; Обработчик.ОбщиеДанные = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.8.6"; - Обработчик.Процедура = "АдресныйКлассификатор.ЗагрузитьАдресныеОбъектыПервогоУровня"; - Обработчик.ОбщиеДанные = Истина; - КонецПроцедуры // Загружает адресные объекты первого уровня по макету @@ -1868,7 +1901,7 @@ // Возвращаемое значение: // Соответствие, в котором ключ - строка адресного объекта, значение - дата актуальности адресного объекта. // -Функция ПолучитьВерсииАдресныхСведений(знач ТекстXML) Экспорт +Функция ПолучитьВерсииАдресныхСведений(Знач ТекстXML) Экспорт ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ТекстXML); @@ -1906,15 +1939,11 @@ ПутьККаталогуНаСервере = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); СоздатьКаталог(ПутьККаталогуНаСервере); КонецЕсли; + ДвоичныеДанные.Записать(ПутьККаталогуНаСервере + ИмяФайлаАрхива); ЧтениеZIP = Новый ЧтениеZipФайла(ПутьККаталогуНаСервере + ИмяФайлаАрхива); - // При распаковке приводим имена к верхнему регистру - Для Каждого ЭлементЗип Из ЧтениеZIP.Элементы Цикл - ЧтениеZIP.Извлечь(ЭлементЗип, ПутьККаталогуНаСервере, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - ПереместитьФайл(ПутьККаталогуНаСервере + ЭлементЗип.Имя, ПутьККаталогуНаСервере + ВРег(ЭлементЗип.Имя) ); - КонецЦикла; - + ЧтениеZIP.ИзвлечьВсе(ПутьККаталогуНаСервере, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); ЧтениеZIP.Закрыть(); УдалитьФайлы(ПутьККаталогуНаСервере, ИмяФайлаАрхива); КонецПроцедуры @@ -2260,7 +2289,7 @@ // Процедура для заполнения данных с 2-го по 4-й уровень классификации: // // Параметры: -// КодАдресногоОбъекта - Строка - код адресного объекта в формате NN +// КодАдресногоОбъекта - Cтрока - код адресного объекта в формате NN // АдресныеСведения - ТаблицаЗначений - записи, повторяющие структуру РС АдресныйКлассификатор; // которые переносятся в регистр // @@ -2593,7 +2622,7 @@ // Возвращаемое значение: // Найденный элемент справочника Адресный классификатор или пустая ссылка в случае неудачи // -Функция ПолучитьАдресныйЭлемент(знач НазваниеЭлемента, ТипЭлемента, ЭлементРодитель) +Функция ПолучитьАдресныйЭлемент(Знач НазваниеЭлемента, ТипЭлемента, ЭлементРодитель) Если (СокрЛП(НазваниеЭлемента) = "") ИЛИ (ТипЭлемента = 0) Тогда Возврат АдресныйКлассификаторКлиентСервер.ПустаяСтруктураАдреса(); @@ -2856,15 +2885,8 @@ Если НЕ СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Номер, Ложь) Тогда // Проверяем вхождение конкретного номера дома в интервал (отбрасывая букву "К" - означающую "корпус") - - Вариант = ?(ТипЗнч(Номер) = Тип("Число"), Формат(Номер, "ЧГ="), ВРег(СтрЗаменить(Номер, " ", ""))); - Позиция = Найти(Вариант, "К"); - НомерБезЛишнихСимволов = ?(Позиция > 0, Лев(Вариант, Позиция - 1), Вариант); - - Вариант = ВРег(СтрЗаменить(Интервал, " ", "")); - Позиция = Найти(Вариант, "К"); - ИнтервалБезЛишнихСимволов = ?(Позиция > 0, Лев(Вариант, Позиция - 1), Вариант); - + НомерБезЛишнихСимволов = СтрЗаменить(ВРЕГ(СтрЗаменить("" + Номер, " ", "")), "К", ""); + ИнтервалБезЛишнихСимволов = СтрЗаменить(ВРЕГ(СтрЗаменить("" + Интервал, " ", "")), "К", ""); НомерВходитВИнтервал = (НомерБезЛишнихСимволов = ИнтервалБезЛишнихСимволов); Если НомерВходитВИнтервал Тогда Возврат Истина; @@ -3205,6 +3227,184 @@ Возврат ЦифроваяЧасть; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Фоновое задание загрузки данных КЛАДР +// + +// Распаковывает по необходимости и загружает в регистр файлы кладр, запускает фоновое +// +// Параметры: +// ОбъектыДляЗагрузки - Массив - регионы для загрузки +// ПереданныеФайлы - Массив - описание переданных файлов +// ИсточникДанных - Число - описание файлов: 1 - zip с сайта, 2 - exe с ИТС, 3 - dbf с диска +// ИдентификаторХранилища - УникальныйИдентификатор - для привязки к форме +// +Функция ОбработатьФайлыКЛАДР(Знач ОбъектыЗагрузки, Знач ПереданныеФайлы, Знач ИсточникДанных, Знач ИдентификаторХранилища) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ОбъектыЗагрузки", ОбъектыЗагрузки); + Параметры.Вставить("ИсточникДанных", ИсточникДанных); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + // Описание файлов передаем непосредственно + Параметры.Вставить("ПереданныеФайлы", ПереданныеФайлы); + + АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторХранилища); + ФоноваяЗагрузкаФайловКЛАДР(Параметры, АдресХранилища); + Результат = Новый Структура("ЗаданиеВыполнено", Истина); + + Иначе + // Описание файлов передаем как двоичные данные + Параметры.Вставить("ПереданныеФайлы", ДвоичныеДанныеФайловКЛАДР(ПереданныеФайлы)); + + Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(ИдентификаторХранилища, + "АдресныйКлассификатор.ФоноваяЗагрузкаФайловКЛАДР", Параметры, + НСтр("ru = 'Загрузка адресного классификатора'")); + + АдресХранилища = Результат.АдресХранилища; + КонецЕсли; + + Если Результат.ЗаданиеВыполнено Тогда + Результат.Вставить("РезультатЗагрузки", ПолучитьИзВременногоХранилища(АдресХранилища)); + КонецЕсли; + + Возврат Результат; +КонецФункции + +Функция ДвоичныеДанныеФайловКЛАДР(Знач ПереданныеФайлы) + Результат = Новый Массив; + + Для Каждого Элемент Из ПереданныеФайлы Цикл + Описание = Новый Структура("Имя", Элемент.Имя); + Описание.Вставить("Хранение", ПолучитьИзВременногоХранилища(Элемент.Хранение)); + Результат.Добавить(Описание); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Процедура ФоноваяЗагрузкаФайловКЛАДР(Знач Параметры, Знач АдресХранилища) Экспорт + + ОбъектыЗагрузки = Параметры.ОбъектыЗагрузки; + ИсточникДанных = Параметры.ИсточникДанных; + + ПереданныеФайлы = Параметры.ПереданныеФайлы; + Если ТипЗнч(ПереданныеФайлы)=Тип("Строка") Тогда + ПереданныеФайлы = ПолучитьИзВременногоХранилища(ПереданныеФайлы); + КонецЕсли; + + Если ИсточникДанных = 1 Тогда + КаталогФайлов = ИзвлечьФайлыКЛАДРСайт(ПереданныеФайлы); + ИначеЕсли ИсточникДанных = 2 Тогда + КаталогФайлов = ИзвлечьФайлыКЛАДРИТС(ПереданныеФайлы); + ИначеЕсли ИсточникДанных = 3 Тогда + КаталогФайлов = ИзвлечьФайлыКЛАДРДиск(ПереданныеФайлы); + Иначе + ВызватьИсключение НСтр("ru = 'Не поддерживаемый источник данных КЛАДР'"); + КонецЕсли; + + // Определяем версию того, что грузим + Маска = ?(ОбщегоНазначения.ЭтоLinuxСервер(), "[Kk][Ll][Aa][Dd][Rr].[Dd][Bb][Ff]" , "kladr.dbf"); + ФайлыВерсии = НайтиФайлы(КаталогФайлов, Маска, Ложь); + Если ФайлыВерсии.Количество()=0 Тогда + ЗагружаемаяВерсия = ТекущаяДатаСеанса(); + Иначе + ЗагружаемаяВерсия = ФайлыВерсии[0].ПолучитьВремяИзменения(); + КонецЕсли; + + ДоступныеВерсии = Новый Соответствие; + Для Каждого ОбъектЗагрузки Из ОбъектыЗагрузки Цикл + ДоступныеВерсии.Вставить(ОбъектЗагрузки, ЗагружаемаяВерсия); + КонецЦикла; + + ПараметрыЗагрузки = Новый Структура; + ПараметрыЗагрузки.Вставить("АдресныеОбъекты", ОбъектыЗагрузки); + ПараметрыЗагрузки.Вставить("ПутьКДаннымНаСервере", КаталогФайлов); + ПараметрыЗагрузки.Вставить("ВерсияЗагружаемогоКЛАДР", ЗагружаемаяВерсия); + ПараметрыЗагрузки.Вставить("ИсточникДанныхДляЗагрузки", ИсточникДанных); + ПараметрыЗагрузки.Вставить("ДоступныеВерсии", ДоступныеВерсии); + + ЗагрузкаАдресныхСведенийИзФайловКЛАДРВРегистрСведений(ПараметрыЗагрузки, АдресХранилища); + + // И чистим за собой + УдалитьВременныеФайлы(КаталогФайлов); +КонецПроцедуры + +Процедура УдалитьВременныеФайлы(Путь) + Попытка + УдалитьФайлы(Путь); + Исключение + // Будут удалены при перезапуске сеанса, обработка не требуется + КонецПопытки; +КонецПроцедуры + +Функция ИзвлечьФайлыКЛАДРСайт(Знач ПереданныеФайлы) + // С сайта приходят ZIP, внутри которых DBF по регионам + + СерверныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(СерверныйКаталог); + + Для Каждого Описание Из ПереданныеФайлы Цикл + Файл = Новый Файл(Описание.Имя); + Если Врег(Файл.Расширение) <> ".ZIP" Тогда + Продолжить; + КонецЕсли; + ИмяАрхива = СерверныйКаталог + Файл.Имя; + + Данные = ?(ТипЗнч(Описание.Хранение) = Тип("Строка"), ПолучитьИзВременногоХранилища(Описание.Хранение), Описание.Хранение); + Данные.Записать(ИмяАрхива); + + Архив = Новый ЧтениеZipФайла(ИмяАрхива); + Архив.ИзвлечьВсе(СерверныйКаталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); + + УдалитьВременныеФайлы(ИмяАрхива); + КонецЦикла; + + Возврат СерверныйКаталог; +КонецФункции + +Функция ИзвлечьФайлыКЛАДРИТС(Знач ПереданныеФайлы) + // С ИТC приходят файлы *.exe, представляющие собой самораспаковывающийся RAR + // Сейчас они распаковываются на клиенте + + СерверныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(СерверныйКаталог); + + Для Каждого Описание Из ПереданныеФайлы Цикл + Файл = Новый Файл(Описание.Имя); + Если Врег(Файл.Расширение) <> ".DBF" Тогда + Продолжить; + КонецЕсли; + ИмяАрхива = СерверныйКаталог + Файл.Имя; + + Данные = ?(ТипЗнч(Описание.Хранение) = Тип("Строка"), ПолучитьИзВременногоХранилища(Описание.Хранение), Описание.Хранение); + Данные.Записать(ИмяАрхива); + КонецЦикла; + + Возврат СерверныйКаталог; +КонецФункции + +Функция ИзвлечьФайлыКЛАДРДиск(Знач ПереданныеФайлы) + // На диске находятся файлы dbf, можно грузить сразу + + СерверныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла()); + СоздатьКаталог(СерверныйКаталог); + + Для Каждого Описание Из ПереданныеФайлы Цикл + Файл = Новый Файл(Описание.Имя); + Если Врег(Файл.Расширение) <> ".DBF" Тогда + Продолжить; + КонецЕсли; + ИмяФайла = СерверныйКаталог + Файл.Имя; + + Данные = ?(ТипЗнч(Описание.Хранение) = Тип("Строка"), ПолучитьИзВременногоХранилища(Описание.Хранение), Описание.Хранение); + Данные.Записать(ИмяФайла); + КонецЦикла; + + Возврат СерверныйКаталог; +КонецФункции + + //////////////////////////////////////////////////////////////////////////////// // Учет изменений КЛАДР в упаковке домов по данным ФИАС // @@ -3462,7 +3662,7 @@ // Сравниваем по частям Результат = Истина; - // То, что передали, должно быть всегда + // То, что передали, должно быть в найденном всегда Для Каждого КлючЗначение Из Здание Цикл Значение = КлючЗначение.Значение; Ключ = КлючЗначение.Ключ; @@ -3495,8 +3695,8 @@ // Описание - Строка - описание одиночного здания КЛАДР // // Возвращаемое значение: -// Структура - Ключ - идентификатор, значение - номер здания. -// Набор идентификаторов определяется по данным таблицы-результата ТипыЧастейЗдания +// Структура - Ключ - идентификатор, значение - номер здания. +// Набор идентификаторов определяется по данным таблицы-результата ТипыЧастейЗдания // // Неопределено - если описание не удалось распознать. // @@ -3554,6 +3754,44 @@ Возврат Результат; КонецФункции +// Разбирает строковое описание диапазона КЛАДР +// +// Параметры: +// Описание - Строка - описание диапазона домов КЛАДР +// +// Возвращаемое значение: +// Структура с полями: +// Четные - Булево - Истина, если диапазон включает в себя четные дома. +// Нечетные - Булево - Истина, если диапазон включает в себя нечетные дома. +// Состав - Строка - Номера домов через дефис. Пустая строка, если в диапазоне все дома +// +// Неопределено, если описание не удалось распознать. +// +Функция СтруктураОписанияДиапазона(Знач Описание) + Если Не ЭтоДиапазон(Описание) Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = Новый Структура("Четные, Нечетные", Ложь, Ложь); + + ПервыйСимвол = Лев(Описание, 1); + Если ПервыйСимвол="Н" Тогда + Результат.Нечетные = Истина; + Текст = Сред(Описание, 2); + ИначеЕсли ПервыйСимвол="Ч" Тогда + Результат.Четные = Истина; + Текст = Сред(Описание, 2); + Иначе + Результат.Нечетные = Истина; + Результат.Четные = Истина; + Текст = Описание; + КонецЕсли; + + Результат.Вставить("Состав", СокрЛП(СтрЗаменить(СтрЗаменить(Текст, "(", ""), ")", "")) ); + + Возврат Результат; +КонецФункции + // Выделяем числовую часть номера дома // // Параметры: @@ -3675,3 +3913,969 @@ Возврат Результат; КонецФункции +// Возвращает расшифровку всех зданий улиц +// +// Параметры: +// Улица - Структура - поля адресного объекта-улицы, для которой запрашиваются все дома +// +// Возвращаемое значение - ТаблицаЗначений с колонками +// ЭтоДиапазон - Булево - признак того, что описание содержит диапазон +// Значение - Структура - расшифровка данных. Неопределено, если данные не разобраны. +// Описание - Строка - исходное описание +// Индекс - Строка - почтовый индекс +// Код - Строка - код адресного классификатора, соответствующий описанию +// +Функция РасшифровкаВсехЗданийУлицы(Знач Улица) Экспорт + Результат = ВариантыНомеровЗданийУлицы(Улица); + Результат.Колонки.Добавить("Значение"); + + Для Каждого Вариант Из Результат Цикл + Если Вариант.ЭтоДиапазон Тогда + Вариант.Значение = СтруктураОписанияДиапазона(Вариант.Описание); + Иначе + Вариант.Значение = СтруктураОписанияЗдания(Вариант.Описание); + КонецЕсли; + КонецЦикла; + + Результат.Сортировать("ЭтоДиапазон, Индекс"); + Возврат Результат; +КонецФункции + + +//////////////////////////////////////////////////////////////////////////////// +// Данные для подсистемы КонтактнаяИнформация -разрыв связей подсистем +// + +// Возвращает строку для поиска в операторе ПОДОБНО +Функция ЗамаскироватьСпецсимволы(Текст) + Результат = Текст; + Спецсимвол = "\"; + Служебные = "%_[]^" + Спецсимвол; + Для Индекс = 1 По СтрДлина(Служебные) Цикл + Символ = Сред(Служебные, Индекс, 1); + Результат = СтрЗаменить(Результат, Символ, Спецсимвол + Символ); + КонецЦикла; + Возврат Результат; +КонецФункции + +Функция ЗапросДесериализацияАдресаПоПредставлениюКЛАДР(Знач ТаблицаСтранМира = "( ВЫБРАТЬ &НаименованиеРоссии КАК Наименование )") Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ + | ДанныеАдреса.Позиция0 КАК Позиция0, + | ДанныеАдреса.Позиция КАК Позиция, + | ДанныеАдреса.Значение КАК Значение, + | ДанныеАдреса.Наименование КАК Наименование, + | ДанныеАдреса.Сокращение КАК Сокращение, + | ДанныеАдреса.Начало КАК Начало, + | ДанныеАдреса.Длина КАК Длина + |ПОМЕСТИТЬ + | ДанныеАдреса + |ИЗ + | &ДанныеАдреса КАК ДанныеАдреса + |ИНДЕКСИРОВАТЬ ПО + | Позиция0, Позиция, Наименование, Сокращение + |;////////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | ДанныеАдреса.Позиция КАК Позиция, + | ДанныеАдреса.Значение КАК Значение, + | ДанныеАдреса.Наименование КАК Наименование, + | ДанныеАдреса.Сокращение КАК Сокращение, + | + | ДанныеАдреса.Начало КАК Начало, + | ДанныеАдреса.Длина КАК Длина, + | ЛОЖЬ КАК Обработано, + | + | МИНИМУМ(АдресныйКлассификатор.ТипАдресногоЭлемента) КАК УровеньПоКлассификатору, + | ВЫБОР + | КОГДА МИНИМУМ(АдресныйКлассификатор.ТипАдресногоЭлемента) ЕСТЬ NULL ТОГДА ЛОЖЬ + | ИНАЧЕ ИСТИНА + | КОНЕЦ КАК НайденоПоКлассификатору, + | + | МИНИМУМ(АдресныеСокращения.Уровень) КАК УровеньПоСокращениям, + | ВЫБОР + | КОГДА МИНИМУМ(АдресныеСокращения.Уровень) ЕСТЬ NULL ТОГДА ЛОЖЬ + | ИНАЧЕ ИСТИНА + | КОНЕЦ КАК НайденоПоСокращениям, + | + | ВЫБОР + | КОГДА НЕ МИНИМУМ(СтраныМира.Наименование) ЕСТЬ NULL ТОГДА ИСТИНА + | КОГДА ДанныеАдреса.Значение В (&СтраныКлассификатора) ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК НайденоПоСтранамМира, + | + | ВЫБОР + | КОГДА ДанныеАдреса.Значение = &НаименованиеРоссии ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ЭтоСтранаРоссия, + | + | ВЫБОР + | КОГДА ДанныеАдреса.Наименование ПОДОБНО ""[0-9][0-9][0-9][0-9][0-9][0-9]"" ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК НайденоПоИндексу + | + |ИЗ + | ДанныеАдреса КАК ДанныеАдреса + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор + |ПО + | АдресныйКлассификатор.Наименование = ДанныеАдреса.Наименование + | И АдресныйКлассификатор.Сокращение = ДанныеАдреса.Сокращение + | И АдресныйКлассификатор.ТипАдресногоЭлемента <= 5 + | И АдресныйКлассификатор.ТипАдресногоЭлемента >= ДанныеАдреса.Позиция0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныеСокращения КАК АдресныеСокращения + |ПО + | АдресныеСокращения.Сокращение = ДанныеАдреса.Сокращение + | И АдресныеСокращения.Уровень <= 5 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | " + ТаблицаСтранМира + " КАК СтраныМира + |ПО + | СтраныМира.Наименование = ДанныеАдреса.Значение + | + |СГРУППИРОВАТЬ ПО + | ДанныеАдреса.Позиция, + | ДанныеАдреса.Значение, + | ДанныеАдреса.Наименование, + | ДанныеАдреса.Сокращение, + | ДанныеАдреса.Начало, + | ДанныеАдреса.Длина + | + |УПОРЯДОЧИТЬ ПО + | ДанныеАдреса.Позиция УБЫВ + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросРезультатыАвтоПодбораНаселенногоПунктаКЛАДР(Знач ВыбиратьСтрок, Знач СкрыватьНеактуальныеАдреса) Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ + | КодАдресногоОбъектаВКоде КАК КодАдресногоОбъектаВКоде + |ПОМЕСТИТЬ + | ТаблицаЗагруженныхРегионов + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК ЗагруженныеРегионыВнутр + |ГДЕ + | ТипАдресногоЭлемента = 1 + | И 1 В ( + | ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 + | ) + |ИНДЕКСИРОВАТЬ ПО + | КодАдресногоОбъектаВКоде + |;////////////////////////////////////////////////////////////////////////////////////////// + | + |ВЫБРАТЬ + | ВЫБОР + | КОГДА ЗагруженныеРегионы.КодАдресногоОбъектаВКоде ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК МожноЗагружатьРегион, + | ОтобранныеАдреса.* + | + |ИЗ ( + | + |ВЫБРАТЬ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " + | + | Адреса.КодАдресногоОбъектаВКоде КАК КодАдресногоОбъектаВКоде, + | + | Адреса.Код КАК Код, + | Адреса.Наименование КАК АдресаНаименование, + | + | ВЫБОР + | КОГДА Адреса.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК ПоложениеВСтроке, + | + | ВЫБОР + | КОГДА Адреса.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Регионы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Районы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Города.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА НаселенныеПункты.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | Регионы.Сокращение КАК РегионыСокращение, + | Регионы.Наименование КАК РегионыНаименование, + | Районы.Сокращение КАК РайоныСокращение, + | Районы.Наименование КАК РайоныНаименование, + | Города.Сокращение КАК ГородаСокращение, + | Города.Наименование КАК ГородаНаименование, + | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, + | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Адреса + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Регионы + |ПО + | Регионы.ТипАдресногоЭлемента = 1 + | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Регионы.КодРайонаВКоде = 0 + | И Регионы.КодГородаВКоде = 0 + | И Регионы.КодНаселенногоПунктаВКоде = 0 + | И Регионы.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Регионы.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Районы + |ПО + | Районы.ТипАдресногоЭлемента = 2 + | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Районы.КодГородаВКоде = 0 + | И Районы.КодНаселенногоПунктаВКоде = 0 + | И Районы.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Районы.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Города + |ПО + | Города.ТипАдресногоЭлемента = 3 + | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Города.КодГородаВКоде = Адреса.КодГородаВКоде + | И Города.КодНаселенногоПунктаВКоде = 0 + | И Города.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Города.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты + |ПО + | НаселенныеПункты.ТипАдресногоЭлемента = 4 + | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде + | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде + | И НаселенныеПункты.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И НаселенныеПункты.ПризнакАктуальности = 0","") + " + | + |ГДЕ + | Адреса.ТипАдресногоЭлемента <= 4 + | " + ?(СкрыватьНеактуальныеАдреса, "И Адреса.ПризнакАктуальности = 0","") + " + | + | И ( + | // В начале строки + | Адреса.Наименование ПОДОБНО &НачалоТекста СПЕЦСИМВОЛ ""\"" + | ИЛИ + | // В начале слова + | Адреса.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" + | ) + | + |) ОтобранныеАдреса + | + |ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗагруженныхРегионов КАК ЗагруженныеРегионы + | + |ПО + | ЗагруженныеРегионы.КодАдресногоОбъектаВКоде = ОтобранныеАдреса.КодАдресногоОбъектаВКоде + | + |УПОРЯДОЧИТЬ ПО + | ОтобранныеАдреса.ПоложениеВСтроке, + | ОтобранныеАдреса.РегионыНаименование, + | ОтобранныеАдреса.РайоныНаименование, + | ОтобранныеАдреса.ГородаНаименование, + | ОтобранныеАдреса.НаселенныеПунктыНаименование, + | ОтобранныеАдреса.АдресаНаименование + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросРезультатыАвтоПодбораУлицыКЛАДР(Знач ВыбиратьСтрок, Знач СкрыватьНеактуальныеАдреса) Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " + | Улицы.Код КАК Код, + | + | ВЫБОР + | КОГДА Улицы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | Улицы.Наименование КАК Наименование, + | Улицы.Сокращение КАК Сокращение + | + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныйПункт + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Улицы + |ПО + | Улицы.ТипАдресногоЭлемента = 5 + | И Улицы.КодАдресногоОбъектаВКоде = НаселенныйПункт.КодАдресногоОбъектаВКоде + | И Улицы.КодРайонаВКоде = НаселенныйПункт.КодРайонаВКоде + | И Улицы.КодГородаВКоде = НаселенныйПункт.КодГородаВКоде + | И Улицы.КодНаселенногоПунктаВКоде = НаселенныйПункт.КодНаселенногоПунктаВКоде + | " + ?(СкрыватьНеактуальныеАдреса, "И Улицы.ПризнакАктуальности = 0","") + " + | + |ГДЕ + | НаселенныйПункт.Код = &Код + | И ( + | Улицы.Наименование ПОДОБНО &НачалоСтроки СПЕЦСИМВОЛ ""\"" + | ИЛИ + | Улицы.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" + | ) + | + |УПОРЯДОЧИТЬ ПО + | Улицы.Наименование + |"); + + Возврат Запрос; +КонецФункции + +// Парсинг из строки текста +Функция ЗапросНаселенныеПунктыПоПредставлениюКЛАДР(Знач ЧастиАдреса, Знач ВыбиратьСтрок, Знач СкрыватьНеактуальныеАдреса) Экспорт + + ДополнительныхСтрокПоиска = ЧастиАдреса.ВГраница(); + + Запрос = Новый Запрос; + ОграничительСверху = "яяяяя"; + + Наименование = ЧастиАдреса[0].Наименование; + Сокращение = ЧастиАдреса[0].Сокращение; + Если ДополнительныхСтрокПоиска = 0 И ПустаяСтрока(Сокращение) Тогда + УсловиеНаименования = "(Адреса.Наименование >= &НаименованиеПоиска0 И Адреса.Наименование < &ОграничительПоиска0)"; + Иначе + УсловиеНаименования = "(Адреса.Наименование = &НаименованиеПоиска0 И Адреса.Сокращение = &СокращениеПоиска0)"; + КонецЕсли; + Запрос.УстановитьПараметр("НаименованиеПоиска0", Наименование); + Запрос.УстановитьПараметр("ОграничительПоиска0", Наименование + ОграничительСверху); + Запрос.УстановитьПараметр("СокращениеПоиска0", Сокращение); + + Для Позиция = 1 По ДополнительныхСтрокПоиска Цикл + НомерПозиции = Формат(Позиция, "ЧН=; ЧГ="); + ИмяПараметраНаименование = "НаименованиеПоиска" + НомерПозиции; + ИмяПараметраСокращение = "СокращениеПоиска" + НомерПозиции; + ИмяПараметраОграничитель = "ОграничительПоиска" + НомерПозиции; + + Наименование = ЧастиАдреса[Позиция].Наименование; + Сокращение = ЧастиАдреса[Позиция].Сокращение; + Если ПустаяСтрока(Сокращение) Тогда + УсловиеНаименования = УсловиеНаименования + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" + |И ( + | (НаселенныеПункты.Наименование >= &%1 И НаселенныеПункты.Наименование < &%2) + | ИЛИ (Города.Наименование >= &%1 И Города.Наименование < &%2) + | ИЛИ (Районы.Наименование >= &%1 И Районы.Наименование < &%2) + | ИЛИ (Регионы.Наименование >= &%1 И Регионы.Наименование < &%2) + |)", + ИмяПараметраНаименование, ИмяПараметраОграничитель); + Иначе + УсловиеНаименования = УсловиеНаименования + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" + |И ( + | (НаселенныеПункты.Наименование = &%1 И НаселенныеПункты.Сокращение = &%2) + | ИЛИ (Города.Наименование = &%1 И Города.Сокращение = &%2) + | ИЛИ (Районы.Наименование = &%1 И Районы.Сокращение = &%2) + | ИЛИ (Регионы.Наименование = &%1 И Регионы.Сокращение = &%2) + |)", + ИмяПараметраНаименование, ИмяПараметраСокращение); + КонецЕсли; + Запрос.УстановитьПараметр(ИмяПараметраНаименование, Наименование); + Запрос.УстановитьПараметр(ИмяПараметраОграничитель, Наименование + ОграничительСверху); + Запрос.УстановитьПараметр(ИмяПараметраСокращение, Сокращение); + КонецЦикла; + + Запрос.Текст = " + |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " + | Адреса.Код КАК Код, + | + | ВЫБОР + | КОГДА Адреса.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Регионы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Районы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА Города.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | КОГДА НаселенныеПункты.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | Регионы.Код КАК РегионыКод, + | Регионы.Сокращение КАК РегионыСокращение, + | Регионы.Наименование КАК РегионыНаименование, + | + | Районы.Код КАК РайоныКод, + | Районы.Сокращение КАК РайоныСокращение, + | Районы.Наименование КАК РайоныНаименование, + | + | Города.Код КАК ГородаКод, + | Города.Сокращение КАК ГородаСокращение, + | Города.Наименование КАК ГородаНаименование, + | + | НаселенныеПункты.Код КАК НаселенныеПунктыКод, + | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, + | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Адреса + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Регионы + |ПО + | Регионы.ТипАдресногоЭлемента = 1 + | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Регионы.КодРайонаВКоде = 0 + | И Регионы.КодГородаВКоде = 0 + | И Регионы.КодНаселенногоПунктаВКоде = 0 + | И Регионы.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Регионы.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Районы + |ПО + | Районы.ТипАдресногоЭлемента = 2 + | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Районы.КодГородаВКоде = 0 + | И Районы.КодНаселенногоПунктаВКоде = 0 + | И Районы.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Районы.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Города + |ПО + | Города.ТипАдресногоЭлемента = 3 + | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Города.КодГородаВКоде = Адреса.КодГородаВКоде + | И Города.КодНаселенногоПунктаВКоде = 0 + | И Города.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И Города.ПризнакАктуальности = 0","") + " + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты + |ПО + | НаселенныеПункты.ТипАдресногоЭлемента = 4 + | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде + | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде + | И НаселенныеПункты.КодУлицыВКоде = 0 + | " + ?(СкрыватьНеактуальныеАдреса, "И НаселенныеПункты.ПризнакАктуальности = 0","") + " + | + |ГДЕ + | Адреса.ТипАдресногоЭлемента <= 4 + | " + ?(СкрыватьНеактуальныеАдреса, "И Адреса.ПризнакАктуальности = 0","") + " + | И (" + УсловиеНаименования + ") + | + |УПОРЯДОЧИТЬ ПО + | Адреса.ПризнакАктуальности, // Актуальные - вперед + | + | Адреса.Наименование, + | НаселенныеПункты.Наименование, + | Города.Наименование, + | Районы.Наименование, + | Регионы.Наименование + |"; + + Возврат Запрос; +КонецФункции + +// Парсинг из строки текста +Функция ЗапросУлицыПоПредставлениюКЛАДР(Знач ЧастиАдреса, Знач ВыбиратьСтрок, Знач СкрыватьНеактуальныеАдреса) Экспорт + + НаименованиеПоиска = ЧастиАдреса[0].Наименование; + СокращениеПоиска = ЧастиАдреса[0].Сокращение; + Если ПустаяСтрока(СокращениеПоиска) Тогда + УсловиеНаименования = "Улицы.Наименование ПОДОБНО &НачалоСтроки СПЕЦСИМВОЛ ""\"" ИЛИ Улицы.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" "; + Иначе + УсловиеНаименования = "Улицы.Наименование = &НаименованиеПоиска И Улицы.Сокращение = &СокращениеПоиска" + КонецЕсли; + + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " + | Улицы.Код КАК Код, + | + | ВЫБОР + | КОГДА Улицы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | Улицы.Наименование КАК Наименование, + | Улицы.Сокращение КАК Сокращение + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныйПункт + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Улицы + |ПО + | Улицы.ТипАдресногоЭлемента = 5 + | И Улицы.КодАдресногоОбъектаВКоде = НаселенныйПункт.КодАдресногоОбъектаВКоде + | И Улицы.КодРайонаВКоде = НаселенныйПункт.КодРайонаВКоде + | И Улицы.КодГородаВКоде = НаселенныйПункт.КодГородаВКоде + | И Улицы.КодНаселенногоПунктаВКоде = НаселенныйПункт.КодНаселенногоПунктаВКоде + | + |ГДЕ + | НаселенныйПункт.Код = &КодНаселенногоПункта + | " + ?(СкрыватьНеактуальныеАдреса, "И Улицы.ПризнакАктуальности = 0","") + " + | И (" + УсловиеНаименования + ") + | + |УПОРЯДОЧИТЬ ПО + | Улицы.ПризнакАктуальности, + | Улицы.Наименование + |"); + + // Частично известные параметры + Запрос.УстановитьПараметр("НаименованиеПоиска", НаименованиеПоиска); + Запрос.УстановитьПараметр("СокращениеПоиска", СокращениеПоиска); + + Возврат Запрос; +КонецФункции + +Функция ЗапросСписокРеквизитовНаселенныйПунктКЛАДР() Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ + | НаселенныеПункты.Код КАК НаселенныеПунктыКод, + | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование, + | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, + | Города.Код КАК ГородаКод, + | Города.Наименование КАК ГородаНаименование, + | Города.Сокращение КАК ГородаСокращение, + | Районы.Код КАК РайоныКод, + | Районы.Наименование КАК РайоныНаименование, + | Районы.Сокращение КАК РайоныСокращение, + | Регионы.Код КАК РегионыКод, + | Регионы.Наименование КАК РегионыНаименование, + | Регионы.Сокращение КАК РегионыСокращение + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Адреса + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Регионы + |ПО + | Регионы.ТипАдресногоЭлемента = 1 + | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Регионы.КодРайонаВКоде = 0 + | И Регионы.КодГородаВКоде = 0 + | И Регионы.КодНаселенногоПунктаВКоде = 0 + | И Регионы.КодУлицыВКоде = 0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Районы + |ПО + | Районы.ТипАдресногоЭлемента = 2 + | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Районы.КодГородаВКоде = 0 + | И Районы.КодНаселенногоПунктаВКоде = 0 + | И Районы.КодУлицыВКоде = 0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Города + |ПО + | Города.ТипАдресногоЭлемента = 3 + | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Города.КодГородаВКоде = Адреса.КодГородаВКоде + | И Города.КодНаселенногоПунктаВКоде = 0 + | И Города.КодУлицыВКоде = 0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты + |ПО + | НаселенныеПункты.ТипАдресногоЭлемента = 4 + | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде + | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде + | И НаселенныеПункты.КодУлицыВКоде = 0 + | + |ГДЕ + | Адреса.Код = &Код + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросСписокРеквизитовУлицаКЛАДР() Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ + | Улицы.Код КАК УлицыКод, + | Улицы.Наименование КАК УлицыНаименование, + | Улицы.Сокращение КАК УлицыСокращение + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Улицы + |ГДЕ + | Улицы.Код = &Код + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросСписокАнализаЭлементаАдресаКЛАДР(Знач ЧастиАдреса, Знач Уровень, Знач Наименование, Знач Сокращение, Знач ПоискПоПодобию, Знач ВыбиратьСтрок) Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " + | + | Адреса.Код КАК Код, + | Адреса.Индекс КАК Индекс, + | Адреса.ПризнакАктуальности КАК ПризнакАктуальности, + | Адреса.Наименование КАК АдресаНаименование, + | Адреса.Сокращение КАК АдресаСокращение, + | + | ВЫБОР + | КОГДА Адреса.ПризнакАктуальности > 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | " + ?(Уровень = 1, " + | ВЫБОР КОГДА РегионЗагружен.Код ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ + | ", " + | ЛОЖЬ + | ") + " КАК МожноЗагружатьРегион + | + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК Адреса + |"); + + // Добавляем информацию о загруженности региона + Если Уровень = 1 Тогда + Запрос.Текст = Запрос.Текст + " + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК РегионЗагружен + |ПО + | РегионЗагружен.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И РегионЗагружен.ТипАдресногоЭлемента = 1 + | И 1 В ( + | ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 + | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде = РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 + | ) + |"; + КонецЕсли; + Если Уровень > 1 Тогда + // Район, опираемся на регион + Запрос.Текст = Запрос.Текст + " + |ВНУТРЕННЕЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Регионы + |ПО + | Регионы.ТипАдресногоЭлемента = 1 + | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Регионы.КодРайонаВКоде = 0 + | И Регионы.КодГородаВКоде = 0 + | И Регионы.КодНаселенногоПунктаВКоде = 0 + | И Регионы.КодУлицыВКоде = 0 + | И Регионы.Наименование = &Регион + | И Регионы.Сокращение = &РегионСокращение + |"; + Запрос.УстановитьПараметр("Регион", ЧастиАдреса.Регион.Наименование); + Запрос.УстановитьПараметр("РегионСокращение", ЧастиАдреса.Регион.Сокращение); + КонецЕсли; + Если Уровень > 2 И (Не ПустаяСтрока(ЧастиАдреса.Район.Наименование)) Тогда + // Город, опираемся на район + регион, район возможно пуст + Запрос.Текст = Запрос.Текст + " + |ВНУТРЕННЕЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Районы + |ПО + | Районы.ТипАдресногоЭлемента = 2 + | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Районы.КодГородаВКоде = 0 + | И Районы.КодНаселенногоПунктаВКоде = 0 + | И Районы.КодУлицыВКоде = 0 + | И Районы.Наименование = &Район + | И Районы.Сокращение = &РайонСокращение + |"; + Запрос.УстановитьПараметр("Район", ЧастиАдреса.Район.Наименование); + Запрос.УстановитьПараметр("РайонСокращение", ЧастиАдреса.Район.Сокращение); + КонецЕсли; + Если Уровень > 3 И (Не ПустаяСтрока(ЧастиАдреса.Город.Наименование)) Тогда + // Населенный пункт, опираемся на регион + район + город, район возможно пуст, город возможно пуст + Запрос.Текст = Запрос.Текст + " + |ВНУТРЕННЕЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Города + |ПО + | Города.ТипАдресногоЭлемента = 3 + | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И Города.КодГородаВКоде = Адреса.КодГородаВКоде + | И Города.КодНаселенногоПунктаВКоде = 0 + | И Города.КодУлицыВКоде = 0 + | И Города.Наименование = &Город + | И Города.Сокращение = &ГородСокращение + |"; + Запрос.УстановитьПараметр("Город", ЧастиАдреса.Город.Наименование); + Запрос.УстановитьПараметр("ГородСокращение", ЧастиАдреса.Город.Сокращение); + КонецЕсли; + Если Уровень > 4 И (Не ПустаяСтрока(ЧастиАдреса.НаселенныйПункт.Наименование)) Тогда + // Улица, опираемся на регион + район + город + населенный пункт, возможно пустые + Запрос.Текст = Запрос.Текст + " + |ВНУТРЕННЕЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты + |ПО + | НаселенныеПункты.ТипАдресногоЭлемента = 4 + | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде + | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде + | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде + | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде + | И НаселенныеПункты.КодУлицыВКоде = 0 + | + | И НаселенныеПункты.Наименование = &НаселенныйПункт + | И НаселенныеПункты.Сокращение = &НаселенныйПунктСокращение + |"; + Запрос.УстановитьПараметр("НаселенныйПункт", ЧастиАдреса.НаселенныйПункт.Наименование); + Запрос.УстановитьПараметр("НаселенныйПунктСокращение", ЧастиАдреса.НаселенныйПункт.Сокращение); + КонецЕсли; + + Если ПустаяСтрока(Сокращение) Тогда + УсловиеСокращения = ""; + Иначе + Если ПоискПоПодобию Тогда + УсловиеСокращения = "И Адреса.Сокращение ПОДОБНО &Сокращение СПЕЦСИМВОЛ ""\"" "; + Запрос.УстановитьПараметр("Сокращение", ЗамаскироватьСпецсимволы(Сокращение) + "%"); + Иначе + УсловиеСокращения = "И Адреса.Сокращение = &Сокращение"; + Запрос.УстановитьПараметр("Сокращение", Сокращение); + КонецЕсли; + КонецЕсли; + + Если ПоискПоПодобию Тогда + УсловиеНаименования = "И Адреса.Наименование ПОДОБНО &Наименование СПЕЦСИМВОЛ ""\"" "; + Запрос.УстановитьПараметр("Наименование", ЗамаскироватьСпецсимволы(Наименование) + "%"); + Иначе + УсловиеНаименования = "И Адреса.Наименование = &Наименование"; + Запрос.УстановитьПараметр("Наименование", Наименование); + КонецЕсли; + + Запрос.Текст = Запрос.Текст + " + |ГДЕ + | Адреса.ТипАдресногоЭлемента = &Уровень + | " + УсловиеНаименования + " + | " + УсловиеСокращения + " + |УПОРЯДОЧИТЬ ПО + | Адреса.ПризнакАктуальности, + | + | Адреса.Наименование + |"; + + Возврат Запрос; +КонецФункции + +Функция ЗапросАдресаПоИндексуКЛАДР(Знач ВыбиратьСтрок, Знач СкрыватьНеактуальные) Экспорт + ФрагментПервые = ?(ВыбиратьСтрок > 0, "ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ="), ""); + + Запрос = Новый Запрос(" + |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ " + ФрагментПервые + " + | + | ВЫБОР + | КОГДА ПочтовыеИндексы.ПризнакАктуальности <> 0 ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК Неактуален, + | + | ПочтовыеИндексы.Индекс КАК Индекс, + | + | // Синтетический код объекта, к которому относится индекс - СС РРР ГГГ ППП УУУУ АА ДДДД + | 1000000 * ВЫРАЗИТЬ( ПочтовыеИндексы.Код /1000000 - 0.5 КАК ЧИСЛО(21,0)) КАК Код, + | + | // Остальные колонки - вспомогательные, будут удалены из результата + | + | Улицы.Наименование КАК УлицаНаименование, + | Улицы.Сокращение КАК УлицаСокращение, + | Улицы.Наименование + "" "" + Улицы.Сокращение КАК ПредставлениеУлица, + | + | НаселенныеПункты.Наименование КАК НаселенныйПунктНаименование, + | НаселенныеПункты.Сокращение КАК НаселенныйПунктСокращение, + | НаселенныеПункты.Наименование + "" "" + НаселенныеПункты.Сокращение КАК ПредставлениеНаселенныйПункт, + | + | Города.Наименование КАК ГородНаименование, + | Города.Сокращение КАК ГородСокращение, + | Города.Наименование + "" "" + Города.Сокращение КАК ПредставлениеГород, + | + | Районы.Наименование КАК РайонНаименование, + | Районы.Сокращение КАК РайонСокращение, + | Районы.Наименование + "" "" + Районы.Сокращение КАК ПредставлениеРайон, + | + | Регионы.Наименование КАК РегионНаименование, + | Регионы.Сокращение КАК РегионСокращение, + | Регионы.Наименование + "" "" + Регионы.Сокращение КАК ПредставлениеРегион + | + |ПОМЕСТИТЬ + | АдресаПоПочтовымИндексам + | + |ИЗ + | РегистрСведений.АдресныйКлассификатор КАК ПочтовыеИндексы + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Улицы + |ПО + | Улицы.ТипАдресногоЭлемента = 5 + | " + ?(СкрыватьНеактуальные, "И Улицы.ПризнакАктуальности = 0","") + " + | И Улицы.КодАдресногоОбъектаВКоде = ПочтовыеИндексы.КодАдресногоОбъектаВКоде + | И Улицы.КодРайонаВКоде = ПочтовыеИндексы.КодРайонаВКоде + | И Улицы.КодГородаВКоде = ПочтовыеИндексы.КодГородаВКоде + | И Улицы.КодНаселенногоПунктаВКоде = ПочтовыеИндексы.КодНаселенногоПунктаВКоде + | И Улицы.КодУлицыВКоде = ПочтовыеИндексы.КодУлицыВКоде + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты + |ПО + | НаселенныеПункты.ТипАдресногоЭлемента = 4 + | " + ?(СкрыватьНеактуальные, "И НаселенныеПункты.ПризнакАктуальности = 0","") + " + | И НаселенныеПункты.КодАдресногоОбъектаВКоде = ПочтовыеИндексы.КодАдресногоОбъектаВКоде + | И НаселенныеПункты.КодРайонаВКоде = ПочтовыеИндексы.КодРайонаВКоде + | И НаселенныеПункты.КодГородаВКоде = ПочтовыеИндексы.КодГородаВКоде + | И НаселенныеПункты.КодНаселенногоПунктаВКоде = ПочтовыеИндексы.КодНаселенногоПунктаВКоде + | И НаселенныеПункты.КодУлицыВКоде = 0 + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Города + |ПО + | Города.ТипАдресногоЭлемента = 3 + | " + ?(СкрыватьНеактуальные, "И Города.ПризнакАктуальности = 0","") + " + | И Города.КодАдресногоОбъектаВКоде = ПочтовыеИндексы.КодАдресногоОбъектаВКоде + | И Города.КодРайонаВКоде = ПочтовыеИндексы.КодРайонаВКоде + | И Города.КодГородаВКоде = ПочтовыеИндексы.КодГородаВКоде + | И Города.КодНаселенногоПунктаВКоде = 0 + | И Города.КодУлицыВКоде = 0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Районы + |ПО + | Районы.ТипАдресногоЭлемента = 2 + | " + ?(СкрыватьНеактуальные, "И Районы.ПризнакАктуальности = 0","") + " + | И Районы.КодАдресногоОбъектаВКоде = ПочтовыеИндексы.КодАдресногоОбъектаВКоде + | И Районы.КодРайонаВКоде = ПочтовыеИндексы.КодРайонаВКоде + | И Районы.КодГородаВКоде = 0 + | И Районы.КодНаселенногоПунктаВКоде = 0 + | И Районы.КодУлицыВКоде = 0 + | + |ЛЕВОЕ СОЕДИНЕНИЕ + | РегистрСведений.АдресныйКлассификатор КАК Регионы + |ПО + | Регионы.ТипАдресногоЭлемента = 1 + | " + ?(СкрыватьНеактуальные, "И Регионы.ПризнакАктуальности = 0","") + " + | И Регионы.КодАдресногоОбъектаВКоде = ПочтовыеИндексы.КодАдресногоОбъектаВКоде + | И Регионы.КодРайонаВКоде = 0 + | И Регионы.КодГородаВКоде = 0 + | И Регионы.КодНаселенногоПунктаВКоде = 0 + | И Регионы.КодУлицыВКоде = 0 + | + |ГДЕ + | ПочтовыеИндексы.Индекс = &ПочтовыйИндекс + | " + ?(СкрыватьНеактуальные, "И ПочтовыеИндексы.ПризнакАктуальности = 0","") + " + | + |" + ?(ПустаяСтрока(ФрагментПервые), "", " + |УПОРЯДОЧИТЬ ПО + | Индекс, + | УлицаНаименование, УлицаСокращение, + | НаселенныйПунктНаименование, НаселенныйПунктСокращение, + | ГородНаименование, ГородСокращение, + | РайонНаименование, РайонСокращение, + | РегионНаименование, РегионСокращение + |") + " + | + |ИНДЕКСИРОВАТЬ ПО + | ПредставлениеУлица, ПредставлениеНаселенныйПункт, ПредставлениеГород, ПредставлениеРайон, ПредставлениеРегион + |;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + | + |// Основной результат + |ВЫБРАТЬ + | * + |ИЗ + | АдресаПоПочтовымИндексам + |УПОРЯДОЧИТЬ ПО + | Индекс, + | УлицаНаименование, УлицаСокращение, + | НаселенныйПунктНаименование, НаселенныйПунктСокращение, + | ГородНаименование, ГородСокращение, + | РайонНаименование, РайонСокращение, + | РегионНаименование, РегионСокращение + |;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + | + |// Вспомогательный результат + |ВЫБРАТЬ + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеУлица, """")) ТОГДА + | МИНИМУМ(УлицаНаименование) ИНАЧЕ """" КОНЕЦ КАК УлицаНаименование, + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеУлица, """")) ТОГДА + | МИНИМУМ(УлицаСокращение) ИНАЧЕ """" КОНЕЦ КАК УлицаСокращение, + | + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеНаселенныйПункт, """")) ТОГДА + | МИНИМУМ(НаселенныйПунктНаименование) ИНАЧЕ """" КОНЕЦ КАК НаселенныйПунктНаименование, + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеНаселенныйПункт, """")) ТОГДА + | МИНИМУМ(НаселенныйПунктСокращение) ИНАЧЕ """" КОНЕЦ КАК НаселенныйПунктСокращение, + | + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеГород, """")) ТОГДА + | МИНИМУМ(ГородНаименование) ИНАЧЕ """" КОНЕЦ КАК ГородНаименование, + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеГород, """")) ТОГДА + | МИНИМУМ(ГородСокращение) ИНАЧЕ """" КОНЕЦ КАК ГородСокращение, + | + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеРайон, """")) ТОГДА + | МИНИМУМ(РайонНаименование) ИНАЧЕ """" КОНЕЦ КАК РайонНаименование, + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеРайон, """")) ТОГДА + | МИНИМУМ(РайонСокращение) ИНАЧЕ """" КОНЕЦ КАК РайонСокращение, + | + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеРегион, """")) ТОГДА + | МИНИМУМ(РегионНаименование) ИНАЧЕ """" КОНЕЦ КАК РегионНаименование, + | ВЫБОР КОГДА 1 = КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЕСТЬNULL(ПредставлениеРегион, """")) ТОГДА + | МИНИМУМ(РегионСокращение) ИНАЧЕ """" КОНЕЦ КАК РегионСокращение + |ИЗ + | АдресаПоПочтовымИндексам + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросКодРегионаКЛАДР() Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ ПЕРВЫЕ 1 + | КодАдресногоОбъектаВКоде КАК Код + |ИЗ + | РегистрСведений.АдресныйКлассификатор + |ГДЕ + | ТипАдресногоЭлемента = 1 + | И КодРайонаВКоде = 0 + | И КодГородаВКоде = 0 + | И КодНаселенногоПунктаВКоде = 0 + | И КодУлицыВКоде = 0 + | + | И Наименование = &Наименование + | И Сокращение = &Сокращение + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросРегионКодаКЛАДР() Экспорт + + Запрос = Новый Запрос(" + |ВЫБРАТЬ ПЕРВЫЕ 1 + | Наименование + "" "" + Сокращение КАК Регион + |ИЗ + | РегистрСведений.АдресныйКлассификатор + |ГДЕ + | ТипАдресногоЭлемента = 1 + | И КодАдресногоОбъектаВКоде = &Код + | И КодРайонаВКоде = 0 + | И КодГородаВКоде = 0 + | И КодНаселенногоПунктаВКоде = 0 + | И КодУлицыВКоде = 0 + |"); + + Возврат Запрос; +КонецФункции + +Функция ЗапросВсеРегионыКЛАДР() Экспорт + Запрос = Новый Запрос(" + |ВЫБРАТЬ + | КодАдресногоОбъектаВКоде КАК Код, + | Наименование КАК Наименование, + | Сокращение КАК Сокращение, + | Наименование + "" "" + Сокращение КАК Представление + |ИЗ + | РегистрСведений.АдресныйКлассификатор + |ГДЕ + | ТипАдресногоЭлемента = 1 + | И КодРайонаВКоде = 0 + | И КодГородаВКоде = 0 + | И КодНаселенногоПунктаВКоде = 0 + | И КодУлицыВКоде = 0 + |"); + + Возврат Запрос; +КонецФункции + \ No newline at end of file diff --git a/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl index 6a0aaf1bd..84c640acc 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторВызовСервера/Module.bsl @@ -9,13 +9,12 @@ // Проверяет наличие обновлений адресного классификатора на веб сервере // для тех объектов, которые ранее уже загружались. // -// Возвращаемое значение -// Массив структур, в котором каждая структура имеет формат: -// ключ КодАдресногоОбъекта - строка - код адресного объекта -// ключ Наименование - строка - наименование адресного объекта -// ключ Сокращение - строка - сокращение адресного объекта -// ключ Индекс - строка - индекс адресного объекта -// ключ ОбновлениеДоступно - Булево +// Возвращаемое значение - Массив - Содержит структуры с полями: +// КодАдресногоОбъекта - Строка - Код адресного объекта +// Наименование - Строка - Наименование адресного объекта +// Сокращение - Строка - Сокращение адресного объекта +// Индекс - Строка - Индекс адресного объекта +// ОбновлениеДоступно - Булево // Функция ПроверитьОбновлениеАдресныхОбъектовСервер() Экспорт @@ -26,8 +25,7 @@ // Возвращает версию адресных объектов, записанную при последнем обновлении // Если записи об адресном объекте нет - возвращается дата 01.09.2008 // -// Возвращаемое значение -// Массив соответствий: ключ - номер адресного объекта, значение - дата выпуска версии +// Возвращаемое значение - Массив - Содержит соответствия, где ключ - номер адресного объекта, значение - дата выпуска версии // Функция ПолучитьВерсииАдресныхОбъектов() Экспорт @@ -37,15 +35,14 @@ // Возвращает структуру, содержащую информацию по адресному объекту // -// Параметры -// КодАдресногоОбъекта - Строка - номер адресного объекта от 1 до 89 + 99 в формате NN +// Параметры: +// КодАдресногоОбъекта - Строка - Номер адресного объекта от 1 до 89 + 99 в формате NN // -// Возвращаемое значение -// Структура, с ключами: -// КодАдресногоОбъекта - Строка - код адресного объекта. -// Наименование - Строка - наименование адресного объекта. -// Сокращение - Строка - сокращение адресного объекта. -// Индекс - Строка - индекс. +// Возвращаемое значение - Структура - Описание адресного объекта с полями: +// КодАдресногоОбъекта - Строка - Код адресного объекта. +// Наименование - Строка - Наименование адресного объекта. +// Сокращение - Строка - Сокращение адресного объекта. +// Индекс - Строка - Индекс. // Функция ИнформацияПоАдресномуОбъекту(КодАдресногоОбъекта) Экспорт @@ -57,12 +54,9 @@ // версии сведений по адресным объектам // // Параметры: -// ТекстXML - Строка - строка, содержащая текст XML. +// ТекстXML - Строка - Строка, содержащая текст XML. // -// Возвращаемое значение: -// Соответствие с полями: -// Ключ - Строка - адресный объект. -// Значение - Дата - дата актуальности адресного объекта. +// Возвращаемое значение - Соответствие - Описание файла версий: Ключ - Строка - адресный объект, Значение - Дата - дата актуальности адресного объекта. // Функция ПолучитьВерсииАдресныхСведений(ТекстXML) Экспорт diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl index 808466683..861e7e5bf 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиент/Module.bsl @@ -11,7 +11,7 @@ Процедура ЗагрузитьАдресныйКлассификатор() Экспорт #Если ВебКлиент Тогда - Предупреждение(НСтр("ru = 'В веб-клиенте загрузка адресного классификатора не поддерживается.'")); + ПоказатьПредупреждение(, НСтр("ru='В веб-клиенте загрузка адресного классификатора не поддерживается.'")); #Иначе ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ЗагрузкаАдресногоКлассификатора"); #КонецЕсли @@ -30,59 +30,66 @@ #КонецЕсли Если Не Результат.Статус Тогда - Предупреждение(Результат.СообщениеОбОшибке); + ПоказатьПредупреждение(, Результат.СообщениеОбОшибке); Возврат; КонецЕсли; - Если Результат.Значение.Количество() <> 0 Тогда - КоличествоОбновлений = 0; - СписокСтрока = ""; - АдресныеОбъекты = Новый Массив; - - Для Каждого АдресныйОбъект Из Результат.Значение Цикл - Если АдресныйОбъект.КодАдресногоОбъекта<>"AL" И АдресныйОбъект.ОбновлениеДоступно Тогда - КоличествоОбновлений = КоличествоОбновлений + 1; - АдресныеОбъекты.Добавить(Лев(АдресныйОбъект.КодАдресногоОбъекта, 2)); - СписокСтрока = СписокСтрока + Лев(АдресныйОбъект.КодАдресногоОбъекта, 2) - + " - " + АдресныйОбъект.Наименование + " " + АдресныйОбъект.Сокращение + Символы.ПС; - КонецЕсли; - КонецЦикла; - - Если КоличествоОбновлений > 0 Тогда - // Полный список - Заголовок = НСтр("ru = 'Обновление адресного классификатора'"); - Текст = НСтр("ru = 'Обнаружены обновления регионов:'") + Символы.ПС + СписокСтрока; -#Если ВебКлиент Тогда - СтандартныеПодсистемыКлиент.ВопросПользователю( - Текст, РежимДиалогаВопрос.ОК, 0, КодВозвратаДиалога.ОК, Заголовок, - Неопределено, Ложь, Ложь); -#Иначе - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("Да", НСтр("ru='Обновить'")); - Кнопки.Добавить("Нет", НСтр("ru='Отмена'")); - - Результат = СтандартныеПодсистемыКлиент.ВопросПользователю( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Приступить к обновлению адресного классификатора на версию от %1?'"), - Формат(Результат.ВерсияПоследнегоОбновленияКЛАДР, "ДЛФ=D") - ) + Символы.ПС + Символы.ПС + Текст, - Кнопки, 0, "Да", Заголовок, Неопределено, Ложь, Ложь); - - Если Результат="Да" Тогда - ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ЗагрузкаАдресногоКлассификатора", - Новый Структура("АдресныеОбъекты", АдресныеОбъекты) ); - КонецЕсли; -#КонецЕсли - Иначе - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Обновление адресного классификатора не требуется. - |В программу уже загружены актуальные адресные сведения от %1.'"), - Формат(Результат.ВерсияПоследнегоОбновленияКЛАДР, "ДЛФ=D"))); - КонецЕсли; - Иначе - Предупреждение(НСтр("ru = 'Адресный классификатор не заполнен.'")); + Если Результат.Значение.Количество()=0 Тогда + ПоказатьПредупреждение(, НСтр("ru='Адресный классификатор не заполнен.'")); + Возврат; КонецЕсли; + СписокОбновлений = ""; + КоличествоАдресныхОбъектов = 0; + АдресныеОбъекты = Новый Массив; + Для Каждого АдресныйОбъект Из Результат.Значение Цикл + Если АдресныйОбъект.КодАдресногоОбъекта <> "AL" И АдресныйОбъект.ОбновлениеДоступно Тогда + АдресныеОбъекты.Добавить(Лев(АдресныйОбъект.КодАдресногоОбъекта, 2)); + СписокОбновлений = СписокОбновлений + Лев(АдресныйОбъект.КодАдресногоОбъекта, 2) + + " - " + АдресныйОбъект.Наименование + " " + АдресныйОбъект.Сокращение + Символы.ПС; + КоличествоАдресныхОбъектов = КоличествоАдресныхОбъектов + 1; + КонецЕсли; + КонецЦикла; + + Если КоличествоАдресныхОбъектов = 0 Тогда + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обновление адресного классификатора не требуется. + |В программу уже загружены актуальные адресные сведения от %1.'"), + Формат(Результат.ВерсияПоследнегоОбновленияКЛАДР, "ДЛФ=D"))); + Возврат; + КонецЕсли; + + // Полный список + Заголовок = НСтр("ru = 'Обновление адресного классификатора'"); + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Доступно обновление для регионов (%1):'"), КоличествоАдресныхОбъектов) + + Символы.ПС + СписокОбновлений; + Оповещение = Новый ОписаниеОповещения("ОпределитьНеобходимостьОбновленияАдресныхОбъектовЗавершение", + ЭтотОбъект, АдресныеОбъекты); + ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю(); + ПараметрыВопроса.Заголовок = Заголовок; + ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + +#Если ВебКлиент Тогда + // Только информируем окошком, список большой, поэтому используем общую форму, а не предупреждение + + ПараметрыВопроса.КнопкаПоУмолчанию = КодВозвратаДиалога.ОК; + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Оповещение, + НСтр("ru = 'Для обновления адресного классификатора требуется запустить программу в тонком клиенте.'") + + Символы.ПС + Символы.ПС + Текст, РежимДиалогаВопрос.ОК, ПараметрыВопроса); + Возврат; +#КонецЕсли + + // Спрашиваем повторно + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Да", НСтр("ru='Обновить'")); + Кнопки.Добавить("Нет", НСтр("ru='Отмена'")); + ПараметрыВопроса.КнопкаПоУмолчанию = "Да"; + СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Оповещение, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Приступить к обновлению адресного классификатора на версию от %1?'"), + Формат(Результат.ВерсияПоследнегоОбновленияКЛАДР, "ДЛФ=D") + ) + Символы.ПС + Символы.ПС + Текст, Кнопки, ПараметрыВопроса); + КонецПроцедуры // Вызывает форму очистки сведений адресного классификатора по адресным объектам @@ -99,6 +106,20 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Завершение модального диалога необходимости обновления +Процедура ОпределитьНеобходимостьОбновленияАдресныхОбъектовЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + +#Если ВебКлиент Тогда + Возврат; +#КонецЕсли + + Если РезультатВопроса <> Неопределено И РезультатВопроса.Значение = "Да" Тогда + ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ЗагрузкаАдресногоКлассификатора", + Новый Структура("АдресныеОбъекты", ДополнительныеПараметры)); + КонецЕсли; + +КонецПроцедуры + // Содержит полный список файлов данных КЛАДР // Функция СписокФайловДанных() Экспорт @@ -171,9 +192,8 @@ // Функция ПроверитьНаличиеФайловНаДискеИТС(Знач ПутьКДискуИТС) Экспорт - // Если был выбран диск - то убираем последний символ "\" - ПравыйСимвол = Прав(ПутьКДискуИТС, 1); - Если ПравыйСимвол = "\" Или ПравыйСимвол = "/" Тогда + // если был выбран диск - то убираем последний символ "\" + Если Прав(ПутьКДискуИТС, 1) = "\" Тогда ПутьКДискуИТС = Лев(ПутьКДискуИТС, СтрДлина(ПутьКДискуИТС) - 1); КонецЕсли; @@ -212,8 +232,7 @@ ВозможныеПути.Добавить("\1CitsFr\EXE\KLADR\"); ВозможныеПути.Добавить("\1CItsB\EXE\KLADR"); - ПравыйСимвол = Прав(ПутьКДискуИТС, 1); - Если ПравыйСимвол = "\" Или ПравыйСимвол = "/" Тогда + Если Прав(ПутьКДискуИТС, 1) = "\" Тогда ПутьКДискуИТС = Лев(ПутьКДискуИТС, СтрДлина(ПутьКДискуИТС) - 1); КонецЕсли; @@ -278,6 +297,15 @@ КонецФункции +// Открывает форму выбора уровня - разрыв взаимозависимости систем +// +Функция ОткрытьФормуВыбораКЛАДР(ПараметрыФормы = Неопределено, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено, НавигационнаяСсылка = Неопределено, ОписаниеОповещенияОЗакрытии = Неопределено) Экспорт + + Возврат ОткрытьФорму("РегистрСведений.АдресныйКлассификатор.Форма.ФормаВыбора", ПараметрыФормы, Владелец, + Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии); + + КонецФункции + #Если Не ВебКлиент Тогда // Распаковывает файлы КЛАДР с диска ИТС и выполняет их архивацию в ZIP-архив. @@ -340,28 +368,11 @@ КонецЕсли; ФайлDBF = ПутьКDBFФайлам + ИмяФайла; - Файл = Новый Файл(ФайлDBF); - Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - // Обход возможной зависимости от регистра символов - Маска = ""; - Для Позиция = 1 По СтрДлина(Файл.Имя) Цикл - Символ = Сред(Файл.Имя, Позиция, 1); - ВСимвол = ВРег(Символ); - НСимвол = НРег(Символ); - Если ВСимвол = НСимвол Тогда - Маска = Маска + Символ; - Иначе - Маска = Маска + "[" + ВСимвол + НСимвол + "]"; - КонецЕсли; - КонецЦикла; - Кандидаты = НайтиФайлы(ПутьКDBFФайлам, Маска); - Файл = Кандидаты[0] - КонецЕсли; - + Файл = Новый Файл(ФайлDBF); Если Файл.Существует() Тогда ПутьКФайлуАрхива = КаталогВременныхФайлов + ЗаменитьРасширение_DBF_На_ZIP(ИмяФайла); ZIPФайл = Новый ЗаписьZipФайла(ПутьКФайлуАрхива, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный); - ZIPФайл.Добавить(Файл.ПолноеИмя, РежимСохраненияПутейZIP.НеСохранятьПути, РежимОбработкиПодкаталоговZIP.НеОбрабатывать); + ZIPФайл.Добавить(ФайлDBF); ZIPФайл.Записать(); КонецЕсли; @@ -380,7 +391,7 @@ // ключ значение - строка - если Статус ложь, содержит // пояснение об ошибке. // -Функция ЗагрузитьКЛАДРСВебСервера(Знач АдресныйОбъект, знач ДанныеАутентификации, ВременныйКаталог) Экспорт +Функция ЗагрузитьКЛАДРСВебСервера(Знач АдресныйОбъект, Знач ДанныеАутентификации, ВременныйКаталог) Экспорт URLСтрока = "http://downloads.v8.1c.ru/tmplts/ITS/KLADR/"; @@ -388,7 +399,6 @@ ВременныйКаталог = ПолучитьИмяВременногоФайла(); СоздатьКаталог(ВременныйКаталог); КонецЕсли; - ВременныйКаталог = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ВременныйКаталог); ПараметрыЗагрузкиФайла = Новый Структура; ПараметрыЗагрузкиФайла.Вставить("Пользователь", ДанныеАутентификации.КодПользователя); @@ -396,9 +406,9 @@ Если АдресныйОбъект = "AL" Тогда // - Файл = Новый Файл(ВременныйКаталог + "ALTNAMES.ZIP"); + Файл = Новый Файл(ВременныйКаталог + "\ALTNAMES.ZIP"); Если Не Файл.Существует() Тогда - ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + "ALTNAMES.ZIP"); + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + "\ALTNAMES.ZIP"); Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + "ALTNAMES.ZIP", ПараметрыЗагрузкиФайла); Если Не Результат.Статус Тогда @@ -408,9 +418,9 @@ // ИначеЕсли АдресныйОбъект = "SO" Тогда // - Файл = Новый Файл(ВременныйКаталог + "SOCRBASE.ZIP"); + Файл = Новый Файл(ВременныйКаталог + "\SOCRBASE.ZIP"); Если Не Файл.Существует() Тогда - ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + "SOCRBASE.ZIP"); + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + "\SOCRBASE.ZIP"); Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + "SOCRBASE.ZIP", ПараметрыЗагрузкиФайла); Если Не Результат.Статус Тогда @@ -419,7 +429,7 @@ КонецЕсли; Иначе ИмяZIP = "BASE" + АдресныйОбъект + ".ZIP"; - ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + ИмяZIP); + ПараметрыЗагрузкиФайла.Вставить("ПутьДляСохранения", ВременныйКаталог + "\" + ИмяZIP); Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(URLСтрока + ИмяZIP, ПараметрыЗагрузкиФайла); Если Не Результат.Статус Тогда @@ -430,5 +440,5 @@ Возврат Новый Структура("Статус", Истина); КонецФункции - + #КонецЕсли diff --git a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl index 79dc3a013..02fab8d25 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторКлиентСервер/Module.bsl @@ -112,7 +112,7 @@ // Возвращаемое значение: // Структура - возвращаемая структура. // -Функция ЗаполнитьРезультат(знач Значение, знач Статус = Истина) +Функция ЗаполнитьРезультат(Знач Значение, Знач Статус = Истина) Если Статус Тогда Возврат Новый Структура("Статус, Значение", Истина, Значение); diff --git a/SSL/src/CommonModules/АдресныйКлассификаторСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/АдресныйКлассификаторСлужебныйВМоделиСервиса/Module.bsl index 4afa6b4ab..e4dce69bf 100644 --- a/SSL/src/CommonModules/АдресныйКлассификаторСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/АдресныйКлассификаторСлужебныйВМоделиСервиса/Module.bsl @@ -11,15 +11,15 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных" ].Добавить("АдресныйКлассификаторСлужебныйВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки" + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки" ].Добавить("АдресныйКлассификаторСлужебныйВМоделиСервиса"); КонецЕсли; @@ -228,15 +228,15 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.РегистрыСведений.АдресныеСокращения); - Объекты.Добавить(Метаданные.РегистрыСведений.АдресныйКлассификатор); + Типы.Добавить(Метаданные.РегистрыСведений.АдресныеСокращения); + Типы.Добавить(Метаданные.РегистрыСведений.АдресныйКлассификатор); КонецПроцедуры diff --git a/SSL/src/CommonModules/Анкетирование/Module.bsl b/SSL/src/CommonModules/Анкетирование/Module.bsl index c059ccaf6..b25e3cd7f 100644 --- a/SSL/src/CommonModules/Анкетирование/Module.bsl +++ b/SSL/src/CommonModules/Анкетирование/Module.bsl @@ -719,11 +719,6 @@ ОписаниеТипаЧисло = Новый ОписаниеТипов("Число",,,Новый КвалификаторыЧисла(СтрокаДерева.Длина,СтрокаДерева.Точность)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаЧисло,,СтрокаДерева.Формулировка)); - - ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда - - ОписаниеТипаСтроки = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(0)); - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяВопроса,ОписаниеТипаСтроки,,СтрокаДерева.Формулировка)); ИначеЕсли СтрокаДерева.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда @@ -952,7 +947,7 @@ ЭлементГруппаВопроса = Форма.Элементы.Добавить(ИмяВопроса + "_Группа" ,Тип("ГруппаФормы"),ЭлементГруппа); ЭлементГруппаВопроса.Вид = ВидГруппыФормы.ОбычнаяГруппа ; ЭлементГруппаВопроса.ОтображатьЗаголовок = Ложь; - ЭлементГруппаВопроса.Отображение = ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыОтступ(); + ЭлементГруппаВопроса.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; ЭлементГруппаВопроса.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная; ЭлементГруппаВопроса.ШиринаПодчиненныхЭлементов = ШиринаПодчиненныхЭлементовФормы.ЛевыйОченьУзкий; ЭлементГруппаВопроса.РастягиватьПоГоризонтали = Истина; @@ -1047,15 +1042,6 @@ КонецЕсли; - ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ВидКонтактнойИнформации Тогда - - Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.МногострочныйРежим = Ложь; - Элемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; - Элемент.АвтоОтметкаНезаполненного = СтрокаТаблицы.Обязательный; - Элемент.ПутьКДанным = ИмяВопроса; - ИначеЕсли СтрокаТаблицы.ТипОтвета = Перечисления.ТипыОтветовНаВопрос.ЗначениеИнформационнойБазы Тогда Элемент = Форма.Элементы.Добавить(ИмяВопроса,Тип("ПолеФормы"),ЭлементГруппаВопросКомментарий); diff --git a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl index 584a97877..4ce19cc6e 100644 --- a/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/АнкетированиеКлиентСервер/Module.bsl @@ -79,12 +79,12 @@ ЗначимыеЭлементыДерева = ДеревоАнкеты.ПолучитьЭлементы(); КонецЕсли; - СформироватьНумерациюЭлементовДерева(ЗначимыеЭлементыДерева,1,Новый Массив,ПреобразовыватьФормулировку); + CформироватьНумерациюЭлементовДерева(ЗначимыеЭлементыДерева,1,Новый Массив,ПреобразовыватьФормулировку); КонецПроцедуры //Вызывается рекурсивно при формировании полного кода строк дерева анкеты -Процедура СформироватьНумерациюЭлементовДерева(СтрокиДерева, УровеньРекурсии, МассивПолныйКод, ПреобразовыватьФормулировку) +Процедура CформироватьНумерациюЭлементовДерева(СтрокиДерева, УровеньРекурсии, МассивПолныйКод, ПреобразовыватьФормулировку) Если МассивПолныйКод.Количество() < УровеньРекурсии Тогда МассивПолныйКод.Добавить(0); @@ -112,7 +112,7 @@ ПодчиненныеЭлементыСтрокиДерева = Элемент.ПолучитьЭлементы(); Если ПодчиненныеЭлементыСтрокиДерева.Количество() > 0 Тогда - СформироватьНумерациюЭлементовДерева(ПодчиненныеЭлементыСтрокиДерева,?(Элемент.ТипСтроки ="Вопрос",УровеньРекурсии,УровеньРекурсии + 1),МассивПолныйКод,ПреобразовыватьФормулировку); + CформироватьНумерациюЭлементовДерева(ПодчиненныеЭлементыСтрокиДерева,?(Элемент.ТипСтроки ="Вопрос",УровеньРекурсии,УровеньРекурсии + 1),МассивПолныйКод,ПреобразовыватьФормулировку); КонецЕсли; КонецЦикла; diff --git a/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/БанкиСлужебныйВМоделиСервиса/Module.bsl index 96d18fcad..0b5410acf 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 1a88f1a37..6ee05c549 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/Module.bsl @@ -63,11 +63,7 @@ НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Ссылка", ЗадачаСсылка); - Блокировка.Заблокировать(); + БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(ЗадачаСсылка); ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); ЗадачаОбъект.Прочитать(); @@ -111,7 +107,7 @@ Результат = Истина; Для Каждого Задача Из МассивЗадач Цикл - ЗадачаВыполнена = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Задача.Ссылка, "Выполнена"); + ЗадачаВыполнена = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Задача, "Выполнена"); Если ЗадачаВыполнена Тогда Результат = Ложь; Если ТолькоПроверка Тогда @@ -129,15 +125,11 @@ НачатьТранзакцию(); Попытка - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки.УстановитьЗначение("Ссылка", Задача.Ссылка); - Блокировка.Заблокировать(); + БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задача); // Не устанавливаем объектную блокировку на задачу Задача для того, чтобы // позволить выполнять перенаправление по команде из формы этой задачи. - ЗадачаОбъект = Задача.Ссылка.ПолучитьОбъект(); + ЗадачаОбъект = Задача.ПолучитьОбъект(); УстановитьПривилегированныйРежим(Истина); НоваяЗадача = Задачи.ЗадачаИсполнителя.СоздатьЗадачу(); @@ -158,9 +150,6 @@ ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), - УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -175,24 +164,17 @@ НачатьТранзакцию(); Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессы); Для каждого БизнесПроцесс Из БизнесПроцессы Цикл - - Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - СделатьАктивнымБизнесПроцесс(БизнесПроцесс); - КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -204,24 +186,32 @@ Возврат; КонецЕсли; - Объект = БизнесПроцесс.ПолучитьОбъект(); - - Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен Тогда + НачатьТранзакцию(); + Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцесс); - Если Объект.Завершен Тогда - ВызватьИсключение НСтр("ru = 'Невозможно сделать активными завершенные бизнес-процессы.'"); + Объект = БизнесПроцесс.ПолучитьОбъект(); + Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен Тогда + + Если Объект.Завершен Тогда + ВызватьИсключение НСтр("ru = 'Невозможно сделать активными завершенные бизнес-процессы.'"); + КонецЕсли; + + Если Не Объект.Стартован Тогда + ВызватьИсключение НСтр("ru = 'Невозможно сделать активными не стартовавшие бизнес-процессы.'"); + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже активен.'"); КонецЕсли; - Если Не Объект.Стартован Тогда - ВызватьИсключение НСтр("ru = 'Невозможно сделать активными не стартовавшие бизнес-процессы.'"); - КонецЕсли; - - ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже активен.'"); - КонецЕсли; - - Объект.Заблокировать(); - Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен; - Объект.Записать(); + Объект.Заблокировать(); + Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Активен; + Объект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -231,14 +221,10 @@ НачатьТранзакцию(); Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессы); + Для каждого БизнесПроцесс Из БизнесПроцессы Цикл - - Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - ОстановитьБизнесПроцесс(БизнесПроцесс); - КонецЦикла; ЗафиксироватьТранзакцию(); Исключение @@ -258,24 +244,32 @@ Возврат; КонецЕсли; - Объект = БизнесПроцесс.ПолучитьОбъект(); - - Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен Тогда + НачатьТранзакцию(); + Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцесс); - Если Объект.Завершен Тогда - ВызватьИсключение НСтр("ru = 'Невозможно остановить завершенные бизнес-процессы.'"); - КонецЕсли; + Объект = БизнесПроцесс.ПолучитьОбъект(); + Если Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен Тогда - Если Не Объект.Стартован Тогда - ВызватьИсключение НСтр("ru = 'Невозможно остановить не стартовавшие бизнес-процессы.'"); + Если Объект.Завершен Тогда + ВызватьИсключение НСтр("ru = 'Невозможно остановить завершенные бизнес-процессы.'"); + КонецЕсли; + + Если Не Объект.Стартован Тогда + ВызватьИсключение НСтр("ru = 'Невозможно остановить не стартовавшие бизнес-процессы.'"); + КонецЕсли; + + ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже остановлен.'"); КонецЕсли; - ВызватьИсключение НСтр("ru = 'Бизнес-процесс уже остановлен.'"); - КонецЕсли; - - Объект.Заблокировать(); - Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен; - Объект.Записать(); + Объект.Заблокировать(); + Объект.Состояние = Перечисления.СостоянияБизнесПроцессов.Остановлен; + Объект.Записать(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; КонецПроцедуры @@ -287,25 +281,26 @@ НачатьТранзакцию(); Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задачи); + Для каждого Задача Из Задачи Цикл - Если ТипЗнч(Задача) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - ЗадачаОбъект = Задача.ПолучитьОбъект(); - ЗадачаОбъект.Заблокировать(); - ЗадачаОбъект.ПринятаКИсполнению = Истина; - ЗадачаОбъект.ДатаПринятияКИсполнению = ТекущаяДатаСеанса(); - Если ЗадачаОбъект.Исполнитель.Пустая() Тогда - ЗадачаОбъект.Исполнитель = Пользователи.ТекущийПользователь(); - КонецЕсли; - ЗадачаОбъект.Записать(); - - НовыйМассивЗадач.Добавить(Задача); + Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; КонецЕсли; + ЗадачаОбъект = Задача.ПолучитьОбъект(); + ЗадачаОбъект.Заблокировать(); + ЗадачаОбъект.ПринятаКИсполнению = Истина; + ЗадачаОбъект.ДатаПринятияКИсполнению = ТекущаяДатаСеанса(); + Если ЗадачаОбъект.Исполнитель.Пустая() Тогда + ЗадачаОбъект.Исполнитель = Пользователи.ТекущийПользователь(); + КонецЕсли; + ЗадачаОбъект.Записать(); + + НовыйМассивЗадач.Добавить(Задача); КонецЦикла; - ЗафиксироватьТранзакцию(); + ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение; КонецПопытки; @@ -321,27 +316,30 @@ НачатьТранзакцию(); Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьЗадачи(Задачи); + Для каждого Задача Из Задачи Цикл - Если ТипЗнч(Задача) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - ЗадачаОбъект = Задача.ПолучитьОбъект(); - ЗадачаОбъект.Заблокировать(); - ЗадачаОбъект.ПринятаКИсполнению = Ложь; - ЗадачаОбъект.ДатаПринятияКИсполнению = "00010101000000"; - Если Не ЗадачаОбъект.РольИсполнителя.Пустая() Тогда - ЗадачаОбъект.Исполнитель = Справочники.Пользователи.ПустаяСсылка(); - КонецЕсли; - ЗадачаОбъект.Записать(); - - НовыйМассивЗадач.Добавить(Задача); + + Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; КонецЕсли; + + ЗадачаОбъект = Задача.ПолучитьОбъект(); + ЗадачаОбъект.Заблокировать(); + ЗадачаОбъект.ПринятаКИсполнению = Ложь; + ЗадачаОбъект.ДатаПринятияКИсполнению = "00010101000000"; + Если Не ЗадачаОбъект.РольИсполнителя.Пустая() Тогда + ЗадачаОбъект.Исполнитель = Справочники.Пользователи.ПустаяСсылка(); + КонецЕсли; + ЗадачаОбъект.Записать(); + + НовыйМассивЗадач.Добавить(Задача); КонецЦикла; ЗафиксироватьТранзакцию(); Исключение ОтменитьТранзакцию(); - ЗаписьЖурналаРегистрации(БизнесПроцессыИЗадачиСервер.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение; - КонецПопытки; + ВызватьИсключение; + КонецПопытки; Задачи = НовыйМассивЗадач; @@ -350,7 +348,7 @@ // Проверяет, является ли указанная задача ведущей. // // Параметры -// ЗадачаСсылка - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. // // Возвращаемое значение: // Булево @@ -422,127 +420,9 @@ Возврат; КонецЕсли; - НаборПисемПоАдресатам = Новый ТаблицаЗначений; - НаборПисемПоАдресатам.Колонки.Добавить("ПочтовыйАдрес"); - НаборПисемПоАдресатам.Колонки.Добавить("ТекстПисьма"); - НаборПисемПоАдресатам.Колонки.Добавить("КоличествоЗадач"); - НаборПисемПоАдресатам.Колонки.Добавить("ТипПисьма"); - НаборПисемПоАдресатам.Колонки.Добавить("Получатель"); - - Для Каждого ЭлементПросроченныеЗадачи Из ПросроченныеЗадачи Цикл - ПросроченнаяЗадача = ЭлементПросроченныеЗадачи.Ссылка; - - ТекстПисьма = СформироватьПредставлениеЗадачи(ЭлементПросроченныеЗадачи); - // Задача адресована лично исполнителю? - Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда - ПолучательПисьма = ""; - БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель, ПолучательПисьма); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Исполнитель, ТекстПисьма, "Исполнителю"); - ПолучательПисьма = ""; - БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Автор, ПолучательПисьма); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); - Иначе - Исполнители = ВыбратьИсполнителейЗадач(ПросроченнаяЗадача); - Координаторы = НайтиОтветственныхЗаНазначениеРолей(ПросроченнаяЗадача); - // Есть хотя бы один исполнитель для измерений ролевой адресации задачи? - Если Исполнители.Количество() > 0 Тогда - // Исполнитель не выполняет свои задачи. - Для Каждого Исполнитель Из Исполнители Цикл - ПолучательПисьма = ""; - БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(Исполнитель.Исполнитель, ПолучательПисьма); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Исполнитель.Исполнитель, ТекстПисьма, "Исполнителю"); - КонецЦикла; - Иначе // Задачу исполнять некому. - СоздатьЗадачуПоНастройкеРолей(ПросроченнаяЗадача, Координаторы); - КонецЕсли; - - Для Каждого Координатор Из Координаторы Цикл - ПолучательПисьма = ""; - БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(Координатор, ПолучательПисьма); - НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Координатор, ТекстПисьма, "Координатору"); - КонецЦикла; - КонецЕсли; - КонецЦикла; - + НаборПисемПоАдресатам = ВыбратьИсполнителейПросроченныхЗадач(ПросроченныеЗадачи); Для Каждого ПисьмоИзНабора Из НаборПисемПоАдресатам Цикл - - Если ПустаяСтрока(ПисьмоИзНабора.ПочтовыйАдрес) Тогда - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Уведомление не было отправлено, так как у пользователя %1 не задан адрес электронной почты.'"), - ПисьмоИзНабора.Получатель); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Информация,,, ТекстСообщения); - Продолжить; - КонецЕсли; - - ПараметрыПисьма = Новый Структура; - ПараметрыПисьма.Вставить("Кому", ПисьмоИзНабора.ПочтовыйАдрес); - Если ПисьмоИзНабора.ТипПисьма = "Исполнителю" Тогда - ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не выполненные в срок задачи: - | - |%1'"), ПисьмоИзНабора.ТекстПисьма); - ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); - - ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не выполненные в срок задачи (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач )); - ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); - ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Автору" Тогда - ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'По введенным задачам прошел крайний срок: - | - |%1'"), ПисьмоИзНабора.ТекстПисьма); - ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); - - ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'По задачам истек контрольный срок (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач)); - ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); - ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Координатору" Тогда - ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Прошел крайний срок по задачам: - | - |%1'"), ПисьмоИзНабора.ТекстПисьма); - ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); - - ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Истек контрольный срок задач (%1)'"), - Строка(ПисьмоИзНабора.КоличествоЗадач)); - ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); - КонецЕсли; - - ТекстСообщения = ""; - - Попытка - РаботаСПочтовымиСообщениями.ОтправитьСообщение( - РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(), ПараметрыПисьма); - Исключение - ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при отправке уведомления о просроченных задачах: %1.'"), - ОписаниеОшибки); - УровеньВажностиСобытия = УровеньЖурналаРегистрации.Ошибка; - КонецПопытки; - - Если ПустаяСтрока(ТекстСообщения) Тогда - Если ПараметрыПисьма.Кому.Количество() > 0 Тогда - Кому = ? (ПустаяСтрока(ПараметрыПисьма.Кому[0].Представление), - ПараметрыПисьма.Кому[0].Адрес, - ПараметрыПисьма.Кому[0].Представление + " <"+ПараметрыПисьма.Кому[0].Адрес+">"); - КонецЕсли; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Уведомление о просроченных задачах успешно отправлено на адрес %1.'"), - Кому); - - УровеньВажностиСобытия = УровеньЖурналаРегистрации.Информация; - КонецЕсли; - - ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньВажностиСобытия,,, ТекстСообщения); + ОтправитьУведомлениеОПросроченныхЗадачах(ПисьмоИзНабора); КонецЦикла; КонецПроцедуры @@ -764,6 +644,135 @@ КонецФункции +Функция ВыбратьИсполнителейПросроченныхЗадач(ПросроченныеЗадачи) + + НаборПисемПоАдресатам = Новый ТаблицаЗначений; + НаборПисемПоАдресатам.Колонки.Добавить("ПочтовыйАдрес"); + НаборПисемПоАдресатам.Колонки.Добавить("ТекстПисьма"); + НаборПисемПоАдресатам.Колонки.Добавить("КоличествоЗадач"); + НаборПисемПоАдресатам.Колонки.Добавить("ТипПисьма"); + НаборПисемПоАдресатам.Колонки.Добавить("Получатель"); + + Для Каждого ЭлементПросроченныеЗадачи Из ПросроченныеЗадачи Цикл + ПросроченнаяЗадача = ЭлементПросроченныеЗадачи.Ссылка; + + ТекстПисьма = СформироватьПредставлениеЗадачи(ЭлементПросроченныеЗадачи); + // Задача адресована лично исполнителю? + Если ЗначениеЗаполнено(ПросроченнаяЗадача.Исполнитель) Тогда + ПолучательПисьма = ""; + БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Исполнитель, ПолучательПисьма); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Исполнитель, ТекстПисьма, "Исполнителю"); + ПолучательПисьма = ""; + БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(ПросроченнаяЗадача.Автор, ПолучательПисьма); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, ПросроченнаяЗадача.Автор, ТекстПисьма, "Автору"); + Иначе + Исполнители = ВыбратьИсполнителейЗадач(ПросроченнаяЗадача); + Координаторы = НайтиОтветственныхЗаНазначениеРолей(ПросроченнаяЗадача); + // Есть хотя бы один исполнитель для измерений ролевой адресации задачи? + Если Исполнители.Количество() > 0 Тогда + // Исполнитель не выполняет свои задачи. + Для Каждого Исполнитель Из Исполнители Цикл + ПолучательПисьма = ""; + БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(Исполнитель.Исполнитель, ПолучательПисьма); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Исполнитель.Исполнитель, ТекстПисьма, "Исполнителю"); + КонецЦикла; + Иначе // Задачу исполнять некому. + СоздатьЗадачуПоНастройкеРолей(ПросроченнаяЗадача, Координаторы); + КонецЕсли; + + Для Каждого Координатор Из Координаторы Цикл + ПолучательПисьма = ""; + БизнесПроцессыИЗадачиСервер.ПриПолученииАдресаЭлектроннойПочты(Координатор, ПолучательПисьма); + НайтиПисьмоИДобавитьТекст(НаборПисемПоАдресатам, ПолучательПисьма, Координатор, ТекстПисьма, "Координатору"); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Возврат НаборПисемПоАдресатам; + +КонецФункции + +Процедура ОтправитьУведомлениеОПросроченныхЗадачах(ПисьмоИзНабора) + + Если ПустаяСтрока(ПисьмоИзНабора.ПочтовыйАдрес) Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление не было отправлено, так как у пользователя %1 не задан адрес электронной почты.'"), + ПисьмоИзНабора.Получатель); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация,,, ТекстСообщения); + Возврат; + КонецЕсли; + + ПараметрыПисьма = Новый Структура; + ПараметрыПисьма.Вставить("Кому", ПисьмоИзНабора.ПочтовыйАдрес); + Если ПисьмоИзНабора.ТипПисьма = "Исполнителю" Тогда + ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не выполненные в срок задачи: + | + |%1'"), ПисьмоИзНабора.ТекстПисьма); + ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); + + ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не выполненные в срок задачи (%1)'"), + Строка(ПисьмоИзНабора.КоличествоЗадач )); + ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); + ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Автору" Тогда + ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'По введенным задачам прошел крайний срок: + | + |%1'"), ПисьмоИзНабора.ТекстПисьма); + ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); + + ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'По задачам истек контрольный срок (%1)'"), + Строка(ПисьмоИзНабора.КоличествоЗадач)); + ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); + ИначеЕсли ПисьмоИзНабора.ТипПисьма = "Координатору" Тогда + ТекстТелаПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Прошел крайний срок по задачам: + | + |%1'"), ПисьмоИзНабора.ТекстПисьма); + ПараметрыПисьма.Вставить("Тело", ТекстТелаПисьма); + + ТекстТемыПисьма = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Истек контрольный срок задач (%1)'"), + Строка(ПисьмоИзНабора.КоличествоЗадач)); + ПараметрыПисьма.Вставить("Тема", ТекстТемыПисьма); + КонецЕсли; + + ТекстСообщения = ""; + + Попытка + РаботаСПочтовымиСообщениями.ОтправитьСообщение( + РаботаСПочтовымиСообщениями.ПолучитьСистемнуюУчетнуюЗапись(), ПараметрыПисьма); + Исключение + ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при отправке уведомления о просроченных задачах: %1.'"), + ОписаниеОшибки); + УровеньВажностиСобытия = УровеньЖурналаРегистрации.Ошибка; + КонецПопытки; + + Если ПустаяСтрока(ТекстСообщения) Тогда + Если ПараметрыПисьма.Кому.Количество() > 0 Тогда + Кому = ? (ПустаяСтрока(ПараметрыПисьма.Кому[0].Представление), + ПараметрыПисьма.Кому[0].Адрес, + ПараметрыПисьма.Кому[0].Представление + " <" + ПараметрыПисьма.Кому[0].Адрес + ">"); + КонецЕсли; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Уведомление о просроченных задачах успешно отправлено на адрес %1.'"), Кому); + + УровеньВажностиСобытия = УровеньЖурналаРегистрации.Информация; + КонецЕсли; + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Бизнес-процессы и задачи.Уведомление о просроченных задачах'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньВажностиСобытия,,, ТекстСообщения); + +КонецПроцедуры + Функция СоздатьЗадачуПоНастройкеРолей(ЗадачаСсылка, Ответственные) Для Каждого Ответственный Из Ответственные Цикл @@ -975,8 +984,17 @@ Если БизнесПроцессСсылка = Неопределено ИЛИ БизнесПроцессСсылка.Пустая() Тогда Продолжить; КонецЕсли; - БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект(); - БизнесПроцессОбъект.УстановитьПометкуУдаления(НЕ БизнесПроцессОбъект.ПометкаУдаления); + НачатьТранзакцию(); + Попытка + БизнесПроцессыИЗадачиСервер.ЗаблокироватьБизнесПроцессы(БизнесПроцессСсылка); + БизнесПроцессОбъект = БизнесПроцессСсылка.ПолучитьОбъект(); + БизнесПроцессОбъект.УстановитьПометкуУдаления(НЕ БизнесПроцессОбъект.ПометкаУдаления); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + Количество = Количество + 1; КонецЦикла; Возврат ?(Количество = 1, ВыделенныеСтроки[0].БизнесПроцесс, Неопределено); diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/БизнесПроцессыИЗадачиВызовСервера.mdo b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/БизнесПроцессыИЗадачиВызовСервера.mdo index 7d95058b4..1bb040b21 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/БизнесПроцессыИЗадачиВызовСервера.mdo +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиВызовСервера/БизнесПроцессыИЗадачиВызовСервера.mdo @@ -6,7 +6,5 @@ <value>Бизнес процессы и задачи вызов сервера</value> </synonym> <server>true</server> - <externalConnection>true</externalConnection> - <clientOrdinaryApplication>true</clientOrdinaryApplication> <serverCall>true</serverCall> </mdclass:CommonModule> diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl index 8dda88bc3..44f35f816 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиент/Module.bsl @@ -14,18 +14,17 @@ Процедура Остановить(Знач ПараметрКоманды) Экспорт ТекстВопроса = ""; - ЧислоЗадач = 0; Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда Если ПараметрКоманды.Количество() = 0 Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; КонецЕсли; Если ПараметрКоманды.Количество() = 1 И ТипЗнч(ПараметрКоманды[0]) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; КонецЕсли; @@ -49,7 +48,7 @@ Иначе Если ТипЗнч(ПараметрКоманды) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс'")); Возврат; КонецЕсли; @@ -66,50 +65,9 @@ КонецЕсли; - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Остановка бизнес-процесса'")); - Если Результат = КодВозвратаДиалога.Да Тогда - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); - Иначе - Состояние(НСтр("ru = 'Идет остановка бизнес-процессов. Пожалуйста подождите...'")); - КонецЕсли; - - БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцессы(ПараметрКоманды); - - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы остановлены.'")); - КонецЕсли; - Иначе - Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); - БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцесс(ПараметрКоманды); - Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - Если ПараметрКоманды.Количество() <> 0 Тогда - - Для Каждого Параметр Из ПараметрКоманды Цикл - - Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - ОповеститьОбИзменении(ТипЗнч(Параметр)); - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Иначе - ОповеститьОбИзменении(ПараметрКоманды); - КонецЕсли; - - КонецЕсли; - + Оповещение = Новый ОписаниеОповещения("ОстановитьЗавершение", ЭтотОбъект, ПараметрКоманды); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Остановка бизнес-процесса'")); + КонецПроцедуры // Отмечает указанный бизнес-процесс как остановленный. @@ -133,18 +91,17 @@ Процедура СделатьАктивным(Знач ПараметрКоманды) Экспорт ТекстВопроса = ""; - ЧислоЗадач = 0; Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда Если ПараметрКоманды.Количество() = 0 Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; КонецЕсли; Если ПараметрКоманды.Количество() = 1 И ТипЗнч(ПараметрКоманды[0]) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; КонецЕсли; @@ -162,7 +119,7 @@ Иначе Если ТипЗнч(ПараметрКоманды) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Предупреждение(НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); + ПоказатьПредупреждение(,НСтр("ru= 'Не выбран ни один бизнес-процесс.'")); Возврат; КонецЕсли; @@ -173,51 +130,8 @@ КонецЕсли; - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Остановка бизнес-процесса'")); - Если Результат = КодВозвратаДиалога.Да Тогда - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи делаются активными. Пожалуйста подождите...'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы и их задачи делаются активными. Пожалуйста подождите...'")); - КонецЕсли; - - БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцессы(ПараметрКоманды); - - Если ПараметрКоманды.Количество() = 1 Тогда - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); - Иначе - Состояние(НСтр("ru = 'Бизнес-процессы и их задачи сделаны активными.'")); - КонецЕсли; - - Иначе - Состояние(НСтр("ru = 'Идет отмена остановки бизнес-процесса. Пожалуйста подождите...'")); - БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцесс(ПараметрКоманды); - Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - Если ПараметрКоманды.Количество() <> 0 Тогда - - Для Каждого Параметр Из ПараметрКоманды Цикл - - Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - ОповеститьОбИзменении(ТипЗнч(Параметр)); - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Иначе - ОповеститьОбИзменении(ПараметрКоманды); - КонецЕсли; - - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("СделатьАктивнымЗавершение", ЭтотОбъект, ПараметрКоманды); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Остановка бизнес-процесса'")); КонецПроцедуры @@ -243,7 +157,7 @@ БизнесПроцессыИЗадачиВызовСервера.ПринятьЗадачиКИсполнению(МассивЗадач); Если МассивЗадач.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; ИначеЕсли МассивЗадач.Количество() <> 1 Тогда Состояние(НСтр("ru = 'Задачи приняты к исполнению.'")); @@ -290,7 +204,7 @@ БизнесПроцессыИЗадачиВызовСервера.ОтменитьПринятиеЗадачКИсполнению(МассивЗадач); Если МассивЗадач.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; ИначеЕсли МассивЗадач.Количество() <> 1 Тогда Состояние(НСтр("ru = 'Задачи помечены как НЕ принятые к исполнению.'")); @@ -511,52 +425,25 @@ Процедура ПеренаправитьЗадачи(МассивЗадач, ВладелецФорма) Экспорт Если МассивЗадач = Неопределено Тогда - Предупреждение(НСтр("ru = 'Не выбраны задачи.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Не выбраны задачи.'")); Возврат; КонецЕсли; ЗадачиМогутБытьПеренаправлены = БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи( МассивЗадач, Неопределено, Истина); Если НЕ ЗадачиМогутБытьПеренаправлены И МассивЗадач.Количество() = 1 Тогда - Предупреждение(НСтр("ru = 'Невозможно перенаправить уже выполненную задачу.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Невозможно перенаправить уже выполненную задачу.'")); Возврат; КонецЕсли; - Результат = ОткрытьФормуМодально("Задача.ЗадачаИсполнителя.Форма.ПеренаправитьЗадачи", + Оповещение = Новый ОписаниеОповещения("ПеренаправитьЗадачиЗавершение", ЭтотОбъект, МассивЗадач); + ОткрытьФорму("Задача.ЗадачаИсполнителя.Форма.ПеренаправитьЗадачи", Новый Структура("Задача,КоличествоЗадач,ЗаголовокФормы", МассивЗадач[0], МассивЗадач.Количество(), ?(МассивЗадач.Количество() > 1, НСтр("ru = 'Перенаправить задачи'"), НСтр("ru = 'Перенаправить задачу'"))), - ВладелецФорма); + ВладелецФорма,,,,Оповещение); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - Если МассивЗадач.Количество() > 10 Тогда - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Выполняется перенаправление задач...'")); - КонецЕсли; - МассивПеренаправленныхЗадач = Неопределено; - ЗадачиПеренаправлены = БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи( - МассивЗадач, Результат, Ложь, МассивПеренаправленныхЗадач); - Если МассивЗадач.Количество() > 1 Тогда - Если ЗадачиПеренаправлены Тогда - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Задачи перенаправлены.'")); - Иначе - Состояние(НСтр("ru = 'Перенаправление задач'"),, - НСтр("ru = 'Не все задачи перенаправлены. Пропущены задачи, отмеченные как выполненные.'")); - КонецЕсли; - Иначе - Задача = МассивПеренаправленныхЗадач[0]; - ПоказатьОповещениеПользователя( - НСтр("ru = 'Задача перенаправлена'"), - ПолучитьНавигационнуюСсылку(Задача), - Строка(Задача)); - КонецЕсли; - Оповестить("Запись_ЗадачаИсполнителя", Новый Структура("Перенаправлена", Истина), МассивЗадач); - КонецПроцедуры // Открыть форму с дополнительной информацией о задаче. @@ -617,20 +504,15 @@ // Список - ТаблицаФормы - элемент управления (таблица формы) со списком бизнес-процессов. // Процедура СписокБизнесПроцессовПометкаУдаления(Список) Экспорт + ВыделенныеСтроки = Список.ВыделенныеСтроки; Если ВыделенныеСтроки = Неопределено ИЛИ ВыделенныеСтроки.Количество() <= 0 Тогда - Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; - КонецЕсли; - Результат = Вопрос(НСтр("ru = 'Изменить пометку удаления?'"), РежимДиалогаВопрос.ДаНет); - Если Результат <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - БизнесПроцессСсылка = БизнесПроцессыИЗадачиВызовСервера.ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки); - Список.Обновить(); - ПоказатьОповещениеПользователя(НСтр("ru = 'Пометка удаления изменена.'"), - ?(БизнесПроцессСсылка <> Неопределено, ПолучитьНавигационнуюСсылку(БизнесПроцессСсылка), ""), - ?(БизнесПроцессСсылка <> Неопределено, Строка(БизнесПроцессСсылка), "")); + КонецЕсли; + Оповещение = Новый ОписаниеОповещения("СписокБизнесПроцессовПометкаУдаленияЗавершение", ЭтотОбъект, Список); + ПоказатьВопрос(Оповещение, НСтр("ru = 'Изменить пометку удаления?'"), РежимДиалогаВопрос.ДаНет); + КонецПроцедуры // Открывает форму выбора исполнителя. @@ -649,11 +531,8 @@ Отказ = БизнесПроцессыИЗадачиКлиентПереопределяемый.ВыбратьИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли, БезВнешнихРолей); - Если Отказ Тогда - Возврат; - КонецЕсли; ПараметрыФормы = Новый Структура("Исполнитель, ТолькоПростыеРоли, БезВнешнихРолей", @@ -662,3 +541,145 @@ КонецПроцедуры +Процедура ОстановитьЗавершение(Знач Результат, Знач ПараметрКоманды) Экспорт + + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + Если ПараметрКоманды.Количество() = 1 Тогда + Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); + Иначе + Состояние(НСтр("ru = 'Идет остановка бизнес-процессов. Пожалуйста подождите...'")); + КонецЕсли; + + БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцессы(ПараметрКоманды); + + Если ПараметрКоманды.Количество() = 1 Тогда + Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); + Иначе + Состояние(НСтр("ru = 'Бизнес-процессы остановлены.'")); + КонецЕсли; + Иначе + Состояние(НСтр("ru = 'Идет остановка бизнес-процесса. Пожалуйста подождите...'")); + БизнесПроцессыИЗадачиВызовСервера.ОстановитьБизнесПроцесс(ПараметрКоманды); + Состояние(НСтр("ru = 'Бизнес-процесс остановлен.'")); + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + Если ПараметрКоманды.Количество() <> 0 Тогда + + Для Каждого Параметр Из ПараметрКоманды Цикл + + Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + ОповеститьОбИзменении(ТипЗнч(Параметр)); + Прервать; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Иначе + ОповеститьОбИзменении(ПараметрКоманды); + КонецЕсли; + +КонецПроцедуры + +Процедура СписокБизнесПроцессовПометкаУдаленияЗавершение(Результат, Список) Экспорт + + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтроки = Список.ВыделенныеСтроки; + БизнесПроцессСсылка = БизнесПроцессыИЗадачиВызовСервера.ПометитьНаУдалениеБизнесПроцессы(ВыделенныеСтроки); + Список.Обновить(); + ПоказатьОповещениеПользователя(НСтр("ru = 'Пометка удаления изменена.'"), + ?(БизнесПроцессСсылка <> Неопределено, ПолучитьНавигационнуюСсылку(БизнесПроцессСсылка), ""), + ?(БизнесПроцессСсылка <> Неопределено, Строка(БизнесПроцессСсылка), "")); + +КонецПроцедуры + +Процедура СделатьАктивнымЗавершение(Знач Результат, Знач ПараметрКоманды) Экспорт + + Если Результат <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + Если ПараметрКоманды.Количество() = 1 Тогда + Состояние(НСтр("ru = 'Бизнес-процесс и его задачи делаются активными. Пожалуйста подождите...'")); + Иначе + Состояние(НСтр("ru = 'Бизнес-процессы и их задачи делаются активными. Пожалуйста подождите...'")); + КонецЕсли; + + БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцессы(ПараметрКоманды); + + Если ПараметрКоманды.Количество() = 1 Тогда + Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); + Иначе + Состояние(НСтр("ru = 'Бизнес-процессы и их задачи сделаны активными.'")); + КонецЕсли; + + Иначе + Состояние(НСтр("ru = 'Идет отмена остановки бизнес-процесса. Пожалуйста подождите...'")); + БизнесПроцессыИЗадачиВызовСервера.СделатьАктивнымБизнесПроцесс(ПараметрКоманды); + Состояние(НСтр("ru = 'Бизнес-процесс и его задачи сделаны активными.'")); + КонецЕсли; + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + + Если ПараметрКоманды.Количество() <> 0 Тогда + + Для Каждого Параметр Из ПараметрКоманды Цикл + + Если ТипЗнч(Параметр) <> Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + ОповеститьОбИзменении(ТипЗнч(Параметр)); + Прервать; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Иначе + ОповеститьОбИзменении(ПараметрКоманды); + КонецЕсли; + +КонецПроцедуры + +Процедура ПеренаправитьЗадачиЗавершение(Знач Результат, Знач МассивЗадач) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + Если МассивЗадач.Количество() > 10 Тогда + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Выполняется перенаправление задач...'")); + КонецЕсли; + МассивПеренаправленныхЗадач = Неопределено; + ЗадачиПеренаправлены = БизнесПроцессыИЗадачиВызовСервера.ПеренаправитьЗадачи( + МассивЗадач, Результат, Ложь, МассивПеренаправленныхЗадач); + Если МассивЗадач.Количество() > 1 Тогда + Если ЗадачиПеренаправлены Тогда + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Задачи перенаправлены:'") + " " + МассивЗадач.Количество()); + Иначе + Состояние(НСтр("ru = 'Перенаправление задач'"),, + НСтр("ru = 'Не все задачи перенаправлены. Пропущены задачи, отмеченные как выполненные.'")); + КонецЕсли; + Иначе + Задача = МассивПеренаправленныхЗадач[0]; + ПоказатьОповещениеПользователя( + НСтр("ru = 'Задача перенаправлена'"), + ПолучитьНавигационнуюСсылку(Задача), + Строка(Задача)); + КонецЕсли; + Оповестить("Запись_ЗадачаИсполнителя", Новый Структура("Перенаправлена", Истина), МассивЗадач); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl index 508555c42..9e5b1e07e 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиКлиентПереопределяемый/Module.bsl @@ -18,15 +18,24 @@ // БезВнешнихРолей - Булево, если Истина, то указывает, что для выбора надо // использовать только роли, у которых не установлен признак ВнешняяРоль // +// Возвращаемое значение: +// Булево - если Истина, то не требуется выводить форму выбора исполнителя по умолчанию. +// Функция ВыбратьИсполнителя(ЭлементИсполнитель, РеквизитИсполнитель, ТолькоПростыеРоли, БезВнешнихРолей) Экспорт Возврат Ложь; КонецФункции -// Заполняет массив ПланыОбменаДляВыбора +// Заполняет список узлов планов обмена - доступных информационных баз, +// в которых могут быть определены внешние роли. +// +// Параметры: +// ПланыОбменаДляВыбора - Массив - список узлов планов обмена. +// Если оставить незаполненным, то будут доступны все узлы всех планов обменов, +// предусмотренных в конфигурации. +// Процедура ЗаполнитьМассивПлановОбмена(ПланыОбменаДляВыбора) Экспорт - КонецПроцедуры diff --git a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl index 6ca58866c..120100582 100644 --- a/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl +++ b/SSL/src/CommonModules/БизнесПроцессыИЗадачиСервер/Module.bsl @@ -19,8 +19,6 @@ ЭлементГруппаСостояние, ЭлементДатаИсполнения) Экспорт ФормаЗадачи.ТолькоПросмотр = ЗадачаОбъект.Выполнена; - ИзменятьЗаданияЗаднимЧислом = ПолучитьФункциональнуюОпцию("ИзменятьЗаданияЗаднимЧислом"); - ЭлементДатаИсполнения.Вид = ?(ИзменятьЗаданияЗаднимЧислом, ВидПоляФормы.ПолеВвода, ВидПоляФормы.ПолеНадписи); ЭлементГруппаСостояние.Видимость = ЗадачаОбъект.Выполнена; Если ЗадачаОбъект.Выполнена Тогда @@ -81,12 +79,8 @@ Процедура УстановитьОформлениеЗадач(Знач СписокЗадачИлиЕгоУсловноеОформление) Экспорт Если ТипЗнч(СписокЗадачИлиЕгоУсловноеОформление) = Тип("ДинамическийСписок") Тогда - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - УсловноеОформлениеСпискаЗадач = СписокЗадачИлиЕгоУсловноеОформление.КомпоновщикНастроек.Настройки.УсловноеОформление; - УсловноеОформлениеСпискаЗадач.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; - Иначе - УсловноеОформлениеСпискаЗадач = СписокЗадачИлиЕгоУсловноеОформление.УсловноеОформление; - КонецЕсли; + УсловноеОформлениеСпискаЗадач = СписокЗадачИлиЕгоУсловноеОформление.КомпоновщикНастроек.Настройки.УсловноеОформление; + УсловноеОформлениеСпискаЗадач.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; Иначе УсловноеОформлениеСпискаЗадач = СписокЗадачИлиЕгоУсловноеОформление; КонецЕсли; @@ -218,6 +212,11 @@ НачатьТранзакцию(); Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("БизнесПроцесс", БизнесПроцессСсылка); + Блокировка.Заблокировать(); + Запрос = Новый Запрос("ВЫБРАТЬ | Задачи.Ссылка КАК Ссылка |ИЗ @@ -261,17 +260,18 @@ КонецПроцедуры -// Проверяет, является ли указанная задача ведущей. -// -// Параметры -// ЗадачаСсылка - задача. +// Получить бизнес-процессы ведущей задачи ЗадачаСсылка. // +// Параметры: +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ДляИзменения - Булево - если Истина, то следует установить исключительную управляемую блокировку +// на все бизнес-процессы указанной ведущей задачи. По умолчанию, Ложь. // Возвращаемое значение: -// Булево -// -Функция БизнесПроцессыВедущейЗадачи(ЗадачаСсылка) Экспорт +// Массив - массив бизнес-процессов. +// +Функция БизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт - Результат = ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка); + Результат = ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения); Возврат Результат.Выгрузить().ВыгрузитьКолонку("Ссылка"); КонецФункции @@ -311,15 +311,17 @@ КонецФункции -// Возвращает массив подчиненных указанной задаче бизнес-процессов +// Возвращает массив подчиненных указанной задаче бизнес-процессов. // // Параметры -// ЗадачаСсылка - задача. +// ЗадачаСсылка - ЗадачаСсылка.ЗадачаИсполнителя - задача. +// ДляИзменения - Булево - если Истина, то следует установить исключительную управляемую блокировку +// на все бизнес-процессы, подчиненные указанной задаче. По умолчанию, Ложь. // // Возвращаемое значение: -// массив ссылок на бизнес-процессы +// Массив - массив ссылок на бизнес-процессы. // -Функция БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка) Экспорт +Функция БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт Результат = Новый Массив; Для Каждого МетаданныеБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл @@ -330,6 +332,13 @@ Продолжить; КонецЕсли; + Если ДляИзменения Тогда + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеБизнесПроцесса.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("ГлавнаяЗадача", ЗадачаСсылка); + Блокировка.Заблокировать(); + КонецЕсли; + ТекстЗапроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( "ВЫБРАТЬ РАЗРЕШЕННЫЕ | %1.Ссылка КАК Ссылка @@ -404,6 +413,64 @@ КонецПроцедуры +// Установить исключительную управляемую блокировку на массив переданных бизнес-процессов. +// +// Параметры: +// БизнесПроцессы - Массив - массив ссылок на бизнес-процессы, или одна ссылка на бизнес-процесс. +// +Процедура ЗаблокироватьБизнесПроцессы(БизнесПроцессы) Экспорт + + Блокировка = Новый БлокировкаДанных; + Если ТипЗнч(БизнесПроцессы) = Тип("Массив") Тогда + Для каждого БизнесПроцесс Из БизнесПроцессы Цикл + + Если ТипЗнч(БизнесПроцесс) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; + КонецЕсли; + + ЭлементБлокировки = Блокировка.Добавить(БизнесПроцесс.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", БизнесПроцесс); + КонецЦикла; + Иначе + Если ТипЗнч(БизнесПроцессы) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат; + КонецЕсли; + ЭлементБлокировки = Блокировка.Добавить(БизнесПроцессы.Метаданные().ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("Ссылка", БизнесПроцессы); + КонецЕсли; + Блокировка.Заблокировать(); + +КонецПроцедуры + +// Установить исключительную управляемую блокировку на массив переданных задач. +// +// Параметры: +// Задачи - Массив - массив ссылок на задачи, или одна ссылка ЗадачаСсылка.ЗадачаИсполнителя. +// +Процедура ЗаблокироватьЗадачи(Задачи) Экспорт + + Блокировка = Новый БлокировкаДанных; + Если ТипЗнч(Задачи) = Тип("Массив") Тогда + Для каждого Задача Из Задачи Цикл + + Если ТипЗнч(Задача) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; + КонецЕсли; + + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Задача); + КонецЦикла; + Иначе + Если ТипЗнч(БизнесПроцессы) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Возврат; + КонецЕсли; + ЭлементБлокировки = Блокировка.Добавить("Задача.ЗадачаИсполнителя"); + ЭлементБлокировки.УстановитьЗначение("Ссылка", Задачи); + КонецЕсли; + Блокировка.Заблокировать(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -468,27 +535,27 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( "БизнесПроцессыИЗадачиСервер"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда СерверныеОбработчики["СтандартныеПодсистемы.НапоминанияПользователя\ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания"].Добавить( "БизнесПроцессыИЗадачиСервер"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииЗависимостейПравДоступа"].Добавить( "БизнесПроцессыИЗадачиСервер"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "БизнесПроцессыИЗадачиСервер"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"].Добавить( + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( "БизнесПроцессыИЗадачиСервер"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "БизнесПроцессыИЗадачиСервер"); КонецЕсли; @@ -665,35 +732,24 @@ // проверяется наличие права изменения "ведущего" объекта // и проверяется отсутствие ограничения изменения "ведущего" объекта. // +// Допускается только одно переназначение по сравнению со стандартным: +// в пункте "2)" вместо проверки права изменения "ведущего" объекта установить +// проверку права чтения "ведущего" объекта. +// // Параметры: -// Таблица - РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа. -// Допустимые значения ресурсов: -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения", -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления", -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения". +// ЗависимостиПрав - ТаблицаЗначений с колонками: +// - ВедущаяТаблица - Строка, например, "БизнесПроцесс.Задание" +// - ПодчиненнаяТаблица - Строка, например, "Задача.ЗадачаИсполнителя" // -// Если задано недопустимое значение, будет установлено значение по умолчанию: -// для права Чтение - ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения, -// для прав Добавление, Изменение, Удаление - ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения. -// -// Следует иметь в виду, что обычная "жесткость" условия ограничения доступа -// уменьшается в порядке "Добавление", "Изменение", "Чтение", -// Т.е. то, что можно добавить, можно и изменить и прочитать, -// соответственно, то что можно изменить можно и прочитать, но не наоборот. -// -Процедура ПриЗаполненииЗависимостейПравДоступа(Знач Таблица) Экспорт +Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт // Задача исполнителя может быть изменена, когда бизнес-процесс доступен только для чтения, // поэтому проверка права изменения и ограничения изменения не требуется, // а требуется более "мягкое" условие - проверка права и ограничения чтения. - // - // Для задач права добавление и удаление могут быть использованы только в привилегированном - // режиме, поэтому для них проверять что-либо не требуется. - Строка = Таблица.Добавить(); + + Строка = ЗависимостиПрав.Добавить(); Строка.ПодчиненнаяТаблица = "Задача.ЗадачаИсполнителя"; - Строка.ТипВедущейТаблицы = БизнесПроцессы.Задание.ПустаяСсылка(); - // Для права Изменения проверка изменяется с "Изменение" на "Чтение". - Строка.ПриПроверкеПраваИзменение = ПланыВидовХарактеристик["ВидыДоступа"].ПравоЧтения; + Строка.ВедущаяТаблица = "БизнесПроцесс.Задание"; КонецПроцедуры @@ -713,17 +769,12 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо // Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах @@ -737,12 +788,25 @@ // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("Организации") Тогда + + Описание = Описание + + " + |РегистрСведений.ИсполнителиЗадач.Чтение.Организации + |РегистрСведений.ИсполнителиЗадач.Изменение.Организации + |"; + + КонецЕсли; + Описание = Описание + " - |РегистрСведений.ИсполнителиЗадач.Чтение.Организации - |РегистрСведений.ИсполнителиЗадач.Изменение.Организации |БизнесПроцесс.Задание.Чтение.Пользователи - |БизнесПроцесс.Задание.Добавление.Пользователи |БизнесПроцесс.Задание.Изменение.Пользователи |Задача.ЗадачаИсполнителя.Чтение.Объект.БизнесПроцесс.Задание |Задача.ЗадачаИсполнителя.Чтение.Пользователи @@ -752,18 +816,27 @@ КонецПроцедуры -// Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. +// Заполняет виды доступа, используемые в ограничениях прав доступа. +// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. +// Их можно удалить, если они не требуются для ограничения прав доступа. // // Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). +// ВидыДоступа - ТаблицаЗначений с полями: +// - Имя - Строка - имя используемое в описании поставляемых +// профилей групп доступа и текстах ОДД. +// - Представление - Строка - представляет вид доступа в профилях и группах доступа. +// - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). +// - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). +// - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), +// можно выбрать несколько групп значений (Групп доступа номенклатуры). // -Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт - Если Свойства.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].Пользователи Тогда - Свойства.Таблицы.Добавить("Справочник.ГруппыИсполнителейЗадач"); + ВидДоступа = ВидыДоступа.Найти("Пользователи", "Имя"); + Если ВидДоступа <> Неопределено Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом.ДобавитьДополнительныеТипыВидаДоступа(ВидДоступа, + Тип("СправочникСсылка.ГруппыИсполнителейЗадач")); КонецЕсли; КонецПроцедуры @@ -912,13 +985,19 @@ КонецФункции -// Получить бизнес-процессы ведущей задачи ЗадачаСсылка. -// -Функция ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка) Экспорт +Функция ВыбратьБизнесПроцессыВедущейЗадачи(ЗадачаСсылка, ДляИзменения = Ложь) Экспорт Итерация = 1; ТекстЗапроса = ""; - Для Каждого ТипБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл + Для Каждого МетаданныеБизнесПроцесса Из Метаданные.БизнесПроцессы Цикл + + Если ДляИзменения Тогда + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить(МетаданныеБизнесПроцесса.ПолноеИмя()); + ЭлементБлокировки.УстановитьЗначение("ВедущаяЗадача", ЗадачаСсылка); + Блокировка.Заблокировать(); + КонецЕсли; + Если НЕ ПустаяСтрока(ТекстЗапроса) Тогда ТекстЗапроса = ТекстЗапроса + " | @@ -932,7 +1011,7 @@ |ИЗ | %2 КАК %1 |ГДЕ - | %1.ВедущаяЗадача = &ВедущаяЗадача", ТипБизнесПроцесса.Имя, ТипБизнесПроцесса.ПолноеИмя(), + | %1.ВедущаяЗадача = &ВедущаяЗадача", МетаданныеБизнесПроцесса.Имя, МетаданныеБизнесПроцесса.ПолноеИмя(), ?(Итерация = 1, "РАЗРЕШЕННЫЕ", "")); ТекстЗапроса = ТекстЗапроса + ФрагментЗапроса; Итерация = Итерация + 1; @@ -1156,33 +1235,46 @@ // Функция ГруппаИсполнителейЗадач(РольИсполнителя, ОсновнойОбъектАдресации, ДополнительныйОбъектАдресации) Экспорт - Запрос = Новый Запрос( - "ВЫБРАТЬ - | ГруппыИсполнителейЗадач.Ссылка КАК Ссылка - |ИЗ - | Справочник.ГруппыИсполнителейЗадач КАК ГруппыИсполнителейЗадач - |ГДЕ - | ГруппыИсполнителейЗадач.РольИсполнителя = &РольИсполнителя - | И ГруппыИсполнителейЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации - | И ГруппыИсполнителейЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"); - Запрос.УстановитьПараметр("РольИсполнителя", РольИсполнителя); - Запрос.УстановитьПараметр("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); - Запрос.УстановитьПараметр("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); - Выборка = Запрос.Выполнить().Выбрать(); - Если Выборка.Следующий() Тогда - ГруппаИсполнителей = Выборка.Ссылка; - Иначе - // Требуется добавить новую группу исполнителей задач. - ГруппаИсполнителейОбъект = Справочники.ГруппыИсполнителейЗадач.СоздатьЭлемент(); - ГруппаИсполнителейОбъект.РольИсполнителя = РольИсполнителя; - ГруппаИсполнителейОбъект.ОсновнойОбъектАдресации = ОсновнойОбъектАдресации; - ГруппаИсполнителейОбъект.ДополнительныйОбъектАдресации = ДополнительныйОбъектАдресации; - ГруппаИсполнителейОбъект.Записать(); - ГруппаИсполнителей = ГруппаИсполнителейОбъект.Ссылка; - КонецЕсли; - - Возврат ГруппаИсполнителей; - + НачатьТранзакцию(); + Попытка + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыИсполнителейЗадач"); + ЭлементБлокировки.УстановитьЗначение("РольИсполнителя", РольИсполнителя); + ЭлементБлокировки.УстановитьЗначение("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + ЭлементБлокировки.УстановитьЗначение("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); + Блокировка.Заблокировать(); + + Запрос = Новый Запрос( + "ВЫБРАТЬ + | ГруппыИсполнителейЗадач.Ссылка КАК Ссылка + |ИЗ + | Справочник.ГруппыИсполнителейЗадач КАК ГруппыИсполнителейЗадач + |ГДЕ + | ГруппыИсполнителейЗадач.РольИсполнителя = &РольИсполнителя + | И ГруппыИсполнителейЗадач.ОсновнойОбъектАдресации = &ОсновнойОбъектАдресации + | И ГруппыИсполнителейЗадач.ДополнительныйОбъектАдресации = &ДополнительныйОбъектАдресации"); + Запрос.УстановитьПараметр("РольИсполнителя", РольИсполнителя); + Запрос.УстановитьПараметр("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации); + Запрос.УстановитьПараметр("ДополнительныйОбъектАдресации", ДополнительныйОбъектАдресации); + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.Следующий() Тогда + ГруппаИсполнителей = Выборка.Ссылка; + Иначе + // Требуется добавить новую группу исполнителей задач. + ГруппаИсполнителейОбъект = Справочники.ГруппыИсполнителейЗадач.СоздатьЭлемент(); + ГруппаИсполнителейОбъект.РольИсполнителя = РольИсполнителя; + ГруппаИсполнителейОбъект.ОсновнойОбъектАдресации = ОсновнойОбъектАдресации; + ГруппаИсполнителейОбъект.ДополнительныйОбъектАдресации = ДополнительныйОбъектАдресации; + ГруппаИсполнителейОбъект.Записать(); + ГруппаИсполнителей = ГруппаИсполнителейОбъект.Ссылка; + КонецЕсли; + ЗафиксироватьТранзакцию(); + Возврат ГруппаИсполнителей; + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + КонецФункции // Пометить на удаление вложенные и подчиненные бизнес-процессы задачи ЗадачаСсылка. @@ -1205,7 +1297,7 @@ Попытка // Помечаем вложенные бизнес-процессы УстановитьПривилегированныйРежим(Истина); - ВложенныеБизнесПроцессы = БизнесПроцессыВедущейЗадачи(ЗадачаСсылка); + ВложенныеБизнесПроцессы = БизнесПроцессыВедущейЗадачи(ЗадачаСсылка, Истина); Для Каждого ВложенныйБизнесПроцесс Из ВложенныеБизнесПроцессы Цикл БизнесПроцессОбъект = ВложенныйБизнесПроцесс.ПолучитьОбъект(); БизнесПроцессОбъект.УстановитьПометкуУдаления(НовоеЗначениеПометкиУдаления); @@ -1213,7 +1305,7 @@ УстановитьПривилегированныйРежим(Ложь); // Помечаем подчиненные бизнес-процессы - ПодчиненныеБизнесПроцессы = БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка); + ПодчиненныеБизнесПроцессы = БизнесПроцессыГлавнойЗадачи(ЗадачаСсылка, Истина); Для Каждого ПодчиненныйБизнесПроцесс Из ПодчиненныеБизнесПроцессы Цикл БизнесПроцессОбъект = ПодчиненныйБизнесПроцесс.ПолучитьОбъект(); БизнесПроцессОбъект.Заблокировать(); @@ -1274,7 +1366,7 @@ Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.0.6.6"; Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновлениеИнформационнойБазыПредметСтрокой"; - + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.1.1.2"; Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновлениеСостоянияИПринятияКИсполнению"; @@ -1283,7 +1375,7 @@ Обработчик.Версия = "1.2.1.1"; Обработчик.Процедура = "БизнесПроцессыИЗадачиСервер.ОбновлениеКодаРолиИсполнителя"; -КонецПроцедуры +КонецПроцедуры // Инициализировать предопределенную роль исполнителей ОтветственныйЗаКонтрольИсполнения. // @@ -1423,7 +1515,7 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы // Возвращает адрес электронной почты пользователя Получатель для рассылки уведомлений о задачах. @@ -1435,8 +1527,8 @@ // Процедура ПриПолученииАдресаЭлектроннойПочты(Знач Получатель, Адрес) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); Адрес = МодульУправлениеКонтактнойИнформацией.ПолучитьКонтактнуюИнформацияОбъекта( Получатель, Справочники.ВидыКонтактнойИнформации.EmailПользователя); КонецЕсли; @@ -1446,7 +1538,7 @@ // Возвращает Истина, если используется подсистема ВнешниеЗадачиИБизнесПроцессы Процедура ПриОпределенииИспользованияВнешнихЗадачИБизнесПроцессов(ПодсистемаИспользуется) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеБизнесПроцессыИЗадачи") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеБизнесПроцессыИЗадачи") Тогда ПодсистемаИспользуется = Истина; Иначе ПодсистемаИспользуется = Ложь; @@ -1462,7 +1554,7 @@ Процедура ПриОпределенииВнешнейЗадачи(ЗадачаСсылка, ЗадачаВнешняя) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеБизнесПроцессыИЗадачи") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеБизнесПроцессыИЗадачи") Тогда Иначе ЗадачаВнешняя = Ложь; КонецЕсли; diff --git a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl index 480caa65e..62591d301 100644 --- a/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетов/Module.bsl @@ -8,15 +8,12 @@ // Формирует список разделов, в которых размещены команды вызова панели отчетов. // -// Параметры: -// Нет -// -// Возвращаемое значение: -// Результат (ТаблицаЗначений) -// |- Ссылка (СправочникСсылка.ИдентификаторыОбъектовМетаданных) -// |- Метаданные (ОбъектМетаданных) -// |- Имя (Строка) -// |- Представление (Строка) +// Возвращаемое значение: +// ТаблицаЗначений - Информация о разделах. +// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных +// * Метаданные - ОбъектМетаданных +// * Имя - Строка +// * Представление - Строка // Функция ИспользуемыеРазделы() Экспорт Результат = Новый ТаблицаЗначений; @@ -29,6 +26,11 @@ ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов(РазделыМетаданные); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСВариантамиОтчетов(РазделыМетаданные); + КонецЕсли; + Для Каждого РазделМетаданные Из РазделыМетаданные Цикл Строка = Результат.Добавить(); Строка.Ссылка = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(РазделМетаданные); @@ -43,11 +45,12 @@ // Получает ссылку варианта отчета по набору ключевых реквизитов. // // Параметры: -// Отчет (Соответствует реквизиту справочника) Полное имя или ссылка отчета. -// КлючВарианта (Соответствует реквизиту справочника) Имя варианта отчета. +// Отчет - Соответствует реквизиту справочника - Полное имя или ссылка отчета. +// КлючВарианта - Соответствует реквизиту справочника - Имя варианта отчета. // // Возвращаемое значение: -// Результат (СправочникСсылка.ВариантыОтчетов, Неопределено) +// * СправочникСсылка.ВариантыОтчетов - Когда вариант найден. +// * Неопределено - Когда вариант не найден. // Функция ПолучитьСсылку(Отчет, КлючВарианта) Экспорт Результат = Неопределено; @@ -76,8 +79,8 @@ // Формирует массив отчетов, доступных текущему пользователю. // // Возвращаемое значение: -// Результат (Массив) из (*) см. тип реквизита Отчет справочника ВариантыОтчетов. -// Ссылки отчетов, доступных текущему пользователю. +// Массив - Ссылки отчетов, доступных текущему пользователю. +// Типы значений соответствуют типу реквизита Отчет справочника ВариантыОтчетов. // // Описание: // Данный массив следует использовать во всех запросах к таблице @@ -89,8 +92,8 @@ ДоступныеОтчеты = ВариантыОтчетовПовтИсп.ДоступныеОтчеты(); // Дополнить массив ссылкам дополнительных отчетов, доступных текущему пользователю. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииДополнительныхОтчетовДоступныхТекущемуПользователю(ДоступныеОтчеты); КонецЕсли; @@ -103,17 +106,17 @@ // Формирует описание настроек отчета. // Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). +// см. описание функции ДеревоНастроекВариантовОтчетовКонфигурации(). // // Параметры: -// ДеревоВариантов (ДеревоЗначений) Используется для описания настроек отчетов и вариантов -// см. описание к ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() -// ОтчетЗначениеИлиМетаданные (...) Метаданные или ссылка отчета. -// |- (ОбъектМетаданных) -// |- (СправочникСсылка.ИдентификаторыОбъектовМетаданных) +// ДеревоВариантов - ДеревоЗначений - Используется для описания настроек отчетов и вариантов +// См. описание функции ДеревоНастроекВариантовОтчетовКонфигурации(). +// ОтчетЗначениеИлиМетаданные - ОбъектМетаданных, СправочникСсылка.ИдентификаторыОбъектовМетаданных - +// Метаданные или ссылка отчета. // -// Возвращаемое значение: -// Отчет (СтрокаДереваЗначений) -// см. "Реквизиты для изменения" функции ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() +// Возвращаемое значение: +// СтрокаДереваЗначений - Отчет. +// см. "Реквизиты для изменения" функции ДеревоНастроекВариантовОтчетовКонфигурации(). // Функция ОписаниеОтчета(ДеревоВариантов, ОтчетЗначениеИлиМетаданные) Экспорт ЭтоМетаданные = (ТипЗнч(ОтчетЗначениеИлиМетаданные) = Тип("ОбъектМетаданных")); @@ -127,49 +130,49 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка получения описания отчета ""%1"", |он не подключен к подсистеме ""%2""'"), - ?(ЭтоМетаданные, ОтчетЗначениеИлиМетаданные.Имя, Строка(СтрокаОтчет)), + СтрокаОтчет.Метаданные.Имя, ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы("")); КонецЕсли; Возврат СтрокаОтчет; -КонецФункции // ОписаниеОтчета +КонецФункции // Формирует описание настроек варианта отчета. // Для использования в ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(). // // Параметры: -// ДеревоВариантов (ДеревоЗначений) Используется для описания настроек отчетов и вариантов -// см. описание к ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() -// ОтчетСтрокаДереваИлиЗначениеИлиМетаданные (...) Описание настроек, метаданные или ссылка отчета. -// |- (СтрокаДерева) -// |- (ОбъектМетаданных) -// |- (СправочникСсылка.ИдентификаторыОбъектовМетаданных) -// КлючВарианта (Строка) Имя варианта отчета как оно задано в схеме компоновки данных. +// ДеревоВариантов - ДеревоЗначений - Используется для описания настроек отчетов и вариантов +// см. описание функции ДеревоНастроекВариантовОтчетовКонфигурации(). +// ОтчетСтрокаДереваИлиЗначениеИлиМетаданные - СтрокаДерева, ОбъектМетаданных, +// СправочникСсылка.ИдентификаторыОбъектовМетаданных - Описание настроек, метаданные или ссылка отчета. +// КлючВарианта - Строка - Имя варианта отчета как оно задано в схеме компоновки данных. // // Возвращаемое значение: -// Вариант (СтрокаДереваЗначений) -// см. "Реквизиты для изменения" функции ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() +// СтрокаДереваЗначений - Вариант. +// см. "Реквизиты для изменения" функции ДеревоНастроекВариантовОтчетовКонфигурации(). // Функция ОписаниеВарианта(ДеревоВариантов, ОтчетСтрокаДереваИлиЗначениеИлиМетаданные, КлючВарианта) Экспорт - Если ТипЗнч(ОтчетСтрокаДереваИлиЗначениеИлиМетаданные) = Тип("СтрокаДереваЗначений") Тогда - СтрокаОтчет = ОтчетСтрокаДереваИлиЗначениеИлиМетаданные; - Иначе + Если ТипЗнч(ОтчетСтрокаДереваИлиЗначениеИлиМетаданные) <> Тип("СтрокаДереваЗначений") Тогда СтрокаОтчет = ОписаниеОтчета(ДеревоВариантов, ОтчетСтрокаДереваИлиЗначениеИлиМетаданные); + Иначе + СтрокаОтчет = ОтчетСтрокаДереваИлиЗначениеИлиМетаданные; КонецЕсли; СтрокаВариант = СтрокаОтчет.Строки.Найти(КлючВарианта, "КлючВарианта", Ложь); Если СтрокаВариант = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вариант ""%1"" не найден для отчета ""%2"".'"), + НСтр("ru = 'Ошибка получения описания варианта ""%1"" отчета ""%2"", + |он не подключен к подсистеме ""%3""'"), КлючВарианта, - СтрокаОтчет.Метаданные.Имя); + СтрокаОтчет.Метаданные.Имя, + ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы("")); КонецЕсли; ЗаполнитьОписаниеСтрокиВарианта(СтрокаВариант, СтрокаОтчет); Возврат СтрокаВариант; -КонецФункции // ОписаниеВарианта +КонецФункции //////////////////////////////////////////////////////////////////////////////// // Для вызова из обработчиков обновления прикладной конфигурации @@ -180,9 +183,9 @@ // Рекомендуется использовать в обработчиках обновления на конкретную версию. // // Параметры: -// ИменаОтчетов (Строка) Необязательный. Имена отчетов, разделенные запятыми. +// ИменаОтчетов - Строка - Необязательный. Имена отчетов, разделенные запятыми. // -// Например: +// Пример: // // Перенос всех пользовательских вариантов отчетов при обновлении. // ВариантыОтчетов.ПеренестиВариантыОтчетовИзСтандартногоХранилища(); // // Либо перенос пользовательских вариантов отчетов, переведенных на хранилище подсистемы "Варианты отчетов". @@ -301,14 +304,14 @@ // Рекомендуется использовать в обработчиках обновления на конкретную версию. // // Параметры: -// ТаблицаВариантов (ТаблицаЗначений) Необязательный. Используется в системных целях. -// |- Отчет (Строка) Полное имя отчета в формате "Отчет.<ИмяОтчета>". -// |- Вариант (Строка) Имя варианта отчета. -// |- Автор (Строка) Имя пользователя. -// |- Настройка (ХранилищеЗначения) ПользовательскиеНастройкиКомпоновкиДанных. -// |- ПредставлениеОтчета (Строка) -// |- ПредставлениеВарианта (Строка) -// |- ИдентификаторАвтора (УникальныйИдентификатор) Идентификатор пользователя. +// ТаблицаВариантов - ТаблицаЗначений - Необязательный. Используется в служебных сценариях. +// * Отчет - Строка - Полное имя отчета в формате "Отчет.<ИмяОтчета>". +// * Вариант - Строка - Имя варианта отчета. +// * Автор - Строка - Имя пользователя. +// * Настройка - ХранилищеЗначения - ПользовательскиеНастройкиКомпоновкиДанных. +// * ПредставлениеОтчета - Строка - Представление отчета. +// * ПредставлениеВарианта - Строка - Представление варианта. +// * ИдентификаторАвтора - УникальныйИдентификатор - Идентификатор пользователя. // Процедура ЗагрузитьПользовательские(ТаблицаВариантов = Неопределено) Экспорт @@ -469,9 +472,122 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Получает объект отчета по ссылке варианта отчета. +// +// Параметры: +// СсылкаВариантаИлиОтчета - +// - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета, подключенного к хранилищу подсистемы. +// - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка отчета конфигурации. +// - Произвольный - Ссылка дополнительного или внешнего отчета. +// +// Возвращаемое значение: +// Структура - Параметры отчета, в том числе Объект отчета. +// * Объект - ОтчетОбъект.<Имя отчета>, ВнешнийОтчет - Объект отчета. +// * Имя - Строка - Имя объекта отчета. +// * Метаданные - ОбъектМетаданных - Объект метаданных отчета. +// * Ссылка - * - Ссылка отчета. +// * Ошибки - Строка - Текст ошибки. +// +// Места использования: +// РассылкаОтчетов.ИнициализироватьОтчет(). +// +Функция ПодключитьОтчетОбъект(СсылкаВариантаИлиОтчета) Экспорт + + Результат = Новый Структура; + Результат.Вставить("Объект", Неопределено); + Результат.Вставить("Имя", ""); + Результат.Вставить("Метаданные", Неопределено); + Результат.Вставить("Ссылка", Неопределено); + Результат.Вставить("Подключен", Ложь); + Результат.Вставить("Ошибки", ""); + + Если ТипЗнч(СсылкаВариантаИлиОтчета) = Тип("СправочникСсылка.ВариантыОтчетов") Тогда + Результат.Ссылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаВариантаИлиОтчета, "Отчет"); + Иначе + Результат.Ссылка = СсылкаВариантаИлиОтчета; + КонецЕсли; + + Если Результат.Ссылка = Неопределено Тогда + Результат.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вариант отчета ""%1"" не найден в программе'"), + Строка(СсылкаВариантаИлиОтчета)); + Возврат Результат; + ИначеЕсли ТипЗнч(Результат.Ссылка) = Тип("Строка") Тогда + Результат.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для варианта ""%1"" отчет ""%2"" записан как внешний и не может быть подключен из программы'"), + Строка(СсылкаВариантаИлиОтчета), + Результат.Ссылка); + Возврат Результат; + КонецЕсли; + + Если ТипЗнч(Результат.Ссылка) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(Результат.Ссылка, Результат, Результат.Подключен); + КонецЕсли; + Возврат Результат; + КонецЕсли; + + Результат.Имя = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Результат.Ссылка, "Имя"); + Результат.Метаданные = Метаданные.Отчеты.Найти(Результат.Имя); + Если Результат.Метаданные = Неопределено Тогда + Результат.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для варианта ""%1"" отчет ""%2"" не найден в программе'"), + Строка(СсылкаВариантаИлиОтчета), + Результат.Имя); + Возврат Результат; + КонецЕсли; + + Результат.Объект = Отчеты[Результат.Имя].Создать(); + Результат.Подключен = Истина; + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Добавление обработчиков служебных событий (подписок) + +// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. +Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт + + // СЕРВЕРНЫЕ СОБЫТИЯ. + + // Регистрация изменений в именах вариантов отчетов. + // Используется в обработчиках обновления, в целях контроля ссылочной целостности + // и для сохранения настроек, сделанных администратором для предопределенных вариантов. + // + // Параметры: + // Изменения - ТаблицаЗначений - Изменения в именах вариантов отчетов. + // * Отчет - ОбъектМетаданных - Метаданные отчета, в схеме которого изменилось имя варианта. + // * СтароеИмяВарианта - Строка - Старое имя варианта, до изменения. + // * АктуальноеИмяВарианта - Строка - Текущее (последнее актуальное) имя варианта. + // + // Описание: + // В Изменения необходимо добавить описания изменений имен вариантов + // отчетов, подключенных к подсистеме. + // + // Например: + //Процедура ПриРегистрацииИзмененийИменВариантовОтчетов(Изменения) Экспорт + // Переименование = Изменения.Добавить(); + // Переименование.Отчет = Метаданные.Отчеты.<ИмяОтчета>; + // Переименование.СтароеИмяВарианта = "<СтароеИмяВарианта>"; + // Переименование.АктуальноеИмяВарианта = "<АктуальноеИмяВарианта>"; + //КонецПроцедуры + // + // Важно: + // Старое имя варианта резервируется и не может быть использовано в дальнейшем. + // Если изменений было несколько, то каждое изменение необходимо зарегистрировать, + // указывая в актуальном имени варианта последнее (текущее) имя варианта отчета. + // Поскольку имена вариантов отчетов не выводятся в пользовательском интерфейсе, + // то рекомендуется задавать их таким образом, что бы затем не менять. + // + // (То же, что ВариантыОтчетовПереопределяемый.ЗарегистрироватьИзмененияКлючейВариантовОтчетов). + СерверныеСобытия.Добавить( + "СтандартныеПодсистемы.ВариантыОтчетов\ПриРегистрацииИзмененийИменВариантовОтчетов"); + +КонецПроцедуры + // См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт @@ -489,15 +605,9 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( "ВариантыОтчетов"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПослеВыгрузкиОбласти"].Добавить( - "ВариантыОтчетов"); - - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриФормированииСловаряЗаменПоКаталогуВыгрузки"].Добавить( - "ВариантыОтчетов"); - - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихДанных"].Добавить( + СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"].Добавить( "ВариантыОтчетов"); КонецЕсли; @@ -510,9 +620,9 @@ // Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. // // Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// Обработчики - ТаблицаЗначений - Обработчики обновления. +// См. описание метода ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). +// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт //////////////////////////////////////////////////////////////////////////////// @@ -561,7 +671,6 @@ КонецПроцедуры // Возникает при получении исключений поиска ссылок. -// Процедура ПриДобавленииИсключенийПоискаСсылок(ИсключенияПоискаСсылок) Экспорт ИсключенияПоискаСсылок.Добавить(Метаданные.Справочники.ВариантыОтчетов.ТабличныеЧасти.Размещение.Реквизиты.РазделИлиГруппа); @@ -572,7 +681,8 @@ // автоматически найти по типу, но ссылки на которые требуется сохранять // в базе данных (например: подсистемы, роли). // -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). +// См. также: +// ОбщегоНазначения.ДобавитьПереименование(). // Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт @@ -587,11 +697,8 @@ // Если подсистема имеет объекты метаданных обязательные для включения в состав плана обмена, // то в параметр <Объект> необходимо добавить эти объекты метаданных. // -// Параметры: -// Объекты – Массив. Массив объектов метаданных конфигурации, которые необходимо включить в состав плана обмена. -// РаспределеннаяИнформационнаяБаза (только чтение) – Булево. Признак получения объектов для плана обмена РИБ. -// Истина – требуется получить список объектов плана обмена РИБ; -// Ложь – требуется получить список для плана обмена НЕ РИБ. +// См. также: +// СтандартныеПодсистемыСервер.ПроверитьСоставПланаОбмена(). // Процедура ПриПолученииОбязательныхОбъектовПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт @@ -606,100 +713,15 @@ КонецПроцедуры -// Выгружает данные для идентификации предопределенных вариантов отчетов в XML файл. -Процедура ПослеВыгрузкиОбласти(Знач КаталогВыгрузки) Экспорт - - ЗаписьXML = Новый ЗаписьXML; - ЗаписьXML.ОткрытьФайл(КаталогВыгрузки + "PredefinedReportVariants.xml"); - ЗаписьXML.ЗаписатьОбъявлениеXML(); - - ЗаписьXML.ЗаписатьНачалоЭлемента("Data"); - ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ns2", "http://v8.1c.ru/8.1/data/enterprise"); - ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); - - Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, КлючВарианта, Отчет ИЗ Справочник.ПредопределенныеВариантыОтчетов"); - ТаблицаПредопределенных = Запрос.Выполнить().Выгрузить(); - СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаПредопределенных, НазначениеТипаXML.Явное); - - ЗаписьXML.ЗаписатьКонецЭлемента(); - - ЗаписьXML.Закрыть(); - -КонецПроцедуры - -// Добавляет в таблицу замен записи по предопределенным вариантам отчетов. -Процедура ПриФормированииСловаряЗаменПоКаталогуВыгрузки(Знач СловарьЗамен, Знач КаталогВыгрузки) Экспорт - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(КаталогВыгрузки + "PredefinedReportVariants.xml"); - Чтение.ПерейтиКСодержимому(); - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента ИЛИ Чтение.Имя <> "Data" ИЛИ НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Неверный формат файла PredefinedReportVariants.xml или этот файл не содержит записей.'")); - КонецЕсли; - - Идентификаторы = СловарьЗамен.Найти(Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных"), "Тип").СоответствиеСсылок; - СоответствиеСтарыхИАктуальныхИОМ = Новый Соответствие; - Для Каждого КлючИЗначение Из Идентификаторы Цикл - СтараяСсылка = Справочники.ИдентификаторыОбъектовМетаданных.ПолучитьСсылку(КлючИЗначение.Значение); - АктуальнаяСсылка = Справочники.ИдентификаторыОбъектовМетаданных.ПолучитьСсылку(КлючИЗначение.Ключ); - СоответствиеСтарыхИАктуальныхИОМ.Вставить(СтараяСсылка, АктуальнаяСсылка); - КонецЦикла; - - ТаблицаПредопределенных = СериализаторXDTO.ПрочитатьXML(Чтение); // Ссылка, КлючВарианта, Отчет - Для Каждого СтрокаТаблицы Из ТаблицаПредопределенных Цикл - СтрокаТаблицы.Отчет = СоответствиеСтарыхИАктуальныхИОМ.Получить(СтрокаТаблицы.Отчет); - КонецЦикла; - - ТекстЗапроса = - "ВЫБРАТЬ - | ТаблицаПредопределенных.Ссылка, - | ТаблицаПредопределенных.КлючВарианта, - | ТаблицаПредопределенных.Отчет - |ПОМЕСТИТЬ втТаблицаПредопределенных - |ИЗ - | &ТаблицаПредопределенных КАК ТаблицаПредопределенных - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | втТаблицаПредопределенных.Ссылка КАК СтараяСсылка, - | ПредопределенныеВариантыОтчетов.Ссылка КАК АктуальнаяСсылка - |ИЗ - | Справочник.ПредопределенныеВариантыОтчетов КАК ПредопределенныеВариантыОтчетов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ втТаблицаПредопределенных КАК втТаблицаПредопределенных - | ПО ПредопределенныеВариантыОтчетов.Отчет = втТаблицаПредопределенных.Отчет - | И ПредопределенныеВариантыОтчетов.КлючВарианта = втТаблицаПредопределенных.КлючВарианта"; - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("ТаблицаПредопределенных", ТаблицаПредопределенных); - Запрос.Текст = ТекстЗапроса; - - СоответствиеСсылок = Новый Соответствие; - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - СоответствиеСсылок.Вставить(Выборка.АктуальнаяСсылка.УникальныйИдентификатор(), Выборка.СтараяСсылка.УникальныйИдентификатор()); - КонецЦикла; - - СтрокаФрагмента = СловарьЗамен.Добавить(); - СтрокаФрагмента.Тип = Тип("СправочникСсылка.ПредопределенныеВариантыОтчетов"); - СтрокаФрагмента.СтандартнаяОбработка = Ложь; - СтрокаФрагмента.СоответствиеСсылок = СоответствиеСсылок; - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных. Он используется при обновлении ссылок -// при загрузке-выгрузке конфигурации -// -// Параметры: -// МассивТипов - массив +// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок +// при загрузке данных в другую информационную базу. // -Процедура ПриОпределенииСтандартныхТиповОбщихДанных(Знач МассивТипов) Экспорт +// Параметры: +// Типы - Массив из ОбъектМетаданных +// +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - МассивТипов.Добавить(Тип("СправочникСсылка.ПредопределенныеВариантыОтчетов")); + Типы.Добавить(Метаданные.Справочники.ПредопределенныеВариантыОтчетов); КонецПроцедуры @@ -708,11 +730,10 @@ // Обновляет варианты дополнительного отчета при его записи. // -// Параметры: -// ТекущийОбъект (*) См. Источник подписки ОбработкаВариантовДополнительногоОтчета. -// Отказ (Булево) +// Места использования: +// Справочник.ДополнительныеОтчетыИОбработки.ПриЗаписиГлобальногоОтчета(). // -Процедура ОбработкаВариантовДополнительногоОтчета(ТекущийОбъект, Отказ, ВнешнийОбъект) Экспорт +Процедура ПриЗаписиДополнительногоОтчета(ТекущийОбъект, Отказ, ВнешнийОбъект) Экспорт Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ВариантыОтчетов) Тогда ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -809,15 +830,8 @@ // Получает варианты переданного отчета и их представления // -// Параметры: -// ОтчетМетаданные - Объект метаданных - отчет, для которого получаются варианты отчета. -// ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы. -// СведенияОВариантахОтчетов - ТаблицаЗначений - таблица, в которую сохраняется информация о варианте отчета. -// |-КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". -// |-КлючВарианта - Строка - ключ варианта отчета. -// |-Представление - Строка - представление варианта отчета. -// |-СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. -// СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. +// Места использования: +// ПользователиСлужебный.ПриПолученииПользовательскихВариантовОтчетов(). // Процедура ПользовательскиеВариантыОтчетов(ОтчетМетаданные, ПользовательИнформационнойБазы, ТаблицаВариантовОтчетов, СтандартнаяОбработка) Экспорт @@ -850,14 +864,8 @@ // Удаляет переданный вариант отчета из хранилища вариантов отчетов // -// Параметры: -// СведенияОВариантахОтчетов - ТаблицаЗначений - таблица, в которой сохранена информация о варианте отчета. -// |-КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". -// |-КлючВарианта - Строка - ключ варианта отчета. -// |-Представление - Строка - представление варианта отчета. -// |-СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. -// ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы у которого очищается вариант отчета -// СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. +// Места использования: +// ПользователиСлужебный.ПриУдаленииПользовательскихВариантовОтчета(). // Процедура УдалитьПользовательскийВариантОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка) Экспорт @@ -874,8 +882,16 @@ // Добавляет оповещение для открытых форм подсистемы если изменилось значение функциональной опции. // // Параметры: -// Результат (Структура) Подробнее см. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). -// КонстантаИмя (Строка) Имя константы, значение которой изменилось. +// Результат - Структура - Результат работы сервера, который возвращается на клиент. +// См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). +// КонстантаМенеджер - КонстантаМенеджер.<Имя константы> - Менеджер константы, значение которой изменилось. +// +// Описание: +// Данную процедуру следует использовать при изменении значений констант, +// связанных с функциональными опциями для последующего обновления открытых форм. +// +// Места использования: +// Обработка.ПанельАдминистрированияБСП.Форма.*. // Процедура ДобавитьОповещениеПриИзмененииЗначенияКонстанты(Результат, КонстантаМенеджер) Экспорт // Варианты отчетов связаны с константами через функциональные опции. @@ -913,77 +929,62 @@ КонецПроцедуры -// Получает объект отчета по ссылке варианта отчета. -// -// Параметры: -// СсылкаВариантаИлиОтчета (...) -// |- (СправочникСсылка.ВариантыОтчетов) Ссылка варианта отчета, подключенного к хранилищу подсистемы. -// |- (СправочникСсылка.ИдентификаторыОбъектовМетаданных) Ссылка отчета конфигурации. -// |- (*) Ссылка дополнительного или внешнего отчета. -// -// Возвращаемое значение: -// Результат (Структура) -// |- Ошибки (Строка) Текст ошибки. -// |- Ссылка (*) Ссылка отчета. -// |- Имя (Строка) Имя объекта отчета. -// |- Метаданные (ОбъектМетаданных) Объект метаданных отчета. -// |- Объект (ОтчетОбъект.<Имя отчета>, ВнешнийОтчет) Объект отчета. -// -Функция ПодключитьОтчетОбъект(СсылкаВариантаИлиОтчета) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// Прочие процедуры служебного программного интерфейса + +// Актуализирует данные подсистемы с учетом режима работы программы. +Процедура Обновить(Настройки = Неопределено) Экспорт - Результат = Новый Структура; - Результат.Вставить("Ссылка", СсылкаВариантаИлиОтчета); - Результат.Вставить("Подключен", Ложь); - Результат.Вставить("Ошибки", ""); - Результат.Вставить("Имя", ""); - Результат.Вставить("Метаданные", Неопределено); - Результат.Вставить("Объект", Неопределено); - - Если ТипЗнч(Результат.Ссылка) = Тип("СправочникСсылка.ВариантыОтчетов") Тогда - Результат.Ссылка = Результат.Ссылка.Отчет; - Если Результат.Ссылка = Неопределено Тогда - Результат.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Вариант отчета ""%1"" не найден в программе'"), - Строка(СсылкаВариантаИлиОтчета)); - Возврат Результат; + Если Настройки = Неопределено Тогда + Настройки = Новый Структура("ОбщиеДанные, РазделенныеДанные"); + + РежимРаботы = ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы(); + Если РежимРаботы.МодельСервиса Тогда + Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда + Настройки.ОбщиеДанные = Ложь; + Настройки.РазделенныеДанные = Истина; + Иначе + Настройки.ОбщиеДанные = Истина; + Настройки.РазделенныеДанные = Ложь; + КонецЕсли; + Иначе + Если РежимРаботы.Автономный Тогда + Настройки.ОбщиеДанные = Ложь; + Настройки.РазделенныеДанные = Истина; + Иначе + Настройки.ОбщиеДанные = Истина; + Настройки.РазделенныеДанные = Истина; + КонецЕсли; КонецЕсли; КонецЕсли; - Если ТипЗнч(Результат.Ссылка) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(Результат.Ссылка, Результат, Результат.Подключен); - КонецЕсли; - Возврат Результат; + Если Настройки.ОбщиеДанные = Истина Тогда + ПараметрыОбновления = Новый Структура("РазделенныеОбработчики"); + ПараметрыОбновления.РазделенныеОбработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + ОбновитьОбщиеДанные(ПараметрыОбновления); КонецЕсли; - Результат.Имя = Результат.Ссылка.Имя; - Результат.Метаданные = Метаданные.Отчеты.Найти(Результат.Имя); - Если Результат.Метаданные = Неопределено Тогда - Результат.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для варианта ""%1"" отчет ""%2"" не найден в программе'"), - Строка(СсылкаВариантаИлиОтчета), - Результат.Имя); - Возврат Результат; + Если Настройки.РазделенныеДанные = Истина Тогда + ОбновитьРазделенныеДанные(); КонецЕсли; - Результат.Объект = Отчеты[Результат.Имя].Создать(); - Результат.Подключен = Истина; - Возврат Результат; -КонецФункции +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Формирует отчет с указанными настройками, используется в фоновых заданиях. -// Процедура СформироватьОтчет(ПараметрыФормированияОтчета, АдресХранилища) Экспорт ОтчетСсылка = ПараметрыФормированияОтчета.ОтчетСсылка; Если ТипЗнч(ОтчетСсылка) = Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда ОтчетОбъект = Отчеты[ОтчетСсылка.Имя].Создать(); Иначе - ОтчетОбъект = ПолучитьОбъектДополнительногоОтчета(ОтчетСсылка); + ОтчетОбъект = Неопределено; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + ОтчетОбъект = МодульДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(ОтчетСсылка); + КонецЕсли; КонецЕсли; Если ОтчетОбъект = Неопределено Тогда @@ -1031,32 +1032,29 @@ КонецПроцедуры -// Формирует дерево настроек и размещения предопределенных вариантов отчетов -// конфигурации, подключенных к подсистеме. -// -// Параметры: -// Нет +// Формирует дерево настроек и размещения предопределенных вариантов отчетов. +// Только для отчетов, подключенных к подсистеме. // // Возвращаемое значение: -// ДеревоВариантов (ДеревоЗначений) -// ---- Реквизиты только для чтения: ---- -// |- Отчет (*) Полное имя или ссылка на отчет -// |- Метаданные (ОбъектМетаданных) Метаданные отчета -// |- КлючВарианта (Строка) Имя варианта отчета -// |- ОписаниеПолучено (Булево) -// |- СистемнаяИнформация (Структура) -// ---- Реквизиты для изменения: ---- -// |- Включен (Булево) Если Ложь, то вариант отчета не регистрируется в подсистеме. -// |- ВидимостьПоУмолчанию (Булево) Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// |- Наименование (Строка) Наименование варианта отчета. -// |- Описание (Строка) Информация о варианте отчета. -// |- Размещение (Соответствие) Настройки размещения варианта отчета в разделах. -// |- Ключ (ОбъектМетаданных) Подсистема, в которой размещается отчет или вариант отчета -// |- Значение (Строка) Настройки размещения в подсистеме. -// |- "" - Вывод отчета в своей группе обычным шрифтом. -// |- "Важный" - Вывод отчета в своей группе жирным шрифтом. -// |- "СмТакже" - Вывод отчета в группе "См. также". -// |- ФункциональныеОпции (Массив) из (Строка) Имена функциональных опций варианта отчета. +// ДеревоВариантов - ДеревоЗначений - Настройки предопределенных вариантов отчетов, подключенных к подсистеме. +// Реквизиты, открытые для изменения: +// * Включен - Булево - Если Ложь, то вариант отчета не регистрируется в подсистеме. +// * ВидимостьПоУмолчанию - Булево - Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// * Наименование - Строка - Наименование варианта отчета. +// * Описание - Строка - Информация о варианте отчета. +// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. +// ** Ключ - ОбъектМетаданных - Подсистема, в которой размещается отчет или вариант отчета. +// ** Значение - Строка - Настройки размещения в подсистеме (визуально - группами командного интерфейса). +// *** "" - Вывод отчета в подсистеме без специального выделение. +// *** "Важный" - Вывод отчета в подсистеме с выделением жирным шрифтом. +// *** "СмТакже" - Вывод отчета в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - Имена функциональных опций варианта отчета. +// Служебные реквизиты (только для чтения): +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Полное имя или ссылка на отчет. +// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. +// * КлючВарианта - Строка - Имя варианта отчета. +// * ОписаниеПолучено - Булево - Флажок что описание строки уже получено. Описание получается методом ОписаниеВарианта(). +// * СистемнаяИнформация - Структура - Другая служебная информация. // Функция ДеревоНастроекВариантовОтчетовКонфигурации() Экспорт РеквизитыСправочника = Метаданные.Справочники.ВариантыОтчетов.Реквизиты; @@ -1107,28 +1105,8 @@ Если СтрокаОтчет.СистемнаяИнформация.ПостроенНаСКД Тогда ОтчетМенеджер = Отчеты[ОтчетМетаданные.Имя]; ИмяСхемыКД = ОтчетМетаданные.ОсновнаяСхемаКомпоновкиДанных.Имя; - ВариантыНастроек = Неопределено; - Попытка - СхемаКД = ОтчетМенеджер.ПолучитьМакет(ИмяСхемыКД); - ВариантыНастроек = СхемаКД.ВариантыНастроек; - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось прочитать схему отчета ""%1"":'"); - ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", ОтчетМетаданные.Имя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ПредупреждениеПоВарианту(Неопределено, ТекстОшибки); - КонецПопытки; - Если ВариантыНастроек = Неопределено Тогда - Попытка - ВариантыНастроек = ОтчетМенеджер.ВариантыНастроек(); - Исключение - ТекстОшибки = НСтр("ru = 'Не удалось прочитать список вариантов отчета ""%1"":'"); - ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", ОтчетМетаданные.Имя); - ТекстОшибки = ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - ОшибкаПоВарианту(Неопределено, ТекстОшибки); - Продолжить; - КонецПопытки; - КонецЕсли; - Для Каждого ВариантНастроекКД Из ВариантыНастроек Цикл + СхемаКД = ОтчетМенеджер.ПолучитьМакет(ИмяСхемыКД); + Для Каждого ВариантНастроекКД Из СхемаКД.ВариантыНастроек Цикл Вариант = СтрокаОтчет.Строки.Добавить(); Вариант.Включен = Истина; Вариант.Отчет = СтрокаОтчет.Отчет; @@ -1150,13 +1128,13 @@ КонецЦикла; // Условные вызовы подсистем БСП. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриНастройкеВариантовОтчетов(ДеревоВариантов); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриНастройкеВариантовОтчетов(ДеревоВариантов); КонецЕсли; @@ -1164,23 +1142,21 @@ ВариантыОтчетовПереопределяемый.НастроитьВариантыОтчетов(ДеревоВариантов); Возврат ДеревоВариантов; -КонецФункции // ДеревоНастроекВариантовОтчетовКонфигурации +КонецФункции // Формирует ссылку и тип отчета по полному имени. // // Параметры: -// ОтчетПолноеИмя (Строка) Полное имя отчета в виде +// ОтчетПолноеИмя - Строка - Полное имя отчета в формате // "Отчет.<ИмяОтчета>" или "ВнешнийОтчет.<ИмяОтчета>" // // Возвращаемое значение: -// Результат (Структура) -// |- Отчет -// |- ТипОтчета -// |- ОтчетИмя -// |- ОтчетМетаданные -// |- ТекстОшибки -// |- (Неопределено) Если ошибки нет -// |- (Строка) Текст ошибки +// Результат - Структура - +// * Отчет +// * ТипОтчета +// * ОтчетИмя +// * ОтчетМетаданные +// * ТекстОшибки - Строка, Неопределено - Текст ошибки. // Функция СформироватьИнформациюОбОтчетеПоПолномуИмени(ОтчетПолноеИмя) Экспорт Результат = Новый Структура("Отчет, ТипОтчета, ОтчетПолноеИмя, ОтчетИмя, ОтчетМетаданные, ТекстОшибки"); @@ -1223,11 +1199,11 @@ Результат.ТипОтчета = Перечисления.ТипыОтчетов.Внешний; // Заменить тип и ссылку внешнего отчета для дополнительных отчетов, подключенных к хранилищу подсистемы. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда Результат.Вставить("ПодключеныВсеОтчеты", ПодключеныВсеОтчеты()); - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриОпределенииТипаИСсылкиЕслиОтчетДополнительный(Результат); Если Результат.Свойство("ОтчетДополнительный") Тогда @@ -1252,15 +1228,15 @@ // Формирует таблицу размещения отчетов по подсистемам конфигурации. // // Параметры: -// Результат (Неопределено) Используется для рекурсии. -// ПодсистемаРодитель (Неопределено) Используется для рекурсии. +// Результат - Неопределено - Используется для рекурсии. +// ПодсистемаРодитель - Неопределено - Используется для рекурсии. // // Возвращаемое значение: -// Результат (ТаблицаЗначений) -// |- ОтчетМетаданные -// |- ОтчетПолноеИмя -// |- ПодсистемаМетаданные -// |- ПодсистемаПолноеИмя +// Результат - ТаблицаЗначений - Настройки размещения отчетов по подсистемам. +// * ОтчетМетаданные - ОбъектМетаданных: Отчет +// * ОтчетПолноеИмя - Строка +// * ПодсистемаМетаданные - ОбъектМетаданных: Подсистема +// * ПодсистемаПолноеИмя - Строка // Функция РазмещениеОтчетовВПодсистемах(Результат = Неопределено, ПодсистемаРодитель = Неопределено) Экспорт Если Результат = Неопределено Тогда @@ -1305,7 +1281,7 @@ // связанного с элементом справочника "Варианты отчетов". // // Параметры: -// ВариантОбъект (СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура) +// ВариантОбъект - СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура // Функция СброситьНастройкиВариантаОтчета(ВариантОбъект) Экспорт Если ВариантОбъект.Пользовательский @@ -1315,10 +1291,10 @@ КонецЕсли; ВариантОбъект.Автор = Неопределено; - ВариантОбъект.Наименование = ""; ВариантОбъект.Описание = ""; ВариантОбъект.Размещение.Очистить(); ВариантОбъект.ВидимостьПоУмолчаниюПереопределена = Ложь; + ЗаполнитьЗначенияСвойств(ВариантОбъект, ВариантОбъект.ПредопределенныйВариант, "Наименование, ВидимостьПоУмолчанию"); Возврат Истина; КонецФункции @@ -1357,19 +1333,16 @@ КонецПроцедуры // Формирует описание типов Строка заданной длины. -// Функция ОписаниеТиповСтрока(ДлинаСтроки = 1000) Экспорт Возврат Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(ДлинаСтроки)); КонецФункции // По составу ролей определяет полные права к данным подсистемы. -// Функция ПолныеПраваНаВарианты() Экспорт Возврат Пользователи.РолиДоступны("ДобавлениеИзменениеВариантовОтчетов"); КонецФункции // Проверяет свободно ли наименование варианта отчета. -// Функция НаименованиеЗанято(Отчет, Ссылка, Наименование) Экспорт Запрос = Новый Запрос; Запрос.Текст = @@ -1394,7 +1367,6 @@ КонецФункции // Проверяет свободен ли ключ варианта отчета. -// Функция КлючВариантаЗанят(Отчет, Ссылка, КлючВарианта) Экспорт Запрос = Новый Запрос; Запрос.Текст = @@ -1419,7 +1391,6 @@ КонецФункции // Определяет способ внедрения подсистемы. -// Функция ПодключеныВсеОтчеты() Экспорт Возврат (Метаданные.ХранилищеВариантовОтчетов <> Неопределено И Метаданные.ХранилищеВариантовОтчетов.Имя = "ХранилищеВариантовОтчетов"); КонецФункции @@ -1427,8 +1398,8 @@ // Заполняет описание настроек для строки варианта отчета если оно еще не заполнено. // // Параметры: -// СтрокаВариант (СтрокаДерева) Описание настроек варианта отчета. -// СтрокаОтчет (СтрокаДерева) Необязательный. Описание настроек отчета. +// СтрокаВариант - СтрокаДерева - Описание настроек варианта отчета. +// СтрокаОтчет - СтрокаДерева - Необязательный. Описание настроек отчета. // Процедура ЗаполнитьОписаниеСтрокиВарианта(СтрокаВариант, СтрокаОтчет = Неопределено) Экспорт Если СтрокаВариант.ОписаниеПолучено Тогда @@ -1459,10 +1430,9 @@ // Работа с деревом подсистем из форм // Добавляет элементы условного оформления дерева подсистем. -// -Процедура ДеревоПодсистемДобавитьУсловноеОформление(ЭтаФорма) Экспорт - ЭтаФорма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеВажный()); - ЭтаФорма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеСмТакже()); +Процедура ДеревоПодсистемДобавитьУсловноеОформление(Форма) Экспорт + Форма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеВажный()); + Форма.Элементы.ДеревоПодсистемВажность.СписокВыбора.Добавить(ВариантыОтчетовКлиентСервер.ПредставлениеСмТакже()); Отборы = Новый Соответствие; Отборы.Вставить("ДеревоПодсистем.Приоритет", ""); @@ -1472,21 +1442,20 @@ Поля = "ДеревоПодсистем"; - ДобавитьЭлементУсловногоОформления(ЭтаФорма, Отборы, Оформление, Поля); + ДобавитьЭлементУсловногоОформления(Форма, Отборы, Оформление, Поля); Оформление = Новый Соответствие; Оформление.Вставить("Отображать", Ложь); Поля = "ДеревоПодсистемИспользование, ДеревоПодсистемВажность"; - ДобавитьЭлементУсловногоОформления(ЭтаФорма, Отборы, Оформление, Поля); + ДобавитьЭлементУсловногоОформления(Форма, Отборы, Оформление, Поля); КонецПроцедуры // Добавляет элемент условного оформления. -// -Функция ДобавитьЭлементУсловногоОформления(ЭтаФорма, Отборы, Оформление, Поля) - ЭлементУсловногоОформленияКД = ЭтаФорма.УсловноеОформление.Элементы.Добавить(); +Функция ДобавитьЭлементУсловногоОформления(Форма, Отборы, Оформление, Поля) + ЭлементУсловногоОформленияКД = Форма.УсловноеОформление.Элементы.Добавить(); ЭлементУсловногоОформленияКД.Использование = Истина; Для Каждого КлючИЗначение Из Отборы Цикл @@ -1516,11 +1485,10 @@ КонецФункции // Формирует дерево подсистем по данным варианта-основания. -// -Функция ДеревоПодсистемСформировать(ЭтаФорма, ВариантОснование) Экспорт +Функция ДеревоПодсистемСформировать(Форма, ВариантОснование) Экспорт ДеревоИсточник = ВариантыОтчетовПовтИсп.ПодсистемыТекущегоПользователя(); - ДеревоПриемник = ЭтаФорма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); + ДеревоПриемник = Форма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); ДеревоПриемник.Строки.Очистить(); РазмещениеПредопределенного = Неопределено; @@ -1534,7 +1502,6 @@ КонецФункции // Добавляет строки дерева-источника в строки дерева-приемника. -// Процедура ДобавитьПодсистемыВДерево(ПриемникРодитель, ИсточникРодитель, ВариантОснование, РазмещениеПредопределенного) Для Каждого Источник Из ИсточникРодитель.Строки Цикл @@ -1571,15 +1538,15 @@ // Сохраняет настройки размещения, измененные пользователем в табличную часть варианта отчета. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// ВариантОбъект (СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура) -// Кэш (Структура) Необязательный. +// Форма - УправляемаяФорма - Форма, в которой хранятся настройки размещения. +// ВариантОбъект - СправочникОбъект.ВариантыОтчетов, ДанныеФормыСтруктура - Объект варианта отчета. +// Кэш - Структура - Необязательный. // -Процедура ДеревоПодсистемЗаписать(ЭтаФорма, ВариантОбъект, Кэш = Неопределено) Экспорт +Процедура ДеревоПодсистемЗаписать(Форма, ВариантОбъект, Кэш = Неопределено) Экспорт Если Кэш <> Неопределено И Кэш.Свойство("ИзмененияПодсистем") Тогда ИзмененияПодсистем = Кэш.ИзмененияПодсистем; Иначе - ДеревоПриемник = ЭтаФорма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); + ДеревоПриемник = Форма.РеквизитФормыВЗначение("ДеревоПодсистем", Тип("ДеревоЗначений")); ИзмененияПодсистем = ДеревоПриемник.Строки.НайтиСтроки(Новый Структура("ИзмененПользователем", Истина), Истина); Если Кэш <> Неопределено Тогда Кэш.Вставить("ИзмененияПодсистем", ИзмененияПодсистем); @@ -1631,7 +1598,6 @@ // Журнал регистрации // Запись ошибки в журнале регистрации по варианту отчета. -// Процедура ОшибкаПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт ЗаписьЖурналаРегистрации( ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), @@ -1646,7 +1612,6 @@ КонецПроцедуры // Запись информации в журнале регистрации по варианту отчета. -// Процедура ИнформацияПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт ЗаписьЖурналаРегистрации( ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), @@ -1661,7 +1626,6 @@ КонецПроцедуры // Запись предупреждения в журнале регистрации по варианту отчета. -// Процедура ПредупреждениеПоВарианту(Вариант, Сообщение, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт ЗаписьЖурналаРегистрации( ВариантыОтчетовКлиентСервер.НаименованиеПодсистемы(Неопределено), @@ -1676,21 +1640,18 @@ КонецПроцедуры // Записывает в журнал регистрации событие запуска процедуры и открывает транзакцию. -// Процедура ЗапускПроцедуры(ПредставлениеПроцедуры) ИнформацияПоВарианту(Неопределено, НСтр("ru = 'Запуск процедуры ""%1"".'"), ПредставлениеПроцедуры); НачатьТранзакцию(); КонецПроцедуры // Записывает в журнал регистрации событие завершения процедуры и фиксирует транзакцию. -// Процедура ЗавершениеПроцедуры(ПредставлениеПроцедуры) ЗафиксироватьТранзакцию(); ИнформацияПоВарианту(Неопределено, НСтр("ru = 'Завершение процедуры ""%1"".'"), ПредставлениеПроцедуры); КонецПроцедуры // Создает фильтр по реквизиту КлючОбъекта для СтандартноеХранилищеНастроекМенеджер.Выбрать(). -// Функция НовыйФильтрПоКлючуОбъекта(ИменаОтчетов) Экспорт Если ИменаОтчетов = "" ИЛИ ИменаОтчетов = "*" Тогда Возврат Неопределено; @@ -1716,7 +1677,6 @@ // Обработчики стандартных событий // Удаление личных вариантов отчетов при удалении пользователя -// Процедура ПриУдаленииПользователя(ПользовательОбъект, Отказ) Экспорт Если ПользовательОбъект.ЭтоНовый() ИЛИ ПользовательОбъект.ОбменДанными.Загрузка @@ -1748,7 +1708,6 @@ КонецПроцедуры // Удаление ссылок подсистем перед их удалением. -// Процедура ПередУдалениемИдентификатораОбъектаМетаданных(ИдентификаторОбъектаМетаданныхОбъект, Отказ) Экспорт Если ИдентификаторОбъектаМетаданныхОбъект.ОбменДанными.Загрузка Тогда Возврат; @@ -1781,34 +1740,10 @@ КонецЦикла; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Условные вызовы в друге подсистемы - -// Создает экземпляр объекта отчета. -// -// Параметры: -// ОтчетСсылка (*) см. реквизит справочника ВариантыОтчетов.Отчет -// -// Возвращаемое значение: -// (ОтчетОбъект, Неопределено) -// -Функция ПолучитьОбъектДополнительногоОтчета(ОтчетСсылка) - ОтчетОбъект = Неопределено; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - ОтчетОбъект = МодульДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(ОтчетСсылка); - КонецЕсли; - - Возврат ОтчетОбъект; -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы -// [*] Актуализирует данные справочника "Предопределенные варианты отчетов" -// и константы "Функциональные опции вариантов отчетов". -// +// [*] Актуализирует неразделенные данные: справочник ПредопределенныеВариантыОтчетов и константу ПараметрыВариантовОтчетов. Процедура ОбновитьОбщиеДанные(ПараметрыОбновления) Экспорт //////////////////////////////////////////////////////////////////////////////// @@ -1846,8 +1781,7 @@ КонецПроцедуры -// [*] Актуализирует данные справочника "Варианты отчетов". -// +// [*] Актуализирует разделенные данные: справочник ВариантыОтчетов. Процедура ОбновитьРазделенныеДанные() Экспорт //////////////////////////////////////////////////////////////////////////////// @@ -1864,7 +1798,6 @@ КонецПроцедуры // [2.1.1.1] Выполняет перенос данных справочника "Варианты отчетов" для редакции 2.1. -// Процедура ПерейтиКРедакции21() Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Перейти к редакции 2.1'"); ЗапускПроцедуры(ПредставлениеПроцедуры); @@ -1940,7 +1873,6 @@ КонецПроцедуры // [2.1.3.6] Заполняет ссылки предопределенных элементов справочника "Варианты отчетов". -// Процедура ЗаполнитьСсылкиПредопределенных() Экспорт ПредставлениеПроцедуры = НСтр("ru = 'Заполнить ссылки предопределенных вариантов отчетов'"); ЗапускПроцедуры(ПредставлениеПроцедуры); @@ -2047,7 +1979,6 @@ // Обновление информационной базы / Начальное заполнение и актуализация справочников // Замена старых ключей вариантов отчетов на актуальные -// Процедура АктуализироватьКлючиПредопределенных(Кэш) ПредставлениеПроцедуры = НСтр("ru = 'Обновить ключи вариантов отчетов'"); ЗапускПроцедуры(ПредставлениеПроцедуры); @@ -2146,7 +2077,6 @@ КонецПроцедуры // Актуализация предопределенных вариантов отчетов -// Процедура ОбновитьНастройкиПредопределенных(Кэш) ПредставлениеПроцедуры = НСтр("ru = 'Обновить предопределенные'"); ЗапускПроцедуры(ПредставлениеПроцедуры); @@ -2224,7 +2154,6 @@ КонецПроцедуры // Определяет изменились ли настройки предопределенного варианта отчета. -// Функция ИзменилисьНастройкиПредопределенного(ВариантВыборка, ОписаниеВарианта) // Шапка Если ВариантВыборка.Наименование <> ОписаниеВарианта.Наименование @@ -2254,7 +2183,6 @@ КонецФункции // Записывает настройки варианта в данные справочника. -// Функция ЗаписатьНастройкиПредопределенного(ОписаниеВарианта, ВариантСсылка = Неопределено) Если ВариантСсылка = Неопределено Тогда ВариантОбъект = Справочники.ПредопределенныеВариантыОтчетов.СоздатьЭлемент(); @@ -2379,7 +2307,6 @@ КонецПроцедуры // Установка пометки удаления вариантов удаленных отчетов. -// Процедура ПометитьНаУдалениеВариантыУдаленныхОтчетов(Кэш, ОбщиеДанные) Запрос = Новый Запрос; Запрос.Текст = diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl index f779695ca..dd2844239 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиент/Module.bsl @@ -10,11 +10,11 @@ // Открывает панель отчетов. Используется в модуле общей команды. // // Параметры: -// ПутьКПодсистеме (Строка) Имя раздела или путь к подсистеме, для которой открывается панель отчетов. +// ПутьКПодсистеме - Строка - Имя раздела или путь к подсистеме, для которой открывается панель отчетов. // Задается в формате: "ИмяРаздела[.ИмяВложеннойПодсистемы1][.ИмяВложеннойПодсистемы2][...]". // NB! Раздел должен быть описан в ВариантыОтчетовПереопределяемый.ОпределитьРазделыСВариантамиОтчетов. -// ПараметрыВыполненияКоманды (ПараметрыВыполненияКоманды) Передается "как есть" из параметров обработчика команды. -// Заголовок (Строка) Необязательный. Заголовок панели отчетов. +// ПараметрыВыполненияКоманды - ПараметрыВыполненияКоманды - Передается "как есть" из параметров обработчика команды. +// Заголовок - Строка - Необязательный. Заголовок панели отчетов. // Процедура ПоказатьПанельОтчетов(ПутьКПодсистеме, ПараметрыВыполненияКоманды, Заголовок = "") Экспорт ФормаПараметры = Новый Структура("ПутьКПодсистеме", ПутьКПодсистеме); @@ -29,25 +29,18 @@ ОткрытьФорму("ОбщаяФорма.ПанельОтчетов", ФормаПараметры, ФормаВладелец, ФормаУникальность, ФормаОкно); КонецПроцедуры -// Устарела: следует использовать процедуру ПоказатьПанельОтчетов. -// -Процедура ОткрытьПанельОтчетов(ИмяРаздела, ЗаголовокПанелиОтчетов, ПараметрыВыполненияКоманды, - КартинкаФормы = Неопределено) Экспорт - ПоказатьПанельОтчетов(ИмяРаздела, ПараметрыВыполненияКоманды, ЗаголовокПанелиОтчетов); -КонецПроцедуры - // Открывает диалог настройки размещения нескольких вариантов в разделах. -// Проверки рекомендуется осуществлять до вызова. +// Проверки рекомендуется осуществлять до вызова. // // Параметры: -// МассивВариантов (Массив) из (СправочникСсылка.ВариантыОтчетов) +// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. // ДополнительныеПараметры (*) Необязательный. -// Владелец (УправляемаяФорма) Необязательный. Используется только для блокирования формы, из которой выполняется размещение вариантов отчетов. +// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования формы, из которой выполняется размещение вариантов отчетов. // Процедура ОткрытьДиалогРазмещенияВариантовВРазделах(МассивВариантов, ДополнительныеПараметры = Неопределено, Владелец = Неопределено) Экспорт Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда - Предупреждение(НСтр("ru = 'Выберите варианты отчетов, которые необходимо разместить в разделах.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, которые необходимо разместить в разделах.'")); Возврат; КонецЕсли; @@ -56,10 +49,51 @@ КонецПроцедуры +// Открывает диалог диалог сброса пользовательских настроек выбранных вариантов отчетов. +// Проверки рекомендуется осуществлять до вызова. +// +// Параметры: +// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. +// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования формы, из которой выполняется вызов. +// +Процедура ОткрытьДиалогСбросаНастроекПользователей(МассивВариантов, Владелец = Неопределено) Экспорт + + Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов, для которых необходимо сбросить пользовательские настройки.'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("МассивВариантов", МассивВариантов); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросПользовательскихНастроек", ПараметрыОткрытия, Владелец); + +КонецПроцедуры + +// Открывает диалог диалог сброса настроек размещения выбранных вариантов отчетов программы. +// Проверки рекомендуется осуществлять до вызова. +// +// Параметры: +// МассивВариантов - Массив из СправочникСсылка.ВариантыОтчетов - Варианты отчетов, для которых открывается диалог. +// Владелец - УправляемаяФорма - Необязательный. Используется только для блокирования формы, из которой выполняется вызов. +// +Процедура ОткрытьДиалогСбросаНастроекРазмещения(МассивВариантов, Владелец = Неопределено) Экспорт + + Если ТипЗнч(МассивВариантов) <> Тип("Массив") ИЛИ МассивВариантов.Количество() < 1 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Выберите варианты отчетов программы, для которых необходимо сбросить настройки размещения.'")); + Возврат; + КонецЕсли; + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("МассивВариантов", МассивВариантов); + ОткрытьФорму("Справочник.ВариантыОтчетов.Форма.СбросНастроекРазмещения", ПараметрыОткрытия, Владелец); + +КонецПроцедуры + // Оповещает открытые панели отчетов, формы списков и элементов о изменениях. // // Параметры: -// см. справку к Оповестить (Глобальный контекст) +// Параметр - Произвольный - Необязательный. Могут быть переданы любые необходимые данные. +// Источник - Произвольный - Необязательный. Источник события. Например, в качестве источника может быть указана другая форма. // Процедура ОбновитьОткрытыеФормы(Параметр = Неопределено, Источник = Неопределено) Экспорт @@ -70,27 +104,27 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Открывает вариант отчета. +// Открывает форму отчета. // // Параметры: -// ЭтаФорма (УправляемаяФорма) +// Форма - УправляемаяФорма - Форма, из которой открывается отчет. // -Процедура ОткрытьВариантОтчета(ЭтаФорма) Экспорт - Если ЭтаФорма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаСписка" Тогда - Вариант = ЭтаФорма.Элементы.Список.ТекущиеДанные; - ИначеЕсли ЭтаФорма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаЭлемента" Тогда - Вариант = ЭтаФорма.Объект; +Процедура ОткрытьВариантОтчета(Форма) Экспорт + Если Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаСписка" Тогда + Вариант = Форма.Элементы.Список.ТекущиеДанные; + ИначеЕсли Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаЭлемента" Тогда + Вариант = Форма.Объект; Иначе Возврат; КонецЕсли; Если Вариант = Неопределено ИЛИ Вариант.Ссылка.Пустая() Тогда - Предупреждение(НСтр("ru = 'Выберите вариант отчета.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Выберите вариант отчета.'")); ИначеЕсли Вариант.ТипОтчета = ПредопределенноеЗначение("Перечисление.ТипыОтчетов.Внешний") Тогда - Предупреждение(НСтр("ru = 'Вариант внешнего отчета можно открыть только из формы отчета.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Вариант внешнего отчета можно открыть только из формы отчета.'")); ИначеЕсли Вариант.ТипОтчета = ПредопределенноеЗначение("Перечисление.ТипыОтчетов.Дополнительный") Тогда @@ -100,10 +134,10 @@ Иначе - Если ЭтаФорма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаСписка" Тогда + Если Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаСписка" Тогда ИмяОтчета = Вариант.ИмяОтчета; Иначе - ИмяОтчета = ЭтаФорма.ИмяОтчета; + ИмяОтчета = Форма.ИмяОтчета; КонецЕсли; Уникальность = "Отчет." + ИмяОтчета; @@ -121,55 +155,9 @@ КонецЕсли; КонецПроцедуры -// Выводит пользователю результат выполнения какой-либо операции, при необходимости -// оповещает об изменении типа или ссылки. -// -Процедура ПоказатьРезультат(Результат) Экспорт - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - Оповестить = ?(Результат.Свойство("Оповестить"), Результат.Оповестить, Истина); - Заголовок = ?(Результат.Свойство("Заголовок"), Результат.Заголовок, ""); - Текст = ?(Результат.Свойство("Текст"), Результат.Текст, ""); - Картинка = ?(Результат.Свойство("Картинка"), Результат.Картинка, Неопределено); - ТекстОшибок = ?(Результат.Свойство("ТекстОшибок"), Результат.ТекстОшибок, ""); - Ссылка = ?(Результат.Свойство("Ссылка"), Результат.Ссылка, ""); - - Если Оповестить = Истина Тогда - ПоказатьОповещениеПользователя(Заголовок, Ссылка, Текст, Картинка); - Иначе - Если ЗначениеЗаполнено(ТекстОшибок) Тогда - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Показать ошибки'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(Текст, Кнопки, , 1, Заголовок); - - Если Ответ = 1 Тогда - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.УстановитьТекст(ТекстОшибок); - Если ЗначениеЗаполнено(Заголовок) Тогда - ТекстовыйДокумент.Показать(Заголовок); - Иначе - ТекстовыйДокумент.Показать(); - КонецЕсли; - КонецЕсли; - Иначе - Предупреждение(Текст); - КонецЕсли; - КонецЕсли; - - Если Результат.Свойство("ТипДляОбновления") Тогда - ОповеститьОбИзменении(Результат.ТипДляОбновления); - КонецЕсли; - -КонецПроцедуры - // Процедура обслуживает событие реквизита ДеревоПодсистем в формах редактирования. -// -Процедура ДеревоПодсистемИспользованиеПриИзменении(ЭтаФорма, Элемент) Экспорт - СтрокаДерева = ЭтаФорма.Элементы.ДеревоПодсистем.ТекущиеДанные; +Процедура ДеревоПодсистемИспользованиеПриИзменении(Форма, Элемент) Экспорт + СтрокаДерева = Форма.Элементы.ДеревоПодсистем.ТекущиеДанные; Если СтрокаДерева = Неопределено Тогда Возврат; КонецЕсли; @@ -184,13 +172,12 @@ СтрокаДерева.Использование = 0; КонецЕсли; - УстановитьИзмененПользователем(ЭтаФорма, СтрокаДерева); + УстановитьИзмененПользователем(Форма, СтрокаДерева); КонецПроцедуры // Процедура обслуживает событие реквизита ДеревоПодсистем в формах редактирования. -// -Процедура ДеревоПодсистемВажностьПриИзменении(ЭтаФорма, Элемент) Экспорт - СтрокаДерева = ЭтаФорма.Элементы.ДеревоПодсистем.ТекущиеДанные; +Процедура ДеревоПодсистемВажностьПриИзменении(Форма, Элемент) Экспорт + СтрокаДерева = Форма.Элементы.ДеревоПодсистем.ТекущиеДанные; Если СтрокаДерева = Неопределено Тогда Возврат; КонецЕсли; @@ -205,68 +192,75 @@ СтрокаДерева.Использование = 1; КонецЕсли; - УстановитьИзмененПользователем(ЭтаФорма, СтрокаДерева); + УстановитьИзмененПользователем(Форма, СтрокаДерева); КонецПроцедуры // Вспомогательная процедура для обработки изменений ДеревоПодсистем. -// -Процедура УстановитьИзмененПользователем(ЭтаФорма, СтрокаДерева) +Процедура УстановитьИзмененПользователем(Форма, СтрокаДерева) Если СтрокаДерева.Использование = СтрокаДерева.ИспользованиеПоУмолчанию И СтрокаДерева.Важность = СтрокаДерева.ВажностьПоУмолчанию Тогда СтрокаДерева.ИзмененПользователем = Ложь; Иначе СтрокаДерева.ИзмененПользователем = Истина; - Если ЭтаФорма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаЭлемента" Тогда - ЭтаФорма.Модифицированность = Истина; + Если Форма.ИмяФормы = "Справочник.ВариантыОтчетов.Форма.ФормаЭлемента" Тогда + Форма.Модифицированность = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры -// Вызывает диалог сохранения редактируемых данных произвольной формы -// Вызывается из обработчиков "ПередЗакрытием" и "ПриЗакрытии". +// Аналог ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста, работающий за 1 вызов. +// В отличие от ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария позволяет устанавливать свой заголовок +// и работает с реквизитами таблиц. // -// Параметры: -// Модифицированность (Булево) Флаг модифицированности формы. -// Если форма не модифицирована, то сохранять нечего и запрос не требуется -// Отказ (...) Флаг отказа от закрытия формы. -// |- (Булево) для обработчика "ПередЗакрытием", используется для толстого и тонкого клиента. -// |- (Неопределено) для обработчика "ПриЗакрытии", используется для веб клиента. -// -// Возвращаемое значение: -// (Булево) Необходимость сохранения данных формы. -// -Функция СохранитьДанныеПроизвольнойФормы(Модифицированность, Отказ = Неопределено) Экспорт - // Изменение сохраняемых данных должно устанавливать модифицированность формы - Если Модифицированность <> Истина Тогда - Возврат Ложь; +Процедура РедактироватьМногострочныйТекст(ФормаИлиОбработчик, ТекстРедактирования, ВладелецРеквизита, ИмяРеквизита, Знач Заголовок = "") Экспорт + + Если ПустаяСтрока(Заголовок) Тогда + Заголовок = НСтр("ru = 'Комментарий'"); КонецЕсли; - // Определение клиента - #Если ВебКлиент Тогда - ЭтоВебКлиент = Истина; - #Иначе - ЭтоВебКлиент = Ложь; - #КонецЕсли + ПараметрыИсточника = Новый Структура; + ПараметрыИсточника.Вставить("ФормаИлиОбработчик", ФормаИлиОбработчик); + ПараметрыИсточника.Вставить("ВладелецРеквизита", ВладелецРеквизита); + ПараметрыИсточника.Вставить("ИмяРеквизита", ИмяРеквизита); + Обработчик = Новый ОписаниеОповещения("РедактироватьМногострочныйТекстЗавершение", ЭтотОбъект, ПараметрыИсточника); - // Предупреждение необходимо вызвать только один раз для одного клиента - Если ЭтоВебКлиент <> (Отказ = Неопределено) Тогда - Возврат Ложь; + ПоказатьВводСтроки(Обработчик, ТекстРедактирования, Заголовок, , Истина); + +КонецПроцедуры + +// Обработчик результата работы процедуры РедактироватьМногострочныйТекст. +Процедура РедактироватьМногострочныйТекстЗавершение(Текст, ПараметрыИсточника) Экспорт + + Если ТипЗнч(ПараметрыИсточника.ФормаИлиОбработчик) = Тип("УправляемаяФорма") Тогда + Форма = ПараметрыИсточника.ФормаИлиОбработчик; + Обработчик = Неопределено; + Иначе + Форма = Неопределено; + Обработчик = ПараметрыИсточника.ФормаИлиОбработчик; КонецЕсли; - ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); - Кнопки = ?(ЭтоВебКлиент, РежимДиалогаВопрос.ДаНет, РежимДиалогаВопрос.ДаНетОтмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - Возврат Истина; + Если Текст <> Неопределено Тогда + + Если ТипЗнч(ПараметрыИсточника.ВладелецРеквизита) = Тип("ДанныеФормыЭлементДерева") + Или ТипЗнч(ПараметрыИсточника.ВладелецРеквизита) = Тип("ДанныеФормыЭлементКоллекции") Тогда + ЗаполнитьЗначенияСвойств(ПараметрыИсточника.ВладелецРеквизита, Новый Структура(ПараметрыИсточника.ИмяРеквизита, Текст)); + Иначе + ПараметрыИсточника.ВладелецРеквизита[ПараметрыИсточника.ИмяРеквизита] = Текст; + КонецЕсли; + + Если Форма <> Неопределено Тогда + Если Не Форма.Модифицированность Тогда + Форма.Модифицированность = Истина; + КонецЕсли; + КонецЕсли; + КонецЕсли; - Если НЕ ЭтоВебКлиент И Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; + Если Обработчик <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Обработчик, Текст); КонецЕсли; - Возврат Ложь; -КонецФункции +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -274,15 +268,15 @@ // Открывает форму дополнительного отчета с заданным вариантом. // // Параметры -// Вариант (Структура) -// |- Ссылка (СправочникСсылка.ВариантыОтчетов) -// |- Отчет (*) см. тип реквизита Отчет справочника ВариантыОтчетов. -// |- КлючВарианта (Строка) +// Вариант - Структура - Информация о варианте отчета: +// * Ссылка - СправочникСсылка.ВариантыОтчетов - Ссылка варианта отчета. +// * Отчет - <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - Ссылка или имя отчета. +// * КлючВарианта - Строка - Имя варианта отчета. // Процедура ОткрытьВариантДополнительногоОтчета(Вариант) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); МодульДополнительныеОтчетыИОбработкиКлиент.ОткрытьВариантДополнительногоОтчета(Вариант.Отчет, Вариант.КлючВарианта); КонецЕсли; diff --git a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl index 18e6e2b14..aa6a8132c 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовКлиентСервер/Module.bsl @@ -15,19 +15,16 @@ КонецФункции // Представление группы важности. -// Функция ПредставлениеСмТакже() Экспорт Возврат НСтр("ru = 'См. также'"); КонецФункции // Представление группы важности. -// Функция ПредставлениеВажный() Экспорт Возврат НСтр("ru = 'Важный'"); КонецФункции // Имя события оповещения для изменения варианта отчета. -// Функция ИмяСобытияИзменениеВарианта() Экспорт Возврат "СтандартныеПодсистемы.ВариантыОтчетов.ИзменениеВарианта"; КонецФункции diff --git a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl index fced365cd..1d073451c 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПереопределяемый/Module.bsl @@ -11,7 +11,7 @@ // Определяет разделы, в которых доступна панель отчетов. // // Параметры: -// Разделы (Массив) из (ОбъектМетаданных) +// Разделы - Массив из ОбъектМетаданных: Подсистема - Разделы в которые выведена команды открытия панели отчетов. // // Описание: // В Разделы необходимо добавить метаданные тех подсистем 1го уровня, @@ -29,39 +29,38 @@ // Содержит настройки размещения вариантов отчетов в панели отчетов. // // Параметры: -// Настройки (Коллекция) Используется для описания настроек отчетов и вариантов +// Настройки - Коллекция - Используется для описания настроек отчетов и вариантов // см. описание к ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() // // Описание: // В данной процедуре необходимо указать каким именно образом предопределенные варианты отчетов // будут регистрироваться в программе и показываться в панели отчетов. // -// Вспомогательные функции: +// Вспомогательные методы: // НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); // // Данные функции получают соответственно настройки отчета и настройки варианта отчета следующей структуры: -// |- Включен (Булево) -// Если Ложь, то вариант отчета не регистрируется в подсистеме. -// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. -// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи -// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). -// |- ВидимостьПоУмолчанию (Булево) -// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// Пользователь может "включить" его в режиме настройки панели отчетов -// или открыть через форму "Все отчеты". -// |- Описание (Строка) -// Дополнительная информация по варианту отчета. -// В панели отчетов выводится в качестве подсказки. -// Должно расшифровывать для пользователя содержимое варианта отчета -// и не должно дублировать наименование варианта отчета. -// |- Размещение (Соответствие) Настройки размещения варианта отчета в разделах -// |- Ключ (ОбъектМетаданных) Подсистема, в которой размещается отчет или вариант отчета -// |- Значение (Строка) Необязательный. Настройки размещения в подсистеме. -// |- "" - Выводить отчет в своей группе обычным шрифтом. -// |- "Важный" - Выводить отчет в своей группе жирным шрифтом. -// |- "СмТакже" - Выводить отчет в группе "См. также". -// |- ФункциональныеОпции (Массив) из (Строка) +// * Включен - Булево - +// Если Ложь, то вариант отчета не регистрируется в подсистеме. +// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. +// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи +// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). +// * ВидимостьПоУмолчанию - Булево - +// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// Пользователь может "включить" его в режиме настройки панели отчетов +// или открыть через форму "Все отчеты". +// * Описание - Строка - Дополнительная информация по варианту отчета. +// В панели отчетов выводится в качестве подсказки. +// Должно расшифровывать для пользователя содержимое варианта отчета +// и не должно дублировать наименование варианта отчета. +// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. +// ** Ключ - ОбъектМетаданных: Подсистема - Подсистема, в которой размещается отчет или вариант отчета +// ** Значение - Строка - Необязательный. Настройки размещения в подсистеме. +// "" - Выводить отчет в своей группе обычным шрифтом. +// "Важный" - Выводить отчет в своей группе жирным шрифтом. +// "СмТакже" - Выводить отчет в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - // Имена функциональных опций варианта отчета. // // Например: @@ -127,10 +126,10 @@ // и для сохранения настроек варианта, сделанных администратором. // // Параметры: -// Изменения (ТаблицаЗначений) Таблица изменений имен вариантов -// |- Отчет (ОбъектМетаданных) -// |- СтароеИмяВарианта (Строка) -// |- АктуальноеИмяВарианта (Строка) +// Изменения - ТаблицаЗначений - Таблица изменений имен вариантов. Колонки: +// * Отчет - ОбъектМетаданных - Метаданные отчета, в схеме которого изменилось имя варианта. +// * СтароеИмяВарианта - Строка - Старое имя варианта, до изменения. +// * АктуальноеИмяВарианта - Строка - Текущее (последнее актуальное) имя варианта. // // Описание: // В Изменения необходимо добавить описания изменений имен вариантов diff --git a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl index 30a485f22..8a4cd0931 100644 --- a/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ВариантыОтчетовПовтИсп/Module.bsl @@ -10,7 +10,7 @@ // Формирует список отчетов конфигурации, доступных текущему пользователю. // // Возвращаемое значение: -// Результат (Массив) из (*) см. тип реквизита Отчет справочника ВариантыОтчетов. +// Массив из <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - // Ссылки отчетов, доступных текущему пользователю. // // Описание: @@ -33,7 +33,8 @@ // Формирует список вариантов отчетов конфигурации, недоступных текущему пользователю по функциональным опциям. // // Возвращаемое значение: -// (Массив) из (СправочникСсылка.ПредопределенныеВариантыОтчетов) Варианты отчетов, которые отключены по функциональным опциям. +// Массив из СправочникСсылка.ПредопределенныеВариантыОтчетов - +// Варианты отчетов, которые отключены по функциональным опциям. // // Описание: // Данный массив следует использовать во всех запросах к таблице @@ -90,13 +91,13 @@ // Формирует дерево подсистем, доступных текущему пользователю. // // Возвращаемое значение: -// Результат (ДеревоЗначений) -// |- РазделСсылка (СправочникСсылка.ИдентификаторыОбъектовМетаданных) Ссылка раздела. -// |- Ссылка (СправочникСсылка.ИдентификаторыОбъектовМетаданных) Ссылка подсистемы. -// |- Имя (Строка) Имя подсистемы. -// |- ПолноеИмя (Строка) Полное имя подсистемы. -// |- Представление (Строка) Представление подсистемы. -// |- Приоритет (Строка) Приоритет подсистемы. +// Результат - ДеревоЗначений - +// * РазделСсылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка раздела. +// * Ссылка - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка подсистемы. +// * Имя - Строка - Имя подсистемы. +// * ПолноеИмя - Строка - Полное имя подсистемы. +// * Представление - Строка - Представление подсистемы. +// * Приоритет - Строка - Приоритет подсистемы. // Функция ПодсистемыТекущегоПользователя() Экспорт Результат = Новый ДеревоЗначений; diff --git a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl index 0d0a78dd3..b6e49e90f 100644 --- a/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ВерсионированиеОбъектов/Module.bsl @@ -563,6 +563,7 @@ // ОбъектСсылка - Ссылка - Ссылка на объект, для которого имеется версия // НомерВерсииДляПерехода - Число - Номер версии, на которую необходимо выполнить переход // НомерИгнорируемойВерсии - Число - Номер версии, на которую необходимо проигнорировать +// ПропуститьПроверкуЗапретаИзменения - Булево - Признак пропуска проверки даты запрета загрузки // Процедура ПриПереходеНаВерсиюОбъекта(СсылкаНаОбъект, Знач НомерВерсии) Экспорт @@ -688,7 +689,7 @@ // // Возвращаемое значение - Объект или Неопределено. // -Функция ВосстановитьОбъектПоXML(знач АдресВоВременномХранилище = "", ТекстСообщенияОбОшибке = "") Экспорт +Функция ВосстановитьОбъектПоXML(Знач АдресВоВременномХранилище = "", ТекстСообщенияОбОшибке = "") Экспорт УстановитьПривилегированныйРежим(Истина); @@ -729,7 +730,7 @@ // Функция может вызвать исключение, если запись не содержит данных. // Функцию требуется вызвать в привилегированном режиме. // -Функция СведенияОВерсииОбъекта(знач Ссылка, знач НомерВерсии) Экспорт +Функция СведенияОВерсииОбъекта(Знач Ссылка, Знач НомерВерсии) Экспорт Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ @@ -773,7 +774,7 @@ // версионирование, то он версионируется в соответствии с правилами // версионирования "по умолчанию". // -Функция ОбъектВерсионируется(знач Источник, НомерПоследнейВерсии) Экспорт +Функция ОбъектВерсионируется(Знач Источник, НомерПоследнейВерсии) Экспорт // Проверяем, что подсистема версионирования включена Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьВерсионированиеОбъектов") Тогда @@ -1089,7 +1090,7 @@ // Получает представление наименования системного реквизита // -Функция ПолучитьПредставлениеРеквизитаНаЯзыке(знач ИмяРеквизита) +Функция ПолучитьПредставлениеРеквизитаНаЯзыке(Знач ИмяРеквизита) Если ИмяРеквизита = "Number" Тогда Возврат НСтр("ru = 'Номер'; en='Number'"); @@ -1162,7 +1163,7 @@ // ВерсияОбъекта - СправочникОбъект,ДокументОбъект - объект, данные которого необходимо отобразить в отчете // НаименованиеОбъекта - Строка - наименование объекта, по которому // -Процедура ФормированиеПоСтандартномуМакету(ТЧОтчета, Макет, ВерсияОбъекта, знач ОписаниеВерсии, СсылкаНаОбъект) +Процедура ФормированиеПоСтандартномуМакету(ТЧОтчета, Макет, ВерсияОбъекта, Знач ОписаниеВерсии, СсылкаНаОбъект) МетаданныеОбъекта = СсылкаНаОбъект.Метаданные(); @@ -1367,13 +1368,13 @@ // Выводит текст в область табличного документа с определенным оформлением // Функция ВывестиТекстВОтчет(ТЧОтчета, - знач Секция, - знач Регион, - знач Текст, - знач ЦветТекста = Неопределено, - знач ЦветФона = Неопределено, - знач Размер = 9, - знач Жирный = Ложь) + Знач Секция, + Знач Регион, + Знач Текст, + Знач ЦветТекста = Неопределено, + Знач ЦветФона = Неопределено, + Знач Размер = 9, + Знач Жирный = Ложь) ОбластьСекции = Секция.Область(Регион); @@ -1402,11 +1403,11 @@ // с условным оформлением // Процедура УстановитьСвойстваТекста(ОбластьСекции, Текст, - знач ЦветТекста = Неопределено, - знач ЦветФона = Неопределено, - знач Размер = 9, - знач Жирный = Ложь, - знач ПоказыватьГраницы = Ложь) + Знач ЦветТекста = Неопределено, + Знач ЦветФона = Неопределено, + Знач Размер = 9, + Знач Жирный = Ложь, + Знач ПоказыватьГраницы = Ложь) ОбластьСекции.Текст = Текст; @@ -1433,7 +1434,7 @@ // Формирует пустой сектор для вывода в отчет. Используется, // если строка не была изменена в одной из версий. // -Функция СформироватьПустойСектор(знач ЧислоСтрок, знач ТипВывода = "") +Функция СформироватьПустойСектор(Знач ЧислоСтрок, Знач ТипВывода = "") ЗначениеЗаполнения = Новый Массив; @@ -1451,7 +1452,7 @@ // "д" - добавление // "у" - удаление // "" - обычный вывод -Функция СформироватьСекторСтрокиТЧ(знач ЗначениеЗаполнения,знач ТипВывода = "") +Функция СформироватьСекторСтрокиТЧ(Знач ЗначениеЗаполнения,Знач ТипВывода = "") ОбщийШаблон = РегистрыСведений.ВерсииОбъектов.ПолучитьМакет("СтандартныйМакетПредставленияОбъекта"); diff --git a/SSL/src/CommonModules/Взаимодействия/Module.bsl b/SSL/src/CommonModules/Взаимодействия/Module.bsl index d5130c679..42023d08e 100644 --- a/SSL/src/CommonModules/Взаимодействия/Module.bsl +++ b/SSL/src/CommonModules/Взаимодействия/Module.bsl @@ -51,6 +51,10 @@ Контакты = Новый Массив; Контакты.Добавить(ДанныеЗаполнения.Контакт); КонецЕсли; + Если ДанныеЗаполнения.Свойство("Предмет") И ЗначениеЗаполнено(ДанныеЗаполнения.Предмет) Тогда + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ДанныеЗаполнения.Предмет); + Контакты = МенеджерОбъекта.ПолучитьКонтакты(ДанныеЗаполнения.Предмет); + КонецЕсли; КонецЕсли; @@ -126,7 +130,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПредставленияПредмета"].Добавить( "Взаимодействия"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "Взаимодействия"); КонецЕсли; @@ -134,6 +138,12 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "Взаимодействия"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки" + ].Добавить("Взаимодействия"); + КонецЕсли; + КонецПроцедуры // Заполняет структуру параметров, необходимых для работы клиентского кода @@ -194,17 +204,12 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо // Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах @@ -218,55 +223,68 @@ // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("УчетныеЗаписиЭлектроннойПочты") Тогда + + Описание = Описание + + " + |Справочник.ПапкиЭлектронныхПисем.Чтение.УчетныеЗаписиЭлектроннойПочты + |Справочник.ПапкиЭлектронныхПисем.Изменение.УчетныеЗаписиЭлектроннойПочты + |Справочник.ПравилаОбработкиЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты + |Справочник.ПравилаОбработкиЭлектроннойПочты.Изменение.УчетныеЗаписиЭлектроннойПочты + |"; + + КонецЕсли; + Описание = Описание + " - |Справочник.ПапкиЭлектронныхПисем.Чтение.УчетныеЗаписиЭлектроннойПочты - |Справочник.ПапкиЭлектронныхПисем.Добавление.УчетныеЗаписиЭлектроннойПочты - |Справочник.ПапкиЭлектронныхПисем.Изменение.УчетныеЗаписиЭлектроннойПочты - |Справочник.ПравилаОбработкиЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты - |Справочник.ПравилаОбработкиЭлектроннойПочты.Добавление.УчетныеЗаписиЭлектроннойПочты - |Справочник.ПравилаОбработкиЭлектроннойПочты.Изменение.УчетныеЗаписиЭлектроннойПочты |Документ.Встреча.Чтение.Объект.Документ.Встреча - |Документ.Встреча.Добавление.Объект.Документ.Встреча |Документ.Встреча.Изменение.Объект.Документ.Встреча |Документ.ЗапланированноеВзаимодействие.Чтение.Объект.Документ.ЗапланированноеВзаимодействие - |Документ.ЗапланированноеВзаимодействие.Добавление.Объект.Документ.ЗапланированноеВзаимодействие |Документ.ЗапланированноеВзаимодействие.Изменение.Объект.Документ.ЗапланированноеВзаимодействие + |Документ.СообщениеSMS.Чтение.Объект.Документ.СообщениеSMS + |Документ.СообщениеSMS.Изменение.Объект.Документ.СообщениеSMS |Документ.ТелефонныйЗвонок.Чтение.Объект.Документ.ТелефонныйЗвонок - |Документ.ТелефонныйЗвонок.Добавление.Объект.Документ.ТелефонныйЗвонок |Документ.ТелефонныйЗвонок.Изменение.Объект.Документ.ТелефонныйЗвонок |Документ.ЭлектронноеПисьмоВходящее.Чтение.Объект.Документ.ЭлектронноеПисьмоВходящее - |Документ.ЭлектронноеПисьмоВходящее.Добавление.Объект.Документ.ЭлектронноеПисьмоВходящее |Документ.ЭлектронноеПисьмоВходящее.Изменение.Объект.Документ.ЭлектронноеПисьмоВходящее |Документ.ЭлектронноеПисьмоИсходящее.Чтение.Объект.Документ.ЭлектронноеПисьмоИсходящее - |Документ.ЭлектронноеПисьмоИсходящее.Добавление.Объект.Документ.ЭлектронноеПисьмоИсходящее |Документ.ЭлектронноеПисьмоИсходящее.Изменение.Объект.Документ.ЭлектронноеПисьмоИсходящее |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.Встреча |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.ЗапланированноеВзаимодействие + |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.СообщениеSMS |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.ТелефонныйЗвонок |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.ЭлектронноеПисьмоВходящее |ЖурналДокументов.Взаимодействия.Чтение.Объект.Документ.ЭлектронноеПисьмоИсходящее |РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.Встреча + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.ЗапланированноеВзаимодействие + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.СообщениеSMS + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.ТелефонныйЗвонок + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.ЭлектронноеПисьмоВходящее + |РегистрСведений.ПредметыПапкиВзаимодействий.Изменение.Объект.Документ.ЭлектронноеПисьмоИсходящее |"; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда Описание = Описание + " |Справочник.ВстречаПрисоединенныеФайлы.Чтение.Объект.Документ.Встреча - |Справочник.ВстречаПрисоединенныеФайлы.Добавление.Объект.Документ.Встреча |Справочник.ВстречаПрисоединенныеФайлы.Изменение.Объект.Документ.Встреча |Справочник.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.Чтение.Объект.Документ.ЗапланированноеВзаимодействие - |Справочник.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.Добавление.Объект.Документ.ЗапланированноеВзаимодействие |Справочник.ЗапланированноеВзаимодействиеПрисоединенныеФайлы.Изменение.Объект.Документ.ЗапланированноеВзаимодействие + |Справочник.СообщениеSMSПрисоединенныеФайлы.Чтение.Объект.Документ.СообщениеSMS + |Справочник.СообщениеSMSПрисоединенныеФайлы.Изменение.Объект.Документ.СообщениеSMS |Справочник.ТелефонныйЗвонокПрисоединенныеФайлы.Чтение.Объект.Документ.ТелефонныйЗвонок - |Справочник.ТелефонныйЗвонокПрисоединенныеФайлы.Добавление.Объект.Документ.ТелефонныйЗвонок |Справочник.ТелефонныйЗвонокПрисоединенныеФайлы.Изменение.Объект.Документ.ТелефонныйЗвонок |Справочник.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.Чтение.Объект.Документ.ЭлектронноеПисьмоВходящее - |Справочник.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.Добавление.Объект.Документ.ЭлектронноеПисьмоВходящее |Справочник.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы.Изменение.Объект.Документ.ЭлектронноеПисьмоВходящее |Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.Чтение.Объект.Документ.ЭлектронноеПисьмоИсходящее - |Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.Добавление.Объект.Документ.ЭлектронноеПисьмоИсходящее |Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы.Изменение.Объект.Документ.ЭлектронноеПисьмоИсходящее |"; КонецЕсли; @@ -285,6 +303,51 @@ КонецПроцедуры +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. +// +// Параметры: +// Типы - Массив(Типы). +// +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.Константы.АдресПубликацииИнформационнойБазыВИнтернете); + Типы.Добавить(Метаданные.Константы.ИспользоватьПочтовыйКлиент); + Типы.Добавить(Метаданные.Константы.ИспользоватьПризнакРассмотрено); + Типы.Добавить(Метаданные.Константы.ИспользоватьПрочиеВзаимодействия); + Типы.Добавить(Метаданные.Константы.ОтправлятьПисьмаВФорматеHTML); + + Типы.Добавить(Метаданные.Справочники.ВстречаПрисоединенныеФайлы); + Типы.Добавить(Метаданные.Справочники.ЗакладкиВзаимодействий); + Типы.Добавить(Метаданные.Справочники.ЗапланированноеВзаимодействиеПрисоединенныеФайлы); + Типы.Добавить(Метаданные.Справочники.ПапкиЭлектронныхПисем); + Типы.Добавить(Метаданные.Справочники.ПравилаОбработкиЭлектроннойПочты); + Типы.Добавить(Метаданные.Справочники.СообщениеSMSПрисоединенныеФайлы); + Типы.Добавить(Метаданные.Справочники.СтроковыеКонтактыВзаимодействий); + Типы.Добавить(Метаданные.Справочники.ТелефонныйЗвонокПрисоединенныеФайлы); + Типы.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоВходящееПрисоединенныеФайлы); + Типы.Добавить(Метаданные.Справочники.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы); + + Типы.Добавить(Метаданные.Документы.Встреча); + Типы.Добавить(Метаданные.Документы.ЗапланированноеВзаимодействие); + Типы.Добавить(Метаданные.Документы.СообщениеSMS); + Типы.Добавить(Метаданные.Документы.ТелефонныйЗвонок); + Типы.Добавить(Метаданные.Документы.ЭлектронноеПисьмоВходящее); + Типы.Добавить(Метаданные.Документы.ЭлектронноеПисьмоИсходящее); + + Типы.Добавить(Метаданные.ЖурналыДокументов.Взаимодействия); + + Типы.Добавить(Метаданные.РегистрыСведений.ИдентификаторыПолученныхЭлектронныхПисем); + Типы.Добавить(Метаданные.РегистрыСведений.КонтактыВзаимодействий); + Типы.Добавить(Метаданные.РегистрыСведений.НастройкиУчетныхЗаписейЭлектроннойПочты); + Типы.Добавить(Метаданные.РегистрыСведений.ПредметыПапкиВзаимодействий); + Типы.Добавить(Метаданные.РегистрыСведений.СостоянияКонтактовВзаимодействий); + Типы.Добавить(Метаданные.РегистрыСведений.СостоянияПапокПисем); + Типы.Добавить(Метаданные.РегистрыСведений.СостоянияПредметовВзаимодействий); + Типы.Добавить(Метаданные.РегистрыСведений.УведомленияОПрочтении); + Типы.Добавить(Метаданные.РегистрыСведений.Удалить_АктивныеПредметыВзаимодействий); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции отвечающие за полнотекстовый поиск @@ -1533,25 +1596,45 @@ // Функция ПолучитьЗначениеПредмета(Ссылка) Экспорт - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ПредметыВзаимодействий.Предмет - |ИЗ - | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий - |ГДЕ - | ПредметыВзаимодействий.Взаимодействие = &Взаимодействие"; + Реквизиты = СтруктураРеквизитовВзаимодействия(Ссылка); + Возврат ?(Реквизиты = Неопределено, Неопределено, Реквизиты.Предмет); - Запрос.УстановитьПараметр("Взаимодействие",Ссылка); +КонецФункции + +//Возвращает структуру доп. реквизитов взаимодействия, хранящихся в регистре Предметы и папки взаимодействий +//Параметры: +// Ссылка - ссылка на взаимодействие +// +//Возвращаемое значение: +// Структура - структура содержащая доп реквизиты. +// +Функция СтруктураРеквизитовВзаимодействия(Ссылка) Экспорт + + СтруктураВозврата = ВзаимодействияКлиентСервер.ПустаяСтруктураРеквизитыВзаимодействия(); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Предмет, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма Как Папка, + | ПредметыПапкиВзаимодействий.Рассмотрено, + | ПредметыПапкиВзаимодействий.РассмотретьПосле + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Взаимодействие = &Взаимодействие"; + + Запрос.УстановитьПараметр("Взаимодействие", Ссылка); Результат = Запрос.Выполнить(); - Если Результат.Пустой() Тогда - Возврат Неопределено; - Иначе + Если НЕ Результат.Пустой() Тогда Выборка = Результат.Выбрать(); Выборка.Следующий(); - Возврат Выборка.Предмет; + ЗаполнитьЗначенияСвойств(СтруктураВозврата, Выборка); КонецЕсли; + Возврат СтруктураВозврата; + КонецФункции //Возвращает ссылку на текущую папку электронного письма @@ -1653,6 +1736,17 @@ КонецФункции +//Получает значения реквизитов документа взаимодействия, хранящиеся в регистре и +// устанавливает их в соответствующие реквизиты формы +//Параметры: +// Форма - УправляемаяФорма - форма документа взаимодействия. +// +Процедура УстановитьРеквизитыФормыВзаимодействияПоДаннымРегистра(Форма) Экспорт + + СтруктураРеквизитов = СтруктураРеквизитовВзаимодействия(Форма.Объект.Ссылка); + ЗаполнитьЗначенияСвойств(Форма, СтруктураРеквизитов, "Предмет, Рассмотрено, РассмотретьПосле"); + +КонецПроцедуры /////////////////////////////////////////////////////////////////////////////////// // Процедуры и функции работы с взаимодействиями @@ -1801,7 +1895,7 @@ НоваяСтрока.Контакт = ЭлементМассива; КонецЕсли; - ДозаполнитьПоляКонтактов(НоваяСтрока.Контакт, НоваяСтрока.ПредставлениеКонтакта, НоваяСтрока.КакСвязаться , ТипКонтактнойИнформации); + ДозаполнитьПоляКонтактов(НоваяСтрока.Контакт, НоваяСтрока.ПредставлениеКонтакта, НоваяСтрока.КакСвязаться, ТипКонтактнойИнформации); КонецЦикла; @@ -2233,10 +2327,7 @@ // Функция ВыполнитьОтправкуПисьма(Объект, Соединение = Неопределено) Экспорт - РасширениеДляФайловПодписи = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляФайловПодписи"); - Если РасширениеДляФайловПодписи = Неопределено ИЛИ ПустаяСтрока(РасширениеДляФайловПодписи) Тогда - РасширениеДляФайловПодписи = "p7s"; - КонецЕсли; + РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи; ПараметрыПисьма = Новый Структура; @@ -2262,7 +2353,7 @@ | Файлы.Наименование КАК ПолноеНаименование, | Файлы.Расширение КАК Расширение, | Файлы.Ссылка КАК Ссылка, - | Файлы.ЭлектронныеЦифровыеПодписи.( + | Файлы.ЭлектронныеПодписи.( | НомерСтроки, | Подпись | ), @@ -2284,10 +2375,10 @@ СтруктураДанныеВложения.Вставить("Идентификатор", Выборка.ИДФайлаЭлектронногоПисьма); соотвВложения.Вставить(ИмяФайла, СтруктураДанныеВложения); КонецЕсли; - Для каждого ЭЦП Из Выборка.ЭлектронныеЦифровыеПодписи.Выгрузить() Цикл + Для каждого ЭП Из Выборка.ЭлектронныеЦифровыеПодписи.Выгрузить() Цикл - соотвВложения.Вставить(Выборка.ПолноеНаименование + "-DS("+ ЭЦП.НомерСтроки + ")." + - РасширениеДляФайловПодписи,ЭЦП.Подпись.Получить()); + соотвВложения.Вставить(Выборка.ПолноеНаименование + "-DS("+ ЭП.НомерСтроки + ")." + + РасширениеДляФайловПодписи,ЭП.Подпись.Получить()); КонецЦикла; КонецЦикла; @@ -2329,28 +2420,6 @@ КонецПроцедуры -//Получает данные выбора для документов взаимодействия -Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка, ИмяДокумента) Экспорт - - СтандартнаяОбработка = Ложь; - - Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ - | ДокументВзаимодействий.Ссылка КАК Ссылка - |ИЗ - | Документ." + ИмяДокумента + " КАК ДокументВзаимодействий - |ГДЕ - | ДокументВзаимодействий.Тема ПОДОБНО &СтрокаПоиска - | ИЛИ ДокументВзаимодействий.Номер ПОДОБНО &СтрокаПоиска"; - - Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска + "%"); - - ДанныеВыбора = Новый СписокЗначений; - ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка")); - - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обработчики обновления @@ -2362,6 +2431,10 @@ // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.1.2.4"; Обработчик.Процедура = "Взаимодействия.ОбновитьХранениеПредмета_1_2_1_4"; @@ -2394,9 +2467,56 @@ Обработчик.Версия = "2.1.3.22"; Обработчик.Процедура = "Взаимодействия. ОбновитьХранениеВключатьВПредставлениеИмяПользователя_2_1_3_22"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.ПредметыПапкиВзаимодействий.ОбновитьХранениеРассмотреноРассмотретьПосле_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Комментарий = НСтр("ru = 'Переносится хранение реквизитов ""Рассмотрено"" и ""РассмотретьПосле"" в регистр сведений ""ПредметыПапкиВзаимодействий"". Без выполнения обработчика значения данных реквизитов будут отображаться некорректно.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.КонтактыВзаимодействий.ЗаполнитьКонтактыВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Комментарий = НСтр("ru = 'Заполняется вспомогательный регистр сведений ""КонтактыВзаимодействий"". Без выполнения обработчика не будут корректно работать отборы по контактам взаимодействий.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияПапокПисем.РассчитатьСостоянияПапокЭлектронныхПисем_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества нерассмотренных писем по папкам. Без выполнения обработчика не будет корректно выводится информация о количестве нерассмотренных писем по папкам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияПредметовВзаимодействий.РассчитатьСостоянияПредметовВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний предметов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по предметам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.Процедура = "РегистрыСведений.СостоянияКонтактовВзаимодействий.РассчитатьСостоянияКонтактовВзаимодействий_2_2_0_0"; + Обработчик.РежимВыполнения = "Отложенно"; + Обработчик.Комментарий = НСтр("ru = 'Выполняется первоначальный расчет количества состояний контактов взаимодействий. Без выполнения обработчика не будет корректно выводится информация в панель навигации журнала взаимодействий по контактам.'"); + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.29"; + Обработчик.Процедура = "Взаимодействия.ОтключитьПодсистемуВМоделиСервиса"; + КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +Процедура ОтключитьПодсистемуВМоделиСервиса() Экспорт + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + + Константы.ИспользоватьПочтовыйКлиент.Установить(Ложь); + Константы.ИспользоватьПризнакРассмотрено.Установить(Ложь); + Константы.ИспользоватьПрочиеВзаимодействия.Установить(Ложь); + Константы.ОтправлятьПисьмаВФорматеHTML.Установить(Ложь); + + КонецЕсли; + +КонецПроцедуры + +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Перемещает письма в предопределенные папки // Процедура ПереместитьПисьмаВПредопределенныеПапки_1_2_1_4() Экспорт @@ -2499,7 +2619,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Переносит предмет взаимодействий из реквизита документа в регистр сведений ПредметыПапкиВзаимодействий // Процедура СоздатьПапкиЭлектронныхПисем_1_2_1_4() Экспорт @@ -2520,7 +2640,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Переносит данные из реквизита ОтветственныйЗаОбработкуПисем справочника УчетныеЗаписиЭлектроннойПочты в //реквизиты ОтветственныйЗаОбработкуПисем и ОтветственныйЗаВедениеПапок регистра сведений НастройкиУчетныхЗаписейЭлектроннойПочты // @@ -2554,7 +2674,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 2.1.3.22 +//Процедура обновления ИБ для версии БСП 2.1.3.22 //Переносит данные из реквизита ВключатьВПредставлениеИмяПользователя справочника УчетныеЗаписиЭлектроннойПочты в //реквизит ВключатьВПредставлениеИмяПользователя регистра сведений НастройкиУчетныхЗаписейЭлектроннойПочты // @@ -2588,7 +2708,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Переносит предмет взаимодействий из реквизита документа в регистр сведений ПредметыПапкиВзаимодействий // Процедура ОбновитьХранениеПредмета_1_2_1_4() Экспорт @@ -2642,7 +2762,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Преобразовывает начало описания документов "Встреча", "Телефонный звонок" и "Запланированное взаимодействие" в реквизит Тема. // Процедура ПреобразоватьОписаниеВТему_1_2_1_4() Экспорт @@ -2689,7 +2809,7 @@ КонецПроцедуры -//Процедура обновления на ИБ для версии БСП 1.2.1.4 +//Процедура обновления ИБ для версии БСП 1.2.1.4 //Определяет оценочный размер исходящих писем. // Процедура ЗаполнитьРазмерДляИсходящихЭлектронныхПисем_1_2_1_4() Экспорт @@ -2804,60 +2924,83 @@ //Параметры // ТекущийОбъект - ДокументОбъект - документ, в котором возникло событие // -Процедура ПриЗаписиВзаимодействияИзФормы(ТекущийОбъект,НовыйПредмет) Экспорт +Процедура ПриЗаписиВзаимодействияИзФормы(ТекущийОбъект,Форма) Экспорт Ссылка = ТекущийОбъект.Ссылка; - СтарыйПредмет = ПолучитьЗначениеПредмета(Ссылка); + СтарыеЗначенияРеквизитов = СтруктураРеквизитовВзаимодействия(Ссылка); - Если СтарыйПредмет = НовыйПредмет И ЗначениеЗаполнено(НовыйПредмет) Тогда - // Предмет не изменился, ничего изменять не надо + Если СтарыеЗначенияРеквизитов.Предмет = Форма.Предмет И ЗначениеЗаполнено(Форма.Предмет) + И СтарыеЗначенияРеквизитов.Рассмотрено = Форма.Рассмотрено + И СтарыеЗначенияРеквизитов.РассмотретьПосле = Форма.РассмотретьПосле Тогда Возврат; КонецЕсли; + РассчитыватьРассмотрено = НЕ (Форма.Объект.Ссылка.Пустая() И Форма.Рассмотрено); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи( + , Форма.Предмет, Форма.Рассмотрено, Форма.РассмотретьПосле, РассчитыватьРассмотрено); + //Если в качестве предмета устанавливается само взаимодействие то делать ничего не нужно. - Если НовыйПредмет = Ссылка Тогда - УстановитьПредмет(Ссылка, НовыйПредмет); + Если Форма.Предмет = Ссылка Тогда + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); + РассчитатьРассмотреноПоКонтактамПриЗаписиИзФормы(ТекущийОбъект, Форма, СтарыеЗначенияРеквизитов); Возврат; КонецЕсли; // Если в качестве нового предмета установлено взаимодействие, то надо проверить предмет у нового предмета - Если ЗначениеЗаполнено(НовыйПредмет) Тогда + Если ЗначениеЗаполнено(Форма.Предмет) Тогда - Если ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(НовыйПредмет) Тогда + Если ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(Форма.Предмет) Тогда - ПредметПредмета = ПолучитьЗначениеПредмета(НовыйПредмет); + ПредметПредмета = ПолучитьЗначениеПредмета(Форма.Предмет); Если Не ЗначениеЗаполнено(ПредметПредмета) Тогда // У предмета установим в качестве предмета ссылку на самого себя - УстановитьПредмет(НовыйПредмет, НовыйПредмет); - УстановитьПредмет(Ссылка, НовыйПредмет); + УстановитьПредмет(Форма.Предмет, Форма.Предмет); + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); Иначе - УстановитьПредмет(Ссылка, ПредметПредмета); - НовыйПредмет = ПредметПредмета; + СтруктураДляЗаписи.Предмет = ПредметПредмета; + Форма.Предмет = ПредметПредмета; + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); КонецЕсли; Иначе - УстановитьПредмет(Ссылка, НовыйПредмет); + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); КонецЕсли; Иначе - УстановитьПредмет(Ссылка, Ссылка); - НовыйПредмет = Ссылка; + СтруктураДляЗаписи.Предмет = Ссылка; + Форма.Предмет = Ссылка; + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, СтруктураДляЗаписи); КонецЕсли; // Если предыдущим предметом было взаимодействие, то возможно нужно поменять предмет у всей цепочки - Если ЗначениеЗаполнено(СтарыйПредмет) И ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(СтарыйПредмет) Тогда + Если ЗначениеЗаполнено(СтарыеЗначенияРеквизитов.Предмет) И ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(СтарыеЗначенияРеквизитов.Предмет) Тогда - Если НЕ (Ссылка <> СтарыйПредмет И (Не ЗначениеЗаполнено(НовыйПредмет) ИЛИ ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(НовыйПредмет))) Тогда - ВзаимодействияВызовСервера.ЗаменитьПредметВЦепочкеВзаимодействий(СтарыйПредмет, НовыйПредмет, Ссылка); + Если НЕ (Ссылка <> СтарыеЗначенияРеквизитов.Предмет И (Не ЗначениеЗаполнено(Форма.Предмет) ИЛИ ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(Форма.Предмет))) Тогда + ВзаимодействияВызовСервера.ЗаменитьПредметВЦепочкеВзаимодействий(СтарыеЗначенияРеквизитов.Предмет, Форма.Предмет, Ссылка); КонецЕсли; КонецЕсли; + РассчитатьРассмотреноПоКонтактамПриЗаписиИзФормы(ТекущийОбъект, Форма, СтарыеЗначенияРеквизитов); + +КонецПроцедуры + +Процедура РассчитатьРассмотреноПоКонтактамПриЗаписиИзФормы(ТекущийОбъект, Форма, СтарыеЗначенияРеквизитов) + + Если НеЗаписыватьКонтакты(ТекущийОбъект.ДополнительныеСвойства) + И СтарыеЗначенияРеквизитов.Рассмотрено <> Форма.Рассмотрено Тогда + + МассивВзаимодействий = Новый Массив; + МассивВзаимодействий.Добавить(ТекущийОбъект.Ссылка); + РассчитатьРассмотреноПоКонтактам(МассивВзаимодействий); + + КонецЕсли; + КонецПроцедуры //Обработчик события перед записью, возникающих в формах документов взаимодействий. @@ -2866,8 +3009,14 @@ // Форма - УправляемаяФорма - форма в которой произошло событие // ТекущийОбъект - ДокументОбъект - документ, в котором возникло событие // -Процедура ПередЗаписьюВзаимодействияИзФормы(Форма,ТекущийОбъект) Экспорт - +Процедура ПередЗаписьюВзаимодействияИзФормы(Форма,ТекущийОбъект, ИзменилисьКонтакты = Ложь) Экспорт + + Если НЕ ИзменилисьКонтакты Тогда + + ТекущийОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); + + КонецЕсли; + Если ТекущийОбъект.Ссылка.Пустая() Тогда ТекущийОбъект.ВзаимодействиеОснование = Форма.ВзаимодействиеОснование; КонецЕсли; @@ -3074,27 +3223,7 @@ ////////////////////////////////////////////////////////////////////////////////// // Работа с предметами взаимодействий -// Устанавливает активность предмета взаимодействий -// -// Параметры -// Предмет - ПроизвольнаяСсылка - ссылка на предмет у которого изменяется активность -// Устанавливать - Булево - если Истина, то активность будет установлена, если Ложь то снята -// -Процедура УстановитьАктивностьПредмета(Предмет,Устанавливать) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - МенеджерЗаписи = РегистрыСведений.АктивныеПредметыВзаимодействий.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Предмет = Предмет; - Если Устанавливать Тогда - МенеджерЗаписи.Записать(); - Иначе - МенеджерЗаписи.Удалить(); - КонецЕсли; - -КонецПроцедуры - -// Устанавливает предмет взаимодействий для электронного письма +// Устанавливает предмет для документа взаимодействия // // Параметры // Ссылка - ДокументСсылка.ЭлектронноеПисьмоВходящее, @@ -3104,65 +3233,10 @@ // ДокументСсылка.ТелефонныйЗвонок - взаимодействие для которого будет установлен предмет // Предмет - ПроизвольнаяСсылка - ссылка на устанавливаемый предмет // -Процедура УстановитьПредмет(Ссылка, Предмет) Экспорт +Процедура УстановитьПредмет(Ссылка, Предмет, РассчитыватьРассмотрено = Истина) Экспорт - УстановитьПредметПапкуВзаимодействия(Ссылка,,Предмет); - -КонецПроцедуры - -// Устанавливает папку и предмет для взаимодействий -// -// Параметры -// Ссылка - ДокументСсылка.ЭлектронноеПисьмоВходящее, -// ДокументСсылка.ЭлектронноеПисьмоИсходящее, -// ДокументСсылка.Встреча, -// ДокументСсылка.ЗапланированноеВзаимодействие, -// ДокументСсылка.ТелефонныйЗвонок - взаимодействие для которого будут установлены папка и предмет -// Папка - СправочникСсылка.ПапкиЭлектронныхПисем - устанавливаемая папка -// Предмет - ПроизвольнаяСсылка - ссылка на устанавливаемый предмет -// -Процедура УстановитьПредметПапкуВзаимодействия(Взаимодействие,Папка = Неопределено, Предмет = Неопределено) Экспорт - - Если Папка = Неопределено И Предмет = Неопределено Тогда - - Возврат; - - ИначеЕсли Папка = Неопределено ИЛИ Предмет = Неопределено Тогда - - Запрос = Новый Запрос; - Запрос.Текст = " - |ВЫБРАТЬ - | ПредметыПапкиВзаимодействий.Предмет, - | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма - |ИЗ - | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий - |ГДЕ - | ПредметыПапкиВзаимодействий.Взаимодействие = &Взаимодействие"; - - Запрос.УстановитьПараметр("Взаимодействие",Взаимодействие); - - Результат = Запрос.Выполнить(); - Если НЕ Результат.Пустой() Тогда - - Выборка = Результат.Выбрать(); - Выборка.Следующий(); - - Если Папка = Неопределено Тогда - Папка = Выборка.ПапкаЭлектронногоПисьма; - КонецЕсли; - - Если Предмет = Неопределено Тогда - Предмет = Выборка.Предмет; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - МенеджерЗаписи = РегистрыСведений.ПредметыПапкиВзаимодействий.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.Взаимодействие = Взаимодействие; - МенеджерЗаписи.Предмет = Предмет; - МенеджерЗаписи.ПапкаЭлектронногоПисьма = Папка; - МенеджерЗаписи.Записать(); + Реквизиты = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(, Предмет,,, РассчитыватьРассмотрено); + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, Реквизиты); КонецПроцедуры @@ -4150,7 +4224,6 @@ КонецПроцедуры - // Возвращает сохраненную настройку текущего пользователя Функция ПолучитьНастройку(КлючОбъекта, КлючНастроек = Неопределено, @@ -4378,6 +4451,10 @@ //Выполняет процедуру отправки сообщений SMS. Процедура ОтправкаSMS() Экспорт + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Возврат; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), @@ -4451,6 +4528,7 @@ ДокументОбъект = ВыборкаДокументы.Ссылка.ПолучитьОбъект(); ОтразитьРезультатыОтправкиSMSВДокументе(ДокументОбъект, РезультатОтправки); + ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ДокументОбъект.Записать(); КонецЦикла; @@ -4464,6 +4542,10 @@ //Выполняет процедуру обновления статусов доставки SMS. Процедура ОбновлениеСтатусовДоставкиSMS() Экспорт + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Возврат; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); ЗаписьЖурналаРегистрации(УправлениеЭлектроннойПочтой.СобытиеЖурналаРегистрации(), @@ -4526,7 +4608,7 @@ КонецЦикла; ДокументОбъект.Состояние = СостояниеДокументаСообщениеSMS(ДокументОбъект); - + ДокументОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ДокументОбъект.Записать(); КонецЦикла; @@ -4734,9 +4816,11 @@ Процедура УстановитьПапкуДляМассиваПисем(МассивПисем,Папка) Экспорт Запрос = Новый Запрос; - Запрос.Текст = "ВЫБРАТЬ + Запрос.Текст = " + |ВЫБРАТЬ | ЭлектронноеПисьмоВходящее.Ссылка, - | ЭлектронноеПисьмоВходящее.ПометкаУдаления + | ЭлектронноеПисьмоВходящее.ПометкаУдаления, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка |ИЗ | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий @@ -4749,7 +4833,8 @@ | |ВЫБРАТЬ | ЭлектронноеПисьмоИсходящее.Ссылка, - | ЭлектронноеПисьмоИсходящее.ПометкаУдаления + | ЭлектронноеПисьмоИсходящее.ПометкаУдаления, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма |ИЗ | Документ.ЭлектронноеПисьмоИсходящее КАК ЭлектронноеПисьмоИсходящее | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий @@ -4777,7 +4862,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(Выборка.Ссылка, Папка); + ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(Выборка.Ссылка, Папка, Ложь); Если ПеремещениеВПапкуУдаленные И НЕ Выборка.ПометкаУдаления Тогда ПисьмоОбъект = Выборка.Ссылка.ПолучитьОбъект(); ПисьмоОбъект.ДополнительныеСвойства.Вставить("ОбработаноИзменениеПометкиУдаления", Истина); @@ -4789,6 +4874,14 @@ КонецЕсли; КонецЦикла; + Выборка.Сбросить(); + ТаблицаДляРасчета = ТаблицаДанныхДляРасчетаРассмотрено(Выборка, "Папка"); + Если ТаблицаДляРасчета.Найти(Папка, "ПоЧемуРассчитывать") = Неопределено Тогда + НоваяСтрока = ТаблицаДляРасчета.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = Папка; + КонецЕсли; + РассчитатьРассмотреноПоПапкам(ТаблицаДляРасчета); + КонецПроцедуры // Устанавливает пометку удаления для папки и входящих в нее писем @@ -4821,7 +4914,7 @@ | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ - | ПапкиЭлектронныхПисем.Ссылка + | ПапкиЭлектронныхПисем.Ссылка КАК Папка |ИЗ | Справочник.ПапкиЭлектронныхПисем КАК ПапкиЭлектронныхПисем |ГДЕ @@ -4873,7 +4966,7 @@ Пока ВыборкаПисьма.Следующий() Цикл - ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(ВыборкаПисьма.Ссылка, ПапкаУдаленные); + ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(ВыборкаПисьма.Ссылка, ПапкаУдаленные, Ложь); Если НЕ ВыборкаПисьма.ПометкаУдаления Тогда ПисьмоОбъект = ВыборкаПисьма.Ссылка.ПолучитьОбъект(); @@ -4884,11 +4977,19 @@ Пока ВыборкаПапки.Следующий() Цикл - ПапкаОбъект = ВыборкаПапки.Ссылка.ПолучитьОбъект(); + ПапкаОбъект = ВыборкаПапки.Папка.ПолучитьОбъект(); ПапкаОбъект.УстановитьПометкуУдаления(Истина); КонецЦикла; + ВыборкаПапки.Сбросить(); + ТаблицаДляРасчета = ТаблицаДанныхДляРасчетаРассмотрено(ВыборкаПапки, "Папка"); + Если ТаблицаДляРасчета.Найти(ПапкаУдаленные, "ПоЧемуРассчитывать") = Неопределено Тогда + НоваяСтрока = ТаблицаДляРасчета.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = ПапкаУдаленные; + КонецЕсли; + РассчитатьРассмотреноПоПапкам(ТаблицаДляРасчета); + Исключение ОтменитьТранзакцию(); @@ -5184,10 +5285,28 @@ // Процедура УстановитьПапкиДляМассиваПисем(МассивПисем) Экспорт + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Взаимодействие В(&МассивПисем)"; + + Запрос.УстановитьПараметр("МассивПисем", МассивПисем); + + МассивПапокДляРасчета = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Папка"); + ТаблицаПапок = ОпределитьПапкиДляМассиваПисем(МассивПисем); Для каждого СтрокаТаблицы Из ТаблицаПапок Цикл - ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(СтрокаТаблицы.Письмо,СтрокаТаблицы.Папка); + ВзаимодействияВызовСервера.УстановитьПапкуЭлектронногоПисьма(СтрокаТаблицы.Письмо, СтрокаТаблицы.Папка, Ложь); + Если ЗначениеЗаполнено(СтрокаТаблицы.Папка) И МассивПапокДляРасчета.Найти(СтрокаТаблицы.Папка) = Неопределено Тогда + МассивПапокДляРасчета.Добавить(СтрокаТаблицы.Папка); + КонецЕсли; КонецЦикла; + + РассчитатьРассмотреноПоПапкам(ТаблицаДанныхДляРасчетаРассмотрено(МассивПапокДляРасчета, "Папка")); КонецПроцедуры @@ -5395,10 +5514,570 @@ КонецПроцедуры +/////////////////////////////////////////////////////////////////////////////////// +// Расчет состояний + +// Рассчитывает состояния предметов взаимодействий +// +// Параметры: +// ТаблицаПапок - ТаблицаЗначений, Неопределено - таблица папок, которые необходимо рассчитать. +// Если Неопределено, то рассчитываются состояния всех папок. +// +Процедура РассчитатьРассмотреноПоПапкам(ТаблицаПапок) Экспорт + + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; + + Если ТаблицаПапок = Неопределено Тогда + + РегистрыСведений.СостоянияПапокПисем.УдалитьЗаписьИзРегистра(Неопределено); + + Запрос.Текст = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК ПапкаЭлектронногоПисьма, + | СУММА(ВЫБОР + | КОГДА ПредметыПапкиВзаимодействий.Рассмотрено + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоНеРассмотрено + |ПОМЕСТИТЬ ИспользуемыеПапки + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма <> ЗНАЧЕНИЕ(Справочник.ПапкиЭлектронныхПисем.ПустаяСсылка) + | + |СГРУППИРОВАТЬ ПО + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма + | + |ИНДЕКСИРОВАТЬ ПО + | ПапкаЭлектронногоПисьма + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПапкиЭлектронныхПисем.Ссылка КАК Папка, + | ЕСТЬNULL(ИспользуемыеПапки.КоличествоНеРассмотрено, 0) КАК НеРассмотрено + |ИЗ + | Справочник.ПапкиЭлектронныхПисем КАК ПапкиЭлектронныхПисем + | ЛЕВОЕ СОЕДИНЕНИЕ ИспользуемыеПапки КАК ИспользуемыеПапки + | ПО (ИспользуемыеПапки.ПапкаЭлектронногоПисьма = ПапкиЭлектронныхПисем.Ссылка)"; + + Иначе + + Если ТаблицаПапок.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Запрос.Текст = " + |ВЫБРАТЬ + | ПапкиДляРасчета.ПоЧемуРассчитывать КАК Папка + |ПОМЕСТИТЬ ПапкиДляРасчета + |ИЗ + | &ПапкиДляРасчета КАК ПапкиДляРасчета + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СУММА(ВЫБОР + | КОГДА ПредметыПапкиВзаимодействий.Рассмотрено + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоНеРассмотрено, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка + |ПОМЕСТИТЬ РассчитанныеПапки + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма В + | (ВЫБРАТЬ + | ПапкиДляРасчета.Папка + | ИЗ + | ПапкиДляРасчета КАК ПапкиДляРасчета) + | + |СГРУППИРОВАТЬ ПО + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПапкиДляРасчета.Папка, + | ЕСТЬNULL(РассчитанныеПапки.КоличествоНеРассмотрено, 0) КАК НеРассмотрено + |ИЗ + | ПапкиДляРасчета КАК ПапкиДляРасчета + | ЛЕВОЕ СОЕДИНЕНИЕ РассчитанныеПапки КАК РассчитанныеПапки + | ПО ПапкиДляРасчета.Папка = РассчитанныеПапки.Папка"; + + Запрос.УстановитьПараметр("ПапкиДляРасчета", ТаблицаПапок); + + КонецЕсли; + + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + РегистрыСведений.СостоянияПапокПисем.ВыполнитьЗаписьВРегистр(Выборка.Папка, Выборка.НеРассмотрено); + + КонецЦикла; + +КонецПроцедуры + +// Рассчитывает состояния контактов взаимодействий +// +// Параметры: +// ТаблицаПредметов - ТаблицаЗначений, Неопределено - таблица контактов, которые необходимо рассчитать. +// Если Неопределено, то рассчитываются состояния всех контактов. +// +Процедура РассчитатьРассмотреноПоКонтактам(ДанныеДляРасчета) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если ДанныеДляРасчета = Неопределено Тогда + + РегистрыСведений.СостоянияКонтактовВзаимодействий.УдалитьЗаписьИзРегистра(Неопределено); + + Пока Истина Цикл + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100 + | КонтактыВзаимодействий.Контакт + |ПОМЕСТИТЬ КонтактыДляРасчета + |ИЗ + | РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияКонтактовВзаимодействий КАК СостоянияКонтактовВзаимодействий + | ПО КонтактыВзаимодействий.Контакт = СостоянияКонтактовВзаимодействий.Контакт + |ГДЕ + | СостоянияКонтактовВзаимодействий.Контакт ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | КонтактыВзаимодействий.Контакт, + | МАКСИМУМ(Взаимодействия.Дата) КАК ДатаПоследнегоВзаимодействия, + | СУММА(ВЫБОР + | КОГДА ПредметыПапкиВзаимодействий.Рассмотрено + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоНеРассмотрено + |ИЗ + | КонтактыДляРасчета КАК КонтактыДляРасчета + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ПО КонтактыВзаимодействий.Взаимодействие = Взаимодействия.Ссылка + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ПО КонтактыВзаимодействий.Взаимодействие = ПредметыПапкиВзаимодействий.Взаимодействие + | ПО КонтактыДляРасчета.Контакт = КонтактыВзаимодействий.Контакт + | + |СГРУППИРОВАТЬ ПО + | КонтактыВзаимодействий.Контакт"; + + Результат = Запрос.Выполнить(); + Если Результат.Пустой() Тогда + Возврат; + КонецЕсли; + + Выборка = Результат.Выбрать(); + Пока Выборка.Следующий() Цикл + + РегистрыСведений.СостоянияКонтактовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Контакт, + Выборка.КоличествоНеРассмотрено, + Выборка.ДатаПоследнегоВзаимодействия); + КонецЦикла; + + КонецЦикла; + + Иначе + + Запрос = Новый Запрос; + + Если ТипЗнч(ДанныеДляРасчета) = Тип("ТаблицаЗначений") Тогда + + ТекстКонтактыДляРасчета = + "ВЫБРАТЬ + | КонтактыДляРасчета.ПоЧемуРассчитывать КАК Контакт + |ПОМЕСТИТЬ КонтактыДляРасчета + |ИЗ + | &КонтактыДляРасчета КАК КонтактыДляРасчета + | + |ИНДЕКСИРОВАТЬ ПО + | Контакт + |; + | + |////////////////////////////////////////////////////////////////////////////////"; + + Запрос.УстановитьПараметр("КонтактыДляРасчета", ДанныеДляРасчета); + + ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("ВыборкаИзРезультатаЗапроса") Тогда + + МассивВзаимодействий = Новый Массив; + Пока ДанныеДляРасчета.Следующий() Цикл + МассивВзаимодействий.Добавить(ДанныеДляРасчета.Взаимодействие); + КонецЦикла; + + ТекстКонтактыДляРасчета = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | КонтактыВзаимодействий.Контакт + |ПОМЕСТИТЬ КонтактыДляРасчета + |ИЗ + | РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + |ГДЕ + | КонтактыВзаимодействий.Взаимодействие В(&МассивВзаимодействий) + | + |ИНДЕКСИРОВАТЬ ПО + | Контакт + |; + | + |////////////////////////////////////////////////////////////////////////////////"; + + Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий); + + ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("Массив") Тогда + + ТекстКонтактыДляРасчета = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | КонтактыВзаимодействий.Контакт + |ПОМЕСТИТЬ КонтактыДляРасчета + |ИЗ + | РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + |ГДЕ + | КонтактыВзаимодействий.Взаимодействие В(&МассивВзаимодействий) + | + |ИНДЕКСИРОВАТЬ ПО + | Контакт + |; + | + |////////////////////////////////////////////////////////////////////////////////"; + + Запрос.УстановитьПараметр("МассивВзаимодействий", ДанныеДляРасчета); + + Иначе + + Возврат; + + КонецЕсли; + + Запрос.Текст = ТекстКонтактыДляРасчета + + " + |ВЫБРАТЬ + | ВложенныйЗапрос.Контакт, + | МАКСИМУМ(ВложенныйЗапрос.ДатаПоследнегоВзаимодействия) КАК ДатаПоследнегоВзаимодействия, + | СУММА(ВложенныйЗапрос.КоличествоНеРассмотрено) КАК КоличествоНеРассмотрено + |ИЗ + | (ВЫБРАТЬ РАЗЛИЧНЫЕ + | КонтактыВзаимодействий.Контакт КАК Контакт, + | Взаимодействия.Ссылка КАК Ссылка, + | ЕСТЬNULL(Взаимодействия.Дата, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоВзаимодействия, + | ВЫБОР + | КОГДА ЕСТЬNULL(ПредметыПапкиВзаимодействий.Рассмотрено, ЛОЖЬ) + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ КАК КоличествоНеРассмотрено + | ИЗ + | КонтактыДляРасчета КАК КонтактыДляРасчета + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ПО КонтактыВзаимодействий.Взаимодействие = Взаимодействия.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ПО КонтактыВзаимодействий.Взаимодействие = ПредметыПапкиВзаимодействий.Взаимодействие + | ПО КонтактыДляРасчета.Контакт = КонтактыВзаимодействий.Контакт) КАК ВложенныйЗапрос + | + |СГРУППИРОВАТЬ ПО + | ВложенныйЗапрос.Контакт"; + + Результат = Запрос.Выполнить(); + Выборка = Результат.Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если Выборка.ДатаПоследнегоВзаимодействия = Дата(1, 1, 1) Тогда + РегистрыСведений.СостоянияКонтактовВзаимодействий.УдалитьЗаписьИзРегистра(Выборка.Контакт); + Иначе + РегистрыСведений.СостоянияКонтактовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Контакт, + Выборка.КоличествоНеРассмотрено, + Выборка.ДатаПоследнегоВзаимодействия); + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +// Рассчитывает состояния предметов взаимодействий +// +// Параметры: +// ТаблицаПредметов - ТаблицаЗначений, Неопределено - таблица предметов, которые необходимо рассчитать. +// Если Неопределено, то рассчитываются состояния всех предметов. +// +Процедура РассчитатьРассмотреноПоПредметам(ТаблицаПредметов) Экспорт + + УстановитьПривилегированныйРежим(Истина); + Запрос = Новый Запрос; + + Если ТаблицаПредметов = Неопределено Тогда + + РегистрыСведений.СостоянияПредметовВзаимодействий.УдалитьЗаписьИзРегистра(Неопределено); + + Запрос.Текст = " + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Предмет, + | СУММА(ВЫБОР + | КОГДА ПредметыПапкиВзаимодействий.Рассмотрено + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоНеРассмотрено, + | МАКСИМУМ(Взаимодействия.Дата) КАК ДатаПоследнегоВзаимодействия, + | МАКСИМУМ(ЕСТЬNULL(СостоянияПредметовВзаимодействий.Активен, ЛОЖЬ)) КАК Активен + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ПО ПредметыПапкиВзаимодействий.Взаимодействие = Взаимодействия.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПредметовВзаимодействий КАК СостоянияПредметовВзаимодействий + | ПО ПредметыПапкиВзаимодействий.Предмет = СостоянияПредметовВзаимодействий.Предмет + | + |СГРУППИРОВАТЬ ПО + | ПредметыПапкиВзаимодействий.Предмет"; + + Иначе + + Если ТаблицаПредметов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Запрос.Текст = + "ВЫБРАТЬ + | ПредметыДляРасчета.ПоЧемуРассчитывать КАК Предмет + |ПОМЕСТИТЬ ПредметыДляРасчета + |ИЗ + | &ПредметыДляРасчета КАК ПредметыДляРасчета + | + |ИНДЕКСИРОВАТЬ ПО + | Предмет + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Предмет КАК Предмет, + | СУММА(ВЫБОР + | КОГДА ПредметыПапкиВзаимодействий.Рассмотрено + | ТОГДА 0 + | ИНАЧЕ 1 + | КОНЕЦ) КАК КоличествоНеРассмотрено, + | МАКСИМУМ(Взаимодействия.Дата) КАК ДатаПоследнегоВзаимодействия, + | МАКСИМУМ(ЕСТЬNULL(СостоянияПредметовВзаимодействий.Активен, ЛОЖЬ)) КАК Активен + |ПОМЕСТИТЬ РассчитанныеПредметы + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + | ЛЕВОЕ СОЕДИНЕНИЕ ЖурналДокументов.Взаимодействия КАК Взаимодействия + | ПО ПредметыПапкиВзаимодействий.Взаимодействие = Взаимодействия.Ссылка + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПредметовВзаимодействий КАК СостоянияПредметовВзаимодействий + | ПО ПредметыПапкиВзаимодействий.Предмет = СостоянияПредметовВзаимодействий.Предмет + |ГДЕ + | ПредметыПапкиВзаимодействий.Предмет В + | (ВЫБРАТЬ + | ПредметыДляРасчета.Предмет + | ИЗ + | ПредметыДляРасчета) + | + |СГРУППИРОВАТЬ ПО + | ПредметыПапкиВзаимодействий.Предмет + | + |ИНДЕКСИРОВАТЬ ПО + | Предмет + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПредметыДляРасчета.Предмет, + | ЕСТЬNULL(РассчитанныеПредметы.КоличествоНеРассмотрено, 0) КАК КоличествоНеРассмотрено, + | ЕСТЬNULL(РассчитанныеПредметы.ДатаПоследнегоВзаимодействия, ДАТАВРЕМЯ(1, 1, 1)) КАК ДатаПоследнегоВзаимодействия, + | ВЫБОР + | КОГДА РассчитанныеПредметы.Активен ЕСТЬ NULL + | ТОГДА ЕСТЬNULL(СостоянияПредметовВзаимодействий.Активен, ЛОЖЬ) + | ИНАЧЕ РассчитанныеПредметы.Активен + | КОНЕЦ КАК Активен + |ИЗ + | ПредметыДляРасчета КАК ПредметыДляРасчета + | ЛЕВОЕ СОЕДИНЕНИЕ РассчитанныеПредметы КАК РассчитанныеПредметы + | ПО ПредметыДляРасчета.Предмет = РассчитанныеПредметы.Предмет + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СостоянияПредметовВзаимодействий КАК СостоянияПредметовВзаимодействий + | ПО ПредметыДляРасчета.Предмет = СостоянияПредметовВзаимодействий.Предмет"; + + Запрос.УстановитьПараметр("ПредметыДляРасчета", ТаблицаПредметов); + + КонецЕсли; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Если Выборка.ДатаПоследнегоВзаимодействия <> Дата(1,1,1) ИЛИ Выборка.Активен = Истина Тогда + РегистрыСведений.СостоянияПредметовВзаимодействий.ВыполнитьЗаписьВРегистр(Выборка.Предмет, + Выборка.КоличествоНеРассмотрено, + Выборка.ДатаПоследнегоВзаимодействия, + Выборка.Активен); + Иначе + + РегистрыСведений.СостоянияПредметовВзаимодействий.УдалитьЗаписьИзРегистра(Выборка.Предмет); + + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Формирует таблицу данных для расчета состояний папок и предметов взаимодействий +// +// Параметры: +// ДанныеДляРасчета - Структура, ВыборкаИзРезультатовЗапроса, Массив - данные, на основании +// которых будет формироваться таблица +// ИмяРеквизита - Строка - может принимать значения "Предмет" или "Папка". +// +// Возвращаемое значение: +// ТаблицаЗначений - подготовленная для расчета таблица. +// +Функция ТаблицаДанныхДляРасчетаРассмотрено(ДанныеДляРасчета, ИмяРеквизита) Экспорт + + СформированнаяТаблица = Новый ТаблицаЗначений; + Если ИмяРеквизита = "Папка" Тогда + ОписаниеТиповКолонки = Новый ОписаниеТипов("СправочникСсылка.ПапкиЭлектронныхПисем"); + ИначеЕсли ИмяРеквизита = "Предмет" Тогда + ОписаниеТиповКолонки = Новый ОписаниеТипов(Новый ОписаниеТипов(Метаданные.РегистрыСведений.СостоянияПредметовВзаимодействий.Измерения.Предмет.Тип.Типы())); + ИначеЕсли ИмяРеквизита = "Контакт" Тогда + ОписаниеТиповКолонки = Новый ОписаниеТипов(Новый ОписаниеТипов(Метаданные.РегистрыСведений.КонтактыВзаимодействий.Измерения.Контакт.Тип.Типы())); + КонецЕсли; + + СформированнаяТаблица.Колонки.Добавить("ПоЧемуРассчитывать", ОписаниеТиповКолонки); + + Если ТипЗнч(ДанныеДляРасчета) = Тип("Структура") Тогда + + НоваяЗапись = ДанныеДляРасчета.НоваяЗапись; + СтараяЗапись = ДанныеДляРасчета.СтараяЗапись; + + Если ЗначениеЗаполнено(НоваяЗапись[ИмяРеквизита]) Тогда + НоваяСтрока = СформированнаяТаблица.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = НоваяЗапись[ИмяРеквизита]; + КонецЕсли; + + Если ЗначениеЗаполнено(СтараяЗапись[ИмяРеквизита]) И НоваяЗапись[ИмяРеквизита] <> СтараяЗапись[ИмяРеквизита] Тогда + + НоваяСтрока = СформированнаяТаблица.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = СтараяЗапись[ИмяРеквизита]; + + КонецЕсли; + + ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("ВыборкаИзРезультатаЗапроса") Тогда + + Пока ДанныеДляРасчета.Следующий() Цикл + Если ЗначениеЗаполнено(ДанныеДляРасчета[ИмяРеквизита]) И СформированнаяТаблица.Найти(ДанныеДляРасчета[ИмяРеквизита], "ПоЧемуРассчитывать") = Неопределено Тогда + НоваяСтрока = СформированнаяТаблица.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = ДанныеДляРасчета[ИмяРеквизита]; + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипЗнч(ДанныеДляРасчета) = Тип("Массив") Тогда + + Для Каждого ЭлементМассива Из ДанныеДляРасчета Цикл + Если ЗначениеЗаполнено(ЭлементМассива) И СформированнаяТаблица.Найти(ЭлементМассива, "ПоЧемуРассчитывать") = Неопределено Тогда + НоваяСтрока = СформированнаяТаблица.Добавить(); + НоваяСтрока.ПоЧемуРассчитывать = ЭлементМассива; + КонецЕсли; + КонецЦикла; + + КонецЕсли; + + Возврат СформированнаяТаблица; + +КонецФункции + +// Определяет необходимость расчета состояний папок, предметов или контактов взаимодействий. +// +// Параметры: +// ДополнительныеСвойства - Структура - дополнительные свойства набора записей или документа взаимодействий. +// +// Возвращаемое значение: +// Булево - признак необходимости расчета состояний папок, предметов или контактов взаимодействий" +// +Функция РассчитыватьРассмотрено(ДополнительныеСвойства) Экспорт + Перем РассчитыватьРассмотрено; + + Возврат ДополнительныеСвойства.Свойство("РассчитыватьРассмотрено", РассчитыватьРассмотрено) + И РассчитыватьРассмотрено; + +КонецФункции + +// Определяет необходимость записи контактов взаимодействий во вспомогательный регистр +// "Контакты взаимодействий" +// +// Параметры: +// ДополнительныеСвойства - Структура - дополнительные свойства документа взаимодействий +// +// Возвращаемое значение: +// Булево - признак необходимости записи контактов взаимодействий во вспомогательный регистр +// "Контакты взаимодействий" +// +Функция НеЗаписыватьКонтакты(ДополнительныеСвойства) Экспорт + Перем НеЗаписыватьКонтакты; + + Возврат ДополнительныеСвойства.Свойство("НеЗаписыватьКонтакты", НеЗаписыватьКонтакты) + И НеЗаписыватьКонтакты; + +КонецФункции + +// Устанавливает признак рассмотрения для массива взаимодействий +// +// Параметры: +// МассивВзаимодействий - Массив - массив, для которого устанавливается признак. +// ЗначениеПризнака - Булево - значение признака Рассмотрено. +// ЕстьИзменения - Булево - признак того, что хотя бы у одного взаимодействия было изменено значение Рассмотрено. +// +Процедура УстановитьПризнакРассмотрено(МассивВзаимодействий, ЗначениеПризнака, ЕстьИзменения) Экспорт + + Если МассивВзаимодействий.Количество() > 0 Тогда + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Взаимодействие, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма КАК Папка, + | ПредметыПапкиВзаимодействий.Предмет + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Рассмотрено <> &ЗначениеПризнака + | И ПредметыПапкиВзаимодействий.Взаимодействие В(&МассивВзаимодействий)"; + + Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий); + Запрос.УстановитьПараметр("ЗначениеПризнака", ЗначениеПризнака); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + Реквизиты = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(,,ЗначениеПризнака,,ЛОЖЬ); + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Выборка.Взаимодействие, Реквизиты); + ЕстьИзменения = Истина; + + КонецЦикла; + + Выборка.Сбросить(); + РассчитатьРассмотреноПоПапкам(ТаблицаДанныхДляРасчетаРассмотрено(Выборка, "Папка")); + + Выборка.Сбросить(); + РассчитатьРассмотреноПоПредметам(ТаблицаДанныхДляРасчетаРассмотрено(Выборка, "Предмет")); + + Выборка.Сбросить(); + РассчитатьРассмотреноПоКонтактам(Выборка); + + КонецЕсли; + +КонецПроцедуры + /////////////////////////////////////////////////////////////////////////////////// // Прочее -// Получает в привилегированном режиме значение константы "Адрес публикации информационной базы в интернете" +// Получает в привелигированном режиме значение константы "Адрес публикации информационной базы в интернете" // // Возвращаемое значение: // Строка - значение константы @@ -5437,3 +6116,510 @@ КонецЦикла; КонецПроцедуры + +// Формирует текст запроса динамического списка взаимодействий в зависимости от вида панели навигации +// и типа переданного параметра. +// +// Параметры: +// ЗначениеОтбора - СправочникСсылка, ДокументСсылка - значение отбора панели навигации. +// +// Возвращаемое значение: +// Строка - текст запроса динамического списка. +// +Функция ТекстЗапросаСпискаВзаимодействий(ЗначениеОтбора = Неопределено) Экспорт + + ТекстЗапроса =" + |ВЫБРАТЬ + | ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.Встреча + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 10 + | ИНАЧЕ 0 + | КОНЕЦ + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.ЗапланированноеВзаимодействие + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 11 + | ИНАЧЕ 1 + | КОНЕЦ + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.ТелефонныйЗвонок + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 12 + | ИНАЧЕ 2 + | КОНЕЦ + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.ЭлектронноеПисьмоВходящее + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 13 + | ИНАЧЕ 3 + | КОНЕЦ + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.ЭлектронноеПисьмоИсходящее + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 14 + | ИНАЧЕ ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Черновик) + | ТОГДА 15 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СтатусыИсходящегоЭлектронногоПисьма.Исходящее) + | ТОГДА 16 + | ИНАЧЕ 4 + | КОНЕЦ + | КОНЕЦ + | КОГДА ЖурналДокументовВзаимодействия.Ссылка ССЫЛКА Документ.СообщениеSMS + | ТОГДА ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.ПометкаУдаления + | ТОГДА 22 + | ИНАЧЕ ВЫБОР + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.Черновик) + | ТОГДА 17 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.Исходящее) + | ТОГДА 18 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.Доставляется) + | ТОГДА 19 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.ЧастичноДоставлено) + | ТОГДА 21 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.НеДоставлено) + | ТОГДА 23 + | КОГДА ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма = ЗНАЧЕНИЕ(Перечисление.СостоянияДокументаСообщениеSMS.Доставлено) + | ТОГДА 24 + | ИНАЧЕ 17 + | КОНЕЦ + | КОНЕЦ + | КОНЕЦ КАК НомерКартинки, + | ЖурналДокументовВзаимодействия.Ссылка, + | ЖурналДокументовВзаимодействия.Дата, + | ЖурналДокументовВзаимодействия.ПометкаУдаления, + | ЖурналДокументовВзаимодействия.Номер, + | ЖурналДокументовВзаимодействия.Проведен, + | ЖурналДокументовВзаимодействия.Автор, + | ЖурналДокументовВзаимодействия.Входящий, + | ЖурналДокументовВзаимодействия.Тема, + | ЖурналДокументовВзаимодействия.Ответственный КАК Ответственный, + | ЕСТЬNULL(ПредметыВзаимодействий.Рассмотрено, ЛОЖЬ) КАК Рассмотрено, + | ЕСТЬNULL(ПредметыВзаимодействий.РассмотретьПосле, ДАТАВРЕМЯ(1, 1, 1)) КАК РассмотретьПосле, + | ЖурналДокументовВзаимодействия.Участники, + | ЖурналДокументовВзаимодействия.Тип, + | ЖурналДокументовВзаимодействия.УчетнаяЗапись, + | %Предмет% КАК Предмет, + | ТИПЗНАЧЕНИЯ(ПредметыВзаимодействий.Предмет) КАК ТипПредмета, + | ЕСТЬNULL(ПредметыВзаимодействий.ПапкаЭлектронногоПисьма, ЗНАЧЕНИЕ(Справочник.ПапкиЭлектронныхПисем.ПустаяСсылка)) КАК Папка, + | ЖурналДокументовВзаимодействия.Размер, + | ЖурналДокументовВзаимодействия.СтатусИсходящегоПисьма + |ИЗ + | ЖурналДокументов.Взаимодействия КАК ЖурналДокументовВзаимодействия + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыВзаимодействий + | ПО ЖурналДокументовВзаимодействия.Ссылка = ПредметыВзаимодействий.Взаимодействие + | %ТекстСоединенияТаблицаКонтактов% + |{ГДЕ + | ЖурналДокументовВзаимодействия.Ссылка КАК Поиск + | %ОтборКонтакт%}"; + + Если ЗначениеОтбора = Неопределено Тогда + ТекстПредмет = "ЕСТЬNULL(ПредметыВзаимодействий.Предмет, НЕОПРЕДЕЛЕНО)"; + ТекстОтборКонтакт = ""; + ТекстСоединениеТаблицаКонтактов = ""; + ИначеЕсли ВзаимодействияКлиентСервер.ЯвляетсяПредметом(ЗначениеОтбора) ИЛИ ВзаимодействияКлиентСервер.ЯвляетсяВзаимодействием(ЗначениеОтбора) Тогда + ТекстПредмет = "ЕСТЬNULL(ВЫРАЗИТЬ(ПредметыВзаимодействий.Предмет КАК " + ЗначениеОтбора.Метаданные().ПолноеИмя() + "), НЕОПРЕДЕЛЕНО)"; + ТекстОтборКонтакт = ""; + ТекстСоединениеТаблицаКонтактов = ""; + Иначе + ТекстПредмет = "ЕСТЬNULL(ПредметыВзаимодействий.Предмет, НЕОПРЕДЕЛЕНО)"; + ТекстРазличные = ""; + ТекстОтборКонтакт = ", + |КонтактыВзаимодействий.Контакт"; + ТекстСоединениеТаблицаКонтактов = "{ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + |ПО ЖурналДокументовВзаимодействия.Ссылка = КонтактыВзаимодействий.Взаимодействие}"; + КонецЕсли; + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%Предмет%", ТекстПредмет); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%РАЗЛИЧНЫЕ%", ТекстРазличные); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ОтборКонтакт%", ТекстОтборКонтакт); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ТекстСоединенияТаблицаКонтактов%", ТекстСоединениеТаблицаКонтактов); + + Возврат ТекстЗапроса; + +КонецФункции + +// Заполняет данные регистра сведений КонтактыВзаимодействий для переданного массива взаимодействий +// +// Параметры: +// МассивВзаимодействий - Массив - массив для которого будут заполнены данные о контактах. +// РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний контактов взаимодействий. +// +Процедура ПриЗаписиДокумента(ДокументОбъект) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Если НеЗаписыватьКонтакты(ДокументОбъект.ДополнительныеСвойства) Тогда + Возврат; + КонецЕсли; + + НаборЗаписей = РегистрыСведений.КонтактыВзаимодействий.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Взаимодействие.Установить(ДокументОбъект.Ссылка); + + Таблица = Новый ТаблицаЗначений; + ОписаниеТиповКонтактов = Новый ОписаниеТипов(ВзаимодействияКлиентСервер.ПолучитьМассивВозможныхТиповКонтактов()); + Таблица.Колонки.Добавить("Контакт", ОписаниеТиповКонтактов); + Таблица.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная))); + + Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.Встреча") Тогда + + Для Каждого Участник ИЗ ДокументОбъект.Участники Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Участник.Контакт; + НоваяСтрока.Представление = Участник.ПредставлениеКонтакта; + + КонецЦикла; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗапланированноеВзаимодействие") Тогда + + Для Каждого Участник ИЗ ДокументОбъект.Участники Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Участник.Контакт; + НоваяСтрока.Представление = Участник.ПредставлениеКонтакта; + + КонецЦикла; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ТелефонныйЗвонок") Тогда + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = ДокументОбъект.АбонентКонтакт; + НоваяСтрока.Представление = ДокументОбъект.АбонентПредставление; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.СообщениеSMS") Тогда + + Для Каждого Абонент ИЗ ДокументОбъект.Адресаты Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Абонент.Контакт; + НоваяСтрока.Представление = Абонент.ПредставлениеКонтакта; + + КонецЦикла; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЭлектронноеПисьмоВходящее") Тогда + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = ДокументОбъект.ОтправительКонтакт; + НоваяСтрока.Представление = ДокументОбъект.ОтправительПредставление; + + ИначеЕсли ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЭлектронноеПисьмоИсходящее") Тогда + + Для Каждого Адресат ИЗ ДокументОбъект.ПолучателиПисьма Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Адресат.Контакт; + НоваяСтрока.Представление = Адресат.Представление; + + КонецЦикла; + + Для Каждого Адресат ИЗ ДокументОбъект.ПолучателиКопий Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Адресат.Контакт; + НоваяСтрока.Представление = Адресат.Представление; + + КонецЦикла; + + Для Каждого Адресат ИЗ ДокументОбъект.ПолучателиСкрытыхКопий Цикл + + НоваяСтрока = Таблица.Добавить(); + НоваяСтрока.Контакт = Адресат.Контакт; + НоваяСтрока.Представление = Адресат.Представление; + + КонецЦикла; + + КонецЕсли; + + Для Каждого СтрокаТаблицы Из Таблица Цикл + Если НЕ ЗначениеЗаполнено(СтрокаТаблицы.Контакт) Тогда + СтрокаТаблицы.Контакт = Справочники.Пользователи.ПустаяСсылка(); + КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТаблицаКонтактов.Контакт, + | ТаблицаКонтактов.Представление + |ПОМЕСТИТЬ ТаблицаКонтактов + |ИЗ + | &ТаблицаКонтактов КАК ТаблицаКонтактов + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВЫБОР + | КОГДА ТаблицаКонтактов.Контакт = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) + | ТОГДА ЕСТЬNULL(СтроковыеКонтактыВзаимодействий.Ссылка, НЕОПРЕДЕЛЕНО) + | ИНАЧЕ ТаблицаКонтактов.Контакт + | КОНЕЦ КАК Контакт, + | ТаблицаКонтактов.Представление + |ИЗ + | ТаблицаКонтактов КАК ТаблицаКонтактов + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтроковыеКонтактыВзаимодействий КАК СтроковыеКонтактыВзаимодействий + | ПО ТаблицаКонтактов.Представление = СтроковыеКонтактыВзаимодействий.Наименование + | И (НЕ СтроковыеКонтактыВзаимодействий.ПометкаУдаления)"; + + Запрос.УстановитьПараметр("ТаблицаКонтактов", Таблица); + + Таблица = Запрос.Выполнить().Выгрузить(); + + Для Каждого СтрокаТаблицы Из Таблица Цикл + Если СтрокаТаблицы.Контакт = Неопределено Тогда + СтроковыйКонтактВзаимодействий = Справочники.СтроковыеКонтактыВзаимодействий.СоздатьЭлемент(); + СтроковыйКонтактВзаимодействий.Наименование = СтрокаТаблицы.Представление; + СтроковыйКонтактВзаимодействий.Записать(); + СтрокаТаблицы.Контакт = СтроковыйКонтактВзаимодействий.Ссылка; + КонецЕсли; + КонецЦикла; + + Таблица.Колонки.Добавить("Взаимодействие"); + Таблица.ЗаполнитьЗначения(ДокументОбъект.Ссылка, "Взаимодействие"); + НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", Истина); + НаборЗаписей.Загрузить(Таблица); + + НаборЗаписей.Записать(); + +КонецПроцедуры + +// Заполняет данные регистра сведений КонтактыВзаимодействий для переданного массива взаимодействий +// +// Параметры: +// МассивВзаимодействий - Массив - массив для которого будут заполнены данные о контактах. +// РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний контактов взаимодействий. +// +Процедура ЗаполнитьКонтактыМассиваВзаимодействий(МассивВзаимодействий, РассчитыватьРассмотрено = Ложь) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ВстречаУчастники.Ссылка КАК Взаимодействие, + | ВстречаУчастники.Контакт, + | ВстречаУчастники.ПредставлениеКонтакта КАК ПредставлениеКонтакта + |ПОМЕСТИТЬ ИнформацияОКонтактах + |ИЗ + | Документ.Встреча.Участники КАК ВстречаУчастники + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО ВстречаУчастники.Ссылка = КонтактыВзаимодействий.Взаимодействие + |ГДЕ + | ВстречаУчастники.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗапланированноеВзаимодействиеУчастники.Ссылка, + | ЗапланированноеВзаимодействиеУчастники.Контакт, + | ЗапланированноеВзаимодействиеУчастники.ПредставлениеКонтакта + |ИЗ + | Документ.ЗапланированноеВзаимодействие.Участники КАК ЗапланированноеВзаимодействиеУчастники + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО ЗапланированноеВзаимодействиеУчастники.Ссылка = КонтактыВзаимодействий.Взаимодействие + |ГДЕ + | ЗапланированноеВзаимодействиеУчастники.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ТелефонныйЗвонок.Ссылка, + | ТелефонныйЗвонок.АбонентКонтакт, + | ТелефонныйЗвонок.АбонентПредставление + |ИЗ + | Документ.ТелефонныйЗвонок КАК ТелефонныйЗвонок + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО (КонтактыВзаимодействий.Взаимодействие = ТелефонныйЗвонок.Ссылка) + |ГДЕ + | ТелефонныйЗвонок.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | СообщениеSMSАдресаты.Ссылка, + | СообщениеSMSАдресаты.Контакт, + | СообщениеSMSАдресаты.ПредставлениеКонтакта + |ИЗ + | Документ.СообщениеSMS.Адресаты КАК СообщениеSMSАдресаты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО СообщениеSMSАдресаты.Ссылка = КонтактыВзаимодействий.Взаимодействие + |ГДЕ + | СообщениеSMSАдресаты.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЭлектронноеПисьмоВходящее.Ссылка, + | ЭлектронноеПисьмоВходящее.ОтправительКонтакт, + | ЭлектронноеПисьмоВходящее.ОтправительПредставление + |ИЗ + | Документ.ЭлектронноеПисьмоВходящее КАК ЭлектронноеПисьмоВходящее + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО (КонтактыВзаимодействий.Взаимодействие = ЭлектронноеПисьмоВходящее.Ссылка) + |ГДЕ + | ЭлектронноеПисьмоВходящее.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Ссылка, + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Контакт, + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиПисьма КАК ЭлектронноеПисьмоИсходящееПолучателиПисьма, + | РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиПисьма.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Ссылка, + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Контакт, + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиКопий КАК ЭлектронноеПисьмоИсходящееПолучателиКопий + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиКопий.Ссылка В + | (&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Ссылка, + | ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Контакт, + | ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Представление + |ИЗ + | Документ.ЭлектронноеПисьмоИсходящее.ПолучателиСкрытыхКопий КАК ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактыВзаимодействий КАК КонтактыВзаимодействий + | ПО ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Ссылка = КонтактыВзаимодействий.Взаимодействие + |ГДЕ + | ЭлектронноеПисьмоИсходящееПолучателиСкрытыхКопий.Ссылка В + | (&МассивВзаимодействий) + | + |ИНДЕКСИРОВАТЬ ПО + | ПредставлениеКонтакта + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ИнформацияОКонтактах.Взаимодействие КАК Взаимодействие, + | ВЫБОР + | КОГДА ИнформацияОКонтактах.Контакт = НЕОПРЕДЕЛЕНО + | ТОГДА ЕСТЬNULL(СтроковыеКонтактыВзаимодействий.Ссылка, НЕОПРЕДЕЛЕНО) + | ИНАЧЕ ИнформацияОКонтактах.Контакт + | КОНЕЦ КАК Контакт, + | ИнформацияОКонтактах.ПредставлениеКонтакта + |ИЗ + | ИнформацияОКонтактах КАК ИнформацияОКонтактах + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтроковыеКонтактыВзаимодействий КАК СтроковыеКонтактыВзаимодействий + | ПО ИнформацияОКонтактах.ПредставлениеКонтакта = СтроковыеКонтактыВзаимодействий.Наименование + |ИТОГИ ПО + | Взаимодействие"; + + Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий); + + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат; + КонецЕсли; + + ВыборкаВзаимодействие = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаВзаимодействие.Следующий() Цикл + ВыборкаДетали = ВыборкаВзаимодействие.Выбрать(); + + НаборЗаписей = РегистрыСведений.КонтактыВзаимодействий.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Взаимодействие.Установить(ВыборкаВзаимодействие.Взаимодействие); + + Пока ВыборкаДетали.Следующий() Цикл + + НоваяЗапись = НаборЗаписей.Добавить(); + НоваяЗапись.Взаимодействие = ВыборкаВзаимодействие.Взаимодействие; + Если ВыборкаДетали.Контакт <> Неопределено Тогда + НоваяЗапись.Контакт = ВыборкаДетали.Контакт; + Иначе + СтроковыйКонтактВзаимодействий = Справочники.СтроковыеКонтактыВзаимодействий.СоздатьЭлемент(); + СтроковыйКонтактВзаимодействий.Наименование = ВыборкаДетали.ПредставлениеКонтакта; + СтроковыйКонтактВзаимодействий.Записать(); + НоваяЗапись.Контакт = СтроковыйКонтактВзаимодействий.Ссылка; + КонецЕсли; + + КонецЦикла; + + Если РассчитыватьРассмотрено Тогда + НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", Истина); + КонецЕсли; + + НаборЗаписей.Записать(); + + КонецЦикла + +КонецПроцедуры + +//Удаляет повторяющиеся элементы массива +// +Функция УдалитьПовторяющиесяЭлементыМассива(Массив, НеИспользоватьНеопределено = Ложь) Экспорт + + ОписаниеТиповСправочники = Справочники.ТипВсеСсылки(); + ОписаниеТиповДокументы = Документы.ТипВсеСсылки(); + ОписаниеТиповПВХ = ПланыВидовХарактеристик.ТипВсеСсылки(); + ОписаниеТиповПланыСчетов = ПланыСчетов.ТипВсеСсылки(); + ОписаниеТиповПланыРасчета = ПланыВидовРасчета.ТипВсеСсылки(); + + Если ТипЗнч(Массив) = Тип("Массив") Тогда + + УжеВМассиве = Новый Соответствие; + БылоНеопределено = Ложь; + КолвоЭлементовВМассиве = Массив.Количество(); + + Для ОбратныйИндекс = 1 По КолвоЭлементовВМассиве Цикл + + ЭлементМассива = Массив[КолвоЭлементовВМассиве - ОбратныйИндекс]; + ТипЭлемента = ТипЗнч(ЭлементМассива); + + Если ЭлементМассива = Неопределено Тогда + + Если БылоНеопределено ИЛИ НеИспользоватьНеопределено Тогда + Массив.Удалить(КолвоЭлементовВМассиве - ОбратныйИндекс); + Иначе + БылоНеопределено = Истина; + КонецЕсли; + + Продолжить; + + ИначеЕсли ОписаниеТиповСправочники.СодержитТип(ТипЭлемента) + ИЛИ ОписаниеТиповДокументы.СодержитТип(ТипЭлемента) + ИЛИ ОписаниеТиповПВХ.СодержитТип(ТипЭлемента) + ИЛИ ОписаниеТиповПланыСчетов.СодержитТип(ТипЭлемента) + ИЛИ ОписаниеТиповПланыРасчета.СодержитТип(ТипЭлемента) Тогда + + ИДЭлемента = Строка(ЭлементМассива.УникальныйИдентификатор()); + + Иначе + + ИДЭлемента = ЭлементМассива; + + КонецЕсли; + + Если УжеВМассиве[ИДЭлемента] = Истина Тогда + Массив.Удалить(КолвоЭлементовВМассиве - ОбратныйИндекс); + Иначе + УжеВМассиве[ИДЭлемента] = Истина; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Возврат Массив; + +КонецФункции diff --git a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl index 920ad54ab..b4dbb9eda 100644 --- a/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияВызовСервера/Module.bsl @@ -1,7 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Взаимодействия" -// -//////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -214,6 +210,31 @@ КонецПроцедуры +/////////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции работы с взаимодействиями + +//Получает данные выбора для документов взаимодействия +Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка, ИмяДокумента) Экспорт + + СтандартнаяОбработка = Ложь; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ + | ДокументВзаимодействий.Ссылка КАК Ссылка + |ИЗ + | Документ." + ИмяДокумента + " КАК ДокументВзаимодействий + |ГДЕ + | ДокументВзаимодействий.Тема ПОДОБНО &СтрокаПоиска + | ИЛИ ДокументВзаимодействий.Номер ПОДОБНО &СтрокаПоиска"; + + Запрос.УстановитьПараметр("СтрокаПоиска", Параметры.СтрокаПоиска + "%"); + + ДанныеВыбора = Новый СписокЗначений; + ДанныеВыбора.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка")); + + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Прочее @@ -260,10 +281,34 @@ КонецЕсли; + Если ТипЗнч(Предмет) = Тип("РегистрСведенийКлючЗаписи.СостоянияПредметовВзаимодействий") Тогда + Предмет = Предмет.Предмет; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ + | ПредметыПапкиВзаимодействий.Предмет + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Взаимодействие В(&МассивВзаимодействий) + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | &Предмет"; + + Запрос.УстановитьПараметр("Предмет", Предмет); + Запрос.УстановитьПараметр("МассивВзаимодействий", МассивВзаимодействий); + + ВыборкаПредметы = Запрос.Выполнить().Выбрать(); + Для Каждого Взаимодействие Из МассивВзаимодействий Цикл - Взаимодействия.УстановитьПредмет(Взаимодействие, Предмет); + Взаимодействия.УстановитьПредмет(Взаимодействие, Предмет, Ложь); КонецЦикла; + Взаимодействия.РассчитатьРассмотреноПоПредметам(Взаимодействия.ТаблицаДанныхДляРасчетаРассмотрено(ВыборкаПредметы, "Предмет")); + КонецПроцедуры // Обновляет индекс полнотекстового поиска если это доступно. @@ -294,9 +339,96 @@ // Ссылка - ссылка на письмо, // Папка - устанавливаемая папка электронного письма // -Процедура УстановитьПапкуЭлектронногоПисьма(Ссылка, Папка) Экспорт +Процедура УстановитьПапкуЭлектронногоПисьма(Ссылка, Папка, РассчитыватьРассмотрено = Истина) Экспорт - Взаимодействия.УстановитьПредметПапкуВзаимодействия(Ссылка, Папка); + ЗаписьРегистрРеквизитыВзаимодействия(Ссылка, ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи(Папка,,,,РассчитыватьРассмотрено)); + +КонецПроцедуры + +// Устанавливает папку, предмет и реквизиты рассмотрения для взаимодействий +// +// Параметры +// Ссылка - ДокументСсылка.ЭлектронноеПисьмоВходящее, +// ДокументСсылка.ЭлектронноеПисьмоИсходящее, +// ДокументСсылка.Встреча, +// ДокументСсылка.ЗапланированноеВзаимодействие, +// ДокументСсылка.ТелефонныйЗвонок - взаимодействие для которого будут установлены папка и предмет +// Реквизиты - Структура - содержит данные реквизитов взаимодействия, которые хранятся в регистре +// НаборЗаписей - РегистрСведений.ПредметыПапкиВзаимодействий.НаборЗаписей - набор записей регистра, если он уже создан +// на момент вызова процедуры +// +Процедура ЗаписьРегистрРеквизитыВзаимодействия(Взаимодействие, Реквизиты, НаборЗаписей = Неопределено) Экспорт + + Папка = Реквизиты.Папка; + Предмет = Реквизиты.Предмет; + Рассмотрено = Реквизиты.Рассмотрено; + РассмотретьПосле = Реквизиты.РассмотретьПосле; + РассчитыватьРассмотрено = Реквизиты.РассчитыватьРассмотрено; + + СоздаватьИЗаписывать = (НаборЗаписей = Неопределено); + + Если Папка = Неопределено И Предмет = Неопределено И Рассмотрено = Неопределено + И РассмотретьПосле = Неопределено Тогда + + Возврат; + + ИначеЕсли Папка = Неопределено ИЛИ Предмет = Неопределено ИЛИ Рассмотрено = Неопределено + ИЛИ РассмотретьПосле = Неопределено Тогда + + Запрос = Новый Запрос; + Запрос.Текст = " + |ВЫБРАТЬ + | ПредметыПапкиВзаимодействий.Предмет, + | ПредметыПапкиВзаимодействий.ПапкаЭлектронногоПисьма, + | ПредметыПапкиВзаимодействий.Рассмотрено, + | ПредметыПапкиВзаимодействий.РассмотретьПосле + |ИЗ + | РегистрСведений.ПредметыПапкиВзаимодействий КАК ПредметыПапкиВзаимодействий + |ГДЕ + | ПредметыПапкиВзаимодействий.Взаимодействие = &Взаимодействие"; + + Запрос.УстановитьПараметр("Взаимодействие",Взаимодействие); + + Результат = Запрос.Выполнить(); + Если НЕ Результат.Пустой() Тогда + + Выборка = Результат.Выбрать(); + Выборка.Следующий(); + + Если Папка = Неопределено Тогда + Папка = Выборка.ПапкаЭлектронногоПисьма; + КонецЕсли; + + Если Предмет = Неопределено Тогда + Предмет = Выборка.Предмет; + КонецЕсли; + + Если Рассмотрено = Неопределено Тогда + Рассмотрено = Выборка.Рассмотрено; + КонецЕсли; + + Если РассмотретьПосле = Неопределено Тогда + РассмотретьПосле = Выборка.РассмотретьПосле; + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Если СоздаватьИЗаписывать Тогда + НаборЗаписей = РегистрыСведений.ПредметыПапкиВзаимодействий.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.Взаимодействие.Установить(Взаимодействие); + КонецЕсли; + Запись = НаборЗаписей.Добавить(); + Запись.Взаимодействие = Взаимодействие; + Запись.Предмет = Предмет; + Запись.ПапкаЭлектронногоПисьма = Папка; + Запись.Рассмотрено = Рассмотрено; + Запись.РассмотретьПосле = РассмотретьПосле; + НаборЗаписей.ДополнительныеСвойства.Вставить("РассчитыватьРассмотрено", РассчитыватьРассмотрено); + + Если СоздаватьИЗаписывать Тогда + НаборЗаписей.Записать(); + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl index e348a6fb5..d2619b696 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиент/Module.bsl @@ -106,20 +106,36 @@ // Процедура КомандаОбновитьИндексППДВыполнить(ИнформацияОбАктуальностиИндексаППД,ППДВключен,ИндексАктуален) Экспорт + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ИнформацияОбАктуальностиИндексаППД", ИнформацияОбАктуальностиИндексаППД); + ДополнительныеПараметры.Вставить("ППДВключен", ППДВключен); + ДополнительныеПараметры.Вставить("ИндексАктуален", ИндексАктуален); + + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросОНеобходимостиОбновленияПолнотекстовогоПоиска", ЭтотОбъект); СтрВопроса = НСтр("ru = 'Обновление индекса полнотекстового поиска может занять длительное время. Продолжить?'"); - Ответ = Вопрос(СтрВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда + ПоказатьВопрос(ОбработчикОповещенияОЗакрытии,СтрВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры +// КомандаОбновитьИндексППДВыполнить. +// +Процедура ВопросОНеобходимостиОбновленияПолнотекстовогоПоиска(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда Возврат; КонецЕсли; Состояние(НСтр("ru = 'Идет обновление индекса полнотекстового поиска ...'")); - Результат = ВзаимодействияВызовСервера.ОбновитьИндексППД(ИнформацияОбАктуальностиИндексаППД,ППДВключен,ИндексАктуален); + Результат = ВзаимодействияВызовСервера.ОбновитьИндексППД(ДополнительныеПараметры.ИнформацияОбАктуальностиИндексаППД, + ДополнительныеПараметры.ППДВключен, + ДополнительныеПараметры.ИндексАктуален); Состояние(); Если Не ПустаяСтрока(Результат) Тогда - Предупреждение(Результат); + ПоказатьПредупреждение(, Результат); КонецЕсли; - + КонецПроцедуры //Открывает форму объекта-контакта заполненную по описанию участника взаимодействия @@ -133,14 +149,29 @@ Если ТипыКонтактов.Количество() = 0 Тогда Возврат; КонецЕсли; - ТипКонтакта = ТипыКонтактов.ВыбратьЭлемент("Выбор типа контакта"); - Если ТипКонтакта <> Неопределено Тогда + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Описание", Описание); + ДополнительныеПараметры.Вставить("Адрес", Адрес); + ДополнительныеПараметры.Вставить("Основание", Основание); + ОбработчикОповещения = Новый ОписаниеОповещения("ВыборТипаКонтактаПриЗавершении", ЭтотОбъект, ДополнительныеПараметры); + ТипыКонтактов.ПоказатьВыборЭлемента(ОбработчикОповещения, НСтр("ru = 'Выбор типа контакта'")); + +КонецПроцедуры + +//Обработчик оповещения выбора типа контакта при создании контакта из документов взаимодействий +//Параметры: +// РезультатВыбора - ЭлементСпискаЗначений - в значение элемента содержится строковое представление типа контакта, +// ДополнительныеПараметры - Структура - содержит поля "Описание", "Адрес" и "Основание" +// + +Процедура ВыборТипаКонтактаПриЗавершении(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если РезультатВыбора <> Неопределено Тогда ПараметрФормы = Новый Структура( - "Основание", - Новый Структура("Наименование, Адрес, Объект", - Описание, Адрес, Основание)); - Если НЕ ВзаимодействияКлиентПереопределяемый.СоздатьКонтактНестандартнаяФорма(ТипКонтакта.Значение,ПараметрФормы) Тогда - ОткрытьФорму("Справочник." + ТипКонтакта.Значение + ".ФормаОбъекта", ПараметрФормы); + "Основание",ДополнительныеПараметры); + Если НЕ ВзаимодействияКлиентПереопределяемый.СоздатьКонтактНестандартнаяФорма(РезультатВыбора.Значение,ПараметрФормы) Тогда + ОткрытьФорму("Справочник." + РезультатВыбора.Значение + ".ФормаОбъекта", ПараметрФормы); КонецЕсли; КонецЕсли; @@ -254,6 +285,8 @@ Возврат; КонецЕсли; + Форма.ИзменилисьКонтакты = Истина; + ТекущиеДанные.Контакт = Контакт; ТекущиеДанные.КакСвязаться = Адрес; ТекущиеДанные.ПредставлениеКонтакта = Представление; @@ -266,6 +299,8 @@ Возврат; КонецЕсли; + Форма.ИзменилисьКонтакты = Истина; + ТекущиеДанные.Контакт = Контакт; ТекущиеДанные.КакСвязаться = Адрес; ТекущиеДанные.ПредставлениеКонтакта = Представление; @@ -279,6 +314,8 @@ Возврат; КонецЕсли; + Форма.ИзменилисьКонтакты = Истина; + ТекущиеДанные.Контакт = Контакт; ТекущиеДанные.КакСвязаться = Адрес; ТекущиеДанные.ПредставлениеКонтакта = Представление; @@ -288,6 +325,8 @@ ИначеЕсли ТипЗнч(Форма.Объект.Ссылка)=Тип("ДокументСсылка.ТелефонныйЗвонок") Тогда + Форма.ИзменилисьКонтакты = Истина; + Форма.Объект.АбонентКонтакт = Контакт; Форма.Объект.АбонентКакСвязаться = Адрес; Форма.Объект.АбонентПредставление = Представление; @@ -383,8 +422,6 @@ Если ЭлементМассиваОписания.ИмяВладельца = ИмяТаблицыБезПрефикса Тогда Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда КоллекцияОтборов = Форма["Список_" + ЭлементМассиваОписания.Имя].КомпоновщикНастроек.ФиксированныеНастройки.Отбор; - Иначе - КоллекцияОтборов = Форма["Список_" + ЭлементМассиваОписания.Имя].Отбор; КонецЕсли; КоллекцияОтборов.Элементы[0].ПравоеЗначение = ЗначениеОтбора; КонецЕсли; @@ -392,14 +429,30 @@ КонецПроцедуры -//Задает вопрос пользователю при смене режима форматирования электронного письма с HTML на обычный текст и возвращает выбор пользователя. -Функция ПриИзмененииФорматаСообщенияНаОбычныйТекст() Экспорт - +//Задает вопрос пользователю при смене режима форматирования электронного письма с HTML на обычный текст. +Процедура ВопросПриИзмененииФорматаСообщенияНаОбычныйТекст(Форма, ДополнительныеПараметры = Неопределено) Экспорт + + ОбработчикОповещенияОЗакрытии = Новый ОписаниеОповещения("ВопросПриИзмененииФорматаПриЗакрытии", Форма, ДополнительныеПараметры); ТекстСообщения = НСтр("ru='При преобразовании этого сообщения в обычный текст будут утеряны все элементы оформления, картинки и прочие вставленные элементы. Продолжить?'"); - Результат = Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Изменение формата письма'")); - Возврат Результат = КодВозвратаДиалога.Да; + ПоказатьВопрос(ОбработчикОповещенияОЗакрытии, ТекстСообщения, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, НСтр("ru = 'Изменение формата письма'")); + +КонецПроцедуры -КонецФункции +// Обработчик окончания выбора типа документа при создании документа взаимодействий +// +// Параметры: +// РезультатВыборка - ЭлементСпискаЗначений - содержит в значение строковое представление типа создаваемого документа. +// ДополнительныеПараметры - Структура - содержит одно поле - "ПараметрыСоздания". +// +Процедура ВыборТипаДокументаДляСозданияПриЗавершении(РезультатВыбора, ДополнительныеПараметры) Экспорт + + Если НЕ РезультатВыбора = Неопределено Тогда + + СоздатьНовоеВзаимодействие(РезультатВыбора.Значение,ДополнительныеПараметры.ПараметрыСоздания); + + КонецЕсли; + +КонецПроцедуры // Обработчик перед началом добавления динамических списков журнала взаимодействия // @@ -425,7 +478,7 @@ ТипЗнч(ТекущиеДанные.Ссылка) = Тип("ДокументСсылка.ЭлектронноеПисьмоИсходящее") Тогда Отказ = Истина; Если Не ТолькоПочта Тогда - Предупреждение(НСтр("ru = 'Копирование электронных писем запрещено'")); + ПоказатьПредупреждение(, НСтр("ru = 'Копирование электронных писем запрещено'")); КонецЕсли; КонецЕсли; @@ -437,12 +490,10 @@ Иначе Отказ = Истина; - РезультатВыбора = ДокументыДоступныеДляСоздания.ВыбратьЭлемент(НСтр("ru = 'Выберите тип документа'")); - Если НЕ РезультатВыбора = Неопределено Тогда - - СоздатьНовоеВзаимодействие(РезультатВыбора.Значение,ПараметрыСоздания); - - КонецЕсли; + + ДополнительныеПараметры = Новый Структура("ПараметрыСоздания", ПараметрыСоздания); + ОбработчикОповещения = Новый ОписаниеОповещения("ВыборТипаДокументаДляСозданияПриЗавершении", ЭтотОбъект, ДополнительныеПараметры); + ДокументыДоступныеДляСоздания.ПоказатьВыборЭлемента(ОбработчикОповещения, НСтр("ru = 'Выберите тип документа'")); КонецЕсли; diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl index a3850f345..c1a37c561 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСервер/Module.bsl @@ -513,11 +513,11 @@ //установить отборы для режима Если Форма[ИмяОтбора] = "КРассмотрению" Тогда -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - ДатаДляОтбора = ТекущаяДатаСеанса(); -#Иначе - ДатаДляОтбора = ОбщегоНазначенияКлиент.ДатаСеанса(); -#КонецЕсли + #Если Сервер Или ВнешнееСоединение Тогда + ДатаДляОтбора = ТекущаяДатаСеанса(); + #Иначе + ДатаДляОтбора = ОбщегоНазначенияКлиент.ДатаСеанса(); + #КонецЕсли ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(Отбор, "Рассмотрено", Ложь,,, Истина); ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора( Отбор, "РассмотретьПосле", ДатаДляОтбора, ВидСравненияКомпоновкиДанных.МеньшеИлиРавно,, Истина); @@ -788,10 +788,60 @@ // Функция ОтборДинамическогоСписка(Список) Экспорт - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; - Иначе - Возврат Список.Отбор; - КонецЕсли; + Возврат Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; +КонецФункции + +// Формирует структуру для записи в регистр сведений ПредметыПапкиВзаимодействий +// +// Параметры: +// Папка - Справочник.ПапкиЭлектронныхПисем - папка, имеет смысл для документов "Электронное письмо входящее" +// и "Электронное письмо исходящее". +// Предмет - СправочникСсылка, ДокументСсылка, указывает на предмет взаимодействия. +// Рассмотрено - Булево - признак рассмотрения взаимодействия. +// РассмотретьПосле - ДатаВремя - дата, до которой отложено рассмотрение взаимодействия. +// РассчитыватьРассмотрено - Булево - признак необходимости расчета состояний папки и предмета +// +// Возвращаемое значение: +// Структура - сформированная структура. +// +Функция СтруктураРеквизитовВзаимодействияДляЗаписи(Папка = Неопределено, Предмет = Неопределено, Рассмотрено = Неопределено, + РассмотретьПосле = Неопределено, РассчитыватьРассмотрено = Истина) Экспорт + + СтруктураВозврата = ПустаяСтруктураРеквизитыВзаимодействия(); + + Если Папка <> Неопределено Тогда + СтруктураВозврата.Папка = Папка; + КонецЕсли; + + Если Предмет <> Неопределено Тогда + СтруктураВозврата.Предмет = Предмет; + КонецЕсли; + + Если Рассмотрено <> Неопределено Тогда + СтруктураВозврата.Рассмотрено = Рассмотрено; + КонецЕсли; + + Если РассмотретьПосле <> Неопределено Тогда + СтруктураВозврата.РассмотретьПосле = РассмотретьПосле; + КонецЕсли; + СтруктураВозврата.РассчитыватьРассмотрено = РассчитыватьРассмотрено; + + Возврат СтруктураВозврата; + +КонецФункции + +// Формирует пустую структуру для записи в регистр сведений ПредметыПапкиВзаимодействий +// +Функция ПустаяСтруктураРеквизитыВзаимодействия() Экспорт + + СтруктураВозврата = Новый Структура; + СтруктураВозврата.Вставить("Предмет" ,Неопределено); + СтруктураВозврата.Вставить("Папка" ,Неопределено); + СтруктураВозврата.Вставить("Рассмотрено" ,Неопределено); + СтруктураВозврата.Вставить("РассмотретьПосле" ,Неопределено); + СтруктураВозврата.Вставить("РассчитыватьРассмотрено",Истина); + + Возврат СтруктураВозврата; + КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl index 90be281fc..dcce108dd 100644 --- a/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ВзаимодействияКлиентСерверПовтИспПереопределяемый/Module.bsl @@ -40,22 +40,4 @@ КонецПроцедуры -// Получает массив описаний видов панели навигации от предмет. -// Используется, если в конфигурации есть необходимость строить панель навигации от реквизита предмета -// -// Возвращаемое значение:: -// Массив - массив структур, в котором описываются возможные виды навигации от реквизита предмета. -// Каждая структура массив строковых представлений типа предмета, представление реквизита, -// представление отображаемое в панели навигации в случае, когда реквизит в предмете не указан, -// представление для формирования имени панели навигации -// -Функция ПолучитьМассивОписанияВидовНавигацииОтРеквизитовПредмета() Экспорт - - МассивОписаний = Новый Массив; - - - - Возврат МассивОписаний; - -КонецФункции diff --git a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/Module.bsl b/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/Module.bsl deleted file mode 100644 index 737589d96..000000000 --- a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/Module.bsl +++ /dev/null @@ -1,2579 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// ВыгрузкаЗагрузкаДанных: Экспорт области данных в файл/Импорт области данных из файла. -// Доступно только администратору ИБ/Области данных. -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Выгружает данные текущей области данных в zip архив с XML файлами. -// -// Параметры: -// БезДеленияПоФайлам - Булево - Истина - выгружать все данные в один файл, -// Ложь - отдельно выгружать данные требующие замены ссылок при загрузке. -// СохранятьПаролиПользователей - Булево - выгружать вместе с пользователями -// сохраняемые значения паролей. -// -// Возвращаемое значение: -// Строка - полное имя файла с выгрузкой. -// -Функция ВыгрузитьТекущуюОбластьВАрхив() Экспорт - - НачалоВыполнения = ТекущаяУниверсальнаяДата(); - - Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение(НСтр("ru = 'Нарушение прав доступа'")); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ВнешнийМонопольныйРежим = РаботаВМоделиСервиса.УстановленМонопольныйРежим(); - Иначе - ВнешнийМонопольныйРежим = Ложь; - КонецЕсли; - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.ЗаблокироватьИБ(Ложь); - КонецЕсли; - - КаталогВыгрузки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогВыгрузки); - - КаталогВыгрузки = КаталогВыгрузки + "/"; - - Попытка - - ЗаписатьИнформациюОВыгрузкеВXML(КаталогВыгрузки, Ложь); - - ЗаписатьДанныеВXMLСУказаниемТипов(КаталогВыгрузки, ПолучитьМассивТиповТребующихПодменыСсылок()); - - ЗаписатьПользователейВXML(КаталогВыгрузки, Ложь); - - Справочники.ИдентификаторыОбъектовМетаданных.ВыгрузитьДанныеСправочника(КаталогВыгрузки); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПослеВыгрузкиОбласти"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеВыгрузкиОбласти(КаталогВыгрузки); - КонецЦикла; - - ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеВыгрузкиОбласти(КаталогВыгрузки); - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - - Исключение - - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - - Попытка - УдалитьКаталог(КаталогВыгрузки); - Исключение - КонецПопытки; - - ВызватьИсключение ПредставлениеОшибки; - - КонецПопытки; - - ИмяАрхива = ПолучитьИмяВременногоФайла("zip"); - - Архиватор = Новый ЗаписьZipФайла(ИмяАрхива, , , , УровеньСжатияZIP.Максимальный); - Архиватор.Добавить(КаталогВыгрузки + "*"); - Архиватор.Записать(); - - УдалитьКаталог(КаталогВыгрузки); - - ОписаниеАрхива = Новый Файл(ИмяАрхива); - - ЗаписатьСобытиеВЖурнал( - НСтр("ru = 'Выгрузка'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ОписаниеАрхива.Размер(), - ТекущаяУниверсальнаяДата() - НачалоВыполнения); - - Возврат ИмяАрхива; - -КонецФункции - -// Загружает данные текущей области данных из zip архива с XML файлами. -// -// Параметры: -// ИмяАрхива - Строка - полное имя файла архива с данными -// ЗагружатьПользователей - Булево - загружать информацию о пользователях ИБ -// -Функция ЗагрузитьТекущуюОбластьИзАрхива(Знач ИмяАрхива, Знач ЗагружатьПользователей = Ложь) Экспорт - - НачалоВыполнения = ТекущаяУниверсальнаяДата(); - - УстановитьПривилегированныйРежим(Истина); - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ВнешнийМонопольныйРежим = РаботаВМоделиСервиса.УстановленМонопольныйРежим(); - Иначе - ВнешнийМонопольныйРежим = Ложь; - КонецЕсли; - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.ЗаблокироватьИБ(Ложь); - КонецЕсли; - - КаталогВыгрузки = РаспаковатьАрхив(ИмяАрхива); - - Попытка - - ВыполнитьЗагрузкуДанных(КаталогВыгрузки, ЗагружатьПользователей); - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - - Исключение - - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - - Если Не ВнешнийМонопольныйРежим Тогда - ОбщегоНазначения.РазблокироватьИБ(); - КонецЕсли; - - Попытка - УдалитьКаталог(КаталогВыгрузки); - Исключение - КонецПопытки; - - ВызватьИсключение ПредставлениеОшибки; - - КонецПопытки; - - УдалитьКаталог(КаталогВыгрузки); - - ОписаниеАрхива = Новый Файл(ИмяАрхива); - - ЗаписатьСобытиеВЖурнал( - НСтр("ru = 'Загрузка'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ОписаниеАрхива.Размер(), - ТекущаяУниверсальнаяДата() - НачалоВыполнения); - -КонецФункции - -// Выполняет загрузку данных в область из zip архива с XML файлами в рамках подготовки новой области данных. -// -// Параметры: -// ИмяАрхива - Строка - полное имя файла архива с данными -// ЗагружатьПользователей - Булево - загружать информацию о пользователях ИБ -// -// Возвращаемое значение: -// Булево, Истина - если область загружена из архива, Ложь - если требуется конвертация файла data_dump.zip -// -Функция ПодготовитьТекущуюОбластьИзАрхива(Знач ИмяАрхива, Знач ЗагружатьПользователей = Ложь) Экспорт - - НачалоВыполнения = ТекущаяУниверсальнаяДата(); - - КаталогВыгрузки = РаспаковатьАрхив(ИмяАрхива); - - ИнформацияОВыгрузке = ПолучитьИнформациюОВыгрузке(КаталогВыгрузки); - Если ИнформацияОВыгрузке.Configuration.Name <> Метаданные.Имя ИЛИ ИнформацияОВыгрузке.Configuration.Version <> Метаданные.Версия Тогда - Возврат Ложь; - КонецЕсли; - - Попытка - ВыполнитьЗагрузкуДанных(КаталогВыгрузки, ЗагружатьПользователей); - Исключение - ПредставлениеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - УдалитьКаталог(КаталогВыгрузки); - ВызватьИсключение ПредставлениеОшибки; - КонецПопытки; - - УдалитьКаталог(КаталогВыгрузки); - - ОписаниеАрхива = Новый Файл(ИмяАрхива); - - ЗаписатьСобытиеВЖурнал( - НСтр("ru = 'Загрузка'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - ОписаниеАрхива.Размер(), - ТекущаяУниверсальнаяДата() - НачалоВыполнения); - - Возврат Истина; - -КонецФункции - -// Выгружает данные текущей области данных во временное хранилище по переданному адресу -// -// Параметры: -// АдресХранилища - Строка - адрес временного хранилища в которое нужно поместить данные. -// -Процедура ВыгрузитьТекущуюОбластьВоВременноеХранилище(Знач АдресХранилища) Экспорт - - ИмяАрхива = ВыгрузитьТекущуюОбластьВАрхив(); - - ДанныеВыгрузки = Новый ДвоичныеДанные(ИмяАрхива); - - ПоместитьВоВременноеХранилище(ДанныеВыгрузки, АдресХранилища); - - ДанныеВыгрузки = Неопределено; - Попытка - УдалитьФайлы(ИмяАрхива); - Исключение - // При неудаче система удалит временный файл автоматически - ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции удаления временного файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - -// Выгружает указанную область данных во временное хранилище по переданному адресу -// -// Параметры: -// ОбластьДанных - Число - значения разделителя области данных, которую требуется выгрузить. -// АдресХранилища - Строка - адрес временного хранилища в которое нужно поместить данные. -// -Процедура ВыгрузитьОбластьВоВременноеХранилище(Знач ОбластьДанных, Знач АдресХранилища) Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.СеансЗапущенБезРазделителей() - ИЛИ НЕ Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда - - ВызватьИсключение(НСтр("ru = 'Операция может быть выполнена только администратором информационной базы.'")); - КонецЕсли; - - ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, ОбластьДанных); - - ВыгрузитьТекущуюОбластьВоВременноеХранилище(АдресХранилища); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Объявляет события подсистемы РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных: -// -// Серверные события: -// ПриЗаполненииВидовОграниченийПравОбъектовМетаданных, -// ПриДополненииСловаряЗаменПоОбщимДанным, -// ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса, -// ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки, -// ПослеВыгрузкиОбласти, -// ПриФормированииСловаряЗаменПоКаталогуВыгрузки. -// -// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. -Процедура ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия) Экспорт - - // СЕРВЕРНЫЕ СОБЫТИЯ. - - // Заполняет массив типов неразделенных данных. Он используется при обновлении ссылок - // при загрузке-выгрузке конфигурации - // - // Параметры: - // МассивТипов - массив - // - // Синтаксис: - // Процедура ПриОпределенииСтандартныхТиповОбщихДанных(Знач МассивТипов) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ТипыОбщихДанных). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихДанных"); - - // Заполняет массив типов неразделенных данных, всегда содержащих только предопределенные элементы. - // Он используется при обновлении ссылок при загрузке-выгрузке данных. - // - // Параметры: - // МассивТипов - массив - // - // Синтаксис: - // Процедура ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных(МассивТипов) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ТипыОбщихПредопределенныхДанных). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных"); - - // Обработчик, вызываемый перед стандартным формирования словаря замен - // по очередному файлу общих данных. - // - // Параметры - // СловарьЗамен - таблица значений, колонки: - // Тип - Тип - Тип значения заменяемой ссылки - // СоответствиеСсылок - Соответствие - соответствие новой ссылки исходной - // Ключ - Идентификатор новой ссылки (на которую требуется заменить) - // Значение - Идентификатор исходной ссылки (требующая замены) - // СтандартнаяОбработка - Булево, Неопределено - выполнять стандартную замену ссылок - // Неопределено - замена будет выполняться если СоответствиеСсылок не содержит записей - // ИмяФайлаОбщихДанных - Строка - имя текущего обрабатываемого файла выгрузки - // общих данных - // - // Синтаксис: - // Процедура ПриДополненииСловаряЗаменПоОбщимДанным(Знач СловарьЗамен, Знач ИмяФайлаОбщихДанных) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ДополнитьСловарьЗаменПоОбщимДанным). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриДополненииСловаряЗаменПоОбщимДанным"); - - // Обработчик, вызываемый при заполнении таблицы соответствия объектов метаданных, используемых в локальном - // режиме и в модели сервиса. - // - // Параметры - // ТаблицаСоответствия - ТаблицаЗначений, колонки: - // ОбъектВЛокальномРежиме - ОбъектМетаданных, объект метаданных, используемый в локальном режиме, - // ОбъектВМоделиСервиса - ОбъектМетаданных, объект метаданных, используемый в модели сервиса. - // - // Синтаксис: - // Процедура ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(ТаблицаСоответствия) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ЗаполнитьСоответствиеТиповМетаданныхВЛокальномРежимеИМоделиСервиса). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса"); - - // Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. - // - // Параметры - // Объекты - Массив(ОбъектМетаданных). - // - // Синтаксис: - // Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ЗаполнитьСоответствиеТиповМетаданныхВЛокальномРежимеИМоделиСервиса). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"); - - // Обработчик, вызываемый после выгрузки области в файлы. - // - // Параметры - // КаталогВыгрузки - Строка - имя каталога с файлами выгрузки области. В каталог можно поместить - // дополнительные файлы, они будут доступны в некоторых событиях загрузки. - // - // Синтаксис: - // Процедура ПослеВыгрузкиОбласти(Знач КаталогВыгрузки) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ПослеВыгрузкиОбласти). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПослеВыгрузкиОбласти"); - - // Обработчик, вызываемый при окончании стандартного формирования словаря замен - // по очередному файлу общих данных. - // - // Параметры - // СловарьЗамен - таблица значений, колонки: - // Тип - Тип - Тип значения заменяемой ссылки - // СоответствиеСсылок - Соответствие - соответствие новой ссылки исходной - // Ключ - Идентификатор новой ссылки (на которую требуется заменить) - // Значение - Идентификатор исходной ссылки (требующая замены) - // СтандартнаяОбработка - Булево, Неопределено - выполнять стандартную замену ссылок - // Неопределено - замена будет выполняться если СоответствиеСсылок не содержит записей - // КаталогВыгрузки - Строка - имя каталога с файлами выгрузки области - // - // Синтаксис: - // Процедура ПриФормированииСловаряЗаменПоКаталогуВыгрузки(Знач СловарьЗамен, Знач КаталогВыгрузки) Экспорт - // - // (То же, что ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриФормированииСловаряЗаменПоКаталогуВыгрузки). - // - СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриФормированииСловаряЗаменПоКаталогуВыгрузки"); - -КонецПроцедуры - -Процедура УдалитьКаталог(Знач Каталог) - - Попытка - УдалитьФайлы(Каталог); - Исключение - // При неудаче система удалит временный файл автоматически - ЗаписьЖурналаРегистрации(НСтр("ru = 'Выполнение операции удаления временного файла'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - -КонецПроцедуры - -// Возвращает массив типов неразделенных данных. Он используется при обновлении ссылок -// при загрузке-выгрузке конфигурации -// -// Возвращаемое значение: -// Массив Типов данных -// -Функция ТипыОбщихДанных() - Перем Результат; - - Результат = Новый Массив; - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихДанных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииСтандартныхТиповОбщихДанных(Результат); - КонецЦикла; - - ВыгрузкаЗагрузкаДанныхПереопределяемый.ТипыОбщихДанных(Результат); - - Возврат Результат; - -КонецФункции - -Функция ТипыОбщихДанныхСПредопределеннымиЭлементами() - - Результат = Новый Массив(); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных(Результат); - КонецЦикла; - - ВыгрузкаЗагрузкаДанныхПереопределяемый.ТипыОбщихПредопределенныхДанных(Результат); - - Возврат Результат; - -КонецФункции - -Функция РаспаковатьАрхив(Знач ИмяФайла) - - КаталогВыгрузки = ПолучитьИмяВременногоФайла(); - СоздатьКаталог(КаталогВыгрузки); - - КаталогВыгрузки = КаталогВыгрузки + "/"; - - Разархиватор = Новый ЧтениеZipФайла(ИмяФайла); - Разархиватор.ИзвлечьВсе(КаталогВыгрузки, РежимВосстановленияПутейФайловZIP.НеВосстанавливать); - - Возврат КаталогВыгрузки; - -КонецФункции - -Функция ПолучитьИнформациюОВыгрузке(КаталогВыгрузки) - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(КаталогВыгрузки + "DumpInfo.xml"); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Info" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Info.'")); - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'")); - КонецЕсли; - - ТипDumpInfo = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "DumpInfo"); - ИнформацияОВыгрузке = ФабрикаXDTO.ПрочитатьXML(Чтение, ТипDumpInfo); - - Чтение.Закрыть(); - - Возврат ИнформацияОВыгрузке; - -КонецФункции - -Процедура ВыполнитьЗагрузкуДанных(КаталогВыгрузки, ЗагружатьПользователей) - - // Очистим все данные текущей области - РаботаВМоделиСервиса.ОчиститьДанныеОбласти(ЗагружатьПользователей); - - // Загрузим данные из файла - ЗагрузитьДанныеСПодменойСсылок(КаталогВыгрузки); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПослеЗагрузкиДанныхИзДругойМодели"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПослеЗагрузкиДанныхИзДругойМодели(); - КонецЦикла; - - Если ЗагружатьПользователей Тогда - СоответствиеИдентификаторов = СоздатьПользователейИзXML(КаталогВыгрузки); - ОбработатьПользователейПослеЗагрузкиИзДругойМодели(СоответствиеИдентификаторов); - Иначе - ОчиститьИдентификаторыПользователей(КаталогВыгрузки); - КонецЕсли; - -КонецПроцедуры - -Процедура ОшибкаОпределенияТипаПриЧтении(Знач Чтение) - - Запись = Новый ЗаписьXML; - Запись.УстановитьСтроку(); - Запись.ЗаписатьТекущий(Чтение); - ТекущийЭлемент = Запись.Закрыть(); - - ШаблонТекста = НСтр("ru = 'Ошибка при чтении XML. Не удалось определить тип данных на основе элемента: - |%1'"); - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ТекущийЭлемент); - ВызватьИсключение(ТекстСообщения); - -КонецПроцедуры - -Функция ПолучитьФабрикуСУказаниемТипов(Знач Типы = Неопределено) - - НаборСхем = ФабрикаXDTO.ЭкспортСхемыXML("http://v8.1c.ru/8.1/data/enterprise/current-config"); - Схема = НаборСхем[0]; - Схема.ОбновитьЭлементDOM(); - - ЗаписьDOM = Новый ЗаписьDOM; - - КорневойУзел = Схема.ДокументDOM.ДочерниеУзлы[0]; - - ИгнорироватьТипы = Новый Массив; - ИгнорироватьТипы.Добавить("AccountingRegisterExtDimensions"); - ИгнорироватьТипы.Добавить("CatalogTabularSectionRow"); - ИгнорироватьТипы.Добавить("ChartOfAccountsExtDimensionTypesRow"); - ИгнорироватьТипы.Добавить("LeadingCalculationTypesRow"); - ИгнорироватьТипы.Добавить("DocumentTabularSectionRow"); - ИгнорироватьТипы.Добавить("AccountingRegisterRecord"); - ИгнорироватьТипы.Добавить("AccumulationRegisterRecord"); - ИгнорироватьТипы.Добавить("InformationRegisterRecord"); - ИгнорироватьТипы.Добавить("EnumRef"); - - Если Типы = Неопределено Тогда - ТолькоУказанныеТипы = Ложь; - Иначе - ТолькоУказанныеТипы = Истина; - - УказанныеТипы = Новый Соответствие; - Для каждого Тип Из Типы Цикл - УказанныеТипы.Вставить(СериализаторXDTO.XMLТип(Тип).ИмяТипа, Истина); - КонецЦикла; - КонецЕсли; - - Для каждого Узел Из КорневойУзел.ДочерниеУзлы Цикл - ДобавитьТипККоду = Ложь; - - Если Узел.ЛокальноеИмя <> "complexType" Тогда - Продолжить; - КонецЕсли; - - Если Узел.ДочерниеУзлы.Количество() = 0 Тогда - Продолжить; - КонецЕсли; - - СодержимоеУзла = Узел.ДочерниеУзлы[0]; - - Если СодержимоеУзла.ЛокальноеИмя <> "sequence" Тогда - Продолжить; - КонецЕсли; - - Для каждого УзелПоля Из СодержимоеУзла.ДочерниеУзлы Цикл - Если УзелПоля.ЛокальноеИмя <> "element" Тогда - Продолжить; - КонецЕсли; - - АтрибутИмя = УзелПоля.Атрибуты.ПолучитьИменованныйЭлемент("name"); - Если ДобавитьТипККоду - И АтрибутИмя <> Неопределено И АтрибутИмя.ТекстовоеСодержимое = "Code" Тогда - УзелПоля.УстановитьАтрибут("nillable", "true"); - УзелПоля.УдалитьАтрибут("type"); - Продолжить; - КонецЕсли; - - АтрибутТип = УзелПоля.Атрибуты.ПолучитьИменованныйЭлемент("type"); - Если АтрибутТип <> Неопределено Тогда - Если Найти(АтрибутТип.ТекстовоеСодержимое, "tns:") = 1 Тогда - - ТипБезNSПрефикса = Сред(АтрибутТип.ТекстовоеСодержимое, СтрДлина("tns:") + 1); - - Если ТолькоУказанныеТипы Тогда - Если УказанныеТипы.Получить(ТипБезNSПрефикса) = Неопределено Тогда - Продолжить; - КонецЕсли; - Иначе - Пропустить = Ложь; - Для каждого ПрефиксТипа Из ИгнорироватьТипы Цикл - Если Найти(ТипБезNSПрефикса, ПрефиксТипа) = 1 Тогда - Пропустить = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - Если Пропустить Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - Если АтрибутИмя <> Неопределено И АтрибутИмя.ТекстовоеСодержимое = "Ref" Тогда - ДобавитьТипККоду = Истина; - КонецЕсли; - - УзелПоля.УстановитьАтрибут("nillable", "true"); - УзелПоля.УдалитьАтрибут("type"); - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЦикла; - - ЗаписьXML = Новый ЗаписьXML; - ИмяФайлаСхемы = ПолучитьИмяВременногоФайла("xsd"); - ЗаписьXML.ОткрытьФайл(ИмяФайлаСхемы); - ЗаписьDOM.Записать(Схема.ДокументDOM, ЗаписьXML); - ЗаписьXML.Закрыть(); - - Фабрика = СоздатьФабрикуXDTO(ИмяФайлаСхемы); - - Попытка - УдалитьФайлы(ИмяФайлаСхемы); - Исключение - - КонецПопытки; - - Возврат Фабрика; - -КонецФункции - -Процедура ЗаписатьПользователейВXML(КаталогВыгрузки, СохранятьПароли) - - Запись = Новый ЗаписьXML; - Запись.ОткрытьФайл(КаталогВыгрузки + "users.xml", - Новый ПараметрыЗаписиXML(,,,Истина)); - Запись.ЗаписатьОбъявлениеXML(); - - Запись.ЗаписатьНачалоЭлемента("Users"); - Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - Запись.ЗаписатьСоответствиеПространстваИмен("dd", "http://v8.1c.ru/misc/datadump/1.0.1.1"); - - Для каждого Пользователь Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл - ФабрикаXDTO.ЗаписатьXML(Запись, ЗаписатьПользователяВXDTO(Пользователь, СохранятьПароли)); - КонецЦикла; - - Запись.ЗаписатьКонецЭлемента(); - - Запись.Закрыть(); - -КонецПроцедуры - -Процедура ЗаписатьИнформациюОВыгрузкеВXML(КаталогВыгрузки, БезДеленияПоФайлам) - - Запись = Новый ЗаписьXML; - Запись.ОткрытьФайл(КаталогВыгрузки + "DumpInfo.xml", - Новый ПараметрыЗаписиXML(,,,Истина)); - Запись.ЗаписатьОбъявлениеXML(); - - Запись.ЗаписатьНачалоЭлемента("Info"); - Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - - ТипDumpInfo = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "DumpInfo"); - ТипConfigurationInfo = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "ConfigurationInfo"); - - ИнформацияОВыгрузке = ФабрикаXDTO.Создать(ТипDumpInfo); - Если БезДеленияПоФайлам Тогда - ИнформацияОВыгрузке.Type = "Solid"; - Иначе - ИнформацияОВыгрузке.Type = "Split"; - КонецЕсли; - ИнформацияОВыгрузке.Created = ТекущаяДатаСеанса(); - - ИнформацияОКонфигурации = ФабрикаXDTO.Создать(ТипConfigurationInfo); - ИнформацияОКонфигурации.Name = Метаданные.Имя; - ИнформацияОКонфигурации.Version = Метаданные.Версия; - ИнформацияОКонфигурации.Vendor = Метаданные.Поставщик; - ИнформацияОКонфигурации.Presentation = Метаданные.Представление(); - - ИнформацияОВыгрузке.Configuration = ИнформацияОКонфигурации; - - ФабрикаXDTO.ЗаписатьXML(Запись, ИнформацияОВыгрузке); - - Запись.ЗаписатьКонецЭлемента(); - - Запись.Закрыть(); - -КонецПроцедуры - -Функция ПолучитьМассивТиповТребующихПодменыСсылок() - - Типы = ПолучитьМассивТиповПоставляемыхСправочников(); - - Типы.Добавить(Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); - - Возврат Типы; - -КонецФункции - -Функция ПолучитьМассивТиповПоставляемыхСправочников() - - Типы = Новый Массив; - Для каждого ТипОбщихДанных Из ТипыОбщихДанных() Цикл - Если НЕ Справочники.ТипВсеСсылки().СодержитТип(ТипОбщихДанных) Тогда - Продолжить; - КонецЕсли; - Типы.Добавить(ТипОбщихДанных); - КонецЦикла; - - Возврат Типы; - -КонецФункции - -Функция ФорматНомеров(Знач Значение) - - Возврат Формат(Значение, "ЧЦ=4; ЧН=0000; ЧВН=; ЧГ="); - -КонецФункции - -Процедура ОткрытьЗаписьXML(ПараметрыЗаписи) - - ПараметрыЗаписи.Запись = Новый ЗаписьXML; - Если ПараметрыЗаписи.НомерЧасти = Неопределено Тогда - ПараметрыЗаписи.НомерЧасти = 1; - Иначе - ПараметрыЗаписи.НомерЧасти = ПараметрыЗаписи.НомерЧасти + 1; - КонецЕсли; - ПараметрыЗаписи.РазмерЧасти = 0; - - НомерЧастиСтрокой = ФорматНомеров(ПараметрыЗаписи.НомерЧасти); - ИмяФайлаВыгрузки = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ПараметрыЗаписи.ШаблонИмени, НомерЧастиСтрокой); - - ПараметрыЗаписи.Запись.ОткрытьФайл(ИмяФайлаВыгрузки); - ПараметрыЗаписи.Запись.ЗаписатьОбъявлениеXML(); - - ПараметрыЗаписи.Запись.ЗаписатьНачалоЭлемента("DataDumpPart"); - ПараметрыЗаписи.Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - ПараметрыЗаписи.Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - ПараметрыЗаписи.Запись.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - ПараметрыЗаписи.Запись.ЗаписатьСоответствиеПространстваИмен("ns2", "http://v8.1c.ru/8.1/data/enterprise"); - ПараметрыЗаписи.Запись.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); - - ПараметрыЗаписи.Запись.ЗаписатьНачалоЭлемента("Data"); - -КонецПроцедуры - -Процедура ЗакрытьЗаписьXML(ПараметрыЗаписи, ЕстьПродолжение = Ложь) - - ПараметрыЗаписи.Запись.ЗаписатьКонецЭлемента(); - - ПараметрыЗаписи.Запись.ЗаписатьНачалоЭлемента("PartInfo"); - ПараметрыЗаписи.Запись.ЗаписатьАтрибут("LastPart", XMLСтрока(НЕ ЕстьПродолжение)); - ПараметрыЗаписи.Запись.ЗаписатьКонецЭлемента(); - - ПараметрыЗаписи.Запись.ЗаписатьКонецЭлемента(); - - ПараметрыЗаписи.Запись.Закрыть(); - -КонецПроцедуры - -Процедура ЗаписатьВXML(Значение, МетаданныеЗначения, Размер, Сериализатор, ПараметрыЗаписи_ЗаменяемыеТипы, - ПараметрыЗаписи_ПрочиеДанные, ИменаМетаданныхЗаменяемыхТипов, МаксимальныйРазмерЧасти) - - Если ИменаМетаданныхЗаменяемыхТипов.Получить(МетаданныеЗначения.ПолноеИмя()) = Неопределено Тогда - ПараметрыЗаписи = ПараметрыЗаписи_ПрочиеДанные; - Иначе - ПараметрыЗаписи = ПараметрыЗаписи_ЗаменяемыеТипы; - КонецЕсли; - - Если ПараметрыЗаписи.РазмерЧасти >= МаксимальныйРазмерЧасти Тогда - ЗакрытьЗаписьXML(ПараметрыЗаписи, Истина); - ОткрытьЗаписьXML(ПараметрыЗаписи); - КонецЕсли; - - ПараметрыЗаписи.РазмерЧасти = ПараметрыЗаписи.РазмерЧасти + Размер; - - ПередВыгрузкойДанных(Значение); - Сериализатор.ЗаписатьXML(ПараметрыЗаписи.Запись, Значение); - -КонецПроцедуры - -Функция ОценитьРазмерОбъекта(МДОбъекта, Объект) - - Размер = 1; - Для каждого МДТабличнойЧасти Из МДОбъекта.ТабличныеЧасти Цикл - Размер = Размер + Объект[МДТабличнойЧасти.Имя].Количество(); - КонецЦикла; - - Возврат Размер; - -КонецФункции - -Функция ОценитьРазмерНабораЗаписей(МДНабора, Набор) - - Возврат Набор.Количество(); - -КонецФункции - -Процедура СортироватьВыгружаемыеДанные(Знач ВыгружаемыеДанные) - - Для каждого СтрокаОбъекта Из ВыгружаемыеДанные Цикл - ИмяОбъектаМетаданных = СтрокаОбъекта.ВыгружаемыйОбъект.ПолноеИмя; - - Если РаботаВМоделиСервиса.ЭтоПолноеИмяКонстанты(ИмяОбъектаМетаданных) Тогда - СтрокаОбъекта.Приоритет = 0; - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяОбъектаСсылочногоТипа(ИмяОбъектаМетаданных) Тогда - СтрокаОбъекта.Приоритет = 1; - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяРегистра(ИмяОбъектаМетаданных) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПоследовательности(ИмяОбъектаМетаданных) Тогда - СтрокаОбъекта.Приоритет = 2; - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяПерерасчета(ИмяОбъектаМетаданных) Тогда - СтрокаОбъекта.Приоритет = 3; - Иначе - ШаблонТекста = НСтр("ru = 'Выгрузка объекта метаданных не поддерживается %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекста, ИмяОбъектаМетаданных); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - - СтрокаОбъекта.Имя = СтрокаОбъекта.ВыгружаемыйОбъект.ПолноеИмя; - КонецЦикла; - - ВыгружаемыеДанные.Сортировать("Приоритет ВОЗР, Имя ВОЗР"); - -КонецПроцедуры - -Функция НоваяТаблицаПредопределенных() - - ОписаниеXDTO = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://v8.1c.ru/8.1/data/core", "TypeDescription")); - ОписаниеXDTO.TypeSet.Добавить(СериализаторXDTO.ЗаписатьXDTO(Новый РасширенноеИмяXML( - "http://v8.1c.ru/8.1/data/enterprise/current-config", - "AnyRef"))); - - Предопределенные = Новый ТаблицаЗначений; - Предопределенные.Колонки.Добавить("Ссылка", СериализаторXDTO.ПрочитатьXDTO(ОписаниеXDTO)); - Предопределенные.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(256, ДопустимаяДлина.Переменная))); - - Возврат Предопределенные; - -КонецФункции - -Процедура ЗаписатьДанныеВXMLСУказаниемТипов(КаталогВыгрузки, ТипыДляЗамены = Неопределено, МаксимальныйРазмерЧасти = 100000, - ВыгружатьСовместноРазделенныеСсылочныеОбъекты = Ложь) - - МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); - СоответствиеЗаменяемыхОбъектов = СоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(); - ИсключаемыеОбъекты = ПолучитьОбъектыМетаданныхИсключаемыеИзВыгрузкиЗагрузки(); - - ВыгружаемыеДанные = Новый ТаблицаЗначений; - ВыгружаемыеДанные.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный))); - ВыгружаемыеДанные.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная))); - ВыгружаемыеДанные.Колонки.Добавить("ВыгружаемыйОбъект"); - ВыгружаемыеДанные.Колонки.Добавить("ЭмулируемыйОбъект"); - - Для Каждого ЭлементМоделиДанных Из МодельДанных Цикл - - ИмяВыгружаемогоОбъекта = ЭлементМоделиДанных.Ключ; - ИмяЭмулируемогоОбъекта = Неопределено; - - Если РаботаВМоделиСервиса.ЭтоПолноеИмяЖурналаДокументов(ИмяВыгружаемогоОбъекта) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяРегламентногоЗадания(ИмяВыгружаемогоОбъекта) Тогда - - // Журналы документов и регламентные задания не требуется обрабатывать при выгрузке данных - Продолжить; - - КонецЕсли; - - ЭтоИсключаемыйОбъект = Ложь; - Для Каждого ИсключаемыйОбъект Из ИсключаемыеОбъекты Цикл - Если ИсключаемыйОбъект.ПолноеИмя() = ИмяВыгружаемогоОбъекта Тогда - ЭтоИсключаемыйОбъект = Истина; - Продолжить; - КонецЕсли; - КонецЦикла; - Если ЭтоИсключаемыйОбъект Тогда - Продолжить; - КонецЕсли; - - ЭмулируемыйОбъект = Неопределено; - Для Каждого ПравилоЭмуляции Из СоответствиеЗаменяемыхОбъектов Цикл - Если ПравилоЭмуляции.Ключ.ПолноеИмя() = ИмяВыгружаемогоОбъекта Тогда - ЭмулируемыйОбъект = ПравилоЭмуляции.Значение; - Продолжить; - КонецЕсли; - КонецЦикла; - - СтрокаОбъекта = ВыгружаемыеДанные.Добавить(); - - ОписаниеВыгружаемогоОбъекта = Новый Структура("ПолноеИмя,Имя,Разделитель,УсловноеРазделение", ИмяВыгружаемогоОбъекта); - ЗаполнитьЗначенияСвойств(ОписаниеВыгружаемогоОбъекта, ЭлементМоделиДанных.Значение); - СтрокаОбъекта.ВыгружаемыйОбъект = ОписаниеВыгружаемогоОбъекта; - - Если ЭмулируемыйОбъект <> Неопределено Тогда - - ОписаниеЭмулируемогоОбъекта = Новый Структура("ПолноеИмя,Имя", ЭмулируемыйОбъект.ПолноеИмя(), ЭмулируемыйОбъект.Имя); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - СтрокаОбъекта.ЭмулируемыйОбъект = ОписаниеЭмулируемогоОбъекта; - Иначе - СтрокаОбъекта.ВыгружаемыйОбъект = ОписаниеЭмулируемогоОбъекта; - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - ТипыОбщихДанныхСПредопределеннымиЭлементами = ТипыОбщихДанныхСПредопределеннымиЭлементами(); - Для Каждого ТипОбщихДанныхСПредопределеннымиЭлементами Из ТипыОбщихДанныхСПредопределеннымиЭлементами Цикл - - СтрокаОбъекта = ВыгружаемыеДанные.Добавить(); - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбщихДанныхСПредопределеннымиЭлементами); - ОписаниеВыгружаемогоОбъекта = Новый Структура("ПолноеИмя,Имя,Разделитель,УсловноеРазделение", - ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Имя); - СтрокаОбъекта.ВыгружаемыйОбъект = ОписаниеВыгружаемогоОбъекта; - - КонецЦикла; - НеразделенныеПредопределенные = НоваяТаблицаПредопределенных(); - НеразделенныеПредопределенные.Колонки.Добавить("ИмяТипаXML", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(256, ДопустимаяДлина.Переменная))); - - ИменаМетаданныхЗаменяемыхТипов = Новый Соответствие; - Если ТипыДляЗамены <> Неопределено ИЛИ ТипыОбщихДанныхСПредопределеннымиЭлементами.Количество() > 0 Тогда - - Для Каждого ТипДляЗамены Из ТипыДляЗамены Цикл - - ИменаМетаданныхЗаменяемыхТипов.Вставить(Метаданные.НайтиПоТипу(ТипДляЗамены).ПолноеИмя(), Истина); - - МетаданныеТипаДляЗамены = Метаданные.НайтиПоТипу(ТипДляЗамены); - - СтрокаОбъекта = ВыгружаемыеДанные.Найти(МетаданныеТипаДляЗамены.ПолноеИмя()); - Если СтрокаОбъекта = Неопределено Тогда - СтрокаОбъекта = ВыгружаемыеДанные.Добавить(); - ОписаниеВыгружаемогоОбъекта = Новый Структура( - "ПолноеИмя,Имя,Разделитель,УсловноеРазделение", - МетаданныеТипаДляЗамены.ПолноеИмя(), - МетаданныеТипаДляЗамены.Имя); - СтрокаОбъекта.ВыгружаемыйОбъект = ОписаниеВыгружаемогоОбъекта; - КонецЕсли; - - КонецЦикла; - - ТипыСАннотациейСсылок = Новый Массив(); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ТипыСАннотациейСсылок, ТипыДляЗамены); - ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ТипыСАннотациейСсылок, ТипыОбщихДанныхСПредопределеннымиЭлементами()); - - Фабрика = ПолучитьФабрикуСУказаниемТипов(ТипыСАннотациейСсылок); - Сериализатор = Новый СериализаторXDTO(Фабрика); - - Иначе - - Сериализатор = СериализаторXDTO; - - КонецЕсли; - - СортироватьВыгружаемыеДанные(ВыгружаемыеДанные); - - ТекущийРазмерЧасти = Неопределено; - ТекущийНомерЧасти = 0; - - ПараметрыЗаписи_ЗаменяемыеТипы = Новый Структура("Запись, РазмерЧасти, ШаблонИмени, НомерЧасти"); - ПараметрыЗаписи_ЗаменяемыеТипы.ШаблонИмени = КаталогВыгрузки + "data_common%1.xml"; - - ОткрытьЗаписьXML(ПараметрыЗаписи_ЗаменяемыеТипы); - - ПараметрыЗаписи_ПрочиеДанные = Новый Структура("Запись, РазмерЧасти, ШаблонИмени, НомерЧасти"); - ПараметрыЗаписи_ПрочиеДанные.ШаблонИмени = КаталогВыгрузки + "data_misc%1.xml"; - - ОткрытьЗаписьXML(ПараметрыЗаписи_ПрочиеДанные); - - // Выгрузка в XML всех данных, относящихся к области - - ФормироватьТаблицуПредопределенных = НЕ СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости(); - Если ФормироватьТаблицуПредопределенных Тогда - Предопределенные = НоваяТаблицаПредопределенных(); - КонецЕсли; - - Для Каждого СтрокаОбъекта Из ВыгружаемыеДанные Цикл - - ОписаниеВыгружаемогоОбъекта = СтрокаОбъекта.ВыгружаемыйОбъект; - ОписаниеЭмулируемогоОбъекта = СтрокаОбъекта.ЭмулируемыйОбъект; - - Если РаботаВМоделиСервиса.ЭтоПолноеИмяКонстанты(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) Тогда - - МенеджерЗначения = Константы[ОписаниеВыгружаемогоОбъекта.Имя].СоздатьМенеджерЗначения(); - МенеджерЗначения.Прочитать(); - - Если ОписаниеЭмулируемогоОбъекта <> Неопределено Тогда - - МенеджерЗначения = ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных( - МенеджерЗначения, - ОписаниеВыгружаемогоОбъекта, - ОписаниеЭмулируемогоОбъекта); - - КонецЕсли; - - ЗаписатьВXML(МенеджерЗначения, МенеджерЗначения.Метаданные(), 1, Сериализатор, ПараметрыЗаписи_ЗаменяемыеТипы, - ПараметрыЗаписи_ПрочиеДанные, ИменаМетаданныхЗаменяемыхТипов, МаксимальныйРазмерЧасти) - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяОбъектаСсылочногоТипа(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) Тогда - - ЭтоПланОбмена = РаботаВМоделиСервиса.ЭтоПолноеИмяПланаОбмена(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - Разделитель = ОписаниеВыгружаемогоОбъекта.Разделитель; - - Если (ЭтоПланОбмена ИЛИ Разделитель = ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) - И НЕ ВыгружатьСовместноРазделенныеСсылочныеОбъекты Тогда - Продолжить; - КонецЕсли; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | _XMLВыгрузка_Таблица.Ссылка КАК Ссылка - |ИЗ - | " + ОписаниеВыгружаемогоОбъекта.ПолноеИмя + " КАК _XMLВыгрузка_Таблица"; - - Если ЭтоПланОбмена Тогда - - Запрос.Текст = Запрос.Текст + " ГДЕ _XMLВыгрузка_Таблица.Ссылка <> &ЭтотУзел"; - Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена[ОписаниеВыгружаемогоОбъекта.Имя].ЭтотУзел()); - - КонецЕсли; - - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - - РезультатЗапроса = Запрос.Выполнить(); - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - - Объект = Выборка.Ссылка.ПолучитьОбъект(); - - Если ОписаниеЭмулируемогоОбъекта <> Неопределено Тогда - - Объект = ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных( - Объект, - ОписаниеВыгружаемогоОбъекта, - ОписаниеЭмулируемогоОбъекта); - - КонецЕсли; - - Если ФормироватьТаблицуПредопределенных - И (РаботаВМоделиСервиса.ЭтоПолноеИмяСправочника(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовХарактеристик(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаСчетов(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовРасчета(ОписаниеВыгружаемогоОбъекта.ПолноеИмя)) - И Объект.Предопределенный Тогда - - СтрокаПредопределенного = Предопределенные.Добавить(); - СтрокаПредопределенного.Ссылка = Объект.Ссылка; - СтрокаПредопределенного.Имя = Менеджер.ПолучитьИмяПредопределенного(СтрокаПредопределенного.Ссылка); - - КонецЕсли; - - Если ТипыОбщихДанныхСПредопределеннымиЭлементами.Найти(ТипЗнч(Выборка.Ссылка)) <> Неопределено - И Объект.Предопределенный Тогда - - СтрокаПредопределенного = НеразделенныеПредопределенные.Добавить(); - СтрокаПредопределенного.Ссылка = Объект.Ссылка; - СтрокаПредопределенного.Имя = Менеджер.ПолучитьИмяПредопределенного(СтрокаПредопределенного.Ссылка); - СтрокаПредопределенного.ИмяТипаXML = СериализаторXDTO.XMLТип(ТипЗнч(Объект.Ссылка)).ИмяТипа; - - КонецЕсли; - - Размер = ОценитьРазмерОбъекта(Объект.Метаданные(), Объект); - ЗаписатьВXML(Объект, Объект.Метаданные(), Размер, Сериализатор, ПараметрыЗаписи_ЗаменяемыеТипы, - ПараметрыЗаписи_ПрочиеДанные, ИменаМетаданныхЗаменяемыхТипов, МаксимальныйРазмерЧасти); - - КонецЦикла; - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяРегистра(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПоследовательности(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПерерасчета(ОписаниеВыгружаемогоОбъекта.ПолноеИмя) Тогда - - ЭтоРегистрСведений = РаботаВМоделиСервиса.ЭтоПолноеИмяРегистраСведений(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - Если ЭтоРегистрСведений Тогда - МетаданныеРегистра = Метаданные.РегистрыСведений.Найти(ОписаниеВыгружаемогоОбъекта.Имя); - ЭтоНезависимыйРегистрСведений = (МетаданныеРегистра.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый); - ЭтоПерерасчет = Ложь; - Иначе - ЭтоНезависимыйРегистрСведений = Ложь; - ЭтоПерерасчет = РаботаВМоделиСервиса.ЭтоПолноеИмяПерерасчета(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - КонецЕсли; - - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - - - Если ЭтоНезависимыйРегистрСведений Тогда - - НаборЗаписей = Менеджер.СоздатьНаборЗаписей(); - НаборЗаписей.Прочитать(); - - Если ОписаниеЭмулируемогоОбъекта <> Неопределено Тогда - - НаборЗаписей = ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных( - НаборЗаписей, - ОписаниеВыгружаемогоОбъекта, - ОписаниеЭмулируемогоОбъекта); - - КонецЕсли; - - Размер = ОценитьРазмерНабораЗаписей(НаборЗаписей.Метаданные(), НаборЗаписей); - ЗаписатьВXML(НаборЗаписей, НаборЗаписей.Метаданные(), Размер, Сериализатор, ПараметрыЗаписи_ЗаменяемыеТипы, - ПараметрыЗаписи_ПрочиеДанные, ИменаМетаданныхЗаменяемыхТипов, МаксимальныйРазмерЧасти); - - Иначе - - ПараметрыВыборки = РаботаВМоделиСервиса.ПараметрыВыборки(ОписаниеВыгружаемогоОбъекта.ПолноеИмя); - ИмяПоляРегистратор = ПараметрыВыборки.ИмяПоляРегистратор; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | _XMLВыгрузка_Таблица.Регистратор КАК Регистратор - |ИЗ - | " + ПараметрыВыборки.Таблица + " КАК _XMLВыгрузка_Таблица"; - - Если ИмяПоляРегистратор <> "Регистратор" Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "Регистратор", ИмяПоляРегистратор); - КонецЕсли; - - РезультатЗапроса = Запрос.Выполнить(); - Выборка = РезультатЗапроса.Выбрать(); - Пока Выборка.Следующий() Цикл - - НаборЗаписей = Менеджер.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор[ИмяПоляРегистратор].Установить(Выборка[ИмяПоляРегистратор]); - НаборЗаписей.Прочитать(); - - Если ОписаниеЭмулируемогоОбъекта <> Неопределено Тогда - - НаборЗаписей = ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных( - НаборЗаписей, - ОписаниеВыгружаемогоОбъекта, - ОписаниеЭмулируемогоОбъекта); - - КонецЕсли; - - Размер = ОценитьРазмерНабораЗаписей(НаборЗаписей.Метаданные(), НаборЗаписей); - ЗаписатьВXML(НаборЗаписей, НаборЗаписей.Метаданные(), Размер, Сериализатор, ПараметрыЗаписи_ЗаменяемыеТипы, - ПараметрыЗаписи_ПрочиеДанные, ИменаМетаданныхЗаменяемыхТипов, МаксимальныйРазмерЧасти); - - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - ЗакрытьЗаписьXML(ПараметрыЗаписи_ЗаменяемыеТипы); - ЗакрытьЗаписьXML(ПараметрыЗаписи_ПрочиеДанные); - - Если ФормироватьТаблицуПредопределенных Тогда - Запись = Новый ЗаписьXML; - Запись.ОткрытьФайл(КаталогВыгрузки + "PredefinedDataNames.xml"); - Запись.ЗаписатьОбъявлениеXML(); - Запись.ЗаписатьНачалоЭлемента("Data"); - Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns2", "http://v8.1c.ru/8.1/data/enterprise"); - Запись.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); - - Сериализатор.ЗаписатьXML(Запись, Предопределенные); - Запись.ЗаписатьКонецЭлемента(); - Запись.Закрыть(); - КонецЕсли; - - Если ТипыОбщихДанныхСПредопределеннымиЭлементами.Количество() > 0 Тогда - - Запись = Новый ЗаписьXML(); - - Запись.ОткрытьФайл(КаталогВыгрузки + "UnseparatedPredefinedDataNames.xml"); - Запись.ЗаписатьОбъявлениеXML(); - Запись.ЗаписатьНачалоЭлемента("Data"); - Запись.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema"); - Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns1", "http://v8.1c.ru/8.1/data/core"); - Запись.ЗаписатьСоответствиеПространстваИмен("ns2", "http://v8.1c.ru/8.1/data/enterprise"); - Запись.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/8.1/data/enterprise/current-config"); - - Сериализатор.ЗаписатьXML(Запись, НеразделенныеПредопределенные); - - Запись.ЗаписатьКонецЭлемента(); - Запись.Закрыть(); - - КонецЕсли; - -КонецПроцедуры - -// Возвращает таблицу с правилами замен -// -// Возвращаемое значение: -// ТаблицаЗначений с колонками -// ИмяТипаXML - строка, XMLТип(Тип).ИмяТипа -// Тип - Тип, возвращаемый вызовом ТипыОбщихДанных() из подмножества Справочники.ТипВсеСсылки() -// ОбщиеДанные - всегда Истина, не используется -// СоответствиеСсылок - Соответствие -// ОбратноеСоответствие - Соответствие -// ТекстЗапроса - строка запроса, возвращающего для текущего типа 3 колонки: -// Коды.Ссылка КАК ИсходнаяСсылка, -// Коды.Код КАК Код, -// ТаблицаСправочника.Ссылка КАК ОбщаяСсылка -// -Функция ПодготовитьСловарьЗамен() - - СловарьЗамен = Новый ТаблицаЗначений; - СловарьЗамен.Колонки.Добавить("ИмяТипаXML", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(255, ДопустимаяДлина.Переменная))); - СловарьЗамен.Колонки.Добавить("Тип", Новый ОписаниеТипов("Тип")); - СловарьЗамен.Колонки.Добавить("ОбщиеДанные", Новый ОписаниеТипов("Булево")); - СловарьЗамен.Колонки.Добавить("СоответствиеСсылок", Новый ОписаниеТипов("Соответствие")); - СловарьЗамен.Колонки.Добавить("ОбратноеСоответствие", Новый ОписаниеТипов("Соответствие")); - СловарьЗамен.Колонки.Добавить("ТекстЗапроса", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(0, ДопустимаяДлина.Переменная))); - СловарьЗамен.Колонки.Добавить("ОбщиеСсылки", Новый ОписаниеТипов("Массив")); - СловарьЗамен.Колонки.Добавить("СтандартнаяОбработка"); - - Для каждого ТипОбщихДанных Из ТипыОбщихДанных() Цикл - - Если НЕ Справочники.ТипВсеСсылки().СодержитТип(ТипОбщихДанных) Тогда - Продолжить; - КонецЕсли; - - ДобавитьТипЗамены(СловарьЗамен, ТипОбщихДанных); - - КонецЦикла; - - Возврат СловарьЗамен; - -КонецФункции - -Процедура ДобавитьТипЗамены(Знач СловарьЗамен, Знач ТипОбщихДанных) - - ОписаниеТипаЗамены = СловарьЗамен.Добавить(); - - ОписаниеТипаЗамены.ОбщиеДанные = Истина; - ОписаниеТипаЗамены.Тип = ТипОбщихДанных; - - ОписаниеТипаЗамены.ИмяТипаXML = СериализаторXDTO.XMLТип(ОписаниеТипаЗамены.Тип).ИмяТипа; - - МетаданныеТипа = Метаданные.НайтиПоТипу(ОписаниеТипаЗамены.Тип); - МетаданныеОбщегоТипа = Метаданные.НайтиПоТипу(ТипОбщихДанных); - - Если МетаданныеОбщегоТипа.Иерархический - И МетаданныеОбщегоТипа.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда - - УсловиеНаГруппы = Символы.ПС + Символы.Таб + Символы.Таб + "И Коды.ЭтоГруппа = ТаблицаСправочника.ЭтоГруппа"; - - Иначе - - УсловиеНаГруппы = ""; - - КонецЕсли; - - ОписаниеТипаЗамены.ТекстЗапроса = - "ВЫБРАТЬ - | Коды.Ссылка КАК ИсходнаяСсылка, - | Коды.Код КАК Код, - | ТаблицаСправочника.Ссылка КАК ОбщаяСсылка - |ИЗ - | Коды КАК Коды - | ЛЕВОЕ СОЕДИНЕНИЕ " + МетаданныеОбщегоТипа.ПолноеИмя() + " КАК ТаблицаСправочника - | ПО Коды.Код = ТаблицаСправочника.Код" + УсловиеНаГруппы + " - |ГДЕ - | Коды.Ссылка ССЫЛКА " + МетаданныеТипа.ПолноеИмя(); - -КонецПроцедуры - -// Возвращает пустую ТаблицуЗначений -// -// Возвращаемое значение: -// ТаблицаЗначений с колонками -// Тип -// СоответствиеСсылок -Функция ПодготовитьФрагментСловаряЗамен() - - Результат = Новый ТаблицаЗначений; - Результат.Колонки.Добавить("Тип", Новый ОписаниеТипов("Тип")); - Результат.Колонки.Добавить("СоответствиеСсылок", Новый ОписаниеТипов("Соответствие")); - Результат.Колонки.Добавить("СтандартнаяОбработка"); - - Возврат Результат; - -КонецФункции - -Процедура ДобавитьФрагментВСловарьЗамен(Знач СловарьЗамен, Знач Фрагмент) - - ПустойУИД = СериализаторXDTO.XMLСтрока(Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); - - Для каждого СтрокаФрагмента Из Фрагмент Цикл - СтрокаСловаря = СловарьЗамен.Найти(СтрокаФрагмента.Тип, "Тип"); - Если СтрокаСловаря = Неопределено Тогда - СтрокаСловаря = СловарьЗамен.Добавить(); - СтрокаСловаря.Тип = СтрокаФрагмента.Тип; - СтрокаСловаря.ИмяТипаXML = СериализаторXDTO.XMLТип(СтрокаСловаря.Тип).ИмяТипа; - СтрокаСловаря.ОбщиеДанные = Истина; - КонецЕсли; - - СтрокаСловаря.СоответствиеСсылок = СтрокаФрагмента.СоответствиеСсылок; - СтрокаСловаря.СтандартнаяОбработка = СтрокаФрагмента.СтандартнаяОбработка; - - СтрокаСловаря.ОбратноеСоответствие = Новый Соответствие; - СтрокаСловаря.ОбратноеСоответствие.Вставить(ПустойУИД, ПустойУИД); - - Для каждого КлючИЗначение Из СтрокаСловаря.СоответствиеСсылок Цикл - ИсходнаяСсылкаXML = СериализаторXDTO.XMLСтрока(КлючИЗначение.Значение); - НайденнаяСсылкаXML = СериализаторXDTO.XMLСтрока(КлючИЗначение.Ключ); - СтрокаСловаря.ОбратноеСоответствие.Вставить(ИсходнаяСсылкаXML, НайденнаяСсылкаXML); - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -Процедура ЗагрузитьДанныеСПодменойСсылок(Знач КаталогВыгрузки) - - СловарьЗамен = ПодготовитьСловарьЗамен(); - - // Заполняем подстановки для Справочник.ИдентификаторыОбъектовМетаданных - ФрагментСловаряЗамен = ПодготовитьФрагментСловаряЗамен(); - Справочники.ИдентификаторыОбъектовМетаданных.ДополнитьСловарьЗаменСсылокИдентификаторовТекущихИЗагружаемыхДанных(ФрагментСловаряЗамен, КаталогВыгрузки); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриФормированииСловаряЗаменПоКаталогуВыгрузки"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриФормированииСловаряЗаменПоКаталогуВыгрузки(ФрагментСловаряЗамен, КаталогВыгрузки); - КонецЦикла; - ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриФормированииСловаряЗаменПоКаталогуВыгрузки(ФрагментСловаряЗамен, КаталогВыгрузки); - - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - - // Дополняем словарь замен ссылками на неразделенные предопределенные - - ФайлСоответствия = Новый Файл(КаталогВыгрузки + "UnseparatedPredefinedDataNames.xml"); - - Если ФайлСоответствия.Существует() Тогда - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлСоответствия.ПолноеИмя); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Data" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Data.'")); - КонецЕсли; - - Чтение.Прочитать(); - - НеразделенныеПредопределенные = СериализаторXDTO.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Чтение = Неопределено; - - ТипыНеразделенныхПредопределенных = НеразделенныеПредопределенные.Скопировать(); - ТипыНеразделенныхПредопределенных.Свернуть("ИмяТипаXML"); - - НеразделенныеПредопределенные.Индексы.Добавить("ИмяТипаXML"); - - Для Каждого ТипНеразделенныхПредопределенных Из ТипыНеразделенныхПредопределенных Цикл - - НеразделенныеПредопределенныеТипа = НеразделенныеПредопределенные.НайтиСтроки( - Новый Структура("ИмяТипаXML", ТипНеразделенныхПредопределенных.ИмяТипаXML)); - - СоответствиеСсылок = Новый Соответствие(); - - Для Каждого НеразделенныйПредопределенный Из НеразделенныеПредопределенныеТипа Цикл - - ТекущийПредопределенный = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент( - НеразделенныйПредопределенный.Ссылка.Метаданные().ПолноеИмя() + "." + НеразделенныйПредопределенный.Имя); - - Если ТекущийПредопределенный <> Неопределено Тогда - - СоответствиеСсылок.Вставить( - ТекущийПредопределенный.УникальныйИдентификатор(), - НеразделенныйПредопределенный.Ссылка.УникальныйИдентификатор()); - - КонецЕсли; - - КонецЦикла; - - СтрокаФрагмента = ФрагментСловаряЗамен.Добавить(); - СтрокаФрагмента.Тип = ТипЗнч(НеразделенныеПредопределенныеТипа.Получить(0).Ссылка); - СтрокаФрагмента.СтандартнаяОбработка = Ложь; - СтрокаФрагмента.СоответствиеСсылок = СоответствиеСсылок; - - КонецЦикла; - - КонецЕсли; - - КонецЕсли; - - ДобавитьФрагментВСловарьЗамен(СловарьЗамен, ФрагментСловаряЗамен); - - ПустойУИД = СериализаторXDTO.XMLСтрока(Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); - - Коллизии = Новый ТаблицаЗначений; - Коллизии.Колонки.Добавить("ИсходнаяСсылка", Справочники.ТипВсеСсылки()); - Коллизии.Колонки.Добавить("Код", Новый ОписаниеТипов("Число, Строка", - Новый КвалификаторыЧисла(20, 0, ДопустимыйЗнак.Неотрицательный), Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная))); - Коллизии.Колонки.Добавить("НайденнаяСсылка", Справочники.ТипВсеСсылки()); - Коллизии.Индексы.Добавить("ИсходнаяСсылка, НайденнаяСсылка"); - - РазорванныеСсылки = Новый ТаблицаЗначений; - РазорванныеСсылки.Колонки.Добавить("ИсходнаяСсылка", Справочники.ТипВсеСсылки()); - РазорванныеСсылки.Колонки.Добавить("Код", Новый ОписаниеТипов("Число, Строка", - Новый КвалификаторыЧисла(20, 0, ДопустимыйЗнак.Неотрицательный), Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная))); - - ТекстЗапросаСозданияТаблицыКодов = - "ВЫБРАТЬ - | Коды.Ссылка КАК Ссылка, - | Коды.Код КАК Код, - | Коды.ЭтоГруппа КАК ЭтоГруппа - |ПОМЕСТИТЬ Коды - |ИЗ - | &ТаблицаКодов КАК Коды - | - |ИНДЕКСИРОВАТЬ ПО - | Ссылка"; - - ФайлыОбщихДанных = НайтиФайлы(КаталогВыгрузки, "data_common*.xml", Ложь); - Для каждого ФайлОбщихДанных Из ФайлыОбщихДанных Цикл - - // Дополнительные замены прикладных конфигураций - ФрагментСловаряЗамен = ПодготовитьФрагментСловаряЗамен(); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриДополненииСловаряЗаменПоОбщимДанным"); - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриДополненииСловаряЗаменПоОбщимДанным(ФрагментСловаряЗамен, ФайлОбщихДанных.ПолноеИмя); - КонецЦикла; - ВыгрузкаЗагрузкаДанныхПереопределяемый.ДополнитьСловарьЗаменПоОбщимДанным(ФрагментСловаряЗамен, ФайлОбщихДанных.ПолноеИмя); - - ДобавитьФрагментВСловарьЗамен(СловарьЗамен, ФрагментСловаряЗамен); - - ТаблицаКодов = ПолучитьТаблицуКодовОбщихДанных(ФайлОбщихДанных.ПолноеИмя); - - МенеджерВТ = Новый МенеджерВременныхТаблиц; - - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = МенеджерВТ; - Запрос.Текст = ТекстЗапросаСозданияТаблицыКодов; - Запрос.УстановитьПараметр("ТаблицаКодов", ТаблицаКодов); - Запрос.Выполнить(); - - Для каждого ОписаниеТипаЗамены Из СловарьЗамен Цикл - Если ПустаяСтрока(ОписаниеТипаЗамены.ТекстЗапроса) - ИЛИ ОписаниеТипаЗамены.СтандартнаяОбработка = Ложь - ИЛИ ОписаниеТипаЗамены.СоответствиеСсылок.Количество() > 0 Тогда - - Продолжить; - КонецЕсли; - - ОписаниеТипаЗамены.СоответствиеСсылок = Новый Соответствие; - - ОписаниеТипаЗамены.ОбратноеСоответствие = Новый Соответствие; - ОписаниеТипаЗамены.ОбратноеСоответствие.Вставить(ПустойУИД, ПустойУИД); - - СсылкиДляПодбора = Новый Массив; - - Запрос.Текст = ОписаниеТипаЗамены.ТекстЗапроса; - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - ИсходнаяСсылкаXML = СериализаторXDTO.XMLСтрока(Выборка.ИсходнаяСсылка.УникальныйИдентификатор()); - - Если Выборка.ОбщаяСсылка = NULL Тогда - СтрокаОшибки = РазорванныеСсылки.Добавить(); - СтрокаОшибки.ИсходнаяСсылка = Выборка.ИсходнаяСсылка; - СтрокаОшибки.Код = Выборка.Код; - - ОписаниеТипаЗамены.ОбратноеСоответствие.Вставить( - ИсходнаяСсылкаXML, ИсходнаяСсылкаXML); - Иначе - НайденнаяСсылкаXML = СериализаторXDTO.XMLСтрока(Выборка.ОбщаяСсылка.УникальныйИдентификатор()); - - СуществующееЗначение = ОписаниеТипаЗамены.СоответствиеСсылок.Получить(Выборка.ОбщаяСсылка); - Если СуществующееЗначение <> Неопределено Тогда - Если Коллизии.НайтиСтроки(Новый Структура("ИсходнаяСсылка, НайденнаяСсылка", - СуществующееЗначение, Выборка.ОбщаяСсылка)).Количество() = 0 Тогда - - Коллизия = Коллизии.Добавить(); - Коллизия.ИсходнаяСсылка = СуществующееЗначение; - Коллизия.Код = Выборка.Код; - Коллизия.НайденнаяСсылка = Выборка.ОбщаяСсылка; - КонецЕсли; - - Коллизия = Коллизии.Добавить(); - Коллизия.ИсходнаяСсылка = Выборка.ИсходнаяСсылка; - Коллизия.Код = Выборка.Код; - Коллизия.НайденнаяСсылка = Выборка.ОбщаяСсылка; - Иначе - ОписаниеТипаЗамены.СоответствиеСсылок.Вставить(Выборка.ОбщаяСсылка, Выборка.ИсходнаяСсылка); - ОписаниеТипаЗамены.ОбратноеСоответствие.Вставить(ИсходнаяСсылкаXML, НайденнаяСсылкаXML); - - ОписаниеТипаЗамены.ОбщиеСсылки.Добавить(Выборка.ОбщаяСсылка); - КонецЕсли; - КонецЕсли; - КонецЦикла; - - КонецЦикла; - - МаскаПоиска = "data_*.xml"; - ВсеФайлыДанных = НайтиФайлы(КаталогВыгрузки, МаскаПоиска, Ложь); - Для каждого ФайлДанных Из ВсеФайлыДанных Цикл - - // Замена ссылок - - Чтение = Новый ЧтениеТекста(ФайлДанных.ПолноеИмя); - ИмяОбработанногоФайла = ПолучитьИмяВременногоФайла(); - Запись = Новый ЗаписьТекста(ИмяОбработанногоФайла); - - // Константы для разбора текста - НачалоТипа = "xsi:type=""v8:"; - ДлинаНачалаТипа = СтрДлина(НачалоТипа); - КонецТипа = """>"; - ДлинаКонцаТипа = СтрДлина(КонецТипа); - - ИсходнаяСтрока = Чтение.ПрочитатьСтроку(); - Пока ИсходнаяСтрока <> Неопределено Цикл - - ОстатокСтроки = Неопределено; - - ТекущаяПозиция = 1; - ПозицияТипа = Найти(ИсходнаяСтрока, НачалоТипа); - Пока ПозицияТипа > 0 Цикл - - Запись.Записать(Сред(ИсходнаяСтрока, ТекущаяПозиция, ПозицияТипа - 1 + ДлинаНачалаТипа)); - - ТекущаяПозиция = ТекущаяПозиция + ПозицияТипа + ДлинаНачалаТипа; - - Если ОстатокСтроки = Неопределено Тогда - ОстатокСтроки = Сред(ИсходнаяСтрока, ПозицияТипа + ДлинаНачалаТипа); - Иначе - ОстатокСтроки = Сред(ОстатокСтроки, ПозицияТипа + ДлинаНачалаТипа); - КонецЕсли; - ПозицияТипа = Найти(ОстатокСтроки, НачалоТипа); - - ПозицияКонцаТипа = Найти(ОстатокСтроки, КонецТипа); - Если ПозицияКонцаТипа = 0 Тогда - Прервать; - КонецЕсли; - - ИмяТипа = Лев(ОстатокСтроки, ПозицияКонцаТипа - 1); - ОписаниеТипаЗамены = СловарьЗамен.Найти(ИмяТипа, "ИмяТипаXML"); - Если ОписаниеТипаЗамены = Неопределено Тогда - Продолжить; - КонецЕсли; - - Запись.Записать(ИмяТипа); - Запись.Записать(КонецТипа); - - ИсходнаяСсылкаXML = Сред(ОстатокСтроки, ПозицияКонцаТипа + ДлинаКонцаТипа, 36); - НайденнаяСсылкаXML = ОписаниеТипаЗамены.ОбратноеСоответствие.Получить(ИсходнаяСсылкаXML); - Если НайденнаяСсылкаXML = Неопределено Тогда - Запись.Записать(ИсходнаяСсылкаXML); - Иначе - Запись.Записать(НайденнаяСсылкаXML); - КонецЕсли; - - ТекущаяПозиция = ТекущаяПозиция + ПозицияКонцаТипа - 1 + ДлинаКонцаТипа + 36; - ОстатокСтроки = Сред(ОстатокСтроки, ПозицияКонцаТипа + ДлинаКонцаТипа + 36); - ПозицияТипа = Найти(ОстатокСтроки, НачалоТипа); - - КонецЦикла; - - Если ОстатокСтроки <> Неопределено Тогда - Запись.ЗаписатьСтроку(ОстатокСтроки); - Иначе - Запись.ЗаписатьСтроку(Сред(ИсходнаяСтрока, ТекущаяПозиция)); - КонецЕсли; - - ИсходнаяСтрока = Чтение.ПрочитатьСтроку(); - КонецЦикла; - - Чтение.Закрыть(); - - Запись.Закрыть(); - - УдалитьФайлы(ФайлДанных.ПолноеИмя); - ПереместитьФайл(ИмяОбработанногоФайла, ФайлДанных.ПолноеИмя); - - КонецЦикла; - - КонецЦикла; - - // Загрузка данных - ЗагрузитьДанныеЧерезXDTOСериализатор(КаталогВыгрузки); - -КонецПроцедуры - -Процедура ЗагрузитьДанныеЧерезXDTOСериализатор(Знач КаталогВыгрузки, Знач МаскаПоиска = Неопределено) - - МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); - СоответствиеЗаменяемыхОбъектов = СоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(); - ИсключаемыеОбъекты = ПолучитьОбъектыМетаданныхИсключаемыеИзВыгрузкиЗагрузки(); - - ЗагружаемыеДанные = Новый Соответствие(); - - Для Каждого ЭлементМоделиДанных Из МодельДанных Цикл - - ИмяЗагружаемогоОбъекта = ЭлементМоделиДанных.Ключ; - - ВыгруженныйОбъект = Неопределено; - Для Каждого ПравилоЭмуляции Из СоответствиеЗаменяемыхОбъектов Цикл - Если ПравилоЭмуляции.Ключ.ПолноеИмя() = ИмяЗагружаемогоОбъекта Тогда - - ВыгруженныйОбъект = ПравилоЭмуляции.Значение; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ЗагружаемыйОбъект = ПравилоЭмуляции.Ключ; - Иначе - ЗагружаемыйОбъект = ПравилоЭмуляции.Значение; - КонецЕсли; - - Прервать; - - КонецЕсли; - КонецЦикла; - - Если ВыгруженныйОбъект <> Неопределено Тогда - - ЭлементЗагружаемыхДанных = Новый Структура("ВыгружаемыйОбъект,ЗагружаемыйОбъект"); - ЭлементЗагружаемыхДанных.ВыгружаемыйОбъект = Новый Структура("ПолноеИмя,Имя", ВыгруженныйОбъект.ПолноеИмя(), ВыгруженныйОбъект.Имя); - ЭлементЗагружаемыхДанных.ЗагружаемыйОбъект = Новый Структура("ПолноеИмя,Имя", ЗагружаемыйОбъект.ПолноеИмя(), ЗагружаемыйОбъект.Имя); - - ЗагружаемыеДанные.Вставить( - ЭлементЗагружаемыхДанных.ВыгружаемыйОбъект.ПолноеИмя, - ЭлементЗагружаемыхДанных); - - КонецЕсли; - - КонецЦикла; - - ПланыОбменаКонфигурации = Новый Соответствие(); - Для каждого МетаданныеПланаОбмена Из Метаданные.ПланыОбмена Цикл - - Если МодельДанных.Получить(МетаданныеПланаОбмена.ПолноеИмя()) <> Неопределено Тогда - ПланыОбменаКонфигурации.Вставить(МетаданныеПланаОбмена, Истина); - КонецЕсли; - - КонецЦикла; - - Если МаскаПоиска = Неопределено Тогда - МаскаПоиска = "data_*.xml"; - КонецЕсли; - - ИспользоватьИменаПредопределенных = СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости(); - Если ИспользоватьИменаПредопределенных Тогда - ФайлСоответствия = Новый Файл(КаталогВыгрузки + "PredefinedDataNames.xml"); - Если ФайлСоответствия.Существует() Тогда - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлСоответствия.ПолноеИмя); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Data" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Data.'")); - КонецЕсли; - - Чтение.Прочитать(); - - Предопределенные = СериализаторXDTO.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Чтение = Неопределено; - - ЗагруженыИменаПредопределенных = Истина; - Иначе - Предопределенные = НоваяТаблицаПредопределенных(); - - ЗагруженыИменаПредопределенных = Ложь; - КонецЕсли; - КонецЕсли; - - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - - ВсеФайлыДанных = НайтиФайлы(КаталогВыгрузки, МаскаПоиска, Ложь); - - РежимОтладки = Ложь; - - Пока Истина Цикл - - Попытка - - Для каждого ФайлДанных Из ВсеФайлыДанных Цикл - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлДанных.ПолноеИмя); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "DataDumpPart" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента DataDumpPart.'")); - КонецЕсли; - - Если РежимОтладки Тогда - СоответствияПространствИмен = Чтение.КонтекстПространствИмен.СоответствияПространствИмен(); - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'")); - КонецЕсли; - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Data" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Data.'")); - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'")); - КонецЕсли; - - Пока Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл - Если НЕ СериализаторXDTO.ВозможностьЧтенияXML(Чтение) Тогда - ОшибкаОпределенияТипаПриЧтении(Чтение); - КонецЕсли; - - Если РежимОтладки Тогда - ЗаписьФрагмента = Новый ЗаписьXML; - ЗаписьФрагмента.УстановитьСтроку(); - - ИмяУзлаФрагмента = Чтение.Имя; - - КорневойУзел = Истина; - - Пока НЕ (Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента - И Чтение.Имя = ИмяУзлаФрагмента) Цикл - - ЗаписьФрагмента.ЗаписатьТекущий(Чтение); - - Если КорневойУзел Тогда - ПрефиксыФрагмента = ЗаписьФрагмента.КонтекстПространствИмен.СоответствияПространствИмен(); - Для каждого ПрефиксИПространство Из СоответствияПространствИмен Цикл - Если ПрефиксыФрагмента.Получить(ПрефиксИПространство.Ключ) = Неопределено Тогда - ЗаписьФрагмента.ЗаписатьСоответствиеПространстваИмен(ПрефиксИПространство.Ключ, ПрефиксИПространство.Значение); - КонецЕсли; - КонецЦикла; - КорневойУзел = Ложь; - КонецЕсли; - - Чтение.Прочитать(); - КонецЦикла; - ЗаписьФрагмента.ЗаписатьТекущий(Чтение); - Чтение.Прочитать(); - - Фрагмент = ЗаписьФрагмента.Закрыть(); - - ЧтениеФрагмента = Новый ЧтениеXML; - ЧтениеФрагмента.УстановитьСтроку(Фрагмент); - Попытка - Данные = СериализаторXDTO.ПрочитатьXML(ЧтениеФрагмента); - Исключение - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'ВыгрузкаЗагрузкаДанных.ОшибкаЧтенияXML'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 - | - |Фрагмент файла выгрузки, который не удается прочитать через СериализаторXDTO: - |%2'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), - Фрагмент)); - - ВызватьИсключение; - - КонецПопытки; - Иначе - Данные = СериализаторXDTO.ПрочитатьXML(Чтение); - КонецЕсли; - - // В платформе 8.3.2 и ниже не допускается наличие помеченных на удаление предопределенных элементов - Если Не ИспользоватьИменаПредопределенных И - (Метаданные.Справочники.Содержит(Данные.Метаданные()) Или - Метаданные.ПланыВидовХарактеристик.Содержит(Данные.Метаданные()) Или - Метаданные.ПланыСчетов.Содержит(Данные.Метаданные()) Или - Метаданные.ПланыВидовРасчета.Содержит(Данные.Метаданные())) - И Данные.Предопределенный И Данные.ПометкаУдаления Тогда - - Продолжить; - - КонецЕсли; - - МетаданныеЗагруженногоЗначения = Данные.Метаданные(); - - Если ИсключаемыеОбъекты.Найти(МетаданныеЗагруженногоЗначения) <> Неопределено Тогда - Продолжить; - КонецЕсли; - - ОписаниеЗагруженныхДанных = МодельДанных.Получить(МетаданныеЗагруженногоЗначения.ПолноеИмя()); - Если ОписаниеЗагруженныхДанных <> Неопределено Тогда - Разделитель = ОписаниеЗагруженныхДанных.Разделитель; - Иначе - Разделитель = Неопределено; - КонецЕсли; - - ПравилоПодменыОбъектовПриЗаписи = ЗагружаемыеДанные.Получить(МетаданныеЗагруженногоЗначения.ПолноеИмя()); - Если ПравилоПодменыОбъектовПриЗаписи <> Неопределено Тогда - - Данные = ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных( - Данные, - ПравилоПодменыОбъектовПриЗаписи.ВыгружаемыйОбъект, - ПравилоПодменыОбъектовПриЗаписи.ЗагружаемыйОбъект); - МетаданныеЗагруженногоЗначения = Данные.Метаданные(); - ОписаниеЗагруженныхДанных = МодельДанных.Получить(МетаданныеЗагруженногоЗначения.ПолноеИмя()); - Если ОписаниеЗагруженныхДанных <> Неопределено Тогда - Разделитель = ОписаниеЗагруженныхДанных.Разделитель; - Иначе - Разделитель = Неопределено; - КонецЕсли; - - Иначе - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И Разделитель = Неопределено Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - - ЭтоПланОбмена = (ПланыОбменаКонфигурации.Получить(МетаданныеЗагруженногоЗначения) <> Неопределено); - - Если ЭтоПланОбмена Или Разделитель = ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных() Тогда - - Если ОбщегоНазначения.ЭтоРегистр(МетаданныеЗагруженногоЗначения) Тогда - - Данные.Отбор[Разделитель].Установить(ОбластьДанных); - - Для Каждого ЗаписьНабораЗаписей Из Данные Цикл - - ЗаписьНабораЗаписей[Разделитель] = ОбластьДанных; - - КонецЦикла; - - - Иначе - - Данные[Разделитель] = ОбластьДанных; - - КонецЕсли; - - КонецЕсли; - - Если НЕ ЭтоПланОбмена Тогда - - Данные.ОбменДанными.Загрузка = Истина; - - Если ИспользоватьИменаПредопределенных Тогда - - Если РаботаВМоделиСервиса.ЭтоПолноеИмяСправочника(МетаданныеЗагруженногоЗначения.ПолноеИмя()) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовХарактеристик(МетаданныеЗагруженногоЗначения.ПолноеИмя()) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаСчетов(МетаданныеЗагруженногоЗначения.ПолноеИмя()) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовРасчета(МетаданныеЗагруженногоЗначения.ПолноеИмя()) Тогда - - Если ЗначениеЗаполнено(Данные.ИмяПредопределенныхДанных) И Данные.ЭтоНовый() Тогда - - Если ЗагруженыИменаПредопределенных Тогда - ВызватьИсключение(НСтр("ru = 'Некорректный формат выгрузки данных - существует файл соответствия имен предопределенных - |и установлено имя предопределенного в объекте.'")); - КонецЕсли; - - Если МетаданныеЗагруженногоЗначения["ОбновлениеПредопределенныхДанных"] <> - Метаданные.СвойстваОбъектов["ОбновлениеПредопределенныхДанных"]["НеОбновлятьАвтоматически"] Тогда - - СтрокаПредопределенного = Предопределенные.Добавить(); - СтрокаПредопределенного.Ссылка = Данные.ПолучитьСсылкуНового(); - СтрокаПредопределенного.Имя = Данные.ИмяПредопределенныхДанных; - - Данные.ИмяПредопределенныхДанных = ""; - - КонецЕсли; - - КонецЕсли; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - - ПередЗагрузкойДанных(Данные); - Данные.Записать(); - - КонецЦикла; - - КонецЦикла; - - Исключение - - Если НЕ РежимОтладки Тогда - - ТекстЖР = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При попытке загрузки данных из файла выгрузки произошла ошибка: - |%1 - |Будет предпринята попытка заргузить данные в режиме отладки'"), - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - - ЗаписьЖурналаРегистрации(НСтр("ru = 'ВыгрузкаЗагрузкаДанных.ОшибкаЧтенияXML'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ТекстЖР); - - РежимОтладки = Истина; - Продолжить; - - КонецЕсли; - - ВызватьИсключение; - КонецПопытки; - - Прервать; - - КонецЦикла; - - Если ИспользоватьИменаПредопределенных Тогда - - Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - Запрос.Текст = - "ВЫБРАТЬ - | Предопределенные.Ссылка КАК Ссылка, - | Предопределенные.Имя КАК Имя - |ПОМЕСТИТЬ Предопределенные - |ИЗ - | &Предопределенные КАК Предопределенные"; - Запрос.УстановитьПараметр("Предопределенные", Предопределенные); - Запрос.Выполнить(); - - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ТИПЗНАЧЕНИЯ(Предопределенные.Ссылка) КАК Тип - |ИЗ - | Предопределенные КАК Предопределенные"; - ВыборкаТипов = Запрос.Выполнить().Выбрать(); - - Пока ВыборкаТипов.Следующий() Цикл - - ИмяТаблицы = Метаданные.НайтиПоТипу(ВыборкаТипов.Тип).ПолноеИмя(); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - ЭтоНеразделенныйОбъект = Истина; - - Если ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТаблицы, ОбщегоНазначенияПовтИсп.РазделительОсновныхДанных()) Тогда - ЭтоНеразделенныйОбъект = Ложь; - КонецЕсли; - - Если ЭтоНеразделенныйОбъект И ОбщегоНазначенияПовтИсп.ЭтоРазделенныйОбъектМетаданных(ИмяТаблицы, ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда - ЭтоНеразделенныйОбъект = Ложь; - КонецЕсли; - - Если ЭтоНеразделенныйОбъект Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - - Запрос.Текст = - "ВЫБРАТЬ - | Таблица.Ссылка КАК Ссылка, - | Таблица.ИмяПредопределенныхДанных КАК Имя - |ИЗ - | " + ИмяТаблицы + " КАК Таблица - | - |ГДЕ - | Таблица.Предопределенный = ИСТИНА"; - - ВыборкаСуществующих = Запрос.Выполнить().Выбрать(); - - Запрос.Текст = - "ВЫБРАТЬ - | Предопределенные.Ссылка КАК Ссылка, - | Предопределенные.Имя КАК Имя - |ИЗ - | Предопределенные КАК Предопределенные - |ГДЕ - | ТИПЗНАЧЕНИЯ(Предопределенные.Ссылка) = &Тип"; - Запрос.УстановитьПараметр("Тип", ВыборкаТипов.Тип); - ТаблицаЗагруженных = Запрос.Выполнить().Выгрузить(); - ТаблицаЗагруженных.Индексы.Добавить("Имя"); - - Пока ВыборкаСуществующих.Следующий() Цикл - - СтрокаЗагруженной = ТаблицаЗагруженных.Найти(ВыборкаСуществующих.Имя, "Имя"); - Если СтрокаЗагруженной = Неопределено Тогда - // В файле выгрузки нет предопределенного с таким именем - Продолжить; - КонецЕсли; - - Если СтрокаЗагруженной.Ссылка = ВыборкаСуществующих.Ссылка Тогда - // В области уже есть предопределенный с такой же ссылкой - Продолжить; - КонецЕсли; - - Удаление = Новый УдалениеОбъекта(ВыборкаСуществующих.Ссылка); - Удаление.ОбменДанными.Загрузка = Истина; - Удаление.Записать(); - - Объект = СтрокаЗагруженной.Ссылка.ПолучитьОбъект(); - Объект.ИмяПредопределенныхДанных = ВыборкаСуществующих.Имя; - Объект.ОбменДанными.Загрузка = Истина; - Объект.Записать(); - - КонецЦикла; - - КонецЦикла; - - КонецЕсли; - -КонецПроцедуры - -Функция ПрочитатьТаблицуПользователей(Знач КаталогВыгрузки) - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(КаталогВыгрузки + "users.xml"); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Users" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Users.'")); - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'")); - КонецЕсли; - - ТипInfoBaseUser = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "InfoBaseUser"); - - ТаблицаПользователей = Новый ТаблицаЗначений; - ТаблицаПользователей.Колонки.Добавить("Пользователь"); - ТаблицаПользователей.Колонки.Добавить("Администратор", Новый ОписаниеТипов("Булево")); - ТаблицаПользователей.Колонки.Добавить("ПользовательXDTO"); - - Пока Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Цикл - ПользовательXDTO = ФабрикаXDTO.ПрочитатьXML(Чтение, ТипInfoBaseUser); - - Пользователь = ОбновитьПользователяИзXDTO(ПользовательXDTO); - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Пользователь.ПоказыватьВСпискеВыбора = Истина; - КонецЕсли; - - ОбработатьРолиПользователяПриЗагрузкеИзДругойМодели(Пользователь); - - СтрокаПользователя = ТаблицаПользователей.Добавить(); - СтрокаПользователя.Пользователь = Пользователь; - СтрокаПользователя.Администратор = Пользователь.Роли.Содержит(Метаданные.Роли.ПолныеПрава); - СтрокаПользователя.ПользовательXDTO = ПользовательXDTO; - КонецЦикла; - - Чтение.Закрыть(); - - Возврат ТаблицаПользователей; - -КонецФункции - -Функция СоздатьПользователейИзXML(Знач КаталогВыгрузки) - - ТаблицаПользователей = ПрочитатьТаблицуПользователей(КаталогВыгрузки); - - СоответствиеИдентификаторов = Новый Соответствие; - - ТаблицаПользователей.Сортировать("Администратор УБЫВ"); - Если ТаблицаПользователей.Количество() > 0 Тогда - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - И НЕ ТаблицаПользователей[0].Администратор Тогда - - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'В списке пользователей нет ни одного администратора. Загрузка списка пользователей не выполнена.'")); - Иначе - - Для каждого СтрокаПользователя Из ТаблицаПользователей Цикл - ПользователиСлужебный.ЗаписатьПользователяИнформационнойБазы(СтрокаПользователя.Пользователь); - СоответствиеИдентификаторов.Вставить(СтрокаПользователя.ПользовательXDTO.UUID, - СтрокаПользователя.Пользователь.УникальныйИдентификатор); - КонецЦикла; - КонецЕсли; - КонецЕсли; - - Возврат СоответствиеИдентификаторов; - -КонецФункции - -Функция ПолучитьТаблицуКодовОбщихДанных(Знач ИмяФайлаОбщихДанных) - - ИмяФайлыТаблицыКодов = ПолучитьИмяВременногоФайла("xml"); - - ЗаписьТаблицы = Новый ЗаписьXML; - ЗаписьТаблицы.ОткрытьФайл(ИмяФайлыТаблицыКодов); - - Преобразование = ОбщегоНазначенияПовтИсп.ПолучитьПреобразованиеXSLИзОбщегоМакета("ИзвлечениеКодовОбщихДанных"); - Преобразование.ПреобразоватьИзФайла(ИмяФайлаОбщихДанных, ЗаписьТаблицы); - - ЗаписьТаблицы.Закрыть(); - - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ИмяФайлыТаблицыКодов); - Чтение.ПерейтиКСодержимому(); - - Если Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента - ИЛИ Чтение.Имя <> "Data" Тогда - - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Неверный формат файла. Ожидается начало элемента Data.'")); - КонецЕсли; - - Если НЕ Чтение.Прочитать() Тогда - ВызватьИсключение(НСтр("ru = 'Ошибка чтения XML. Обнаружено завершение файла.'")); - КонецЕсли; - - ТаблицаКодов = СериализаторXDTO.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - - Попытка - УдалитьФайлы(ИмяФайлыТаблицыКодов); - Исключение - - КонецПопытки; - - Возврат ТаблицаКодов; - -КонецФункции - -Процедура ОбработатьРолиПользователяПриЗагрузкеИзДругойМодели(Пользователь) - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - // Удаление недоступных ролей. - НедоступныеРоли = ПользователиСлужебный.НедоступныеРолиПоТипуПользователей( - Перечисления.ТипыПользователей.ПользовательОбластиДанных); - - Для каждого КлючИЗначение Из НедоступныеРоли Цикл - Роль = Метаданные.Роли.Найти(КлючИЗначение.Ключ); - - Если Роль <> Неопределено - И Пользователь.Роли.Содержит(Роль) Тогда - - Пользователь.Роли.Удалить(Роль); - КонецЕсли; - КонецЦикла; - Иначе - // Добавление роли АдминистраторСистемы пользователю с ролью ПолныеПрава. - Если Пользователь.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда - Пользователь.Роли.Добавить(Метаданные.Роли.АдминистраторСистемы); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ОчиститьИдентификаторыПользователей(КаталогВыгрузки) - - ТаблицаПользователей = ПрочитатьТаблицуПользователей(КаталогВыгрузки); - - Идентификаторы = Новый Массив; - Для каждого СтрокаПользователя Из ТаблицаПользователей Цикл - Идентификаторы.Добавить(СтрокаПользователя.ПользовательXDTO.UUID); - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка, - | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяИБ В(&Идентификаторы)"; - Запрос.УстановитьПараметр("Идентификаторы", Идентификаторы); - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - ПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ПользовательОбъект.ОбменДанными.Загрузка = Истина; - ПользовательОбъект.ИдентификаторПользователяСервиса = Неопределено; - ПользовательОбъект.ИдентификаторПользователяИБ = Неопределено; - ПользовательОбъект.Записать(); - КонецЦикла; - -КонецПроцедуры - -Процедура ОбработатьПользователейПослеЗагрузкиИзДругойМодели(Знач СоответствиеИдентификаторов) - - СтарыеИдентификаторы = Новый Массив; - Для каждого КлючИЗначение Из СоответствиеИдентификаторов Цикл - СтарыеИдентификаторы.Добавить(КлючИЗначение.Ключ); - КонецЦикла; - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка, - | Пользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяИБ В(&СтарыеИдентификаторы)"; - Запрос.УстановитьПараметр("СтарыеИдентификаторы", СтарыеИдентификаторы); - Результат = Запрос.Выполнить(); - Выборка = Результат.Выбрать(); - Пока Выборка.Следующий() Цикл - ПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ПользовательОбъект.ОбменДанными.Загрузка = Истина; - ПользовательОбъект.ИдентификаторПользователяСервиса = Неопределено; - ПользовательОбъект.ИдентификаторПользователяИБ = СоответствиеИдентификаторов.Получить(Выборка.ИдентификаторПользователяИБ); - ПользовательОбъект.Записать(); - КонецЦикла; - -КонецПроцедуры - -Процедура ЗаписатьСобытиеВЖурнал(Знач Событие, - Знач Размер, - Знач Длительность) - - ДанныеСобытия = Новый Структура; - ДанныеСобытия.Вставить("Размер", Размер); - ДанныеСобытия.Вставить("Длительность", Длительность); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Выгрузка / загрузка областей'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()) + "." + Событие, - УровеньЖурналаРегистрации.Информация, - , - , - ОбщегоНазначения.ЗначениеВСтрокуXML(ДанныеСобытия)); - - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Запись / чтение пользователей ИБ в / из XML - -Функция ЗаписатьПользователяВXDTO(Знач Пользователь, Знач СохранятьПароль = Ложь, Знач СохранятьРазделение = Ложь) - - ТипInfoBaseUser = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "InfoBaseUser"); - ТипUserRoles = ФабрикаXDTO.Тип("http://v8.1c.ru/misc/datadump/1.0.1.1", "UserRoles"); - - ПользовательXDTO = ФабрикаXDTO.Создать(ТипInfoBaseUser); - ПользовательXDTO.OSAuthentication = Пользователь.АутентификацияОС; - ПользовательXDTO.StandardAuthentication = Пользователь.АутентификацияСтандартная; - ПользовательXDTO.CannotChangePassword = Пользователь.ЗапрещеноИзменятьПароль; - ПользовательXDTO.Name = Пользователь.Имя; - Если Пользователь.ОсновнойИнтерфейс <> Неопределено Тогда - ПользовательXDTO.DefaultInterface = Пользователь.ОсновнойИнтерфейс.Имя; - Иначе - ПользовательXDTO.DefaultInterface = ""; - КонецЕсли; - ПользовательXDTO.PasswordIsSet = Пользователь.ПарольУстановлен; - ПользовательXDTO.ShowInList = Пользователь.ПоказыватьВСпискеВыбора; - ПользовательXDTO.FullName = Пользователь.ПолноеИмя; - ПользовательXDTO.OSUser = Пользователь.ПользовательОС; - Если СохранятьРазделение Тогда - ПользовательXDTO.DataSeparation = СериализаторXDTO.ЗаписатьXDTO(Пользователь.РазделениеДанных); - Иначе - ПользовательXDTO.DataSeparation = Неопределено; - КонецЕсли; - ПользовательXDTO.RunMode = РежимЗапускаСтрокой(Пользователь.РежимЗапуска); - ПользовательXDTO.Roles = ФабрикаXDTO.Создать(ТипUserRoles); - Для каждого Роль Из Пользователь.Роли Цикл - ПользовательXDTO.Roles.Role.Добавить(Роль.Имя); - КонецЦикла; - Если СохранятьПароль Тогда - ПользовательXDTO.StoredPasswordValue = Пользователь.СохраняемоеЗначениеПароля; - Иначе - ПользовательXDTO.StoredPasswordValue = Неопределено; - КонецЕсли; - ПользовательXDTO.UUID = Пользователь.УникальныйИдентификатор; - Если Пользователь.Язык <> Неопределено Тогда - ПользовательXDTO.Language = Пользователь.Язык.Имя; - Иначе - ПользовательXDTO.Language = ""; - КонецЕсли; - - Возврат ПользовательXDTO; - -КонецФункции - -Функция ОбновитьПользователяИзXDTO(Знач ПользовательXDTO, Знач ВосстанавливатьПароль = Ложь, Знач ВосстанавливатьРазделение = Ложь) - - Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользовательXDTO.UUID); - Если Пользователь = Неопределено Тогда - Пользователь = ПользователиИнформационнойБазы.СоздатьПользователя(); - КонецЕсли; - - Пользователь.АутентификацияОС = ПользовательXDTO.OSAuthentication; - Пользователь.АутентификацияСтандартная = ПользовательXDTO.StandardAuthentication; - Пользователь.ЗапрещеноИзменятьПароль = ПользовательXDTO.CannotChangePassword; - Пользователь.Имя = ПользовательXDTO.Name; - Если ПустаяСтрока(ПользовательXDTO.DefaultInterface) Тогда - Пользователь.ОсновнойИнтерфейс = Неопределено; - Иначе - Пользователь.ОсновнойИнтерфейс = Метаданные.Интерфейсы.Найти(ПользовательXDTO.DefaultInterface); - КонецЕсли; - Пользователь.ПоказыватьВСпискеВыбора = ПользовательXDTO.ShowInList; - Пользователь.ПолноеИмя = ПользовательXDTO.FullName; - Пользователь.ПользовательОС = ПользовательXDTO.OSUser; - Если ВосстанавливатьРазделение Тогда - Если ПользовательXDTO.DataSeparation = Неопределено Тогда - Пользователь.РазделениеДанных = Новый Структура; - Иначе - Пользователь.РазделениеДанных = СериализаторXDTO.ПрочитатьXDTO(ПользовательXDTO.DataSeparation); - КонецЕсли; - Иначе - Пользователь.РазделениеДанных = Новый Структура; - КонецЕсли; - Пользователь.РежимЗапуска = РежимЗапускаКлиентскогоПриложения[ПользовательXDTO.RunMode]; - Пользователь.Роли.Очистить(); - Для каждого ИмяРоли Из ПользовательXDTO.Roles.Role Цикл - Роль = Метаданные.Роли.Найти(ИмяРоли); - Если Роль <> Неопределено Тогда - Пользователь.Роли.Добавить(Роль); - КонецЕсли; - КонецЦикла; - Если ВосстанавливатьПароль Тогда - Пользователь.СохраняемоеЗначениеПароля = ПользовательXDTO.StoredPasswordValue; - Иначе - Пользователь.СохраняемоеЗначениеПароля = ""; - КонецЕсли; - Если ПустаяСтрока(ПользовательXDTO.Language) Тогда - Пользователь.Язык = Неопределено; - Иначе - Пользователь.Язык = Метаданные.Языки[ПользовательXDTO.Language]; - КонецЕсли; - - Возврат Пользователь; - -КонецФункции - -Функция РежимЗапускаСтрокой(Знач РежимЗапуска) - - Если РежимЗапуска = Неопределено Тогда - Возврат ""; - ИначеЕсли РежимЗапуска = РежимЗапускаКлиентскогоПриложения.Авто Тогда - Возврат "Auto"; - ИначеЕсли РежимЗапуска = РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Тогда - Возврат "OrdinaryApplication"; - ИначеЕсли РежимЗапуска = РежимЗапускаКлиентскогоПриложения.УправляемоеПриложение Тогда - Возврат "ManagedApplication"; - Иначе - ШаблонСообщения = НСтр("ru = 'Неизвестный режим запуска клиентского приложения %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, РежимЗапуска); - ВызватьИсключение(ТекстСообщения); - КонецЕсли; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Работа с данными, для хранения которых в локальном режиме и модели сервиса -// используются разные объекты метаданных. - -// Только для внутреннего использования. -// -// ИсходныйОбъект: -// - Для констант - МенеджерЗначения; -// - Для значений ссылочного типа - Объект; -// - Для регистров - НаборЗаписей; -// -Функция ПодменаОбъектаМетаданныхПриВыгрузкеЗагрузкеДанных(Знач ИсходныйОбъект, Знач ОписаниеИсходногоОбъектаМетаданных, Знач ОписаниеЭмулируемогоОбъектаМетаданных) - - Если РаботаВМоделиСервиса.ЭтоПолноеИмяКонстанты(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя) Тогда - - ЗначениеКонстанты = ИсходныйОбъект.Значение; - МенеджерЗначения = Константы[ОписаниеЭмулируемогоОбъектаМетаданных.Имя].СоздатьМенеджерЗначения(); - МенеджерЗначения.Значение = ЗначениеКонстанты; - Возврат МенеджерЗначения; - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяОбъектаСсылочногоТипа(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя) Тогда - - ИсключенияЗаполненияСвойств = Новый Массив(); - Если РаботаВМоделиСервиса.ЭтоПолноеИмяСправочника(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - ЭмулируемыйОбъектМетаданных = Метаданные.Справочники.Найти(ОписаниеЭмулируемогоОбъектаМетаданных.Имя); - Если ЭмулируемыйОбъектМетаданных.Владельцы.Количество() = 0 Тогда - ИсключенияЗаполненияСвойств.Добавить("Владелец"); - КонецЕсли; - Если ЭмулируемыйОбъектМетаданных.Иерархический Тогда - ИсключенияЗаполненияСвойств.Добавить("Родитель"); - КонецЕсли; - КонецЕсли; - Если РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовХарактеристик(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - ЭмулируемыйОбъектМетаданных = Метаданные.ПланыВидовХарактеристик.Найти(ОписаниеЭмулируемогоОбъектаМетаданных.Имя); - Если Не ЭмулируемыйОбъектМетаданных.Иерархический Тогда - ИсключенияЗаполненияСвойств.Добавить("Родитель"); - КонецЕсли; - КонецЕсли; - - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя); - Если РаботаВМоделиСервиса.ЭтоПолноеИмяСправочника(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) ИЛИ - РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовХарактеристик(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя)Тогда - - Если ИсходныйОбъект.ЭтоГруппа Тогда - ПодменаОбъекта = Менеджер.СоздатьГруппу(); - Иначе - ПодменаОбъекта = Менеджер.СоздатьЭлемент(); - КонецЕсли; - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяДокумента(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьДокумент(); - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяБизнесПроцесса(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьБизнесПроцесс(); - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяЗадачи(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьЗадачу(); - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяПланаСчетов(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьСчет(); - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяПланаОбмена(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьУзел(); - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяПланаВидовРасчета(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя) Тогда - - ПодменаОбъекта = Менеджер.СоздатьВидРасчета(); - - КонецЕсли; - - ЗаполнитьЗначенияСвойств( - ПодменаОбъекта, ИсходныйОбъект, , - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок( - ИсключенияЗаполненияСвойств)); - - ИсходныйОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя); - ЭмулируемыйОбъектМетаданных = ПодменаОбъекта.Метаданные(); - - Для Каждого ПодменяемаяТабличнаяЧасть Из ЭмулируемыйОбъектМетаданных.ТабличныеЧасти Цикл - - ИсходнаяТабличнаяЧасть = ИсходныйОбъектМетаданных.ТабличныеЧасти.Найти(ПодменяемаяТабличнаяЧасть.Имя); - Если ИсходнаяТабличнаяЧасть <> Неопределено Тогда - - ПодменаОбъекта[ПодменяемаяТабличнаяЧасть.Имя].Загрузить( - ИсходныйОбъект[ПодменяемаяТабличнаяЧасть.Имя].Выгрузить()); - - КонецЕсли; - - КонецЦикла; - - Возврат ПодменаОбъекта; - - ИначеЕсли РаботаВМоделиСервиса.ЭтоПолноеИмяРегистра(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПоследовательности(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя) - ИЛИ РаботаВМоделиСервиса.ЭтоПолноеИмяПерерасчета(ОписаниеИсходногоОбъектаМетаданных.ПолноеИмя) Тогда - - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя); - ПодменяемыйНаборЗаписей = Менеджер.СоздатьНаборЗаписей(); - - ПараметрыВыборки = РаботаВМоделиСервиса.ПараметрыВыборки(ОписаниеЭмулируемогоОбъектаМетаданных.ПолноеИмя); - ИмяПоляРегистратор = ПараметрыВыборки.ИмяПоляРегистратор; - ОтборПоРегистратору = ИсходныйОбъект.Отбор.Найти(ИмяПоляРегистратор); - Если ОтборПоРегистратору <> Неопределено Тогда - ПодменяемыйНаборЗаписей.Отбор[ИмяПоляРегистратор].Установить(ОтборПоРегистратору.Значение); - КонецЕсли; - - ПодменяемыйНаборЗаписей.Загрузить(ИсходныйОбъект.Выгрузить()); - - Возврат ПодменяемыйНаборЗаписей; - - Иначе - - ВызватьИсключение НСтр("ru = 'Неожиданный объект метаданных!'"); - - КонецЕсли; - -КонецФункции - -// Возвращает соответствие объектов метаданных, используемых в локальном режиме и в модели сервиса. -// -// Возвращаемое значение: ФиксированноеСоответствие: -// Ключ - ОбъектМетаданных, объект метаданных, используемый в модели сервиса. -// Значение - ОбъектМетаданных, объект метаданных, используемый в локальном режиме, -// -Функция СоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса() - - Результат = Новый Соответствие(); - - ТаблицаСоответствия = ЗаполнитьСоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(); - Для Каждого ЭлементТаблицыСоответствия Из ТаблицаСоответствия Цикл - Результат.Вставить(ЭлементТаблицыСоответствия.ОбъектВМоделиСервиса, ЭлементТаблицыСоответствия.ОбъектВЛокальномРежиме); - КонецЦикла; - - Возврат Новый ФиксированноеСоответствие(Результат); - -КонецФункции - -// Возвращает таблицу соответствия объектов метаданных, используемых в локальном режиме и в модели сервиса. -// -// Возвращаемое значение: ТаблицаЗначений, колонки: -// ОбъектВЛокальномРежиме - ОбъектМетаданных, объект метаданных, используемый в локальном режиме, -// ОбъектВМоделиСервиса - ОбъектМетаданных, объект метаданных, используемый в модели сервиса. -// -Функция ЗаполнитьСоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса() - - Результат = Новый ТаблицаЗначений(); - Результат.Колонки.Добавить("ОбъектВЛокальномРежиме", Новый ОписаниеТипов("ОбъектМетаданных")); - Результат.Колонки.Добавить("ОбъектВМоделиСервиса", Новый ОписаниеТипов("ОбъектМетаданных")); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(Результат); - КонецЦикла; - - ВыгрузкаЗагрузкаДанныхПереопределяемый.ЗаполнитьСоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(Результат); - - Возврат Результат; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Работа с метаданными, которые не переносятся между моделями при выгрузке / загрузке данных. - -// Возвращает объекты метаданных, которые не должны переноситься между моделями при -// выгрузке / загрузке данных. -// -// Возвращаемое значение: Массив(ОбъектМетаданных). -// -Функция ПолучитьОбъектыМетаданныхИсключаемыеИзВыгрузкиЗагрузки() - - Результат = Новый Массив(); - - ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Результат); - КонецЦикла; - - ВыгрузкаЗагрузкаДанныхПереопределяемый.ЗаполнитьОбъектыМетаданныхИсключаемыеИзВыгрузкиЗагрузки(Результат); - - Возврат Результат; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы - -// Обработчик, вызываемый для данных перед их записью в файл при выгрузке областей. -// -// Параметры: -// ЭлементДанных - КонстантаМенеджер.<Имя>; СправочникОбъект.<Имя>; Регистр<Вид>НаборЗаписей.<Имя>. -// -Процедура ПередВыгрузкойДанных(ЭлементДанных) - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - ОтправкаЭлемента = ОтправкаЭлементаДанных.Авто; - МодульРаботаСФайламиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента); - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - ОтправкаЭлемента = ОтправкаЭлементаДанных.Авто; - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента); - КонецЕсли; - -КонецПроцедуры - -// Обработчик, вызываемый для считанных из файла данных перед их записью в ИБ при загрузке областей. -// -// Параметры: -// ЭлементДанных - КонстантаМенеджер.<Имя>; СправочникОбъект.<Имя>; Регистр<Вид>НаборЗаписей.<Имя>. -// -Процедура ПередЗагрузкойДанных(ЭлементДанных) - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - ПолучениеЭлемента = ПолучениеЭлементаДанных.Авто; - МодульРаботаСФайламиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - ПолучениеЭлемента = ПолучениеЭлементаДанных.Авто; - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); - МодульПрисоединенныеФайлыСлужебный.ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента); - КонецЕсли; - -КонецПроцедуры diff --git a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/Module.bsl b/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/Module.bsl deleted file mode 100644 index d91573cc1..000000000 --- a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/Module.bsl +++ /dev/null @@ -1,96 +0,0 @@ -/////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ВыгрузкаЗагрузкаДанныхПереопределяемый: обработка событий выгрузки и загрузки данных в области. -// -/////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Обработчик, вызываемый перед стандартным формирования словаря замен -// по очередному файлу общих данных. -// -// Параметры -// СловарьЗамен - таблица значений, колонки: -// Тип - Тип - Тип значения заменяемой ссылки -// СоответствиеСсылок - Соответствие - соответствие новой ссылки исходной -// Ключ - Идентификатор новой ссылки (на которую требуется заменить) -// Значение - Идентификатор исходной ссылки (требующая замены) -// СтандартнаяОбработка - Булево, Неопределено - выполнять стандартную замену ссылок -// Неопределено - замена будет выполняться если СоответствиеСсылок не содержит записей -// ИмяФайлаОбщихДанных - Строка - имя текущего обрабатываемого файла выгрузки -// общих данных -// -Процедура ДополнитьСловарьЗаменПоОбщимДанным(Знач СловарьЗамен, Знач ИмяФайлаОбщихДанных) Экспорт - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных. Он используется при обновлении ссылок -// при загрузке-выгрузке конфигурации -// -// Параметры: -// МассивТипов - массив -// -Процедура ТипыОбщихДанных(МассивТипов) Экспорт - - - -КонецПроцедуры - -// Заполняет массив типов неразделенных данных, всегда содержащих только предопределенные элементы. -// Он используется при обновлении ссылок при загрузке-выгрузке данных. -// -// Параметры: -// МассивТипов - массив -// -Процедура ТипыОбщихПредопределенныхДанных(МассивТипов) Экспорт - - - -КонецПроцедуры - -// Заполняет соответствие типов метаданных, используемых в локальном режиме и в модели сервиса. -// -// Параметры: -// ТаблицаСоответствия - ТаблицаЗначений, колонки: -// ОбъектВЛокальномРежиме - ОбъектМетаданных, объект метаданных, используемый в локальном режиме, -// ОбъектВМоделиСервиса - ОбъектМетаданных, объект метаданных, используемый в модели сервиса. -// -Процедура ЗаполнитьСоответствиеОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(ТаблицаСоответствия) Экспорт - -КонецПроцедуры - -// Вызывается при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. -// -// Параметры -// Объекты - Массив(ОбъектМетаданных). -// -Процедура ЗаполнитьОбъектыМетаданныхИсключаемыеИзВыгрузкиЗагрузки(Объекты) Экспорт - -КонецПроцедуры - -// Обработчик, вызываемый после выгрузки области в файлы. -// -// Параметры -// КаталогВыгрузки - Строка - имя каталога с файлами выгрузки области. В каталог можно поместить -// дополнительные файлы, они будут доступны в некоторых событиях загрузки. -// -Процедура ПослеВыгрузкиОбласти(Знач КаталогВыгрузки) Экспорт - -КонецПроцедуры - -// Обработчик, вызываемый при окончании стандартного формирования словаря замен -// по очередному файлу общих данных. -// -// Параметры -// СловарьЗамен - таблица значений, колонки: -// Тип - Тип - Тип значения заменяемой ссылки -// СоответствиеСсылок - Соответствие - соответствие новой ссылки исходной -// Ключ - Идентификатор новой ссылки (на которую требуется заменить) -// Значение - Идентификатор исходной ссылки (требующая замены) -// СтандартнаяОбработка - Булево, Неопределено - выполнять стандартную замену ссылок -// Неопределено - замена будет выполняться если СоответствиеСсылок не содержит записей -// КаталогВыгрузки - Строка - имя каталога с файлами выгрузки области -// -Процедура ПриФормированииСловаряЗаменПоКаталогуВыгрузки(Знач СловарьЗамен, Знач КаталогВыгрузки) Экспорт - -КонецПроцедуры diff --git a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/ВыгрузкаЗагрузкаДанныхПереопределяемый.mdo b/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/ВыгрузкаЗагрузкаДанныхПереопределяемый.mdo deleted file mode 100644 index 9a8aab78b..000000000 --- a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанныхПереопределяемый/ВыгрузкаЗагрузкаДанныхПереопределяемый.mdo +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a7f1af69-f0f1-4c24-bf4f-b8dc15f4dec2"> - <name>ВыгрузкаЗагрузкаДанныхПереопределяемый</name> - <synonym> - <key>ru</key> - <value>Выгрузка загрузка данных переопределяемый</value> - </synonym> - <server>true</server> - <externalConnection>true</externalConnection> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl new file mode 100644 index 000000000..ed5ad1a55 --- /dev/null +++ b/SSL/src/CommonModules/ГрафикиРаботы/Module.bsl @@ -0,0 +1,637 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Графики работы" +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Функция возвращает массив дат, которые отличается указанной даты на количество дней, +// входящих в указанный график +// +// Параметры +// ГрафикРаботы - график , который необходимо использовать, тип СправочникСсылка.Календари +// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата +// МассивДней - массив с количеством дней, на которые нужно увеличить дату начала, тип Массив,Число +// РассчитыватьСледующуюДатуОтПредыдущей - нужно ли рассчитывать следующую дату от предыдущей или +// все даты рассчитываются от переданной даты +// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика +// +// Возвращаемое значение +// Массив - массив дат, увеличенных на количество дней, входящих в график, +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено +// +Функция ДатыПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + КалендарныеГрафики.СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей); + + // Алгоритм работает следующим образом: + // Получаем количество включенных в график дней на дату отсчета + // Для всех последующих годов получаем "смещение" количества дней в виде суммы количества дней предыдущих годов + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Запрос.Текст = + "ВЫБРАТЬ + | КалендарныеГрафики.Год, + | МАКСИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК ДнейВГрафике + |ПОМЕСТИТЬ ВТКоличествоДнейВГрафикеПоГодам + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.ДатаГрафика >= &ДатаОт + | И КалендарныеГрафики.Календарь = &ГрафикРаботы + | И КалендарныеГрафики.ДеньВключенВГрафик + | + |СГРУППИРОВАТЬ ПО + | КалендарныеГрафики.Год + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КоличествоДнейВГрафикеПоГодам.Год, + | СУММА(ЕСТЬNULL(КоличествоДнейПредыдущихГодов.ДнейВГрафике, 0)) КАК ДнейВГрафике + |ПОМЕСТИТЬ ВТКоличествоДнейСУчетомПредыдущихГодов + |ИЗ + | ВТКоличествоДнейВГрафикеПоГодам КАК КоличествоДнейВГрафикеПоГодам + | ЛЕВОЕ СОЕДИНЕНИЕ ВТКоличествоДнейВГрафикеПоГодам КАК КоличествоДнейПредыдущихГодов + | ПО (КоличествоДнейПредыдущихГодов.Год < КоличествоДнейВГрафикеПоГодам.Год) + | + |СГРУППИРОВАТЬ ПО + | КоличествоДнейВГрафикеПоГодам.Год + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | МИНИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК КоличествоДнейВГрафикеСНачалаГода + |ПОМЕСТИТЬ ВТКоличествоДнейВГрафикеНаДатуОтсчета + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.ДатаГрафика >= &ДатаОт + | И КалендарныеГрафики.Год = ГОД(&ДатаОт) + | И КалендарныеГрафики.Календарь = &ГрафикРаботы + | И КалендарныеГрафики.ДеньВключенВГрафик + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПриращениеДней.ИндексСтроки, + | ЕСТЬNULL(КалендарныеГрафики.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю + |ИЗ + | ВТПриращениеДней КАК ПриращениеДней + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКоличествоДнейВГрафикеНаДатуОтсчета КАК КоличествоДнейВГрафикеНаДатуОтсчета + | ПО (ИСТИНА) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКоличествоДнейСУчетомПредыдущихГодов КАК КоличествоДнейСУчетомПредыдущихГодов + | ПО (КоличествоДнейСУчетомПредыдущихГодов.Год = КалендарныеГрафики.Год) + | ПО (КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеНаДатуОтсчета.КоличествоДнейВГрафикеСНачалаГода - КоличествоДнейСУчетомПредыдущихГодов.ДнейВГрафике + ПриращениеДней.КоличествоДней) + | И (КалендарныеГрафики.ДатаГрафика >= &ДатаОт) + | И (КалендарныеГрафики.Календарь = &ГрафикРаботы) + | И (КалендарныеГрафики.ДеньВключенВГрафик) + | + |УПОРЯДОЧИТЬ ПО + | ПриращениеДней.ИндексСтроки"; + + Запрос.УстановитьПараметр("ДатаОт", НачалоДня(ДатаОт)); + Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы); + + Выборка = Запрос.Выполнить().Выбрать(); + + МассивДат = Новый Массив; + + Пока Выборка.Следующий() Цикл + Если Выборка.ДатаПоКалендарю = Неопределено Тогда + СообщениеОбОшибке = НСтр("ru = 'График работы «%1» не заполнен с даты %2 на указанное количество рабочих дней.'"); + Если ВызыватьИсключение Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + СообщениеОбОшибке, + ГрафикРаботы, Формат(ДатаОт, "ДЛФ=D")); + Иначе + Возврат Неопределено; + КонецЕсли; + КонецЕсли; + + МассивДат.Добавить(Выборка.ДатаПоКалендарю); + КонецЦикла; + + Возврат МассивДат; + +КонецФункции + +// Функция возвращает дату, которая отличается указанной даты на количество дней, +// входящих в указанный график +// +// Параметры +// ГрафикРаботы - график, который необходимо использовать, тип СправочникСсылка.Календари +// ДатаОт - дата, от которой нужно рассчитать количество дней, тип Дата +// КоличествоДней - количество дней, на которые нужно увеличить дату начала, тип Число +// ВызыватьИсключение - булево, если Истина вызывается исключение в случае незаполненного графика +// +// Возвращаемое значение +// Дата - дата, увеличенная на количество дней, входящих в график +// Если выбранный график не заполнен, и ВызыватьИсключение = Ложь, возвращается Неопределено +// +Функция ДатаПоГрафику(Знач ГрафикРаботы, Знач ДатаОт, Знач КоличествоДней, ВызыватьИсключение = Истина) Экспорт + + ДатаОт = НачалоДня(ДатаОт); + + Если КоличествоДней = 0 Тогда + Возврат ДатаОт; + КонецЕсли; + + МассивДней = Новый Массив; + МассивДней.Добавить(КоличествоДней); + + МассивДат = ДатыПоГрафику(ГрафикРаботы, ДатаОт, МассивДней, , ВызыватьИсключение); + + Возврат ?(МассивДат <> Неопределено, МассивДат[0], Неопределено); + +КонецФункции + +// Составляет расписания работы для дат, включенных в указанные графики на указанный период. +// Если расписание на предпраздничный день не задано, то оно определяется так, как если бы этот день был бы рабочим. +// +// Параметры +// Графики - массив элементов типа СправочникСсылка.Календари +// ДатаНачала - дата начала периода, за который нужно составить расписания +// ДатаОкончания - дата окончания периода +// +// Возвращаемое значение - таблица значений с колонками +// ГрафикРаботы +// ДатаГрафика +// ВремяНачала +// ВремяОкончания +// +Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + // Создаем временную таблицу расписаний + СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания); + + ТекстЗапроса = + "ВЫБРАТЬ + | РасписанияРаботы.ГрафикРаботы, + | РасписанияРаботы.ДатаГрафика, + | РасписанияРаботы.ВремяНачала, + | РасписанияРаботы.ВремяОкончания + |ИЗ + | ВТРасписанияРаботы КАК РасписанияРаботы"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Возврат Запрос.Выполнить().Выгрузить(); + +КонецФункции + +// Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками +// Подробнее см. комментарий к функции РасписанияРаботыНаПериод +// +Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | ШаблонЗаполнения.Ссылка КАК ГрафикРаботы, + | МАКСИМУМ(ШаблонЗаполнения.НомерСтроки) КАК ДлинаЦикла + |ПОМЕСТИТЬ ВТДлинаЦиклаГрафиков + |ИЗ + | Справочник.Календари.ШаблонЗаполнения КАК ШаблонЗаполнения + |ГДЕ + | ШаблонЗаполнения.Ссылка В(&Календари) + | + |СГРУППИРОВАТЬ ПО + | ШаблонЗаполнения.Ссылка + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | Календари.Ссылка КАК ГрафикРаботы, + | ДанныеПроизводственногоКалендаря.Дата КАК ДатаГрафика + |ПОМЕСТИТЬ ВТПредпраздничныеДни + |ИЗ + | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари + | ПО ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = Календари.ПроизводственныйКалендарь + | И (Календари.Ссылка В (&Календари)) + |ГДЕ + | ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания + | И ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КалендарныеГрафики.Календарь КАК ГрафикРаботы, + | КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика, + | РАЗНОСТЬДАТ(Календари.ДатаОтсчета, КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1 КАК ДнейОтДатыОтсчета, + | ВЫБОР + | КОГДА ПредпраздничныеДни.ДатаГрафика ЕСТЬ НЕ NULL + | ТОГДА ИСТИНА + | ИНАЧЕ ЛОЖЬ + | КОНЕЦ КАК ПредпраздничныйДень + |ПОМЕСТИТЬ ВТДниВключенныеВГрафик + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари + | ПО КалендарныеГрафики.Календарь = Календари.Ссылка + | И (КалендарныеГрафики.Календарь В (&Календари)) + | И (КалендарныеГрафики.ДатаГрафика МЕЖДУ &ДатаНачала И &ДатаОкончания) + | И (КалендарныеГрафики.ДеньВключенВГрафик) + | ЛЕВОЕ СОЕДИНЕНИЕ ВТПредпраздничныеДни КАК ПредпраздничныеДни + | ПО (ПредпраздничныеДни.ГрафикРаботы = КалендарныеГрафики.Календарь) + | И (ПредпраздничныеДни.ДатаГрафика = КалендарныеГрафики.ДатаГрафика) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ДниВключенныеВГрафик.ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика, + | ВЫБОР + | КОГДА ДниВключенныеВГрафик.РезультатДеленияПоМодулю = 0 + | ТОГДА ДниВключенныеВГрафик.ДлинаЦикла + | ИНАЧЕ ДниВключенныеВГрафик.РезультатДеленияПоМодулю + | КОНЕЦ КАК НомерДня, + | ДниВключенныеВГрафик.ПредпраздничныйДень + |ПОМЕСТИТЬ ВТДатыНомераДней + |ИЗ + | (ВЫБРАТЬ + | ДниВключенныеВГрафик.ГрафикРаботы КАК ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика КАК ДатаГрафика, + | ДниВключенныеВГрафик.ПредпраздничныйДень КАК ПредпраздничныйДень, + | ДниВключенныеВГрафик.ДлинаЦикла КАК ДлинаЦикла, + | ДниВключенныеВГрафик.ДнейОтДатыОтсчета - ДниВключенныеВГрафик.ЦелаяЧастьРезультатаДеления * ДниВключенныеВГрафик.ДлинаЦикла КАК РезультатДеленияПоМодулю + | ИЗ + | (ВЫБРАТЬ + | ДниВключенныеВГрафик.ГрафикРаботы КАК ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика КАК ДатаГрафика, + | ДниВключенныеВГрафик.ПредпраздничныйДень КАК ПредпраздничныйДень, + | ДниВключенныеВГрафик.ДнейОтДатыОтсчета КАК ДнейОтДатыОтсчета, + | ДлинаЦиклов.ДлинаЦикла КАК ДлинаЦикла, + | (ВЫРАЗИТЬ(ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла КАК ЧИСЛО(15, 0))) - ВЫБОР + | КОГДА (ВЫРАЗИТЬ(ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла КАК ЧИСЛО(15, 0))) > ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла + | ТОГДА 1 + | ИНАЧЕ 0 + | КОНЕЦ КАК ЦелаяЧастьРезультатаДеления + | ИЗ + | ВТДниВключенныеВГрафик КАК ДниВключенныеВГрафик + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари + | ПО ДниВключенныеВГрафик.ГрафикРаботы = Календари.Ссылка + | И (Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПоЦикламПроизвольнойДлины)) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДлинаЦиклаГрафиков КАК ДлинаЦиклов + | ПО ДниВключенныеВГрафик.ГрафикРаботы = ДлинаЦиклов.ГрафикРаботы) КАК ДниВключенныеВГрафик) КАК ДниВключенныеВГрафик + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | ДниВключенныеВГрафик.ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика, + | ДЕНЬНЕДЕЛИ(ДниВключенныеВГрафик.ДатаГрафика), + | ДниВключенныеВГрафик.ПредпраздничныйДень + |ИЗ + | ВТДниВключенныеВГрафик КАК ДниВключенныеВГрафик + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари + | ПО ДниВключенныеВГрафик.ГрафикРаботы = Календари.Ссылка + |ГДЕ + | Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПоНеделям) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ДниВключенныеВГрафик.ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика, + | ДниВключенныеВГрафик.НомерДня, + | ЕСТЬNULL(РасписанияРаботыПредпраздничногоДня.ВремяНачала, РасписанияРаботы.ВремяНачала) КАК ВремяНачала, + | ЕСТЬNULL(РасписанияРаботыПредпраздничногоДня.ВремяОкончания, РасписанияРаботы.ВремяОкончания) КАК ВремяОкончания + |ПОМЕСТИТЬ ВТРасписанияРаботы + |ИЗ + | ВТДатыНомераДней КАК ДниВключенныеВГрафик + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Календари.РасписаниеРаботы КАК РасписанияРаботы + | ПО (РасписанияРаботы.Ссылка = ДниВключенныеВГрафик.ГрафикРаботы) + | И (РасписанияРаботы.НомерДня = ДниВключенныеВГрафик.НомерДня) + | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Календари.РасписаниеРаботы КАК РасписанияРаботыПредпраздничногоДня + | ПО (РасписанияРаботыПредпраздничногоДня.Ссылка = ДниВключенныеВГрафик.ГрафикРаботы) + | И (РасписанияРаботыПредпраздничногоДня.НомерДня = 0) + | И (ДниВключенныеВГрафик.ПредпраздничныйДень) + | + |ИНДЕКСИРОВАТЬ ПО + | ДниВключенныеВГрафик.ГрафикРаботы, + | ДниВключенныеВГрафик.ДатаГрафика"; + + // Для вычисления номера в цикле произвольной длины для дня, включенного в график, используется следующая формула: + // Номер дня = Дней от даты отсчета % Длина цикла, где % - операция деления по модулю. + + // Операция деления по модулю в свою очередь производится по формуле: + // Делимое - Цел(Делимое / Делитель) * Делитель, где Цел() - функция выделения целой части + + // Для выделения целой части используется конструкция: + // если результат округления числа по правилам «1.5 как 2» больше исходного значения, уменьшаем результат на 1 + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + Запрос.УстановитьПараметр("Календари", Графики); + Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); + Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); + Запрос.Выполнить(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Выполняет обновление графиков работы по данным производственных календарей, +// на основании которых они заполняются +// +// Параметры: +// - УсловияОбновления - таблица значений с колонками +// - КодПроизводственногоКалендаря - код производственного календаря, данные которого изменились, +// - Год - год, за который нужно обновить данные +// +Процедура ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления) Экспорт + + Справочники.Календари.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления); + +КонецПроцедуры + +// См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. +Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт + + // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. + + СерверныеОбработчики[ + "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления" + ].Добавить("ГрафикиРаботы"); + + СерверныеОбработчики[ + "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена" + ].Добавить("ГрафикиРаботы"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Используется для получения объектов метаданных обязательных для плана обмена. +// Если подсистема имеет объекты метаданных обязательные для включения в состав плана обмена, +// то в параметр <Объект> необходимо добавить эти объекты метаданных. +// +// Параметры: +// Объекты – Массив. Массив объектов метаданных конфигурации, которые необходимо включить в состав плана обмена. +// РаспределеннаяИнформационнаяБаза (только чтение) – Булево. Признак получения объектов для плана обмена РИБ. +// Истина – требуется получить список объектов плана обмена РИБ; +// Ложь – требуется получить список для плана обмена НЕ РИБ. +// +Процедура ПриПолученииОбязательныхОбъектовПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт + + Если РаспределеннаяИнформационнаяБаза Тогда + + Объекты.Добавить(Метаданные.Справочники.Календари); + Объекты.Добавить(Метаданные.РегистрыСведений.КалендарныеГрафики); + + КонецЕсли; + +КонецПроцедуры + +// Создает временную таблицу ВТКалендарныеГрафики, содержащую данные графика ГрафикРаботы за годы, +// приведенные в ВТРазличныеГодыГрафика +// +// Параметры +// - МенеджерВременныхТаблиц - должен содержать ВТРазличныеГодыГрафика с полем Год, типа Число (4,0), +// - ГрафикРаботы - график, который необходимо использовать, тип СправочникСсылка.Календари +// +Процедура СоздатьВТДанныеГрафика(МенеджерВременныхТаблиц, ГрафикРаботы) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | КалендарныеГрафики.Год, + | КалендарныеГрафики.ДатаГрафика, + | КалендарныеГрафики.ДеньВключенВГрафик + |ПОМЕСТИТЬ ВТКалендарныеГрафики + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРазличныеГодыГрафика КАК ГодыГрафика + | ПО (ГодыГрафика.Год = КалендарныеГрафики.Год) + |ГДЕ + | КалендарныеГрафики.Календарь = &ГрафикРаботы"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы); + Запрос.Выполнить(); + +КонецПроцедуры + +// Формирует шаблон текста запроса, встраиваемый в методе КалендарныеГрафики.ПолучитьДатыРабочихДней +// +Функция ШаблонТекстаЗапросаОпределенияБлижайшихДатПоГрафикуРаботы() Экспорт + + Возврат + "ВЫБРАТЬ + | НачальныеДаты.Дата, + | %Функция%(ДатыКалендаря.ДатаГрафика) КАК БлижайшаяДата + |ИЗ + | НачальныеДаты КАК НачальныеДаты + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КалендарныеГрафики КАК ДатыКалендаря + | ПО (ДатыКалендаря.ДатаГрафика %ЗнакУсловия% НачальныеДаты.Дата) + | И (ДатыКалендаря.Календарь = &График) + | И (ДатыКалендаря.ДеньВключенВГрафик) + | + |СГРУППИРОВАТЬ ПО + | НачальныеДаты.Дата"; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы + +// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. +// +// Параметры: +// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления +// общего модуля ОбновлениеИнформационнойБазы. +// +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "КалендарныеГрафики.СоздатьКалендарьПятидневкаРоссийскойФедерации"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.3.1"; + Обработчик.Процедура = "КалендарныеГрафики.ЗаполнитьНастройкиЗаполненияГрафиковРаботы"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.1.4.21"; + Обработчик.Процедура = "КалендарныеГрафики.ЗаполнитьКоличествоДнейВГрафикеСНачалаГода"; + +КонецПроцедуры + +// Процедура создает график работы на основе производственного календаря +// Российской Федерации по шаблону "Пятидневка" +// +Процедура СоздатьКалендарьПятидневкаРоссийскойФедерации() Экспорт + + ПроизводственныйКалендарь = КалендарныеГрафики.ПроизводственныйКалендарьРоссийскойФедерации(); + Если ПроизводственныйКалендарь = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не Справочники.Календари.НайтиПоРеквизиту("ПроизводственныйКалендарь", ПроизводственныйКалендарь).Пустая() Тогда + Возврат; + КонецЕсли; + + НовыйГрафикРаботы = Справочники.Календари.СоздатьЭлемент(); + НовыйГрафикРаботы.Наименование = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПроизводственныйКалендарь, "Наименование"); + НовыйГрафикРаботы.ПроизводственныйКалендарь = ПроизводственныйКалендарь; + НовыйГрафикРаботы.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; + НовыйГрафикРаботы.ДатаНачала = НачалоГода(ТекущаяДатаСеанса()); + НовыйГрафикРаботы.УчитыватьПраздники = Истина; + + // Заполняем недельный цикл как пятидневку + Для НомерДня = 1 По 7 Цикл + НовыйГрафикРаботы.ШаблонЗаполнения.Добавить().ДеньВключенВГрафик = НомерДня <= 5; + КонецЦикла; + + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыйГрафикРаботы, Истина, Истина); + +КонецПроцедуры + +// Заполняет производственный календарь для тех графиков работы, +// которые были созданы не по шаблону или до появления производственных календарей +// +Процедура ЗаполнитьНастройкиЗаполненияГрафиковРаботы() Экспорт + + ПроизводственныйКалендарьРФ = КалендарныеГрафики.ПроизводственныйКалендарьРоссийскойФедерации(); + + Если ПроизводственныйКалендарьРФ = Неопределено Тогда + // Если по какой-то причине нет производственного календаря по умолчанию, + // заполнение настроек бессмысленно + Возврат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | Календари.Ссылка, + | Календари.УдалитьВидКалендаря КАК ВидКалендаря, + | Календари.ПроизводственныйКалендарь + |ИЗ + | Справочник.Календари КАК Календари + |ГДЕ + | Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПустаяСсылка)"; + + Запрос = Новый Запрос(ТекстЗапроса); + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + ГрафикРаботыОбъект = Выборка.Ссылка.ПолучитьОбъект(); + Если Не ЗначениеЗаполнено(Выборка.ПроизводственныйКалендарь) Тогда + // Устанавливаем календарь РФ + ГрафикРаботыОбъект.ПроизводственныйКалендарь = ПроизводственныйКалендарьРФ; + КонецЕсли; + ГрафикРаботыОбъект.ДатаНачала = Дата(2012, 1, 1); + Если Не ЗначениеЗаполнено(Выборка.ВидКалендаря) Тогда + // Если вид календаря не был указан, нет возможности вписать точную настройку заполнения + ГрафикРаботыОбъект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоЦикламПроизвольнойДлины; + ГрафикРаботыОбъект.ДатаОтсчета = Дата(2012, 1, 1); + Иначе + // Для пятидневки и шестидневки заполняем соответствующую настройку + ГрафикРаботыОбъект.УчитыватьПраздники = Истина; + ГрафикРаботыОбъект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; + КоличествоРабочихДней = 5; + Если Выборка.ВидКалендаря = Перечисления.УдалитьВидыКалендарей.Шестидневка Тогда + КоличествоРабочихДней = 6; + КонецЕсли; + ГрафикРаботыОбъект.ШаблонЗаполнения.Очистить(); + Для НомерДня = 1 По 7 Цикл + НоваяСтрока = ГрафикРаботыОбъект.ШаблонЗаполнения.Добавить(); + НоваяСтрока.ДеньВключенВГрафик = НомерДня <= КоличествоРабочихДней; + КонецЦикла; + КонецЕсли; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(ГрафикРаботыОбъект); + КонецЦикла; + +КонецПроцедуры + +// Заполняет вторичные данные для оптимизации расчета дат по календарю +// +Процедура ЗаполнитьКоличествоДнейВГрафикеСНачалаГода() Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | КалендарныеГрафики.Календарь, + | КалендарныеГрафики.Год + |ПОМЕСТИТЬ ВТГрафикиРаботыКоличествоДнейЗаполнено + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода > 0 + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | КалендарныеГрафики.Календарь КАК Календарь, + | КалендарныеГрафики.Год КАК Год, + | КалендарныеГрафики.ДатаГрафика, + | КалендарныеГрафики.ДеньВключенВГрафик + |ИЗ + | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики + | ЛЕВОЕ СОЕДИНЕНИЕ ВТГрафикиРаботыКоличествоДнейЗаполнено КАК ГрафикиРаботыКоличествоДнейЗаполнено + | ПО (ГрафикиРаботыКоличествоДнейЗаполнено.Календарь = КалендарныеГрафики.Календарь) + | И (ГрафикиРаботыКоличествоДнейЗаполнено.Год = КалендарныеГрафики.Год) + |ГДЕ + | ГрафикиРаботыКоличествоДнейЗаполнено.Год ЕСТЬ NULL + | + |УПОРЯДОЧИТЬ ПО + | КалендарныеГрафики.Календарь, + | КалендарныеГрафики.Год, + | КалендарныеГрафики.ДатаГрафика, + | КалендарныеГрафики.ДеньВключенВГрафик + |ИТОГИ ПО + | Календарь, + | Год"; + + // Выбираем графики работы и годы, для которых не заполнено значение ресурса КоличествоДнейВГрафикеСНачалаГода, + // заполняем для них последовательно рассчитывая количество дней + + Запрос = Новый Запрос(ТекстЗапроса); + ВыборкаПоГрафикам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаПоГрафикам.Следующий() Цикл + ВыборкаПоГодам = ВыборкаПоГрафикам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); + Пока ВыборкаПоГодам.Следующий() Цикл + НаборЗаписей = РегистрыСведений.КалендарныеГрафики.СоздатьНаборЗаписей(); + КоличествоДнейВГрафикеСНачалаГода = 0; + Выборка = ВыборкаПоГодам.Выбрать(); + Пока Выборка.Следующий() Цикл + Если Выборка.ДеньВключенВГрафик Тогда + КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеСНачалаГода + 1; + КонецЕсли; + СтрокаНабора = НаборЗаписей.Добавить(); + ЗаполнитьЗначенияСвойств(СтрокаНабора, Выборка); + СтрокаНабора.КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеСНачалаГода; + КонецЦикла; + НаборЗаписей.Отбор.Календарь.Установить(ВыборкаПоГодам.Календарь); + НаборЗаписей.Отбор.Год.Установить(ВыборкаПоГодам.Год); + ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики условных вызовов в другие подсистемы + +// Процедура выполняет обновление графиков работы по данным производственных календарей +// по всем областям данных +// +Процедура ЗапланироватьОбновлениеГрафиковРаботы(Знач УсловияОбновления) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ЗапланироватьОбновлениеГрафиковРаботы(УсловияОбновления); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/ВыгрузкаЗагрузкаДанных.mdo b/SSL/src/CommonModules/ГрафикиРаботы/ГрафикиРаботы.mdo similarity index 62% rename from SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/ВыгрузкаЗагрузкаДанных.mdo rename to SSL/src/CommonModules/ГрафикиРаботы/ГрафикиРаботы.mdo index 28042b2d6..8a4f62252 100644 --- a/SSL/src/CommonModules/ВыгрузкаЗагрузкаДанных/ВыгрузкаЗагрузкаДанных.mdo +++ b/SSL/src/CommonModules/ГрафикиРаботы/ГрафикиРаботы.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="27bfc94e-e438-4854-9a9d-39a3b984c9b4"> - <name>ВыгрузкаЗагрузкаДанных</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="68500931-89e0-491e-aba8-b013c9e6f8c3"> + <name>ГрафикиРаботы</name> <synonym> <key>ru</key> - <value>Выгрузка загрузка данных</value> + <value>Графики работы</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl similarity index 82% rename from SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/Module.bsl rename to SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl index 547ae2098..1cdb87ced 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/Module.bsl @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Календарные графики" +// Подсистема "Графики работы" // //////////////////////////////////////////////////////////////////////////////// @@ -73,25 +73,11 @@ КонецПроцедуры -// Создает и заполняет соответствие по данным фиксированного соответствия -// -Функция СоответствиеПоФиксированномуСоответствию(ФиксированноеСоответствие) Экспорт - - НовоеСоответствие = Новый Соответствие; - - Для Каждого КлючИЗначение Из ФиксированноеСоответствие Цикл - НовоеСоответствие.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; - - Возврат НовоеСоответствие; - -КонецФункции - // Пересоздает фиксированное соответствие, вставляя в него указанное значение // Процедура ВставитьВФиксированноеСоответствие(ФиксированноеСоответствие, Ключ, Значение) Экспорт - Соответствие = СоответствиеПоФиксированномуСоответствию(ФиксированноеСоответствие); + Соответствие = Новый Соответствие(ФиксированноеСоответствие); Соответствие.Вставить(Ключ, Значение); ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие); @@ -101,7 +87,7 @@ // Процедура УдалитьИзФиксированногоСоответствия(ФиксированноеСоответствие, Ключ) Экспорт - Соответствие = СоответствиеПоФиксированномуСоответствию(ФиксированноеСоответствие); + Соответствие = Новый Соответствие(ФиксированноеСоответствие); Соответствие.Удалить(Ключ); ФиксированноеСоответствие = Новый ФиксированноеСоответствие(Соответствие); diff --git a/SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/КалендарныеГрафикиКлиентСервер.mdo b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/ГрафикиРаботыКлиентСервер.mdo similarity index 72% rename from SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/КалендарныеГрафикиКлиентСервер.mdo rename to SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/ГрафикиРаботыКлиентСервер.mdo index 126fbdb6b..9df811383 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиКлиентСервер/КалендарныеГрафикиКлиентСервер.mdo +++ b/SSL/src/CommonModules/ГрафикиРаботыКлиентСервер/ГрафикиРаботыКлиентСервер.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="70b79e56-bb71-4f38-93cf-94dda79d9b4c"> - <name>КалендарныеГрафикиКлиентСервер</name> + <name>ГрафикиРаботыКлиентСервер</name> <synonym> <key>ru</key> - <value>Календарные графики клиент сервер</value> + <value>Графики работы клиент сервер</value> </synonym> <clientManagedApplication>true</clientManagedApplication> <server>true</server> diff --git a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl index 9cdd4f7d8..eac2a9590 100644 --- a/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ГрупповоеИзменениеОбъектовКлиент/Module.bsl @@ -33,7 +33,7 @@ КонецЦикла; Если ПараметрыФормы.МассивОбъектов.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl index 99ca3a561..5b02d5c21 100644 --- a/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДатыЗапретаИзмененияСлужебный/Module.bsl @@ -17,14 +17,15 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииОбработчиковУстановкиПараметровСеанса"].Добавить( "ДатыЗапретаИзмененияСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "ДатыЗапретаИзмененияСлужебный"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных"].Добавить( - "ДатыЗапретаИзмененияСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( + "ДатыЗапретаИзмененияСлужебный"); КонецЕсли; КонецПроцедуры @@ -70,54 +71,56 @@ КонецПроцедуры -// Заполняет массив типов неразделенных данных, всегда содержащих только предопределенные элементы. -// Он используется при обновлении ссылок при загрузке-выгрузке данных. -// -// Параметры: -// МассивТипов - массив +// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок +// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок +// гарантируется с помощью других механизмов. // -Процедура ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных(МассивТипов) Экспорт +// Параметры: +// Типы - Массив(ОбъектМетаданных) +// +Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - МассивТипов.Добавить(Тип("ПланВидовХарактеристикСсылка.РазделыДатЗапретаИзменения")); + // В разделенных данных используются ссылки только на предопределенные элементы + // плана видов характеристик РазделыДатЗапретаИзменения. + Типы.Добавить(Метаданные.ПланыВидовХарактеристик.РазделыДатЗапретаИзменения); КонецПроцедуры // Содержит настройки размещения вариантов отчетов в панели отчетов. // // Параметры: -// Настройки (Коллекция) Используется для описания настроек отчетов и вариантов +// Настройки - Коллекция - Используется для описания настроек отчетов и вариантов // см. описание к ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() // // Описание: // В данной процедуре необходимо указать каким именно образом предопределенные варианты отчетов // будут регистрироваться в программе и показываться в панели отчетов. // -// Вспомогательные функции: +// Вспомогательные методы: // НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); // // Данные функции получают соответственно настройки отчета и настройки варианта отчета следующей структуры: -// |- Включен (Булево) -// Если Ложь, то вариант отчета не регистрируется в подсистеме. -// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. -// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи -// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). -// |- ВидимостьПоУмолчанию (Булево) -// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// Пользователь может "включить" его в режиме настройки панели отчетов -// или открыть через форму "Все отчеты". -// |- Описание (Строка) -// Дополнительная информация по варианту отчета. -// В панели отчетов выводится в качестве подсказки. -// Должно расшифровывать для пользователя содержимое варианта отчета -// и не должно дублировать наименование варианта отчета. -// |- Размещение (Соответствие) Настройки размещения варианта отчета в разделах -// |- Ключ (ОбъектМетаданных) Подсистема, в которой размещается отчет или вариант отчета -// |- Значение (Строка) Необязательный. Настройки размещения в подсистеме. -// |- "" - Выводить отчет в своей группе обычным шрифтом. -// |- "Важный" - Выводить отчет в своей группе жирным шрифтом. -// |- "СмТакже" - Выводить отчет в группе "См. также". -// |- ФункциональныеОпции (Массив) из (Строка) +// * Включен - Булево - +// Если Ложь, то вариант отчета не регистрируется в подсистеме. +// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. +// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи +// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). +// * ВидимостьПоУмолчанию - Булево - +// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// Пользователь может "включить" его в режиме настройки панели отчетов +// или открыть через форму "Все отчеты". +// * Описание - Строка - Дополнительная информация по варианту отчета. +// В панели отчетов выводится в качестве подсказки. +// Должно расшифровывать для пользователя содержимое варианта отчета +// и не должно дублировать наименование варианта отчета. +// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. +// ** Ключ - ОбъектМетаданных: Подсистема - Подсистема, в которой размещается отчет или вариант отчета +// ** Значение - Строка - Необязательный. Настройки размещения в подсистеме. +// "" - Выводить отчет в своей группе обычным шрифтом. +// "Важный" - Выводить отчет в своей группе жирным шрифтом. +// "СмТакже" - Выводить отчет в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - // Имена функциональных опций варианта отчета. // // Например: @@ -176,7 +179,7 @@ Свойства = ДатыЗапретаИзмененияПовтИсп.СвойстваРазделов(); - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); // Установка используемых вариантов отчета ДатыЗапретаИзменения. Отчет = МодульВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ДатыЗапретаИзменения); diff --git a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl index ea3660704..b40a30912 100644 --- a/SSL/src/CommonModules/ДлительныеОперации/Module.bsl +++ b/SSL/src/CommonModules/ДлительныеОперации/Module.bsl @@ -66,7 +66,7 @@ Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьБезопасно", ПараметрыЗадания,, НаименованиеЗадания); Попытка Задание.ОжидатьЗавершения(ВремяОжидания); - Исключение + Исключение // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания. КонецПопытки; @@ -171,6 +171,75 @@ КонецФункции +// Регистрирует в сообщениях информацию о ходе выполнения фонового задания. +// В дальнейшем эту информацию можно считать с клиента при помощи функции ПрочитатьПрогресс. +// +// Параметры: +// Процент - Число - Необязательный. Процент выполнения. +// Текст - Строка - Необязательный. Информация о текущей операции. +// ДополнительныеПараметры - Произвольный - Необязательный. Любая дополнительная информация, +// которую необходимо передать на клиент. Значение должно быть простым (сериализуемым в XML строку). +// +Процедура СообщитьПрогресс(Знач Процент = Неопределено, Знач Текст = Неопределено, Знач ДополнительныеПараметры = Неопределено) Экспорт + + ПередаваемоеЗначение = Новый Структура; + Если Процент <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("Процент", Процент); + КонецЕсли; + Если Текст <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("Текст", Текст); + КонецЕсли; + Если ДополнительныеПараметры <> Неопределено Тогда + ПередаваемоеЗначение.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + КонецЕсли; + + ПередаваемыйТекст = ОбщегоНазначения.ЗначениеВСтрокуXML(ПередаваемоеЗначение); + + ПолучитьСообщенияПользователю(Истина); // Удаление предыдущих сообщений. + Сообщить("{" + ИмяПодсистемы() + "}" + ПередаваемыйТекст); + +КонецПроцедуры + +// Находит фоновое задание и считывает из его сообщений информацию о ходе выполнения. +// +// Возвращаемое значение: +// Структура - Информация о ходе выполнения фонового задания. +// Ключи и значения структуры соответствуют именам и значениям параметров процедуры СообщитьПрогресс(). +// +Функция ПрочитатьПрогресс(Знач ИдентификаторЗадания) Экспорт + Перем Результат; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания); + Если Задание = Неопределено Тогда + Возврат Результат; + КонецЕсли; + + МассивСообщений = Задание.ПолучитьСообщенияПользователю(Истина); + Количество = МассивСообщений.Количество(); + Если Количество = 0 Тогда + Возврат Результат; + КонецЕсли; + + Для Номер = 1 По Количество Цикл + ОбратныйИндекс = Количество - Номер; + Сообщение = МассивСообщений[ОбратныйИндекс]; + + Если Лев(Сообщение.Текст, 1) = "{" Тогда + Позиция = Найти(Сообщение.Текст, "}"); + Если Позиция > 2 Тогда + ИдентификаторМеханизма = Сред(Сообщение.Текст, 2, Позиция - 2); + Если ИдентификаторМеханизма = ИмяПодсистемы() Тогда + ПолученныйТекст = Сред(Сообщение.Текст, Позиция + 1); + Результат = ОбщегоНазначения.ЗначениеИзСтрокиXML(ПолученныйТекст); + Прервать; + КонецЕсли; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -195,3 +264,36 @@ КонецФункции +Процедура ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища) Экспорт + + ИмяМетода = Параметры.ИмяМетода; + ВременнаяСтруктура = Новый Структура; + Попытка + ВременнаяСтруктура.Вставить(ИмяМетода); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода обработки'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Имя метода ""%1"" не соответствует требованиям образования имен переменных.'"), + ИмяМетода); + КонецПопытки; + + ПараметрыВыполнения = Параметры.ПараметрыВыполнения; + Если Параметры.ЭтоВнешняяОбработка Тогда + Если ЗначениеЗаполнено(Параметры.ДополнительнаяОбработкаСсылка) И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Обработка = МодульДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(Параметры.ДополнительнаяОбработкаСсылка); + Иначе + Обработка = ВнешниеОбработки.Создать(Параметры.ИмяОбработки); + КонецЕсли; + Иначе + Обработка = Обработки[Параметры.ИмяОбработки].Создать(); + КонецЕсли; + + Выполнить("Обработка." + ИмяМетода + "(ПараметрыВыполнения, АдресХранилища)"); + +КонецПроцедуры + +Функция ИмяПодсистемы() + Возврат "СтандартныеПодсистемы.ДлительныеОперации"; +КонецФункции diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl index 25833ca21..89d341de4 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработки/Module.bsl @@ -6,16 +6,16 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Подключает внешнюю обработку (отчет). После подключения -// обработка (отчет) регистрируется в программе под определенным именем, -// используя которое можно создавать объект или открывать формы обработки (отчета). +// Подключает и возвращает имя, под которым подключен внешний отчет или обработка. +// После подключения отчет или обработка регистрируется в программе под определенным именем, +// используя которое можно создавать объект или открывать формы отчета или обработки. // // Параметры: -// Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Подключаемая обработка. +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Подключаемая обработка. // // Возвращаемое значение: -// (Строка) Имя подключенной обработки (отчета). -// (Неопределено) Если передана некорректная ссылка. +// * Строка - Имя подключенного отчета или обработки. +// * Неопределено - Если передана некорректная ссылка. // // Важно: // Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" @@ -25,7 +25,7 @@ // Проверка корректности переданных параметров Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки") - ИЛИ Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда + Или Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда Возврат Неопределено; КонецЕсли; @@ -34,13 +34,15 @@ // Подключение #Если ТолстыйКлиентОбычноеПриложение Тогда ИмяОбработки = ПолучитьИмяВременногоФайла(); - ДвоичныеДанные = Ссылка.ХранилищеОбработки.Получить(); + ХранилищеОбработки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ХранилищеОбработки"); + ДвоичныеДанные = ХранилищеОбработки.Получить(); ДвоичныеДанные.Записать(ИмяОбработки); Возврат ИмяОбработки; #КонецЕсли - Если Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет - ИЛИ Ссылка.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Вид"); + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда Менеджер = ВнешниеОтчеты; Иначе Менеджер = ВнешниеОбработки; @@ -55,15 +57,15 @@ КонецФункции -// Создает и возвращает объект внешней обработки (отчета). +// Возвращает объект внешнего отчета или обработки. // // Параметры: -// Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Подключаемая обработка. +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Подключаемый отчет или обработка. // // Возвращаемое значение: -// (ВнешняяОбработкаОбъект.*) Объект подключенной обработки. -// (ВнешнийОтчетОбъект.*) Объект подключенного отчета. -// (Неопределено) Если передана некорректная ссылка. +// * ВнешняяОбработкаОбъект - Объект подключенной обработки. +// * ВнешнийОтчетОбъект - Объект подключенного отчета. +// * Неопределено - Если передана некорректная ссылка. // // Важно: // Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" @@ -95,17 +97,17 @@ // командного интерфейса формы) // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// ТипФормы (Строка) Необязательный. "ФормаСписка" для форм списков и "ФормаОбъекта" для форм элементов. +// Форма - УправляемаяФорма +// ТипФормы - Строка - Необязательный. "ФормаСписка" для форм списков и "ФормаОбъекта" для форм элементов. // см. также функции ТипФормыСписка() и ТипФормыОбъекта() общего модуля ДополнительныеОтчетыИОбработкиКлиентСервер. // -Процедура ПриСозданииНаСервере(ЭтаФорма, ТипФормы = Неопределено) Экспорт +Процедура ПриСозданииНаСервере(Форма, ТипФормы = Неопределено) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда Возврат; КонецЕсли; // Установка параметров формы для команд вызова дополнительных отчетов и обработок. - Параметры = ДополнительныеОтчетыИОбработкиПовтИсп.ПараметрыФормыНазначаемогоОбъекта(ЭтаФорма.ИмяФормы, ТипФормы); + Параметры = ДополнительныеОтчетыИОбработкиПовтИсп.ПараметрыФормыНазначаемогоОбъекта(Форма.ИмяФормы, ТипФормы); Если ТипЗнч(Параметры) <> Тип("ФиксированнаяСтруктура") Тогда Возврат; КонецЕсли; @@ -114,10 +116,10 @@ ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиОбъектНазначения", Параметры.СсылкаРодителя); ПараметрыФункциональныхОпций.Вставить("ДополнительныеОтчетыИОбработкиТипФормы", ?(ТипФормы = Неопределено, Параметры.ТипФормы, ТипФормы)); - ЭтаФорма.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФункциональныхОпций); + Форма.УстановитьПараметрыФункциональныхОпцийФормы(ПараметрыФункциональныхОпций); Если Параметры.ВыводитьПодменюЗаполнениеОбъекта Тогда - СформироватьПодменюКомандЗаполнения(ЭтаФорма, Параметры); + СформироватьПодменюКомандЗаполнения(Форма, Параметры); КонецЕсли; КонецПроцедуры @@ -126,12 +128,12 @@ // // Параметры: // Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Внешняя обработка -// ПараметрыИсточника (Структура) -// |- ИдентификаторКоманды (Строка) Список макетов, перечисленных через запятую -// |- ОбъектыНазначения (Массив) -// КоллекцияПечатныхФорм (ТаблицаЗначений) см. описание процедуры Печать() в документации. +// ПараметрыИсточника - Структура - +// * ИдентификаторКоманды - Строка - Список макетов, перечисленных через запятую +// * ОбъектыНазначения (Массив) +// КоллекцияПечатныхФорм - ТаблицаЗначений - см. описание процедуры Печать() в документации. // ОбъектыПечати (СписокЗначений) см. описание процедуры Печать() в документации. -// ПараметрыВывода (Структура) см. описание процедуры Печать() в документации. +// ПараметрыВывода - Структура - см. описание процедуры Печать() в документации. // Процедура ПечатьПоВнешнемуИсточнику(Ссылка, ПараметрыИсточника, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт @@ -178,50 +180,50 @@ // Формирует шаблон структуры сведений о внешнем отчете или обработке для последующего заполнения. // // Параметры: -// ВерсияБСП (Строка) Версия библиотеки стандартных подсистем, на которую рассчитывают механизмы внешнего объекта. +// ВерсияБСП - Строка - Версия библиотеки стандартных подсистем, на которую рассчитывают механизмы внешнего объекта. // Подробнее - см. СтандартныеПодсистемыСервер.ВерсияБиблиотеки(). // // Возвращаемое значение: -// ПараметрыРегистрации (Структура) Параметры внешнего объекта. -// |- Вид (Строка) Вид внешнего объекта. Соответствует реквизиту "Вид" (ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок). +// ПараметрыРегистрации - Структура - Параметры внешнего объекта. +// * Вид - Строка - Вид внешнего объекта. Соответствует реквизиту "Вид" (ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок). // Для определения вида можно использовать функции "Вид*" общего модуля ДополнительныеОтчетыИОбработкиКлиентСервер, // или указать вид явно: -// |- "ПечатнаяФорма" -// |- "ЗаполнениеОбъекта" -// |- "СозданиеСвязанныхОбъектов" -// |- "Отчет" -// |- "ДополнительнаяОбработка" -// |- "ДополнительныйОтчет" -// |- Версия (Строка) Версия объекта. +// ** "ПечатнаяФорма" +// ** "ЗаполнениеОбъекта" +// ** "СозданиеСвязанныхОбъектов" +// ** "Отчет" +// ** "ДополнительнаяОбработка" +// ** "ДополнительныйОтчет" +// * Версия - Строка - Версия объекта. // Задается в формате: "<Старший номер>.<Младший номер>". -// |- Назначение (Массив) из (Строка) Необязательный. Имена объектов конфигурации, для которых предназначен этот объект. +// * Назначение - Массив - из - Строка - Необязательный. Имена объектов конфигурации, для которых предназначен этот объект. // Задается в формате: "<ИмяКлассаОбъектаМетаданного>.[*|<ИмяОбъектаМетаданных>]" -// |- Наименование (Строка) Необязательный. Представление для администратора (наименование элемента справочника). +// * Наименование - Строка - Необязательный. Представление для администратора (наименование элемента справочника). // Если не заполнено, то берется представление объекта метаданных внешнего объекта. -// |- БезопасныйРежим (Булево) Необязательный. Признак подключения внешней обработки в безопасном режиме. +// * БезопасныйРежим - Булево - Необязательный. Признак подключения внешней обработки в безопасном режиме. // Значение по умолчанию Истина (обработка будет выполняться безопасно). // Подробнее - см. разделы справки "ВнешниеОтчетыМенеджер.Подключить" и "ВнешниеОбработкиМенеджер.Подключить". -// |- Информация (Строка) Необязательный. Краткая информация по внешнему объекту. +// * Информация - Строка - Необязательный. Краткая информация по внешнему объекту. // В этом параметре для администратора рекомендуется указать описание возможностей внешнего объекта. // Если не заполнено, то берется комментарий объекта метаданных внешнего объекта. -// |- ВерсияБСП (Строка) Необязательный. Версия библиотеки, на которую рассчитывают механизмы внешнего объекта. +// * ВерсияБСП - Строка - Необязательный. Версия библиотеки, на которую рассчитывают механизмы внешнего объекта. // Подробнее - см. СтандартныеПодсистемыСервер.ВерсияБиблиотеки(). -// |- Команды (ТаблицаЗначений) Необязательный для отчетов. Таблица команд, поставляемых внешним объектом. +// * Команды - ТаблицаЗначений - Необязательный для отчетов. Таблица команд, поставляемых внешним объектом. // Типы колонок соответствуют типам табличной части Команды справочника ДополнительныеОтчетыИОбработки. -// |- Идентификатор (Строка) Имя команды. Для печатной формы - список макетов. -// |- Использование (Строка) Тип команды. Соответствует реквизиту "ВариантЗапуска" (ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок). -// |- "ВызовКлиентскогоМетода" -// |- "ВызовСерверногоМетода" -// |- "ЗаполнениеФормы" -// |- "ОткрытиеФормы" -// |- "СценарийВБезопасномРежиме" -// |- Представление (Строка) Представление команды для конечного пользователя. -// |- ПоказыватьОповещение (Булево) Истина = при запуске команды будет показано стандартное оповещение. +// ** Идентификатор - Строка - Имя команды. Для печатной формы - список макетов. +// ** Использование - Строка - Тип команды. Соответствует реквизиту "ВариантЗапуска" (ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок). +// *** "ВызовКлиентскогоМетода" +// *** "ВызовСерверногоМетода" +// *** "ЗаполнениеФормы" +// *** "ОткрытиеФормы" +// *** "СценарийВБезопасномРежиме" +// ** Представление - Строка - Представление команды для конечного пользователя. +// ** ПоказыватьОповещение - Булево - Истина = при запуске команды будет показано стандартное оповещение. // Не работает для команд "ОткрытиеФормы". -// |- Модификатор (Строка) Вспомогательный модификатор команды. -// |- "ПечатьMXL" для печатных форм на основе макетов MXL. -// |- Скрыть (Булево) Истина если команду необходимо скрывать в форме элемента. -// |- Разрешения (Массив(ОбъектXDTO {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}PermissionBase)) +// ** Модификатор - Строка - Вспомогательный модификатор команды. +// *** "ПечатьMXL" для печатных форм на основе макетов MXL. +// ** Скрыть - Булево - Истина если команду необходимо скрывать в форме элемента. +// * Разрешения - Массив из ОбъектXDTO {http://www.1c.ru/1cFresh/ApplicationExtensions/Permissions/a.b.c.d}PermissionBase - // Необязательный. Массив разрешений, предоставленных дополнительному отчету или обработке при работе в безопасном // режиме. // @@ -255,9 +257,9 @@ // Выполняет назначаемую команду контекстно из формы объекта назначения. // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма, из которой вызвана команда. -// ИмяЭлемента (Строка) Имя команды формы, которая была нажата. -// РезультатВыполнения (Структура) См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). +// Форма - УправляемаяФорма - Форма, из которой вызвана команда. +// ИмяЭлемента - Строка - Имя команды формы, которая была нажата. +// РезультатВыполнения - Структура - См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). // // Описание: // Предназначена для вызова кодом этой подсистемы из формы элемента назначаемого объекта (например, справочника или документа). @@ -266,9 +268,9 @@ // Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" // должна выполняться вызывающим кодом. // -Процедура ВыполнитьНазначаемуюКомандуНаСервере(ЭтаФорма, ИмяЭлемента, РезультатВыполнения) Экспорт +Процедура ВыполнитьНазначаемуюКомандуНаСервере(Форма, ИмяЭлемента, РезультатВыполнения) Экспорт - Найденные = ЭтаФорма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)); + Найденные = Форма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)); Если Найденные.Количество() = 0 Тогда ВызватьИсключение НСтр("ru = 'Команда не найдена'"); КонецЕсли; @@ -279,7 +281,7 @@ ИдентификаторКоманды = СтрокаТаблицы.Идентификатор; ПараметрыКоманды = Новый Структура; - ПараметрыКоманды.Вставить("ЭтаФорма", ЭтаФорма); + ПараметрыКоманды.Вставить("ЭтаФорма", Форма); РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, Неопределено); @@ -288,15 +290,17 @@ // Выполняет команду обработки и возвращает результат ее выполнения. // // Параметры: -// ПараметрыКоманды (Структура) Параметры, с которыми выполняется команда. -// |- ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Элемент справочника. -// |- ИдентификаторКоманды (Строка) Имя выполняемой команды. -// |- ОбъектыНазначения (Массив) из (*) Ссылки объектов, для которых выполняется обработка. Обязательный для назначаемых обработок. -// |- РезультатВыполнения (*) Необязательный. Используется для передачи результата работы на клиент. -// АдресРезультата (Строка) Необязательный. Адрес временного хранилища по которому будет размещен результат выполнения. +// ПараметрыКоманды - Структура - Параметры, с которыми выполняется команда. +// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Элемент справочника. +// * ИдентификаторКоманды - Строка - Имя выполняемой команды. +// * ОбъектыНазначения - Массив - Ссылки объектов, для которых выполняется обработка. Обязательный для назначаемых обработок. +// * РезультатВыполнения - Структура - Необязательный. Дополняет возвращаемое значение. +// См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). +// АдресРезультата - Строка - Необязательный. Адрес временного хранилища по которому будет размещен результат выполнения. // // Возвращаемое значение: -// ПараметрыКоманды.РезультатВыполнения (*) см. ПараметрыКоманды. Если был передан АдресРезультата, то возвращается Неопределено. +// * Структура - Результат выполнения, который далее передается на клиент. +// * Неопределено - Если был передан АдресРезультата. // // Важно: // Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" @@ -317,20 +321,21 @@ // Пример использования - см. ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). // // Параметры: -// ИдентификаторКоманды (Строка) Имя команды как оно задано в функции СведенияОВнешнейОбработке() модуля объекта. -// ПараметрыКоманды (Структура) Параметры выполнения команды. См. ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). -// ЭтаФорма (УправляемаяФорма) Форма, в которую необходимо вернуть результат. +// ИдентификаторКоманды - Строка - Имя команды как оно задано в функции СведенияОВнешнейОбработке() модуля объекта. +// ПараметрыКоманды - Структура - Параметры выполнения команды. +// См. ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(). +// Форма - УправляемаяФорма - Форма, в которую необходимо вернуть результат. // // Возвращаемое значение: -// РезультатВыполнения (Структура) См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). +// РезультатВыполнения - Структура - См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). // // Важно: // Проверка функциональной опции "ИспользоватьДополнительныеОтчетыИОбработки" // должна выполняться вызывающим кодом. // -Функция ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма) Экспорт +Функция ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, Форма) Экспорт - ВнешнийОбъект = ЭтаФорма.РеквизитФормыВЗначение("Объект"); + ВнешнийОбъект = Форма.РеквизитФормыВЗначение("Объект"); РезультатВыполнения = ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, Неопределено); @@ -338,12 +343,48 @@ КонецФункции +// Формирует список разделов, в которых доступна команда вызова дополнительных отчетов. +// +// Возвращаемое значение: +// Массив ОбъектМетаданных: Подсистема - Метаданные разделов, в которые выведен список команд дополнительных отчетов. +// +Функция РазделыДополнительныхОтчетов() Экспорт + РазделыМетаданные = Новый Массив; + + ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами(РазделыМетаданные); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСДополнительнымиОтчетами(РазделыМетаданные); + КонецЕсли; + + Возврат РазделыМетаданные; +КонецФункции + +// Формирует список разделов, в которых доступна команда вызова дополнительных обработок. +// +// Возвращаемое значение: +// Массив из ОбъектМетаданных: Подсистема - Метаданные разделов, в которые выведен список команд дополнительных обработок. +// +Функция РазделыДополнительныхОбработок() Экспорт + РазделыМетаданные = Новый Массив; + + ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками(РазделыМетаданные); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриОпределенииРазделовСДополнительнымиОбработками(РазделыМетаданные); + КонецЕсли; + + Возврат РазделыМетаданные; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры используемые при обмене данными // Переопределяет стандартное поведение при загрузке данных. -// Реквизит РегламентноеЗаданиеGUID табличной части Команды не переносится, -// т.к. связан с регламентным заданием текущей базы. +// Реквизит РегламентноеЗаданиеGUID табличной части Команды не переносится, +// т.к. связан с регламентным заданием текущей базы. // Процедура ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента) Экспорт @@ -406,55 +447,14 @@ КонецПроцедуры -// Дополняет список команд печати внешними печатными формами. -// -// Параметры: -// КомандыПечати - ТаблицаЗначений - описание см. в УправлениеПечатью.СоздатьКоллекциюКомандПечати(). -// ИмяФормы - Строка - полное имя формы, для которой необходимо получить список команд печати. -// -Процедура ПриПолученииКомандПечати(КомандыПечати, ИмяФормы) Экспорт - - Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда - Возврат; - КонецЕсли; - - ФормаМетаданные = Метаданные.НайтиПоПолномуИмени(ИмяФормы); - Если ФормаМетаданные = Неопределено Тогда - Возврат; - КонецЕсли; - - ПолноеИмяОбъектаМетаданных = ФормаМетаданные.Родитель().ПолноеИмя(); - Запрос = НовыйЗапросПоДоступнымКомандам(Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма, ПолноеИмяОбъектаМетаданных); - ТаблицаКоманд = Запрос.Выполнить().Выгрузить(); - - Если ТаблицаКоманд.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого СтрокаТаблицы Из ТаблицаКоманд Цикл - КомандаПечати = КомандыПечати.Добавить(); - - // Обязательные параметры. - ЗаполнитьЗначенияСвойств(КомандаПечати, СтрокаТаблицы, "Идентификатор, Представление"); - // Параметры, идентифицирующие подсистему. - КомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки"; - - // Дополнительные параметры. - КомандаПечати.ДополнительныеПараметры = Новый Структура("Ссылка, Модификатор, ВариантЗапуска, ПоказыватьОповещение"); - ЗаполнитьЗначенияСвойств(КомандаПечати.ДополнительныеПараметры, СтрокаТаблицы); - КонецЦикла; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обработчики служебных событий // Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. // // Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// +// Обработчики - ТаблицаЗначений - См. ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(). +// Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); @@ -482,10 +482,8 @@ КонецПроцедуры // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной информационной базе. +// См. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтакс-помощнике. // -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтПодчиненного() в синтаксис-помощнике. -// Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента); @@ -493,10 +491,8 @@ КонецПроцедуры // Процедура является обработчиком одноименного события, возникающего при обмене данными в распределенной информационной базе. +// См. описание обработчика события ПриПолученииДанныхОтГлавного() в синтакс-помощнике. // -// Параметры: -// см. описание обработчика события ПриПолученииДанныхОтГлавного() в синтаксис-помощнике. -// Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт ПриПолученииДополнительнойОбработки(ЭлементДанных, ПолучениеЭлемента); @@ -509,7 +505,7 @@ // Получает ссылку дополнительного отчета, если он подключен к хранилищу подсистемы Варианты отчетов. // // Параметры: -// ОтчетИнформация (Структура) см. ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени() +// ОтчетИнформация - Структура - См. ВариантыОтчетов.СформироватьИнформациюОбОтчетеПоПолномуИмени(). // Процедура ПриОпределенииТипаИСсылкиЕслиОтчетДополнительный(ОтчетИнформация) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда @@ -550,9 +546,12 @@ // Дополняет массив ссылкам дополнительных отчетов, доступных текущему пользователю. // // Параметры: -// Результат (Массив) из (*) см. тип реквизита Отчет справочника ВариантыОтчетов. +// Результат - Массив из <см. Справочники.ВариантыОтчетов.Реквизиты.Отчет> - // Ссылки отчетов, доступных текущему пользователю. // +// Места использования: +// ВариантыОтчетов.ОтчетыТекущегоПользователя(). +// Процедура ПриДобавленииДополнительныхОтчетовДоступныхТекущемуПользователю(ДоступныеОтчеты) Экспорт Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Или Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда @@ -582,30 +581,35 @@ // Подключает отчет подсистемы "Дополнительные отчеты и обработки". // Обработка исключений производится управляющим кодом. -// -// Параметры: -// ДопОтчет (СправочникСсылка.ДополнительныеОтчетыИОбработки) Отчет, который необходимо инициализировать -// ПараметрыОтчета (Структура) Набор параметров, получаемый в процессе проверки и подключения отчета -// см. описание функции "ИнициализироватьОтчет" модуля "РассылкаОтчетов" -// Результат (Булево, Неопределено) -// |- Истина - Удалось подключить дополнительный отчет -// |- Ложь - Не удалось подключить дополнительный отчет -// |- Неопределено - По умолчанию. Подсистема доп. отчетов недоступна. // -Процедура ПриПодключенииДопОтчета(ДопОтчет, ПараметрыОтчета, Результат) Экспорт +// Параметры: +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Отчет, который необходимо инициализировать +// ПараметрыОтчета - Структура - Набор параметров, получаемый в процессе проверки и подключения отчета +// Cм. РассылкаОтчетов.ИнициализироватьОтчет(). +// Результат - Булево, Неопределено - Результат подключения. +// Истина - Удалось подключить дополнительный отчет +// Ложь - Не удалось подключить дополнительный отчет +// Неопределено - Подсистема доп. отчетов недоступна. +// +// Места использования: +// ВариантыОтчетов.ПодключитьОтчетОбъект(). +// РассылкаОтчетов.ИнициализироватьОтчет(). +// +Процедура ПриПодключенииДопОтчета(Ссылка, ПараметрыОтчета, Результат) Экспорт Если Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда ПараметрыОтчета.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Элемент ""%1"" не подключен, потому что подсистема ""%2"" отключена в настройках программы. |Для включения подсистемы обратитесь к администратору программы.'"), - "'"+ Строка(ДопОтчет) +"'", - ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы(Неопределено)); + "'"+ Строка(Ссылка) +"'", + ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы("ru")); Возврат; КонецЕсли; - Если ДопОтчет.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет - ИЛИ ДопОтчет.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда + Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Вид"); + Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет + ИЛИ Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда - ПараметрыОтчета.Имя = ПодключитьВнешнююОбработку(ДопОтчет); + ПараметрыОтчета.Имя = ПодключитьВнешнююОбработку(Ссылка); ПараметрыОтчета.Объект = ВнешниеОтчеты.Создать(ПараметрыОтчета.Имя); ПараметрыОтчета.Метаданные = ПараметрыОтчета.Объект.Метаданные(); @@ -615,7 +619,7 @@ ПараметрыОтчета.Ошибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Элемент %1 не является дополнительным отчетом'"), - "'"+ Строка(ДопОтчет) +"'"); + "'"+ Строка(Ссылка) +"'"); Результат = Ложь; @@ -623,13 +627,60 @@ КонецПроцедуры +// Дополняет список команд печати внешними печатными формами. +// +// Параметры: +// КомандыПечати - ТаблицаЗначений - См. УправлениеПечатью.СоздатьКоллекциюКомандПечати(). +// ИмяФормы - Строка - Полное имя формы, для которой необходимо получить список команд печати. +// +// Места использования: +// УправлениеПечатью.КомандыПечатиФормы(). +// +Процедура ПриПолученииКомандПечати(КомандыПечати, ИмяФормы) Экспорт + + Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда + Возврат; + КонецЕсли; + + ФормаМетаданные = Метаданные.НайтиПоПолномуИмени(ИмяФормы); + Если ФормаМетаданные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПолноеИмяОбъектаМетаданных = ФормаМетаданные.Родитель().ПолноеИмя(); + Запрос = НовыйЗапросПоДоступнымКомандам(Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма, ПолноеИмяОбъектаМетаданных); + ТаблицаКоманд = Запрос.Выполнить().Выгрузить(); + + Если ТаблицаКоманд.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого СтрокаТаблицы Из ТаблицаКоманд Цикл + КомандаПечати = КомандыПечати.Добавить(); + + // Обязательные параметры. + ЗаполнитьЗначенияСвойств(КомандаПечати, СтрокаТаблицы, "Идентификатор, Представление"); + // Параметры, идентифицирующие подсистему. + КомандаПечати.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки"; + + // Дополнительные параметры. + КомандаПечати.ДополнительныеПараметры = Новый Структура("Ссылка, Модификатор, ВариантЗапуска, ПоказыватьОповещение"); + ЗаполнитьЗначенияСвойств(КомандаПечати.ДополнительныеПараметры, СтрокаТаблицы); + КонецЦикла; + +КонецПроцедуры + // Заполняет список печатных форм из внешних источников. // // Параметры: -// ВнешниеПечатныеФормы - СписокЗначений: -// Значение - Строка - идентификатор печатной формы; -// Представление - Строка - название печатной формы. -// ПолноеИмяОбъектаМетаданных - Строка - полное имя объекта метаданных, для которого требуется получить список печатных форм. +// ВнешниеПечатныеФормы - СписокЗначений - Печатные формы. +// Значение - Строка - Идентификатор печатной формы. +// Представление - Строка - Название печатной формы. +// ПолноеИмяОбъектаМетаданных - Строка - Полное имя объекта метаданных, +// для которого требуется получить список печатных форм. +// +// Места использования: +// УправлениеПечатью.ПриПолученииСпискаВнешнихПечатныхФорм(). // Процедура ПриПолученииСпискаВнешнихПечатныхФорм(ВнешниеПечатныеФормы, ПолноеИмяОбъектаМетаданных) Экспорт Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) @@ -651,6 +702,9 @@ // Возвращает ссылку на объект внешней печатной формы. // +// Места использования: +// УправлениеПечатью.ПриПолученииВнешнейПечатнойФормы(). +// Процедура ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка) Экспорт Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Или Не ПолучитьФункциональнуюОпцию("ИспользоватьДополнительныеОтчетыИОбработки") Тогда @@ -668,14 +722,113 @@ КонецПроцедуры +// Получает настройки дополнительных отчетов и обработок для переданного пользователя. +// +// Параметры: +// ПользовательСсылка - СправочникСсылка.Пользователи - Пользователь, для которого требуется получить настройки. +// Настройки - Структура - Прочие пользовательские настройки. +// * НазваниеНастройки - Строка - название, которое будет отображаться в дереве настроек обработки. +// * КартинкаНастройки - Картинка - картинка, которая будет отображаться в дереве обработки. +// * СписокНастроек - СписокЗначений - список полученных настроек +// +// Места использования: +// ПользователиСлужебный.ПриПолученииПрочихПользовательскихНастроек(). +// +Процедура ПолучитьНастройкиДополнительныхОтчетовИОбработок(ПользовательСсылка, Настройки) Экспорт + + // Название строки настроек, отображаемое в дереве настроек обработки + НазваниеНастройки = НСтр("ru='Настройки быстрого доступа к дополнительным отчетам и обработкам'"); + + // Картинка строки настроек + КартинкаНастройки = ""; + + // Список дополнительных отчетов и обработок, находящихся в быстром доступе у пользователя + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка КАК Объект, + | ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды КАК Идентификатор, + | ПользовательскиеНастройкиДоступаКОбработкам.Пользователь КАК Пользователь + |ИЗ + | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам + |ГДЕ + | Пользователь = &Пользователь"; + + Запрос.Параметры.Вставить("Пользователь", ПользовательСсылка); + + РезультатЗапроса = Запрос.Выполнить().Выгрузить(); + + Настройки = Новый Структура; + Настройки.Вставить("НазваниеНастройки", НазваниеНастройки); + Настройки.Вставить("КартинкаНастройки", КартинкаНастройки); + Настройки.Вставить("СписокНастроек", РезультатЗапроса); + +КонецПроцедуры + +// Сохраняет команды дополнительных отчетов и обработок указанным пользователям. +// +// Параметры: +// Настройки - СписокЗначений - Список ключей сохраняемых настроек. +// ПользователиПолучатели - Массив из СправочникСсылка.Пользователи - +// Пользователи, которым нужно скопировать настройки. +// +// Места использования: +// ПользователиСлужебный.ПриСохраненииПрочихПользовательскихНастроек(). +// +Процедура ДобавитьКомандыВСписокБыстрогоДоступа(Настройки, ПользователиПолучатели) Экспорт + + Для Каждого ПользовательПриемник Из ПользователиПолучатели Цикл + + Для Каждого ЭлементСтрока Из Настройки Цикл + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; + Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; + Запись.Пользователь = ПользовательПриемник; + Запись.Доступно = Истина; + + Запись.Записать(Истина); + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +// Очищает команды дополнительных отчетов и обработок у указанного пользователя. +// +// Параметры: +// СписокКлючей - СписокЗначений - Список ключей очищаемых настроек. +// ОчищаемыйПользователь - СправочникСсылка.Пользователи - +// Пользователь, для которого нужно очистить настройки. +// +// Места использования: +// ПользователиСлужебный.ПриУдаленииПрочихПользовательскихНастроек(). +// +Процедура УдалитьКомандыИзСпискаБыстрогоДоступа(СписокКлючей, ОчищаемыйПользователь) Экспорт + + Для Каждого ЭлементСтрока Из СписокКлючей Цикл + + Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); + + Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; + Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; + Запись.Пользователь = ОчищаемыйПользователь; + + Запись.Прочитать(); + + Запись.Удалить(); + + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы -// Процедура обновления записей о доступности дополнительных обработок -// +// [1.0.7.1] Процедура обновления записей о доступности дополнительных обработок Процедура ОбновитьПользовательскиеНастройкиДоступаКОбработкам() Экспорт ПользователиСДопОбработками = ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам(); @@ -698,9 +851,8 @@ КонецПроцедуры -// Заполнение реквизита "ИмяОбъекта". Данный реквизит отвечает за имя, -// под которыми дополнительный отчет или обработка регистрируется в системе. -// Для объектов с вариантом Публикации "Используется" дополнительно проводится +// [2.0.1.4] Заполнение реквизита "ИмяОбъекта" (имя, под которыми объект регистрируется в программе). +// Для объектов с вариантом Публикации "Используется" дополнительно проводится // контроль уникальности Имени объекта. В случае нахождения отчетов или обработок // с неуникальными Именами объектов для всех элементов, кроме первого, // вариант Публикации изменяется с "Используется" на "Режим отладки". @@ -781,16 +933,16 @@ КонецПроцедуры -// Замена имен рабочих мест на идентификаторы разделов. -// +// Замена имен рабочих мест на ссылки справочника ИдентификаторыОбъектовМетаданных. +// // Параметры: -// ИменаРазделовИИдентификаторы (Соответствие) -// |- Ключ (Строка) Имя рабочего места (команды), которое ранее указывалось в процедуре -// ПолучитьОбщиеКомандыДополнительныхОбработок или ПолучитьОбщиеКомандыДополнительныхОтчетов -// общего модуля ДополнительныеОтчетыИОбработкиПереопределяемый -// |- Значение (ОбъектМетаданных) Раздел командного интерфейса (подсистема первого уровня), -// в котором размещается данное рабочее место (команда) -// +// ИменаРазделовИИдентификаторы - Соответствие - +// * Ключ - Строка - Имя рабочего места (команды), которое ранее указывалось в процедурах: +// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОбработок(); +// ДополнительныеОтчетыИОбработкиПереопределяемый.ПолучитьОбщиеКомандыДополнительныхОтчетов(). +// * Значение - ОбъектМетаданных: Подсистема - Раздел командного интерфейса (подсистема первого уровня), +// в котором размещается данное рабочее место (команда). +// Процедура ЗаменитьИменаРазделовНаИдентификаторы(ИменаРазделовИИдентификаторы) Экспорт ИдентификаторРабочегоСтола = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); @@ -835,16 +987,7 @@ КонецЦикла; КонецПроцедуры -// Замена имен рабочих мест на идентификаторы разделов. -// -// Параметры: -// ИменаРазделовИИдентификаторы (Соответствие) -// |- Ключ (Строка) Имя рабочего места (команды), которое ранее указывалось в процедуре -// ПолучитьОбщиеКомандыДополнительныхОбработок или ПолучитьОбщиеКомандыДополнительныхОтчетов -// общего модуля ДополнительныеОтчетыИОбработкиПереопределяемый -// |- Значение (ОбъектМетаданных) Раздел командного интерфейса (подсистема первого уровня), -// в котором размещается данное рабочее место (команда) -// +// [2.1.3.2] Замена имен объектов назначения на ссылки справочника ИдентификаторыОбъектовМетаданных. Процедура ЗаменитьИменаОбъектовМетаданныхНаСсылки() Экспорт НачатьТранзакцию(); @@ -890,9 +1033,7 @@ КонецПроцедуры -// Включение функциональной опции ИспользоватьДополнительныеОтчетыИОбработки. -// Используется только для локального режима. -// +// [2.1.3.22] Включение функциональной опции ИспользоватьДополнительныеОтчетыИОбработки для локального режима. Процедура ВключитьФункциональнуюОпцию() Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда @@ -907,12 +1048,12 @@ // Регламентные задания // Обработчик экземпляра регламентного задания ЗапускОбработок. -// Запускает обработчик глобальной обработки по регламентному заданию, -// с указанным идентификатором команды. +// Запускает обработчик глобальной обработки по регламентному заданию, +// с указанным идентификатором команды. // // Параметры -// ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки -// ИдентификаторКоманды - Строка - идентификатор выполняемой команды +// ВнешняяОбработка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка выполняемой обработки. +// ИдентификаторКоманды - Строка - Идентификатор выполняемой команды. // Процедура ВыполнитьОбработкуПоРегламентномуЗаданию(ВнешняяОбработка, ИдентификаторКоманды) Экспорт @@ -939,45 +1080,30 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Условные вызовы в друге подсистемы - -// Формирует ссылку варианта дополнительного отчета. -// -// Параметры: -// Отчет (СправочникСсылка.ДополнительныеОтчетыИОбработки) -// КлючВарианта (Строка) -// Результат (*) См. описание вызываемых процедур и функций. -// -Процедура ПриОпределенииСсылкиВариантаДополнительногоОтчета(Отчет, КлючВарианта, Результат) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); - Результат = МодульВариантыОтчетов.ПолучитьСсылку(Отчет, КлючВарианта); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции // Формирует запрос для получения таблицы команд дополнительных отчетов или обработок -// +// // Параметры: -// ВидОбработок (ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок) Вид обработки -// ПолноеИмяИлиСсылкаРодителяИлиРаздела (...) Справочник или документ для назначаемых обработок, подсистема для глобальных обработок -// |- (Строка) Полное имя объекта метаданных. -// |- (СправочникСсылка.ИдентификаторыОбъектовМетаданных) Ссылка объекта метаданных. -// ЭтоФормаОбъекта (Булево) Необязательный. Истина - для формы объекта, Ложь - для формы списка. -// +// ВидОбработок - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид обработки. +// ПолноеИмяИлиСсылкаРодителяИлиРаздела - СправочникСсылка.ИдентификаторыОбъектовМетаданных, Строка - +// Объект метаданных (Ссылка или ПолноеИмя). +// Для назначаемых обработок - справочника или документа. +// Для глобальных обработок - подсистемы. +// ЭтоФормаОбъекта - Булево - Необязательный. +// Истина - для формы объекта. +// Ложь - для формы списка. +// // Возвращаемое значение: -// (ТаблицаЗначений) -// |- Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) -// |- Идентификатор (Строка) Идентификатор команды, как он задан разработчиком дополнительного объекта. -// |- ВариантЗапуска (ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок) Способ вызова команды дополнительного объекта. -// |- Представление (Строка) Представление команды для конечного пользователя. -// |- ПоказыватьОповещение (Булево) Показывать оповещение пользователю после выполнения -// |- Модификатор (Строка) Модификатор команды +// ТаблицаЗначений - Команды дополнительных отчетов или обработок +// * Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка дополнительного отчета или обработки. +// * Идентификатор - Строка - Идентификатор команды, как он задан разработчиком дополнительного объекта. +// * ВариантЗапуска - ПеречислениеСсылка.СпособыВызоваДополнительныхОбработок - +// Способ вызова команды дополнительного объекта. +// * Представление - Строка - Наименование команды в пользовательском интерфейсе. +// * ПоказыватьОповещение - Булево - Показывать оповещение пользователю после выполнения команды. +// * Модификатор - Строка - Модификатор команды. // Функция НовыйЗапросПоДоступнымКомандам(ВидОбработок, ПолноеИмяИлиСсылкаРодителяИлиРаздела, ЭтоФормаОбъекта = Неопределено) Экспорт ЭтоГлобальныеОбработки = ( @@ -1102,17 +1228,19 @@ Возврат Запрос; КонецФункции -// Функция возвращает таблицу значений со списком объектов метаданных, -// к которым может быть применена обработка переданного вида. -// Список объектов метаданных берется из общий команд, соответствующих -// виду обработки. Для глобальных обработок возвращается пустой набор. -// Параметры -// Вид - Перечисление.ВидыДополнительныхОтчетовИОбработок - вид внешней обработки -// Возвращаемое значение -// ТаблицаЗначений с колонками -// ПолноеИмяОбъектаМетаданных - строка - полное имя объекта метаданных, например "Справочник.Валюты" -// Класс - строка - класс метаданных, например "Справочник" -// Объект - строка - имя объекта метаданных, например "Валюты" +// Определяет список объектов метаданных, к которым может быть применена назначаемая обработка переданного вида. +// +// Параметры: +// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид внешней обработки. +// +// Возвращаемое значение: +// Неопределено - Если передан некорректный Вид. +// ТаблицаЗначений - Описание объектов метаданных. +// * ПолноеИмяОбъектаМетаданных - Строка - Полное имя объекта метаданных, например "Справочник.Валюты". +// * ОбъектНазначения - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка объекта метаданных. +// * ВидОбъектаМетаданных - Строка - Вид объекта метаданных. +// * Представление - Строка - Представление объекта метаданных. +// * ПолноеПредставление - Строка - Представление имени и вида объекта метаданных. // Функция НазначаемыеОбъектыМетаданныхПоВидуВнешнегоОбъекта(Вид) Экспорт Назначение = Новый ТаблицаЗначений; @@ -1127,27 +1255,27 @@ Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.ТипПараметраКоманды.Типы(); + МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта.ТипПараметраКоманды.Типы(); ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиОтчеты.ТипПараметраКоманды.Типы(); + МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ОтчетыОбъекта.ТипПараметраКоманды.Типы(); ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиПечатныеФормы.ТипПараметраКоманды.Типы(); + МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ДополнительныеПечатныеФормыОбъекта.ТипПараметраКоманды.Типы(); ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда - МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов.ТипПараметраКоманды.Типы(); + МассивТиповИлиМетаданных = Метаданные.ОбщиеКоманды.СозданиеСвязанныхОбъектов.ТипПараметраКоманды.Типы(); ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками(МассивТиповИлиМетаданных); + МассивТиповИлиМетаданных = РазделыДополнительныхОбработок(); ИначеЕсли Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами(МассивТиповИлиМетаданных); + МассивТиповИлиМетаданных = РазделыДополнительныхОтчетов(); Иначе @@ -1185,25 +1313,29 @@ Возврат Назначение; КонецФункции -// Проверяет, что обработка относится к категории глобальных. -// Параметры -// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - вид обработки -// Возвращаемое значение -// Истина - обработка относится к категории глобальных -// Ложь - обработка относится к категории назначаемых +// Возвращает Истина если вид относится к категории глобальных дополнительных отчетов или обработок. +// +// Параметры: +// Вид - ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Вид внешней обработки. +// +// Возвращаемое значение: +// Истина - обработка относится к категории глобальных +// Ложь - обработка относится к категории назначаемых // Функция ПроверитьГлобальнаяОбработка(Вид) Экспорт Возврат Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка - ИЛИ Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет; + Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет; КонецФункции -// Возвращает вид обработки по строковому представлению -// Параметры -// СтроковоеПредставление - Строка - строковое представление вида обработки -// Возвращаемое значение -// ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - вид обработки +// Преобразует вид дополнительных отчетов или обработок из строковой константы в ссылку перечисления. +// +// Параметры: +// СтроковоеПредставление - Строка - Строковое представление вида. +// +// Возвращаемое значение: +// ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок - Ссылка вида. // Функция ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СтроковоеПредставление) Экспорт @@ -1223,8 +1355,7 @@ КонецФункции -// Преобразует ссылку вида в строковую константу. -// +// Преобразует вид дополнительных отчетов или обработок из ссылки перечисления в строковую константу. Функция ВидВСтроку(СсылкаВида) Экспорт Если СсылкаВида = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда @@ -1251,8 +1382,7 @@ КонецФункции -// Возвращает имя рабочего места команды -// +// Возвращает имя рабочего места команды. Функция ПредставлениеРаздела(Раздел) Экспорт Если Раздел = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() ИЛИ Раздел = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка() Тогда @@ -1272,8 +1402,7 @@ ПредставлениеРаздела); КонецФункции -// Функция для добавления команд дополнительных обработок в список "своих" -// +// Функция для добавления команд дополнительных обработок в список "своих". Процедура ДобавитьКомандыВСписокСвоих(МассивКоманд) Экспорт Для Каждого ЭлементСтрока Из МассивКоманд Цикл @@ -1289,8 +1418,7 @@ КонецПроцедуры -// Функция для исключения команд дополнительных обработок из списока "своих" -// +// Функция для исключения команд дополнительных обработок из списока "своих". Процедура УдалитьКомандыИзСпискаСвоих(МассивКоманд) Экспорт Для Каждого ЭлементСтрока Из МассивКоманд Цикл @@ -1309,14 +1437,12 @@ КонецПроцедуры -// Проверяет интегрирована ли конфигурация с подсистемой хранилищем вариантов отчетов -// +// Проверяет интегрирована ли конфигурация с подсистемой хранилищем вариантов отчетов. Функция ИспользуетсяИнтеграцияСВариантамиОтчетов() Экспорт Возврат Метаданные.ХранилищаНастроек.Найти("ХранилищеВариантовОтчетов") <> Неопределено; КонецФункции // Проверяет наличие права добавления дополнительных отчетов и обработок. -// Функция ПравоДобавления(Знач ДополнительнаяОбработка = Неопределено) Экспорт Результат = Ложь; @@ -1325,7 +1451,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПриПроверкеПраваДобавления(ДополнительнаяОбработка, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда @@ -1339,7 +1465,7 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда Результат = Пользователи.ЭтоПолноправныйПользователь(, Истина); Иначе - Результат = Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок, ПолныеПрава"); + Результат = Пользователи.РолиДоступны("ДобавлениеИзменениеДополнительныхОтчетовИОбработок"); КонецЕсли; КонецЕсли; @@ -1348,104 +1474,13 @@ КонецФункции -// Получает список настроек дополнительных отчетов и обработок у переданного пользователя справочника +// Проверяет возможность выгрузки дополнительного отчета или обработки из программы в файл. // // Параметры: -// ПользовательСсылка - СправочникСсылка.Пользователи - пользователь, у которого нужно получить настройки. -// Настройки - Структура - прочие пользовательские настройки. -// |-НазваниеНастройки - Строка - название, которое будет отображаться в дереве настроек обработки. -// |-КартинкаНастройки - Картинка - картинка, которая будет отображаться в дереве обработки. -// |-СписокНастроек - СписокЗначений - список полученных настроек +// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки // -Процедура ПолучитьНастройкиДополнительныхОтчетовИОбработок(ПользовательСсылка, Настройки) Экспорт - - // Название строки настроек, отображаемое в дереве настроек обработки - НазваниеНастройки = НСтр("ru='Настройки быстрого доступа к дополнительным отчетам и обработкам'"); - - // Картинка строки настроек - КартинкаНастройки = ""; - - // Список дополнительных отчетов и обработок, находящихся в быстром доступе у пользователя - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ПользовательскиеНастройкиДоступаКОбработкам.ДополнительныйОтчетИлиОбработка КАК Объект, - | ПользовательскиеНастройкиДоступаКОбработкам.ИдентификаторКоманды КАК Идентификатор, - | ПользовательскиеНастройкиДоступаКОбработкам.Пользователь КАК Пользователь - |ИЗ - | РегистрСведений.ПользовательскиеНастройкиДоступаКОбработкам КАК ПользовательскиеНастройкиДоступаКОбработкам - |ГДЕ - | Пользователь = &Пользователь"; - - Запрос.Параметры.Вставить("Пользователь", ПользовательСсылка); - - РезультатЗапроса = Запрос.Выполнить().Выгрузить(); - - Настройки = Новый Структура; - Настройки.Вставить("НазваниеНастройки", НазваниеНастройки); - Настройки.Вставить("КартинкаНастройки", КартинкаНастройки); - Настройки.Вставить("СписокНастроек", РезультатЗапроса); - -КонецПроцедуры - -// Сохраняет команды дополнительных отчетов и обработок переданным пользователям справочника -// -// Параметры: -// Настройки - СписокЗначений - список ключей сохраняемых настроек -// ПользователиПолучатели - Массив - элемент массива - СправочникСсылка.Пользователи - пользователи, -// которым нужно скопировать настройки -// -Процедура ДобавитьКомандыВСписокБыстрогоДоступа(Настройки, ПользователиПолучатели) Экспорт - - Для Каждого ПользовательПриемник Из ПользователиПолучатели Цикл - - Для Каждого ЭлементСтрока Из Настройки Цикл - Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); - - Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; - Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; - Запись.Пользователь = ПользовательПриемник; - Запись.Доступно = Истина; - - Запись.Записать(Истина); - КонецЦикла; - - КонецЦикла; - -КонецПроцедуры - -// Очищает команды дополнительных отчетов и обработок переданному пользователю справочника -// -// Параметры: -// СписокКлючей - СписокЗначений - список ключей очищаемых настроек -// ОчищаемыйПользователь - СправочникСсылка.Пользователи - пользователь, у -// которого нужно очистить настройки -// -Процедура УдалитьКомандыИзСпискаБыстрогоДоступа(СписокКлючей, ОчищаемыйПользователь) Экспорт - - Для Каждого ЭлементСтрока Из СписокКлючей Цикл - - Запись = РегистрыСведений.ПользовательскиеНастройкиДоступаКОбработкам.СоздатьМенеджерЗаписи(); - - Запись.ДополнительныйОтчетИлиОбработка = ЭлементСтрока.Значение; - Запись.ИдентификаторКоманды = ЭлементСтрока.Представление; - Запись.Пользователь = ОчищаемыйПользователь; - - Запись.Прочитать(); - - Запись.Удалить(); - - КонецЦикла; - -КонецПроцедуры - -// Функция возвращает признак возможности выгрузки уже существующей в ИБ дополнительной обработки -// в файл -// -// Параметры: -// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки. -// -// Возвращаемое значение: булево. +// Возвращаемое значение: +// Булево // Функция ВозможнаВыгрузкаОбработкиВФайл(Знач Обработка) Экспорт @@ -1455,7 +1490,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПриПроверкеВозможностиЗагрузкиОбработкиИзФайла(Обработка, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда @@ -1470,13 +1505,13 @@ КонецФункции -// Функция возвращает признак возможности загрузки уже существующей в ИБ дополнительной обработки -// из файла +// Проверяет возможность загрузки уже существующей в ИБ дополнительной обработки из файла. // // Параметры: -// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки. +// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки // -// Возвращаемое значение: булево. +// Возвращаемое значение: +// Булево // Функция ВозможнаЗагрузкаОбработкиИзФайла(Знач Обработка) Экспорт @@ -1486,7 +1521,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПриПроверкеВозможностиВыгрузкиОбработкиВФайл(Обработка, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда @@ -1501,13 +1536,13 @@ КонецФункции -// Функция возвращает флаг отображения пользователю расширенной информации о дополнительном -// отчете или обработке. +// Возвращает флажок отображения пользователю расширенной информации о дополнительном отчете или обработке. // // Параметры: -// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки, +// Обработка - СправочникСсылка.ДополнительныеОтчетыИОбработки // -// Возвращаемое значение: Булево. +// Возвращаемое значение: +// Булево // Функция ОтображатьРасширеннуюИнформацию(Знач Обработка) Экспорт @@ -1517,7 +1552,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПриПроверкеНеобходимостиОтображенияРасширеннойИнформации(Обработка, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда @@ -1532,9 +1567,7 @@ КонецФункции -// Возвращает виды публикации дополнительных отчетов и обработок, недоступные для использования -// в текущей модели информационной базы. -// +// Виды публикации, недоступные для использования в текущем режиме работы программы. Функция НедоступныеВидыПубликации() Экспорт Результат = Новый Массив; @@ -1542,7 +1575,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); НедоступныеВидыПубликации = Модуль.НедоступныеВидыПубликации(); ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Результат, НедоступныеВидыПубликации, Истина); @@ -1558,22 +1591,21 @@ // каталога дополнительных обработок менеджера сервиса. // // Параметры: -// Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки, -// Отказ - булево, флаг отказа от выполнения записи элемента справочника. +// Источник - СправочникОбъект.ДополнительныеОтчетыИОбработки +// Отказ - булево, флаг отказа от выполнения записи элемента справочника. // Процедура ПередЗаписьюДополнительнойОбработки(Источник, Отказ) Экспорт ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПередЗаписьюДополнительнойОбработки(Источник, Отказ); КонецЦикла; КонецПроцедуры - // Процедура должна вызываться из события ПередУдалением справочника // ДополнительныеОтчетыИОбработки. // @@ -1586,7 +1618,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПередУдалениемДополнительнойОбработки(Источник, Отказ); КонецЦикла; @@ -1594,7 +1626,6 @@ КонецПроцедуры // Запись ошибки в журнал регистрации по дополнительному отчету или обработке. -// Процедура ЗаписатьОшибку(Ссылка, ТекстСообщения, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт ЗаписьЖурналаРегистрации( ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы(Неопределено), @@ -1609,7 +1640,6 @@ КонецПроцедуры // Запись ошибки в журнал регистрации по дополнительному отчету или обработке. -// Процедура ЗаписатьИнформацию(Ссылка, ТекстСообщения, Реквизит1 = Неопределено, Реквизит2 = Неопределено, Реквизит3 = Неопределено) Экспорт ЗаписьЖурналаРегистрации( ДополнительныеОтчетыИОбработкиКлиентСервер.НаименованиеПодсистемы(Неопределено), @@ -1627,7 +1657,7 @@ // Локальные служебные процедуры и функции // Вывод команд заполнения в формах объектов. -Процедура СформироватьПодменюКомандЗаполнения(ЭтаФорма, Параметры) +Процедура СформироватьПодменюКомандЗаполнения(Форма, Параметры) ТекстЗапроса = "ВЫБРАТЬ РАЗЛИЧНЫЕ @@ -1678,12 +1708,12 @@ КонецЕсли; // Определение группы, в которую будут добавлены команды. - Элементы = ЭтаФорма.Элементы; + Элементы = Форма.Элементы; ПредустановленныеКоманды = Новый Массив; Подменю = Элементы.Найти("ПодменюДополнительныхОбработокЗаполнения"); Если Подменю = Неопределено Тогда - Подменю = Элементы.Вставить("ПодменюДополнительныхОбработокЗаполнения", Тип("ГруппаФормы"), ЭтаФорма.КоманднаяПанель); + Подменю = Элементы.Вставить("ПодменюДополнительныхОбработокЗаполнения", Тип("ГруппаФормы"), Форма.КоманднаяПанель); Иначе Для Каждого Элемент Из Подменю.ПодчиненныеЭлементы Цикл ПредустановленныеКоманды.Добавить(Элемент); @@ -1707,7 +1737,7 @@ ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Идентификатор", Новый ОписаниеТипов("Строка"), ИмяТаблицы)); ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ЭтоОтчет", Новый ОписаниеТипов("Булево"), ИмяТаблицы)); - ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); // Добавление команд и элементов под команды. НомерЭлемента = 0; @@ -1717,15 +1747,15 @@ НомерЭлемента = НомерЭлемента + 1; ИмяЭлемента = "КомандаДополнительнойОбработки" + Формат(НомерЭлемента, "ЧГ="); - СтрокаТаблицы = ЭтаФорма.КомандыДополнительныхОбработок.Добавить(); + СтрокаТаблицы = Форма.КомандыДополнительныхОбработок.Добавить(); ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка); СтрокаТаблицы.ИмяЭлемента = ИмяЭлемента; - Команда = ЭтаФорма.Команды.Добавить(ИмяЭлемента); + Команда = Форма.Команды.Добавить(ИмяЭлемента); Команда.Действие = "Подключаемый_ВыполнитьНазначаемуюКоманду"; Команда.Заголовок = СтрокаТаблицы.Представление; - Элемент = ЭтаФорма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Подменю); + Элемент = Форма.Элементы.Добавить(ИмяЭлемента, Тип("КнопкаФормы"), Подменю); Элемент.ИмяКоманды = ИмяЭлемента; Элемент.ТолькоВоВсехДействиях = Ложь; КонецЦикла; @@ -1737,7 +1767,6 @@ КонецПроцедуры // Для внутреннего использования -// Функция ПолучитьТаблицуЗаписей(ПользователиСДопОбработками) ТекстЗапроса = @@ -1803,7 +1832,6 @@ КонецФункции // Для внутреннего использования -// Функция ПолучитьМассивПользователейСДоступомКДополнительнымОбработкам() Результат = Новый Массив; @@ -1814,7 +1842,7 @@ ВсеПользователи = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); Для Каждого Пользователь Из ВсеПользователи Цикл - Если Пользователи.РолиДоступны(ПроверяемыеРоли, Пользователь) Тогда + Если Пользователи.РолиДоступны(ПроверяемыеРоли, Пользователь, Ложь) Тогда Результат.Добавить(Пользователь); КонецЕсли; КонецЦикла; @@ -1840,7 +1868,6 @@ КонецФункции // Для внутреннего использования -// Процедура ВыполнитьКомандуДополнительногоОтчетаИлиОбработки(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, Знач СценарийВБезопасномРежиме = Ложь) Если СценарийВБезопасномРежиме Тогда @@ -1864,7 +1891,6 @@ КонецПроцедуры // Для внутреннего использования -// Процедура ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, ОбъектыНазначения, Знач СценарийВБезопасномРежиме = Ложь) Если СценарийВБезопасномРежиме Тогда @@ -1884,7 +1910,6 @@ КонецПроцедуры // Для внутреннего использования -// Процедура ВыполнитьКомандуСозданияСвязанныхОбъектов(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, ОбъектыНазначения, ИзмененныеОбъекты, Знач СценарийВБезопасномРежиме = Ложь) Если СценарийВБезопасномРежиме Тогда @@ -1906,7 +1931,6 @@ КонецПроцедуры // Для внутреннего использования -// Процедура ВыполнитьКомандуФормированияПечатнойФормы(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, ОбъектыНазначения, Знач СценарийВБезопасномРежиме = Ложь) Если СценарийВБезопасномРежиме Тогда @@ -1926,7 +1950,6 @@ КонецПроцедуры // Выполняет команду дополнительного отчета или обработки из объекта. -// Функция ВыполнитьКомандуВнешнегоОбъекта(ВнешнийОбъект, ИдентификаторКоманды, ПараметрыКоманды, АдресРезультата) СведенияОВнешнемОбъекте = ВнешнийОбъект.СведенияОВнешнейОбработке(); @@ -2013,7 +2036,6 @@ КонецФункции // Для внутреннего использования -// Процедура ВыполнитьСценарийВБезопасномРежиме(ВнешнийОбъект, ПараметрыКоманды, ОбъектыНазначения = Неопределено) РасширениеБезопасногоРежима = ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный; @@ -2034,7 +2056,6 @@ // Другие // Для внутреннего использования -// Функция ЗарегистрироватьОбработку(Знач Объект, Знач ПараметрыРегистрации) Экспорт ВидДополнительнаяОбработка = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка; @@ -2055,7 +2076,11 @@ Результат = Новый Структура("ИмяОбъекта, СтароеИмяОбъекта, Успешно, ИмяОбъектаЗанято, Конфликтующие, КраткоеПредставлениеОшибки"); Результат.ИмяОбъектаЗанято = Ложь; Результат.Успешно = Ложь; - Результат.СтароеИмяОбъекта = ?(Объект.ЭтоНовый(), Объект.ИмяОбъекта, Объект.Ссылка.ИмяОбъекта); + Если Объект.ЭтоНовый() Тогда + Результат.СтароеИмяОбъекта = Объект.ИмяОбъекта; + Иначе + Результат.СтароеИмяОбъекта = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Объект.Ссылка, "ИмяОбъекта"); + КонецЕсли; РегистрационныеДанные = ПолучитьРегистрационныеДанные(Объект, ПараметрыРегистрации, Результат); Если РегистрационныеДанные = Неопределено Тогда @@ -2234,7 +2259,6 @@ КонецФункции // Для внутреннего использования -// Функция ПолучитьРегистрационныеДанные(Знач Объект, Знач ПараметрыРегистрации, Знач ПараметрыОбработки) Результат = Новый Структура; @@ -2244,7 +2268,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПриПолученииРегистрационныхДанных(Объект, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда @@ -2257,20 +2281,22 @@ // Подключение и получение имени, под которым объект будет подключаться Менеджер = ?(ПараметрыРегистрации.ЭтоОтчет, ВнешниеОтчеты, ВнешниеОбработки); - - #Если ТолстыйКлиентОбычноеПриложение Тогда - ПараметрыОбработки.ИмяОбъекта = ПолучитьИмяВременногоФайла(); - ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПараметрыРегистрации.АдресДанныхОбработки); - ДвоичныеДанные.Записать(ПараметрыОбработки.ИмяОбъекта); - #Иначе - ПараметрыОбработки.ИмяОбъекта = СокрЛП(Менеджер.Подключить(ПараметрыРегистрации.АдресДанныхОбработки, , Истина)); - #КонецЕсли + ПараметрыОбработки.ИмяОбъекта = СокрЛП(Менеджер.Подключить(ПараметрыРегистрации.АдресДанныхОбработки, , Истина)); // Получение сведений о внешней обработке ВнешнийОбъект = Менеджер.Создать(ПараметрыОбработки.ИмяОбъекта); ВнешнийОбъектМетаданные = ВнешнийОбъект.Метаданные(); - РегистрационныеДанные = ВнешнийОбъект.СведенияОВнешнейОбработке(); + Попытка + РегистрационныеДанные = ВнешнийОбъект.СведенияОВнешнейОбработке(); + Исключение + ТекстПредупреждения = НСтр("ru='Невозможно подключить дополнительный отчет/обработку из файла: + | + |%1.'"); + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстПредупреждения; + КонецПопытки; + Если РегистрационныеДанные.Наименование = Неопределено ИЛИ РегистрационныеДанные.Информация = Неопределено Тогда Если РегистрационныеДанные.Наименование = Неопределено Тогда РегистрационныеДанные.Наименование = ВнешнийОбъектМетаданные.Представление(); @@ -2297,10 +2323,6 @@ КомандаОписание.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок[КомандаОписание.Использование]; КонецЦикла; - #Если ТолстыйКлиентОбычноеПриложение Тогда - ПараметрыОбработки.ИмяОбъекта = ВнешнийОбъектМетаданные.Имя; - #КонецЕсли - Возврат РегистрационныеДанные; КонецЕсли; @@ -2308,28 +2330,25 @@ КонецФункции // Процедура вызывается для выполнения проверки возможности выполнения дополнительной обработки -// Процедура ПроверитьВозможностьВыполнения(Ссылка) ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ПроверитьВозможностьВыполнения(Ссылка); КонецЦикла; КонецПроцедуры -// Функция возвращает параметры, которые должны использоваться для подключения внешней обработки -// к информационной базе и ее выполнения. +// Параметры для подключения и выполнения внешнего отчета или обработки к программе. // // Параметры: -// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки. +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки // // Возвращаемое значение: -// Структура, ключи: -// БезопасныйРежим - булево, флаг подключения дополнительной обработки в безопасном режиме, -// ХранилищеОбработки - ХранилищеЗначения, содержащее ДвоичныеДанные, содержащие файл -// дополнительной обработки. +// Структура - Параметры подключения +// * ХранилищеОбработки - ХранилищеЗначения - ДвоичныеДанные для подключения. +// * БезопасныйРежим - Булево - Подключать в безопасном режиме. // Функция ОпределитьПараметрыЗапуска(Ссылка) Экспорт @@ -2340,7 +2359,7 @@ ОбработчикиУсловныхВызовов = ДополнительныеОтчетыИОбработкиПовтИсп.ОбработчикиИнтеграции(); Для Каждого ОбработчикУсловныхВызовов Из ОбработчикиУсловныхВызовов Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОбработчикУсловныхВызовов); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОбработчикУсловныхВызовов); Модуль.ОпределениеПараметровЗапуска(Ссылка, Результат, СтандартнаяОбработка); Если Не СтандартнаяОбработка Тогда diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl index 3944d19a9..c666ba1f8 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВАвтономномРежиме/Module.bsl @@ -273,7 +273,7 @@ // СтандартнаяОбработка - Булево, в этот параметр в данной процедуре устанавливается флаг выполнения // стандартной обработки проверки права. // -Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка = Неопределено, Результат, СтандартнаяОбработка) Экспорт +Процедура ПриПроверкеПраваДобавления(Знач ДополнительнаяОбработка, Результат, СтандартнаяОбработка) Экспорт Если АвтономнаяРаботаСлужебный.ЭтоАвтономноеРабочееМесто() Тогда diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl index aa6bcc431..ddc13f911 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежиме/Module.bsl @@ -350,11 +350,11 @@ ПроверитьКорректностьВызоваПоОкружению(); - Если Не ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда ВызватьИсключение НСтр("ru = 'В данной конфигурации не поддерживается вызов функции ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПолучитьФайлИзИнтернета!'"); КонецЕсли; - ОбработчикПолученияФайлов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); + ОбработчикПолученияФайлов = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); Если Порт = 0 Тогда @@ -437,11 +437,11 @@ ПроверитьКорректностьВызоваПоОкружению(); - Если Не ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда ВызватьИсключение НСтр("ru = 'В данной конфигурации не поддерживается вызов функции ДополнительныеОтчетыИОбработкиВБезопасномРежиме.ПередатьФайлВИнтернет!'"); КонецЕсли; - ОбработчикПолученияФайлов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); + ОбработчикПолученияФайлов = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); Если Порт = 0 Тогда @@ -475,66 +475,43 @@ Прокси = ОбработчикПолученияФайлов.ПолучитьПрокси(Протокол); - ПараметрыСоединения = Новый Массив; - ПараметрыСоединения.Добавить(ИмяСервера); - ПараметрыСоединения.Добавить(Порт); - ПараметрыСоединения.Добавить(ИмяПользователя); - ПараметрыСоединения.Добавить(Пароль); - ПараметрыСоединения.Добавить(Прокси); - Если ВРег(Протокол) = "FTP" Тогда - - ПараметрыСоединения.Добавить(ПассивноеСоединение); - - ПараметрыСоединения.Добавить(Таймаут); - Попытка - Соединение = Новый(Тип("FTPСоединение"), ПараметрыСоединения); + Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, ПассивноеСоединение, Таймаут); Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании FTP-соединения с сервером %1:'") + Символы.ПС + "%2"; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - - КонецПопытки; + КонецПопытки; Иначе - - ПараметрыСоединения.Добавить(Таймаут); - Если ЗащищенноеСоединение = Истина Тогда - ИмяТип = "ЗащищенноеСоединениеOpenSSL"; - ЗащищенноеСоединение = Новый(Тип(ИмяТип)); + ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL; Иначе ЗащищенноеСоединение = Неопределено; КонецЕсли; - ПараметрыСоединения.Добавить(ЗащищенноеСоединение); Попытка - Соединение = Новый(Тип("HTTPСоединение"), ПараметрыСоединения); + Соединение = Новый HTTPСоединение(ИмяСервера, Порт, ИмяПользователя, Пароль, Прокси, Таймаут, ЗащищенноеСоединение); Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании HTTP-соединения с сервером %1:'") + Символы.ПС + "%2"; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; КонецЕсли; Попытка Соединение.Записать(ВременныйФайл, ПутьКФайлуНаСервере); Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при передаче файла на сервер %1:'") + Символы.ПС + "%2"; ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - КонецПопытки; КонецФункции diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl index 86f404eae..d12b92f2d 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебный/Module.bsl @@ -21,9 +21,9 @@ СтандартнаяОбработка = Истина; ОписанияРазрешений = Неопределено; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебныйВМоделиСервиса"); + МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебныйВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВБезопасномРежимеСлужебныйВМоделиСервиса.ПолучитьРазрешенияСессииРасширенияБезопасногоРежима( КлючСессии, ОписанияРазрешений, diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl index 1df43bf1f..5864c2d6a 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервиса/Module.bsl @@ -267,11 +267,10 @@ АктуальныеКоманды.Колонки.Добавить("РегламентноеЗаданиеGUID", Новый ОписаниеТипов("УникальныйИдентификатор")); Для Каждого АктуальнаяКоманда Из АктуальныеКоманды Цикл - + НастройкаЗадания = Задания.Найти(АктуальнаяКоманда.Идентификатор, "Идентификатор"); Если НастройкаЗадания <> Неопределено Тогда ЗаполнитьЗначенияСвойств(АктуальнаяКоманда, НастройкаЗадания, "РегламентноеЗаданиеРасписание,РегламентноеЗаданиеИспользование"); - КонецЕсли; КонецЦикла; @@ -296,7 +295,7 @@ ИспользуемаяОбработка.Назначение.Загрузить(СправочникиИДокументы); ИспользуемаяОбработка.ИспользоватьДляФормыСписка = НастройкиРасположенияКоманд.ИспользоватьДляФормыСписка; ИспользуемаяОбработка.ИспользоватьДляФормыОбъекта = НастройкиРасположенияКоманд.ИспользоватьДляФормыОбъекта; - + КонецЕсли; ИспользуемаяОбработка.Наименование = ОписаниеИнсталляции.Представление; @@ -328,31 +327,37 @@ // Размещение вариантов дополнительного отчета в разделах, которые выбрал пользователь // при установке (или разработчик при создании манифеста, если пользователь не // изменял настройки по-умолчанию. - Для Каждого ВариантДополнительногоОтчета Из ВариантыДополнительногоОтчета Цикл + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); - ВариантСсылка = Неопределено; - КлючВарианта = ВариантДополнительногоОтчета.Ключ; - ДополнительныеОтчетыИОбработки.ПриОпределенииСсылкиВариантаДополнительногоОтчета(ИспользуемаяОбработка.Ссылка, КлючВарианта, ВариантСсылка); - Если ВариантСсылка <> Неопределено Тогда + Для Каждого ВариантДополнительногоОтчета Из ВариантыДополнительногоОтчета Цикл - Вариант = ВариантСсылка.ПолучитьОбъект(); - Вариант.Размещение.Очистить(); - - Для Каждого ЭлементРазмещения Из ВариантДополнительногоОтчета.Размещение Цикл + ВариантСсылка = МодульВариантыОтчетов.ПолучитьСсылку(ИспользуемаяОбработка.Ссылка, ВариантДополнительногоОтчета.Ключ); + Если ВариантСсылка <> Неопределено Тогда - РазмещениеВарианта = Вариант.Размещение.Добавить(); - РазмещениеВарианта.Использование = Истина; - РазмещениеВарианта.РазделИлиГруппа = ЭлементРазмещения.Раздел; - РазмещениеВарианта.Важный = ЭлементРазмещения.Важный; - РазмещениеВарианта.СмТакже = ЭлементРазмещения.СмТакже; + Вариант = ВариантСсылка.ПолучитьОбъект(); + Вариант.Размещение.Очистить(); - КонецЦикла; + Для Каждого ЭлементРазмещения Из ВариантДополнительногоОтчета.Размещение Цикл + + РазмещениеВарианта = Вариант.Размещение.Добавить(); + РазмещениеВарианта.Использование = Истина; + РазмещениеВарианта.РазделИлиГруппа = ЭлементРазмещения.Раздел; + РазмещениеВарианта.Важный = ЭлементРазмещения.Важный; + РазмещениеВарианта.СмТакже = ЭлементРазмещения.СмТакже; + + КонецЦикла; + + Вариант.Записать(); + + КонецЕсли; - Вариант.Записать(); - - КонецЕсли; + КонецЦикла; - КонецЦикла; + КонецЕсли; + + + // Отправляется сообщение в МС об успешной установке обработки в области данных Сообщение = СообщенияВМоделиСервиса.НовоеСообщение( @@ -407,7 +412,7 @@ КонецЕсли; ЗафиксироватьТранзакцию(); - + Исключение ОтменитьТранзакцию(); @@ -416,7 +421,7 @@ КонецПопытки; ОбменСообщениями.ДоставитьСообщения(); - + КонецПроцедуры // Выполняет удаление поставляемой дополнительной обработки из текущей области данных. @@ -555,9 +560,10 @@ , ПоставляемаяОбработка, Строка(ИдентификаторИнсталляции) + Символы.ПС + Символы.ВК + ТекстИсключения); - + НачатьТранзакцию(); Попытка + // Отправляется сообщение в МС об ошибке установки обработки в области данных Сообщение = СообщенияВМоделиСервиса.НовоеСообщение( СообщенияКонтрольДополнительныхОтчетовИОбработокИнтерфейс.СообщениеОшибкаУстановкиДополнительногоОтчетаИлиОбработки()); @@ -571,7 +577,7 @@ Сообщение, РаботаВМоделиСервисаПовтИсп.КонечнаяТочкаМенеджераСервиса(), Истина); - + ЗафиксироватьТранзакцию(); Исключение @@ -826,19 +832,19 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); @@ -864,6 +870,12 @@ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииВерсииИнтерфейсаКорреспондента"].Добавить( "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -877,8 +889,8 @@ // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ИспользованиеКаталогаДополнительныхОтчетовИОбработокВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МинимальныйИнтервалРегламентныхЗаданийДополнительныхОтчетовИОбработокВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "НезависимоеИспользованиеДополнительныхОтчетовИОбработокВМоделиСервиса"); @@ -941,10 +953,10 @@ Процедура ПриОпределенииПсевдонимовОбработчиков(СоответствиеИменПсевдонимам) Экспорт СоответствиеИменПсевдонимам.Вставить("ДополнительныеОтчетыИОбработкиВМоделиСервиса.АктуализацияНастроекИспользуемойОбработки"); - СоответствиеИменПсевдонимам.Вставить("ДополнительныеОтчетыИОбработкиВМоделиСервиса.УстановитьПоставляемуюОбработкуПриПолучении"); - // Совместимость с версиями БСП 2.1.6.14 и ниже + // Совместимость с версиями БСП 2.2.1.25 и ниже СоответствиеИменПсевдонимам.Вставить("ДополнительныеОтчетыИОбработкиВМоделиСервиса.УстановитьПоставляемуюОбработкуВОбластьДанных", "ДополнительныеОтчетыИОбработкиВМоделиСервиса.УстановитьПоставляемуюОбработкуПриПолучении"); + СоответствиеИменПсевдонимам.Вставить("ДополнительныеОтчетыИОбработкиВМоделиСервиса.УстановитьПоставляемуюОбработкуПриПолучении"); СоответствиеИменПсевдонимам.Вставить("ДополнительныеОтчетыИОбработкиВМоделиСервиса.УдалитьПоставляемуюОбработкуИзОбластиДанных"); СоответствиеИменПсевдонимам.Вставить(Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок.ИмяМетода); @@ -1017,6 +1029,19 @@ КонецПроцедуры +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. +// +// Параметры: +// Типы - Массив(Типы). +// +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИнсталляцииПоставляемыхДополнительныхОтчетовИОбработокВОбластиДанных); + +КонецПроцедуры + + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -1217,7 +1242,7 @@ // Проверка на выполнение обновления версии обработки Если ПараметрыПубликацииИспользуемойОбработки.Версия <> ПараметрыПубликацииПоставляемойОбработки.Версия Тогда ВызватьИсключение НСтр( - "ru = 'Использование дополнительной обработки временно недоступно по причине выполнения ее обновления. Данный процесс может занять несколько минут. Приносим извинения за доставленные неудобства.'"); + "ru = 'Использование дополнительной обработки временно недоступно по причине выполнения ее обновления. Данный процесс может занять несколько минут. Приносим извинения на доставленные неудобства.'"); КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl index 493ec00bd..e703f3f6b 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифест/Module.bsl @@ -74,11 +74,10 @@ ВыбранныеРазделы = ОбъектВерсии.Разделы.Выгрузить(); - ВозможныеРазделы = Новый Массив; Если ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительнаяОбработка Тогда - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОбработками(ВозможныеРазделы); + ВозможныеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОбработок(); Иначе - ДополнительныеОтчетыИОбработкиПереопределяемый.ОпределитьРазделыСДополнительнымиОтчетами(ВозможныеРазделы); + ВозможныеРазделы = ДополнительныеОтчетыИОбработки.РазделыДополнительныхОтчетов(); КонецЕсли; РабочийСтол = ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(); @@ -119,13 +118,13 @@ ВозможныеОбъектыНазначения = Новый Массив(); Если ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ЗаполнениеОбъекта Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта; ИначеЕсли ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиОтчеты; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ОтчетыОбъекта; ИначеЕсли ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиПечатныеФормы; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеПечатныеФормыОбъекта; ИначеЕсли ОбъектОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.СозданиеСвязанныхОбъектов Тогда - ОбщаяКоманда = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов; + ОбщаяКоманда = Метаданные.ОбщиеКоманды.СозданиеСвязанныхОбъектов; КонецЕсли; Для Каждого ТипПараметраКоманды Из ОбщаяКоманда.ТипПараметраКоманды.Типы() Цикл ВозможныеОбъектыНазначения.Добавить(Метаданные.НайтиПоТипу(ТипПараметраКоманды)); diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl index f0b2cea2a..fd2ccf1ed 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиВызовСервера/Module.bsl @@ -7,8 +7,7 @@ // ПРОГРАММНЫЙ ИНТЕРФЕЙС // Подключает внешнюю обработку (отчет). -// -// Подробнее - см. описание ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(). +// Подробнее - см. ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(). // Функция ПодключитьВнешнююОбработку(Ссылка) Экспорт @@ -16,9 +15,8 @@ КонецФункции -// Создает и возвращает экземпляр внешней обработки (отчета) -// -// Подробнее - см. описание ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(). +// Создает и возвращает экземпляр внешней обработки (отчета). +// Подробнее - см. ДополнительныеОтчетыИОбработки.ПолучитьОбъектВнешнейОбработки(). // Функция ПолучитьОбъектВнешнейОбработки(Ссылка) Экспорт @@ -27,10 +25,10 @@ КонецФункции // Функция возвращает вид публикации, который должен использоваться для -// конфликтующих дополнительных отчетов и обработок. +// конфликтующих дополнительных отчетов и обработок. // // Возвращаемое значение: -// ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок. +// ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок // Функция ВидПубликацииДляКонфликтующихОбработок() Экспорт @@ -42,8 +40,7 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Выполняет команду обработки и помещает результат во временное хранилище. -// -// Подробнее - см. описание ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(). +// Подробнее - см. ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(). // Функция ВыполнитьКоманду(ПараметрыКоманды, АдресРезультата = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl index ec3edad9a..0fee4ee7a 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиент/Module.bsl @@ -9,11 +9,11 @@ // Открывает форму с доступными командами. // // Параметры: -// ПараметрКоманды (...) Передается "как есть" из параметров обработчика команды. -// ПараметрыВыполненияКоманды (...) Передается "как есть" из параметров обработчика команды. -// Вид (Строка) Вид обработки, который можно получить из серии функций: -// ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<...>() -// ИмяРаздела (Строка) Имя раздела командного интерфейса, из которого вызывается команда. +// ПараметрКоманды - Передается "как есть" из параметров обработчика команды. +// ПараметрыВыполненияКоманды - Передается "как есть" из параметров обработчика команды. +// Вид - Строка - Вид обработки, который можно получить из серии функций: +// ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработки<...>() +// ИмяРаздела - Строка - Имя раздела командного интерфейса, из которого вызывается команда. // Процедура ОткрытьФормуКомандДополнительныхОтчетовИОбработок(ПараметрКоманды, ПараметрыВыполненияКоманды, Вид, ИмяРаздела = "") Экспорт @@ -42,8 +42,8 @@ // Открывает форму дополнительного отчета с заданным вариантом. // // Параметры: -// Ссылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) -// КлючВарианта (Строка) +// Ссылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка дополнительного отчета. +// КлючВарианта - Строка - Имя варианта дополнительного отчета. // Процедура ОткрытьВариантДополнительногоОтчета(Ссылка, КлючВарианта) Экспорт @@ -61,22 +61,24 @@ // Подключает длительную операцию для выполнения команды из формы внешнего отчета или обработки. // // Параметры: -// ИдентификаторКоманды (Строка) Имя команды как оно задано в функции СведенияОВнешнейОбработке() модуля объекта. -// ПараметрыКоманды (Структура) Параметры выполнения команды. -// Обязательные параметры: -// |- ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки) Передается "Как есть" из параметров формы. -// Необязательные параметры: -// |- СопровождающийТекст (Строка) Текст длительной операции. -// |- Заголовок (Строка) Заголовок длительной операции. -// |- ОбъектыНазначения (Массив) Ссылки объектов, для которых выполняется команда. -// Используется для назначаемых дополнительных обработок. -// |- РезультатВыполнения (Структура) См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). -// Зарезервированные параметры: -// |- ИдентификаторКоманды (Строка) -// Помимо обязательных параметров может содержать "свои" для использования в обработчике команды. -// При добавлении собственных параметров желательно использовать префикс, -// исключающий пересечение со стандартными механизмами, например "Контекст...". -// ЭтаФорма (УправляемаяФорма) Форма, в которую необходимо вернуть результат. +// ИдентификаторКоманды - Строка - Имя команды как оно задано в функции СведенияОВнешнейОбработке() модуля объекта. +// ПараметрыКоманды - Структура - Параметры выполнения команды. +// Обязательные параметры: +// * ДополнительнаяОбработкаСсылка - СправочникСсылка.ДополнительныеОтчетыИОбработки - +// Передается "Как есть" из параметров формы. +// Необязательные параметры: +// * СопровождающийТекст - Строка - Текст длительной операции. +// * Заголовок - Строка - Заголовок длительной операции. +// * ОбъектыНазначения - Массив - Ссылки объектов, для которых выполняется команда. +// Используется для назначаемых дополнительных обработок. +// * РезультатВыполнения - Структура - +// См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). +// Служебные параметры, зарезервированные подсистемой: +// * ИдентификаторКоманды - Строка - Имя выполняемой команды. +// Помимо обязательных параметров может содержать "свои" для использования в обработчике команды. +// При добавлении собственных параметров желательно использовать префикс, +// исключающий пересечение со стандартными механизмами, например "Контекст...". +// Форма - УправляемаяФорма - Форма, в которую необходимо вернуть результат. // // Важно: // Результат возвращается в обработчике ОбработкаВыбора(). @@ -85,7 +87,7 @@ // Примеры использования можно найти в дополнительной обработке демо базы. // // Возвращаемое значение: -// РезультатВыполнения (Структура) См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). +// РезультатВыполнения - Структура - См. СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(). // // Пример обработчика команды: //&НаКлиенте @@ -97,23 +99,23 @@ // Состояние(ПараметрыКоманды.СопровождающийТекст); // Если СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда // РезультатВыполнения = ВыполнитьКомандуНапрямую(ИдентификаторКоманды, ПараметрыКоманды); -// ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтаФорма, РезультатВыполнения); +// ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтотОбъект, РезультатВыполнения); // Иначе -// ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); +// ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект); // КонецЕсли; //КонецПроцедуры // // Пример кода выполнения команды напрямую: //&НаСервере //Функция ВыполнитьКомандуНапрямую(ИдентификаторКоманды, ПараметрыКоманды) -// Возврат ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма); +// Возврат ДополнительныеОтчетыИОбработки.ВыполнитьКомандуИзФормыВнешнегоОбъекта(ИдентификаторКоманды, ПараметрыКоманды, ЭтотОбъект); //КонецФункции // // Пример обработчика выбора: //&НаКлиенте //Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) // Если ИсточникВыбора.ИмяФормы = ДополнительныеОтчетыИОбработкиКлиент.ИмяФормыДлительнойОперации() Тогда -// ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтаФорма, ВыбранноеЗначение); +// ДополнительныеОтчетыИОбработкиКлиент.ПоказатьРезультатВыполненияКоманды(ЭтотОбъект, ВыбранноеЗначение); // КонецЕсли; //КонецПроцедуры // @@ -123,7 +125,7 @@ // ОбъектСсылка = Параметры.ДополнительнаяОбработкаСсылка; //КонецПроцедуры // -Процедура ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, ЭтаФорма) Экспорт +Процедура ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыКоманды, Форма) Экспорт ДополнительнаяОбработкаСсылка = Неопределено; ПараметрыКоманды.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); @@ -148,14 +150,14 @@ ПараметрыФормы = Новый Структура("ПараметрыЗапускаФоновогоЗадания", ПараметрыКоманды); - ОткрытьФорму(ИмяФормыДлительнойОперации(), ПараметрыФормы, ЭтаФорма); + ОткрытьФорму(ИмяФормыДлительнойОперации(), ПараметрыФормы, Форма); КонецПроцедуры // Возвращает имя формы для идентификации результата выполнения длительной операции. // // Возвращаемое значение: -// (Строка) См. ВыполнитьКомандуВФоне(). +// Строка - См. ВыполнитьКомандуВФоне(). // Функция ИмяФормыДлительнойОперации() Экспорт @@ -167,17 +169,18 @@ // Возвращает Ложь если для выполнения команды требуется серверный вызов. // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма, из которой вызвана команда. -// ИмяЭлемента (Строка) Имя команды формы, которая была нажата. +// Форма - УправляемаяФорма - Форма, из которой вызвана команда. +// ИмяЭлемента - Строка - Имя команды формы, которая была нажата. // -// Возвращаемое значение: -// (Булево) Истина - Команда обработки выполнена неконтекстно. -// Ложь - Для выполнения требуется контекстный вызов сервера. +// Возвращаемое значение: +// Булево - Способ выполнения. +// Истина - Команда обработки выполняется неконтекстно. +// Ложь - Для выполнения требуется контекстный вызов сервера. // -Функция ВыполнитьНазначаемуюКомандуНаКлиенте(ЭтаФорма, ИмяЭлемента) Экспорт +Функция ВыполнитьНазначаемуюКомандуНаКлиенте(Форма, ИмяЭлемента) Экспорт ОчиститьСообщения(); - Найденные = ЭтаФорма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)); + Найденные = Форма.КомандыДополнительныхОбработок.НайтиСтроки(Новый Структура("ИмяЭлемента", ИмяЭлемента)); Если Найденные.Количество() = 0 Тогда ВызватьИсключение НСтр("ru = 'Команда не найдена'"); КонецЕсли; @@ -185,83 +188,104 @@ ВыполняемаяКоманда = Найденные[0]; Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ЗаполнениеФормы") Тогда - Возврат Ложь; // Требуется контекстный вызов сервера + Возврат Ложь; // Для выполнения команды требуется контекстный вызов сервера. КонецЕсли; - Объект = ЭтаФорма.Объект; - Если Объект.Ссылка.Пустая() ИЛИ ЭтаФорма.Модифицированность Тогда + Объект = Форма.Объект; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Форма", Форма); + ДополнительныеПараметры.Вставить("Объект", Объект); + ДополнительныеПараметры.Вставить("ВыполняемаяКоманда", ВыполняемаяКоманда); + + Если Объект.Ссылка.Пустая() ИЛИ Форма.Модифицированность Тогда ТекстВопроса = СтрЗаменить( НСтр("ru = 'Для выполнения команды ""%1"" необходимо записать данные.'"), "%1", ВыполняемаяКоманда.Представление); Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Записать и продолжить'")); + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Записать и продолжить'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, 1); - - Если Ответ <> 1 Тогда - Возврат Истина; - КонецЕсли; - - Если НЕ ЭтаФорма.Записать() Тогда - Возврат Истина; - КонецЕсли; + Обработчик = Новый ОписаниеОповещения("ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да); + Иначе + ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение(-1, ДополнительныеПараметры); КонецЕсли; - ПараметрыВызоваСервера = Новый Структура; - ПараметрыВызоваСервера.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); - ПараметрыВызоваСервера.Вставить("ДополнительнаяОбработкаСсылка", ВыполняемаяКоманда.Ссылка); - ПараметрыВызоваСервера.Вставить("ОбъектыНазначения", Новый Массив); - ПараметрыВызоваСервера.Вставить("ИмяФормы", ЭтаФорма.ИмяФормы); - ПараметрыВызоваСервера.ОбъектыНазначения.Добавить(Объект.Ссылка); - - ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда); - - // Контроль за результатом выполнения поддерживается только для серверных методов. - // Если открывается форма или вызывается клиентский метод, то вывод результата выполнения выполняется обработкой. - Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда - - ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); - Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ОткрытьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, ЭтаФорма); - Иначе - ОткрытьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, ЭтаФорма); - КонецЕсли; - - ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда - - ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); - Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, ЭтаФорма); - Иначе - ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, ЭтаФорма); - КонецЕсли; - ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения); - - ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода") - Или ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда - - ПараметрыВызоваСервера.Вставить("РезультатВыполнения", СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения()); - ДополнительныеОтчетыИОбработкиВызовСервера.ВыполнитьКоманду(ПараметрыВызоваСервера, Неопределено); - ЭтаФорма.Прочитать(); - ПоказатьРезультатВыполненияКоманды(ЭтаФорма, ПараметрыВызоваСервера.РезультатВыполнения); - - КонецЕсли; - - Возврат Истина; + Возврат Истина; // Для выполнения команды достаточно клиентского контекста. КонецФункции // Отображает результат выполнения команды. // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма, для которой требуется вывод. -// РезультатВыполнения (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения() +// Форма - УправляемаяФорма - Форма, для которой требуется вывод. +// РезультатВыполнения - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения() // -Процедура ПоказатьРезультатВыполненияКоманды(ЭтаФорма, РезультатВыполнения) Экспорт +Процедура ПоказатьРезультатВыполненияКоманды(Форма, РезультатВыполнения) Экспорт - СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(ЭтаФорма, РезультатВыполнения); + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Форма, РезультатВыполнения); + +КонецПроцедуры + +// Показывает диалог выбора файлов и помещает выбранные файлы во временное хранилище. +// Совмещает работу методов глобального метода НачатьПомещениеФайла и ПоместитьФайлы, +// возвращая идентичный результат вне зависимости от того, подключено расширение работы с файлами, или нет. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора. +// ИдентификаторФормы - УникальныйИдентификатор - Уникальный идентификатор формы, из которой выполняется размещение файла. +// НачальноеИмяФайла - Строка - Полный путь и имя файла, которые будут предложены пользователю в начале выбора. +// ПараметрыДиалога - Структура, Неопределено - См. свойства ДиалогВыбораФайла в синтакс-помощнике. +// Используется в случае, если удалось подключить расширение работы с файлами. +// +// Значение первого параметра, возвращаемого в ОбработчикРезультата: +// ПомещенныеФайлы - Результат выбора. +// * - Неопределено - Пользователь отказался от выбора. +// * - Массив из ОписаниеПереданногоФайла, Структура - Пользователь выбрал файл. +// ** Имя - Строка - Полное имя выбранного файла. +// ** Хранение - Строка - Адрес во временном хранилище, по которому размещен файл. +// +// Ограничения: +// Используется только для интерактивного выбора в диалоге. +// Не используется для выбора каталогов - эта опция не поддерживается веб-клиентом. +// Не поддерживается множественный выбор в веб-клиенте, если не установлено расширение работы с файлами. +// Не поддерживается передача адреса временного хранилища. +// +Процедура ПоказатьПомещениеФайла(ОбработчикРезультата, ИдентификаторФормы, НачальноеИмяФайла, ПараметрыДиалога) Экспорт + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + + Если ПараметрыДиалога = Неопределено Тогда + ПараметрыДиалога = Новый Структура; + КонецЕсли; + Если ПараметрыДиалога.Свойство("Режим") Тогда + Режим = ПараметрыДиалога.Режим; + Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда + ВызватьИсключение НСтр("ru = 'Выбор каталога не поддерживается'"); + КонецЕсли; + Иначе + Режим = РежимДиалогаВыбораФайла.Открытие; + КонецЕсли; + + Диалог = Новый ДиалогВыбораФайла(Режим); + Диалог.ПолноеИмяФайла = НачальноеИмяФайла; + ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога); + + ПомещенныеФайлы = Новый Массив; + ВыборВыполнен = ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина, ИдентификаторФормы); + ОбработатьРезультатПомещенияФайла(ВыборВыполнен, ПомещенныеФайлы, Неопределено, ДополнительныеПараметры); + + Иначе + + Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ДополнительныеПараметры); + НачатьПомещениеФайла(Обработчик, , НачальноеИмяФайла, Истина, ИдентификаторФормы); + + КонецЕсли; КонецПроцедуры @@ -272,7 +296,13 @@ // Обработчики условных вызовов // Открывает форму подбора дополнительных отчетов. -// +// +// Параметры: +// ЭлементФормы - Произвольный - Элемент формы, в который выполняется подбор элементов. +// +// Места использования: +// Справочник.РассылкиОтчетов.Форма.ФормаЭлемента.ДобавитьДополнительныйОтчет(). +// Процедура РассылкаОтчетовПодборДопОтчета(ЭлементФормы) Экспорт ДополнительныйОтчет = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет"); @@ -325,54 +355,7 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Вызывает диалог сохранения редактируемых данных произвольной формы -// Вызывается из обработчиков "ПередЗакрытием" и "ПриЗакрытии". -// -// Параметры: -// Отказ - (...) Флаг отказа от закрытия формы. -// |- (Булево) для обработчика "ПередЗакрытием", используется для толстого и тонкого клиентов -// |- (Неопределено) для обработчика "ПриЗакрытии", используется для веб клиента -// Модифицированность - (Булево) Флаг модифицированности формы. -// Если форма не модифицирована, то сохранять нечего и запрос не требуется -// -// Возвращаемое значение: -// (Булево) Необходимость сохранения данных формы. -// -Функция СохранитьДанныеПроизвольнойФормы(Модифицированность, Отказ = Неопределено) Экспорт - // Изменение сохраняемых данных должно устанавливать модифицированность формы - Если Модифицированность <> Истина Тогда - Возврат Ложь; - КонецЕсли; - - // Определение клиента - #Если ВебКлиент Тогда - ЭтоВебКлиент = Истина; - #Иначе - ЭтоВебКлиент = Ложь; - #КонецЕсли - - // Предупреждение необходимо вызвать только один раз для одного клиента - Если ЭтоВебКлиент <> (Отказ = Неопределено) Тогда - Возврат Ложь; - КонецЕсли; - - ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); - Кнопки = ?(ЭтоВебКлиент, РежимДиалогаВопрос.ДаНет, РежимДиалогаВопрос.ДаНетОтмена); - Ответ = Вопрос(ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Да Тогда - Возврат Истина; - КонецЕсли; - - Если НЕ ЭтоВебКлиент И Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - КонецЕсли; - - Возврат Ложь; -КонецФункции - // Выводит оповещение перед запуском команды. -// Процедура ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда) Экспорт Если ВыполняемаяКоманда.ПоказыватьОповещение Тогда ПоказатьОповещениеПользователя(НСтр("ru = 'Команда выполняется...'"), , ВыполняемаяКоманда.Представление); @@ -380,12 +363,11 @@ КонецПроцедуры // Открывает форму обработки. -// -Процедура ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, ЭтаФорма, ОбъектыНазначения) Экспорт +Процедура ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, Форма, ОбъектыНазначения) Экспорт ПараметрыОбработки = Новый Структура("ИдентификаторКоманды, ДополнительнаяОбработкаСсылка, ИмяФормы, КлючСессии"); ПараметрыОбработки.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор; ПараметрыОбработки.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка; - ПараметрыОбработки.ИмяФормы = ?(ЭтаФорма = Неопределено, Неопределено, ЭтаФорма.ИмяФормы); + ПараметрыОбработки.ИмяФормы = ?(Форма = Неопределено, Неопределено, Форма.ИмяФормы); ПараметрыОбработки.КлючСессии = ВыполняемаяКоманда.Ссылка.УникальныйИдентификатор(); Если ТипЗнч(ОбъектыНазначения) = Тип("Массив") Тогда @@ -394,7 +376,7 @@ #Если ТолстыйКлиентОбычноеПриложение Тогда ВнешняяОбработка = ДополнительныеОтчетыИОбработкиВызовСервера.ПолучитьОбъектВнешнейОбработки(ВыполняемаяКоманда.Ссылка); - ФормаОбработки = ВнешняяОбработка.ПолучитьФорму(, ЭтаФорма); + ФормаОбработки = ВнешняяОбработка.ПолучитьФорму(, Форма); Если ФормаОбработки = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для отчета или обработки ""%1"" не назначена основная форма, @@ -408,23 +390,22 @@ #Иначе ИмяОбработки = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ОткрытьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки, ЭтаФорма); + ОткрытьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки, Форма); Иначе - ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки, ЭтаФорма); + ОткрытьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки, Форма); КонецЕсли; #КонецЕсли КонецПроцедуры // Выполняет клиентский метод обработки. -// -Процедура ВыполнитьКлиентскийМетодОбработки(ВыполняемаяКоманда, ЭтаФорма, ОбъектыНазначения) Экспорт +Процедура ВыполнитьКлиентскийМетодОбработки(ВыполняемаяКоманда, Форма, ОбъектыНазначения) Экспорт ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда); ПараметрыОбработки = Новый Структура("ИдентификаторКоманды, ДополнительнаяОбработкаСсылка, ИмяФормы"); ПараметрыОбработки.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор; ПараметрыОбработки.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка; - ПараметрыОбработки.ИмяФормы = ?(ЭтаФорма = Неопределено, Неопределено, ЭтаФорма.ИмяФормы); + ПараметрыОбработки.ИмяФормы = ?(Форма = Неопределено, Неопределено, Форма.ИмяФормы);; Если ТипЗнч(ОбъектыНазначения) = Тип("Массив") Тогда ПараметрыОбработки.Вставить("ОбъектыНазначения", ОбъектыНазначения); @@ -432,7 +413,7 @@ #Если ТолстыйКлиентОбычноеПриложение Тогда ВнешняяОбработка = ДополнительныеОтчетыИОбработкиВызовСервера.ПолучитьОбъектВнешнейОбработки(ВыполняемаяКоманда.Ссылка); - ФормаОбработки = ВнешняяОбработка.ПолучитьФорму(, ЭтаФорма); + ФормаОбработки = ВнешняяОбработка.ПолучитьФорму(, Форма); Если ФормаОбработки = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Для отчета или обработки ""%1"" не назначена основная форма, @@ -444,9 +425,9 @@ #Иначе ИмяОбработки = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); Если ВыполняемаяКоманда.ЭтоОтчет Тогда - ФормаОбработки = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки, ЭтаФорма); + ФормаОбработки = ПолучитьФорму("ВнешнийОтчет."+ ИмяОбработки +".Форма", ПараметрыОбработки, Форма); Иначе - ФормаОбработки = ПолучитьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки, ЭтаФорма); + ФормаОбработки = ПолучитьФорму("ВнешняяОбработка."+ ИмяОбработки +".Форма", ПараметрыОбработки, Форма); КонецЕсли; #КонецЕсли @@ -506,15 +487,29 @@ КонецПроцедуры // Формирует табличный документ в форме подсистемы "Печать". -// -Процедура ВыполнитьОткрытиеПечатнойФормы(ВыполняемаяКоманда, ЭтаФорма, ОбъектыНазначения) Экспорт +Процедура ВыполнитьОткрытиеПечатнойФормы(ВыполняемаяКоманда, Форма, ОбъектыНазначения) Экспорт СтандартнаяОбработка = Истина; ДополнительныеОтчетыИОбработкиКлиентПереопределяемый.ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ОбъектыНазначения, СтандартнаяОбработка); - Если СтандартнаяОбработка И Не УправлениеПечатьюКлиент.ПроверитьДокументыПроведены(ОбъектыНазначения) Тогда + Если Не СтандартнаяОбработка Тогда Возврат; КонецЕсли; + Параметры = Новый Структура; + Параметры.Вставить("ВыполняемаяКоманда", ВыполняемаяКоманда); + Параметры.Вставить("Форма", Форма); + + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьОткрытиеПечатнойФормыЗавершение", ЭтотОбъект, Параметры); + УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыНазначения, Форма); + +КонецПроцедуры + +// Продолжение процедуры ВыполнитьОткрытиеПечатнойФормы. +Процедура ВыполнитьОткрытиеПечатнойФормыЗавершение(ОбъектыНазначения, ДополнительныеПараметры) Экспорт + + ВыполняемаяКоманда = ДополнительныеПараметры.ВыполняемаяКоманда; + Форма = ДополнительныеПараметры.Форма; + ПараметрыИсточника = Новый Структура; ПараметрыИсточника.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначения); @@ -523,6 +518,144 @@ ПараметрыОткрытия.Вставить("ИсточникДанных", ВыполняемаяКоманда.Ссылка); ПараметрыОткрытия.Вставить("ПараметрыИсточника", ПараметрыИсточника); - ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ЭтаФорма); + ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, Форма); КонецПроцедуры + +// Обработчик продолжения выполнения назначаемой команды на клиенте. +Процедура ВыполнитьНазначаемуюКомандуНаКлиентеЗавершение(Ответ, ДополнительныеПараметры) Экспорт + Форма = ДополнительныеПараметры.Форма; + Если Ответ = КодВозвратаДиалога.Да Тогда + Если НЕ Форма.Записать() Тогда + Возврат; + КонецЕсли; + ИначеЕсли Ответ <> -1 Тогда + Возврат; + КонецЕсли; + + ВыполняемаяКоманда = ДополнительныеПараметры.ВыполняемаяКоманда; + Объект = ДополнительныеПараметры.Объект; + + ПараметрыВызоваСервера = Новый Структура; + ПараметрыВызоваСервера.Вставить("ИдентификаторКоманды", ВыполняемаяКоманда.Идентификатор); + ПараметрыВызоваСервера.Вставить("ДополнительнаяОбработкаСсылка", ВыполняемаяКоманда.Ссылка); + ПараметрыВызоваСервера.Вставить("ОбъектыНазначения", Новый Массив); + ПараметрыВызоваСервера.Вставить("ИмяФормы", Форма.ИмяФормы); + ПараметрыВызоваСервера.ОбъектыНазначения.Добавить(Объект.Ссылка); + + ПоказатьОповещениеПриВыполненииКоманды(ВыполняемаяКоманда); + + // Контроль за результатом выполнения поддерживается только для серверных методов. + // Если открывается форма или вызывается клиентский метод, то вывод результата выполнения выполняется обработкой. + Если ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда + + ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); + Если ВыполняемаяКоманда.ЭтоОтчет Тогда + ОткрытьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + Иначе + ОткрытьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + КонецЕсли; + + ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда + + ИмяВнешнегоОбъекта = ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку(ВыполняемаяКоманда.Ссылка); + Если ВыполняемаяКоманда.ЭтоОтчет Тогда + ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешнийОтчет."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + Иначе + ФормаВнешнегоОбъекта = ПолучитьФорму("ВнешняяОбработка."+ ИмяВнешнегоОбъекта +".Форма", ПараметрыВызоваСервера, Форма); + КонецЕсли; + ФормаВнешнегоОбъекта.ВыполнитьКоманду(ПараметрыВызоваСервера.ИдентификаторКоманды, ПараметрыВызоваСервера.ОбъектыНазначения); + + ИначеЕсли ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода") + Или ВыполняемаяКоманда.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда + + ПараметрыВызоваСервера.Вставить("РезультатВыполнения", СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения()); + ДополнительныеОтчетыИОбработкиВызовСервера.ВыполнитьКоманду(ПараметрыВызоваСервера, Неопределено); + Форма.Прочитать(); + ПоказатьРезультатВыполненияКоманды(Форма, ПараметрыВызоваСервера.РезультатВыполнения); + + КонецЕсли; +КонецПроцедуры + +// Аналог ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста, работающий за 1 вызов. +// В отличие от ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария позволяет устанавливать свой заголовок +// и работает с реквизитами таблиц. +// +Процедура РедактироватьМногострочныйТекст(ФормаИлиОбработчик, ТекстРедактирования, ВладелецРеквизита, ИмяРеквизита, Знач Заголовок = "") Экспорт + + Если ПустаяСтрока(Заголовок) Тогда + Заголовок = НСтр("ru = 'Комментарий'"); + КонецЕсли; + + ПараметрыИсточника = Новый Структура; + ПараметрыИсточника.Вставить("ФормаИлиОбработчик", ФормаИлиОбработчик); + ПараметрыИсточника.Вставить("ВладелецРеквизита", ВладелецРеквизита); + ПараметрыИсточника.Вставить("ИмяРеквизита", ИмяРеквизита); + Обработчик = Новый ОписаниеОповещения("РедактироватьМногострочныйТекстЗавершение", ЭтотОбъект, ПараметрыИсточника); + + ПоказатьВводСтроки(Обработчик, ТекстРедактирования, Заголовок, , Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные обработчики асинхронных диалогов + +// Обработчик результата работы процедуры ПоказатьПомещениеФайла. +Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(ДополнительныеПараметры.ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда + + Если ВыборВыполнен = Истина Тогда + Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда + РезультатВыбора = АдресИлиРезультатВыбора; + Иначе + РезультатВыбора = Новый Массив; + ЭлементРезультата = Новый Структура; + ЭлементРезультата.Вставить("Хранение", АдресИлиРезультатВыбора); + ЭлементРезультата.Вставить("Имя", ВыбранноеИмяФайла); + РезультатВыбора.Добавить(ЭлементРезультата); + КонецЕсли; + Иначе + РезультатВыбора = Неопределено; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, РезультатВыбора); + + КонецЕсли; + +КонецПроцедуры + +// Обработчик результата работы процедуры РедактироватьМногострочныйТекст. +Процедура РедактироватьМногострочныйТекстЗавершение(Текст, ПараметрыИсточника) Экспорт + + Если ТипЗнч(ПараметрыИсточника.ФормаИлиОбработчик) = Тип("УправляемаяФорма") Тогда + Форма = ПараметрыИсточника.ФормаИлиОбработчик; + Обработчик = Неопределено; + Иначе + Форма = Неопределено; + Обработчик = ПараметрыИсточника.ФормаИлиОбработчик; + КонецЕсли; + + Если Текст <> Неопределено Тогда + + Если ТипЗнч(ПараметрыИсточника.ВладелецРеквизита) = Тип("ДанныеФормыЭлементДерева") + Или ТипЗнч(ПараметрыИсточника.ВладелецРеквизита) = Тип("ДанныеФормыЭлементКоллекции") Тогда + ЗаполнитьЗначенияСвойств(ПараметрыИсточника.ВладелецРеквизита, Новый Структура(ПараметрыИсточника.ИмяРеквизита, Текст)); + Иначе + ПараметрыИсточника.ВладелецРеквизита[ПараметрыИсточника.ИмяРеквизита] = Текст; + КонецЕсли; + + Если Форма <> Неопределено Тогда + Если Не Форма.Модифицированность Тогда + Форма.Модифицированность = Истина; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Обработчик <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Обработчик, Текст); + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl index 53d5c9bee..1d3f0d691 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентПереопределяемый/Module.bsl @@ -7,11 +7,12 @@ // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Выполняет дополнительные действия перед формированием печатной формы. -// +// // Параметры: // ПечатаемыеОбъекты - Массив - ссылки на объекты, для которых выполняется команда печати; // СтандартнаяОбработка - Булево - признак необходимости проверки проведенности печатаемых документов, // если установить в Ложь, то проверка выполняться не будет. +// Процедура ПередВыполнениемКомандыПечатиВнешнейПечатнойФормы(ПечатаемыеОбъекты, СтандартнаяОбработка) Экспорт КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl index dddd0a00d..48efef294 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиКлиентСервер/Module.bsl @@ -6,56 +6,110 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Имя типа дополнительных отчетов и обработок - "печатная форма". -// +//////////////////////////////////////////////////////////////////////////////// +// Имена видов объектов. + +// Печатная форма. Функция ВидОбработкиПечатнаяФорма() Экспорт Возврат "ПечатнаяФорма"; // не локализуется КонецФункции -// Имя типа дополнительных отчетов и обработок - "заполнение объекта". -// +// Заполнение объекта. Функция ВидОбработкиЗаполнениеОбъекта() Экспорт Возврат "ЗаполнениеОбъекта"; // не локализуется КонецФункции -// Имя типа дополнительных отчетов и обработок - "создание связанных объектов". -// +// Создание связанных объектов. Функция ВидОбработкиСозданиеСвязанныхОбъектов() Экспорт Возврат "СозданиеСвязанныхОбъектов"; // не локализуется КонецФункции -// Имя типа дополнительных отчетов и обработок - "назначаемый отчет". -// +// Назначаемый отчет. Функция ВидОбработкиОтчет() Экспорт Возврат "Отчет"; // не локализуется КонецФункции -// Имя типа дополнительных отчетов и обработок - "дополнительная обработка". -// +// Дополнительная обработка. Функция ВидОбработкиДополнительнаяОбработка() Экспорт Возврат "ДополнительнаяОбработка"; // не локализуется КонецФункции -// Имя типа дополнительных отчетов и обработок - "дополнительный отчет". -// +// Дополнительный отчет. Функция ВидОбработкиДополнительныйОтчет() Экспорт Возврат "ДополнительныйОтчет"; // не локализуется КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Имена типов команд. + +// Вызов клиентского метода. +Функция ТипКомандыВызовКлиентскогоМетода() Экспорт + + Возврат "ВызовКлиентскогоМетода"; // не локализуется + +КонецФункции + +// Вызов серверного метода. +Функция ТипКомандыВызовСерверногоМетода() Экспорт + + Возврат "ВызовСерверногоМетода"; // не локализуется + +КонецФункции + +// Открытие формы. +Функция ТипКомандыОткрытиеФормы() Экспорт + + Возврат "ОткрытиеФормы"; // не локализуется + +КонецФункции + +// Заполнение формы. +Функция ТипКомандыЗаполнениеФормы() Экспорт + + Возврат "ЗаполнениеФормы"; // не локализуется + +КонецФункции + +// Сценарий в безопасном режиме. +Функция ТипКомандыСценарийВБезопасномРежиме() Экспорт + + Возврат "СценарийВБезопасномРежиме"; // не локализуется + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Имена типов форм. Используются при настройке назначаемых объектов. + +// Идентификатор формы списка. +Функция ТипФормыСписка() Экспорт + + Возврат "ФормаСписка"; // не локализуется + +КонецФункции + +// Идентификатор формы объекта. +Функция ТипФормыОбъекта() Экспорт + + Возврат "ФормаОбъекта"; // не локализуется + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Другие процедуры и функции. + // Фильтр для диалогов выбора или сохранения дополнительных отчетов и обработок. -// Функция ФильтрДиалоговВыбораИСохранения() Экспорт Фильтр = НСтр("ru = 'Внешние отчеты и обработки (*.%1, *.%2)|*.%1;*.%2|Внешние отчеты (*.%1)|*.%1|Внешние обработки (*.%2)|*.%2'"); @@ -65,7 +119,6 @@ КонецФункции // Идентификатор, который используется для рабочего стола -// Функция ИдентификаторРабочегоСтола() Экспорт Возврат "РабочийСтол"; // не локализуется @@ -73,66 +126,8 @@ КонецФункции // Наименование подсистемы. -// Функция НаименованиеПодсистемы(КодЯзыка) Экспорт Возврат НСтр("ru = 'Дополнительные отчеты и обработки'", ?(КодЯзыка = Неопределено, ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка(), КодЯзыка)); КонецФункции - -// Идентификатор формы списка. -// -Функция ТипФормыСписка() Экспорт - - Возврат "ФормаСписка"; // не локализуется - -КонецФункции - -// Идентификатор формы объекта. -// -Функция ТипФормыОбъекта() Экспорт - - Возврат "ФормаОбъекта"; // не локализуется - -КонецФункции - -// Имя типа команд "вызов клиентского метода". -// -Функция ТипКомандыВызовКлиентскогоМетода() Экспорт - - Возврат "ВызовКлиентскогоМетода"; // не локализуется - -КонецФункции - -// Имя типа команд "вызов серверного метода". -// -Функция ТипКомандыВызовСерверногоМетода() Экспорт - - Возврат "ВызовСерверногоМетода"; // не локализуется - -КонецФункции - -// Имя типа команд "открытие формы". -// -Функция ТипКомандыОткрытиеФормы() Экспорт - - Возврат "ОткрытиеФормы"; // не локализуется - -КонецФункции - -// Имя типа команд "заполнение формы". -// -Функция ТипКомандыЗаполнениеФормы() Экспорт - - Возврат "ЗаполнениеФормы"; // не локализуется - -КонецФункции - -// Имя типа команд "Сценарий в безопасном режиме". -// -Функция ТипКомандыСценарийВБезопасномРежиме() Экспорт - - Возврат "СценарийВБезопасномРежиме"; // не локализуется - -КонецФункции - diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl index 194ea8a61..d98f35e0e 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПереопределяемый/Module.bsl @@ -6,17 +6,19 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Определяет разделы, в которых доступна команда вызова дополнительных обработок +// Определяет разделы, в которых доступна команда вызова дополнительных обработок. // // Параметры: -// Разделы (Массив) из (ОбъектМетаданных) +// Разделы - Массив - Разделы, в которых размещены команды вызова дополнительных обработок. +// * ОбъектМетаданных: Подсистема - Метаданные раздела (подсистемы). +// * Строка - Для рабочего стола. // // Описание: -// В Разделы необходимо добавить метаданные тех разделов, +// В Разделы необходимо добавить метаданные тех разделов, // в которых размещены команды вызова. // // Для рабочего стола вместо Метаданных необходимо добавлять -// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() +// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). // Процедура ОпределитьРазделыСДополнительнымиОбработками(Разделы) Экспорт @@ -24,17 +26,19 @@ КонецПроцедуры -// Определяет разделы, в которых доступна команда вызова дополнительных отчетов +// Определяет разделы, в которых доступна команда вызова дополнительных отчетов. // // Параметры: -// Разделы (Массив) из (ОбъектМетаданных) +// Разделы - Массив - Разделы, в которых размещены команды вызова дополнительных отчетов. +// * ОбъектМетаданных: Подсистема - Метаданные раздела (подсистемы). +// * Строка - Для рабочего стола. // // Описание: // В Разделы необходимо добавить метаданные тех разделов, // в которых размещены команды вызова. // // Для рабочего стола вместо Метаданных необходимо добавлять -// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола() +// ДополнительныеОтчетыИОбработкиКлиентСервер.ИдентификаторРабочегоСтола(). // Процедура ОпределитьРазделыСДополнительнымиОтчетами(Разделы) Экспорт diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl index 344ac3af1..124ccefa9 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиПовтИсп/Module.bsl @@ -7,8 +7,7 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Функция возвращает виды публикации дополнительных обработок, доступные в информационной базе -// +// Виды публикации дополнительных обработок, доступные в программе. Функция ДоступныеВидыПубликации() Экспорт Результат = Новый Массив(); @@ -26,10 +25,10 @@ КонецФункции -// Функция возвращает вид публикации, которые должен использоваться для конфликтующих -// дополнительных отчетов и обработок. +// Вид публикации, который должен использоваться для конфликтующих дополнительных отчетов и обработок. // -// Возвращаемое значение: ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок. +// Возвращаемое значение: +// ПеречислениеСсылка.ВариантыПубликацииДополнительныхОтчетовИОбработок // Функция ВидПубликацииДляКонфликтующихОбработок() Экспорт @@ -45,13 +44,12 @@ КонецФункции -// Функция возвращает перечень реквизитов справочников ДополнительныОтчетыИОбработки и -// ПоставляемыеДополнительныеОтчетыИОбработки, в которых хранятся значения, -// которые должны использоваться для подключения внешней обработки к информационной базе -// и выполнения кода дополнительной обработки. +// Имена реквизитов справочников, в которых хранятся параметры подключения +// дополнительных отчетов и обработок к программе. +// Для справочников ДополнительныОтчетыИОбработки и ПоставляемыеДополнительныеОтчетыИОбработки. // // Возвращаемое значение: -// Строка - имена реквизитов, разделенные запятой. +// Строка - имена реквизитов, разделенные запятой. // Функция ПараметрыЗапуска() Экспорт @@ -59,8 +57,7 @@ КонецФункции -// Формирует настройки формы для назначаемого объекта. -// +// Настройки формы для назначаемого объекта. Функция ПараметрыФормыНазначаемогоОбъекта(ПолноеИмяФормы, ТипФормы = Неопределено) Экспорт Если НЕ ПравоДоступа("Чтение", Метаданные.Справочники.ДополнительныеОтчетыИОбработки) Тогда Возврат ""; @@ -99,7 +96,7 @@ Если Результат.ЭтоФормаОбъекта Тогда // Форма объекта Результат.ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыОбъекта(); РодительТип = Тип(СтрЗаменить(РодительМетаданные.ПолноеИмя(), ".", "Ссылка.")); - Результат.ВыводитьПодменюЗаполнениеОбъекта = Метаданные.ОбщиеКоманды.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта.ТипПараметраКоманды.СодержитТип(РодительТип); + Результат.ВыводитьПодменюЗаполнениеОбъекта = Метаданные.ОбщиеКоманды.ЗаполнениеОбъекта.ТипПараметраКоманды.СодержитТип(РодительТип); Иначе // Форма списка Результат.ТипФормы = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипФормыСписка(); Результат.ВыводитьПодменюЗаполнениеОбъекта = Ложь; @@ -108,16 +105,16 @@ Возврат Новый ФиксированнаяСтруктура(Результат); КонецФункции -// Возвращает массив имен общих модулей, выполняющих роль интеграции подсистемы ДополнительныеОтчетыИОбработки -// с подсистемой ДополнительныеОтчетыИОбработкиВМоделиСервиса. +// Массив имен общих модулей для интеграции с подсистемой ДополнительныеОтчетыИОбработкиВМоделиСервиса. // -// Возвращаемое значение: ФиксированныйМассив(Строка). +// Возвращаемое значение: +// ФиксированныйМассив из Строка - Имена общих модулей. // Функция ОбработчикиИнтеграции() Экспорт Результат = Новый Массив(); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда Результат.Добавить("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); Результат.Добавить("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); diff --git a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl index 3b2cd129c..e73e9daa7 100644 --- a/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl +++ b/SSL/src/CommonModules/ДополнительныеОтчетыИОбработкиРегламентныеЗадания/Module.bsl @@ -17,8 +17,8 @@ Функция СоздатьНовоеЗадание(Знач Наименование) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И - ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.СоздатьНовоеЗадание(); КонецЕсли; @@ -40,8 +40,8 @@ Функция ПолучитьИдентификаторЗадания(Знач Задание) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И - ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.ПолучитьИдентификаторЗадания(Задание); КонецЕсли; @@ -61,8 +61,8 @@ Процедура УстановитьПараметрыЗадания(Задание, Использование, Наименование, Параметры, Расписание) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И - ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.УстановитьПараметрыЗадания(Задание, Использование, Параметры, Расписание); Возврат; КонецЕсли; @@ -90,8 +90,8 @@ Функция ПолучитьПараметрыЗадания(Знач Задание) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И - ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.ПолучитьПараметрыЗадания(Задание); КонецЕсли; @@ -115,8 +115,8 @@ Функция НайтиЗадание(Знач Идентификатор) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); Возврат МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.НайтиЗадание(Идентификатор); КонецЕсли; @@ -140,8 +140,8 @@ Процедура УдалитьЗадание(Знач Задание) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И - ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); + ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса.УдалитьЗадание(Задание); Возврат; КонецЕсли; diff --git a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl index 0be79e86d..3a7ceceb9 100644 --- a/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрации/Module.bsl @@ -4,60 +4,110 @@ // //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Процедура пакетной записи сообщений в журнал регистрации +// +// Параметры: СобытияДляЖурналаРегистрации - СписокЗначений, клиентская глобальная переменная +// После записи переменная очищается. +Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт + + Если ТипЗнч(СобытияДляЖурналаРегистрации) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + Если СобытияДляЖурналаРегистрации.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Для Каждого СообщениеЖурнала Из СобытияДляЖурналаРегистрации Цикл + ЗначениеСообщения = СообщениеЖурнала.Значение; + ИмяСобытия = ЗначениеСообщения.ИмяСобытия; + УровеньСобытия = УровеньСобытияПоПредставлению(ЗначениеСообщения.ПредставлениеУровня); + ДатаСобытия = ТекущаяДатаСеанса(); + Если ЗначениеСообщения.Свойство("ДатаСобытия") И ЗначениеЗаполнено(ЗначениеСообщения.ДатаСобытия) Тогда + ДатаСобытия = ЗначениеСообщения.ДатаСобытия; + КонецЕсли; + Комментарий = Строка(ДатаСобытия) + " " + ЗначениеСообщения.Комментарий; + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньСобытия,,, Комментарий); + КонецЦикла; + СобытияДляЖурналаРегистрации.Очистить(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Выполняет чтение событий журнала регистрации в соответствии с установленным отбором // // Параметры: -// ПараметрыОтчета - Структура, содержит параметры для чтения событий журнала регистрации -// АдресХранилища - Адрес временного хранилища, куда помещается итоговый результат // -// Журнал - ТаблицаЗначений, содержащая записи журнала регистрации -// ОтборЖурналаНаКлиенте - Структура, настройки отбора для чтения записей журнала регистрации -// КоличествоСобытий - Число, ограничивает число считываемых событий журнала -// УникальныйИдентификатор - УникальныйИдентификатор, уникальный идентификатор формы -// МенеджерВладельца - менеджер объекта, в форме которого отображается журнал регистрации, -// необходим для обратного вызова функций оформления -// ДобавлятьДополнительныеКолонки - Булево, определяет необходимость обратного вызова для добавления дополнительных колонок -// +// ПараметрыОтчета - Структура - Содержит параметры для чтения событий журнала регистрации. Содержит поля: +// Журнал - ТаблицаЗначений - Содержит записи журнала регистрации +// ОтборЖурналаНаКлиенте - Структура - Настройки отбора для чтения записей журнала регистрации +// КоличествоСобытий - Число - Ограничение числа считываемых событий журнала +// УникальныйИдентификатор - УникальныйИдентификатор - Уникальный идентификатор формы +// МенеджерВладельца - Произвольный - Менеджер объекта, в форме которого отображается журнал регистрации, +// необходим для обратного вызова функций оформления. +// ДобавлятьДополнительныеКолонки - Булево - Определяет необходимость обратного вызова для добавления +// дополнительных колонок +// АдресХранилища - Строка, УникальныйИдентификатор - Адрес временного хранилища для результата. +// +// Результат представляет собой структуру с полями: +// СобытияЖурнала - ТаблицаЗначений - Отобранные события. +// Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт - Журнал = ПараметрыОтчета.Журнал; - ОтборЖурналаНаКлиенте = ПараметрыОтчета.ОтборЖурналаРегистрации; - КоличествоСобытий = ПараметрыОтчета.КоличествоПоказываемыхСобытий; - УникальныйИдентификатор = ПараметрыОтчета.УникальныйИдентификатор; - МенеджерВладельца = ПараметрыОтчета.МенеджерВладельца; + Журнал = ПараметрыОтчета.Журнал; + ОтборЖурналаНаКлиенте = ПараметрыОтчета.ОтборЖурналаРегистрации; + КоличествоСобытий = ПараметрыОтчета.КоличествоПоказываемыхСобытий; + УникальныйИдентификатор = ПараметрыОтчета.УникальныйИдентификатор; + МенеджерВладельца = ПараметрыОтчета.МенеджерВладельца; ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки; - // Подготовка Отбора + // Проверяем параметры на корректность + ДатаНачала = Неопределено; + ДатаОкончания = Неопределено; + ДатыОтбораУказаны= ОтборЖурналаНаКлиенте.Свойство("ДатаНачала", ДатаНачала) И ОтборЖурналаНаКлиенте.Свойство("ДатаОкончания", ДатаОкончания) + И ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ОтборЖурналаНаКлиенте.ДатаОкончания); + + Если ДатыОтбораУказаны И ДатаНачала > ДатаОкончания + Тогда + ВызватьИсключение НСтр("ru = 'Некорректно заданы условия отбора журнала регистрации. Дата начала больше даты окончания.'"); + КонецЕсли; + + // Подготовка отбора Отбор = Новый Структура; Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение); КонецЦикла; ПреобразованиеОтбора(Отбор); - // Выгрузка отбираемых событий + // Выгрузка отбираемых событий и формирование структуры таблицы СобытияЖурнала = Новый ТаблицаЗначений; ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоСобытий); + СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число")); СобытияЖурнала.Колонки.Добавить("АдресДанных", Новый ОписаниеТипов("Строка")); + Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка")); КонецЕсли; - ПравилаУстановкиРисунка = Неопределено; - Если ДобавлятьДополнительныеКолонки Тогда - // Добавление дополнительных колонок МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала); КонецЕсли; - ПроверенныеПользователи = Новый Массив(); - ПсевдонимыСлужебныхПользователей = Новый Соответствие(); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ПсевдонимыПользователей = Новый Соответствие(); + Иначе + МодульРаботаВМоделиСервиса = Неопределено; + ПсевдонимыПользователей = Неопределено; + КонецЕсли; Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл - // Заполнение номеров картинок строк МенеджерВладельца.УстановитьНомерРисунка(СобытиеЖурнала); @@ -97,20 +147,24 @@ Если СобытиеЖурнала.Данные <> Неопределено Тогда Если СобытиеЖурнала.Данные.Свойство("Право") Тогда - СобытиеЖурнала.Данные = НСтр("ru = 'Право:'") + " " + СобытиеЖурнала.Данные.Право; + СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Право: %1'"), + СобытиеЖурнала.Данные.Право); Иначе - СобытиеЖурнала.Данные = НСтр("ru = 'Действие:'") + " " + СобытиеЖурнала.Данные.Действие + - ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ..."); + СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Действие: %1%2'"), + СобытиеЖурнала.Данные.Действие, ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...") ); КонецЕсли; КонецЕсли; ИначеЕсли СобытиеЖурнала.Событие = "_$Session$_.Authentication" - ИЛИ СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда + Или СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда + УстановитьСтрокуАдресаДанных(СобытиеЖурнала); СобытиеЖурналаДанные = ""; Если СобытиеЖурнала.Данные <> Неопределено Тогда - Для каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл + Для Каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл Если ЗначениеЗаполнено(СобытиеЖурналаДанные) Тогда СобытиеЖурналаДанные = СобытиеЖурналаДанные + ", ..."; Прервать; @@ -140,7 +194,9 @@ Если СобытиеЖурнала.Данные <> Неопределено Тогда СобытиеЖурнала.Данные.Свойство("Имя", ИмяПользователяИБ); КонецЕсли; - СобытиеЖурнала.Данные = НСтр("ru = 'Имя:'") + " " + ИмяПользователяИБ + ", ..."; + СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя: %1, ...'"), + ИмяПользователяИБ); КонецЕсли; @@ -153,40 +209,34 @@ СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя(); ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда - СобытиеЖурнала.ИмяПользователя = СобытиеЖурнала.ИмяПользователя + " " + НСтр("ru = '<Удален>'"); + СобытиеЖурнала.ИмяПользователя = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 <Удален>'"), + СобытиеЖурнала.ИмяПользователя); КонецЕсли; - Если ПроверенныеПользователи.Найти(СобытиеЖурнала.Пользователь) = Неопределено Тогда - - ПроверенныеПользователи.Добавить(СобытиеЖурнала.Пользователь); - - Если Пользователи.ЭтоНеразделенныйПользователь(СобытиеЖурнала.Пользователь) Тогда - - ПсевдонимСлужебногоПользователя = Пользователи.ПолноеИмяСлужебногоПользователя(СобытиеЖурнала.Пользователь); - - ПсевдонимыСлужебныхПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимСлужебногоПользователя); - СобытиеЖурнала.ИмяПользователя = ПсевдонимСлужебногоПользователя; - + Если МодульРаботаВМоделиСервиса <> Неопределено Тогда + Если ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь) = Неопределено Тогда + ПсевдонимПользователя = МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(СобытиеЖурнала.Пользователь); + ПсевдонимыПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимПользователя); + Иначе + ПсевдонимПользователя = ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь); КонецЕсли; - Иначе - - ПсевдонимСлужебногоПользователя = ПсевдонимыСлужебныхПользователей.Получить(СобытиеЖурнала.Пользователь); - Если ПсевдонимСлужебногоПользователя <> Неопределено Тогда - СобытиеЖурнала.ИмяПользователя = ПсевдонимСлужебногоПользователя; + Если ЗначениеЗаполнено(ПсевдонимПользователя) Тогда + СобытиеЖурнала.ИмяПользователя = ПсевдонимПользователя; КонецЕсли; - КонецЕсли; // Преобразование идентификатора в имя для использования в дальнейшем при установке отборе СобытиеЖурнала.Пользователь = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь); УстановитьПривилегированныйРежим(Ложь); - КонецЦикла; - ПоместитьВоВременноеХранилище(Новый Структура("СобытияЖурнала", - СобытияЖурнала), АдресХранилища); + // Успешное завершение + Результат = Новый Структура; + Результат.Вставить("СобытияЖурнала", СобытияЖурнала); + ПоместитьВоВременноеХранилище(Результат, АдресХранилища); КонецПроцедуры // Создает пользовательское представление отбора журнала регистрации @@ -421,3 +471,16 @@ СобытиеЖурнала.АдресДанных = ЗаписьXML.Закрыть(); КонецПроцедуры + +Функция УровеньСобытияПоПредставлению(ПредставлениеУровня) + Если ПредставлениеУровня = "Информация" Тогда + Возврат УровеньЖурналаРегистрации.Информация; + ИначеЕсли ПредставлениеУровня = "Ошибка" Тогда + Возврат УровеньЖурналаРегистрации.Ошибка; + ИначеЕсли ПредставлениеУровня = "Предупреждение" Тогда + Возврат УровеньЖурналаРегистрации.Предупреждение; + ИначеЕсли ПредставлениеУровня = "Примечание" Тогда + Возврат УровеньЖурналаРегистрации.Примечание; + КонецЕсли; +КонецФункции + diff --git a/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl new file mode 100644 index 000000000..eeaadb048 --- /dev/null +++ b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/Module.bsl @@ -0,0 +1,18 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// Процедуры и функции для работы с журналом регистрации. +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Процедура пакетной записи сообщений в журнал регистрации +// +// Параметры: СобытияДляЖурналаРегистрации - СписокЗначений, клиентская глобальная переменная +// После записи переменная очищается. +Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт + + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовВызовСервера/ПрефиксацияОбъектовВызовСервера.mdo b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/ЖурналРегистрацииВызовСервера.mdo similarity index 50% rename from SSL/src/CommonModules/ПрефиксацияОбъектовВызовСервера/ПрефиксацияОбъектовВызовСервера.mdo rename to SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/ЖурналРегистрацииВызовСервера.mdo index b1bba1480..27b00521a 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовВызовСервера/ПрефиксацияОбъектовВызовСервера.mdo +++ b/SSL/src/CommonModules/ЖурналРегистрацииВызовСервера/ЖурналРегистрацииВызовСервера.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="259564b8-172e-4eed-9360-d561ec6dad69"> - <name>ПрефиксацияОбъектовВызовСервера</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="17df1591-61b0-4204-8379-8d1f58445968"> + <name>ЖурналРегистрацииВызовСервера</name> <synonym> <key>ru</key> - <value>Префиксация объектов вызов сервера</value> + <value>Журнал регистрации вызов сервера</value> </synonym> <server>true</server> <serverCall>true</serverCall> diff --git a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl index e87e3a2b2..0697a4f98 100644 --- a/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЖурналРегистрацииКлиент/Module.bsl @@ -4,9 +4,67 @@ // //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Записывает сообщение в журнал регистрации. +// Если параметр ЗаписатьСобытия = Истина, то запись выполняется сразу (обращение к серверу). +// Если ЗаписатьСобытия = Ложь (по умолчанию), то сообщение помещается в очередь, +// которая может быть записана позднее, при следующем вызове этой или другой процедуры, +// в которую передается в качестве параметра очередь СообщенияДляЖурналаРегистрации. +// +// Параметры: +// ИмяСобытия - Строка - имя события для журнала регистрации; +// ПредставлениеУровня - Строка - описание уровня события, по нему будет определен уровень события при записи на сервере; +// Например: "Ошибка", "Предупреждение". +// Соответствуют именам элементов перечисления УровеньЖурналаРегистрации. +// Комментарий - Строка - комментарий для события журнала; +// ДатаСобытия - Дата - точная дата возникновения события, описанного в сообщении. Будет добавлена в начало комментария; +// ЗаписатьСобытия - Булево - выполнить запись всех ранее накопленных сообщений в журнал регистрации (обращение к серверу). +// +// Пример: +// ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", +// НСтр("ru = 'Невозможно подключиться к сети Интернет для проверки обновлений.'")); +// +Процедура ДобавитьСообщениеДляЖурналаРегистрации(Знач ИмяСобытия, Знач ПредставлениеУровня = "Информация", + Знач Комментарий = "", Знач ДатаСобытия = "", Знач ЗаписатьСобытия = Ложь) Экспорт + + // В случае необходимости выполним инициализацию глобального списка сообщений для журнала регистрации. + Если СообщенияДляЖурналаРегистрации = Неопределено Тогда + СообщенияДляЖурналаРегистрации = Новый СписокЗначений; + КонецЕсли; + + Если ТипЗнч(ДатаСобытия) = Тип("Дата") Тогда + ДатаСобытия = Формат(ДатаСобытия, "ДЛФ=DT"); + КонецЕсли; + + СтруктураСообщения = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия", + ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия); + + СообщенияДляЖурналаРегистрации.Добавить(СтруктураСообщения); + + Если ЗаписатьСобытия Тогда + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + КонецЕсли; + +КонецПроцедуры + + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Открывает форму журнала регистрации с установленным отбором. +// +// Параметры: +// Отбор - Структура - поля и значения, по которым необходимо отфильтровать журнал. +// Владелец - УправляемаяФорма - форма, из которой открывается журнал регистрации. +// +Процедура ОткрытьЖурналРегистрации(Знач Отбор = Неопределено, Владелец = Неопределено) Экспорт + + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Отбор, Владелец); + +КонецПроцедуры + // Открывает форму для просмотра дополнительных данных события. // // Параметры: @@ -15,12 +73,12 @@ Процедура ОткрытьДанныеДляПросмотра(ТекущиеДанные) Экспорт Если ТекущиеДанные = Неопределено Или ТекущиеДанные.Данные = Неопределено Тогда - Предупреждение(НСтр("ru = 'Эта запись журнала регистрации не связана с данными (см. колонку ""Данные"")'")); + ПоказатьПредупреждение(, НСтр("ru = 'Эта запись журнала регистрации не связана с данными (см. колонку ""Данные"")'")); Возврат; КонецЕсли; Попытка - ОткрытьЗначение(ТекущиеДанные.Данные); + ПоказатьЗначение(, ТекущиеДанные.Данные); Исключение ТекстПредупреждения = НСтр("ru = 'Эта запись журнала регистрации связана с данными, но отобразить их невозможно. |%1'"); @@ -36,7 +94,7 @@ ТекстПредупреждения, НСтр("ru = 'Возможно, данные удалены из информационной базы'")); КонецЕсли; - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(, ТекстПредупреждения); КонецПопытки; КонецПроцедуры @@ -64,10 +122,8 @@ // ИнтервалДат - СтандартныйПериод, интервал дат отбора // ОтборЖурналаРегистрации - Структура, отбор журнала регистрации // -Функция УстановитьИнтервалДатДляПросмотра(ИнтервалДат, ОтборЖурналаРегистрации) Экспорт +Процедура УстановитьИнтервалДатДляПросмотра(ИнтервалДат, ОтборЖурналаРегистрации, ОбработчикОповещения = Неопределено) Экспорт - ИнтервалУстановлен = Ложь; - // Получение текущего периода ДатаНачала = Неопределено; ДатаОкончания = Неопределено; @@ -88,25 +144,15 @@ Диалог = Новый ДиалогРедактированияСтандартногоПериода; Диалог.Период = ИнтервалДат; - Если Диалог.Редактировать() Тогда - // Обновление текущего периода - ИнтервалДат = Диалог.Период; - Если ИнтервалДат.ДатаНачала = '00010101000000' Тогда - ОтборЖурналаРегистрации.Удалить("ДатаНачала"); - Иначе - ОтборЖурналаРегистрации.Вставить("ДатаНачала", ИнтервалДат.ДатаНачала); - КонецЕсли; - Если ИнтервалДат.ДатаОкончания = '00010101000000' Тогда - ОтборЖурналаРегистрации.Удалить("ДатаОкончания"); - Иначе - ОтборЖурналаРегистрации.Вставить("ДатаОкончания", ИнтервалДат.ДатаОкончания); - КонецЕсли; - ИнтервалУстановлен = Истина; - КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОтборЖурналаРегистрации", ОтборЖурналаРегистрации); + ДополнительныеПараметры.Вставить("ИнтервалДат", ИнтервалДат); + ДополнительныеПараметры.Вставить("ОбработчикОповещения", ОбработчикОповещения); - Возврат ИнтервалУстановлен; + Оповещение = Новый ОписаниеОповещения("УстановитьИнтервалДатДляПросмотраЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Диалог.Показать(Оповещение); -КонецФункции // УстановитьИнтервалДатДляПросмотра +КонецПроцедуры // Выполняет обработку выбора отдельного события в таблице событий // @@ -200,7 +246,7 @@ Возврат Истина; -КонецФункции +КонецФункции // УстановитьОтборПоЗначениюВТекущейКолонке //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -242,3 +288,34 @@ Возврат ПараметрыФормы; КонецФункции +// Только для внутреннего использования. +// +Процедура УстановитьИнтервалДатДляПросмотраЗавершение(Результат, ДополнительныеПараметры) Экспорт + + ОтборЖурналаРегистрации = ДополнительныеПараметры.ОтборЖурналаРегистрации; + ИнтервалУстановлен = Ложь; + + Если Результат <> Неопределено Тогда + + // Обновление текущего периода + ИнтервалДат = Результат; + Если ИнтервалДат.ДатаНачала = '00010101000000' Тогда + ОтборЖурналаРегистрации.Удалить("ДатаНачала"); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаНачала", ИнтервалДат.ДатаНачала); + КонецЕсли; + + Если ИнтервалДат.ДатаОкончания = '00010101000000' Тогда + ОтборЖурналаРегистрации.Удалить("ДатаОкончания"); + Иначе + ОтборЖурналаРегистрации.Вставить("ДатаОкончания", ИнтервалДат.ДатаОкончания); + КонецЕсли; + ИнтервалУстановлен = Истина; + + КонецЕсли; + + Если ДополнительныеПараметры.ОбработчикОповещения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикОповещения, ИнтервалУстановлен); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl index 48b57bfbe..57d312ab5 100644 --- a/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ЗаметкиПользователяСлужебный/Module.bsl @@ -11,7 +11,7 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда СерверныеОбработчики["СтандартныеПодсистемы.НапоминанияПользователя\ПриЗаполненииСпискаРеквизитовИсточникаСДатамиДляНапоминания"].Добавить( "ЗаметкиПользователяСлужебный"); КонецЕсли; @@ -36,3 +36,37 @@ КонецЕсли; КонецПроцедуры + +Процедура УстановитьПометкуУдаленияЗаметкамПользователя(Источник, Отказ) Экспорт + Если Не Источник.ПометкаУдаления Тогда + Возврат; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | Заметки.Ссылка КАК Ссылка + |ИЗ + | Справочник.Заметки КАК Заметки + |ГДЕ + | Заметки.ПометкаУдаления = ЛОЖЬ + | И Заметки.Автор = &Пользователь"; + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Пользователь", Источник.Ссылка); + + УстановитьПривилегированныйРежим(Истина); + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ЗаметкаОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ЗаметкаОбъект.УстановитьПометкуУдаления(Истина, Ложь); + ЗаметкаОбъект.ДополнительныеСвойства.Вставить("ПометкаУдаленияЗаметки", Истина); + Попытка + ЗаметкаОбъект.Записать(); + Исключение + ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации("Заметки пользователя. Установка пометки удаления", УровеньЖурналаРегистрации.Ошибка, ЗаметкаОбъект.Метаданные(), ЗаметкаОбъект.Ссылка, ТекстОшибки); + КонецПопытки; + КонецЦикла; +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl index f757320d9..3b136f670 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектов/Module.bsl @@ -6,16 +6,17 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Принимает в качестве параметра форму и для всех реквизитов, -// для которых определен механизм, блокирует их редактирование. +// Принимает в качестве параметра форму объекта, к которому подключена подсистема, +// и запрещает редактирование заданных реквизитов, +// а также добавляет во "Все действия" команду для разрешения их редактирования. // // Параметры: -// Форма - УправляемаяФорма объекта, которая будет настроена. +// Форма - УправляемаяФорма - форма объекта. +// ГруппаДляКнопкиЗапрета - ГруппаФормы - переопределяет стандартное размещение +// кнопки запрета в форме объекта. +// ЗаголовокКнопкиЗапрета - Строка - заголовок кнопки. По умолчанию, "Разрешить редактирование реквизитов". // -// СпециальнаяПолеГруппыДляКнопкиЗапрета - переопределяет стандартное размещение -// кнопки запрета в форме объекта. -// -Процедура ЗаблокироватьРеквизиты(Форма, СпециальнаяПолеГруппыДляКнопкиЗапрета = Неопределено) Экспорт +Процедура ЗаблокироватьРеквизиты(Форма, ГруппаДляКнопкиЗапрета = Неопределено, ЗаголовокКнопкиЗапрета = "") Экспорт // Определение, форма уже подготовлена при предыдущем вызове ФормаПодготовлена = Ложь; @@ -28,7 +29,7 @@ КонецЦикла; Если Не ФормаПодготовлена Тогда - ПодготовитьФорму(Форма, Форма.Объект.Ссылка, СпециальнаяПолеГруппыДляКнопкиЗапрета); + ПодготовитьФорму(Форма, Форма.Объект.Ссылка, ГруппаДляКнопкиЗапрета, ЗаголовокКнопкиЗапрета); КонецЕсли; ЭтоНовыйОбъект = Форма.Объект.Ссылка.Пустая(); @@ -65,7 +66,7 @@ // - добавляет реквизит ПараметрыЗапретаРедактированияРеквизитов для хранения внутренних данных // - добавляет команду и кнопку РазрешитьРедактированиеРеквизитовОбъекта (если есть права) // -Процедура ПодготовитьФорму(Форма, Ссылка, СпециальнаяПолеГруппыДляКнопкиЗапрета = Неопределено) +Процедура ПодготовитьФорму(Форма, Ссылка, ГруппаДляКнопкиЗапрета, ЗаголовокКнопкиЗапрета) ОписаниеТиповСтрока100 = Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100)); ОписаниеТиповБулево = Новый ОписаниеТипов("Булево"); @@ -149,18 +150,13 @@ // Добавление команды Команда = Форма.Команды.Добавить("РазрешитьРедактированиеРеквизитовОбъекта"); - Команда.Заголовок = НСтр("ru = 'Разрешить редактирование реквизитов объекта'"); + Команда.Заголовок = ?(ПустаяСтрока(ЗаголовокКнопкиЗапрета), НСтр("ru = 'Разрешить редактирование реквизитов'"), ЗаголовокКнопкиЗапрета); Команда.Действие = "Подключаемый_РазрешитьРедактированиеРеквизитовОбъекта"; Команда.Картинка = БиблиотекаКартинок.РазрешитьРедактированиеРеквизитовОбъекта; Команда.ИзменяетСохраняемыеДанные = Истина; // Добавление кнопки - Если СпециальнаяПолеГруппыДляКнопкиЗапрета <> Неопределено Тогда - РодительскаяГруппа = СпециальнаяПолеГруппыДляКнопкиЗапрета; - Иначе - РодительскаяГруппа = Форма.КоманднаяПанель; - КонецЕсли; - + РодительскаяГруппа = ?(ГруппаДляКнопкиЗапрета <> Неопределено, ГруппаДляКнопкиЗапрета, Форма.КоманднаяПанель); Кнопка = Форма.Элементы.Добавить("РазрешитьРедактированиеРеквизитовОбъекта", Тип("КнопкаФормы"), РодительскаяГруппа); Кнопка.ТолькоВоВсехДействиях = Истина; Кнопка.ИмяКоманды = "РазрешитьРедактированиеРеквизитовОбъекта"; diff --git a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl index 729171035..84f8579c3 100644 --- a/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЗапретРедактированияРеквизитовОбъектовКлиент/Module.bsl @@ -7,13 +7,27 @@ // ПРОГРАММНЫЙ ИНТЕРФЕЙС // Разрешает редактирование заблокированных элементов формы, связанных с заданными реквизитами. -Функция РазрешитьРедактированиеРеквизитовОбъекта(Знач Форма) Экспорт +// +// Параметры: +// Форма - УправляемаяФорма - форма, в которой требуется разрешить +// редактирование элементов формы, заданных реквизитов. +// +// ОбработкаПродолжения - Неопределено - никаких действий после выполнения процедуры. +// ОписаниеОповещения, которое вызывается после выполнения процедуры, +// в обработку передается параметр Успех типа Булево: +// Истина - ссылок не обнаружено или решение пользователя, +// Ложь - видимых заблокированных реквизитов нет или +// ссылки обнаружены и пользователь отказался от продолжения. +// +Процедура РазрешитьРедактированиеРеквизитовОбъекта(Знач Форма, ОбработкаПродолжения = Неопределено) Экспорт - ЗаблокированныеРеквизиты = РеквизитыКромеНевидимых(Форма); + ЗаблокированныеРеквизиты = Реквизиты(Форма); Если ЗаблокированныеРеквизиты.Количество() = 0 Тогда - ПредупреждениеВсеВидимыеРеквизитыРазблокированы(); - Возврат Ложь; + ПоказатьПредупреждениеВсеВидимыеРеквизитыРазблокированы( + Новый ОписаниеОповещения("РазрешитьРедактированиеРеквизитовОбъектаПослеПредупреждения", + ЭтотОбъект, ОбработкаПродолжения)); + Возврат; КонецЕсли; СинонимыРеквизитов = Новый Массив; @@ -27,15 +41,18 @@ МассивСсылок = Новый Массив; МассивСсылок.Добавить(Форма.Объект.Ссылка); - Результат = ПроверитьСсылкиНаОбъект(МассивСсылок, СинонимыРеквизитов); + Параметры = Новый Структура; + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ЗаблокированныеРеквизиты", ЗаблокированныеРеквизиты); + Параметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - Если Результат Тогда - УстановитьРазрешенностьРедактированияРеквизитов(Форма, ЗаблокированныеРеквизиты); - КонецЕсли; - - Возврат Результат; + ПроверитьСсылкиНаОбъект( + Новый ОписаниеОповещения( + "РазрешитьРедактированиеРеквизитовОбъектаПослеПроверкиСсылок", ЭтотОбъект, Параметры), + МассивСсылок, + СинонимыРеквизитов); -КонецФункции +КонецПроцедуры // Устанавливает доступность элементов формы, связанных с заданными реквизитами, // для которых установлено разрешение изменения. Если передать массив реквизитов, @@ -76,89 +93,68 @@ КонецПроцедуры - // Спрашивает у пользователя подтверждение на включение редактирования реквизитов -// и проверяет есть ли ссылки на объект в информационной базе +// и проверяет, есть ли ссылки на объект в информационной базе. // -Функция ПроверитьСсылкиНаОбъект(Знач МассивСсылок, Знач СинонимыРеквизитов) Экспорт +// Параметры: +// ОбработкаПродолжения - ОписаниеОповещения, которое вызывается после проверки, +// в обработку передается параметр: +// Истина - ссылок не обнаружено или решение пользователя, +// Ложь - ссылки обнаружены и пользователь отказался от продолжения. +// МассивСсылок - Массив - массив значений типа Ссылка, которые нужно найти в различных объектах. +// СинонимыРеквизитов - Массив - массив значений типа Строка, которые показываются пользователю. +// +Процедура ПроверитьСсылкиНаОбъект(Знач ОбработкаПродолжения, Знач МассивСсылок, Знач СинонимыРеквизитов) Экспорт - Результат = Ложь; - - ЗаголовокДиалога = НСтр("ru = 'Редактирование реквизитов объекта'"); + ЗаголовокДиалога = НСтр("ru = 'Разрешение редактирования реквизитов'"); РеквизитыПредставление = ""; - Для Каждого СинонимРеквизита Из СинонимыРеквизитов Цикл РеквизитыПредставление = РеквизитыПредставление + СинонимРеквизита + "," + Символы.ПС; КонецЦикла; - - РеквизитыПредставление = Лев(РеквизитыПредставление, СтрДлина(РеквизитыПредставление)-2); + РеквизитыПредставление = Лев(РеквизитыПредставление, СтрДлина(РеквизитыПредставление) - 2); Если СинонимыРеквизитов.Количество() > 1 Тогда - ТекстВопроса = НСтр("ru = 'Изменение следующих реквизитов может привести к рассогласованию - |данных информационной базы: - | - |%1. - | - |Настоятельно рекомендуется проверить все случаи использования - |объекта и оценить последствия изменения этих реквизитов.'"); + ТекстВопроса = НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, следующие реквизиты не доступны для редактирования: + |%1. + | + |Перед тем, как разрешить их редактирование, рекомендуется оценить последствия, + |проверив все места использования этого элемента в программе. + |Поиск мест использования может занять длительное время.'"); + Иначе - ТекстВопроса = НСтр("ru = 'Изменение реквизита ""%1"" - |может привести к рассогласованию данных информационной базы. - | - |Настоятельно рекомендуется проверить все случаи использования - |объекта и оценить последствия изменения этого реквизита.'"); + ТекстВопроса = НСтр("ru = 'Для того чтобы не допустить рассогласования данных в программе, реквизит %1 не доступен для редактирования. + | + |Перед тем, как разрешить его редактирование, рекомендуется оценить последствия, + |проверив все места использования %2 в программе. + |Поиск мест использования может занять длительное время.'"); КонецЕсли; - ТекстВопроса = ТекстВопроса + Символы.ПС + Символы.ПС; Если МассивСсылок.Количество() = 1 Тогда - ТекстВопроса = ТекстВопроса + НСтр("ru = 'Продолжить с проверкой использования объекта?'"); + ОбъектыПредставление = МассивСсылок[0]; Иначе - Если Прав(Строка(МассивСсылок.Количество()), 1) = "1" Тогда - ШаблонТекстаВопроса = НСтр("ru = 'Разрешить редактирование реквизитов для %1 объекта?'"); - Иначе - ШаблонТекстаВопроса = НСтр("ru = 'Разрешить редактирование реквизитов для %1 объектов?'"); - КонецЕсли; - ТекстВопроса = ТекстВопроса - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонТекстаВопроса, МассивСсылок.Количество()); + ОбъектыПредставление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'выбранных элементов (%1)'"), МассивСсылок.Количество()); КонецЕсли; - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, РеквизитыПредставление); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, РеквизитыПредставление, ОбъектыПредставление); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ЗаголовокДиалога); + Параметры = Новый Структура; + Параметры.Вставить("МассивСсылок", МассивСсылок); + Параметры.Вставить("СинонимыРеквизитов", СинонимыРеквизитов); + Параметры.Вставить("ЗаголовокДиалога", ЗаголовокДиалога); + Параметры.Вставить("ОбработкаПродолжения", ОбработкаПродолжения); - Если Ответ = КодВозвратаДиалога.Да Тогда - - Если МассивСсылок.Количество() = 1 Тогда - Если ОбщегоНазначенияВызовСервера.ЕстьСсылкиНаОбъект(МассивСсылок) Тогда - - ТекстСообщения = НСтр("ru = 'Редактируемый объект используется в информационной базе. - | - |Разрешить редактирование реквизитов объекта?'"); - - Ответ = Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да, ЗаголовокДиалога); - - Если Ответ = КодВозвратаДиалога.Да Тогда - Результат = Истина; - КонецЕсли; - Иначе - ТекстСообщения = НСтр("ru = 'Редактируемый объект не используется в информационной базе. - | - |Редактирование реквизитов объекта разрешено.'"); - Предупреждение(ТекстСообщения, , ЗаголовокДиалога); - Результат = Истина; - КонецЕсли; - - Иначе - Результат = Истина; - КонецЕсли; - - КонецЕсли; + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Проверить и разрешить'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); - Возврат Результат; + ПоказатьВопрос( + Новый ОписаниеОповещения("ПроверитьСсылкиНаОбъектПослеПодтвержденияПроверки", ЭтотОбъект, Параметры), + ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, ЗаголовокДиалога); -КонецФункции +КонецПроцедуры // Устанавливает разрешенность редактирования для тех реквизитов, описание которых подготовлено в форме. // Используется, когда доступность элементов формы изменяется самостоятельно, без @@ -215,20 +211,22 @@ // Возвращает массив имен реквизитов, заданных в свойстве формы // ПараметрыЗапретаРедактированияРеквизитов на основе имен реквизитов // указанных в модуле мененджера объекта, исключая реквизиты, -// у которых Видимость = Ложь и ПравоРедактирования = Ложь. +// у которых ПравоРедактирования = Ложь. // // Параметры: -// Форма - Форма объекта с обязательным стандартным реквизитом Объект +// Форма - Форма объекта с обязательным стандартным реквизитом Объект // ТолькоЗаблокированные - Булево, начальное значение Истина, -// для вспомогательных целей можно задать Ложь, чтобы -// получить список всех видимых реквизитов, которые могут разблокироваться. +// для вспомогательных целей можно задать Ложь, чтобы +// получить список всех видимых реквизитов, которые могут разблокироваться. +// ТолькоВидимые - Булево, начальное значение Истина, +// чтобы получить и разблокировать все реквизиты объекта, нужно указать Ложь. // // Возвращаемое значение: // Массив - имена реквизитов // -Функция РеквизитыКромеНевидимых(Знач Форма, Знач ТолькоЗаблокированные = Истина) Экспорт +Функция Реквизиты(Знач Форма, Знач ТолькоЗаблокированные = Истина, ТолькоВидимые = Истина) Экспорт - РеквизитыКромеНевидимых = Новый Массив; + Реквизиты = Новый Массив; Для Каждого ОписаниеБлокируемогоРеквизита Из Форма.ПараметрыЗапретаРедактированияРеквизитов Цикл @@ -236,30 +234,125 @@ И ( ОписаниеБлокируемогоРеквизита.РедактированиеРазрешено = Ложь ИЛИ ТолькоЗаблокированные = Ложь) Тогда - СуществуетВидимоеПоле = Ложь; + ДобавитьРеквизит = Ложь; Для Каждого БлокируемыйЭлементФормы Из ОписаниеБлокируемогоРеквизита.БлокируемыеЭлементы Цикл ЭлементФормы = Форма.Элементы.Найти(БлокируемыйЭлементФормы.Значение); - Если ЭлементФормы <> Неопределено И ЭлементФормы.Видимость Тогда - СуществуетВидимоеПоле = Истина; + Если ЭлементФормы <> Неопределено И (ЭлементФормы.Видимость Или НЕ ТолькоВидимые) Тогда + ДобавитьРеквизит = Истина; Прервать; КонецЕсли; КонецЦикла; - Если СуществуетВидимоеПоле Тогда - РеквизитыКромеНевидимых.Добавить(ОписаниеБлокируемогоРеквизита.ИмяРеквизита); + Если ДобавитьРеквизит Тогда + Реквизиты.Добавить(ОписаниеБлокируемогоРеквизита.ИмяРеквизита); КонецЕсли; КонецЕсли; КонецЦикла; - Возврат РеквизитыКромеНевидимых; + Возврат Реквизиты; КонецФункции // Выводит предупреждение о том, что все видимые реквизиты разблокированы. -// Необходимость в предупреждении возникает, когда команда разблокировки +// Необходимость в предупреждении возникает, когда команда разблокировки // остается включенной из-за наличия невидимых неразблокированных реквизитов. // -Процедура ПредупреждениеВсеВидимыеРеквизитыРазблокированы() Экспорт +// Параметры: +// ОбработкаПродолжения - Неопределено - никаких действий после выполнения процедуры. +// ОписаниеОповещения, которое вызывается после выполнения процедуры. +// +Процедура ПоказатьПредупреждениеВсеВидимыеРеквизитыРазблокированы(ОбработкаПродолжения = Неопределено) Экспорт - Предупреждение(НСтр("ru = 'Редактирование всех видимых реквизитов объекта уже разрешено.'")); + ПоказатьПредупреждение(ОбработкаПродолжения, + НСтр("ru = 'Редактирование всех видимых реквизитов объекта уже разрешено.'")); + +КонецПроцедуры + +// Устарела. Следует использовать функцию Реквизиты. +Функция РеквизитыКромеНевидимых(Знач Форма, Знач ТолькоЗаблокированные = Истина) Экспорт + + Возврат Реквизиты(Форма, ТолькоЗаблокированные); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура РазрешитьРедактированиеРеквизитовОбъектаПослеПредупреждения(ОбработкаПродолжения) Экспорт + + Если ОбработкаПродолжения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, Ложь); + КонецЕсли; + +КонецПроцедуры + +Процедура РазрешитьРедактированиеРеквизитовОбъектаПослеПроверкиСсылок(Результат, Параметры) Экспорт + + Если Результат Тогда + УстановитьРазрешенностьРедактированияРеквизитов( + Параметры.Форма, Параметры.ЗаблокированныеРеквизиты); + + УстановитьДоступностьЭлементовФормы(Параметры.Форма); + КонецЕсли; + + Если Параметры.ОбработкаПродолжения <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Результат); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьСсылкиНаОбъектПослеПодтвержденияПроверки(Ответ, Параметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); + Возврат; + КонецЕсли; + + Если Параметры.МассивСсылок.Количество() = 0 Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Истина); + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияВызовСервера.ЕстьСсылкиНаОбъект(Параметры.МассивСсылок) Тогда + + Если Параметры.МассивСсылок.Количество() = 1 Тогда + ТекстСообщения = НСтр("ru = 'Элемент ""%1"" уже используется в других местах в программе. + |Не рекомендуется разрешать редактирование из-за риска рассогласования данных.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Параметры.МассивСсылок[0]); + Иначе + ТекстСообщения = НСтр("ru = 'Выбранные элементы (%1) уже используются в других местах в программе. + |Не рекомендуется разрешать редактирование из-за риска рассогласования данных.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Параметры.МассивСсылок.Количество()); + КонецЕсли; + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Разрешить редактирование'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Отмена'")); + ПоказатьВопрос( + Новый ОписаниеОповещения( + "ПроверитьСсылкиНаОбъектПослеПодтвержденияРедактирования", ЭтотОбъект, Параметры), + ТекстСообщения, Кнопки, , КодВозвратаДиалога.Нет, Параметры.ЗаголовокДиалога); + Иначе + Если Параметры.МассивСсылок.Количество() = 1 Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Редактирование реквизитов разрешено'"), + ПолучитьНавигационнуюСсылку(Параметры.МассивСсылок[0]), Параметры.МассивСсылок[0]); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Разрешено редактирование реквизитов объектов (%1)'"), Параметры.МассивСсылок.Количество()); + ПоказатьОповещениеПользователя(НСтр("ru = 'Редактирование реквизитов разрешено'"),, ТекстСообщения); + КонецЕсли; + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура ПроверитьСсылкиНаОбъектПослеПодтвержденияРедактирования(Ответ, Параметры) Экспорт + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ответ = КодВозвратаДиалога.Да); + +КонецПроцедуры + +Процедура ПроверитьСсылкиНаОбъектПослеПредупрежденияРедактирования(Параметры) Экспорт + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Истина); КонецПроцедуры diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl index cf22c942b..2a22005e3 100644 --- a/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанных/Module.bsl @@ -193,6 +193,26 @@ КонецФункции +// Процедура предназначена для использования из метода ДобавитьКомандыПечати +// стандартной подсистемы Печать в объектах, являющимися субъектами персональных данных. +// Добавляет в список команд печати команду перехода к подготовке согласия на обработку персональных данных субъекта. +// +// Параметры: +// КомандыПечати - ТаблицаЗначений - состав полей см. в функции УправлениеПечатью.СоздатьКоллекциюКомандПечати +// +Процедура ДобавитьКомандуПечатиСогласияНаОбработкуПерсональныхДанных(КомандыПечати) Экспорт + + Если Не Пользователи.РолиДоступны("ПодготовкаСогласияНаОбработкуПерсональныхДанных") Тогда + Возврат; + КонецЕсли; + + КомандаПечати = КомандыПечати.Добавить(); + КомандаПечати.Идентификатор = "СогласиеНаОбработкуПерсональныхДанных"; + КомандаПечати.Представление = НСтр("ru = 'Согласие на обработку персональных данных...'"); + КомандаПечати.Обработчик = "ЗащитаПерсональныхДанныхКлиент.ОткрытьФормуСогласиеНаОбработкуПерсональныхДанных"; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ diff --git a/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl new file mode 100644 index 000000000..8dd07a4b7 --- /dev/null +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/Module.bsl @@ -0,0 +1,20 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Защита персональных данных" +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Осуществляет переход к форме подготовки согласие на обработку персональных данных, +// используется как обработчик печати +// +// Параметры +// ПараметрыПечати - структура параметров обработки команды печати, +// должна содержать поля ОбъектыПечати и Форма +// +Функция ОткрытьФормуСогласиеНаОбработкуПерсональныхДанных(ПараметрыПечати) Экспорт + + ОткрытьФорму("Обработка.СогласиеНаОбработкуПерсональныхДанных.Форма", Новый Структура("Субъекты", ПараметрыПечати.ОбъектыПечати), ПараметрыПечати.Форма); + +КонецФункции diff --git a/SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/КомандыРаботыСФайламиКлиент.mdo b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/ЗащитаПерсональныхДанныхКлиент.mdo similarity index 57% rename from SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/КомандыРаботыСФайламиКлиент.mdo rename to SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/ЗащитаПерсональныхДанныхКлиент.mdo index e941d6de9..537e356ee 100644 --- a/SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/КомандыРаботыСФайламиКлиент.mdo +++ b/SSL/src/CommonModules/ЗащитаПерсональныхДанныхКлиент/ЗащитаПерсональныхДанныхКлиент.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="120c5162-b03c-46ce-8a2a-8ef501971715"> - <name>КомандыРаботыСФайламиКлиент</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3916ddbd-9023-42a4-849e-9cda6e591408"> + <name>ЗащитаПерсональныхДанныхКлиент</name> <synonym> <key>ru</key> - <value>Команды работы с файлами клиент</value> + <value>Защита персональных данных клиент</value> </synonym> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> diff --git a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl index 80057ae1e..aa365fcb9 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапуске/Module.bsl @@ -31,7 +31,7 @@ // Обработчики служебных событий // Вызывается после завершения монопольного обновления данных ИБ. -// +// // Параметры: // ПредыдущаяВерсия - Строка - версия подсистемы до обновления. "0.0.0.0" для "пустой" ИБ. // ТекущаяВерсия - Строка - версия подсистемы после обновления. @@ -68,7 +68,7 @@ // Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. // // Параметры: -// Параметры (Структура) Параметры запуска. +// Параметры - Структура - Параметры запуска. // Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске(Параметры) Экспорт diff --git a/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl b/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl index 96787d549..26f37c38a 100644 --- a/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl +++ b/SSL/src/CommonModules/ИнформацияПриЗапускеКлиент/Module.bsl @@ -10,11 +10,10 @@ // Обработчики служебных событий // Вызывается при запуске конфигурации, открывает окно информации. -// -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт - Параметры = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если Параметры.Свойство("ИнформацияПриЗапуске") И Параметры.ИнформацияПриЗапуске.Показывать Тогда + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("ИнформацияПриЗапуске") И ПараметрыКлиента.ИнформацияПриЗапуске.Показывать Тогда ОткрытьФорму("Обработка.ИнформацияПриЗапуске.Форма"); КонецЕсли; diff --git a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl index 61d7b31d3..cc33bad15 100644 --- a/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафики/Module.bsl @@ -24,157 +24,67 @@ // Функция ПолучитьМассивДатПоКалендарю(Знач ГрафикРаботы, Знач ДатаОт, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь, ВызыватьИсключение = Истина) Экспорт - ДатаОт = НачалоДня(ДатаОт); - - ПриращениеДней = Новый ТаблицаЗначений; - ПриращениеДней.Колонки.Добавить("ИндексСтроки", Новый ОписаниеТипов("Число")); - ПриращениеДней.Колонки.Добавить("КоличествоДней", Новый ОписаниеТипов("Число")); - - КоличествоДней = 0; - НомерСтроки = 0; - Для Каждого СтрокаДней Из МассивДней Цикл - КоличествоДней = КоличествоДней + СтрокаДней; - - Строка = ПриращениеДней.Добавить(); - Строка.ИндексСтроки = НомерСтроки; - Если РассчитыватьСледующуюДатуОтПредыдущей Тогда - Строка.КоличествоДней = КоличествоДней; - Иначе - Строка.КоличествоДней = СтрокаДней; + Если ТипЗнч(ГрафикРаботы) <> Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + Возврат МодульГрафикиРаботы.ПолучитьМассивДатПоГрафику( + ГрафикРаботы, ДатаОт, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей, ВызыватьИсключение); КонецЕсли; - - НомерСтроки = НомерСтроки + 1; - КонецЦикла; + КонецЕсли; + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей); // Алгоритм работает следующим образом: - // а) для графика работы - // Получаем количество включенных в график дней на дату отсчета - // Для всех последующих годов получаем "смещение" количества дней в виде суммы количества дней предыдущих годов - // б) для производственного календаря // Получаем все дни календаря, следующие после даты отсчета. // Для каждого из таких дней рассчитываем количество дней, включенных в график с даты отсчета. // Отбираем рассчитанное таким образом количество по таблице приращения дней. Запрос = Новый Запрос; - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + // По производственному календарю Запрос.Текст = "ВЫБРАТЬ - | ПриращениеДней.ИндексСтроки, - | ПриращениеДней.КоличествоДней - |ПОМЕСТИТЬ ВТПриращениеДней + | КалендарныеГрафики.Дата КАК ДатаГрафика + |ПОМЕСТИТЬ ВТПоследующиеДатыГрафика |ИЗ - | &ПриращениеДней КАК ПриращениеДней"; + | РегистрСведений.ДанныеПроизводственногоКалендаря КАК КалендарныеГрафики + |ГДЕ + | КалендарныеГрафики.Дата >= &ДатаОт + | И КалендарныеГрафики.ПроизводственныйКалендарь = &ГрафикРаботы + | И КалендарныеГрафики.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПоследующиеДатыГрафика.ДатаГрафика, + | КОЛИЧЕСТВО(КалендарныеГрафики.ДатаГрафика) - 1 КАК КоличествоДнейВключенныхВГрафик + |ПОМЕСТИТЬ ВТПоследующиеДатыГрафикаСКоличествомДней + |ИЗ + | ВТПоследующиеДатыГрафика КАК ПоследующиеДатыГрафика + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафика КАК КалендарныеГрафики + | ПО (КалендарныеГрафики.ДатаГрафика <= ПоследующиеДатыГрафика.ДатаГрафика) + | + |СГРУППИРОВАТЬ ПО + | ПоследующиеДатыГрафика.ДатаГрафика + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | ПриращениеДней.ИндексСтроки, + | ЕСТЬNULL(ПоследующиеДни.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю + |ИЗ + | ВТПриращениеДней КАК ПриращениеДней + | ЛЕВОЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафикаСКоличествомДней КАК ПоследующиеДни + | ПО ПриращениеДней.КоличествоДней = ПоследующиеДни.КоличествоДнейВключенныхВГрафик + | + |УПОРЯДОЧИТЬ ПО + | ПриращениеДней.ИндексСтроки"; - Запрос.УстановитьПараметр("ПриращениеДней", ПриращениеДней); - - Запрос.Выполнить(); - - Если ТипЗнч(ГрафикРаботы) = Тип("СправочникСсылка.Календари") Тогда - // По графику работы - Запрос.Текст = - "ВЫБРАТЬ - | КалендарныеГрафики.Год, - | МАКСИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК ДнейВГрафике - |ПОМЕСТИТЬ ВТКоличествоДнейВГрафикеПоГодам - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - |ГДЕ - | КалендарныеГрафики.ДатаГрафика >= &ДатаОт - | И КалендарныеГрафики.Календарь = &ГрафикРаботы - | И КалендарныеГрафики.ДеньВключенВГрафик - | - |СГРУППИРОВАТЬ ПО - | КалендарныеГрафики.Год - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КоличествоДнейВГрафикеПоГодам.Год, - | СУММА(ЕСТЬNULL(КоличествоДнейПредыдущихГодов.ДнейВГрафике, 0)) КАК ДнейВГрафике - |ПОМЕСТИТЬ ВТКоличествоДнейСУчетомПредыдущихГодов - |ИЗ - | ВТКоличествоДнейВГрафикеПоГодам КАК КоличествоДнейВГрафикеПоГодам - | ЛЕВОЕ СОЕДИНЕНИЕ ВТКоличествоДнейВГрафикеПоГодам КАК КоличествоДнейПредыдущихГодов - | ПО (КоличествоДнейПредыдущихГодов.Год < КоличествоДнейВГрафикеПоГодам.Год) - | - |СГРУППИРОВАТЬ ПО - | КоличествоДнейВГрафикеПоГодам.Год - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | МИНИМУМ(КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода) КАК КоличествоДнейВГрафикеСНачалаГода - |ПОМЕСТИТЬ ВТКоличествоДнейВГрафикеНаДатуОтсчета - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - |ГДЕ - | КалендарныеГрафики.ДатаГрафика >= &ДатаОт - | И КалендарныеГрафики.Год = ГОД(&ДатаОт) - | И КалендарныеГрафики.Календарь = &ГрафикРаботы - | И КалендарныеГрафики.ДеньВключенВГрафик - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПриращениеДней.ИндексСтроки, - | ЕСТЬNULL(КалендарныеГрафики.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю - |ИЗ - | ВТПриращениеДней КАК ПриращениеДней - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКоличествоДнейВГрафикеНаДатуОтсчета КАК КоличествоДнейВГрафикеНаДатуОтсчета - | ПО (ИСТИНА) - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТКоличествоДнейСУчетомПредыдущихГодов КАК КоличествоДнейСУчетомПредыдущихГодов - | ПО (КоличествоДнейСУчетомПредыдущихГодов.Год = КалендарныеГрафики.Год) - | ПО (КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеНаДатуОтсчета.КоличествоДнейВГрафикеСНачалаГода - КоличествоДнейСУчетомПредыдущихГодов.ДнейВГрафике + ПриращениеДней.КоличествоДней) - | И (КалендарныеГрафики.ДатаГрафика >= &ДатаОт) - | И (КалендарныеГрафики.Календарь = &ГрафикРаботы) - | И (КалендарныеГрафики.ДеньВключенВГрафик) - | - |УПОРЯДОЧИТЬ ПО - | ПриращениеДней.ИндексСтроки"; - Иначе - // По производственному календарю - Запрос.Текст = - "ВЫБРАТЬ - | КалендарныеГрафики.Дата КАК ДатаГрафика - |ПОМЕСТИТЬ ВТПоследующиеДатыГрафика - |ИЗ - | РегистрСведений.ДанныеПроизводственногоКалендаря КАК КалендарныеГрафики - |ГДЕ - | КалендарныеГрафики.Дата >= &ДатаОт - | И КалендарныеГрафики.ПроизводственныйКалендарь = &ГрафикРаботы - | И КалендарныеГрафики.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПоследующиеДатыГрафика.ДатаГрафика, - | КОЛИЧЕСТВО(КалендарныеГрафики.ДатаГрафика) - 1 КАК КоличествоДнейВключенныхВГрафик - |ПОМЕСТИТЬ ВТПоследующиеДатыГрафикаСКоличествомДней - |ИЗ - | ВТПоследующиеДатыГрафика КАК ПоследующиеДатыГрафика - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафика КАК КалендарныеГрафики - | ПО (КалендарныеГрафики.ДатаГрафика <= ПоследующиеДатыГрафика.ДатаГрафика) - | - |СГРУППИРОВАТЬ ПО - | ПоследующиеДатыГрафика.ДатаГрафика - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПриращениеДней.ИндексСтроки, - | ЕСТЬNULL(ПоследующиеДни.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю - |ИЗ - | ВТПриращениеДней КАК ПриращениеДней - | ЛЕВОЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафикаСКоличествомДней КАК ПоследующиеДни - | ПО ПриращениеДней.КоличествоДней = ПоследующиеДни.КоличествоДнейВключенныхВГрафик - | - |УПОРЯДОЧИТЬ ПО - | ПриращениеДней.ИндексСтроки"; - КонецЕсли; - - Запрос.УстановитьПараметр("ДатаОт", ДатаОт); + Запрос.УстановитьПараметр("ДатаОт", НачалоДня(ДатаОт)); Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы); Выборка = Запрос.Выполнить().Выбрать(); @@ -183,7 +93,7 @@ Пока Выборка.Следующий() Цикл Если Выборка.ДатаПоКалендарю = Неопределено Тогда - СообщениеОбОшибке = НСтр("ru = 'График работы «%1» не заполнен с даты %2 на указанное количество рабочих дней.'"); + СообщениеОбОшибке = НСтр("ru = 'Производственный календарь «%1» не заполнен с даты %2 на указанное количество рабочих дней.'"); Если ВызыватьИсключение Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( СообщениеОбОшибке, @@ -279,8 +189,10 @@ ШаблонОбъединения, Формат(ДатаГрафика, "ДФ='гггг, ММ, д'")); КонецЦикла; + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос = Новый Запрос(ТекстЗапроса); - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; Запрос.Выполнить(); // Готовим временные таблицы с исходными данными @@ -301,21 +213,7 @@ Запрос.Выполнить(); - Если ТипЗнч(ГрафикРаботы) = Тип("СправочникСсылка.Календари") Тогда - // По графику работы - Запрос.Текст = - "ВЫБРАТЬ - | КалендарныеГрафики.Год, - | КалендарныеГрафики.ДатаГрафика, - | КалендарныеГрафики.ДеньВключенВГрафик - |ПОМЕСТИТЬ ВТКалендарныеГрафики - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРазличныеГодыГрафика КАК ГодыГрафика - | ПО (ГодыГрафика.Год = КалендарныеГрафики.Год) - |ГДЕ - | КалендарныеГрафики.Календарь = &ГрафикРаботы"; - Иначе + Если ТипЗнч(ГрафикРаботы) = Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда // По производственному календарю Запрос.Текст = "ВЫБРАТЬ @@ -333,6 +231,12 @@ | ПО (ГодыГрафика.Год = КалендарныеГрафики.Год) |ГДЕ | КалендарныеГрафики.ПроизводственныйКалендарь = &ГрафикРаботы"; + Иначе + // По графику работы + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.СоздатьВТДанныеГрафика(МенеджерВременныхТаблиц, ГрафикРаботы); + КонецЕсли; КонецЕсли; Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы); @@ -456,21 +360,7 @@ Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; Запрос.Выполнить(); - Если ТипЗнч(График) = Тип("СправочникСсылка.Календари") Тогда - ТекстЗапроса = - "ВЫБРАТЬ - | НачальныеДаты.Дата, - | %Функция%(ДатыКалендаря.ДатаГрафика) КАК БлижайшаяДата - |ИЗ - | НачальныеДаты КАК НачальныеДаты - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КалендарныеГрафики КАК ДатыКалендаря - | ПО (ДатыКалендаря.ДатаГрафика %ЗнакУсловия% НачальныеДаты.Дата) - | И (ДатыКалендаря.Календарь = &График) - | И (ДатыКалендаря.ДеньВключенВГрафик) - | - |СГРУППИРОВАТЬ ПО - | НачальныеДаты.Дата"; - Иначе + Если ТипЗнч(График) = Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда ТекстЗапроса = "ВЫБРАТЬ | НачальныеДаты.Дата, @@ -487,6 +377,12 @@ | |СГРУППИРОВАТЬ ПО | НачальныеДаты.Дата"; + Иначе + // По графику работы + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + ТекстЗапроса = МодульГрафикиРаботы.ШаблонТекстаЗапросаОпределенияБлижайшихДатПоГрафикуРаботы(); + КонецЕсли; КонецЕсли; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%Функция%", ?(ПолучатьПредшествующие, "МАКСИМУМ", "МИНИМУМ")); @@ -523,6 +419,8 @@ // Составляет расписания работы для дат, включенных в указанные графики на указанный период. // Если расписание на предпраздничный день не задано, то оно определяется так, как если бы этот день был бы рабочим. // +// ВНИМАНИЕ! Для работы метода обязательно наличие подсистемы ГрафикиРаботы +// // Параметры // Графики - массив элементов типа СправочникСсылка.Календари // ДатаНачала - дата начала периода, за который нужно составить расписания @@ -536,181 +434,28 @@ // Функция РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания) Экспорт - МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + Возврат МодульГрафикиРаботы.РасписанияРаботыНаПериод(Графики, ДатаНачала, ДатаОкончания); + КонецЕсли; - // Создаем временную таблицу расписаний - СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания); - - ТекстЗапроса = - "ВЫБРАТЬ - | РасписанияРаботы.ГрафикРаботы, - | РасписанияРаботы.ДатаГрафика, - | РасписанияРаботы.ВремяНачала, - | РасписанияРаботы.ВремяОкончания - |ИЗ - | ВТРасписанияРаботы КАК РасписанияРаботы"; - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - - Возврат Запрос.Выполнить().Выгрузить(); + ВызватьИсключение НСтр("ru = 'Подсистема «Графики работы» не обнаружена.'"); КонецФункции // Создает в менеджере временную таблицу ВТРасписанияРаботы с колонками // Подробнее см. комментарий к функции РасписанияРаботыНаПериод // +// ВНИМАНИЕ! Для работы метода обязательно наличие подсистемы ГрафикиРаботы +// Процедура СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания) Экспорт - ТекстЗапроса = - "ВЫБРАТЬ - | ШаблонЗаполнения.Ссылка КАК ГрафикРаботы, - | МАКСИМУМ(ШаблонЗаполнения.НомерСтроки) КАК ДлинаЦикла - |ПОМЕСТИТЬ ВТДлинаЦиклаГрафиков - |ИЗ - | Справочник.Календари.ШаблонЗаполнения КАК ШаблонЗаполнения - |ГДЕ - | ШаблонЗаполнения.Ссылка В(&Календари) - | - |СГРУППИРОВАТЬ ПО - | ШаблонЗаполнения.Ссылка - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | Календари.Ссылка КАК ГрафикРаботы, - | ДанныеПроизводственногоКалендаря.Дата КАК ДатаГрафика, - | ДанныеПроизводственногоКалендаря.ДатаПереноса, - | ВЫБОР - | КОГДА ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ПредпраздничныйДень - |ПОМЕСТИТЬ ВТСведенияПоКалендарю - |ИЗ - | РегистрСведений.ДанныеПроизводственногоКалендаря КАК ДанныеПроизводственногоКалендаря - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари - | ПО ДанныеПроизводственногоКалендаря.ПроизводственныйКалендарь = Календари.ПроизводственныйКалендарь - | И (Календари.Ссылка В (&Календари)) - | И (ДанныеПроизводственногоКалендаря.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания) - | И (ДанныеПроизводственногоКалендаря.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) - | ИЛИ ДанныеПроизводственногоКалендаря.ДатаПереноса <> ДАТАВРЕМЯ(1, 1, 1)) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КалендарныеГрафики.Календарь КАК ГрафикРаботы, - | КалендарныеГрафики.ДатаГрафика КАК ДатаГрафика, - | РАЗНОСТЬДАТ(Календари.ДатаОтсчета, КалендарныеГрафики.ДатаГрафика, ДЕНЬ) + 1 КАК ДнейОтДатыОтсчета, - | СведенияПоКалендарю.ПредпраздничныйДень, - | СведенияПоКалендарю.ДатаПереноса - |ПОМЕСТИТЬ ВТДниВключенныеВГрафик - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари - | ПО КалендарныеГрафики.Календарь = Календари.Ссылка - | И (КалендарныеГрафики.Календарь В (&Календари)) - | И (КалендарныеГрафики.ДатаГрафика МЕЖДУ &ДатаНачала И &ДатаОкончания) - | И (КалендарныеГрафики.ДеньВключенВГрафик) - | ЛЕВОЕ СОЕДИНЕНИЕ ВТСведенияПоКалендарю КАК СведенияПоКалендарю - | ПО (СведенияПоКалендарю.ГрафикРаботы = КалендарныеГрафики.Календарь) - | И (СведенияПоКалендарю.ДатаГрафика = КалендарныеГрафики.ДатаГрафика) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ДниВключенныеВГрафик.ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика, - | ВЫБОР - | КОГДА ДниВключенныеВГрафик.РезультатДеленияПоМодулю = 0 - | ТОГДА ДниВключенныеВГрафик.ДлинаЦикла - | ИНАЧЕ ДниВключенныеВГрафик.РезультатДеленияПоМодулю - | КОНЕЦ КАК НомерДня, - | ДниВключенныеВГрафик.ПредпраздничныйДень - |ПОМЕСТИТЬ ВТДатыНомераДней - |ИЗ - | (ВЫБРАТЬ - | ДниВключенныеВГрафик.ГрафикРаботы КАК ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика КАК ДатаГрафика, - | ДниВключенныеВГрафик.ПредпраздничныйДень КАК ПредпраздничныйДень, - | ДниВключенныеВГрафик.ДлинаЦикла КАК ДлинаЦикла, - | ДниВключенныеВГрафик.ДнейОтДатыОтсчета - ДниВключенныеВГрафик.ЦелаяЧастьРезультатаДеления * ДниВключенныеВГрафик.ДлинаЦикла КАК РезультатДеленияПоМодулю - | ИЗ - | (ВЫБРАТЬ - | ДниВключенныеВГрафик.ГрафикРаботы КАК ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика КАК ДатаГрафика, - | ДниВключенныеВГрафик.ПредпраздничныйДень КАК ПредпраздничныйДень, - | ДниВключенныеВГрафик.ДнейОтДатыОтсчета КАК ДнейОтДатыОтсчета, - | ДлинаЦиклов.ДлинаЦикла КАК ДлинаЦикла, - | (ВЫРАЗИТЬ(ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла КАК ЧИСЛО(15, 0))) - ВЫБОР - | КОГДА (ВЫРАЗИТЬ(ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла КАК ЧИСЛО(15, 0))) > ДниВключенныеВГрафик.ДнейОтДатыОтсчета / ДлинаЦиклов.ДлинаЦикла - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК ЦелаяЧастьРезультатаДеления - | ИЗ - | ВТДниВключенныеВГрафик КАК ДниВключенныеВГрафик - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари - | ПО ДниВключенныеВГрафик.ГрафикРаботы = Календари.Ссылка - | И (Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПоЦикламПроизвольнойДлины)) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДлинаЦиклаГрафиков КАК ДлинаЦиклов - | ПО ДниВключенныеВГрафик.ГрафикРаботы = ДлинаЦиклов.ГрафикРаботы) КАК ДниВключенныеВГрафик) КАК ДниВключенныеВГрафик - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | ДниВключенныеВГрафик.ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика, - | ВЫБОР - | КОГДА ДниВключенныеВГрафик.ДатаПереноса ЕСТЬ NULL - | ТОГДА ДЕНЬНЕДЕЛИ(ДниВключенныеВГрафик.ДатаГрафика) - | ИНАЧЕ ДЕНЬНЕДЕЛИ(ДниВключенныеВГрафик.ДатаПереноса) - | КОНЕЦ, - | ДниВключенныеВГрафик.ПредпраздничныйДень - |ИЗ - | ВТДниВключенныеВГрафик КАК ДниВключенныеВГрафик - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Календари КАК Календари - | ПО ДниВключенныеВГрафик.ГрафикРаботы = Календари.Ссылка - |ГДЕ - | Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПоНеделям) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ДниВключенныеВГрафик.ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика, - | ДниВключенныеВГрафик.НомерДня, - | ЕСТЬNULL(РасписанияРаботыПредпраздничногоДня.ВремяНачала, РасписанияРаботы.ВремяНачала) КАК ВремяНачала, - | ЕСТЬNULL(РасписанияРаботыПредпраздничногоДня.ВремяОкончания, РасписанияРаботы.ВремяОкончания) КАК ВремяОкончания - |ПОМЕСТИТЬ ВТРасписанияРаботы - |ИЗ - | ВТДатыНомераДней КАК ДниВключенныеВГрафик - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Календари.РасписаниеРаботы КАК РасписанияРаботы - | ПО (РасписанияРаботы.Ссылка = ДниВключенныеВГрафик.ГрафикРаботы) - | И (РасписанияРаботы.НомерДня = ДниВключенныеВГрафик.НомерДня) - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Календари.РасписаниеРаботы КАК РасписанияРаботыПредпраздничногоДня - | ПО (РасписанияРаботыПредпраздничногоДня.Ссылка = ДниВключенныеВГрафик.ГрафикРаботы) - | И (РасписанияРаботыПредпраздничногоДня.НомерДня = 0) - | И (ДниВключенныеВГрафик.ПредпраздничныйДень) - | - |ИНДЕКСИРОВАТЬ ПО - | ДниВключенныеВГрафик.ГрафикРаботы, - | ДниВключенныеВГрафик.ДатаГрафика"; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + МодульГрафикиРаботы.СоздатьВТРасписанияРаботыНаПериод(МенеджерВременныхТаблиц, Графики, ДатаНачала, ДатаОкончания); + КонецЕсли; - // Для вычисления номера в цикле произвольной длины для дня, включенного в график, используется следующая формула: - // Номер дня = Дней от даты отсчета % Длина цикла, где % - операция деления по модулю. - - // Операция деления по модулю в свою очередь производится по формуле: - // Делимое - Цел(Делимое / Делитель) * Делитель, где Цел() - функция выделения целой части - - // Для выделения целой части используется конструкция: - // если результат округления числа по правилам «1.5 как 2» больше исходного значения, уменьшаем результат на 1 - - Запрос = Новый Запрос(ТекстЗапроса); - Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; - Запрос.УстановитьПараметр("Календари", Графики); - Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); - Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); - Запрос.Выполнить(); + ВызватьИсключение НСтр("ru = 'Подсистема «Графики работы» не обнаружена.'"); КонецПроцедуры @@ -790,9 +535,9 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления" ].Добавить("КалендарныеГрафики"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихДанных" + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке" ].Добавить("КалендарныеГрафики"); КонецЕсли; @@ -805,15 +550,15 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Заполняет массив типов неразделенных данных. Он используется при обновлении ссылок -// при загрузке-выгрузке конфигурации -// -// Параметры: -// МассивТипов - массив +// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок +// при загрузке данных в другую информационную базу. // -Процедура ПриОпределенииСтандартныхТиповОбщихДанных(Знач МассивТипов) Экспорт +// Параметры: +// Типы - Массив(ОбъектМетаданных) +// +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - МассивТипов.Добавить(Тип("СправочникСсылка.ПроизводственныеКалендари")); + Типы.Добавить(Метаданные.Справочники.ПроизводственныеКалендари); КонецПроцедуры @@ -834,13 +579,57 @@ Объекты.Добавить(Метаданные.Справочники.ПроизводственныеКалендари); Объекты.Добавить(Метаданные.РегистрыСведений.ДанныеПроизводственногоКалендаря); - Объекты.Добавить(Метаданные.Справочники.Календари); - Объекты.Добавить(Метаданные.РегистрыСведений.КалендарныеГрафики); - КонецЕсли; КонецПроцедуры +// Создает временную таблицу ВТПриращениеДней, в которой для каждого элемента из МассивДней +// формируется строка с индексом элемента и значением — количеством дней +// +// Параметры +// - МенеджерВременныхТаблиц, +// - МассивДней - массив, количество дней, +// - РассчитыватьСледующуюДатуОтПредыдущей - необязательный, по умолчанию Ложь +// +Процедура СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, Знач МассивДней, Знач РассчитыватьСледующуюДатуОтПредыдущей = Ложь) Экспорт + + ПриращениеДней = Новый ТаблицаЗначений; + ПриращениеДней.Колонки.Добавить("ИндексСтроки", Новый ОписаниеТипов("Число")); + ПриращениеДней.Колонки.Добавить("КоличествоДней", Новый ОписаниеТипов("Число")); + + КоличествоДней = 0; + НомерСтроки = 0; + Для Каждого СтрокаДней Из МассивДней Цикл + КоличествоДней = КоличествоДней + СтрокаДней; + + Строка = ПриращениеДней.Добавить(); + Строка.ИндексСтроки = НомерСтроки; + Если РассчитыватьСледующуюДатуОтПредыдущей Тогда + Строка.КоличествоДней = КоличествоДней; + Иначе + Строка.КоличествоДней = СтрокаДней; + КонецЕсли; + + НомерСтроки = НомерСтроки + 1; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Запрос.Текст = + "ВЫБРАТЬ + | ПриращениеДней.ИндексСтроки, + | ПриращениеДней.КоличествоДней + |ПОМЕСТИТЬ ВТПриращениеДней + |ИЗ + | &ПриращениеДней КАК ПриращениеДней"; + + Запрос.УстановитьПараметр("ПриращениеДней", ПриращениеДней); + + Запрос.Выполнить(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы @@ -867,60 +656,18 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "КалендарныеГрафики.ОбновитьИспользованиеНесколькихПроизводственныхКалендарей"; - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "КалендарныеГрафики.СоздатьКалендарьПятидневкаРоссийскойФедерации"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.1"; - Обработчик.Процедура = "КалендарныеГрафики.ЗаполнитьНастройкиЗаполненияГрафиковРаботы"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.3.7"; Обработчик.Процедура = "КалендарныеГрафики.ОбновитьИспользованиеНесколькихПроизводственныхКалендарей"; Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.4.21"; - Обработчик.Процедура = "КалендарныеГрафики.ЗаполнитьКоличествоДнейВГрафикеСНачалаГода"; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.6.22"; + Обработчик.Версия = "2.2.1.32"; Обработчик.Процедура = "КалендарныеГрафики.ОбновитьДанныеПроизводственныхКалендарей"; Обработчик.РежимВыполнения = "Монопольно"; Обработчик.ОбщиеДанные = Истина; КонецПроцедуры -// Процедура создает график работы на основе производственного календаря -// Российской Федерации по шаблону "Пятидневка" -// -Процедура СоздатьКалендарьПятидневкаРоссийскойФедерации() Экспорт - - ПроизводственныйКалендарь = ПроизводственныйКалендарьРоссийскойФедерации(); - Если ПроизводственныйКалендарь = Неопределено Тогда - Возврат; - КонецЕсли; - - Если Не Справочники.Календари.НайтиПоРеквизиту("ПроизводственныйКалендарь", ПроизводственныйКалендарь).Пустая() Тогда - Возврат; - КонецЕсли; - - НовыйГрафикРаботы = Справочники.Календари.СоздатьЭлемент(); - НовыйГрафикРаботы.Наименование = ОбщегоНазначения.ПолучитьЗначениеРеквизита(ПроизводственныйКалендарь, "Наименование"); - НовыйГрафикРаботы.ПроизводственныйКалендарь = ПроизводственныйКалендарь; - НовыйГрафикРаботы.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; - НовыйГрафикРаботы.ДатаНачала = НачалоГода(ТекущаяДатаСеанса()); - НовыйГрафикРаботы.УчитыватьПраздники = Истина; - - // Заполняем недельный цикл как пятидневку - Для НомерДня = 1 По 7 Цикл - НовыйГрафикРаботы.ШаблонЗаполнения.Добавить().ДеньВключенВГрафик = НомерДня <= 5; - КонецЦикла; - - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НовыйГрафикРаботы, Истина, Истина); - -КонецПроцедуры - // Обновляет справочник Производственные календари из одноименного макета // Процедура ОбновитьПроизводственныеКалендари() Экспорт @@ -944,63 +691,6 @@ КонецПроцедуры -// Заполняет производственный календарь для тех графиков работы, -// которые были созданы не по шаблону или до появления производственных календарей -// -Процедура ЗаполнитьНастройкиЗаполненияГрафиковРаботы() Экспорт - - ПроизводственныйКалендарьРФ = ПроизводственныйКалендарьРоссийскойФедерации(); - - Если ПроизводственныйКалендарьРФ = Неопределено Тогда - // Если по какой-то причине нет производственного календаря по умолчанию, - // заполнение настроек бессмысленно - Возврат; - КонецЕсли; - - ТекстЗапроса = - "ВЫБРАТЬ - | Календари.Ссылка, - | Календари.УдалитьВидКалендаря КАК ВидКалендаря, - | Календари.ПроизводственныйКалендарь - |ИЗ - | Справочник.Календари КАК Календари - |ГДЕ - | Календари.СпособЗаполнения = ЗНАЧЕНИЕ(Перечисление.СпособыЗаполненияГрафикаРаботы.ПустаяСсылка)"; - - Запрос = Новый Запрос(ТекстЗапроса); - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - ГрафикРаботыОбъект = Выборка.Ссылка.ПолучитьОбъект(); - Если Не ЗначениеЗаполнено(Выборка.ПроизводственныйКалендарь) Тогда - // Устанавливаем календарь РФ - ГрафикРаботыОбъект.ПроизводственныйКалендарь = ПроизводственныйКалендарьРФ; - КонецЕсли; - ГрафикРаботыОбъект.ДатаНачала = Дата(2012, 1, 1); - Если Не ЗначениеЗаполнено(Выборка.ВидКалендаря) Тогда - // Если вид календаря не был указан, нет возможности вписать точную настройку заполнения - ГрафикРаботыОбъект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоЦикламПроизвольнойДлины; - ГрафикРаботыОбъект.ДатаОтсчета = Дата(2012, 1, 1); - Иначе - // Для пятидневки и шестидневки заполняем соответствующую настройку - ГрафикРаботыОбъект.УчитыватьПраздники = Истина; - ГрафикРаботыОбъект.СпособЗаполнения = Перечисления.СпособыЗаполненияГрафикаРаботы.ПоНеделям; - КоличествоРабочихДней = 5; - Если Выборка.ВидКалендаря = Перечисления.УдалитьВидыКалендарей.Шестидневка Тогда - КоличествоРабочихДней = 6; - КонецЕсли; - ГрафикРаботыОбъект.ШаблонЗаполнения.Очистить(); - Для НомерДня = 1 По 7 Цикл - НоваяСтрока = ГрафикРаботыОбъект.ШаблонЗаполнения.Добавить(); - НоваяСтрока.ДеньВключенВГрафик = НомерДня <= КоличествоРабочихДней; - КонецЦикла; - КонецЕсли; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ГрафикРаботыОбъект); - КонецЦикла; - -КонецПроцедуры - // Устанавливает значение константы, определяющей использование нескольких производственных календарей // Процедура ОбновитьИспользованиеНесколькихПроизводственныхКалендарей() Экспорт @@ -1011,83 +701,3 @@ КонецЕсли; КонецПроцедуры - -// Заполняет вторичные данные для оптимизации расчета дат по календарю -// -Процедура ЗаполнитьКоличествоДнейВГрафикеСНачалаГода() Экспорт - - ТекстЗапроса = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | КалендарныеГрафики.Календарь, - | КалендарныеГрафики.Год - |ПОМЕСТИТЬ ВТГрафикиРаботыКоличествоДнейЗаполнено - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - |ГДЕ - | КалендарныеГрафики.КоличествоДнейВГрафикеСНачалаГода > 0 - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | КалендарныеГрафики.Календарь КАК Календарь, - | КалендарныеГрафики.Год КАК Год, - | КалендарныеГрафики.ДатаГрафика, - | КалендарныеГрафики.ДеньВключенВГрафик - |ИЗ - | РегистрСведений.КалендарныеГрафики КАК КалендарныеГрафики - | ЛЕВОЕ СОЕДИНЕНИЕ ВТГрафикиРаботыКоличествоДнейЗаполнено КАК ГрафикиРаботыКоличествоДнейЗаполнено - | ПО (ГрафикиРаботыКоличествоДнейЗаполнено.Календарь = КалендарныеГрафики.Календарь) - | И (ГрафикиРаботыКоличествоДнейЗаполнено.Год = КалендарныеГрафики.Год) - |ГДЕ - | ГрафикиРаботыКоличествоДнейЗаполнено.Год ЕСТЬ NULL - | - |УПОРЯДОЧИТЬ ПО - | КалендарныеГрафики.Календарь, - | КалендарныеГрафики.Год, - | КалендарныеГрафики.ДатаГрафика, - | КалендарныеГрафики.ДеньВключенВГрафик - |ИТОГИ ПО - | Календарь, - | Год"; - - // Выбираем графики работы и годы, для которых не заполнено значение ресурса КоличествоДнейВГрафикеСНачалаГода, - // заполняем для них последовательно рассчитывая количество дней - - Запрос = Новый Запрос(ТекстЗапроса); - ВыборкаПоГрафикам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); - Пока ВыборкаПоГрафикам.Следующий() Цикл - ВыборкаПоГодам = ВыборкаПоГрафикам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); - Пока ВыборкаПоГодам.Следующий() Цикл - НаборЗаписей = РегистрыСведений.КалендарныеГрафики.СоздатьНаборЗаписей(); - КоличествоДнейВГрафикеСНачалаГода = 0; - Выборка = ВыборкаПоГодам.Выбрать(); - Пока Выборка.Следующий() Цикл - Если Выборка.ДеньВключенВГрафик Тогда - КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеСНачалаГода + 1; - КонецЕсли; - СтрокаНабора = НаборЗаписей.Добавить(); - ЗаполнитьЗначенияСвойств(СтрокаНабора, Выборка); - СтрокаНабора.КоличествоДнейВГрафикеСНачалаГода = КоличествоДнейВГрафикеСНачалаГода; - КонецЦикла; - НаборЗаписей.Отбор.Календарь.Установить(ВыборкаПоГодам.Календарь); - НаборЗаписей.Отбор.Год.Установить(ВыборкаПоГодам.Год); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(НаборЗаписей); - КонецЦикла; - КонецЦикла; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы - -// Процедура выполняет обновление графиков работы по данным производственных календарей -// по всем областям данных -// -Процедура ЗапланироватьОбновлениеГрафиковРаботы(Знач УсловияОбновления) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда - МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); - МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ЗапланироватьОбновлениеГрафиковРаботы(УсловияОбновления); - КонецЕсли; - -КонецПроцедуры diff --git a/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl index 7b9dbda14..72b9c2d21 100644 --- a/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/КалендарныеГрафикиСлужебныйВМоделиСервиса/Module.bsl @@ -11,13 +11,13 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( "КалендарныеГрафикиСлужебныйВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "КалендарныеГрафикиСлужебныйВМоделиСервиса"); @@ -178,12 +178,19 @@ // Процедура ОбновитьГрафикиРаботы(Знач УсловияОбновления, Знач ИдентификаторОбновления) Экспорт - ОбластиДляОбновления = ПоставляемыеДанные.ОбластиТребующиеОбработки( - ИдентификаторОбновления, "ДанныеПроизводственныхКалендарей"); - - // Обновление графиков работы по областям данных - РаспространитьДанныеПроизводственныхКалендарейПоГрафикамРаботы(УсловияОбновления, ОбластиДляОбновления, - ИдентификаторОбновления, "ДанныеПроизводственныхКалендарей"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда + + МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы"); + + // Получение областей данных для обработки + ОбластиДляОбновления = ПоставляемыеДанные.ОбластиТребующиеОбработки( + ИдентификаторОбновления, "ДанныеПроизводственныхКалендарей"); + + // Обновление графиков работы по областям данных + РаспространитьДанныеПроизводственныхКалендарейПоГрафикамРаботы(УсловияОбновления, ОбластиДляОбновления, + ИдентификаторОбновления, "ДанныеПроизводственныхКалендарей", МодульГрафикиРаботы); + + КонецЕсли; КонецПроцедуры @@ -197,7 +204,7 @@ // КодОбработчика - Строка, код обработчика // Процедура РаспространитьДанныеПроизводственныхКалендарейПоГрафикамРаботы(Знач УсловияОбновления, - Знач ОбластиДляОбновления, Знач ИдентификаторФайла, Знач КодОбработчика) + Знач ОбластиДляОбновления, Знач ИдентификаторФайла, Знач КодОбработчика, Знач МодульГрафикиРаботы) УсловияОбновления.Свернуть("КодПроизводственногоКалендаря, Год"); @@ -208,7 +215,7 @@ УстановитьПривилегированныйРежим(Ложь); НачатьТранзакцию(); - Справочники.Календари.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления); + МодульГрафикиРаботы.ОбновитьГрафикиРаботыПоДаннымПроизводственныхКалендарей(УсловияОбновления); ПоставляемыеДанные.ОбластьОбработана(ИдентификаторФайла, КодОбработчика, ОбластьДанных); ЗафиксироватьТранзакцию(); diff --git a/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/Module.bsl b/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/Module.bsl deleted file mode 100644 index 1691f6fb9..000000000 --- a/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/Module.bsl +++ /dev/null @@ -1,71 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Бизнес-процессы и задачи" -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Устаревший программный интерфейс. Будет удален в следующей редакции БСП. - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура Остановить(Знач ПараметрКоманды) Экспорт - - БизнесПроцессыИЗадачиКлиент.Остановить(ПараметрКоманды); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОстановитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт - - БизнесПроцессыИЗадачиКлиент.ОстановитьБизнесПроцессИзФормыОбъекта(Форма); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура СделатьАктивным(Знач ПараметрКоманды) Экспорт - - БизнесПроцессыИЗадачиКлиент.СделатьАктивным(ПараметрКоманды); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ПродолжитьБизнесПроцессИзФормыОбъекта(Форма) Экспорт - - БизнесПроцессыИЗадачиКлиент.ПродолжитьБизнесПроцессИзФормыОбъекта(Форма); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ПринятьЗадачиКИсполнению(Знач МассивЗадач) Экспорт - - БизнесПроцессыИЗадачиКлиент.ПринятьЗадачиКИсполнению(МассивЗадач); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ПринятьЗадачуКИсполнению(Форма, ТекущийПользователь) Экспорт - - БизнесПроцессыИЗадачиКлиент.ПринятьЗадачуКИсполнению(Форма, ТекущийПользователь); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОтменитьПринятиеЗадачКИсполнению(Знач МассивЗадач) Экспорт - - БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачКИсполнению(МассивЗадач); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОтменитьПринятиеЗадачиКИсполнению(Форма) Экспорт - - БизнесПроцессыИЗадачиКлиент.ОтменитьПринятиеЗадачиКИсполнению(Форма); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОбновитьДоступностьКомандПринятияКИсполнению(Форма) Экспорт - - БизнесПроцессыИЗадачиКлиент.ОбновитьДоступностьКомандПринятияКИсполнению(Форма); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/КомандыРаботыСБизнесПроцессамиКлиент.mdo b/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/КомандыРаботыСБизнесПроцессамиКлиент.mdo deleted file mode 100644 index a20166435..000000000 --- a/SSL/src/CommonModules/КомандыРаботыСБизнесПроцессамиКлиент/КомандыРаботыСБизнесПроцессамиКлиент.mdo +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="bd97e481-cfc4-4a40-8438-985020f06abd"> - <name>КомандыРаботыСБизнесПроцессамиКлиент</name> - <synonym> - <key>ru</key> - <value>Команды работы с бизнес процессами клиент</value> - </synonym> - <clientManagedApplication>true</clientManagedApplication> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/Module.bsl deleted file mode 100644 index f1b90b8d0..000000000 --- a/SSL/src/CommonModules/КомандыРаботыСФайламиКлиент/Module.bsl +++ /dev/null @@ -1,143 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Устаревший программный интерфейс. Будет удален в следующей редакции БСП. - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ЗакончитьРедактирование( - ПараметрКоманды, - ИдентификаторФормы, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - Знач АвторТекущейВерсии = Неопределено, - Знач Кодировка = Неопределено) Экспорт - - РаботаСФайламиКлиент.ЗакончитьРедактирование( - ПараметрКоманды, - ИдентификаторФормы, - ХранитьВерсии, - РедактируетТекущийПользователь, - Редактирует, - АвторТекущейВерсии, - Кодировка); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура Редактировать(ОбъектСсылка, - УникальныйИдентификатор = Неопределено, - РабочийКаталогВладельца = Неопределено) Экспорт - - РаботаСФайламиКлиент.Редактировать( - ОбъектСсылка, - УникальныйИдентификатор, - РабочийКаталогВладельца); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура Занять(ПараметрКоманды, УникальныйИдентификатор = Неопределено) Экспорт - - РаботаСФайламиКлиент.Занять(ПараметрКоманды, УникальныйИдентификатор); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОсвободитьФайл( - ПараметрКоманды, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - УникальныйИдентификатор = Неопределено) Экспорт - - РаботаСФайламиКлиент.ОсвободитьФайл( - ПараметрКоманды, - ХранитьВерсии, - РедактируетТекущийПользователь, - Редактирует, - УникальныйИдентификатор); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура Открыть(ДанныеФайла) Экспорт - - РаботаСФайламиКлиент.Открыть(ДанныеФайла); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы) Экспорт - - РаботаСФайламиКлиент.ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОткрытьКаталогФайла(ДанныеФайла) Экспорт - - РаботаСФайламиКлиент.ОткрытьКаталогФайла(ДанныеФайла); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура СохранитьКак(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - РаботаСФайламиКлиент.СохранитьКак(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Экспорт - - РаботаСФайламиКлиент.ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы); - -КонецПроцедуры - -// Устарела. Следует использовать вызываемую функцию. Будет удалена в следующей редакции БСП. -Функция СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи) Экспорт - - Возврат РаботаСФайламиКлиент.СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи); - -КонецФункции - -// Устарела. Следует использовать вызываемую функцию. Будет удалена в следующей редакции БСП. -Функция Зашифровать(ДанныеФайла, - УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков) Экспорт - - Возврат РаботаСФайламиКлиент.Зашифровать( - ДанныеФайла, - УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков); - -КонецФункции - -// Устарела. Следует использовать вызываемую функцию. Будет удалена в следующей редакции БСП. -Функция Расшифровать(ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу) Экспорт - - Возврат РаботаСФайламиКлиент.Расшифровать( - ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу); - -КонецФункции - -// Устарела. Следует использовать вызываемую функцию. Будет удалена в следующей редакции БСП. -Функция ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - Возврат РаботаСФайламиКлиент.ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор); - -КонецФункции - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Процедура СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор) Экспорт - - РаботаСФайламиКлиент.СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияXML/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияXML/Module.bsl index 7d2028279..293c4bb82 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияXML/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияXML/Module.bsl @@ -36,16 +36,16 @@ // Параметры: // Текст XML строка контактной информации. Может быть модифицирован // -Функция СтрокаСоставаКонтактнойИнформации(Знач Текст, Знач НовоеЗначение=Неопределено) Экспорт +Функция СтрокаСоставаКонтактнойИнформации(Знач Текст, Знач НовоеЗначение = Неопределено) Экспорт Чтение = Новый ЧтениеXML; Чтение.УстановитьСтроку(Текст); ОбъектXDTO= ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(), "КонтактнаяИнформация")); Состав = ОбъектXDTO.Состав; - Если Состав<>Неопределено - И Состав.Свойства().Получить("Значение")<>Неопределено - И ТипЗнч(Состав.Значение)=Тип("Строка") + Если Состав <> Неопределено + И Состав.Свойства().Получить("Значение") <> Неопределено + И ТипЗнч(Состав.Значение) = Тип("Строка") Тогда Возврат Состав.Значение; КонецЕсли; @@ -53,10 +53,10 @@ Возврат Неопределено; КонецФункции -// Преобразует строку пар ключ=значение (см старый формат адреса) в структуру. +// Преобразует строку пар ключ = значение (см старый формат адреса) в структуру. // // Параметры: -// Текст - строка пар ключ=значение, разделенные переносом строки +// Текст - строка пар ключ = значение, разделенные переносом строки // Функция СтрокаКлючЗначениеВСтруктуру(Знач Текст) Экспорт Возврат ЗначениеИзСтрокиXML( XSLT_СтрокаКлючЗначениеВСтруктуру(Текст) ); @@ -66,9 +66,9 @@ // В возвращаемом списке значений представление - исходный ключ, значение - исходное значение // // Параметры: -// Текст - строка пар ключ=значение, разделенные переносом строки +// Текст - строка пар ключ = значение, разделенные переносом строки // -Функция СтрокаКлючЗначениеВСписокЗначений(Знач Текст, Знач УникальностьПолей=Истина) Экспорт +Функция СтрокаКлючЗначениеВСписокЗначений(Знач Текст, Знач УникальностьПолей = Истина) Экспорт Если УникальностьПолей Тогда Возврат ЗначениеИзСтрокиXML( XSLT_УникальныеПоПредставлениюВСписке(XSLT_СтрокаКлючЗначениеВСписокЗначений(Текст)) ); КонецЕсли; @@ -142,7 +142,7 @@ ДанныеКИ2 = ПривестиКонтактнуюИнформациюXML(Данные2); ТипКонтактнойИнформации = ДанныеКИ1.ТипКонтактнойИнформации; - Если ТипКонтактнойИнформации<>ДанныеКИ2.ТипКонтактнойИнформации Тогда + Если ТипКонтактнойИнформации <> ДанныеКИ2.ТипКонтактнойИнформации Тогда // Различные типы, дальше не сравниваем Результат = Новый ТаблицаЗначений; Колонки = Результат.Колонки; @@ -150,7 +150,7 @@ СтрокаРезультата[Колонки.Добавить("Путь").Имя] = "ТипКонтактнойИнформации"; СтрокаРезультата[Колонки.Добавить("Значение1").Имя] = ДанныеКИ1.ТипКонтактнойИнформации; СтрокаРезультата[Колонки.Добавить("Значение2").Имя] = ДанныеКИ2.ТипКонтактнойИнформации; - СтрокаРезультата[Колонки.Добавить("Описание").Имя] = НСтр("ru='Различные типы контактной информации'"); + СтрокаРезультата[Колонки.Добавить("Описание").Имя] = НСтр("ru = 'Различные типы контактной информации'"); Возврат Результат; КонецЕсли; @@ -183,7 +183,7 @@ Возврат Новый Структура("ДанныеXML, ТипКонтактнойИнформации", Данные, ЗначениеИзСтрокиXML( XSLT_ТипКонтактнойИнформацииПоСтрокеXML(Данные) )); - ИначеЕсли ТипЗнч(Данные)=Тип("ОбъектXDTO") Тогда + ИначеЕсли ТипЗнч(Данные) = Тип("ОбъектXDTO") Тогда ДанныеXML = КонтактнаяИнформацияСлужебный.СериализацияКонтактнойИнформации(Данные); Возврат Новый Структура("ДанныеXML, ТипКонтактнойИнформации", ДанныеXML, ЗначениеИзСтрокиXML( XSLT_ТипКонтактнойИнформацииПоСтрокеXML(ДанныеXML) )); @@ -207,13 +207,13 @@ // Разбираем по ЗначенияПолей, ВидКонтактнойИнформации, Представление ТипЗначенийПолей = ТипЗнч(ЗначенияПолей); - Если ТипЗначенийПолей=Тип("Строка") Тогда + Если ТипЗначенийПолей = Тип("Строка") Тогда // Текст из пар ключ-значение СтрокаXMLСтруктуры = XSLT_СтрокаКлючЗначениеВСтруктуру(ЗначенияПолей) - ИначеЕсли ТипЗначенийПолей=Тип("СписокЗначений") Тогда + ИначеЕсли ТипЗначенийПолей = Тип("СписокЗначений") Тогда // Список значений СтрокаXMLСтруктуры = XSLT_СписокЗначенийВСтруктуру( ЗначениеВСтрокуXML(ЗначенияПолей) ); - ИначеЕсли ТипЗначенийПолей=Тип("Соответствие") Тогда + ИначеЕсли ТипЗначенийПолей = Тип("Соответствие") Тогда // Соответствие СтрокаXMLСтруктуры = XSLT_СоответствиеВСтруктуру( ЗначениеВСтрокуXML(ЗначенияПолей) ); Иначе @@ -227,26 +227,26 @@ Результат = Новый Структура("ТипКонтактнойИнформации, ДанныеXML", ТипКонтактнойИнформации); ВсеТипы = Перечисления.ТипыКонтактнойИнформации; - Если ТипКонтактнойИнформации=ВсеТипы.Адрес Тогда + Если ТипКонтактнойИнформации = ВсеТипы.Адрес Тогда Результат.ДанныеXML = XSLT_СтруктураВАдрес(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); - ИначеЕсли ТипКонтактнойИнформации=ВсеТипы.АдресЭлектроннойПочты Тогда + ИначеЕсли ТипКонтактнойИнформации = ВсеТипы.АдресЭлектроннойПочты Тогда Результат.ДанныеXML = XSLT_СтруктураВАдресЭлектроннойПочты(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); - ИначеЕсли ТипКонтактнойИнформации=ВсеТипы.ВебСтраница Тогда + ИначеЕсли ТипКонтактнойИнформации = ВсеТипы.ВебСтраница Тогда Результат.ДанныеXML = XSLT_СтруктураВВебСтраницу(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); - ИначеЕсли ТипКонтактнойИнформации=ВсеТипы.Телефон Тогда + ИначеЕсли ТипКонтактнойИнформации = ВсеТипы.Телефон Тогда Результат.ДанныеXML = XSLT_СтруктураВТелефон(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); - ИначеЕсли ТипКонтактнойИнформации=ВсеТипы.Факс Тогда + ИначеЕсли ТипКонтактнойИнформации = ВсеТипы.Факс Тогда Результат.ДанныеXML = XSLT_СтруктураВФакс(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); - ИначеЕсли ТипКонтактнойИнформации=ВсеТипы.Другое Тогда + ИначеЕсли ТипКонтактнойИнформации = ВсеТипы.Другое Тогда Результат.ДанныеXML = XSLT_СтруктураВДругое(СтрокаXMLСтруктуры, Данные.Представление, Комментарий); Иначе - ВызватьИсключение НСтр("ru='Ошибка параметров преобразования, не определен тип контактной информации'"); + ВызватьИсключение НСтр("ru = 'Ошибка параметров преобразования, не определен тип контактной информации'"); КонецЕсли; @@ -290,12 +290,12 @@ Возврат Преобразователь.ПреобразоватьИзСтроки( Построитель.ПолучитьТекст() ); КонецФункции -// Преобразует текст с парами Ключ=Значение, разделенных переносами строк (см формат адреса) в XML. +// Преобразует текст с парами Ключ = Значение, разделенных переносами строк (см формат адреса) в XML. // В случае повторных ключей все включаются в результат, но при десериализации будет использован // последний (особенность работы сериализатора платформы) // // Параметры: -// Текст - строка с парами Ключ=Значение +// Текст - строка с парами Ключ = Значение // // Возвращаемое значение - строка XML сериализованной структуры // @@ -304,11 +304,11 @@ Возврат Преобразователь.ПреобразоватьИзСтроки( XSLT_УзелСтрокиПараметра(Текст) ); КонецФункции -// Преобразует текст с парами Ключ=Значение, разделенных переносами строк (см формат адреса) в XML. +// Преобразует текст с парами Ключ = Значение, разделенных переносами строк (см формат адреса) в XML. // В случае повторных ключей все включаются в результат // // Параметры: -// Текст - строка с парами Ключ=Значение +// Текст - строка с парами Ключ = Значение // // Возвращаемое значение - строка XML сериализованного списка значений // @@ -317,7 +317,7 @@ Возврат Преобразователь.ПреобразоватьИзСтроки( XSLT_УзелСтрокиПараметра(Текст) ); КонецФункции -// Преобразует список значений в строку пар ключ=значение, разделенных переносом строки +// Преобразует список значений в строку пар ключ = значение, разделенных переносом строки // // Параметры: // Текст - сериализованный список значений @@ -329,7 +329,7 @@ Возврат Преобразователь.ПреобразоватьИзСтроки(Текст); КонецФункции -// Преобразует структуру в строку пар ключ=значение, разделенных переносом строки +// Преобразует структуру в строку пар ключ = значение, разделенных переносом строки // // Параметры: // Текст - сериализованная структура @@ -402,7 +402,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВАдрес(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВАдрес(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВАдрес(); Возврат XSLT_КонтрольПредставленияИКомментария( Преобразователь.ПреобразоватьИзСтроки(Текст), @@ -418,7 +418,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВАдресЭлектроннойПочты(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВАдресЭлектроннойПочты(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВАдресЭлектроннойПочты(); Возврат XSLT_КонтрольПредставленияИКомментария( @@ -435,7 +435,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВВебСтраницу(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВВебСтраницу(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВВебСтраницу(); Возврат XSLT_КонтрольПредставленияИКомментария( @@ -452,7 +452,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВТелефон(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВТелефон(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВТелефон(); Возврат XSLT_КонтрольПредставленияИКомментария( Преобразователь.ПреобразоватьИзСтроки(Текст), @@ -468,7 +468,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВФакс(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВФакс(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВФакс(); Возврат XSLT_КонтрольПредставленияИКомментария( Преобразователь.ПреобразоватьИзСтроки(Текст), @@ -484,7 +484,7 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_СтруктураВДругое(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) +Функция XSLT_СтруктураВДругое(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) Преобразователь = КонтактнаяИнформацияСлужебныйПовтИсп.XSLT_СтруктураВДругое(); Возврат XSLT_КонтрольПредставленияИКомментария( @@ -501,8 +501,8 @@ // // Возвращаемое значение - XML контактной информации // -Функция XSLT_КонтрольПредставленияИКомментария(Знач Текст, Знач Представление=Неопределено, Знач Комментарий=Неопределено) - Если Представление=Неопределено И Комментарий=Неопределено Тогда +Функция XSLT_КонтрольПредставленияИКомментария(Знач Текст, Знач Представление = Неопределено, Знач Комментарий = Неопределено) + Если Представление = Неопределено И Комментарий = Неопределено Тогда Возврат Текст; КонецЕсли; @@ -520,7 +520,7 @@ | </xsl:template> |"); - Если Представление<>Неопределено Тогда + Если Представление <> Неопределено Тогда XSLT_Текст.ДобавитьСтроку(" | <xsl:template match=""tns:КонтактнаяИнформация/@Представление""> | <xsl:attribute name=""Представление""> @@ -535,7 +535,7 @@ |"); КонецЕсли; - Если Комментарий<>Неопределено Тогда + Если Комментарий <> Неопределено Тогда XSLT_Текст.ДобавитьСтроку(" | <xsl:template match=""tns:КонтактнаяИнформация/tns:Комментарий""> | <xsl:element name=""Комментарий""> @@ -569,7 +569,7 @@ // Состав. Если там ничего нет и атрибут "Состав.Значение" пуст, то ставим в состав значение представления // Функция XSLT_КонтрольСтроковогоЗначенияПростогоТипа(Знач Текст, Знач Представление) - Если Представление=Неопределено Тогда + Если Представление = Неопределено Тогда Возврат Текст; КонецЕсли; @@ -611,7 +611,7 @@ // - Текст - строка, вставляемая в XML // - ИмяЭлемента - необязательное имя для внешнего узла // -Функция XSLT_УзелСтрокиПараметра(Знач Текст, Знач ИмяЭлемента="ExternalParamNode") +Функция XSLT_УзелСтрокиПараметра(Знач Текст, Знач ИмяЭлемента = "ExternalParamNode") // Через запись xml для маскировки спецсимволов Запись = Новый ЗаписьXML; Запись.УстановитьСтроку(); @@ -651,7 +651,7 @@ // Текст - проверяемый текст // Функция ЭтоСтрокаXML(Текст) - Возврат ТипЗнч(Текст)=Тип("Строка") И Лев(СокрЛ(Текст),1)="<"; + Возврат ТипЗнч(Текст) = Тип("Строка") И Лев(СокрЛ(Текст),1) = "<"; КонецФункции // Десериализатор известных платформе типов diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСервер/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСервер/Module.bsl index 9a1a4b51b..18274a222 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСервер/Module.bsl @@ -7,10 +7,10 @@ // ПРОГРАММНЫЙ ИНТЕРФЕЙС // -// Возвращает признак того, является ли строка данных контактной информации XML данными +// Возвращает признак того, является ли строка данных контактной информации XML данными // -// Параметры: -// Текст - проверяемая строка +// Параметры: +// Текст - Строка - Проверяемая строка // Функция ЭтоКонтактнаяИнформацияВXML(Знач Текст) Экспорт // Упрощенная проверка @@ -21,17 +21,17 @@ // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // -/// Возвращает аккуратно построеное наименование через запятую по парам "Название" + "Сокращение" +// Возвращает аккуратно построеное наименование через запятую по парам "Название" + "Сокращение" // -Функция ПолноеНаименование(Знач н0="", Знач с0="", Знач н1="", Знач с1="", Знач н2="", Знач с2="", Знач н3="", Знач с3="", Знач н4="", Знач с4="", Знач н5="", Знач с5="", Знач н6="", Знач с6="", Знач н7="", Знач с7="", Знач н8="", Знач с8="", Знач н9="", Знач с9="") Экспорт +Функция ПолноеНаименование(Знач н0 = "", Знач с0 = "", Знач н1 = "", Знач с1 = "", Знач н2 = "", Знач с2 = "", Знач н3 = "", Знач с3 = "", Знач н4 = "", Знач с4 = "", Знач н5 = "", Знач с5 = "", Знач н6 = "", Знач с6 = "", Знач н7 = "", Знач с7 = "", Знач н8 = "", Знач с8 = "", Знач н9 = "", Знач с9 = "") Экспорт // Часть 0 Результат = ?(ПустаяСтрока(н0), "", СокрЛП( СокрП(н0) + " " + СокрЛ(с0)) ); // Часть 1 ТекН = СокрЛП(н1); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с1))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с1))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -39,8 +39,8 @@ // Часть 2 ТекН = СокрЛП(н2); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с2))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с2))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -48,8 +48,8 @@ // Часть 3 ТекН = СокрЛП(н3); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с3))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с3))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -57,8 +57,8 @@ // Часть 4 ТекН = СокрЛП(н4); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с4))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с4))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -66,8 +66,8 @@ // Часть 5 ТекН = СокрЛП(н5); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с5))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с5))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -75,8 +75,8 @@ // Часть 6 ТекН = СокрЛП(н6); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с6))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с6))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -84,8 +84,8 @@ // Часть 7 ТекН = СокрЛП(н7); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с7))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с7))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -93,8 +93,8 @@ // Часть 8 ТекН = СокрЛП(н8); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с8))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с8))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -102,8 +102,8 @@ // Часть 9 ТекН = СокрЛП(н9); - Наименование = ?(ТекН="", "", СокрЛП(ТекН + " " + СокрЛ(с9))); - Если Наименование="" Или Результат="" Тогда + Наименование = ?(ТекН = "", "", СокрЛП(ТекН + " " + СокрЛ(с9))); + Если Наименование = "" Или Результат = "" Тогда Результат = Результат + Наименование; Иначе Результат = Результат + ", " + Наименование; @@ -112,72 +112,72 @@ Возврат Результат; КонецФункции -// Возвращает структуру с наименованием и сокращением от значения +// Возвращает структуру с наименованием и сокращением от значения // -// Параметры: -// Текст - строка полного наименования +// Параметры: +// Текст - Строка - Полное наименование // Функция НаименованиеСокращение(Знач Текст) Экспорт Результат = Новый Структура("Наименование, Сокращение"); Части = ЧастиАдреса(Текст, Истина); - Если Части.Количество()>0 Тогда + Если Части.Количество() > 0 Тогда ЗаполнитьЗначенияСвойств(Результат, Части[0]); - Иначе + Иначе Результат.Наименование = Текст; КонецЕсли; Возврат Результат; -КонецФункции +КонецФункции -// Возвращает отдельно сокращение от значения +// Возвращает отдельно сокращение от значения // -// Параметры: -// Текст - строка полного наименования +// Параметры: +// Текст - Строка - Полное наименования // Функция Сокращение(Знач Текст) Экспорт Части = НаименованиеСокращение(Текст); Возврат Части.Сокращение; КонецФункции -// Разделяет текст на слова по указанным разделителям. По умолчанию разделители - пробельные символы -// Возвращает массив слов. +// Разделяет текст на слова по указанным разделителям. По умолчанию разделители - пробельные символы +// Возвращает массив слов. // -// Параметры: -// Текст - разделяемая строка -// Разделители - необязательная строка символов-разделителей +// Параметры: +// Текст - Строка - Разделяемая строка +// Разделители - Строка - Необязательная строка символов-разделителей // -Функция СловаТекста(Знач Текст, Знач Разделители=Неопределено) Экспорт +Функция СловаТекста(Знач Текст, Знач Разделители = Неопределено) Экспорт НачалоСлова = 0; Состояние = 0; Результат = Новый Массив; - Для Позиция=1 По СтрДлина(Текст) Цикл + Для Позиция = 1 По СтрДлина(Текст) Цикл ТекущийСимвол = Сред(Текст, Позиция, 1); - ЭтоРазделитель = ?(Разделители=Неопределено, ПустаяСтрока(ТекущийСимвол), Найти(Разделители, ТекущийСимвол)>0); + ЭтоРазделитель = ?(Разделители = Неопределено, ПустаяСтрока(ТекущийСимвол), Найти(Разделители, ТекущийСимвол) > 0); - Если Состояние=0 И (Не ЭтоРазделитель) Тогда + Если Состояние = 0 И (Не ЭтоРазделитель) Тогда НачалоСлова = Позиция; Состояние = 1; - ИначеЕсли Состояние=1 И ЭтоРазделитель Тогда + ИначеЕсли Состояние = 1 И ЭтоРазделитель Тогда Результат.Добавить(Сред(Текст, НачалоСлова, Позиция-НачалоСлова)); Состояние = 0; КонецЕсли; КонецЦикла; - Если Состояние=1 Тогда + Если Состояние = 1 Тогда Результат.Добавить(Сред(Текст, НачалоСлова, Позиция-НачалоСлова)); КонецЕсли; Возврат Результат; КонецФункции -// Разделяет текст, разделенный запятыми, на массив структур "Наименование, Сокращение" +// Разделяет текст, разделенный запятыми, на массив структур "Наименование, Сокращение" // -// Параметры: -// Текст - разделяемый текст -// ВыделятьСокращения - опциональный параметр режима работы +// Параметры: +// Текст - Срока - Разделяемый текст +// ВыделятьСокращения - Булево - Опциональный параметр режима работы // -Функция ЧастиАдреса(Знач Текст, Знач ВыделятьСокращения=Истина) Экспорт +Функция ЧастиАдреса(Знач Текст, Знач ВыделятьСокращения = Истина) Экспорт Результат = Новый Массив; Для Каждого Часть Из СловаТекста(Текст, ",") Цикл @@ -187,8 +187,8 @@ КонецЕсли; Позиция = ?(ВыделятьСокращения, СтрДлина(СтрокаЧасти), 0); - Пока Позиция>0 Цикл - Если Сред(СтрокаЧасти, Позиция, 1)=" " Тогда + Пока Позиция > 0 Цикл + Если Сред(СтрокаЧасти, Позиция, 1) = " " Тогда Результат.Добавить(Новый Структура("Наименование, Сокращение", СокрЛП(Лев(СтрокаЧасти, Позиция-1)), СокрЛП(Сред(СтрокаЧасти, Позиция)))); Позиция = -1; @@ -196,7 +196,7 @@ КонецЕсли; Позиция = Позиция - 1; КонецЦикла; - Если Позиция=0 Тогда + Если Позиция = 0 Тогда Результат.Добавить(Новый Структура("Наименование, Сокращение", СтрокаЧасти)); КонецЕсли; @@ -205,13 +205,19 @@ Возврат Результат; КонецФункции -// Возвращает значение перечисления "ВариантыАдресногоКлассификатора" согласно текущей установке. +// Возвращает вариант адресного классификатора: "КЛАДР" или Неопределено. +// // Функция ИспользуемыйАдресныйКлассификатор() Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - Возврат ПредопределенноеЗначение(ИмяПеречисленияКЛАДР); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + ЕстьПодсистемаАдресныйКлассификатор = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор"); +#Иначе + ЕстьПодсистемаАдресныйКлассификатор = ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор"); +#КонецЕсли + + Если ЕстьПодсистемаАдресныйКлассификатор Тогда + Возврат "КЛАДР"; КонецЕсли; // Нет подсистемы, возможно нет и перечисления @@ -220,30 +226,29 @@ // Возвращает первый элемент из списка или Неопределено, если такого элемента нет // -// Параметры: -// СписокДанных - список значений, массив или поле формы +// Параметры: +// СписокДанных - СписокЗначений, Массив, ПолеФормы // Функция ПервыйИлиПустой(Знач СписокДанных) Экспорт ТипСписка = ТипЗнч(СписокДанных); - Если ТипСписка=Тип("СписокЗначений") И СписокДанных.Количество()>0 Тогда + Если ТипСписка = Тип("СписокЗначений") И СписокДанных.Количество() > 0 Тогда Возврат СписокДанных[0].Значение; - ИначеЕсли ТипСписка=Тип("Массив") И СписокДанных.Количество()>0 Тогда + ИначеЕсли ТипСписка = Тип("Массив") И СписокДанных.Количество() > 0 Тогда Возврат СписокДанных[0]; - ИначеЕсли ТипСписка=Тип("ПолеФормы") Тогда + ИначеЕсли ТипСписка = Тип("ПолеФормы") Тогда Возврат ПервыйИлиПустой(СписокДанных.СписокВыбора); КонецЕсли; Возврат Неопределено; КонецФункции -// Возвращает признак того, хранит ли строка данные XML +// Возвращает признак того, хранит ли строка данные XML // -// Параметры: -// Текст - проверяемая строка +// Параметры: +// Текст - Строка - Проверяемая строка // Функция ЭтоСтрокаXML(Знач Текст) Экспорт // Упрощенная проверка - Возврат ТипЗнч(Текст)=Тип("Строка") И Лев(СокрЛ(Текст),1)="<"; + Возврат ТипЗнч(Текст) = Тип("Строка") И Лев(СокрЛ(Текст),1) = "<"; КонецФункции - diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСерверПовтИсп/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСерверПовтИсп/Module.bsl index 6b5ab832b..4e635e26d 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСерверПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияКлиентСерверПовтИсп/Module.bsl @@ -47,7 +47,7 @@ // Функция XPathНомераДополнительногоОбъектаАдресации(СтрокаЗначения) Экспорт Код = КонтактнаяИнформацияКлиентСерверПовтИсп.КодСериализацииОбъектаАдресации(СтрокаЗначения); - Если Код=Неопределено Тогда + Если Код = Неопределено Тогда Код = СтрЗаменить(СтрокаЗначения, "'", ""); КонецЕсли; Возврат "ДопАдрЭл/Номер[Тип='" + Код + "']"; @@ -85,31 +85,22 @@ ТипИнформации = КонтактнаяИнформацияСлужебныйВызовСервера.ТипВидаКонтактнойИнформации(ВидИнформации); ВсеТипы = "Перечисление.ТипыКонтактнойИнформации."; - Если ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "Адрес") Тогда + Если ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Адрес") Тогда Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводАдреса"; - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "Телефон") Тогда + ИначеЕсли ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Телефон") Тогда Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона"; - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "Факс") Тогда + ИначеЕсли ТипИнформации = ПредопределенноеЗначение(ВсеТипы + "Факс") Тогда Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводТелефона"; - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "ВебСтраница") Тогда - Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводДругого"; - - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "АдресЭлектроннойПочты") Тогда - Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводДругого"; - - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеТипы + "Другое") Тогда - Возврат "Обработка.ВводКонтактнойИнформации.Форма.ВводДругого"; - КонецЕсли; Возврат Неопределено; КонецФункции // Возвращает массив вариантов наименований по типу (по признаку владения, строения, и т.п) -Функция НаименованияОбъектовАдресацииПоТипу(Тип, ДопускатьПовторыКода=Истина) Экспорт +Функция НаименованияОбъектовАдресацииПоТипу(Тип, ДопускатьПовторыКода = Истина) Экспорт Результат = Новый Массив; Повторы = Новый Соответствие; @@ -118,7 +109,7 @@ Если ДопускатьПовторыКода Тогда Результат.Добавить(Элемент.Наименование); Иначе - Если Повторы.Получить(Элемент.Код)=Неопределено Тогда + Если Повторы.Получить(Элемент.Код) = Неопределено Тогда Результат.Добавить(Элемент.Наименование); КонецЕсли; Повторы.Вставить(Элемент.Код, Истина); @@ -172,7 +163,7 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -Функция СтрокаОбъектаАдресации(Код, Наименование, Тип=0, Порядок=0, КодФИАС=0) +Функция СтрокаОбъектаАдресации(Код, Наименование, Тип = 0, Порядок = 0, КодФИАС = 0) Возврат Новый Структура("Код, Наименование, Тип, Порядок, КодФИАС, Сокращение, Ключ", Код, Наименование, Тип, Порядок, КодФИАС, НРег(Наименование), ВРег(Наименование)); КонецФункции diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебный/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебный/Module.bsl index 7318225e6..cfba6dcda 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебный/Module.bsl @@ -8,13 +8,13 @@ // Устарело. Необходимо использовать УправлениеКонтактнойИнформацией.ПредыдущийФорматКонтактнойИнформацииXML // -Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СтарыйСоставПолей=Ложь) Экспорт +Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СтарыйСоставПолей = Ложь) Экспорт Возврат УправлениеКонтактнойИнформацией.ПредыдущийФорматКонтактнойИнформацииXML(Данные, СтарыйСоставПолей); КонецФункции // Устарело. Необходимо использовать УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML // -Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации=Неопределено) Экспорт +Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации = Неопределено) Экспорт Возврат УправлениеКонтактнойИнформацией.ПредыдущаяСтруктураКонтактнойИнформацииXML(Данные, ВидКонтактнойИнформации); КонецФункции @@ -31,16 +31,14 @@ // состоит из структур с предупреждением о неактуальности. // Ложь - обычный список значений. // -Функция РезультатыАвтоПодбораНаселенногоПункта(Текст, СкрыватьНеактуальныеАдреса=Ложь, ПредупреждатьОНеактуальных=Истина) Экспорт +Функция РезультатыАвтоПодбораНаселенногоПункта(Текст, СкрыватьНеактуальныеАдреса = Ложь, ПредупреждатьОНеактуальных = Истина) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат РезультатыАвтоПодбораНаселенногоПунктаКЛАДР(Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных, 50); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); КонецФункции @@ -55,16 +53,14 @@ // состоит из структур с предупреждением о неактуальности. // Ложь - обычный список значений. // -Функция РезультатыАвтоПодбораУлицы(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса=Ложь, ПредупреждатьОНеактуальных=Истина) Экспорт +Функция РезультатыАвтоПодбораУлицы(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса = Ложь, ПредупреждатьОНеактуальных = Истина) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат РезультатыАвтоПодбораУлицыКЛАДР(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных, 50); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); КонецФункции @@ -76,16 +72,14 @@ // СкрыватьНеактуальныеАдреса - флаг того, что неактуальные адреса не должны попадать в автоподбор // ВыбиратьСтрок - ограничение на количество результатов // -Функция НаселенныеПунктыПоПредставлению(Текст, СкрыватьНеактуальныеАдреса=Ложь, ВыбиратьСтрок=50) Экспорт +Функция НаселенныеПунктыПоПредставлению(Текст, СкрыватьНеактуальныеАдреса = Ложь, ВыбиратьСтрок = 50) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат НаселенныеПунктыПоПредставлениюКЛАДР(Текст, СкрыватьНеактуальныеАдреса, ВыбиратьСтрок); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); КонецФункции @@ -98,35 +92,39 @@ // СкрыватьНеактуальныеАдреса - флаг того, что неактуальные адреса не должны попадать в автоподбор // ВыбиратьСтрок - ограничение на количество результатов // -Функция УлицыПоПредставлению(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса=Ложь, ВыбиратьСтрок=50) Экспорт +Функция УлицыПоПредставлению(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса = Ложь, ВыбиратьСтрок = 50) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат УлицыПоПредставлениюКЛАДР(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, ВыбиратьСтрок); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Ложь, Новый СписокЗначений); КонецФункции // Возвращает варианты типов домов (по признаку владения) Функция ВариантыДанныхДом() Экспорт + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", КонтактнаяИнформацияКлиентСерверПовтИсп.НаименованияОбъектовАдресацииПоТипу(1), Ложь); + КонецФункции // Возвращает варианты типов домов (по признаку строения) Функция ВариантыДанныхСтроение() Экспорт + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", КонтактнаяИнформацияКлиентСерверПовтИсп.НаименованияОбъектовАдресацииПоТипу(2), Ложь); + КонецФункции // Возвращает варианты типов помещений Функция ВариантыДанныхПомещение() Экспорт + Возврат Новый Структура("ВариантыТипа, МожноПодбиратьЗначения", КонтактнаяИнформацияКлиентСерверПовтИсп.НаименованияОбъектовАдресацииПоТипу(3, Ложь), Ложь); + КонецФункции // Возвращает флаг вхождения объекта в состав родителя @@ -138,13 +136,11 @@ Функция ЯвляетсяПотомком(КодОбъекта, КодРодителя) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат ЯвляетсяПотомкомКЛАДР(КодОбъекта, КодРодителя); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -160,13 +156,11 @@ Функция КодРегиона(Знач ПолноеНаименование) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат КодРегионаКЛАДР(ПолноеНаименование); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -182,13 +176,11 @@ Функция РегионКода(Знач Код) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант = Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат РегионКодаКЛАДР(Код); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -201,13 +193,11 @@ Функция ВсеРегионы() Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат ВсеРегионыКЛАДР(); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -220,16 +210,14 @@ // Код - необязательный код классификатора объекта. Если указан, то структура // заполняется данными для этого объекта // -Функция СписокРеквизитовНаселенныйПункт(Код=Неопределено) Экспорт +Функция СписокРеквизитовНаселенныйПункт(Код = Неопределено) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат СписокРеквизитовНаселенныйПунктКЛАДР(Код); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура; КонецФункции @@ -241,16 +229,14 @@ // Код - необязательный код классификатора объекта. Если указан, то структура // заполняется данными для этого объекта // -Функция СписокРеквизитовУлица(Код=Неопределено) Экспорт +Функция СписокРеквизитовУлица(Код = Неопределено) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый Структура; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат СписокРеквизитовУлицаКЛАДР(Код); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый Структура; КонецФункции @@ -260,16 +246,14 @@ // ЧастиАдреса - структура, зависимая от классификатора // СкрыватьНеактуальные - флаг скрытия актуальных // -Функция КодНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса, СкрыватьНеактуальные=Ложь) Экспорт +Функция КодНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса, СкрыватьНеактуальные = Ложь) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат КодОбъектаПоЧастямАдресаКЛАДР(ЧастиАдреса, СкрыватьНеактуальные); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -286,13 +270,11 @@ Функция СписокАвтоПодбораЭлементаАдреса(Текст, КодЧастиАдреса, ЧастиАдреса, ПредупреждатьОНеактуальных) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый СписокЗначений; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат СписокАвтоПодбораЭлементаАдресаКЛАДР(Текст, КодЧастиАдреса, ЧастиАдреса, ПредупреждатьОНеактуальных, 50); КонецЕсли; + // Нет подсистемы классификатора Возврат Новый СписокЗначений; КонецФункции @@ -304,17 +286,44 @@ // ЧастиАдреса - значения для других частей адреса, зависит от классификатора // ВыбиратьСтрок - ограничитель на возвращаемое число строк // -Функция СписокВариантовЭлементаАдресаПоТексту(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок=50) Экспорт +Функция СписокВариантовЭлементаАдресаПоТексту(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок = 50) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Новый СписокЗначений; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат СписокВариантовЭлементаАдресаПоТекстуКЛАДР(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок); КонецЕсли; - Возврат Новый СписокЗначений; + // Нет подсистемы классификатора + Возврат Новый СписокЗначений; +КонецФункции + +// Возвращает коды классификатора по почтовому индексу +// +// Параметры: +// Индекс - Строка - почтовый индекс, для которого необходимо получать данные. +// +// ДополнительныеПараметрыПоиска - Структура - Описывает настройки поиска. Состоит из необязательных полей: +// СкрыватьНеактуальные - Булево - Флаг исключения из выборки неактуальных адресов. По умолчанию Ложь +// ВыбиратьСтрок - Число - Ограничение на количество возвращаемых строк, 0 - без ограничения. По умолчанию 0 +// +// Возвращаемое значение - структура с полями: +// СлишкомМногоДанных - Булево - Истина, если в базе найдено больше записей, чем ограничено параметром ВыбиратьСтрок +// ОбщаяЧастьПредставления - Строка - Общая часть представлений адреса. +// Данные - ТаблицаЗначений - Содержит данные для выбора. Колонки: +// Неактуален - Булево - Флаг неактуальности строки данных +// Индекс - Строка - Почтовый индекс, соответствующей адресу +// Код - Число - Код классификатора для поиска вариантов по индексу +// Представление - Строка - Представление варианта +// +Функция АдресаКлассификатораПоИндексу(Знач Индекс, Знач ДополнительныеПараметрыПоиска = Неопределено) Экспорт + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант = "КЛАДР" Тогда + Возврат АдресаПоИндексуКЛАДР(Индекс, ДополнительныеПараметрыПоиска); + КонецЕсли; + + // Нет подсистемы классификатора + Возврат Новый Структура("Данные, ОбщаяЧастьПредставления, СлишкомМногоДанных", Новый ТаблицаЗначений, "", Ложь); КонецФункции //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -330,7 +339,7 @@ Запись = Новый ЗаписьXML; Запись.УстановитьСтроку(Новый ПараметрыЗаписиXML(, , Ложь, Ложь, "")); - Если ОбъектXDTOИнформации<>Неопределено Тогда + Если ОбъектXDTOИнформации <> Неопределено Тогда ФабрикаXDTO.ЗаписатьXML(Запись, ОбъектXDTOИнформации); КонецЕсли; @@ -348,7 +357,7 @@ // - ТекстОшибки - описание ошибок процесса чтения. Возвращаемый функцией результат будет // корректного типа, но не заполнен. // -Функция ДесериализацияКонтактнойИнформации(Знач Текст, Знач ОжидаемыйВид=Неопределено, РезультатыЧтения=Неопределено) Экспорт +Функция ДесериализацияКонтактнойИнформации(Знач Текст, Знач ОжидаемыйВид = Неопределено, РезультатыЧтения = Неопределено) Экспорт ОжидаемыйТип = УправлениеКонтактнойИнформацией.ТипВидаКонтактнойИнформации(ОжидаемыйВид); @@ -373,41 +382,41 @@ УровеньЖурналаРегистрации.Ошибка, , Текст, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); - Если ТипЗнч(ОжидаемыйВид)=Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда - ТекстОшибки = СтрЗаменить(НСтр("ru='Некорректный формат XML контактной информации для ""%1"", значения полей были очищены.'"), + Если ТипЗнч(ОжидаемыйВид) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ТекстОшибки = СтрЗаменить(НСтр("ru = 'Некорректный формат XML контактной информации для ""%1"", значения полей были очищены.'"), "%1", Строка(ОжидаемыйВид)); Иначе - ТекстОшибки = НСтр("ru='Некорректный формат XML контактной информации, значения полей были очищены.'"); + ТекстОшибки = НСтр("ru = 'Некорректный формат XML контактной информации, значения полей были очищены.'"); КонецЕсли; КонецПопытки; - Если ТекстОшибки=Неопределено Тогда + Если ТекстОшибки = Неопределено Тогда // Контролируем соответствие типов - НайденТип = ?(Результат.Состав=Неопределено, Неопределено, Результат.Состав.Тип()); - Если ОжидаемыйТип=ПеречислениеАдрес И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается адрес'"); - ИначеЕсли ОжидаемыйТип=ПеречислениеАдресЭлектроннойПочты И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается адрес электронной почты'"); - ИначеЕсли ОжидаемыйТип=ПеречислениеВебСтраница И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается веб-страница'"); - ИначеЕсли ОжидаемыйТип=ПеречислениеТелефон И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается телефон'"); - ИначеЕсли ОжидаемыйТип=ПеречислениеФакс И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается телефон'"); - ИначеЕсли ОжидаемыйТип=ПеречислениеДругое И НайденТип<>ФабрикаXDTO.Тип(ПространствоИмен, "Прочее") Тогда - ТекстОшибки = НСтр("ru='Ошибка десериализации контактной информации, ожидается ""другое""'"); + НайденТип = ?(Результат.Состав = Неопределено, Неопределено, Результат.Состав.Тип()); + Если ОжидаемыйТип = ПеречислениеАдрес И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается адрес'"); + ИначеЕсли ОжидаемыйТип = ПеречислениеАдресЭлектроннойПочты И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается адрес электронной почты'"); + ИначеЕсли ОжидаемыйТип = ПеречислениеВебСтраница И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается веб-страница'"); + ИначеЕсли ОжидаемыйТип = ПеречислениеТелефон И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается телефон'"); + ИначеЕсли ОжидаемыйТип = ПеречислениеФакс И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается телефон'"); + ИначеЕсли ОжидаемыйТип = ПеречислениеДругое И НайденТип <> ФабрикаXDTO.Тип(ПространствоИмен, "Прочее") Тогда + ТекстОшибки = НСтр("ru = 'Ошибка десериализации контактной информации, ожидается ""другое""'"); КонецЕсли; КонецЕсли; - Если ТекстОшибки=Неопределено Тогда + Если ТекстОшибки = Неопределено Тогда // Успешно прочитано Возврат Результат; КонецЕсли; // Проверим ошибку и вернем расширенную информацию - Если РезультатыЧтения=Неопределено Тогда + Если РезультатыЧтения = Неопределено Тогда ВызватьИсключение ТекстОшибки; - ИначеЕсли ТипЗнч(РезультатыЧтения)<>Тип("Структура") Тогда + ИначеЕсли ТипЗнч(РезультатыЧтения) <> Тип("Структура") Тогда РезультатыЧтения = Новый Структура; КонецЕсли; РезультатыЧтения.Вставить("ТекстОшибки", ТекстОшибки); @@ -416,9 +425,9 @@ Текст = ""; КонецЕсли; - Если ТипЗнч(Текст)=Тип("СписокЗначений") Тогда + Если ТипЗнч(Текст) = Тип("СписокЗначений") Тогда Представление = ""; - ЭтоНовый = Текст.Количество()=0; + ЭтоНовый = Текст.Количество() = 0; Иначе Представление = Строка(Текст); ЭтоНовый = ПустаяСтрока(Текст); @@ -427,42 +436,42 @@ Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); // Разбор - Если ОжидаемыйТип=ПеречислениеАдрес Тогда + Если ОжидаемыйТип = ПеречислениеАдрес Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Адрес")); Иначе Результат = ДесериализацияАдреса(Текст, Представление, ОжидаемыйТип); КонецЕсли; - ИначеЕсли ОжидаемыйТип=ПеречислениеТелефон Тогда + ИначеЕсли ОжидаемыйТип = ПеречислениеТелефон Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона")); Иначе Результат = ДесериализацияТелефона(Текст, Представление, ОжидаемыйТип) КонецЕсли; - ИначеЕсли ОжидаемыйТип=ПеречислениеФакс Тогда + ИначеЕсли ОжидаемыйТип = ПеречислениеФакс Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса")); Иначе Результат = ДесериализацияФакса(Текст, Представление, ОжидаемыйТип) КонецЕсли; - ИначеЕсли ОжидаемыйТип=ПеречислениеАдресЭлектроннойПочты Тогда + ИначеЕсли ОжидаемыйТип = ПеречислениеАдресЭлектроннойПочты Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта")); Иначе Результат = ДесериализацияПрочейКонтактнойИнформации(Текст, Представление, ОжидаемыйТип) КонецЕсли; - ИначеЕсли ОжидаемыйТип=ПеречислениеВебСтраница Тогда + ИначеЕсли ОжидаемыйТип = ПеречислениеВебСтраница Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт")); Иначе Результат = ДесериализацияПрочейКонтактнойИнформации(Текст, Представление, ОжидаемыйТип) КонецЕсли; - ИначеЕсли ОжидаемыйТип=ПеречислениеДругое Тогда + ИначеЕсли ОжидаемыйТип = ПеречислениеДругое Тогда Если ЭтоНовый Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Прочее")); Иначе @@ -470,7 +479,7 @@ КонецЕсли; Иначе - ВызватьИсключение НСтр("ru='Ошибка десериализации контактной информации, не указан ожидаемый тип'"); + ВызватьИсключение НСтр("ru = 'Ошибка десериализации контактной информации, не указан ожидаемый тип'"); КонецЕсли; Возврат Результат; @@ -487,22 +496,22 @@ ОжидаемыйТип = УправлениеКонтактнойИнформацией.ТипВидаКонтактнойИнформации(ОжидаемыйВид); - Если ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + Если ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда Возврат ДесериализацияАдреса("", Текст, ОжидаемыйТип); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда Возврат ДесериализацияПрочейКонтактнойИнформации("", Текст, ОжидаемыйТип); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда Возврат ДесериализацияПрочейКонтактнойИнформации("", Текст, ОжидаемыйТип); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда Возврат ДесериализацияТелефона("", Текст, ОжидаемыйТип); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.Факс Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда Возврат ДесериализацияФакса("", Текст, ОжидаемыйТип); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.Другое Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда Возврат ДесериализацияПрочейКонтактнойИнформации("", Текст, ОжидаемыйТип); КонецЕсли; @@ -532,11 +541,11 @@ // Возвращаемое значение // ОбъектXDTO контактной информации. // -Функция ДесериализацияАдреса(Знач ЗначенияПолей, Знач Представление="", Знач ОжидаемыйТип=Неопределено) Экспорт +Функция ДесериализацияАдреса(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйТип = Неопределено) Экспорт ТипЗначения = ТипЗнч(ЗначенияПолей); - РазбиратьПоПолям = ТипЗначения=Тип("СписокЗначений") Или ТипЗначения=Тип("Структура") - Или ( ТипЗначения=Тип("Строка") И Не ПустаяСтрока(ЗначенияПолей) ); + РазбиратьПоПолям = ТипЗначения = Тип("СписокЗначений") Или ТипЗначения = Тип("Структура") + Или ( ТипЗначения = Тип("Строка") И Не ПустаяСтрока(ЗначенияПолей) ); Если РазбиратьПоПолям Тогда // Разбираем из значений полей @@ -546,12 +555,12 @@ // Разбираем из представления по классификаторам Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат ДесериализацияАдресаПоПредставлениюКЛАДР(Представление); КонецЕсли; + // Нет подсистемы классификатора + // Пустой объект с представлением ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); @@ -569,7 +578,7 @@ // если ЗначенияПолей пусто // ОжидаемыйТип - необязательный тип для контроля // -Функция ДесериализацияТелефона(ЗначенияПолей, Представление="", ОжидаемыйТип=Неопределено) Экспорт +Функция ДесериализацияТелефона(ЗначенияПолей, Представление = "", ОжидаемыйТип = Неопределено) Экспорт Возврат ДесериализацияТелефонаФакса(ЗначенияПолей, Представление, ОжидаемыйТип); КонецФункции @@ -581,7 +590,7 @@ // если ЗначенияПолей пусто // ОжидаемыйТип - необязательный тип для контроля // -Функция ДесериализацияФакса(ЗначенияПолей, Представление="", ОжидаемыйТип=Неопределено) Экспорт +Функция ДесериализацияФакса(ЗначенияПолей, Представление = "", ОжидаемыйТип = Неопределено) Экспорт Возврат ДесериализацияТелефонаФакса(ЗначенияПолей, Представление, ОжидаемыйТип); КонецФункции @@ -593,7 +602,7 @@ // если ЗначенияПолей пусто // ОжидаемыйТип - необязательный тип для контроля // -Функция ДесериализацияПрочейКонтактнойИнформации(ЗначенияПолей, Представление="", ОжидаемыйТип=Неопределено) Экспорт +Функция ДесериализацияПрочейКонтактнойИнформации(ЗначенияПолей, Представление = "", ОжидаемыйТип = Неопределено) Экспорт Если КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(ЗначенияПолей) Тогда // Общий формат контактной информации @@ -604,17 +613,17 @@ Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Результат.Представление = Представление; - Если ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + Если ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта")); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт")); - ИначеЕсли ОжидаемыйТип=Перечисления.ТипыКонтактнойИнформации.Другое Тогда + ИначеЕсли ОжидаемыйТип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда Результат.Состав = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "Прочее")); - ИначеЕсли ОжидаемыйТип<>Неопределено Тогда - ВызватьИсключение НСтр("ru='Ошибка десериализации контактной информации, ожидается другой тип'"); + ИначеЕсли ОжидаемыйТип <> Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Ошибка десериализации контактной информации, ожидается другой тип'"); КонецЕсли; @@ -630,15 +639,15 @@ // XDTOИнформация - ОбъектXDTO или XML строка контактной информации // НовоеЗначение - необязательное устанавливаемое новое представление в XDTOИнформация // -Функция ПредставлениеКонтактнойИнформации(XDTOИнформация, НовоеЗначение=Неопределено) Экспорт - НадоСериализовать = ТипЗнч(XDTOИнформация)=Тип("Строка"); +Функция ПредставлениеКонтактнойИнформации(XDTOИнформация, НовоеЗначение = Неопределено) Экспорт + НадоСериализовать = ТипЗнч(XDTOИнформация) = Тип("Строка"); Если НадоСериализовать И Не КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOИнформация) Тогда // Старая версия значений полей, возвращаем саму строку Возврат XDTOИнформация; КонецЕсли; ОбъектXDTO = ?(НадоСериализовать, ДесериализацияКонтактнойИнформации(XDTOИнформация), XDTOИнформация); - Если НовоеЗначение<>Неопределено Тогда + Если НовоеЗначение <> Неопределено Тогда ОбъектXDTO.Представление = НовоеЗначение; Если НадоСериализовать Тогда XDTOИнформация = СериализацияКонтактнойИнформации(ОбъектXDTO); @@ -654,15 +663,15 @@ // XDTOИнформация - ОбъектXDTO или XML строка контактной информации. Объект может измениться // НовоеЗначение - необязательный устанавливаемый новый комментарий XDTOИнформация // -Функция КомментарийКонтактнойИнформации(XDTOИнформация, НовоеЗначение=Неопределено) Экспорт - НадоСериализовать = ТипЗнч(XDTOИнформация)=Тип("Строка"); +Функция КомментарийКонтактнойИнформации(XDTOИнформация, НовоеЗначение = Неопределено) Экспорт + НадоСериализовать = ТипЗнч(XDTOИнформация) = Тип("Строка"); Если НадоСериализовать И Не КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOИнформация) Тогда // Старая версия значений полей, комментарий не поддерживается Возврат ""; КонецЕсли; ОбъектXDTO = ?(НадоСериализовать, ДесериализацияКонтактнойИнформации(XDTOИнформация), XDTOИнформация); - Если НовоеЗначение<>Неопределено Тогда + Если НовоеЗначение <> Неопределено Тогда ОбъектXDTO.Комментарий = НовоеЗначение; Если НадоСериализовать Тогда XDTOИнформация = СериализацияКонтактнойИнформации(ОбъектXDTO); @@ -679,8 +688,8 @@ // XDTOИнформация - ОбъектXDTO или XML строка контактной информации. Объект может измениться // НовоеЗначение - булево - необязательное устанавливаемое новое значение // -Функция АдресВведенВСвободнойФорме(XDTOИнформация, НовоеЗначение=Неопределено) Экспорт - НадоСериализовать = ТипЗнч(XDTOИнформация)=Тип("Строка"); +Функция АдресВведенВСвободнойФорме(XDTOИнформация, НовоеЗначение = Неопределено) Экспорт + НадоСериализовать = ТипЗнч(XDTOИнформация) = Тип("Строка"); Если НадоСериализовать И Не КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOИнформация) Тогда // Старая версия значений полей, не поддерживается Возврат Ложь; @@ -693,7 +702,7 @@ КонецЕсли; АдресРФ = ОбъектXDTO.Состав.Состав; - Если ТипЗнч(НовоеЗначение)<>Тип("Булево") Тогда + Если ТипЗнч(НовоеЗначение) <> Тип("Булево") Тогда // Читаем Возврат Не ПустаяСтрока(АдресРФ.Адрес_по_документу); КонецЕсли; @@ -719,27 +728,27 @@ // Функция СформироватьПредставлениеКонтактнойИнформации(Информация, ВидИнформации) Экспорт - Если ТипЗнч(Информация)=Тип("ОбъектXDTO") Тогда - Если Информация.Состав=Неопределено Тогда + Если ТипЗнч(Информация) = Тип("ОбъектXDTO") Тогда + Если Информация.Состав = Неопределено Тогда // Что было, то и будет Возврат Информация.Представление; КонецЕсли; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); ТипИнформации = Информация.Состав.Тип(); - Если ТипИнформации=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если ТипИнформации = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда Возврат ПредставлениеАдреса(Информация.Состав, ВидИнформации); - ИначеЕсли ТипИнформации=ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + ИначеЕсли ТипИнформации = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда Возврат ПредставлениеТелефона(Информация.Состав, ВидИнформации); - ИначеЕсли ТипИнформации=ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда + ИначеЕсли ТипИнформации = ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда Возврат ПредставлениеТелефона(Информация.Состав, ВидИнформации); КонецЕсли; // Заглушка на другие типы - Если ТипЗнч(ТипИнформации)=Тип("ОбъектXDTO") И ТипИнформации.Свойства.Получить("Значение")<>Неопределено Тогда + Если ТипЗнч(ТипИнформации) = Тип("ОбъектXDTO") И ТипИнформации.Свойства.Получить("Значение") <> Неопределено Тогда Возврат Строка(Информация.Состав.Значение); КонецЕсли; @@ -747,7 +756,7 @@ КонецЕсли; // Старый формат или новый десериализованный - Если ВидИнформации.Тип=Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + Если ВидИнформации.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда НоваяИнфо = ДесериализацияАдреса(Информация,,Перечисления.ТипыКонтактнойИнформации.Адрес); Возврат СформироватьПредставлениеКонтактнойИнформации(НоваяИнфо, ВидИнформации); КонецЕсли; @@ -761,7 +770,7 @@ // XDTOАдрес - объект XDTO КИ или адреса // Функция ЭтоРоссийскийАдрес(XDTOАдрес) Экспорт - Возврат РоссийскийАдрес(XDTOАдрес)<>Неопределено; + Возврат РоссийскийАдрес(XDTOАдрес) <> Неопределено; КонецФункции // Возвращает извлеченный XDTO российского адреса или Неопределено для адреса иностранного @@ -773,20 +782,20 @@ Результат = Неопределено; ТипXDTO = Тип("ОбъектXDTO"); - Если ТипЗнч(ОбъектИнформации)=ТипXDTO Тогда + Если ТипЗнч(ОбъектИнформации) = ТипXDTO Тогда ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - Если ОбъектИнформации.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") Тогда + Если ОбъектИнформации.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") Тогда Адрес = ОбъектИнформации.Состав; Иначе Адрес = ОбъектИнформации; КонецЕсли; - Если ТипЗнч(Адрес)=ТипXDTO И Адрес.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда Адрес = Адрес.Состав; КонецЕсли; - Если ТипЗнч(Адрес)=ТипXDTO И Адрес.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда + Если ТипЗнч(Адрес) = ТипXDTO И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда Результат = Адрес; КонецЕсли; КонецЕсли; @@ -800,17 +809,17 @@ // XDTOАдрес - объект XDTO адреса или адреса РФ // НовоеЗначение - устанавливаемое значение // -Функция ПочтовыйИндексАдреса(XDTOАдрес, НовоеЗначение=Неопределено) Экспорт +Функция ПочтовыйИндексАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт - Если НовоеЗначение=Неопределено Тогда + Если НовоеЗначение = Неопределено Тогда // Чтение АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ=Неопределено Тогда + Если АдресРФ = Неопределено Тогда Возврат Неопределено; КонецЕсли; Результат = АдресРФ.Получить( КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса() ); - Если Результат<>Неопределено Тогда + Если Результат <> Неопределено Тогда Результат = Результат.Значение; КонецЕсли; @@ -821,7 +830,7 @@ КодИндекса = КонтактнаяИнформацияКлиентСерверПовтИсп.КодСериализацииПочтовогоИндекса(); ЗаписьИндекса = XDTOАдрес.Получить( КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса() ); - Если ЗаписьИндекса=Неопределено Тогда + Если ЗаписьИндекса = Неопределено Тогда ЗаписьИндекса = XDTOАдрес.ДопАдрЭл.Добавить( ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип) ); ЗаписьИндекса.ТипАдрЭл = КодИндекса; КонецЕсли; @@ -839,25 +848,23 @@ ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - Если XDTOАдрес.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если XDTOАдрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда XDTOАдресРФ = XDTOАдрес.Состав; Иначе XDTOАдресРФ = XDTOАдрес; КонецЕсли; - Если XDTOАдресРФ=Неопределено Или XDTOАдресРФ.Тип()<>ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда - Возврат Неопределено; // Иностранный или пустой адрес + Если XDTOАдресРФ = Неопределено Или XDTOАдресРФ.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда + Возврат Неопределено; // Иностранный или пустой адрес КонецЕсли; Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат Неопределено; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда Возврат ОпределитьПочтовыйИндексАдресаКЛАДР(XDTOАдресРФ); КонецЕсли; + // Нет подсистемы классификатора Возврат Неопределено; КонецФункции @@ -867,22 +874,22 @@ // XDTOАдрес - объект XDTO адреса или адреса РФ // НовоеЗначение - устанавливаемое значение // -Функция РайонАдреса(XDTOАдрес, НовоеЗначение=Неопределено) Экспорт +Функция РайонАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт - Если НовоеЗначение=Неопределено Тогда + Если НовоеЗначение = Неопределено Тогда // Чтение Результат = Неопределено; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); XDTOТип = XDTOАдрес.Тип(); - Если XDTOТип=ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда АдресРФ = XDTOАдрес; Иначе АдресРФ = XDTOАдрес.Состав; КонецЕсли; - Если ТипЗнч(АдресРФ)=Тип("ОбъектXDTO") Тогда + Если ТипЗнч(АдресРФ) = Тип("ОбъектXDTO") Тогда Возврат ЗначениеСвойстваПоXPath(АдресРФ, КонтактнаяИнформацияКлиентСерверПовтИсп.XPathРайона() ); КонецЕсли; @@ -908,18 +915,18 @@ // для установки новых значения. Структура таблиц аналогична структуре результата функции. // Можно смешивать здания и помещения в одной таблице. // -Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение=Неопределено) Экспорт +Функция ЗданияИПомещенияАдреса(XDTOАдрес, НовоеЗначение = Неопределено) Экспорт Результат = Новый Структура("Здания, Помещения", ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид"), ТаблицаЗначений("Тип, Значение, Сокращение, ПутьXPath, Вид", "Тип, Вид")); АдресРФ = РоссийскийАдрес(XDTOАдрес); - Если АдресРФ=Неопределено Тогда + Если АдресРФ = Неопределено Тогда Возврат Результат; КонецЕсли; - Если НовоеЗначение<>Неопределено Тогда + Если НовоеЗначение <> Неопределено Тогда // Запись Если НовоеЗначение.Свойство("Здания") Тогда Для Каждого Строка Из НовоеЗначение.Здания Цикл @@ -936,19 +943,19 @@ // Чтение Для Каждого ДопЭлемент Из АдресРФ.ДопАдрЭл Цикл - Если ДопЭлемент.Номер<>Неопределено Тогда + Если ДопЭлемент.Номер <> Неопределено Тогда КодОбъекта = ДопЭлемент.Номер.Тип; ТипОбъекта = КонтактнаяИнформацияКлиентСерверПовтИсп.ТипОбъектаПоКодуСериализации(КодОбъекта); - Если ТипОбъекта<>Неопределено Тогда + Если ТипОбъекта <> Неопределено Тогда Вид = ТипОбъекта.Тип; - Если Вид=1 Или Вид=2 Тогда + Если Вид = 1 Или Вид = 2 Тогда НоваяСтрока = Результат.Здания.Добавить(); - ИначеЕсли Вид=3 Тогда + ИначеЕсли Вид = 3 Тогда НоваяСтрока = Результат.Помещения.Добавить(); Иначе НоваяСтрока = Неопределено; КонецЕсли; - Если НоваяСтрока<>Неопределено Тогда + Если НоваяСтрока <> Неопределено Тогда НоваяСтрока.Тип = ТипОбъекта.Наименование; НоваяСтрока.Значение = ДопЭлемент.Номер.Значение; НоваяСтрока.Сокращение = ТипОбъекта.Сокращение; @@ -974,14 +981,11 @@ Процедура УстановитьНаселенныйПунктАдресаПоКоду(XDTOАдрес, КодКлассификатора) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда УстановитьНаселенныйПунктАдресаПоКодуКЛАДР(XDTOАдрес, КодКлассификатора); КонецЕсли; -КонецПроцедуры +КонецПроцедуры // Устанавливает значения полей улицы // @@ -992,13 +996,11 @@ Процедура УстановитьУлицуАдресаПоКоду(XDTOАдрес, КодКлассификатора) Экспорт Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + Если Вариант = "КЛАДР" Тогда УстановитьУлицуАдресаПоКодуКЛАДР(XDTOАдрес, КодКлассификатора); КонецЕсли; + // Нет подсистемы классификатора КонецПроцедуры // Возвращает представление младший-старший для населенного пункта @@ -1009,15 +1011,15 @@ Функция ПредставлениеНаселенногоПункта(ОбъектАдреса) Экспорт АдресРФ = РоссийскийАдрес(ОбъектАдреса); - Если АдресРФ=Неопределено Тогда + Если АдресРФ = Неопределено Тогда Возврат ""; КонецЕсли; - Если АдресРФ.СвРайМО=Неопределено Тогда + Если АдресРФ.СвРайМО = Неопределено Тогда Район = ""; - ИначеЕсли АдресРФ.СвРайМО.Район<>Неопределено Тогда + ИначеЕсли АдресРФ.СвРайМО.Район <> Неопределено Тогда Район = АдресРФ.СвРайМО.Район; - ИначеЕсли АдресРФ.СвРайМО.СвМО<>Неопределено Тогда + ИначеЕсли АдресРФ.СвРайМО.СвМО <> Неопределено Тогда Район = КонтактнаяИнформацияКлиентСервер.ПолноеНаименование( АдресРФ.СвРайМО.СвМО.МунОбр2, "", АдресРФ.СвРайМО.СвМО.МунОбр1, ""); @@ -1042,7 +1044,7 @@ Функция ПредставлениеУлицы(ОбъектАдреса) Экспорт АдресРФ = РоссийскийАдрес(ОбъектАдреса); - Если АдресРФ=Неопределено Тогда + Если АдресРФ = Неопределено Тогда Возврат ""; КонецЕсли; @@ -1135,14 +1137,14 @@ // ИмяПоля - внутренний идентификатор элемента адреса // Сообщение - подробный текст ошибки для поля // -Функция ОшибкиЗаполненияАдреса(XDTOАдрес, ВидИнформации, РезультатГруппами=Ложь) Экспорт +Функция ОшибкиЗаполненияАдреса(XDTOАдрес, ВидИнформации, РезультатГруппами = Ложь) Экспорт Если ТипЗнч(XDTOАдрес) = Тип("ОбъектXDTO") Тогда АдресРФ = XDTOАдрес.Состав; Иначе XTDOКонтактная = ДесериализацияАдреса(XDTOАдрес); Адрес = XTDOКонтактная.Состав; - АдресРФ = ?(Адрес=Неопределено, Неопределено, Адрес.Состав); + АдресРФ = ?(Адрес = Неопределено, Неопределено, Адрес.Состав); КонецЕсли; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); @@ -1164,10 +1166,11 @@ ОшибкиКлассификатора = Новый СписокЗначений; Если ПроверятьКлассификатор Тогда Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант = Неопределено Тогда - // Нет подсистемы классификатора - ИначеЕсли Вариант = Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + + Если Вариант = "КЛАДР" Тогда ЗаполнитьОшибкиАдресаКЛАДР(АдресРФ, ОшибкиКлассификатора); + Иначе + // Нет подсистемы классификатора КонецЕсли; КонецЕсли; @@ -1177,7 +1180,7 @@ КоличествоОшибок = ОшибкиКлассификатора.Количество(); Если КоличествоОшибок = 1 И ОшибкиКлассификатора[0].Значение <> Неопределено - И ОшибкиКлассификатора[0].Значение.ПутьXPath=Неопределено + И ОшибкиКлассификатора[0].Значение.ПутьXPath = Неопределено Тогда ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, ОшибкиКлассификатора[0].Представление)); @@ -1185,14 +1188,14 @@ ИначеЕсли КоличествоОшибок > 0 Тогда // Подробное описание ошибок ВсеОшибки.Добавить(ГруппаОшибокАдреса(НаименованиеГруппыОшибки, - НСтр("ru='Части адреса не соответствуют адресному классификатору:'"))); + НСтр("ru = 'Части адреса не соответствуют адресному классификатору:'"))); ГруппаОшибокКлассификатора = ВсеОшибки[ВсеОшибки.ВГраница()]; СписокСущностей = ""; Для Каждого Элемент Из ОшибкиКлассификатора Цикл ЭлементОшибки = Элемент.Значение; - Если ЭлементОшибки=Неопределено Тогда + Если ЭлементОшибки = Неопределено Тогда // Абстрактная ошибка ДобавитьОшибкуЗаполненияАдреса(ГруппаОшибокКлассификатора, "", Элемент.Представление); @@ -1244,7 +1247,7 @@ Функция ОбщиеГруппыОшибокЗаполненияАдреса(ДанныеАдреса, ВидИнформации) Экспорт Результат = Новый Массив; - Если ТипЗнч(ДанныеАдреса)=Тип("ОбъектXDTO") Тогда + Если ТипЗнч(ДанныеАдреса) = Тип("ОбъектXDTO") Тогда АдресРФ = ДанныеАдреса; Иначе XTDOКонтактная = ДесериализацияАдреса(ДанныеАдреса); @@ -1256,43 +1259,43 @@ // 1) совпадение представления и набора данных Представление = ПредставлениеАдреса(АдресРФ, ВидИнформации); - Если XTDOКонтактная.Представление<>Представление Тогда + Если XTDOКонтактная.Представление <> Представление Тогда Результат.Добавить(ГруппаОшибокАдреса("ПредставлениеНеСоответствуетНаборуПолей", - НСтр("ru='Адрес не соответствует значениям в наборе полей.'"))); + НСтр("ru = 'Адрес не соответствует значениям в наборе полей.'"))); ДобавитьОшибкуЗаполненияАдреса(Результат[0], "", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Представление адреса для вида контактной информации ""%1"" отличается от данных в адресе.'"), + НСтр("ru = 'Представление адреса для вида контактной информации ""%1"" отличается от данных в адресе.'"), Строка(ВидИнформации))); КонецЕсли; КонецЕсли; НеЗаполненыОбязательныеПоля = ГруппаОшибокАдреса("НеЗаполненыОбязательныеПоля", - НСтр("ru='Не заполнены обязательные поля:'")); + НСтр("ru = 'Не заполнены обязательные поля:'")); Результат.Добавить(НеЗаполненыОбязательныеПоля); НеУказаныСокращенияПолей = ГруппаОшибокАдреса("НеУказаныСокращенияПолей", - НСтр("ru='Не указано сокращение для полей:'")); + НСтр("ru = 'Не указано сокращение для полей:'")); Результат.Добавить(НеУказаныСокращенияПолей); НедопустимыеСимволыПолей = ГруппаОшибокАдреса("НедопустимыеСимволыПолей", - НСтр("ru='Найдены недопустимые символы в полях:'")); + НСтр("ru = 'Найдены недопустимые символы в полях:'")); Результат.Добавить(НедопустимыеСимволыПолей); НеСоответствуетДлинаПолей = ГруппаОшибокАдреса("НеСоответствуетДлинаПолей", - НСтр("ru='Не соответствует установленной длина полей:'")); + НСтр("ru = 'Не соответствует установленной длина полей:'")); Результат.Добавить(НеСоответствуетДлинаПолей); // 2) Индекс, Регион, Дом должны быть заполнены Индекс = ПочтовыйИндексАдреса(АдресРФ); Если ПустаяСтрока(Индекс) Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса(), - НСтр("ru='Не указан почтовый индекс.'"), "Индекс"); + НСтр("ru = 'Не указан почтовый индекс.'"), "Индекс"); КонецЕсли; Регион = АдресРФ.СубъектРФ; Если ПустаяСтрока(Регион) Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "СубъектРФ", - НСтр("ru='Не указан регион.'"), "Регион"); + НСтр("ru = 'Не указан регион.'"), "Регион"); КонецЕсли; ЗданияПомещения = ЗданияИПомещенияАдреса(АдресРФ); @@ -1309,7 +1312,7 @@ Если ЗданиеНеУказано Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации("Дом"), - НСтр("ru='Не указан дом или корпус.'"), "Дом"); + НСтр("ru = 'Не указан дом или корпус.'"), "Дом"); КонецЕсли; Иначе @@ -1319,15 +1322,15 @@ Если ДанныеДома = Неопределено Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации("Дом"), - НСтр("ru='Не указан дом или владение.'"), "Дом"); + НСтр("ru = 'Не указан дом или владение.'"), "Дом"); ИначеЕсли ПустаяСтрока(ДанныеДома.Значение) Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, ДанныеДома.ПутьXPath, - НСтр("ru='Не заполнено значение дома или владения.'"), "Дом"); + НСтр("ru = 'Не заполнено значение дома или владения.'"), "Дом"); КонецЕсли; КонецЕсли; - // 3) Регион, Район, Город, НаселенныйПункт, Улица должны: + // 3) Регион, Район, Город, НаселенныйПункт, Улица должны: // - иметь сокращение // - не длинней 50 символов // - только кириллица @@ -1340,19 +1343,19 @@ Если ПустаяСтрока(КонтактнаяИнформацияКлиентСервер.Сокращение(Регион)) Тогда ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, "СубъектРФ", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не указано сокращение в названии региона ""%1"".'"), Регион + НСтр("ru = 'Не указано сокращение в названии региона ""%1"".'"), Регион ), "Регион"); КонецЕсли; - Если СтрДлина(Регион)>50 Тогда + Если СтрДлина(Регион) > 50 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Название региона ""%1"" должно быть короче 50 символов.'"), Регион + НСтр("ru = 'Название региона ""%1"" должно быть короче 50 символов.'"), Регион ), "Регион"); КонецЕсли; Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Регион, Ложь, ДопустимоКромеКириллицы) Тогда ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='В названии региона ""%1"" есть не кириллические символы.'"), Регион + НСтр("ru = 'В названии региона ""%1"" есть не кириллические символы.'"), Регион ), "Регион"); КонецЕсли КонецЕсли; @@ -1364,19 +1367,19 @@ Если ПустаяСтрока(КонтактнаяИнформацияКлиентСервер.Сокращение(Район)) Тогда ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не указано сокращение в названии района ""%1""'."), Район + НСтр("ru = 'Не указано сокращение в названии района ""%1""'."), Район ), "Район"); КонецЕсли; - Если СтрДлина(Район)>50 Тогда + Если СтрДлина(Район) > 50 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Название района ""%1"" должно быть короче 50 символов.'"), Район + НСтр("ru = 'Название района ""%1"" должно быть короче 50 символов.'"), Район ), "Район"); КонецЕсли; Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Район, Ложь, ДопустимоКромеКириллицы) Тогда ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='В названии района ""%1"" есть не кириллические символы.'"), Район + НСтр("ru = 'В названии района ""%1"" есть не кириллические символы.'"), Район ), "Район"); КонецЕсли; КонецЕсли; @@ -1388,19 +1391,19 @@ Если ПустаяСтрока(КонтактнаяИнформацияКлиентСервер.Сокращение(Город)) Тогда ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не указано сокращение в названии города ""%1"".'"), Город + НСтр("ru = 'Не указано сокращение в названии города ""%1"".'"), Город ), "Город"); КонецЕсли; - Если СтрДлина(Город)>50 Тогда + Если СтрДлина(Город) > 50 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Название города ""%1"" должно быть короче 50 символов.'"), Город + НСтр("ru = 'Название города ""%1"" должно быть короче 50 символов.'"), Город ), "Город"); КонецЕсли; Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Город, Ложь, ДопустимоКромеКириллицы) Тогда ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='В названии города ""%1"" есть не кириллические символы.'"), Город + НСтр("ru = 'В названии города ""%1"" есть не кириллические символы.'"), Город ), "Город"); КонецЕсли; КонецЕсли; @@ -1412,19 +1415,19 @@ Если ПустаяСтрока(КонтактнаяИнформацияКлиентСервер.Сокращение(НаселенныйПункт)) Тогда ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не указано сокращение в названии населенного пункта ""%1"".'"), НаселенныйПункт + НСтр("ru = 'Не указано сокращение в названии населенного пункта ""%1"".'"), НаселенныйПункт ), "Населенный пункт"); КонецЕсли; - Если СтрДлина(НаселенныйПункт)>50 Тогда + Если СтрДлина(НаселенныйПункт) > 50 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Название населенного пункта ""%1"" должно быть короче 50 символов.'"), НаселенныйПункт + НСтр("ru = 'Название населенного пункта ""%1"" должно быть короче 50 символов.'"), НаселенныйПункт ), "Населенный пункт"); КонецЕсли; Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(НаселенныйПункт, Ложь, ДопустимоКромеКириллицы) Тогда ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='В названии населенного пункта ""%1"" есть не кириллические символы.'"), НаселенныйПункт + НСтр("ru = 'В названии населенного пункта ""%1"" есть не кириллические символы.'"), НаселенныйПункт ), "Населенный пункт"); КонецЕсли; КонецЕсли; @@ -1436,19 +1439,19 @@ Если ПустаяСтрока(КонтактнаяИнформацияКлиентСервер.Сокращение(Улица)) Тогда ДобавитьОшибкуЗаполненияАдреса(НеУказаныСокращенияПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Не указано сокращение в названии улицы ""%1"".'"), Улица + НСтр("ru = 'Не указано сокращение в названии улицы ""%1"".'"), Улица ), "Улица"); КонецЕсли; - Если СтрДлина(Район)>50 Тогда + Если СтрДлина(Район) > 50 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Название улицы ""%1"" должно быть короче 50 символов.'"), Улица + НСтр("ru = 'Название улицы ""%1"" должно быть короче 50 символов.'"), Улица ), "Улица"); КонецЕсли; Если Не СтроковыеФункцииКлиентСервер.ТолькоКириллицаВСтроке(Улица, Ложь, ДопустимоКромеКириллицы) Тогда ДобавитьОшибкуЗаполненияАдреса(НедопустимыеСимволыПолей, Поле, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='В названии улицы ""%1"" есть не кириллические символы.'"), Улица + НСтр("ru = 'В названии улицы ""%1"" есть не кириллические символы.'"), Улица ), "Улица"); КонецЕсли; КонецЕсли; @@ -1456,38 +1459,38 @@ // 4) Индекс - если есть, то 6 цифр Если Не ПустаяСтрока(Индекс) Тогда Поле = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса(); - Если СтрДлина(Индекс)<>6 Или Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Индекс) Тогда + Если СтрДлина(Индекс) <> 6 Или Не СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(Индекс) Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, Поле, - НСтр("ru='Почтовый индекс должен состоять из 6 цифр.'"), "Индекс"); + НСтр("ru = 'Почтовый индекс должен состоять из 6 цифр.'"), "Индекс"); КонецЕсли; КонецЕсли; // 5) Дом, Корпус, Квартира не длинней 10 символов Для Каждого ДанныеЗдания Из ЗданияПомещения.Здания Цикл - Если СтрДлина(ДанныеЗдания.Значение)>10 Тогда + Если СтрДлина(ДанныеЗдания.Значение) > 10 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеЗдания.ПутьXPath, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Значение поля ""%1"" должно быть короче 10 символов.'"), ДанныеЗдания.Тип + НСтр("ru = 'Значение поля ""%1"" должно быть короче 10 символов.'"), ДанныеЗдания.Тип ), ДанныеЗдания.Тип); КонецЕсли; КонецЦикла; Для Каждого ДанныеПомещения Из ЗданияПомещения.Помещения Цикл - Если СтрДлина(ДанныеПомещения.Значение)>10 Тогда + Если СтрДлина(ДанныеПомещения.Значение) > 10 Тогда ДобавитьОшибкуЗаполненияАдреса(НеСоответствуетДлинаПолей, ДанныеПомещения.ПутьXPath, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Значение поля ""%1"" должно быть короче 10 символов.'"), ДанныеПомещения.Тип + НСтр("ru = 'Значение поля ""%1"" должно быть короче 10 символов.'"), ДанныеПомещения.Тип ), ДанныеПомещения.Тип); КонецЕсли; КонецЦикла; - // 6) Поля Город и НаселенныйПункт могут быть одновременно пустые только в регионе==городе ФЗ + // 6) Поля Город и НаселенныйПункт могут быть одновременно пустые только в регионе - городе ФЗ Если ПустаяСтрока(Город) И ПустаяСтрока(НаселенныйПункт) Тогда - Если НазванияГородовФедеральногоЗначения().Найти(ВРег(Регион))=Неопределено Тогда + Если НазванияГородовФедеральногоЗначения().Найти(ВРег(Регион)) = Неопределено Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Город", - НСтр("ru='Город может быть не указан только в регионе - городе федерального значения.'"), + НСтр("ru = 'Город может быть не указан только в регионе - городе федерального значения.'"), "Город"); ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "НаселПункт", - НСтр("ru='Населенный пункт может быть не указан только в регионе - городе федерального значения.'"), + НСтр("ru = 'Населенный пункт может быть не указан только в регионе - городе федерального значения.'"), "Населенный пункт"); КонецЕсли; КонецЕсли; @@ -1497,7 +1500,7 @@ Если ПустаяСтрока(НаселенныйПункт) И ПустаяСтрока(Улица) Тогда ДобавитьОшибкуЗаполненияАдреса(НеЗаполненыОбязательныеПоля, "Улица", - НСтр("ru='Если неопределен населенный пункт, то должна быть указана улица.'"), "Улица"); + НСтр("ru = 'Если неопределен населенный пункт, то должна быть указана улица.'"), "Улица"); КонецЕсли; КонецЕсли; @@ -1516,7 +1519,7 @@ Поле.Удалить("СущностьПоля"); КонецЕсли; КонецЦикла; - Если Поля.Количество()=0 Тогда + Если Поля.Количество() = 0 Тогда Результат.Удалить(-Индекс); ИначеЕсли Не ПустаяСтрока(СписокСущностей) Тогда Группа.Сообщение = Группа.Сообщение + Сред(СписокСущностей, 2); @@ -1558,8 +1561,6 @@ Результат = Новый Массив; Результат.Добавить("МОСКВА Г"); Результат.Добавить("САНКТ-ПЕТЕРБУРГ Г"); - Результат.Добавить("БАЙКОНУР Г"); - Результат.Добавить("СЕВАСТОПОЛЬ Г"); Возврат Результат; КонецФункции @@ -1570,7 +1571,7 @@ // XDTOДанные - объект XDTO номера телефона // ВидИнформации - необязательная ссылка на справочник вида КИ // -Функция ПредставлениеТелефона(XDTOДанные, ВидИнформации=Неопределено) Экспорт +Функция ПредставлениеТелефона(XDTOДанные, ВидИнформации = Неопределено) Экспорт Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона( СократитьНеЦифры(XDTOДанные.КодСтраны), XDTOДанные.КодГорода, @@ -1585,7 +1586,7 @@ // XDTOДанные - объект XDTO номера телефона // ВидИнформации - необязательная ссылка на справочник вида КИ // -Функция ПредставлениеФакса(XDTOДанные, ВидИнформации=Неопределено) Экспорт +Функция ПредставлениеФакса(XDTOДанные, ВидИнформации = Неопределено) Экспорт Возврат УправлениеКонтактнойИнформациейКлиентСервер.СформироватьПредставлениеТелефона( СократитьНеЦифры(XDTOДанные.КодСтраны), XDTOДанные.КодГорода, @@ -1596,16 +1597,14 @@ // Возвращает флаг того, что текущий пользователь может загружать или очищать адресный классификатор Функция ЕстьВозможностьИзмененияАдресногоКлассификатора() Экспорт - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - Если Вариант=Неопределено Тогда - // Нет классификатора - Возврат Ложь; - ИначеЕсли Вариант=Перечисления["ВариантыАдресногоКлассификатора"].КЛАДР Тогда + + Если Вариант = "КЛАДР" Тогда ОбъектКонтроля = Метаданные.РегистрыСведений.Найти("АдресныйКлассификатор"); - Возврат ОбъектКонтроля<>Неопределено И ПравоДоступа("Изменение", ОбъектКонтроля); + Возврат ОбъектКонтроля <> Неопределено И ПравоДоступа("Изменение", ОбъектКонтроля); КонецЕсли; + // Нет классификатора Возврат Ложь; КонецФункции @@ -1620,7 +1619,7 @@ // СтарыйСоставПолей - булево - необязательный флаг того, что из состава полей будут исключены // поля, отсутствующие в версиях БСП младше 2.1.3 // -Функция КонтактнаяИнформацияВСтаруюСтруктуру(XDTOКонтактнаяИнформация, СтарыйСоставПолей=Ложь) Экспорт +Функция КонтактнаяИнформацияВСтаруюСтруктуру(XDTOКонтактнаяИнформация, СтарыйСоставПолей = Ложь) Экспорт Если КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(XDTOКонтактнаяИнформация) Тогда XDTOКонтактная = ДесериализацияКонтактнойИнформации(XDTOКонтактнаяИнформация); @@ -1633,16 +1632,16 @@ ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); Состав = XDTOКонтактная.Состав; - Если Состав=Неопределено Тогда + Если Состав = Неопределено Тогда Возврат Результат; КонецЕсли; Тип = Состав.Тип(); - Если Тип=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда Результат.ЗначенияПолей = АдресВСтарыйСписокПолей(Состав, Не СтарыйСоставПолей); Результат.ЗначенияПолей.Добавить(Результат.Представление, "Представление"); - ИначеЕсли Тип=ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда Результат.ЗначенияПолей = НомерТелефонаВСтарыйСписокПолей(Состав); Результат.ЗначенияПолей.Добавить(XDTOКонтактная.Комментарий, "Комментарий"); @@ -1660,12 +1659,12 @@ // // Возвращаемый результат - список значений // -Функция АдресВСтарыйСписокПолей(XDTOАдрес, РасширенныйСоставПолей=Истина) Экспорт +Функция АдресВСтарыйСписокПолей(XDTOАдрес, РасширенныйСоставПолей = Истина) Экспорт Список = Новый СписокЗначений; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); XDTOТип = XDTOАдрес.Тип(); - Если XDTOТип=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда // Страна с кодом ДобавитьЗначение(Список, "Страна", XDTOАдрес.Страна); @@ -1683,7 +1682,7 @@ АдресРФ = XDTOАдрес.Состав; - ИначеЕсли XDTOТип=ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда + ИначеЕсли XDTOТип = ФабрикаXDTO.Тип(ПространствоИмен, "АдресРФ") Тогда АдресРФ = XDTOАдрес; Иначе @@ -1724,7 +1723,7 @@ ЗданияИПомещения = ЗданияИПомещенияАдреса(АдресРФ); ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхДом(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество()=0 Тогда + Если ПараметрыОбъекта.Количество() = 0 Тогда ДобавитьЗначение(Список, "ТипДома", ""); ДобавитьЗначение(Список, "Дом", ""); Иначе @@ -1735,7 +1734,7 @@ КонецЕсли; ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Здания, ВариантыДанныхСтроение(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество()=0 Тогда + Если ПараметрыОбъекта.Количество() = 0 Тогда ДобавитьЗначение(Список, "ТипКорпуса", ""); ДобавитьЗначение(Список, "Корпус", ""); Иначе @@ -1746,7 +1745,7 @@ КонецЕсли; ПараметрыОбъекта = ЗначениеЗданияИлиПомещения(ЗданияИПомещения.Помещения, ВариантыДанныхПомещение(), РасширенныйСоставПолей); - Если ПараметрыОбъекта.Количество()=0 Тогда + Если ПараметрыОбъекта.Количество() = 0 Тогда ДобавитьЗначение(Список, "ТипКвартиры", ""); ДобавитьЗначение(Список, "Квартира", ""); Иначе @@ -1759,11 +1758,11 @@ Возврат Список; КонецФункции -Процедура ДобавитьЗначение(Список, ИмяПоля, Значение, РазрешитьДубли=Ложь) +Процедура ДобавитьЗначение(Список, ИмяПоля, Значение, РазрешитьДубли = Ложь) Если Не РазрешитьДубли Тогда Для Каждого Элемент Из Список Цикл - Если Элемент.Представление=ИмяПоля Тогда + Если Элемент.Представление = ИмяПоля Тогда Элемент.Значение = Строка(Значение); Возврат; КонецЕсли; @@ -1801,9 +1800,9 @@ Функция ГруппаОшибокАдреса(ТипОшибки, Сообщение) Возврат Новый Структура("ТипОшибки, Сообщение, Поля", ТипОшибки, Сообщение, Новый Массив); -КонецФункции +КонецФункции -Процедура ДобавитьОшибкуЗаполненияАдреса(Группа, ИмяПоля="", Сообщение="", СущностьПоля="") +Процедура ДобавитьОшибкуЗаполненияАдреса(Группа, ИмяПоля = "", Сообщение = "", СущностьПоля = "") Группа.Поля.Добавить(Новый Структура("ИмяПоля, Сообщение, СущностьПоля", ИмяПоля, Сообщение, СущностьПоля)); КонецПроцедуры @@ -1815,11 +1814,8 @@ // Функция СерверныйМодульКЛАДР() - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - Возврат Вычислить("АдресныйКлассификатор"); - КонецЕсли; + Возврат ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); - Возврат Неопределено; КонецФункции Функция ЧастиКодаКЛАДР(Знач ПолныйКод) @@ -1853,140 +1849,8 @@ Функция РезультатыАвтоПодбораНаселенногоПунктаКЛАДР(Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных, ВыбиратьСтрок) Результат = Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Истина, Новый СписокЗначений); - Запрос = Новый Запрос(" - |ВЫБРАТЬ - | КодАдресногоОбъектаВКоде КАК КодАдресногоОбъектаВКоде - |ПОМЕСТИТЬ - | ТаблицаЗагруженныхРегионов - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК ЗагруженныеРегионыВнутр - |ГДЕ - | ТипАдресногоЭлемента = 1 - | И 1 В ( - | ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=ЗагруженныеРегионыВнутр.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 - | ) - |ИНДЕКСИРОВАТЬ ПО - | КодАдресногоОбъектаВКоде - |;////////////////////////////////////////////////////////////////////////////////////////// - | - |ВЫБРАТЬ - | ВЫБОР - | КОГДА ЗагруженныеРегионы.КодАдресногоОбъектаВКоде ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК МожноЗагружатьРегион, - | ОтобранныеАдреса.* - | - |ИЗ ( - | - |ВЫБРАТЬ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " - | - | Адреса.КодАдресногоОбъектаВКоде КАК КодАдресногоОбъектаВКоде, - | - | Адреса.Код КАК Код, - | Адреса.Наименование КАК АдресаНаименование, - | - | ВЫБОР - | КОГДА Адреса.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК ПоложениеВСтроке, - | - | ВЫБОР - | КОГДА Адреса.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Регионы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Районы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Города.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА НаселенныеПункты.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Неактуален, - | - | Регионы.Сокращение КАК РегионыСокращение, - | Регионы.Наименование КАК РегионыНаименование, - | Районы.Сокращение КАК РайоныСокращение, - | Районы.Наименование КАК РайоныНаименование, - | Города.Сокращение КАК ГородаСокращение, - | Города.Наименование КАК ГородаНаименование, - | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, - | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК Адреса - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Регионы - |ПО - | Регионы.ТипАдресногоЭлемента = 1 - | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Регионы.КодРайонаВКоде = 0 - | И Регионы.КодГородаВКоде = 0 - | И Регионы.КодНаселенногоПунктаВКоде = 0 - | И Регионы.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Регионы.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Районы - |ПО - | Районы.ТипАдресногоЭлемента = 2 - | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Районы.КодГородаВКоде = 0 - | И Районы.КодНаселенногоПунктаВКоде = 0 - | И Районы.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Районы.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Города - |ПО - | Города.ТипАдресногоЭлемента = 3 - | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Города.КодГородаВКоде = Адреса.КодГородаВКоде - | И Города.КодНаселенногоПунктаВКоде = 0 - | И Города.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Города.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты - |ПО - | НаселенныеПункты.ТипАдресногоЭлемента = 4 - | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде - | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде - | И НаселенныеПункты.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И НаселенныеПункты.ПризнакАктуальности=0","") + " - | - |ГДЕ - | Адреса.ТипАдресногоЭлемента <= 4 - | " + ?(СкрыватьНеактуальныеАдреса, "И Адреса.ПризнакАктуальности=0","") + " - | - | И ( - | // В начале строки - | Адреса.Наименование ПОДОБНО &НачалоТекста СПЕЦСИМВОЛ ""\"" - | ИЛИ - | // В начале слова - | Адреса.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" - | ) - | - |) ОтобранныеАдреса - | - |ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаЗагруженныхРегионов КАК ЗагруженныеРегионы - | - |ПО - | ЗагруженныеРегионы.КодАдресногоОбъектаВКоде = ОтобранныеАдреса.КодАдресногоОбъектаВКоде - | - |УПОРЯДОЧИТЬ ПО - | ОтобранныеАдреса.ПоложениеВСтроке, - | ОтобранныеАдреса.РегионыНаименование, - | ОтобранныеАдреса.РайоныНаименование, - | ОтобранныеАдреса.ГородаНаименование, - | ОтобранныеАдреса.НаселенныеПунктыНаименование, - | ОтобранныеАдреса.АдресаНаименование - | - |;////////////////////////////////////////////////////////////////////////////////////////// - |УНИЧТОЖИТЬ ТаблицаЗагруженныхРегионов - |"); + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросРезультатыАвтоПодбораНаселенногоПунктаКЛАДР(ВыбиратьСтрок, СкрыватьНеактуальныеАдреса); СтрокаПодобия = ЗамаскироватьСпецсимволы(Текст); Запрос.УстановитьПараметр("НачалоТекста", СтрокаПодобия + "%"); @@ -1994,10 +1858,10 @@ Выборка = Запрос.Выполнить().Выбрать(); - Результат.СлишкомМногоДанных = Выборка.Количество()>ВыбиратьСтрок; + Результат.СлишкомМногоДанных = Выборка.Количество() > ВыбиратьСтрок; ДанныеВыбора = Результат.ДанныеВыбора; - ПредупреждениеНеактуальности = НСтр("ru='Адрес ""%1"" неактуален.'"); + ПредупреждениеНеактуальности = НСтр("ru = 'Адрес ""%1"" неактуален.'"); КартинкаНеактуальности = БиблиотекаКартинок.КонтактнаяИнформацияНеактуально; КартинкаАктуальности = Неопределено; @@ -2034,41 +1898,9 @@ Функция РезультатыАвтоПодбораУлицыКЛАДР(КодНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных, ВыбиратьСтрок) - Запрос = Новый Запрос(" - |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " - | Улицы.Код КАК Код, - | - | ВЫБОР - | КОГДА Улицы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Неактуален, - | - | Улицы.Наименование КАК Наименование, - | Улицы.Сокращение КАК Сокращение - | - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныйПункт - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Улицы - |ПО - | Улицы.ТипАдресногоЭлемента = 5 - | И Улицы.КодАдресногоОбъектаВКоде = НаселенныйПункт.КодАдресногоОбъектаВКоде - | И Улицы.КодРайонаВКоде = НаселенныйПункт.КодРайонаВКоде - | И Улицы.КодГородаВКоде = НаселенныйПункт.КодГородаВКоде - | И Улицы.КодНаселенногоПунктаВКоде = НаселенныйПункт.КодНаселенногоПунктаВКоде - | " + ?(СкрыватьНеактуальныеАдреса, "И Улицы.ПризнакАктуальности=0","") + " - | - |ГДЕ - | НаселенныйПункт.Код = &Код - | И ( - | Улицы.Наименование ПОДОБНО &НачалоСтроки СПЕЦСИМВОЛ ""\"" - | ИЛИ - | Улицы.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" - | ) - | - |УПОРЯДОЧИТЬ ПО - | Улицы.Наименование - |"); + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросРезультатыАвтоПодбораУлицыКЛАДР(ВыбиратьСтрок, СкрыватьНеактуальныеАдреса); + Запрос.УстановитьПараметр("Код", КодНаселенногоПункта); СтрокаПоиска = ЗамаскироватьСпецсимволы(Текст); @@ -2077,7 +1909,7 @@ ДанныеВыбора = Новый СписокЗначений; - ПредупреждениеНеактуальности = НСтр("ru='Адрес ""%1"" неактуален.'"); + ПредупреждениеНеактуальности = НСтр("ru = 'Адрес ""%1"" неактуален.'"); КартинкаНеактуальности = БиблиотекаКартинок.КонтактнаяИнформацияНеактуально; КартинкаАктуальности = Неопределено; @@ -2108,7 +1940,7 @@ КонецЦикла; Возврат Новый Структура("СлишкомМногоДанных, ДанныеВыбора", - Выборка.Количество()>ВыбиратьСтрок, ДанныеВыбора); + Выборка.Количество() > ВыбиратьСтрок, ДанныеВыбора); КонецФункции @@ -2121,152 +1953,21 @@ ЧастиАдреса = КонтактнаяИнформацияКлиентСервер.ЧастиАдреса(Текст); Результат = Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Истина, Новый СписокЗначений); + ДополнительныхСтрокПоиска = ЧастиАдреса.ВГраница(); - Если ДополнительныхСтрокПоиска<0 Тогда + Если ДополнительныхСтрокПоиска < 0 Тогда Возврат Результат; КонецЕсли; - Запрос = Новый Запрос; - ОграничительСверху = "яяяяя"; + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросНаселенныеПунктыПоПредставлениюКЛАДР(ЧастиАдреса, ВыбиратьСтрок, СкрыватьНеактуальныеАдреса); - Наименование = ЧастиАдреса[0].Наименование; - Сокращение = ЧастиАдреса[0].Сокращение; - Если ДополнительныхСтрокПоиска=0 И ПустаяСтрока(Сокращение) Тогда - УсловиеНаименования = "(Адреса.Наименование>=&НаименованиеПоиска0 И Адреса.Наименование<&ОграничительПоиска0)"; - Иначе - УсловиеНаименования = "(Адреса.Наименование=&НаименованиеПоиска0 И Адреса.Сокращение=&СокращениеПоиска0)"; - КонецЕсли; - Запрос.УстановитьПараметр("НаименованиеПоиска0", Наименование); - Запрос.УстановитьПараметр("ОграничительПоиска0", Наименование + ОграничительСверху); - Запрос.УстановитьПараметр("СокращениеПоиска0", Сокращение); - - Для Позиция=1 По ДополнительныхСтрокПоиска Цикл - НомерПозиции = Формат(Позиция, "ЧН=; ЧГ="); - ИмяПараметраНаименование = "НаименованиеПоиска" + НомерПозиции; - ИмяПараметраСокращение = "СокращениеПоиска" + НомерПозиции; - ИмяПараметраОграничитель = "ОграничительПоиска" + НомерПозиции; - - Наименование = ЧастиАдреса[Позиция].Наименование; - Сокращение = ЧастиАдреса[Позиция].Сокращение; - Если ПустаяСтрока(Сокращение) Тогда - УсловиеНаименования = УсловиеНаименования + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" - |И ( - | (НаселенныеПункты.Наименование>=&%1 И НаселенныеПункты.Наименование<&%2) - | ИЛИ (Города.Наименование>=&%1 И Города.Наименование<&%2) - | ИЛИ (Районы.Наименование>=&%1 И Районы.Наименование<&%2) - | ИЛИ (Регионы.Наименование>=&%1 И Регионы.Наименование<&%2) - |)", - ИмяПараметраНаименование, ИмяПараметраОграничитель); - Иначе - УсловиеНаименования = УсловиеНаименования + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(" - |И ( - | (НаселенныеПункты.Наименование=&%1 И НаселенныеПункты.Сокращение=&%2) - | ИЛИ (Города.Наименование=&%1 И Города.Сокращение=&%2) - | ИЛИ (Районы.Наименование=&%1 И Районы.Сокращение=&%2) - | ИЛИ (Регионы.Наименование=&%1 И Регионы.Сокращение=&%2) - |)", - ИмяПараметраНаименование, ИмяПараметраСокращение); - КонецЕсли; - Запрос.УстановитьПараметр(ИмяПараметраНаименование, Наименование); - Запрос.УстановитьПараметр(ИмяПараметраОграничитель, Наименование + ОграничительСверху); - Запрос.УстановитьПараметр(ИмяПараметраСокращение, Сокращение); - КонецЦикла; - - Запрос.Текст = " - |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " - | Адреса.Код КАК Код, - | - | ВЫБОР - | КОГДА Адреса.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Регионы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Районы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА Города.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | КОГДА НаселенныеПункты.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Неактуален, - | - | Регионы.Код КАК РегионыКод, - | Регионы.Сокращение КАК РегионыСокращение, - | Регионы.Наименование КАК РегионыНаименование, - | - | Районы.Код КАК РайоныКод, - | Районы.Сокращение КАК РайоныСокращение, - | Районы.Наименование КАК РайоныНаименование, - | - | Города.Код КАК ГородаКод, - | Города.Сокращение КАК ГородаСокращение, - | Города.Наименование КАК ГородаНаименование, - | - | НаселенныеПункты.Код КАК НаселенныеПунктыКод, - | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, - | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК Адреса - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Регионы - |ПО - | Регионы.ТипАдресногоЭлемента = 1 - | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Регионы.КодРайонаВКоде = 0 - | И Регионы.КодГородаВКоде = 0 - | И Регионы.КодНаселенногоПунктаВКоде = 0 - | И Регионы.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Регионы.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Районы - |ПО - | Районы.ТипАдресногоЭлемента = 2 - | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Районы.КодГородаВКоде = 0 - | И Районы.КодНаселенногоПунктаВКоде = 0 - | И Районы.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Районы.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Города - |ПО - | Города.ТипАдресногоЭлемента = 3 - | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Города.КодГородаВКоде = Адреса.КодГородаВКоде - | И Города.КодНаселенногоПунктаВКоде = 0 - | И Города.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И Города.ПризнакАктуальности=0","") + " - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты - |ПО - | НаселенныеПункты.ТипАдресногоЭлемента = 4 - | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде - | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде - | И НаселенныеПункты.КодУлицыВКоде = 0 - | " + ?(СкрыватьНеактуальныеАдреса, "И НаселенныеПункты.ПризнакАктуальности=0","") + " - | - |ГДЕ - | Адреса.ТипАдресногоЭлемента <= 4 - | " + ?(СкрыватьНеактуальныеАдреса, "И Адреса.ПризнакАктуальности=0","") + " - | И (" + УсловиеНаименования + ") - | - |УПОРЯДОЧИТЬ ПО - | Адреса.ПризнакАктуальности, // Актуальные - вперед - | - | Адреса.Наименование, - | НаселенныеПункты.Наименование, - | Города.Наименование, - | Районы.Наименование, - | Регионы.Наименование - |"; Выборка = Запрос.Выполнить().Выбрать(); - Результат.СлишкомМногоДанных = Выборка.Количество()>ВыбиратьСтрок; + Результат.СлишкомМногоДанных = Выборка.Количество() > ВыбиратьСтрок; ДанныеВыбора = Результат.ДанныеВыбора; - ПредупреждениеНеактуальности = НСтр("ru='Населенный пункт неактуален.'"); + ПредупреждениеНеактуальности = НСтр("ru = 'Населенный пункт неактуален.'"); КартинкаНеактуальности = БиблиотекаКартинок.КонтактнаяИнформацияНеактуально; КартинкаАктуальности = Неопределено; @@ -2281,7 +1982,7 @@ ТекстПредупреждения = ПредупреждениеНеактуальности; Пометка = Истина; Картинка = КартинкаНеактуальности; - Иначе + Иначе ТекстПредупреждения = Неопределено; Пометка = Ложь; Картинка = КартинкаАктуальности; @@ -2322,52 +2023,15 @@ ЧастиАдреса = КонтактнаяИнформацияКлиентСервер.ЧастиАдреса(Текст); Результат = Новый Структура("СлишкомМногоДанных, ДанныеВыбора", Истина, Новый СписокЗначений); КоличествоСтрокПоиска = ЧастиАдреса.ВГраница(); - Если КоличествоСтрокПоиска<0 Тогда + Если КоличествоСтрокПоиска < 0 Тогда Возврат Результат; КонецЕсли; - НаименованиеПоиска = ЧастиАдреса[0].Наименование; - СокращениеПоиска = ЧастиАдреса[0].Сокращение; - Если ПустаяСтрока(СокращениеПоиска) Тогда - УсловиеНаименования = "Улицы.Наименование ПОДОБНО &НачалоСтроки СПЕЦСИМВОЛ ""\"" ИЛИ Улицы.Наименование ПОДОБНО &НачалоСлова СПЕЦСИМВОЛ ""\"" "; - Иначе - УсловиеНаименования = "Улицы.Наименование = &НаименованиеПоиска И Улицы.Сокращение = &СокращениеПоиска" - КонецЕсли; + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросУлицыПоПредставлениюКЛАДР(ЧастиАдреса, ВыбиратьСтрок, СкрыватьНеактуальныеАдреса); - Запрос = Новый Запрос(" - |ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " - | Улицы.Код КАК Код, - | - | ВЫБОР - | КОГДА Улицы.ПризнакАктуальности<>0 ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Неактуален, - | - | Улицы.Наименование КАК Наименование, - | Улицы.Сокращение КАК Сокращение - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныйПункт - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Улицы - |ПО - | Улицы.ТипАдресногоЭлемента = 5 - | И Улицы.КодАдресногоОбъектаВКоде = НаселенныйПункт.КодАдресногоОбъектаВКоде - | И Улицы.КодРайонаВКоде = НаселенныйПункт.КодРайонаВКоде - | И Улицы.КодГородаВКоде = НаселенныйПункт.КодГородаВКоде - | И Улицы.КодНаселенногоПунктаВКоде = НаселенныйПункт.КодНаселенногоПунктаВКоде - | - |ГДЕ - | НаселенныйПункт.Код = &КодНаселенногоПункта - | " + ?(СкрыватьНеактуальныеАдреса, "И Улицы.ПризнакАктуальности=0","") + " - | И (" + УсловиеНаименования + ") - | - |УПОРЯДОЧИТЬ ПО - | Улицы.ПризнакАктуальности, - | Улицы.Наименование - |"); + // Оставшиеся параметры Запрос.УстановитьПараметр("КодНаселенногоПункта", КодНаселенногоПункта); - Запрос.УстановитьПараметр("НаименованиеПоиска", НаименованиеПоиска); - Запрос.УстановитьПараметр("СокращениеПоиска", СокращениеПоиска); СтрокаПоиска = ЗамаскироватьСпецсимволы(Текст); Запрос.УстановитьПараметр("НачалоСтроки", СтрокаПоиска + "%"); // Начало строки @@ -2376,7 +2040,7 @@ Выборка = Запрос.Выполнить().Выбрать(); ДанныеВыбора = Результат.ДанныеВыбора; - ПредупреждениеНеактуальности = НСтр("ru='Улица неактуальна.'"); + ПредупреждениеНеактуальности = НСтр("ru = 'Улица неактуальна.'"); КартинкаНеактуальности = БиблиотекаКартинок.КонтактнаяИнформацияНеактуально; КартинкаАктуальности = Неопределено; @@ -2400,7 +2064,7 @@ )), ПолноеНаименование, Пометка, Картинка); КонецЦикла; - Результат.СлишкомМногоДанных = Выборка.Количество()>ВыбиратьСтрок; + Результат.СлишкомМногоДанных = Выборка.Количество() > ВыбиратьСтрок; Возврат Результат; КонецФункции @@ -2408,25 +2072,25 @@ СтруктураРодителя = ЧастиКодаКЛАДР(КодРодителя); СтруктураОбъекта = ЧастиКодаКЛАДР(КодОбъекта); - Если СтруктураОбъекта.КодУлицы<>0 Тогда - Возврат СтруктураОбъекта.КодНаселенногоПункта=СтруктураРодителя.КодНаселенногоПункта - И СтруктураОбъекта.КодГорода=СтруктураРодителя.КодГорода - И СтруктураОбъекта.КодРайона=СтруктураРодителя.КодРайона - И СтруктураОбъекта.КодРегиона=СтруктураРодителя.КодРегиона + Если СтруктураОбъекта.КодУлицы <> 0 Тогда + Возврат СтруктураОбъекта.КодНаселенногоПункта = СтруктураРодителя.КодНаселенногоПункта + И СтруктураОбъекта.КодГорода = СтруктураРодителя.КодГорода + И СтруктураОбъекта.КодРайона = СтруктураРодителя.КодРайона + И СтруктураОбъекта.КодРегиона = СтруктураРодителя.КодРегиона - ИначеЕсли СтруктураОбъекта.КодНаселенногоПункта<>0 Тогда - Возврат СтруктураОбъекта.КодГорода=СтруктураРодителя.КодГорода - И СтруктураОбъекта.КодРайона=СтруктураРодителя.КодРайона - И СтруктураОбъекта.КодРегиона=СтруктураРодителя.КодРегиона + ИначеЕсли СтруктураОбъекта.КодНаселенногоПункта <> 0 Тогда + Возврат СтруктураОбъекта.КодГорода = СтруктураРодителя.КодГорода + И СтруктураОбъекта.КодРайона = СтруктураРодителя.КодРайона + И СтруктураОбъекта.КодРегиона = СтруктураРодителя.КодРегиона - ИначеЕсли СтруктураОбъекта.КодГорода<>0 Тогда - Возврат СтруктураОбъекта.КодРайона=СтруктураРодителя.КодРайона - И СтруктураОбъекта.КодРегиона=СтруктураРодителя.КодРегиона + ИначеЕсли СтруктураОбъекта.КодГорода <> 0 Тогда + Возврат СтруктураОбъекта.КодРайона = СтруктураРодителя.КодРайона + И СтруктураОбъекта.КодРегиона = СтруктураРодителя.КодРегиона - ИначеЕсли СтруктураОбъекта.КодРайона<>0 Тогда - Возврат СтруктураОбъекта.КодРегиона=СтруктураРодителя.КодРегиона + ИначеЕсли СтруктураОбъекта.КодРайона <> 0 Тогда + Возврат СтруктураОбъекта.КодРегиона = СтруктураРодителя.КодРегиона - ИначеЕсли СтруктураОбъекта.КодРегиона<>0 Тогда + ИначеЕсли СтруктураОбъекта.КодРегиона <> 0 Тогда Возврат Истина; КонецЕсли; @@ -2434,86 +2098,28 @@ КонецФункции // Возвращает или пустую структуру-заготовку, или заполненную структуру по коду -Функция СписокРеквизитовНаселенныйПунктКЛАДР(Код=Неопределено) +Функция СписокРеквизитовНаселенныйПунктКЛАДР(Код = Неопределено) // Первый уровень - внутренние идентификаторы Результат = Новый Структура; - Результат.Вставить("Регион", ЭлементАдреснойСтруктуры(НСтр("ru='Регион'"), "СубъектРФ") ); - Результат.Вставить("Район", ЭлементАдреснойСтруктуры(НСтр("ru='Район'"), "СвРайМО/Район") ); - Результат.Вставить("Город", ЭлементАдреснойСтруктуры(НСтр("ru='Город'"), "Город") ); - Результат.Вставить("НаселенныйПункт", ЭлементАдреснойСтруктуры(НСтр("ru='Нас.пункт'"), "НаселПункт", ,Истина)); + Результат.Вставить("Регион", ЭлементАдреснойСтруктуры(НСтр("ru = 'Регион'"), "СубъектРФ") ); + Результат.Вставить("Район", ЭлементАдреснойСтруктуры(НСтр("ru = 'Район'"), "СвРайМО/Район") ); + Результат.Вставить("Город", ЭлементАдреснойСтруктуры(НСтр("ru = 'Город'"), "Город") ); + Результат.Вставить("НаселенныйПункт", ЭлементАдреснойСтруктуры(НСтр("ru = 'Нас.пункт'"), "НаселПункт", ,Истина)); // Подсказки для интерфейса - Результат.Регион.Вставить("Подсказка", НСтр("ru='Регион адреса'")); - Результат.Район.Вставить("Подсказка", НСтр("ru='Район адреса'")); - Результат.Город.Вставить("Подсказка", НСтр("ru='Город адреса'")); - Результат.НаселенныйПункт.Вставить("Подсказка", НСтр("ru='Населенный пункт адреса'")); + Результат.Регион.Вставить("Подсказка", НСтр("ru = 'Регион адреса'")); + Результат.Район.Вставить("Подсказка", НСтр("ru = 'Район адреса'")); + Результат.Город.Вставить("Подсказка", НСтр("ru = 'Город адреса'")); + Результат.НаселенныйПункт.Вставить("Подсказка", НСтр("ru = 'Населенный пункт адреса'")); - Если Код=Неопределено Тогда + Если Код = Неопределено Тогда Возврат Результат; КонецЕсли; - // Мы знаем что там КЛАДР, поэтому можем заполнить поля - Запрос = Новый Запрос(" - |ВЫБРАТЬ - | НаселенныеПункты.Код КАК НаселенныеПунктыКод, - | НаселенныеПункты.Наименование КАК НаселенныеПунктыНаименование, - | НаселенныеПункты.Сокращение КАК НаселенныеПунктыСокращение, - | Города.Код КАК ГородаКод, - | Города.Наименование КАК ГородаНаименование, - | Города.Сокращение КАК ГородаСокращение, - | Районы.Код КАК РайоныКод, - | Районы.Наименование КАК РайоныНаименование, - | Районы.Сокращение КАК РайоныСокращение, - | Регионы.Код КАК РегионыКод, - | Регионы.Наименование КАК РегионыНаименование, - | Регионы.Сокращение КАК РегионыСокращение - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК Адреса - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Регионы - |ПО - | Регионы.ТипАдресногоЭлемента = 1 - | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Регионы.КодРайонаВКоде = 0 - | И Регионы.КодГородаВКоде = 0 - | И Регионы.КодНаселенногоПунктаВКоде = 0 - | И Регионы.КодУлицыВКоде = 0 - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Районы - |ПО - | Районы.ТипАдресногоЭлемента = 2 - | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Районы.КодГородаВКоде = 0 - | И Районы.КодНаселенногоПунктаВКоде = 0 - | И Районы.КодУлицыВКоде = 0 - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Города - |ПО - | Города.ТипАдресногоЭлемента = 3 - | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Города.КодГородаВКоде = Адреса.КодГородаВКоде - | И Города.КодНаселенногоПунктаВКоде = 0 - | И Города.КодУлицыВКоде = 0 - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты - |ПО - | НаселенныеПункты.ТипАдресногоЭлемента = 4 - | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде - | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде - | И НаселенныеПункты.КодУлицыВКоде = 0 - | - |ГДЕ - | Адреса.Код = &Код - |"); + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросСписокРеквизитовНаселенныйПунктКЛАДР(); + Запрос.УстановитьПараметр("Код", Код); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда @@ -2541,23 +2147,14 @@ КонецФункции // Возвращает или пустую структуру-заготовку, или заполненную структуру по коду -Функция СписокРеквизитовУлицаКЛАДР(Код=Неопределено) - Результат = Новый Структура("Улица", - ЭлементАдреснойСтруктуры("Улица", "Улица"),); +Функция СписокРеквизитовУлицаКЛАДР(Код = Неопределено) + Результат = Новый Структура("Улица", ЭлементАдреснойСтруктуры("Улица", "Улица"),); - Если Код<>Неопределено Тогда - // Мы знаем что там КЛАДР, поэтому можем заполнить поля - Запрос = Новый Запрос(" - |ВЫБРАТЬ - | Улицы.Код КАК УлицыКод, - | Улицы.Наименование КАК УлицыНаименование, - | Улицы.Сокращение КАК УлицыСокращение - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК Улицы - |ГДЕ - | Улицы.Код = &Код - |"); + Если Код <> Неопределено Тогда + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросСписокРеквизитовУлицаКЛАДР(); Запрос.УстановитьПараметр("Код", Код); + Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Результат.Улица.Значение = КонтактнаяИнформацияКлиентСервер.ПолноеНаименование(Выборка.УлицыНаименование, Выборка.УлицыСокращение); @@ -2567,19 +2164,19 @@ КонецЕсли; КонецЕсли; - Возврат Результат; + Возврат Результат; КонецФункции Функция СписокАвтоПодбораЭлементаАдресаКЛАДР(Текст, КодЧастиАдреса, ЧастиАдреса, ПредупреждатьОНеактуальных, ВыбиратьСтрок) Возврат СписокАнализаЭлементаАдресаКЛАДР(Текст, "", КодЧастиАдреса, ЧастиАдреса, Истина, ПредупреждатьОНеактуальных, ВыбиратьСтрок); КонецФункции -Функция СписокВариантовЭлементаАдресаПоТекстуКЛАДР(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок=50) +Функция СписокВариантовЭлементаАдресаПоТекстуКЛАДР(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок = 50) ЧастиАдресаПоиска = КонтактнаяИнформацияКлиентСервер.ЧастиАдреса(Текст); - Если ЧастиАдресаПоиска.Количество()=0 Тогда + Если ЧастиАдресаПоиска.Количество() = 0 Тогда Возврат Неопределено; - КонецЕсли; + КонецЕсли; Наименование = СокрЛП(ЧастиАдресаПоиска[0].Наименование); Сокращение = СокрЛП(ЧастиАдресаПоиска[0].Сокращение); @@ -2588,174 +2185,31 @@ Возврат СписокАнализаЭлементаАдресаКЛАДР(Наименование, Сокращение, КодЧастиАдреса, ЧастиАдреса, ПоискПоПодобию, Истина, ВыбиратьСтрок); КонецФункции -Функция СписокАнализаЭлементаАдресаКЛАДР(Наименование, Сокращение, КодЧастиАдреса, ЧастиАдреса, ПоискПоПодобию=Истина, ПредупреждатьОНеактуальных=Истина, ВыбиратьСтрок=50) +Функция СписокАнализаЭлементаАдресаКЛАДР(Наименование, Сокращение, КодЧастиАдреса, ЧастиАдреса, ПоискПоПодобию = Истина, ПредупреждатьОНеактуальных = Истина, ВыбиратьСтрок = 50) КодРеквизита = ВРег(КодЧастиАдреса); - Если КодРеквизита="РЕГИОН" Тогда + Если КодРеквизита = "РЕГИОН" Тогда Уровень = 1; - ИначеЕсли КодРеквизита="РАЙОН" Тогда + ИначеЕсли КодРеквизита = "РАЙОН" Тогда Уровень = 2; - ИначеЕсли КодРеквизита="ГОРОД" Тогда + ИначеЕсли КодРеквизита = "ГОРОД" Тогда Уровень = 3; - ИначеЕсли КодРеквизита="НАСЕЛЕННЫЙПУНКТ" Тогда + ИначеЕсли КодРеквизита = "НАСЕЛЕННЫЙПУНКТ" Тогда Уровень = 4; - ИначеЕсли КодРеквизита="УЛИЦА" Тогда + ИначеЕсли КодРеквизита = "УЛИЦА" Тогда Уровень = 5; - Иначе + Иначе Возврат Неопределено; - КонецЕсли; - - Запрос = Новый Запрос(" - |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ " + Формат(ВыбиратьСтрок, "ЧН=; ЧГ=") + " - | - | Адреса.Код КАК Код, - | Адреса.Индекс КАК Индекс, - | Адреса.ПризнакАктуальности КАК ПризнакАктуальности, - | Адреса.Наименование КАК АдресаНаименование, - | Адреса.Сокращение КАК АдресаСокращение, - | - | ВЫБОР - | КОГДА Адреса.ПризнакАктуальности>0 ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Неактуален, - | - | " + ?(Уровень=1, " - | ВЫБОР КОГДА РегионЗагружен.Код ЕСТЬ NULL ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ - | ", " - | ЛОЖЬ - | ") + " КАК МожноЗагружатьРегион - | - |ИЗ - | РегистрСведений.АдресныйКлассификатор КАК Адреса - |"); - - // Добавляем информацию о загруженности региона - Если Уровень=1 Тогда - Запрос.Текст = Запрос.Текст + " - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК РегионЗагружен - |ПО - | РегионЗагружен.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И РегионЗагружен.ТипАдресногоЭлемента = 1 - | И 1 В ( - | ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 2 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 3 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 4 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 5 - | ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.АдресныйКлассификатор ГДЕ КодАдресногоОбъектаВКоде=РегионЗагружен.КодАдресногоОбъектаВКоде И ТипАдресногоЭлемента = 6 - | ) - |"; - КонецЕсли; - Если Уровень>1 Тогда - // Район, опираемся на регион - Запрос.Текст = Запрос.Текст + " - |ВНУТРЕННЕЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Регионы - |ПО - | Регионы.ТипАдресногоЭлемента = 1 - | И Регионы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Регионы.КодРайонаВКоде = 0 - | И Регионы.КодГородаВКоде = 0 - | И Регионы.КодНаселенногоПунктаВКоде = 0 - | И Регионы.КодУлицыВКоде = 0 - | И Регионы.Наименование = &Регион - | И Регионы.Сокращение = &РегионСокращение - |"; - Запрос.УстановитьПараметр("Регион", ЧастиАдреса.Регион.Наименование); - Запрос.УстановитьПараметр("РегионСокращение", ЧастиАдреса.Регион.Сокращение); - КонецЕсли; - Если Уровень>2 И (Не ПустаяСтрока(ЧастиАдреса.Район.Наименование)) Тогда - // Город, опираемся на район + регион, район возможно пуст - Запрос.Текст = Запрос.Текст + " - |ВНУТРЕННЕЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Районы - |ПО - | Районы.ТипАдресногоЭлемента = 2 - | И Районы.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Районы.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Районы.КодГородаВКоде = 0 - | И Районы.КодНаселенногоПунктаВКоде = 0 - | И Районы.КодУлицыВКоде = 0 - | И Районы.Наименование = &Район - | И Районы.Сокращение = &РайонСокращение - |"; - Запрос.УстановитьПараметр("Район", ЧастиАдреса.Район.Наименование); - Запрос.УстановитьПараметр("РайонСокращение", ЧастиАдреса.Район.Сокращение); - КонецЕсли; - Если Уровень>3 И (Не ПустаяСтрока(ЧастиАдреса.Город.Наименование)) Тогда - // Населенный пункт, опираемся на регион + район + город, район возможно пуст, город возможно пуст - Запрос.Текст = Запрос.Текст + " - |ВНУТРЕННЕЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК Города - |ПО - | Города.ТипАдресногоЭлемента = 3 - | И Города.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И Города.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И Города.КодГородаВКоде = Адреса.КодГородаВКоде - | И Города.КодНаселенногоПунктаВКоде = 0 - | И Города.КодУлицыВКоде = 0 - | И Города.Наименование = &Город - | И Города.Сокращение = &ГородСокращение - |"; - Запрос.УстановитьПараметр("Город", ЧастиАдреса.Город.Наименование); - Запрос.УстановитьПараметр("ГородСокращение", ЧастиАдреса.Город.Сокращение); - КонецЕсли; - Если Уровень>4 И (Не ПустаяСтрока(ЧастиАдреса.НаселенныйПункт.Наименование)) Тогда - // Улица, опираемся на регион + район + город + населенный пункт, возможно пустые - Запрос.Текст = Запрос.Текст + " - |ВНУТРЕННЕЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК НаселенныеПункты - |ПО - | НаселенныеПункты.ТипАдресногоЭлемента = 4 - | И НаселенныеПункты.КодАдресногоОбъектаВКоде = Адреса.КодАдресногоОбъектаВКоде - | И НаселенныеПункты.КодРайонаВКоде = Адреса.КодРайонаВКоде - | И НаселенныеПункты.КодГородаВКоде = Адреса.КодГородаВКоде - | И НаселенныеПункты.КодНаселенногоПунктаВКоде = Адреса.КодНаселенногоПунктаВКоде - | И НаселенныеПункты.КодУлицыВКоде = 0 - | - | И НаселенныеПункты.Наименование = &НаселенныйПункт - | И НаселенныеПункты.Сокращение = &НаселенныйПунктСокращение - |"; - Запрос.УстановитьПараметр("НаселенныйПункт", ЧастиАдреса.НаселенныйПункт.Наименование); - Запрос.УстановитьПараметр("НаселенныйПунктСокращение", ЧастиАдреса.НаселенныйПункт.Сокращение); КонецЕсли; - Если ПустаяСтрока(Сокращение) Тогда - УсловиеСокращения = ""; - Иначе - Если ПоискПоПодобию Тогда - УсловиеСокращения = "И Адреса.Сокращение ПОДОБНО &Сокращение СПЕЦСИМВОЛ ""\"" "; - Запрос.УстановитьПараметр("Сокращение", ЗамаскироватьСпецсимволы(Сокращение) + "%"); - Иначе - УсловиеСокращения = "И Адреса.Сокращение = &Сокращение"; - Запрос.УстановитьПараметр("Сокращение", Сокращение); - КонецЕсли; - КонецЕсли; - - Если ПоискПоПодобию Тогда - УсловиеНаименования = "И Адреса.Наименование ПОДОБНО &Наименование СПЕЦСИМВОЛ ""\"" "; - Запрос.УстановитьПараметр("Наименование", ЗамаскироватьСпецсимволы(Наименование) + "%"); - Иначе - УсловиеНаименования = "И Адреса.Наименование = &Наименование"; - Запрос.УстановитьПараметр("Наименование", Наименование); - КонецЕсли; - - Запрос.Текст = Запрос.Текст + " - |ГДЕ - | Адреса.ТипАдресногоЭлемента = &Уровень - | " + УсловиеНаименования + " - | " + УсловиеСокращения + " - |УПОРЯДОЧИТЬ ПО - | Адреса.ПризнакАктуальности, - | - | Адреса.Наименование - |"; + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросСписокАнализаЭлементаАдресаКЛАДР(ЧастиАдреса, Уровень, Наименование, Сокращение, ПоискПоПодобию, ВыбиратьСтрок); Запрос.УстановитьПараметр("Уровень", Уровень); Выборка = Запрос.Выполнить().Выбрать(); - ПредупреждениеНеактуальности = НСтр("ru='Адрес ""%1"" неактуален.'"); + ПредупреждениеНеактуальности = НСтр("ru = 'Адрес ""%1"" неактуален.'"); КартинкаНеактуальности = БиблиотекаКартинок.КонтактнаяИнформацияНеактуально; КартинкаАктуальности = Неопределено; @@ -2769,7 +2223,7 @@ ТекстПредупреждения = СтрЗаменить(ПредупреждениеНеактуальности, "%1", ПолноеНаименование); Пометка = Истина; Картинка = КартинкаНеактуальности; - Иначе + Иначе ТекстПредупреждения = Неопределено; Пометка = Ложь; Картинка = КартинкаАктуальности; @@ -2796,7 +2250,7 @@ Процедура УстановитьНаселенныйПунктАдресаПоКодуКЛАДР(XDTOАдресРФ, КодКлассификатора) МодульКЛАДР = СерверныйМодульКЛАДР(); - Если МодульКЛАДР=Неопределено Тогда + Если МодульКЛАДР = Неопределено Тогда Возврат; КонецЕсли; @@ -2811,7 +2265,7 @@ Процедура УстановитьУлицуАдресаПоКодуКЛАДР(XDTOАдресРФ, КодКлассификатора) МодульКЛАДР = СерверныйМодульКЛАДР(); - Если МодульКЛАДР=Неопределено Тогда + Если МодульКЛАДР = Неопределено Тогда Возврат; КонецЕсли; @@ -2825,15 +2279,21 @@ Процедура ЗаполнитьОшибкиАдресаКЛАДР(XDTOАдресРФ, Результат) МодульКЛАДР = СерверныйМодульКЛАДР(); - Если МодульКЛАДР=Неопределено Тогда + Если МодульКЛАДР = Неопределено Тогда // Нет классификатора КЛАДР Возврат; КонецЕсли; - Если МодульКЛАДР.ЧислоЗаполненныхАдресныхОбъектов()=0 Тогда + РеквизитыПроверки = СписокРеквизитовАдресаКЛАДР(); + + СущностьПоляРегион = "Субъект РФ"; + ИмяРеквизитаРегион = "Регион"; + ПутьXPathРегион = РеквизитыПроверки[ИмяРеквизитаРегион].ПутьXPath; + + Если МодульКЛАДР.ЧислоЗаполненныхАдресныхОбъектов() = 0 Тогда // Классификатор КЛАДР не загружен ни по одному региону - Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath"), - НСтр("ru='Адресный классификатор не загружен.'")); + Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath", СущностьПоляРегион, ПутьXPathРегион), + НСтр("ru = 'Адресный классификатор не загружен.'")); Возврат; КонецЕсли; @@ -2843,33 +2303,31 @@ КодРегиона = КодРегионаКЛАДР(Данные.Регион); Если ПустаяСтрока(КодРегиона) Тогда // Переданное значение - не регион с точки зрения КЛАДР - Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath"), + Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath", СущностьПоляРегион, ПутьXPathРегион), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Регион ""%1"" не является субъектом РФ по классификатору'"), + НСтр("ru = 'Регион ""%1"" не является субъектом РФ по классификатору'"), Данные.Регион)); Возврат; КонецЕсли; // Проверим классификатор на загруженность по региону Если Не МодульКЛАДР.АдресныйЭлементЗагружен(Данные.Регион) Тогда - Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath"), + Результат.Добавить(Новый Структура("СущностьПоля, ПутьXPath", СущностьПоляРегион, ПутьXPathРегион), СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Адресный классификатор по региону ""%1"" не загружен'"), + НСтр("ru = 'Адресный классификатор по региону ""%1"" не загружен'"), Данные.Регион)); Возврат; КонецЕсли; - // Проверим на соответствие частей классификатору + // Проверим на соответсвие частей классификатору СтруктураПроверки = МодульКЛАДР.ПроверитьСоответствиеАдресаКЛАДРу( Данные.Индекс, Данные.Регион, Данные.Район, Данные.Город, Данные.НаселенныйПункт, Данные.Улица, Данные.Дом, Данные.Корпус); - Если СтруктураПроверки=Неопределено Или Не СтруктураПроверки.ЕстьОшибки Тогда + Если СтруктураПроверки = Неопределено Или Не СтруктураПроверки.ЕстьОшибки Тогда // Нет ошибок, адрес корректен Возврат; КонецЕсли; - РеквизитыПроверки = СписокРеквизитовАдресаКЛАДР(); - Для Каждого Элемент Из СтруктураПроверки.СтруктураОшибок Цикл ИмяРеквизита = Элемент.Ключ; Если РеквизитыПроверки.Свойство(ИмяРеквизита) Тогда @@ -2885,7 +2343,7 @@ КонецПроцедуры -Функция КодОбъектаПоЧастямАдресаКЛАДР(ЧастиАдреса, СкрыватьНеактуальные=Ложь) +Функция КодОбъектаПоЧастямАдресаКЛАДР(ЧастиАдреса, СкрыватьНеактуальные = Ложь) Перем ЗначениеЧастиАдреса; // Проверяем от младшего к старшему @@ -2931,7 +2389,7 @@ // Проверяем по классификатору МодульКЛАДР = СерверныйМодульКЛАДР(); - Если МодульКЛАДР=Неопределено Тогда + Если МодульКЛАДР = Неопределено Тогда Возврат Неопределено; КонецЕсли; @@ -2954,21 +2412,9 @@ Функция КодРегионаКЛАДР(ПолноеНаименование) - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 1 - | КодАдресногоОбъектаВКоде КАК Код - |ИЗ - | РегистрСведений.АдресныйКлассификатор - |ГДЕ - | ТипАдресногоЭлемента = 1 - | И КодРайонаВКоде = 0 - | И КодГородаВКоде = 0 - | И КодНаселенногоПунктаВКоде = 0 - | И КодУлицыВКоде = 0 - | - | И Наименование = &Наименование - | И Сокращение = &Сокращение - |"); + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросКодРегионаКЛАДР(); + Параметры = КонтактнаяИнформацияКлиентСервер.НаименованиеСокращение(ПолноеНаименование); Запрос.УстановитьПараметр("Наименование", Параметры.Наименование); Запрос.УстановитьПараметр("Сокращение", Параметры.Сокращение); @@ -2983,21 +2429,10 @@ Функция РегионКодаКЛАДР(Знач Код) - Запрос = Новый Запрос(" - |ВЫБРАТЬ ПЕРВЫЕ 1 - | Наименование + "" "" + Сокращение КАК Регион - |ИЗ - | РегистрСведений.АдресныйКлассификатор - |ГДЕ - | ТипАдресногоЭлемента = 1 - | И КодАдресногоОбъектаВКоде = &Код - | И КодРайонаВКоде = 0 - | И КодГородаВКоде = 0 - | И КодНаселенногоПунктаВКоде = 0 - | И КодУлицыВКоде = 0 - |"); + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросРегионКодаКЛАДР(); - Если ТипЗнч(Код)=Тип("Число") Тогда + Если ТипЗнч(Код) = Тип("Число") Тогда КодЧислом = Код; Иначе ТипЧисло = Новый ОписаниеТипов("Число"); @@ -3014,21 +2449,10 @@ КонецФункции Функция ВсеРегионыКЛАДР() - Запрос = Новый Запрос(" - |ВЫБРАТЬ - | КодАдресногоОбъектаВКоде КАК Код, - | Наименование КАК Наименование, - | Сокращение КАК Сокращение, - | Наименование + "" "" + Сокращение КАК Представление - |ИЗ - | РегистрСведений.АдресныйКлассификатор - |ГДЕ - | ТипАдресногоЭлемента = 1 - | И КодРайонаВКоде = 0 - | И КодГородаВКоде = 0 - | И КодНаселенногоПунктаВКоде = 0 - | И КодУлицыВКоде = 0 - |"); + + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросВсеРегионыКЛАДР(); + Результат = Запрос.Выполнить().Выгрузить(); Результат.Индексы.Добавить("Код"); Результат.Индексы.Добавить("Представление"); @@ -3039,11 +2463,14 @@ Функция ОпределитьПочтовыйИндексАдресаКЛАДР(XDTOАдресРФ) МодульКЛАДР = СерверныйМодульКЛАДР(); - Если МодульКЛАДР<>Неопределено Тогда + Если МодульКЛАДР <> Неопределено Тогда Данные = СтруктураКЛАДРПоАдресуРФ(XDTOАдресРФ); + Индекс = МодульКЛАДР.ПолучитьИндекс( - Данные.Регион, Данные.Район, Данные.Город, Данные.НаселенныйПункт, Данные.Улица, - Данные.Дом, Данные.Корпус); + Данные.Регион, Данные.Район, Данные.Город, Данные.НаселенныйПункт, Данные.Улица, + Данные.Дом, Данные.Корпус + ); + Если Не ПустаяСтрока(Индекс) Тогда Возврат СокрЛП(Индекс); КонецЕсли; @@ -3052,8 +2479,72 @@ Возврат Неопределено; КонецФункции +Функция АдресаПоИндексуКЛАДР(Знач Индекс, Знач ДополнительныеПараметрыПоиска = Неопределено) + + ПараметрыПоиска = Новый Структура("СкрыватьНеактуальные, ВыбиратьСтрок", Ложь, 0); + Если ДополнительныеПараметрыПоиска <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыПоиска, ДополнительныеПараметрыПоиска); + КонецЕсли; + + СкрыватьНеактуальные = ПараметрыПоиска.СкрыватьНеактуальные; + ВыбиратьСтрок = ПараметрыПоиска.ВыбиратьСтрок; + + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросАдресаПоИндексуКЛАДР(ВыбиратьСтрок, СкрыватьНеактуальные); + + Запрос.УстановитьПараметр("ПочтовыйИндекс", СокрЛП(Индекс)); + + Результаты = Запрос.ВыполнитьПакет(); + + // Общая часть представления + Данные = Результаты[2].Выгрузить(); + Строка = Данные[0]; + ОбщаяЧастьПредставления = КонтактнаяИнформацияКлиентСервер.ПолноеНаименование( + Строка.УлицаНаименование, Строка.УлицаСокращение, + Строка.НаселенныйПунктНаименование, Строка.НаселенныйПунктСокращение, + Строка.ГородНаименование, Строка.ГородСокращение, + Строка.РайонНаименование, Строка.РайонСокращение, + Строка.РегионНаименование, Строка.РегионСокращение + ); + ОбщиеПоля = Новый Структура; + Для Каждого Колонка Из Данные.Колонки Цикл + Имя = Колонка.Имя; + Если Не ПустаяСтрока(Строка[Имя]) Тогда + ОбщиеПоля.Вставить(Имя, ""); + КонецЕсли; + КонецЦикла; + + // Весь результат + Данные = Результаты[1].Выгрузить(); + КолонкиДанных = Данные.Колонки; + КолонкиДанных.Вставить(0, "Представление", Новый ОписаниеТипов("Строка") ); + + Для Каждого Строка Из Данные Цикл + // Очищаем общие поля + ЗаполнитьЗначенияСвойств(Строка, ОбщиеПоля); + // По оставшимся полям строим представление + Строка.Представление = КонтактнаяИнформацияКлиентСервер.ПолноеНаименование( + Строка.УлицаНаименование, Строка.УлицаСокращение, + Строка.НаселенныйПунктНаименование, Строка.НаселенныйПунктСокращение, + Строка.ГородНаименование, Строка.ГородСокращение, + Строка.РайонНаименование, Строка.РайонСокращение, + Строка.РегионНаименование, Строка.РегионСокращение + ); + КонецЦикла; + + // Удаляем ненужные колонки + Позиция = КолонкиДанных.Количество() - 1; + Пока Позиция > 3 Цикл + КолонкиДанных.Удалить(Позиция); + Позиция = Позиция - 1; + КонецЦикла; + + Возврат Новый Структура("Данные, ОбщаяЧастьПредставления, СлишкомМногоДанных", Данные, ОбщаяЧастьПредставления, + (ВыбиратьСтрок > 0) И (Данные.Количество() > ВыбиратьСтрок) ); +КонецФункции + // Конструктор таблицы значений -Функция ТаблицаЗначений(СписокКолонок, СписокИндексов="") +Функция ТаблицаЗначений(СписокКолонок, СписокИндексов = "") ТаблицаРезультата = Новый ТаблицаЗначений; Для Каждого КлючЗначение Из (Новый Структура(СписокКолонок)) Цикл @@ -3061,7 +2552,7 @@ КонецЦикла; СтрокиИндексов = СтрЗаменить(СписокИндексов, "|", Символы.ПС); - Для НомерИндекса=1 По СтрЧислоСтрок(СтрокиИндексов) Цикл + Для НомерИндекса = 1 По СтрЧислоСтрок(СтрокиИндексов) Цикл КолонкиИндекса = СокрЛП(СтрПолучитьСтроку(СтрокиИндексов, НомерИндекса)); Для Каждого КлючЗначение Из (Новый Структура(КолонкиИндекса)) Цикл ТаблицаРезультата.Индексы.Добавить(КлючЗначение.Ключ); @@ -3072,7 +2563,7 @@ КонецФункции // Конструктор внутренней структуры элемента адреса -Функция ЭлементАдреснойСтруктуры(Заголовок, ПутьXPath, Значение=Неопределено, Предопределенный=Ложь) +Функция ЭлементАдреснойСтруктуры(Заголовок, ПутьXPath, Значение = Неопределено, Предопределенный = Ложь) Возврат Новый Структура("Заголовок, ПутьXPath, Значение, Предопределенный, Наименование, Сокращение, КодКлассификатора", Заголовок, ПутьXPath, Значение, Предопределенный); КонецФункции @@ -3082,7 +2573,7 @@ Результат = Текст; Спецсимвол = "\"; Служебные = "%_[]^" + Спецсимвол; - Для Индекс=1 По СтрДлина(Служебные) Цикл + Для Индекс = 1 По СтрДлина(Служебные) Цикл Символ = Сред(Служебные, Индекс, 1); Результат = СтрЗаменить(Результат, Символ, Спецсимвол + Символ); КонецЦикла; @@ -3127,7 +2618,7 @@ Дом = Неопределено; Для Каждого Вариант Из ВариантыДанныхДом().ВариантыТипа Цикл Строка = ТаблицаЗданий.Найти(Вариант, "Тип"); - Дом = ?(Строка=Неопределено, Неопределено, Строка.Значение); + Дом = ?(Строка = Неопределено, Неопределено, Строка.Значение); Если Не ПустаяСтрока(Дом) Тогда Прервать; КонецЕсли; @@ -3137,7 +2628,7 @@ Корпус = Неопределено; Для Каждого Вариант Из ВариантыДанныхСтроение().ВариантыТипа Цикл Строка = ТаблицаЗданий.Найти(Вариант, "Тип"); - Корпус = ?(Строка=Неопределено, Неопределено, Строка.Значение); + Корпус = ?(Строка = Неопределено, Неопределено, Строка.Значение); Если Не ПустаяСтрока(Корпус) Тогда Прервать; КонецЕсли; @@ -3147,29 +2638,6 @@ Возврат Результат; КонецФункции -Функция XDTOКонтактнаяИнформацияЗаполнена(Знач XDTOДанные) Экспорт - - Если Не ПустаяСтрока(XDTOДанные.Представление) Тогда - Возврат Истина; - - ИначеЕсли Не ПустаяСтрока(XDTOДанные.Комментарий) Тогда - Возврат Истина; - - Иначе - Состав = XDTOДанные.Состав; - Если Состав <> Неопределено Тогда - Для Каждого СвойстваСостава Из XDTOДанные.Состав.Свойства() Цикл - Если Состав.Установлено(СвойстваСостава) Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - КонецЕсли; - - Возврат Ложь; -КонецФункции - // Внутреннее для сериализации Функция ДесериализацияАдресаОбщая(Знач ЗначенияПолей, Знач Представление, Знач ОжидаемыйТип = Неопределено) @@ -3330,19 +2798,42 @@ Возврат Результат; КонецФункции +Функция XDTOКонтактнаяИнформацияЗаполнена(Знач XDTOДанные) Экспорт + + Если Не ПустаяСтрока(XDTOДанные.Представление) Тогда + Возврат Истина; + + ИначеЕсли Не ПустаяСтрока(XDTOДанные.Комментарий) Тогда + Возврат Истина; + + Иначе + Состав = XDTOДанные.Состав; + Если Состав <> Неопределено Тогда + Для Каждого СвойстваСостава Из XDTOДанные.Состав.Свойства() Цикл + Если Состав.Установлено(СвойстваСостава) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + КонецЕсли; + + Возврат Ложь; +КонецФункции + Процедура ВставитьЗданиеПомещение(XDTOАдрес, Тип, Значение) Если ПустаяСтрока(Значение) Тогда Возврат; КонецЕсли; Запись = XDTOАдрес.Получить( КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(Тип) ); - Если Запись=Неопределено Тогда + Если Запись = Неопределено Тогда Запись = XDTOАдрес.ДопАдрЭл.Добавить( ФабрикаXDTO.Создать(XDTOАдрес.ДопАдрЭл.ВладеющееСвойство.Тип) ); Запись.Номер = ФабрикаXDTO.Создать(Запись.Свойства().Получить("Номер").Тип); Запись.Номер.Значение = Значение; КодТипа = КонтактнаяИнформацияКлиентСерверПовтИсп.КодСериализацииОбъектаАдресации(Тип); - Если КодТипа=Неопределено Тогда + Если КодТипа = Неопределено Тогда КодТипа = Тип; КонецЕсли; Запись.Номер.Тип = КодТипа @@ -3366,7 +2857,7 @@ КонецФункции Функция СвРайМО(АдресРФ) - Если АдресРФ.СвРайМО<>Неопределено Тогда + Если АдресРФ.СвРайМО <> Неопределено Тогда Возврат АдресРФ.СвРайМО; КонецЕсли; @@ -3383,110 +2874,21 @@ Результат.Представление = Представление; ДанныеАнализа = ЧастиАдресаТаблицей(Представление); - Если ДанныеАнализа.Количество()=0 Тогда + Если ДанныеАнализа.Количество() = 0 Тогда Возврат Результат; КонецЕсли; Адрес = Результат.Состав; - Запрос = Новый Запрос(" - |ВЫБРАТЬ - | ДанныеАдреса.Позиция0 КАК Позиция0, - | ДанныеАдреса.Позиция КАК Позиция, - | ДанныеАдреса.Значение КАК Значение, - | ДанныеАдреса.Наименование КАК Наименование, - | ДанныеАдреса.Сокращение КАК Сокращение, - | ДанныеАдреса.Начало КАК Начало, - | ДанныеАдреса.Длина КАК Длина - |ПОМЕСТИТЬ - | ДанныеАдреса - |ИЗ - | &ДанныеАдреса КАК ДанныеАдреса - |ИНДЕКСИРОВАТЬ ПО - | Позиция0, Позиция, Наименование, Сокращение - |;////////////////////////////////////////////////////////////////////////////// - | - |ВЫБРАТЬ - | ДанныеАдреса.Позиция КАК Позиция, - | ДанныеАдреса.Значение КАК Значение, - | ДанныеАдреса.Наименование КАК Наименование, - | ДанныеАдреса.Сокращение КАК Сокращение, - | - | ДанныеАдреса.Начало КАК Начало, - | ДанныеАдреса.Длина КАК Длина, - | ЛОЖЬ КАК Обработано, - | - | МИНИМУМ(АдресныйКлассификатор.ТипАдресногоЭлемента) КАК УровеньПоКлассификатору, - | ВЫБОР - | КОГДА МИНИМУМ(АдресныйКлассификатор.ТипАдресногоЭлемента) ЕСТЬ NULL ТОГДА ЛОЖЬ - | ИНАЧЕ ИСТИНА - | КОНЕЦ КАК НайденоПоКлассификатору, - | - | МИНИМУМ(АдресныеСокращения.Уровень) КАК УровеньПоСокращениям, - | ВЫБОР - | КОГДА МИНИМУМ(АдресныеСокращения.Уровень) ЕСТЬ NULL ТОГДА ЛОЖЬ - | ИНАЧЕ ИСТИНА - | КОНЕЦ КАК НайденоПоСокращениям, - | - | ВЫБОР - | КОГДА НЕ МИНИМУМ(СтраныМира.Наименование) ЕСТЬ NULL ТОГДА ИСТИНА - | КОГДА ДанныеАдреса.Значение В (&СтраныКлассификатора) ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК НайденоПоСтранамМира, - | - | ВЫБОР - | КОГДА ДанныеАдреса.Значение=СтранаРоссия.Наименование ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК ЭтоСтранаРоссия, - | - | ВЫБОР - | КОГДА ДанныеАдреса.Наименование ПОДОБНО ""[0-9][0-9][0-9][0-9][0-9][0-9]"" ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК НайденоПоИндексу - | - |ИЗ - | ДанныеАдреса КАК ДанныеАдреса - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныйКлассификатор КАК АдресныйКлассификатор - |ПО - | АдресныйКлассификатор.Наименование=ДанныеАдреса.Наименование - | И АдресныйКлассификатор.Сокращение=ДанныеАдреса.Сокращение - | И АдресныйКлассификатор.ТипАдресногоЭлемента<=5 - | И АдресныйКлассификатор.ТипАдресногоЭлемента>=ДанныеАдреса.Позиция0 - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.АдресныеСокращения КАК АдресныеСокращения - |ПО - | АдресныеСокращения.Сокращение=ДанныеАдреса.Сокращение - | И АдресныеСокращения.Уровень<=5 - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | Справочник.СтраныМира КАК СтраныМира - |ПО - | СтраныМира.Наименование=ДанныеАдреса.Значение - | - |ЛЕВОЕ СОЕДИНЕНИЕ - | Справочник.СтраныМира КАК СтранаРоссия - |ПО - | СтранаРоссия.Ссылка = ЗНАЧЕНИЕ(Справочник.СтраныМира.Россия) - | - |СГРУППИРОВАТЬ ПО - | СтранаРоссия.Наименование, - | ДанныеАдреса.Позиция, - | ДанныеАдреса.Значение, - | ДанныеАдреса.Наименование, - | ДанныеАдреса.Сокращение, - | ДанныеАдреса.Начало, - | ДанныеАдреса.Длина - | - |УПОРЯДОЧИТЬ ПО - | ДанныеАдреса.Позиция УБЫВ - |"); - + МодульКЛАДР = СерверныйМодульКЛАДР(); + Запрос = МодульКЛАДР.ЗапросДесериализацияАдресаПоПредставлениюКЛАДР("Справочник.СтраныМира"); + + НаименованиеРоссии = СокрЛП(Справочники.СтраныМира.Россия.Наименование); + Классификатор = Справочники.СтраныМира.ТаблицаКлассификатора(); Запрос.УстановитьПараметр("СтраныКлассификатора", Классификатор.ВыгрузитьКолонку("Наименование") ); Запрос.УстановитьПараметр("ДанныеАдреса", ДанныеАнализа); + Запрос.УстановитьПараметр("НаименованиеРоссии", НаименованиеРоссии); РезультатАнализа = Запрос.Выполнить().Выгрузить(); @@ -3524,7 +2926,7 @@ УстановитьЧастьВАдресеПоУровнюКЛАДР(АдресРФ, Уровень, Строка.Значение); Строка.Обработано = Истина; // Контроль повторной обработки - Если ОбработанныеУровни[Уровень]<>Неопределено Тогда + Если ОбработанныеУровни[Уровень] <> Неопределено Тогда ВведеноВСвободнойФорме = Истина; КонецЕсли; @@ -3533,14 +2935,14 @@ УстановитьЧастьВАдресеПоУровнюКЛАДР(АдресРФ, Уровень, Строка.Значение); Строка.Обработано = Истина; // Контроль повторной обработки - Если ОбработанныеУровни[Уровень]<>Неопределено Тогда + Если ОбработанныеУровни[Уровень] <> Неопределено Тогда ВведеноВСвободнойФорме = Истина; КонецЕсли; Иначе // Проверка на квартиру или здание Тип = СокрЛП(СтрЗаменить(Строка.Наименование, "№", "")); - Если КонтактнаяИнформацияКлиентСерверПовтИсп.КодСериализацииОбъектаАдресации(Тип)<>Неопределено Тогда + Если КонтактнаяИнформацияКлиентСерверПовтИсп.КодСериализацииОбъектаАдресации(Тип) <> Неопределено Тогда // Вставляем в начало, так как порядок результата запроса у нас обратный НоваяСтрока = ТаблицаЗданийПомещений.Вставить(0); НоваяСтрока.Значение = СокрЛП(СтрЗаменить(Строка.Сокращение, "№", "")); @@ -3554,13 +2956,13 @@ // Смотрим на страну разбора Если ЭтоРоссийскийАдрес Тогда - Адрес.Страна = СокрЛП(Справочники.СтраныМира.Россия.Наименование); + Адрес.Страна = НаименованиеРоссии; Адрес.Состав = АдресРФ; ЗданияИПомещения = Новый Структура("Здания, Помещения", ТаблицаЗданийПомещений, ТаблицаЗданийПомещений); ЗданияИПомещенияАдреса(АдресРФ, ЗданияИПомещения); - Если ВведеноВСвободнойФорме Или РезультатАнализа.Найти(Ложь, "Обработано")<>Неопределено Тогда + Если ВведеноВСвободнойФорме Или РезультатАнализа.Найти(Ложь, "Обработано") <> Неопределено Тогда // Что-то осталось, считаем адресом в свободной форме АдресРФ.Адрес_По_Документу = Представление; КонецЕсли; @@ -3569,7 +2971,7 @@ КонецЕсли; // Адрес за пределами РФ - Если СтрокаСтраны=Неопределено Тогда + Если СтрокаСтраны = Неопределено Тогда Адрес.Состав = Представление; Иначе Адрес.Страна = СтрокаСтраны.Значение; @@ -3578,10 +2980,10 @@ Позиция = СтрокаСтраны.Начало + СтрокаСтраны.Длина; Длина = СтрДлина(Представление); Разделители = "," + Символы.ПС; - Пока Позиция<=Длина И Найти(Разделители, Сред(Представление, Позиция, 1))<=0 Цикл + Пока Позиция <= Длина И Найти(Разделители, Сред(Представление, Позиция, 1)) <= 0 Цикл Позиция = Позиция + 1; КонецЦикла; - Пока Позиция<=Длина И Найти(Разделители, Сред(Представление, Позиция, 1))>0 Цикл + Пока Позиция <= Длина И Найти(Разделители, Сред(Представление, Позиция, 1)) > 0 Цикл Позиция = Позиция + 1; КонецЦикла; Адрес.Состав = СокрЛП( Лев(Представление, СтрокаСтраны.Начало -1 ) + " " + Сред(Представление, Позиция) ); @@ -3624,7 +3026,7 @@ Строка.Длина = Часть.Длина; Позиция = СтрДлина(Значение); - Пока Позиция>0 Цикл + Пока Позиция > 0 Цикл Символ = Сред(Значение, Позиция, 1); Если ПустаяСтрока(Символ) Тогда Строка.Наименование = Лев(Значение, Позиция-1); @@ -3643,7 +3045,7 @@ Возврат Результат; КонецФункции -Функция СловаТекстаТаблицей(Знач Текст, Знач Разделители=Неопределено) +Функция СловаТекстаТаблицей(Знач Текст, Знач Разделители = Неопределено) НачалоСлова = 0; Состояние = 0; @@ -3657,14 +3059,14 @@ Колонки.Добавить("Начало", ТипЧисло); Колонки.Добавить("Длина", ТипЧисло); - Для Позиция=1 По СтрДлина(Текст) Цикл + Для Позиция = 1 По СтрДлина(Текст) Цикл ТекущийСимвол = Сред(Текст, Позиция, 1); - ЭтоРазделитель = ?(Разделители=Неопределено, ПустаяСтрока(ТекущийСимвол), Найти(Разделители, ТекущийСимвол)>0); + ЭтоРазделитель = ?(Разделители = Неопределено, ПустаяСтрока(ТекущийСимвол), Найти(Разделители, ТекущийСимвол) > 0); - Если Состояние=0 И (Не ЭтоРазделитель) Тогда + Если Состояние = 0 И (Не ЭтоРазделитель) Тогда НачалоСлова = Позиция; Состояние = 1; - ИначеЕсли Состояние=1 И ЭтоРазделитель Тогда + ИначеЕсли Состояние = 1 И ЭтоРазделитель Тогда Строка = Результат.Добавить(); Строка.Начало = НачалоСлова; Строка.Длина = Позиция-НачалоСлова; @@ -3673,7 +3075,7 @@ КонецЕсли; КонецЦикла; - Если Состояние=1 Тогда + Если Состояние = 1 Тогда Строка = Результат.Добавить(); Строка.Начало = НачалоСлова; Строка.Длина = Позиция-НачалоСлова; @@ -3686,15 +3088,15 @@ Процедура УстановитьЧастьВАдресеПоУровнюКЛАДР(XDTOАдресРФ, Знач Уровень, Знач Значение) // XPath - Если Уровень=1 Тогда + Если Уровень = 1 Тогда Путь = "СубъектРФ"; - ИначеЕсли Уровень=2 Тогда + ИначеЕсли Уровень = 2 Тогда Путь = "СвРайМО/Район"; - ИначеЕсли Уровень=3 Тогда + ИначеЕсли Уровень = 3 Тогда Путь = "Город"; - ИначеЕсли Уровень=4 Тогда + ИначеЕсли Уровень = 4 Тогда Путь = "НаселПункт"; - ИначеЕсли Уровень=5 Тогда + ИначеЕсли Уровень = 5 Тогда Путь = "Улица"; Иначе Возврат; @@ -3814,9 +3216,9 @@ КонецФункции // Возвращает первую подстроку из цифр в строке. Параметр ПозицияНачала изменяется на первую не цифру -Функция НайтиПодстрокуЦифр(Текст, ПозицияНачала=Неопределено, ДопустимоКромеЦифр="") +Функция НайтиПодстрокуЦифр(Текст, ПозицияНачала = Неопределено, ДопустимоКромеЦифр = "") - Если ПозицияНачала=Неопределено Тогда + Если ПозицияНачала = Неопределено Тогда ПозицияНачала = 1; КонецЕсли; @@ -3824,9 +3226,9 @@ ПозицияКонца = СтрДлина(Текст); ПоискНачала = Истина; - Пока ПозицияНачала<=ПозицияКонца Цикл + Пока ПозицияНачала <= ПозицияКонца Цикл Символ = Сред(Текст, ПозицияНачала, 1); - ЭтоЦифра = Символ>="0" И Символ<="9"; + ЭтоЦифра = Символ >= "0" И Символ <= "9"; Если ПоискНачала Тогда Если ЭтоЦифра Тогда @@ -3834,7 +3236,7 @@ ПоискНачала = Ложь; КонецЕсли; Иначе - Если ЭтоЦифра Или Найти(ДопустимоКромеЦифр, Символ)>0 Тогда + Если ЭтоЦифра Или Найти(ДопустимоКромеЦифр, Символ) > 0 Тогда Результат = Результат + Символ; Иначе Прервать; @@ -3849,7 +3251,7 @@ КонецФункции -Функция СократитьНеЦифры(Текст, ДопустимоКромеЦифр="", Направление=Истина) +Функция СократитьНеЦифры(Текст, ДопустимоКромеЦифр = "", Направление = Истина) Длина = СтрДлина(Текст); Если Направление Тогда @@ -3864,9 +3266,9 @@ Шаг = -1; КонецЕсли; - Пока Индекс<>Конец Цикл + Пока Индекс <> Конец Цикл Символ = Сред(Текст, Индекс, 1); - ЭтоЦифра = (Символ>="0" И Символ<="9") Или Найти(ДопустимоКромеЦифр, Символ)=0; + ЭтоЦифра = (Символ >= "0" И Символ <= "9") Или Найти(ДопустимоКромеЦифр, Символ) = 0; Если ЭтоЦифра Тогда Прервать; КонецЕсли; @@ -3890,14 +3292,14 @@ СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); - Если ЧислоСвойств=1 Тогда + Если ЧислоСвойств = 1 Тогда Возврат ОбъектXTDO.Получить(СтрокаСвойств); КонецЕсли; - Результат = ?(ЧислоСвойств=0, Неопределено, ОбъектXTDO); - Для Индекс=1 По ЧислоСвойств Цикл + Результат = ?(ЧислоСвойств = 0, Неопределено, ОбъектXTDO); + Для Индекс = 1 По ЧислоСвойств Цикл Результат = Результат.Получить(СтрПолучитьСтроку(СтрокаСвойств, Индекс)); - Если Результат=Неопределено Тогда + Если Результат = Неопределено Тогда Прервать; КонецЕсли; КонецЦикла; @@ -3912,16 +3314,16 @@ СтрокаСвойств = СтрЗаменить(СтрЗаменить(XPath, "/", Символы.ПС), Символы.ПС + Символы.ПС, "/"); ЧислоСвойств = СтрЧислоСтрок(СтрокаСвойств); - Если ЧислоСвойств=1 Тогда + Если ЧислоСвойств = 1 Тогда ОбъектXTDO.Установить(СтрокаСвойств, Значение); Возврат; - ИначеЕсли ЧислоСвойств<1 Тогда + ИначеЕсли ЧислоСвойств < 1 Тогда Возврат; КонецЕсли; РодительскийОбъект = Неопределено; ТекущийОбъект = ОбъектXTDO; - Для Индекс=1 По ЧислоСвойств Цикл + Для Индекс = 1 По ЧислоСвойств Цикл ТекущееИмя = СтрПолучитьСтроку(СтрокаСвойств, Индекс); Если ТекущийОбъект.Установлено(ТекущееИмя) Тогда @@ -3930,12 +3332,12 @@ Иначе НовыйТип = ТекущийОбъект.Свойства().Получить(ТекущееИмя).Тип; ТипТипа = ТипЗнч(НовыйТип); - Если ТипТипа=Тип("ТипОбъектаXDTO") Тогда + Если ТипТипа = Тип("ТипОбъектаXDTO") Тогда НовыйОбъект = ФабрикаXDTO.Создать(НовыйТип); ТекущийОбъект.Установить(ТекущееИмя, НовыйОбъект); РодительскийОбъект = ТекущийОбъект; ТекущийОбъект = НовыйОбъект; - ИначеЕсли ТипТипа=Тип("ТипЗначенияXDTO") Тогда + ИначеЕсли ТипТипа = Тип("ТипЗначенияXDTO") Тогда // Непосредственное значение ТекущийОбъект.Установить(ТекущееИмя, Значение); РодительскийОбъект = Неопределено; @@ -3944,7 +3346,7 @@ КонецЕсли; КонецЦикла; - Если РодительскийОбъект<>Неопределено Тогда + Если РодительскийОбъект <> Неопределено Тогда РодительскийОбъект.Установить(ТекущееИмя, Значение); КонецЕсли; diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйВызовСервера/Module.bsl index 1acd68ccb..1ed945f12 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйВызовСервера/Module.bsl @@ -43,6 +43,14 @@ Возврат КонтактнаяИнформацияXML.ПривестиКонтактнуюИнформациюXML(Данные); КонецФункции +// Возвращает список идентификаторов строк доступных для копирования в текущий адресов +// +Функция ДоступныеДляКопированияАдреса(Знач ЗначенияПолейДляАнализа, Знач ВидАдреса) Экспорт + + Возврат УправлениеКонтактнойИнформацией.ДоступныеДляКопированияАдреса(ЗначенияПолейДляАнализа, ВидАдреса); + +КонецФункции + // Возвращает найденную ссылку или создает новую страну мира и возвращает ссылку на нее // Функция СтранаМираПоДаннымКлассификатора(Знач КодСтраны) Экспорт diff --git a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйПовтИсп/Module.bsl index fd79b98f0..b915a5a22 100644 --- a/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/КонтактнаяИнформацияСлужебныйПовтИсп/Module.bsl @@ -647,7 +647,7 @@ // Функция XSLT_ИнтерпретацияРазличияXMLКонтактнойИнформации(Знач ТипКонтактнойИнформации) Экспорт - Если ТипЗнч(ТипКонтактнойИнформации)<>Тип("Строка") Тогда + Если ТипЗнч(ТипКонтактнойИнформации) <> Тип("Строка") Тогда ТипКонтактнойИнформации = ТипКонтактнойИнформации.Метаданные().Имя; КонецЕсли; @@ -699,7 +699,7 @@ КодыРегионов = Новый ТекстовыйДокумент; ВсеРегионы = КонтактнаяИнформацияСлужебный.ВсеРегионы(); - Если ВсеРегионы<>Неопределено Тогда + Если ВсеРегионы <> Неопределено Тогда Для Каждого Строка Из ВсеРегионы Цикл КодыРегионов.ДобавитьСтроку("<data:item data:code=""" + Формат(Строка.Код, "ЧН=; ЧГ=") + """>" + Строка.Представление + "</data:item>"); КонецЦикла; @@ -721,7 +721,7 @@ |<xsl:output method=""xml"" omit-xml-declaration=""yes"" indent=""yes"" encoding=""utf-8""/> | " + XSLT_ШаблоныСтроковыхФункций() + " | - | <xsl:variable name=""local-country"">РОССИЯ</xsl:variable> + | <xsl:variable name=""local-сountry"">РОССИЯ</xsl:variable> | | <xsl:variable name=""presentation"" select=""tns:Structure/tns:Property[@name='Представление']/tns:Value/text()"" /> | @@ -747,7 +747,7 @@ | <xsl:attribute name=""Страна""> | <xsl:choose> | <xsl:when test=""0=count($country)""> - | <xsl:value-of select=""$local-country"" /> + | <xsl:value-of select=""$local-сountry"" /> | </xsl:when> | <xsl:otherwise> | <xsl:value-of select=""$country"" /> @@ -759,7 +759,7 @@ | <xsl:when test=""0=count($country)""> | <xsl:apply-templates select=""/"" mode=""domestic"" /> | </xsl:when> - | <xsl:when test=""$country-upper=$local-country""> + | <xsl:when test=""$country-upper=$local-сountry""> | <xsl:apply-templates select=""/"" mode=""domestic"" /> | </xsl:when> | <xsl:otherwise> diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl new file mode 100644 index 000000000..8305b2fdd --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/Module.bsl @@ -0,0 +1,16 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Контроль динамического обновления конфигурации" +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Проверить, что информационная база была обновлена динамически. +// +Функция КонфигурацияБДБылаИзмененаДинамически() Экспорт + + Возврат КонфигурацияБазыДанныхИзмененаДинамически(); + +КонецФункции + diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo similarity index 75% rename from SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo rename to SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo index 5a2a1f40d..f0608d9fc 100644 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/КонтрольДинамическогоОбновленияКонфигурации.mdo +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера/КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="33343620-673e-4aa3-9e58-c6a25f738001"> - <name>КонтрольДинамическогоОбновленияКонфигурации</name> + <name>КонтрольДинамическогоОбновленияКонфигурацииВызовСервера</name> <synonym> <key>ru</key> - <value>Контроль динамического обновления конфигурации</value> + <value>Контроль динамического обновления конфигурации вызов сервера</value> </synonym> <server>true</server> <serverCall>true</serverCall> diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl index 030faf26b..10fdc3271 100644 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииГлобальный/Module.bsl @@ -11,21 +11,6 @@ // Процедура ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ() Экспорт - Если КонтрольДинамическогоОбновленияКонфигурации.КонфигурацияБДБылаИзмененаДинамически() Тогда - - ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ"); - - ТекстСообщения = НСтр("ru = 'В конфигурацию информационной базы внесены изменения. - |Для дальнейшей работы рекомендуется перезапустить программу. - |Перезапустить?'"); - Ответ = Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Да Тогда - СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); - ЗавершитьРаботуСистемы(Истина, Истина); - КонецЕсли; - - ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); // раз в 20 минут - - КонецЕсли; + КонтрольДинамическогоОбновленияКонфигурацииКлиент.ОбработчикОжиданияПроверкиДинамическогоОбновления(); -КонецПроцедуры +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl index 51ee21717..b608fa555 100644 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииКлиент/Module.bsl @@ -4,13 +4,51 @@ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Обработчик события ПриНачалеРаботыСистемы вызывается -// для выполнения действий, требуемых для подсистемы -// "Контроль динамического обновления конфигурации". +// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. +// Вызывается после завершения действий ПриНачалеРаботыСистемы. +// Используется для подключения обработчиков ожидания, которые не должны вызываться +// в случае интерактивных действий перед и при начале работы системы. // -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +Процедура ПослеНачалаРаботыСистемы() Экспорт + ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); // раз в 20 минут + КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Обработчик ожидания проверяет, что информационная база была обновлена динамически, и +// сообщает об этом пользователю. +// +Процедура ОбработчикОжиданияПроверкиДинамическогоОбновления() Экспорт + + Если Не КонтрольДинамическогоОбновленияКонфигурацииВызовСервера.КонфигурацияБДБылаИзмененаДинамически() Тогда + Возврат; + КонецЕсли; + + ОтключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ"); + + ТекстСообщения = НСтр("ru = 'В конфигурацию информационной базы внесены изменения. + |Для дальнейшей работы рекомендуется перезапустить программу. + |Перезапустить?'"); + + ОписаниеОповещения = Новый ОписаниеОповещения("ОбработчикОжиданияПроверкиДинамическогоОбновленияЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстСообщения, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Обработчик оповещения, вызываемый из процедуры ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ +// +Процедура ОбработчикОжиданияПроверкиДинамическогоОбновленияЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(Истина, Истина); + КонецЕсли; + + ПодключитьОбработчикОжидания("ОбработчикОжиданияПроверкиДинамическогоИзмененияИБ", 20 * 60); // раз в 20 минут + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl similarity index 64% rename from SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl rename to SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl index 39960aaf5..7e88e177e 100644 --- a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/Module.bsl @@ -3,17 +3,6 @@ // //////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Проверить, что информационная база была обновлена динамически. -// -Функция КонфигурацияБДБылаИзмененаДинамически() Экспорт - - Возврат КонфигурацияБазыДанныхИзмененаДинамически(); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -23,7 +12,7 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( "КонтрольДинамическогоОбновленияКонфигурацииКлиент"); КонецПроцедуры diff --git a/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo new file mode 100644 index 000000000..8b0f2e86a --- /dev/null +++ b/SSL/src/CommonModules/КонтрольДинамическогоОбновленияКонфигурацииСлужебный/КонтрольДинамическогоОбновленияКонфигурацииСлужебный.mdo @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f1bc5034-a4b5-4fa9-97db-d43c2b7e8d36"> + <name>КонтрольДинамическогоОбновленияКонфигурацииСлужебный</name> + <synonym> + <key>ru</key> + <value>Контроль динамического обновления конфигурации служебный</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl index d2523e8b3..2bef582a6 100644 --- a/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/КурсыВалютСлужебныйВМоделиСервиса/Module.bsl @@ -15,21 +15,23 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "КурсыВалютСлужебныйВМоделиСервиса"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( "КурсыВалютСлужебныйВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "КурсыВалютСлужебныйВМоделиСервиса"); КонецЕсли; - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "КурсыВалютСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( + "КурсыВалютСлужебныйВМоделиСервиса"); + КонецЕсли; КонецПроцедуры @@ -243,7 +245,7 @@ // Процедура ПослеЗагрузкиДанныхИзДругойМодели() Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда //Создаем связи между разделенными и неразделенными валютами, копируем курсы ОбновитьКурсыВалют(); КонецЕсли; diff --git a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl index 2b6d9806b..efec4fe42 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяГлобальный/Module.bsl @@ -6,14 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Открывает форму текущих напоминаний пользователя при начале работы системы. -// -Процедура ПроверитьТекущиеНапоминанияПриЗапуске() Экспорт - - ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", 60, Истина); // через 60 секунд после запуска клиента - -КонецПроцедуры - // Открывает форму текущих напоминаний пользователя. // Процедура ПроверитьТекущиеНапоминания() Экспорт @@ -34,9 +26,3 @@ ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", ИнтервалСледующейПроверки, Истина); КонецПроцедуры - -// Сбрасывает таймер проверки текущих напоминаний и выполняет проверку немедленно. -Процедура СброситьТаймерПроверкиТекущихОповещений() Экспорт - ОтключитьОбработчикОжидания("ПроверитьТекущиеНапоминания"); - ПроверитьТекущиеНапоминания(); -КонецПроцедуры diff --git a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl index f25e97199..49aa6f077 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяКлиент/Module.bsl @@ -16,20 +16,6 @@ ОтключитьОбработчикОжидания("ПроверитьТекущиеНапоминания"); КонецПроцедуры -// Активизирует обработчик ожидания, проверяющий текущие напоминания пользователя. -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат; - КонецЕсли; - - Если ПараметрыРаботыКлиента.НастройкиНапоминаний.ИспользоватьНапоминания Тогда - ПроверитьТекущиеНапоминанияПриЗапуске(); - КонецЕсли; - -КонецПроцедуры - // Создает новое напоминание на указанное время. // // Параметры: @@ -65,9 +51,32 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Активизирует обработчик ожидания, проверяющий текущие напоминания пользователя. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + Возврат; + КонецЕсли; + + Если ПараметрыРаботыКлиента.НастройкиНапоминаний.ИспользоватьНапоминания Тогда + ПодключитьОбработчикОжидания("ПроверитьТекущиеНапоминания", 60, Истина); // через 60 секунд после запуска клиента + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Сбрасывает таймер проверки текущих напоминаний и выполняет проверку немедленно. +Процедура СброситьТаймерПроверкиТекущихОповещений() Экспорт + ОтключитьОбработчикОжидания("ПроверитьТекущиеНапоминания"); + ПроверитьТекущиеНапоминания(); +КонецПроцедуры + // Открывает форму оповещения Процедура ОткрытьФормуОповещения() Экспорт ФормаОповещения = НапоминанияПользователяКлиентПовтИсп.ПолучитьФормуОповещения(); diff --git a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl index 4aa9f41d9..1b193f5b6 100644 --- a/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НапоминанияПользователяСлужебный/Module.bsl @@ -39,7 +39,7 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( "НапоминанияПользователяКлиент"); // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. @@ -54,19 +54,6 @@ КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ДобавитьПараметрыРаботыКлиента(Параметры) Экспорт - - Параметры.Вставить("НастройкиНапоминаний", - Новый ФиксированнаяСтруктура(ПолучитьНастройкиНапоминаний())); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -645,8 +632,8 @@ Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске(Параметры) Экспорт Параметры.Вставить("НастройкиНапоминаний", - Новый ФиксированнаяСтруктура(ПолучитьНастройкиНапоминаний())); - + Новый ФиксированнаяСтруктура("ИспользоватьНапоминания", ПолучитьНастройкиНапоминаний().ИспользоватьНапоминания)); + КонецПроцедуры // Заполняет структуру параметров, необходимых для работы клиентского кода @@ -657,6 +644,7 @@ // Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем(Параметры) Экспорт - ДобавитьПараметрыРаботыКлиента(Параметры); + Параметры.Вставить("НастройкиНапоминаний", + Новый ФиксированнаяСтруктура(ПолучитьНастройкиНапоминаний())); КонецПроцедуры diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl index a1656b3fc..94634cd19 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовКлиент/Module.bsl @@ -39,51 +39,102 @@ Возврат; КонецЕсли; - Если Не ПроверитьСписокПередОперацией(СписокРеквизит) Тогда + Параметры = Новый Структура; + Параметры.Вставить("СписокРеквизит", СписокРеквизит); + Параметры.Вставить("СписокЭлемент", СписокЭлемент); + Параметры.Вставить("Направление", Направление); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПереместитьЭлементПроверкаВыполнена", ЭтотОбъект, Параметры); + + ПроверитьСписокПередОперацией(ОписаниеОповещения, СписокРеквизит); + +КонецПроцедуры + +Процедура ПереместитьЭлементПроверкаВыполнена(РезультатПроверки, ДополнительныеПараметры) Экспорт + + Если РезультатПроверки <> Истина Тогда Возврат; КонецЕсли; + СписокЭлемент = ДополнительныеПараметры.СписокЭлемент; + СписокРеквизит = ДополнительныеПараметры.СписокРеквизит; + Направление = ДополнительныеПараметры.Направление; + ОтображениеСписком = (СписокЭлемент.Отображение = ОтображениеТаблицы.Список); ТекстОшибки = НастройкаПорядкаЭлементовСлужебныйВызовСервера.ИзменитьПорядокЭлементов( СписокЭлемент.ТекущиеДанные.Ссылка, СписокРеквизит, ОтображениеСписком, Направление); Если Не ПустаяСтрока(ТекстОшибки) Тогда - Предупреждение(ТекстОшибки); + ПоказатьПредупреждение(, ТекстОшибки); КонецЕсли; СписокЭлемент.Обновить(); КонецПроцедуры -Функция ПроверитьСписокПередОперацией(СписокРеквизит) +Процедура ПроверитьСписокПередОперацией(ОбработчикРезультата, СписокРеквизит) + + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("СписокРеквизит", СписокРеквизит); Если Не СортировкаВСпискеУстановленаПравильно(СписокРеквизит) Тогда - Предупреждение(НСтр("ru = 'Для изменения порядка элементов необходимо настроить сортировку - |списка таким образом, чтобы поле ""Порядок"" находилось на первой - |позиции, и вид сортировки был установлен ""По возрастанию"".'")); - Возврат Ложь; + ТекстВопроса = НСтр("ru = 'Для изменения порядка элементов необходимо настроить сортировку списка + |по полю ""Порядок"". Настроить необходимую сортировку?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьСписокПередОперациейОтветПоСортировкеПолучен", ЭтотОбъект, Параметры); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Настроить'")); + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Не настраивать'")); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да); + Возврат; КонецЕсли; - Если СписокСодержитГруппуОтборов(СписокРеквизит) Тогда - Предупреждение(НСтр("ru = 'Для изменения порядка элементов у списка необходимо отключить группы отборов.'")); - Возврат Ложь; + ПереместитьЭлементПроверкаВыполнена(Истина, ОбработчикРезультата.ДополнительныеПараметры); + +КонецПроцедуры + +Процедура ПроверитьСписокПередОперациейОтветПоСортировкеПолучен(РезультатОтвета, ДополнительныеПараметры) Экспорт + + Если РезультатОтвета <> КодВозвратаДиалога.Да Тогда + Возврат; КонецЕсли; - Для Каждого ЭлементГруппировки Из СписокРеквизит.Группировка.Элементы Цикл - Если ЭлементГруппировки.Использование Тогда - Предупреждение(НСтр("ru = 'Для изменения порядка элементов необходимо отключить все группировки.'")); - Возврат Ложь; + СписокРеквизит = ДополнительныеПараметры.СписокРеквизит; + + ПользовательскиеНастройкиПорядка = Неопределено; + Для Каждого Элемент Из СписокРеквизит.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл + Если ТипЗнч(Элемент) = Тип("ПорядокКомпоновкиДанных") Тогда + ПользовательскиеНастройкиПорядка = Элемент; + Прервать; КонецЕсли; КонецЦикла; - Возврат Истина; + ОбщегоНазначенияКлиентСервер.Проверить(ПользовательскиеНастройкиПорядка <> Неопределено, НСтр("ru = 'Пользовательская настройка порядка не найдена.'")); -КонецФункции + ПользовательскиеНастройкиПорядка.Элементы.Очистить(); + Элемент = ПользовательскиеНастройкиПорядка.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); + Элемент.Использование = Истина; + Элемент.Поле = Новый ПолеКомпоновкиДанных("РеквизитДопУпорядочивания"); + Элемент.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; + +КонецПроцедуры -Функция СортировкаВСпискеУстановленаПравильно(СписокРеквизит) +Функция СортировкаВСпискеУстановленаПравильно(Список) - ЭлементыПорядка = СписокРеквизит.Порядок.Элементы; + ПользовательскиеНастройкиПорядка = Неопределено; + Для Каждого Элемент Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл + Если ТипЗнч(Элемент) = Тип("ПорядокКомпоновкиДанных") Тогда + ПользовательскиеНастройкиПорядка = Элемент; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ПользовательскиеНастройкиПорядка = Неопределено Тогда + Возврат Истина; + КонецЕсли; + + ЭлементыПорядка = ПользовательскиеНастройкиПорядка.Элементы; // Найдем первый используемый элемент порядка Элемент = Неопределено; @@ -111,14 +162,3 @@ Возврат Ложь; КонецФункции - -Функция СписокСодержитГруппуОтборов(Список) - Для Каждого Отбор Из Список.Отбор.Элементы Цикл - Если Не Отбор.Использование Тогда - Продолжить; - ИначеЕсли ТипЗнч(Отбор) <> Тип("ЭлементОтбораКомпоновкиДанных") Тогда - Возврат Истина; - КонецЕсли; - КонецЦикла; - Возврат Ложь; -КонецФункции diff --git a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl index b9a483b90..e00a8932f 100644 --- a/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl +++ b/SSL/src/CommonModules/НастройкаПорядкаЭлементовСлужебный/Module.bsl @@ -244,7 +244,7 @@ // Копирует отборы динамического списка в построитель запроса. Недоступные в построителе поля игнорируются. Процедура СкопироватьОтборы(ПостроительЗапроса, ДинамическийСписок) Отбор = ПостроительЗапроса.Отбор; - Для Каждого ЭлементОтбораДинамическогоСписка Из ДинамическийСписок.Отбор.Элементы Цикл + Для Каждого ЭлементОтбораДинамическогоСписка Из ДинамическийСписок.КомпоновщикНастроек.ПолучитьНастройки().Отбор.Элементы Цикл ИмяПоля = ЭлементОтбораДинамическогоСписка.ЛевоеЗначение; ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяПоля, ".", Ложь); @@ -319,7 +319,7 @@ ОтборыПоВладельцу.Добавить(Новый ПолеКомпоновкиДанных("Владелец")); ОтборыПоВладельцу.Добавить(Новый ПолеКомпоновкиДанных("Owner")); - Для Каждого Отбор Из Список.Отбор.Элементы Цикл + Для Каждого Отбор Из Список.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл Если ОтборыПоВладельцу.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда Возврат Истина; КонецЕсли; @@ -335,7 +335,7 @@ ОтборыПоВладельцу.Добавить(Новый ПолеКомпоновкиДанных("Родитель")); ОтборыПоВладельцу.Добавить(Новый ПолеКомпоновкиДанных("Parent")); - Для Каждого Отбор Из Список.Отбор.Элементы Цикл + Для Каждого Отбор Из Список.КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл Если ОтборыПоВладельцу.Найти(Отбор.ЛевоеЗначение) <> Неопределено Тогда Возврат Истина; КонецЕсли; @@ -352,6 +352,12 @@ Возврат НСтр("ru = 'Недостаточно прав для изменения порядка элементов.'"); КонецЕсли; + Для Каждого ЭлементГруппировки Из Список.КомпоновщикНастроек.ПолучитьНастройки().Структура Цикл + Если ЭлементГруппировки.Использование Тогда + Возврат НСтр("ru = 'Для изменения порядка элементов необходимо отключить все группировки.'"); + КонецЕсли; + КонецЦикла; + Информация = ПолучитьИнформациюДляПеремещения(Ссылка); // Для иерархических справочников может быть установлен отбор по родителю, если нет, @@ -375,4 +381,5 @@ Возврат ""; -КонецФункции \ No newline at end of file +КонецФункции + diff --git a/SSL/src/CommonModules/НастройкиПользователейКлиент/Module.bsl b/SSL/src/CommonModules/НастройкиПользователейКлиент/Module.bsl index aa335768a..48af08b00 100644 --- a/SSL/src/CommonModules/НастройкиПользователейКлиент/Module.bsl +++ b/SSL/src/CommonModules/НастройкиПользователейКлиент/Module.bsl @@ -26,7 +26,7 @@ Если Пользователь <> ТекущийПользователь Тогда ТекстПредупреждения = НСтр("ru = 'Для просмотра настроек другого пользователя необходимо запустить программу от его имени |и открыть нужный отчет или форму.'"); - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(,ТекстПредупреждения); Возврат; КонецЕсли; @@ -57,13 +57,13 @@ РодительЭлемента = ЭлементДереваЗначений.ТекущиеДанные.ПолучитьРодителя(); Если ЭлементДереваЗначений.ТекущиеДанные.ТипСтроки = "НастройкиРабочегоСтола" Тогда - Предупреждение(НСтр("ru = 'Для просмотра настроек рабочего стола перейдите к разделу ""Рабочий стол"" + ПоказатьПредупреждение(,НСтр("ru = 'Для просмотра настроек рабочего стола перейдите к разделу ""Рабочий стол"" |в командном интерфейсе программы.'")); Возврат; КонецЕсли; Если ЭлементДереваЗначений.ТекущиеДанные.ТипСтроки = "НастройкиКомандногоИнтерфейса" Тогда - Предупреждение(НСтр("ru = 'Для просмотра настроек командного интерфейса выберите нужный раздел + ПоказатьПредупреждение(,НСтр("ru = 'Для просмотра настроек командного интерфейса выберите нужный раздел |командного интерфейса программы.'")); Возврат; КонецЕсли; @@ -73,7 +73,7 @@ |и затем перейти к форме ""%2"".'"); ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПредупреждения, РодительЭлемента.Настройка, ЭлементДереваЗначений.ТекущиеДанные.Настройка); - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(,ТекстПредупреждения); Возврат; КонецЕсли; @@ -81,7 +81,7 @@ КонецЦикла; - Предупреждение(НСтр("ru = 'Данную настройку невозможно просмотреть.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Данную настройку невозможно просмотреть.'")); Возврат; ИначеЕсли ЭлементДереваЗначений.Имя = "ПрочиеНастройки" Тогда @@ -92,12 +92,12 @@ Возврат; КонецЕсли; - Предупреждение(НСтр("ru = 'Данную настройку невозможно просмотреть.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Данную настройку невозможно просмотреть.'")); Возврат; КонецЕсли; - Предупреждение(НСтр("ru = 'Выберите настройку для просмотра.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Выберите настройку для просмотра.'")); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl index abfee79ea..8f3600acc 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервиса/Module.bsl @@ -24,17 +24,17 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ОбменДаннымиВМоделиСервиса"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"].Добавить( "ОбменДаннымиВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "ОбменДаннымиВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( "ОбменДаннымиВМоделиСервиса"); @@ -61,10 +61,12 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "ОбменДаннымиВМоделиСервиса"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОбменДаннымиВМоделиСервиса"); - + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ОбменДаннымиВМоделиСервиса"); + КонецЕсли; + СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( "ОбменДаннымиВМоделиСервиса"); @@ -167,19 +169,17 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Обработчик = Обработчики.Добавить(); - Обработчик.ОбщиеДанные = Истина; - Обработчик.УправлениеОбработчиками = Истина; - Обработчик.Версия = "*"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "ОбменДаннымиВМоделиСервиса.ЗаполнитьОбработчикиРазделенныхДанных"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "*"; Обработчик.ОбщиеДанные = Истина; Обработчик.МонопольныйРежим = Ложь; Обработчик.Процедура = "ОбменДаннымиВМоделиСервиса.ЗаблокироватьКонечныеТочки"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.МонопольныйРежим = Ложь; + Обработчик.Процедура = "ОбменДаннымиВМоделиСервиса.УстановитьКодыПредопределенныхУзлов"; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.2.0"; Обработчик.Процедура = "ОбменДаннымиВМоделиСервиса.ПеренестиНастройкиОбменаВСтруктуруДанных_2_1_2_0"; @@ -198,27 +198,6 @@ КонецПроцедуры -// Заполняет обработчик разделенных данных, зависимый от изменения неразделенных данных. -// -// Параметры: -// Обработчики - ТаблицаЗначений, Неопределено - см. описание -// функции НоваяТаблицаОбработчиковОбновления общего модуля -// ОбновлениеИнформационнойБазы.. -// В случае прямого вызова (не через механизм обновления -// версии ИБ) передается Неопределено. -// -Процедура ЗаполнитьОбработчикиРазделенныхДанных(Параметры = Неопределено) Экспорт - - Если Параметры <> Неопределено И ЕстьНезаполненныеКодыПредопределенныхУзлов() Тогда - Обработчики = Параметры.РазделенныеОбработчики; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.РежимВыполнения = "Оперативно"; - Обработчик.Процедура = "ОбменДаннымиВМоделиСервиса.УстановитьКодыПредопределенныхУзлов"; - КонецЕсли; - -КонецПроцедуры - // Для каждого из используемых в модели сервиса планов обмена // определяет и устанавливает код и наименование предопределенного узла. // Код генерируется на основании значения разделителя. @@ -615,40 +594,6 @@ Возврат Результат; КонецФункции -// Проверяет наличие предопределенных узлов с незаполненными кодами -// -Функция ЕстьНезаполненныеКодыПредопределенныхУзлов() - - Для Каждого ПланОбмена Из Метаданные.ПланыОбмена Цикл - - Если ОбменДаннымиВМоделиСервисаПовтИсп.ЭтоПланОбменаСинхронизацииДанных(ПланОбмена.Имя) Тогда - - ТекстЗапроса = "ВЫБРАТЬ - | ПланОбмена.Код - |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена - |ГДЕ - | ПланОбмена.Код = """""; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ПланОбмена.Имя); - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Результат = Запрос.Выполнить(); - - Если Не Результат.Пустой() Тогда - - Возврат Истина; - - КонецЕсли; - - КонецЕсли; - - КонецЦикла; - - Возврат Ложь; - -КонецФункции - // // Для внутреннего использования @@ -798,8 +743,8 @@ // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "АдресДляВосстановленияПароляУчетнойЗаписи"); КонецЕсли; @@ -927,26 +872,26 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.Константы.ДатаОбновленияПовторноИспользуемыхЗначенийМРО); - Объекты.Добавить(Метаданные.Константы.ЗарегистрированыИзмененияДанных); - Объекты.Добавить(Метаданные.Константы.НастройкиПодчиненногоУзлаРИБ); - Объекты.Добавить(Метаданные.Константы.ПрефиксПоследнегоАвтономногоРабочегоМеста); - Объекты.Добавить(Метаданные.Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы); + Типы.Добавить(Метаданные.Константы.ДатаОбновленияПовторноИспользуемыхЗначенийМРО); + Типы.Добавить(Метаданные.Константы.ЗарегистрированыИзмененияДанных); + Типы.Добавить(Метаданные.Константы.НастройкиПодчиненногоУзлаРИБ); + Типы.Добавить(Метаданные.Константы.ПрефиксПоследнегоАвтономногоРабочегоМеста); + Типы.Добавить(Метаданные.Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы); - Объекты.Добавить(Метаданные.РегистрыСведений.ИзмененияОбщихДанныхУзлов); - Объекты.Добавить(Метаданные.РегистрыСведений.НастройкиТранспортаОбменаОбластиДанных); - Объекты.Добавить(Метаданные.РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз); - Объекты.Добавить(Метаданные.РегистрыСведений.РезультатыОбменаДанными); - Объекты.Добавить(Метаданные.РегистрыСведений.СессииОбменаСообщениямиСистемы); - Объекты.Добавить(Метаданные.РегистрыСведений.СоответствияОбъектовИнформационныхБаз); - Объекты.Добавить(Метаданные.РегистрыСведений.СостоянияОбменовДаннымиОбластейДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ИзмененияОбщихДанныхУзлов); + Типы.Добавить(Метаданные.РегистрыСведений.НастройкиТранспортаОбменаОбластиДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ОбщиеНастройкиУзловИнформационныхБаз); + Типы.Добавить(Метаданные.РегистрыСведений.РезультатыОбменаДанными); + Типы.Добавить(Метаданные.РегистрыСведений.СессииОбменаСообщениямиСистемы); + Типы.Добавить(Метаданные.РегистрыСведений.СоответствияОбъектовИнформационныхБаз); + Типы.Добавить(Метаданные.РегистрыСведений.СостоянияОбменовДаннымиОбластейДанных); КонецПроцедуры @@ -976,7 +921,7 @@ Пока Выборка.Следующий() Цикл - ПолноеИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбщегоНазначенияПовтИсп.КаталогВременногоХранилищаФайлов(), Выборка.ИмяФайла); + ПолноеИмяФайлаСообщения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбменДаннымиПовтИсп.КаталогВременногоХранилищаФайлов(), Выборка.ИмяФайла); ФайлСообщения = Новый Файл(ПолноеИмяФайлаСообщения); @@ -1710,7 +1655,7 @@ КонецПроцедуры // Удаляет настройку синхронизации -Функция УдалитьНастройкуОбмена(ИмяПланаОбмена, ОбластьДанныхКорреспондента, Сессия = Неопределено) Экспорт +Функция УдалитьНастройкуОбмена(ИмяПланаОбмена, ОбластьДанныхКорреспондента) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -1863,7 +1808,7 @@ // Удаляем из номера версии дополнительный номер релиза (последний номер) ВерсияПлатформы.Удалить(3); - Возврат СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ВерсияПлатформы, "."); + Возврат СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ВерсияПлатформы, "."); КонецФункции @@ -2113,7 +2058,7 @@ КонецЦикла; - ДополнительныеСвойстваБезИсточникаДанныхСтрокой = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ДополнительныеСвойстваБезИсточникаДанных) + ", "; + ДополнительныеСвойстваБезИсточникаДанныхСтрокой = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ДополнительныеСвойстваБезИсточникаДанных) + ", "; КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl index 52f99c7e0..7859ce3ea 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаКлиент/Module.bsl @@ -3,12 +3,15 @@ // //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + // Обработчик запуска клиентского сеанса приложения. // Если запущен сеанс для автономного рабочего места, то выводит пользователю оповещение // о необходимости выполнить синхронизацию данных с приложением в Интернете // (если установлен соответствующий признак). // -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); diff --git a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl index d3149a088..62d9ad31b 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВМоделиСервисаПереопределяемый/Module.bsl @@ -7,13 +7,13 @@ // Приложение этой версии должно быть установлено на локальном компьютере пользователя. // Если возвращаемое значение функции не задано, то в качестве требуемой версии приложения // будет использоваться значение по умолчанию: первые три цифры версии текущего приложения, -// расположенного в Интернете, например, "8.2.15". +// расположенного в Интернете, например, "8.3.3". // Используется в помощнике создания автономного рабочего места. // // Возвращаемое значение: // Строка - Версия требуемого приложения 1С:Предприятия в формате // <основная версия>.<младшая версия>.<релиз>.<дополнительный номер релиза>. -// Например, "8.2.15.310". +// Например, "8.3.3.715". // Функция ТребуемаяВерсияПриложения() Экспорт diff --git a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl index 0a470cd58..0e698f613 100644 --- a/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиВызовСервера/Module.bsl @@ -236,16 +236,12 @@ СтрокаСообщенияОбОшибке = ""; // выполняем попытку установки внешнего соединения - ВнешнееСоединение = ОбменДаннымиСервер.УстановитьВнешнееСоединение(СтруктураНастроек, СтрокаСообщенияОбОшибке, ОшибкаПодключенияКомпоненты); - - Если ВнешнееСоединение = Неопределено Тогда - - // Выводим сообщение об ошибке - Сообщение = НСтр("ru = 'Ошибка при установке подключения ко второй информационной базе: %1'"); - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Сообщение, СтрокаСообщенияОбОшибке); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Сообщение,,,, Отказ); - + Результат = ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(СтруктураНастроек); + // Выводим сообщение об ошибке + Если Результат.Соединение = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.КраткоеОписаниеОшибки,,,, Отказ); КонецЕсли; + ОшибкаПодключенияКомпоненты = Результат.ОшибкаПодключенияКомпоненты; КонецПроцедуры @@ -479,7 +475,7 @@ УстановитьПривилегированныйРежим(Истина); - Если НовоеЗначениеПометкиУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник, "ПометкаУдаления") Тогда + Если ПараметрыСеанса.ИспользуемыеПланыОбмена.Количество() > 0 Тогда НаборЗаписейКонфликта = РегистрыСведений.РезультатыОбменаДанными.СоздатьНаборЗаписей(); НаборЗаписейКонфликта.Отбор.ПроблемныйОбъект.Установить(Источник); @@ -488,15 +484,23 @@ НаборЗаписейКонфликта.Прочитать(); Если НаборЗаписейКонфликта.Количество() = 1 Тогда - НаборЗаписейКонфликта[0].ПометкаУдаления = НовоеЗначениеПометкиУдаления; - НаборЗаписейКонфликта.Записать(); + + + Если НовоеЗначениеПометкиУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник, "ПометкаУдаления") Тогда + + НаборЗаписейКонфликта[0].ПометкаУдаления = НовоеЗначениеПометкиУдаления; + НаборЗаписейКонфликта.Записать(); + + + Иначе + + НаборЗаписейКонфликта.Очистить(); + НаборЗаписейКонфликта.Записать(); + + КонецЕсли; + КонецЕсли; - Иначе - - СтруктураЗаписи = Новый Структура("ПроблемныйОбъект, ТипПроблемы", Источник, ТипПроблемы); - ОбменДаннымиСервер.УдалитьНаборЗаписейВРегистреСведений(СтруктураЗаписи, "РезультатыОбменаДанными"); - КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl index a14a65f18..5240eeec6 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиент/Module.bsl @@ -54,13 +54,11 @@ Если Форма.Модифицированность Тогда - Ответ = Вопрос(НСтр("ru = 'Данные были изменены. Закрыть форму без сохранения изменений?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет); + Отказ = Истина; - Если Ответ = КодВозвратаДиалога.Нет Тогда - - Отказ = Истина; - - КонецЕсли; + ТекстВопроса = НСтр("ru = 'Данные были изменены. Закрыть форму без сохранения изменений?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ФормаНастройкиПередЗакрытиемЗавершение", ЭтотОбъект, Форма); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Нет); КонецЕсли; @@ -89,8 +87,7 @@ КонецЕсли; - ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.Форма", ПараметрыФормы,, ИмяПланаОбмена + НастройкаОбменаССервисом, ВариантОткрытияОкна.ОтдельноеОкно); - + ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.Форма", ПараметрыФормы, , ИмяПланаОбмена + НастройкаОбменаССервисом, , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры // Обработчик начала выбора элемента для формы задания настроек узла базы-корреспондента при настройке обмена через внешнее соединение @@ -321,49 +318,36 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обработчики событий подсистем БСП - -// Вызывается при интерактивном начале работы пользователя с областью данных. +// Открывает форму для ввода параметров прокси сервера // -// Параметры: -// ПервыйПараметр - Строка - первое значение параметра запуска, -// до первого символа ";" в верхнем регистре. -// ПараметрыЗапуска – Массив – массив строк разделенных символом ";" в параметре запуска, -// переданным в конфигурацию с помощью ключа командной строки /C. -// Отказ - Булево (возвращаемое значение), если установить Истина, -// обработка события ПриНачалеРаботыСистемы будет прервана. -// -Процедура ПриОбработкеПараметровЗапуска(ПервыйПараметр, ПараметрыЗапуска, Отказ) Экспорт +Процедура ОткрытьФормуПараметровПроксиСервера() Экспорт - Если ОбработатьПараметрыЗапуска(ПервыйПараметр, ПараметрыЗапуска) Тогда - - Отказ = Истина; - + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиент"); + МодульПолучениеФайловИзИнтернетаКлиент.ОткрытьФормуПараметровПроксиСервера(); КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем БСП + // Процедура-обработчик запуска клиентского сеанса приложения. // Если выполняется запуск ИБ для подчиненного узла РИБ, // с необходимостью повтора загрузки сообщения обмена, тогда // пользователю предлагается принять решение о повторной загрузке // или продолжении без загрузки. // -Процедура ПередНачаломРаботыСистемы(Отказ, ПараметрыКлиента, ОбновитьПараметрыКлиента) Экспорт +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") Тогда Возврат; КонецЕсли; - ОбновитьПараметрыКлиента = Истина; - - Результат = ОткрытьФормуМодально( - "РегистрСведений.НастройкиТранспортаОбмена.Форма.ПовторнаяСинхронизацияДанныхПередЗапуском"); - - Если Результат <> "Продолжить" Тогда - Отказ = Истина; - КонецЕсли; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском", ЭтотОбъект); КонецПроцедуры @@ -371,7 +355,7 @@ // Если выполняется первый запуск ИБ для подчиненного узла РИБ, // то открывается форма помощника создания обмена данными. // -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных ИЛИ ПараметрыРаботыКлиента.РазделениеВключено Тогда @@ -383,7 +367,19 @@ ПараметрыФормы = Новый Структура("ИмяПланаОбмена, ЭтоПродолжениеНастройкиВПодчиненномУзлеРИБ", ПараметрыРаботыКлиента.ИмяПланаОбменаРИБ); ОткрытьФорму("Обработка.ПомощникСозданияОбменаДанными.Форма.Форма", ПараметрыФормы, , , ВариантОткрытияОкна.ОтдельноеОкно); - ИначеЕсли ПараметрыРаботыКлиента.ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзла Тогда + КонецЕсли; + +КонецПроцедуры + +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных ИЛИ ПараметрыРаботыКлиента.РазделениеВключено Тогда + Возврат; + КонецЕсли; + + Если Не ПараметрыРаботыКлиента.ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла + И ПараметрыРаботыКлиента.ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзла Тогда ПодключитьОбработчикОжидания("ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзлаПриЗапуске", 1, Истина); @@ -394,88 +390,385 @@ //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции +// Только для внутреннего использования. +Процедура ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском(Параметры, Неопределен) Экспорт + + Форма = ОткрытьФорму( + "РегистрСведений.НастройкиТранспортаОбмена.Форма.ПовторнаяСинхронизацияДанныхПередЗапуском", , , , , , + Новый ОписаниеОповещения( + "ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском", ЭтотОбъект, Параметры)); + + Если Форма = Неопределено Тогда + ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском("Продолжить", Параметры); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры +// ИнтерактивнаяОбработкаПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском. +// +Процедура ПослеЗакрытияФормыПовторнаяСинхронизацияДанныхПередЗапуском(Результат, Параметры) Экспорт + + Если Результат <> "Продолжить" Тогда + Параметры.Отказ = Истина; + Иначе + Параметры.ПолученныеПараметрыКлиента.Вставить( + "ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском"); + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры +// ФормаНастройкиПередЗакрытием. +// +Процедура ФормаНастройкиПередЗакрытиемЗавершение(Ответ, Форма) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + Форма.Модифицированность = Ложь; + Форма.Закрыть(); + + // Очищаем кэш повторного использования для сброса возможных COM соединений + ОбновитьПовторноИспользуемыеЗначения(); +КонецПроцедуры + // Открывает файл в ассоциированном приложении операционной системы -// Каталоги открываются в приложении explorer // // Параметры: -// Объект - объект из которого по имени свойства будет получено имя файла для открытия -// ИмяСвойства - Строка - имя свойства объекта из которого будет получено имя файла для открытия -// СтандартнаяОбработка - Булево - флаг стандартной обработки. Устанавливается в значение Ложь. -// -Процедура ОбработчикОткрытияФайлаИлиКаталога(Объект, ИмяСвойства, СтандартнаяОбработка) Экспорт - +// Объект - Произвольный - Объект из которого по имени свойства будет получено имя файла для открытия +// ИмяСвойства - Строка - Имя свойства объекта из которого будет получено имя файла для открытия +// СтандартнаяОбработка - Булево - Флаг стандартной обработки, устанавливается в Ложь +// +Процедура ОбработчикОткрытияФайлаИлиКаталога(Объект, ИмяСвойства, СтандартнаяОбработка = Ложь) Экспорт СтандартнаяОбработка = Ложь; ПолноеИмяФайла = Объект[ИмяСвойства]; - Если ПустаяСтрока(ПолноеИмяФайла) Тогда Возврат; КонецЕсли; - // открываем каталог в приложении explorer - // файл открываем в ассоциированном приложении ЗапуститьПриложение(ПолноеИмяФайла); - КонецПроцедуры -// Открывает диалог для выбора файлового каталога +// Открывает диалог для выбора файлового каталога, запрашивая установку расширения для работы с файлами // -Процедура ОбработчикВыбораФайловогоКаталога(Объект, ИмяСвойства, СтандартнаяОбработка) Экспорт - +// Параметры: +// Объект - Произвольный - Объект, в котором будет установлено выбираемое свойство +// ИмяСвойства - Строка - Имя свойства с именем файла, устанавливаемого в объекте. Источник начального значения. +// СтандартнаяОбработка - Булево - Флаг стандартной обработки, устанавливается в Ложь +// ПараметрыДиалога - Структура - Необязательные дополнительные параметры диалога выбора каталога +// ОповещениеЗавершения - ОписаниеОповещения - Необязательное оповещение, которое будет вызвано со следующими параметрами: +// Результат - Строка - Выбранное значение (массив строк, если был множественный выбор); +// ДополнительныеПараметры - Неопределено +// +Процедура ОбработчикВыбораФайловогоКаталога(Объект, Знач ИмяСвойства, СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено) Экспорт СтандартнаяОбработка = Ложь; - Если Не ПодключитьРасширениеРаботыСФайлами() Тогда - Предупреждение(НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами.'")); + УмолчанияДиалога = Новый Структура; + УмолчанияДиалога.Вставить("Заголовок", НСтр("ru = 'Укажите каталог'") ); + + УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога); + + ТекстПредупреждения = НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами.'"); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Объект", Объект); + ДополнительныеПараметры.Вставить("ИмяСвойства", ИмяСвойства); + ДополнительныеПараметры.Вставить("ПараметрыДиалога", ПараметрыДиалога); + ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + + Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораФайловогоКаталогаЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредупреждения, Ложь); +КонецПроцедуры + +// Обработчик немодального завершения диалога выбора каталога +// +Процедура ОбработчикВыбораФайловогоКаталогаЗавершение(Знач Результат, Знач ДополнительныеПараметры) Экспорт + Если Результат <> Истина Тогда Возврат; КонецЕсли; + ИмяСвойства = ДополнительныеПараметры.ИмяСвойства; + Объект = ДополнительныеПараметры.Объект; + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); + ЗаполнитьЗначенияСвойств(Диалог, ДополнительныеПараметры.ПараметрыДиалога); - Диалог.Заголовок = НСтр("ru = 'Укажите каталог'"); - Диалог.Каталог = Объект[ИмяСвойства]; - + Диалог.Каталог = Объект[ИмяСвойства]; Если Диалог.Выбрать() Тогда - Объект[ИмяСвойства] = Диалог.Каталог; + Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда + Результат = ?(Диалог.МножественныйВыбор, Диалог.ВыбранныеФайлы, Диалог.Каталог); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); + КонецЕсли; КонецЕсли; КонецПроцедуры -// Открывает диалог для выбора файла +// Открывает диалог для выбора файла, запрашивая установку расширения для работы с файлами // -Процедура ОбработчикВыбораФайла(Объект, - ИмяСвойства, - СтандартнаяОбработка, - Фильтр = "", - ПроверятьСуществованиеФайла = Истина) Экспорт - +// Параметры: +// Объект - Произвольный - Объект, в котором будет установлено выбираемое свойство +// ИмяСвойства - Строка - Имя свойства с именем файла, устанавливаемого в объекте. Источник начального значения. +// СтандартнаяОбработка - Булево - Флаг стандартной обработки, устанавливается в Ложь +// ПараметрыДиалога - Структура - Необязательные дополнительные параметры диалога выбора файла +// ОповещениеЗавершения - ОписаниеОповещения - Необязательное оповещение, которое будет вызвано со следующими параметрами: +// Результат - Строка - Выбранное значение (массив строк, если был множественный выбор); +// ДополнительныеПараметры - Неопределено +// +// +Процедура ОбработчикВыбораФайла(Объект, Знач ИмяСвойства, СтандартнаяОбработка = Ложь, Знач ПараметрыДиалога = Неопределено, ОповещениеЗавершения = Неопределено) Экспорт СтандартнаяОбработка = Ложь; - Если Не ПодключитьРасширениеРаботыСФайлами() Тогда - Предупреждение(НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами.'")); + УмолчанияДиалога = Новый Структура; + УмолчанияДиалога.Вставить("Режим", РежимДиалогаВыбораФайла.Открытие); + УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина); + УмолчанияДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл'")); + УмолчанияДиалога.Вставить("МножественныйВыбор", Ложь); + УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь); + + УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога); + + ТекстПредупреждения = НСтр("ru = 'Для данной операции необходимо установить расширение работы с файлами.'"); + + Оповещение = Новый ОписаниеОповещения("ОбработчикВыбораФайлаЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("Объект", Объект); + Оповещение.ДополнительныеПараметры.Вставить("ИмяСвойства", ИмяСвойства); + Оповещение.ДополнительныеПараметры.Вставить("ПараметрыДиалога", ПараметрыДиалога); + Оповещение.ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредупреждения, Ложь); +КонецПроцедуры + +// Обработчик немодального завершения диалога выбора файла +// +Процедура ОбработчикВыбораФайлаЗавершение(Знач Результат, Знач ДополнительныеПараметры) Экспорт + Если Результат <> Истина Тогда Возврат; КонецЕсли; - Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ИмяСвойства = ДополнительныеПараметры.ИмяСвойства; + Объект = ДополнительныеПараметры.Объект; + + ПараметрыДиалогаВыбора = ДополнительныеПараметры.ПараметрыДиалога; + Диалог = Новый ДиалогВыбораФайла(ПараметрыДиалогаВыбора.Режим); + ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалогаВыбора); - Диалог.Заголовок = НСтр("ru = 'Выберите файл'"); Диалог.ПолноеИмяФайла = Объект[ИмяСвойства]; - Диалог.МножественныйВыбор = Ложь; - Диалог.ПредварительныйПросмотр = Ложь; - Диалог.ПроверятьСуществованиеФайла = ПроверятьСуществованиеФайла; - Диалог.Фильтр = Фильтр; - Если Диалог.Выбрать() Тогда - Объект[ИмяСвойства] = Диалог.ПолноеИмяФайла; + Если ДополнительныеПараметры.ОповещениеЗавершения <> Неопределено Тогда + Результат = ?(Диалог.МножественныйВыбор, Диалог.ВыбранныеФайлы, Диалог.ПолноеИмяФайла); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); + КонецЕсли; КонецЕсли; КонецПроцедуры -// Открывает форму записи регистра сведений по заданному отбору +// Передает файлы на сервер, запрашивая установку расширения для работы с файлами +// +// Параметры: +// ОповещениеЗавершения - ОписаниеОповещения - Экспортная процедура, которая будет вызвана следующими параметрами: +// Результат - Массив - Содержит структуры с полями Имя, Хранение, ОписаниеОшибки для каждого файла +// ДополнительныеПараметры - Неопределено +// +// ИменаФайлов - Массив - Массив имен файлов для передачи +// ИдентификаторФормы - УникальныйИдентификатор - Параметр для хранилища +// ТекстПредупреждения - Строка - Текст предупреждения о необходимости установки расширения для работы с файлами +// +Процедура ПередатьФайлыНаСервер(ОповещениеЗавершения, Знач ИменаФайлов, Знач ИдентификаторФормы = Неопределено, Знач ТекстПредупреждения = Неопределено) Экспорт + + ДанныеФайлов = Новый Массив; + ЕстьПустые = Ложь; + + Для Каждого ИмяФайла Из ИменаФайлов Цикл + ОписаниеФайла = Новый Структура("Имя, Хранение, ОписаниеОшибки", ИмяФайла); + Если ПустаяСтрока(ИмяФайла) Тогда + ЕстьПустые = Истина; + ОписаниеФайла.ОписаниеОшибки = НСтр("ru = 'Файл не выбран.'"); + КонецЕсли; + ДанныеФайлов.Добавить(ОписаниеФайла); + КонецЦикла; + + Если ЕстьПустые Тогда + ВыполнитьОбработкуОповещения(ОповещениеЗавершения, ДанныеФайлов); + Возврат; + КонецЕсли; + + Оповещение= Новый ОписаниеОповещения("ПередатьФайлНаСерверЗавершениеПодключенияРасширения", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("Оповещение", ОповещениеЗавершения); + Оповещение.ДополнительныеПараметры.Вставить("ДанныеФайлов", ДанныеФайлов); + Оповещение.ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + Если ТекстПредупреждения = Неопределено Тогда + Если ИменаФайлов.Количество() = 1 Тогда + ТекстПредупреждения = НСтр("ru = 'Для передачи файла на сервер необходимо установить расширение работы с файлами.'"); + Иначе + ТекстПредупреждения = НСтр("ru = 'Для передачи файлов на сервер необходимо установить расширение работы с файлами.'"); + КонецЕсли; + КонецЕсли; + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредупреждения, Ложь); +КонецПроцедуры + +// Обработчик немодального завершения передачи файлов на сервер // +Процедура ПередатьФайлНаСерверЗавершениеПодключенияРасширения(Знач Результат, Знач ДополнительныеПараметры) Экспорт + Если Не Результат Тогда + Возврат; + КонецЕсли; + // Расширение успешно установлено + + ДанныеФайлов = ДополнительныеПараметры.ДанныеФайлов; + СписокДляПередачи = Новый Массив; + + БылиОшибки = Ложь; + Для Каждого Элемент Из ДанныеФайлов Цикл + ИмяФайла = Элемент.Имя; + + Файл = Новый Файл(ИмяФайла); + Если Не Файл.Существует() Или Файл.ЭтоКаталог() Тогда + БылиОшибки = Истина; + Элемент.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" не существует или к нему нет доступа'"), ИмяФайла); + Иначе + СписокДляПередачи.Добавить( Новый ОписаниеПередаваемогоФайла(ИмяФайла) ); + КонецЕсли; + + КонецЦикла; + + Если Не БылиОшибки Тогда + ПомещенныеФайлы = Новый Массив; + + ПоместитьФайлы(СписокДляПередачи, ПомещенныеФайлы, , Ложь, ДополнительныеПараметры.ИдентификаторФормы); + + Для Индекс = 0 По ПомещенныеФайлы.ВГраница() Цикл + ДанныеФайлов[Индекс].Хранение = ПомещенныеФайлы[Индекс].Хранение; + КонецЦикла; + КонецЕсли; + + // Оповещаем исходного вызывающего + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.Оповещение, ДанныеФайлов); +КонецПроцедуры + +// Передает файл на сервер интерактивно, без расширения для работы с файлами +// +// Параметры: +// ОповещениеЗавершения - ОписаниеОповещения - Экспортная процедура, которая будет вызвано со следующими параметрами: +// Результат - Структура с полями Имя, Хранение, ОписаниеОшибки +// ДополнительныеПараметры - Неопределено +// +// ПараметрыДиалога - Структура - Необязательные дополнительные параметры диалога выбора файлов +// ИдентификаторФормы - Строка, УникальныйИдентификатор - Параметр для хранилища +// +Процедура ВыбратьИПередатьФайлНаСервер(ОповещениеЗавершения, Знач ПараметрыДиалога = Неопределено, Знач ИдентификаторФормы = Неопределено) Экспорт + + Результат = Новый Структура("Имя, Хранение, ОписаниеОшибки"); + + Оповещение = Новый ОписаниеОповещения("ВыбратьИПередатьФайлыНаСерверЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + // У нас нет расширения, используем диалог выбора из НачатьПомещениеФайла + НачатьПомещениеФайла(Оповещение, , , Истина, ИдентификаторФормы); + Возврат; + КонецЕсли; + + // У нас есть расширение, используем диалог + УмолчанияДиалога = Новый Структура; + УмолчанияДиалога.Вставить("ПроверятьСуществованиеФайла", Истина); + УмолчанияДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл'")); + УмолчанияДиалога.Вставить("МножественныйВыбор", Ложь); + УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь); + + УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога); + + ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ЗаполнитьЗначенияСвойств(ДиалогВыбора, ПараметрыДиалога); + + Если ДиалогВыбора.Выбрать() Тогда + НачатьПомещениеФайла(Оповещение, , ДиалогВыбора.ПолноеИмяФайла, Ложь, ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +// Обработчик немодального завершения выбора и передачи файлов на сервер +// +Процедура ВыбратьИПередатьФайлыНаСерверЗавершение(Знач Успешно, Знач Адрес, Знач ВыбранноеИмяФайла, Знач ДополнительныеПараметры) Экспорт + Если Не Успешно Тогда + Возврат; + КонецЕсли; + + // Оповещаем исходного вызывающего + Результат = ДополнительныеПараметры.Результат; + Результат.Имя = ВыбранноеИмяФайла; + Результат.Хранение = Адрес; + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОповещениеЗавершения, Результат); +КонецПроцедуры + +// Запускает получение файла с сервера интерактивно, без расширения для работы с файлами +// +// Параметры: +// ПолучаемыйФайл - Структура - Описание файла для получения. Содержит свойства Имя и Хранение +// ПараметрыДиалога - Структура - Необязательные дополнительные параметры диалога выбора файлов +// +Процедура ВыбратьИСохранитьФайлНаКлиенте(Знач ПолучаемыйФайл, Знач ПараметрыДиалога = Неопределено) Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + // У нас нет расширения, используем диалог выбора из ПолучитьФайл + ПолучитьФайл(ПолучаемыйФайл.Хранение, ПолучаемыйФайл.Имя, Истина); + Возврат; + КонецЕсли; + + // Доступно расширение, используем диалог + УмолчанияДиалога = Новый Структура; + УмолчанияДиалога.Вставить("Заголовок", НСтр("ru = 'Выберите файл для сохранения'")); + УмолчанияДиалога.Вставить("МножественныйВыбор", Ложь); + УмолчанияДиалога.Вставить("ПредварительныйПросмотр", Ложь); + + УстановитьЗначенияСтруктурыПоУмолчанию(ПараметрыДиалога, УмолчанияДиалога); + + ДиалогСохранения = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ЗаполнитьЗначенияСвойств(ДиалогСохранения, ПараметрыДиалога); + + Получаемые = Новый Массив; + Получаемые.Добавить( Новый ОписаниеПередаваемогоФайла(ПолучаемыйФайл.Имя, ПолучаемыйФайл.Хранение) ); + + Полученные = Новый Массив; + ПолучитьФайлы(Получаемые, Полученные, ДиалогСохранения, Истина); +КонецПроцедуры + +// Добавляет поля в целевую структуру, если их там нет +// +// Параметры: +// Результат - Структура - Целевая структура +// ЗначенияПоУмолчанию - Структура - Значения по умолчанию +// +Процедура УстановитьЗначенияСтруктурыПоУмолчанию(Результат, Знач ЗначенияПоУмолчанию) Экспорт + + Если Результат = Неопределено Тогда + Результат = Новый Структура; + КонецЕсли; + + Для Каждого КлючЗначение Из ЗначенияПоУмолчанию Цикл + ИмяСвойства = КлючЗначение.Ключ; + Если Не Результат.Свойство(ИмяСвойства) Тогда + Результат.Вставить(ИмяСвойства, КлючЗначение.Значение); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + + +// Открывает форму записи регистра сведений по заданному отбору Процедура ОткрытьФормуЗаписиРегистраСведенийПоОтбору( Отбор, ЗначенияЗаполнения, @@ -483,20 +776,20 @@ ФормаВладелец, Знач ИмяФормы = "", ПараметрыФормы = Неопределено, - ОткрытьМодально = Ложь) Экспорт + ОповещениеОЗакрытии = Неопределено) Экспорт Перем КлючЗаписи; НаборЗаписейПустой = ОбменДаннымиВызовСервера.НаборЗаписейРегистраПустой(Отбор, ИмяРегистра); Если Не НаборЗаписейПустой Тогда + // Создаем через тип, так как находимся на клиенте ТипЗначения = Тип("РегистрСведенийКлючЗаписи." + ИмяРегистра); Параметры = Новый Массив(1); Параметры[0] = Отбор; КлючЗаписи = Новый(ТипЗначения, Параметры); - КонецЕсли; ПараметрыЗаписи = Новый Структура; @@ -527,8 +820,8 @@ КонецЕсли; // открываем форму записи РС - Если ОткрытьМодально Тогда - ОткрытьФормуМодально(ПолноеИмяФормы, ПараметрыЗаписи, ФормаВладелец); + Если ОповещениеОЗакрытии <> Неопределено Тогда + ОткрытьФорму(ПолноеИмяФормы, ПараметрыЗаписи, ФормаВладелец, , , , ОповещениеОЗакрытии); Иначе ОткрытьФорму(ПолноеИмяФормы, ПараметрыЗаписи, ФормаВладелец); КонецЕсли; @@ -622,89 +915,6 @@ КонецПроцедуры -// Обработать параметры запуска -// -// Параметры -// ЗначениеПараметраЗапуска – Строка – главный параметр запуска -// ПараметрыЗапуска – Массив – дополнительные параметры запуска, разделенные -// символом ";". -// -// Возвращаемое значение: -// Булево – Истина, если требуется прекратить выполнение запуска системы. -// -Функция ОбработатьПараметрыЗапуска(Знач ЗначениеПараметраЗапуска, Знач ПараметрыЗапуска) Экспорт - - Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ДоступноИспользованиеРазделенныхДанных Тогда - Возврат Ложь; - КонецЕсли; - - Если ЗначениеПараметраЗапуска = ВРег("ВыполнитьИнтерактивнуюЗагрузкуДанных") Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ИмяПланаОбмена", ПараметрыЗапуска[1]); - ПараметрыФормы.Вставить("КодУзлаИнформационнойБазы", ПараметрыЗапуска[2]); - ПараметрыФормы.Вставить("РасширенныйРежимДополненияВыгрузки", Истина); - - ОткрытьФормуМодально("Обработка.ПомощникИнтерактивногоОбменаДанными.Форма.Форма", ПараметрыФормы); - - // безусловное завершение работы программы - ЗавершитьРаботуСистемы(Ложь); - - Возврат Истина; - КонецЕсли; - - Возврат Ложь; -КонецФункции - -// Выполняет запуск приложения 1С:Предприятие, при котором выполняется -// сеанс работы с помощником интерактивной загрузки данных. -// После завершения работы с помощником работа приложения завершается. -// -Процедура ЗапуститьПриложение1СПредприятиеИВыполнитьИнтерактивнуюЗагрузкуДанных(ПараметрыПодключения, ИмяПланаОбмена) Экспорт - -#Если ВебКлиент Тогда - - Предупреждение(НСтр("ru = 'В Веб-клиенте данная возможность не поддерживается'")); - -#Иначе - - КодНовогоУзлаВторойБазы = ОбменДаннымиВызовСервера.ПолучитьКодЭтогоУзлаДляПланаОбмена(ИмяПланаОбмена); - - ПутьКИсполняемомуФайлуПриложения = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(КаталогПрограммы(), "1cv8.exe"); - - Если ПараметрыПодключения.ВариантРаботыИнформационнойБазы = 0 Тогда // файловый - - СтрокаКоманды = "%1 ENTERPRISE /F""%2"" /N""%3"" /P""%4"" /CВыполнитьИнтерактивнуюЗагрузкуДанных;%5;%6"; - - СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаКоманды, - ПутьКИсполняемомуФайлуПриложения, - ПараметрыПодключения.КаталогИнформационнойБазы, - ПараметрыПодключения.ИмяПользователя, - ПараметрыПодключения.ПарольПользователя, - ИмяПланаОбмена, - КодНовогоУзлаВторойБазы); - - Иначе // клиент-серверный - - СтрокаКоманды = "%1 ENTERPRISE /S%2\%3 /N""%4"" /P""%5"" /CВыполнитьИнтерактивнуюЗагрузкуДанных;%6;%7"; - - СтрокаКоманды = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаКоманды, - ПутьКИсполняемомуФайлуПриложения, - ПараметрыПодключения.ИмяСервера1СПредприятия, - ПараметрыПодключения.ИмяИнформационнойБазыНаСервере1СПредприятия, - ПараметрыПодключения.ИмяПользователя, - ПараметрыПодключения.ПарольПользователя, - ИмяПланаОбмена, - КодНовогоУзлаВторойБазы); - - КонецЕсли; - - ЗапуститьПриложение(СтрокаКоманды,, Истина); - -#КонецЕсли - -КонецПроцедуры - // Оповещает все открытые динамические списки о необходимости обновить отображаемые данные. // Процедура ОбновитьВсеОткрытыеДинамическиеСписки() Экспорт @@ -719,21 +929,6 @@ КонецПроцедуры -// Для внутреннего использования -// -Процедура ВыполнитьОбновлениеИнформационнойБазы(ЗавершениеРаботыСистемы = Ложь) Экспорт - - СтандартнаяОбработка = Истина; - - ПриВыполненииОбновленияИнформационнойБазы(СтандартнаяОбработка, ЗавершениеРаботыСистемы); - - Если СтандартнаяОбработка Тогда - ОткрытьФорму("ОбщаяФорма.ДополнительноеОписание", Новый Структура("Заголовок,ИмяМакета", - НСтр("ru = 'Установка обновления'"), "ИнструкцияКакВыполнитьУстановкуОбновленияВручную")); - КонецЕсли; - -КонецПроцедуры - // Открывает форму монитора зарегистрированных к отправке данных // Процедура ОткрытьСоставОтправляемыхДанных(Знач УзелИнформационнойБазы) Экспорт @@ -758,7 +953,15 @@ // Процедура УдалитьНастройкуСинхронизации(Знач УзелИнформационнойБазы) Экспорт - Ответ = Вопрос(НСтр("ru = 'Удалить настройку синхронизации данных?'"), РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); + ТекстВопроса = НСтр("ru = 'Удалить настройку синхронизации данных?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("УдалитьНастройкуСинхронизацииЗавершение", ЭтотОбъект, УзелИнформационнойБазы); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); + +КонецПроцедуры + +// Обработчик оповещения +// +Процедура УдалитьНастройкуСинхронизацииЗавершение(Ответ, УзелИнформационнойБазы) Экспорт Если Ответ = КодВозвратаДиалога.Да Тогда @@ -811,14 +1014,14 @@ // Обновляет конфигурацию базы данных. // -// Параметры: -// СтандартнаяОбработка - Булево - если в процедуре установить данному параметру значение Ложь, то инструкция по -// "ручному" обновлению показана не будет. -Процедура ПриВыполненииОбновленияИнформационнойБазы(СтандартнаяОбработка, ЗавершениеРаботыСистемы = Ложь) +Процедура ВыполнитьОбновлениеИнформационнойБазы(ЗавершениеРаботыСистемы = Ложь) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда - МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеКонфигурацииКлиент"); - МодульОбновлениеКонфигурацииКлиент.ПриВыполненииОбновленияИнформационнойБазы(СтандартнаяОбработка, ЗавершениеРаботыСистемы); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент"); + МодульОбновлениеКонфигурацииКлиент.ПриВыполненииОбновленияИнформационнойБазы(ЗавершениеРаботыСистемы); + Иначе + ОткрытьФорму("ОбщаяФорма.ДополнительноеОписание", Новый Структура("Заголовок,ИмяМакета", + НСтр("ru = 'Установка обновления'"), "ИнструкцияКакВыполнитьУстановкуОбновленияВручную")); КонецЕсли; КонецПроцедуры @@ -830,39 +1033,13 @@ // Процедура ПриИзмененииВыделенныхОбъектов(Список) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда - МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + МодульГрупповоеИзменениеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ГрупповоеИзменениеОбъектовКлиент"); МодульГрупповоеИзменениеОбъектовКлиент.ИзменитьВыделенные(Список); КонецЕсли; КонецПроцедуры -// Обработчик вызывается при завершении работы помощника создания обмена данными по нажатию в помощнике на кнопку "Готово". -// -// Параметры: -// <Помощник> -// Тип: Управляемая форма, Обычная форма. -// Форма помощника создания обмена данными, которая является инициатором события. -// -// <ЗапуститьМенеджерЗаданий> -// Тип: Булево. -// Признак, показывающий, что необходимо выполнить запуск менеджера заданий (отдельного сеанса 1С:Предприятия) -// для отработки регламентных и фоновых заданий при файловом режиме работы информационной базы. -// Параметр имеет значение Истина, когда в помощнике создания обмена пользователь указал расписание -// и режим работы информационной базы файловый. -// Если режим работы информационной базы клиент-серверный, то значение параметра всегда Ложь. -// -Процедура ПриЗавершенииРаботыПомощникаСозданияОбмена(Помощник, ЗапуститьМенеджерЗаданий) Экспорт - - Если ЗапуститьМенеджерЗаданий Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - РегламентныеЗаданияСлужебныйКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РегламентныеЗаданияСлужебныйКлиент"); - РегламентныеЗаданияСлужебныйКлиент.ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийИАктивизироватьОкно(); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - // Обработчик события открытия инструкции по восстановлению/изменению пароля синхронизации данных // с автономным рабочим местом. // @@ -870,7 +1047,7 @@ Если ПустаяСтрока(АдресДляВосстановленияПароляУчетнойЗаписи) Тогда - Предупреждение(НСтр("ru = 'Адрес для восстановления пароля учетной записи не задан.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Адрес для восстановления пароля учетной записи не задан.'")); Иначе @@ -889,8 +1066,8 @@ // Процедура ПриОткрытииФормыОтчетаПоВерсии(Ссылка, СравниваемыеВерсии) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВерсионированиеОбъектовКлиент"); МодульВерсионированиеОбъектовКлиент.ПриОткрытииФормыОтчетаПоВерсии(Ссылка, СравниваемыеВерсии); КонецЕсли; @@ -918,7 +1095,7 @@ Колонки.Удалить(0); - КолонкиСтрокой = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Колонки); + КолонкиСтрокой = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Колонки); Таблица = Новый Массив; diff --git a/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl index 5744289c6..6896e9eec 100644 --- a/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиКлиентСервер/Module.bsl @@ -25,13 +25,7 @@ // Функция НедопустимыеСимволыВИмениПользователяWSПрокси() Экспорт - СистемнаяИнформация = Новый СистемнаяИнформация; - - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.2.17.0") > 0 Тогда - Возврат ":"; - Иначе - Возврат "@/\[]#&*?:;="; - КонецЕсли; + Возврат ":"; КонецФункции diff --git a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl index a3b5595fd..6ceec5dcd 100644 --- a/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиПовтИсп/Module.bsl @@ -69,24 +69,29 @@ КонецФункции -// Устарело. В будущем необходимо использовать "УстановитьВнешнееСоединениеСБазой" +// Устарела. В будущем необходимо использовать "УстановитьВнешнееСоединениеСБазой" // Функция УстановитьВнешнееСоединение(ПараметрыВнешнегоСоединения, СтрокаСообщенияОбОшибке = "") Экспорт - - Результат = ОбщегоНазначения.УстановитьВнешнееСоединениеСБазой(ПараметрыВнешнегоСоединения); - СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; - + + Результат = УстановитьВнешнееСоединениеСБазой(ПараметрыВнешнегоСоединения); + СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; + Возврат Результат.Соединение; КонецФункции -// Устанавливает внешнее соединение с информационной базой и возвращает указатель на это соединение +// Устанавливает внешнее соединение с информационной базой и возвращает описание соединения // (Только для внутреннего использования) // -Функция УстановитьВнешнееСоединениеСБазой(ПараметрыВнешнегоСоединения) Экспорт - Возврат ОбщегоНазначения.УстановитьВнешнееСоединениеСБазой(ПараметрыВнешнегоСоединения); +// Параметры: +// Параметры - Структура - Параметры внешнего соединения, подробно см ОбщегоНазначения.УстановитьВнешнееСоединениеСБазой +// +Функция УстановитьВнешнееСоединениеСБазой(Параметры) Экспорт + + // Преобразуем настройки - параметры внешнего соединения в параметры транспорта + НастройкиТранспорта = ОбменДаннымиСервер.НастройкиТранспортаПоПараметрамВнешнегоСоединения(Параметры); + Возврат ОбменДаннымиСервер.УстановитьВнешнееСоединениеСБазой(НастройкиТранспорта); КонецФункции - // Возвращает признак предопределенного узла этой информационной базы по переданному значению ссылки // // Параметры: @@ -105,8 +110,6 @@ КонецФункции -// - // Определяет, используется ли план обмена, идентифицируемый именем, в модели сервиса. // Чтобы дать возможность это определить, все планы обмена на уровне модуля менеджера // определяют функцию ПланОбменаИспользуетсяВМоделиСервиса(), @@ -164,9 +167,9 @@ // Функция ЭтоАвтономноеРабочееМесто() Экспорт - Возврат АвтономнаяРаботаПоддерживается() + Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() И ОбменДаннымиСервер.ГлавныйУзел() <> Неопределено - И ОбменДаннымиСервер.ГлавныйУзел().Метаданные().Имя = ПланОбменаАвтономнойРаботы(); + И ОбменДаннымиСервер.ГлавныйУзел().Метаданные().Имя = ОбменДаннымиПовтИсп.ПланОбменаАвтономнойРаботы(); КонецФункции @@ -174,8 +177,8 @@ // Функция ЭтоУзелАвтономногоРабочегоМеста(Знач УзелИнформационнойБазы) Экспорт - Возврат АвтономнаяРаботаПоддерживается() - И УзелИнформационнойБазы.Метаданные().Имя = ПланОбменаАвтономнойРаботы() + Возврат ОбменДаннымиПовтИсп.АвтономнаяРаботаПоддерживается() + И УзелИнформационнойБазы.Метаданные().Имя = ОбменДаннымиПовтИсп.ПланОбменаАвтономнойРаботы() ; КонецФункции @@ -983,10 +986,10 @@ // в случае ошибки возвращается Неопределенно. // Функция ПолучитьВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы, СтрокаСообщенияОбОшибке = "") Экспорт - - Результат = ВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы); - - СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; + + Результат = ВнешнееСоединениеДляУзлаИнформационнойБазы(УзелИнформационнойБазы); + + СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; Возврат Результат.Соединение; КонецФункции @@ -1023,24 +1026,6 @@ КонецФункции -// Только для внутреннего использования. Устарело, будет удалено в следующей версии. -// -Функция ПолучитьЭлементыИерархическогоСправочникаИерархияГруппИЭлементов(ПолноеИмяТаблицы) Экспорт - Возврат ОбменДаннымиСервер.ЭлементыИерархическогоСправочникаИерархияГруппИЭлементов(ПолноеИмяТаблицы); -КонецФункции - -// Только для внутреннего использования. Устарело, будет удалено в следующей версии. -// -Функция ПолучитьЭлементыИерархическогоСправочникаИерархияЭлементов(ПолноеИмяТаблицы) Экспорт - Возврат ОбменДаннымиСервер.ЭлементыИерархическогоСправочникаИерархияЭлементов(ПолноеИмяТаблицы); -КонецФункции - -// Только для внутреннего использования. Устарело, будет удалено в следующей версии. -// -Функция ПолучитьЭлементыНеиерархическогоСправочника(ПолноеИмяТаблицы) Экспорт - Возврат ОбменДаннымиСервер.ЭлементыНеиерархическогоСправочника(ПолноеИмяТаблицы); -КонецФункции - // Возвращает признак доступности использования плана обмена. // Признак вычисляется по составу всех функциональных опций конфигурации. // Если план обмена не входит в состав ни одной функциональной опции, то возвращается Истина. @@ -1332,13 +1317,13 @@ Используется = Ложь; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда Используется = ?(Отправитель <> Неопределено, ЭтоУзелОбменаДаннымиБСП(Отправитель), Истина); Если Используется И ПроверятьПраваДоступа Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); Используется = МодульВерсионированиеОбъектов.ЕстьПравоНаЧтениеВерсийОбъектов(); КонецЕсли; @@ -1347,4 +1332,72 @@ Возврат Используется; -КонецФункции \ No newline at end of file +КонецФункции + +// Функция возвращает имя каталога временных файлов. +// +// Возвращаемое значение: +// Строка - путь к каталогу временных файлов. +// +Функция КаталогВременногоХранилищаФайлов() Экспорт + + // Если файловая база, то возвращается КаталогВременныхФайлов. + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Возврат СокрЛП(КаталогВременныхФайлов()); + КонецЕсли; + + ОбщийТипПлатформы = "Windows"; + + ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера(); + + УстановитьПривилегированныйРежим(Истина); + + Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 + ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда + + Результат = Константы.КаталогСообщенийОбменаДаннымиДляWindows.Получить(); + + ИначеЕсли ТипПлатформыСервера = ТипПлатформы.Linux_x86 + ИЛИ ТипПлатформыСервера = ТипПлатформы.Linux_x86_64 Тогда + + Результат = Константы.КаталогСообщенийОбменаДаннымиДляLinux.Получить(); + ОбщийТипПлатформы = "Linux"; + + Иначе + + Результат = Константы.КаталогСообщенийОбменаДаннымиДляWindows.Получить(); + + КонецЕсли; + + УстановитьПривилегированныйРежим(Ложь); + + ПредставлениеКонстанты = ?(ОбщийТипПлатформы = "Linux", + Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляLinux.Представление(), + Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляWindows.Представление()); + + Если ПустаяСтрока(Результат) Тогда + + Результат = СокрЛП(КаталогВременныхФайлов()); + + Иначе + + Результат = СокрЛП(Результат); + + // Проверка существования каталога + Каталог = Новый Файл(Результат); + Если Не Каталог.Существует() Тогда + + ШаблонСообщения = НСтр("ru = 'Каталог временных файлов не существует. + |Необходимо убедиться, что в настройках программы задано правильное значение параметра + |""%1"".'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ПредставлениеКонстанты); + ВызватьИсключение(ТекстСообщения); + + КонецЕсли; + + КонецЕсли; + + Возврат Результат; + +КонецФункции + diff --git a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl index ddbc09fed..631b087df 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСервер/Module.bsl @@ -79,9 +79,9 @@ Если Данные <> Неопределено И ТипЗнч(Данные) = Тип("Соответствие") Тогда - СтрокаСообщенияОбОшибке = ""; - - ВнешнееСоединение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединение(Форма.ПараметрыВнешнегоСоединения, СтрокаСообщенияОбОшибке); + Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(Форма.ПараметрыВнешнегоСоединения); + СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; + ВнешнееСоединение = Подключение.Соединение; Если ВнешнееСоединение = Неопределено Тогда ВызватьИсключение СтрокаСообщенияОбОшибке; @@ -160,64 +160,6 @@ КонецПроцедуры -// Определяет список реквизитов, которые должны быть обязательно заполнены -// при настройке синхронизации данных с учетом функциональных опций -// -// Параметры: -// ПроверяемыеРеквизиты - Массив - Список реквизитов, для которых выполняется проверка заполнения -// ИмяПланаОбмена - Строка - имя плана обмена, для которого выполняется проверка реквизитов -// -Процедура ОпределитьПроверяемыеРеквизитыСУчетомФункциональныхОпций(ПроверяемыеРеквизиты, ИмяПланаОбмена) Экспорт - - ОбратныйИндекс = ПроверяемыеРеквизиты.Количество() - 1; - - Пока ОбратныйИндекс >= 0 Цикл - - ИмяРеквизита = ПроверяемыеРеквизиты[ОбратныйИндекс]; - - Реквизит = Метаданные.ПланыОбмена[ИмяПланаОбмена].Реквизиты.Найти(ИмяРеквизита); - - Если Реквизит <> Неопределено - И Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку Тогда - - ФункциональныеОпции = ФункциональныеОпцииРеквизита(Реквизит); - - УдалитьРеквизит = Истина; - - Если ФункциональныеОпции.Количество() = 0 Тогда - - УдалитьРеквизит = Ложь; - - Иначе - - Для Каждого ИмяФункциональнойОпции Из ФункциональныеОпции Цикл - - Если ПолучитьФункциональнуюОпцию(ИмяФункциональнойОпции) = Истина Тогда - - УдалитьРеквизит = Ложь; - - Прервать; - - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Если УдалитьРеквизит Тогда - - ПроверяемыеРеквизиты.Удалить(ОбратныйИндекс); - - КонецЕсли; - - КонецЕсли; - - ОбратныйИндекс = ОбратныйИндекс - 1; - - КонецЦикла; - -КонецПроцедуры - // Удаляет из списка реквизитов для обязательного заполнения те реквизиты, // которые не отображаются на форме // @@ -547,13 +489,13 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбработкеПараметровЗапуска"].Добавить( - "ОбменДаннымиКлиент"); - КлиентскиеОбработчики[ "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( "ОбменДаннымиКлиент"); + + КлиентскиеОбработчики[ + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( + "ОбменДаннымиКлиент"); // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. @@ -587,7 +529,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( "ОбменДаннымиСервер"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииПоставляемыхПрофилейГруппДоступа"].Добавить( "ОбменДаннымиСервер"); @@ -614,6 +556,10 @@ Возврат; КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Истина); + УстановитьПривилегированныйРежим(Ложь); + Попытка Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") = Ложь Тогда @@ -658,6 +604,10 @@ КонецЕсли; Исключение + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Ложь); + УстановитьПривилегированныйРежим(Ложь); + ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); ЗаписьЖурналаРегистрации( @@ -669,6 +619,9 @@ НСтр("ru = 'Из главного узла не загружены изменения справочника ""Идентификаторы объектов метаданных"": |ошибка загрузки данных. См. подробности в журнале регистрации.'"); КонецПопытки; + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Ложь); + УстановитьПривилегированныйРежим(Ложь); Если Отказ Тогда @@ -700,61 +653,52 @@ Возврат; КонецЕсли; - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") = Ложь Тогда - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - - КонецЕсли; - - Иначе - - Если ПолучитьИспользуемыеПланыОбмена().Количество() > 0 Тогда - - Константы.ИспользоватьСинхронизациюДанных.Установить(Истина); - - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") = Истина Тогда УзелИнформационнойБазы = ГлавныйУзел(); Если УзелИнформационнойБазы <> Неопределено Тогда - // Обновление правил регистрации объектов выполняем до загрузки данных - ВыполнитьОбновлениеПравилДляОбменаДанными(); - - ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); - - Отказ = Ложь; - - ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Истина, Ложь, ВидТранспорта); // только загрузка - - // Режим повтора требует включения в следующих случаях. - // Случай 1. Получены метаданные с новой версией конфигурации, т.е. будет выполнено обновление ИБ. - // - если Отказ = Истина, тогда недопустимо продолжение, т.к. могут быть созданы дубли генерируемых данных, - // - если Отказ = Ложь, тогда возможна ошибка при обновлении ИБ, возможно требующая повторной загрузки сообщения. - // Случай 2. Получены метаданные с той же версией конфигурации, т.е. не будет выполнено обновление ИБ. - // - если Отказ = Истина, тогда возможна ошибка при продолжении запуска, например, из-за того, что - // не были загружены предопределенные элементы, - // - если Отказ = Ложь, тогда продолжение возможно, т.к. выгрузку можно сделать позднее (если же - // выгрузка не выполняется успешно, тогда позднее можно получить и новое сообщение для загрузки). - - Если Отказ ИЛИ ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда - ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); - КонецЕсли; - - Если Отказ Тогда - ВызватьИсключение НСтр("ru = 'Получение данных из главного узла завершилось с ошибками.'"); - КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Истина); + УстановитьПривилегированныйРежим(Ложь); + Попытка + // Обновление правил регистрации объектов выполняем до загрузки данных + ВыполнитьОбновлениеПравилДляОбменаДанными(); + + ВидТранспорта = РегистрыСведений.НастройкиТранспортаОбмена.ВидТранспортаСообщенийОбменаПоУмолчанию(УзелИнформационнойБазы); + + Отказ = Ложь; + + ВыполнитьОбменДаннымиДляУзлаИнформационнойБазы(Отказ, УзелИнформационнойБазы, Истина, Ложь, ВидТранспорта); // только загрузка + + // Режим повтора требует включения в следующих случаях. + // Случай 1. Получены метаданные с новой версией конфигурации, т.е. будет выполнено обновление ИБ. + // - если Отказ = Истина, тогда недопустимо продолжение, т.к. могут быть созданы дубли генерируемых данных, + // - если Отказ = Ложь, тогда возможна ошибка при обновлении ИБ, возможно требующая повторной загрузки сообщения. + // Случай 2. Получены метаданные с той же версией конфигурации, т.е. не будет выполнено обновление ИБ. + // - если Отказ = Истина, тогда возможна ошибка при продолжении запуска, например, из-за того, что + // не были загружены предопределенные элементы, + // - если Отказ = Ложь, тогда продолжение возможно, т.к. выгрузку можно сделать позднее (если же + // выгрузка не выполняется успешно, тогда позднее можно получить и новое сообщение для загрузки). + + Если Отказ ИЛИ ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() Тогда + ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском(); + КонецЕсли; + + Если Отказ Тогда + ВызватьИсключение НСтр("ru = 'Получение данных из главного узла завершилось с ошибками.'"); + КонецЕсли; + Исключение + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Ложь); + УстановитьПривилегированныйРежим(Ложь); + ВызватьИсключение; + КонецПопытки; + УстановитьПривилегированныйРежим(Истина); + УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена", Ложь); + УстановитьПривилегированныйРежим(Ложь); КонецЕсли; КонецЕсли; @@ -829,7 +773,7 @@ ЗафиксироватьТранзакцию(); Исключение Если КонфигурацияИзменена() Тогда - Если НЕ ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском.Свойство( + Если НЕ ОбменДаннымиВызовСервера.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( "СообщениеПолученоИзКэша") Тогда // Переход с конфигурации, в которой не использовалось кэширование // сообщения обмена. Возможно, новое загруженное сообщение содержит @@ -845,7 +789,7 @@ ОтменитьТранзакцию(); УстановитьПривилегированныйРежим(Истина); Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Ложь); - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); УстановитьПривилегированныйРежим(Ложь); ЗаписатьСобытиеПолученияДанных(ГлавныйУзел(), НСтр("ru = 'Обнаружен возврат к конфигурации базы данных. @@ -889,8 +833,7 @@ Если ВызыватьИсключение Тогда ТекстОшибки = НСтр("ru = 'Из главного узла не загружены изменения справочника ""Идентификаторы объектов метаданных"": - |при проверке обнаружено, что требуется загрузить критичные изменения (см. подробности в журнале - |регистрации в событии ""Идентификаторы объектов метаданных.Требуется загрузить критичные изменения""). + |не найдены идентификаторы новых объектов метаданных. См. подробности в журнале регистрации. | |Если недоступно сообщение обмена данными, тогда перезапустите программу, |настройте параметры подключения и повторите синхронизацию. @@ -1236,40 +1179,16 @@ Функция FTPСоединение(Знач Настройки) Экспорт - НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); - - Если НастройкаПроксиСервера <> Неопределено Тогда - ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); - ИспользоватьСистемныеНастройки = НастройкаПроксиСервера.Получить("ИспользоватьСистемныеНастройки"); - Если ИспользоватьПрокси Тогда - Если ИспользоватьСистемныеНастройки Тогда - // Системные настройки прокси-сервера - Прокси = Новый ИнтернетПрокси(Истина); - Иначе - // Ручные настройки прокси-сервера - Прокси = Новый ИнтернетПрокси; - Прокси.Установить("ftp", НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); - Прокси.Пользователь = НастройкаПроксиСервера["Пользователь"]; - Прокси.Пароль = НастройкаПроксиСервера["Пароль"]; - Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; - КонецЕсли; - Иначе - // Не использовать прокси-сервер - Прокси = Новый ИнтернетПрокси(Ложь); - КонецЕсли; - Иначе - Прокси = Неопределено; - КонецЕсли; - Возврат Новый FTPСоединение( Настройки.Сервер, Настройки.Порт, Настройки.ИмяПользователя, Настройки.ПарольПользователя, - Прокси, + НастройкиПроксиСервера(), Настройки.ПассивноеСоединение, Настройки.Таймаут ); + КонецФункции Функция FTPКаталогСуществует(Знач Путь, Знач ИмяКаталога, Знач FTPСоединение) Экспорт @@ -1355,12 +1274,54 @@ КонецЕсли; - Результат.Путь = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПараметрыПодключения, "/"); + Результат.Путь = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПараметрыПодключения, "/"); Результат.Путь = СтрЗаменить(Результат.Путь, "@", ""); Возврат Результат; КонецФункции +// Получает настройки прокси сервера +// +Функция НастройкиПроксиСервера() + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + + МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + МодульПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); + + Иначе + + НастройкаПроксиСервера = Неопределено; + + КонецЕсли; + + Если НастройкаПроксиСервера <> Неопределено Тогда + ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); + ИспользоватьСистемныеНастройки = НастройкаПроксиСервера.Получить("ИспользоватьСистемныеНастройки"); + Если ИспользоватьПрокси Тогда + Если ИспользоватьСистемныеНастройки Тогда + // Системные настройки прокси-сервера + Прокси = Новый ИнтернетПрокси(Истина); + Иначе + // Ручные настройки прокси-сервера + Прокси = Новый ИнтернетПрокси; + Прокси.Установить("ftp", НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); + Прокси.Пользователь = НастройкаПроксиСервера["Пользователь"]; + Прокси.Пароль = НастройкаПроксиСервера["Пароль"]; + Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; + КонецЕсли; + Иначе + // Не использовать прокси-сервер + Прокси = Новый ИнтернетПрокси(Ложь); + КонецЕсли; + Иначе + Прокси = Неопределено; + КонецЕсли; + + Возврат Прокси; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -1409,6 +1370,8 @@ И ЭтоПодчиненныйУзелРИБ() И Не Константы.НастройкаПодчиненногоУзлаРИБЗавершена.Получить()); + УстановитьПривилегированныйРежим(Ложь); + Параметры.Вставить("ПроверитьНеобходимостьОбновленияКонфигурацииПодчиненногоУзла", Не Параметры.ОткрытьПомощникСозданияОбменаДаннымиДляНастройкиПодчиненногоУзла И Пользователи.РолиДоступны("ВыполнениеСинхронизацииДанных")); @@ -1479,6 +1442,8 @@ Объекты.Добавить(Метаданные.Константы.ИспользоватьСинхронизациюДанных); Объекты.Добавить(Метаданные.Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме); Объекты.Добавить(Метаданные.Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса); + Объекты.Добавить(Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляWindows); + Объекты.Добавить(Метаданные.Константы.КаталогСообщенийОбменаДаннымиДляLinux); Объекты.Добавить(Метаданные.Константы.НастройкаПодчиненногоУзлаРИБЗавершена); Объекты.Добавить(Метаданные.Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы); Объекты.Добавить(Метаданные.Константы.СообщениеОбменаДаннымиИзГлавногоУзла); @@ -1525,12 +1490,12 @@ // Заполняет описания поставляемых профилей групп доступа и // переопределяет параметры обновления профилей и групп доступа. -// Подробнее см. УправлениеДоступомПереопределяемый.ЗаполнитьПоставляемыеПрофилиГруппДоступа. +// Подробнее см. УправлениеДоступомПереопределяемый.ПриЗаполненииПоставляемыхПрофилейГруппДоступа. // Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт // Профиль "Синхронизация данных с другими программами". - ОписаниеПрофиля = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом").НовоеОписаниеПрофиляГруппДоступа(); + ОписаниеПрофиля = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом").НовоеОписаниеПрофиляГруппДоступа(); ОписаниеПрофиля.Идентификатор = ПрофильДоступаСинхронизацияДанныхСДругимиПрограммами(); ОписаниеПрофиля.Наименование = НСтр("ru = 'Синхронизация данных с другими программами'"); ОписаниеПрофиля.Описание = НСтр("ru = 'Дополнительно назначается тем пользователям, которым должны быть доступны средства @@ -1586,7 +1551,7 @@ // Процедура ПриОпределенииИспользованияГрупповогоИзмененияОбъектов(Используется) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов") Тогда Используется = Истина; КонецЕсли; @@ -1599,7 +1564,7 @@ // Процедура ПриОпределенииИспользованияДатЗапретаИзменения(Используется) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда Используется = Истина; КонецЕсли; @@ -1614,8 +1579,8 @@ // Процедура ПриИгнорированииВерсииОбъекта(Ссылка, НомерВерсии, Игнорировать) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ИгнорироватьВерсиюОбъекта(Ссылка, НомерВерсии, Игнорировать); КонецЕсли; @@ -1631,8 +1596,8 @@ // Процедура ПриПереходеНаВерсиюОбъекта(ОбъектСсылка, НомерВерсии) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриПереходеНаВерсиюОбъекта(ОбъектСсылка, НомерВерсии); КонецЕсли; @@ -1645,8 +1610,8 @@ // Процедура ПриОбновленииЗаголовковКомандМонитораОбменаДанными(ДатаСобытия, ПолучитьДатуПоследнейКоллизии) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); ДатаСобытия = МодульВерсионированиеОбъектов.ДатаПоследнейКоллизииИлиЗапретаЗагрузки(ПолучитьДатуПоследнейКоллизии); КонецЕсли; @@ -1670,8 +1635,8 @@ // Процедура ПриОтключенииСинхронизацииДанных(Отказ) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОтключенииСинхронизацииДанных(Отказ); КонецЕсли; @@ -1692,8 +1657,8 @@ // Процедура ПослеОпределенияПолучателей(Данные, Получатели, Знач ИмяПланаОбмена) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПослеОпределенияПолучателей(Данные, Получатели, ИмяПланаОбмена); КонецЕсли; @@ -1703,8 +1668,8 @@ // Процедура ПропуститьПроверкуЗапретаИзменения(Пропустить = Истина) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПропуститьПроверкуЗапретаИзменения(Пропустить); КонецЕсли; @@ -2487,8 +2452,8 @@ КонецЦикла; // Удаляем неактуальные сообщения обмена, отмеченные в РС.СообщенияОбменаДаннымиОбластейДанных - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриУдаленииНеактуальныхСообщенийОбмена(); КонецЕсли; @@ -2923,7 +2888,7 @@ Если СтандартнаяОбработка Тогда Попытка - Если Не ПустаяСтрока(ФайлСообщенияОбмена) И ТипЗнч(ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла()) <> Тип("Структура") Тогда + Если Не ПустаяСтрока(ФайлСообщенияОбмена) Тогда УдалитьФайлы(ФайлСообщенияОбмена); КонецЕсли; Исключение @@ -3106,6 +3071,10 @@ Возврат; КонецЕсли; + // Получаем версию удаленной базы + ВерсияБСППоВнешнемуСоединению = ВнешнееСоединение.СтандартныеПодсистемыСервер.ВерсияБиблиотеки(); + ОбменСБСП20 = ОбщегоНазначенияКлиентСервер.СравнитьВерсии("2.1.1.10", ВерсияБСППоВнешнемуСоединению) > 0; + // ИНИЦИАЛИЗАЦИЯ ОБМЕНА ДАННЫМИ (ВНЕШНЕЕ СОЕДИНЕНИЕ) Структура = Новый Структура("ИмяПланаОбмена, ТекущийУзелПланаОбменаКод, КоличествоЭлементовВТранзакции"); ЗаполнитьЗначенияСвойств(Структура, СтруктураНастроекОбмена); @@ -3117,11 +3086,6 @@ // Структура.Вставить("ДействиеПриОбменеСтрокой", ДействиеПриОбменеСтрокой); - - ОбменСБСП20 = Ложь; - ВерсияБСППоВнешнемуСоединению = ВнешнееСоединение.СтандартныеПодсистемыСервер.ВерсияБиблиотеки(); - ОбменСБСП20 = ОбщегоНазначенияКлиентСервер.СравнитьВерсии("2.1.1.10", ВерсияБСППоВнешнемуСоединению) > 0; - Структура.Вставить("РежимОтладки", Ложь); Структура.Вставить("ИмяФайлаПротоколаОбмена", ""); @@ -3139,7 +3103,7 @@ КонецПопытки; СтруктураНастроекОбмена.РезультатВыполненияОбмена = Неопределено; - СтруктураНастроекОбменаВнешнееСоединение.ДатаНачала = ТекущаяДатаСеанса(); + СтруктураНастроекОбменаВнешнееСоединение.ДатаНачала = ВнешнееСоединение.ТекущаяДатаСеанса(); ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.ЗаписьЖурналаРегистрацииНачалаОбменаДанными(СтруктураНастроекОбменаВнешнееСоединение); @@ -3351,27 +3315,25 @@ Если ЭтоПодчиненныйУзелРИБ() И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда - СохраненноеСообщениеОбмена = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); + СохраненноеСообщениеОбмена = Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); Если ТипЗнч(СохраненноеСообщениеОбмена) = Тип("ДвоичныеДанные") Тогда - СтандартнаяОбработка = Ложь; - СообщениеОбмена = ПолучитьИмяВременногоФайла("xml"); - СохраненноеСообщениеОбмена.Записать(СообщениеОбмена); - ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); - УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Истина); + СтандартнаяОбработка = Ложь; - ИначеЕсли ТипЗнч(СохраненноеСообщениеОбмена) = Тип("Структура") Тогда + СообщениеОбмена = ПолучитьИмяВременногоФайла("xml"); + + СохраненноеСообщениеОбмена.Записать(СообщениеОбмена); + + ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); - СтандартнаяОбработка = Ложь; - СообщениеОбмена = СохраненноеСообщениеОбмена.ПутьКФайлу; - ЗаписатьСобытиеПолученияДанных(Получатель, НСтр("ru = 'Сообщение обмена получено из кэша.'")); УстановитьПривилегированныйРежим(Истина); УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Истина); УстановитьПривилегированныйРежим(Ложь); - Иначе + УстановитьПривилегированныйРежим(Истина); УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша", Ложь); + УстановитьПривилегированныйРежим(Ложь); КонецЕсли; КонецЕсли; @@ -3379,16 +3341,15 @@ КонецПроцедуры // Для внутреннего использования -// Процедура ПослеЧтенияСообщенияОбмена(Знач Получатель, Знач СообщениеОбмена, Знач СообщениеПрочитано, СтандартнаяОбработка, Знач УдалитьСообщение = Истина) Если ЭтоПодчиненныйУзелРИБ() И ТипЗнч(ГлавныйУзел()) = ТипЗнч(Получатель) Тогда Если НЕ СообщениеПрочитано - И ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском.Свойство("СообщениеПолученоИзКэша") Тогда + И ОбменДаннымиВызовСервера.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("СообщениеПолученоИзКэша") Тогда // Не удалось прочитать сообщение, полученное из кэша - требуется очистка кэша. - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); Возврат; КонецЕсли; @@ -3413,11 +3374,12 @@ Если УдалитьСообщение Тогда - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); Если Константы.ЗагрузитьСообщениеОбменаДанными.Получить() = Истина Тогда Константы.ЗагрузитьСообщениеОбменаДанными.Установить(Ложь); КонецЕсли; + Иначе // Т.к. чтение сообщение обмена может быть без загрузки метаданных, // то нужно сохранить сообщение обмена после чтения параметров работы программы, @@ -3428,33 +3390,27 @@ КонецЕсли; Если ОбновитьСообщениеВКэше Тогда + СтароеСообщение = Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); - СтароеСообщение = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); - + НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); ОбновитьКэш = Ложь; - НовоеСообщение = Новый ДвоичныеДанные(СообщениеОбмена); - ТипСтруктура = ТипЗнч(СтароеСообщение) = Тип("Структура"); - Если ТипСтруктура Или ТипЗнч(СтароеСообщение) = Тип("ДвоичныеДанные") Тогда - - Если ТипСтруктура Тогда - СтароеСообщение = Новый ДвоичныеДанные(СтароеСообщение.ПутьКФайлу); - КонецЕсли; - + Если ТипЗнч(СтароеСообщение) <> Тип("ДвоичныеДанные") Тогда + ОбновитьКэш = Истина; + Иначе Если СтароеСообщение.Размер() <> НовоеСообщение.Размер() Тогда ОбновитьКэш = Истина; ИначеЕсли НовоеСообщение <> СтароеСообщение Тогда ОбновитьКэш = Истина; КонецЕсли; - - Иначе - - ОбновитьКэш = Истина; - КонецЕсли; Если ОбновитьКэш Тогда - УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(НовоеСообщение, Получатель); + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить( + Новый ХранилищеЗначения(НовоеСообщение, Новый СжатиеДанных(9))); + + ЗаписатьСобытиеПолученияДанных( + Получатель, НСтр("ru = 'Сообщение обмена записано в кэш.'")); КонецЕсли; КонецЕсли; @@ -4361,7 +4317,7 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриПолученииФайлаИзХранилища(ИдентификаторФайла, ИмяФайла); Иначе @@ -4397,7 +4353,7 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриПомещенииФайлаВХранилище(СтруктураЗаписи); Иначе @@ -4825,7 +4781,7 @@ | И ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОсновнойОтбор)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОсновнойОтбор)); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -4848,7 +4804,7 @@ | ТаблицаРегистра.Период >= &ДатаНачалаВыгрузки"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОсновнойОтбор)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОсновнойОтбор)); Запрос = Новый Запрос; Запрос.УстановитьПараметр("ДатаНачалаВыгрузки", ДатаНачалаВыгрузки); @@ -4870,7 +4826,7 @@ | ТаблицаРегистра.Организация В(&Организации)"; ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъекта]", ПолноеИмяОбъекта); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОсновнойОтбор)); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Измерения]", СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОсновнойОтбор)); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организации", Организации); @@ -5074,6 +5030,27 @@ Возврат НастройкиСинхронизации; КонецФункции +Функция КоличествоНастроенныхОбменов(Знач ПланыОбмена) Экспорт + + ТекстЗапроса = "ВЫБРАТЬ + | 1 КАК Поле1 + |ИЗ + | ПланыОбменаКонфигурации КАК ПланыОбмена"; + + УстановитьПривилегированныйРежим(Истина); + + МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + + ПолучитьТаблицуПлановОбменаДляМонитора(МенеджерВременныхТаблиц, ПланыОбмена, ""); + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; + + Возврат Запрос.Выполнить().Выгрузить().Количество(); + +КонецФункции + // Для внутреннего использования // Функция ОбменДаннымиВыполненСПредупреждениями(Знач УзелИнформационнойБазы) Экспорт @@ -5196,20 +5173,37 @@ Результат = Новый Массив; - ЗначенияПоУмолчанию = ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента(ИмяПланаОбмена, ВерсияКорреспондента); + Настройки = ЗначенияПоУмолчаниюНаУзлеБазыКорреспондента(ИмяПланаОбмена, ВерсияКорреспондента); - Для Каждого Элемент Из ЗначенияПоУмолчанию Цикл + Для Каждого Реквизит Из Метаданные.ПланыОбмена[ИмяПланаОбмена].Реквизиты Цикл - Если Найти(Элемент.Ключ, "_Ключ") > 0 Тогда - Продолжить; + Если Настройки.Свойство(Реквизит.Имя) Тогда + + Если Реквизит.Тип.Типы().Количество() <> 1 Тогда + + СтрокаСообщения = НСтр("ru = 'Составной тип данных для значений по умолчанию не поддерживается. + |Реквизит ""%1"".'"); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Реквизит.ПолноеИмя()); + ВызватьИсключение СтрокаСообщения; + КонецЕсли; + + ОбъектМетаданных = Метаданные.НайтиПоТипу(Реквизит.Тип.Типы().Получить(0)); + + Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда + + СтрокаСообщения = НСтр("ru = 'Выбор значений по умолчанию поддерживается только для справочников. + |Реквизит ""%1"".'"); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Реквизит.ПолноеИмя()); + ВызватьИсключение СтрокаСообщения; + КонецЕсли; + + Результат.Добавить(ОбъектМетаданных.ПолноеИмя()); + КонецЕсли; - Результат.Добавить(Элемент.Ключ); - КонецЦикла; Возврат Новый ФиксированныйМассив(Результат); - КонецФункции // Процедура удаляет неактуальные записи в регистре сведений. @@ -5324,7 +5318,7 @@ КонецЦикла; - ДополнительныеСвойстваБезИсточникаДанныхСтрокой = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ДополнительныеСвойстваБезИсточникаДанных) + ", "; + ДополнительныеСвойстваБезИсточникаДанныхСтрокой = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ДополнительныеСвойстваБезИсточникаДанных) + ", "; КонецЕсли; @@ -5413,10 +5407,10 @@ Если ПолучитьФункциональнуюОпцию("ИспользоватьСинхронизациюДанных") <> Истина Тогда - ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,, - НСтр("ru = 'Выполнение обмена запрещено администратором.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка())); + ТекстСообщения = НСтр("ru = 'Синхронизация данных запрещена администратором.'"); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииОбменДанными(), УровеньЖурналаРегистрации.Ошибка,,,ТекстСообщения); + ВызватьИсключение ТекстСообщения; - ВызватьИсключение НСтр("ru = 'Выполнение обмена запрещено администратором.'"); КонецЕсли; КонецПроцедуры @@ -5427,7 +5421,12 @@ Если Не Пользователи.РолиДоступны("ВыполнениеСинхронизацииДанных, НастройкаСинхронизацииДанных") Тогда - ВызватьИсключение НСтр("ru = 'Нет прав на выполнение обменов данными.'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для синхронизации данных.'"); + + ИначеЕсли ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы() + И НЕ ОбменДаннымиВызовСервера.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском("ЗагрузкаРазрешена") Тогда + + ВызватьИсключение НСтр("ru = 'Информационная база находится в состоянии обновления.'"); КонецЕсли; @@ -5439,7 +5438,7 @@ Если Не Пользователи.РолиДоступны("НастройкаСинхронизацииДанных") Тогда - ВызватьИсключение НСтр("ru = 'Нет прав на администрирование обменов данными.'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для администрирования синхронизации данных.'"); КонецЕсли; @@ -5451,8 +5450,8 @@ Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда - ВызватьИсключение НСтр("ru = 'Выполнение обмена данными через прямое подключение на сервере под управлением ОС Linux недоступно. - |Для выполнения обмена данными через прямое подключение требуется использовать ОС Windows.'"); + ВызватьИсключение НСтр("ru = 'Синхронизация данных через прямое подключение на сервере под управлением ОС Linux недоступно. + |Для синхронизации данных через прямое подключение требуется использовать ОС Windows.'"); КонецЕсли; @@ -6038,25 +6037,6 @@ Возврат Значение; КонецФункции -// Для внутреннего использования -// -Функция ФункциональныеОпцииРеквизита(Реквизит) - - Результат = Новый Массив; - - Для Каждого ФункциональнаяОпция Из Метаданные.ФункциональныеОпции Цикл - - Если ФункциональнаяОпция.Состав.Содержит(Реквизит) Тогда - - Результат.Добавить(ФункциональнаяОпция.Имя); - - КонецЕсли; - - КонецЦикла; - - Возврат Результат; -КонецФункции - // Для внутреннего использования // Функция НаименованиеПредопределенногоУзлаПланаОбмена(ИмяПланаОбмена) Экспорт @@ -6400,7 +6380,7 @@ Колонки.Удалить(0); - КолонкиСтрокой = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Колонки); + КолонкиСтрокой = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Колонки); Таблица = Новый Массив; @@ -6453,7 +6433,7 @@ КонецЦикла; - РеквизитыСтрокой.Добавить(СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(Колонки, ".")); + РеквизитыСтрокой.Добавить(СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(Колонки, ".")); Иначе @@ -6463,7 +6443,7 @@ КонецЦикла; - Возврат СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(РеквизитыСтрокой); + Возврат СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(РеквизитыСтрокой); КонецФункции // Проверяет наличие указанных реквизитов в форме. @@ -6490,7 +6470,7 @@ Если ОтсутствующиеРеквизиты.Количество() > 0 Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Отсутствуют обязательные реквизиты формы настройки узла: %1'"), - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОтсутствующиеРеквизиты) + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОтсутствующиеРеквизиты) ); КонецЕсли; @@ -6708,9 +6688,9 @@ Если ПараметрыПодключения.ТипСоединения = "ВнешнееСоединение" Тогда - СтрокаСообщенияОбОшибке = ""; - - ВнешнееСоединение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединение(ПараметрыПодключения, СтрокаСообщенияОбОшибке); + Подключение = ОбменДаннымиПовтИсп.УстановитьВнешнееСоединениеСБазой(ПараметрыПодключения); + СтрокаСообщенияОбОшибке = Подключение.ПодробноеОписаниеОшибки; + ВнешнееСоединение = Подключение.Соединение; Если ВнешнееСоединение = Неопределено Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СтрокаСообщенияОбОшибке,,,, Отказ); @@ -6938,7 +6918,7 @@ // Только для внутреннего использования // -Функция ЭлементыИерархическогоСправочникаИерархияГруппИЭлементов(Знач ПолноеИмяТаблицы) Экспорт +Функция ЭлементыИерархическогоСправочникаИерархияГруппИЭлементов(Знач ПолноеИмяТаблицы) Запрос = Новый Запрос(" |ВЫБРАТЬ ПЕРВЫЕ 2000 @@ -6962,7 +6942,7 @@ // Только для внутреннего использования // -Функция ЭлементыИерархическогоСправочникаИерархияЭлементов(Знач ПолноеИмяТаблицы) Экспорт +Функция ЭлементыИерархическогоСправочникаИерархияЭлементов(Знач ПолноеИмяТаблицы) Запрос = Новый Запрос(" |ВЫБРАТЬ ПЕРВЫЕ 2000 @@ -6983,7 +6963,7 @@ // Только для внутреннего использования // -Функция ЭлементыНеиерархическогоСправочника(Знач ПолноеИмяТаблицы) Экспорт +Функция ЭлементыНеиерархическогоСправочника(Знач ПолноеИмяТаблицы) Запрос = Новый Запрос(" |ВЫБРАТЬ ПЕРВЫЕ 2000 @@ -7042,43 +7022,14 @@ Функция ДанныеТаблицКорреспондента(Таблицы, Знач ИмяПланаОбмена) Экспорт Результат = Новый Соответствие; - РеквизитыПланаОбмена = Метаданные.ПланыОбмена[ИмяПланаОбмена].Реквизиты; - Для Каждого Элемент Из Таблицы Цикл + Для Каждого Таблица Из Таблицы Цикл - Реквизит = РеквизитыПланаОбмена.Найти(Элемент); + ДанныеТаблицы = Новый Структура("СвойстваОбъектаМетаданных, ТаблицаБазыКорреспондента"); + ДанныеТаблицы.СвойстваОбъектаМетаданных = СвойстваОбъектаМетаданных(Таблица); + ДанныеТаблицы.ТаблицаБазыКорреспондента = ПолучитьОбъектыТаблицы(Таблица); - Если Реквизит <> Неопределено Тогда - - ТипыРеквизита = Реквизит.Тип.Типы(); - - Если ТипыРеквизита.Количество() <> 1 Тогда - - СтрокаСообщения = НСтр("ru = 'Составной тип данных для значений по умолчанию не поддерживается. - |Реквизит ""%1"".'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Реквизит.ПолноеИмя()); - ВызватьИсключение СтрокаСообщения; - КонецЕсли; - - ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипыРеквизита.Получить(0)); - - Если Не ОбщегоНазначения.ЭтоСправочник(ОбъектМетаданных) Тогда - - СтрокаСообщения = НСтр("ru = 'Выбор значений по умолчанию поддерживается только для справочников. - |Реквизит ""%1"".'"); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, Реквизит.ПолноеИмя()); - ВызватьИсключение СтрокаСообщения; - КонецЕсли; - - ПолноеИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); - - ДанныеТаблицы = Новый Структура("СвойстваОбъектаМетаданных, ТаблицаБазыКорреспондента"); - ДанныеТаблицы.СвойстваОбъектаМетаданных = СвойстваОбъектаМетаданных(ПолноеИмяОбъектаМетаданных); - ДанныеТаблицы.ТаблицаБазыКорреспондента = ПолучитьОбъектыТаблицы(ПолноеИмяОбъектаМетаданных); - - Результат.Вставить(ПолноеИмяОбъектаМетаданных, ДанныеТаблицы); - - КонецЕсли; + Результат.Вставить(Таблица, ДанныеТаблицы); КонецЦикла; @@ -7091,7 +7042,6 @@ Результат.Вставить("{ДополнительныеДанные}", ДополнительныеДанные); Возврат Результат; - КонецФункции // Для внутреннего использования @@ -7147,7 +7097,7 @@ ОтборМассив = ИнформацияСтатистики.ВыгрузитьКолонку("ИмяТаблицыПриемника"); - ОтборСтрока = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОтборМассив); + ОтборСтрока = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОтборМассив); Отбор = Новый Структура("ПолноеИмя", ОтборСтрока); @@ -7312,7 +7262,7 @@ |Эти правила могут быть несовместимы с новой версией программы. |Для предупреждения возможного возникновения ошибок при работе с программой рекомендуется актуализировать правила обмена из файла.'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПланыОбменаМассив)); + СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщения, СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПланыОбменаМассив)); ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Ошибка,,, СтрокаСообщения); @@ -7355,43 +7305,93 @@ КонецПроцедуры -// Устарело. В будущем необходимо использовать "УстановитьВнешнееСоединениеСБазой" +// Устарела. В будущем необходимо использовать "УстановитьВнешнееСоединениеСБазой" // Функция УстановитьВнешнееСоединение(СтруктураНастроек, СтрокаСообщенияОбОшибке = "", ОшибкаПодключенияКомпоненты = Ложь) Экспорт - - Результат = УстановитьВнешнееСоединениеСБазой(СтруктураНастроек); - - ОшибкаПодключенияКомпоненты = Результат.ОшибкаПодключенияКомпоненты; - СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; - - Возврат Результат.Соединение; + + Результат = УстановитьВнешнееСоединениеСБазой(СтруктураНастроек); + + ОшибкаПодключенияКомпоненты = Результат.ОшибкаПодключенияКомпоненты; + СтрокаСообщенияОбОшибке = Результат.ПодробноеОписаниеОшибки; + + Возврат Результат.Соединение; КонецФункции -// Для внутреннего использования -// +// Основная функция для использования внешнего соединения при обмене. Для внутреннего использования +// +// Параметры: +// СтруктураНастроек - структура настроек транспорта COM обмена +// Функция УстановитьВнешнееСоединениеСБазой(СтруктураНастроек) Экспорт Результат = ОбщегоНазначения.УстановитьВнешнееСоединениеСБазой( ЗаполнитьПараметрыПодключенияВнешнегоСоединения(СтруктураНастроек)); ВнешнееСоединение = Результат.Соединение; - Если ВнешнееСоединение<>Неопределено Тогда - Попытка - Если Не ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.РольДоступнаПолныеПрава() Тогда - СтрокаСообщенияОбОшибке = НСтр("ru = 'Для пользователя внешнего соединения должна быть указана роль ""Полные права"".'"); - Результат.ПодробноеОписаниеОшибки = СтрокаСообщенияОбОшибке; - Результат.КраткоеОписаниеОшибки = СтрокаСообщенияОбОшибке; - КонецЕсли; + Если ВнешнееСоединение = Неопределено Тогда + // Ошибка установки соединения + Возврат Результат; + КонецЕсли; + + // Дополнительно проверяем возможность работы с внешней базой + + Попытка + НетПолныхПрав = Не ВнешнееСоединение.ОбменДаннымиВнешнееСоединение.РольДоступнаПолныеПрава(); + Исключение + НетПолныхПрав = Истина; + КонецПопытки; + + Если НетПолныхПрав Тогда + Результат.ПодробноеОписаниеОшибки = НСтр("ru = 'У пользователя другой программы отсутствует роль ""Полные права"".'"); + Результат.КраткоеОписаниеОшибки = Результат.ПодробноеОписаниеОшибки; + Результат.Соединение = Неопределено; + Иначе + Попытка + СостояниеНеДопустимо = ВнешнееСоединение.ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы(); Исключение - СтрокаСообщенияОбОшибке = НСтр("ru = 'Для пользователя внешнего соединения должна быть указана роль ""Полные права"".'"); - Результат.ПодробноеОписаниеОшибки = СтрокаСообщенияОбОшибке; - Результат.КраткоеОписаниеОшибки = СтрокаСообщенияОбОшибке; + СостояниеНеДопустимо = Ложь КонецПопытки; + + Если СостояниеНеДопустимо Тогда + Результат.ПодробноеОписаниеОшибки = НСтр("ru = 'Другая программа находится в состоянии обновления.'"); + Результат.КраткоеОписаниеОшибки = Результат.ПодробноеОписаниеОшибки; + Результат.Соединение = Неопределено; + КонецЕсли; + КонецЕсли; Возврат Результат; КонецФункции +Функция НастройкиТранспортаПоПараметрамВнешнегоСоединения(Параметры) Экспорт + + // Преобразуем настройки - параметры внешнего соединения в параметры транспорта + НастройкиТранспорта = + НастройкаТранспорта(Параметры, "COMВариантРаботыИнформационнойБазы", "ВариантРаботыИнформационнойБазы", + НастройкаТранспорта(Параметры, "COMКаталогИнформационнойБазы", "КаталогИнформационнойБазы", + НастройкаТранспорта(Параметры, "COMИмяСервера1СПредприятия", "ИмяСервера1СПредприятия", + НастройкаТранспорта(Параметры, "COMИмяИнформационнойБазыНаСервере1СПредприятия", "ИмяИнформационнойБазыНаСервере1СПредприятия", + НастройкаТранспорта(Параметры, "COMАутентификацияОперационнойСистемы", "АутентификацияОперационнойСистемы", + НастройкаТранспорта(Параметры, "COMИмяПользователя", "ИмяПользователя", + НастройкаТранспорта(Параметры, "COMПарольПользователя", "ПарольПользователя", + ))))))); + + Возврат НастройкиТранспорта; +КонецФункции + +// Вспомогательное +Функция НастройкаТранспорта(Знач ПараметрыСоединения, Знач ИмяПараметраТранспорта, Знач ИмяПараметраСоединения, Знач НачальнаяНастройка = Неопределено) + Результат = ?(НачальнаяНастройка = Неопределено, Новый Структура, НачальнаяНастройка); + + ЗначениеПараметра = Неопределено; + ПараметрыСоединения.Свойство(ИмяПараметраСоединения, ЗначениеПараметра); + Результат.Вставить(ИмяПараметраТранспорта, ЗначениеПараметра); + + Возврат Результат; +КонецФункции + + + // Для внутреннего использования // Функция ПолучитьWSПроксиПоПараметрамПодключения( @@ -7968,7 +7968,7 @@ // Процедура ВключитьПовторениеЗагрузкиСообщенияОбменаДаннымиПередЗапуском() - ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла(); + Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); Константы.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском.Установить(Истина); @@ -8005,7 +8005,7 @@ // Функция КаталогВременногоХранилищаФайлов() - Возврат ОбщегоНазначенияПовтИсп.КаталогВременногоХранилищаФайлов(); + Возврат ОбменДаннымиПовтИсп.КаталогВременногоХранилищаФайлов(); КонецФункции @@ -8086,7 +8086,7 @@ // Функция СоздатьВременныйКаталогСообщенийОбмена() Экспорт - Результат = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбщегоНазначенияПовтИсп.КаталогВременногоХранилищаФайлов(), ИмяВременногоКаталогаСообщенийОбмена()); + Результат = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла(ОбменДаннымиПовтИсп.КаталогВременногоХранилищаФайлов(), ИмяВременногоКаталогаСообщенийОбмена()); СоздатьКаталог(Результат); @@ -8102,6 +8102,7 @@ КонецФункции // Возвращает признак необходимости загрузки сообщения обмена данными +// Функция ЗагрузитьСообщениеОбменаДанными() Экспорт УстановитьПривилегированныйРежим(Истина); @@ -8927,10 +8928,9 @@ КонецФункции // Для внутреннего использования -// Процедура УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском(Знач Свойство, Знач ВключитьРежим) Экспорт - УстановитьПривилегированныйРежим(Истина); + // Перед вызовом требуется установить привилегированный режим.. Если ЭтоПодчиненныйУзелРИБ() Тогда @@ -9942,8 +9942,8 @@ Функция КоличествоПроблемВерсионирования(УзлыОбмена = Неопределено, ЭтоКоличествоКоллизий = Неопределено, УчитыватьПроигнорированные = Ложь, Период = Неопределено, СтрокаПоиска = "") Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); Возврат МодульВерсионированиеОбъектов.КоличествоКоллизийИлиНепринятых(УзлыОбмена, ЭтоКоличествоКоллизий, УчитыватьПроигнорированные, Период, СтрокаПоиска); КонецЕсли; @@ -10299,21 +10299,15 @@ // Ссылка: ссылка на проверяемый объект. // ДополнительныеСвойства: необязательная структура с дополнительными свойствами, передаваемыми через объект // -Функция ВыгрузкаСсылкиРазрешена(УзелОбмена, Ссылка, ДополнительныеСвойства = Неопределено) Экспорт +Функция ВыгрузкаСсылкиРазрешена(УзелОбмена, Ссылка, ДополнительныеСвойства=Неопределено) Экспорт Если Ссылка.Пустая() Тогда - Возврат Ложь; - КонецЕсли; - - РежимВыгрузкиОбъекта = ОбменДаннымиПовтИсп.РежимВыгрузкиОбъекта(Ссылка.Метаданные().ПолноеИмя(), УзелОбмена); - Если РежимВыгрузкиОбъекта = Перечисления.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости Тогда - // Выгружаемые по ссылке можно всегда - Возврат Истина; + Возврат Ложь КонецЕсли; ОбъектСсылки = Ссылка.ПолучитьОбъект(); Если ОбъектСсылки = Неопределено Тогда - // Объект удален, можно всегда + // Объект удален удаление объекта посылаем всегда. Возврат Истина; КонецЕсли; @@ -10359,7 +10353,7 @@ Функция ИнтерактивноеИзменениеВыгрузки_ОбъектПоНастройкам(Знач Настройки) ОбъектОтчета = Обработки.ИнтерактивноеИзменениеВыгрузки.Создать(); - ЗаполнитьЗначенияСвойств(ОбъектОтчета, Настройки,, "КомпоновщикОтбораВсехДокументов"); + ЗаполнитьЗначенияСвойств(ОбъектОтчета, Настройки, , "КомпоновщикОтбораВсехДокументов"); // Компоновщик конструируем по частям Данные = ОбъектОтчета.КомпоновщикНастроекОбщегоОтбора(); @@ -10367,7 +10361,8 @@ Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки)); Компоновщик.ЗагрузитьНастройки(Данные.Настройки); - ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Компоновщик; + ОбъектОтчета.КомпоновщикОтбораВсехДокументов = Компоновщик; + ЭлементыОтбора = ОбъектОтчета.КомпоновщикОтбораВсехДокументов.Настройки.Отбор.Элементы; ЭлементыОтбора.Очистить(); ОбъектОтчета.ДобавитьЗначенияОтбораКомпоновки( @@ -10453,7 +10448,7 @@ // Функция РолиПрофиляДоступаСинхронизацияДанныхСДругимиПрограммами() - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда Возврат "ВыполнениеСинхронизацииДанных, УдаленныйДоступБазоваяФункциональность, ЧтениеИнформацииОВерсияхОбъектов"; Иначе Возврат "ВыполнениеСинхронизацииДанных, УдаленныйДоступБазоваяФункциональность"; @@ -10461,63 +10456,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции для работы с константой СообщениеОбменаДаннымиИзГлавногоУзла -// - -// Зачитывает из информационной базы информацию о сообщении обмена данными -// -// Возвращаемое значение - Структура - Информация о расположении файла сообщения обмена (текущий формат) -// - ДвоичныеДанные - Сообщение обмена в информационной базе (устаревший формат) -// -Функция ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла() - - Возврат Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Получить().Получить(); - -КонецФункции - -// Записывает на диск файл сообщения обмена, полученный из главного узла. -// Сохраняет путь к записанному сообщению в константу СообщениеОбменаДаннымиИзГлавногоУзла. -// -// Параметры: -// СообщениеОбмена - ДвоичныеДанные - Зачитанное сообщение обмена -// ГлавныйУзел - ПланОбменаСсылка - Узел из которого получено сообщение -// -Процедура УстановитьСообщениеОбменаДаннымиИзГлавногоУзла(СообщениеОбмена, ГлавныйУзел) Экспорт - - ПутьКФайлу = "[Каталог][Путь].xml"; - ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Каталог]", КаталогВременногоХранилищаФайлов()); - ПутьКФайлу = СтрЗаменить(ПутьКФайлу, "[Путь]", Новый УникальныйИдентификатор); - - СообщениеОбмена.Записать(ПутьКФайлу); - - СтруктураСообщения = Новый Структура; - СтруктураСообщения.Вставить("ПутьКФайлу", ПутьКФайлу); - - Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(СтруктураСообщения)); - - ЗаписатьСобытиеПолученияДанных(ГлавныйУзел, НСтр("ru = 'Сообщение обмена записано в кэш.'")); - -КонецПроцедуры - -// Удаляет файл сообщения обмена с диска и очищает константу СообщениеОбменаДаннымиИзГлавногоУзла -// -Процедура ОчиститьСообщениеОбменаДаннымиИзГлавногоУзла() Экспорт - - СообщениеОбмена = ПолучитьСообщениеОбменаДаннымиИзГлавногоУзла(); - - Если ТипЗнч(СообщениеОбмена) = Тип("Структура") Тогда - - УдалитьФайлы(СообщениеОбмена.ПутьКФайлу); - - КонецЕсли; - - Константы.СообщениеОбменаДаннымиИзГлавногоУзла.Установить(Новый ХранилищеЗначения(Неопределено)); - - ЗаписатьСобытиеПолученияДанных(ГлавныйУзел(), НСтр("ru = 'Сообщение обмена удалено из кэша.'")); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС ИНТЕРАКТИВНОГО ДОПОЛНЕНИЯ ВЫГРУЗКИ // @@ -10532,7 +10470,7 @@ // Возвращаемое значение: // Структура - данные для дальнейшего оперирования дополнением выгрузки // -Функция ИнтерактивноеИзменениеВыгрузки(Знач УзелИнформационнойБазы, Знач АдресХранилищаФормы, Знач ЕстьСценарийУзла = Неопределено) Экспорт +Функция ИнтерактивноеИзменениеВыгрузки(Знач УзелИнформационнойБазы, Знач АдресХранилищаФормы, Знач ЕстьСценарийУзла=Неопределено) Экспорт Результат = Новый Структура; Результат.Вставить("УзелИнформационнойБазы", УзелИнформационнойБазы); @@ -10594,25 +10532,14 @@ МетаУзел = УзелИнформационнойБазы.Метаданные(); - Если ЕстьСценарийУзла = Неопределено Тогда + Если ЕстьСценарийУзла=Неопределено Тогда // Можно определить по метаданным узла ЕстьСценарийУзла = Ложь; КонецЕсли; Если ЕстьСценарийУзла Тогда - МодульМенеджераУзла = ПланыОбмена[МетаУзел.Имя]; - МожноНастраивать = Ложь; - Попытка - МожноНастраивать = МодульМенеджераУзла.НастраиватьИнтерактивнуюВыгрузку(УзелИнформационнойБазы); - Исключение - // Обработка не требуется, считаем функционал недоступным - КонецПопытки; - - Если МожноНастраивать Тогда - МодульМенеджераУзла.НастроитьИнтерактивнуюВыгрузку(УзелИнформационнойБазы, Результат.ПараметрыСценарияДополнения); - КонецЕсли; - + МодульМенеджераУзла.НастроитьИнтерактивнуюВыгрузку(УзелИнформационнойБазы, Результат.ПараметрыСценарияДополнения); КонецЕсли; Результат.Вставить("АдресХранилищаФормы", АдресХранилищаФормы); @@ -10636,7 +10563,6 @@ Компоновщик = Новый КомпоновщикНастроекКомпоновкиДанных; Компоновщик.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки)); Компоновщик.ЗагрузитьНастройки(Данные.Настройки); - ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов = Компоновщик; КонецЕсли; @@ -10725,14 +10651,14 @@ ЗаполнитьЗначенияСвойств(ДополнениеВыгрузки, ОбработкаДополнения, СписокРеквизитов); - ЗаполнитьТаблицуЗначений(ДополнениеВыгрузки.ДополнительнаяРегистрация, ОбработкаДополнения.ДополнительнаяРегистрация); - ЗаполнитьТаблицуЗначений(ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла, ОбработкаДополнения.ДополнительнаяРегистрацияСценарияУзла); - // И обновляем адрес Данные = ОбработкаДополнения.КомпоновщикНастроекОбщегоОтбора(); Данные.Настройки = ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов.Настройки; ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов = ПоместитьВоВременноеХранилище(Данные, ДополнениеВыгрузки.АдресХранилищаФормы); + ЗаполнитьТаблицуЗначений(ДополнениеВыгрузки.ДополнительнаяРегистрация, ОбработкаДополнения.ДополнительнаяРегистрация); + ЗаполнитьТаблицуЗначений(ДополнениеВыгрузки.ДополнительнаяРегистрацияСценарияУзла, ОбработкаДополнения.ДополнительнаяРегистрацияСценарияУзла); + // Текущее представление ранее запомненных настроек ДополнениеВыгрузки.ПредставлениеТекущейНастройки = ПредставлениеНастройки; КонецЕсли; @@ -10744,7 +10670,7 @@ // // Параметры: // ДополнениеВыгрузки - Структура, РеквизитФормыКоллекция - описание параметров выгрузки -// ПредставлениеНастройки - Строка - название сохраняемой настройки +// ПредставлениеНастройки - Строка - название восстанавливаемой настройки // Процедура ИнтерактивноеИзменениеВыгрузкиСохранитьНастройки(ДополнениеВыгрузки, Знач ПредставлениеНастройки) Экспорт @@ -10754,7 +10680,7 @@ СписокРеквизитов = " |ВариантВыгрузки, ПериодОтбораВсехДокументов, |ПериодОтбораСценарияУзла, ПредставлениеОтбораСценарияУзла"; - + ЗаполнитьЗначенияСвойств(ОбработкаДополнения, ДополнениеВыгрузки, СписокРеквизитов); ЗаполнитьТаблицуЗначений(ОбработкаДополнения.ДополнительнаяРегистрация, ДополнениеВыгрузки.ДополнительнаяРегистрация); @@ -10762,17 +10688,12 @@ // Компоновщик настроек собираем заново Данные = ОбработкаДополнения.КомпоновщикНастроекОбщегоОтбора(); - - Если ПустаяСтрока(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов) Тогда - ИсточникНастроек = ДополнениеВыгрузки.КомпоновщикОтбораВсехДокументов.Настройки; - Иначе - СтруктураКомпоновщика = ПолучитьИзВременногоХранилища(ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов); - ИсточникНастроек = СтруктураКомпоновщика.Настройки; - КонецЕсли; - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов = Новый КомпоновщикНастроекКомпоновкиДанных; - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки) ); - ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(ИсточникНастроек); + ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.Инициализировать( + Новый ИсточникДоступныхНастроекКомпоновкиДанных(Данные.СхемаКомпоновки)); + ОбработкаДополнения.КомпоновщикОтбораВсехДокументов.ЗагрузитьНастройки(Данные.Настройки); + + ДополнениеВыгрузки.АдресКомпоновщикаВсехДокументов = ПоместитьВоВременноеХранилище(Данные, ДополнениеВыгрузки.АдресХранилищаФормы); // Собственно сохранение ОбработкаДополнения.СохранитьТекущееВНастройки(ПредставлениеНастройки); @@ -10881,7 +10802,6 @@ Возврат МодульМенеджера.ПредставлениеОтбораИнтерактивнойВыгрузки(ДополнениеВыгрузки.УзелИнформационнойБазы, Параметры); КонецФункции - // Возвращает описание периода и отбора строкой // // Параметры: diff --git a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl index e7682d4f4..997d0e9ef 100644 --- a/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl +++ b/SSL/src/CommonModules/ОбменДаннымиСобытия/Module.bsl @@ -15,7 +15,7 @@ // Процедура МеханизмРегистрацииОбъектовПередЗаписьюДокумента(ИмяПланаОбмена, Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - МеханизмРегистрацииОбъектов(ИмяПланаОбмена, Источник, Отказ, РежимЗаписи); + ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Источник, Отказ, РежимЗаписи); КонецПроцедуры @@ -28,7 +28,7 @@ // Процедура МеханизмРегистрацииОбъектовПередЗаписью(ИмяПланаОбмена, Источник, Отказ) Экспорт - МеханизмРегистрацииОбъектов(ИмяПланаОбмена, Источник, Отказ); + ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Источник, Отказ); КонецПроцедуры @@ -42,7 +42,7 @@ // Процедура МеханизмРегистрацииОбъектовПередЗаписьюРегистра(ИмяПланаОбмена, Источник, Отказ, Замещение) Экспорт - МеханизмРегистрацииОбъектов(ИмяПланаОбмена, Источник, Отказ,, Замещение, Истина); + ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Источник, Отказ,, Замещение, Истина); КонецПроцедуры @@ -55,7 +55,7 @@ // Процедура МеханизмРегистрацииОбъектовПередЗаписьюКонстанты(ИмяПланаОбмена, Источник, Отказ) Экспорт - МеханизмРегистрацииОбъектов(ИмяПланаОбмена, Источник, Отказ,,,,, Истина); + ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Источник, Отказ,,,,, Истина); КонецПроцедуры @@ -68,7 +68,7 @@ // Процедура МеханизмРегистрацииОбъектовПередУдалением(ИмяПланаОбмена, Источник, Отказ) Экспорт - МеханизмРегистрацииОбъектов(ИмяПланаОбмена, Источник, Отказ,,,, Истина); + ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Источник, Отказ,,,, Истина); КонецПроцедуры @@ -249,7 +249,6 @@ // Фиксируем выгруженные предопределенные данные (только для РИБ) Если Не СозданиеНачальногоОбраза - И ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() И ОтправкаЭлемента <> ОтправкаЭлементаДанных.Игнорировать И ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(Получатель.Ссылка) И ТипЗнч(ЭлементДанных) <> Тип("УдалениеОбъекта") @@ -631,6 +630,10 @@ Функция ВыгрузкаОбъектаРазрешена(УзелОбмена, Объект) + Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Объект) Тогда + Возврат ОбменДаннымиСервер.ВыгрузкаСсылкиРазрешена(УзелОбмена, Объект); + КонецЕсли; + Отправка = ОтправкаЭлементаДанных.Авто; ПриОтправкеДанныхКорреспонденту(Объект, Отправка, , УзелОбмена); Возврат Отправка = ОтправкаЭлементаДанных.Авто; @@ -727,27 +730,21 @@ //////////////////////////////////////////////////////////////////////////////// // Механизм регистрации объектов (МРО) -// Процедура механизма регистрации объектов. Предназначена для определения списка узлов получателей планов обмена -// на которых необходимо выполнить регистрацию объекта для последующей его выгрузки -// Включает в себя два последовательно работающие механизма - ВРО и ПРО. -// ВРО - механизм выборочной регистрации объектов; -// ПРО - механизм регистрации объектов по правилам регистрации; -// Вначале отрабатывает механизм ВРО, далее включается механизм ПРО. -// ВРО определяет на каких планах обмена должен быть зарегистрирован объект к выгрузке; -// ПРО определяет на каких узлах каждого плана обмена должен быть зарегистрирован объект. +// Определяет список узлов получателей плана обмена ИмяПланаОбмена, для которых необходимо выполнить +// регистрацию объекта Объект для последующей его выгрузки. +// +// Сначала, с помощью механизма выборочной регистрации объектов (ВРО) определяется, +// на каких планах обмена должен быть зарегистрирован объект к выгрузке. +// Затем, с помощью механизм регистрации объектов (ПРО, правила регистрации) определяется, +// на каких узлах каждого плана обмена должен быть зарегистрирован объект. // // Параметры: -// Объект - СправочникОбъект или ДокументОбъект - Объект для получения значений реквизитов и др. свойств -// Отказ - Булево - флаг отказа. Если флаг отказа взведен, то процедура не выполняется +// Объект - Произвольный - объект, набор записей, константа или сведения об удалении объекта. +// Отказ - Булево - флаг отказа. Если флаг отказа взведен, то процедура не выполняется. +// а также другие вспомогательные признаки. // -Процедура МеханизмРегистрацииОбъектов(ИмяПланаОбмена, - Объект, - Отказ, - РежимЗаписи = Неопределено, - Замещение = Ложь, - ЭтоРегистр = Ложь, - ЭтоУдалениеОбъекта = Ложь, - ЭтоКонстанта = Ложь) +Процедура ЗарегистрироватьИзменениеОбъекта(ИмяПланаОбмена, Объект, Отказ, + РежимЗаписи = Неопределено, Замещение = Ложь, ЭтоРегистр = Ложь, ЭтоУдалениеОбъекта = Ложь, ЭтоКонстанта = Ложь) Попытка @@ -762,56 +759,27 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда Если Не РазделенныйПланОбмена(ИмяПланаОбмена) Тогда - ВызватьИсключение НСтр("ru = 'Регистрация изменений для неразделенных планов обмена не поддерживается.'"); - КонецЕсли; Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Если Не РазделенныеДанные(ОбъектМетаданных) Тогда - ВызватьИсключение НСтр("ru = 'Регистрация изменений неразделенных данных в разделенном режиме.'"); - КонецЕсли; Иначе Если РазделенныеДанные(ОбъектМетаданных) Тогда - ВызватьИсключение НСтр("ru = 'Регистрация изменений разделенных данных в неразделенном режиме.'"); - - Иначе - - // Для неразделенных данных в неразделенном режиме выполняем регистрацию изменений данных - // на всех узлах разделенных планов обмена. - // Использование механизма правил регистрации в этом режиме не поддерживается. - - ТекстЗапроса = - "ВЫБРАТЬ - | ПланОбмена.Ссылка КАК Получатель - |ИЗ - | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена - |ГДЕ - | ПланОбмена.РегистрироватьИзменения - | И НЕ ПланОбмена.ПометкаУдаления"; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - - Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель"); - - Для Каждого Получатель Из Получатели Цикл - - Объект.ОбменДанными.Получатели.Добавить(Получатель); - - КонецЦикла; - КонецЕсли; + + // Для неразделенных данных в неразделенном режиме выполняем регистрацию изменений данных + // на всех узлах разделенных планов обмена. + // Использование механизма правил регистрации в этом режиме не поддерживается. + ЗарегистрироватьИзмененияНаВсехУзлахРазделенныхПлановОбмена(ИмяПланаОбмена, Объект); + Возврат; - Возврат; // Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() КонецЕсли; КонецЕсли; @@ -835,7 +803,8 @@ // при физическом удалении объекта ВРО не выполняем ЗарегистрироватьОбъектКВыгрузке = ЭтоРегистр ИЛИ ЭтоУдалениеОбъекта ИЛИ ЭтоКонстанта; - ОбъектМодифицирован = ОбъектМодифицированДляПланаОбмена(Объект, ОбъектМетаданных, ИмяПланаОбмена, РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); + ОбъектМодифицирован = ОбъектМодифицированДляПланаОбмена(Объект, ОбъектМетаданных, ИмяПланаОбмена, + РежимЗаписи, ЗарегистрироватьОбъектКВыгрузке); Если Не ОбъектМодифицирован Тогда @@ -877,6 +846,27 @@ КонецПроцедуры +Процедура ЗарегистрироватьИзмененияНаВсехУзлахРазделенныхПлановОбмена(ИмяПланаОбмена, Объект) + + ТекстЗапроса = + "ВЫБРАТЬ + | ПланОбмена.Ссылка КАК Получатель + |ИЗ + | ПланОбмена.[ИмяПланаОбмена] КАК ПланОбмена + |ГДЕ + | ПланОбмена.РегистрироватьИзменения + | И НЕ ПланОбмена.ПометкаУдаления"; + + Запрос = Новый Запрос; + Запрос.Текст = СтрЗаменить(ТекстЗапроса, "[ИмяПланаОбмена]", ИмяПланаОбмена); + Получатели = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Получатель"); + + Для Каждого Получатель Из Получатели Цикл + Объект.ОбменДанными.Получатели.Добавить(Получатель); + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Выборочная регистрация объектов (ВРО) @@ -2448,7 +2438,7 @@ КонецЦикла; - СписокСвойствШапки = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(СписокСвойствШапки); + СписокСвойствШапки = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(СписокСвойствШапки); ЗаполнитьЗначенияСвойств(Приемник, Источник, СписокСвойствШапки); @@ -3083,8 +3073,8 @@ КонецЕсли; СообщениеОбОшибке = ""; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзменения = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДатыЗапретаИзменения"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзменения = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзменения"); Если МодульДатыЗапретаИзменения.ЗагрузкаЗапрещена(ЭлементДанных, Отправитель, СообщениеОбОшибке) = Истина Тогда @@ -3154,7 +3144,7 @@ Процедура ПриСозданииВерсииОбъекта(Объект, АвторВерсии = Неопределено, ТипВерсииОбъекта = "ИзмененоПользователем", Комментарий = "", СсылкаСуществует = Неопределено) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда СведенияОВерсииОбъекта = Новый Структура; @@ -3162,7 +3152,7 @@ СведенияОВерсииОбъекта.Вставить("ТипВерсииОбъекта", ТипВерсииОбъекта); СведенияОВерсииОбъекта.Вставить("Комментарий", Комментарий); - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.СоздатьВерсиюОбъектаПоОбменуДанными(Объект, СведенияОВерсииОбъекта, СсылкаСуществует); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl index 87a590bfe..5529c4211 100644 --- a/SSL/src/CommonModules/ОбменСообщениями/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениями/Module.bsl @@ -386,12 +386,12 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ОбменСообщениямиВнутренний"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриВыгрузкеДанныхСлужебный"].Добавить( "ОбменСообщениями"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда СерверныеОбработчики["СтандартныеПодсистемы.ОбменДанными\ПриЗагрузкеДанныхСлужебный"].Добавить( "ОбменСообщениями"); КонецЕсли; @@ -399,8 +399,10 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( "ОбменСообщениями"); - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОбменСообщениями"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ОбменСообщениями"); + КонецЕсли; КонецПроцедуры @@ -534,7 +536,7 @@ СтандартнаяОбработка = Истина; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); ПереопределенныйСправочник = МодульСообщенияВМоделиСервисаРазделениеДанных.ПриВыбореСправочникаДляСообщения(ТелоСообщения); Если ПереопределенныйСправочник <> Неопределено Тогда СправочникДляСообщения = ПереопределенныйСправочник; @@ -565,7 +567,7 @@ СтандартнаяОбработкаЗаписи = Истина; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПередЗаписьюСообщения(НовоеСообщение, СтандартнаяОбработкаЗаписи); КонецЕсли; @@ -802,16 +804,16 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт МассивСправочников = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений(); Для Каждого СправочникСообщений Из МассивСправочников Цикл - Объекты.Добавить(СправочникСообщений.ПустаяСсылка().Метаданные()); + Типы.Добавить(СправочникСообщений.ПустаяСсылка().Метаданные()); КонецЦикла; КонецПроцедуры @@ -830,9 +832,9 @@ // Процедура ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульСообщенияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервиса"); + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); МодульСообщенияВМоделиСервиса.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); КонецЕсли; @@ -850,8 +852,8 @@ // Процедура ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульСообщенияВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульСообщенияВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервиса"); МодульСообщенияВМоделиСервиса.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl index 14781f5bb..9041d2f46 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиВнутренний/Module.bsl @@ -182,7 +182,7 @@ МодульРаботаВМоделиСервиса = Неопределено; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; СправочникиСообщений = ОбменСообщениямиПовтИсп.ПолучитьСправочникиСообщений(); @@ -489,7 +489,7 @@ МодульРаботаВМоделиСервиса = Неопределено; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; ОбработчикиСообщений = ОбработчикиСообщений(); @@ -987,7 +987,7 @@ МодульРаботаВМоделиСервиса = Неопределено; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); КонецЕсли; ДанныеМогутБытьПрочитаныЧастично = КорреспондентПоддерживаетЧастичноеПолучениеСообщенийОбмена(Отправитель); diff --git a/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl index 5b7f39387..a3add1c27 100644 --- a/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбменСообщениямиПовтИсп/Module.bsl @@ -34,7 +34,7 @@ МассивСправочников = Новый Массив(); Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриЗаполненииСправочниковСообщений(МассивСправочников); КонецЕсли; diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl index 43a9ab212..251b36749 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазы/Module.bsl @@ -17,12 +17,10 @@ КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); + Запустить = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ЗапуститьОбновлениеИнформационнойБазы"); УстановитьПривилегированныйРежим(Ложь); - Если Найти(НРег(ПараметрЗапускаКлиента), НРег("ЗапуститьОбновлениеИнформационнойБазы")) > 0 - И ЕстьПраваНаОбновлениеИнформационнойБазы() Тогда - + Если Запустить <> Неопределено И ЕстьПраваНаОбновлениеИнформационнойБазы() Тогда Возврат Истина; КонецЕсли; @@ -255,9 +253,9 @@ Если ТекущаяВерсияИБ <> "0.0.0.0" Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.СформироватьПланОбновленияОбластиДанных(ИдентификаторБиблиотеки, ОбработчикиОбновления, ОбязательныеРазделенныеОбработчики, ИсходнаяВерсияИБ, ВерсияМетаданныхИБ); @@ -389,6 +387,9 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. + КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( + "ОбновлениеИнформационнойБазыКлиент"); + КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( "ОбновлениеИнформационнойБазыКлиент"); @@ -412,13 +413,10 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( "ОбновлениеИнформационнойБазы"); - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( - "ОбновлениеИнформационнойБазы"); - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииОбработчиковУстановкиПараметровСеанса"].Добавить( "ОбновлениеИнформационнойБазы"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "ОбновлениеИнформационнойБазы"); @@ -465,12 +463,10 @@ Если НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда УстановитьПривилегированныйРежим(Истина); - ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); + Запустить = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ЗапуститьОбновлениеИнформационнойБазы"); УстановитьПривилегированныйРежим(Ложь); - Если Найти(НРег(ПараметрЗапускаКлиента), НРег("ЗапуститьОбновлениеИнформационнойБазы")) > 0 - И ЕстьПраваНаОбновлениеИнформационнойБазы() Тогда - + Если Запустить <> Неопределено И ЕстьПраваНаОбновлениеИнформационнойБазы() Тогда Возврат Истина; КонецЕсли; КонецЕсли; @@ -554,9 +550,9 @@ ТребуетсяПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском = Ложь; Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВызовСервера"); + МодульОбменДаннымиВызовСервера = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВызовСервера"); Если МодульОбменДаннымиВызовСервера.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Тогда ТребуетсяПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском = Истина; КонецЕсли; @@ -670,10 +666,10 @@ Если НЕ НеобходимоОбновлениеИнформационнойБазы() Тогда Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда // Загрузка и выгрузка сообщения обмена после перезапуска в связи с получением изменений конфигурации. - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ВыполнитьСинхронизациюПриОтсутствииОбновленияИнформационнойБазы( ПриЗапускеКлиентскогоПриложения, Перезапустить); @@ -683,10 +679,10 @@ КонецЕсли; Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда // Загрузка сообщения обмена после перезапуска в связи с получением изменений конфигурации. - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ЗагрузитьСообщениеПередОбновлениемИнформационнойБазы(); КонецЕсли; @@ -697,7 +693,7 @@ Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда Продолжить; КонецЕсли; - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); Модуль.ПередОбновлениемИнформационнойБазы(); КонецЦикла; ОбновлениеИнформационнойБазыПереопределяемый.ПередОбновлениемИнформационнойБазы(); @@ -723,8 +719,8 @@ УстановитьПривилегированныйРежим(Истина); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); КлючЗаписи = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.КлючЗаписиВерсийПодсистем(); КонецЕсли; @@ -790,6 +786,7 @@ И ИспользуетсяЗавершениеРаботыПользователей Тогда ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); + Если Найти(ПараметрЗапускаКлиента, "РегламентныеЗаданияОтключены") = 0 Тогда Возврат "ПрекратитьРаботуСистемы"; КонецЕсли; @@ -849,6 +846,12 @@ ВызватьИсключение; КонецПопытки; + Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + ОбновитьРазделыОписанияИзменений(); + КонецЕсли; + // Отключение монопольного режима. Если НЕ РежимОтладки Тогда ОбщегоНазначения.РазблокироватьИБ(); @@ -861,28 +864,24 @@ НСтр("ru = 'Обновление информационной базы на версию ""%1"" выполнено успешно.'"), ВерсияМетаданных); ЗаписатьИнформацию(Сообщение); - ВыводитьОписаниеОбновлений = Не НачальноеЗаполнениеДанных; + ВыводитьОписаниеОбновлений = ВерсияДанных <> "0.0.0.0"; ОбновитьПовторноИспользуемыеЗначения(); - ВыполнитьОбработчикиПослеОбновленияИнформационнойБазы( - ИтерацииОбновления, - Константы.ДетализироватьОбновлениеИБВЖурналеРегистрации.Получить(), - ВыводитьОписаниеОбновлений, - ОперативноеОбновление); - - ОбновлениеИнформационнойБазыПереопределяемый.ПослеОбновленияИнформационнойБазы( - ВерсияДанных, - ВерсияМетаданных, - ИтерацииОбновления, - ВыводитьОписаниеОбновлений, - Не ОперативноеОбновление); + Для каждого ИтерацияОбновления Из ИтерацииОбновления Цикл + ИтерацияОбновления.ОсновнойСерверныйМодуль.ПослеОбновленияИнформационнойБазы( + ИтерацияОбновления.ПредыдущаяВерсия, + ИтерацияОбновления.Версия, + ИтерацияОбновления.ВыполненныеОбработчики, + ВыводитьОписаниеОбновлений, + НЕ ОперативноеОбновление); + КонецЦикла; Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда // Выгрузка сообщения обмена после перезапуска в связи с получением изменений конфигурации. - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ВыгрузитьСообщениеПослеОбновленияИнформационнойБазы(); КонецЕсли; @@ -897,14 +896,16 @@ КонецЕсли; - ОпределитьВыводОписанияОбновлений(ВыводитьОписаниеОбновлений); + Если Не НачальноеЗаполнениеДанных И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ОбновлениеИБ", "ВывестиОписаниеИзмененийДляАдминистратора", Истина, , ИмяПользователя()); + КонецЕсли; Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда // Сброс неуспешного статуса обновления конфигурации // при завершении обновления вручную (без скрипта). - МодульОбновлениеКонфигурации = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеКонфигурации"); + МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); МодульОбновлениеКонфигурации.ПослеОбновленияИнформационнойБазы(); КонецЕсли; @@ -915,6 +916,10 @@ ПараметрыСеанса.ВыполняетсяОбновлениеИБ = Ложь; КонецЕсли; + УстановитьПривилегированныйРежим(Истина); + СтандартныеПодсистемыСервер.УстановитьЗапускОбновленияИнформационнойБазы(Ложь); + УстановитьПривилегированныйРежим(Ложь); + Возврат "Успешно"; КонецФункции @@ -938,9 +943,9 @@ СтандартнаяОбработка = Истина; Результат = ""; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииВерсииИБ(ИдентификаторБиблиотеки, ПолучитьВерсиюОбщихДанных, СтандартнаяОбработка, Результат); @@ -995,6 +1000,39 @@ КонецФункции +// Записывает в информационную базу версию конфигурации или родительской конфигурации (библиотеки). +// +// Параметры: +// ИдентификаторБиблиотеки - Строка, имя конфигурации или родительской конфигурации (библиотеки), +// НомерВерсии - Строка, номер версии. +// +Процедура УстановитьВерсиюИБ(Знач ИдентификаторБиблиотеки, Знач НомерВерсии) Экспорт + + СтандартнаяОбработка = Истина; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриУстановкеВерсииИБ(ИдентификаторБиблиотеки, НомерВерсии, СтандартнаяОбработка); + + КонецЕсли; + + Если СтандартнаяОбработка Тогда + + НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); + НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИдентификаторБиблиотеки); + + НоваяЗапись = НаборЗаписей.Добавить(); + + НоваяЗапись.ИмяПодсистемы = ИдентификаторБиблиотеки; + НоваяЗапись.Версия = НомерВерсии; + + НаборЗаписей.Записать(); + + КонецЕсли; + +КонецПроцедуры + // Возвращает Истина, если при входе будет выполнено начальное заполнение // информационной базы (или области данных), а не обновление, иначе возвращает Ложь. // @@ -1007,49 +1045,21 @@ СтандартнаяОбработка = Истина; Результат = Неопределено; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриОпределенииПервогоВходаВОбластьДанных(СтандартнаяОбработка, Результат); КонецЕсли; Если СтандартнаяОбработка Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | 1 КАК Поле1 - |ИЗ - | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | 1 - |ИЗ - | РегистрСведений.УдалитьВерсииПодсистем КАК УдалитьВерсииПодсистем"; - Результат = Запрос.Выполнить().Пустой(); - + Результат = НачальноеЗаполнениеДанныхВЛокальномРежиме(); КонецЕсли; Возврат Результат; КонецФункции -// Возвращает Истина если запуск информационной базы -// выполняется первый раз, иначе возвращает Ложь. -// -Функция ПервыйЗапускИнформационнойБазы() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Возврат НЕ Константы.ИспользоватьРазделениеПоОбластямДанных.Получить() - И НЕ Константы.НеИспользоватьРазделениеПоОбластямДанных.Получить() - И НЕ Константы.ЭтоАвтономноеРабочееМесто.Получить(); - -КонецФункции - // Заполняет структуру параметров, необходимых для работы клиентского кода // конфигурации. // @@ -1157,8 +1167,7 @@ Возврат; КонецЕсли; - СведенияОбОбновлении.ЛегальностьПолученияОбновленияПодтверждена = Истина; - ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); КонецПроцедуры @@ -1206,14 +1215,13 @@ Если НЕ ЗначениеЗаполнено(ОписаниеПодсистемы.ОсновнойСерверныйМодуль) Тогда Продолжить; КонецЕсли; - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); + Модуль = ОбщегоНазначения.ОбщийМодуль(ОписаниеПодсистемы.ОсновнойСерверныйМодуль); ИтерацияОбновления = Новый Структура; ИтерацияОбновления.Вставить("Подсистема", ОписаниеПодсистемы.Имя); ИтерацияОбновления.Вставить("Версия", ОписаниеПодсистемы.Версия); ИтерацияОбновления.Вставить("Обработчики", НоваяТаблицаОбработчиковОбновления()); ИтерацияОбновления.Вставить("ВыполненныеОбработчики", Неопределено); - ИтерацияОбновления.Вставить("ИмяОсновногоСерверногоМодуля", ОписаниеПодсистемы.ОсновнойСерверныйМодуль); ИтерацияОбновления.Вставить("ОсновнойСерверныйМодуль", Модуль); ИтерацияОбновления.Вставить("ПредыдущаяВерсия", ВерсияИБ(ОписаниеПодсистемы.Имя)); ИтерацииОбновления.Добавить(ИтерацияОбновления); @@ -1235,7 +1243,6 @@ ИтерацияОбновления.Вставить("Версия", Метаданные.Версия); ИтерацияОбновления.Вставить("Обработчики", ОбновлениеИнформационнойБазыПереопределяемый.ОбработчикиОбновления()); ИтерацияОбновления.Вставить("ВыполненныеОбработчики", Неопределено); - ИтерацияОбновления.Вставить("ИмяОсновногоСерверногоМодуля", "ОбновлениеИнформационнойБазыПереопределяемый"); ИтерацияОбновления.Вставить("ОсновнойСерверныйМодуль", ОбновлениеИнформационнойБазыПереопределяемый); ИтерацияОбновления.Вставить("ПредыдущаяВерсия", ВерсияИБ(ИмяОсновнойПодсистемы)); ИтерацииОбновления.Добавить(ИтерацияОбновления); @@ -1407,11 +1414,10 @@ КонецПроцедуры // Формирует дерево отложенных обработчиков и активирует регламентное задание. -// Процедура ЗапланироватьОтложенноеОбновление(ИтерацииОбновления, НачальноеЗаполнениеДанных) ДеревоОбработчиков = ВыполненныеОбработчикиПрошлыхВерсий(НачальноеЗаполнениеДанных); - СведенияОбОбновлении = НовыеСведенияОбОбновлении(НачальноеЗаполнениеДанных); + СведенияОбОбновлении = НовыеСведенияОбОбновлении(); ИмяБиблиотеки = ""; НомерВерсии = ""; @@ -1440,32 +1446,22 @@ СтрокаДереваБиблиотека.Статус = ""; Для каждого СтрокаВерсия Из ОбработчикиПоВерсиям.Строки Цикл - НайденнаяСтрока = СтрокаДереваБиблиотека.Строки.Найти(СтрокаВерсия.Версия, "НомерВерсии"); - ЕстьНевыполненныеОбработчики = Ложь; Если НайденнаяСтрока <> Неопределено Тогда НайденнаяСтрока.Статус = ""; Для Каждого НевыполненныйОбработчик Из НайденнаяСтрока.Строки Цикл - ЕстьНевыполненныеОбработчики = Истина; НевыполненныйОбработчик.ЧислоПопыток = 0; КонецЦикла; - СтрокаДереваВерсии = НайденнаяСтрока; - Иначе - СтрокаДереваВерсии = СтрокаДереваБиблиотека.Строки.Добавить(); - СтрокаДереваВерсии.НомерВерсии = СтрокаВерсия.Версия; - СтрокаДереваВерсии.Статус = ""; + + Продолжить; КонецЕсли; + СтрокаДереваВерсии = СтрокаДереваБиблиотека.Строки.Добавить(); + СтрокаДереваВерсии.НомерВерсии = СтрокаВерсия.Версия; + СтрокаДереваВерсии.Статус = ""; Для Каждого СтрокаОбработчики Из СтрокаВерсия.Строки Цикл - Если ЕстьНевыполненныеОбработчики Тогда - НайденнаяСтрока = СтрокаДереваВерсии.Строки.Найти(СтрокаОбработчики.Процедура, "ИмяОбработчика"); - Если НайденнаяСтрока <> Неопределено Тогда - Продолжить; // Данный обработчик на эту версию уже существует. - КонецЕсли; - КонецЕсли; - Если СтрокаОбработчики.МонопольныйРежим = Истина Тогда ТекстОшибки = НСтр("ru = 'У отложенного обработчика ""%1"" @@ -1517,6 +1513,11 @@ СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); + Если Не ОбщегоНазначенияПовтИсп.РазделениеВключено() + И СведенияОбОбновлении.ВремяОкончанияОбновления = Неопределено Тогда + Возврат; // Ожидаем, пока запишется вся информация об основном цикле обновления + КонецЕсли; + Если СведенияОбОбновлении.ВремяОкончаниеОтложенногоОбновления <> Неопределено Тогда ОтключитьОтложенноеОбновление(); Возврат; @@ -1567,24 +1568,107 @@ КонецПроцедуры // Получает сведения об обновлении информационной базы. -// Функция СведенияОбОбновленииИнформационнойБазы() Экспорт УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат НовыеСведенияОбОбновлении(Истина); + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + Возврат НовыеСведенияОбОбновлении(); КонецЕсли; - Возврат Константы.СведенияОбОбновленииИБ.Получить().Получить(); + СведенияОбОбновленииИБ = Константы.СведенияОбОбновленииИБ.Получить().Получить(); + Если ТипЗнч(СведенияОбОбновленииИБ) = Тип("Структура") Тогда + Если СведенияОбОбновленииИБ.Количество() = 1 Тогда + СведенияОбОбновленииИБ = Неопределено; + Иначе + СведенияОбОбновленииИБ = НовыеСведенияОбОбновлении(СведенияОбОбновленииИБ); + КонецЕсли; + Иначе + СведенияОбОбновленииИБ = Неопределено; + КонецЕсли; + + Возврат СведенияОбОбновленииИБ; КонецФункции // Записывает данные по обновлению в константу "СведенияОбОбновлении". -// -Процедура ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении) Экспорт +Процедура ЗаписатьСведенияОбОбновленииИнформационнойБазы(Знач СведенияОбОбновлении) Экспорт + + Если СведенияОбОбновлении = Неопределено Тогда + НовоеЗначение = Новый Структура; + Иначе + НовоеЗначение = СведенияОбОбновлении; + КонецЕсли; + + СтароеЗначение = Константы.СведенияОбОбновленииИБ.Получить().Получить(); + + Если ТипЗнч(СтароеЗначение) = Тип("Структура") И СтароеЗначение.Свойство("ЛегальнаяВерсия") Тогда + НовоеЗначение.Вставить("ЛегальнаяВерсия", СтароеЗначение.ЛегальнаяВерсия); + КонецЕсли; МенеджерКонстанты = Константы.СведенияОбОбновленииИБ.СоздатьМенеджерЗначения(); - МенеджерКонстанты.Значение = Новый ХранилищеЗначения(СведенияОбОбновлении); + МенеджерКонстанты.Значение = Новый ХранилищеЗначения(НовоеЗначение); + ЗаписатьДанные(МенеджерКонстанты); + +КонецПроцедуры + +// Только для внутреннего использования +Функция ТребуетсяПроверитьЛегальностьПолученияОбновления() Экспорт + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + Возврат Ложь; + КонецЕсли; + + Если СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Возврат Ложь; + КонецЕсли; + + Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда + Возврат Ложь; + КонецЕсли; + + ЛегальнаяВерсия = ""; + + Если НачальноеЗаполнениеДанныхВЛокальномРежиме() Тогда + ЛегальнаяВерсия = Метаданные.Версия; + Иначе + УстановитьПривилегированныйРежим(Истина); + Свойства = Константы.СведенияОбОбновленииИБ.Получить().Получить(); + Если ТипЗнч(Свойства) = Тип("Структура") И Свойства.Свойство("ЛегальнаяВерсия") Тогда + ЛегальнаяВерсия = Свойства.ЛегальнаяВерсия; + КонецЕсли; + КонецЕсли; + + Возврат ЛегальнаяВерсия <> Метаданные.Версия; + +КонецФункции + +// Только для внутреннего использования +Процедура ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() Экспорт + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() + И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + Возврат; + КонецЕсли; + + СтароеЗначение = Константы.СведенияОбОбновленииИБ.Получить().Получить(); + Если ТипЗнч(СтароеЗначение) = Тип("Структура") Тогда + НовоеЗначение = СтароеЗначение; + Иначе + НовоеЗначение = Новый Структура; + КонецЕсли; + + НовоеЗначение.Вставить("ЛегальнаяВерсия", Метаданные.Версия); + + МенеджерКонстанты = Константы.СведенияОбОбновленииИБ.СоздатьМенеджерЗначения(); + МенеджерКонстанты.Значение = Новый ХранилищеЗначения(НовоеЗначение); ЗаписатьДанные(МенеджерКонстанты); КонецПроцедуры @@ -1623,29 +1707,6 @@ КонецПроцедуры -// Доопределяет структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации, т.е. в обработчиках событий -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы. -// -// Важно: при запуске недопустимо использовать команды сброса кэша -// повторно используемых модулей, иначе запуск может привести -// к непредсказуемым ошибкам или лишним серверным вызовам. -// -// Параметры: -// Параметры - Структура, в которую можно вставить параметры работы клиента при запуске. -// Ключ - имя параметра, -// Значение - значение параметра. -// -// Пример использования: -// Параметры.Вставить(<ИмяПараметра>, <Код получения значения параметра>); -// -Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт - - Параметры.Вставить("ПроверитьЛегальностьПолученияОбновления", ТребуетсяПроверитьЛегальностьПолученияОбновления()); - -КонецПроцедуры - // Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. // // Параметры: @@ -1654,6 +1715,12 @@ // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + Обработчик = Обработчики.Добавить(); + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "ОбновлениеИнформационнойБазы.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений"; + КонецЕсли; + Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.3.19"; Обработчик.Процедура = "ОбновлениеИнформационнойБазы.ПеренестиВерсииПодсистемВНеразделенныеДанные"; @@ -1747,7 +1814,7 @@ // Процедура ПриОпределенииИспользованияПодсистемыЗавершениеРаботыПользователей(Используется) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда Используется = Истина; КонецЕсли; @@ -1757,8 +1824,8 @@ // Процедура ПриСнятииБлокировкиФайловойБазы() Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБ = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СоединенияИБ"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриСнятииБлокировкиФайловойБазы(); КонецЕсли; @@ -1771,8 +1838,8 @@ // Процедура ПриВключенииОтложенногоОбновления(Знач Использование) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриВключенииОтложенногоОбновления(Использование); КонецЕсли; @@ -1936,33 +2003,6 @@ КонецФункции -Процедура УстановитьВерсиюИБ(Знач ИдентификаторБиблиотеки, Знач НомерВерсии) - - СтандартнаяОбработка = Истина; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриУстановкеВерсииИБ(ИдентификаторБиблиотеки, НомерВерсии, СтандартнаяОбработка); - - КонецЕсли; - - Если СтандартнаяОбработка Тогда - - НаборЗаписей = РегистрыСведений.ВерсииПодсистем.СоздатьНаборЗаписей(); - НаборЗаписей.Отбор.ИмяПодсистемы.Установить(ИдентификаторБиблиотеки); - - НоваяЗапись = НаборЗаписей.Добавить(); - - НоваяЗапись.ИмяПодсистемы = ИдентификаторБиблиотеки; - НоваяЗапись.Версия = НомерВерсии; - - НаборЗаписей.Записать(); - - КонецЕсли; - -КонецПроцедуры - Процедура СкопироватьСтрокиВДерево(Знач СтрокиПриемника, Знач СтрокиИсточника, Знач СтруктураКолонок) Для каждого СтрокаИсточника Из СтрокиИсточника Цикл @@ -2108,46 +2148,6 @@ КонецПроцедуры -Процедура ВыполнитьОбработчикиПослеОбновленияИнформационнойБазы(Знач ИтерацииОбновления, Знач ЗаписыватьВЖурнал, ВыводитьОписаниеОбновлений, Знач ОперативноеОбновление) - - Для Каждого ИтерацияОбновления Из ИтерацииОбновления Цикл - - Если ЗаписыватьВЖурнал Тогда - Обработчик = Новый Структура(); - Обработчик.Вставить("Версия", "*"); - Обработчик.Вставить("ВерсияРегистрации", "*"); - Обработчик.Вставить("РежимВыполнения", "Оперативно"); - Обработчик.Вставить("Процедура", ИтерацияОбновления.ИмяОсновногоСерверногоМодуля + ".ПослеОбновленияИнформационнойБазы"); - ОписаниеОбработчика = ПодготовитьДетальнуюИнформациюОХодеОбновления(Обработчик, Неопределено, ИтерацияОбновления.Подсистема); - КонецЕсли; - - Попытка - - ИтерацияОбновления.ОсновнойСерверныйМодуль.ПослеОбновленияИнформационнойБазы( - ИтерацияОбновления.ПредыдущаяВерсия, - ИтерацияОбновления.Версия, - ИтерацияОбновления.ВыполненныеОбработчики, - ВыводитьОписаниеОбновлений, - НЕ ОперативноеОбновление); - - Исключение - - Если ЗаписыватьВЖурнал Тогда - ЗаписатьДетальнуюИнформациюОХодеОбновления(ОписаниеОбработчика); - КонецЕсли; - - ВызватьИсключение; - - КонецПопытки; - - Если ЗаписыватьВЖурнал Тогда - ЗаписатьДетальнуюИнформациюОХодеОбновления(ОписаниеОбработчика); - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - Функция ПодготовитьДетальнуюИнформациюОХодеОбновления(Обработчик, Параметры, ИдентификаторБиблиотеки, ОбработчикОтложенный = Ложь) ОписаниеОбработчика = Новый Структура; @@ -2183,7 +2183,7 @@ КонецЕсли; - ОписаниеОбработчика.Вставить("ЗначениеНаНачало", Вычислить("ТекущаяУниверсальнаяДатаВМиллисекундах()")); + ОписаниеОбработчика.Вставить("ЗначениеНаНачало", ТекущаяУниверсальнаяДатаВМиллисекундах()); Возврат ОписаниеОбработчика; @@ -2191,7 +2191,7 @@ Процедура ЗаписатьДетальнуюИнформациюОХодеОбновления(ОписаниеОбработчика) - Длительность = Вычислить("ТекущаяУниверсальнаяДатаВМиллисекундах()") - ОписаниеОбработчика.ЗначениеНаНачало; // для возможности запуска на 8.2.16 + Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - ОписаниеОбработчика.ЗначениеНаНачало; ОписаниеОбработчика.Вставить("Выполнен", Ложь); ОписаниеОбработчика.Вставить("Длительность", Длительность / 1000); // В секундах @@ -2336,8 +2336,6 @@ КонецПроцедуры -// Только для внутреннего использования -// Функция КоличествоОбработчиковНаТекущуюВерсию(ИтерацииОбновления) КоличествоОбработчиков = 0; @@ -2359,24 +2357,6 @@ КонецФункции -Функция ТребуетсяПроверитьЛегальностьПолученияОбновления() - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат Ложь; - КонецЕсли; - - Если ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() Тогда - Возврат Ложь; - КонецЕсли; - - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - ПроверитьЛегальностьПолученияОбновления = (Не НеобходимоОбновлениеИнформационнойБазы() И - СведенияОбОбновлении <> Неопределено И - Не СведенияОбОбновлении.ЛегальностьПолученияОбновленияПодтверждена); - Возврат ПроверитьЛегальностьПолученияОбновления; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Протоколирование хода обновления @@ -2408,31 +2388,6 @@ //////////////////////////////////////////////////////////////////////////////// // Описание обновлений -// Только для внутреннего использования. -Процедура ОпределитьВыводОписанияОбновлений(ВыводитьОписаниеОбновлений) - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() - ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - ОбновитьРазделыОписанияИзменений(); - КонецЕсли; - - Если ВыводитьОписаниеОбновлений И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ОбновлениеИБ", "ВывестиОписаниеИзмененийДляАдминистратора", Истина, , ИмяПользователя()); - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - СведенияОбОбновленииИБ = СведенияОбОбновленииИнформационнойБазы(); - СведенияОбОбновленииИБ.ВыводитьОписаниеОбновлений = ВыводитьОписаниеОбновлений; - - МенеджерКонстанты = Константы.СведенияОбОбновленииИБ.СоздатьМенеджерЗначения(); - МенеджерКонстанты.Значение = Новый ХранилищеЗначения(СведенияОбОбновленииИБ); - - ЗаписатьДанные(МенеджерКонстанты); - КонецЕсли; - -КонецПроцедуры - // Вывести описания изменений в указанной версии // // Параметры @@ -2461,12 +2416,6 @@ // Функция ПоказатьОписаниеИзмененийСистемы() - СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); - Если СведенияОбОбновлении <> Неопределено И СведенияОбОбновлении.Свойство("ВыводитьОписаниеОбновлений") - И СведенияОбОбновлении.ВыводитьОписаниеОбновлений = Ложь Тогда - Возврат Ложь; - КонецЕсли; - Если НЕ ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда // Анонимным пользователям новое в версии не показываем Возврат Ложь; @@ -2494,12 +2443,8 @@ Возврат Ложь; КонецЕсли; - Если ПоследняяВерсия = Неопределено Тогда - Возврат Разделы.Количество() > 0; - Иначе - Возврат ПолучитьВерсииБольшеЗаданной(Разделы, ПоследняяВерсия).Количество() > 0; - КонецЕсли; - + Возврат ПолучитьВерсииБольшеЗаданной(Разделы, ПоследняяВерсия).Количество() > 0; + КонецФункции Функция ПоследняяВерсияОтображенияИзмененийСистемы(Знач ИмяПользователя = Неопределено) @@ -2615,8 +2560,7 @@ СведенияОбОбновлении = СведенияОбОбновленииИнформационнойБазы(); Если СведенияОбОбновлении <> Неопределено - И Не СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Истина - И СведенияОбОбновлении.ДеревоОбработчиков <> Неопределено Тогда + И СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Ложь Тогда // Оставляем только не выполненные НайденныеОбработчики = СведенияОбОбновлении.ДеревоОбработчиков.Строки.НайтиСтроки(Новый Структура("Статус", "Выполнено"), Истина); @@ -2727,6 +2671,7 @@ ОписаниеОбработчика = ПодготовитьДетальнуюИнформациюОХодеОбновления(ОбработчикОбновления, Параметры, ОбработчикОбновления.ИмяБиблиотеки, Истина); КонецЕсли; + ОбработчикОбновления.Статус = "Выполняется"; ОбщегоНазначения.ВыполнитьБезопасно(ИмяОбработчика, ПараметрыОбработчика); Если Параметры.ОбработкаЗавершена Тогда ОбработчикОбновления.Статус = "Выполнено"; @@ -2800,17 +2745,9 @@ // Только для внутреннего использования // -Функция НовыеСведенияОбОбновлении(НачальноеЗаполнениеДанных) +Функция НовыеСведенияОбОбновлении(СтарыеСведения = Неопределено) СведенияОбОбновлении = Новый Структура; - - Если Не ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") - Или СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - ЛегальностьПолученияОбновленияПодтверждена = Истина; - Иначе - ЛегальностьПолученияОбновленияПодтверждена = НачальноеЗаполнениеДанных; - КонецЕсли; - СведенияОбОбновлении.Вставить("ВремяНачалаОбновления"); СведенияОбОбновлении.Вставить("ВремяОкончанияОбновления"); СведенияОбОбновлении.Вставить("ПродолжительностьОбновления"); @@ -2818,9 +2755,11 @@ СведенияОбОбновлении.Вставить("ВремяОкончаниеОтложенногоОбновления"); СведенияОбОбновлении.Вставить("НомерСеанса"); СведенияОбОбновлении.Вставить("ОтложенноеОбновлениеЗавершеноУспешно"); - СведенияОбОбновлении.Вставить("ЛегальностьПолученияОбновленияПодтверждена", ЛегальностьПолученияОбновленияПодтверждена); СведенияОбОбновлении.Вставить("ДеревоОбработчиков"); - СведенияОбОбновлении.Вставить("ВыводитьОписаниеОбновлений"); + + Если ТипЗнч(СтарыеСведения) = Тип("Структура") Тогда + ЗаполнитьЗначенияСвойств(СведенияОбОбновлении, СтарыеСведения); + КонецЕсли; Возврат СведенияОбОбновлении; @@ -2843,3 +2782,25 @@ Возврат ДеревоОбработчиков; КонецФункции + +Функция НачальноеЗаполнениеДанныхВЛокальномРежиме() + + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | 1 КАК Поле1 + |ИЗ + | РегистрСведений.ВерсииПодсистем КАК ВерсииПодсистем + | + |ОБЪЕДИНИТЬ ВСЕ + | + |ВЫБРАТЬ + | 1 + |ИЗ + | РегистрСведений.УдалитьВерсииПодсистем КАК УдалитьВерсииПодсистем"; + + Возврат Запрос.Выполнить().Пустой(); + +КонецФункции diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl index 21bda8d30..db0239da3 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыБСП/Module.bsl @@ -28,7 +28,7 @@ Процедура ПриДобавленииПодсистемы(Описание) Экспорт Описание.Имя = "СтандартныеПодсистемы"; - Описание.Версия = "2.1.9.2"; + Описание.Версия = "2.2.1.35"; КонецПроцедуры @@ -46,7 +46,7 @@ // Обработчик = Обработчики.Добавить(); // Обработчик.Версия = "1.1.0.0"; // Обработчик.Процедура = "ОбновлениеИБ.ПерейтиНаВерсию_1_1_0_0"; -// Обработчик.МонопольныйРежим = Ложь; +// Обработчик.РежимВыполнения = "Монопольно"; // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl index 2b70a2755..faed424db 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыВызовСервера/Module.bsl @@ -10,7 +10,7 @@ // См. описание этой же функции в модуле ОбновлениеИнформационнойБазы. Функция ВыполнитьОбновлениеИнформационнойБазы(ИсключениеПриНевозможностиБлокировкиИБ = Истина, - Знач ПриЗапускеКлиентскогоПриложения = Ложь, + ПриЗапускеКлиентскогоПриложения = Ложь, Перезапустить = Ложь) Экспорт Возврат ОбновлениеИнформационнойБазы.ВыполнитьОбновлениеИнформационнойБазы( @@ -57,9 +57,8 @@ СведенияОбОбновлении.ПродолжительностьОбновления = СокрЛП(ПродолжительностьОбновления); - МенеджерКонстанты = Константы.СведенияОбОбновленииИБ.СоздатьМенеджерЗначения(); - МенеджерКонстанты.Значение = Новый ХранилищеЗначения(СведенияОбОбновлении); - МенеджерКонстанты.Записать(); + ОбновлениеИнформационнойБазы.ЗаписатьСведенияОбОбновленииИнформационнойБазы( + СведенияОбОбновлении); КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl index 30f255424..67521dafe 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыКлиент/Module.bsl @@ -10,29 +10,55 @@ // См. описание параметра ПриЗапускеКлиентскогоПриложения в модуле ОбновлениеИнформационнойБазы // в описании функции ВыполнитьОбновлениеИнформационнойБазы. // -Процедура ОбновитьИнформационнуюБазу(Отказ = Ложь, ПриЗапускеКлиентскогоПриложения = Ложь) Экспорт +Процедура ОбновитьИнформационнуюБазу(Параметры) Экспорт ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - СтандартныеПодсистемыКлиент.ЗавершающиеДействияПриНачалеРаботыСистемы(); Возврат; КонецЕсли; Если НЕ ПараметрыРаботыКлиента.НеобходимоОбновлениеИнформационнойБазы Тогда - Если ПараметрыРаботыКлиента.ЗагрузитьСообщениеОбменаДанными Тогда + Если ПараметрыРаботыКлиента.Свойство("ЗагрузитьСообщениеОбменаДанными") Тогда Перезапустить = Ложь; ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(, Истина, Перезапустить); Если Перезапустить Тогда - ПрекратитьРаботуСистемы(Перезапустить); + Параметры.Отказ = Истина; + Параметры.Перезапустить = Истина; Возврат; КонецЕсли; КонецЕсли; - СтандартныеПодсистемыКлиент.ЗавершающиеДействияПриНачалеРаботыСистемы(); Возврат; КонецЕсли; - ПараметрыФормы = Новый Структура("ПриЗапускеКлиентскогоПриложения", ПриЗапускеКлиентскогоПриложения); - ОткрытьФорму("Обработка.ОбновлениеИнформационнойБазы.Форма.ИндикацияХодаОбновленияИБ", ПараметрыФормы); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "НачатьОбновлениеИнформационнойБазы", ЭтотОбъект); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ОбновитьИнформационнуюБазу +Процедура НачатьОбновлениеИнформационнойБазы(Параметры, Неопределен) Экспорт + + ПараметрыФормы = Новый Структура("ПриЗапускеКлиентскогоПриложения", Истина); + ОткрытьФорму("Обработка.ОбновлениеИнформационнойБазы.Форма.ИндикацияХодаОбновленияИБ", ПараметрыФормы, + ,,,, Новый ОписаниеОповещения("ПослеЗакрытияФормыИндикацияХодаОбновленияИБ", ЭтотОбъект, Параметры)); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ОбновитьИнформационнуюБазу +Процедура ПослеЗакрытияФормыИндикацияХодаОбновленияИБ(Результат, Параметры) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + Результат = Новый Структура("Отказ", Истина); + КонецЕсли; + + Если Результат.Отказ Тогда + Параметры.Отказ = Истина; + Если Результат.Перезапустить Тогда + Параметры.Перезапустить = Истина; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); КонецПроцедуры @@ -71,19 +97,46 @@ Возврат "e1cib/app/Обработка.ОбновлениеИнформационнойБазы"; КонецФункции -// Подключает глобальный обработчик ожидания в форме. +// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. +// Вызывается после завершения действий ПриНачалеРаботыСистемы. +// Используется для подключения обработчиков ожидания, которые не должны вызываться +// в случае интерактивных действий перед и при начале работы системы. // -Процедура ПодключитьОбработчикПроверкиСтатусаОтложенногоОбновления() Экспорт - ПодключитьОбработчикОжидания("ПроверитьСтатусОтложенногоОбновления", 2, Истина); +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если Не ПараметрыКлиента.РазделениеВключено Тогда + ПодключитьОбработчикОжидания("ПроверитьСтатусОтложенногоОбновления", 2, Истина); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП +// Вызывается перед интерактивным началом работы пользователя с областью данных. +// Соответствует событию ПередНачаломРаботыСистемы модулей приложения. +// +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если ПараметрыКлиента.Свойство("ИнформационнаяБазаЗаблокированаДляОбновления") Тогда + Параметры.Отказ = Истина; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ПоказатьПредупреждениеИПродолжить", + СтандартныеПодсистемыКлиент.ЭтотОбъект, + ПараметрыКлиента.ИнформационнаяБазаЗаблокированаДляОбновления); + Возврат; + КонецЕсли; + +КонецПроцедуры + // Вызывается при интерактивном начале работы пользователя с областью данных. // Соответствует событию ПриНачалеРаботыСистемы модулей приложения. // -Процедура ПриНачалеРаботыСистемы() Экспорт +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl index 9b45edd74..ecf7c91a1 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыПереопределяемый/Module.bsl @@ -6,27 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Возвращает список процедур-обработчиков обновления ИБ для всех поддерживаемых версий ИБ. -// -// Пример добавления процедуры-обработчика в список: -// Обработчик = Обработчики.Добавить(); -// Обработчик.Версия = "1.1.0.0"; -// Обработчик.Процедура = "ОбновлениеИБ.ПерейтиНаВерсию_1_1_0_0"; -// -// Вызывается перед началом обновления данных ИБ. -// -Функция ОбработчикиОбновления() Экспорт - - Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); - - // Подключаются процедуры-обработчики обновления конфигурации - - - - Возврат Обработчики; - -КонецФункции - // Вызывается перед обработчиками обновления данных ИБ. // Процедура ПередОбновлениемИнформационнойБазы() Экспорт @@ -107,4 +86,28 @@ Процедура ПолучитьТекстПоясненияДляРезультатовОбновленияПрограммы(ТекстПодсказки) Экспорт -КонецПроцедуры \ No newline at end of file +КонецПроцедуры + +// Устарела. Следует использовать процедуру ПриДобавленииПодсистем +// общего модуля ПодсистемыКонфигурацииПереопределяемый. +// +// Вызывается перед началом обновления данных ИБ. +// Возвращает список процедур-обработчиков обновления ИБ для всех поддерживаемых версий ИБ. +// +// Пример добавления процедуры-обработчика в список: +// Обработчик = Обработчики.Добавить(); +// Обработчик.Версия = "1.1.0.0"; +// Обработчик.Процедура = "ОбновлениеИБ.ПерейтиНаВерсию_1_1_0_0"; +// +// Возвращаемое значение: +// ТаблицаЗначений - состав колонок см. в ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления. +// +Функция ОбработчикиОбновления() Экспорт + + Обработчики = ОбновлениеИнформационнойБазы.НоваяТаблицаОбработчиковОбновления(); + + // Подключаются процедуры-обработчики обновления конфигурации + + Возврат Обработчики; + +КонецФункции diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl index e8b9769ad..8fc130106 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса/Module.bsl @@ -233,7 +233,7 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); @@ -251,13 +251,14 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить( "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса"].Добавить( - "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + КонецЕсли; + СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"].Добавить( "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); @@ -331,40 +332,14 @@ Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ПараметрыБлокировки = СоединенияИБ.ПолучитьБлокировкуСеансовОбластиДанных(); Если НЕ ПараметрыБлокировки.Установлена Тогда Возврат; КонецЕсли; ПараметрыБлокировки.Установлена = Ложь; СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки); - Иначе - - СнятьМонопольныйРежим = Ложь; - Если Не МонопольныйРежим() Тогда - - Попытка - УстановитьМонопольныйРежим(Истина); - СнятьМонопольныйРежим = Истина; - Исключение - // Обработка исключения не требуется. - // Ожидаемое исключение - ошибка установки монопольного режима из-за - // наличия других сеансов (например, при динамическом обновлении конфигурации). - // В этом случае планирование обновления областей будет выполняться с учетом - // возможной конкуренции при доступе к таблицам объектов метаданных, разделенных - // в режиме "Независимо и совместно" (что будет менее эффективно, нежели в - // выполнение в монопольном режиме). - КонецПопытки; - - КонецЕсли; - ЗапланироватьОбновлениеОбластейДанных(Истина); - - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - КонецЕсли; КонецПроцедуры @@ -384,18 +359,14 @@ КонецПроцедуры -// Заполняет таблицу соответствия объектов метаданных, используемых в локальном режиме и в модели сервиса. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// ТаблицаСоответствия - ТаблицаЗначений, колонки: -// ОбъектВЛокальномРежиме - ОбъектМетаданных, объект метаданных, используемый в локальном режиме, -// ОбъектВМоделиСервиса - ОбъектМетаданных, объект метаданных, используемый в модели сервиса. +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриЗаполненииСоответствияОбъектовМетаданныхВЛокальномРежимеИМоделиСервиса(Знач ТаблицаСоответствия) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - НовоеСоответствие = ТаблицаСоответствия.Добавить(); - НовоеСоответствие.ОбъектВЛокальномРежиме = Метаданные.РегистрыСведений.ВерсииПодсистем; - НовоеСоответствие.ОбъектВМоделиСервиса = Метаданные.РегистрыСведений.ВерсииПодсистемОбластейДанных; + Типы.Добавить(Метаданные.РегистрыСведений.ВерсииПодсистемОбластейДанных); КонецПроцедуры @@ -664,7 +635,9 @@ ОчередьЗаданий.ДобавитьЗадание(ПараметрыЗадания); Если БлокироватьОбласти Тогда - СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки, Ложь, Выборка.ОбластьДанных); + ОбщегоНазначения.УстановитьРазделениеСеанса(Истина, Выборка.ОбластьДанных); + СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки, Ложь); + ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); КонецЕсли; ЗафиксироватьТранзакцию(); diff --git a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl index 165fa7442..0cc7b551a 100644 --- a/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеИнформационнойБазыСлужебныйПовтИсп/Module.bsl @@ -19,7 +19,7 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль( + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль( "ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МинимальнаяВерсияОбластейДанных = МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.МинимальнаяВерсияОбластейДанных(); @@ -42,4 +42,3 @@ Возврат МинимальнаяВерсияИБ; КонецФункции - diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl index 9f0ee44c4..1ba588f05 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурации/Module.bsl @@ -112,6 +112,7 @@ Настройки.Вставить("АдресСервераДляПроверкиНаличияОбновления", АдресСервераДляПроверкиНаличияОбновления()); Настройки.Вставить("КаталогОбновлений", КаталогОбновлений()); Настройки.Вставить("АдресРесурсаДляПроверкиНаличияОбновления", АдресРесурсаДляПроверкиНаличияОбновления()); + Настройки.Вставить("АдресСервисаПроверкиЛегальности", АдресСервисаПроверкиЛегальности()); Настройки.Вставить("КонфигурацияИзменена", КонфигурацияИзменена); Настройки.Вставить("ПроверитьПрошлыеОбновленияБазы", ОбновлениеКонфигурацииУспешно() <> Неопределено); Настройки.Вставить("ЕстьДоступДляОбновления", ЕстьДоступДляОбновления); @@ -277,6 +278,26 @@ КонецФункции +Функция АдресСервисаПроверкиЛегальности() + + Значение = "https://webits.1c.ru/services/WebItsSimpleService?wsdl"; // Значение по умолчанию + + СтруктураНастройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( + "ОбновлениеКонфигурации", + "НастройкиОбновленияКонфигурации"); + + Если СтруктураНастройки <> Неопределено Тогда // Значение из настроек пользователя + ИспользоватьЗначениеНастройки = Ложь; + СтруктураНастройки.Свойство("ИспользоватьЗначениеНастройкиАдресСервисаПроверкиЛегальности", ИспользоватьЗначениеНастройки); + Если ИспользоватьЗначениеНастройки = Истина Тогда + Значение = СтруктураНастройки.АдресСервисаПроверкиЛегальности; + КонецЕсли; + КонецЕсли; + + Возврат Значение; + +КонецФункции + // Возвращает признак успешного обновления конфигурации на основе данных константы настроек. Функция ОбновлениеКонфигурацииУспешно() Экспорт @@ -309,7 +330,7 @@ Процедура ЗаписатьСтатусОбновления(Знач ИмяАдминистратораОбновления = "", Знач ОбновлениеЗапланировано = Ложь, Знач ОбновлениеВыполнено = Ложь, Знач РезультатОбновления = Ложь, СообщенияДляЖурналаРегистрации = Неопределено) Экспорт - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); Статус = Новый Структура("ИмяАдминистратораОбновления, |ОбновлениеЗапланировано, @@ -359,7 +380,7 @@ Если Настройки <> Неопределено И Настройки.Свойство("РасписаниеПроверкиНаличияОбновления", Расписание) И ТипЗнч(Расписание) = Тип("РасписаниеРегламентногоЗадания") Тогда Настройки.РасписаниеПроверкиНаличияОбновления = ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Расписание); - КонецЕсли; + КонецЕсли; Возврат Настройки; КонецФункции @@ -367,7 +388,7 @@ // Записывает настройки помощника обновления в хранилище общих настроек. Процедура ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации, СообщенияДляЖурналаРегистрации = Неопределено) Экспорт - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( "ОбновлениеКонфигурации", diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl index cc064a3b7..4cd592763 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиент/Module.bsl @@ -104,6 +104,118 @@ КонецПроцедуры +// Скачивает из Интернета файл проверки наличия обновлений +// +Функция ПолучитьФайлПроверкиНаличияОбновлений(Знач ВыдаватьСообщения = Истина, ПроверитьОбновленияДляНовойРедакции = Ложь) Экспорт + + ПараметрыОбновления = ПолучитьПараметрыОбновления(ПроверитьОбновленияДляНовойРедакции); + НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; + + ВременныйФайл = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяФайлаПроверкиНаличияОбновления; + + // при необходимости, создаем каталог для временного файла + КаталогВременногоФайла = ПолучитьКаталогФайла(ВременныйФайл); + КаталогВременногоФайлаОбъект = Новый Файл(КаталогВременногоФайла); + Если НЕ КаталогВременногоФайлаОбъект.Существует() Тогда + Попытка + СоздатьКаталог(КаталогВременногоФайла); + Исключение + ИнфоОбОшибке = ИнформацияОбОшибке(); + + СообщениеОбОшибке = НСтр("ru = 'Не удалось создать временный каталог для проверки наличия обновлений. + |%1'"); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ПодробноеПредставлениеОшибки(ИнфоОбОшибке)),, + Истина); + + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, + КраткоеПредставлениеОшибки(ИнфоОбОшибке)); + Если ВыдаватьСообщения Тогда + ПоказатьПредупреждение(, СообщениеОбОшибке); + КонецЕсли; + Возврат СообщениеОбОшибке; + КонецПопытки; + КонецЕсли; + + // получаем сам файл из Интернета + Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + + ПараметрыОбновления.АдресРесурсовДляПроверкиНаличияОбновления + ПараметрыОбновления.ИмяФайлаПроверкиНаличияОбновления, + Новый Структура("ПутьДляСохранения", ? (ПустаяСтрока(ВременныйФайл), Неопределено, ВременныйФайл))); + + Если Результат.Статус <> Истина Тогда + СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось проверить наличие обновлений. + |%1'"), Результат.СообщениеОбОшибке); + Если ВыдаватьСообщения Тогда + ПоказатьПредупреждение(, СообщениеОбОшибке); + КонецЕсли; + Возврат СообщениеОбОшибке; + КонецЕсли; + + Возврат ПараметрыДистрибутива(ВременныйФайл); + +КонецФункции + +// Чтение данных по обновлению из файла ИмяФайлаПроверкиНаличияОбновления (UpdInfo.txt) +// Вычисляются: +// номер версии обновления на сервере, +// номера версий, с которых производится обновление (раздляются символом ";") +// дата публикации обновления +// +// Параметры: +// ИмяФайла - полное имя файла UpdInfo.txt +// +// Возвращаемое значение: +// Структура: +// Version - версия обновления +// FromVersions - с каких версий обновляет +// UpdateDate - дата опубликования +// Строка - описание ошибки, если файл не найден или не содержит нужных значений +// +Функция ПараметрыДистрибутива(Знач ИмяФайла) Экспорт + Файл = Новый Файл(ИмяФайла); + Если НЕ Файл.Существует() Тогда + Возврат НСтр("ru = 'Файл описания обновлений не получен'"); + КонецЕсли; + ТД = Новый ТекстовыйДокумент(); + ТД.Прочитать(Файл.ПолноеИмя); + ПарКомпл = Новый Структура(); + Для Н = 1 По ТД.КоличествоСтрок() Цикл + СтрТмп = НРег(СокрЛП(ТД.ПолучитьСтроку(Н))); + Если ПустаяСтрока(СтрТмп) Тогда + Продолжить; + КонецЕсли; + Если Найти(СтрТмп,"fromversions=")>0 Тогда + СтрТМП = СокрЛП(Сред(СтрТмп,Найти(СтрТмп,"fromversions=")+СтрДлина("fromversions="))); + СтрТМП = ?(Лев(СтрТМП,1)=";","",";") + СтрТмп + ?(Прав(СтрТМП,1)=";","",";"); + ПарКомпл.Вставить("FromVersions",СтрТМП); + ИначеЕсли Найти(СтрТмп,"version=")>0 Тогда + ПарКомпл.Вставить("Version",Сред(СтрТмп,Найти(СтрТмп,"version=")+СтрДлина("version="))); + ИначеЕсли Найти(СтрТмп,"updatedate=")>0 Тогда + // формат даты = Дата, + СтрТмп = Сред(СтрТмп,Найти(СтрТмп,"updatedate=")+СтрДлина("updatedate=")); + Если СтрДлина(СтрТмп)>8 Тогда + Если Найти(СтрТмп,".")=5 Тогда + // дата в формате ГГГГ.ММ.ДД + СтрТмп = СтрЗаменить(СтрТмп,".",""); + ИначеЕсли Найти(СтрТмп,".")=3 Тогда + // дата в формате ДД.ММ.ГГГГ + СтрТмп = Прав(СтрТмп,4)+Сред(СтрТмп,4,2)+Лев(СтрТмп,2); + Иначе + // дата в формате ГГГГММДД + КонецЕсли; + КонецЕсли; + ПарКомпл.Вставить("UpdateDate",Дата(СтрТмп)); + Иначе + Возврат НСтр("ru = 'Неверный формат сведений о наличии обновлений'"); + КонецЕсли; + КонецЦикла; + Если ПарКомпл.Количество() <> 3 Тогда + Возврат НСтр("ru = 'Неверный формат сведений о наличии обновлений'"); + КонецЕсли; + Возврат ПарКомпл; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -115,15 +227,11 @@ // Параметры: // СтандартнаяОбработка - Булево - если в процедуре установить данному параметру значение Ложь, то инструкция по // "ручному" обновлению показана не будет. -Процедура ПриВыполненииОбновленияИнформационнойБазы(СтандартнаяОбработка, ЗавершениеРаботыСистемы = Ложь) Экспорт +Процедура ПриВыполненииОбновленияИнформационнойБазы(ЗавершениеРаботыСистемы = Ложь) Экспорт - СтандартнаяОбработка = Ложь; - Если ЗавершениеРаботыСистемы Тогда - ПараметрыФормы = Новый Структура("ЗавершениеРаботыСистемы, ПолученоОбновлениеКонфигурации", Истина, Истина); - ОткрытьФормуМодально("Обработка.ОбновлениеКонфигурации.Форма.Форма", ПараметрыФормы); - Иначе - ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.Форма"); - КонецЕсли; + ПараметрыФормы = Новый Структура("ЗавершениеРаботыСистемы, ПолученоОбновлениеКонфигурации", + ЗавершениеРаботыСистемы, ЗавершениеРаботыСистемы); + ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.Форма", ПараметрыФормы); КонецПроцедуры @@ -132,7 +240,7 @@ // Возвращает общие параметры обновления. // -Функция ПолучитьПараметрыОбновления(ПроверитьОбновленияДля83 = Ложь) Экспорт +Функция ПолучитьПараметрыОбновления(ПроверитьОбновленияДляНовойРедакции = Ложь) Экспорт #Если НЕ ВебКлиент Тогда СтруктураПараметров = Новый Структура(); @@ -155,10 +263,11 @@ КаталогВременныхФайловОбновления = КаталогВременныхФайлов() + "1Cv8Update." + Формат(ОбщегоНазначенияКлиент.ДатаСеанса(), "ДФ=ггММддЧЧммсс") + "\"; СтруктураПараметров.Вставить("КаталогВременныхФайловОбновления" , КаталогВременныхФайловОбновления); - СтруктураПараметров.Вставить("АдресРесурсовДляПроверкиНаличияОбновления" , АдресРесурсовДляПроверкиНаличияОбновления(ПроверитьОбновленияДля83)); + СтруктураПараметров.Вставить("АдресРесурсовДляПроверкиНаличияОбновления" , АдресРесурсовДляПроверкиНаличияОбновления(ПроверитьОбновленияДляНовойРедакции)); СтруктураПараметров.Вставить("АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту" , АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту()); СтруктураПараметров.Вставить("АдресКаталогаШаблоновНаСервереОбновлений" , АдресКаталогаШаблоновНаСервереОбновлений()); СтруктураПараметров.Вставить("АдресСервераОбновлений" , АдресСервераОбновлений()); + СтруктураПараметров.Вставить("АдресСервисаПроверкиЛегальности" , АдресСервисаПроверкиЛегальности()); СтруктураПараметров.Вставить("ИмяФайлаПроверкиНаличияОбновления" , ИмяФайлаПроверкиНаличияОбновления()); // ИТС @@ -193,21 +302,38 @@ // Возвращаемое значение: // Строка – адрес веб-страницы. // -Функция АдресРесурсовДляПроверкиНаличияОбновления(ПроверитьОбновленияДля83 = Ложь) Экспорт +Функция АдресРесурсовДляПроверкиНаличияОбновления(ПроверитьОбновленияДляНовойРедакции = Ложь) Экспорт + НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; КороткоеИмяКонфигурации = НастройкиОбновления.КороткоеИмяКонфигурации; КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "\", "/"); - Если ПроверитьОбновленияДля83 Тогда - Количество82 = СтрЧислоВхождений(КороткоеИмяКонфигурации, "82"); - Если Количество82 = 1 Тогда - КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, "82", "83"); - ИначеЕсли Количество82 > 1 Тогда - КороткоеИмяКонфигурации = ЗаменитьРелизПлатформы(КороткоеИмяКонфигурации); - КонецЕсли; + Если ПроверитьОбновленияДляНовойРедакции Тогда + КороткоеИмяКонфигурации = СтрЗаменить(КороткоеИмяКонфигурации, ТекущаяРедакцияПлатформы(), СледующаяРедакцияПлатформы()); КонецЕсли; Результат = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НастройкиОбновления.АдресРесурсаДляПроверкиНаличияОбновления) + - КороткоеИмяКонфигурации + "/"; + КороткоеИмяКонфигурации + "/"; Возврат Результат; + +КонецФункции + +Функция ТекущаяРедакцияПлатформы() + + СистемнаяИнформация = Новый СистемнаяИнформация; + МассивТекущейВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СистемнаяИнформация.ВерсияПриложения, "."); + ТекущаяРедакция = МассивТекущейВерсии[0] + МассивТекущейВерсии[1]; + + Возврат ТекущаяРедакция; + +КонецФункции + +Функция СледующаяРедакцияПлатформы() + + СистемнаяИнформация = Новый СистемнаяИнформация; + МассивТекущейВерсии = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СистемнаяИнформация.ВерсияПриложения, "."); + СледующаяРедакция = МассивТекущейВерсии[0] + Строка(Число(МассивТекущейВерсии[1]) +1); + + Возврат СледующаяРедакция; + КонецФункции // Получить адрес веб-страницы с информацией о том, как получить доступ к @@ -252,6 +378,17 @@ КонецФункции +// Получить адрес сервиса проверки легальности получения обновления. +// +// Возвращаемое значение: +// Строка – адрес сервиса. +// +Функция АдресСервисаПроверкиЛегальности() Экспорт + + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.АдресСервисаПроверкиЛегальности; + +КонецФункции + // Получить адрес сервера обновлений. // // Возвращаемое значение: @@ -305,7 +442,7 @@ // // Параметры: // ВыдаватьСообщения: Булево, признак вывода пользователю сообщений об ошибках -Процедура ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения = Ложь, ДоступноОбновлениеДля83 = Ложь) Экспорт +Процедура ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения = Ложь, ДоступноОбновлениеДляНовойРедакции = Ложь) Экспорт Состояние("Проверка наличия обновления в Интернете.."); Параметры = ПолучитьДоступноеОбновлениеКонфигурации(); @@ -318,7 +455,7 @@ Параметры.ПараметрыФайлаПроверкиОбновления = ПолучитьФайлПроверкиНаличияОбновлений(ВыдаватьСообщения); Если ТипЗнч(Параметры.ПараметрыФайлаПроверкиОбновления) = Тип("Строка") Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", НСтр("ru = 'Невозможно подключиться к сети Интернет для проверки обновлений.'")); Параметры.ИмяСтраницы = "ПодключениеКИнтернет"; Возврат; @@ -330,7 +467,7 @@ ОбновленияНеОбнаружено = Истина; - Если Не ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83() Тогда + Если ПроверятьОбновлениеДляСледующейРедакцииПлатформы() Тогда Параметры.ПараметрыФайлаПроверкиОбновления = ПолучитьФайлПроверкиНаличияОбновлений(Ложь, Истина); @@ -341,7 +478,7 @@ Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияКонфигурации, Параметры.ПоследняяВерсияКонфигурации) < 0 Тогда ОбновленияНеОбнаружено = Ложь; - ДоступноОбновлениеДля83 = Истина; + ДоступноОбновлениеДляНовойРедакции = Истина; КонецЕсли; КонецЕсли; @@ -350,7 +487,7 @@ Если ОбновленияНеОбнаружено Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Обновление не требуется: последняя версия конфигурации уже установлена.'")); Параметры.ИмяСтраницы = "ОбновленияНеОбнаружено"; @@ -359,7 +496,7 @@ КонецЕсли; КонецЕсли; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Обнаружена более новая версия конфигурации в Интернете:'") + " " + Параметры.ПоследняяВерсияКонфигурации + "."); @@ -386,7 +523,7 @@ КонецЕсли; НастройкиОбновленияКонфигурации.ВремяПоследнейПроверкиОбновления = ДатаПроверки; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, НСтр("ru = 'Проверка наличия обновления в сети Интернет по расписанию.'")); НаименованиеСтраницыДоступногоОбновления = "ДоступноеОбновление"; @@ -394,7 +531,7 @@ Параметры = ПолучитьДоступноеОбновлениеКонфигурации(); Если Параметры.ИсточникОбновления <> -1 И Параметры.ИмяСтраницы = НаименованиеСтраницыДоступногоОбновления Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, НСтр("ru = 'Обнаружена новая версия конфигурации:'") + " " + Параметры.ПараметрыФайлаПроверкиОбновления.Version); @@ -410,84 +547,13 @@ НСтр("ru = 'Версия:'") + " " + Параметры.ПараметрыФайлаПроверкиОбновления.Version, БиблиотекаКартинок.Информация32); Иначе - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),, НСтр("ru = 'Доступных обновлений не обнаружено.'")); КонецЕсли; ОбновлениеКонфигурацииВызовСервера.ЗаписатьСтруктуруНастроекПомощника(НастройкиОбновленияКонфигурации, СообщенияДляЖурналаРегистрации); КонецПроцедуры -Функция ПолучитьФайлПроверкиНаличияОбновлений(Знач ВыдаватьСообщения = Истина, ПроверитьОбновленияДля83 = Ложь) - - ПараметрыОбновления = ПолучитьПараметрыОбновления(ПроверитьОбновленияДля83); - НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; - - ВременныйФайл = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяФайлаПроверкиНаличияОбновления; - - // при необходимости, создаем каталог для временного файла - КаталогВременногоФайла = ПолучитьКаталогФайла(ВременныйФайл); - КаталогВременногоФайлаОбъект = Новый Файл(КаталогВременногоФайла); - Если НЕ КаталогВременногоФайлаОбъект.Существует() Тогда - Попытка - СоздатьКаталог(КаталогВременногоФайла); - Исключение - ИнфоОбОшибке = ИнформацияОбОшибке(); - - СообщениеОбОшибке = НСтр("ru = 'Не удалось создать временный каталог для проверки наличия обновлений. - |%1'"); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ПодробноеПредставлениеОшибки(ИнфоОбОшибке)),, - Истина); - - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, - КраткоеПредставлениеОшибки(ИнфоОбОшибке)); - Если ВыдаватьСообщения Тогда - Предупреждение(СообщениеОбОшибке); - КонецЕсли; - Возврат СообщениеОбОшибке; - КонецПопытки; - КонецЕсли; - - // получаем сам файл из Интернета - Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + - ПараметрыОбновления.АдресРесурсовДляПроверкиНаличияОбновления + ПараметрыОбновления.ИмяФайлаПроверкиНаличияОбновления, - Новый Структура("ПутьДляСохранения", ? (ПустаяСтрока(ВременныйФайл), Неопределено, ВременныйФайл))); - - Если Результат.Статус <> Истина Тогда - СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось проверить наличие обновлений. - |%1'"), Результат.СообщениеОбОшибке); - Если ВыдаватьСообщения Тогда - Предупреждение(СообщениеОбОшибке); - КонецЕсли; - Возврат СообщениеОбОшибке; - КонецЕсли; - - Возврат ПараметрыДистрибутива(ВременныйФайл); - -КонецФункции - -Функция ЗаменитьРелизПлатформы(ИмяКонфигурации) - - ОбщаяДлинаСтроки = СтрДлина(ИмяКонфигурации); - ДлинаСтроки = ОбщаяДлинаСтроки; - Пока ДлинаСтроки > 1 Цикл - - ТекущийСимвол = Сред(ИмяКонфигурации, ДлинаСтроки, 1); - ПредыдущийСимвол = Сред(ИмяКонфигурации, ДлинаСтроки - 1, 1); - Если ТекущийСимвол = "2" И ПредыдущийСимвол = "8" Тогда - ШаблонИмениКонфигурации = "%1%2%3"; - КороткоеИмяКонфигурации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениКонфигурации, - Лев(КороткоеИмяКонфигурации, ДлинаСтроки - 1), "3", Прав(КороткоеИмяКонфигурации, ОбщаяДлинаСтроки - ДлинаСтроки)); - Прервать; - КонецЕсли; - ДлинаСтроки = ДлинаСтроки - 1; - КонецЦикла; - - Возврат ИмяКонфигурации; - -КонецФункции - // Функция, выполняющая копирование заданного файла в другой. // // Параметры: @@ -504,7 +570,7 @@ |(источник: %2; приемник: %3)'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ИмяФайлаИсточник, ИмяФайлаНазначение); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", Сообщение); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Предупреждение", Сообщение); Возврат Ложь; КонецПопытки; Возврат Истина; @@ -558,7 +624,7 @@ ПараметрыРелизовНаДискеИТС = ПрочитатьАдресаРелизовНаДискеИТС(ВременныйФайл, ДискИТС); Если ТипЗнч(ПараметрыРелизовНаДискеИТС) <> Тип("Структура") Тогда // ошибки при чтении файла Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Обновления на диске 1С:ИТС не найдены.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Обновления на диске 1С:ИТС не найдены.'")); КонецЕсли; Возврат Неопределено; КонецЕсли; @@ -589,66 +655,6 @@ КонецФункции -// Чтение данных по обновлению из файла ИмяФайлаПроверкиНаличияОбновления (UpdInfo.txt) -// Вычисляются: -// номер версии обновления на сервере, -// номера версий, с которых производится обновление (раздляются символом ";") -// дата публикации обновления -// -// Параметры: -// ИмяФайла - полное имя файла UpdInfo.txt -// -// Возвращаемое значение: -// Структура: -// Version - версия обновления -// FromVersions - с каких версий обновляет -// UpdateDate - дата опубликования -// Строка - описание ошибки, если файл не найден или не содержит нужных значений -// -Функция ПараметрыДистрибутива(Знач ИмяФайла) - Файл = Новый Файл(ИмяФайла); - Если НЕ Файл.Существует() Тогда - Возврат НСтр("ru = 'Файл описания обновлений не получен'"); - КонецЕсли; - ТД = Новый ТекстовыйДокумент(); - ТД.Прочитать(Файл.ПолноеИмя); - ПарКомпл = Новый Структура(); - Для Н = 1 По ТД.КоличествоСтрок() Цикл - СтрТмп = НРег(СокрЛП(ТД.ПолучитьСтроку(Н))); - Если ПустаяСтрока(СтрТмп) Тогда - Продолжить; - КонецЕсли; - Если Найти(СтрТмп,"fromversions=")>0 Тогда - СтрТМП = СокрЛП(Сред(СтрТмп,Найти(СтрТмп,"fromversions=")+СтрДлина("fromversions="))); - СтрТМП = ?(Лев(СтрТМП,1)=";","",";") + СтрТмп + ?(Прав(СтрТМП,1)=";","",";"); - ПарКомпл.Вставить("FromVersions",СтрТМП); - ИначеЕсли Найти(СтрТмп,"version=")>0 Тогда - ПарКомпл.Вставить("Version",Сред(СтрТмп,Найти(СтрТмп,"version=")+СтрДлина("version="))); - ИначеЕсли Найти(СтрТмп,"updatedate=")>0 Тогда - // формат даты = Дата, - СтрТмп = Сред(СтрТмп,Найти(СтрТмп,"updatedate=")+СтрДлина("updatedate=")); - Если СтрДлина(СтрТмп)>8 Тогда - Если Найти(СтрТмп,".")=5 Тогда - // дата в формате ГГГГ.ММ.ДД - СтрТмп = СтрЗаменить(СтрТмп,".",""); - ИначеЕсли Найти(СтрТмп,".")=3 Тогда - // дата в формате ДД.ММ.ГГГГ - СтрТмп = Прав(СтрТмп,4)+Сред(СтрТмп,4,2)+Лев(СтрТмп,2); - Иначе - // дата в формате ГГГГММДД - КонецЕсли; - КонецЕсли; - ПарКомпл.Вставить("UpdateDate",Дата(СтрТмп)); - Иначе - Возврат НСтр("ru = 'Неверный формат сведений о наличии обновлений'"); - КонецЕсли; - КонецЦикла; - Если ПарКомпл.Количество() <> 3 Тогда - Возврат НСтр("ru = 'Неверный формат сведений о наличии обновлений'"); - КонецЕсли; - Возврат ПарКомпл; -КонецФункции - Функция ПрочитатьАдресаРелизовНаДискеИТС(Знач ИмяФайла, Знач ДискИТС) Файл = Новый Файл(ИмяФайла); Если НЕ Файл.Существует() Тогда @@ -692,7 +698,7 @@ КонецЦикла; ЧтениеXML.Закрыть(); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = ' ПрочитатьАдресаРелизовНаДискеИТС:'") + " " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Возврат Неопределено; @@ -717,6 +723,12 @@ КонецФункции +Функция ПроверятьОбновлениеДляСледующейРедакцииПлатформы() + + Возврат ОбновлениеКонфигурацииКлиентПереопределяемый.ПроверятьОбновлениеДляСледующейРедакцииПлатформы(); + +КонецФункции + // Функция, возвращает путь к каталогу временных файлов для проведения обновления. Функция КаталогLocalAppData() Экспорт App = Новый COMОбъект("Shell.Application"); @@ -776,22 +788,19 @@ // Проверяет легальность получения обновления. При отсутствии подсистемы // проверки легальности возвращает Истина // -Функция ПроверитьЛегальностьПолученияОбновления() Экспорт +// Параметры: +// Оповещение - ОписаниеОповещения - содержит обработчик, +// вызываемый после подтверждения легальности получения обновления. +// +Функция ПроверитьЛегальностьПолученияОбновления(Оповещение) Экспорт - ОбновлениеПолученоЛегально = Истина; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда - МодульПроверкаЛегальностиПолученияОбновленияКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); - ОбновлениеПолученоЛегально = МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновления(); - - Если ОбновлениеПолученоЛегально = Неопределено Тогда - ОбновлениеПолученоЛегально = Истина; - КонецЕсли; - + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + МодульПроверкаЛегальностиПолученияОбновленияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); + МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПоказатьПроверкуЛегальностиПолученияОбновления(Оповещение); + Иначе + ВыполнитьОбработкуОповещения(Оповещение, Истина); КонецЕсли; - Возврат ОбновлениеПолученоЛегально; - КонецФункции //////////////////////////////////////////////////////////////////////////////// @@ -828,9 +837,789 @@ // Вызывается при интерактивном начале работы пользователя с областью данных. // Соответствует событию ПриНачалеРаботыСистемы модулей приложения. // -Процедура ПриНачалеРаботыСистемы() Экспорт +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт ПроверитьОбновлениеКонфигурации(); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Процедуры для проверки легальности получения обновления + +#Если Не ВебКлиент Тогда + +// Возвращает структуру ответа веб-сервера +// +Функция ПроверитьЛегальностьСкачиванияОбновления(ПараметрыЗапроса) Экспорт + + Если Не ОбновлениеКонфигурацииКлиентПереопределяемый.ИспользоватьПроверкуЛегальностиСкачиванияОбновления() Тогда + + Возврат Новый Структура("ЗначениеРезультата, ТекстОшибки", Истина, ""); + + КонецЕсли; + + Попытка + // Создание описания сервиса + ОписаниеСервиса = ОписаниеСервисаПроверкиЛегальности(); + Исключение + ТекстОшибки = НСтр("ru = 'Ошибка создания описания веб-сервиса проверки легальности получения обновления.'"); + Возврат СтруктураОтветаВебСервера(ТекстОшибки,,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + // Определение доступности веб-сервиса + Попытка + + ОтветСервера = СервисДоступен(ОписаниеСервиса); + + Если НРег(СокрЛП(ОтветСервера)) <> "ready" Тогда + + ТекстОшибки = НСтр("ru = 'Сервис проверки легальности получения обновлений временно недоступен. + |Повторите попытку позднее'"); + Возврат СтруктураОтветаВебСервера(ТекстОшибки, ОтветСервера); + + КонецЕсли; + + Исключение + + ТекстОшибки = НСтр("ru = 'Не удалось подключиться к сервису проверки легальности получения обновлений. + |Проверьте параметры подключения к Интернету'"); + Возврат СтруктураОтветаВебСервера(ТекстОшибки,,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + // Получение ответа с веб-сервиса. + Возврат ПроверитьЛегальностьПолученияОбновлений(ПараметрыЗапроса, ОписаниеСервиса); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для работы с веб-сервисом проверки легальности на "высоком уровне". + +// Добавляет из структуры параметры в запрос. +// +// Параметры: +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание соединения с веб-сервисом проверки легальности +// ПараметрыЗапроса - Строка - уже сформированные параметры. +// СписокПараметров - ОбъектXDTO - список значений параметров. +// +Процедура ДобавитьПараметрыКЗапросу(ОписаниеСервисаПроверкиЛегальности, ПараметрыЗапроса, СписокПараметров) + + ТипПараметр = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Тип(ОписаниеСервисаПроверкиЛегальности.URIСервиса, "Parameter"); + КоличествоПараметров = 0; + + Для Каждого ПараметрПередачи Из СписокПараметров Цикл + + // Определение объекта параметра (Объект XDTO). + Параметр = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Создать(ТипПараметр); + + Параметр.name = СокрЛП(ПараметрПередачи.Ключ); + Параметр.value = СокрЛП(ПараметрПередачи.Значение); + Параметр.index = КоличествоПараметров; + + ПараметрыЗапроса.parameter.Добавить(Параметр); + + КоличествоПараметров = КоличествоПараметров + 1; + + КонецЦикла; + +КонецПроцедуры + +// Проверяет легальность скачивания обновления. +// +// Параметры: +// ДополнительныеПараметры - Структура - дополнительные параметры для передачи веб-сервису; +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание соединения с веб-сервисом проверки легальности +// +// Возвращаемое значение: +// Структура - структурированный ответ веб-сервера +// +Функция ПроверитьЛегальностьПолученияОбновлений(ДополнительныеПараметры, ОписаниеСервисаПроверкиЛегальности) + + Попытка + + ТипОтвета = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Тип(ОписаниеСервисаПроверкиЛегальности.URIСервиса, "ProcessResponseType"); + ТипЗапроса = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Тип(ОписаниеСервисаПроверкиЛегальности.URIСервиса, "Parameters"); + + ПараметрыЗапроса = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Создать(ТипЗапроса); + + // Если имеются передаваемые параметры, то добавляем их. + Если ДополнительныеПараметры <> Неопределено Тогда + ДобавитьПараметрыКЗапросу(ОписаниеСервисаПроверкиЛегальности, ПараметрыЗапроса, ДополнительныеПараметры); + КонецЕсли; + + // Выполнение метода "process" WEB-Сервиса. + ОтветСервера = ОбновлениеПолученоЛегально(ПараметрыЗапроса, ОписаниеСервисаПроверкиЛегальности); + + Исключение + + ТекстОшибки = НСтр("ru = 'Ошибка выполнения проверки легальности получения обновления. + |Обратитесь к администратору'"); + Возврат СтруктураОтветаВебСервера(ТекстОшибки,,,,ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + + КонецПопытки; + + СтруктураКоманды = ОтветСервера.command[0]; + + Если СтруктураКоманды.name = "store.put" Тогда + + ПараметрыОтвета = СтруктураКоманды.parameters.parameter; + + Результат = Новый Структура; + Для Каждого Параметр Из ПараметрыОтвета Цикл + + Результат.Вставить(Параметр.name, Параметр.value); + + КонецЦикла; + + Результат = СтруктураОтветаВебСервера(Результат.resultTextError, + Результат.resultCodeError, Результат.resultAvtorisation, Ложь); + + Иначе + + Результат = СтруктураОтветаВебСервера(Нстр("ru = 'Неожиданный ответ сервиса проверки легальности получения обновлений'")); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает ответ сервера в виде структуры +// +Функция СтруктураОтветаВебСервера(ТекстОшибки, КодОшибки = 0, ЗначениеРезультата = Ложь, + ЗаписьВЖурналРегистрации = Истина, ТекстСообщения = "") + + СтруктураОтвета = Новый Структура; + + СтруктураОтвета.Вставить("ЗначениеРезультата", ЗначениеРезультата); + СтруктураОтвета.Вставить("ТекстОшибки", ТекстОшибки); + + Если ЗаписьВЖурналРегистрации Тогда + + Если ПустаяСтрока(ТекстСообщения) Тогда + ТекстСообщения = Нстр("ru = '%ТекстОшибки. Код ошибки: %КодОшибки.'"); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ТекстОшибки", ТекстОшибки); + ТекстСообщения = СтрЗаменить(ТекстСообщения, "%КодОшибки", КодОшибки); + КонецЕсли; + + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ТекстСообщения); + + КонецЕсли; + + Возврат СтруктураОтвета; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для работы с веб-сервисом проверки легальности на "низком уровне". + +// Формирует описание веб-сервиса из WSDL-документа для дальнейшей работы +// с веб-сервисом проверки легальности. +// +// Возвращаемое значение: +// Структура со свойствами: +// АдресWSDL (Строка) - URL WSDL-документа; +// выполняется с использованием временных файлов; +// ФабрикаXDTO (ФабрикаXDTO) - Фабрика XDTO веб-сервиса; +// URIСервиса (Строка) - URI веб-сервиса проверки легальности; +// СоединениеПорта (HTTPСоединение) - соединение с портом сервиса +// для выполнения вызовов методов веб-сервиса; +// ПутьПорта (Строка) - путь порта на сервере; +// +Функция ОписаниеСервисаПроверкиЛегальности() + + АдресWSDL = АдресСервисаПроверкиЛегальности(); + ПараметрыСоединения = ПолучениеФайловИзИнтернетаКлиентСервер.СтруктураURI(АдресWSDL); + + Результат = Новый Структура("АдресWSDL", АдресWSDL); + + ИнтернетПрокси = ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(ПараметрыСоединения.Схема); + + ТаймаутСети = 10; + + HTTP = Новый HTTPСоединение(ПараметрыСоединения.Хост, + ПараметрыСоединения.Порт, + ПараметрыСоединения.Логин, + ПараметрыСоединения.Пароль, + ИнтернетПрокси, + ТаймаутСети, + ?(ПараметрыСоединения.Схема = "https", + Новый ЗащищенноеСоединениеOpenSSL(), + Неопределено)); + + Попытка + + ПараметрыКонструктора = Новый Массив; + ПараметрыКонструктора.Добавить(ПараметрыСоединения.ПутьНаСервере); + HTTPЗапрос = Новый(Тип("HTTPЗапрос"), ПараметрыКонструктора); + Ответ = HTTP.Получить(HTTPЗапрос); + ТекстWSDL = Ответ.ПолучитьТелоКакСтроку(); + + Исключение + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса. + |Не удалось получить WSDL-описание с сервера проверки легальности скачивания обновления (%1): %2.'"), + АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + КонецПопытки; + + ЧтениеXML = Новый ЧтениеXML; + ЧтениеXML.УстановитьСтроку(ТекстWSDL); + + ПостроительDOM = Новый ПостроительDOM; + Попытка + ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML); + Исключение + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: %2.'"), + АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + КонецПопытки; + + // Создание фабрики XDTO веб-сервиса проверки легальности + + УзлыСхемы = ДокументDOM.ПолучитьЭлементыПоИмени("wsdl:types"); + Если УзлыСхемы.Количество() = 0 Тогда + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, НСтр("ru = 'Отсутствует элемент описания типов данных (<wsdl:types ...>).'")); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + УзелОписанияСхемы = УзлыСхемы[0].ПервыйДочерний; + Если УзелОписанияСхемы = Неопределено Тогда + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, НСтр("ru = 'Отсутствует элемент описания типов данных (<xs:schema ...>)'")); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + ПостроительСхемы = Новый ПостроительСхемXML; + + Попытка + СхемаДанныхСервиса = ПостроительСхемы.СоздатьСхемуXML(УзелОписанияСхемы); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка при создании схемы данных из WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + НаборСхем = Новый НаборСхемXML; + НаборСхем.Добавить(СхемаДанныхСервиса); + + Попытка + ФабрикаСервиса = Новый ФабрикаXDTO(НаборСхем); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка при создании фабрики XDTO из WSDL-описания веб-сервиса проверки легальности скачивания обновления: %2'"), + АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + // Определение параметров подключения к порту сервиса + + КорневойЭлемент = ДокументDOM.ПервыйДочерний; + + Результат.Вставить("ФабрикаXDTO", ФабрикаСервиса); + + URIСервиса = ЗначениеАтрибутаУзлаDOM(КорневойЭлемент, "targetNamespace"); + Если НЕ ЗначениеЗаполнено(URIСервиса) Тогда + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, НСтр("ru = 'Отсутствует URI пространства имен в WSDL-описании.'")); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + Результат.Вставить("URIСервиса" , URIСервиса); + + // Определение адреса порта веб-сервиса + УзлыСервисов = КорневойЭлемент.ПолучитьЭлементыПоИмени("wsdl:service"); + Если УзлыСервисов.Количество() = 0 Тогда + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, НСтр("ru = 'Отсутствует описание веб-сервисов в WSDL-описании (<wsdl:service ...>).'")); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + УзелСервиса = УзлыСервисов[0]; + + ИмяСервиса = ЗначениеАтрибутаУзлаDOM(УзелСервиса, "name"); + + УзлыПортов = УзелСервиса.ПолучитьЭлементыПоИмени("wsdl:port"); + + Если УзлыПортов.Количество() = 0 Тогда + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, НСтр("ru = 'Отсутствует описание портов в WSDL-описании (<wsdl:port ...>).'")); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + УзелПорта = УзлыПортов[0]; + ИмяПорта = ЗначениеАтрибутаУзлаDOM(УзелПорта, "name"); + + Если НЕ ЗначениеЗаполнено(ИмяПорта) Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось определить имя порта сервиса (%1).'"), ИмяСервиса); + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, ТекстОшибки); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + АдресПорта = Неопределено; + УзлыАдреса = УзелПорта.ПолучитьЭлементыПоИмени("soap:address"); + Если УзлыАдреса.Количество() > 0 Тогда + АдресПорта = ЗначениеАтрибутаУзлаDOM(УзлыАдреса[0], "location"); + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(АдресПорта) Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Не удалось определить URL заданного порта сервиса (%1).'"), ИмяПорта); + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при создании описания веб-сервиса (%1). + |Ошибка чтения WSDL-описания веб-сервиса проверки легальности скачивания обновления: + |%2'"), АдресWSDL, ТекстОшибки); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + СоединениеПорта = Новый HTTPСоединение(ПараметрыСоединения.Хост, + ПараметрыСоединения.Порт, + ПараметрыСоединения.Логин, + ПараметрыСоединения.Пароль, + ИнтернетПрокси, + ТаймаутСети, + ?(ПараметрыСоединения.Схема = "https", + Новый ЗащищенноеСоединениеOpenSSL(), + Неопределено)); + + Результат.Вставить("СоединениеПорта" , СоединениеПорта); + Результат.Вставить("ПутьПорта" , ПараметрыСоединения.ПутьНаСервере); + + Возврат Результат; + +КонецФункции + +// Прокси-функция для вызова метода isReady() веб-сервиса проверки легальности +// +// Параметры: +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание веб-сервиса проверки легальности, +// см. ОписаниеСервисаПроверкиЛегальности(); +// +// Возвращаемое значение: +// Строка: +// значение, возвращенное методом isReady() веб-сервиса проверки легальности; +// +Функция СервисДоступен(ОписаниеСервисаПроверкиЛегальности) + + ЗаписьКонверта = НовыйЗаписьКонвертаSOAP(); + ТекстКонверта = ТекстВКонвертеSOAP(ЗаписьКонверта); + + Попытка + ТелоОтвета = ОтправитьЗапросSOAP(ТекстКонверта, ОписаниеСервисаПроверкиЛегальности); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при вызове операции isReady сервиса (%1): %2'"), + ОписаниеСервисаПроверкиЛегальности.АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + ТипОбъекта = ТипЗначенияКорневогоСвойстваФабрикиСервисаЛегальности("isReadyResponse", ОписаниеСервисаПроверкиЛегальности); + Если ТипОбъекта = Неопределено Тогда + ТекстИсключения = СтрЗаменить(НСтр("ru = 'Ошибка при вызове операции isReady сервиса (%1). + |Не удалось определить тип корневого свойства isReadyResponse.'"), + "%1", + ОписаниеСервисаПроверкиЛегальности.АдресWSDL); + ВызватьИсключение ТекстИсключения; + КонецЕсли; + + Попытка + Значение = ПрочитатьОтветВКонвертеSOAP(ТелоОтвета, ОписаниеСервисаПроверкиЛегальности, ТипОбъекта); + Исключение + ТекстИсключения = СтрЗаменить(НСтр("ru = 'Ошибка при вызове операции isReady сервиса (%1).'"), + "%1", + ОписаниеСервисаПроверкиЛегальности.АдресWSDL) + + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) + + Символы.ПС + Символы.ПС + + НСтр("ru = 'Тело запроса:'") + + Символы.ПС + + ТекстКонверта; + + ВызватьИсключение ТекстИсключения; + КонецПопытки; + + Если ТипЗнч(Значение) = Тип("Структура") Тогда + + // Возвращено описание исключения SOAP + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при вызове операции isReady сервиса (%1) + |Ошибка SOAP: %2'"), ОписаниеСервисаПроверкиЛегальности.АдресWSDL, ОписаниеИсключенияSOAPВСтроку(Значение)); + ВызватьИсключение ТекстИсключения; + + ИначеЕсли ТипЗнч(Значение) = Тип("ЗначениеXDTO") Тогда + Возврат Значение.Значение; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +// Метод веб-сервиса для проверки легальности получения обновления +// +// Параметры: +// ПараметрыЗапроса (ОбъектXDTO) - параметры запроса метода process(); +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание веб-сервиса проверки легальности, +// см. ОписаниеСервисаПроверкиЛегальности(); +// +// Возвращаемое значение: +// ОбъектXDTO: +// значение, возвращенное методом process() веб-сервиса проверки легальности; +// +Функция ОбновлениеПолученоЛегально(ПараметрыЗапроса, ОписаниеСервисаПроверкиЛегальности) + + ЗаписьКонверта = НовыйЗаписьКонвертаSOAP(); + + ЗаписьКонверта.ЗаписатьНачалоЭлемента("m:processRequest"); + ЗаписьКонверта.ЗаписатьАтрибут("xmlns:m", ОписаниеСервисаПроверкиЛегальности.URIСервиса); + + ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.ЗаписатьXML(ЗаписьКонверта, + ПараметрыЗапроса, + "parameters", + , + ФормаXML.Элемент, + НазначениеТипаXML.Явное); + + ЗаписьКонверта.ЗаписатьКонецЭлемента(); // </m:processRequest> + + ТекстКонверта = ТекстВКонвертеSOAP(ЗаписьКонверта); + + Попытка + ТелоОтвета = ОтправитьЗапросSOAP(ТекстКонверта, ОписаниеСервисаПроверкиЛегальности); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка при вызове операции process сервиса (%1): %2'"), + ОписаниеСервисаПроверкиЛегальности.АдресWSDL, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + ТипОбъекта = ТипЗначенияКорневогоСвойстваФабрикиСервисаЛегальности("processResponse", ОписаниеСервисаПроверкиЛегальности); + Если ТипОбъекта = Неопределено Тогда + ТекстИсключения = СтрЗаменить(НСтр("ru = 'Ошибка при вызове операции process сервиса (%1). + |Не удалось определить тип корневого свойства processResponse.'"), + "%1", + ОписаниеСервисаПроверкиЛегальности.АдресWSDL); + ВызватьИсключение ТекстИсключения; + КонецЕсли; + + Попытка + Значение = ПрочитатьОтветВКонвертеSOAP(ТелоОтвета, ОписаниеСервисаПроверкиЛегальности, ТипОбъекта); + Исключение + + ТекстИсключения = СтрЗаменить(НСтр("ru = 'Ошибка при вызове операции process сервиса (%1).'"), + "%1", + ОписаниеСервисаПроверкиЛегальности.АдресWSDL) + + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) + + Символы.ПС + Символы.ПС + + НСтр("ru = 'Тело запроса:'") + + Символы.ПС + + ТекстКонверта; + + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + Если ТипЗнч(Значение) = Тип("ОбъектXDTO") Тогда + Возврат Значение.commands; + Иначе + Возврат Неопределено; + КонецЕсли; + +КонецФункции + +// Возвращает строковое значение атрибута узла DOM-документа. +// +// Параметры: +// УзелDOM (УзелDOM) - узел DOM-документа; +// ИмяАтрибута (Строка) - полное имя атрибута; +// ЗначениеЕслиНеНайдено (Произвольный) - значение, если атрибут не найден; +// +// Возвращаемое значение: +// Строка: +// Строковое значение атрибута узла; +// +Функция ЗначениеАтрибутаУзлаDOM(УзелDOM, ИмяАтрибута, ЗначениеЕслиНеНайдено = Неопределено) + + Атрибут = УзелDOM.Атрибуты.ПолучитьИменованныйЭлемент(ИмяАтрибута); + + Если Атрибут = Неопределено Тогда + Возврат ЗначениеЕслиНеНайдено; + Иначе + Возврат Атрибут.Значение; + КонецЕсли; + +КонецФункции + +// Определяет тип значения корневого свойства пакета фабрики XDTO +// веб-сервиса проверки легальности. +// +// Параметры: +// ИмяСвойства (Строка) - имя корневого свойства; +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание веб-сервиса проверки легальности, +// см. ОписаниеСервисаПроверкиЛегальности(); +// +// Возвращаемое значение: +// ТипЗначенияXDTO; +// ТипОбъектаXDTO; +// Неопределено - если корневое свойство не найдено; +// +Функция ТипЗначенияКорневогоСвойстваФабрикиСервисаЛегальности(ИмяСвойства, ОписаниеСервисаПроверкиЛегальности) + + Пакет = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.Пакеты.Получить(ОписаниеСервисаПроверкиЛегальности.URIСервиса); + КорневоеСвойство = Пакет.КорневыеСвойства.Получить(ИмяСвойства); + Если КорневоеСвойство = Неопределено Тогда + Возврат Неопределено; + Иначе + Возврат КорневоеСвойство.Тип; + КонецЕсли; + +КонецФункции + +// Формирует объект тип ЗаписьXML с уже записанными +// SOAP-заголовками; +// +// Возвращаемое значение: +// ЗаписьXML: +// объект записи XML с записанными SOAP-заголовками; +// +Функция НовыйЗаписьКонвертаSOAP() + + ЗаписьXML = Новый ЗаписьXML; + ЗаписьXML.УстановитьСтроку(); + + ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Envelope"); + ЗаписьXML.ЗаписатьАтрибут("xmlns:soap", "http://schemas.xmlsoap.org/soap/envelope/"); + ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Header"); + ЗаписьXML.ЗаписатьКонецЭлемента(); // </soap:Header> + ЗаписьXML.ЗаписатьНачалоЭлемента("soap:Body"); + + Возврат ЗаписьXML; + +КонецФункции + +// Финализирует запись конверта SOAP и возвращает текст конверта. +// +// Параметры: +// ЗаписьКонверта (ЗаписьXML) - объект, в который выполнялась запись конверта; +// +// Возвращаемое значение: +// Строка: текст конверта SOAP; +// +Функция ТекстВКонвертеSOAP(ЗаписьКонверта) + + ЗаписьКонверта.ЗаписатьКонецЭлемента(); // </soap:Body> + ЗаписьКонверта.ЗаписатьКонецЭлемента(); // </soap:Envelope> + + Возврат ЗаписьКонверта.Закрыть(); + +КонецФункции + +// Выполняет отправку SOAP-конверта веб-сервису и получает ответный +// SOAP-конверт. +// +// Параметры: +// ТекстКонверта (Строка) - текст конверта-запроса; +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание веб-сервиса проверки легальности, +// см. ОписаниеСервисаПроверкиЛегальности(); +// +// Возвращаемое значение: +// Строка: текст SOAP-конверта-ответа; +// +Функция ОтправитьЗапросSOAP(ТекстКонверта, ОписаниеСервисаПроверкиЛегальности) + + ПараметрыКонструктора = Новый Массив; + ПараметрыКонструктора.Добавить(ОписаниеСервисаПроверкиЛегальности.ПутьПорта); + HTTPЗапрос = Новый(Тип("HTTPЗапрос"), ПараметрыКонструктора); + HTTPЗапрос.Заголовки["Content-Type"] = "text/xml;charset=UTF-8"; + HTTPЗапрос.УстановитьТелоИзСтроки(ТекстКонверта); + + Попытка + HTTPОтвет = ОписаниеСервисаПроверкиЛегальности.СоединениеПорта.ОтправитьДляОбработки(HTTPЗапрос); + Исключение + ТекстИсключения = НСтр("ru = 'Ошибка сетевого соединения при отправке SOAP-запроса.'") + + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение ТекстИсключения; + КонецПопытки; + + ТелоОтвета = HTTPОтвет.ПолучитьТелоКакСтроку(); + + Возврат ТелоОтвета; + +КонецФункции + +// Выполняет чтение объекта или значения в ответном SOAP-конверте в +// соответствии с фабрикой типов XDTO веб-сервиса. +// +// Параметры: +// ТелоОтвета (Строка) - тело в SOAP-конверта-ответа; +// ОписаниеСервисаПроверкиЛегальности (Структура) - описание веб-сервиса проверки легальности, +// см. ОписаниеСервисаПроверкиЛегальности(); +// ТипЗначения (ТипЗначенияXDTO, ТипОбъектаXDTO) - тип читаемого значения; +// +Функция ПрочитатьОтветВКонвертеSOAP(ТелоОтвета, ОписаниеСервисаПроверкиЛегальности, ТипЗначения) + + ЧтениеОтвета = Новый ЧтениеXML; + ЧтениеОтвета.УстановитьСтроку(ТелоОтвета); + + Попытка + + // Переход к телу ответа + Пока ЧтениеОтвета.Имя <> "soap:Body" Цикл + ЧтениеОтвета.Прочитать(); + КонецЦикла; + + // Переход к описанию объекта ответа + ЧтениеОтвета.Прочитать(); + + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка чтения ответа SOAP: + |%1 + |Тело ответа: + |%2'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ТелоОтвета); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + Если ЧтениеОтвета.ТипУзла = ТипУзлаXML.НачалоЭлемента + И ВРег(ЧтениеОтвета.Имя) = "SOAP:FAULT" Тогда + // Это исключение веб-сервиса + Попытка + ДеталиИсключения = ПрочитатьОписаниеИсключенияСервиса(ЧтениеОтвета); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка чтения ответа SOAP: + |%1 + |Тело ответа: + |%2'"), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ТелоОтвета); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка SOAP-Сервера при обработке запроса: %1'"), ОписаниеИсключенияSOAPВСтроку(ДеталиИсключения)); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + Попытка + Значение = ОписаниеСервисаПроверкиЛегальности.ФабрикаXDTO.ПрочитатьXML(ЧтениеОтвета, ТипЗначения); + Исключение + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Ошибка чтения объекта (%1) в конверте SOAP: + |%2 + |Тело ответа: + |%3'"), Строка(ТипЗначения), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()), ТелоОтвета); + ВызватьИсключение ТекстИсключения; + + КонецПопытки; + + Возврат Значение; + +КонецФункции + +// Если в ответном SOAP-конверте содержится описание ошибки, +// то выполняется чтение описания ошибки. +// +// Параметры: +// ЧтениеОтвета (ЧтениеXML) - объект, используемый для чтения +// ответного SOAP-конверта. На момент вызова спозиционирован на описании +// исключения SOAP; +// +// Возвращаемое значение: +// Структура со свойствами: +// FaultCode (Строка), FaultString (Строка), FaultActor (Строка); +// +Функция ПрочитатьОписаниеИсключенияСервиса(ЧтениеОтвета) + + ОписаниеИсключения = Новый Структура("FaultCode, FaultString, FaultActor", "", "", ""); + + Пока НЕ (ВРег(ЧтениеОтвета.Имя) = "SOAP:BODY" И ЧтениеОтвета.ТипУзла = ТипУзлаXML.КонецЭлемента) Цикл + + Если ЧтениеОтвета.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + ИмяУзлаВРег = ВРег(ЧтениеОтвета.Имя); + + Если ИмяУзлаВРег = "FAULTCODE" + ИЛИ ИмяУзлаВРег = "FAULTSTRING" + ИЛИ ИмяУзлаВРег = "FAULTACTOR" Тогда + + ЧтениеОтвета.Прочитать(); // Прочитать текст узла + + Если ЧтениеОтвета.ТипУзла = ТипУзлаXML.Текст Тогда + ОписаниеИсключения[ИмяУзлаВРег] = ЧтениеОтвета.Значение; + КонецЕсли; + + ЧтениеОтвета.Прочитать(); // Прочитать конец элемента + + КонецЕсли; + + КонецЕсли; + + Если НЕ ЧтениеОтвета.Прочитать() Тогда + Прервать; + КонецЕсли; + + КонецЦикла; + + Возврат ОписаниеИсключения; + +КонецФункции + +// Выполняет преобразование структуры-описателя исключения SOAP +// в строку для пользовательского представления; +// +// Параметры: +// ИсключениеSOAP (Структура) - см. ПрочитатьОписаниеИсключенияСервиса(); +// +// Возвращаемое значение: +// Строка: пользовательское представление исключения SOAP; +// +Функция ОписаниеИсключенияSOAPВСтроку(ИсключениеSOAP) + + Результат = ""; + Если НЕ ПустаяСтрока(ИсключениеSOAP.FaultCode) Тогда + Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Код ошибки: %1'"), ИсключениеSOAP.FaultCode); + КонецЕсли; + + Если НЕ ПустаяСтрока(ИсключениеSOAP.FaultString) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Строка ошибки: %1'"), ИсключениеSOAP.FaultString); + Результат = Результат + Символы.ПС + ТекстОшибки; + КонецЕсли; + + Если НЕ ПустаяСтрока(ИсключениеSOAP.FaultActor) Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Источник ошибки: %1'"), ИсключениеSOAP.FaultActor); + Результат = Результат + Символы.ПС + ТекстОшибки; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl index ece8b4c4f..f5c02b422 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентПереопределяемый/Module.bsl @@ -81,3 +81,29 @@ Возврат ""; КонецФункции + +// Признак необходимости проверки обновления для следующей редакции платформы. +// Рекомендуется устанавливать значение Истина, только при следующих условиях: +// - Для конфигурации используется обновление с сайта поддержки пользователей системы 1С:Предприятие +// - Вышла новая редакция платформы +// - Конфигурация поддерживает прямое обновление на новую версию, использующую новую редакцию платформы. +// +// Если функция возвращает значение Истина, то при проверке обновления на сайте поддержки пользователей +// в случае если не найдено обновлений для текущей редакции платформы программа автоматически проверит +// обновления для следующей редакции платформы. +// +Функция ПроверятьОбновлениеДляСледующейРедакцииПлатформы() Экспорт + + Возврат Ложь; + +КонецФункции + +// Признак необходимости использования проверки легальности скачивания обновления +// Рекомендуется устанавливать значение Истина, если конфигурация поддерживает обновление +// с сайта поддержки пользователей. +// +Функция ИспользоватьПроверкуЛегальностиСкачиванияОбновления() Экспорт + + Возврат Истина; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl index 3d15b940b..e0159ab70 100644 --- a/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбновлениеКонфигурацииКлиентСервер/Module.bsl @@ -38,7 +38,6 @@ Функция НовыеНастройкиОбновленияКонфигурации() Экспорт Результат = Новый Структура; - Результат.Вставить("ПропускатьПриветствие", Ложь); Результат.Вставить("КодПользователяСервераОбновлений", ""); Результат.Вставить("ПарольСервераОбновлений", ""); Результат.Вставить("ЗапомнитьПарольСервераОбновлений", Истина); @@ -60,9 +59,10 @@ Результат.Вставить("НуженФайлОбновления", 1); Результат.Вставить("СоздаватьРезервнуюКопию", 1); Результат.Вставить("ИмяКаталогаРезервнойКопииИБ", ""); - Результат.Вставить("ВосстанавливатьИнформационнуюБазу", Ложь); + Результат.Вставить("ВосстанавливатьИнформационнуюБазу", Истина); Результат.Вставить("АдресСервераДляПроверкиНаличияОбновления", ""); Результат.Вставить("КаталогОбновлений", ""); + Результат.Вставить("АдресСервисаПроверкиЛегальности", ""); Результат.Вставить("КороткоеИмяКонфигурации", ""); Результат.Вставить("АдресРесурсаДляПроверкиНаличияОбновления", ""); Результат.Вставить("ДискИТС", ""); diff --git a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl index e3ead84e2..98b569b06 100644 --- a/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначения/Module.bsl @@ -47,26 +47,21 @@ // Структура - содержит имена (ключи) и значения затребованных реквизитов. // Если строка затребованных реквизитов пуста, то возвращается пустая структура // -Функция ЗначенияРеквизитовОбъекта(Ссылка, Реквизиты) Экспорт +Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда Если ПустаяСтрока(Реквизиты) Тогда Возврат Новый Структура; КонецЕсли; - - СтруктураРеквизитов = Новый Структура(Реквизиты); - - ИначеЕсли ТипЗнч(Реквизиты) = Тип("Структура") - ИЛИ ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда - + Реквизиты = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Реквизиты, ",", Истина); + КонецЕсли; + + СтруктураРеквизитов = Новый Структура; + Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда СтруктураРеквизитов = Реквизиты; - - ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") - ИЛИ ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда - - СтруктураРеквизитов = Новый Структура; - Для каждого Реквизит Из Реквизиты Цикл - СтруктураРеквизитов.Вставить(Реквизит); + ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда + Для Каждого Реквизит Из Реквизиты Цикл + СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); КонецЦикла; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -76,7 +71,6 @@ ТекстПолей = ""; Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл - ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ)); @@ -85,7 +79,6 @@ ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " | " + ИмяПоля + " КАК " + Псевдоним; - КонецЦикла; Запрос = Новый Запрос; @@ -127,7 +120,7 @@ Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); - Возврат Результат[ИмяРеквизита]; + Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; КонецФункции @@ -214,7 +207,7 @@ // Возвращаемое значение: // Массив - непроведенные документы из массива Документы // -Функция ПроверитьПроведенностьДокументов(знач Документы) Экспорт +Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт Результат = Новый Массив; @@ -289,6 +282,9 @@ ВыполненоУспешно = Истина; Исключение ПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Проведение документов при печати'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Информация, ДокументОбъект.Метаданные(), ДокументСсылка, + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Иначе ПредставлениеОшибки = НСтр("ru = 'Поля документа не заполнены.'"); @@ -379,6 +375,333 @@ КонецФункции +// Производит замену ссылок по всей конфигурации. После замены неиспользуемые ссылки опционально удаляются. +// +// Параметры: +// +// ПарыЗамен - Соответствие - Ключ - искомая ссылка, Значение - ссылка для замены. Ссылки сами на себя и пустые +// ссылки для поиска будут проигнорированы. +// +// Параметры - Структура - Параметры замены. Может включать поля: +// +// СпособУдаления - Строка, маркер способа удаления. Может принимать значения: +// "Непосредственно" - Если после замены ссылка нигде не используется, +// то она будет удалена непосредственно +// "Пометка" - Если после замены ссылка не используется, то +// она будет помечена на удаление +// Любые другие значения отменяют необходимость удаления. +// Значение по умолчанию - пустая строка. +// +// ВключатьБизнесЛогику - Булево, флаг необходимость включения бизнес логики при записи объектов +// Значение по умолчанию - Истина +// +// ЗаменаПарыВТранзакции - Булево - при значении Истина транзакция охватывает все производимые замены для одной пары ссылок. +// Ложь - каждая замена ссылки в одном объекте выполняется в отдельной транзакции. +// Значение по умолчанию - Истина +// +// ПривилегированнаяЗапись - Булево - При значении Истина запись происходит в привилегированном режиме, иначе - с текущими правами +// Значение по умолчанию - Ложь +// +// АдресРезультата - Строка - Необязательный адрес во временном хранилище, куда будет помещен копия результата замены +// +// Возвращаемое значение - ТаблицаЗначений - описание неуспешных замен (ошибок) с колонками: +// +// Ссылка - ЛюбаяСсылка - Ссылка, которую заменяли +// +// ОбъектОшибки - Произвольный - Объект - причина ошибки +// +// ПредставлениеОбъектаОшибки - Строка - Строковое представление объекта ошибки +// +// ТипОшибки - Строка - Маркер типа ошибки. Возможны варианты: +// "ОшибкаБлокировки" - при обработке ссылки некоторые объекты были заблокированы +// "ДанныеИзменены" - в процессе обработки данные были изменены другим пользователем +// "ОшибкаЗаписи" - не смогли записать объект +// "НеизвестныеДанные" - при обработке были найдены данные, которые +// не планировались к анализу, замена не реализована +// +// ТекстОшибки - Строка - Подробное описание ошибки +// +// Замена ссылок происходит с транзакциями по изменяемому объекту и его связям, не по анализируемой ссылке +// +Функция ЗаменитьСсылки(Знач ПарыЗамен, Знач Параметры = Неопределено, Знач АдресРезультата = "") Экспорт + + // Умолчания + ПараметрыЗамены = Новый Структура; + ПараметрыЗамены.Вставить("УдалятьНепосредственно", Ложь); + ПараметрыЗамены.Вставить("ПомечатьНаУдаление", Ложь); + ПараметрыЗамены.Вставить("КонтрольПриЗаписи", Истина); + ПараметрыЗамены.Вставить("ПривилегированнаяЗапись", Ложь); + + ДлиннаяТранзакция = Истина; + + Если Параметры <> Неопределено Тогда + ЗначениеПараметра = Неопределено; + + Если Параметры.Свойство("СпособУдаления", ЗначениеПараметра) Тогда + Если ЗначениеПараметра = "Непосредственно" Тогда + ПараметрыЗамены.УдалятьНепосредственно = Истина; + ПараметрыЗамены.ПомечатьНаУдаление = Ложь; + ИначеЕсли ЗначениеПараметра = "Пометка" Тогда + ПараметрыЗамены.УдалятьНепосредственно = Ложь; + ПараметрыЗамены.ПомечатьНаУдаление = Истина; + КонецЕсли; + КонецЕсли; + + Если Параметры.Свойство("ВключатьБизнесЛогику", ЗначениеПараметра) Тогда + Если ЗначениеПараметра = Истина Тогда + ПараметрыЗамены.КонтрольПриЗаписи = Истина; + ИначеЕсли ЗначениеПараметра = Ложь Тогда + ПараметрыЗамены.КонтрольПриЗаписи = Ложь; + КонецЕсли; + КонецЕсли; + + Если Параметры.Свойство("ЗаменаПарыВТранзакции", ЗначениеПараметра) Тогда + Если ЗначениеПараметра = Истина Тогда + ДлиннаяТранзакция = Истина; + ИначеЕсли ЗначениеПараметра = Ложь Тогда + ДлиннаяТранзакция = Ложь; + КонецЕсли; + КонецЕсли; + + // правильно ПривилегированнаяЗапись + Если Параметры.Свойство("ПривилегированнаяЗапись", ЗначениеПараметра) Тогда + Если ЗначениеПараметра = Истина Тогда + ПараметрыЗамены.ПривилегированнаяЗапись = Истина; + ИначеЕсли ЗначениеПараметра = Ложь Тогда + ПараметрыЗамены.ПривилегированнаяЗапись = Ложь; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + ТипСтрока = Новый ОписаниеТипов("Строка"); + + РезультатЗамены = Новый ТаблицаЗначений; + РезультатЗамены.Колонки.Добавить("Ссылка"); + РезультатЗамены.Колонки.Добавить("ОбъектОшибки"); + РезультатЗамены.Колонки.Добавить("ПредставлениеОбъектаОшибки", ТипСтрока); + РезультатЗамены.Колонки.Добавить("ТипОшибки", ТипСтрока); + РезультатЗамены.Колонки.Добавить("ТекстОшибки", ТипСтрока); + РезультатЗамены.Индексы.Добавить("Ссылка"); + РезультатЗамены.Индексы.Добавить("Ссылка, ОбъектОшибки, ТипОшибки"); + + КэшМетаданных = Новый Соответствие; + + СписокСсылок = Новый Массив; + Для Каждого КлючЗначение Из ПарыЗамен Цикл + ТекущаяСсылка = КлючЗначение.Ключ; + ЦелеваяСсылка = КлючЗначение.Значение; + + Если ТекущаяСсылка = ЦелеваяСсылка Или ТекущаяСсылка.Пустая() Тогда + // Самого на себя и пустые ссылки не заменяем + Продолжить; + КонецЕсли; + + СписокСсылок.Добавить(ТекущаяСсылка); + КонецЦикла; + + ТаблицаПоиска = МестаИспользования(СписокСсылок); + + // Для каждой ссылки объекта будем производить замены в порядке "Константа", "Объект", "Набор". + // Одновременно пустая строка в этой колонке - флаг того, что эта замена не нужна или уже была произведена + ТаблицаПоиска.Колонки.Добавить("КлючЗамены", ТипСтрока); + ТаблицаПоиска.Индексы.Добавить("Ссылка, КлючЗамены"); + ТаблицаПоиска.Индексы.Добавить("Данные, КлючЗамены"); + + // Вспомогательные данные + ТаблицаПоиска.Колонки.Добавить("ВерсияДанных", ТипСтрока); + ТаблицаПоиска.Колонки.Добавить("ЦелеваяСсылка"); + + Конфигурация = Новый Структура; + Конфигурация.Вставить("ТипВсеСсылки", ОписаниеТипаВсеСсылки() ); + Конфигурация.Вставить("МетаКонстанты", Метаданные.Константы); + Конфигурация.Вставить("ТипКлючЗаписи", ОписаниеТипаКлючиЗаписей() ); + + // Определяем порядок обработки и проверяем то, что мы можем обработать + ПроизводимыеЗамены = Новый Массив; + Для Каждого ТекущаяСсылка Из СписокСсылок Цикл + ЦелеваяСсылка = ПарыЗамен[ТекущаяСсылка]; + + РезультатРазметки = Неопределено; + РазметитьМестаИспользования(Конфигурация, ТекущаяСсылка, ЦелеваяСсылка, ТаблицаПоиска, РезультатРазметки); + + Если РезультатРазметки.ОшибкиРазметки.Количество() = 0 Тогда + ПроизводимыеЗамены.Добавить(ТекущаяСсылка); + + Иначе + // Найдены неизвестные типы замены, не будем работать с этой ссылкой, возможно нарушение связности + Для Каждого Ошибка Из РезультатРазметки.ОшибкиРазметки Цикл + ДобавитьРезультатЗамены(РезультатЗамены, ТекущаяСсылка, "НеизвестныеДанные", Ошибка.Объект, Ошибка.Текст); + КонецЦикла; + + КонецЕсли; + + КонецЦикла; + + Если ДлиннаяТранзакция Тогда + Для Каждого Ссылка Из ПроизводимыеЗамены Цикл + ЗаменитьСсылкуДлиннойТранзакцией(РезультатЗамены, Ссылка, ПараметрыЗамены, ТаблицаПоиска); + КонецЦикла; + Иначе + ЗаменитьСсылкиКороткимиТранзакциями(РезультатЗамены, ПараметрыЗамены, ПроизводимыеЗамены, ТаблицаПоиска); + КонецЕсли; + + Если Не ПустаяСтрока(АдресРезультата) Тогда + ПоместитьВоВременноеХранилище(РезультатЗамены, АдресРезультата); + КонецЕсли; + + Возврат РезультатЗамены; +КонецФункции + +// Получает все места использования ссылок +// +// Параметры: +// НаборСсылок - Массив - Ссылки, для которых ищем места использования +// АдресРезультата - Строка - Необязательный адрес во временном хранилище, куда будет помещен копия результата замены +// +// Возвращаемое значение: +// ТаблицаЗначений - Состоит из колонок: +// Ссылка - ЛюбаяСсылка - Ссылка, которая анализируется +// Данные - Произвольный - Данные, содержащие анализируемую ссылку +// Метаданные - ОбъектМетаданных - Метаданные найденных данных +// ПредставлениеДанных - Строка - Представление данных, содержащих анализируемую ссылку +// ТипСсылки - Тип - Тип анализируемой ссылки +// ВспомогательныеДанные - Булево - Истина, если данные используются анализируемой ссылкой как вспомогательными +// данными (ведущее измерение и т.п.) +// +// Если какая-либо ссылка нигде не используется, то строк для нее в результирующей таблице не будет. +// +Функция МестаИспользования(Знач НаборСсылок, Знач АдресРезультата = "") Экспорт + + МестаИспользования = Новый ТаблицаЗначений; + + УстановитьПривилегированныйРежим(Истина); + МестаИспользования = НайтиПоСсылкам(НаборСсылок); + + МестаИспользования.Колонки.Добавить("ПредставлениеДанных", Новый ОписаниеТипов("Строка")); + МестаИспользования.Колонки.Добавить("ТипСсылки"); + МестаИспользования.Колонки.Добавить("ВспомогательныеДанные", Новый ОписаниеТипов("Булево")); + + МестаИспользования.Индексы.Добавить("Ссылка"); + МестаИспользования.Индексы.Добавить("Данные"); + МестаИспользования.Индексы.Добавить("ВспомогательныеДанные"); + МестаИспользования.Индексы.Добавить("Ссылка, ВспомогательныеДанные"); + + ТипКлючиЗаписей = ОписаниеТипаКлючиЗаписей(); + ТипВсеСсылки = ОписаниеТипаВсеСсылки(); + МетаКонстанты = Метаданные.Константы; + МетаДокументы = Метаданные.Документы; + + ВспомогательныеМетаданные = ПолучитьОбщийСписокИсключенийПоискаСсылок(); + + КэшИзмерений = Новый Соответствие; + + Для Каждого Строка Из МестаИспользования Цикл + Ссылка = Строка.Ссылка; + Данные = Строка.Данные; + Мета = Строка.Метаданные; + ТипДанных = ТипЗнч(Данные); + + ПутьВспомогательныхДанных = ВспомогательныеМетаданные[Мета]; + + Если ПутьВспомогательныхДанных = Неопределено Тогда + ЭтоВспомогательныеДанные = Ложь; + + ИначеЕсли ПутьВспомогательныхДанных = "*" Тогда + ЭтоВспомогательныеДанные = Истина; + + ИначеЕсли ТипКлючиЗаписей.СодержитТип(ТипДанных) Тогда + ЭтоВспомогательныеДанные = Ложь; + Для Каждого СтрокаДанные Из Данные Цикл + Если Ссылка = ВычислитьЗначениеДанныхПоПути(СтрокаДанные, ПутьВспомогательныхДанных) Тогда + ЭтоВспомогательныеДанные = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Иначе + ЭтоВспомогательныеДанные = (Ссылка = ВычислитьЗначениеДанныхПоПути(Данные, ПутьВспомогательныхДанных) ); + + КонецЕсли; + + Если МетаДокументы.Содержит(Мета) Тогда + Представление = Строка(Данные); + + ИначеЕсли МетаКонстанты.Содержит(Мета) Тогда + Представление = Мета.Представление() + " (" + НСтр("ru = 'константа'") + ")"; + + ИначеЕсли ТипВсеСсылки.СодержитТип(ТипДанных) Тогда + МетаПредставление = Мета.ПредставлениеОбъекта; + Если ПустаяСтрока(МетаПредставление) Тогда + МетаПредставление = Мета.Представление(); + КонецЕсли; + Представление = Строка(Данные); + Если Не ПустаяСтрока(МетаПредставление) Тогда + Представление = Представление + " (" + МетаПредставление + ")"; + КонецЕсли; + + ИначеЕсли ТипКлючиЗаписей.СодержитТип(ТипДанных) Тогда + Представление = Мета.ПредставлениеЗаписи; + Если ПустаяСтрока(Представление) Тогда + Представление = Мета.Представление(); + КонецЕсли; + + ОписаниеИзмерений = ""; + Для Каждого КлючЗначение Из ОписаниеИзмеренийНабора(Мета, КэшИзмерений) Цикл + Значение = Данные[КлючЗначение.Ключ]; + Описание = КлючЗначение.Значение; + Если Значение = Ссылка Тогда + Если Описание.Ведущее Тогда + ЭтоВспомогательныеДанные = Истина; + КонецЕсли; + КонецЕсли; + Формат = Описание.Формат; + ОписаниеИзмерений = ОписаниеИзмерений + ", " + + Описание.Представление + " """ + ?(Формат = Неопределено, Строка(Значение), Формат(Значение, Формат)) + """"; + КонецЦикла; + ОписаниеИзмерений = Сред(ОписаниеИзмерений, 3); + + Если Не ПустаяСтрока(ОписаниеИзмерений) Тогда + Представление = Представление + " (" + ОписаниеИзмерений + ")"; + КонецЕсли; + + Иначе + Представление = Строка(Данные); + + КонецЕсли; + + Строка.ПредставлениеДанных = Представление; + Строка.ВспомогательныеДанные = ЭтоВспомогательныеДанные; + Строка.ТипСсылки = ТипЗнч(Строка.Ссылка); + КонецЦикла; + + Если Не ПустаяСтрока(АдресРезультата) Тогда + ПоместитьВоВременноеХранилище(МестаИспользования, АдресРезультата); + КонецЕсли; + + Возврат МестаИспользования; +КонецФункции + +// Возвращает описание типа, включающего в себя все возможные ссылочные типы конфигурации +// +Функция ОписаниеТипаВсеСсылки() Экспорт + + Возврат Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов( + Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов(Новый ОписаниеТипов( + Справочники.ТипВсеСсылки(), + Документы.ТипВсеСсылки().Типы() + ), ПланыОбмена.ТипВсеСсылки().Типы() + ), Перечисления.ТипВсеСсылки().Типы() + ), ПланыВидовХарактеристик.ТипВсеСсылки().Типы() + ), ПланыСчетов.ТипВсеСсылки().Типы() + ), ПланыВидовРасчета.ТипВсеСсылки().Типы() + ), БизнесПроцессы.ТипВсеСсылки().Типы() + ), БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().Типы() + ), Задачи.ТипВсеСсылки().Типы() + ); + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции для работы с прикладными типами и коллекциями значений @@ -1116,45 +1439,7 @@ // Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач ИсхСумма, МассивКоэф, Знач Точность = 2) Экспорт - Если МассивКоэф.Количество() = 0 Или НЕ ЗначениеЗаполнено(ИсхСумма) Тогда - Возврат Неопределено; - КонецЕсли; - - ИндексМакс = 0; - МаксЗнач = 0; - РаспрСумма = 0; - СуммаКоэф = 0; - - Для К = 0 По МассивКоэф.Количество() - 1 Цикл - - МодульЧисла = ?(МассивКоэф[К] > 0, МассивКоэф[К], - МассивКоэф[К]); - - Если МаксЗнач < МодульЧисла Тогда - МаксЗнач = МодульЧисла; - ИндексМакс = К; - КонецЕсли; - - СуммаКоэф = СуммаКоэф + МассивКоэф[К]; - - КонецЦикла; - - Если СуммаКоэф = 0 Тогда - Возврат Неопределено; - КонецЕсли; - - МассивСумм = Новый Массив(МассивКоэф.Количество()); - - Для К = 0 По МассивКоэф.Количество() - 1 Цикл - МассивСумм[К] = Окр(ИсхСумма * МассивКоэф[К] / СуммаКоэф, Точность, 1); - РаспрСумма = РаспрСумма + МассивСумм[К]; - КонецЦикла; - - // Погрешности округления отнесем на коэффициент с максимальным весом - Если Не РаспрСумма = ИсхСумма Тогда - МассивСумм[ИндексМакс] = МассивСумм[ИндексМакс] + ИсхСумма - РаспрСумма; - КонецЕсли; - - Возврат МассивСумм; + Возврат ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам(ИсхСумма, МассивКоэф, Точность); КонецФункции @@ -1237,7 +1522,7 @@ КонецЕсли; Попытка - COMConnector = Новый COMObject(ИмяCOMСоединителя()); // "V82.COMConnector" + COMConnector = Новый COMObject(ИмяCOMСоединителя()); // "V83.COMConnector" Исключение Информация = ИнформацияОбОшибке(); СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключится к другой программе: %1'"); @@ -1285,13 +1570,13 @@ КонецЕсли; Если Параметры.АутентификацияОперационнойСистемы Тогда - СтрокаСоединения = "Srvr = &ИмяСервера1СПредприятия; Ref = &ИмяИнформационнойБазыНаСервере1СПредприятия"; + СтрокаСоединения = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия"";"; СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяСервера1СПредприятия", Параметры.ИмяСервера1СПредприятия); СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяИнформационнойБазыНаСервере1СПредприятия", Параметры.ИмяИнформационнойБазыНаСервере1СПредприятия); Иначе - СтрокаСоединения = "Srvr = &ИмяСервера1СПредприятия; Ref = &ИмяИнформационнойБазыНаСервере1СПредприятия; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя"""; + СтрокаСоединения = "Srvr = ""&ИмяСервера1СПредприятия""; Ref = ""&ИмяИнформационнойБазыНаСервере1СПредприятия""; Usr = ""&ИмяПользователя""; Pwd = ""&ПарольПользователя"""; СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяСервера1СПредприятия", Параметры.ИмяСервера1СПредприятия); СтрокаСоединения = СтрЗаменить(СтрокаСоединения, "&ИмяИнформационнойБазыНаСервере1СПредприятия", Параметры.ИмяИнформационнойБазыНаСервере1СПредприятия); @@ -1306,7 +1591,7 @@ Результат.Соединение = COMConnector.Connect(СтрокаСоединения); Исключение Информация = ИнформацияОбОшибке(); - СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключится к другой программе: %1'"); + СтрокаСообщенияОбОшибке = НСтр("ru = 'Не удалось подключиться к другой программе: %1'"); Результат.ОшибкаПодключенияКомпоненты = Истина; Результат.ПодробноеОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаСообщенияОбОшибке, ПодробноеПредставлениеОшибки(Информация)); @@ -1335,7 +1620,7 @@ // Процедура ВыполнитьБезопасно(ИмяЭкспортнойПроцедуры, Параметры = Неопределено, ОбластьДанных = Неопределено) Экспорт - // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. + // Проверка предусловий на формат ИмяЭкспортнойПроцедуры. ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяЭкспортнойПроцедуры, "."); Если ЧастиИмени.Количество() <> 2 И ЧастиИмени.Количество() <> 3 Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( @@ -1346,10 +1631,12 @@ ИмяОбъекта = ЧастиИмени[0]; Если ЧастиИмени.Количество() = 2 И Метаданные.ОбщиеМодули.Найти(ИмяОбъекта) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"), - ИмяЭкспортнойПроцедуры); + НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1): + |Не найден общий модуль ""%2"".'"), + ИмяЭкспортнойПроцедуры, + ИмяОбъекта); КонецЕсли; - + Если ЧастиИмени.Количество() = 3 Тогда ДопустимыеИменаТипов = Новый Массив; ДопустимыеИменаТипов.Добавить(ВРег(ИмяТипаКонстанты())); @@ -1371,8 +1658,11 @@ ИмяТипа = ВРег(ЧастиИмени[0]); Если ДопустимыеИменаТипов.Найти(ИмяТипа) = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"), - ИмяЭкспортнойПроцедуры); + НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1): + |Не найдена коллекция объектов метаданных ""%2"", + |или для этой коллекции не поддерживается безопасное выполнение.'"), + ИмяЭкспортнойПроцедуры, + ИмяОбъекта); КонецЕсли; КонецЕсли; @@ -1386,8 +1676,10 @@ ЗаписьЖурналаРегистрации(НСтр("ru = 'Безопасное выполнение метода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1)'"), - ИмяЭкспортнойПроцедуры); + НСтр("ru='Неправильный формат параметра ИмяЭкспортнойПроцедуры (%1): + |Имя метода ""%2"" не соответствует требованиям образования имен переменных.'"), + ИмяЭкспортнойПроцедуры, + ИмяМетода); КонецПопытки; ПараметрыСтрока = ""; @@ -1808,15 +2100,14 @@ ОбщиеПараметры = Новый Структура; ОбщиеПараметры.Вставить("ИмяФормыПерсональныхНастроек", ""); - ОбщиеПараметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", "8.2.17.153"); - ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Ложь); + ОбщиеПараметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", "8.3.3.715"); + ОбщиеПараметры.Вставить("РаботаВПрограммеЗапрещена", Истина); // Блокировать запуск, если версия ниже минимальной. ОбщиеПараметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", Истина); ОбщиеПараметры.Вставить("ОтключитьСправочникИдентификаторыОбъектовМетаданных", Ложь); ОбщегоНазначенияПереопределяемый.ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры); ОбщегоНазначенияПереопределяемый.ИмяФормыПерсональныхНастроек(ОбщиеПараметры.ИмяФормыПерсональныхНастроек); - ОбщегоНазначенияВызовСервераПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы(ОбщиеПараметры); ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы(ОбщиеПараметры); Возврат ОбщиеПараметры; @@ -1858,7 +2149,8 @@ Функция ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Отказ = Истина; Возврат Ложь; КонецЕсли; @@ -1868,20 +2160,48 @@ Возврат Ложь; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеВерсииИБ") Тогда - - МодульОбновлениеИнформационнойБазы = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазы"); - Если МодульОбновлениеИнформационнойБазы.ВыполняетсяОбновлениеИнформационнойБазы() Тогда - Отказ = Истина; - Возврат Ложь; - КонецЕсли; - + УстановитьПривилегированныйРежим(Истина); + Если ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("СкрытьРабочийСтолПриНачалеРаботыСистемы") <> Неопределено Тогда + Отказ = Истина; + Возврат Ложь; КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); Возврат Истина; КонецФункции +// Возвращает редакцию конфигурации. +// Редакцией принято называть две первые группы цифр полной версии конфигурации. +// Например, у версии "1.2.3.4" редакция "1.2". +// +// Возвращаемое значение: +// Строка - номер редакции конфигурации. +Функция РедакцияКонфигурации() Экспорт + + Результат = ""; + ВерсияКонфигурации = Метаданные.Версия; + + Позиция = Найти(ВерсияКонфигурации, "."); + Если Позиция > 0 Тогда + Результат = Лев(ВерсияКонфигурации, Позиция); + ВерсияКонфигурации = Сред(ВерсияКонфигурации, Позиция + 1); + Позиция = Найти(ВерсияКонфигурации, "."); + Если Позиция > 0 Тогда + Результат = Результат + Лев(ВерсияКонфигурации, Позиция - 1); + Иначе + Результат = ""; + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(Результат) Тогда + Результат = Метаданные.Версия; + КонецЕсли; + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с формами @@ -2196,7 +2516,7 @@ ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеИмя, "."); - Если ЧастиИмени.Количество() = 2 Тогда + Если ЧастиИмени.Количество() >= 2 Тогда КлассОМ = ЧастиИмени[0]; ИмяОМ = ЧастиИмени[1]; КонецЕсли; @@ -2249,10 +2569,12 @@ ИмяПодчиненногоОМ = ЧастиИмени[3]; Если ВРег(КлассПодчиненногоОМ) = "ПЕРЕРАСЧЕТ" Тогда // Перерасчет - Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ПолноеИмя); + Попытка + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + ИмяОм = ИмяПодчиненногоОМ; + Исключение + Менеджер = Неопределено; + КонецПопытки; КонецЕсли; КонецЕсли; @@ -2849,7 +3171,7 @@ НовоеИмяКоллекции = ВРег(ИмяКоллекции(НовоеПолноеИмя)); ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ЗаполнитьТаблицуПереименованияОбъектовМетаданных + НСтр("ru = 'Ошибка в процедуре ПриДобавленииПереименованийОбъектовМетаданных |общего модуля ОбщегоНазначенияПереопределяемый.'"); Если СтароеИмяКоллекции <> НовоеИмяКоллекции Тогда @@ -3212,8 +3534,8 @@ КонецФункции // Возвращает имя предопределенного элемента по указанной ссылке. -// Рекомендуется использовать вместо метода ПолучитьИмяПредопределенного для -// конфигураций рассчитанных для платформ версий 8.2 и 8.3 одновременно. +// Для использования вместо устаревшего метода ПолучитьИмяПредопределенного в +// конфигурациях, рассчитанных на платформу версии 8.2. // // Параметры: // Ссылка - ссылка на предопределенный элемент. @@ -3223,11 +3545,7 @@ // Функция ИмяПредопределенного(Знач Ссылка) Экспорт - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ИмяПредопределенныхДанных"); - Иначе - Возврат МенеджерОбъектаПоСсылке(Ссылка).ПолучитьИмяПредопределенного(Ссылка); - КонецЕсли; + Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ИмяПредопределенныхДанных"); КонецФункции @@ -3246,7 +3564,7 @@ // Функция ЭтоДокумент(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаДокументы(); + Возврат Метаданные.Документы.Содержит(ОбъектМетаданных); КонецФункции @@ -3260,7 +3578,7 @@ // Функция ЭтоСправочник(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаСправочники(); + Возврат Метаданные.Справочники.Содержит(ОбъектМетаданных); КонецФункции @@ -3274,7 +3592,7 @@ // Функция ЭтоПеречисление(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПеречисления(); + Возврат Метаданные.Перечисления.Содержит(ОбъектМетаданных); КонецФункции @@ -3288,7 +3606,7 @@ // Функция ЭтоПланОбмена(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПланыОбмена(); + Возврат Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных); КонецФункции @@ -3302,7 +3620,7 @@ // Функция ЭтоПланВидовХарактеристик(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПланыВидовХарактеристик(); + Возврат Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных); КонецФункции @@ -3316,7 +3634,7 @@ // Функция ЭтоБизнесПроцесс(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаБизнесПроцессы(); + Возврат Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных); КонецФункции @@ -3330,7 +3648,7 @@ // Функция ЭтоЗадача(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаЗадачи(); + Возврат Метаданные.Задачи.Содержит(ОбъектМетаданных); КонецФункции @@ -3344,7 +3662,7 @@ // Функция ЭтоПланСчетов(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПланыСчетов(); + Возврат Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных); КонецФункции @@ -3358,7 +3676,7 @@ // Функция ЭтоПланВидовРасчета(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПланыВидовРасчета(); + Возврат Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных); КонецФункции @@ -3374,7 +3692,7 @@ // Функция ЭтоРегистрСведений(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаРегистрыСведений(); + Возврат Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных); КонецФункции @@ -3388,7 +3706,7 @@ // Функция ЭтоРегистрНакопления(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаРегистрыНакопления(); + Возврат Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных); КонецФункции @@ -3402,7 +3720,7 @@ // Функция ЭтоРегистрБухгалтерии(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаРегистрыБухгалтерии(); + Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных); КонецФункции @@ -3416,7 +3734,7 @@ // Функция ЭтоРегистрРасчета(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаРегистрыРасчета(); + Возврат Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных); КонецФункции @@ -3432,7 +3750,7 @@ // Функция ЭтоКонстанта(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаКонстанты(); + Возврат Метаданные.Константы.Содержит(ОбъектМетаданных); КонецФункции @@ -3448,7 +3766,7 @@ // Функция ЭтоЖурналДокументов(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаЖурналыДокументов(); + Возврат Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных); КонецФункции @@ -3464,7 +3782,7 @@ // Функция ЭтоПоследовательность(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПоследовательности(); + Возврат Метаданные.Последовательности.Содержит(ОбъектМетаданных); КонецФункции @@ -3480,7 +3798,7 @@ // Функция ЭтоРегламентноеЗадание(ОбъектМетаданных) Экспорт - Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаРегламентныеЗадания(); + Возврат Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных); КонецФункции @@ -3496,13 +3814,11 @@ // Функция ЭтоРегистр(ОбъектМетаданных) Экспорт - ИмяБазовогоТипа = ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); - - Возврат ИмяБазовогоТипа = ИмяТипаРегистрыСведений() - ИЛИ ИмяБазовогоТипа = ИмяТипаРегистрыНакопления() - ИЛИ ИмяБазовогоТипа = ИмяТипаРегистрыБухгалтерии() - ИЛИ ИмяБазовогоТипа = ИмяТипаРегистрыРасчета(); - + Возврат Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) + Или Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) + Или Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) + Или Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных); + КонецФункции // Определяет принадлежность объекта метаданных к ссылочному типу @@ -3515,16 +3831,21 @@ // Функция ЭтоОбъектСсылочногоТипа(ОбъектМетаданных) Экспорт - ИмяБазовогоТипа = ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных); - - Возврат ИмяБазовогоТипа = ИмяТипаСправочники() - ИЛИ ИмяБазовогоТипа = ИмяТипаДокументы() - ИЛИ ИмяБазовогоТипа = ИмяТипаБизнесПроцессы() - ИЛИ ИмяБазовогоТипа = ИмяТипаЗадачи() - ИЛИ ИмяБазовогоТипа = ИмяТипаПланыСчетов() - ИЛИ ИмяБазовогоТипа = ИмяТипаПланыОбмена() - ИЛИ ИмяБазовогоТипа = ИмяТипаПланыВидовХарактеристик() - ИЛИ ИмяБазовогоТипа = ИмяТипаПланыВидовРасчета(); + ИмяОбъектаМетаданных = ОбъектМетаданных.ПолноеИмя(); + Позиция = Найти(ИмяОбъектаМетаданных, "."); + Если Позиция > 0 Тогда + ИмяБазовогоТипа = Лев(ИмяОбъектаМетаданных, Позиция - 1); + Возврат ИмяБазовогоТипа = "Справочник" + Или ИмяБазовогоТипа = "Документ" + Или ИмяБазовогоТипа = "БизнесПроцесс" + Или ИмяБазовогоТипа = "Задача" + Или ИмяБазовогоТипа = "ПланСчетов" + Или ИмяБазовогоТипа = "ПланОбмена" + Или ИмяБазовогоТипа = "ПланВидовХарактеристик" + Или ИмяБазовогоТипа = "ПланВидовРасчета"; + Иначе + Возврат Ложь; + КонецЕсли; КонецФункции @@ -3795,7 +4116,7 @@ КонецЕсли; Для Каждого Элемент Из МассивСтруктур Цикл - ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, Элемент.Настройка, Элемент.Значение); + ХранилищеОбщихНастроек.Сохранить(Элемент.Объект, КлючНастроек(Элемент.Настройка), Элемент.Значение); КонецЦикла; Если НужноОбновитьПовторноИспользуемыеЗначения Тогда @@ -3942,18 +4263,20 @@ КонецПроцедуры // Сохраняет настройку в хранилище настроек через его менеджер. -// +// // Параметры: -// МенеджерХранилища (СтандартноеХранилищеНастроекМенеджер) Хранилище, в котором сохраняется настройка -// КлючОбъекта (Строка) Ключ объекта настройки. -// Подробнее см. раздел справки "Настройки, автоматически сохраняемые в системном хранилище". -// КлючНастроек (Строка) Ключ сохраняемых настроек. -// Значение (*) Содержит настройки, которые нужно сохранить в хранилище. -// ОписаниеНастроек (ОписаниеНастроек) Содержит информацию об описании настройки. -// ИмяПользователя (Строка) Имя пользователя, настройки которого сохраняются. -// Если не указано, то сохраняются настройки текущего пользователя. -// НужноОбновитьПовторноИспользуемыеЗначения (Булево) -// +// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, в котором сохраняется настройка. +// КлючОбъекта - Строка - Ключ объекта настройки. +// КлючНастроек - Строка - Ключ сохраняемых настроек. +// Значение - * - Содержит настройки, которые нужно сохранить в хранилище. +// ОписаниеНастроек - ОписаниеНастроек - Содержит информацию об описании настройки. +// ИмяПользователя - Строка - Имя пользователя, настройки которого сохраняются. +// Если не указано, то сохраняются настройки текущего пользователя. +// НужноОбновитьПовторноИспользуемыеЗначения - Булево - Сбросить кэши модулей ПовтИсп. +// +// См. также: +// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. +// Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек, ИмяПользователя, НужноОбновитьПовторноИспользуемыеЗначения) @@ -3961,7 +4284,7 @@ Возврат; КонецЕсли; - МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек, Значение, ОписаниеНастроек, ИмяПользователя); + МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Значение, ОписаниеНастроек, ИмяПользователя); Если НужноОбновитьПовторноИспользуемыеЗначения Тогда ОбновитьПовторноИспользуемыеЗначения(); @@ -3972,25 +4295,28 @@ // Загружает настройку из хранилища настроек через его менеджер. // // Параметры: -// МенеджерХранилища (СтандартноеХранилищеНастроекМенеджер) Хранилище, из которого загружается настройка -// КлючОбъекта (Строка) Ключ объекта настройки. -// Подробнее см. раздел справки "Настройки, автоматически сохраняемые в системном хранилище". -// КлючНастроек (Строка) Ключ сохраняемых настроек. -// ЗначениеПоУмолчанию (*) Значение, которое необходимо подставить если настройки не были загружены. -// ОписаниеНастроек (ОписаниеНастроек) Через данный параметр при загрузке можно получить описание настроек. -// ИмяПользователя (Строка) Имя пользователя, настройки которого загружается. -// Если не указано, то загружается настройки текущего пользователя. -// +// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, из которого загружается настройка. +// КлючОбъекта - Строка - Ключ объекта настройки. +// КлючНастроек - Строка - Ключ сохраняемых настроек. +// ЗначениеПоУмолчанию - * - Значение, которое необходимо подставить если настройки не были загружены. +// ОписаниеНастроек - ОписаниеНастроек - Через данный параметр при загрузке можно получить описание настроек. +// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. +// Если не указано, то загружается настройки текущего пользователя. +// // Возвращаемое значение: -// (*) Настройки, загруженные из хранилища. Неопределено, если настройки не найдены. -// +// Произвольный - Настройки, загруженные из хранилища. +// Неопределено - Если настройки не найдены. +// +// См. также: +// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. +// Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию, ОписаниеНастроек, ИмяПользователя) Результат = Неопределено; Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек, ОписаниеНастроек, ИмяПользователя); + Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек), ОписаниеНастроек, ИмяПользователя); КонецЕсли; Если (Результат = Неопределено) И (ЗначениеПоУмолчанию <> Неопределено) Тогда @@ -4004,21 +4330,24 @@ // Удаляет настройку из хранилища настроек через его менеджер. // // Параметры: -// МенеджерХранилища (СтандартноеХранилищеНастроекМенеджер) Хранилище, из которого удаляется настройка -// КлючОбъекта (Строка) Ключ объекта настройки. -// (Неопределено) Удаляются настройки для всех объектов. -// КлючНастроек (Строка) Ключ сохраняемых настроек. -// (Неопределено) Удаляются настройки со всеми ключами. -// ИмяПользователя (Строка) Имя пользователя, настройки которого загружается. -// (Неопределено) Удаляются настройки всех пользователей. -// +// МенеджерХранилища - СтандартноеХранилищеНастроекМенеджер - Хранилище, из которого удаляется настройка. +// КлючОбъекта - Строка - Ключ объекта настройки. +// - Неопределено - Удаляются настройки для всех объектов. +// КлючНастроек - Строка - Ключ сохраняемых настроек. +// - Неопределено - Удаляются настройки со всеми ключами. +// ИмяПользователя - Строка - Имя пользователя, настройки которого загружается. +// - Неопределено - Удаляются настройки всех пользователей. +// // Возвращаемое значение: // (*) Настройки, загруженные из хранилища. Неопределено, если настройки не найдены. -// +// +// См. также: +// "Настройки, автоматически сохраняемые в системном хранилище" в синтакс-помощнике. +// Процедура ХранилищеУдалить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ИмяПользователя) Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда - МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя); + МенеджерХранилища.Удалить(КлючОбъекта, КлючНастроек(КлючНастроек), ИмяПользователя); КонецЕсли; КонецПроцедуры @@ -4046,98 +4375,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Функции для работы с журналом регистрации - -// Процедура пакетной записи сообщений в журнал регистрации -// -// Параметры: СобытияДляЖурналаРегистрации - СписокЗначений, клиентская глобальная переменная -// После записи переменная очищается. -Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт - - Если ТипЗнч(СобытияДляЖурналаРегистрации) <> Тип("СписокЗначений") Тогда - Возврат; - КонецЕсли; - - Если СобытияДляЖурналаРегистрации.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Для Каждого СообщениеЖурнала Из СобытияДляЖурналаРегистрации Цикл - ЗначениеСообщения = СообщениеЖурнала.Значение; - ИмяСобытия = ЗначениеСообщения.ИмяСобытия; - УровеньСобытия = УровеньСобытияПоПредставлению(ЗначениеСообщения.ПредставлениеУровня); - ДатаСобытия = ТекущаяДатаСеанса(); - Если ЗначениеСообщения.Свойство("ДатаСобытия") И ЗначениеЗаполнено(ЗначениеСообщения.ДатаСобытия) Тогда - ДатаСобытия = ЗначениеСообщения.ДатаСобытия; - КонецЕсли; - Комментарий = Строка(ДатаСобытия) + " " + ЗначениеСообщения.Комментарий; - ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньСобытия,,, Комментарий); - КонецЦикла; - СобытияДляЖурналаРегистрации.Очистить(); - -КонецПроцедуры - -// Включить запись уровней событий СписокУровней в журнале регистрации. -// -// Параметры: УровниСобытий - СписокЗначений - наименования уровней регистрации событий, -// которые необходимо включить -// -Процедура ВключитьИспользованиеЖурналаРегистрации(СписокУровней = Неопределено) Экспорт - - МассивУровней = Новый Массив(); - Если СписокУровней = Неопределено Тогда - МассивУровней.Добавить(УровеньЖурналаРегистрации.Информация); - МассивУровней.Добавить(УровеньЖурналаРегистрации.Ошибка); - МассивУровней.Добавить(УровеньЖурналаРегистрации.Предупреждение); - МассивУровней.Добавить(УровеньЖурналаРегистрации.Примечание); - Иначе - МассивУровней = УровниСобытияЖурналаРегистрацииПоСтроке(СписокУровней); - КонецЕсли; - - МонопольныйРежимУстановленРанее = МонопольныйРежим(); - УстановитьМонопольныйРежим(Истина); - - Попытка - УстановитьИспользованиеЖурналаРегистрации(МассивУровней); - Исключение - Если Не МонопольныйРежимУстановленРанее Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Проверяет, включена ли регистрация событий УровниСобытий в журнале регистрации. -// -// Параметры: -// УровниСобытий - СписокЗначений - список строк с уровнями регистрации событий журнала регистрации, -// для которых необходимо проверить, что они включены. -// Если Неопределено, то проверяются все уровни событий. -// -// Возвращаемое значение: -// Булево - Истина, когда заданные режимы включены. Иначе - Ложь. -// -Функция ПроверитьВключениеЖурналаРегистрации(УровниСобытий = Неопределено) Экспорт - - УстановленныеУровниСобытий = ПолучитьИспользованиеЖурналаРегистрации(); - Если УровниСобытий = Неопределено Тогда - Возврат УстановленныеУровниСобытий.Количество() = 4; // включены все уровни событий? - КонецЕсли; - - ИменаУровнейСобытий = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(УровниСобытий); - Для Каждого Название Из ИменаУровнейСобытий Цикл - УровеньСобытия = УровеньСобытияПоПредставлению(Название); - Если УстановленныеУровниСобытий.Найти(УровеньСобытия) = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции для работы в режиме разделения данных @@ -4157,27 +4394,21 @@ // Процедура ЗаблокироватьИБ(Знач ПроверитьОтсутствиеДругихСеансов = Истина) Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Если НЕ МонопольныйРежим() Тогда УстановитьМонопольныйРежим(Истина); КонецЕсли; - Иначе - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(ПроверитьОтсутствиеДругихСеансов); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - КонецЕсли; - + КонецПроцедуры // Снимает монопольный доступ к информационной базе (области данных). @@ -4191,25 +4422,19 @@ // Процедура РазблокироватьИБ() Экспорт - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() + ИЛИ НЕ ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Если МонопольныйРежим() Тогда УстановитьМонопольныйРежим(Ложь); КонецЕсли; - Иначе - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных(); - Иначе - ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); - КонецЕсли; - КонецЕсли; КонецПроцедуры @@ -4274,49 +4499,6 @@ КонецПроцедуры -// Устанавливает значение двух дополнительных констант. -// Имена констант строго регламентированы и должны соответствовать шаблонам: -// <Имя основной константы>ВМоделиСервиса -// <Имя основной константы>ВЛокальномРежиме -// -// Параметры: -// Значение – Булево – значение основной константы. -// ИмяКонстанты – Строка – имя основной константы. -// -Процедура УстановитьЗначенияДополнительныхКонстант(Знач Значение, Знач ИмяКонстанты, Знач МенеджерЗначения) Экспорт - - Если Значение = Истина Тогда - - РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); - - УстановитьЗначениеКонстанты(РазделениеВключено, ИмяКонстанты + "ВМоделиСервиса", МенеджерЗначения); - УстановитьЗначениеКонстанты(Не РазделениеВключено, ИмяКонстанты + "ВЛокальномРежиме", МенеджерЗначения); - - Иначе - - УстановитьЗначениеКонстанты(Ложь, ИмяКонстанты + "ВМоделиСервиса", МенеджерЗначения); - УстановитьЗначениеКонстанты(Ложь, ИмяКонстанты + "ВЛокальномРежиме", МенеджерЗначения); - - КонецЕсли; - -КонецПроцедуры - -Процедура УстановитьЗначениеКонстанты(Знач Значение, Знач ИмяКонстанты, Знач МенеджерЗначения) - - МенеджерКонстанты = Константы[ИмяКонстанты].СоздатьМенеджерЗначения(); - - Для Каждого ДополнительноеСвойство Из МенеджерЗначения.ДополнительныеСвойства Цикл - - МенеджерКонстанты.ДополнительныеСвойства.Вставить(ДополнительноеСвойство.Ключ, ДополнительноеСвойство.Значение); - - КонецЦикла; - - МенеджерКонстанты.ОбменДанными.Загрузка = МенеджерЗначения.ОбменДанными.Загрузка; - МенеджерКонстанты.Значение = Значение; - МенеджерКонстанты.Записать(); - -КонецПроцедуры - // Выполняет запись значения ссылочного типа, разделенных разделителем РазделительВспомогательныхДанных // с переключением разделения сеанса на время записи. // @@ -4325,8 +4507,8 @@ // Процедура ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ЗаписатьВспомогательныеДанные(ОбъектВспомогательныхДанных); Иначе ОбъектВспомогательныхДанных.Записать(); @@ -4342,8 +4524,8 @@ // Процедура УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.УдалитьВспомогательныеДанные(ОбъектВспомогательныхДанных); Иначе ОбъектВспомогательныхДанных.Удалить(); @@ -4500,6 +4682,61 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для обработки событий и вызова необязательных подсистем. + +// Возвращает Истина, если подсистема существует в конфигурации. +// +// Параметры: +// ПолноеИмяПодсистемы - Строка. Полное имя объекта метаданных подсистема без слов "Подсистема.". +// Например: "СтандартныеПодсистемы.БазоваяФункциональность". +// +// Пример вызова необязательной подсистемы: +// +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда +// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); +// МодульУправлениеДоступом.<Имя метода>(); +// КонецЕсли; +// +// Возвращаемое значение: +// Булево. +// +Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт + + ИменаПодсистем = СтандартныеПодсистемыПовтИсп.ИменаПодсистем(); + Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; + +КонецФункции + +// Возвращает ссылку на общий модуль по имени. +// +// Параметры: +// Имя - Строка - имя общего модуля, например: +// "ОбщегоНазначения", +// "ОбщегоНазначенияКлиент". +// +// Возвращаемое значение: +// ОбщийМодуль. +// +Функция ОбщийМодуль(Имя) Экспорт + + Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда + Модуль = Вычислить(Имя); + ИначеЕсли СтрЧислоВхождений(Имя, ".") = 1 Тогда + Возврат СерверныйМодульМенеджера(Имя); + Иначе + Модуль = Неопределено; + КонецЕсли; + + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); + КонецЕсли; + + Возврат Модуль; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -4540,7 +4777,7 @@ Обработчики = СтандартныеПодсистемыПовтИсп.ОбработчикиСерверногоСобытия(Событие, Ложь); Для каждого Обработчик Из Обработчики Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщийМодуль(Обработчик.Модуль); Элемент = Новый Структура; Элемент.Вставить("Модуль", Модуль); @@ -4573,7 +4810,7 @@ Обработчики = СтандартныеПодсистемыПовтИсп.ОбработчикиСерверногоСобытия(Событие, Истина); Для каждого Обработчик Из Обработчики Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщийМодуль(Обработчик.Модуль); Элемент = Новый Структура; Элемент.Вставить("Модуль", Модуль); @@ -4761,53 +4998,36 @@ // Функция WSОпределения(Знач АдресWSDL, Знач ИмяПользователя, Знач Пароль, Знач Таймаут = 10) Экспорт - ДоступноПолучениеФайловИзИнтернета = Неопределено; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - ДоступноПолучениеФайловИзИнтернета = Истина; + Если Не ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + Возврат Новый WSОпределения(АдресWSDL, ИмяПользователя, Пароль, ,Таймаут); КонецЕсли; - Если ДоступноПолучениеФайловИзИнтернета = Истина Тогда + ПараметрыПолучения = Новый Массив; + ПараметрыПолучения.Добавить(АдресWSDL); + ПараметрыПолучения.Добавить(ИмяПользователя); + ПараметрыПолучения.Добавить(Пароль); + ПараметрыПолучения.Добавить(Таймаут); - ПараметрыПолучения = Новый Массив; - ПараметрыПолучения.Добавить(АдресWSDL); - ПараметрыПолучения.Добавить(ИмяПользователя); - ПараметрыПолучения.Добавить(Пароль); - ПараметрыПолучения.Добавить(Таймаут); + ДанныеWSDL = ОбщегоНазначенияПовтИсп.ПолучитьДанныеКэшаВерсий( + АдресWSDL, + Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ОписаниеWebСервиса, + ЗначениеВСтрокуXML(ПараметрыПолучения), + Ложь); - ДанныеWSDL = ОбщегоНазначенияПовтИсп.ПолучитьДанныеКэшаВерсий( - АдресWSDL, - Перечисления.ТипыДанныхКэшаПрограммныхИнтерфейсов.ОписаниеWebСервиса, - ЗначениеВСтрокуXML(ПараметрыПолучения), - Ложь); - - ИмяФайлаWSDL = ПолучитьИмяВременногоФайла("wsdl"); - - ДанныеWSDL.Записать(ИмяФайлаWSDL); - - Определения = Новый WSОпределения(ИмяФайлаWSDL); - - Попытка - УдалитьФайлы(ИмяФайлаWSDL); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат Определения; - - Иначе - - Параметры = Новый Массив; - Параметры.Добавить(АдресWSDL); - Параметры.Добавить(ИмяПользователя); - Параметры.Добавить(Пароль); - Параметры.Добавить(Таймаут); - - Возврат Новый(Тип("WSОпределения"), Параметры); - - КонецЕсли; + ИмяФайлаWSDL = ПолучитьИмяВременногоФайла("wsdl"); + ДанныеWSDL.Записать(ИмяФайлаWSDL); + + Определения = Новый WSОпределения(ИмяФайлаWSDL); + + Попытка + УдалитьФайлы(ИмяФайлаWSDL); + Исключение + ЗаписьЖурналаРегистрации(НСтр("ru = 'Получение WSDL'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + КонецПопытки; + + Возврат Определения; КонецФункции // Функция возвращает объект WSПрокси созданный с переданными параметрами. @@ -4834,16 +5054,15 @@ ИмяТочкиПодключения = ИмяСервиса + "Soap"; КонецЕсли; - Параметры = Новый Массив; - Параметры.Добавить(WSОпределения); - Параметры.Добавить(URIПространстваИмен); - Параметры.Добавить(ИмяСервиса); - Параметры.Добавить(ИмяТочкиПодключения); - Параметры.Добавить(Таймаут); + ИнтернетПрокси = Неопределено; + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернетаКлиентСервер") Тогда + МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщийМодуль("ПолучениеФайловИзИнтернета"); + ИнтернетПрокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси(АдресWSDL); + КонецЕсли; - Прокси = Новый(Тип("WSПрокси"), Параметры); + Прокси = Новый WSПрокси(WSОпределения, URIПространстваИмен, ИмяСервиса, ИмяТочкиПодключения, ИнтернетПрокси, Таймаут); Прокси.Пользователь = ИмяПользователя; - Прокси.Пароль = Пароль; + Прокси.Пароль = Пароль; Возврат Прокси; КонецФункции @@ -4887,27 +5106,6 @@ //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -Функция УровеньСобытияПоПредставлению(ПредставлениеУровня) - Если ПредставлениеУровня = "Информация" Тогда - Возврат УровеньЖурналаРегистрации.Информация; - ИначеЕсли ПредставлениеУровня = "Ошибка" Тогда - Возврат УровеньЖурналаРегистрации.Ошибка; - ИначеЕсли ПредставлениеУровня = "Предупреждение" Тогда - Возврат УровеньЖурналаРегистрации.Предупреждение; - ИначеЕсли ПредставлениеУровня = "Примечание" Тогда - Возврат УровеньЖурналаРегистрации.Примечание; - КонецЕсли; -КонецФункции - -Функция УровниСобытияЖурналаРегистрацииПоСтроке(СписокУровней) - МассивНазванийУровней = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СписокУровней); - МассивУровней = Новый Массив; - Для Каждого Название Из МассивНазванийУровней Цикл - МассивУровней.Добавить(УровеньСобытияПоПредставлению(Название)); - КонецЦикла; - Возврат МассивУровней; -КонецФункции - Процедура НоваяСтрокаКоллекцииОбъектовМетаданных(Имя, Синоним, Картинка, КартинкаОбъекта, Таб) НоваяСтрока = Таб.Добавить(); @@ -5089,6 +5287,114 @@ КонецЦикла; КонецПроцедуры +// Возвращает строку ключа настроек, не превышающую допустимую длину. +// Проверяет длину строки на входе и, в случае превышения 128, преобразует ее конец по алгоритму MD5 в короткий +// вариант, в результате чего строка становится длиной 128 символов. +// Если исходная строка менее 128 символов, она возвращается в неизменном виде. +// +// Параметры: +// Строка - Строка - строка произвольной длины. +// +Функция КлючНастроек(Знач Строка) + Результат = Строка; + Если СтрДлина(Строка) > 128 Тогда // ключ более 128 символов вызовет исключение при обращении к хранилищу настроек + Результат = Лев(Строка, 96); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(Сред(Строка, 97)); + Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + КонецЕсли; + Возврат Результат; +КонецФункции + +// Возвращает серверный модуль менеджера по имени объекта. +Функция СерверныйМодульМенеджера(Имя) + ОбъектНайден = Ложь; + + ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Имя, "."); + Если ЧастиИмени.Количество() = 2 Тогда + + ИмяВида = ВРег(ЧастиИмени[0]); + ИмяОбъекта = ЧастиИмени[1]; + + Если ИмяВида = ВРег(ИмяТипаКонстанты()) Тогда + Если Метаданные.Константы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыСведений()) Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыНакопления()) Тогда + Если Метаданные.РегистрыНакопления.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыБухгалтерии()) Тогда + Если Метаданные.РегистрыБухгалтерии.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаРегистрыРасчета()) Тогда + Если Метаданные.РегистрыРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаСправочники()) Тогда + Если Метаданные.Справочники.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаДокументы()) Тогда + Если Метаданные.Документы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаОтчеты()) Тогда + Если Метаданные.Отчеты.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаОбработки()) Тогда + Если Метаданные.Обработки.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаБизнесПроцессы()) Тогда + Если Метаданные.БизнесПроцессы.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаЖурналыДокументов()) Тогда + Если Метаданные.ЖурналыДокументов.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаЗадачи()) Тогда + Если Метаданные.Задачи.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыСчетов()) Тогда + Если Метаданные.ПланыСчетов.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыОбмена()) Тогда + Если Метаданные.ПланыОбмена.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыВидовХарактеристик()) Тогда + Если Метаданные.ПланыВидовХарактеристик.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + ИначеЕсли ИмяВида = ВРег(ИмяТипаПланыВидовРасчета()) Тогда + Если Метаданные.ПланыВидовРасчета.Найти(ИмяОбъекта) <> Неопределено Тогда + ОбъектНайден = Истина; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + Если Не ОбъектНайден Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект метаданных ""%1"" не найден, + |либо для него не поддерживается получение модуля менеджера.'"), Имя); + КонецЕсли; + + Модуль = Вычислить(Имя); + + Возврат Модуль; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -5117,8 +5423,8 @@ // Процедура ПриСкачиванииФайлаНаСервере(Знач Адрес, Знач ПараметрыПолучения, ВозвращаемоеЗначение) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернета = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолучениеФайловИзИнтернета"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернета = ОбщийМодуль("ПолучениеФайловИзИнтернета"); ВозвращаемоеЗначение = МодульПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Адрес, ПараметрыПолучения); КонецЕсли; @@ -5132,8 +5438,8 @@ // Процедура ПриУстановкеРазделенияСеанса(Знач Использование, Знач ОбластьДанных = Неопределено) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.УстановитьРазделениеСеанса(Использование, ОбластьДанных); КонецЕсли; @@ -5147,8 +5453,8 @@ // Процедура ПриПолученииЗначенияРазделителяСеанса(ЗначениеРазделителя) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); ЗначениеРазделителя = МодульРаботаВМоделиСервиса.ЗначениеРазделителяСеанса(); Иначе ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); @@ -5163,11 +5469,1444 @@ // Процедура ПриПолученииИспользованияРазделителяСеанса(ИспользованиеРазделителя) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщийМодуль("РаботаВМоделиСервиса"); ИспользованиеРазделителя = МодульРаботаВМоделиСервиса.ИспользованиеРазделителяСеанса(); Иначе ВызватьИсключение(НСтр("ru = 'Подсистема ""Работа в модели сервиса"" не доступна'")); КонецЕсли; КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ Замена ссылок + +Функция ОписаниеТипаКлючиЗаписей() + + ДобавляемыеТипы = Новый Массив; + Для Каждого Мета Из Метаданные.РегистрыСведений Цикл + ДобавляемыеТипы.Добавить(Тип("РегистрСведенийКлючЗаписи." + Мета.Имя)); + КонецЦикла; + Для Каждого Мета Из Метаданные.РегистрыНакопления Цикл + ДобавляемыеТипы.Добавить(Тип("РегистрНакопленияКлючЗаписи." + Мета.Имя)); + КонецЦикла; + Для Каждого Мета Из Метаданные.РегистрыБухгалтерии Цикл + ДобавляемыеТипы.Добавить(Тип("РегистрБухгалтерииКлючЗаписи." + Мета.Имя)); + КонецЦикла; + Для Каждого Мета Из Метаданные.РегистрыРасчета Цикл + ДобавляемыеТипы.Добавить(Тип("РегистрРасчетаКлючЗаписи." + Мета.Имя)); + КонецЦикла; + + Возврат Новый ОписаниеТипов(ДобавляемыеТипы); +КонецФункции + +Процедура РазметитьМестаИспользования(Знач Конфигурация, Знач Ссылка, Знач ЦелеваяСсылка, Знач ТаблицаПоиска, РезультатРазметки = Неопределено) + УстановитьПривилегированныйРежим(Истина); + + ТипКлючЗаписи = Конфигурация.ТипКлючЗаписи; + МетаКонстанты = Конфигурация.МетаКонстанты; + ТипВсеСсылки = Конфигурация.ТипВсеСсылки; + ТипКлючЗаписей = Конфигурация.ТипКлючЗаписи; + + // Устанавливаем порядок известных и проверяем наличие неопознанных объектов + ФильтрСсылки = Новый Структура("Ссылка, КлючЗамены", Ссылка, ""); + + РезультатРазметки = Новый Структура; + РезультатРазметки.Вставить("МестаИспользования", ТаблицаПоиска.НайтиСтроки(ФильтрСсылки) ); + РезультатРазметки.Вставить("ОшибкиРазметки", Новый Массив); + + Для Каждого МестоИспользования Из РезультатРазметки.МестаИспользования Цикл + МетаданныеМеста = МестоИспользования.Метаданные; + + Если МестоИспользования.ВспомогательныеДанные Тогда + // Зависимые данные не обрабатываем совсем + Продолжить; + + ИначеЕсли МетаКонстанты.Содержит(МетаданныеМеста) Тогда + МестоИспользования.КлючЗамены = "Константа"; + МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка; + + Иначе + ТипДанных = ТипЗнч(МестоИспользования.Данные); + Если ТипВсеСсылки.СодержитТип(ТипДанных) Тогда + МестоИспользования.КлючЗамены = "Объект"; + МестоИспользования.ВерсияДанных = МестоИспользования.Данные.ВерсияДанных; + МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка; + + ИначеЕсли ТипКлючЗаписей.СодержитТип(ТипДанных) Тогда + МестоИспользования.КлючЗамены = "КлючЗаписи"; + МестоИспользования.ЦелеваяСсылка = ЦелеваяСсылка; + + Иначе + // Неизвестный объект для замены ссылок + Текст = НСтр("ru = 'Неизвестный тип данных %1 для проведения замены %2'"); + Текст = СтрЗаменить(Текст, "%1", Строка(МестоИспользования.Данные)); + Текст = СтрЗаменить(Текст, "%2", Строка(Ссылка)); + РезультатРазметки.ОшибкиРазметки.Добавить( + Новый Структура("Объект, Текст", МестоИспользования.Данные, Текст)); + + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Процедура ПроизвестиЗаменуВКонстанте(Результаты, Знач МестоИспользования, Знач ПараметрыЗаписи, Знач ВнутренняяТранзакция = Истина) + УстановитьПривилегированныйРежим(Истина); + + Данные = МестоИспользования.Данные; + Мета = МестоИспользования.Метаданные; + + // Будем производить сразу все замены для этих данных + Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "Константа"); + ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); + + СостояниеОперации = ""; + + Если ВнутренняяТранзакция Тогда + НачатьТранзакцию(); + + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить(Мета.ПолноеИмя()); + + Попытка + Блокировка.Заблокировать(); + Исключение + // Добавляем запись в результат о неудачной попытке блокировке + Ошибка = НСтр("ru = 'Не удалось заблокировать константу %1'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + + СостояниеОперации = "ОшибкаБлокировки"; + КонецПопытки; + + КонецЕсли; // Необходимость блокировки + + Если СостояниеОперации = "" Тогда + Менеджер = Константы[Мета.Имя].СоздатьМенеджерЗначения(); + Менеджер.Прочитать(); + + ЗаменаНеПроизведена = Истина; + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + Если Менеджер.Значение = Строка.Ссылка Тогда + Менеджер.Значение = Строка.ЦелеваяСсылка; + ЗаменаНеПроизведена = Ложь; + Прервать; + КонецЕсли; + КонецЦикла; + + Если ЗаменаНеПроизведена Тогда + // Добавляем запись в результат о том, что объект был изменен + Ошибка = НСтр("ru = 'Объект %1 был изменен другим пользователем'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ДанныеИзменены", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ДанныеИзменены"; + Иначе + // Пытаемся сохранить + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Попытка + ЗаписатьОбъект(Менеджер, ПараметрыЗаписи); + Исключение + // Сохраняем причину + Информация = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), + УровеньЖурналаРегистрации.Ошибка, Мета, ПодробноеПредставлениеОшибки(Информация)); + + // Добавляем запись в результат о ошибке записи + ОписаниеОшибки = КраткоеПредставлениеОшибки(Информация); + Если ПустаяСтрока(ОписаниеОшибки) Тогда + ОписаниеОшибки = Информация.Описание; + КонецЕсли; + + Ошибка = НСтр("ru = 'Не удалось записать %1 по причине: %2'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + Ошибка = СтрЗаменить(Ошибка, "%2", ОписаниеОшибки); + + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ОшибкаЗаписи", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ОшибкаЗаписи"; + КонецПопытки; + + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Если ВнутренняяТранзакция Тогда + Если СостояниеОперации = "" Тогда + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + КонецЕсли; + + // Помечаем как обработанные + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + Строка.КлючЗамены = ""; + КонецЦикла; + +КонецПроцедуры + +Процедура ПроизвестиЗаменуВОбъекте(Результаты, Знач МестоИспользования, Знач ПараметрыЗаписи, Знач ВнутренняяТранзакция = Истина) + УстановитьПривилегированныйРежим(Истина); + + Данные = МестоИспользования.Данные; + Мета = МестоИспользования.Метаданные; + + // Будем производить сразу все замены для этих данных + Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "Объект"); + ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); + + ОписаниеПоследовательностей = ОписаниеПоследовательностей(Мета); + ОписаниеДвижений = ОписаниеДвижений(Мета); + + СостояниеОперации = ""; + + Если ВнутренняяТранзакция Тогда + // Обрабатываем все связные данные одновременно + НачатьТранзакцию(); + + Блокировка = Новый БлокировкаДанных; + + // Сам элемент + Блокировка.Добавить(Мета.ПолноеИмя()).УстановитьЗначение("Ссылка", Данные); + + // Движения + Для Каждого Элемент Из ОписаниеДвижений Цикл + // Все по регистратору + Блокировка.Добавить(Элемент.ПространствоБлокировки + ".НаборЗаписей").УстановитьЗначение("Регистратор", Данные); + + // Все кандидаты - измерения для сохранения итогов + Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Для Каждого МестоИспользования Из ОбрабатываемыеСтроки Цикл + ТекущаяСсылка = МестоИспользования.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.Ссылка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + // Последовательности + Для Каждого Элемент Из ОписаниеПоследовательностей Цикл + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", Данные); + + Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Для Каждого МестоИспользования Из ОбрабатываемыеСтроки Цикл + ТекущаяСсылка = МестоИспользования.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, ТекущаяСсылка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + Попытка + Блокировка.Заблокировать(); + Исключение + // Добавляем запись в результат о неудачной попытке блокировке + Ошибка = НСтр("ru = 'Не удалось заблокировать один или несколько объектов из списка + |%1'"); + Ошибка = СтрЗаменить(Ошибка, "%1", ОписаниеСпискаБлокировки(Блокировка)); + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ОшибкаБлокировки", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ОшибкаБлокировки"; + КонецПопытки; + + КонецЕсли; // Необходимость блокировки + + Если СостояниеОперации = "" Тогда + // Если объект был изменен, то считаем, что замена выполнена успешна + + Попытка + ТекущаяВерсия = Данные.ВерсияДанных; + Исключение + ТекущаяВерсия = МестоИспользования.ВерсияДанных; + КонецПопытки; + + Если ТекущаяВерсия <> МестоИспользования.ВерсияДанных Тогда + // Добавляем запись в результат о том, что объект был изменен + Ошибка = НСтр("ru = 'Объект %1 был изменен другим пользователем'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ДанныеИзменены", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ДанныеИзменены"; + КонецЕсли; + КонецЕсли; + + Если СостояниеОперации = "" Тогда + ОбъектыЗаписи = ИзмененныеОбъектыПриЗаменеВОбъекте(Данные, ОбрабатываемыеСтроки, ОписаниеДвижений, ОписаниеПоследовательностей); + + // Пытаемся сохранить, сам объект идет последним + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Попытка + Для Каждого КлючЗначение Из ОбъектыЗаписи Цикл + ЗаписатьОбъект(КлючЗначение.Ключ, ПараметрыЗаписи); + КонецЦикла; + Исключение + // Сохраняем причину + Информация = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), + УровеньЖурналаРегистрации.Ошибка, Мета, ПодробноеПредставлениеОшибки(Информация)); + + ОписаниеОшибки = КраткоеПредставлениеОшибки(Информация); + Если ПустаяСтрока(ОписаниеОшибки) Тогда + ОписаниеОшибки = Информация.Описание; + КонецЕсли; + + // Добавляем запись в результат о ошибке записи + Ошибка = НСтр("ru = 'Не удалось записать %1 по причине: %2'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + Ошибка = СтрЗаменить(Ошибка, "%2", ОписаниеОшибки); + + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ОшибкаЗаписи", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ОшибкаЗаписи"; + КонецПопытки; + + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + // Удаляем обработанные движения и последовательности из таблицы поиска + КонецЕсли; + + Если ВнутренняяТранзакция Тогда + Если СостояниеОперации = "" Тогда + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + КонецЕсли; + + // Помечаем как обработанные + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + Строка.КлючЗамены = ""; + КонецЦикла; + +КонецПроцедуры + +Процедура ПроизвестиЗаменуВНаборе(Результаты, Знач МестоИспользования, Знач ПараметрыЗаписи, Знач ВнутренняяТранзакция = Истина) + УстановитьПривилегированныйРежим(Истина); + + Данные = МестоИспользования.Данные; + Мета = МестоИспользования.Метаданные; + + // Будем производить сразу все замены для этих данных + Фильтр = Новый Структура("Данные, КлючЗамены", Данные, "КлючЗаписи"); + ОбрабатываемыеСтроки = МестоИспользования.Владелец().НайтиСтроки(Фильтр); + + ОписаниеНабора = ОписаниеКлючаЗаписи(Мета); + НаборЗаписей = ОписаниеНабора.НаборЗаписей; + + ПарыЗамен = Новый Соответствие; + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ПарыЗамен.Вставить(Строка.Ссылка, Строка.ЦелеваяСсылка); + КонецЦикла; + + СостояниеОперации = ""; + + Если ВнутренняяТранзакция Тогда + НачатьТранзакцию(); + + // Блокировка и подготовка набора + Блокировка = Новый БлокировкаДанных; + Для Каждого КлючЗначение Из ОписаниеНабора.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Имя = КлючЗначение.Ключ; + Значение = Данные[Имя]; + + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ТекущаяСсылка = Строка.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(ОписаниеНабора.ПространствоБлокировки).УстановитьЗначение(Имя, ТекущаяСсылка); + КонецЕсли; + КонецЦикла; + + НаборЗаписей.Отбор[Имя].Установить(Значение); + КонецЦикла; + + Попытка + Блокировка.Заблокировать(); + Исключение + // Добавляем запись в результат о неудачной попытке блокировке + Ошибка = НСтр("ru = 'Не удалось заблокировать константу %1'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + + СостояниеОперации = "ОшибкаБлокировки"; + КонецПопытки; + + КонецЕсли; // Необходимость блокировки + + Если СостояниеОперации = "" Тогда + НаборЗаписей.Прочитать(); + ЗаменитьВКоллекцииСтрок(НаборЗаписей, ОписаниеНабора.СписокПолей, ПарыЗамен); + + Если НаборЗаписей.Модифицированность() Тогда + // Пытаемся сохранить + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Попытка + ЗаписатьОбъект(НаборЗаписей, ПараметрыЗаписи); + Исключение + // Сохраняем причину + Информация = ИнформацияОбОшибке(); + ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрацииЗаменыСсылок(), + УровеньЖурналаРегистрации.Ошибка, Мета, ПодробноеПредставлениеОшибки(Информация)); + + ОписаниеОшибки = КраткоеПредставлениеОшибки(Информация); + Если ПустаяСтрока(ОписаниеОшибки) Тогда + ОписаниеОшибки = Информация.Описание; + КонецЕсли; + + // Добавляем запись в результат о ошибке записи + Ошибка = НСтр("ru = 'Не удалось записать %1 по причине: %2'"); + Ошибка = СтрЗаменить(Ошибка, "%1", Строка(Данные)); + Ошибка = СтрЗаменить(Ошибка, "%2", ОписаниеОшибки); + + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + ДобавитьРезультатЗамены(Результаты, Строка.Ссылка, "ОшибкаЗаписи", Данные, Ошибка); + КонецЦикла; + + СостояниеОперации = "ОшибкаЗаписи"; + КонецПопытки; + + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + КонецЕсли; + КонецЕсли; + + Если ВнутренняяТранзакция Тогда + Если СостояниеОперации = "" Тогда + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + КонецЕсли; + + // Помечаем как обработанные + Для Каждого Строка Из ОбрабатываемыеСтроки Цикл + Строка.КлючЗамены = ""; + КонецЦикла; + +КонецПроцедуры + +Функция ИзмененныеОбъектыПриЗаменеВОбъекте(Знач Данные, Знач ОбрабатываемыеСтроки, Знач ОписаниеДвижений, Знач ОписаниеПоследовательностей) + УстановитьПривилегированныйРежим(Истина); + + // Возвращаем измененные обработанные объекты + Измененные = Новый Соответствие; + + // Считываем + Описание = ОписаниеОбъекта(Данные.Метаданные()); + Попытка + Объект = Данные.ПолучитьОбъект(); + Исключение + // Был уже обработан с ошибками + Объект = Неопределено; + КонецПопытки; + + Если Объект = Неопределено Тогда + Возврат Измененные; + КонецЕсли; + + Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл + ОписаниеДвижения.НаборЗаписей.Отбор.Регистратор.Установить(Данные); + ОписаниеДвижения.НаборЗаписей.Прочитать(); + КонецЦикла; + + Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл + ОписаниеПоследовательности.НаборЗаписей.Отбор.Регистратор.Установить(Данные); + ОписаниеПоследовательности.НаборЗаписей.Прочитать(); + КонецЦикла; + + // Заменяем сразу все варианты + ПарыЗамен = Новый Соответствие; + Для Каждого МестоИспользования Из ОбрабатываемыеСтроки Цикл + ПарыЗамен.Вставить(МестоИспользования.Ссылка, МестоИспользования.ЦелеваяСсылка); + КонецЦикла; + + + // Реквизиты + Для Каждого КлючЗначение Из Описание.Реквизиты Цикл + Имя = КлючЗначение.Ключ; + ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ]; + Если ЦелеваяСсылка <> Неопределено Тогда + Объект[Имя] = ЦелеваяСсылка; + КонецЕсли; + КонецЦикла; + + // Стандартные реквизиты + Для Каждого КлючЗначение Из Описание.СтандартныеРеквизиты Цикл + Имя = КлючЗначение.Ключ; + ЦелеваяСсылка = ПарыЗамен[ Объект[Имя] ]; + Если ЦелеваяСсылка <> Неопределено Тогда + Объект[Имя] = ЦелеваяСсылка; + КонецЕсли; + КонецЦикла; + + // Табличные части + Для Каждого Элемент Из Описание.ТабличныеЧасти Цикл + ЗаменитьВКоллекцииСтрок(Объект[Элемент.Имя], Элемент.СписокПолей, ПарыЗамен); + КонецЦикла; + + // Стандартные табличные части + Для Каждого Элемент Из Описание.СтандартныеТабличныеЧасти Цикл + ЗаменитьВКоллекцииСтрок(Объект[Элемент.Имя], Элемент.СписокПолей, ПарыЗамен); + КонецЦикла; + + // Движения + Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл + ЗаменитьВКоллекцииСтрок(ОписаниеДвижения.НаборЗаписей, ОписаниеДвижения.СписокПолей, ПарыЗамен); + КонецЦикла; + + // Последовательности + Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл + ЗаменитьВКоллекцииСтрок(ОписаниеПоследовательности.НаборЗаписей, ОписаниеПоследовательности.СписокПолей, ПарыЗамен); + КонецЦикла; + + Для Каждого ОписаниеДвижения Из ОписаниеДвижений Цикл + Если ОписаниеДвижения.НаборЗаписей.Модифицированность() Тогда + Измененные.Вставить(ОписаниеДвижения.НаборЗаписей, Ложь); + КонецЕсли; + КонецЦикла; + + Для Каждого ОписаниеПоследовательности Из ОписаниеПоследовательностей Цикл + Если ОписаниеПоследовательности.НаборЗаписей.Модифицированность() Тогда + Измененные.Вставить(ОписаниеПоследовательности.НаборЗаписей, Ложь); + КонецЕсли; + КонецЦикла; + + // Сам объект последний - для возможного перепроведения + Если Объект.Модифицированность() Тогда + Измененные.Вставить(Объект, Описание.МожетБытьПроведен); + КонецЕсли; + + Возврат Измененные; +КонецФункции + +Процедура УдалитьСсылкиПометкой(РезультатУдаления, Знач СписокСсылок, Знач ПараметрыЗаписи, Знач ВнутренняяТранзакция = Истина) + УстановитьПривилегированныйРежим(Истина); + + Удаляемые = Новый Массив; + + Если ВнутренняяТранзакция Тогда + НачатьТранзакцию(); + + Для Каждого Ссылка Из СписокСсылок Цикл + Блокировка = Новый БлокировкаДанных; + Блокировка.Добавить(Ссылка.Метаданные().ПолноеИмя()).УстановитьЗначение("Ссылка", Ссылка); + + Попытка + Блокировка.Заблокировать(); + Удаляемые.Добавить(Ссылка); + Исключение + ДобавитьРезультатЗамены(РезультатУдаления, Ссылка, "ОшибкаБлокировки", Ссылка, + НСтр("ru = 'Ошибка удаления ссылки, она используется другим пользователем'")); + Продолжить; + КонецПопытки + + КонецЦикла; + + Иначе + Для Каждого Ссылка Из СписокСсылок Цикл + Удаляемые.Добавить(Ссылка); + КонецЦикла; + + КонецЕсли; + + ТаблицаПоиска = МестаИспользования(Удаляемые); + Фильтр = Новый Структура("Ссылка"); + + Для Каждого Ссылка Из Удаляемые Цикл + Фильтр.Ссылка = Ссылка; + МестаИспользования = ТаблицаПоиска.НайтиСтроки(Фильтр); + + Индекс = МестаИспользования.ВГраница(); + Пока Индекс >= 0 Цикл + Если МестаИспользования[Индекс].ВспомогательныеДанные Тогда + МестаИспользования.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Если МестаИспользования.Количество()=0 Тогда + Объект = Ссылка.ПолучитьОбъект(); + + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Попытка + УстановитьПометкуУдаления(Объект, ПараметрыЗаписи); + Исключение + ДобавитьРезультатЗамены(РезультатУдаления, Ссылка, "ОшибкаЗаписи", Ссылка, + НСтр("ru = 'Ошибка пометки удаления'")); + КонецПопытки; + + Если Не ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + Иначе + ДобавитьРезультатыЗаменыИзмененныхОбъектов(РезультатУдаления, МестаИспользования); + КонецЕсли; + + КонецЦикла; + + Если ВнутренняяТранзакция Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; +КонецПроцедуры + +Процедура УдалитьСсылкиНепосредственно(РезультатУдаления, СписокСсылок, ПараметрыЗаписи, ВнутренняяТранзакция) + МестаИспользования = Неопределено; + + СостояниеТранзакции = ""; + Если ВнутренняяТранзакция Тогда + НачатьТранзакцию(); + КонецЕсли; + + Если ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + Попытка + УдалитьОбъекты(СписокСсылок, Истина, МестаИспользования); + ДобавитьРезультатыЗаменыИзмененныхОбъектов(РезультатУдаления, МестаИспользования); + Исключение + СостояниеТранзакции = "ОшибкаУдаления"; + + ДобавитьРезультатЗамены(РезультатУдаления, Неопределено, СостояниеТранзакции, Неопределено, + НСтр("ru = 'Ошибка безвозвратного удаления объектов'")); + КонецПопытки; + + Если ПараметрыЗаписи.ПривилегированнаяЗапись Тогда + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Если ВнутренняяТранзакция Тогда + Если СостояниеТранзакции = "" Тогда + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +Процедура ДобавитьРезультатыЗаменыИзмененныхОбъектов(ИтоговаяТаблица, ТаблицаПовторногоПоиска) + + ТипКлючЗаписи = ОписаниеТипаКлючиЗаписей(); + + Фильтр = Новый Структура("ТипОшибки, Ссылка, ОбъектОшибки", ""); + Для Каждого Строка Из ТаблицаПовторногоПоиска Цикл + Тест = Новый Структура("ВспомогательныеДанные", Ложь); + ЗаполнитьЗначенияСвойств(Тест, Строка); + Если Тест.ВспомогательныеДанные Тогда + Продолжить; + КонецЕсли; + + Данные = Строка.Данные; + Ссылка = Строка.Ссылка; + + Фильтр.ОбъектОшибки = Данные; + Фильтр.Ссылка = Ссылка; + Если ИтоговаяТаблица.НайтиСтроки(Фильтр).Количество() = 0 Тогда + ДобавитьРезультатЗамены(ИтоговаяТаблица, Ссылка, "ДанныеИзменены", Данные, + НСтр("ru = 'Данные были добавлены или изменены другим пользователем'")); + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ОписаниеИзмеренийНабора(Знач Мета, Кэш) + + ОписаниеИзмерений = Кэш[Мета]; + Если ОписаниеИзмерений<>Неопределено Тогда + Возврат ОписаниеИзмерений; + КонецЕсли; + + // Период и регистратор, если есть + ОписаниеИзмерений = Новый Структура; + + ДанныеИзмерения = Новый Структура("Ведущее, Представление, Формат, Тип", Ложь); + + Если Метаданные.РегистрыСведений.Содержит(Мета) Тогда + // Возможно есть период + МетаПериод = Мета.ПериодичностьРегистраСведений; + Периодичность = Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений; + + Если МетаПериод = Периодичность.ПозицияРегистратора Тогда + ДанныеИзмерения.Тип = Документы.ТипВсеСсылки(); + ДанныеИзмерения.Представление = НСтр("ru='Регистратор'"); + ДанныеИзмерения.Ведущее = Истина; + ОписаниеИзмерений.Вставить("Регистратор", ДанныеИзмерения); + + ИначеЕсли МетаПериод = Периодичность.Год Тогда + ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата"); + ДанныеИзмерения.Представление = НСтр("ru='Период'"); + ДанныеИзмерения.Формат = "Л=ru_RU; ДФ='yyyy ""г.""'; ДП='Дата не задана'"; + ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения); + + ИначеЕсли МетаПериод = Периодичность.День Тогда + ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата"); + ДанныеИзмерения.Представление = НСтр("ru='Период'"); + ДанныеИзмерения.Формат = "Л=ru_RU; ДЛФ=D; ДП='Дата не задана'"; + ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения); + + ИначеЕсли МетаПериод = Периодичность.Квартал Тогда + ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата"); + ДанныеИзмерения.Представление = НСтр("ru='Период'"); + ДанныеИзмерения.Формат = "Л=ru_RU; ДФ='к ""квартал ""yyyy ""г.""'; ДП='Дата не задана'"; + ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения); + + ИначеЕсли МетаПериод = Периодичность.Месяц Тогда + ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата"); + ДанныеИзмерения.Представление = НСтр("ru='Период'"); + ДанныеИзмерения.Формат = "Л=ru_RU; ДФ='ММММ yyyy ""г.""'; ДП='Дата не задана'"; + ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения); + + ИначеЕсли МетаПериод = Периодичность.Секунда Тогда + ДанныеИзмерения = Новый Структура; + ДанныеИзмерения.Тип = Новый ОписаниеТипов("Дата"); + ДанныеИзмерения.Представление = НСтр("ru='Период'"); + ДанныеИзмерения.Формат = "Л=ru_RU; ДЛФ=DT; ДП='Дата не задана'"; + ОписаниеИзмерений.Вставить("Период", ДанныеИзмерения); + + КонецЕсли; + + Иначе + ДанныеИзмерения.Тип = Документы.ТипВсеСсылки(); + ДанныеИзмерения.Представление = НСтр("ru='Регистратор'"); + ДанныеИзмерения.Ведущее = Истина; + ОписаниеИзмерений.Вставить("Регистратор", ДанныеИзмерения); + + КонецЕсли; + + // Все измерения + Для Каждого МетаИзмерение Из Мета.Измерения Цикл + ДанныеИзмерения = Новый Структура("Ведущее, Представление, Формат, Тип"); + ДанныеИзмерения.Тип = МетаИзмерение.Тип; + ДанныеИзмерения.Представление = МетаИзмерение.Представление(); + ДанныеИзмерения.Ведущее = МетаИзмерение.Ведущее; + ОписаниеИзмерений.Вставить(МетаИзмерение.Имя, ДанныеИзмерения); + КонецЦикла; + + Кэш[Мета] = ОписаниеИзмерений; + Возврат ОписаниеИзмерений; +КонецФункции + +Функция ОписаниеДвижений(Знач Мета) + // можно закэшировать по Мета + + ОписаниеДвижений = Новый Массив; + Если Не Метаданные.Документы.Содержит(Мета) Тогда + Возврат ОписаниеДвижений; + КонецЕсли; + + Для Каждого Движение Из Мета.Движения Цикл + + Если Метаданные.РегистрыНакопления.Содержит(Движение) Тогда + НаборЗаписей = РегистрыНакопления[Движение.Имя].СоздатьНаборЗаписей(); + ИсключатьПоля = "Активность, НомерСтроки, Период, Регистратор"; + + ИначеЕсли Метаданные.РегистрыСведений.Содержит(Движение) Тогда + НаборЗаписей = РегистрыСведений[Движение.Имя].СоздатьНаборЗаписей(); + ИсключатьПоля = "Активность, ВидДвижения, НомерСтроки, Период, Регистратор"; + + ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Движение) Тогда + НаборЗаписей = РегистрыБухгалтерии[Движение.Имя].СоздатьНаборЗаписей(); + ИсключатьПоля = "Активность, ВидДвижения, НомерСтроки, Период, Регистратор"; + + ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Движение) Тогда + НаборЗаписей = РегистрыРасчета[Движение.Имя].СоздатьНаборЗаписей(); + ИсключатьПоля = "Активность, БазовыйПериодКонец, БазовыйПериодНачало, НомерСтроки, ПериодДействия, + |ПериодДействияКонец, ПериодДействияНачало, ПериодРегистрации, Регистратор, Сторно, + |ФактическийПериодДействия"; + Иначе + // Неизвестный тип + Продолжить; + КонецЕсли; + + // Поля ссылочного типа и измерения - кандидаты + Описание = СпискиПолейПоТипу(НаборЗаписей, Движение.Измерения, ИсключатьПоля); + Если Описание.СписокПолей.Количество() = 0 Тогда + // Незачем обрабатывать + Продолжить; + КонецЕсли; + + Описание.Вставить("НаборЗаписей", НаборЗаписей); + Описание.Вставить("ПространствоБлокировки", Движение.ПолноеИмя() ); + + ОписаниеДвижений.Добавить(Описание); + КонецЦикла; // Метаданные движений + + Возврат ОписаниеДвижений; +КонецФункции + +Функция ОписаниеПоследовательностей(Знач Мета) + // можно закэшировать по Мета + + ОписаниеПоследовательностей = Новый Массив; + Если Не Метаданные.Документы.Содержит(Мета) Тогда + Возврат ОписаниеПоследовательностей; + КонецЕсли; + + Для Каждого Последовательность Из Метаданные.Последовательности Цикл + Если Не Последовательность.Документы.Содержит(Мета) Тогда + Продолжить; + КонецЕсли; + + ИмяТаблицы = Последовательность.ПолноеИмя(); + + // Список полей и измерений + Описание = СпискиПолейПоТипу(ИмяТаблицы, Последовательность.Измерения, "Регистратор"); + Если Описание.СписокПолей.Количество() = 0 Тогда + // Незачем обрабатывать + Продолжить; + КонецЕсли; + + ОписаниеПоследовательностей.Вставить("НаборЗаписей", Последовательности[Последовательность.Имя].СоздатьНаборЗаписей()); + ОписаниеПоследовательностей.Вставить("ПространствоБлокировки", ИмяТаблицы + ".Записи"); + ОписаниеПоследовательностей.Вставить("Измерения", Новый Структура); + + КонецЦикла; // Последовательность + + Возврат ОписаниеПоследовательностей; +КонецФункции + +Функция ОписаниеОбъекта(Знач Мета) + // можно закэшировать по Мета + + ТипВсеСсылки = ОписаниеТипаВсеСсылки(); + + Кандидаты = Новый Структура("Реквизиты, СтандартныеРеквизиты, ТабличныеЧасти, СтандартныеТабличныеЧасти"); + ЗаполнитьЗначенияСвойств(Кандидаты, Мета); + + ОписаниеОбъекта = Новый Структура; + + ОписаниеОбъекта.Вставить("Реквизиты", Новый Структура); + Если Кандидаты.Реквизиты <> Неопределено Тогда + Для Каждого МетаРеквизит Из Кандидаты.Реквизиты Цикл + Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда + ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОписаниеОбъекта.Вставить("СтандартныеРеквизиты", Новый Структура); + Если Кандидаты.СтандартныеРеквизиты <> Неопределено Тогда + Исключаемые = Новый Структура("Ссылка"); + + Для Каждого МетаРеквизит Из Кандидаты.СтандартныеРеквизиты Цикл + Имя = МетаРеквизит.Имя; + Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда + ОписаниеОбъекта.Реквизиты.Вставить(МетаРеквизит.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОписаниеОбъекта.Вставить("ТабличныеЧасти", Новый Массив); + Если Кандидаты.ТабличныеЧасти <> Неопределено Тогда + Для Каждого МетаТаблица Из Кандидаты.ТабличныеЧасти Цикл + + СписокПолей = Новый Структура; + Для Каждого МетаРеквизит Из МетаТаблица.Реквизиты Цикл + Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда + СписокПолей.Вставить(МетаРеквизит.Имя); + КонецЕсли; + КонецЦикла; + + Если СписокПолей.Количество() > 0 Тогда + ОписаниеОбъекта.ТабличныеЧасти.Добавить(Новый Структура("Имя, СписокПолей", МетаТаблица.Имя, СписокПолей)); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОписаниеОбъекта.Вставить("СтандартныеТабличныеЧасти", Новый Массив); + Если Кандидаты.СтандартныеТабличныеЧасти <> Неопределено Тогда + Для Каждого МетаТаблица Из Кандидаты.СтандартныеТабличныеЧасти Цикл + + СписокПолей = Новый Структура; + Для Каждого МетаРеквизит Из МетаТаблица.СтандартныеРеквизиты Цикл + Если ОписанияТиповПересекаются(МетаРеквизит.Тип, ТипВсеСсылки) Тогда + СписокПолей.Вставить(МетаРеквизит.Имя); + КонецЕсли; + КонецЦикла; + + Если СписокПолей.Количество() > 0 Тогда + ОписаниеОбъекта.СтандартныеТабличныеЧасти.Добавить(Новый Структура("Имя, СписокПолей", МетаТаблица.Имя, СписокПолей)); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + ОписаниеОбъекта.Вставить("МожетБытьПроведен", Метаданные.Документы.Содержит(Мета)); + Возврат ОписаниеОбъекта; +КонецФункции + +Функция ОписаниеКлючаЗаписи(Знач Мета) + // можно закэшировать по Мета + + ИмяТаблицы = Мета.ПолноеИмя(); + + // Поля ссылочного типа - кандидаты и набор измерений + ОписаниеКлюча = СпискиПолейПоТипу(ИмяТаблицы, Мета.Измерения, "Период, Регистратор"); + + Если Метаданные.РегистрыСведений.Содержит(Мета) Тогда + НаборЗаписей = РегистрыСведений[Мета.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли Метаданные.РегистрыНакопления.Содержит(Мета) Тогда + НаборЗаписей = РегистрыНакопления[Мета.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(Мета) Тогда + НаборЗаписей = РегистрыБухгалтерии[Мета.Имя].СоздатьНаборЗаписей(); + + ИначеЕсли Метаданные.РегистрыРасчета.Содержит(Мета) Тогда + НаборЗаписей = РегистрыРасчета[Мета.Имя].СоздатьНаборЗаписей(); + + Иначе + НаборЗаписей = Неопределено; + КонецЕсли; + + ОписаниеКлюча.Вставить("НаборЗаписей", НаборЗаписей); + ОписаниеКлюча.Вставить("ПространствоБлокировки", ИмяТаблицы); + + Возврат ОписаниеКлюча; +КонецФункции + +Функция ОписаниеСпискаБлокировки(Знач Блокировка) + // Только уникальные значения + Обработанные = Новый Соответствие; + + СтрокаОписания = ""; + Для Каждого Элемент Из Блокировка Цикл + Для Каждого Поле Из Элемент.Поля Цикл + Значение = Поле.Значение; + Если Обработанные[Значение] = Неопределено Тогда + СтрокаОписания = СтрокаОписания + Символы.ПС + Поле.Значение; + Обработанные[Значение] = Истина; + КонецЕсли + КонецЦикла; + КонецЦикла; + + Возврат СокрЛ(СтрокаОписания); +КонецФункции + +Функция ОписанияТиповПересекаются(Знач Описание1, Знач Описание2) + + Для Каждого Тип Из Описание1.Типы() Цикл + Если Описание2.СодержитТип(Тип) Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; +КонецФункции + +// Возвращает описание по имени таблицы или по набору записей +Функция СпискиПолейПоТипу(Знач ИсточникДанных , Знач МетаИзмерения, Знач ИсключатьПоля) + // можно закэшировать + + Описание = Новый Структура; + Описание.Вставить("СписокПолей", Новый Структура); + Описание.Вставить("СписокИзмерений", Новый Структура); + Описание.Вставить("СписокВедущих", Новый Структура); + + ТипКонтроля = ОписаниеТипаВсеСсылки(); + Исключаемые = Новый Структура(ИсключатьПоля); + + ТипИсточникаДанных = ТипЗнч(ИсточникДанных); + + Если ТипИсточникаДанных = Тип("Строка") Тогда + // Источник - имя таблицы, получаем поля запросом + Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ " + ИсточникДанных + " ГДЕ ЛОЖЬ"); + ИсточникПолей = Запрос.Выполнить(); + Иначе + // Источник - набор записей + ИсточникПолей = ИсточникДанных.ВыгрузитьКолонки(); + КонецЕсли; + + Для Каждого Колонка Из ИсточникПолей.Колонки Цикл + Имя = Колонка.Имя; + Если Не Исключаемые.Свойство(Имя) И ОписанияТиповПересекаются(Колонка.ТипЗначения, ТипКонтроля) Тогда + Описание.СписокПолей.Вставить(Имя); + + // И проверка на ведущее измерение + Мета = МетаИзмерения.Найти(Имя); + Если Мета <> Неопределено Тогда + Описание.СписокИзмерений.Вставить(Имя, Мета.Тип); + Тест = Новый Структура("Ведущее", Ложь); + ЗаполнитьЗначенияСвойств(Тест, Мета); + Если Тест.Ведущее Тогда + Описание.СписокВедущих.Вставить(Имя, Мета.Тип); + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + КонецЦикла; + + Возврат Описание; +КонецФункции + +Процедура ДобавитьРезультатЗамены(Таблица, Знач Ссылка, Знач ТипОшибки = "", Знач ОбъектОшибки = Неопределено, Знач ТекстОшибки = "") + Строка = Таблица.Добавить(); + Строка.Ссылка = Ссылка; + Строка.ТипОшибки = ТипОшибки; + Строка.ОбъектОшибки = ОбъектОшибки; + Строка.ТекстОшибки = ТекстОшибки; + + Строка.ПредставлениеОбъектаОшибки = Строка(ОбъектОшибки); +КонецПроцедуры + +Процедура ЗаменитьВКоллекцииСтрок(Коллекция, Знач СписокПолей, Знач ПарыЗамен) + РабочаяКоллекция = Коллекция.Выгрузить(); + Модифицировано = Ложь; + + Для Каждого Строка Из РабочаяКоллекция Цикл + + Для Каждого КлючЗначение Из СписокПолей Цикл + Имя = КлючЗначение.Ключ; + ЦелеваяСсылка = ПарыЗамен[ Строка[Имя] ]; + Если ЦелеваяСсылка <> Неопределено Тогда + Строка[Имя] = ЦелеваяСсылка; + Модифицировано = Истина; + КонецЕсли; + КонецЦикла; + + КонецЦикла; + + Если Модифицировано Тогда + Коллекция.Загрузить(РабочаяКоллекция); + КонецЕсли; +КонецПроцедуры + +Функция ПолучитьТекущиеСообщенияПользователя() + Результат = Новый Массив; + + Сообщения = ПолучитьСообщенияПользователю(Истина); + Для Каждого Сообщение Из Сообщения Цикл + Результат.Добавить(Сообщение); + КонецЦикла; + + Возврат Результат; +КонецФункции + +Процедура СообщитьОтложенныеСообщения(Знач Сообщения) + Для Каждого Сообщение Из Сообщения Цикл + Сообщение.Сообщить(); + КонецЦикла; +КонецПроцедуры + +Процедура ЗаписатьОбъектСПерехватомСообщений(Знач Объект, Знач РежимЗаписи = Неопределено) + + // Текущие сообщения до исключения запоминаем + ПредыдущиеСообщения = ПолучитьТекущиеСообщенияПользователя(); + + Попытка + Если РежимЗаписи = Неопределено Тогда + Объект.Записать(); + Иначе + Объект.Записать(РежимЗаписи); + КонецЕсли; + + Исключение + Информация = ИнформацияОбОшибке(); + + // Перехватываем все сообщенное при ошибке и преобразуем их в одно исключение + ТекстИсключения = ""; + Для Каждого Сообщение Из ПолучитьТекущиеСообщенияПользователя() Цикл + ТекстИсключения = ТекстИсключения + Символы.ПС + Сообщение.Текст; + КонецЦикла; + + СообщитьОтложенныеСообщения(ПредыдущиеСообщения); + + Если ПустаяСтрока(ТекстИсключения) Тогда + ВызватьИсключение; + КонецЕсли; + + ВызватьИсключение СокрЛП(КраткоеПредставлениеОшибки(Информация) + Символы.ПС + ТекстИсключения); + КонецПопытки; + + СообщитьОтложенныеСообщения(ПредыдущиеСообщения); +КонецПроцедуры + +Процедура ЗаписатьОбъект(Знач Объект, Знач ПараметрыЗаписи) + + УстановитьПараметрыЗаписи(Объект, ПараметрыЗаписи); + + ЭтоДокумент = Ложь; + ТипОбъекта = ТипЗнч(Объект); + + Для Каждого Тип Из Документы.ТипВсеСсылки().Типы() Цикл + ИмяТипа = XMLТип(Тип).ИмяТипа; + ТипДокументОбъект = Тип("ДокументОбъект." + Сред(ИмяТипа, 1 + Найти(ИмяТипа, ".")) ); + Если ТипОбъекта = ТипДокументОбъект Тогда + // Это документ + ЗаписатьОбъектСПерехватомСообщений(Объект, РежимЗаписиДокумента.Запись); + Возврат; + КонецЕсли; + КонецЦикла; + + // Проверка на возможные циклические ссылки + ТестРеквизитов= Новый Структура("Иерархический, ВидыСубконто, Владельцы", Ложь, Неопределено, Новый Массив); + ЗаполнитьЗначенияСвойств(ТестРеквизитов, Объект.Метаданные()); + + // По родителю + Если ТестРеквизитов.Иерархический Или ТестРеквизитов.ВидыСубконто <> Неопределено Тогда + + Если Объект.Родитель = Объект.Ссылка Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При записи ""%1"" возникает циклическая ссылка в иерархии.'"), + Строка(Объект)); + КонецЕсли; + + КонецЕсли; + + // По владельцу + Для Каждого МетаВладелец Из ТестРеквизитов.Владельцы Цикл + + Если Объект.Владелец = Объект.Ссылка Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При записи ""%1"" возникает циклическая ссылка в подчинении.'"), + Строка(Объект)); + КонецЕсли; + Прервать; + + КонецЦикла; + + // Просто запись + ЗаписатьОбъектСПерехватомСообщений(Объект); +КонецПроцедуры + +Процедура УстановитьПометкуУдаления(Объект, Знач ПараметрыЗаписи) + + УстановитьПараметрыЗаписи(Объект, ПараметрыЗаписи); + + Объект.УстановитьПометкуУдаления(Истина, Ложь); + +КонецПроцедуры + +Процедура УстановитьПараметрыЗаписи(Объект, Знач ПараметрыЗаписи) + + Если ПараметрыЗаписи.НеПроверять Тогда + + ТестРеквизита = Новый Структура("ОбменДанными"); + ЗаполнитьЗначенияСвойств(ТестРеквизита, Объект); + Если ТипЗнч(ТестРеквизита.ОбменДанными) = Тип("ПараметрыОбменаДанными") Тогда + Объект.ОбменДанными.Загрузка = Истина; + Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; + КонецЕсли; + + Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов", Истина); + КонецЕсли; + +КонецПроцедуры + +Функция СобытиеЖурналаРегистрацииЗаменыСсылок() + Возврат НСтр("ru='Поиск и удаление ссылок'", + Метаданные.ОсновнойЯзык.КодЯзыка); +КонецФункции + +Процедура ЗаменитьСсылкиКороткимиТранзакциями(РезультатЗамены, Знач ПараметрыЗамены, Знач ПроизводимыеЗамены, Знач ТаблицаПоиска) + + // Основной цикл обработки + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("НеПроверять", Не ПараметрыЗамены.КонтрольПриЗаписи); + ПараметрыЗаписи.Вставить("ПривилегированнаяЗапись", ПараметрыЗамены.ПривилегированнаяЗапись); + + ФильтрСсылок = Новый Структура("Ссылка, КлючЗамены"); + Для Каждого Ссылка Из ПроизводимыеЗамены Цикл + ФильтрСсылок.Ссылка = Ссылка; + + ФильтрСсылок.КлючЗамены = "Константа"; + МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок); + Для Каждого МестоИспользования Из МестаИспользования Цикл + ПроизвестиЗаменуВКонстанте(РезультатЗамены, МестоИспользования, ПараметрыЗаписи); + КонецЦикла; + + ФильтрСсылок.КлючЗамены = "Объект"; + МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок); + Для Каждого МестоИспользования Из МестаИспользования Цикл + ПроизвестиЗаменуВОбъекте(РезультатЗамены, МестоИспользования, ПараметрыЗаписи); + КонецЦикла; + + ФильтрСсылок.КлючЗамены = "КлючЗаписи"; + МестаИспользования = ТаблицаПоиска.НайтиСтроки(ФильтрСсылок); + Для Каждого МестоИспользования Из МестаИспользования Цикл + ПроизвестиЗаменуВНаборе(РезультатЗамены, МестоИспользования, ПараметрыЗаписи); + КонецЦикла; + КонецЦикла; + + // Окончательные действия + Если ПараметрыЗамены.УдалятьНепосредственно Тогда + УдалитьСсылкиНепосредственно(РезультатЗамены, ПроизводимыеЗамены, ПараметрыЗаписи, Истина); + + ИначеЕсли ПараметрыЗамены.ПомечатьНаУдаление Тогда + УдалитьСсылкиПометкой(РезультатЗамены, ПроизводимыеЗамены, ПараметрыЗаписи); + + Иначе + // Поиск новых + ТаблицаПовторногоПоиска = МестаИспользования(ПроизводимыеЗамены); + ДобавитьРезультатыЗаменыИзмененныхОбъектов(РезультатЗамены, ТаблицаПовторногоПоиска); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаменитьСсылкуДлиннойТранзакцией(РезультатЗамены, Знач Ссылка, Знач ПараметрыЗамены, Знач ТаблицаПоиска) + УстановитьПривилегированныйРежим(Истина); + + ПараметрыЗаписи = Новый Структура; + ПараметрыЗаписи.Вставить("НеПроверять", Не ПараметрыЗамены.КонтрольПриЗаписи); + ПараметрыЗаписи.Вставить("ПривилегированнаяЗапись", ПараметрыЗамены.ПривилегированнаяЗапись); + + СостояниеОперации = ""; + + // 1. Блокирование всех мест использования + Блокировка = Новый БлокировкаДанных; + + МестаИспользованияКонстанты = ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка, КлючЗамены", Ссылка, "Константа")); + ДобавитьОбъектыБлокировкиКонстанты(Блокировка, МестаИспользованияКонстанты); + + МестаИспользованияОбъекты = ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка, КлючЗамены", Ссылка, "Объект")); + ДобавитьОбъектыБлокировкиОбъекты(Блокировка, МестаИспользованияОбъекты); + + МестаИспользованияНаборы = ТаблицаПоиска.НайтиСтроки(Новый Структура("Ссылка, КлючЗамены", Ссылка, "КлючЗаписи")); + ДобавитьОбъектыБлокировкиНаборы(Блокировка, МестаИспользованияНаборы); + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + Исключение + // Добавляем запись в результат о неудачной попытке блокировке + Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось заблокировать все места использования %1'"), + Ссылка + ); + ДобавитьРезультатЗамены(РезультатЗамены, Ссылка, "ОшибкаБлокировки", Неопределено, Ошибка); + + СостояниеОперации = "ОшибкаБлокировки"; + КонецПопытки; + + УстановитьПривилегированныйРежим(Ложь); + + // 2. Замена везде + Если СостояниеОперации = "" Тогда + КоличествоОшибок = РезультатЗамены.Количество(); + + Для Каждого МестоИспользования Из МестаИспользованияКонстанты Цикл + ПроизвестиЗаменуВКонстанте(РезультатЗамены, МестоИспользования, ПараметрыЗаписи, Ложь); + КонецЦикла; + + Для Каждого МестоИспользования Из МестаИспользованияОбъекты Цикл + ПроизвестиЗаменуВОбъекте(РезультатЗамены, МестоИспользования, ПараметрыЗаписи, Ложь); + КонецЦикла; + + Для Каждого МестоИспользования Из МестаИспользованияНаборы Цикл + ПроизвестиЗаменуВНаборе(РезультатЗамены, МестоИспользования, ПараметрыЗаписи, Ложь); + КонецЦикла; + + Если КоличествоОшибок <> РезультатЗамены.Количество() Тогда + СостояниеОперации = "ОшибкаЗаписи"; + КонецЕсли; + КонецЕсли; + + // 3. Удаление + ПроизводимыеЗамены = Новый Массив; + ПроизводимыеЗамены.Добавить(Ссылка); + + Если СостояниеОперации = "" Тогда + КоличествоОшибок = РезультатЗамены.Количество(); + + Если ПараметрыЗамены.УдалятьНепосредственно Тогда + УдалитьСсылкиНепосредственно(РезультатЗамены, ПроизводимыеЗамены, ПараметрыЗаписи, Ложь); + + ИначеЕсли ПараметрыЗамены.ПомечатьНаУдаление Тогда + УдалитьСсылкиПометкой(РезультатЗамены, ПроизводимыеЗамены, ПараметрыЗаписи, Ложь); + + Иначе + // Поиск новых + ТаблицаПовторногоПоиска = МестаИспользования(ПроизводимыеЗамены); + ДобавитьРезультатыЗаменыИзмененныхОбъектов(РезультатЗамены, ТаблицаПовторногоПоиска); + КонецЕсли; + + Если КоличествоОшибок <> РезультатЗамены.Количество() Тогда + СостояниеОперации = "ДанныеИзменены"; + КонецЕсли; + КонецЕсли; + + Если СостояниеОперации = "" Тогда + ЗафиксироватьТранзакцию(); + Иначе + ОтменитьТранзакцию(); + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьОбъектыБлокировкиКонстанты(Блокировка, Знач СтрокиИспользования) + + Для Каждого Строка Из СтрокиИспользования Цикл + Блокировка.Добавить(Строка.Метаданные.ПолноеИмя()); + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьОбъектыБлокировкиОбъекты(Блокировка, Знач СтрокиИспользования) + + Для Каждого МестоИспользования Из СтрокиИспользования Цикл + Данные = МестоИспользования.Данные; + Мета = МестоИспользования.Метаданные; + + // Сам элемент + Блокировка.Добавить(Мета.ПолноеИмя()).УстановитьЗначение("Ссылка", Данные); + + // Движения + ОписаниеДвижений = ОписаниеДвижений(Мета); + Для Каждого Элемент Из ОписаниеДвижений Цикл + // Все по регистратору + Блокировка.Добавить(Элемент.ПространствоБлокировки + ".НаборЗаписей").УстановитьЗначение("Регистратор", Данные); + + // Все кандидаты - измерения для сохранения итогов + Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Для Каждого МестоИспользования Из СтрокиИспользования Цикл + ТекущаяСсылка = МестоИспользования.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, МестоИспользования.Ссылка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + // Последовательности + ОписаниеПоследовательностей = ОписаниеПоследовательностей(Мета); + Для Каждого Элемент Из ОписаниеПоследовательностей Цикл + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение("Регистратор", Данные); + + Для Каждого КлючЗначение Из Элемент.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Для Каждого МестоИспользования Из СтрокиИспользования Цикл + ТекущаяСсылка = МестоИспользования.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(Элемент.ПространствоБлокировки).УстановитьЗначение(КлючЗначение.Ключ, ТекущаяСсылка); + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьОбъектыБлокировкиНаборы(Блокировка, Знач СтрокиИспользования) + + Для Каждого МестоИспользования Из СтрокиИспользования Цикл + Данные = МестоИспользования.Данные; + Мета = МестоИспользования.Метаданные; + + ОписаниеНабора = ОписаниеКлючаЗаписи(Мета); + НаборЗаписей = ОписаниеНабора.НаборЗаписей; + + Для Каждого КлючЗначение Из ОписаниеНабора.СписокИзмерений Цикл + ТипИзмерения = КлючЗначение.Значение; + Имя = КлючЗначение.Ключ; + Значение = Данные[Имя]; + + Для Каждого Строка Из СтрокиИспользования Цикл + ТекущаяСсылка = Строка.Ссылка; + Если ТипИзмерения.СодержитТип(ТипЗнч(ТекущаяСсылка)) Тогда + Блокировка.Добавить(ОписаниеНабора.ПространствоБлокировки).УстановитьЗначение(Имя, ТекущаяСсылка); + КонецЕсли; + КонецЦикла; + + НаборЗаписей.Отбор[Имя].Установить(Значение); + КонецЦикла; + + КонецЦикла; + +КонецПроцедуры + +Функция ВычислитьЗначениеДанныхПоПути(Знач Данные, Знач ПутьДанных) + ЧастиПути = СтрЗаменить(ПутьДанных, ".", Символы.ПС); + КоличествоЧастейПути = СтрЧислоСтрок(ЧастиПути); + + ПромежуточныйРезультат = Данные; + + Для Индекс = 1 По КоличествоЧастейПути Цикл + ИмяРеквизита = СтрПолучитьСтроку(ЧастиПути, Индекс); + + Тест = Новый Структура(ИмяРеквизита, Неопределено); + ЗаполнитьЗначенияСвойств(Тест, ПромежуточныйРезультат); + Если Тест[ИмяРеквизита] = Неопределено Тогда + Тест[ИмяРеквизита] = -1; + ЗаполнитьЗначенияСвойств(Тест, ПромежуточныйРезультат); + Если Тест[ИмяРеквизита] = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru='Ошибка вычисления %1 для объекта %2. Реквизит %3 не найден'"), + ПутьДанных, Данные, ИмяРеквизита + ); + КонецЕсли; + КонецЕсли; + + Результат = Тест[ИмяРеквизита]; + Если Индекс = КоличествоЧастейПути Тогда + Возврат Результат; + + ИначеЕсли Результат = Неопределено Тогда + // Не можем дальше считать + Возврат Неопределено; + + КонецЕсли; + + ПромежуточныйРезультат = Результат; + КонецЦикла; + + Возврат Неопределено; +КонецФункции + +// Служебная. Запускает фоновые задания при замене ссылок. +Процедура ФоновыйРасчетКоличестваВхождений(Знач НаборСсылок, Знач АдресРезультата) Экспорт + + ТаблицаПоиска = МестаИспользования(НаборСсылок); + + Фильтр = Новый Структура("ВспомогательныеДанные", Ложь); + АктуальныеСтроки = ТаблицаПоиска.НайтиСтроки(Фильтр); + + Результат = ТаблицаПоиска.Скопировать(АктуальныеСтроки, "Ссылка"); + Результат.Колонки.Добавить("Вхождения", Новый ОписаниеТипов("Число")); + Результат.ЗаполнитьЗначения(1, "Вхождения"); + + Результат.Свернуть("Ссылка", "Вхождения"); + Для Каждого Ссылка Из НаборСсылок Цикл + Если Результат.Найти(Ссылка, "Ссылка") = Неопределено Тогда + Результат.Добавить().Ссылка = Ссылка; + КонецЕсли; + КонецЦикла; + + ПоместитьВоВременноеХранилище(Результат, АдресРезультата); +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl index 4112b71f7..5c7c91c89 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервера/Module.bsl @@ -5,46 +5,6 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -//////////////////////////////////////////////////////////////////////////////// -// Функции для работы с журналом регистрации - -// Процедура пакетной записи сообщений в журнал регистрации -// -// Параметры: СобытияДляЖурналаРегистрации - СписокЗначений, клиентская глобальная переменная -// После записи переменная очищается. -Процедура ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации) Экспорт - - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СобытияДляЖурналаРегистрации); - -КонецПроцедуры - -// Включить запись уровней событий СписокУровней в журнале регистрации. -// -// Параметры: УровниСобытий - СписокЗначений - наименования уровней регистрации событий, -// которые необходимо включить -// -Процедура ВключитьИспользованиеЖурналаРегистрации(СписокУровней = Неопределено) Экспорт - - ОбщегоНазначения.ВключитьИспользованиеЖурналаРегистрации(СписокУровней); - -КонецПроцедуры - -// Проверяет, включена ли регистрация событий УровниСобытий в журнале регистрации. -// -// Параметры: -// УровниСобытий - СписокЗначений - список строк с уровнями регистрации событий журнала регистрации, -// для которых необходимо проверить, что они включены. -// Если Неопределено, то проверяются все уровни событий. -// -// Возвращаемое значение: -// Булево - Истина, когда заданные режимы включены. Иначе - Ложь. -// -Функция ПроверитьВключениеЖурналаРегистрации(УровниСобытий = Неопределено) Экспорт - - Возврат ОбщегоНазначения.ПроверитьВключениеЖурналаРегистрации(УровниСобытий); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Общие процедуры и функции для работы с данными в базе @@ -75,7 +35,7 @@ // Возвращаемое значение: // Массив - непроведенные документы из массива Документы // -Функция ПроверитьПроведенностьДокументов(знач Документы) Экспорт +Функция ПроверитьПроведенностьДокументов(Знач Документы) Экспорт Возврат ОбщегоНазначения.ПроверитьПроведенностьДокументов(Документы); @@ -300,6 +260,9 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + //////////////////////////////////////////////////////////////////////////////// // Функции для работы с цветами стиля в клиентском коде diff --git a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/Module.bsl deleted file mode 100644 index 0c2518147..000000000 --- a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/Module.bsl +++ /dev/null @@ -1,85 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Базовая функциональность". -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации, т.е. в обработчиках событий -// - ПередНачаломРаботыСистемы, -// - ПриНачалеРаботыСистемы -// -// Важно: при запуске недопустимо использовать команды сброса кэша -// повторно используемых модулей, иначе запуск может привести -// к непредсказуемым ошибкам и лишним серверным вызовам -// -// Пример реализации: -// Для установки параметров работы клиента можно использовать шаблон: -// -// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); -// -// Возвращаемое значение: -// Структура - структура параметров работы клиента при запуске. -// -Функция ПараметрыРаботыКлиентаПриЗапуске() Экспорт - - Параметры = Новый Структура(); - - Возврат Параметры; - -КонецФункции - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Пример реализации: -// Для установки параметров работы клиента можно использовать шаблон: -// -// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); -// -// Возвращаемое значение: -// Структура - структура параметров работы клиента. -// -Функция ПараметрыРаботыКлиента() Экспорт - - Параметры = Новый Структура(); - - Возврат Параметры; - -КонецФункции - -// Возвращает структуру параметров, необходимых для работы клиентского кода -// конфигурации при завершении, т.е. в обработчиках: -// - ПередЗавершениемРаботыСистемы, -// - ПриЗавершенииРаботыСистемы -// -// Пример реализации: -// Для установки параметров работы клиента при завершении можно использовать шаблон: -// -// Параметры.Вставить(<ИмяПараметра>, <код получения значения параметра>); -// -// Возвращаемое значение: -// Структура - структура параметров работы клиента при завершении. -// -Функция ПараметрыРаботыКлиентаПриЗавершении() Экспорт - - Параметры = Новый Структура(); - - Возврат Параметры; - -КонецФункции - - -// Вызывается при необходимости переопределить минимально необходимую версию платформы для запуска. -// -// Параметры: -// ПараметрыПроверки - ФиксированнаяСтруктура - -// МинимальноНеобходимаяВерсияПлатформы - Строка - номер версии платформы для запуска программы -// РаботаВПрограммеЗапрещена - Булево - по умолчанию Ложь -// -Процедура ПолучитьМинимальноНеобходимуюВерсиюПлатформы(ПараметрыПроверки) Экспорт - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/ОбщегоНазначенияВызовСервераПереопределяемый.mdo b/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/ОбщегоНазначенияВызовСервераПереопределяемый.mdo deleted file mode 100644 index a9ff7f2d8..000000000 --- a/SSL/src/CommonModules/ОбщегоНазначенияВызовСервераПереопределяемый/ОбщегоНазначенияВызовСервераПереопределяемый.mdo +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3a46c243-bdf5-4429-895a-edeae1c0396e"> - <name>ОбщегоНазначенияВызовСервераПереопределяемый</name> - <synonym> - <key>ru</key> - <value>Общего назначения вызов сервера переопределяемый</value> - </synonym> - <server>true</server> - <externalConnection>true</externalConnection> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl new file mode 100644 index 000000000..2b6f7b696 --- /dev/null +++ b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/Module.bsl @@ -0,0 +1,23 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Задает вопрос о продолжении действия, влекущего к потере изменений. +// +Процедура ПодтвердитьЗакрытиеФормыСейчас() Экспорт + + ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеФормы(); + +КонецПроцедуры + +// Задает вопрос о продолжении действия, ведущего к закрытию формы. +// +Процедура ПодтвердитьЗакрытиеПроизвольнойФормыСейчас() Экспорт + + ОбщегоНазначенияКлиент.ПодтвердитьЗакрытиеПроизвольнойФормы(); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/ОбщегоНазначенияГлобальный.mdo similarity index 56% rename from SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo rename to SSL/src/CommonModules/ОбщегоНазначенияГлобальный/ОбщегоНазначенияГлобальный.mdo index 744e8e68b..5e162dd9c 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/РегламентныеЗаданияКлиент.mdo +++ b/SSL/src/CommonModules/ОбщегоНазначенияГлобальный/ОбщегоНазначенияГлобальный.mdo @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="aa368dd9-86e1-46f9-a296-591c3639734d"> - <name>РегламентныеЗаданияКлиент</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2e4da82c-dddb-4462-b34f-6511cd2a8356"> + <name>ОбщегоНазначенияГлобальный</name> <synonym> <key>ru</key> - <value>Регламентные задания клиент</value> + <value>Общего назначения глобальный</value> </synonym> + <global>true</global> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> </mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl index d8d390c3c..9986471fa 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиент/Module.bsl @@ -51,7 +51,7 @@ КонецЕсли; Если НЕ Результат Тогда - Предупреждение(НСтр("ru = 'Команда не может быть выполнена для указанного объекта.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Действие не может быть выполнено для выбранного элемента.'")); КонецЕсли; Возврат Результат; @@ -71,6 +71,394 @@ Возврат ТекущаяДата() + СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПоправкаКВремениСеанса; КонецФункции +// Предлагает пользователю установить расширение работы с файлами в веб-клиенте. +// При этом инициализирует параметр сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. +// +// Предназначена для использования в начале участков кода, в которых ведется работа с файлами. +// Например: +// +// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); +// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'"); +// ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстСообщения); +// +// Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт +// Если ПодключитьРасширениеРаботыСФайлами() Тогда +// // код печати документа, рассчитывающий на то, что расширение подключено +// //... +// Иначе +// // код печати документа, который работает без подключенного расширения +// //... +// КонецЕсли; +// +// Параметры: +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, +// которая будет вызвана после закрытия формы со следующими параметрами: +// Результат - Булево. Истина - подключено. +// ДополнительныеПараметры - Произвольный. +// ТекстПредложения - Строка - текст сообщения. Если не указан, то выводится текст по умолчанию. +// ВозможноПродолжениеБезУстановки - Булево. Если Истина, будет показана кнопка ПродолжитьБезУстановки, +// если Ложь, будет показана кнопка Отмена. +// +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещенияОЗакрытии, ТекстПредложения = "", ВозможноПродолжениеБезУстановки = Истина) Экспорт + + Оповещение = Новый ОписаниеОповещения("ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение", ЭтотОбъект, ОписаниеОповещенияОЗакрытии); +#Если Не ВебКлиент Тогда + // В тонком и толстом клиентах расширение подключено всегда. + ВыполнитьОбработкуОповещения(Оповещение); + Возврат; +#КонецЕсли + + // Если расширение и так уже подключено, незачем про него спрашивать. + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + ВыполнитьОбработкуОповещения(Оповещение); + Возврат; + КонецЕсли; + + ПервоеОбращениеЗаСеанс = (ПредлагатьУстановкуРасширенияРаботыСФайлами = Неопределено); + Если ПервоеОбращениеЗаСеанс Тогда + ПредлагатьУстановкуРасширенияРаботыСФайлами = ПредлагатьУстановкуРасширенияРаботыСФайлами(); + КонецЕсли; + + Если ВозможноПродолжениеБезУстановки И Не ПредлагатьУстановкуРасширенияРаботыСФайлами Тогда + ВыполнитьОбработкуОповещения(Оповещение); + Возврат; + КонецЕсли; + + Если НЕ ВозможноПродолжениеБезУстановки ИЛИ ПервоеОбращениеЗаСеанс Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстПредложения", ТекстПредложения); + ПараметрыФормы.Вставить("ВозможноПродолжениеБезУстановки", ВозможноПродолжениеБезУстановки); + ОткрытьФорму("ОбщаяФорма.ВопросОбУстановкеРасширенияРаботыСФайлами", ПараметрыФормы,,,,,Оповещение); + Иначе + ВыполнитьОбработкуОповещения(Оповещение); + КонецЕсли; + +КонецПроцедуры + +// Предлагает пользователю подключить расширение работы с файлами в веб-клиенте, +// и в случае отказа выдает предупреждение о невозможности продолжения операции. +// +// Предназначена для использования в начале участков кода, в которых ведется работа с файлами +// только при подключенном расширении. +// Например: +// +// Оповещение = Новый ОписаниеОповещения("ПечатьДокументаЗавершение", ЭтотОбъект); +// ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение работы с файлами.'"); +// ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстСообщения); +// +// Процедура ПечатьДокументаЗавершение(Результат, ДополнительныеПараметры) Экспорт +// // код печати документа, рассчитывающий на то, что расширение подключено +// //... +// +// Параметры +// ОписаниеОповещенияОЗакрытии - ОписаниеОповещения - описание процедуры, которая будет вызвана, если расширение подключено со следующими параметрами: +// Результат - Булево - всегда Истина +// ДополнительныеПараметры - Неопределено +// ТекстПредложения - Строка - текст с предложением подключить расширение работы с файлами. +// Если не указан, то выводится текст по умолчанию. +// ТекстПредупреждения - Строка - текст предупреждения о невозможности продолжения операции. +// Если не указан, то выводится текст по умолчанию. +// +// Возвращаемое значение: +// Булево - Истина, если расширение подключено. +// +Процедура ПроверитьРасширениеРаботыСФайламиПодключено(ОписаниеОповещенияОЗакрытии, Знач ТекстПредложения = "", + Знач ТекстПредупреждения = "") Экспорт + + Параметры = Новый Структура("ОписаниеОповещенияОЗакрытии,ТекстПредупреждения", + ОписаниеОповещенияОЗакрытии, ТекстПредупреждения, ); + Оповещение = Новый ОписаниеОповещения("РасширениеРаботыСФайламиПодключеноЗавершение", ЭтотОбъект, Параметры); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Оповещение, ТекстПредложения); + +КонецПроцедуры + +// Возвращает пользовательскую настройку "Предлагать установку расширения работы с файлами". +// +// Возвращаемое значение: +// Булево +// +Функция ПредлагатьУстановкуРасширенияРаботыСФайлами() Экспорт + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + Возврат ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить( + "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, Истина); + +КонецФункции + +// Выполняет регистрацию компоненты "comcntr.dll" для текущей версии платформы. +// В случае успешной регистрации, предлагает пользователю перезапустить клиентский сеанс +// для того чтобы регистрация вступила в силу. +// +// Вызывается перед клиентским кодом, который использует менеджер COM-соединений (V83.COMConnector) +// и инициируется интерактивными действиями пользователя. Например: +// +// ЗарегистрироватьCOMСоединитель(); +// // далее идет код, использующий менеджер COM-соединений (V83.COMConnector) +// // ... +// +Процедура ЗарегистрироватьCOMСоединитель(Знач ВыполнитьПерезагрузкуСеанса = Истина) Экспорт + +#Если Не ВебКлиент Тогда + + ТекстКоманды = "regsvr32.exe /n /i:user /s comcntr.dll"; + + КодВозврата = Неопределено; + ЗапуститьПриложение(ТекстКоманды, КаталогПрограммы(), Истина, КодВозврата); + + Если КодВозврата = Неопределено Или КодВозврата > 0 Тогда + + ТекстСообщения = НСтр("ru = 'Ошибка при регистрации компоненты comcntr.'") + Символы.ПС + + НСтр("ru = 'Код ошибки regsvr32:'") + " " + КодВозврата; + + Если КодВозврата = 5 Тогда + ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Недостаточно прав доступа.'"); + КонецЕсли; + + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( + НСтр("ru = 'Регистрация компоненты comcntr'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), "Ошибка", ТекстСообщения); + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ПоказатьПредупреждение(,ТекстСообщения + Символы.ПС + НСтр("ru = 'Подробности см. в Журнале регистрации.'")); + ИначеЕсли ВыполнитьПерезагрузкуСеанса Тогда + Оповещение = Новый ОписаниеОповещения("ЗарегистрироватьCOMСоединительЗавершение", ЭтотОбъект); + ТекстВопроса = НСтр("ru = 'Для завершения перерегистрации компоненты comcntr необходимо перезапустить программу. + |Перезапустить сейчас?'"); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + КонецЕсли; + +#Иначе + + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Нстр("ru = 'Операция недоступна. Необходимо запустить программу в тонком клиенте на компьютере с ОС Windows.'")); + +#КонецЕсли + +КонецПроцедуры + +// Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. +// +Функция КлиентПодключенЧерезВебСервер() Экспорт + + Возврат Найти(Врег(СтрокаСоединенияИнформационнойБазы()), "WS=") = 1; + +КонецФункции + +// Задает вопрос о продолжении действия, влекущего к потере изменений. +// Для использования в обработчиках события ПередЗакрытием модулей форм. +// +// Параметры: +// ОповещениеСохранитьИЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку OK. +// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия. +// ТекстПредупреждения - Строка - переопределяемый текст предупреждения, выводимый пользователю. +// +// Пример: +// Оповещение = Новый ОписаниеОповещения("ВыбратьИЗакрыть", ЭтотОбъект); +// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); +// +// &НаКлиенте +// Процедура ВыбратьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт +// // записываем данные формы +// // ... +// Модифицированность = Ложь; // не выводить подтверждение о закрытии формы еще раз +// Закрыть(<РезультатВыбораВФорме>); +// КонецПроцедуры +// +Процедура ПоказатьПодтверждениеЗакрытияФормы(ОповещениеСохранитьИЗакрыть, Отказ, ТекстПредупреждения = "") Экспорт + + Форма = ОповещениеСохранитьИЗакрыть.Модуль; + Если Не Форма.Модифицированность Тогда + Возврат; + КонецЕсли; + + Отказ = Истина; + + Параметры = Новый Структура(); + Параметры.Вставить("ОповещениеСохранитьИЗакрыть", ОповещениеСохранитьИЗакрыть); + Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения); + ПараметрыПодтвержденияЗакрытияФормы = Параметры; + + ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеФормыСейчас", 0.1, Истина); + +КонецПроцедуры + +// Задает вопрос о продолжении действия, ведущего к закрытию формы. +// Для использования в обработчиках события ПередЗакрытием модулей форм. +// +// Параметры: +// Форма - УправляемаяФорма - форма, которая вызывает диалог предупреждения. +// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия. +// ТекстПредупреждения - Строка - текст предупреждения, выводимый пользователю. +// ИмяРеквизитаЗакрытьФормуБезПодтверждения - Строка - имя реквизита, содержащего в себе признак того, нужно +// выводить предупреждение или нет. +// ОписаниеОповещенияЗакрыть - ОписаниеОповещения - содержит имя процедуры, вызываемой при нажатии на кнопку да. +// +// Пример: +// ТекстПредупреждения = НСтр("ru = 'Закрыть помощник?'"); +// ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы( +// ЭтотОбъект, Отказ, ТекстПредупреждения, "ЗакрытьФормуБезПодтверждения"); +// +Процедура ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(Форма, Отказ, ТекстПредупреждения, + ИмяРеквизитаЗакрытьФормуБезПодтверждения, ОписаниеОповещенияЗакрыть = Неопределено) Экспорт + + Если Форма[ИмяРеквизитаЗакрытьФормуБезПодтверждения] Тогда + Возврат; + КонецЕсли; + + Отказ = Истина; + + Параметры = Новый Структура(); + Параметры.Вставить("Форма", Форма); + Параметры.Вставить("ТекстПредупреждения", ТекстПредупреждения); + Параметры.Вставить("ИмяРеквизитаЗакрытьФормуБезПодтверждения", ИмяРеквизитаЗакрытьФормуБезПодтверждения); + Параметры.Вставить("ОписаниеОповещенияЗакрыть", ОписаниеОповещенияЗакрыть); + ПараметрыПодтвержденияЗакрытияФормы = Параметры; + + ПодключитьОбработчикОжидания("ПодтвердитьЗакрытиеПроизвольнойФормыСейчас", 0.1, Истина); + +КонецПроцедуры + +// Функция получает цвет стиля по имени элемента стиля +// +// Параметры: +// ИмяЦветаСтиля - строка с именем элемента +// +// Возвращаемое значение - цвет стиля +// +Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт + + Возврат ОбщегоНазначенияКлиентПовтИсп.ЦветСтиля(ИмяЦветаСтиля); + +КонецФункции + +// Функция получает шрифт стиля по имени элемента стиля +// +// Параметры: +// ИмяШрифтаСтиля - строка с именем элемента +// +// Возвращаемое значение - шрифт стиля +// +Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт + + Возврат ОбщегоНазначенияКлиентПовтИсп.ШрифтСтиля(ИмяШрифтаСтиля); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для обработки событий и вызова необязательных подсистем. + +// Возвращает Истина, если подсистема существует в конфигурации. +// +// Параметры: +// ПолноеИмяПодсистемы - Строка. Полное имя объекта метаданных подсистема без слов "Подсистема.". +// Например: "СтандартныеПодсистемы.БазоваяФункциональность". +// +// Пример вызова необязательной подсистемы: +// +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда +// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); +// МодульУправлениеДоступом.<Имя метода>(); +// КонецЕсли; +// +// Возвращаемое значение: +// Булево. +// +Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт + + ИменаПодсистем = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ИменаПодсистем; + Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; + +КонецФункции + +// Возвращает ссылку на общий модуль по имени. +// +// Параметры: +// Имя - Строка - имя общего модуля, например: +// "ОбщегоНазначения", +// "ОбщегоНазначенияКлиент". +// +// Возвращаемое значение: +// ОбщийМодуль. +// +Функция ОбщийМодуль(Имя) Экспорт + + Модуль = Вычислить(Имя); + +#Если НЕ ВебКлиент Тогда + ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Модуль) = Тип("ОбщийМодуль"), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя)); +#КонецЕсли + + Возврат Модуль; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Функции для обработки действий пользователя в процессе редактирования +// многострочного текста, например комментария в документах. + +// Открывает форму редактирования произвольного многострочного текста. +// +// Параметры: +// ОповещениеОЗакрытии - ОписаниеОповещения - содержит описание процедуры, которая будет вызвана +// после закрытия формы ввода текста с теми же параметрами, что и для метода ПоказатьВводСтроки. +// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать; +// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы. +// +// Пример: +// +// Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект); +// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, Элемент.ТекстРедактирования); +// +// &НаКлиенте +// Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт +// Если ВведенныйТекст = Неопределено Тогда +// Возврат; +// КонецЕсли; +// +// Объект.МногострочныйКомментарий = ВведенныйТекст; +// Модифицированность = Истина; +// КонецПроцедуры +// +Процедура ПоказатьФормуРедактированияМногострочногоТекста(Знач ОповещениеОЗакрытии, + Знач МногострочныйТекст, Знач Заголовок = Неопределено) Экспорт + + Если Заголовок = Неопределено Тогда + ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст,,, Истина); + Иначе + ПоказатьВводСтроки(ОповещениеОЗакрытии, МногострочныйТекст, Заголовок,, Истина); + КонецЕсли; + +КонецПроцедуры + +// Открывает форму редактирования многострочного комментария. +// +// Параметры: +// МногострочныйТекст - Строка - произвольный текст, который необходимо отредактировать +// ФормаВладелец - УправляемаяФорма - форма, в поле которой выполняется ввод комментария +// ИмяРеквизита - Строка - имя реквизита формы, в который будет помещен введенный пользователем комментарий. +// Заголовок - Строка - текст, который необходимо отобразить в заголовке формы. +// По умолчанию: "Комментарий". +// +// Пример использования: +// +// ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Объект.Комментарий"); +// +Процедура ПоказатьФормуРедактированияКомментария(Знач МногострочныйТекст, Знач ФормаВладелец, Знач ИмяРеквизита, + Знач Заголовок = Неопределено) Экспорт + + ДополнительныеПараметры = Новый Структура("ФормаВладелец,ИмяРеквизита", ФормаВладелец, ИмяРеквизита); + Оповещение = Новый ОписаниеОповещения("КомментарийЗавершениеВвода", ЭтотОбъект, ДополнительныеПараметры); + ЗаголовокФормы = ?(Заголовок <> Неопределено, Заголовок, НСтр("ru='Комментарий'")); + ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, МногострочныйТекст, ЗаголовокФормы); + +КонецПроцедуры + +// ИспользованиеМодальности + +//////////////////////////////////////////////////////////////////////////////// +// Устаревшие процедуры и функции, использующие модальные окна. + +// Устарела. Следует использовать ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами. // Предлагает пользователю установить расширение работы с файлами в веб-клиенте. // При этом инициализирует параметр сеанса ПредлагатьУстановкуРасширенияРаботыСФайлами. // @@ -98,10 +486,6 @@ Возврат "Подключено"; // если расширение и так уже есть, незачем про него спрашивать КонецЕсли; - Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентБезПоддержкиРасширенияРаботыСФайлами() Тогда - Возврат "НеподдерживаемыйВебКлиент"; - КонецЕсли; - СистемнаяИнформация = Новый СистемнаяИнформация(); ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; @@ -145,6 +529,7 @@ КонецФункции +// Устарела. Следует использовать ПроверитьРасширениеРаботыСФайламиПодключено. // Предлагает пользователю подключить расширение работы с файлами в веб-клиенте, // и в случае отказа выдает предупреждение о невозможности продолжения операции. // @@ -177,63 +562,44 @@ Иначе ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не подключено расширение работы с файлами в Веб-клиенте.'") КонецЕсли; - ИначеЕсли Результат = "НеподдерживаемыйВебКлиент" Тогда - ТекстСообщения = НСтр("ru = 'Действие недоступно в используемом Веб-клиенте, так как для него не может быть подключено расширение работы с файлами.'"); КонецЕсли; Если Не ПустаяСтрока(ТекстСообщения) Тогда - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(,ТекстСообщения); КонецЕсли; Возврат Результат = "Подключено"; КонецФункции -// Выполняет регистрацию компоненты "comcntr.dll" для текущей версии платформы. -// В случае успешной регистрации, предлагает пользователю перезапустить клиентский сеанс -// для того чтобы регистрация вступила в силу. +// Устарела. Следует использовать ПоказатьПодтверждениеЗакрытияФормы или ПоказатьПодтверждениеЗакрытияПроизвольнойФормы. +// Задает вопрос о продолжении действия, влекущего к потере изменений. // -// Вызывается перед клиентским кодом, который использует менеджер COM-соединений (V82.COMConnector) -// и инициируется интерактивными действиями пользователя. Например: -// -// ЗарегистрироватьCOMСоединитель(); -// // далее идет код, использующий менеджер COM-соединений (V82.COMConnector) -// // ... +// Параметры: +// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия; +// Модифицированность - Булево - признак модифицированности формы, из которой вызывается данная процедура; +// ДействиеВыбрано - Булево - признак выбора пользователем действия, приводящего к закрытию формы; +// ТекстПредупреждения - Строка - текст диалога с пользователем. // -Процедура ЗарегистрироватьCOMСоединитель(ВыполнитьПерезагрузкуСеанса = Истина) Экспорт +Процедура ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность = Истина, ДействиеВыбрано = Ложь, ТекстПредупреждения = "") Экспорт - #Если НЕ ВебКлиент Тогда - - ТекстКоманды = "regsvr32.exe /n /i:user /s comcntr.dll"; + Если ДействиеВыбрано = Истина Или Не Модифицированность Тогда + Возврат; + КонецЕсли; + + ТекстВопроса = ?(ПустаяСтрока(ТекстПредупреждения), + НСтр("ru = 'Данные были изменены, внесенные изменения будут отменены. + |Отменить и закрыть?'"), + ТекстПредупреждения); + Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, + НСтр("ru = 'Отмена изменений'")); - КодВозврата = Неопределено; - ЗапуститьПриложение(ТекстКоманды, КаталогПрограммы(), Истина, КодВозврата); - - Если КодВозврата = Неопределено Или КодВозврата > 0 Тогда - - ТекстСообщения = НСтр("ru = 'Ошибка при регистрации компоненты comcntr.'") + Символы.ПС - + НСтр("ru = 'Код ошибки regsvr32:'") + " " + КодВозврата; - - Если КодВозврата = 5 Тогда - ТекстСообщения = ТекстСообщения + " " + НСтр("ru = 'Недостаточно прав доступа.'"); - КонецЕсли; - - ДобавитьСообщениеДляЖурналаРегистрации( - НСтр("ru = 'Регистрация компоненты comcntr'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), "Ошибка", ТекстСообщения); - ОбщегоНазначенияВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); - Предупреждение(ТекстСообщения + Символы.ПС + НСтр("ru = 'Подробности см. в Журнале регистрации.'")); - ИначеЕсли ВыполнитьПерезагрузкуСеанса Тогда - Ответ = Вопрос(НСтр("ru = 'Для завершения перерегистрации компоненты comcntr необходимо перезапустить сеанс 1С:Предприятия. - |Перезапустить сейчас?'"), РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Да Тогда - ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - ЗавершитьРаботуСистемы(Истина, Истина); - КонецЕсли; - КонецЕсли; - - #КонецЕсли - + Если Результат = КодВозвратаДиалога.Нет Тогда + Отказ = Истина; + КонецЕсли; + КонецПроцедуры -// Процедура позволяет выбрать время из выпадающего списка. +// Позволяет выбрать время из выпадающего списка. +// // Параметры: // Форма - управляемая форма / форма - форма, на которой располагается элемент, // для которого будет выбираться время @@ -242,6 +608,9 @@ // ТекущееЗначение - Дата - значение, на которое будет спозиционирован выпадающий список // Интервал - число - интервал времени (в секундах), с которым необходимо заполнить список, по умолчанию час // +// Возвращаемое значение: +// Число - значение времени в секундах. Либо Неопределено, если пользователь отказался от выбора. +// Функция ВыбратьВремя(Форма, ПолеВводаФормы, Знач ТекущееЗначение, Интервал = 3600) Экспорт НачалоРабочегоДня = '00010101000000'; @@ -287,173 +656,7 @@ КонецФункции -// Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. -// -Функция КлиентПодключенЧерезВебСервер() Экспорт - - Возврат Найти(Врег(СтрокаСоединенияИнформационнойБазы()), "WS=") = 1; - -КонецФункции - -// Задает вопрос о продолжении действия, влекущего к потере изменений. -// -// Параметры: -// Отказ - Булево - возвращаемый параметр, признак отказа от выполняемого действия; -// Модифицированность - Булево - признак модифицированности формы, из которой вызывается данная процедура; -// ДействиеВыбрано - Булево - признак выбора пользователем действия, приводящего к закрытию формы; -// ТекстПредупреждения - Строка - текст диалога с пользователем. -// -Процедура ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность = Истина, ДействиеВыбрано = Ложь, ТекстПредупреждения = "") Экспорт - - Если ДействиеВыбрано = Истина Или Не Модифицированность Тогда - Возврат; - КонецЕсли; - - ТекстВопроса = ?(ПустаяСтрока(ТекстПредупреждения), - НСтр("ru = 'Данные были изменены, внесенные изменения будут отменены. - |Отменить и закрыть?'"), - ТекстПредупреждения); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, - НСтр("ru = 'Отмена изменений'")); - - Если Результат = КодВозвратаДиалога.Нет Тогда - Отказ = Истина; - КонецЕсли; - -КонецПроцедуры - -// Функция получает цвет стиля по имени элемента стиля -// -// Параметры: -// ИмяЦветаСтиля - строка с именем элемента -// -// Возвращаемое значение - цвет стиля -// -Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт - - Возврат ОбщегоНазначенияПовтИсп.ЦветСтиля(ИмяЦветаСтиля); - -КонецФункции - -// Функция получает шрифт стиля по имени элемента стиля -// -// Параметры: -// ИмяШрифтаСтиля - строка с именем элемента -// -// Возвращаемое значение - шрифт стиля -// -Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт - - Возврат ОбщегоНазначенияПовтИсп.ШрифтСтиля(ИмяШрифтаСтиля); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Функции для работы с журналом регистрации - -// Записывает очередное сообщение в глобальный массив сообщений. -// -// Параметры : -// ИмяСобытия - Строка - имя события для журнала регистрации; -// ПредставлениеУровня - Строка - описание уровня события, по нему будет определен уровень события при записи на сервере; -// ОбъектМетаданных - ОбъектМетаданных - подробнее см. синтакс-помощник по "ЗаписьЖурналаРегистрации"; -// Данные - Произвольный - данные, с которыми связано событие (например, ссылки на объект); -// Комментарий - Строка - комментарий для события журнала; -// ПредставлениеРежима - Строка - представление режима транзакции для данного события; -// ДатаСобытия - Дата - точная дата возникновения события, описанного в сообщении. Будет добавлена в начало комментария; -// ЗаписатьСобытия - Булево - признак вызова процедуры непосредственной записи накопленных сообщений после добавления. -// -Процедура ДобавитьСообщениеДляЖурналаРегистрации(Знач ИмяСобытия, Знач ПредставлениеУровня = "Информация", - Знач Комментарий = "", Знач ДатаСобытия = "", Знач ЗаписатьСобытия = Ложь) Экспорт - - // В случае необходимости выполним инициализацию глобального списка сообщений для журнала регистрации. - Если СообщенияДляЖурналаРегистрации = Неопределено Тогда - СообщенияДляЖурналаРегистрации = Новый СписокЗначений; - КонецЕсли; - - Если ТипЗнч(ДатаСобытия) = Тип("Дата") Тогда - ДатаСобытия = Формат(ДатаСобытия, "ДЛФ=DT"); - КонецЕсли; - - СтруктураСообщения = Новый Структура("ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия", - ИмяСобытия, ПредставлениеУровня, Комментарий, ДатаСобытия); - - СообщенияДляЖурналаРегистрации.Добавить(СтруктураСообщения); - - Если ЗаписатьСобытия Тогда - ОбщегоНазначенияВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); - КонецЕсли; - -КонецПроцедуры - -// Проверяет текущий вариант использования журнала регистрации. -// Если регистрация изменений отключена - то предлагает полностью включить его. -// -// Параметры: -// СписокПроверок - СписокЗначений - список строковых представлений режимов журнала регистрации, которые необходимо проверить на включение. -// СпрашиватьОРегистрации - Булево - признак, отвечающий за вопрос о включении журнала в необходимых режимах. -// СообщениеОНеобходимостиВключенияЖурнала - Строка - сообщение, которое будет выведено пользователю в случае, когда проверка не прошла, и надо включить журнале регистрации. -// -Процедура ПроверитьВключениеЖурналаРегистрации(СписокПроверок = Неопределено, - СпрашиватьОРегистрации = Истина, СообщениеОНеобходимостиВключенияЖурнала = "") Экспорт - - // регистрация данных видов событий уже включена - Если ОбщегоНазначенияВызовСервера.ПроверитьВключениеЖурналаРегистрации(СписокПроверок) Тогда - Возврат; - КонецЕсли; - - Если СпрашиватьОРегистрации Тогда - - Если Не ПустаяСтрока(СообщениеОНеобходимостиВключенияЖурнала) Тогда // если было передано произвольное сообщение, тогда выведем его - ТекстВопроса = СообщениеОНеобходимостиВключенияЖурнала; - Иначе - - Если СписокПроверок = Неопределено Тогда - ТекстВопроса = НСтр("ru = 'Для продолжения рекомендуется включить использование Журнала регистрации. - |В противном случае, запись событий в Журнал регистрации не будет произведена. - |Включить сейчас?'"); - Иначе - ТекстВопроса = НСтр("ru = 'Для продолжения рекомендуется включить регистрацию событий %1 в Журнале регистрации. - |В противном случае, записи событий в Журнал регистрации будут неполными. - |Включить сейчас?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, СписокПроверок); - КонецЕсли; - КонецЕсли; - - Режим = РежимДиалогаВопрос.ДаНет; - Умолчание = КодВозвратаДиалога.Да; - Заголовок = НСтр("ru = 'Журнал регистрации'"); - КодВозврата = Вопрос(ТекстВопроса, Режим, , Умолчание, Заголовок); - Иначе - КодВозврата = КодВозвратаДиалога.Да; - КонецЕсли; - - - Если КодВозврата = КодВозвратаДиалога.Да Тогда - Попытка - ОбщегоНазначенияВызовСервера.ВключитьИспользованиеЖурналаРегистрации(СписокПроверок); - Текст = НСтр("ru = 'Настройка изменена'"); - Пояснение = НСтр("ru = 'Регистрация событий в журнале регистрации обновлена'"); - ПоказатьОповещениеПользователя(Текст,,Пояснение); - Исключение - - ИмяСобытия = НСтр("ru = 'Настройка журнала регистрации'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); - ПредставлениеУровня = "Ошибка"; - Комментарий = НСтр("ru = 'Невозможно установить монопольный доступ. Настройка журнала регистрации не изменена'"); - ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия, ПредставлениеУровня, Комментарий,, Истина); - - ОткрытьФорму("ОбщаяФорма.ВключениеЖурналаРегистрации",Новый Структура("СписокПроверок",СписокПроверок)); - - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Функции для обработки действий пользователя в процессе редактирования -// многострочного текста, например комментария в документах. - +// Устарела. Следует использовать ПоказатьФормуРедактированияМногострочногоТекста. // Открывает форму редактирования произвольного многострочного текста модально. // // Параметры: @@ -482,6 +685,7 @@ КонецПроцедуры +// Устарела. Следует использовать ПоказатьФормуРедактированияКомментария. // Открывает форму редактирования многострочного комментария модально. // // Параметры: @@ -500,6 +704,8 @@ КонецПроцедуры +// Конец ИспользованиеМодальности + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -525,7 +731,7 @@ Обработчики = СтандартныеПодсистемыКлиентПовтИсп.ОбработчикиКлиентскогоСобытия(Событие, Ложь); Для каждого Обработчик Из Обработчики Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщийМодуль(Обработчик.Модуль); Элемент = Новый Структура; Элемент.Вставить("Модуль", Модуль); @@ -558,7 +764,7 @@ Обработчики = СтандартныеПодсистемыКлиентПовтИсп.ОбработчикиКлиентскогоСобытия(Событие, Истина); Для каждого Обработчик Из Обработчики Цикл - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщийМодуль(Обработчик.Модуль); Элемент = Новый Структура; Элемент.Вставить("Модуль", Модуль); @@ -572,3 +778,137 @@ Возврат Новый ФиксированныйМассив(Массив); КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайламиЗавершение(Действие, ОповещениеОЗакрытии) Экспорт + +#Если ВебКлиент Тогда + Если Действие = "БольшеНеПредлагать" Тогда + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + ПредлагатьУстановкуРасширенияРаботыСФайлами = Ложь; + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить( + "НастройкиПрограммы/ПредлагатьУстановкуРасширенияРаботыСФайлами", ИдентификаторКлиента, + ПредлагатьУстановкуРасширенияРаботыСФайлами); + КонецЕсли; +#КонецЕсли + + ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, ПодключитьРасширениеРаботыСФайлами()); + +КонецПроцедуры + +Процедура РасширениеРаботыСФайламиПодключеноЗавершение(Действие, Параметры) Экспорт + + ТекстСообщения = ""; + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияОЗакрытии); + Возврат; + КонецЕсли; + + Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда + ТекстСообщения = НСтр("ru = 'Действие недоступно, так как не установлено расширение работы с файлами.'") + Иначе + ТекстСообщения = Параметры.ТекстПредупреждения; + КонецЕсли; + ПоказатьПредупреждение(, ТекстСообщения); + +КонецПроцедуры + +Процедура КомментарийЗавершениеВвода(Знач ВведенныйТекст, Знач ДополнительныеПараметры) Экспорт + + Если ВведенныйТекст = Неопределено Тогда + Возврат; + КонецЕсли; + + РеквизитФормы = ДополнительныеПараметры.ФормаВладелец; + + ПутьКРеквизитуФормы = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДополнительныеПараметры.ИмяРеквизита, "."); + // Если реквизит вида "Объект.Комментарий" и т.п. + Если ПутьКРеквизитуФормы.Количество() > 1 Тогда + Для Индекс = 0 По ПутьКРеквизитуФормы.Количество() - 2 Цикл + РеквизитФормы = РеквизитФормы[ПутьКРеквизитуФормы[Индекс]]; + КонецЦикла; + КонецЕсли; + + РеквизитФормы[ПутьКРеквизитуФормы[ПутьКРеквизитуФормы.Количество() - 1]] = ВведенныйТекст; + ДополнительныеПараметры.ФормаВладелец.Модифицированность = Истина; + +КонецПроцедуры + +Процедура ЗарегистрироватьCOMСоединительЗавершение(Ответ, Параметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; + ЗавершитьРаботуСистемы(Истина, Истина); + КонецЕсли; + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеФормы() Экспорт + + Параметры = ПараметрыПодтвержденияЗакрытияФормы; + Если Параметры = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыПодтвержденияЗакрытияФормы = Неопределено; + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеФормыЗавершение", ЭтотОбъект, Параметры); + Если ПустаяСтрока(Параметры.ТекстПредупреждения) Тогда + ТекстВопроса = НСтр("ru = 'Данные были изменены. Сохранить изменения?'"); + Иначе + ТекстВопроса = Параметры.ТекстПредупреждения; + КонецЕсли; + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНетОтмена, , + КодВозвратаДиалога.Нет); + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеФормыЗавершение(Ответ, Параметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ВыполнитьОбработкуОповещения(Параметры.ОповещениеСохранитьИЗакрыть); + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда + Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; + Форма.Модифицированность = Ложь; + Форма.Закрыть(); + Иначе + Форма = Параметры.ОповещениеСохранитьИЗакрыть.Модуль; + Форма.Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеПроизвольнойФормы() Экспорт + + Параметры = ПараметрыПодтвержденияЗакрытияФормы; + Если Параметры = Неопределено Тогда + Возврат; + КонецЕсли; + ПараметрыПодтвержденияЗакрытияФормы = Неопределено; + РежимВопроса = РежимДиалогаВопрос.ДаНет; + + Оповещение = Новый ОписаниеОповещения("ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение", ЭтотОбъект, Параметры); + + ПоказатьВопрос(Оповещение, Параметры.ТекстПредупреждения, РежимВопроса); + +КонецПроцедуры + +Процедура ПодтвердитьЗакрытиеПроизвольнойФормыЗавершение(Ответ, Параметры) Экспорт + + Форма = Параметры.Форма; + Если Ответ = КодВозвратаДиалога.Да + Или Ответ = КодВозвратаДиалога.ОК Тогда + Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Истина; + Если Параметры.ОписаниеОповещенияЗакрыть <> Неопределено Тогда + ВыполнитьОбработкуОповещения(Параметры.ОписаниеОповещенияЗакрыть); + КонецЕсли; + Форма.Закрыть(); + Иначе + Форма[Параметры.ИмяРеквизитаЗакрытьФормуБезПодтверждения] = Ложь; + КонецЕсли; + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl index 8944946a6..77df5fd97 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПереопределяемый/Module.bsl @@ -8,29 +8,77 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Выполняется перед интерактивном началом работы пользователя с областью данных. -// Соответствует обработчику ПередНачаломРаботыСистемы +// Выполняется перед интерактивном началом работы пользователя с областью данных или в локальном режиме. +// +// Соответствует обработчику ПередНачаломРаботыСистемы. // // Параметры: -// Отказ - Булево - отказ в от начала работы. Если параметр установить в Истина, -// начало работы с областью осуществлено не будет. +// Параметры - Структура - структура со свойствами: +// Отказ - Булево - Возвращаемое значение. Если установить Истина, +// то работа программы будет прекращена. +// Перезапустить - Булево - Возвращаемое значение. Если установить Истина и параметр +// Отказ тоже установлен в Истина, то выполняется перезапуск программы. +// ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл +// когда Отказ и Перезапустить установлены Истина. +// ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, +// блокирующего вход в программу, следует присвоить в этот параметр +// описание обработчика оповещения, который открывает окно. +// См. пример ниже. +// ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход +// в программу, то в обработке закрытия этого окна необходимо +// выполнить оповещение ОбработкаПродолжения. +// См. пример ниже. // -Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт +// Пример открытия окна, блокирующего вход в программу: +// +// Если ОткрытьОкноПриЗапуске Тогда +// Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения("ОткрытьОкно", ЭтотОбъект); +// КонецЕсли; +// +// Процедура ОткрытьОкно(Параметры, ДополнительныеПараметры) Экспорт +// // Показываем окно, по закрытию которого вызывается обработчик оповещения ОткрытьОкноЗавершение +// Оповещение = Новый ОписаниеОповещения("ОткрытьОкноЗавершение", ЭтотОбъект, Параметры); +// ОткрытьФорму(... +// +// КонецПроцедуры +// +// Процедура ОткрытьОкноЗавершение(Результат, Параметры) Экспорт +// ... +// ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); +// +// КонецПроцедуры +// +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + КонецПроцедуры -// Выполняется при интерактивном начале работы пользователя с областью данных. -// Соответствует обработчику ПриНачалеРаботыСистемы +// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. // -// Параметры -// ОбрабатыватьПараметрыЗапуска - Булево - Истина, если обработчик вызван при -// непосредственном входе пользователя в систему и должен обработать параметры -// запуска (если это предусмотрено его логикой). Иначе обработчика вызван -// при интерактивном входе неразделенного пользователя в область данных и -// обрабатывать параметры запуска не следует. +// Соответствует обработчику ПриНачалеРаботыСистемы. // -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +// Параметры: +// Параметры - Структура - структура со свойствами: +// Отказ - Булево - Возвращаемое значение. Если установить Истина, +// то работа программы будет прекращена. +// Перезапустить - Булево - Возвращаемое значение. Если установить Истина и параметр +// Отказ тоже установлен в Истина, то выполняется перезапуск программы. +// ДополнительныеПараметрыКоманднойСтроки - Строка - Возвращаемое значение. Имеет смысл +// когда Отказ и Перезапустить установлены Истина. +// ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, +// блокирующего вход в программу, следует присвоить в этот параметр +// описание обработчика оповещения, который открывает окно. +// См. пример выше (для обработчика ПередНачаломРаботыСистемы). +// ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее вход +// в программу, то в обработке закрытия этого окна необходимо +// выполнить оповещение ОбработкаПродолжения. +// См. пример выше (для обработчика ПередНачаломРаботыСистемы). +// +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт + + КонецПроцедуры // Обработать параметры запуска программы. @@ -51,8 +99,47 @@ КонецФункции +// Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. +// Вызывается после завершения действий ПриНачалеРаботыСистемы. +// Используется для подключения обработчиков ожидания, которые не должны вызываться +// в случае интерактивных действий перед и при начале работы системы. +// +// Интерактивные взаимодействия с пользователем запрещены. +// +Процедура ПослеНачалаРаботыСистемы() Экспорт + +КонецПроцедуры + +// Выполняется перед интерактивном завершении работы пользователя с областью данных или в локальном режиме. +// // Соответствует обработчику ПередЗавершениемРаботыСистемы. // -Процедура ПередЗавершениемРаботыСистемы(Отказ) Экспорт +// Параметры: +// Параметры - Структура - структура со свойствами: +// Отказ - Булево - Возвращаемое значение. Если установить Истина, +// то завершение работы программы будет отменено. +// ИнтерактивнаяОбработка - ОписаниеОповещения - Возвращаемое значение. Для открытия окна, +// блокирующего выход из программы, следует присвоить в этот параметр +// описание обработчика оповещения, который открывает окно. +// См. пример выше (для обработчика ПередНачаломРаботыСистемы). +// ОбработкаПродолжения - ОписаниеОповещения - если открывается окно, блокирующее выход +// из программы, то в обработке закрытия этого окна необходимо +// выполнить оповещение ОбработкаПродолжения. +// См. пример выше (для обработчика ПередНачаломРаботыСистемы). +// +Процедура ПередЗавершениемРаботыСистемы(Параметры) Экспорт -КонецПроцедуры \ No newline at end of file + + +КонецПроцедуры + +// Переопределяет заголовок приложения. +// +// Параметры: +// ЗаголовокПриложения - Строка - текст заголовка приложения; +// ПриЗапуске - Булево - Истина, если вызывается при начале работы программы. +Процедура ПриУстановкеЗаголовкаКлиентскогоПриложения(ЗаголовокПриложения, ПриЗапуске) Экспорт + +КонецПроцедуры + + diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl index aa8b6f2e6..72a210026 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентПовтИсп/Module.bsl @@ -7,31 +7,6 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Возвращает Истина, если этот веб клиент не поддерживает расширение работы с файлами. -Функция ЭтоВебКлиентБезПоддержкиРасширенияРаботыСФайлами() Экспорт - - #Если Не ВебКлиент Тогда - Возврат Ложь; - #КонецЕсли - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83() Тогда - Возврат Ложь; - КонецЕсли; - - СистемнаяИнфо = Новый СистемнаяИнформация; - - Если Найти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Safari") <> 0 Тогда - Возврат Истина; - КонецЕсли; - - Если Найти(СистемнаяИнфо.ИнформацияПрограммыПросмотра, "Chrome") <> 0 Тогда - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - // Возвращает Истина, если это веб клиент в Mac OS. Функция ЭтоВебКлиентПодMacOS() Экспорт @@ -54,6 +29,9 @@ Возврат СистемнаяИнфо.ТипПлатформы; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + // Функция получает цвет стиля по имени элемента стиля // // Параметры: diff --git a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl index db1399667..5614a9415 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияКлиентСервер/Module.bsl @@ -119,7 +119,11 @@ // ТекстДляНесколькихОшибок - Строка - текст ошибки для случая, когда добавлено несколько ошибок с одинаковым // свойством ГруппаОшибок, например, НСтр("ru = 'Пользователь в строке %1 не выбран.'"). // -Процедура ДобавитьОшибкуПользователю(Ошибки, Знач ПолеОшибки, Знач ТекстДляОднойОшибки, Знач ГруппаОшибок = "", Знач НомерСтроки = 0, Знач ТекстДляНесколькихОшибок = "") Экспорт +// ИндексСтроки - Неопределено - совпадает со значением параметра НомерСтроки. +// Число - значение от 0 ... , определяющее номер строки, который нужно подставить +// в строку ПолеОшибки. +// +Процедура ДобавитьОшибкуПользователю(Ошибки, ПолеОшибки, ТекстДляОднойОшибки, ГруппаОшибок = "", НомерСтроки = 0, ТекстДляНесколькихОшибок = "", ИндексСтроки = Неопределено) Экспорт Если Ошибки = Неопределено Тогда Ошибки = Новый Структура; @@ -145,6 +149,7 @@ Ошибка.Вставить("ГруппаОшибок", ГруппаОшибок); Ошибка.Вставить("НомерСтроки", НомерСтроки); Ошибка.Вставить("ТекстДляНесколькихОшибок", ТекстДляНесколькихОшибок); + Ошибка.Вставить("ИндексСтроки", ИндексСтроки); Ошибки.СписокОшибок.Добавить(Ошибка); @@ -157,7 +162,7 @@ // значение, установленное при использовании процедуры ДобавитьОшибкуПользователю(). // Отказ - Булево, устанавливается Истина, если ошибки сообщались. // -Процедура СообщитьОшибкиПользователю(Знач Ошибки, Отказ = Ложь) Экспорт +Процедура СообщитьОшибкиПользователю(Ошибки, Отказ = Ложь) Экспорт Если Ошибки = Неопределено Тогда Возврат; @@ -167,17 +172,23 @@ Для каждого Ошибка Из Ошибки.СписокОшибок Цикл + Если Ошибка.ИндексСтроки = Неопределено Тогда + ИндексСтроки = Ошибка.НомерСтроки; + Иначе + ИндексСтроки = Ошибка.ИндексСтроки; + КонецЕсли; + Если Ошибки.ГруппыОшибок[Ошибка.ГруппаОшибок] <> Истина Тогда СообщитьПользователю( Ошибка.ТекстДляОднойОшибки, , - СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(Ошибка.НомерСтроки, "ЧН=0; ЧГ="))); + СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ="))); Иначе СообщитьПользователю( СтрЗаменить(Ошибка.ТекстДляНесколькихОшибок, "%1", Формат(Ошибка.НомерСтроки + 1, "ЧН=0; ЧГ=")), , - СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(Ошибка.НомерСтроки, "ЧН=0; ЧГ="))); + СтрЗаменить(Ошибка.ПолеОшибки, "%1", Формат(ИндексСтроки, "ЧН=0; ЧГ="))); КонецЕсли; КонецЦикла; @@ -273,8 +284,8 @@ // Процедура СнятьУсловноеОформлениеСпискаЗначений( УсловноеОформление, - знач ИдентификаторПользовательскойНастройки, - знач Значение) Экспорт + Знач ИдентификаторПользовательскойНастройки, + Знач Значение) Экспорт Для каждого ЭлементУО Из УсловноеОформление.Элементы Цикл Если ЭлементУО.ИдентификаторПользовательскойНастройки = ИдентификаторПользовательскойНастройки Тогда @@ -766,6 +777,7 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для обработки событий и вызова необязательных подсистем. +// Устарела. Следует использовать ОбщегоНазначения.ПодсистемаСуществует или ОбщегоНазначенияКлиент.ПодсистемаСуществует. // Возвращает Истина, если подсистема существует. // // Параметры: @@ -774,8 +786,8 @@ // // Пример вызова необязательной подсистемы: // -// Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда -// МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда +// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); // МодульУправлениеДоступом.<Имя метода>(); // КонецЕсли; // @@ -785,16 +797,14 @@ Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - ИменаПодсистем = СтандартныеПодсистемыПовтИсп.ИменаПодсистем(); + Возврат ОбщегоНазначения.ПодсистемаСуществует(ПолноеИмяПодсистемы); #Иначе - ИменаПодсистем = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске( - ).ИменаПодсистем; + Возврат ОбщегоНазначенияКлиент.ПодсистемаСуществует(ПолноеИмяПодсистемы); #КонецЕсли - - Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; - + КонецФункции +// Устарела. Следует использовать ОбщегоНазначения.ОбщийМодуль или ОбщегоНазначенияКлиент.ОбщийМодуль. // Возвращает ссылку на общий модуль по имени. // // Параметры: @@ -808,9 +818,9 @@ Функция ОбщийМодуль(Имя) Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Модуль = СтандартныеПодсистемыСервер.СерверныйОбщийМодуль(Имя); + Модуль = ОбщегоНазначения.ОбщийМодуль(Имя); #Иначе - Модуль = СтандартныеПодсистемыКлиент.КлиентскийОбщийМодуль(Имя); + Модуль = ОбщегоНазначенияКлиент.ОбщийМодуль(Имя); #КонецЕсли Возврат Модуль; @@ -1273,7 +1283,7 @@ // Возвращаемое значение: // Булево - Истина, если ошибок нет. // -Функция АдресЭлектроннойПочтыСоответствуетТребованиям(Знач Адрес) Экспорт +Функция АдресЭлектроннойПочтыСоответствуетТребованиям(Знач Адрес, РазрешитьЛокальныеАдреса = Ложь) Экспорт // допустимые символы для email Буквы = "abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя"; @@ -1333,7 +1343,7 @@ КонецЕсли; // в домене должна быть минимум одна точка - Если Найти(Домен,".") = 0 Тогда + Если Не РазрешитьЛокальныеАдреса И Найти(Домен,".") = 0 Тогда Возврат Ложь; КонецЕсли; @@ -1351,7 +1361,7 @@ КонецЦикла; // проверяем зону домена (минимум 2 символа, только буквы) - Возврат СтрДлина(Зона) >= 2 И СтрокаСодержитТолькоДопустимыеСимволы(Зона,Буквы); + Возврат РазрешитьЛокальныеАдреса Или СтрДлина(Зона) >= 2 И СтрокаСодержитТолькоДопустимыеСимволы(Зона,Буквы); КонецФункции @@ -1380,7 +1390,7 @@ // некому e-mail адресу. Поэтому, необходимо перед непосредственной // отправкой проверить, что поле почтового адреса заполнено. // -Функция РазобратьСтрокуСПочтовымиАдресами(знач СтрокаПереданныхАдресов, ВызыватьИсключение = Истина) Экспорт +Функция РазобратьСтрокуСПочтовымиАдресами(Знач СтрокаПереданныхАдресов, ВызыватьИсключение = Истина) Экспорт Результат = Новый Массив; @@ -1488,20 +1498,20 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// Функции для работы с отборами динамических списков +// Функции для работы с отборами и параметрами динамических списков // -// Поиск элементов и групп отбора динамического списка +// Найти элемент или группу отбора по заданному имени поля или представлению. +// // Параметры: // ОбластьПоиска - контейнер с элементами и группами отбора, например // Список.Отбор или группа в отборе -// ИмяПоля - имя поля компоновки (не используется для групп) -// Представление - представление поля компоновки -// Примечание: поиск может осуществляться или по ЛевомуЗначению, или по Представлению +// ИмяПоля - Строка - имя поля компоновки (не используется для групп) +// Представление - Строка - представление поля компоновки // -Функция НайтиЭлементыИГруппыОтбора(знач ОбластьПоиска, - знач ИмяПоля = Неопределено, - знач Представление = Неопределено) Экспорт +Функция НайтиЭлементыИГруппыОтбора(Знач ОбластьПоиска, + Знач ИмяПоля = Неопределено, + Знач Представление = Неопределено) Экспорт Если ЗначениеЗаполнено(ИмяПоля) Тогда ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); @@ -1519,12 +1529,13 @@ КонецФункции -// Добавление группы отбора +// Добавить группу отбора в коллекцию КоллекцияЭлементов. +// // Параметры: // КоллекцияЭлементов - контейнер с элементами и группами отбора, например // Список.Отбор.Элементы или группа в отборе -// ТипГруппы - ТипГруппыЭлементовОтбораКомпоновкиДанных - тип группы -// Представление строка - представление группы +// ТипГруппы - ТипГруппыЭлементовОтбораКомпоновкиДанных - тип группы +// Представление - Строка - представление группы. // Функция СоздатьГруппуЭлементовОтбора(Знач КоллекцияЭлементов, Представление, ТипГруппы) Экспорт @@ -1549,24 +1560,25 @@ КонецФункции -// Добавление элемента компоновки в контейнер элементов компоновки +// Добавить элемент компоновки в контейнер элементов компоновки. +// // Параметры: // ОбластьДобавления - контейнер с элементами и группами отбора, например // Список.Отбор или группа в отборе -// ИмяПоля - строка - имя для поля компоновки данных -// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения -// ПравоеЗначение - произвольный -// Представление - представление элемента компоновки данных -// Использование - булево - использование элемента -// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения -// ИдентификаторПользовательскойНастройки - Строка - См. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки в синтакс-помощнике. +// ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда) +// ПравоеЗначение - произвольный - сравниваемое значение +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// Представление - Строка - представление элемента компоновки данных +// Использование - Булево - использование элемента +// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения +// ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки в синтакс-помощнике. // Функция ДобавитьЭлементКомпоновки(ОбластьДобавления, - знач ИмяПоля, - знач ВидСравнения, - знач ПравоеЗначение = Неопределено, - знач Представление = Неопределено, - знач Использование = Неопределено, + Знач ИмяПоля, + Знач ВидСравнения, + Знач ПравоеЗначение = Неопределено, + Знач Представление = Неопределено, + Знач Использование = Неопределено, знач РежимОтображения = Неопределено, знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт @@ -1605,22 +1617,23 @@ КонецФункции -// Изменение элементов отбора +// Изменить элемент отбора с заданным именем поля или представлением. +// // Параметры -// ИмяПоля - строка - имя поля компоновки -// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения -// ПравоеЗначение - произвольный -// Представление - строка - представление элемента компоновки данных -// Использование - булево - использование элемента -// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения +// ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда) +// Представление - Строка - представление элемента компоновки данных +// ПравоеЗначение - произвольный - сравниваемое значение +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// Использование - Булево - использование элемента +// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения // Функция ИзменитьЭлементыОтбора(ОбластьПоиска, - знач ИмяПоля = Неопределено, - знач Представление = Неопределено, - знач ПравоеЗначение = Неопределено, - знач ВидСравнения = Неопределено, - знач Использование = Неопределено, - знач РежимОтображения = Неопределено) Экспорт + Знач ИмяПоля = Неопределено, + Знач Представление = Неопределено, + Знач ПравоеЗначение = Неопределено, + Знач ВидСравнения = Неопределено, + Знач Использование = Неопределено, + Знач РежимОтображения = Неопределено) Экспорт Если ЗначениеЗаполнено(ИмяПоля) Тогда ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); @@ -1659,15 +1672,15 @@ КонецФункции -// Поиск элементов и групп отбора динамического списка +// Удалить элементы отбора с заданным именем поля или представлением. +// // Параметры: // ОбластьУдаления - контейнер с элементами и группами отбора, например -// Список.Отбор или группа в отборе -// ИмяПоля - имя поля компоновки (не используется для групп) -// Представление - представление поля компоновки -// Примечание: поиск может осуществляться или по ЛевомуЗначению, или по Представлению +// Список.Отбор или группа в отборе +// ИмяПоля - Строка - имя поля компоновки (не используется для групп) +// Представление - Строка - представление поля компоновки // -Процедура УдалитьЭлементыГруппыОтбора(знач ОбластьУдаления, знач ИмяПоля = Неопределено, знач Представление = Неопределено) Экспорт +Процедура УдалитьЭлементыГруппыОтбора(Знач ОбластьУдаления, Знач ИмяПоля = Неопределено, Знач Представление = Неопределено) Экспорт Если ЗначениеЗаполнено(ИмяПоля) Тогда ЗначениеПоиска = Новый ПолеКомпоновкиДанных(ИмяПоля); @@ -1691,26 +1704,25 @@ КонецПроцедуры -// Используется для создания элемента отбора или, если таковой не найден, -// установления существующим элементам свойств +// Добавить или заменить существующий элемент отбора. +// // Параметры // ОбластьПоискаДобавления - контейнер с элементами и группами отбора, например // Список.Отбор или группа в отборе -// ИмяПоля - строка - имя для поля компоновки данных (заполняется всегда) -// Устанавливаемые поля: -// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения -// ПравоеЗначение - произвольный -// Представление - представление элемента компоновки данных -// Использование - булево - использование элемента -// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения -// ИдентификаторПользовательскойНастройки - Строка - См. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки в синтакс-помощнике. +// ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда) +// ПравоеЗначение - произвольный - сравниваемое значение +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// Представление - Строка - представление элемента компоновки данных +// Использование - Булево - использование элемента +// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения +// ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки в синтакс-помощнике. // Процедура УстановитьЭлементОтбора(ОбластьПоискаДобавления, - знач ИмяПоля, - знач ПравоеЗначение = Неопределено, - знач ВидСравнения = Неопределено, - знач Представление = Неопределено, - знач Использование = Неопределено, + Знач ИмяПоля, + Знач ПравоеЗначение = Неопределено, + Знач ВидСравнения = Неопределено, + Знач Представление = Неопределено, + Знач Использование = Неопределено, знач РежимОтображения = Неопределено, знач ИдентификаторПользовательскойНастройки = Неопределено) Экспорт @@ -1730,12 +1742,17 @@ КонецПроцедуры -// Добавляет / заменяет существующий элемент отбора динамического списка. -// Работает для платформы версии 8.3. +// Добавить или заменить существующий элемент отбора динамического списка. // // Параметры: -// ДинамическийСписок (ДинамическийСписок) Реквизит формы, для которого требуется установить отбор. -// Остальные параметры - см. УстановитьЭлементОтбора() +// ДинамическийСписок - ДинамическийСписок - реквизит формы, для которого требуется установить отбор. +// ИмяПоля - Строка - имя поля компоновки данных (заполняется всегда) +// ПравоеЗначение - произвольный - сравниваемое значение +// ВидСравнения - ВидСравненияКомпоновкиДанных - вид сравнения +// Представление - Строка - представление элемента компоновки данных +// Использование - Булево - использование элемента +// РежимОтображения - РежимОтображенияЭлементаНастройкиКомпоновкиДанных - режим отображения +// ИдентификаторПользовательскойНастройки - Строка - см. ОтборКомпоновкиДанных.ИдентификаторПользовательскойНастройки в синтакс-помощнике. // Процедура УстановитьЭлементОтбораДинамическогоСписка(ДинамическийСписок, ИмяПоля, ПравоеЗначение = Неопределено, @@ -1749,14 +1766,10 @@ РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный; КонецЕсли; - Если ЭтоПлатформа83БезРежимаСовместимости() Тогда - Если РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда - ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; - Иначе - ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.Настройки.Отбор; - КонецЕсли; + Если РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный Тогда + ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; Иначе - ОтборДинамическогоСписка = ДинамическийСписок.Отбор; + ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.Настройки.Отбор; КонецЕсли; УстановитьЭлементОтбора( @@ -1771,26 +1784,29 @@ КонецПроцедуры -// Удаляет элементы группы отбора динамического списка. -// Работает для платформы версии 8.3. +// Удалить элемент группы отбора динамического списка. // // Параметры: -// ДинамическийСписок (ДинамическийСписок) Реквизит формы, для которого требуется установить отбор. -// Остальные параметры - см. УдалитьЭлементыГруппыОтбора() +// ДинамическийСписок - ДинамическийСписок - реквизит формы, для которого требуется установить отбор. +// ИмяПоля - Строка - имя поля компоновки (не используется для групп) +// Представление - Строка - представление поля компоновки // Процедура УдалитьЭлементыГруппыОтбораДинамическогоСписка(ДинамическийСписок, ИмяПоля = Неопределено, Представление = Неопределено) Экспорт - Если ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; - Иначе - ОтборДинамическогоСписка = ДинамическийСписок.Отбор; - КонецЕсли; + ОтборДинамическогоСписка = ДинамическийСписок.КомпоновщикНастроек.ФиксированныеНастройки.Отбор; УдалитьЭлементыГруппыОтбора(ОтборДинамическогоСписка, ИмяПоля, Представление); КонецПроцедуры -// Устанавливает / обновляет значение параметра динамического списка. +// Установить или обновить значение параметра ИмяПараметра динамического списка Список. +// +// Параметры: +// Список - ДинамическийСписок - реквизит формы, для которого требуется установить параметр. +// ИмяПараметра - Строка - имя параметра динамического списка +// Значение - проивольный - новое значение параметра +// Использование - Булево - признак использования параметра. +// Процедура УстановитьПараметрДинамическогоСписка(Список, ИмяПараметра, Значение, Использование = Истина) Экспорт ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); @@ -1909,48 +1925,36 @@ КонецФункции -// Возвращает значение свойства Линия системного перечисления ОтображениеОбычнойГруппы. +// Устарела. // // Возвращаемое значение: -// ОтображениеОбычнойГруппы - Линия для 8.2 и СлабоеВыделение для 8.3. +// ОтображениеОбычнойГруппы - ОтображениеОбычнойГруппы.СлабоеВыделение. // Функция ОтображениеОбычнойГруппыЛиния() Экспорт - Если ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат ОтображениеОбычнойГруппы["СлабоеВыделение"]; - Иначе - Возврат ОтображениеОбычнойГруппы["Линия"]; - КонецЕсли; + Возврат ОтображениеОбычнойГруппы.СлабоеВыделение; КонецФункции -// Возвращает значение свойства Отступ системного перечисления ОтображениеОбычнойГруппы. +// Устарела. // // Возвращаемое значение: -// ОтображениеОбычнойГруппы - Отступ для 8.2 и ОбычноеВыделение для 8.3. +// ОтображениеОбычнойГруппы - ОтображениеОбычнойГруппы.ОбычноеВыделение. // Функция ОтображениеОбычнойГруппыОтступ() Экспорт - Если ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат ОтображениеОбычнойГруппы["ОбычноеВыделение"]; - Иначе - Возврат ОтображениеОбычнойГруппы["Отступ"]; - КонецЕсли; + Возврат ОтображениеОбычнойГруппы.ОбычноеВыделение; КонецФункции -// Возвращает значение свойства РамкаГруппы системного перечисления ОтображениеОбычнойГруппы. +// Устарела. // // Возвращаемое значение: -// ОтображениеОбычнойГруппы - РамкаГруппы для 8.2 и СильноеВыделение для 8.3. +// ОтображениеОбычнойГруппы - ОтображениеОбычнойГруппы.СильноеВыделение. // Функция ОтображениеОбычнойГруппыРамкаГруппы() Экспорт - Если ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат ОтображениеОбычнойГруппы["СильноеВыделение"]; - Иначе - Возврат ОтображениеОбычнойГруппы["РамкаГруппы"]; - КонецЕсли; + Возврат ОтображениеОбычнойГруппы.СильноеВыделение; КонецФункции @@ -1963,21 +1967,21 @@ // справочники, планы видов характеристик, планы счетов и планы видов расчета. // // Параметры: -// ПолноеИмяПредопределенного (Строка) Полный путь к предопределенному элементу, включая его имя. +// ПолноеИмяПредопределенного - Строка - Полный путь к предопределенному элементу, включая его имя. // Формат полностью аналогичен функции глобального контекста ПредопределенноеЗначение(). // Например: // "Справочник.ВидыКонтактнойИнформации.EmailПользователя" -// "ПланВидовХарактеристик.ВидыДоступа.ВнешниеПользователи" // "ПланСчетов.Хозрасчетный.Материалы" // "ПланВидовРасчета.Начисления.ОплатаПоОкладу" // // Возвращаемое значение: -// Ссылка предопределенного элемента или Неопределено если элемент не найден. +// ЛюбаяСсылка - Ссылка предопределенного элемента. +// Неопределено - Если элемент не найден. // Функция ПредопределенныйЭлемент(ПолноеИмяПредопределенного) Экспорт - Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" // Для получения пустых ссылок. - ИЛИ НЕ ЭтоПлатформа83БезРежимаСовместимости() Тогда // А также в версии 8.2 или 8.3 в режиме совместимости с 8.2. - Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); // Используется стандартная функция платформы. + Если ВРег(Прав(ПолноеИмяПредопределенного, 13)) = ".ПУСТАЯССЫЛКА" Тогда + // Для получения пустых ссылок используется стандартная функция платформы. + Возврат ПредопределенноеЗначение(ПолноеИмяПредопределенного); КонецЕсли; #Если Клиент Тогда @@ -2087,7 +2091,7 @@ // СимволЗамены – Строка – строка, на которую требуется выполнить замену недопустимого символа в XML-строке // // Возвращаемое значение: -// Строка - строка, полученная заменой недопустимых символов в XML-строке. +// Строка - cтрока, полученная заменой недопустимых символов в XML-строке. // Функция ЗаменитьНедопустимыеСимволыXML(Знач Текст, СимволЗамены = " ") Экспорт @@ -2129,42 +2133,19 @@ КонецФункции -// Сравнивает расписания между собой. +// Сравнивает два расписания между собой. // -// Параметры -// Расписание1, Расписание2 - РасписаниеРегламентногоЗадания +// Параметры: +// Расписание1 - РасписаниеРегламентногоЗадания - первое расписание. +// Расписание2 - РасписаниеРегламентногоЗадания - второе расписание. // // Возвращаемое значение // Булево - истина, если расписания идентичны, иначе ложь. +// Функция РасписанияОдинаковые(Знач Расписание1, Знач Расписание2) Экспорт - Расписание1 = РасписаниеВСтруктуру(Расписание1); - Расписание2 = РасписаниеВСтруктуру(Расписание2); - Для Каждого РеквизитРасписания Из Расписание1 Цикл - Если ТипЗнч(РеквизитРасписания.Значение) <> Тип("Массив") Тогда - Если РеквизитРасписания.Значение <> Расписание2[РеквизитРасписания.Ключ] Тогда - Возврат Ложь; - КонецЕсли; - Иначе - Если РеквизитРасписания.Значение.Количество() <> Расписание2[РеквизитРасписания.Ключ].Количество() Тогда - Возврат Ложь; - КонецЕсли; - - Для НомерЭлемента = 0 По РеквизитРасписания.Значение.Количество()-1 Цикл - Если РеквизитРасписания.Ключ = "ДетальныеРасписанияДня" Тогда - Если Не РасписанияОдинаковые(РеквизитРасписания.Значение[НомерЭлемента],Расписание2[РеквизитРасписания.Ключ][НомерЭлемента]) Тогда - Возврат Ложь; - КонецЕсли; - Иначе - Если РеквизитРасписания.Значение[НомерЭлемента] <> Расписание2[РеквизитРасписания.Ключ][НомерЭлемента] Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - КонецЦикла; + Возврат Строка(Расписание1) = Строка(Расписание2); - Возврат Истина; КонецФункции // Возвращает код основного языка конфигурации, например "ru". @@ -2176,26 +2157,6 @@ #КонецЕсли КонецФункции -// Возвращает Истина, если конфигурация запущена под управлением платформы 1С:Предприятие 8.3 без использования режима совместимости -// с версией 8.3.2 или более ранней. -// -Функция ЭтоПлатформа83БезРежимаСовместимости() Экспорт - #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Возврат СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости(); - #Иначе - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоПлатформа83БезРежимаСовместимости; - #КонецЕсли -КонецФункции - -// Возвращает Истина если конфигурация запущена под управлением платформы 8.3. -// -Функция ЭтоПлатформа83() Экспорт - - Информация = Новый СистемнаяИнформация; - Возврат Лев(Информация.ВерсияПриложения, 3) = "8.3"; - -КонецФункции - // Возвращает Истина, если клиентское приложение подключено к базе через веб-сервер. // Если нет клиентского приложения, возвращается Ложь. // @@ -2269,6 +2230,156 @@ КонецФункции +// Вызывает исключение с текстом Сообщение, если Условие не равно Истина. +// Применяется для самодиагностики кода. +// +// Параметры: +// Условие - Булево - если не равно Истина, то вызывается исключение. +// КонтекстПроверки - Строка - например, имя процедуры или функции, в которой выполняется проверка. +// Сообщение - Строка - текст сообщения. Если не задан, то исключение вызывается с сообщением по умолчанию. +// +Процедура Проверить(Знач Условие, Знач Сообщение = "", Знач КонтекстПроверки = "") Экспорт + + Если Условие <> Истина Тогда + Если ПустаяСтрока(Сообщение) Тогда + ТекстИсключения = НСтр("ru = 'Недопустимая операция'"); // Assertion failed + Иначе + ТекстИсключения = Сообщение; + КонецЕсли; + Если Не ПустаяСтрока(КонтекстПроверки) Тогда + ТекстИсключения = ТекстИсключения + " " + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в %1'"), КонтекстПроверки); + КонецЕсли; + ВызватьИсключение ТекстИсключения; + КонецЕсли; + +КонецПроцедуры + +// Вызывает исключение, если тип значения параметра ИмяПараметра процедуры или функции ИмяПроцедурыИлиФункции +// отличается от ожидаемого. +// Для диагностики типов параметров, передаваемых в процедуры и функции программного интерфейса. +// +// Параметры: +// ИмяПроцедурыИлиФункции - Строка - имя процедуры или функции, параметр которой проверяется. +// ИмяПараметра - Строка - имя проверяемого параметра процедуры или функции. +// ЗначениеПараметра - Произвольный - фактическое значение параметра. +// ОжидаемыеТипы - ОписаниеТипов, Тип - тип(ы) параметра процедуры или функции. +// ОжидаемыеТипыСвойств - Структура - если ожидаемый тип - структура, то +// в этом параметре можно указать типы ее свойств. +// +Процедура ПроверитьПараметр(Знач ИмяПроцедурыИлиФункции, Знач ИмяПараметра, Знач ЗначениеПараметра, + Знач ОжидаемыеТипы, Знач ОжидаемыеТипыСвойств = Неопределено) Экспорт + + Контекст = "ОбщегоНазначенияКлиентСервер.ПроверитьПараметр"; + Проверить(ТипЗнч(ИмяПроцедурыИлиФункции) = Тип("Строка"), + НСтр("ru = 'Недопустимо значение параметра ИмяПроцедурыИлиФункции'"), Контекст); + Проверить(ТипЗнч(ИмяПараметра) = Тип("Строка"), + НСтр("ru = 'Недопустимо значение параметра ИмяПараметра'"), Контекст); + + ЭтоОписаниеТипов = ТипЗнч(ОжидаемыеТипы) = Тип("ОписаниеТипов"); + Проверить(ЭтоОписаниеТипов Или ТипЗнч(ОжидаемыеТипы) = Тип("Тип"), + НСтр("ru = 'Недопустимо значение параметра ОжидаемыеТипы'"), Контекст); + + НедопустимыйПараметр = НСтр("ru = 'Недопустимое значение параметра %1 в %2. + |Ожидалось: %3; передано значение: %4 (тип %5).'"); + Проверить((ЭтоОписаниеТипов И ОжидаемыеТипы.СодержитТип(ТипЗнч(ЗначениеПараметра))) + Или (Не ЭтоОписаниеТипов И ОжидаемыеТипы = ТипЗнч(ЗначениеПараметра)), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимыйПараметр, + ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемыеТипы, + ?(ЗначениеПараметра <> Неопределено, ЗначениеПараметра, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеПараметра))); + + Если ТипЗнч(ЗначениеПараметра) = Тип("Структура") И ОжидаемыеТипыСвойств <> Неопределено Тогда + + Проверить(ТипЗнч(ОжидаемыеТипыСвойств) = Тип("Структура"), + НСтр("ru = 'Недопустимо значение параметра ИмяПроцедурыИлиФункции'"), Контекст); + + НетСвойства = НСтр("ru = 'Недопустимое значение параметра %1 (Структура) в %2. + |В структуре ожидалось свойство %3 (тип %4).'"); + НедопустимоеСвойство = НСтр("ru = 'Недопустимое значение свойства %1 в параметре %2 (Структура) в %3. + |Ожидалось: %4; передано значение: %5 (тип %6).'"); + Для каждого Свойство Из ОжидаемыеТипыСвойств Цикл + + ОжидаемоеИмяСвойства = Свойство.Ключ; + ОжидаемыйТипСвойства = Свойство.Значение; + ЗначениеСвойства = Неопределено; + + Проверить(ЗначениеПараметра.Свойство(ОжидаемоеИмяСвойства, ЗначениеСвойства), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НетСвойства, + ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемоеИмяСвойства, ОжидаемыйТипСвойства)); + + ЭтоОписаниеТипов = ТипЗнч(ОжидаемыйТипСвойства) = Тип("ОписаниеТипов"); + Проверить((ЭтоОписаниеТипов И ОжидаемыйТипСвойства.СодержитТип(ТипЗнч(ЗначениеСвойства))) + Или (Не ЭтоОписаниеТипов И ОжидаемыйТипСвойства = ТипЗнч(ЗначениеСвойства)), + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НедопустимоеСвойство, + ОжидаемоеИмяСвойства, ИмяПараметра, ИмяПроцедурыИлиФункции, ОжидаемыйТипСвойства, + ?(ЗначениеСвойства <> Неопределено, ЗначениеСвойства, НСтр("ru = 'Неопределено'")), ТипЗнч(ЗначениеСвойства))); + + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Математические процедуры и функции + +// Выполняет пропорциональное распределение суммы в соответствии +// с заданными коэффициентами распределения. +// +// Параметры: +// ИсхСумма - распределяемая сумма +// МассивКоэф - массив коэффициентов распределения +// Точность - точность округления при распределении. Необязателен. +// +// Возвращаемое значение: +// МассивСумм - массив размерностью равный массиву коэффициентов, содержит +// суммы в соответствии с весом коэффициента (из массива коэффициентов) +// В случае если распределить не удалось (сумма = 0, кол-во коэф. = 0, +// или суммарный вес коэф. = 0), тогда возвращается значение Неопределено +// +Функция РаспределитьСуммуПропорциональноКоэффициентам(Знач ИсхСумма, МассивКоэф, Знач Точность = 2) Экспорт + + Если МассивКоэф.Количество() = 0 Или НЕ ЗначениеЗаполнено(ИсхСумма) Тогда + Возврат Неопределено; + КонецЕсли; + + ИндексМакс = 0; + МаксЗнач = 0; + РаспрСумма = 0; + СуммаКоэф = 0; + + Для К = 0 По МассивКоэф.Количество() - 1 Цикл + + МодульЧисла = ?(МассивКоэф[К] > 0, МассивКоэф[К], - МассивКоэф[К]); + + Если МаксЗнач < МодульЧисла Тогда + МаксЗнач = МодульЧисла; + ИндексМакс = К; + КонецЕсли; + + СуммаКоэф = СуммаКоэф + МассивКоэф[К]; + + КонецЦикла; + + Если СуммаКоэф = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + МассивСумм = Новый Массив(МассивКоэф.Количество()); + + Для К = 0 По МассивКоэф.Количество() - 1 Цикл + МассивСумм[К] = Окр(ИсхСумма * МассивКоэф[К] / СуммаКоэф, Точность, 1); + РаспрСумма = РаспрСумма + МассивСумм[К]; + КонецЦикла; + + // Погрешности округления отнесем на коэффициент с максимальным весом + Если Не РаспрСумма = ИсхСумма Тогда + МассивСумм[ИндексМакс] = МассивСумм[ИндексМакс] + ИсхСумма - РаспрСумма; + КонецЕсли; + + Возврат МассивСумм; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Устаревшие процедуры и функции @@ -2279,10 +2390,22 @@ КонецФункции +// Устарела. Следует удалить все использования этой функции и ветки кода при значении Ложь. +// +Функция ЭтоПлатформа83БезРежимаСовместимости() Экспорт + Возврат Истина; +КонецФункции + +// Устарела. Следует удалить все использования этой функции и ветки кода при значении Ложь. +// +Функция ЭтоПлатформа83() Экспорт + Возврат Истина; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Функция выполняет поиск элемента в коллекции: списке значений или массиве +// Выполняет поиск элемента в коллекции: списке значений или массиве // Функция НайтиВСписке(Список, Элемент) @@ -2316,7 +2439,7 @@ // Значение - структура - в случае успеха операции содержит записанную структуру почтового // адреса: ключи - Адрес, Представление (строки) // -Функция ПроверитьИПодготовитьПочтовыйАдрес(знач ПолноеИмяАдресата, знач ПочтовыйАдрес) +Функция ПроверитьИПодготовитьПочтовыйАдрес(Знач ПолноеИмяАдресата, Знач ПочтовыйАдрес) НедопустимыйСимволВИмениАдресата = НСтр("ru = 'Недопустимый символ в имени адресата.'"); НедопустимыйСимволВПочтовомАдресе = НСтр("ru = 'Недопустимый символ в почтовом адресе.'"); @@ -2367,9 +2490,9 @@ // Сдвигает маркер позиции пока встречается символ Символ // возвращает номер позиции в строке, на которое установился маркер // -Функция ПропуститьПробелы(знач Строка, - знач ТекущийИндекс, - знач ПропускаемыйСимвол) +Функция ПропуститьПробелы(Знач Строка, + Знач ТекущийИндекс, + Знач ПропускаемыйСимвол) Результат = ТекущийИндекс; diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl index 359426135..2a3b39dbe 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПереопределяемый/Module.bsl @@ -44,13 +44,15 @@ // В обработчике необходимо найти "техногенные" объекты, в реквизитах которых указана ссылка удаляемого объекта, // и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. // +// Например: +// Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); +// Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); +// Массив.Добавить("РегистрСведений.ВерсииОбъектов"); +// // Возвращаемое значение: -// (Массив) из -// |- (ОбъектМетаданных) Объект метаданных или его реквизит, например: -// Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); -// Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); -// |- (Строка) Полное имя объекта метаданных, например: -// Массив.Добавить("РегистрСведений.ВерсииОбъектов"); +// Массив - Объекты метаданных или их реквизиты, содержимое которых не должно учитывается в бизнес-логике приложения. +// * ОбъектМетаданных - Объект метаданных или его реквизит. +// * Строка - Полное имя объекта метаданных или его реквизита. // Функция ПолучитьИсключенияПоискаСсылок() Экспорт @@ -69,20 +71,13 @@ КонецПроцедуры -// Заполняет переименования тех объектов метаданных, которые невозможно +// Доопределяет переименования тех объектов метаданных, которые невозможно // автоматически найти по типу, но ссылки на которые требуется сохранять // в базе данных (например: подсистемы, роли). // -// Подробнее: см. ОбщегоНазначения.ДобавитьПереименование(). +// Подробнее см. комментарий к процедуре ДобавитьПереименование общего модуля ОбщегоНазначения. // -Процедура ЗаполнитьТаблицуПереименованияОбъектовМетаданных(Итог) Экспорт - - - -КонецПроцедуры - -// Устарела. Будет удалена в следующей редакции. См. ПриОпределенииОбщихПараметровБазовойФункциональности. -Процедура ИмяФормыПерсональныхНастроек(ИмяФормы) Экспорт +Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт @@ -108,6 +103,8 @@ // Процедура ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт + + КонецПроцедуры // Возвращает структуру параметров, необходимых для работы клиентского кода @@ -142,28 +139,23 @@ КонецПроцедуры -// Устарела. Будет удалена в следующей редакции. См. ПриОпределенииОбщихПараметровБазовойФункциональности. -Процедура ПолучитьМинимальноНеобходимуюВерсиюПлатформы(ПараметрыПроверки) Экспорт - -КонецПроцедуры - // Позволяет настроить общие параметры базовой функциональности. // // Параметры: -// ОбщиеПараметры (Структура) Набор параметров базовой функциональности: +// ОбщиеПараметры - Структура - Набор параметров базовой функциональности: // Ранее определялись в ОбщегоНазначенияПереопределяемый.ИмяФормыПерсональныхНастроек(): -// |- ИмяФормыПерсональныхНастроек (Строка) Имя формы для редактирования персональных настроек. +// * ИмяФормыПерсональныхНастроек - Строка - Имя формы для редактирования персональных настроек. // Ранее определялись в ОбщегоНазначенияПереопределяемый.ПолучитьМинимальноНеобходимуюВерсиюПлатформы(): -// |- МинимальноНеобходимаяВерсияПлатформы (Строка) Номер версии платформы для запуска программы. -// |- РаботаВПрограммеЗапрещена (Булево) Начальное значение Ложь. +// * МинимальноНеобходимаяВерсияПлатформы - Строка - Номер версии платформы для запуска программы. +// * РаботаВПрограммеЗапрещена - Булево - Начальное значение Ложь. // Не имеют аналогов в переопределяемых модулях: -// |- ЗапрашиватьПодтверждениеПриЗавершенииПрограммы (Булево) Определяет значение по умолчанию для флажка +// * ЗапрашиватьПодтверждениеПриЗавершенииПрограммы - Булево - Определяет значение по умолчанию для флажка // "Больше не задавать этот вопрос" диалога "Завершить работу с программой?". // Значение по умолчанию Истина. // Если установить Ложь, то пользователь не увидит диалог, пока явно не включит его отображение через свои настройки. -// |- ОтключитьСправочникИдентификаторыОбъектовМетаданных (Булево) - отключает заполнение справочника +// * ОтключитьСправочникИдентификаторыОбъектовМетаданных - Булево - отключает заполнение справочника // ИдентификаторыОбъектовМетаданных, процедуры выгрузки и загрузки элементов справочника в узлах РИБ. -// Востребовано при частичном встраивании БСП в конфигурации на платформе 8.1 +// Востребовано при частичном встраивании БСП в конфигурации на платформе 8.1. // Процедура ПриОпределенииОбщихПараметровБазовойФункциональности(ОбщиеПараметры) Экспорт @@ -209,4 +201,24 @@ +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Устаревший программный интерфейс + +// Устарела. Будет удалена в следующей редакции. См. ПриОпределенииОбщихПараметровБазовойФункциональности. +Процедура ИмяФормыПерсональныхНастроек(ИмяФормы) Экспорт + + + +КонецПроцедуры + +// Устарела. Будет удалена в следующей редакции. См. ПриОпределенииОбщихПараметровБазовойФункциональности. +Процедура ПолучитьМинимальноНеобходимуюВерсиюПлатформы(ПараметрыПроверки) Экспорт + +КонецПроцедуры + +// Устарела. Будет удалена в следующей редакции. См. ПриДобавленииПереименованийОбъектовМетаданных. +Процедура ЗаполнитьТаблицуПереименованияОбъектовМетаданных(Итог) Экспорт + КонецПроцедуры diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl index e01fbf7a6..2d0d50af0 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/Module.bsl @@ -62,8 +62,8 @@ Функция РазделительОсновныхДанных() Экспорт Результат = ""; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Результат = МодульРаботаВМоделиСервиса.РазделительОсновныхДанных(); КонецЕсли; @@ -78,8 +78,8 @@ Функция РазделительВспомогательныхДанных() Экспорт Результат = ""; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Результат = МодульРаботаВМоделиСервиса.РазделительВспомогательныхДанных(); КонецЕсли; @@ -175,20 +175,6 @@ КонецФункции -// Устарела. Следует использовать коллекцию ЦветаСтиля. -Функция ЦветСтиля(ИмяЦветаСтиля) Экспорт - - Возврат ЦветаСтиля[ИмяЦветаСтиля]; - -КонецФункции - -// Устарела. Следует использовать коллекцию ШрифтыСтиля. -Функция ШрифтСтиля(ИмяШрифтаСтиля) Экспорт - - Возврат ШрифтыСтиля[ИмяШрифтаСтиля]; - -КонецФункции - // Определение режима работы для панелей настроек программы. // // В панелях настроек включены 5 интерфейсов: @@ -209,8 +195,8 @@ РежимРаботы = Новый Структура; // Права пользователя - РежимРаботы.Вставить("ЭтоАдминистраторПрограммы", Пользователи.ЭтоПолноправныйПользователь()); // АА, АС, ЛКС, ЛФ - РежимРаботы.Вставить("ЭтоАдминистраторСистемы", Пользователи.ЭтоПолноправныйПользователь(, Истина)); // АС, ЛКС, ЛФ + РежимРаботы.Вставить("ЭтоАдминистраторПрограммы", Пользователи.ЭтоПолноправныйПользователь(,,Ложь)); // АА, АС, ЛКС, ЛФ + РежимРаботы.Вставить("ЭтоАдминистраторСистемы", Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь)); // АС, ЛКС, ЛФ // Общие настройки РежимРаботы.Вставить("МодельСервиса", РазделениеВключено()); // АС, АА @@ -242,73 +228,6 @@ Возврат РежимРаботы; КонецФункции -// Функция возвращает имя каталога временных файлов. -// -// Возвращаемое значение: -// Строка - путь к каталогу временных файлов. -// -Функция КаталогВременногоХранилищаФайлов() Экспорт - - // Если файловая база, то возвращается КаталогВременныхФайлов. - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда - Возврат СокрЛП(КаталогВременныхФайлов()); - КонецЕсли; - - ОбщийТипПлатформы = "Windows"; - - ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера(); - - УстановитьПривилегированныйРежим(Истина); - - Если ТипПлатформыСервера = ТипПлатформы.Windows_x86 - ИЛИ ТипПлатформыСервера = ТипПлатформы.Windows_x86_64 Тогда - - Результат = Константы.КаталогВременныхФайловДляWindows.Получить(); - - ИначеЕсли ТипПлатформыСервера = ТипПлатформы.Linux_x86 - ИЛИ ТипПлатформыСервера = ТипПлатформы.Linux_x86_64 Тогда - - Результат = Константы.КаталогВременныхФайловДляLinux.Получить(); - ОбщийТипПлатформы = "Linux"; - - Иначе - - Результат = Константы.КаталогВременныхФайловДляWindows.Получить(); - - КонецЕсли; - - УстановитьПривилегированныйРежим(Ложь); - - ПредставлениеКонстанты = ?(ОбщийТипПлатформы = "Linux", - Метаданные.Константы.КаталогВременныхФайловДляLinux.Представление(), - Метаданные.Константы.КаталогВременныхФайловДляWindows.Представление()); - - Если ПустаяСтрока(Результат) Тогда - - Результат = СокрЛП(КаталогВременныхФайлов()); - - Иначе - - Результат = СокрЛП(Результат); - - // Проверка существования каталога - Каталог = Новый Файл(Результат); - Если Не Каталог.Существует() Тогда - - ШаблонСообщения = НСтр("ru = 'Каталог временных файлов не существует. - |Необходимо убедиться, что в настройках программы задано правильное значение параметра - |""%1"".'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ПредставлениеКонстанты); - ВызватьИсключение(ТекстСообщения); - - КонецЕсли; - - КонецЕсли; - - Возврат Результат; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС diff --git a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/ОбщегоНазначенияПовтИсп.mdo b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/ОбщегоНазначенияПовтИсп.mdo index b57ccba80..9c2fc6c62 100644 --- a/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/ОбщегоНазначенияПовтИсп.mdo +++ b/SSL/src/CommonModules/ОбщегоНазначенияПовтИсп/ОбщегоНазначенияПовтИсп.mdo @@ -8,6 +8,5 @@ <server>true</server> <externalConnection>true</externalConnection> <clientOrdinaryApplication>true</clientOrdinaryApplication> - <serverCall>true</serverCall> <returnValuesReuse>DuringSession</returnValuesReuse> </mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl b/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl index d56fae645..ce5fc687c 100644 --- a/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОрганизацииСлужебный/Module.bsl @@ -1,10 +1,10 @@ //////////////////////////////////////////////////////////////////////////////// -// Подсистема "Пользователи". +// Подсистема "Организации". // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт @@ -14,13 +14,13 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ОрганизацииСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "ОрганизацииСлужебный"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"].Добавить( + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( "ОрганизацииСлужебный"); КонецЕсли; @@ -39,11 +39,13 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "ОрганизацииСлужебный.ОбновитьПредопределенныеВидыКонтактнойИнформацииОрганизаций"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.12"; + Обработчик.НачальноеЗаполнение = Истина; + Обработчик.Процедура = "Справочники.Организации.ЗаполнитьКонстантуИспользоватьНесколькоОрганизаций"; + КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП @@ -63,17 +65,12 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо // Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах @@ -87,62 +84,100 @@ // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - ВидДоступаОрганизации = СтандартныеПодсистемыПовтИсп.СсылкиПоИменамПредопределенных( - "ПланВидовХарактеристик.ВидыДоступа").Получить("Организации"); - - Если ВидДоступаОрганизации = Неопределено Тогда + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда Возврат; КонецЕсли; - Описание = Описание + - " - |Справочник.Организации.Чтение.Организации - |"; + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("Организации") Тогда + + Описание = Описание + + " + |Справочник.Организации.Чтение.Организации + |Справочник.Организации.Изменение.Организации + |"; + + КонецЕсли; КонецПроцедуры -// Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. +// Заполняет виды доступа, используемые в ограничениях прав доступа. +// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. +// Их можно удалить, если они не требуются для ограничения прав доступа. // // Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). +// ВидыДоступа - ТаблицаЗначений с полями: +// - Имя - Строка - имя используемое в описании поставляемых +// профилей групп доступа и текстах ОДД. +// - Представление - Строка - представляет вид доступа в профилях и группах доступа. +// - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). +// - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). +// - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), +// можно выбрать несколько групп значений (Групп доступа номенклатуры). // -Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт - ВидДоступаОрганизации = СтандартныеПодсистемыПовтИсп.СсылкиПоИменамПредопределенных( - "ПланВидовХарактеристик.ВидыДоступа").Получить("Организации"); - - Если Свойства.ВидДоступа = ВидДоступаОрганизации Тогда - Свойства.Таблицы.Добавить("Справочник.Организации"); - КонецЕсли; + ВидДоступа = ВидыДоступа.Добавить(); + ВидДоступа.Имя = "Организации"; + ВидДоступа.Представление = НСтр("ru = 'Организации'"); + ВидДоступа.ТипЗначений = Тип("СправочникСсылка.Организации"); КонецПроцедуры // Вызывается при переходе на версию конфигурации 2.1.3.16 +// Процедура ОбновитьПредопределенныеВидыКонтактнойИнформацииОрганизаций() Экспорт + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Возврат; + КонецЕсли; + ПараметрыПроверкиАдреса = Новый Структура; - ПараметрыПроверкиАдреса.Вставить("АдресТолькоРоссийский", Истина); - ПараметрыПроверкиАдреса.Вставить("ПроверятьКорректность", Ложь); - ПараметрыПроверкиАдреса.Вставить("ЗапрещатьВводНекорректного", Ложь); - ПараметрыПроверкиАдреса.Вставить("СкрыватьНеактуальныеАдреса", Ложь); + ПараметрыПроверкиАдреса.Вставить("АдресТолькоРоссийский", Истина); + ПараметрыПроверкиАдреса.Вставить("ПроверятьКорректность", Ложь); + ПараметрыПроверкиАдреса.Вставить("ЗапрещатьВводНекорректного", Ложь); + ПараметрыПроверкиАдреса.Вставить("СкрыватьНеактуальныеАдреса", Ложь); ПараметрыПроверкиАдреса.Вставить("ВключатьСтрануВПредставление", Ложь); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ЮрАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, - НСтр("ru='Юридический адрес организации'"), Истина, Ложь, Ложь, 1, , ПараметрыПроверкиАдреса); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ФактАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, - НСтр("ru='Фактический адрес организации'"), Истина, Ложь, Ложь, 2); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ТелефонОрганизации, Перечисления.ТипыКонтактнойИнформации.Телефон, - НСтр("ru='Телефон организации'"), Истина, Ложь, Ложь, 3, Истина); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ФаксОрганизации, Перечисления.ТипыКонтактнойИнформации.Факс, - НСтр("ru='Факс организации'"), Истина, Ложь, Ложь, 4, Истина); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.EmailОрганизации, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, - НСтр("ru='Адрес электронной почты организации'"), Истина, Ложь, Ложь, 5, Истина); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ПочтовыйАдресОрганизации, Перечисления.ТипыКонтактнойИнформации.Адрес, - НСтр("ru='Почтовый адрес организации'"), Истина, Ложь, Ложь, 6); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ДругаяИнформацияОрганизации, Перечисления.ТипыКонтактнойИнформации.Другое, - НСтр("ru='Любая другая контактная информация'"), Истина, Ложь, Ложь, 7); + МодульКИ = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ЮрАдресОрганизации", "Адрес", НСтр("ru='Юридический адрес организации'"), + Истина, Ложь, Ложь, 1, , ПараметрыПроверкиАдреса); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ФактАдресОрганизации", "Адрес", НСтр("ru='Фактический адрес организации'"), + Истина, Ложь, Ложь, 2); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ТелефонОрганизации", "Телефон", НСтр("ru='Телефон организации'"), + Истина, Ложь, Ложь, 3, Истина); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ФаксОрганизации", "Факс", НСтр("ru='Факс организации'"), + Истина, Ложь, Ложь, 4, Истина); + + МодульКИ.ОбновитьВидКонтактнойИнформации("EmailОрганизации", "АдресЭлектроннойПочты", НСтр("ru='Адрес электронной почты организации'"), + Истина, Ложь, Ложь, 5, Истина); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ПочтовыйАдресОрганизации", "Адрес", НСтр("ru='Почтовый адрес организации'"), + Истина, Ложь, Ложь, 6); + + МодульКИ.ОбновитьВидКонтактнойИнформации("ДругаяИнформацияОрганизации", "Другое", НСтр("ru='Любая другая контактная информация'"), + Истина, Ложь, Ложь, 7); + +КонецПроцедуры + +// Обработчик подписки на событие ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизаций. +// Вызывается при записи элемента справочника "Организации". +// +Процедура ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизацийПриЗаписи(Источник, Отказ) Экспорт + + Если НЕ Источник.ЭтоГруппа + И НЕ ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций") + И Справочники.Организации.КоличествоОрганизаций() > 1 Тогда + + УстановитьПривилегированныйРежим(Истина); + Константы.ИспользоватьНесколькоОрганизаций.Установить(Истина); + УстановитьПривилегированныйРежим(Ложь); + + КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl index 27b8e4298..4061bc68b 100644 --- a/SSL/src/CommonModules/ОтправкаSMS/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMS/Module.bsl @@ -24,7 +24,7 @@ Результат = Новый Структура("ОтправленныеСообщения,ОписаниеОшибки", Новый Массив, ""); Если ПеревестиВТранслит Тогда - Текст = СтрокаЛатиницей(Текст); + Текст = СтроковыеФункцииКлиентСервер.СтрокаЛатиницей(Текст); КонецЕсли; Если Не НастройкаОтправкиSMSВыполнена() Тогда @@ -131,68 +131,3 @@ Возврат Результат; КонецФункции - -Функция СтрокаЛатиницей(Знач Строка) - Результат = ""; - - Соответствие = СоответствиеКириллицыИЛатиницы(); - - ПредыдущийСимвол = ""; - Для Позиция = 1 По СтрДлина(Строка) Цикл - Символ = Сред(Строка, Позиция, 1); - СимволЛатиницей = Соответствие[НРег(Символ)]; // поиск соответствия без учета регистра - Если СимволЛатиницей = Неопределено Тогда - // другие символы остаются "как есть" - СимволЛатиницей = Символ; - Иначе - Если Символ = ВРег(Символ) Тогда - СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр - КонецЕсли; - КонецЕсли; - Результат = Результат + СимволЛатиницей; - ПредыдущийСимвол = СимволЛатиницей; - КонецЦикла; - - Возврат Результат; -КонецФункции - -Функция СоответствиеКириллицыИЛатиницы() - // транслитерация, используемая в загранпаспортах 1997-2010 гг. - Соответствие = Новый Соответствие; - Соответствие.Вставить("а","a"); - Соответствие.Вставить("б","b"); - Соответствие.Вставить("в","v"); - Соответствие.Вставить("г","g"); - Соответствие.Вставить("д","d"); - Соответствие.Вставить("е","e"); - Соответствие.Вставить("ё","e"); - Соответствие.Вставить("ж","zh"); - Соответствие.Вставить("з","z"); - Соответствие.Вставить("и","i"); - Соответствие.Вставить("й","y"); - Соответствие.Вставить("к","k"); - Соответствие.Вставить("л","l"); - Соответствие.Вставить("м","m"); - Соответствие.Вставить("н","n"); - Соответствие.Вставить("о","o"); - Соответствие.Вставить("п","p"); - Соответствие.Вставить("р","r"); - Соответствие.Вставить("с","s"); - Соответствие.Вставить("т","t"); - Соответствие.Вставить("у","u"); - Соответствие.Вставить("ф","f"); - Соответствие.Вставить("х","kh"); - Соответствие.Вставить("ц","ts"); - Соответствие.Вставить("ч","ch"); - Соответствие.Вставить("ш","sh"); - Соответствие.Вставить("щ","shch"); - Соответствие.Вставить("ъ",""""); - Соответствие.Вставить("ы","y"); - Соответствие.Вставить("ь",""); // пропускается - Соответствие.Вставить("э","e"); - Соответствие.Вставить("ю","yu"); - Соответствие.Вставить("я","ya"); - - Возврат Соответствие; -КонецФункции - diff --git a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/ОтправкаSMSПереопределяемый.mdo b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/ОтправкаSMSПереопределяемый.mdo index 2561520ee..4f82294d9 100644 --- a/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/ОтправкаSMSПереопределяемый.mdo +++ b/SSL/src/CommonModules/ОтправкаSMSПереопределяемый/ОтправкаSMSПереопределяемый.mdo @@ -3,7 +3,7 @@ <name>ОтправкаSMSПереопределяемый</name> <synonym> <key>ru</key> - <value>Отправка SMSПереопределяемый</value> + <value>Отправка SMS Переопределяемый</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl index 4973f5d13..3623d39ae 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезБилайн/Module.bsl @@ -164,7 +164,7 @@ // отправка запроса и получение ответа Попытка - Соединение = Новый HTTPСоединение("beeline.amega-inform.ru", , , , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), 3); + Соединение = Новый HTTPСоединение("beeline.amega-inform.ru", , , , ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), 60); Соединение.ОтправитьДляОбработки(ИмяФайлаЗапроса, "/sendsms/", ИмяФайлаОтвета, Заголовок); Результат = ИмяФайлаОтвета; Исключение @@ -188,7 +188,7 @@ Если Не ПустаяСтрока(СтрокаЗапроса) Тогда СтрокаЗапроса = СтрокаЗапроса + "&"; КонецЕсли; - СтрокаЗапроса = СтрокаЗапроса + Параметр.Ключ + "=" + URLEncode(Параметр.Значение); + СтрокаЗапроса = СтрокаЗапроса + Параметр.Ключ + "=" + КодироватьСтроку(Параметр.Значение, СпособКодированияСтроки.КодировкаURL); КонецЦикла; ИмяФайлаЗапроса = ПолучитьИмяВременногоФайла("txt"); @@ -230,114 +230,3 @@ КонецЦикла; Возврат Результат; КонецФункции - -Функция URLEncode(Строка) - Результат = ""; - НаборСимволов = "0123456789ABCDEF"; - Для НомерСимвола = 1 По СтрДлина(Строка) Цикл - КодСимвола = КодСимвола(Строка, НомерСимвола); - Символ = Сред(Строка, НомерСимвола, 1); - - // пропускаем A..Z, a..z, 0..9 - Если Найти("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", Символ) > 0 Тогда // символы -_.!~*\() кодируем как небезопасные - Результат = Результат + Символ; - Продолжить; - КонецЕсли; - - Если Символ = " " Тогда - Результат = Результат + "+"; - Продолжить; - КонецЕсли; - - Если КодСимвола <= 127 Тогда // 0x007F - Результат = Результат + ПредставлениеБайта(КодСимвола); - ИначеЕсли КодСимвола <= 2047 Тогда // 0x07FF - Результат = Результат - + ПредставлениеБайта( - БинарныйМассивВЧисло( - ПобитовоеИли( - ЧислоВБинарныйМассив(192,8), - ЧислоВБинарныйМассив(Цел(КодСимвола / Pow(2,6)),8)))); // 0xc0 | (ch >> 6) - Результат = Результат - + ПредставлениеБайта( - БинарныйМассивВЧисло( - ПобитовоеИли( - ЧислоВБинарныйМассив(128,8), - ПобитовоеИ( - ЧислоВБинарныйМассив(КодСимвола,8), - ЧислоВБинарныйМассив(63,8))))); //0x80 | (ch & 0x3F) - Иначе // 0x7FF < ch <= 0xFFFF - Результат = Результат - + ПредставлениеБайта ( - БинарныйМассивВЧисло( - ПобитовоеИли( - ЧислоВБинарныйМассив(224,8), - ЧислоВБинарныйМассив(Цел(КодСимвола / Pow(2,12)),8)))); // 0xe0 | (ch >> 12) - - Результат = Результат - + ПредставлениеБайта( - БинарныйМассивВЧисло( - ПобитовоеИли( - ЧислоВБинарныйМассив(128,8), - ПобитовоеИ( - ЧислоВБинарныйМассив(Цел(КодСимвола / Pow(2,6)),8), - ЧислоВБинарныйМассив(63,8))))); //0x80 | ((ch >> 6) & 0x3F) - - Результат = Результат - + ПредставлениеБайта( - БинарныйМассивВЧисло( - ПобитовоеИли( - ЧислоВБинарныйМассив(128,8), - ПобитовоеИ( - ЧислоВБинарныйМассив(КодСимвола,8), - ЧислоВБинарныйМассив(63,8))))); //0x80 | (ch & 0x3F) - - КонецЕсли; - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПредставлениеБайта(Знач Байт) - Результат = ""; - СтрокаСимволов = "0123456789ABCDEF"; - Для Счетчик = 1 По 2 Цикл - Результат = Сред(СтрокаСимволов, Байт % 16 + 1, 1) + Результат; - Байт = Цел(Байт / 16); - КонецЦикла; - Возврат "%" + Результат; -КонецФункции - -Функция ЧислоВБинарныйМассив(Знач Число, Знач ВсегоРазрядов = 32) - Результат = Новый Массив; - ТекущийРазряд = 0; - Пока ТекущийРазряд < ВсегоРазрядов Цикл - ТекущийРазряд = ТекущийРазряд + 1; - Результат.Добавить(Булево(Число % 2)); - Число = Цел(Число / 2); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция БинарныйМассивВЧисло(Массив) - Результат = 0; - Для НомерРазряда = -(Массив.Количество()-1) По 0 Цикл - Результат = Результат * 2 + Число(Массив[-НомерРазряда]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеИ(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] И БинарныйМассив2[Индекс]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеИли(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] Или БинарныйМассив2[Индекс]); - КонецЦикла; - Возврат Результат; -КонецФункции diff --git a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl index ea65ccdf7..7b411b465 100644 --- a/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl +++ b/SSL/src/CommonModules/ОтправкаSMSЧерезМТС/Module.bsl @@ -23,7 +23,7 @@ Функция ОтправитьSMS(НомераПолучателей, Текст, ИмяОтправителя, Логин, Знач Пароль) Экспорт Результат = Новый Структура("ОтправленныеСообщения,ОписаниеОшибки", Новый Массив, ""); - Пароль = СтроковыеФункцииКлиентСервер.ВычислитьХешСтрокиПоАлгоритмуMD5(Пароль); + Пароль = ВычислитьХешСтрокиПоАлгоритмуMD5(Пароль); ВебСервис = ПодключитьВебСервис(); @@ -64,7 +64,7 @@ // Возвращаемое значение: // Строка - статус доставки. См. описание функции ОтправкаSMS.СтатусДоставки. Функция СтатусДоставки(ИдентификаторСообщения, Логин, Знач Пароль) Экспорт - Пароль = СтроковыеФункцииКлиентСервер.ВычислитьХешСтрокиПоАлгоритмуMD5(Пароль); + Пароль = ВычислитьХешСтрокиПоАлгоритмуMD5(Пароль); ВебСервис = ПодключитьВебСервис(); ArrayOfDeliveryInfo = ВебСервис.GetMessageStatus(ИдентификаторСообщения, Логин, Пароль); Для Каждого DeliveryInfo Из ArrayOfDeliveryInfo.DeliveryInfo Цикл @@ -99,14 +99,17 @@ КонецФункции Функция ПодключитьВебСервис() - Возврат ОбщегоНазначения.WSПрокси( - "http://www.mcommunicator.ru/m2m/m2m_api.asmx?WSDL", - "http://mcommunicator.ru/M2M", + + Возврат WSСсылки.ОтправкаSMSЧерезМТС.СоздатьWSПрокси("http://mcommunicator.ru/M2M", "MTS_x0020_Communicator_x0020_M2M_x0020_XML_x0020_API", "MTS_x0020_Communicator_x0020_M2M_x0020_XML_x0020_APISoap12", - "", - "", - 60, - Ложь); + ПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("http"), + 60); + КонецФункции +Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка) + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(Строка); + Возврат СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl similarity index 100% rename from SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/Module.bsl rename to SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/Module.bsl diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/ОценкаПроизводительностиПовтИсп.mdo b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/ОценкаПроизводительностиВызовСервераПовтИсп.mdo similarity index 61% rename from SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/ОценкаПроизводительностиПовтИсп.mdo rename to SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/ОценкаПроизводительностиВызовСервераПовтИсп.mdo index 6a200a689..2f99a8c31 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиПовтИсп/ОценкаПроизводительностиПовтИсп.mdo +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПовтИсп/ОценкаПроизводительностиВызовСервераПовтИсп.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fcb46a8a-3461-4ec2-9aa0-685aedb9dd50"> - <name>ОценкаПроизводительностиПовтИсп</name> + <name>ОценкаПроизводительностиВызовСервераПовтИсп</name> <synonym> <key>ru</key> - <value>Оценка производительности повт исп</value> + <value>Оценка производительности вызов сервера повт исп</value> </synonym> <server>true</server> <serverCall>true</serverCall> diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПолныеПрава/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПолныеПрава/Module.bsl index a2d77cdba..e7b0da662 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПолныеПрава/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиВызовСервераПолныеПрава/Module.bsl @@ -52,7 +52,7 @@ // Процедура ЭкспортОценкиПроизводительности(КаталогиЭкспорта) Экспорт // Если система отключена, то выгрузку данных делать не будем. - Если Не ОценкаПроизводительностиПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда + Если Не ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда Возврат; КонецЕсли; @@ -91,9 +91,7 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ Функция УстановитьАвтоматическоеОбновлениеКлючевыхОперацийВРИБ() Экспорт - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Выполнить("Справочники.КлючевыеОперации.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически)"); - КонецЕсли; + Справочники.КлючевыеОперации.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически); КонецФункции /////////////////////////////////////////////////////////////////////////////// @@ -245,18 +243,24 @@ ТекстЗапроса = ТекстЗапроса + ИндексироватьПо + РазделительВременныхТаблиц; - Выборка = Справочники.КлючевыеОперации.Выбрать(); + ЗапросНаКлючевыеОперации = Новый Запрос; + ЗапросНаКлючевыеОперации.Текст = "ВЫБРАТЬ + | КлючевыеОперации.Ссылка, + | КлючевыеОперации.ЦелевоеВремя + |ИЗ + | Справочник.КлючевыеОперации КАК КлючевыеОперации + |ГДЕ + | КлючевыеОперации.Ссылка <> ЗНАЧЕНИЕ(Справочник.КлючевыеОперации.ОбщаяПроизводительностьСистемы) + | И КлючевыеОперации.ПометкаУдаления = ЛОЖЬ"; + + Выборка = ЗапросНаКлючевыеОперации.Выполнить().Выбрать(); НетКлючевыхОпераций = Истина; НомерКлючевойОперации = 1; Пока Выборка.Следующий() Цикл - Если Выборка.ПометкаУдаления Или Выборка.Ссылка = Справочники.КлючевыеОперации.ОбщаяПроизводительностьСистемы Тогда - Продолжить; - КонецЕсли; - Запрос.УстановитьПараметр("КлючеваяОперация" + НомерКлючевойОперации, Выборка.Ссылка); - Запрос.УстановитьПараметр("КлючеваяОперация" + НомерКлючевойОперации + "_МаксВремя", 1000 * Выборка.Ссылка.ЦелевоеВремя); + Запрос.УстановитьПараметр("КлючеваяОперация" + НомерКлючевойОперации + "_МаксВремя", 1000 * Выборка.ЦелевоеВремя); Врем = СтрЗаменить(ПолучениеЗамеров, "%НомерКлючевойОперации%", Строка(НомерКлючевойОперации)); Врем = СтрЗаменить(Врем, "%ИмяВременнойТаблицы%", ?(НомерКлючевойОперации = 1, "ПОМЕСТИТЬ ВТ_Замеры", "")); ТекстЗапроса = ТекстЗапроса + Врем + ОбъединитьВсе; @@ -264,6 +268,7 @@ НомерКлючевойОперации = НомерКлючевойОперации + 1; НетКлючевыхОпераций = Ложь; КонецЦикла; + // Если нет ключевых операций, то возвращаем пустую выборку. Если НетКлючевыхОпераций Тогда Запрос.Текст = "Выбрать 1 ГДЕ 1 < 0;"; diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl index 04cd2ba3f..392e1cdde 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиент/Module.bsl @@ -87,165 +87,13 @@ КонецПроцедуры -// Выполняет работу с ДиалогРаботыСФайлами с учетом веб-клиента. -// -// Параметры: -// РежимДиалога - РежимДиалогаВыбораФайла, режим, в котором следует открыть диалог -// РезультатВыбора - -// Строка, результат выбора -// Неопределено, пользователь не выбрал каталог, но и не отказался от выполнения действий -// МестоХранения - Строка, если действие выполняется в веб-клиенте необходим для запроса разрешения на действие -// Расширение - Строка, расширение сохраняемого/загружаемого файла -// -// Возвращаемое значение: -// Булево - -// Истина, диалог был вызван и пользователь выполнил необходимые действия -// Ложь, пользователь отказался от выполнения каких-либо действий -// -Функция ВызватьДиалогРаботыСФайлами(Знач РежимДиалога, РезультатВыбора, Знач МестоХранения = "", Знач Расширение = "") Экспорт - - РасширениеПодключено = Ложь; - Результат = ОбработатьРасширениеРаботыСФайлами(РасширениеПодключено); - - Если РасширениеПодключено Тогда - - ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалога); - Если Не ПустаяСтрока(Расширение) Тогда - ДиалогВыбора.Фильтр = "*." + Расширение + "| *." + Расширение; - ДиалогВыбора.Расширение = Расширение; - КонецЕсли; - - Если ДиалогВыбора.Выбрать() Тогда - Если РежимДиалога = РежимДиалогаВыбораФайла.ВыборКаталога Тогда - РезультатВыбора = ДиалогВыбора.Каталог; - Иначе - РезультатВыбора = ДиалогВыбора.ПолноеИмяФайла; - КонецЕсли; - Иначе - Результат = Ложь; - КонецЕсли; - - Иначе - РезультатВыбора = Неопределено; - КонецЕсли; - - #Если ВебКлиент Тогда - Если РасширениеПодключено И Результат Тогда - Если РежимДиалога = РежимДиалогаВыбораФайла.Сохранение Тогда - Результат = ЗапроситьРазрешениеНаПолучениеФайла(МестоХранения, РезультатВыбора); - ИначеЕсли РежимДиалога = РежимДиалогаВыбораФайла.Открытие Тогда - - КонецЕсли; - КонецЕсли; - #КонецЕсли - - Возврат Результат; - -КонецФункции - -// Выполняет попытку подключения расширения работы с файлами -// -// Параметры: -// РасширениеПодключено - Булево: -// Истина, расширение подключено -// Ложь, расширение не подключено -// -// Возвращаемое значение: -// Булево - -// Истина, расширение было или не было подключено, пользователь не отказался от выполнения операции -// Ложь, пользователь отказался от выполнения операции -// -Функция ОбработатьРасширениеРаботыСФайлами(РасширениеПодключено) - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Результат = РасширениеПодключено; - - Если Не РасширениеПодключено Тогда - - КодВозврата = Вопрос(НСтр("ru = 'Расширение работы с файлами не установлено, установить? - |""Да"" - Выполнить попытку установки расширения - |""Нет"" - Экспорт будет выполнен стандартными средствами браузера - |""Отмена"" - Отменить экспорт'"), РежимДиалогаВопрос.ДаНетОтмена); - - Если КодВозврата = КодВозвратаДиалога.Да Тогда - - УстановитьРасширениеРаботыСФайлами(); - Если Не ПодключитьРасширениеРаботыСФайлами() Тогда - - КодВозврата = Вопрос(НСтр("ru = 'Выполнить стандартными средствами браузера?'"), РежимДиалогаВопрос.ДаНет); - Если КодВозврата = КодВозвратаДиалога.Да Тогда - РасширениеПодключено = Ложь; - Результат = Истина; - ИначеЕсли КодВозврата = КодВозвратаДиалога.Нет Тогда - РасширениеПодключено = Ложь; - Результат = Ложь; - КонецЕсли; - - Иначе - РасширениеПодключено = Истина; - Результат = Истина; - КонецЕсли; - - ИначеЕсли КодВозврата = КодВозвратаДиалога.Нет Тогда - РасширениеПодключено = Ложь; - Результат = Истина; - ИначеЕсли КодВозврата = КодВозвратаДиалога.Отмена Тогда - РасширениеПодключено = Ложь; - Результат = Ложь; - КонецЕсли; - - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Запрашивает разрешение у пользователя на получение файла -// -// Параметры: -// Хранение - Строка, содержит положение файла на сервере -// Имя - Строка, содержит положение файла на клиенте -// -// Возвращаемое значение: -// Булево - -// Истина, разрешение получено -// Ложь, разрешение не получено -// -Функция ЗапроситьРазрешениеНаПолучениеФайла(Хранение, Имя) - - ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла; - ОписаниеПередаваемогоФайла.Хранение = Хранение; - ОписаниеПередаваемогоФайла.Имя = Имя; - - МассивФайлов = Новый Массив; - МассивФайлов.Добавить(ОписаниеПередаваемогоФайла); - - ОписаниеВызова = Новый Массив; - ОписаниеВызова.Добавить("ПолучитьФайлы"); - ОписаниеВызова.Добавить(МассивФайлов); - ОписаниеВызова.Добавить(""); - ОписаниеВызова.Добавить(""); - ОписаниеВызова.Добавить(Ложь); - - Вызовы = Новый Массив; - Вызовы.Добавить(ОписаниеВызова); - - - Возврат ЗапроситьРазрешениеПользователя(Вызовы); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП // Вызывается перед интерактивным завершением работы пользователя с областью данных. // Соответствует событию ПередЗавершениемРаботыСистемы модулей приложения. // -// Параметры: -// Отказ - Булево - отказ в от начала работы. Если параметр установить -// Истина, тогда начало работы с областью данных будет прервано. -// -Процедура ПередЗавершениемРаботыСистемы(Отказ) Экспорт +Процедура ПередЗавершениемРаботыСистемы(Параметры) Экспорт ЗаписатьРезультатыАвтоНеГлобальный(Истина); diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl index e61d1386d..9a3858954 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиКлиентСервер/Module.bsl @@ -18,7 +18,7 @@ Функция НачатьЗамерВремени(КлючеваяОперация = Неопределено) Экспорт ВремяНачала = 0; - Если ОценкаПроизводительностиПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда + Если ОценкаПроизводительностиВызовСервераПовтИсп.ВыполнятьЗамерыПроизводительности() Тогда ДатаНачала = ЗначениеТаймера(Ложь); ВремяНачала = ЗначениеТаймера(); #Если Клиент Тогда @@ -96,7 +96,7 @@ Перем ЗначениеТаймера; Если ВысокаяТочность Тогда - ЗначениеТаймера = Вычислить("ТекущаяУниверсальнаяДатаВМиллисекундах()")/1000.0; + ЗначениеТаймера = ТекущаяУниверсальнаяДатаВМиллисекундах() / 1000.0; Возврат ЗначениеТаймера; Иначе diff --git a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl index 51626ecd2..b16fbe8ea 100644 --- a/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОценкаПроизводительностиСлужебный/Module.bsl @@ -19,12 +19,6 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииОбработчиковУстановкиПараметровСеанса"].Добавить( "ОценкаПроизводительностиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОценкаПроизводительностиСлужебный"); - КонецЕсли; - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -41,13 +35,3 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. -// -// Параметры -// Объекты - Массив(ОбъектМетаданных). -// -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт - - Объекты.Добавить(Метаданные.РегистрыСведений.ЗамерыВремени); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl index 76169c6fb..f3b575436 100644 --- a/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданий/Module.bsl @@ -337,7 +337,7 @@ СтандартнаяОбработка = Истина; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриОпределенииЗапланированногоМоментаЗапуска( ПараметрыЗадания, ПланируемыйМоментЗапуска, @@ -381,7 +381,7 @@ СтандартнаяОбработка = Истина; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределенныйСправочник = МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриВыбореСправочникаДляЗадания(ПараметрыЗадания); Если ПереопределенныйСправочник <> Неопределено Тогда СправочникДляЗадания = ПереопределенныйСправочник; @@ -504,7 +504,7 @@ СтандартнаяОбработка = Истина; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриОпределенииЗапланированногоМоментаЗапуска( ПараметрыЗадания, ЗапланированныйМоментЗапуска, diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl index bc26c9f26..a49c2755d 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебный/Module.bsl @@ -149,10 +149,6 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( "ОчередьЗаданийСлужебный"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "ОчередьЗаданийСлужебный"); - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -174,17 +170,6 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. -// -// Параметры -// Объекты - Массив(ОбъектМетаданных). -// -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт - - Объекты.Добавить(Метаданные.Справочники.ОчередьЗаданий); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -275,8 +260,8 @@ Результат = ОбщегоНазначения.ВыполнитьЗапросВнеТранзакции(Запрос); Выборка = Результат.Выбрать(); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Иначе МодульРаботаВМоделиСервиса = Неопределено; КонецЕсли; @@ -457,8 +442,8 @@ РазмерВыборкиТекст = Формат(МаксимальноеКоличествоИсполняющихФоновыхЗаданий * 3, "ЧН=; ЧГ="); Запрос.Текст = СтрЗаменить(Запрос.Текст, "111", РазмерВыборкиТекст); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Иначе МодульРаботаВМоделиСервиса = Неопределено; КонецЕсли; @@ -675,8 +660,8 @@ ИмяМетода = ОчередьЗаданийСлужебныйПовтИсп.СоответствиеИменМетодовПсевдонимам().Получить(ВРег(Псевдоним)); Если ИмяМетода = Неопределено Тогда - ШаблонСообщения = НСтр("ru = 'У метода %1 не зарегистрирован псевдоним для вызова через очередь заданий.'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, ИмяМетода); + ШаблонСообщения = НСтр("ru = 'Метод %1 не разрешен к вызову через очередь заданий.'"); + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Псевдоним); ВызватьИсключение(ТекстСообщения); КонецЕсли; @@ -1145,7 +1130,7 @@ ОбластьДанных = Неопределено; Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); ПереопределеннаяОбластьДанных = МодульОчередьЗаданийСлужебныйРазделениеДанных.ОпределитьОбластьДанныхДляЗадания(Ссылка); Если ПереопределеннаяОбластьДанных <> Неопределено Тогда ОбластьДанных = ПереопределеннаяОбластьДанных; @@ -1219,9 +1204,9 @@ ОтменитьТранзакцию(); КонецЦикла; - ШаблонСообщения = НСтр("ru = 'По завершении выполнения обработчика %1 не была закрыта транзакция'", Метаданные.ОсновнойЯзык.КодЯзыка); + ШаблонСообщения = НСтр("ru = 'По завершении выполнения обработчика %1 не была закрыта транзакция'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Задание.ИмяМетода); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий. Выполнение'", + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , @@ -1229,6 +1214,23 @@ ТекстСообщения); КонецЕсли; + + Если ОбластьДанных = -1 И ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + + ТекстСообщенияОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'По завершении выполнения обработчика %1 не было выключено разделение сеанса!'"), + Задание.ИмяМетода); + + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + УровеньЖурналаРегистрации.Ошибка, + , + , + ТекстСообщенияОбОшибке); + + ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + + КонецЕсли; ЗаписьКонтроляВыполнения(НСтр("ru = 'Очередь регламентных заданий.Завершено успешно'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), Ссылка); @@ -1238,12 +1240,16 @@ Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; + Если ОбластьДанных = -1 И ОбщегоНазначенияПовтИсп.РазделениеВключено() + И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + КонецЕсли; ЗаписьКонтроляВыполнения(НСтр("ru = 'Очередь регламентных заданий.Завершено с ошибками'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), Ссылка, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий. Выполнение'", + ЗаписьЖурналаРегистрации(НСтр("ru = 'Очередь регламентных заданий.Выполнение'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , @@ -1277,6 +1283,10 @@ Пока ТранзакцияАктивна() Цикл ОтменитьТранзакцию(); КонецЦикла; + Если ОбластьДанных = -1 И ОбщегоНазначенияПовтИсп.РазделениеВключено() + И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда + ОбщегоНазначения.УстановитьРазделениеСеанса(Ложь); + КонецЕсли; ШаблонКомментария = НСтр("ru = 'Ошибка при выполнении обработчика ошибок |Псевдоним метода: %1 @@ -1290,7 +1300,7 @@ ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ЗаписьЖурналаРегистрации( - НСтр("ru = 'Очередь регламентных заданий. Ошибка обработчика ошибок'", + НСтр("ru = 'Очередь регламентных заданий.Ошибка обработчика ошибок'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl index 52f074bb6..026e65c32 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйПовтИсп/Module.bsl @@ -279,7 +279,7 @@ МассивСправочников.Добавить(Справочники.ОчередьЗаданий); Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриЗаполненииСправочниковЗаданий(МассивСправочников); КонецЕсли; diff --git a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl index 1049ab97a..63e8da2dd 100644 --- a/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl +++ b/SSL/src/CommonModules/ОчередьЗаданийСлужебныйРазделениеДанных/Module.bsl @@ -375,13 +375,17 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( "ОчередьЗаданийСлужебныйРазделениеДанных"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "ОчередьЗаданийСлужебныйРазделениеДанных"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ОчередьЗаданийСлужебныйРазделениеДанных"); + + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( "ОчередьЗаданийСлужебныйРазделениеДанных"); + + КонецЕсли; КонецПроцедуры @@ -400,6 +404,8 @@ Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "ОчередьЗаданийСлужебныйРазделениеДанных.СоздатьЗаданияОчередиПоШаблонамВТекущейОбласти"; Обработчик.МонопольныйРежим = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 98; Обработчик = Обработчики.Добавить(); Обработчик.Версия = "*"; @@ -439,14 +445,14 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.Справочники.ОчередьЗаданийОбластейДанных); + Типы.Добавить(Метаданные.Справочники.ОчередьЗаданийОбластейДанных); КонецПроцедуры diff --git a/SSL/src/CommonModules/ПерепрефиксацияОбъектов/Module.bsl b/SSL/src/CommonModules/ПерепрефиксацияОбъектов/Module.bsl index f01173d60..2637fef1f 100644 --- a/SSL/src/CommonModules/ПерепрефиксацияОбъектов/Module.bsl +++ b/SSL/src/CommonModules/ПерепрефиксацияОбъектов/Module.bsl @@ -131,9 +131,9 @@ ВызватьИсключение НСтр("ru = 'Изменение префикса информационной базы не может выполняться в транзакции.'"); - ИначеЕсли Не Пользователи.РолиДоступны("ПолныеПрава") Тогда + ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Нет прав на изменение префикса информационной базы.'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для изменения префикса информационной базы.'"); КонецЕсли; @@ -169,9 +169,9 @@ ВызватьИсключение НСтр("ru = 'Изменение префикса информационной базы не может выполняться в транзакции.'"); - ИначеЕсли Не Пользователи.РолиДоступны("ПолныеПрава") Тогда + ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Нет прав на изменение префикса информационной базы.'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для изменения префикса информационной базы.'"); КонецЕсли; @@ -445,9 +445,9 @@ ВызватьИсключение НСтр("ru = 'Изменение префикса информационной базы не может выполняться в транзакции.'"); - ИначеЕсли Не Пользователи.РолиДоступны("ПолныеПрава") Тогда + ИначеЕсли Не Пользователи.ЭтоПолноправныйПользователь() Тогда - ВызватьИсключение НСтр("ru = 'Нет прав на изменение префикса информационной базы.'"); + ВызватьИсключение НСтр("ru = 'Недостаточно прав для изменения префикса информационной базы.'"); КонецЕсли; @@ -980,10 +980,14 @@ ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяОбъекта]", ИмяОбъекта); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[Код]", ?(ЭтоДокумент, "Номер", "Код")); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ВыборкаОрганизации]", ?(ВыбиратьОрганизацию, "Таблица.Организация КАК Организация,", "")); + Если ВыбиратьОрганизацию Тогда + ИмяПоляОрганизации = ПрефиксацияОбъектовСобытия.ИмяРеквизитаОрганизация(ИмяОбъекта); + КонецЕсли; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ВыборкаОрганизации]", + ?(ВыбиратьОрганизацию, "Таблица." + ИмяПоляОрганизации + " КАК Организация,", "")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПрефиксОрганизацииЗадан]", ?(ВыбиратьОрганизацию, - "ВЫБОР КОГДА Таблица.Организация.Префикс = """" ТОГДА Ложь ИНАЧЕ Истина КОНЕЦ КАК ПрефиксОрганизацииЗадан,", + "ВЫБОР КОГДА Таблица." + ИмяПоляОрганизации + ".Префикс = """" ТОГДА Ложь ИНАЧЕ Истина КОНЕЦ КАК ПрефиксОрганизацииЗадан,", "Ложь КАК ПрефиксОрганизацииЗадан,")); ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ВыборкаДаты]", ?(ЭтоДокумент, "Таблица.Дата КАК Дата,", "Неопределено КАК Дата,")); @@ -1473,7 +1477,7 @@ // Процедура ПриОпределенииФункциональнойОпцииПрефиксыОрганизаций(ФункциональнаяОпцияИспользуется) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда ФункциональнаяОпцияИспользуется = Истина; Иначе ФункциональнаяОпцияИспользуется = Ложь; @@ -1488,7 +1492,7 @@ // Процедура ПриОпределенииФункциональнойОпцииПрефиксИнформационнойБазы(ФункциональнаяОпцияИспользуется) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда ФункциональнаяОпцияИспользуется = Истина; Иначе ФункциональнаяОпцияИспользуется = Ложь; @@ -1500,8 +1504,8 @@ // Процедура ПриОпределенииПрефиксаИнформационнойБазы(ПрефиксИнформационнойБазы) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); ПрефиксИнформационнойБазы = МодульОбменДаннымиСервер.ПрефиксИнформационнойБазы(); Иначе ПрефиксИнформационнойБазы = ""; @@ -1517,7 +1521,7 @@ // Процедура ПриОпределенииПрефиксаОрганизации(Знач Организация, ПрефиксОрганизации) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда ИмяФункциональнойОпции = "ПрефиксыОрганизаций"; ПрефиксОрганизации = ПолучитьФункциональнуюОпцию(ИмяФункциональнойОпции, Новый Структура("Организация", Организация)); Иначе @@ -1530,8 +1534,8 @@ // Процедура УстановитьПрефиксИнформационнойБазы(Знач Префикс) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.УстановитьПрефиксИнформационнойБазы(Префикс); КонецЕсли; diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/Module.bsl deleted file mode 100644 index 8dda3782a..000000000 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/Module.bsl +++ /dev/null @@ -1,39 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Полнотекстовый поиск". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов в другие подсистемы - -// Вызывается при открытии объекта из полнотекстового поиска -// Функция ПриОткрытииОбъекта позволяет настроить -// поведение при открытии результата из списка найденного в полнотекстовом поиске -// Например, это необходимо при использовании подсистемы "Бизнес-процессы и задачи". -// -// Параметры -// Значение - объект, найденный в полнотекстовом поиске, например СправочникСсылка -// СтандартнаяОбработка - Булево - по умолчанию Истина. -// Если поведение изменено (по собственной механике делается открытие формы для Значение), -// то СтандартнаяОбработка надо установить в Ложь -// -// При использовании подсистемы "Бизнес-процессы и задачи" нужно -// вписать следующий код: -// -//Если ТипЗнч(Значение) = Тип("ЗадачаСсылка.ЗадачаИсполнителя") Тогда -// Если БизнесПроцессыИЗадачиКлиент.ОткрытьФормуВыполненияЗадачи(Значение) Тогда -// СтандартнаяОбработка = Ложь; -// КонецЕсли; -//КонецЕсли; -// -Процедура ПолнотекстовыйПоискПриОткрытииОбъекта(Значение, СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("БизнесПроцессыИЗадачиКлиент"); - МодульБизнесПроцессыИЗадачиКлиент.ПолнотекстовыйПоискПриОткрытииОбъекта(Значение, СтандартнаяОбработка); - КонецЕсли; - -КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl index b1ef68b1e..c6961483b 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолнотекстовыйПоискСервер/Module.bsl @@ -7,7 +7,6 @@ // ПРОГРАММНЫЙ ИНТЕРФЕЙС // Обновляет индекс полнотекстового поиска. -// Процедура ОбновлениеИндексаППД() Экспорт ОбновитьИндекс(НСтр("ru = 'Обновление индекса ППД'"), Ложь, Истина); @@ -15,7 +14,6 @@ КонецПроцедуры // Выполняет слияние индексов полнотекстового поиска. -// Процедура СлияниеИндексаППД() Экспорт ОбновитьИндекс(НСтр("ru = 'Слияние индекса ППД'"), Истина); @@ -23,7 +21,7 @@ КонецПроцедуры // Возвращает, актуален ли индекс полнотекстового поиска. -// Проверка функциональной опции "ИспользоватьПолнотекстовыйПоиск" выполняется в вызывающем коде. +// Проверка функциональной опции "ИспользоватьПолнотекстовыйПоиск" выполняется в вызывающем коде. // Функция ИндексПоискаАктуален() Экспорт @@ -59,7 +57,7 @@ // Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. // // Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления +// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления // общего модуля ОбновлениеИнформационнойБазы. // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт @@ -72,9 +70,9 @@ КонецПроцедуры // Устанавливает значение константы ИспользоватьПолнотекстовыйПоиск. -// Используется для синхронизации значения -// функциональной опции "ИспользоватьПолнотекстовыйПоиск" -// с "ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()". +// Используется для синхронизации значения +// функциональной опции "ИспользоватьПолнотекстовыйПоиск" +// с "ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска()". // Процедура ИнициализироватьФункциональнуюОпциюПолнотекстовыйПоиск() Экспорт @@ -87,7 +85,6 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Общая процедура для обновления и слияния индекса ППД. -// Процедура ОбновитьИндекс(ПредставлениеПроцедуры, РазрешитьСлияние = Ложь, Порциями = Ложь) Если ПустаяСтрока(ИмяПользователя()) Тогда @@ -110,7 +107,6 @@ КонецПроцедуры // Возвращает разрешены ли операции полнотекстового поиска: обновление индексов, очистка индексов, поиск. -// Функция ОперацииРазрешены() Возврат ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить; @@ -124,14 +120,12 @@ // ошибки добавляется в комментарий записи в журнал регистрации. // // Параметры: -// УровеньЖурнала (УровеньЖурналаРегистрации) Важность сообщения для администратора. -// КомментарийСПараметрами (Строка) Комментарий, который может содержать параметры %1, %2 и %3. -// ИнформацияОбОшибке (...) Информация об ошибке, которая будет размещена после комментария. -// |- (ИнформацияОбОшибке) -// |- (Строка) -// Параметр1 (Строка) Для подстановки в КомментарийСПараметрами вместо %1. -// Параметр2 (Строка) Для подстановки в КомментарийСПараметрами вместо %2. -// Параметр3 (Строка) Для подстановки в КомментарийСПараметрами вместо %3. +// УровеньЖурнала - УровеньЖурналаРегистрации - Важность сообщения для администратора. +// КомментарийСПараметрами - Строка - Комментарий, который может содержать параметры %1, %2 и %3. +// ИнформацияОбОшибке - ИнформацияОбОшибке, Строка - Информация об ошибке, которая будет размещена после комментария. +// Параметр1 - Строка - Для подстановки в КомментарийСПараметрами вместо %1. +// Параметр2 - Строка - Для подстановки в КомментарийСПараметрами вместо %2. +// Параметр3 - Строка - Для подстановки в КомментарийСПараметрами вместо %3. // Процедура ЗаписьЖурнала(УровеньЖурнала = Неопределено, КомментарийСПараметрами = "", ИнформацияОбОшибке = Неопределено, diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl index 85633ea0b..73e652369 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернета/Module.bsl @@ -23,7 +23,7 @@ // что соединение должно пассивным (или активным) // // Возвращаемое значение: -// Структура, со свойствами +// Структура - свойства: // Статус - Булево - ключ присутствует в структуре всегда, значения // Истина - вызов функции успешно завершен // Ложь - вызов функции завершен неудачно @@ -31,7 +31,7 @@ // если статус Истина // СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь // -Функция СкачатьФайлНаСервере(знач URL, ПараметрыПолучения = Неопределено) Экспорт +Функция СкачатьФайлНаСервере(Знач URL, ПараметрыПолучения = Неопределено) Экспорт // Объявление переменных перед первым использованием в качестве // параметра метода Свойство, при анализе параметров получения файлов @@ -106,7 +106,7 @@ // что соединение должно пассивным (или активным) // // Возвращаемое значение: -// Структура со свойствами +// Структура - свойства: // Статус - Булево - ключ присутствует в структуре всегда, значения // Истина - вызов функции успешно завершен // Ложь - вызов функции завершен неудачно @@ -114,7 +114,7 @@ // ключ используется только если статус Истина // СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь // -Функция СкачатьФайлВоВременноеХранилище(знач URL, ПараметрыПолучения = Неопределено) Экспорт +Функция СкачатьФайлВоВременноеХранилище(Знач URL, ПараметрыПолучения = Неопределено) Экспорт // Объявление переменных перед первым использованием в качестве // параметра метода Свойство, при анализе параметров получения файлов @@ -175,6 +175,16 @@ // Возвращает настройку прокси сервера для доступа в Интернет со стороны // клиента для текущего пользователя. // +// Возвращаемое значение: +// Соответствие - свойства: +// ИспользоватьПрокси - использовать ли прокси-сервер +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера +// Сервер - адрес прокси-сервера +// Порт - порт прокси-сервера +// Пользователь - имя пользователя для авторизации на прокси-сервере +// Пароль - пароль пользователя +// Функция НастройкиПроксиНаКлиенте() Экспорт Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкаПроксиСервера"); @@ -183,6 +193,16 @@ // Возвращает параметры настройки прокси-сервера на стороне сервера 1С:Предприятие // +// Возвращаемое значение: +// Соответствие - свойства: +// ИспользоватьПрокси - использовать ли прокси-сервер +// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов +// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера +// Сервер - адрес прокси-сервера +// Порт - порт прокси-сервера +// Пользователь - имя пользователя для авторизации на прокси-сервере +// Пароль - пароль пользователя +// Функция НастройкиПроксиНаСервере() Экспорт Если ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Файловый Тогда @@ -213,22 +233,3 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики условных вызовов - -// Получает настройки прокси на сервере. -// -Процедура ПриОпределенииНастроекПрокси(Прокси) Экспорт - - НастройкаПроксиСервера = НастройкиПроксиНаСервере(); - Если НастройкаПроксиСервера <> Неопределено Тогда - Прокси = Новый ИнтернетПрокси(); - Прокси.Установить("ftp", НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); - ЗаполнитьЗначенияСвойств(Прокси, НастройкаПроксиСервера); - КонецЕсли; - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl index 43bc78e3f..8ce43381e 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиент/Module.bsl @@ -22,6 +22,9 @@ // что соединение должно производиться через https // ПассивноеСоединение - - Булево - для случая ftp загрузки флаг указывает, // что соединение должно пассивным (или активным) +// ЗаписыватьОшибку - Булево - Признак необходимости записывать сообщение в журнал регистрации +// при возникновении ошибки при скачивании файла. Например, если +// файл отсутствует по заданному пути. // // помеченные знаком '*' являются обязательными // @@ -34,7 +37,7 @@ // если статус Истина // СообщениеОбОшибке - Строка - сообщение об ошибке, если статус Ложь // -Функция СкачатьФайлНаКлиенте(знач URL, знач ПараметрыПолучения = Неопределено) Экспорт +Функция СкачатьФайлНаКлиенте(Знач URL, Знач ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина) Экспорт // Объявление переменных перед первым использованием в качестве // параметра метода Свойство, при анализе параметров получения файлов @@ -67,8 +70,17 @@ Таймаут, ЗащищенноеСоединение, ПассивноеСоединение, - НастройкаСохранения); + НастройкаСохранения, + ЗаписыватьОшибку); Возврат Результат; КонецФункции + +// Открывает форму для ввода параметров прокси сервера +// +Процедура ОткрытьФормуПараметровПроксиСервера() Экспорт + + ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера"); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl index a796952d6..f04ea8dd9 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаКлиентСервер/Module.bsl @@ -6,10 +6,28 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Создает экземпляр ИнтернетПрокси по сохраненным настройкам. -Функция ПолучитьПрокси(Протокол) Экспорт +// Возвращает объект ИнтернетПрокси для доступа в Интернет. +// +// Параметры: +// URLИлиПротокол - Строка - url в формате [Протокол://]<Сервер>/<Путь к файлу на сервере>, +// либо идентификатор протокола (http, ftp, ...) +// +// Возвращаемое значение: +// ИнтернетПрокси +// +Функция ПолучитьПрокси(Знач URLИлиПротокол) Экспорт - Возврат СформироватьПрокси(ПолучитьПустыеНастройкиПроксиСервера(), Протокол); +#Если Клиент Тогда + НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; +#Иначе + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); +#КонецЕсли + Если Найти(URLИлиПротокол, "://") > 0 Тогда + Протокол = РазделитьURL(URLИлиПротокол).Протокол; + Иначе + Протокол = НРег(URLИлиПротокол); + КонецЕсли; + Возврат СформироватьИнтернетПрокси(НастройкаПроксиСервера, Протокол); КонецФункции @@ -24,12 +42,12 @@ // ИмяСервера - Строка - сервер, на котором располагается ресурс // ПутьКФайлуНаСервере - Строка - путь к ресурсу на сервере // -Функция РазделитьURL(знач URL) Экспорт +Функция РазделитьURL(Знач URL) Экспорт СтруктураURL = СтруктураURI(URL); Результат = Новый Структура; - Результат.Вставить("Протокол", ?(ПустаяСтрока(СтруктураURL.Схема),"http",СтруктураURL.Схема)); + Результат.Вставить("Протокол", ?(ПустаяСтрока(СтруктураURL.Схема), "http", СтруктураURL.Схема)); Результат.Вставить("ИмяСервера", СтруктураURL.ИмяСервера); Результат.Вставить("ПутьКФайлуНаСервере", СтруктураURL.ПутьНаСервере); @@ -115,7 +133,7 @@ Результат.Вставить("Пароль", Пароль); Результат.Вставить("ИмяСервера", ИмяСервера); Результат.Вставить("Хост", Хост); - Результат.Вставить("Порт", ?(ПустаяСтрока(Порт), Неопределено, Число(Порт))); + Результат.Вставить("Порт", Порт); Результат.Вставить("ПутьНаСервере", ПутьНаСервере); Возврат Результат; @@ -155,9 +173,9 @@ // либо адрес во временном хранилище // в случае неуспеха сообщение об ошибке // -Функция ПодготовитьПолучениеФайла(знач URL, знач Пользователь = Неопределено, знач Пароль = Неопределено, - знач Порт = Неопределено, знач Таймаут, знач ЗащищенноеСоединение = Ложь, знач ПассивноеСоединение = Ложь, - знач НастройкаСохранения) Экспорт +Функция ПодготовитьПолучениеФайла(Знач URL, Знач Пользователь = Неопределено, Знач Пароль = Неопределено, + Знач Порт = Неопределено, Знач Таймаут, Знач ЗащищенноеСоединение = Ложь, Знач ПассивноеСоединение = Ложь, + Знач НастройкаСохранения, Знач ЗаписыватьОшибку = Истина) Экспорт НастройкаСоединения = Новый Соответствие; НастройкаСоединения.Вставить("Пользователь", Пользователь); @@ -173,49 +191,17 @@ НастройкаСоединения.Вставить("ЗащищенноеСоединение", ЗащищенноеСоединение); КонецЕсли; - #Если Клиент Тогда - НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; - #Иначе - НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); - #КонецЕсли - - Если НастройкаПроксиСервера = Неопределено - ИЛИ НастройкаПроксиСервера.Получить("ИспользоватьПрокси") <> Истина Тогда - НастройкаПроксиСервера = ПолучитьПустыеНастройкиПроксиСервера(); - КонецЕсли; - - Результат = ПолучитьФайлИзИнтернет(URL, НастройкаСохранения, НастройкаСоединения, НастройкаПроксиСервера); +#Если Клиент Тогда + НастройкаПроксиСервера = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиПроксиСервера; +#Иначе + НастройкаПроксиСервера = ПолучениеФайловИзИнтернета.НастройкиПроксиНаСервере(); +#КонецЕсли + Результат = ПолучитьФайлИзИнтернет(URL, НастройкаСохранения, НастройкаСоединения, НастройкаПроксиСервера, ЗаписыватьОшибку); Возврат Результат; КонецФункции -// Функция возвращает пустые настройки прокси-сервера, соответствующие не использованию прокси-сервера -// -// Возвращаемое значение - структура: -// ИспользоватьПрокси - использовать ли прокси-сервер -// НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов -// ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера -// Сервер - адрес прокси-сервера -// Порт - порт прокси-сервера -// Пользователь - имя пользователя для авторизации на прокси-сервере -// Пароль - пароль пользователя -// -Функция ПолучитьПустыеНастройкиПроксиСервера() Экспорт - - НастройкаПроксиСервера = Новый Соответствие; - НастройкаПроксиСервера.Вставить("ИспользоватьПрокси", Ложь); - НастройкаПроксиСервера.Вставить("Пользователь", ""); - НастройкаПроксиСервера.Вставить("Пароль", ""); - НастройкаПроксиСервера.Вставить("Порт", ""); - НастройкаПроксиСервера.Вставить("Сервер", ""); - НастройкаПроксиСервера.Вставить("НеИспользоватьПроксиДляЛокальныхАдресов", Ложь); - НастройкаПроксиСервера.Вставить("ИспользоватьСистемныеНастройки", Ложь); - - Возврат НастройкаПроксиСервера; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции @@ -256,8 +242,8 @@ // либо адрес во временном хранилище // в случае неуспеха сообщение об ошибке // -Функция ПолучитьФайлИзИнтернет(знач URL, знач НастройкаСохранения, знач НастройкаСоединения = Неопределено, - знач НастройкиПрокси = Неопределено) +Функция ПолучитьФайлИзИнтернет(Знач URL, Знач НастройкаСохранения, Знач НастройкаСоединения = Неопределено, + Знач НастройкиПрокси = Неопределено, Знач ЗаписыватьОшибку = Истина) // Объявление переменных перед первым использованием в качестве // параметра метода Свойство, при анализе параметров получения файлов @@ -293,24 +279,11 @@ КонецЕсли; КонецЕсли; - НастройкиПрокси = ?(НастройкиПрокси = Неопределено, ПолучитьПустыеНастройкиПроксиСервера(), НастройкиПрокси); - Прокси = СформироватьПрокси(НастройкиПрокси, Протокол); - - ПараметрыСоединения = Новый Массив; - ПараметрыСоединения.Добавить(ИмяСервера); - ПараметрыСоединения.Добавить(Порт); - ПараметрыСоединения.Добавить(ИмяПользователя); - ПараметрыСоединения.Добавить(ПарольПользователя); - ПараметрыСоединения.Добавить(Прокси); + Прокси = ?(Прокси <> Неопределено, СформироватьИнтернетПрокси(НастройкиПрокси, Протокол), Неопределено); Если Протокол = "ftp" Тогда - - ПараметрыСоединения.Добавить(ПассивноеСоединение); - - ПараметрыСоединения.Добавить(Таймаут); - Попытка - Соединение = Новый(Тип("FTPСоединение"), ПараметрыСоединения); + Соединение = Новый FTPСоединение(ИмяСервера, Порт, ИмяПользователя, ПарольПользователя, Прокси, ПассивноеСоединение, Таймаут); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании FTP-соединения с сервером %1:'") + Символы.ПС + "%2"; @@ -321,20 +294,16 @@ КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат СформироватьРезультат(Ложь, СообщениеОбОшибке); КонецПопытки; + Иначе - - ПараметрыСоединения.Добавить(Таймаут); - Если ЗащищенноеСоединение = Истина Тогда - ИмяТип = "ЗащищенноеСоединениеOpenSSL"; - ЗащищенноеСоединение = Новый(Тип(ИмяТип)); + ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL; Иначе ЗащищенноеСоединение = Неопределено; КонецЕсли; - ПараметрыСоединения.Добавить(ЗащищенноеСоединение); Попытка - Соединение = Новый(Тип("HTTPСоединение"), ПараметрыСоединения); + Соединение = Новый HTTPСоединение(ИмяСервера, Порт, ИмяПользователя, ПарольПользователя, Прокси, Таймаут, ЗащищенноеСоединение); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при создании HTTP-соединения с сервером %1:'") + Символы.ПС + "%2"; @@ -360,9 +329,11 @@ Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); СообщениеОбОшибке = НСтр("ru = 'Ошибка при получении файла с сервера %1:'") + Символы.ПС + "%2"; - ЗаписатьОшибкуВЖурналРегистрации( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, + Если ЗаписыватьОшибку Тогда + ЗаписатьОшибкуВЖурналРегистрации( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке))); + КонецЕсли; СообщениеОбОшибке = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ИмяСервера, КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); Возврат СформироватьРезультат(Ложь, СообщениеОбОшибке); @@ -382,11 +353,10 @@ КонецФункции -// Функция формирует прокси по настройкам прокси (передаваемому параметру) +// Возвращает прокси по настройкам НастройкаПроксиСервера для заданного протокола Протокол. // // Параметры: -// -// НастройкаПроксиСервера - Соответствие: +// НастройкаПроксиСервера - Соответствие: // ИспользоватьПрокси - использовать ли прокси-сервер // НеИспользоватьПроксиДляЛокальныхАдресов - использовать ли прокси-сервер для локальных адресов // ИспользоватьСистемныеНастройки - использовать ли системные настройки прокси-сервера @@ -394,56 +364,57 @@ // Порт - порт прокси-сервера // Пользователь - имя пользователя для авторизации на прокси-сервере // Пароль - пароль пользователя -// Протокол - строка - протокол для которого устанавливаются параметры прокси сервера, например "http", "https", "ftp" +// Протокол - строка - протокол для которого устанавливаются параметры прокси сервера, например "http", "https", "ftp" // -Функция СформироватьПрокси(НастройкаПроксиСервера, Протокол) +// Возвращаемое значение: +// ИнтернетПрокси +// +Функция СформироватьИнтернетПрокси(НастройкаПроксиСервера, Протокол) - Если НастройкаПроксиСервера <> Неопределено Тогда - ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); - ИспользоватьСистемныеНастройки = НастройкаПроксиСервера.Получить("ИспользоватьСистемныеНастройки"); - Если ИспользоватьПрокси Тогда - Если ИспользоватьСистемныеНастройки Тогда - // Системные настройки прокси-сервера - Прокси = Новый ИнтернетПрокси(Истина); - Иначе - - // Настройки прокси-сервера, заданные вручную - Прокси = Новый ИнтернетПрокси; - - // Определение адреса и порта прокси-сервера - ДополнительныеНастройки = НастройкаПроксиСервера.Получить("ДополнительныеНастройкиПрокси"); - ПроксиПоПротоколу = Неопределено; - Если ТипЗнч(ДополнительныеНастройки) = Тип("Соответствие") Тогда - ПроксиПоПротоколу = ДополнительныеНастройки.Получить(Протокол); - КонецЕсли; - - Если ТипЗнч(ПроксиПоПротоколу) = Тип("Структура") Тогда - Прокси.Установить(Протокол, ПроксиПоПротоколу.Адрес, ПроксиПоПротоколу.Порт); - Иначе - Прокси.Установить(Протокол, НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); - КонецЕсли; - - Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; - Прокси.Пользователь = НастройкаПроксиСервера["Пользователь"]; - Прокси.Пароль = НастройкаПроксиСервера["Пароль"]; - - АдресаИсключений = НастройкаПроксиСервера.Получить("НеИспользоватьПроксиДляАдресов"); - Если ТипЗнч(АдресаИсключений) = Тип("Массив") Тогда - Для каждого АдресИсключения Из АдресаИсключений Цикл - Прокси.НеИспользоватьПроксиДляАдресов.Добавить(АдресИсключения); - КонецЦикла; - КонецЕсли; - - КонецЕсли; - Иначе - // Не использовать прокси-сервер - Прокси = Новый ИнтернетПрокси(Ложь); - КонецЕсли; - Иначе + Если НастройкаПроксиСервера = Неопределено Тогда // Системные установки прокси-сервера - Прокси = Неопределено; + Возврат Неопределено; + КонецЕсли; + + ИспользоватьПрокси = НастройкаПроксиСервера.Получить("ИспользоватьПрокси"); + Если Не ИспользоватьПрокси Тогда + // Не использовать прокси-сервер + Возврат Новый ИнтернетПрокси(Ложь); КонецЕсли; + ИспользоватьСистемныеНастройки = НастройкаПроксиСервера.Получить("ИспользоватьСистемныеНастройки"); + Если ИспользоватьСистемныеНастройки Тогда + // Системные настройки прокси-сервера + Возврат Новый ИнтернетПрокси(Истина); + КонецЕсли; + + // Настройки прокси-сервера, заданные вручную + Прокси = Новый ИнтернетПрокси; + + // Определение адреса и порта прокси-сервера + ДополнительныеНастройки = НастройкаПроксиСервера.Получить("ДополнительныеНастройкиПрокси"); + ПроксиПоПротоколу = Неопределено; + Если ТипЗнч(ДополнительныеНастройки) = Тип("Соответствие") Тогда + ПроксиПоПротоколу = ДополнительныеНастройки.Получить(Протокол); + КонецЕсли; + + Если ТипЗнч(ПроксиПоПротоколу) = Тип("Структура") Тогда + Прокси.Установить(Протокол, ПроксиПоПротоколу.Адрес, ПроксиПоПротоколу.Порт); + Иначе + Прокси.Установить(Протокол, НастройкаПроксиСервера["Сервер"], НастройкаПроксиСервера["Порт"]); + КонецЕсли; + + Прокси.НеИспользоватьПроксиДляЛокальныхАдресов = НастройкаПроксиСервера["НеИспользоватьПроксиДляЛокальныхАдресов"]; + Прокси.Пользователь = НастройкаПроксиСервера["Пользователь"]; + Прокси.Пароль = НастройкаПроксиСервера["Пароль"]; + + АдресаИсключений = НастройкаПроксиСервера.Получить("НеИспользоватьПроксиДляАдресов"); + Если ТипЗнч(АдресаИсключений) = Тип("Массив") Тогда + Для каждого АдресИсключения Из АдресаИсключений Цикл + Прокси.НеИспользоватьПроксиДляАдресов.Добавить(АдресИсключения); + КонецЦикла; + КонецЕсли; + Возврат Прокси; КонецФункции @@ -458,7 +429,7 @@ // поле успех - булево // поле путь - строка // -Функция СформироватьРезультат(знач Статус, знач СообщениеПуть) +Функция СформироватьРезультат(Знач Статус, Знач СообщениеПуть) Результат = Новый Структура("Статус"); @@ -479,7 +450,7 @@ // Параметры // СообщениеОбОшибке - строка сообщение об ошибке // -Процедура ЗаписатьОшибкуВЖурналРегистрации(знач СообщениеОбОшибке) Экспорт +Процедура ЗаписатьОшибкуВЖурналРегистрации(Знач СообщениеОбОшибке) Экспорт #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда ЗаписьЖурналаРегистрации( @@ -487,7 +458,7 @@ УровеньЖурналаРегистрации.Ошибка, , , СообщениеОбОшибке); #Иначе - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", СообщениеОбОшибке,,Истина); #КонецЕсли diff --git a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl index 87f002237..55bda1fc6 100644 --- a/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПолучениеФайловИзИнтернетаСлужебный/Module.bsl @@ -56,7 +56,7 @@ // Сохраняет параметры настройки прокси сервера на стороне сервера 1С:Предприятие // -Процедура СохранитьНастройкиПроксиНаСервере1СПредприятие(знач Настройки) Экспорт +Процедура СохранитьНастройкиПроксиНаСервере1СПредприятие(Знач Настройки) Экспорт Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Истина) Тогда ВызватьИсключение(НСтр("ru = 'Недостаточно прав для выполнения операции'")); diff --git a/SSL/src/CommonModules/Пользователи/Module.bsl b/SSL/src/CommonModules/Пользователи/Module.bsl index 61dcdc957..e4aa4ce40 100644 --- a/SSL/src/CommonModules/Пользователи/Module.bsl +++ b/SSL/src/CommonModules/Пользователи/Module.bsl @@ -26,10 +26,8 @@ // Проверяет, является ли текущий или указанный пользователь полноправным. // // Полноправным считается пользователь, который -// а) при не пустом списке пользователей информационной базы: -// - в локальном режиме работы (без разделения данных) имеет роль ПолныеПрава и -// роль для администрирования системы, -// - в модели сервиса (с разделением данных) имеет роль ПолныеПрава; +// а) при не пустом списке пользователей информационной базы, +// имеет роль ПолныеПрава и роль для администрирования системы (если ПроверятьПраваАдминистрированияСистемы = Истина) // б) при пустом списке пользователей информационной базы // основная роль конфигурации не задана или ПолныеПрава. // @@ -47,7 +45,7 @@ // проверяется наличие роли для администрирования системы. // Начальное значение: Ложь. // -// УчитыватьПривилегированныйРежим - Булево - если задано Истина, тогда +// УчитыватьПривилегированныйРежим - Булево - если задано Истина, тогда для текущего пользователя // функция возвращает Истина, когда установлен привилегированный режим. // Начальное значение: Истина. // @@ -58,44 +56,18 @@ ПроверятьПраваАдминистрированияСистемы = Ложь, УчитыватьПривилегированныйРежим = Истина) Экспорт - Если УчитыватьПривилегированныйРежим И ПривилегированныйРежим() Тогда - Возврат Истина; - КонецЕсли; + ПривилегированныйРежимУстановлен = ПривилегированныйРежим(); УстановитьПривилегированныйРежим(Истина); - ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); + Свойства = СвойстваПроверяемогоПользователяИБ(Пользователь); + ПользовательИБ = Свойства.ПользовательИБ; - Если ТипЗнч(Пользователь) = Тип("ПользовательИнформационнойБазы") Тогда - ПользовательИБ = Пользователь; - - ИначеЕсли Пользователь = Неопределено ИЛИ Пользователь = АвторизованныйПользователь() Тогда - ПользовательИБ = ТекущийПользовательИБ; - Иначе - // Задан не текущий пользователь. - Если Не ЗначениеЗаполнено(Пользователь) Тогда - Возврат Ложь; - КонецЕсли; - - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяИБ")); - - Если ПользовательИБ = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; + ПроверитьРольПолныеПрава = Не ПроверятьПраваАдминистрированияСистемы; + ПроверитьРольАдминистратораСистемы = ПроверятьПраваАдминистрированияСистемы; - ПроверитьРольПолныеПрава = Истина; - ПроверитьРольАдминистратораСистемы = Истина; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Если ПроверятьПраваАдминистрированияСистемы Тогда - ПроверитьРольПолныеПрава = Ложь; - Иначе - ПроверитьРольАдминистратораСистемы = Ложь; - КонецЕсли; - КонецЕсли; - - Если ПользовательИБ.УникальныйИдентификатор <> ТекущийПользовательИБ.УникальныйИдентификатор Тогда + Если ПользовательИБ = Неопределено Тогда + Возврат Ложь; + ИначеЕсли НЕ Свойства.УказанТекущийПользовательИБ Тогда // Для не текущего пользователя ИБ проверяются роли в записанном пользователе ИБ. Если ПроверитьРольПолныеПрава И НЕ ПользовательИБ.Роли.Содержит(Метаданные.Роли.ПолныеПрава) Тогда @@ -107,6 +79,10 @@ КонецЕсли; Возврат Истина; Иначе + Если УчитыватьПривилегированныйРежим И ПривилегированныйРежимУстановлен Тогда + Возврат Истина; + КонецЕсли; + Если СтандартныеПодсистемыПовтИсп.ПривилегированныйРежимУстановленПриЗапуске() Тогда // Когда клиентское приложение запущено с параметром UsePrivilegedMode, тогда // пользователь является полноправным, если привилегированный режим установлен. @@ -120,7 +96,7 @@ КонецЕсли; Если НЕ ЗначениеЗаполнено(ПользовательИБ.Имя) - И ПривилегированныйРежим() + И ПривилегированныйРежимУстановлен И ПравоДоступа("Администрирование", Метаданные, ПользовательИБ) Тогда // Когда у неуказанного пользователя есть право Администрирование, // тогда привилегированный режим учитывается всегда для поддержки @@ -143,57 +119,8 @@ КонецФункции -// Проверяет является ли пользователь неразделенным. -// -// Параметры: -// Идентификатор - Неопределено - проверяется текущий пользователь ИБ; -// УникальныйИдентификатор - идентификатор пользователя ИБ; -// ПользовательИнформационнойБазы - проверяется указанный -// пользователь ИБ. -// СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи - осуществляется поиск -// пользователя ИБ по уникальному идентификатору, -// заданному в реквизите ИдентификаторПользователяИБ. -// Уточнение: если пользователь ИБ не найден, возвращается Ложь. -// -// Возвращаемое значение: -// Булево. Если указан внешний пользователь, возвращается Ложь. -// -Функция ЭтоНеразделенныйПользователь(Идентификатор = Неопределено) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - Если ТипЗнч(Идентификатор) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - Возврат Ложь; - КонецЕсли; - - Если ТипЗнч(Идентификатор) = Тип("УникальныйИдентификатор") Тогда - ИдентификаторПользовательИБ = Идентификатор; - - ИначеЕсли ТипЗнч(Идентификатор) = Тип("ПользовательИнформационнойБазы") Тогда - ИдентификаторПользовательИБ = Идентификатор.УникальныйИдентификатор; - - ИначеЕсли Идентификатор = Неопределено - ИЛИ Идентификатор = АвторизованныйПользователь() Тогда - - ИдентификаторПользовательИБ = - ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; - Иначе - // Задан не текущий пользователь. - ИдентификаторПользовательИБ = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( - Идентификатор, "ИдентификаторПользователяИБ"); - КонецЕсли; - - ПользовательНеразделенный = Неопределено; - ПользователиСлужебный.ЭтоНеразделенныйПользовательИБ( - ИдентификаторПользовательИБ, ПользовательНеразделенный); - - Возврат ПользовательНеразделенный; - -КонецФункции - // Возвращает доступность хотя бы одной из указанных ролей или полноправность -// пользователя (текущего или указанного) без учета привилегированного режима. +// пользователя (текущего или указанного). // // Параметры: // ИменаРолей - Строка - имена ролей, разделенные запятыми, доступность которых проверяется. @@ -207,40 +134,30 @@ // ПользовательИнформационнойБазы - проверяется указанный // пользователь ИБ // +// УчитыватьПривилегированныйРежим - Булево - если задано Истина, тогда для текущего пользователя +// функция возвращает Истина, когда установлен привилегированный режим. +// Начальное значение: Истина. +// // Возвращаемое значение: // Булево - Истина, если хотя бы одна из указанных ролей доступна, // или функция ЭтоПолноправныйПользователь(Пользователь) возвращает Истина. // -Функция РолиДоступны(Знач ИменаРолей, Пользователь = Неопределено) Экспорт +Функция РолиДоступны(ИменаРолей, + Пользователь = Неопределено, + УчитыватьПривилегированныйРежим = Истина) Экспорт - Если ЭтоПолноправныйПользователь(Пользователь, , Ложь) Тогда + Если ЭтоПолноправныйПользователь(Пользователь, , УчитыватьПривилегированныйРежим) Тогда Возврат Истина; КонецЕсли; УстановитьПривилегированныйРежим(Истина); - - Если Пользователь = Неопределено ИЛИ Пользователь = АвторизованныйПользователь() Тогда - ПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); - - ИначеЕсли ТипЗнч(Пользователь) = Тип("ПользовательИнформационнойБазы") Тогда - ПользовательИБ = Пользователь; - - Иначе - // Указан не текущий пользователь. - ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяИБ")); - - Если ПользовательИБ = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - УказанТекущийПользовательИБ = ПользовательИБ.УникальныйИдентификатор = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; + Свойства = СвойстваПроверяемогоПользователяИБ(Пользователь); + ПользовательИБ = Свойства.ПользовательИБ; МассивИменРолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаРолей); Для каждого ИмяРоли Из МассивИменРолей Цикл - Если УказанТекущийПользовательИБ Тогда + Если Свойства.УказанТекущийПользовательИБ Тогда Если РольДоступна(СокрЛП(ИмяРоли)) Тогда Возврат Истина; КонецЕсли; @@ -423,9 +340,20 @@ КонецЦикла; КонецЕсли; КонецЦикла; + ИначеЕсли ТипЗнч(Таблица) = Тип("ДанныеФормыКоллекция") Тогда + Если МассивСтрок = Неопределено Тогда + МассивСтрок = Таблица; + КонецЕсли; + ТаблицаПользователей = Новый ТаблицаЗначений; + ТаблицаПользователей.Колонки.Добавить(ИмяПоляПользователь, Метаданные.РегистрыСведений.СоставыГруппПользователей.Измерения.ГруппаПользователей.Тип); + Для каждого Строка Из МассивСтрок Цикл + ТаблицаПользователей.Добавить()[ИмяПоляПользователь] = Строка[ИмяПоляПользователь]; + КонецЦикла; Иначе + Если МассивСтрок = Неопределено Тогда + МассивСтрок = Таблица; + КонецЕсли; ТаблицаПользователей = Таблица.Выгрузить(МассивСтрок, ИмяПоляПользователь); - МассивСтрок = Таблица; КонецЕсли; Запрос = Новый Запрос(СтрЗаменить( @@ -665,33 +593,6 @@ КонецФункции -// Возвращает полное имя служебного пользователя для отображения в интерфейсах. -// -// Параметры: -// Идентификатор - уникальный идентификатор пользователя ИБ или СправочникСсылка.Пользователи. -// -// Возвращаемое значение: -// Строка -// -Функция ПолноеИмяСлужебногоПользователя(Знач Идентификатор = Неопределено) Экспорт - - Результат = НСтр("ru = '<Служебный пользователь %1>'"); - - Если ЗначениеЗаполнено(Идентификатор) Тогда - - Если ТипЗнч(Идентификатор) = Тип("СправочникСсылка.Пользователи") Тогда - Идентификатор = ОбщегоНазначения.ПолучитьЗначениеРеквизита(Идентификатор, "ИдентификаторПользователяИБ"); - КонецЕсли; - - ПорядковыйНомер = Формат(РегистрыСведений.НеразделенныеПользователи.ПорядковыйНомерПользователяИБ(Идентификатор), "ЧДЦ=0; ЧГ=0"); - Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Результат, ПорядковыйНомер); - - КонецЕсли; - - Возврат Результат; - -КонецФункции - // Проверяет связан ли пользовательИБ с элементом справочника Пользователи или // элементом справочника ВнешниеПользователи. // @@ -746,7 +647,7 @@ // ЗапрещеноИзменятьПароль - Булево. // // АутентификацияОС - Булево. -// ПользовательОС - Строка (не учитывается в учебной платформе). +// ПользовательОС - Строка. // // ОсновнойИнтерфейс - Неопределено, // Строка (имя интерфейса из коллекции @@ -995,12 +896,10 @@ ОписаниеОшибки = "", ПользовательИБ = Неопределено) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ЭтоНеразделенныйПользователь(Идентификатор) Тогда - - ВызватьИсключение(НСтр("ru = 'Удаление неразделенных пользователей - |при включенном использовании разделителей запрещено.'")); - КонецЕсли; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.ПередЗаписьюПользователяИБ(ПользовательИБ.УникальныйИдентификатор); + КонецЦикла; ПользовательИБ = Неопределено; Свойства = Неопределено; @@ -1085,11 +984,6 @@ СтруктураИсключаемыхСвойств = Новый Структура; КонецЕсли; - Если ПользователиСлужебный.ЭтоУчебнаяПлатформа() Тогда - СтруктураИсключаемыхСвойств.Вставить("АутентификацияОС"); - СтруктураИсключаемыхСвойств.Вставить("ПользовательОС"); - КонецЕсли; - ПарольУстановлен = Ложь; Для каждого КлючИЗначение Из ВсеСвойства Цикл @@ -1318,6 +1212,7 @@ РольАдминистратораСистемы = Метаданные.Роли.АдминистраторСистемы; + УстановитьПривилегированныйРежим(Истина); Если ПравоДоступа("Администрирование", Метаданные, Метаданные.Роли.ПолныеПрава) ИЛИ СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда @@ -1571,3 +1466,34 @@ КраткоеПредставлениеОшибки(ИнформацияОбОшибке))); КонецФункции + +// Для функций ЭтоПолноправныйПользователь и РолиДоступны + +Функция СвойстваПроверяемогоПользователяИБ(Пользователь) + + Свойства = Новый Структура; + Свойства.Вставить("ТекущийПользовательИБ", ПользователиИнформационнойБазы.ТекущийПользователь()); + Свойства.Вставить("ПользовательИБ", Неопределено); + + Если ТипЗнч(Пользователь) = Тип("ПользовательИнформационнойБазы") Тогда + Свойства.Вставить("ПользовательИБ", Пользователь); + + ИначеЕсли Пользователь = Неопределено ИЛИ Пользователь = АвторизованныйПользователь() Тогда + Свойства.Вставить("ПользовательИБ", Свойства.ТекущийПользовательИБ); + Иначе + // Задан не текущий пользователь. + Если ЗначениеЗаполнено(Пользователь) Тогда + Свойства.Вставить("ПользовательИБ", ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( + ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяИБ"))); + КонецЕсли; + КонецЕсли; + + Если Свойства.ПользовательИБ <> Неопределено Тогда + Свойства.Вставить("УказанТекущийПользовательИБ", + Свойства.ПользовательИБ.УникальныйИдентификатор + = Свойства.ТекущийПользовательИБ.УникальныйИдентификатор); + КонецЕсли; + + Возврат Свойства; + +КонецФункции diff --git a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl index 9c1385701..d23e414db 100644 --- a/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебный/Module.bsl @@ -78,6 +78,45 @@ // СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриЗаписиАдминистратора"); + // Вызывается при создании элемента справочника "Пользователи" в момент интерактивного входа пользователя + // + // Параметры: + // НовыйПользователь - СправочникОбъект.Пользователи, + // + // Синтаксис: + // Процедура ПриСозданииПользователяВМоментВхода(НовыйПользователь) Экспорт + СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриСозданииПользователяВМоментВхода"); + + // Вызывается при авторизации нового пользователя информационной базы. + // + // Параметры: + // ПользовательИБ - ПользовательИнформационнойБазы, текущий пользователь информационной базы, + // СтандартнаяОбработка - Булево, значение может быть установлено внутри обработчика, в этом случае + // стандартная обработка авторизации нового пользователя ИБ выполняться не будет. + // + // Синтаксис: + // Процедура ПриАвторизацииНовогоПользователяИБ(ПользовательИБ, СтандартнаяОбработка) Экспорт + СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриАвторизацииНовогоПользователяИБ"); + + // Вызывается при начале обработки пользователя информационной базы. + // + // Параметры: + // ПараметрыОбработки - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ() + // ОписаниеПользователяИБ - Структура, см. комментарий к процедуре НачатьОбработкуПользователяИБ() + // + // Синтаксис: + // Процедура ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); + СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПриНачалеОбработкиПользователяИБ"); + + // Вызывается перед записью пользователя информационной базы + // + // Параметры: + // ИдентификаторПользователяИБ - УникальныйИдентификатор. + // + // Синтаксис: + // Процедура ПередЗаписьюПользователяИБ(ИдентификаторПользователяИБ) Экспорт + СерверныеСобытия.Добавить("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); + КонецПроцедуры // См. описание этой же процедуры в модуле СтандартныеПодсистемыСервер. @@ -94,7 +133,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( "ПользователиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "ПользователиСлужебный"); КонецЕсли; @@ -143,7 +182,8 @@ Процедура УстановкаПараметровСеанса(Знач ИмяПараметра, УстановленныеПараметры) Экспорт Если ИмяПараметра <> "ТекущийПользователь" - И ИмяПараметра <> "ТекущийВнешнийПользователь" Тогда + И ИмяПараметра <> "ТекущийВнешнийПользователь" + И ИмяПараметра <> "АвторизованныйПользователь" Тогда Возврат; КонецЕсли; @@ -168,9 +208,6 @@ ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); - ЭтоНеразделенныйПользователь = ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ТекущийПользовательИБ.РазделениеДанных.Количество() = 0; - Если ПустаяСтрока(ТекущийПользовательИБ.Имя) Тогда ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); @@ -232,19 +269,12 @@ ТекущийВнешнийПользователь = Справочники.ВнешниеПользователи.ПустаяСсылка(); Если РезультатПользователи.Пустой() Тогда - Если ЭтоНеразделенныйПользователь - ИЛИ Пользователи.ЭтоПолноправныйПользователь( , , Ложь) Тогда + Если Пользователи.ЭтоПолноправныйПользователь( , ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный, Ложь) Тогда ИдентификаторПользователяИБ = ТекущийПользовательИБ.УникальныйИдентификатор; - Если ЭтоНеразделенныйПользователь Тогда - Служебный = Истина; - // ПолноеИмяПользователя заполняется ниже в транзакции. - ПользовательПоНаименованию = Неопределено; - Иначе - ПолноеИмяПользователя = ТекущийПользовательИБ.ПолноеИмя; - ПользовательПоНаименованию = СсылкаПользователяПоПолномуНаименованию(ПолноеИмяПользователя); - КонецЕсли; + ПолноеИмяПользователя = ТекущийПользовательИБ.ПолноеИмя; + ПользовательПоНаименованию = СсылкаПользователяПоПолномуНаименованию(ПолноеИмяПользователя); Если ПользовательПоНаименованию = Неопределено Тогда ПользовательНеНайден = Истина; @@ -265,14 +295,8 @@ Если СоздатьПользователя Тогда - ЗарегистрироватьНеразделенногоПользователя(); - НачатьТранзакцию(); Попытка - Если ЭтоНеразделенныйПользователь И НЕ ПустаяСтрока(ТекущийПользовательИБ.Имя) Тогда - ПолноеИмяПользователя = Пользователи.ПолноеИмяСлужебногоПользователя( - ИдентификаторПользователяИБ); - КонецЕсли; Если СсылкаНового = Неопределено Тогда СсылкаНового = Справочники.Пользователи.ПолучитьСсылку(); @@ -296,6 +320,11 @@ "ОписаниеПользователяИБ", ОписаниеПользователяИБ); КонецЕсли; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриСозданииПользователяВМоментВхода"); + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.Модуль.ПриСозданииПользователяВМоментВхода(НовыйПользователь); + КонецЦикла; + НовыйПользователь.Записать(); ЗафиксироватьТранзакцию(); @@ -338,8 +367,12 @@ ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь; ПараметрыСеанса.ТекущийВнешнийПользователь = ТекущийВнешнийПользователь; + ПараметрыСеанса.АвторизованныйПользователь = ?(ЗначениеЗаполнено(ТекущийПользователь), + ТекущийПользователь, ТекущийВнешнийПользователь); + УстановленныеПараметры.Добавить("ТекущийПользователь"); УстановленныеПараметры.Добавить("ТекущийВнешнийПользователь"); + УстановленныеПараметры.Добавить("АвторизованныйПользователь"); КонецПроцедуры @@ -381,17 +414,22 @@ УстановитьПривилегированныйРежим(Истина); ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь(); - ПроверитьПраваПользователя(ТекущийПользовательИБ); - - ЗарегистрироватьНеразделенногоПользователя(); + ПроверитьПраваПользователя(ТекущийПользовательИБ, "ПриЗапуске"); Если ПустаяСтрока(ТекущийПользовательИБ.Имя) Тогда // Авторизуется пользователь по умолчанию Возврат ""; КонецЕсли; - ЭтоНеразделенныйПользователь = ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ТекущийПользовательИБ.РазделениеДанных.Количество() = 0; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриАвторизацииНовогоПользователяИБ"); + СтандартнаяОбработка = Истина; + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.Модуль.ПриАвторизацииНовогоПользователяИБ(ТекущийПользовательИБ, СтандартнаяОбработка); + КонецЦикла; + + Если Не СтандартнаяОбработка Тогда + Возврат ""; + КонецЕсли; НайденныйПользователь = Неопределено; Если ПользовательПоИдентификаторуСуществует( @@ -399,8 +437,7 @@ // ПользовательИБ найден в справочнике. Если ПриНачалеРаботыСистемы - И Пользователи.ЭтоПолноправныйПользователь(ТекущийПользовательИБ, , Ложь) - И НЕ ЭтоНеразделенныйПользователь Тогда + И Пользователи.ЭтоПолноправныйПользователь(ТекущийПользовательИБ, ОбщегоНазначенияПовтИсп.РежимРаботыПрограммы().Локальный, Ложь) Тогда ПриАвторизацииАдминистратораПриНачалеРаботыСистемы(НайденныйПользователь); КонецЕсли; @@ -408,33 +445,6 @@ Возврат ""; КонецЕсли; - Если ЭтоНеразделенныйПользователь Тогда - // Это неразделенный пользователь, требуется создать элемент в текущей области. - НачатьТранзакцию(); - Попытка - ПользовательОбъект = Справочники.Пользователи.СоздатьЭлемент(); - ПользовательОбъект.Наименование = Пользователи.ПолноеИмяСлужебногоПользователя( - ТекущийПользовательИБ.УникальныйИдентификатор); - - ОписаниеПользователяИБ = Новый Структура; - ОписаниеПользователяИБ.Вставить("Действие", "Записать"); - ОписаниеПользователяИБ.Вставить( - "УникальныйИдентификатор", ТекущийПользовательИБ.УникальныйИдентификатор); - - ПользовательОбъект.ДополнительныеСвойства.Вставить( - "ОписаниеПользователяИБ", ОписаниеПользователяИБ); - - ПользовательОбъект.Служебный = Истина; - ПользовательОбъект.Записать(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - Возврат ""; - КонецЕсли; - // Требуется либо создать администратора, либо сообщить об отказе авторизации. ТекстСообщенияОбОшибке = ""; ТребуетсяСоздатьАдминистратора = Ложь; @@ -524,15 +534,6 @@ Обработчик.Версия = "2.1.2.8"; Обработчик.Процедура = "РегистрыСведений.СоставыГруппПользователей.ОбновитьДанныеРегистра"; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.12"; - Обработчик.Процедура = "ПользователиСлужебный.ЗаполнениеПорядковыхНомеровНеразделенныхПользователей"; - Обработчик.ОбщиеДанные = Истина; - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.3.12"; - Обработчик.Процедура = "ПользователиСлужебный.ПереименованиеСлужебныхНеразделенныхПользователей"; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.3.16"; Обработчик.НачальноеЗаполнение = Истина; @@ -570,40 +571,31 @@ Процедура УстановитьНачальныеНастройки(Знач ИмяПользователя) Экспорт СистемнаяИнформация = Новый СистемнаяИнформация; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.2.17.0") > 0 Тогда + + Такси = Ложь; + ТекущийРежим = Метаданные.РежимСовместимостиИнтерфейса; + Такси = (ТекущийРежим = Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.Такси + ИЛИ ТекущийРежим = Метаданные.СвойстваОбъектов.РежимСовместимостиИнтерфейса.ТаксиРазрешитьВерсия8_2); + + Если Не Такси Тогда + + НастройкиКлиента = Новый НастройкиКлиентскогоПриложения(); + НастройкиКлиента.ОтображатьПанелиНавигацииИДействий = Ложь; + НастройкиКлиента.ОтображатьПанельРазделов = Истина; + НастройкиКлиента.РежимОткрытияФормПриложения = РежимОткрытияФормПриложения.Закладки; - Такси = Ложь; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, "8.3.3.0") > 0 Тогда - ИмяСвойства = "РежимСовместимостиИнтерфейса"; - ТекущийРежим = Метаданные[ИмяСвойства]; - Если ТекущийРежим = Метаданные.СвойстваОбъектов[ИмяСвойства].Такси - ИЛИ ТекущийРежим = Метаданные.СвойстваОбъектов[ИмяСвойства].ТаксиРазрешитьВерсия8_2 Тогда - - Такси = Истина; - КонецЕсли; - КонецЕсли; + НастройкиИнтерфейса = Новый НастройкиКомандногоИнтерфейса(); + НастройкиИнтерфейса.ОтображениеПанелиРазделов = ОтображениеПанелиРазделов.Текст; - Если Не Такси Тогда + ПользователиПереопределяемый.ПриУстановкеНачальныхНастроек( + НастройкиКлиента, + НастройкиИнтерфейса); - НастройкиКлиента = Новый НастройкиКлиентскогоПриложения(); - НастройкиКлиента.ОтображатьПанелиНавигацииИДействий = Ложь; - НастройкиКлиента.ОтображатьПанельРазделов = Истина; - НастройкиКлиента.РежимОткрытияФормПриложения = Вычислить("РежимОткрытияФормПриложения.Закладки"); - - НастройкиИнтерфейса = Новый НастройкиКомандногоИнтерфейса(); - НастройкиИнтерфейса.ОтображениеПанелиРазделов = Вычислить("ОтображениеПанелиРазделов.Текст"); - - ПользователиПереопределяемый.ПриУстановкеНачальныхНастроек( - НастройкиКлиента, - НастройкиИнтерфейса); - - ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиКлиентскогоПриложения", "", - НастройкиКлиента, , ИмяПользователя); - - ХранилищеСистемныхНастроек.Сохранить("Общее/ПанельРазделов/НастройкиКомандногоИнтерфейса", "", - НастройкиИнтерфейса, , ИмяПользователя); - КонецЕсли; + ХранилищеСистемныхНастроек.Сохранить("Общее/НастройкиКлиентскогоПриложения", "", + НастройкиКлиента, , ИмяПользователя); + ХранилищеСистемныхНастроек.Сохранить("Общее/ПанельРазделов/НастройкиКомандногоИнтерфейса", "", + НастройкиИнтерфейса, , ИмяПользователя); КонецЕсли; КонецПроцедуры @@ -677,32 +669,17 @@ // Функция НедоступныеРолиПоТипуПользователей(ТипПользователей) Экспорт - НедоступныеРоли = ПользователиСлужебныйПовтИсп.Параметры( - ).НедоступныеРолиПоТипамПользователей; + // При работе в локальном режиме у администратора системы - нет ограничений. + Если ТипПользователей = Перечисления.ТипыПользователей.ПользовательЛокальногоРешения + И Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь) Тогда + Возврат Новый ФиксированноеСоответствие(Новый Соответствие()); + КонецЕсли; + НедоступныеРоли = ПользователиСлужебныйПовтИсп.Параметры().НедоступныеРолиПоТипамПользователей; Возврат НедоступныеРоли.Получить(ТипПользователей); КонецФункции -// Проверят, что выполнение происходит на учебной платформе, -// на которой, например, недоступно получение свойства ПользовательОС. -// -Функция ЭтоУчебнаяПлатформа() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); - - Попытка - ПользовательОС = ТекущийПользователь.ПользовательОС; - Исключение - ТекущийПользователь = Неопределено; - КонецПопытки; - - Возврат ТекущийПользователь = Неопределено; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -822,27 +799,23 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. +// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в +// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому +// ограничивается текущий объект таблицы. +// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, +// которые используются для этого вида доступа. Т.е. перечислить типы, +// которые соответствуют полю, использованному в шаблоне ограничения доступа +// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" +// нужно перечислить только те типы поля, которые есть у поля +// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт @@ -1096,8 +1069,7 @@ // Функция УровеньДоступаКСвойствамПользователяИБ(ДляВнешнегоПользователя) Экспорт - Если ПривилегированныйРежим() - ИЛИ Пользователи.ЭтоПолноправныйПользователь() Тогда + Если Пользователи.ЭтоПолноправныйПользователь() Тогда Возврат "ПолныйДоступ"; @@ -1260,26 +1232,13 @@ КонецЕсли; ПараметрыОбработки.Вставить("Действие", ОписаниеПользователяИБ.Действие); - Если ЗначениеЗаполнено(ПараметрыОбработки.СтарыйИдентификаторПользователяИБ) - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Пользователи.ЭтоНеразделенныйПользователь( - ПараметрыОбработки.СтарыйИдентификаторПользователяИБ) Тогда - - ВызватьИсключение ТекстИсключенияЗаписьНеразделенныхПользователейЗапрещена(); - - ИначеЕсли ОписаниеПользователяИБ.Свойство("УникальныйИдентификатор") - И ЗначениеЗаполнено(ОписаниеПользователяИБ.УникальныйИдентификатор) - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Пользователи.ЭтоНеразделенныйПользователь( - ОписаниеПользователяИБ.УникальныйИдентификатор) Тогда - - ПараметрыОбработки.Вставить("ЭтоНеразделенныйПользовательИБ"); - - Если ОписаниеПользователяИБ.Количество() > 2 - ИЛИ ОписаниеПользователяИБ.Действие = "Удалить" Тогда - - ВызватьИсключение ТекстИсключенияЗаписьНеразделенныхПользователейЗапрещена(); - КонецЕсли; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПриНачалеОбработкиПользователяИБ"); + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.Модуль.ПриНачалеОбработкиПользователяИБ(ПараметрыОбработки, ОписаниеПользователяИБ); + КонецЦикла; + + Если НЕ ПараметрыОбработки.Свойство("Действие") Тогда + Возврат; КонецЕсли; Если ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.ВнешниеПользователи") Тогда @@ -1330,16 +1289,6 @@ |справочника для которого уже задан пользователь ИБ.'"), ПользовательОбъект.Наименование); - ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору( - ОписаниеПользователяИБ.УникальныйИдентификатор) = Неопределено Тогда - - Если НЕ ПараметрыОбработки.Свойство("ЭтоНеразделенныйПользовательИБ") Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи пользователя ""%1"". - |Нельзя связать несуществующего пользователя ИБ - |с пользователем справочника.'"), - ПользовательОбъект.Наименование); - КонецЕсли; КонецЕсли; НайденныйПользователь = Неопределено; @@ -1359,18 +1308,6 @@ КонецЕсли; КонецЕсли; - Если ПараметрыОбработки.Свойство("ЭтоНеразделенныйПользовательИБ") Тогда - - ПользовательОбъект.ИдентификаторПользователяИБ = - ОписаниеПользователяИБ.УникальныйИдентификатор; - - // Обновление значения реквизита контролируемого при записи. - ПараметрыОбработки.НовыйИдентификаторПользователяИБ = - ПользовательОбъект.ИдентификаторПользователяИБ; - - Возврат; - КонецЕсли; - Если ОписаниеПользователяИБ.Действие = "Записать" Тогда // Проверка попытки изменения недоступных свойств. @@ -1475,7 +1412,6 @@ Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ТипЗнч(ПользовательОбъект) = Тип("СправочникОбъект.Пользователи") И НЕ ПараметрыОбработки.Свойство("ОбработкаСообщенияКаналаУдаленногоАдминистрирования") - И НЕ ПараметрыОбработки.Свойство("ЭтоНеразделенныйПользовательИБ") И ОписаниеПользователяИБ.Свойство("РезультатДействия") И НЕ ПараметрыОбработки.Служебный Тогда @@ -1504,8 +1440,7 @@ КонецЕсли; Если ПараметрыОбработки.Свойство("УстановкаПользователяИБ") - И НЕ ПараметрыОбработки.Свойство("ОбработкаСообщенияКаналаУдаленногоАдминистрирования") - И НЕ ПараметрыОбработки.Свойство("ЭтоНеразделенныйПользовательИБ") Тогда + И НЕ ПараметрыОбработки.Свойство("ОбработкаСообщенияКаналаУдаленногоАдминистрирования") Тогда ПарольПользователяСервиса = Неопределено; Если ПользовательОбъект.ДополнительныеСвойства.Свойство("ПарольПользователяСервиса") Тогда @@ -1650,6 +1585,10 @@ |поэтому ему автоматически будет назначена роль ""Полные права"". |Продолжить?'"); + Если НЕ ЗапретРедактированияРолей() Тогда + Возврат Истина; + КонецЕсли; + ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.Пользователи\ПриОпределенииТекстаВопросаПередЗаписьюПервогоАдминистратора"); @@ -1739,6 +1678,34 @@ КонецФункции +// Создает пользователя <Не указан> +// +// Возвращаемое значение: +// СправочникСсылка.Пользователи +// +Функция СоздатьНеуказанногоПользователя() Экспорт + + СвойстваНеуказанногоПользователя = СвойстваНеуказанногоПользователя(); + + Если ОбщегоНазначения.СсылкаСуществует(СвойстваНеуказанногоПользователя.СтандартнаяСсылка) Тогда + + Возврат СвойстваНеуказанногоПользователя.СтандартнаяСсылка; + + Иначе + + НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент(); + НовыйПользователь.Служебный = Истина; + НовыйПользователь.Наименование = СвойстваНеуказанногоПользователя.ПолноеИмя; + НовыйПользователь.УстановитьСсылкуНового(СвойстваНеуказанногоПользователя.СтандартнаяСсылка); + НовыйПользователь.ОбменДанными.Загрузка = Истина; + НовыйПользователь.Записать(); + + Возврат НовыйПользователь.Ссылка; + + КонецЕсли; + +КонецФункции + // Проверяет корректность заполнения структуры описания пользователя ИБ. // В случае нахождения ошибок устанавливает параметр Отказ в Истина и // отправляет сообщения об ошибках. @@ -1830,9 +1797,7 @@ Если ОписаниеПользователяИБ.Свойство("ПользовательОС") Тогда - Если Не ПустаяСтрока(ОписаниеПользователяИБ.ПользовательОС) - И Не ЭтоУчебнаяПлатформа() Тогда - + Если НЕ ПустаяСтрока(ОписаниеПользователяИБ.ПользовательОС) Тогда УстановитьПривилегированныйРежим(Истина); Попытка ПользовательИБ = ПользователиИнформационнойБазы.СоздатьПользователя(); @@ -1864,17 +1829,12 @@ // Процедура ЗаписатьПользователяИнформационнойБазы(ПользовательИБ) Экспорт - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - - Если Пользователи.ЭтоНеразделенныйПользователь( - ПользовательИБ.УникальныйИдентификатор) Тогда - - ВызватьИсключение ТекстИсключенияЗаписьНеразделенныхПользователейЗапрещена(); - КонецЕсли; - - КонецЕсли; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.Пользователи\ПередЗаписьюПользователяИБ"); + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.Модуль.ПередЗаписьюПользователяИБ(ПользовательИБ.УникальныйИдентификатор); + КонецЦикла; - ПроверитьПраваПользователя(ПользовательИБ); + ПроверитьПраваПользователя(ПользовательИБ, "ПриЗаписи"); ОбновлениеИнформационнойБазы.УстановитьФлагОтображенияОписанийДляНовогоПользователя(ПользовательИБ.Имя); @@ -2940,8 +2900,7 @@ НСтр("ru = 'т.к. у группы стоит признак ""Все пользователи заданного типа"".'")); Иначе Предмет = ""; - УведомлениеПользователя.Пользователи = СтроковыеФункцииКлиентСервер. - ПолучитьСтрокуИзМассиваПодстрок(МассивНеПеремещенныхПользователей, Символы.ПС); + УведомлениеПользователя.Пользователи = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивНеПеремещенныхПользователей, Символы.ПС); СообщениеПользователю = НСтр("ru = 'Не все пользователи могут быть включены в группу ""%2"", |т.к. в состав ее участников входят только %3 |или у группы стоит признак ""Все пользователи заданного типа"".'"); @@ -3177,50 +3136,6 @@ КонецПроцедуры -// Вызывается при переходе на версию конфигурации 2.1.1.10 -Процедура ЗаполнитьФлажокСлужебный() Экспорт - - УстановитьПривилегированныйРежим(Истина); - - // Заполнение для пользователя <Не указан> и - // для неразделенных пользователей. - - НеуказанныеПользователи = Новый Массив; - НеуказанныеПользователи.Добавить(СвойстваНеуказанногоПользователя().Ссылка); - НеуказанныеПользователи.Добавить(СвойстваНеуказанногоПользователя().СтандартнаяСсылка); - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("НеуказанныеПользователи", НеуказанныеПользователи); - Запрос.Текст = - "ВЫБРАТЬ - | Пользователи.Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.Ссылка В(&НеуказанныеПользователи) - | И НЕ Пользователи.Служебный - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | Пользователи.Ссылка - |ИЗ - | Справочник.Пользователи КАК Пользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи - | ПО Пользователи.ИдентификаторПользователяИБ = НеразделенныеПользователи.ИдентификаторПользователяИБ - |ГДЕ - | НЕ Пользователи.Служебный"; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - ПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ПользовательОбъект.Служебный = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПользовательОбъект); - КонецЦикла; - -КонецПроцедуры - // Преобразует реквизит УдалитьРоль в реквизит Роль роли в табличной части Роли // справочника Группы внешних пользователей. // @@ -3264,76 +3179,25 @@ КонецПроцедуры -// Вызывается при переходе на версию конфигурации 2.1.3.12 -Процедура ЗаполнениеПорядковыхНомеровНеразделенныхПользователей() Экспорт - - ТекстЗапроса = "ВЫБРАТЬ - | НеразделенныеПользователи.ИдентификаторПользователяИБ КАК ИдентификаторПользователяИБ - |ИЗ - | РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи - |ГДЕ - | НеразделенныеПользователи.ПорядковыйНомер = 0"; - Запрос = Новый Запрос(ТекстЗапроса); - - НачатьТранзакцию(); - - Попытка - - ТаблицаПользователей = Запрос.Выполнить().Выгрузить(); - Для Каждого Пользователь Из ТаблицаПользователей Цикл - - НовыйПорядковыйНомер = РегистрыСведений.НеразделенныеПользователи.МаксимальныйПорядковыйНомер() + 1; - - МенеджерЗаписи = РегистрыСведений.НеразделенныеПользователи.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ИдентификаторПользователяИБ = Пользователь.ИдентификаторПользователяИБ; - МенеджерЗаписи.ПорядковыйНомер = НовыйПорядковыйНомер; - МенеджерЗаписи.Записать(); - - КонецЦикла; - - ЗафиксироватьТранзакцию(); - - Исключение - - ОтменитьТранзакцию(); - ВызватьИсключение; - - КонецПопытки; - -КонецПроцедуры - -// Вызывается при переходе на версию конфигурации 2.1.3.12 -Процедура ПереименованиеСлужебныхНеразделенныхПользователей() Экспорт - - ТекстЗапроса = "ВЫБРАТЬ - | Пользователи.Ссылка КАК Ссылка, - | Пользователи.ИдентификаторПользователяИБ - |ИЗ - | Справочник.Пользователи КАК Пользователи - |ГДЕ - | Пользователи.ИдентификаторПользователяИБ В - | (ВЫБРАТЬ - | НеразделенныеПользователи.ИдентификаторПользователяИБ - | ИЗ - | РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи)"; - Запрос = Новый Запрос(ТекстЗапроса); - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - ПользовательОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ПользовательОбъект.Наименование = Пользователи.ПолноеИмяСлужебногоПользователя(Выборка.ИдентификаторПользователяИБ); - ОбновлениеИнформационнойБазы.ЗаписатьДанные(ПользовательОбъект); - КонецЦикла; - -КонецПроцедуры - // Вызывается при переходе на версию конфигурации 2.1.3.16 Процедура ОбновитьПредопределенныеВидыКонтактнойИнформацииПользователей() Экспорт - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.EmailПользователя, Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, - НСтр("ru='Адрес электронной почты пользователя'"), Истина, Ложь, Ложь, 1, Истина); - УправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации(Справочники.ВидыКонтактнойИнформации.ТелефонПользователя, Перечисления.ТипыКонтактнойИнформации.Телефон, - НСтр("ru='Контактный телефон пользователя'"), Истина, Ложь, Ложь, 2, Истина); - + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + + МодульУправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации( + Справочники["ВидыКонтактнойИнформации"].EmailПользователя, + Перечисления["ТипыКонтактнойИнформации"].АдресЭлектроннойПочты, + НСтр("ru='Адрес электронной почты пользователя'"), Истина, Ложь, Ложь, 1, Истина); + + МодульУправлениеКонтактнойИнформацией.ОбновитьВидКонтактнойИнформации( + Справочники["ВидыКонтактнойИнформации"].ТелефонПользователя, + Перечисления["ТипыКонтактнойИнформации"].Телефон, + НСтр("ru='Контактный телефон пользователя'"), Истина, Ложь, Ложь, 2, Истина); + КонецПроцедуры // Вызывается при переходе на версию конфигурации 2.1.4.19 @@ -3371,8 +3235,8 @@ // Процедура ПослеЗаписиАдминистратораПриАвторизации(Комментарий) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеЗаписиАдминистратораПриАвторизации(Комментарий); КонецЕсли; @@ -3398,8 +3262,8 @@ Перезапустить, ДополнительныеПараметрыКоманднойСтроки) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульАвтономнаяРаботаСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АвтономнаяРаботаСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульАвтономнаяРаботаСлужебный = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРаботаСлужебный"); МодульАвтономнаяРаботаСлужебный.ПередАвторизациейТекущегоПользователяПриНачалеРаботыСистемы(Перезапустить); КонецЕсли; @@ -3410,8 +3274,8 @@ // Процедура ПриАвторизацииАдминистратораПриНачалеРаботыСистемы(Администратор) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриАвторизацииАдминистратораПриНачалеРаботыСистемы(Администратор); КонецЕсли; @@ -3427,8 +3291,8 @@ // Процедура ПриСозданииЗапросаНаСменуПочты(Знач НоваяПочта, Знач Пользователь, Знач ПарольПользователяСервиса) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.СоздатьЗапросНаСменуПочты(НоваяПочта, Пользователь, ПарольПользователяСервиса); КонецЕсли; @@ -3445,8 +3309,8 @@ // Процедура ПриПолученииДействийСПользователемСервиса(ДоступныеДействия, Знач Пользователь = Неопределено) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); ДоступныеДействия = МодульПользователиСлужебныйВМоделиСервиса.ПолучитьДействияСПользователемСервиса(Пользователь); КонецЕсли; @@ -3470,11 +3334,11 @@ // Процедура ПослеОбновленияСоставовГруппПользователейПереопределяемый(УчастникиИзменений, ИзмененныеГруппы) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеОбновленияСоставовГруппПользователей(УчастникиИзменений, ИзмененныеГруппы); - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ОбновитьРолиПользователей(УчастникиИзменений); КонецЕсли; @@ -3492,8 +3356,8 @@ СтарыйОбъектАвторизации = Неопределено, НовыйОбъектАвторизации) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеИзмененияОбъектаАвторизацииВнешнегоПользователя( ВнешнийПользователь, СтарыйОбъектАвторизации, НовыйОбъектАвторизации); КонецЕсли; @@ -3513,8 +3377,8 @@ // Процедура ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПослеДобавленияИзмененияПользователяИлиГруппы(Ссылка, ЭтоНовый); КонецЕсли; @@ -3532,8 +3396,8 @@ // Процедура ПослеУстановкиПользователяИБ(Ссылка, ПарольПользователяСервиса) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ОбновитьРолиПользователей(Ссылка, ПарольПользователяСервиса); КонецЕсли; @@ -3544,8 +3408,8 @@ // Обработчик, вызываемый перед записью пользователя. Процедура ОбновитьОписаниеWebСервисаМенеджераСервиса() Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ОбновитьОписаниеWebСервисаМенеджераСервиса(); КонецЕсли; @@ -3554,8 +3418,8 @@ // Обработчик, вызываемый при записи пользователя. Процедура ОбновитьПользователяСервиса(ПользовательОбъект, СоздатьПользователяСервиса) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ОбновитьПользователяСервиса(ПользовательОбъект, СоздатьПользователяСервиса); КонецЕсли; @@ -3570,64 +3434,13 @@ // Процедура АннулироватьДоступПользователяСервиса(ПользовательОбъект) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.АннулироватьДоступПользователяСервиса(ПользовательОбъект); КонецЕсли; КонецПроцедуры -// Обработчик, вызываемый при получении формы справочника Пользователи -// -// Параметры: -// См. параметры платформенного обработчика ОбработкаПолученияФормы -// -Процедура ОбработкаПолученияФормыПользователя(ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ОбработкаПолученияФормыПользователя( - ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка); - КонецЕсли; - -КонецПроцедуры - -// Проверяет содержится ли пользователь ИБ с заданным идентификатором -// в списке неразделенных пользователей. -// -// Параметры: -// ИдентификаторПользователяИБ - УникальныйИдентификатор - идентификатор -// пользователя ИБ принадлежность которого к неразделенным пользователям -// требуется проверить. -// ПользовательНеразделенный - Булево - если Истина - пользователь разделенный. Возвращаемый параметр. -// -Процедура ЭтоНеразделенныйПользовательИБ(Знач ИдентификаторПользователяИБ, ПользовательНеразделенный) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - ПользовательНеразделенный = МодульПользователиСлужебныйВМоделиСервиса.ЭтоНеразделенныйПользовательИБ(ИдентификаторПользователяИБ); - Иначе - ПользовательНеразделенный = Ложь; - КонецЕсли; - -КонецПроцедуры - -// При работе в модели сервиса, заносит текущего пользователя в список неразделенных, -// если у него не установлено использование разделителей. -// -Процедура ЗарегистрироватьНеразделенногоПользователя() Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); - МодульПользователиСлужебныйВМоделиСервиса.ЗарегистрироватьНеразделенногоПользователя(); - КонецЕсли; - -КонецПроцедуры - // Возвращает флаг доступности действий изменения пользователей. // // Возвращаемое значение: @@ -3635,8 +3448,8 @@ // Процедура ПриОпределенииДоступностиИзмененияПользователей(ДоступноИзменениеПользователей) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); ДоступноИзменениеПользователей = МодульПользователиСлужебныйВМоделиСервиса.ДоступноИзменениеПользователей(); Иначе ДоступноИзменениеПользователей = Истина; @@ -3652,16 +3465,16 @@ // ОтчетМетаданные - Объект метаданных - отчет, для которого получаются варианты отчета. // ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы. // СведенияОВариантахОтчетов - ТаблицаЗначений - таблица, в которую сохраняется информация о варианте отчета. -// |-КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". -// |-КлючВарианта - Строка - ключ варианта отчета. -// |-Представление - Строка - представление варианта отчета. -// |-СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. +// * КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". +// * КлючВарианта - Строка - ключ варианта отчета. +// * Представление - Строка - представление варианта отчета. +// * СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // Процедура ПриПолученииПользовательскихВариантовОтчетов(ОтчетМетаданные, ПользовательИнформационнойБазы, СведенияОВариантахОтчетов, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПользовательскиеВариантыОтчетов(ОтчетМетаданные, ПользовательИнформационнойБазы, СведенияОВариантахОтчетов, СтандартнаяОбработка); КонецЕсли; @@ -3672,17 +3485,17 @@ // // Параметры: // СведенияОВариантахОтчетов - ТаблицаЗначений - таблица, в которой сохранена информация о варианте отчета. -// |-КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". -// |-КлючВарианта - Строка - ключ варианта отчета. -// |-Представление - Строка - представление варианта отчета. -// |-СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. +// * КлючОбъекта - Строка - ключ отчета вида "Отчет.НазваниеОтчета". +// * КлючВарианта - Строка - ключ варианта отчета. +// * Представление - Строка - представление варианта отчета. +// * СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // ПользовательИнформационнойБазы - Строка - имя пользователя информационной базы у которого очищается вариант отчета // СтандартнаяОбработка - Булево - если Истина - вариант отчета сохранен в стандартном хранилище. // Процедура ПриУдаленииПользовательскихВариантовОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.УдалитьПользовательскийВариантОтчета(СведенияОВариантеОтчета, ПользовательИнформационнойБазы, СтандартнаяОбработка); КонецЕсли; @@ -3696,14 +3509,14 @@ // Параметры: // ПользовательСсылка - СправочникСсылка.Пользователи - пользователь, у которого нужно получить настройки. // Настройки - Структура - прочие пользовательские настройки. -// |-НазваниеНастройки - Строка - название, которое будет отображаться в дереве настроек обработки. -// |-КартинкаНастройки - Картинка - картинка, которая будет отображаться в дереве обработки. -// |-СписокНастроек - СписокЗначений - список полученных настроек +// * НазваниеНастройки - Строка - название, которое будет отображаться в дереве настроек обработки. +// * КартинкаНастройки - Картинка - картинка, которая будет отображаться в дереве обработки. +// * СписокНастроек - СписокЗначений - список полученных настроек // Процедура ПриПолученииПрочихПользовательскихНастроек(ПользовательСсылка, Настройки) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПолучитьНастройкиДополнительныхОтчетовИОбработок(ПользовательСсылка, Настройки); КонецЕсли; @@ -3718,8 +3531,8 @@ // Процедура ПриСохраненииПрочихПользовательскихНастроек(Настройки, ПользователиПолучатели) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ДобавитьКомандыВСписокБыстрогоДоступа(Настройки, ПользователиПолучатели); КонецЕсли; @@ -3734,8 +3547,8 @@ // Процедура ПриУдаленииПрочихПользовательскихНастроек(Настройки, ОчищаемыйПользователь) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.УдалитьКомандыИзСпискаБыстрогоДоступа(Настройки, ОчищаемыйПользователь); КонецЕсли; @@ -4295,100 +4108,152 @@ КонецПроцедуры -// Проверяет права указанного Пользователя ИБ в режиме разделения данных. +// Проверяет права указанного пользователя ИБ. // // Параметры: // ПользовательИБ - ПользовательИнформационнойБазы. +// РежимПроверки - Строка - ПриЗаписи или ПриЗапуске. // -Процедура ПроверитьПраваПользователя(ПользовательИБ) +Процедура ПроверитьПраваПользователя(ПользовательИБ, РежимПроверки = "ПриЗаписи") - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Если РазделениеВключено И ПользовательИБ.РазделениеДанных.Количество() = 0 Тогда + Возврат; // не нужно проверять неразделенных пользователей в модели сервиса + КонецЕсли; + + Если Не РазделениеВключено И РежимПроверки = "ПриЗапуске" Тогда + Возврат; // не нужно проверять права пользователей при запуске в локальном режиме + КонецЕсли; + + ТипыПользователей = ?(РазделениеВключено, + Перечисления.ТипыПользователей.ПользовательОбластиДанных, + Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); - Если ПользовательИБ.РазделениеДанных.Количество() > 0 Тогда - - НедоступныеРоли = НедоступныеРолиПоТипуПользователей( - Перечисления.ТипыПользователей.ПользовательОбластиДанных); - - НайденныеНедоступныеРоли = Новый Массив; - - Для каждого Роль Из ПользовательИБ.Роли Цикл - ИмяРоли = Роль.Имя; - - СвойстваНедоступнойРоли = НедоступныеРоли.Получить(ИмяРоли); - Если СвойстваНедоступнойРоли <> Неопределено Тогда - НайденныеНедоступныеРоли.Добавить(Роль); - - Если СвойстваНедоступнойРоли.Свойство("ИзменяемыеНеразделенныеДанные") Тогда - Запись = Новый ЗаписьXML; - Запись.УстановитьСтроку(); - СериализаторXDTO.ЗаписатьXML(Запись, СвойстваНедоступнойРоли.ИзменяемыеНеразделенныеДанные); - ТаблицаСтрокой = Запись.Закрыть(); - - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - ПользовательИБ, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Разделенному пользователю назначена роль - |""%1"", - |предоставляющая права на изменение общих данных: - |""%2"".'"), - Роль.Представление(), - ТаблицаСтрокой) ); - КонецЕсли; - - Если СвойстваНедоступнойРоли.Свойство("Права") Тогда - - Для каждого Право Из СвойстваНедоступнойРоли.Права Цикл - ЗаписьЖурналаРегистрации( - НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), - УровеньЖурналаРегистрации.Ошибка, - , - ПользовательИБ, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Разделенному пользователю назначена роль - |""%1"", - |предоставляющая право ""%2"".'"), - Роль.Представление(), - Право)); - КонецЦикла; - КонецЕсли; - КонецЕсли; - КонецЦикла; - - Если НайденныеНедоступныеРоли.Количество() > 0 Тогда - - Если НайденныеНедоступныеРоли.Количество() = 1 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Разделенным пользователям не может быть назначена роль - |""%1"".'"), - НайденныеНедоступныеРоли[0].Представление()); - Иначе - Роли = ""; - Для каждого Роль Из НайденныеНедоступныеРоли Цикл - Роли = " - |" + Роль.Представление(); - КонецЦикла; - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Разделенным пользователям не могут быть назначены роли:%1.'"), - Роли); - КонецЕсли; - КонецЕсли; - + НедоступныеРоли = НедоступныеРолиПоТипуПользователей(ТипыПользователей); + Если НедоступныеРоли.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + // Проверка на изменение состава ролей у администраторов + Если РежимПроверки = "ПриЗаписи" И Не РазделениеВключено Тогда + ПрежнийПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ПользовательИБ.УникальныйИдентификатор); + Если ПрежнийПользовательИБ <> Неопределено Тогда + ПроверитьПраваПользователя(ПрежнийПользовательИБ, "ПередЗаписью"); КонецЕсли; КонецЕсли; -КонецПроцедуры - -Функция ТекстИсключенияЗаписьНеразделенныхПользователейЗапрещена() + НайденныеНедоступныеРоли = Новый Массив; - Возврат - НСтр("ru = 'Запись неразделенных пользователей - |при включенном использовании разделителей запрещена.'"); -КонецФункции + Для каждого Роль Из ПользовательИБ.Роли Цикл + ИмяРоли = Роль.Имя; + + СвойстваНедоступнойРоли = НедоступныеРоли.Получить(ИмяРоли); + Если СвойстваНедоступнойРоли = Неопределено Тогда + Продолжить; + КонецЕсли; + НайденныеНедоступныеРоли.Добавить(Роль); + + Если СвойстваНедоступнойРоли.Свойство("ИзменяемыеНеразделенныеДанные") Тогда + Запись = Новый ЗаписьXML; + Запись.УстановитьСтроку(); + СериализаторXDTO.ЗаписатьXML(Запись, СвойстваНедоступнойРоли.ИзменяемыеНеразделенныеДанные); + ТаблицаСтрокой = Запись.Закрыть(); + + Если РежимПроверки = "ПередЗаписью" Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка изменить состав ролей у пользователя %1 с ролью + |""%2"", + |предоставляющей права на изменение общих данных: + |""%3"".'"), + ПользовательИБ.ПолноеИмя, + Роль.Представление(), + ТаблицаСтрокой); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка назначить пользователю %1 недопустимую роль + |""%2"", + |предоставляющую права на изменение общих данных: + |""%3"".'"), + ПользовательИБ.ПолноеИмя, + Роль.Представление(), + ТаблицаСтрокой); + КонецЕсли; + + ИмяСобытия = НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,, ПользовательИБ, ТекстСообщения); + КонецЕсли; + + Если СвойстваНедоступнойРоли.Свойство("Права") Тогда + + ИмяСобытия = НСтр("ru = 'Пользователи.Ошибка при установке ролей пользователю ИБ'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + + Для каждого Право Из СвойстваНедоступнойРоли.Права Цикл + + Если РежимПроверки = "ПередЗаписью" Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка изменить состав ролей у пользователя ""%1"" с ролью + |""%2"", + |предоставляющей право ""%3"".'"), + Строка(ПользовательИБ), + Роль.Представление(), + Право); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Попытка назначить пользователю ""%1"" недопустимую роль + |""%2"", + |предоставляющую право ""%3"".'"), + Строка(ПользовательИБ), + Роль.Представление(), + Право); + КонецЕсли; + ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,, ПользовательИБ, ТекстСообщения); + + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Если НайденныеНедоступныеРоли.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Если НайденныеНедоступныеРоли.Количество() = 1 Тогда + + Если РежимПроверки = "ПередЗаписью" Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно изменить состав ролей у пользователя ""%1"".'"), + ПользовательИБ.ПолноеИмя); + Иначе + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователю ""%1"" не может быть назначена роль + |""%2"".'"), + ПользовательИБ.ПолноеИмя, + НайденныеНедоступныеРоли[0].Представление()); + КонецЕсли; + ВызватьИсключение ТекстСообщения; + + Иначе + + Если РежимПроверки = "ПередЗаписью" Тогда + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно изменить состав ролей у пользователя ""%1"".'"), + ПользовательИБ.ПолноеИмя); + Иначе + Роли = ""; + Для каждого Роль Из НайденныеНедоступныеРоли Цикл + Роли = " + |" + Роль.Представление(); + КонецЦикла; + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Пользователю ""%1"" не могут быть назначены роли:%2.'"), + ПользовательИБ.ПолноеИмя, + Роли); + КонецЕсли; + ВызватьИсключение ТекстСообщения; + КонецЕсли; + +КонецПроцедуры Функция СписокНастроек(ИмяПользователяИБ, МенеджерНастроек) diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl index 526a97ff9..66192e36b 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервиса/Module.bsl @@ -6,86 +6,6 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Проверяет содержится ли пользователь ИБ с заданным идентификатором -// в списке неразделенных пользователей. -// -// Параметры: -// ИдентификаторПользователяИБ - УникальныйИдентификатор - идентификатор -// пользователя ИБ принадлежность которого к неразделенным пользователям -// требуется проверить. -// -Функция ЭтоНеразделенныйПользовательИБ(Знач ИдентификаторПользователяИБ) Экспорт - - Если НЕ ЗначениеЗаполнено(ИдентификаторПользователяИБ) Тогда - Возврат Ложь; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ИДНеразделенныхПользователей.ИдентификаторПользователяИБ - |ИЗ - | РегистрСведений.НеразделенныеПользователи КАК ИДНеразделенныхПользователей - |ГДЕ - | ИДНеразделенныхПользователей.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; - Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ); - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НеразделенныеПользователи"); - ЭлементБлокировки.УстановитьЗначение("ИдентификаторПользователяИБ", ИдентификаторПользователяИБ); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Разделяемый; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - Результат = Запрос.Выполнить(); - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - Возврат НЕ Результат.Пустой(); - -КонецФункции - -// При работе в модели сервиса, заносит текущего пользователя в список неразделенных, -// если у него не установлено использование разделителей. -// -Процедура ЗарегистрироватьНеразделенногоПользователя() Экспорт - - Если НЕ ПустаяСтрока(ПользователиИнформационнойБазы.ТекущийПользователь().Имя) - И ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ПользователиИнформационнойБазы.ТекущийПользователь().РазделениеДанных.Количество() = 0 Тогда - - НачатьТранзакцию(); - Попытка - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НеразделенныеПользователи"); - Блокировка.Заблокировать(); - - МенеджерЗаписи = РегистрыСведений.НеразделенныеПользователи.СоздатьМенеджерЗаписи(); - МенеджерЗаписи.ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; - МенеджерЗаписи.Прочитать(); - Если НЕ МенеджерЗаписи.Выбран() Тогда - МенеджерЗаписи.ИдентификаторПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор; - МенеджерЗаписи.ПорядковыйНомер = РегистрыСведений.НеразделенныеПользователи.МаксимальныйПорядковыйНомер() + 1; - МенеджерЗаписи.Записать(); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - - КонецЕсли; - -КонецПроцедуры - // Возвращает флаг доступности действий изменения пользователей. // // Возвращаемое значение: @@ -147,7 +67,7 @@ ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Пользователь, "ИдентификаторПользователяСервиса"), НоваяПочта, ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "RequestEmailChange"); // Имя операции не локализуется КонецПроцедуры @@ -223,10 +143,11 @@ ИнформацияОбОшибке = Неопределено; Если СоздатьПользователяСервиса Тогда Прокси.CreateUser(ПользовательСервиса, ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "CreateUser"); // Имя операции не локализуется Иначе Прокси.UpdateUser(ПользовательСервиса, ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "UpdateUser"); // Имя операции не локализуется КонецЕсли; - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); КонецПроцедуры @@ -270,36 +191,6 @@ КонецПроцедуры -// Только для внутреннего использования -Процедура ОбработкаПолученияФормыПользователя(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт - - Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Возврат; - КонецЕсли; - - Если ВидФормы = "ФормаОбъекта" - И Параметры.Свойство("Ключ") И НЕ Параметры.Ключ.Пустая() Тогда - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | 1 - |ИЗ - | РегистрСведений.НеразделенныеПользователи КАК НеразделенныеПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Пользователи КАК Пользователи - | ПО НеразделенныеПользователи.ИдентификаторПользователяИБ = Пользователи.ИдентификаторПользователяИБ - | И (Пользователи.Ссылка = &Ссылка)"; - Запрос.УстановитьПараметр("Ссылка", Параметры.Ключ); - Если НЕ Запрос.Выполнить().Пустой() Тогда - СтандартнаяОбработка = Ложь; - ВыбраннаяФорма = Метаданные.ОбщиеФормы.ИнформацияНеразделенногоПользователя; - Возврат; - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - // Только для внутреннего использования Функция ЕстьПравоДобавленияПользователей() Экспорт @@ -314,7 +205,7 @@ ИнформацияОбОшибке = Неопределено; ПраваДоступаXDTO = Прокси.GetAccessRights(ОбластьДанных, ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetAccessRights"); // Имя операции не локализуется Для каждого ЭлементСпискаПрав Из ПраваДоступаXDTO.Item Цикл Если ЭлементСпискаПрав.AccessRight = "CreateUser" Тогда @@ -357,22 +248,33 @@ ИнформацияОбОшибке = Неопределено; ПраваДоступаОбъектовXDTO = Прокси.GetObjectsAccessRights(ОбъектыДоступа, ИдентификаторСервисаТекущегоПользователя(), ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetObjectsAccessRights"); // Имя операции не локализуется Возврат ПраваДоступаОбъектовXDTOВДействияСПользователемСервиса(Прокси.ФабрикаXDTO, ПраваДоступаОбъектовXDTO); КонецФункции // Только для внутреннего использования -Функция ПолучитьПользователейСервиса(Знач ПарольПользователяСервиса) Экспорт +Функция ПолучитьПользователейСервиса(ПарольПользователяСервиса) Экспорт УстановитьПривилегированныйРежим(Истина); Прокси = РаботаВМоделиСервиса.ПолучитьПроксиМенеджераСервиса(ПарольПользователяСервиса); УстановитьПривилегированныйРежим(Ложь); ИнформацияОбОшибке = Неопределено; - СписокПользователей = Прокси.GetUsersList(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), ); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + + Попытка + + СписокПользователей = Прокси.GetUsersList(РаботаВМоделиСервиса.ЗначениеРазделителяСеанса(), ); + + Исключение + + ПарольПользователяСервиса = Неопределено; + ВызватьИсключение; + + КонецПопытки; + + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetUsersList"); // Имя операции не локализуется Результат = Новый ТаблицаЗначений; Результат.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор")); @@ -404,7 +306,7 @@ ОбщегоНазначения.ЗначениеРазделителяСеанса(), ИдентификаторПользователяСервиса, ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GrantUserAccess"); // Имя операции не локализуется КонецПроцедуры @@ -545,3 +447,18 @@ КонецЕсли; КонецФункции + +// Обрабатывает информация об ошибке полученную из web-сервиса. +// В случае если передана не пустая информация об ошибке, записывает +// подробное представление ошибки в журнал регистрации и вызывает +// исключение с текстом краткого представления об ошибке. +// +Процедура ОбработатьИнформациюОбОшибкеWebСервиса(Знач ИнформацияОбОшибке, Знач ИмяОперации) + + РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса( + ИнформацияОбОшибке, + ПользователиСлужебныйВМоделиСервисаПовтИсп.ИмяПодсистемыДляСобытийЖурналаРегистрации(), + "ManageApplication", // Не локализуется + ИмяОперации); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl index 7351c1c77..427225d27 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаКлиент/Module.bsl @@ -9,18 +9,16 @@ // Открывает форму ввода пароля пользователя сервиса // // Параметры: -// ВладелецФормы - УправляемаяФорма, которую нужно оповестить о выборе. -// ПарольПользователяСервиса - Строка - пароль пользователя сервиса -// ПарольЕщеНеВведен - Булево +// ОбработкаПродолжения - ОписаниеОповещения, которое нужно обработать после получения пароля. +// ФормаВладелец - УправляемаяФорма, которая запрашивает пароль. +// ПарольПользователяСервиса - Строка - текущий пароль пользователя сервиса. // -Процедура ЗапроситьПарольДляАутентификацииВСервисе(ВладелецФормы, ПарольПользователяСервиса, ПарольЕщеНеВведен) Экспорт +Процедура ЗапроситьПарольДляАутентификацииВСервисе(ОбработкаПродолжения, ФормаВладелец, ПарольПользователяСервиса) Экспорт - Если ПарольПользователяСервиса <> Неопределено Тогда - Возврат; + Если ПарольПользователяСервиса = Неопределено Тогда + ОткрытьФорму("ОбщаяФорма.АутентификацияВСервисе", , ФормаВладелец, , , , ОбработкаПродолжения); + Иначе + ВыполнитьОбработкуОповещения(ОбработкаПродолжения, ПарольПользователяСервиса); КонецЕсли; - ОткрытьФорму("ОбщаяФорма.АутентификацияВСервисе", , ВладелецФормы); - - ПарольЕщеНеВведен = Истина; - КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl new file mode 100644 index 000000000..49a99512e --- /dev/null +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/Module.bsl @@ -0,0 +1,18 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Подсистема "Пользователи в модели сервиса". +// +/////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Возвращает имя подсистемы, которое должно использоваться в именах +// событий журнала регистрации. +// +// Возвращаемое значение: Строка. +// +Функция ИмяПодсистемыДляСобытийЖурналаРегистрации() Экспорт + + Возврат Метаданные.Подсистемы.СтандартныеПодсистемы.Подсистемы.РаботаВМоделиСервиса.Подсистемы.ПользователиВМоделиСервиса.Имя; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/ПользователиСлужебныйВМоделиСервисаПовтИсп.mdo b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/ПользователиСлужебныйВМоделиСервисаПовтИсп.mdo new file mode 100644 index 000000000..5767d4e0d --- /dev/null +++ b/SSL/src/CommonModules/ПользователиСлужебныйВМоделиСервисаПовтИсп/ПользователиСлужебныйВМоделиСервисаПовтИсп.mdo @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1126157b-64c0-4d64-8551-f31c5ed0fd29"> + <name>ПользователиСлужебныйВМоделиСервисаПовтИсп</name> + <synonym> + <key>ru</key> + <value>Пользователи служебный в модели сервиса повт исп</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> + <returnValuesReuse>DuringSession</returnValuesReuse> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl index 9463373af..2c5913333 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйВызовСервера/Module.bsl @@ -36,3 +36,24 @@ КонецЕсли; КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Проверяет, что объект информационной базы используется в качестве объекта авторизации +// какого-нибудь внешнего пользователя, кроме заданного внешнего пользователя (если задан). +// +Функция ОбъектАвторизацииИспользуется(Знач СсылкаНаОбъектАвторизации, + Знач СсылкаНаТекущегоВнешнегоПользователя = Неопределено, + НайденныйВнешнийПользователь = Неопределено, + ЕстьПравоДобавленияВнешнегоПользователя = Ложь, + ТекстОшибки = "") Экспорт + + Возврат ПользователиСлужебный.ОбъектАвторизацииИспользуется( + СсылкаНаОбъектАвторизации, + СсылкаНаТекущегоВнешнегоПользователя, + НайденныйВнешнийПользователь, + ЕстьПравоДобавленияВнешнегоПользователя, + ТекстОшибки); + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl index 7e5b40480..07f48dbc5 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйКлиент/Module.bsl @@ -32,33 +32,52 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Выполняет попытку авторизации пользователя и проверку результата. -Процедура ПроверитьАвторизациюПользователя(Отказ = Истина) Экспорт +Процедура ПроверитьАвторизациюПользователя(Параметры, ПроверитьЗапускСПустымСпискомПользователей = Ложь) Экспорт - ОшибкаАвторизации = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ОшибкаАвторизации; - Если ОшибкаАвторизации = "" Тогда - Возврат; - ИначеЕсли ТипЗнч(ОшибкаАвторизации) = Тип("ФиксированнаяСтруктура") Тогда - Если ЗначениеЗаполнено(ОшибкаАвторизации.ДополнительныеПараметрыКоманднойСтроки) Тогда - ПрекратитьРаботуСистемы(Истина, ОшибкаАвторизации.ДополнительныеПараметрыКоманднойСтроки); - Иначе - ПрекратитьРаботуСистемы(Истина); + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если ПроверитьЗапускСПустымСпискомПользователей Тогда + Если НЕ ПараметрыКлиента.Свойство("ОшибкаЗапускаСПустымСпискомПользователей") Тогда + Возврат; + КонецЕсли; + Иначе + Если НЕ ПараметрыКлиента.Свойство("ОшибкаАвторизации") Тогда + Возврат; КонецЕсли; КонецЕсли; - - Отказ = Истина; - ТекстОшибки = ПользователиСлужебныйВызовСервера.ПроверитьВозможностьЗапускаСПустымСпискомПользователейИБ(Истина); - Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда - Предупреждение(ОшибкаАвторизации); - Возврат; - КонецЕсли; - СоздатьАдминистратораИлиЗавершитьРаботу(ТекстОшибки); + Параметры.Отказ = Истина; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПриПроверкеАвторизацииПользователя", ЭтотОбъект); КонецПроцедуры -// Предлагает создать администратора или завершить работу. -Процедура СоздатьАдминистратораИлиЗавершитьРаботу(ТекстОшибки) Экспорт +/////////////////////////////////////////////////////////////////////////////// +// Обработчики оповещений. + +// Предупреждает об ошибке авторизации или предлагает создать первого администратора. +Процедура ИнтерактивнаяОбработкаПриПроверкеАвторизацииПользователя(Параметры, Неопределен) Экспорт + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если НЕ ПараметрыКлиента.Свойство("ОшибкаЗапускаСПустымСпискомПользователей") Тогда + ОшибкаАвторизации = ПараметрыКлиента.ОшибкаАвторизации; + + Если ТипЗнч(ОшибкаАвторизации) = Тип("ФиксированнаяСтруктура") Тогда + Параметры.Перезапустить = Истина; + Если ЗначениеЗаполнено(ОшибкаАвторизации.ДополнительныеПараметрыКоманднойСтроки) Тогда + Параметры.ДополнительныеПараметрыКоманднойСтроки = + ОшибкаАвторизации.ДополнительныеПараметрыКоманднойСтроки; + КонецЕсли; + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + Возврат; + Иначе + СтандартныеПодсистемыКлиент.ПоказатьПредупреждениеИПродолжить(Параметры, ОшибкаАвторизации); + Возврат; + КонецЕсли; + КонецЕсли; + + // Создание администратора или завершение работы. ТекстВопроса = НСтр("ru = 'Запуск с пустым списком пользователей информационной базы невозможен. |Добавить пользователя Администратор и перезапустить программу? @@ -74,17 +93,36 @@ Кнопки.Добавить("СоздатьИПерезапустить", НСтр("ru = 'Добавить и перезапустить'")); Кнопки.Добавить("ЗавершитьРаботу", НСтр("ru = 'Завершить работу'")); - Ответ = Вопрос( + ОбработкаОтвета = Новый ОписаниеОповещения("ПослеОтветаНаВопросСоздатьАдминистратораИлиЗавершитьРаботу", + ЭтотОбъект, Параметры); + + ПоказатьВопрос( + ОбработкаОтвета, ТекстВопроса, Кнопки, , "СоздатьИПерезапустить", НСтр("ru = 'Авторизация пользователя'") ); - Если Ответ = "СоздатьИПерезапустить" Тогда - ПользователиСлужебныйВызовСервера.СоздатьПервогоАдминистратораСистемы(); - ПрекратитьРаботуСистемы(Истина); - КонецЕсли; - КонецПроцедуры +// Продолжение предыдущей процедуры. +Процедура ПослеОтветаНаВопросСоздатьАдминистратораИлиЗавершитьРаботу(Ответ, Параметры) Экспорт + + Если Ответ = "СоздатьИПерезапустить" Тогда + ПользователиСлужебныйВызовСервера.СоздатьПервогоАдминистратораСистемы(); + + НовыйПараметрЗапуска = " /N""" + НСтр("ru = 'Администратор'")+ """"; + + Если ЗначениеЗаполнено(ПараметрЗапуска) Тогда + НовыйПараметрЗапуска = НовыйПараметрЗапуска + + " /C """ + СтрЗаменить(ПараметрЗапуска, """", """""") + """"; + КонецЕсли; + + Параметры.Перезапустить = Истина; + Параметры.ДополнительныеПараметрыКоманднойСтроки = НовыйПараметрЗапуска; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl index a963c33e6..c999394c9 100644 --- a/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ПользователиСлужебныйПовтИсп/Module.bsl @@ -62,11 +62,9 @@ Функция ДеревоРолей(ПоПодсистемам = Истина, Знач ТипПользователей = Неопределено) Экспорт Если ТипПользователей = Неопределено Тогда - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ТипПользователей = Перечисления.ТипыПользователей.ПользовательОбластиДанных; - Иначе - ТипПользователей = Перечисления.ТипыПользователей.ПользовательЛокальногоРешения; - КонецЕсли; + ТипПользователей = ?(ОбщегоНазначенияПовтИсп.РазделениеВключено(), + Перечисления.ТипыПользователей.ПользовательОбластиДанных, + Перечисления.ТипыПользователей.ПользовательЛокальногоРешения); КонецЕсли; Дерево = Новый ДеревоЗначений; @@ -83,7 +81,7 @@ // Добавление ненайденных ролей Для каждого Роль Из Метаданные.Роли Цикл - Если НедоступныеРоли.Получить(Роль) <> Неопределено + Если НедоступныеРоли.Получить(Роль.Имя) <> Неопределено ИЛИ ВРег(Лев(Роль.Имя, СтрДлина("Удалить"))) = ВРег("Удалить") Тогда Продолжить; diff --git a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl index 8f1033538..8b7bee339 100644 --- a/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl +++ b/SSL/src/CommonModules/ПоставляемыеДанные/Module.bsl @@ -588,13 +588,13 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями\ПриОпределенииОбработчиковКаналовСообщений"].Добавить( "ПоставляемыеДанные"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "ПоставляемыеДанные"); diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo index 9519135f4..ee5ad1bf6 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовПовтИсп/ПрефиксацияОбъектовПовтИсп.mdo @@ -3,7 +3,7 @@ <name>ПрефиксацияОбъектовПовтИсп</name> <synonym> <key>ru</key> - <value>Префиксация объектов повторное использование</value> + <value>Префиксация объектов повт исп</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовВызовСервера/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl similarity index 100% rename from SSL/src/CommonModules/ПрефиксацияОбъектовВызовСервера/Module.bsl rename to SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/Module.bsl diff --git a/SSL/src/CommonModules/РаботаСФайламиВызовСервера/РаботаСФайламиВызовСервера.mdo b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/ПрефиксацияОбъектовСлужебный.mdo similarity index 59% rename from SSL/src/CommonModules/РаботаСФайламиВызовСервера/РаботаСФайламиВызовСервера.mdo rename to SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/ПрефиксацияОбъектовСлужебный.mdo index 6c86a6cde..7164b2853 100644 --- a/SSL/src/CommonModules/РаботаСФайламиВызовСервера/РаботаСФайламиВызовСервера.mdo +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСлужебный/ПрефиксацияОбъектовСлужебный.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="68caf9e5-9a79-4b77-b0f4-ca9c0fe4fa16"> - <name>РаботаСФайламиВызовСервера</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="259564b8-172e-4eed-9360-d561ec6dad69"> + <name>ПрефиксацияОбъектовСлужебный</name> <synonym> <key>ru</key> - <value>Работа с файлами вызов сервера</value> + <value>Префиксация объектов служебный</value> </synonym> <server>true</server> <externalConnection>true</externalConnection> diff --git a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl index 2ea32f813..c4c817b7f 100644 --- a/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl +++ b/SSL/src/CommonModules/ПрефиксацияОбъектовСобытия/Module.bsl @@ -205,10 +205,8 @@ Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); - Если Не ПрефиксацияОбъектовВызовСервера.ДатыОбъектаОдногоПериода(Выборка.Дата, Объект.Дата, Объект.Ссылка) Тогда - + Если Не ПрефиксацияОбъектовСлужебный.ДатыОбъектаОдногоПериода(Выборка.Дата, Объект.Дата, Объект.Ссылка) Тогда Объект.Номер = ""; - КонецЕсли; КонецПроцедуры @@ -221,12 +219,8 @@ Возврат; КонецЕсли; - Если ПрефиксацияОбъектовВызовСервера.ДатаИлиОрганизацияОбъектаИзменена( - Объект.Ссылка, - Объект.Дата, - Объект[ИмяРеквизитаОрганизация(Объект.Метаданные())], - Объект.Метаданные().ПолноеИмя()) - Тогда + Если ПрефиксацияОбъектовСлужебный.ДатаИлиОрганизацияОбъектаИзменена(Объект.Ссылка, Объект.Дата, + Объект[ИмяРеквизитаОрганизация(Объект.Метаданные())], Объект.Метаданные().ПолноеИмя()) Тогда Объект.Номер = ""; @@ -244,11 +238,8 @@ Возврат; КонецЕсли; - Если ПрефиксацияОбъектовВызовСервера.ОрганизацияОбъектаИзменена( - Объект.Ссылка, - Объект[ИмяРеквизитаОрганизация(Объект.Метаданные())], - Объект.Метаданные().ПолноеИмя()) - Тогда + Если ПрефиксацияОбъектовСлужебный.ОрганизацияОбъектаИзменена(Объект.Ссылка, + Объект[ИмяРеквизитаОрганизация(Объект.Метаданные())], Объект.Метаданные().ПолноеИмя()) Тогда Объект.Код = ""; diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl index ab142d21b..96ab134e1 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлы/Module.bsl @@ -87,7 +87,7 @@ // Расширение - Строка. // Размер - Число. // Редактирует - СправочникСсылка.Пользователи. -// ПодписанЭЦП - Булево. +// ПодписанЭП - Булево. // Зашифрован - Булево. // ФайлРедактируется - Булево. // ФайлРедактируетТекущийПользователь - Булево. @@ -163,7 +163,7 @@ ДополнительнаяИнформация.Вставить("Расширение", ФайлОбъект.Расширение); ДополнительнаяИнформация.Вставить("Размер", ФайлОбъект.Размер); ДополнительнаяИнформация.Вставить("Редактирует", ФайлОбъект.Редактирует); - ДополнительнаяИнформация.Вставить("ПодписанЭЦП", ФайлОбъект.ПодписанЭЦП); + ДополнительнаяИнформация.Вставить("ПодписанЭП", ФайлОбъект.ПодписанЭП); ДополнительнаяИнформация.Вставить("Зашифрован", ФайлОбъект.Зашифрован); ДополнительнаяИнформация.Вставить("ФайлРедактируется", ФайлОбъект.Редактирует <> Справочники.Пользователи.ПустаяСсылка() ); ДополнительнаяИнформация.Вставить("ФайлРедактируетТекущийПользователь", @@ -277,7 +277,7 @@ ПрисоединенныйФайл.ДатаМодификацииУниверсальная = ВремяИзмененияУниверсальное; ПрисоединенныйФайл.ДатаСоздания = ТекущаяДатаСеанса(); ПрисоединенныйФайл.Описание = Описание; - ПрисоединенныйФайл.ПодписанЭЦП = Ложь; + ПрисоединенныйФайл.ПодписанЭП = Ложь; ПрисоединенныйФайл.Наименование = ИмяБезРасширения; ПрисоединенныйФайл.Расширение = РасширениеБезТочки; ПрисоединенныйФайл.ТипХраненияФайла = ФайловыеФункцииСлужебный.ТипХраненияФайлов(); @@ -510,11 +510,13 @@ // Процедура СконвертироватьФайлыВПрисоединенные(Знач ВладелецФайлов, ИмяСправочника = Неопределено) Экспорт - Если Не ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда Возврат; КонецЕсли; - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + ЗаголовокОшибки = НСтр("ru = 'Ошибка при конвертации присоединенных файлов подсистемы Работа с файлами |в присоединенные файлы подсистемы Присоединенные файлы.'"); @@ -549,7 +551,7 @@ ПрисоединенныйФайл.Зашифрован = ФайлИсточникОбъект.Зашифрован; ПрисоединенныйФайл.Изменил = ТекущаяВерсияОбъект.Автор; ПрисоединенныйФайл.Описание = ФайлИсточникОбъект.Описание; - ПрисоединенныйФайл.ПодписанЭЦП = ФайлИсточникОбъект.ПодписанЭЦП; + ПрисоединенныйФайл.ПодписанЭП = ФайлИсточникОбъект.ПодписанЭП; ПрисоединенныйФайл.Размер = ТекущаяВерсияОбъект.Размер; ПрисоединенныйФайл.Расширение = ТекущаяВерсияОбъект.Расширение; @@ -567,17 +569,15 @@ ЗаполнитьЗначенияСвойств(НоваяСтрока, СертификатШифрованияСтрока); КонецЦикла; - Для Каждого ЭЦПСтрока Из ТекущаяВерсияОбъект.ЭлектронныеЦифровыеПодписи Цикл - НоваяСтрока = ПрисоединенныйФайл.ЭлектронныеЦифровыеПодписи.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭЦПСтрока); + Для Каждого ЭПСтрока Из ТекущаяВерсияОбъект.ЭлектронныеПодписи Цикл + НоваяСтрока = ПрисоединенныйФайл.ЭлектронныеПодписи.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭПСтрока); КонецЦикла; ПрисоединенныйФайл.Записать(); Если ПрисоединенныйФайл.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда - - // "Вычислить" применяется для случая, когда подсистема РаботаСФайлами отсутствует в конфигурации. - ХранилищеФайла = Вычислить("РаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсияОбъект.Ссылка)"); + ХранилищеФайла = МодульРаботаСФайламиСлужебныйВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы(ТекущаяВерсияОбъект.Ссылка); ДвоичныеДанные = ХранилищеФайла.Получить(); МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи(); @@ -597,7 +597,7 @@ ТекущаяВерсияОбъект.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); ФайлИсточникОбъект.ТекущаяВерсияПутьКФайлу = ""; ФайлИсточникОбъект.ТекущаяВерсияТом = ""; - ПометитьНаУдалениеВерсииФайла(ФайлИсточникОбъект.Ссылка, ТекущаяВерсияОбъект.Ссылка); + МодульРаботаСФайламиСлужебный.ПометитьНаУдалениеВерсииФайла(ФайлИсточникОбъект.Ссылка, ТекущаяВерсияОбъект.Ссылка); КонецЕсли; ТекущаяВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); @@ -629,11 +629,11 @@ // Функция СсылкиНаОбъектыСФайлами(Знач ТаблицаВладельцевФайлов) Экспорт - Если Не ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда Возврат Новый Массив; КонецЕсли; - МодульРаботаСФайламиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебный"); + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); Возврат МодульРаботаСФайламиСлужебный.СсылкиНаОбъектыСФайлами(ТаблицаВладельцевФайлов); @@ -654,13 +654,13 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Операции с ЭЦП +// Операции с ЭП -// Заносит информацию о одной ЭЦП. +// Заносит информацию о одной ЭП. // // Параметры: // ПрисоединенныйФайл - Ссылка или Объект присоединенного файла. -// ДанныеПодписи - Структура для заполнения в табличной части ЭлектронныеЦифровыеПодписи. +// ДанныеПодписи - Структура для заполнения в табличной части ЭлектронныеПодписи. // Процедура ЗанестиИнформациюОднойПодписи(Знач ПрисоединенныйФайл, Знач ДанныеПодписи) Экспорт @@ -682,7 +682,7 @@ ВызватьИсключение ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(ПрисоединенныйФайлСсылка); КонецЕсли; - ЭлектроннаяЦифроваяПодпись.ЗанестиИнформациюОПодписи( + ЭлектроннаяПодпись.ЗанестиИнформациюОПодписи( ПрисоединенныйФайл, ДанныеПодписи.НоваяПодписьДвоичныеДанные, ДанныеПодписи.Отпечаток, @@ -694,11 +694,11 @@ КонецПроцедуры -// Заносит информацию о массиве ЭЦП. +// Заносит информацию о массиве ЭП. // // Параметры: // ПрисоединенныйФайл - Ссылка или Объект присоединенного файла. -// МассивПодписей - Массив Структур данных подписей для заполнения в табличной части ЭлектронныеЦифровыеПодписи. +// МассивПодписей - Массив Структур данных подписей для заполнения в табличной части ЭлектронныеПодписи. // Процедура ЗанестиИнформациюОПодписях(Знач ПрисоединенныйФайл, Знач МассивПодписей) Экспорт @@ -729,7 +729,7 @@ Для Каждого ДанныеПодписи Из МассивПодписей Цикл - ЭлектроннаяЦифроваяПодпись.ЗанестиИнформациюОПодписи( + ЭлектроннаяПодпись.ЗанестиИнформациюОПодписи( ФайлОбъект, ДанныеПодписи.НоваяПодписьДвоичныеДанные, ДанныеПодписи.Отпечаток, @@ -978,37 +978,6 @@ КонецПроцедуры -// Переносит файлы из "Работы с файлами" в "Присоединенные файлы". -Процедура ПометитьНаУдалениеВерсииФайла(Знач ФайлСсылка, Знач ВерсияИсключение) - - ТекстЗапроса = - "ВЫБРАТЬ - | ВерсииФайлов.Ссылка КАК Ссылка - |ИЗ - | Справочник.ВерсииФайлов КАК ВерсииФайлов - |ГДЕ - | ВерсииФайлов.Владелец = &Владелец - | И НЕ ВерсииФайлов.ПометкаУдаления - | И ВерсииФайлов.Ссылка <> &Исключение"; - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.УстановитьПараметр("Владелец", ФайлСсылка); - Запрос.УстановитьПараметр("Исключение", ВерсияИсключение); - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - - ВерсияОбъект = Выборка.Ссылка.ПолучитьОбъект(); - ВерсияОбъект.ПометкаУдаления = Истина; - ВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); - ВерсияОбъект.Записать(); - - КонецЦикла; - -КонецПроцедуры - - //////////////////////////////////////////////////////////////////////////////// // УСТАРЕВШИЕ ПРОЦЕДУРЫ И ФУНКЦИИ diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl index 4daf298c3..7d30a427c 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиент/Module.bsl @@ -19,60 +19,12 @@ // Процедура ОткрытьФайл(Знач ДанныеФайла, Знач ДляРедактирования = Истина) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + Параметры.Вставить("ДляРедактирования", ДляРедактирования); - Если ПодключитьРасширениеРаботыСФайлами()Тогда - РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; - - Отказ = Ложь; - - ФайлНаДиске = Новый Файл(ПолноеИмяФайлаНаКлиенте); - - Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) // Файл уже редактируется. - И ДляРедактирования - И ФайлНаДиске.Существует() Тогда - - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - ПолучитьФайл = Ложь; - - ИначеЕсли ФайлНаДиске.Существует() Тогда - ПолучитьФайл = ДиалогНужноПолучитьФайлССервера(ПолноеИмяФайлаНаКлиенте, ДанныеФайла, ДляРедактирования, Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - Иначе - ПолучитьФайл = Истина; - КонецЕсли; - - ФайлМожноОткрывать = Истина; - - Если ПолучитьФайл Тогда - ПолноеИмяФайлаНаКлиенте = ""; - ФайлМожноОткрывать = ПолучитьФайлВРабочийКаталог( - ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, - ДанныеФайла.ОтносительныйПуть, - ДанныеФайла.ДатаМодификацииУниверсальная, - ДанныеФайла.ИмяФайла, - РабочийКаталогПользователя, - ПолноеИмяФайлаНаКлиенте); - КонецЕсли; - - Если ФайлМожноОткрывать Тогда - Если ДляРедактирования Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - Иначе - ФайлНаДиске.УстановитьТолькоЧтение(Истина); - КонецЕсли; - ОткрытьФайлПриложением(ПолноеИмяФайлаНаКлиенте, ДанныеФайла); - КонецЕсли; - Иначе - Если ДанныеФайла.ФайлРедактируется И ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьНапоминаниеПриРедактировании(); - КонецЕсли; - - ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); КонецПроцедуры @@ -93,66 +45,17 @@ // Процедура ДобавитьФайлы(Знач ВладелецФайла, Знач ИдентификаторФормы, Знач Фильтр = "") Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ВладелецФайла", ВладелецФайла); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Параметры.Вставить("Фильтр", Фильтр); - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ВыборФайла.МножественныйВыбор = Истина; - ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); - ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*"); - - Если ВыборФайла.Выбрать() Тогда - ПрисоединенныеФайлыМассив = Новый Массив; - ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьВыбранныеФайлыВХранилище( - ВыборФайла.ВыбранныеФайлы, - ВладелецФайла, - ПрисоединенныеФайлыМассив, - ИдентификаторФормы); - - Если ПрисоединенныеФайлыМассив.Количество() = 1 Тогда - ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), - ПрисоединенныйФайл, - БиблиотекаКартинок.Информация32); - - ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - КонецЕсли; - - Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда - ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); - Оповестить("Запись_ПрисоединенныйФайл", Новый Структура("ЭтоНовый", Истина), ПрисоединенныеФайлыМассив); - КонецЕсли; - - КонецЕсли; - - Иначе // Если веб-клиент без подключенного расширения. -#Если ВебКлиент Тогда - ПрисоединенныйФайл = ПрисоединенныеФайлыСлужебныйКлиент.ПоместитьВыбранныеФайлыВХранилищеВеб( - ВладелецФайла, ИдентификаторФормы); - - Если ПрисоединенныйФайл <> Неопределено Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание'"), - ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), - ПрисоединенныйФайл, - БиблиотекаКартинок.Информация32); - - ОповеститьОбИзменении(ПрисоединенныйФайл); - - ПараметрыФормы = Новый Структура("ПрисоединенныйФайл", ПрисоединенныйФайл); - ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); - КонецЕсли; -#КонецЕсли - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); КонецПроцедуры -// Сохраняет файл вместе вместе с ЭЦП. +// Сохраняет файл вместе вместе с ЭП. // Используется в обработчике команды сохранения файла. // // Параметры: @@ -160,45 +63,15 @@ // ДанныеФайла - Структура - данные файла. // ИдентификаторФормы - УникальныйИдентификатор формы. // -Процедура СохранитьВместеСЭЦП(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт +Процедура СохранитьВместеСЭП(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ПолноеИмяФайла = СохранитьФайлКак(ДанныеФайла); - - Если ПолноеИмяФайла = "" Тогда - Возврат; // Пользователь нажал Отмена или это веб клиент без расширения. - КонецЕсли; - - Настройка = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ДействияПриСохраненииСЭЦП; - - Если Настройка = "Спрашивать" Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Объект", ПрисоединенныйФайл); - ПараметрыФормы.Вставить("УникальныйИдентификатор", ИдентификаторФормы); - - МассивСтруктурПодписей = ОткрытьФормуМодально("ОбщаяФорма.ВыборПодписей", ПараметрыФормы); - - ИначеЕсли Настройка = "СохранятьВсеПодписи" Тогда - МассивСтруктурПодписей = ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьВсеПодписи(ПрисоединенныйФайл, ИдентификаторФормы); - КонецЕсли; - - Если ТипЗнч(МассивСтруктурПодписей) = Тип("Массив") И МассивСтруктурПодписей.Количество() > 0 Тогда - ЭлектроннаяЦифроваяПодписьКлиент.СохранитьПодписи( - ПрисоединенныйФайл, - ПолноеИмяФайла, - ИдентификаторФормы, - МассивСтруктурПодписей); - КонецЕсли; - - Иначе -#Если ВебКлиент Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); -#КонецЕсли - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьВместеСЭПРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); КонецПроцедуры @@ -313,7 +186,7 @@ КонецФункции // Сохраняет файл в каталог на диске. -// Так же используется, как вспомогательная функция при сохранении файла с ЭЦП. +// Так же используется, как вспомогательная функция при сохранении файла с ЭП. // // Параметры: // ДанныеФайла - Структура - данные файла. @@ -321,53 +194,15 @@ // Возвращаемое значение: // Строка - имя сохраненного файла. // -Функция СохранитьФайлКак(Знач ДанныеФайла) Экспорт +Процедура СохранитьФайлКак(Знач ДанныеФайла) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ДанныеФайла", ДанныеФайла); - Если ПодключитьРасширениеРаботыСФайлами() Тогда - - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.ПолноеИмяФайла = ДанныеФайла.ИмяФайла; - ВыборФайла.Расширение = ДанныеФайла.Расширение; - ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); - - Если НЕ ВыборФайла.Выбрать() Тогда - Возврат ""; - КонецЕсли; - - РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); - - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сохраняется файл ""%1"" (%2 Мб) - |Пожалуйста, подождите...'"), - ДанныеФайла.ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб) ); - - Состояние(ТекстПояснения); - - ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); - ПолучаемыеФайлы = Новый Массив; - ПолучаемыеФайлы.Добавить(ПолучаемыйФайл); - - ПолученныеФайлы = Новый Массив; - - Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда - Состояние(НСтр("ru = 'Файл успешно сохранен.'"), , ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - - Возврат ВыборФайла.ПолноеИмяФайла; - Иначе -#Если ВебКлиент Тогда - ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); - Возврат ДанныеФайла.ИмяФайла; -#КонецЕсли - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьФайлКакРасширениеПредложено", ПрисоединенныеФайлыСлужебныйКлиент, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); -КонецФункции +КонецПроцедуры // Открывает общую форму присоединенного файла из формы элемента // справочника присоединенных файлов. Форма элемента закрывается. @@ -454,127 +289,9 @@ КонецФункции -// Обновляет данные файла из файла, выбранного пользователем. -// Используется, как обработчик команды обновления присоединенного файла из другого файла. -// -// Параметры: -// ПрисоединенныйФайл - Ссылка на файл. -// ДанныеФайла - Структура - данные файла. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Булево - Истина, если файл успешно обновлен в хранилище. -// Ложь, если файл не обновлен в хранилище. -// -Функция ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - - ИнформацияОФайле = Новый Структура; - - Если ПрисоединенныеФайлыСлужебныйКлиент.ВыбратьФайлНаДискеИПоместитьВХранилище( - ДанныеФайла, ИнформацияОФайле, ИдентификаторФормы) Тогда - - ПрисоединенныеФайлыСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл(ПрисоединенныйФайл, ИнформацияОФайле); - Возврат Истина; - Иначе - Возврат Ложь; - КонецЕсли; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -Функция ДиалогНужноПолучитьФайлССервера(Знач ИмяФайлаСПутем, Знач ДанныеФайла, Знач ДляРедактирования, Отказ = Ложь) - - СтандартныеДанныеФайла = Новый Структура; - СтандартныеДанныеФайла.Вставить("ДатаМодификацииУниверсальная", ДанныеФайла.ДатаМодификацииУниверсальная); - СтандартныеДанныеФайла.Вставить("Размер", ДанныеФайла.Размер); - СтандартныеДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", НЕ ДляРедактирования); - СтандартныеДанныеФайла.Вставить("Редактирует", ДанныеФайла.Редактирует); - - // Выяснено, что Файл в рабочем каталоге есть. - // Проверка даты изменения и принятие решения, что делать дальше. - Действие = ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( - ИмяФайлаСПутем, СтандартныеДанныеФайла); - - Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда - УдалитьФайл(ИмяФайлаСПутем); - Возврат Истина; - - ИначеЕсли Действие = "ОткрытьСуществующий" Тогда - Возврат Ложь; - - Иначе // Действие = "Отмена". - Отказ = Истина; - Возврат Неопределено; - КонецЕсли; - -КонецФункции - -Процедура ОткрытьФайлПриложением(Знач ИмяОткрываемогоФайла, ДанныеФайла) - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если РасширениеПодключено Тогда - - ЗаголовокСтрока = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.Наименование, ДанныеФайла.Расширение); - - Если НРег(ДанныеФайла.Расширение) = НРег("grs") Тогда - - Схема = Новый ГрафическаяСхема; - Схема.Прочитать(ИмяОткрываемогоФайла); - - Схема.Показать(ЗаголовокСтрока, ИмяОткрываемогоФайла); - Возврат; - - КонецЕсли; - - Если НРег(ДанныеФайла.Расширение) = НРег("mxl") Тогда - - ДвоичныеДанные = Новый ДвоичныеДанные(ИмяОткрываемогоФайла); - Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные); - ТабличныйДокумент = ФайловыеФункцииСлужебныйВызовСервера.ТабличныйДокументИзВременногоХранилища(Адрес); - - ПараметрыОткрытия = Новый Структура; - ПараметрыОткрытия.Вставить("ИмяДокумента", ЗаголовокСтрока); - ПараметрыОткрытия.Вставить("ПутьКФайлу", ИмяОткрываемогоФайла); - ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабличныйДокумент); - - ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия); - - Возврат; - - КонецЕсли; - - // Открытие Файла. - Попытка - - ЗапуститьПриложение(ИмяОткрываемогоФайла); - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'При открытии файла - |""%1"" - |произошла ошибка: - |""%2"".'"), - ИмяОткрываемогоФайла, - ИнформацияОбОшибке.Описание)); - КонецПопытки; - КонецЕсли; - -КонецПроцедуры - -Процедура УдалитьФайл(Знач ПолноеИмяФайла) - - Файл = Новый Файл(ПолноеИмяФайла); - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолноеИмяФайла); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Устаревшие процедуры и функции diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl deleted file mode 100644 index 82aa52bbd..000000000 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/Module.bsl +++ /dev/null @@ -1,31 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Присоединенные файлы". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -//////////////////////////////////////////////////////////////////////////////// -// Обработчики подписок на события - -// См. эту процедуру в модуле ПрисоединенныеФайлы. -// Предназначена для поддержки толстого клиента (вариант клиент-сервер). -// -Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка) Экспорт - - ПрисоединенныеФайлыСлужебныйВызовСервера.ПереопределитьПолучаемуюФормуПрисоединенногоФайла( - Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка); - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl index e038b4837..86791e9c6 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебный/Module.bsl @@ -59,7 +59,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( "ПрисоединенныеФайлыСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"].Добавить( "ПрисоединенныеФайлыСлужебный"); @@ -97,6 +97,13 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( "ПрисоединенныеФайлыСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + + СерверныеОбработчики["ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса\ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса"].Добавить( + "ПрисоединенныеФайлыСлужебный"); + + КонецЕсли; + КонецПроцедуры // Размещает файлы из сформированного образа. @@ -419,7 +426,7 @@ КонецЕсли; ИмяСправочникаПрисоединенныхФайлов = КлючИЗначение.Ключ; ВсеИменаСправочников.Вставить(КлючИЗначение.Ключ, Истина); - + Запрос.Текст = "ВЫБРАТЬ | ЕСТЬNULL(КОЛИЧЕСТВО(ПрисоединенныеФайлы.Ссылка), 0) КАК КоличествоФайлов @@ -428,7 +435,7 @@ |ГДЕ | ПрисоединенныеФайлы.ТипХраненияФайла = ЗНАЧЕНИЕ(Перечисление.ТипыХраненияФайлов.ВТомахНаДиске)"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ИмяСправочника", - "Справочник." + ИмяСправочникаПрисоединенныхФайлов); + "Справочник." + ИмяСправочникаПрисоединенныхФайлов); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда @@ -540,13 +547,76 @@ Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.5.18"; + Обработчик.Версия = "2.2.1.5"; Обработчик.Процедура = "ПрисоединенныеФайлыСлужебный.ОчиститьНекорректныеЗаписиРегистраСведенийНаличиеПрисоединенныхФайлов"; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Процедуры используемые при обмене данными +// Процедуры используемые при обмене данными и выгрузке / загрузке данных + +// Возвращает массив справочников, выступающих в роли владельцев файлов. +// +// Возвращаемое значение: Массив(ОбъектМетаданных). +// +Функция СправочникиФайлов() Экспорт + + Результат = Новый Массив(); + + КоллекцииМетаданных = Новый Массив(); + КоллекцииМетаданных.Добавить(Метаданные.Справочники); + КоллекцииМетаданных.Добавить(Метаданные.Документы); + КоллекцииМетаданных.Добавить(Метаданные.БизнесПроцессы); + КоллекцииМетаданных.Добавить(Метаданные.Задачи); + КоллекцииМетаданных.Добавить(Метаданные.ПланыСчетов); + КоллекцииМетаданных.Добавить(Метаданные.ПланыОбмена); + КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); + КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета); + + Для Каждого КоллекцияМетаданных Из КоллекцииМетаданных Цикл + + Для Каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл + + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + ПустаяСсылка = МенеджерОбъекта.ПустаяСсылка(); + ИменаСправочниковХраненияФайлов = ИменаСправочниковХраненияФайлов(ПустаяСсылка, Истина); + + Для Каждого ИмяСправочникаХраненияФайлов Из ИменаСправочниковХраненияФайлов Цикл + + Результат.Добавить(Метаданные.Справочники[ИмяСправочникаХраненияФайлов.Ключ]); + + КонецЦикла; + + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Возвращает массив объектов метаданных, которые используются для хранения +// двоичных данных файлов в информационной базе. +// +// Возвращаемое значение: Массив(ОбъектМетаданных). +// +Функция ОбъектыХраненияФайловИнформационнойБазе() Экспорт + + Результат = Новый Массив(); + Результат.Добавить(Метаданные.РегистрыСведений.ПрисоединенныеФайлы); + Возврат Результат; + +КонецФункции + +// Возвращает расширение файла. +// +// Объект - СправочникОбъект. +// +Функция РасширениеФайла(Объект) Экспорт + + Возврат Объект.Расширение; + +КонецФункции // Для служебного использования. Процедура ПриОтправкеФайла(ЭлементДанных, @@ -638,6 +708,24 @@ КонецПроцедуры +// Только для внутреннего использования +// +Процедура ВыгрузитьФайл(Знач ОбъектФайла, Знач ИмяНовогоФайла) Экспорт + + Если ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ОбъектФайла.Том) + ОбъектФайла.ПутьКФайлу; + КопироватьФайл(ПолныйПуть, ИмяНовогоФайла); + + Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза + + АдресВоВременномХранилище = ПрисоединенныеФайлы.ПолучитьДанныеФайла(ОбъектФайла.Ссылка).СсылкаНаДвоичныеДанныеФайла; + ПолучитьИзВременногоХранилища(АдресВоВременномХранилище).Записать(ИмяНовогоФайла); + + КонецЕсли; + +КонецПроцедуры + // Для служебного использования. Процедура ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента) Экспорт @@ -714,6 +802,47 @@ КонецПроцедуры +// Только для внутреннего использования +// +Процедура ЗагрузитьФайл(Знач ОбъектФайла, Знач ПутьКФайлу) Экспорт + + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); + + Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + ПутьКФайлуНаТоме = ""; + СсылкаНаТом = Неопределено; + + // Добавление файла в один из томов (где есть свободное место). + ФайловыеФункцииСлужебный.ДобавитьНаДиск( + ДвоичныеДанные, + ПутьКФайлуНаТоме, + СсылкаНаТом, + ОбъектФайла.ДатаМодификацииУниверсальная, + ОбъектФайла.НомерВерсии, + ОбъектФайла.Наименование, + ОбъектФайла.Расширение, + ОбъектФайла.Размер, + ОбъектФайла.Зашифрован); + + ОбъектФайла.ПутьКФайлу = ПутьКФайлуНаТоме; + ОбъектФайла.Том = СсылкаНаТом; + ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; + + ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + + Иначе + + ОбъектФайла.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); + ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + ОбъектФайла.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ОбъектФайла.ПутьКФайлу = ""; + ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -1160,9 +1289,9 @@ КопияФайла.ТекстХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ТекстХранилище.Получить()); КопияФайла.ФайлХранилище = Новый ХранилищеЗначения(КопируемыйФайл.ФайлХранилище.Получить()); - КопияФайла.ЭлектронныеЦифровыеПодписи.Очистить(); - Для Каждого КопируемаяСтрокаТаблицы Из КопируемыйФайл.ЭлектронныеЦифровыеПодписи Цикл - КопияСтрокиТаблицы = КопияФайла.ЭлектронныеЦифровыеПодписи.Добавить(); + КопияФайла.ЭлектронныеПодписи.Очистить(); + Для Каждого КопируемаяСтрокаТаблицы Из КопируемыйФайл.ЭлектронныеПодписи Цикл + КопияСтрокиТаблицы = КопияФайла.ЭлектронныеПодписи.Добавить(); ЗаполнитьЗначенияСвойств(КопияСтрокиТаблицы, КопируемаяСтрокаТаблицы); КопияСтрокиТаблицы.Подпись = КопируемаяСтрокаТаблицы.Подпись; КопияСтрокиТаблицы.Сертификат = КопируемаяСтрокаТаблицы.Сертификат; @@ -1604,6 +1733,18 @@ КонецПроцедуры +// Заполняет перечень обработчиков интеграции подсистемы +// "ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса" +// +// Параметры: +// Обработчики - Массив(Строка), имя общего модуля обработчика, +// +Процедура ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса(Обработчики) Экспорт + + Обработчики.Добавить("ПрисоединенныеФайлыСлужебный"); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -1618,10 +1759,10 @@ // Процедура ПриОбновленииСостоянияОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); МодульФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста); КонецЕсли; diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl index e184bb486..28f6a3670 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйВызовСервера/Module.bsl @@ -78,27 +78,11 @@ // Получает все подписи файла. // -// Подробнее - см. описание ЭлектроннаяЦифроваяПодпись.ПолучитьВсеПодписи(). +// Подробнее - см. описание ЭлектроннаяПодпись.ПолучитьВсеПодписи(). // Функция ПолучитьВсеПодписи(СсылкаНаОбъект, УникальныйИдентификатор) Экспорт - Возврат ЭлектроннаяЦифроваяПодпись.ПолучитьВсеПодписи(СсылкаНаОбъект, УникальныйИдентификатор); + Возврат ЭлектроннаяПодпись.ПолучитьВсеПодписи(СсылкаНаОбъект, УникальныйИдентификатор); КонецФункции -// См. эту процедуру в модуле ПрисоединенныеФайлы. -Процедура ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка) Экспорт - - ПрисоединенныеФайлы.ПереопределитьПолучаемуюФормуПрисоединенногоФайла(Источник, - ВидФормы, - Параметры, - ВыбраннаяФорма, - ДополнительнаяИнформация, - СтандартнаяОбработка); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl index bf091eb63..3cef6e429 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПрисоединенныеФайлыСлужебныйКлиент/Module.bsl @@ -42,25 +42,42 @@ КонецПроцедуры -#Если ВебКлиент Тогда + // Помещает файл с диска в хранилище присоединенных файлов (веб-клиент). // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ПрисоединенныйФайл - Ссылка, Неопределено - ссылка на добавленный файл, либо Неопределено, если +// файл не был помещен; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ВладелецФайла - Ссылка на владельца файла. // НастройкиРаботыСФайлами - Структура. // ИдентификаторФормы - УникальныйИдентификатор формы. // -// Возвращаемое значение: -// Ссылка на файл. -// -Функция ПоместитьВыбранныеФайлыВХранилищеВеб(Знач ВладелецФайла, Знач ИдентификаторФормы) Экспорт +Процедура ПоместитьВыбранныеФайлыВХранилищеВеб(ОбработчикРезультата, Знач ВладелецФайла, Знач ИдентификаторФормы) - АдресВременногоХранилищаФайла = ""; - ИмяФайла = ""; - Если НЕ ПоместитьФайл(АдресВременногоХранилищаФайла, ИмяФайла, ИмяФайла, Истина, ИдентификаторФормы) Тогда - Возврат Неопределено; + Параметры = Новый Структура; + Параметры.Вставить("ВладелецФайла", ВладелецФайла); + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьВыбранныеФайлыВХранилищеВебЗавершение", ЭтотОбъект, Параметры); + НачатьПомещениеФайла(ОписаниеОповещения, , ,Истина, ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьВыбранныеФайлыВХранилищеВеб. +Процедура ПоместитьВыбранныеФайлыВХранилищеВебЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + Если Не Результат Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; + АдресВременногоХранилищаФайла = Адрес; + ИмяФайла = ВыбранноеИмяФайла; + ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; + СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла); Если СтрокиПути.Количество() >= 2 Тогда @@ -85,133 +102,185 @@ , АдресВременногоХранилищаФайла, ""); + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПрисоединенныйФайл); - Возврат ПрисоединенныйФайл; - -КонецФункции -#КонецЕсли +КонецПроцедуры + // Помещает отредактированные файлы в хранилище. // Используется, как обработчик команды окончания редактирования файлов. // // Параметры +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если помещение не было +// выполнено, то возвращается Неопределено; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ДанныеФайла - Структура с данными файла. -// ИнформацияОФайле - Структура (возвращаемое значение) - информация о файле. // ИдентификаторФормы - УникальныйИдентификатор формы. // -// Возвращаемое значение: -// Истина - файл успешно помещен во временное хранилище. -// -Функция ПоместитьРедактируемыйФайлНаДискеВХранилище(Знач ДанныеФайла, ИнформацияОФайле, Знач ИдентификаторФормы) Экспорт +Процедура ПоместитьРедактируемыйФайлНаДискеВХранилище(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ПодключитьРасширениеРаботыСФайлами()Тогда - + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. +Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + + Если РасширениеРаботыСФайламиПодключено Тогда РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; + ИнформацияОФайле = Неопределено; Файл = Новый Файл(ПолноеИмяФайлаНаКлиенте); - Если НЕ Файл.Существует() Тогда + Если Файл.Существует() Тогда + ИнформацияОФайле = ПрисоединенныеФайлыКлиент.ПоместитьФайлВХранилище(ПолноеИмяФайлаНаКлиенте, ИдентификаторФормы); + Иначе ОбщегоНазначенияКлиентСервер.СообщитьПользователю( НСтр("ru = 'Файл не найден в рабочем каталоге.'")); - Возврат Ложь; КонецЕсли; - Возврат ПрисоединенныеФайлыКлиент.ПоместитьФайлНаДискеВХранилище( - ДанныеФайла, ИнформацияОФайле, ПолноеИмяФайлаНаКлиенте, ИдентификаторФормы); - + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); Иначе -#Если ВебКлиент Тогда - Результат = ПоместитьФайлНаДискеВХранилищеВеб(ДанныеФайла, ИнформацияОФайле, ИдентификаторФормы); - - Если НЕ Результат Тогда - Возврат Ложь; - КонецЕсли; - - Если ДанныеФайла.ИмяФайла <> ИнформацияОФайле.ИмяФайла Тогда - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Имя выбранного файла - |""%1"" - |отличается от имени файла в хранилище - |""%2"". - | - |Продолжить?'"), - ИнформацияОФайле.ИмяФайла, - ДанныеФайла.ИмяФайла); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); - Если Ответ <> КодВозвратаДиалога.ОК Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - Возврат Результат; -#КонецЕсли + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеВыполненоПомещение", ЭтотОбъект, ДополнительныеПараметры); + ПоместитьФайлНаДискеВХранилищеВеб(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); КонецЕсли; -КонецФункции +КонецПроцедуры + +// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. +Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + Если ИнформацияОФайле = Неопределено Или ДанныеФайла.ИмяФайла = ИнформацияОФайле.ИмяФайла Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); + Возврат; + КонецЕсли; + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Имя выбранного файла + |""%1"" + |отличается от имени файла в хранилище + |""%2"". + | + |Продолжить?'"), + ИнформацияОФайле.ИмяФайла, + ДанныеФайла.ИмяФайла); + + ДополнительныеПараметры.Вставить("ИнформацияОФайле", ИнформацияОФайле); + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьРедактируемыйФайлНаДискеВХранилищеОтветПолучен", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); +КонецПроцедуры + +// Продолжение процедуры ПоместитьРедактируемыйФайлНаДискеВХранилище. +Процедура ПоместитьРедактируемыйФайлНаДискеВХранилищеОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + Результат = Неопределено; + Если РезультатВопроса = КодВозвратаДиалога.ОК Тогда + Результат = ДополнительныеПараметры.ИнформацияОФайле; + КонецЕсли; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); +КонецПроцедуры + // Выбирает файл с диска и помещает его во временное хранилище на сервере. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если помещение не было +// выполнено, то возвращается Неопределено; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ДанныеФайла - Структура с данными файла. // ИнформацияОФайле - Структура (возвращаемое значение) - информация о файле. // ИдентификаторФормы - УникальныйИдентификатор формы. // -// Возвращаемое значение: -// Истина - файл успешно выбран и помещен во временное хранилище, иначе Ложь. -// -Функция ВыбратьФайлНаДискеИПоместитьВХранилище(Знач ДанныеФайла, ИнформацияОФайле, Знач ИдентификаторФормы) Экспорт +Процедура ВыбратьФайлНаДискеИПоместитьВХранилище(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ПодключитьРасширениеРаботыСФайлами()Тогда - + ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеРасширениеПредложено", ЭтотОбъект, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ВыбратьФайлНаДискеИПоместитьВХранилище. +Процедура ВыбратьФайлНаДискеИПоместитьВХранилищеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + + Если РасширениеРаботыСФайламиПодключено Тогда ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.ПолноеИмяФайла = ДанныеФайла.Наименование + "." + ДанныеФайла.Расширение; - ВыборФайла.Расширение = ДанныеФайла.Расширение; - ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); + ВыборФайла.ПолноеИмяФайла = ДанныеФайла.Наименование + "." + ДанныеФайла.Расширение; + ВыборФайла.Расширение = ДанныеФайла.Расширение; + ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); - Если НЕ ВыборФайла.Выбрать() Тогда - Возврат Ложь; + ИнформацияОФайле = Неопределено; + Если ВыборФайла.Выбрать() Тогда + ИнформацияОФайле = ПрисоединенныеФайлыКлиент.ПоместитьФайлВХранилище(ВыборФайла.ПолноеИмяФайла, ИдентификаторФормы); КонецЕсли; - Возврат ПрисоединенныеФайлыКлиент.ПоместитьФайлНаДискеВХранилище( - ДанныеФайла, ИнформацияОФайле, ВыборФайла.ПолноеИмяФайла, ИдентификаторФормы); - + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); Иначе -#Если ВебКлиент Тогда - Возврат ПоместитьФайлНаДискеВХранилищеВеб(ДанныеФайла, ИнформацияОФайле, ИдентификаторФормы); -#КонецЕсли + ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение", ЭтотОбъект); + ПоместитьФайлНаДискеВХранилищеВеб(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); КонецЕсли; -КонецФункции +КонецПроцедуры + +// Продолжение процедуры ВыбратьФайлНаДискеИПоместитьВХранилище. +Процедура ВыбратьФайлНаДискеИПоместитьВХранилищеВыполненоПомещение(ИнформацияОФайле, ДополнительныеПараметры) Экспорт + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); + +КонецПроцедуры + -#Если ВебКлиент Тогда // Помещает файл с диска клиента во временное хранилище. // Аналог функции ПоместитьФайлНаДискеВХранилище // для веб-клиента без расширения для работы с файлами. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ИнформацияОФайле - Структура, Неопределено - информация о помещенном файле. Если помещение не было +// выполнено, то возвращается Неопределено; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ДанныеФайла - Структура с данными файла. // ИнформацияОФайле - Структура (возвращаемое значение) с информацией о файле. // ИдентификаторФормы - УникальныйИдентификатор формы. // -// Возвращаемое значение: -// Булево - Истина - файл успешно помещен в хранилище, иначе Ложь. -// -Функция ПоместитьФайлНаДискеВХранилищеВеб(Знач ДанныеФайла, ИнформацияОФайле, Знач ИдентификаторФормы) +Процедура ПоместитьФайлНаДискеВХранилищеВеб(ОбработчикРезультата, Знач ДанныеФайла, Знач ИдентификаторФормы) - АдресВременногоХранилищаФайла = ""; - ВыбранноеИмяФайла = ""; + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); - Если Не ПоместитьФайл(АдресВременногоХранилищаФайла, ДанныеФайла.ИмяФайла, ВыбранноеИмяФайла, Истина, ИдентификаторФормы) Тогда - Возврат Ложь; + ОписаниеОповещения = Новый ОписаниеОповещения("ПоместитьФайлНаДискеВХранилищеВебВыполненоПомещение", ЭтотОбъект, Параметры); + НачатьПомещениеФайла(ОписаниеОповещения, , ДанныеФайла.ИмяФайла, Истина, ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры ПоместитьФайлНаДискеВХранилищеВеб. +Процедура ПоместитьФайлНаДискеВХранилищеВебВыполненоПомещение(Результат, АдресВременногоХранилищаФайла, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + + Если Не Результат Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранноеИмяФайла); @@ -220,7 +289,6 @@ НовоеИмя = СтрокиПути[СтрокиПути.Количество()-2]; НовоеРасширение = СтрокиПути[СтрокиПути.Количество()-1]; ИмяФайла = НовоеИмя + "." + НовоеРасширение; - ИначеЕсли СтрокиПути.Количество() = 1 Тогда НовоеИмя = СтрокиПути[0]; НовоеРасширение = ""; @@ -236,10 +304,10 @@ ИнформацияОФайле.Вставить("ИмяФайла", ИмяФайла); ИнформацияОФайле.Вставить("Расширение", НовоеРасширение); - Возврат Истина; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ИнформацияОФайле); -КонецФункции -#КонецЕсли +КонецПроцедуры + // Открывает каталог с файлом (при необходимости получает файл из хранилища). // Используется, как обработчик команды открытия каталога с файлом. @@ -249,173 +317,220 @@ // Процедура ОткрытьКаталогСФайлом(Знач ДанныеФайла) Экспорт + Параметры = Новый Структура; + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайломРасширениеПредложено", ЭтотОбъект, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ОткрытьКаталогСФайлом. +Процедура ОткрытьКаталогСФайломРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт Перем ПолноеИмяФайла; - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - Если ПодключитьРасширениеРаботыСФайлами() Тогда - + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + + Если РасширениеРаботыСФайламиПодключено Тогда РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - Если ПустаяСтрока(РабочийКаталогПользователя) Тогда - Предупреждение(НСтр("ru = 'Не задан рабочий каталог'")); + ПоказатьПредупреждение(, НСтр("ru = 'Не задан рабочий каталог'")); Возврат; КонецЕсли; ПолныйПуть = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; - Файл = Новый Файл(ПолныйПуть); - - Если НЕ Файл.Существует() Тогда - Ответ = Вопрос(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Если Не Файл.Существует() Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |отсутствует в рабочем каталоге. | |Получить файл из хранилища файлов?'"), - Файл.Имя), - РежимДиалогаВопрос.ДаНет); - - Если Ответ <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - ПолноеИмяФайлаНаКлиенте = ""; - ПрисоединенныеФайлыКлиент.ПолучитьФайлВРабочийКаталог( - ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, - ДанныеФайла.ОтносительныйПуть, - ДанныеФайла.ДатаМодификацииУниверсальная, - ДанныеФайла.ИмяФайла, - РабочийКаталогПользователя, - ПолноеИмяФайлаНаКлиенте); - + Файл.Имя); + ДополнительныеПараметры.Вставить("РабочийКаталогПользователя", РабочийКаталогПользователя); + ДополнительныеПараметры.Вставить("ПолныйПуть", ПолныйПуть); + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьКаталогСФайломОтветПолучен", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); КонецЕсли; ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолныйПуть); Иначе -#Если ВебКлиент Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); -#КонецЕсли + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); КонецЕсли; КонецПроцедуры +// Продолжение процедуры ОткрытьКаталогСФайлом. +Процедура ОткрытьКаталогСФайломОтветПолучен(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + РабочийКаталогПользователя = ДополнительныеПараметры.РабочийКаталогПользователя; + ПолныйПуть = ДополнительныеПараметры.ПолныйПуть; + + ПолноеИмяФайлаНаКлиенте = ""; + ПрисоединенныеФайлыКлиент.ПолучитьФайлВРабочийКаталог( + ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, + ДанныеФайла.ОтносительныйПуть, + ДанныеФайла.ДатаМодификацииУниверсальная, + ДанныеФайла.ИмяФайла, + РабочийКаталогПользователя, + ПолноеИмяФайлаНаКлиенте); + + ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолныйПуть); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// -// ЭЦП +// ЭП // Подписывает присоединенный файл: -// - предлагает пользователю выбрать ЭЦП для подписания и получает данные подписи, -// - записывает файл с эцп в хранилище. +// - предлагает пользователю выбрать ЭП для подписания и получает данные подписи, +// - записывает файл с ЭП в хранилище. // Используется в обработчике команды "Подписать" формы списка. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ПодписьСформирована - Булево - Истина, если подпись сформирована успешно, иначе Ложь; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ПрисоединенныйФайл - Ссылка присоединенный файл. // ДанныеФайла - Структура с данными файла. // -// Возвращаемое значение: -// Булево - Истина - файл успешно подписан и сохранен в хранилище, -// Ложь - ошибки или отказ во время работы. -// -Функция СформироватьПодписьФайла(Знач ПрисоединенныйФайл, Знач ДанныеФайла) Экспорт - - ДанныеПодписи = Неопределено; - - Если ВыбратьСертификатыЭЦПИСформироватьДанныеПодписи(ПрисоединенныйФайл, ДанныеФайла, ДанныеПодписи) Тогда - - ПрисоединенныеФайлыСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи( - ПрисоединенныйФайл, ДанныеПодписи); - - Возврат Истина; +Процедура СформироватьПодписьФайла(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла) Экспорт + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + ОписаниеОповещения = Новый ОписаниеОповещения("СформироватьПодписьФайлаПодписьПолучена", ЭтотОбъект, Параметры); + ВыбратьСертификатыЭПИСформироватьДанныеПодписи(ОписаниеОповещения, ПрисоединенныйФайл, ДанныеФайла); +КонецПроцедуры + +// Продолжение процедуры СформироватьПодписьФайла. +Процедура СформироватьПодписьФайлаПодписьПолучена(ДанныеПодписи, ДополнительныеПараметры) Экспорт + ПодписьСформирована = ДанныеПодписи <> Неопределено; + Если ПодписьСформирована Тогда + ПрисоединенныеФайлыСлужебныйВызовСервера.ЗанестиИнформациюОднойПодписи(ДополнительныеПараметры.ПрисоединенныйФайл, ДанныеПодписи); КонецЕсли; - - Возврат Ложь; - -КонецФункции + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПодписьСформирована); +КонецПроцедуры + // Формирует подпись для двоичных данных файла: -// - предлагает пользователю диалог выбора сертификатов ЭЦП, +// - предлагает пользователю диалог выбора сертификатов ЭП, // - подписывает двоичные данные присоединенного файла с целью получения подписи. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// ДанныеПодписи - Структура, Неопределено - сформированная подпись, либо Неопределено, если подпись не была сформирована; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ПрисоединенныйФайл - Ссылка на файл. // ДанныеФайла - Структура с данными файла. -// ДанныеПодписи - Структура (возвращаемое значение) - сформированная подпись. // -// Возвращаемое значение: -// Булево - Истина, если данные присоединенного файла успешно подписаны, -// Ложь, если пользователь отказался от подписания или произошла ошибка. -// -Функция ВыбратьСертификатыЭЦПИСформироватьДанныеПодписи(Знач ПрисоединенныйФайл, Знач ДанныеФайла, ДанныеПодписи) Экспорт +Процедура ВыбратьСертификатыЭПИСформироватьДанныеПодписи(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла) Экспорт -#Если ВебКлиент Тогда - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(); - Возврат Ложь; + Если Не ПодключитьРасширениеРаботыСКриптографией() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(Неопределено); + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; -#КонецЕсли - МассивСтруктурСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ДополнительныеПараметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла); + ОписаниеОповещения = Новый ОписаниеОповещения("ВыбратьСертификатыЭПИСформироватьДанныеПодписиПодписьВыбрана", ЭтотОбъект, ДополнительныеПараметры); + МассивСтруктурСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов, ОбъектСсылка", МассивСтруктурСертификатов, ПрисоединенныйФайл); - СтруктураПараметровПодписи = ОткрытьФормуМодально("ОбщаяФорма.УстановкаПодписиЭЦП", ПараметрыФормы); + ОткрытьФорму("ОбщаяФорма.УстановкаПодписиЭП", ПараметрыФормы, , , , , ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ВыбратьСертификатыЭПИСформироватьДанныеПодписи. +Процедура ВыбратьСертификатыЭПИСформироватьДанныеПодписиПодписьВыбрана(СтруктураПараметровПодписи, ДополнительныеПараметры) Экспорт + + ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; Если ТипЗнч(СтруктураПараметровПодписи) <> Тип("Структура") Тогда - Возврат Ложь; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); Отказ = Ложь; - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); Если Отказ Тогда - Возврат Ложь + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; - ДанныеПодписи = ЭлектроннаяЦифроваяПодписьКлиент.СформироватьДанныеПодписи( + ДанныеПодписи = ЭлектроннаяПодписьКлиент.СформироватьДанныеПодписи( МенеджерКриптографии, ПрисоединенныйФайл, ДвоичныеДанные, СтруктураПараметровПодписи); - Возврат Истина; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ДанныеПодписи); -КонецФункции +КонецПроцедуры -// Добавляет ЭЦП из файла(ов) на диске. + +// Добавляет ЭП из файла(ов) на диске. // // Параметры: // ПрисоединенныйФайл - Ссылка на файл, которому требуется добавить подпись. // ИдентификаторФормы - УникальныйИдентификатор формы. // -Процедура ДобавитьЭЦПИзФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено) Экспорт +Процедура ДобавитьЭПИзФайла(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено) Экспорт -#Если ВебКлиент Тогда Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(); + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(Неопределено); Возврат; КонецЕсли; -#КонецЕсли - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Параметры = Новый Структура; + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ПодключитьРасширениеРаботыСФайлами() Тогда - МассивПодписей = ПолучитьМассивПодписей(ПрисоединенныйФайл, ИдентификаторФормы); - - Если МассивПодписей.Количество() > 0 Тогда - - ПрисоединенныеФайлыСлужебныйВызовСервера.ЗанестиИнформациюОПодписях( - ПрисоединенныйФайл, МассивПодписей); - - ОповеститьОДобавленииПодписиИзФайла(ПрисоединенныйФайл, МассивПодписей.Количество()); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьЭПИзФайлаРасширениеПредложено", ЭтотОбъект, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ДобавитьЭПИзФайла. +Процедура ДобавитьЭПИзФайлаРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + + Если РасширениеРаботыСФайламиПодключено Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьЭПИзФайлаПодписиПолучены", ЭтотОбъект, ПрисоединенныйФайл); + ПолучитьМассивПодписей(ОписаниеОповещения, ПрисоединенныйФайл, ИдентификаторФормы); + Возврат; Иначе -#Если ВебКлиент Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); -#КонецЕсли + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); КонецЕсли; КонецПроцедуры +// Продолжение процедуры ДобавитьЭПИзФайла. +Процедура ДобавитьЭПИзФайлаПодписиПолучены(МассивПодписей, ПрисоединенныйФайл) Экспорт + + Если МассивПодписей.Количество() > 0 Тогда + ПрисоединенныеФайлыСлужебныйВызовСервера.ЗанестиИнформациюОПодписях(ПрисоединенныйФайл, МассивПодписей); + ОповеститьОДобавленииПодписиИзФайла(ПрисоединенныйФайл, МассивПодписей.Количество()); + КонецЕсли; + +КонецПроцедуры + + // Возвращает подписи, для чего вызывает диалог добавления подписей. // // ОСОБЫЕ УСЛОВИЯ @@ -423,24 +538,38 @@ // и расширения для работы со средствами криптографии. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// Подписи - Массив - массив структур подписей; +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ПрисоединенныйФайл - Ссылка на файл. // ИдентификаторФормы - УникальныйИдентификатор формы. // -// Возвращаемое значение: -// Массив Структур подписей. -// -Функция ПолучитьМассивПодписей(Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено) Экспорт +Процедура ПолучитьМассивПодписей(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ИдентификаторФормы = Неопределено) Экспорт - МассивФайловПодписей = ОткрытьФормуМодально("ОбщаяФорма.ДобавлениеПодписиИзФайла"); + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Параметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ТипЗнч(МассивФайловПодписей) <> Тип("Массив") ИЛИ МассивФайловПодписей.Количество() = 0 Тогда - Возврат Новый Массив; + ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьМассивПодписейПодписиДобавлены", ЭтотОбъект, Параметры); + ОткрытьФорму("ОбщаяФорма.ДобавлениеПодписиИзФайла", , , , , , ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьМассивПодписей. +Процедура ПолучитьМассивПодписейПодписиДобавлены(МассивФайловПодписей, ДополнительныеПараметры) Экспорт + + Результат = Новый Массив; + Если ТипЗнч(МассивФайловПодписей) = Тип("Массив") И МассивФайловПодписей.Количество() > 0 Тогда + Результат = ЭлектроннаяПодписьКлиент.СформироватьПодписиДляЗанесениюВБазу(ДополнительныеПараметры.ПрисоединенныйФайл, + МассивФайловПодписей, ДополнительныеПараметры.ИдентификаторФормы); КонецЕсли; - Возврат ЭлектроннаяЦифроваяПодписьКлиент.СформироватьПодписиДляЗанесениюВБазу( - ПрисоединенныйФайл, МассивФайловПодписей, ИдентификаторФормы); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); -КонецФункции +КонецПроцедуры + // Служебная процедура используется для оповещения системы об изменении объекта, // а так же для отображения оповещения пользователя о добавлении подписей. @@ -483,19 +612,27 @@ // Процедура Зашифровать(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - ЗашифрованныеДанные = Неопределено; - МассивОтпечатков = Новый Массив; + Параметры = Новый Структура; + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + ОписаниеОповещения = Новый ОписаниеОповещения("ЗашифроватьДанныеПолучены", ЭтотОбъект, Параметры); + ПолучитьЗашифрованныеДанные(ОписаниеОповещения, ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы); - Если НЕ ПолучитьЗашифрованныеДанные(ПрисоединенныйФайл, - ДанныеФайла, - ИдентификаторФормы, - ЗашифрованныеДанные, - МассивОтпечатков) Тогда +КонецПроцедуры + +// Продолжение процедуры Зашифровать. +Процедура ЗашифроватьДанныеПолучены(РезультатПолучения, ДополнительныеПараметры) Экспорт + + Если РезультатПолучения = Неопределено Тогда Возврат; КонецЕсли; - ПрисоединенныеФайлыСлужебныйВызовСервера.Зашифровать(ПрисоединенныйФайл, ЗашифрованныеДанные, МассивОтпечатков); + ЗашифрованныеДанные = РезультатПолучения.ЗашифрованныеДанные; + МассивОтпечатков = РезультатПолучения.МассивОтпечатков; + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; + ПрисоединенныеФайлыСлужебныйВызовСервера.Зашифровать(ПрисоединенныйФайл, ЗашифрованныеДанные, МассивОтпечатков); ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге(ПрисоединенныйФайл, ДанныеФайла); КонецПроцедуры @@ -503,90 +640,116 @@ // Шифрует двоичные данные файла с помощью сертификатов, выбранных пользователем. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// Результат - Структура, Неопределено - если данные не были зашифрованы, то неопределено, иначе структура: +// ЗашифрованныеДанные - Структура - содержит зашифрованные данные файла (для записи). +// МассивОтпечатков - Массив - содержит отпечатки. +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ПрисоединенныйФайл - Ссылка на файл. // ДанныеФайла - Структура с данными файла. // ИдентификаторФормы - УникальныйИдентификатор формы. -// ЗашифрованныеДанные - Структура (возвращаемое значение) - содержит зашифрованные данные файла (для записи). -// МассивОтпечатков - Массив (возвращаемое значение) - содержит отпечатки. // -// Возвращаемое значение: -// Истина, если данные успешно зашифрованы, Ложь - иначе. -// -Функция ПолучитьЗашифрованныеДанные(Знач ПрисоединенныйФайл, - Знач ДанныеФайла, - Знач ИдентификаторФормы, - ЗашифрованныеДанные, - МассивОтпечатков) Экспорт +Процедура ПолучитьЗашифрованныеДанные(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт -#Если ВебКлиент Тогда Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(); - Возврат Ложь; + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(Неопределено); + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; -#КонецЕсли Если ДанныеФайла.Зашифрован Тогда - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |уже зашифрован.'"), Строка(ПрисоединенныйФайл))); - Возврат Ложь; + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; Если НЕ ДанныеФайла.Редактирует.Пустая() Тогда - Предупреждение(НСтр("ru = 'Нельзя зашифровать занятый файл.'")); - Возврат Ложь; + ПоказатьПредупреждение(, НСтр("ru = 'Нельзя зашифровать занятый файл.'")); + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; - МассивСтруктурСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь); - + МассивСтруктурСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь); ОтпечатокЛичногоСертификатаДляШифрования = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами().ОтпечатокЛичногоСертификатаДляШифрования; // Отпечаток сохраненный в ХранилищеНастроек мог устареть - сертификат могли уже удалить. Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные Если Сертификат = Неопределено Тогда ОтпечатокЛичногоСертификатаДляШифрования = ""; КонецЕсли; КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ДополнительныеПараметры.Вставить("МассивСтруктурСертификатов", МассивСтруктурСертификатов); + ДополнительныеПараметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + ДополнительныеПараметры.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ОтпечатокЛичногоСертификатаДляШифрования); + ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла); + ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); + Если ОтпечатокЛичногоСертификатаДляШифрования = Неопределено ИЛИ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - - МассивСтруктурЛичныхСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные - + МассивСтруктурЛичныхСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов", МассивСтруктурЛичныхСертификатов); - СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификата", ПараметрыФормы); - Если ТипЗнч(СтруктураВозврата) = Тип("Структура") Тогда - ОтпечатокЛичногоСертификатаДляШифрования = СтруктураВозврата.Отпечаток; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "ЭЦП", - "ОтпечатокЛичногоСертификатаДляШифрования", - ОтпечатокЛичногоСертификатаДляШифрования); - Иначе - Предупреждение(НСтр("ru = 'Не выбран персональный сертификат для шифрования.'")); - Возврат Ложь; + ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьЗашифрованныеДанныеСертификатВыбран", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("ОбщаяФорма.ПерсональныеСертификатыДляШифрования", ПараметрыФормы, , , , , ОписаниеОповещения); + Иначе + ПолучитьЗашифрованныеДанныеВыборСертификатов(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗашифрованныеДанные. +Процедура ПолучитьЗашифрованныеДанныеСертификатВыбран(ВыбранныйСертификат, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(ВыбранныйСертификат) = Тип("Структура") Тогда + ДополнительныеПараметры.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ВыбранныйСертификат.Отпечаток); + ПолучитьЗашифрованныеДанныеВыборСертификатов(ДополнительныеПараметры); + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Не выбран персональный сертификат для шифрования.'")); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗашифрованныеДанные. +Процедура ПолучитьЗашифрованныеДанныеВыборСертификатов(ДополнительныеПараметры) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивСтруктурСертификатов", ДополнительныеПараметры.МассивСтруктурСертификатов); + ПараметрыФормы.Вставить("ФайлСсылка", ДополнительныеПараметры.ПрисоединенныйФайл); + ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ДополнительныеПараметры.ОтпечатокЛичногоСертификатаДляШифрования); + + ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьЗашифрованныеДанныеСертификатыВыбраны", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы, , , , , ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьЗашифрованныеДанные. +Процедура ПолучитьЗашифрованныеДанныеСертификатыВыбраны(МассивСертификатов, ДополнительныеПараметры) Экспорт + Перем ЗашифрованныеДанные, МассивОтпечатков; + + Результат = Неопределено; + + Если ТипЗнч(МассивСертификатов) = Тип("Массив") Тогда + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + Если ВыполнитьШифрованиеПоПараметрам(МассивСертификатов, ДанныеФайла, ИдентификаторФормы, ЗашифрованныеДанные, МассивОтпечатков) Тогда + Результат = Новый Структура; + Результат.Вставить("ЗашифрованныеДанные", ЗашифрованныеДанные); + Результат.Вставить("МассивОтпечатков", МассивОтпечатков); КонецЕсли; КонецЕсли; - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурСертификатов); - ПараметрыФормы.Вставить("ФайлСсылка", ПрисоединенныйФайл); - ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ОтпечатокЛичногоСертификатаДляШифрования); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); - МассивСертификатов = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы); - - Если ТипЗнч(МассивСертификатов) = Тип("Массив") Тогда - - Возврат ВыполнитьШифрованиеПоПараметрам(МассивСертификатов, - ДанныеФайла, - ИдентификаторФормы, - ЗашифрованныеДанные, - МассивОтпечатков); - КонецЕсли; - - Возврат Ложь; - -КонецФункции +КонецПроцедуры + // Шифрует двоичные данные файла по указанному массиву сертификатов. // @@ -610,7 +773,7 @@ Для Каждого Сертификат Из МассивСертификатов Цикл Отпечаток = Base64Строка(Сертификат.Отпечаток); - Представление = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); + Представление = ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата); @@ -620,7 +783,7 @@ Состояние(НСтр("ru = 'Выполняется шифрование ...'")); Отказ = Ложь; - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); Если Отказ Тогда Возврат Ложь; КонецЕсли; @@ -638,25 +801,37 @@ КонецФункции + // Удаляет файл из рабочего каталога, оповещает об изменениях открытые формы. Процедура ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталоге(Знач ПрисоединенныйФайл, Знач ДанныеФайла) Экспорт ОповеститьОбИзменении(ПрисоединенныйФайл); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл); Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" |зашифрован.'"), ПрисоединенныйФайл) ); - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - Если ПодключитьРасширениеРаботыСФайлами()Тогда + Параметры = Новый Структура; + Параметры.Вставить("ПрисоединенныйФайл", ПрисоединенныйФайл); + Параметры.Вставить("ДанныеФайла", ДанныеФайла); + + ОписаниеОповещения = Новый ОписаниеОповещения("ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталогеРасширениеПредложено", ЭтотОбъект, Параметры); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + +КонецПроцедуры + +Процедура ОповеститьОбИзмененииИУдалитьФайлВРабочемКаталогеРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + + Если РасширениеРаботыСФайламиПодключено Тогда РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); ПолныйПутьКФайлу = РабочийКаталогПользователя + ДанныеФайла.ИмяФайла; Файл = Новый Файл(ПолныйПутьКФайлу); - Если Файл.Существует() Тогда Попытка Файл.УстановитьТолькоЧтение(Ложь); @@ -669,6 +844,7 @@ КонецПроцедуры + // Расшифровывает файл в хранилище: // - показывает пользователю диалог с предложением расшифровать файл, // - получает двоичные данные и массив отпечатков, @@ -683,44 +859,46 @@ // Процедура Расшифровать(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт - РасшифрованныеДанные = Неопределено; + ОписаниеОповещения = Новый ОписаниеОповещения("РасшифроватьДанныеПолучены", ЭтотОбъект, ПрисоединенныйФайл); + ПолучитьРасшифрованныеДанные(ОписаниеОповещения, ПрисоединенныйФайл, ДанныеФайла, ИдентификаторФормы); - Если НЕ ПолучитьРасшифрованныеДанные(ПрисоединенныйФайл, ДанныеФайла, РасшифрованныеДанные, ИдентификаторФормы) Тогда +КонецПроцедуры + +// Продолжение процедуры Расшифровать. +Процедура РасшифроватьДанныеПолучены(РасшифрованныеДанные, ПрисоединенныйФайл) Экспорт + Если РасшифрованныеДанные = Неопределено Тогда Возврат; КонецЕсли; ПрисоединенныеФайлыСлужебныйВызовСервера.Расшифровать(ПрисоединенныйФайл, РасшифрованныеДанные); - ОповеститьОРасшифровкеФайла(ПрисоединенныйФайл); - КонецПроцедуры + // Получает расшифрованные данные файла. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения - процедура, в которую необходимо передать управление при завершении. +// Параметры вызываемой процедуры: +// РасшифрованныеДанные - Структура, Неопределено - содержит расшифрованные данные, либо Неопределено, если расшифровка не была выполнена. +// ДополнительныеПараметры - Произвольный - значение, которое было указано при создании объекта оповещения. // ПрисоединенныйФайл - Ссылка на файл. // ДанныеФайла - Структура с данными файла. -// РасшифрованныеДанные - Структура (возвращаемое значение) - содержит расшифрованные данные. // ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Истина - данные успешно расшифрованы, Ложь - данные не расшифрованы. // -Функция ПолучитьРасшифрованныеДанные(Знач ПрисоединенныйФайл, Знач ДанныеФайла, РасшифрованныеДанные, Знач ИдентификаторФормы) Экспорт +Процедура ПолучитьРасшифрованныеДанные(ОбработчикРезультата, Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт -#Если ВебКлиент Тогда - Если НЕ ПодключитьРасширениеРаботыСКриптографией() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(); - Возврат Ложь; + Если Не ПодключитьРасширениеРаботыСКриптографией() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(Неопределено); + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; -#КонецЕсли ПредставленияСертификатов = ""; - МассивСертификатовШифрования = ДанныеФайла.МассивСертификатовШифрования; Для Каждого СтруктураСертификата Из МассивСертификатовШифрования Цикл Отпечаток = СтруктураСертификата.Отпечаток; - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, Истина); + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, Истина); Если Сертификат <> Неопределено Тогда Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; @@ -734,22 +912,36 @@ ПараметрыФормы.Вставить("ПредставленияСертификатов", ПредставленияСертификатов); ПараметрыФормы.Вставить("Файл", ПрисоединенныйФайл); - КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ДополнительныеПараметры.Вставить("ДанныеФайла", ДанныеФайла); + ДополнительныеПараметры.Вставить("ИдентификаторФормы", ИдентификаторФормы); - Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда - Пароль = КодВозврата; - Иначе - Возврат Ложь; + ОписаниеОповещения = Новый ОписаниеОповещения("ПолучитьРасшифрованныеДанныеПарольВведен", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы, , , , , ОписаниеОповещения); + +КонецПроцедуры + +// Продолжение процедуры ПолучитьРасшифрованныеДанные. +Процедура ПолучитьРасшифрованныеДанныеПарольВведен(Пароль, ДополнительныеПараметры) Экспорт + + Если ТипЗнч(Пароль) <> Тип("Строка") Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; Состояние(НСтр("ru = 'Выполняется расшифровка ...'")); + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + ДвоичныеДанные = ПолучитьИзВременногоХранилища(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); Отказ = Ложь; - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(Отказ); Если Отказ Тогда - Возврат Ложь; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; @@ -785,9 +977,10 @@ Состояние(НСтр("ru = 'Расшифровка завершена.'")); - Возврат Истина; + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, РасшифрованныеДанные); -КонецФункции +КонецПроцедуры + // Оповещает систему и пользователя о расшифровке файла. // @@ -797,6 +990,7 @@ Процедура ОповеститьОРасшифровкеФайла(Знач ПрисоединенныйФайл) Экспорт ОповеститьОбИзменении(ПрисоединенныйФайл); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура, ПрисоединенныйФайл); Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Файл ""%1"" @@ -926,3 +1120,383 @@ КонецЕсли; КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Продолжения асинхронных процедур + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. +Процедура ОткрытьФайлРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; + + Если РасширениеРаботыСФайламиПодключено Тогда + РабочийКаталогПользователя = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ПолноеИмяФайлаНаКлиенте = РабочийКаталогПользователя + ДанныеФайла.ОтносительныйПуть + ДанныеФайла.ИмяФайла; + ФайлНаДиске = Новый Файл(ПолноеИмяФайлаНаКлиенте); + + ДополнительныеПараметры.Вставить("ДляРедактирования", ДляРедактирования); + ДополнительныеПараметры.Вставить("РабочийКаталогПользователя", РабочийКаталогПользователя); + ДополнительныеПараметры.Вставить("ФайлНаДиске", ФайлНаДиске); + ДополнительныеПараметры.Вставить("ПолноеИмяФайлаНаКлиенте", ПолноеИмяФайлаНаКлиенте); + + Если ЗначениеЗаполнено(ДанныеФайла.Редактирует) И ДляРедактирования И ФайлНаДиске.Существует() Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + ПолучитьФайл = Ложь; + ИначеЕсли ФайлНаДиске.Существует() Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлДиалогПоказан", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьДиалогНужноПолучитьФайлССервера(ОписаниеОповещения, ПолноеИмяФайлаНаКлиенте, ДанныеФайла, ДляРедактирования); + Возврат; + Иначе + ПолучитьФайл = Истина; + КонецЕсли; + + ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры); + Иначе + Если ДанныеФайла.ФайлРедактируется И ДанныеФайла.ФайлРедактируетТекущийПользователь Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФайлНапоминаниеПоказано", ЭтотОбъект, ДополнительныеПараметры); + ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(ОписаниеОповещения); + КонецЕсли; + + ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. +Процедура ОткрытьФайлДиалогПоказан(ПолучитьФайл, ДополнительныеПараметры) Экспорт + Если ПолучитьФайл = Неопределено Тогда + Возврат; + КонецЕсли; + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ДляРедактирования = ДополнительныеПараметры.ДляРедактирования; + РабочийКаталогПользователя = ДополнительныеПараметры.РабочийКаталогПользователя; + ФайлНаДиске = ДополнительныеПараметры.ФайлНаДиске; + ПолноеИмяФайлаНаКлиенте = ДополнительныеПараметры.ПолноеИмяФайлаНаКлиенте; + + ФайлМожноОткрывать = Истина; + Если ПолучитьФайл Тогда + ПолноеИмяФайлаНаКлиенте = ""; + ФайлМожноОткрывать = ПрисоединенныеФайлыКлиент.ПолучитьФайлВРабочийКаталог( + ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, + ДанныеФайла.ОтносительныйПуть, + ДанныеФайла.ДатаМодификацииУниверсальная, + ДанныеФайла.ИмяФайла, + РабочийКаталогПользователя, + ПолноеИмяФайлаНаКлиенте); + КонецЕсли; + + Если ФайлМожноОткрывать Тогда + Если ДляРедактирования Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + Иначе + ФайлНаДиске.УстановитьТолькоЧтение(Истина); + КонецЕсли; + ОткрытьФайлПриложением(ПолноеИмяФайлаНаКлиенте, ДанныеФайла); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ОткрытьФайл. +Процедура ОткрытьФайлНапоминаниеПоказано(РезультатНапоминания, ДополнительныеПараметры) Экспорт + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); + +КонецПроцедуры + + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. +Процедура ДобавитьФайлыРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ВладелецФайла = ДополнительныеПараметры.ВладелецФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + Фильтр = ДополнительныеПараметры.Фильтр; + + Если РасширениеРаботыСФайламиПодключено Тогда + + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ВыборФайла.МножественныйВыбор = Истина; + ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); + ВыборФайла.Фильтр = ?(ЗначениеЗаполнено(Фильтр), Фильтр, НСтр("ru = 'Все файлы'") + " (*.*)|*.*"); + + Если ВыборФайла.Выбрать() Тогда + ПрисоединенныеФайлыМассив = Новый Массив; + ПоместитьВыбранныеФайлыВХранилище( + ВыборФайла.ВыбранныеФайлы, + ВладелецФайла, + ПрисоединенныеФайлыМассив, + ИдентификаторФормы); + + Если ПрисоединенныеФайлыМассив.Количество() = 1 Тогда + ПрисоединенныйФайл = ПрисоединенныеФайлыМассив[0]; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), + ПрисоединенныйФайл, + БиблиотекаКартинок.Информация32); + + ПараметрыФормы = Новый Структура("ПрисоединенныйФайл, ЭтоНовый", ПрисоединенныйФайл, Истина); + ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + КонецЕсли; + + Если ПрисоединенныеФайлыМассив.Количество() > 0 Тогда + ОповеститьОбИзменении(ПрисоединенныеФайлыМассив[0]); + Оповестить("Запись_ПрисоединенныйФайл", Новый Структура("ЭтоНовый", Истина), ПрисоединенныеФайлыМассив); + КонецЕсли; + + КонецЕсли; + + Иначе // Если веб-клиент без подключенного расширения. + ОписаниеОповещения = Новый ОписаниеОповещения("ДобавитьФайлыЗавершение", ЭтотОбъект); + ПоместитьВыбранныеФайлыВХранилищеВеб(ОписаниеОповещения, ВладелецФайла, ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.ДобавитьФайлы. +Процедура ДобавитьФайлыЗавершение(ПрисоединенныйФайл, ДополнительныеПараметры) Экспорт + + Если ПрисоединенныйФайл = Неопределено Тогда + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание'"), + ПолучитьНавигационнуюСсылку(ПрисоединенныйФайл), + ПрисоединенныйФайл, + БиблиотекаКартинок.Информация32); + + ОповеститьОбИзменении(ПрисоединенныйФайл); + + ПараметрыФормы = Новый Структура("ПрисоединенныйФайл", ПрисоединенныйФайл); + ОткрытьФорму("ОбщаяФорма.ПрисоединенныйФайл", ПараметрыФормы, , ПрисоединенныйФайл); + +КонецПроцедуры + + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП. +Процедура СохранитьВместеСЭПРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + Если РасширениеРаботыСФайламиПодключено Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьВместеСЭПИмяФайлаПолучено", ЭтотОбъект, ДополнительныеПараметры); + ДополнительныеПараметры.Вставить("ОбработчикЗавершения", ОписаниеОповещения); + СохранитьФайлКакРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры); + Иначе + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП. +Процедура СохранитьВместеСЭПИмяФайлаПолучено(ПолноеИмяФайла, ДополнительныеПараметры) Экспорт + + Если ПолноеИмяФайла = "" Тогда + Возврат; // Пользователь нажал Отмена или это веб клиент без расширения. + КонецЕсли; + + ПрисоединенныйФайл = ДополнительныеПараметры.ПрисоединенныйФайл; + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ИдентификаторФормы = ДополнительныеПараметры.ИдентификаторФормы; + + + Настройка = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().ДействияПриСохраненииСЭП; + Если Настройка = "Спрашивать" Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Объект", ПрисоединенныйФайл); + ПараметрыФормы.Вставить("УникальныйИдентификатор", ИдентификаторФормы); + + ДополнительныеПараметры.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьВместеСЭППодписиВыбраны", ЭтотОбъект, ДополнительныеПараметры); + ОткрытьФорму("ОбщаяФорма.ВыборПодписей", ПараметрыФормы, , , , , ОписаниеОповещения); + Возврат; + ИначеЕсли Настройка = "СохранятьВсеПодписи" Тогда + МассивСтруктурПодписей = ПрисоединенныеФайлыСлужебныйВызовСервера.ПолучитьВсеПодписи(ПрисоединенныйФайл, ИдентификаторФормы); + КонецЕсли; + + Если ТипЗнч(МассивСтруктурПодписей) = Тип("Массив") И МассивСтруктурПодписей.Количество() > 0 Тогда + ЭлектроннаяПодписьКлиент.СохранитьПодписи( + ПрисоединенныйФайл, + ПолноеИмяФайла, + ИдентификаторФормы, + МассивСтруктурПодписей); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьВместеСЭП. +Процедура СохранитьВместеСЭППодписиВыбраны(МассивСтруктурПодписей, ДополнительныеПараметры) Экспорт + Если ТипЗнч(МассивСтруктурПодписей) = Тип("Массив") И МассивСтруктурПодписей.Количество() > 0 Тогда + ЭлектроннаяПодписьКлиент.СохранитьПодписи( + ДополнительныеПараметры.ПрисоединенныйФайл, + ДополнительныеПараметры.ПолноеИмяФайла, + ДополнительныеПараметры.ИдентификаторФормы, + МассивСтруктурПодписей); + КонецЕсли; +КонецПроцедуры + + +// Продолжение процедуры ПрисоединенныеФайлыКлиент.СохранитьФайлКак. +Процедура СохранитьФайлКакРасширениеПредложено(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + ДанныеФайла = ДополнительныеПараметры.ДанныеФайла; + ПолноеИмяФайла = ""; + Если РасширениеРаботыСФайламиПодключено Тогда + + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ВыборФайла.МножественныйВыбор = Ложь; + ВыборФайла.ПолноеИмяФайла = ДанныеФайла.ИмяФайла; + ВыборФайла.Расширение = ДанныеФайла.Расширение; + ВыборФайла.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Все файлы (*.%1)|*.%1'"), ДанныеФайла.Расширение); + + Если НЕ ВыборФайла.Выбрать() Тогда + Возврат; + КонецЕсли; + + РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Сохраняется файл ""%1"" (%2 Мб) + |Пожалуйста, подождите...'"), + ДанныеФайла.ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб) ); + + Состояние(ТекстПояснения); + + ПолучаемыйФайл = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, ДанныеФайла.СсылкаНаДвоичныеДанныеФайла); + ПолучаемыеФайлы = Новый Массив; + ПолучаемыеФайлы.Добавить(ПолучаемыйФайл); + + ПолученныеФайлы = Новый Массив; + + Если ПолучитьФайлы(ПолучаемыеФайлы, ПолученныеФайлы, , Ложь) Тогда + Состояние(НСтр("ru = 'Файл успешно сохранен.'"), , ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; + Иначе + ПолучитьФайл(ДанныеФайла.СсылкаНаДвоичныеДанныеФайла, ДанныеФайла.ИмяФайла, Истина); + КонецЕсли; + + Если ДополнительныеПараметры.Свойство("ОбработчикЗавершения") Тогда + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикЗавершения, ПолноеИмяФайла); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +Процедура ПоказатьДиалогНужноПолучитьФайлССервера(ОбработчикРезультата, Знач ИмяФайлаСПутем, Знач ДанныеФайла, Знач ДляРедактирования) + + СтандартныеДанныеФайла = Новый Структура; + СтандартныеДанныеФайла.Вставить("ДатаМодификацииУниверсальная", ДанныеФайла.ДатаМодификацииУниверсальная); + СтандартныеДанныеФайла.Вставить("Размер", ДанныеФайла.Размер); + СтандартныеДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", НЕ ДляРедактирования); + СтандартныеДанныеФайла.Вставить("Редактирует", ДанныеФайла.Редактирует); + + // Выяснено, что Файл в рабочем каталоге есть. + // Проверка даты изменения и принятие решения, что делать дальше. + + Параметры = Новый Структура; + Параметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Параметры.Вставить("ИмяФайлаСПутем", ИмяФайлаСПутем); + ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено", ЭтотОбъект, Параметры); + ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + ОписаниеОповещения, ИмяФайлаСПутем, СтандартныеДанныеФайла); +КонецПроцедуры + +// Продолжение процедуры ПоказатьДиалогНужноПолучитьФайлССервера. +Процедура ПоказатьДиалогНужноПолучитьФайлССервераДействиеОпределено(Действие, ДополнительныеПараметры) Экспорт + ИмяФайлаСПутем = ДополнительныеПараметры.ИмяФайлаСПутем; + + Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда + Файл = Новый Файл(ИмяФайлаСПутем); + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ИмяФайлаСПутем); + Результат = Истина; + ИначеЕсли Действие = "ОткрытьСуществующий" Тогда + Результат = Ложь; + Иначе // Действие = "Отмена". + Результат = Неопределено; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); + +КонецПроцедуры + +Процедура ОткрытьФайлПриложением(Знач ИмяОткрываемогоФайла, ДанныеФайла) + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + Если РасширениеПодключено Тогда + ЗаголовокСтрока = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ДанныеФайла.Наименование, ДанныеФайла.Расширение); + + Если НРег(ДанныеФайла.Расширение) = НРег("grs") Тогда + Схема = Новый ГрафическаяСхема; + Схема.Прочитать(ИмяОткрываемогоФайла); + Схема.Показать(ЗаголовокСтрока, ИмяОткрываемогоФайла); + Возврат; + КонецЕсли; + + Если НРег(ДанныеФайла.Расширение) = НРег("mxl") Тогда + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяОткрываемогоФайла); + Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные); + ТабличныйДокумент = ФайловыеФункцииСлужебныйВызовСервера.ТабличныйДокументИзВременногоХранилища(Адрес); + + ПараметрыОткрытия = Новый Структура; + ПараметрыОткрытия.Вставить("ИмяДокумента", ЗаголовокСтрока); + ПараметрыОткрытия.Вставить("ПутьКФайлу", ИмяОткрываемогоФайла); + ПараметрыОткрытия.Вставить("ТабличныйДокумент", ТабличныйДокумент); + + ОткрытьФорму("ОбщаяФорма.РедактированиеТабличногоДокумента", ПараметрыОткрытия); + Возврат; + КонецЕсли; + + // Открытие Файла. + Попытка + ЗапуститьПриложение(ИмяОткрываемогоФайла); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'При открытии файла + |""%1"" + |произошла ошибка: + |""%2"".'"), + ИмяОткрываемогоФайла, + ИнформацияОбОшибке.Описание)); + КонецПопытки; + КонецЕсли; +КонецПроцедуры + +// Обновляет данные файла из файла, выбранного пользователем. +// Используется, как обработчик команды обновления присоединенного файла из другого файла. +// +// Параметры: +// ПрисоединенныйФайл - Ссылка на файл. +// ДанныеФайла - Структура - данные файла. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// +Процедура ОбновитьПрисоединенныйФайл(Знач ПрисоединенныйФайл, Знач ДанныеФайла, Знач ИдентификаторФормы) Экспорт + + ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьПрисоединенныйФайлПомещениеВыполнено", ЭтотОбъект, ПрисоединенныйФайл); + ВыбратьФайлНаДискеИПоместитьВХранилище(ОписаниеОповещения, ДанныеФайла, ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры ОбновитьПрисоединенныйФайл. +Процедура ОбновитьПрисоединенныйФайлПомещениеВыполнено(ИнформацияОФайле, ПрисоединенныйФайл) Экспорт + + Если ИнформацияОФайле = Неопределено Тогда + Возврат; + КонецЕсли; + + ПрисоединенныеФайлыСлужебныйВызовСервера.ОбновитьПрисоединенныйФайл(ПрисоединенныйФайл, ИнформацияОФайле); + ОповеститьОбИзменении(ПрисоединенныйФайл); + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/Module.bsl b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/Module.bsl deleted file mode 100644 index 9a252afed..000000000 --- a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/Module.bsl +++ /dev/null @@ -1,15 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Проверка легальности получения обновления". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Выполняет обработчик проверки легальности получения обновления. -// -Процедура ОбработчикПроверкиЛегальностиПолученияОбновленияВ83() Экспорт - - ПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновленияВ83(); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/ПроверкаЛегальностиПолученияОбновленияГлобальный.mdo b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/ПроверкаЛегальностиПолученияОбновленияГлобальный.mdo deleted file mode 100644 index 150dce4f0..000000000 --- a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияГлобальный/ПроверкаЛегальностиПолученияОбновленияГлобальный.mdo +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a2b2f025-3108-4f13-9440-8909b5e685f5"> - <name>ПроверкаЛегальностиПолученияОбновленияГлобальный</name> - <synonym> - <key>ru</key> - <value>Проверка легальности получения обновления глобальный</value> - </synonym> - <global>true</global> - <clientManagedApplication>true</clientManagedApplication> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl index a1a60944d..c61df9c1d 100644 --- a/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl +++ b/SSL/src/CommonModules/ПроверкаЛегальностиПолученияОбновленияКлиент/Module.bsl @@ -6,6 +6,8 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС +// ИспользованиеМодальности + // Запрашивает у пользователя диалог с подтверждением легальности полученного // обновления и завершает работу системы, если обновление получено не легально // (см. параметр ЗавершатьРаботуСистемы). @@ -13,15 +15,12 @@ // Параметры: // ЗавершатьРаботуСистемы - Булево - завершать работу системы, если пользователь // указал что обновление получено не легально. -// ОткрыватьСЗадержкой - Булево - если Истина, то окно проверки легальности откроется -// с задержкой в 2 секунды. Необходимо для проверки -// легальности при запуске программы. // // Возвращаемое значение: // Булево - Истина, если проверка завершилась успешно (пользователь // подтвердил, что обновление получено легально). // -Функция ПроверитьЛегальностьПолученияОбновления(ЗавершатьРаботуСистемы = Ложь, ОткрыватьСЗадержкой = Ложь) Экспорт +Функция ПроверитьЛегальностьПолученияОбновления(ЗавершатьРаботуСистемы = Ложь) Экспорт Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда Возврат Истина; @@ -29,54 +28,83 @@ ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ПоказыватьПредупреждениеОПерезапуске", ЗавершатьРаботуСистемы); - ПараметрыФормы.Вставить("ПринудительныйЗапуск", Истина); + ПараметрыФормы.Вставить("ПрограммноеОткрытие", Истина); - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - - Если ОткрыватьСЗадержкой Тогда - ПараметрыРаботыКлиентаПриОбновлении.Вставить("ПараметрыЛегальностиПолученияОбновлений", ПараметрыФормы); - ПодключитьОбработчикОжидания("ОбработчикПроверкиЛегальностиПолученияОбновленияВ83", 2, Истина); - Иначе - ОткрытьФорму("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы); - КонецЕсли; - - Иначе - Результат = ОткрытьФормуМодально("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы); - Возврат (Результат = Истина); - КонецЕсли; + Возврат ОткрытьФормуМодально("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы); КонецФункции +// Конец ИспользованиеМодальности + +// Запрашивает у пользователя диалог с подтверждением легальности полученного +// обновления и завершает работу системы, если обновление получено не легально +// (см. параметр ЗавершатьРаботуСистемы). +// +// Параметры: +// ЗавершатьРаботуСистемы - Булево - завершать работу системы, если пользователь +// указал что обновление получено не легально. +// +// Возвращаемое значение: +// Булево - Истина, если проверка завершилась успешно (пользователь +// подтвердил, что обновление получено легально). +// +Процедура ПоказатьПроверкуЛегальностиПолученияОбновления(Оповещение, ЗавершатьРаботуСистемы = Ложь) Экспорт + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПоказыватьПредупреждениеОПерезапуске", ЗавершатьРаботуСистемы); + ПараметрыФормы.Вставить("ПрограммноеОткрытие", Истина); + + ОткрытьФорму("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы,,,,, Оповещение); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Проверить легальность получения обновления при запуске программы. // Должна вызываться перед обновлением информационной базы. // -Функция ПроверитьЛегальностьПолученияОбновленияПриЗапуске() Экспорт +Процедура ПроверитьЛегальностьПолученияОбновленияПриЗапуске(Параметры) Экспорт ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыКлиента.РазделениеВключено Тогда - Возврат Истина; + + Если Не ПараметрыКлиента.Свойство("ПроверитьЛегальностьПолученияОбновления") Тогда + Возврат; КонецЕсли; - Если ПараметрыКлиента.ПроверитьЛегальностьПолученияОбновления = Ложь - Или Не ПараметрыКлиента.ЭтоГлавныйУзел Тогда - Возврат Истина; - КонецЕсли; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПроверкиЛегальностиПолученияОбновления", ЭтотОбъект); - Возврат ПроверитьЛегальностьПолученияОбновления(Истина, Истина); +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПроверитьЛегальностьПолученияОбновленияПриЗапуске. +Процедура ИнтерактивнаяОбработкаПроверкиЛегальностиПолученияОбновления(Параметры, Неопределен) Экспорт -КонецФункции + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПрограммноеОткрытие", Истина); + ПараметрыФормы.Вставить("ПоказыватьПредупреждениеОПерезапуске", Истина); + ПараметрыФормы.Вставить("ПропуститьПерезапуск", Истина); + + ОткрытьФорму("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы, , , , , + Новый ОписаниеОповещения("ПослеЗакрытияФормыПроверкиЛегальностиПолученияОбновленияПриЗапуске", + ЭтотОбъект, Параметры)); + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Только для внутреннего использования. -// -Процедура ПроверитьЛегальностьПолученияОбновленияВ83() Экспорт +// Только для внутреннего использования. Продолжение процедуры ПроверитьЛегальностьПолученияОбновленияПриЗапуске. +Процедура ПослеЗакрытияФормыПроверкиЛегальностиПолученияОбновленияПриЗапуске(Результат, Параметры) Экспорт - ПараметрыФормы = ПараметрыРаботыКлиентаПриОбновлении.ПараметрыЛегальностиПолученияОбновлений; - ОткрытьФорму("Обработка.ЛегальностьПолученияОбновлений.Форма", ПараметрыФормы); + Если Результат <> Истина Тогда + Параметры.Отказ = Истина; + КонецЕсли; -КонецПроцедуры \ No newline at end of file + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl index 4afbc126d..cacd89c94 100644 --- a/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/РаботаВМоделиСервиса/Module.bsl @@ -85,24 +85,59 @@ КонецПопытки; КонецЦикла; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() И НЕ РазделяемаяБлокировка Тогда + Если ПроверитьОтсутствиеДругихСеансов Тогда - АдминистрированиеОбласти = ПравоДоступа("АдминистрированиеДанных", Метаданные); + КонфликтующиеСеансы = Новый Массив(); - Если АдминистрированиеОбласти Тогда - УстановитьПривилегированныйРежим(Истина); + Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл + Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда + Продолжить; + КонецЕсли; + + КлиентскиеПриложения = Новый Массив; + КлиентскиеПриложения.Добавить(ВРег("1CV8")); + КлиентскиеПриложения.Добавить(ВРег("1CV8C")); + КлиентскиеПриложения.Добавить(ВРег("WebClient")); + КлиентскиеПриложения.Добавить(ВРег("COMConnection")); + КлиентскиеПриложения.Добавить(ВРег("WSConnection")); + КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); + Если КлиентскиеПриложения.Найти(ВРег(Сеанс.ИмяПриложения)) = Неопределено Тогда + Продолжить; + КонецЕсли; + + КонфликтующиеСеансы.Добавить(Сеанс); + + КонецЦикла; + + Если КонфликтующиеСеансы.Количество() > 0 Тогда + + ТекстСеансы = ""; + Для Каждого КонфликтующийСеанс Из КонфликтующиеСеансы Цикл + + Если Не ПустаяСтрока(ТекстСеансы) Тогда + ТекстСеансы = ТекстСеансы + ", "; + КонецЕсли; + + ТекстСеансы = ТекстСеансы + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 (сеанс - %2)'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + КонфликтующийСеанс.Пользователь.Имя, + Формат(КонфликтующийСеанс.НомерСеанса, "ЧГ=0")); + + КонецЦикла; + + ТекстИсключения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Операция не может быть выполнена, т.к. в приложении работают другие пользователи: %1'", + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ТекстСеансы); + ВызватьИсключение ТекстИсключения; + КонецЕсли; + КонецЕсли; + + Если НЕ РазделяемаяБлокировка Тогда УстановитьМонопольныйРежим(Истина); - - Если АдминистрированиеОбласти Тогда - УстановитьПривилегированныйРежим(Ложь); - КонецЕсли; - Возврат; - - Иначе - НачатьТранзакцию(); КонецЕсли; МодельДанных = РаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); @@ -115,19 +150,9 @@ Блокировка = Новый БлокировкаДанных; - ИсключенияБлокировки = Новый Массив(); - Если Не РазделяемаяБлокировка Тогда - ИсключенияБлокировки.Добавить(Метаданные.РегистрыСведений.БлокировкиСеансовОбластейДанных.ПолноеИмя()); - КонецЕсли; - Для Каждого ЭлементМодели Из МодельДанных Цикл ПолноеИмяОбъектаМетаданных = ЭлементМодели.Ключ; - - Если ИсключенияБлокировки.Найти(ПолноеИмяОбъектаМетаданных) <> Неопределено Тогда - Продолжить; - КонецЕсли; - ОписаниеОбъектаМетаданных = ЭлементМодели.Значение; ПространствоБлокировки = ПолноеИмяОбъектаМетаданных; @@ -166,28 +191,6 @@ Блокировка.Заблокировать(); - Если ПроверитьОтсутствиеДругихСеансов Тогда - Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл - Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда - Продолжить; - КонецЕсли; - - КлиентскиеПриложения = Новый Массив; - КлиентскиеПриложения.Добавить(ВРег("1CV8")); - КлиентскиеПриложения.Добавить(ВРег("1CV8C")); - КлиентскиеПриложения.Добавить(ВРег("WebClient")); - КлиентскиеПриложения.Добавить(ВРег("COMConnection")); - КлиентскиеПриложения.Добавить(ВРег("WSConnection")); - КлиентскиеПриложения.Добавить(ВРег("BackgroundJob")); - Если КлиентскиеПриложения.Найти(ВРег(Сеанс.ИмяПриложения)) = Неопределено Тогда - Продолжить; - КонецЕсли; - - // Есть другие пользователи - ВызватьИсключение(НСтр("ru = 'Ошибка разделенного доступа к базе данных'")); - КонецЦикла; - КонецЕсли; - КонецПроцедуры // Снимает исключительную блокировку области с текущей области данных @@ -197,28 +200,10 @@ Ключ = СоздатьКлючЗаписиРегистраСведенийВспомогательныхДанных( РегистрыСведений.ОбластиДанных, Новый Структура(РазделительВспомогательныхДанных(), ОбщегоНазначения.ЗначениеРазделителяСеанса())); - + РазблокироватьДанныеДляРедактирования(Ключ); - Если ТранзакцияАктивна() Тогда - - Попытка - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - КонецПопытки; - - КонецЕсли; - - Если УстановленМонопольныйРежим() Тогда - - Если ПравоДоступа("АдминистрированиеДанных", Метаданные) Тогда - УстановитьПривилегированныйРежим(Истина); - КонецЕсли; - - УстановитьМонопольныйРежим(Ложь); - - КонецЕсли; + УстановитьМонопольныйРежим(Ложь); КонецПроцедуры @@ -320,15 +305,19 @@ ИмяФайлаВыгрузки = Неопределено; + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда + + ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных"); + + КонецЕсли; + + МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных"); + НачатьТранзакцию(); + Попытка - - ЗаблокироватьТекущуюОбластьДанных(, Истина); - ИмяФайлаВыгрузки = ВыгрузкаЗагрузкаДанных.ВыгрузитьТекущуюОбластьВАрхив(); - ЗафиксироватьТранзакцию(); - + ИмяФайлаВыгрузки = МодульВыгрузкаЗагрузкаОбластейДанных.ВыгрузитьТекущуюОбластьДанныхВАрхив(); Исключение - ОтменитьТранзакцию(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Если ИмяФайлаВыгрузки <> Неопределено Тогда @@ -343,11 +332,8 @@ ОбщегоНазначения.УстановитьРазделениеСеанса(, ОбластьПриемник); Попытка - ОбщегоНазначения.ЗаблокироватьИБ(); - ВыгрузкаЗагрузкаДанных.ЗагрузитьТекущуюОбластьИзАрхива(ИмяФайлаВыгрузки); - ОбщегоНазначения.РазблокироватьИБ(); + МодульВыгрузкаЗагрузкаОбластейДанных.ЗагрузитьТекущуюОбластьДанныхИзАрхива(ИмяФайлаВыгрузки); Исключение - ОбщегоНазначения.РазблокироватьИБ(); ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Попытка @@ -1012,24 +998,60 @@ // подробное представление ошибки в журнал регистрации и вызывает // исключение с текстом краткого представления об ошибке. // -Процедура ОбработатьИнформациюОбОшибкеWebСервиса(Знач ИнформацияОбОшибке) Экспорт +Процедура ОбработатьИнформациюОбОшибкеWebСервиса(Знач ИнформацияОбОшибке, Знач ИмяПодсистемы = "", Знач ИмяВебСервиса = "", Знач ИмяОперации = "") Экспорт Если ИнформацияОбОшибке = Неопределено Тогда Возврат; КонецЕсли; + Если ПустаяСтрока(ИмяПодсистемы) Тогда + ИмяПодсистемы = Метаданные.Подсистемы.СтандартныеПодсистемы.Подсистемы.РаботаВМоделиСервиса.Имя; + КонецЕсли; + + ИмяСобытия = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1.Ошибка вызова операции web-сервиса'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ИмяПодсистемы); + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при вызове операции %1 веб-сервиса %2: %3'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ИмяОперации, + ИмяВебСервиса, + ИнформацияОбОшибке.DetailErrorDescription); + ЗаписьЖурналаРегистрации( - НСтр("ru = 'Резервное копирование приложений.Ошибка вызова операции web-сервиса'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ИмяСобытия, УровеньЖурналаРегистрации.Ошибка, , , - ИнформацияОбОшибке.DetailErrorDescription); + ТекстОшибки); ВызватьИсключение ИнформацияОбОшибке.BriefErrorDescription; КонецПроцедуры +// Возвращает псевдоним пользователя, который должен использоваться в интерфейсе. +// +// Параметры: +// ИдентификаторПользователя - УникальныйИдентификатор. +// +// Возвращаемое значение: Строка, псевдоним пользователя информационной базы +// для отображения в интерфейсе. +// +Функция ПсевдонимПользователяИнформационнойБазы(Знач ИдентификаторПользователя) Экспорт + + Псевдоним = ""; + + ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( + "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииПсевдонимаПользователя"); + + Для каждого Обработчик Из ОбработчикиСобытия Цикл + Обработчик.Модуль.ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним); + КонецЦикла; + + Возврат Псевдоним; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Работа с файлами @@ -1090,6 +1112,60 @@ /////////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Проверяет возможность использования конфигурации в модели сервиса. +// При невозможности использования - генерируется исключение с указанием причины, +// из-за которой использование конфигурации в модели сервиса невозможно. +// +Процедура ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса() Экспорт + + ОписанияПодсистем = СтандартныеПодсистемыПовтИсп.ОписанияПодсистем().ПоИменам; + ОписаниеБТС = ОписанияПодсистем.Получить("БиблиотекаТехнологииСервиса"); + + Если ОписаниеБТС = Неопределено Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В конфигурацию не внедрена библиотека ""1С:Библиотека технологии сервиса"". + |Без внедрения этой библиотеки конфигурация не может использоваться в модели сервиса. + | + |Для использования этой конфигурации в модели сервиса требуется внедрить библиотеку + |""1С:Библиотека технологии сервиса"" версии не младше %1!'", Метаданные.ОсновнойЯзык.КодЯзыка), + ТребуемаяВерсияБТС()); + + Иначе + + ВерсияБТС = ОписаниеБТС.Версия; + + Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(ВерсияБТС, ТребуемаяВерсияБТС()) < 0 Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Для использования конфигурации в модели сервиса с текущей версией БСП требуется + |обновить используемую версию библиотеки ""1С:Библиотека технологии сервиса""! + | + |Используемая версия: %1, требуется версия не младше %2!'", Метаданные.ОсновнойЯзык.КодЯзыка), + ВерсияБТС, ТребуемаяВерсияБТС()); + + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Вызывает исключение при отсутствии требуемой подсистемы из библиотеки технологии сервиса. +// +// Параметры: +// ИмяПодсистемы - Строка. +// +Процедура ВызватьИсключениеОтсутствуетПодсистемаБТС(Знач ИмяПодсистемы) Экспорт + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Невозможно выполнить операцию по причине - в конфигурации не внедрена подсистема ""%1"". + |Данная подсистема поставляется в состав библиотеки технологии сервиса, которая должна отдельно внедряться в состав конфигурации. + |Проверьте наличие и корректность внедрения подсистемы ""%1"".'"), + ИмяПодсистемы + ); + +КонецПроцедуры + // Объявляет события подсистемы РаботаВМоделиСервиса: // // Серверные события: @@ -1183,14 +1259,17 @@ СерверныеСобытия.Добавить( "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриУстановкеПравПоУмолчанию"); - // Вызывается после окончания загрузки данных из локальной версии - // в область данных сервиса или наоборот. + // Вызывается при определении псевдонима пользователя для отображения в интерфейсе. + // + // Параметры: + // ИдентификаторПользователя - УникальныйИдентификатор, + // Псевдоним - Строка, псевдоним пользователя. // // Синтаксис: - // Процедура ПослеЗагрузкиДанныхИзДругойМодели() Экспорт + // Процедура ПриОпределенииПсевдонимаПользователя(ИдентификаторПользователя, Псевдоним) Экспорт // СерверныеСобытия.Добавить( - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПослеЗагрузкиДанныхИзДругойМодели"); + "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриОпределенииПсевдонимаПользователя"); КонецПроцедуры @@ -1199,13 +1278,13 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные\ПриОпределенииОбработчиковПоставляемыхДанных"].Добавить( "РаботаВМоделиСервиса"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "РаботаВМоделиСервиса"); @@ -1221,7 +1300,7 @@ СерверныеОбработчики[ "СтандартныеПодсистемы.БазоваяФункциональность\ПриВключенииРазделенияПоОбластямДанных"].Добавить( - "РаботаВМоделиСервисаПереопределяемый"); + "РаботаВМоделиСервиса"); СерверныеОбработчики[ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске"].Добавить( @@ -1231,9 +1310,11 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "РаботаВМоделиСервиса"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "РаботаВМоделиСервиса"); + КонецЕсли; КонецПроцедуры @@ -1331,14 +1412,17 @@ // Проверка заблокированности области данных при запуске. // Только для вызова из СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(). // -Процедура ПриПроверкеБлокировкиОбластиДанныхПриЗапуске() Экспорт +Процедура ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки) Экспорт Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() И ОбластьДанныхЗаблокирована(ОбщегоНазначения.ЗначениеРазделителяСеанса()) Тогда - ВызватьИсключение НСтр("ru = 'Запуск приложения временно недоступен (выполняются регламентные операции по обслуживанию приложения). - |Попробуйте запустить приложение через несколько минут.'"); + ОписаниеОшибки = + НСтр("ru = 'Запуск приложения временно недоступен. + |Выполняются регламентные операции по обслуживанию приложения. + | + |Попробуйте запустить приложение через несколько минут.'"); КонецЕсли; @@ -1827,10 +1911,10 @@ Если ТипПлатформыСервера = ТипПлатформы.Linux_x86 ИЛИ ТипПлатформыСервера = ТипПлатформы.Linux_x86_64 Тогда - ОбщийВременныйКаталог = Константы.ОбщийКаталогВременныхФайловLinux.Получить(); + ОбщийВременныйКаталог = Константы.КаталогОбменаФайламиВМоделиСервисаLinux.Получить(); РазделительПути = "/"; Иначе - ОбщийВременныйКаталог = Константы.ОбщийКаталогВременныхФайлов.Получить(); + ОбщийВременныйКаталог = Константы.КаталогОбменаФайламиВМоделиСервиса.Получить(); РазделительПути = "\"; КонецЕсли; @@ -2011,10 +2095,20 @@ Возврат "ФатальнаяОшибка"; КонецЕсли; - Результат = "Успех"; - Если Не ВыгрузкаЗагрузкаДанных.ПодготовитьТекущуюОбластьИзАрхива(ИмяФайлаВыгрузки) Тогда + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда + ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных"); + + КонецЕсли; + + МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных"); + + Если Не МодульВыгрузкаЗагрузкаОбластейДанных.ВыгрузкаВАрхивеСовместимаСТекущейКонфигурацией(ИмяФайлаВыгрузки) Тогда Результат = "ТребуетсяКонвертация"; + Иначе + + МодульВыгрузкаЗагрузкаОбластейДанных.ЗагрузитьТекущуюОбластьДанныхИзАрхива(ИмяФайлаВыгрузки); + Результат = "Успех"; КонецЕсли; @@ -2047,6 +2141,15 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП +// Вызывается при включении разделения данных по областям данных. +// +Процедура ПриВключенииРазделенияПоОбластямДанных() Экспорт + + ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса(); + РаботаВМоделиСервисаПереопределяемый.ПриВключенииРазделенияПоОбластямДанных(); + +КонецПроцедуры + // Зарегистрировать обработчики поставляемых данных // // При получении уведомления о доступности новых общих данных, вызывается процедуры @@ -2112,6 +2215,18 @@ Обработчик.Приоритет = 99; Обработчик.МонопольныйРежим = Ложь; + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "РаботаВМоделиСервиса.ПроверитьВозможностьИспользованияКонфигурацииВМоделиСервиса"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 99; + Обработчик.МонопольныйРежим = Ложь; + + КонецЕсли; + КонецПроцедуры // Заполняет структуру параметров, необходимых для работы клиентского кода @@ -2138,15 +2253,15 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.Константы.КлючОбластиДанных); - Объекты.Добавить(Метаданные.РегистрыСведений.ОбластиДанных); + Типы.Добавить(Метаданные.Константы.КлючОбластиДанных); + Типы.Добавить(Метаданные.РегистрыСведений.ОбластиДанных); КонецПроцедуры @@ -3341,12 +3456,22 @@ УстановитьПривилегированныйРежим(Истина); + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда + + ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных"); + + КонецЕсли; + + МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных"); + Попытка - ОбщегоНазначения.ЗаблокироватьИБ(); - ВыгрузкаЗагрузкаДанных.ЗагрузитьТекущуюОбластьИзАрхива(ИмяФайлаВыгрузки); - ОбщегоНазначения.РазблокироватьИБ(); + + ЗагружатьПользователейИБ = Ложь; + СвернутьПользователей = (Не Константы.РежимИспользованияИнформационнойБазы.Получить() = Перечисления.РежимыИспользованияИнформационнойБазы.Демонстрационный); + МодульВыгрузкаЗагрузкаОбластейДанных.ЗагрузитьТекущуюОбластьДанныхИзАрхива(ИмяФайлаВыгрузки, ЗагружатьПользователейИБ, СвернутьПользователей); + Исключение - ОбщегоНазначения.РазблокироватьИБ(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Копирование области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Попытка @@ -3413,7 +3538,7 @@ ПроверяетсяСсылка = Ложь; КонецЕсли; - Если Не МонопольныйРежим() И ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПроверяемоеЗначение.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда + Если ОбщегоНазначения.ЭтоРазделенныйОбъектМетаданных(ПроверяемоеЗначение.Метаданные(), ОбщегоНазначенияПовтИсп.РазделительВспомогательныхДанных()) Тогда Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда @@ -3694,7 +3819,6 @@ Исключения.Добавить(Метаданные.РегистрыСведений.КэшПрограммныхИнтерфейсов); Исключения.Добавить(Метаданные.Константы.БлокировкаОтправкиБыстрыхСообщений); - Исключения.Добавить(Метаданные.РегистрыСведений.НеразделенныеПользователи); // СтандартныеПодсистемы.ОбменДанными Исключения.Добавить(Метаданные.РегистрыСведений.НастройкиТранспортаОбмена); @@ -3702,7 +3826,7 @@ Исключения.Добавить(Метаданные.РегистрыСведений.СостоянияУспешныхОбменовДанными); // Конец СтандартныеПодсистемы.ОбменДанными - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда Исключения.Добавить(Метаданные.РегистрыСведений.Найти("ЗамерыВремени")); КонецЕсли; @@ -3917,20 +4041,13 @@ КонецПроцедуры -// Прочее - -// Обертка над функцией МонопольныйРежим() глобального контекста. При вызове пользователем с правом -// на конфигурацию АдминистрированиеДанных, но без права МонопольныйРежим() возвращает результат -// функции МонопольныйРежим(), полученный в привилегированном режиме. +// Возвращает минимальную версию библиотеки "1С:Библиотека технологии сервиса", совместно с которой +// возможно использование текущей версии БСП. // -// Возвращаемое значение: Булево. +// Возвращаемое значение: Строка, минимальная поддерживаемая версия БТС в формате РР.{П|ПП}.ЗЗ.СС. // -Функция УстановленМонопольныйРежим() Экспорт +Функция ТребуемаяВерсияБТС() - Если ПравоДоступа("АдминистрированиеДанных", Метаданные) Тогда - УстановитьПривилегированныйРежим(Истина); - КонецЕсли; - - Возврат МонопольныйРежим(); + Возврат "1.0.2.1"; КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl new file mode 100644 index 000000000..b08e43d25 --- /dev/null +++ b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/Module.bsl @@ -0,0 +1,28 @@ +/////////////////////////////////////////////////////////////////////////////////// +// РаботаВМоделиСервисаКлиент. +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий подсистем БСП + +// Вызывается перед интерактивным началом работы пользователя с областью данных. +// Соответствует событию ПередНачаломРаботыСистемы модулей приложения. +// +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если ПараметрыКлиента.Свойство("ОбластьДанныхЗаблокирована") Тогда + Параметры.Отказ = Истина; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ПоказатьПредупреждениеИПродолжить", + СтандартныеПодсистемыКлиент.ЭтотОбъект, + ПараметрыКлиента.ОбластьДанныхЗаблокирована); + Возврат; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/ПолнотекстовыйПоискКлиент.mdo b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/РаботаВМоделиСервисаКлиент.mdo similarity index 59% rename from SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/ПолнотекстовыйПоискКлиент.mdo rename to SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/РаботаВМоделиСервисаКлиент.mdo index 631bd25a7..739b587f3 100644 --- a/SSL/src/CommonModules/ПолнотекстовыйПоискКлиент/ПолнотекстовыйПоискКлиент.mdo +++ b/SSL/src/CommonModules/РаботаВМоделиСервисаКлиент/РаботаВМоделиСервисаКлиент.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="832fe1ae-ba81-44b2-9474-a29f36c3b863"> - <name>ПолнотекстовыйПоискКлиент</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0a0af8bf-0caa-40df-9a69-71f98ca9ff89"> + <name>РаботаВМоделиСервисаКлиент</name> <synonym> <key>ru</key> - <value>Полнотекстовый поиск клиент</value> + <value>Работа в модели сервиса клиент</value> </synonym> <clientManagedApplication>true</clientManagedApplication> <clientOrdinaryApplication>true</clientOrdinaryApplication> diff --git a/SSL/src/CommonModules/РаботаСБанками/Module.bsl b/SSL/src/CommonModules/РаботаСБанками/Module.bsl index eeb79115b..2031d5329 100644 --- a/SSL/src/CommonModules/РаботаСБанками/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанками/Module.bsl @@ -1,8 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// // Подсистема "Банки". -// Процедуры и функции получения, сортировки данных классификатора -// банков РФ, запись полученных данных в справочник КлассификаторБанковРФ, -// обработка данных справочника КлассификаторБанковРФ. // //////////////////////////////////////////////////////////////////////////////// @@ -44,7 +41,7 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( + КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( "РаботаСБанкамиКлиент"); // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. @@ -52,13 +49,13 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( "РаботаСБанками"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( "РаботаСБанками"); КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихДанных"].Добавить( + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики["ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"].Добавить( "РаботаСБанками"); КонецЕсли; @@ -86,10 +83,10 @@ // Добавляет в таблицу информацию о регламентных заданиях подсистемы для модели сервиса. // // Параметры: -// ТаблицаИспользования (ТаблицаЗначений) Таблица регламентных заданий. -// |- РегламентноеЗадание (Строка) Имя предопределенного регламентного задания. -// |- Использование (Булево) Истина, если регламентное задание должно -// выполняться в модели сервиса. +// ТаблицаИспользования - ТаблицаЗначений - Таблица регламентных заданий. +// * РегламентноеЗадание - Строка - Имя предопределенного регламентного задания. +// * Использование - Булево - Истина, если регламентное задание должно +// выполняться в модели сервиса. // Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт @@ -99,15 +96,15 @@ КонецПроцедуры -// Заполняет массив типов неразделенных данных. Он используется при обновлении ссылок -// при загрузке-выгрузке конфигурации -// -// Параметры: -// МассивТипов - массив +// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок +// при загрузке данных в другую информационную базу. // -Процедура ПриОпределенииСтандартныхТиповОбщихДанных(Знач МассивТипов) Экспорт +// Параметры: +// Типы - Массив(ОбъектМетаданных) +// +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - МассивТипов.Добавить(Тип("СправочникСсылка.КлассификаторБанковРФ")); + Типы.Добавить(Метаданные.Справочники.КлассификаторБанковРФ); КонецПроцедуры @@ -431,13 +428,13 @@ ИначеЕсли КодТипа = "3" Тогда Возврат "С."; // СЕЛО ИначеЕсли КодТипа = "4" Тогда - Возврат "ПГТ."; // ПОСЕЛОК ГОРОДСКОГО ТИПА + Возврат "ПГТ"; // ПОСЕЛОК ГОРОДСКОГО ТИПА ИначеЕсли КодТипа = "5" Тогда - Возврат "СТ-ЦА."; // СТАНИЦА + Возврат "СТ-ЦА"; // СТАНИЦА ИначеЕсли КодТипа = "6" Тогда - Возврат "АУЛ."; // АУЛ + Возврат "АУЛ"; // АУЛ ИначеЕсли КодТипа = "7" Тогда - Возврат "РП."; // РАБОЧИЙ ПОСЕЛОК + Возврат "РП"; // РАБОЧИЙ ПОСЕЛОК Иначе Возврат ""; КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl index ea7fbb10f..6870f26f9 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСБанкамиКлиент/Module.bsl @@ -6,13 +6,15 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Вызывается при запуске конфигурации, подключает обработчик ожидания. +// Вызывается после запуска конфигурации, подключает обработчик ожидания. // -Процедура ПриНачалеРаботыСистемы() Экспорт - Параметры = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если Параметры.Свойство("Банки") И Параметры.Банки.ВыводитьОповещениеОНеактуальности Тогда +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("Банки") И ПараметрыКлиента.Банки.ВыводитьОповещениеОНеактуальности Тогда ПодключитьОбработчикОжидания("РаботаСБанкамиВывестиОповещениеОНеактуальности", 45, Истина); КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/РаботаСБанкамиПереопределяемый.mdo b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/РаботаСБанкамиПереопределяемый.mdo index 45e575d62..6c1cf7c72 100644 --- a/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/РаботаСБанкамиПереопределяемый.mdo +++ b/SSL/src/CommonModules/РаботаСБанкамиПереопределяемый/РаботаСБанкамиПереопределяемый.mdo @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="cdac5b57-bb40-4783-a506-37251d7714a4"> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="22c60cbc-429f-40d9-bf8b-681b7786c41d"> <name>РаботаСБанкамиПереопределяемый</name> <synonym> <key>ru</key> diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl index 9eec35f37..998cd2e15 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалют/Module.bsl @@ -6,13 +6,13 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Добавляет в справочник валют валюты из макета -// +// Добавляет в справочник валют валюты из макета. +// // Параметры: -// Код (коллекция строк) Коды добавляемых валют -// +// Код - коллекция строк - Коды добавляемых валют. +// // Возвращаемое значение: -// Массив из СправочникСсылка, соответствующих созданным валютам +// Массив из СправочникСсылка - Ссылки созданных валют. // Функция ДобавитьВалютыПоКоду(Знач Коды) Экспорт Перем КлассификаторXML, КлассификаторТаблица, ЗаписьОКВ, НоваяСтрока, Результат; @@ -49,18 +49,18 @@ КонецФункции // Возвращает курс валюты на дату -// +// // Параметры: -// Валюта (СправочникСсылка.Валюты) Валюта, для которой получается курс -// ДатаКурса (Дата) Дата, на которую получается курс -// +// Валюта - СправочникСсылка.Валюты - Валюта, для которой получается курс. +// ДатаКурса - Дата - Дата, на которую получается курс. +// // Возвращаемое значение: -// (Структура) -// |- Валюта (СправочникСсылка.Валюты) -// |- Курс (Число) -// |- Кратность (Число) -// |- ДатаКурса (Дата) -// +// Структура - Параметры курса. +// * Курс - Число - Курс валюты на указанную дату. +// * Кратность - Число - Кратность валюты на указанную дату. +// * Валюта - СправочникСсылка.Валюты - Ссылка валюты. +// * ДатаКурса - Дата - Дата получения курса. +// Функция ПолучитьКурсВалюты(Валюта, ДатаКурса) Экспорт Результат = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ДатаКурса, Новый Структура("Валюта", Валюта)); @@ -73,15 +73,15 @@ КонецФункции // Формирует представление суммы прописью в указанной валюте -// +// // Параметры: -// СуммаЧислом (Число) Сумма, которую надо представить прописью -// Валюта (СправочникСсылка.Валюты) Валюта, в которой нужно представить сумму -// ВыводитьСуммуБезКопеек (Булево) Флаг представления суммы без копеек -// -// Возвращаемое значение: -// (Строка) Сумма прописью -// +// СуммаЧислом - Число - Сумма, которую надо представить прописью +// Валюта - СправочникСсылка.Валюты - Валюта, в которой нужно представить сумму +// ВыводитьСуммуБезКопеек - Булево - Флаг представления суммы без копеек +// +// Возвращаемое значение: +// Строка - Сумма прописью. +// Функция СформироватьСуммуПрописью(СуммаЧислом, Валюта, ВыводитьСуммуБезКопеек = Ложь) Экспорт Сумма = ?(СуммаЧислом < 0, -СуммаЧислом, СуммаЧислом); @@ -105,7 +105,7 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. - КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"].Добавить( + КлиентскиеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( "РаботаСКурсамиВалютКлиент"); // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. @@ -119,7 +119,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"].Добавить( "РаботаСКурсамиВалют"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( "РаботаСКурсамиВалют"); КонецЕсли; @@ -129,7 +129,7 @@ // Заполняет параметры, которые используется клиентским кодом на запуске конфигурации. // // Параметры: -// Параметры (Структура) Параметры запуска. +// Параметры - Структура - Параметры запуска. // Процедура ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры) Экспорт @@ -157,7 +157,7 @@ // но при этом эти ссылки не должны учитываться в бизнес-логике приложения. // // Параметры: -// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". +// Массив - массив строк, например, "РегистрСведений.ВерсииОбъектов". // Процедура ПриДобавленииИсключенийПоискаСсылок(Массив) Экспорт @@ -168,10 +168,10 @@ // Добавляет в таблицу информацию о регламентных заданиях подсистемы для модели сервиса. // // Параметры: -// ТаблицаИспользования (ТаблицаЗначений) Таблица регламентных заданий. -// |- РегламентноеЗадание (Строка) Имя предопределенного регламентного задания. -// |- Использование (Булево) Истина, если регламентное задание должно -// выполняться в модели сервиса. +// ТаблицаИспользования - ТаблицаЗначений - Таблица регламентных заданий. +// * РегламентноеЗадание - Строка - Имя предопределенного регламентного задания. +// * Использование - Булево - Истина, если регламентное задание должно +// выполняться в модели сервиса. // Процедура ПриОпределенииИспользованияРегламентныхЗаданий(ТаблицаИспользования) Экспорт @@ -307,7 +307,7 @@ // сведений курсов валют. При этом файл с курсами разбирается, и записываются // только те данные, которые удовлетворяют периоду (НачалоПериодаЗагрузки, ОкончаниеПериодаЗагрузки). // -Функция ЗагрузитьКурсВалютыИзФайла(знач Валюта, знач ПутьКФайлу, знач НачалоПериодаЗагрузки, знач ОкончаниеПериодаЗагрузки) Экспорт +Функция ЗагрузитьКурсВалютыИзФайла(Знач Валюта, Знач ПутьКФайлу, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки) Экспорт СтатусЗагрузки = 1; @@ -599,14 +599,14 @@ // Локальные служебные процедуры и функции // Выделяет из переданной строки первое значение - // до символа "TAB" - // - // Параметры: - // ИсходнаяСтрока - Строка - строка для разбора - // - // Возвращаемое значение: - // подстроку до символа "TAB" - // +// до символа "TAB" +// +// Параметры: +// ИсходнаяСтрока - Строка - строка для разбора +// +// Возвращаемое значение: +// подстроку до символа "TAB" +// Функция ВыделитьПодСтроку(ИсходнаяСтрока) Перем ПодСтрока; @@ -635,8 +635,8 @@ // Функция ПриОбновленииКурсовВалютВМоделиСервиса(Валюта) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда - МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); МодульКурсыВалютСлужебныйВМоделиСервиса.ЗапланироватьКопированиеКурсовВалюты(Валюта); КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl index dc4127fe6..2931c72e1 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиент/Module.bsl @@ -6,13 +6,14 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Вызывается при запуске конфигурации, подключает обработчик ожидания. -// -Процедура ПриНачалеРаботыСистемы() Экспорт - Параметры = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если Параметры.Свойство("Валюты") И Параметры.Валюты.КурсыОбновляютсяОтветственными Тогда +// Вызывается после запуска конфигурации, подключает обработчик ожидания. +Процедура ПослеНачалаРаботыСистемы() Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("Валюты") И ПараметрыКлиента.Валюты.КурсыОбновляютсяОтветственными Тогда ПодключитьОбработчикОжидания("РаботаСКурсамиВалютВывестиОповещениеОНеактуальности", 15, Истина); КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl index 11996746f..0b0620741 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютКлиентСервер/Module.bsl @@ -9,21 +9,21 @@ // Пересчитывает Сумму из Текущей валюты в Новую валюту по параметрам их курсов. // Параметры курсов валют можно получить воспользовавшись функцией // РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса). -// +// // Параметры: -// Сумма (Число) Сумма, которую следует пересчитать -// ПараметрыТекущегоКурса (Структура) Параметры курса валюты, из которой надо пересчитать -// |- Валюта (СправочникСсылка.Валюты) -// |- Курс (Число) -// |- Кратность (Число) -// ПараметрыНовогоКурса (Структура) Параметры курса валюты, в которую надо пересчитать -// |- Валюта (СправочникСсылка.Валюты) -// |- Курс (Число) -// |- Кратность (Число) -// +// Сумма - Число - Сумма, которую следует пересчитать. +// ПараметрыТекущегоКурса - Структура - Параметры курса валюты, из которой надо пересчитать. +// * Валюта - СправочникСсылка.Валюты - Ссылка пересчитываемой валюты. +// * Курс - Число - Курс пересчитываемой валюты. +// * Кратность - Число - Кратность пересчитываемой валюты. +// ПараметрыНовогоКурса - Структура - Параметры курса валюты, в которую надо пересчитать. +// * Валюта - СправочникСсылка.Валюты - Ссылка валюты, в которую идет пересчет. +// * Курс - Число - Курс валюты, в которую идет пересчет. +// * Кратность - Число - Кратность валюты, в которую идет пересчет. +// // Возвращаемое значение: -// (Число) Сумма, пересчитанная в другую валюту -// +// Число - Сумма, пересчитанная по новому курсу. +// Функция ПересчитатьПоКурсу(Сумма, ПараметрыТекущегоКурса, ПараметрыНовогоКурса) Экспорт Если ПараметрыТекущегоКурса.Валюта = ПараметрыНовогоКурса.Валюта ИЛИ ( @@ -54,22 +54,22 @@ КонецФункции // Устарела: Следует использовать функцию ПересчитатьПоКурсу -// +// // Пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач // в валюту ВалютаКон по курсу ПоКурсуКон. -// +// // Параметры: -// Сумма (Число) Сумма, которую следует пересчитать -// ВалютаНач (СправочникСсылка.Валюты) Валюта, из которой надо пересчитать -// ВалютаКон (СправочникСсылка.Валюты) Валюта, в которую надо пересчитать -// ПоКурсуНач (Число) Курс, из которого надо пересчитать -// ПоКурсуКон (Число) Курс, в который надо пересчитать -// ПоКратностьНач (Число) Кратность, из которой надо пересчитать (по умолчанию = 1) -// ПоКратностьКон (Число) Кратность, в которую надо пересчитать (по умолчанию = 1) -// +// Сумма - Число - Сумма, которую следует пересчитать +// ВалютаНач - СправочникСсылка.Валюты - Валюта, из которой надо пересчитать +// ВалютаКон - СправочникСсылка.Валюты - Валюта, в которую надо пересчитать +// ПоКурсуНач - Число - Курс, из которого надо пересчитать +// ПоКурсуКон - Число - Курс, в который надо пересчитать +// ПоКратностьНач - Число - Кратность, из которой надо пересчитать (по умолчанию = 1) +// ПоКратностьКон - Число - Кратность, в которую надо пересчитать (по умолчанию = 1) +// // Возвращаемое значение: -// (Число) Сумма, пересчитанная в другую валюту -// +// Число - Сумма, пересчитанная в другую валюту +// Функция ПересчитатьИзВалютыВВалюту(Сумма, ВалютаНач, ВалютаКон, ПоКурсуНач, ПоКурсуКон, ПоКратностьНач = 1, ПоКратностьКон = 1) Экспорт @@ -98,7 +98,7 @@ // СтатусОперации - завершилась ли загрузка успешно // Сообщение - пояснение о загрузке (текст сообщения об ошибке или поясняющее сообщение) // -Функция ЗагрузитьКурсыВалютПоПараметрам(знач Валюты, знач НачалоПериодаЗагрузки, знач ОкончаниеПериодаЗагрузки, +Функция ЗагрузитьКурсыВалютПоПараметрам(Знач Валюты, Знач НачалоПериодаЗагрузки, Знач ОкончаниеПериодаЗагрузки, ПриЗагрузкеВозниклиОшибки = Ложь) Экспорт СостояниеЗагрузки = Новый Массив; diff --git a/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/РаботаСКурсамиВалютПереопределяемый.mdo b/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/РаботаСКурсамиВалютПереопределяемый.mdo index f1089374a..8d0faa4ce 100644 --- a/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/РаботаСКурсамиВалютПереопределяемый.mdo +++ b/SSL/src/CommonModules/РаботаСКурсамиВалютПереопределяемый/РаботаСКурсамиВалютПереопределяемый.mdo @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="071ee250-f4eb-4ff8-a998-e34fa4812013"> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4654d192-74bf-430f-abee-6f4dc431b182"> <name>РаботаСКурсамиВалютПереопределяемый</name> <synonym> <key>ru</key> diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl index 7721c2390..b642ca575 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениями/Module.bsl @@ -46,7 +46,7 @@ // Наименование - Строка - Наименование учетной записи // Адрес - Строка - Адрес электронной почты // -Функция ПолучитьДоступныеУчетныеЗаписи(знач ДляОтправки = Неопределено, знач ДляПриема = Неопределено, знач ВключатьСистемнуюУчетнуюЗапись = Истина) Экспорт +Функция ПолучитьДоступныеУчетныеЗаписи(Знач ДляОтправки = Неопределено, Знач ДляПриема = Неопределено, Знач ВключатьСистемнуюУчетнуюЗапись = Истина) Экспорт Возврат ЭлектроннаяПочта.ПолучитьДоступныеУчетныеЗаписи(ДляОтправки, ДляПриема, ВключатьСистемнуюУчетнуюЗапись); @@ -86,7 +86,7 @@ // // ПРИМЕЧАНИЕ: функция может вызвать исключение, которое требуется обработать // -Функция ОтправитьСообщение(знач УчетнаяЗапись, знач ПараметрыПисьма) Экспорт +Функция ОтправитьСообщение(Знач УчетнаяЗапись, Знач ПараметрыПисьма) Экспорт Возврат ЭлектроннаяПочта.ОтправитьПочтовоеСообщение(УчетнаяЗапись, ПараметрыПисьма); @@ -103,11 +103,11 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ЭлектроннаяПочта"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "РаботаСПочтовымиСообщениями"); - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"].Добавить( + СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( "РаботаСПочтовымиСообщениями"); КонецЕсли; @@ -135,17 +135,12 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо // Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах @@ -159,26 +154,43 @@ // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - Описание = Описание + - " - |Справочник.УчетныеЗаписиЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты - |"; + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; -КонецПроцедуры - - // Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. -// -// Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). -// -Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); - Если Свойства.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].УчетныеЗаписиЭлектроннойПочты Тогда - Свойства.Таблицы.Добавить("Справочник.УчетныеЗаписиЭлектроннойПочты"); + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("УчетныеЗаписиЭлектроннойПочты") Тогда + + Описание = Описание + + " + |Справочник.УчетныеЗаписиЭлектроннойПочты.Чтение.УчетныеЗаписиЭлектроннойПочты + |"; + КонецЕсли; КонецПроцедуры +// Заполняет виды доступа, используемые в ограничениях прав доступа. +// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. +// Их можно удалить, если они не требуются для ограничения прав доступа. +// +// Параметры: +// ВидыДоступа - ТаблицаЗначений с полями: +// - Имя - Строка - имя используемое в описании поставляемых +// профилей групп доступа и текстах ОДД. +// - Представление - Строка - представляет вид доступа в профилях и группах доступа. +// - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). +// - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). +// - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), +// можно выбрать несколько групп значений (Групп доступа номенклатуры). +// +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт + + ВидДоступа = ВидыДоступа.Добавить(); + ВидДоступа.Имя = "УчетныеЗаписиЭлектроннойПочты"; + ВидДоступа.Представление = НСтр("ru = 'Учетные записи электронной почты'"); + ВидДоступа.ТипЗначений = Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты"); + +КонецПроцедуры + diff --git a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl index 1217d66d3..1b766c1c7 100644 --- a/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСПочтовымиСообщениямиКлиент/Module.bsl @@ -34,23 +34,23 @@ // ПисьмоДолжноСохраняться - булево - должно ли письмо сохраняться (используется только // если встроена подсистема Взаимодействия) // -Процедура ОткрытьФормуОтправкиПочтовогоСообщения(знач Отправитель = Неопределено, - знач Получатель = Неопределено, - знач Тема = "", - знач Текст = "", - знач СписокФайлов = Неопределено, - знач УдалятьФайлыПослеОтправки = Ложь, - знач ПисьмоДолжноСохраняться = Истина) Экспорт +Процедура ОткрытьФормуОтправкиПочтовогоСообщения(Знач Отправитель = Неопределено, + Знач Получатель = Неопределено, + Знач Тема = "", + Знач Текст = "", + Знач СписокФайлов = Неопределено, + Знач УдалятьФайлыПослеОтправки = Ложь, + Знач ПисьмоДолжноСохраняться = Истина) Экспорт Если Не ЭлектроннаяПочтаВызовСервера.ЕстьДоступныеУчетныеЗаписиДляОтправки() Тогда ТекстСообщения = НСтр("ru = 'Для отправки письма требуется настройка учетной записи электронной почты.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(, ТекстСообщения); Возврат; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда - МодульВзаимодействияКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВзаимодействияКлиент"); + МодульВзаимодействияКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВзаимодействияКлиент"); МодульВзаимодействияКлиент.ОткрытьФормуОтправкиПочтовогоСообщения(Отправитель, Получатель, Тема, Текст, СписокФайлов); Иначе @@ -91,14 +91,14 @@ // УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - учетная запись, // которую нужно проверить. // -Процедура ПроверитьУчетнуюЗапись(знач УчетнаяЗапись) Экспорт +Процедура ПроверитьУчетнуюЗапись(Знач УчетнаяЗапись) Экспорт ОчиститьСообщения(); Состояние(НСтр("ru = 'Проверка учетной записи'"),,НСтр("ru = 'Выполняется проверка учетной записи. Подождите...'")); Если ЭлектроннаяПочтаВызовСервера.ПарольЗадан(УчетнаяЗапись) Тогда - ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, Неопределено); + ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(Неопределено, УчетнаяЗапись, Неопределено); Иначе ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("УчетнаяЗапись", УчетнаяЗапись); @@ -112,22 +112,22 @@ // // см. описание процедуры ЭлектроннаяПочта.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты. // -Процедура ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, ПарольПараметр) Экспорт +Процедура ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(ОбработчикРезультата, УчетнаяЗапись, ПарольПараметр) Экспорт СообщениеОбОшибке = ""; ДополнительноеСообщение = ""; ЭлектроннаяПочтаВызовСервера.ПроверитьВозможностьОтправкиИПолученияЭлектроннойПочты(УчетнаяЗапись, ПарольПараметр, СообщениеОбОшибке, ДополнительноеСообщение); Если ЗначениеЗаполнено(СообщениеОбОшибке) Тогда - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Проверка параметров учетной записи завершилась с ошибками: - |%1'"), СообщениеОбОшибке ),, - НСтр("ru = 'Проверка учетной записи'")); + ПоказатьПредупреждение(ОбработчикРезультата, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Проверка параметров учетной записи завершилась с ошибками: + |%1'"), СообщениеОбОшибке ),, + НСтр("ru = 'Проверка учетной записи'")); Иначе - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Проверка параметров учетной записи завершилась успешно. %1'"), - ДополнительноеСообщение ),, - НСтр("ru = 'Проверка учетной записи'")); + ПоказатьПредупреждение(ОбработчикРезультата, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Проверка параметров учетной записи завершилась успешно. %1'"), + ДополнительноеСообщение),, + НСтр("ru = 'Проверка учетной записи'")); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl index 7a1cd49ba..ce6409e52 100644 --- a/SSL/src/CommonModules/РаботаСФайлами/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайлами/Module.bsl @@ -52,9 +52,9 @@ // Обработчик события ПриЗаписи. Определен для объектов (кроме Документ), владельцев Файла. Процедура УстановитьПометкуУдаленияФайловПередЗаписью(Источник, Отказ) Экспорт - Если Источник.ОбменДанными.Загрузка Тогда + Если Источник.ОбменДанными.Загрузка Тогда Возврат; - КонецЕсли; + КонецЕсли; Если Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления") Тогда ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); @@ -65,9 +65,9 @@ // Обработчик события ПриЗаписи. Определен для объектов типа Документ, владельцев Файла. Процедура УстановитьПометкуУдаленияФайловДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт - Если Источник.ОбменДанными.Загрузка Тогда + Если Источник.ОбменДанными.Загрузка Тогда Возврат; - КонецЕсли; + КонецЕсли; Если Источник.ПометкаУдаления <> ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Источник.Ссылка, "ПометкаУдаления") Тогда ПометитьНаУдалениеПриложенныеФайлы(Источник.Ссылка, Источник.ПометкаУдаления); diff --git a/SSL/src/CommonModules/РаботаСФайламиВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиВызовСервера/Module.bsl deleted file mode 100644 index bf2f42704..000000000 --- a/SSL/src/CommonModules/РаботаСФайламиВызовСервера/Module.bsl +++ /dev/null @@ -1,15 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Устаревший программный интерфейс. Будет удален в следующей редакции БСП. - -// Устарела. Следует использовать вызываемую процедуру. Будет удалена в следующей редакции БСП. -Функция СоздатьФайлНаОсновеФайлаНаДиске(Владелец, ПутьКФайлуНаДиске) Экспорт - - Возврат РаботаСФайлами.СоздатьФайлНаОсновеФайлаНаДиске(Владелец, ПутьКФайлуНаДиске); - -КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/Module.bsl deleted file mode 100644 index 6e275fb4b..000000000 --- a/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/Module.bsl +++ /dev/null @@ -1,53 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Работа с файлами". -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Устаревший программный интерфейс. Будет удален в следующей редакции БСП. - -// Устарела. Будет удалена в следующей редакции БСП. Следует использовать -// ту же процедуру в модуле РаботаСФайламиПереопределяемый. -// -Процедура ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл) Экспорт - - -КонецПроцедуры - -// Устарела. Будет удалена в следующей редакции БСП. -// Типы владельцев назначаются как и прежде. См. документацию. -// -Функция ПолучитьТипыВладельцаФайла() Экспорт - - Возврат ""; - -КонецФункции - -// Устарела. Будет удалена в следующей редакции БСП. Следует использовать -// ту же процедуру в модуле РаботаСФайламиПереопределяемый. -// -Процедура ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор) Экспорт - - - -КонецПроцедуры - -// Устарела. Будет удалена в следующей редакции БСП. Следует использовать -// ту же процедуру в модуле РаботаСФайламиПереопределяемый. -// -Процедура ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор) Экспорт - - - -КонецПроцедуры - -// Устарела. Будет удалена в следующей редакции БСП. Следует использовать -// ту же процедуру в модуле РаботаСФайламиПереопределяемый. -// -Процедура ПриСозданииФайла(ДанныеФайла) Экспорт - - - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/РаботаСФайламиВызовСервераПереопределяемый.mdo b/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/РаботаСФайламиВызовСервераПереопределяемый.mdo deleted file mode 100644 index 60fa75430..000000000 --- a/SSL/src/CommonModules/РаботаСФайламиВызовСервераПереопределяемый/РаботаСФайламиВызовСервераПереопределяемый.mdo +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="75c4e24f-b8d4-4b29-a9ce-e1d141c60fae"> - <name>РаботаСФайламиВызовСервераПереопределяемый</name> - <synonym> - <key>ru</key> - <value>Работа с файлами вызов сервера переопределяемый</value> - </synonym> - <server>true</server> - <externalConnection>true</externalConnection> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl index bc21ca916..7855f83ac 100644 --- a/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиКлиент/Module.bsl @@ -14,7 +14,7 @@ Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда ТекстСообщения = НСтр("ru = 'Сканирование не поддерживается в клиенте под управлением ОС Linux.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(, ТекстСообщения); Возврат; КонецЕсли; @@ -34,403 +34,17 @@ //////////////////////////////////////////////////////////////////////////////// // Команды работы с файлами -// Сохраняет отредактированный файл в ИБ и снимает с него блокировку -Процедура ЗакончитьРедактирование( - ПараметрКоманды, - ИдентификаторФормы, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - Знач АвторТекущейВерсии = Неопределено, - Знач Кодировка = Неопределено) Экспорт - - Если ПараметрКоманды = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - МассивОбработанных = ЗакончитьРедактированиеПоСсылкам( - ПараметрКоманды, - ИдентификаторФормы); - - ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); - - Для Каждого ФайлСсылка Из МассивОбработанных Цикл - Оповестить("Запись_Файл", Новый Структура("Событие", "ЗаконченоРедактирование"), ФайлСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка); - КонецЦикла; - - Иначе - РедактированиеЗакончено = РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактирование( - ПараметрКоманды, - ИдентификаторФормы, - ХранитьВерсии, - РедактируетТекущийПользователь, - Редактирует, - АвторТекущейВерсии, - "", //ПереданныйПолныйПутьКФайлу - Неопределено, //СоздатьНовуюВерсию - Неопределено, //КомментарийКВерсии - Истина, //ПоказыватьОповещение - Ложь, //ПрименитьКоВсем - Истина, //ОсвобождатьФайлы - Кодировка); - - Если РедактированиеЗакончено Тогда - Оповестить("Запись_Файл", Новый Структура("Событие", "ЗаконченоРедактирование"), ПараметрКоманды); - ОповеститьОбИзменении(ПараметрКоманды); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрКоманды); - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ПараметрКоманды); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Блокирует файл для редактирования и открывает его -Процедура Редактировать(ОбъектСсылка, - УникальныйИдентификатор = Неопределено, - РабочийКаталогВладельца = Неопределено) Экспорт - - Если ОбъектСсылка = Неопределено Тогда - Возврат; - КонецЕсли; - - ФайлОтредактирован = РаботаСФайламиСлужебныйКлиент.РедактироватьФайлПоСсылке( - ОбъектСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); - - Если ФайлОтредактирован Тогда - - ОповеститьОбИзменении(ОбъектСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ОбъектСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ФайлРедактировался"), ОбъектСсылка); - КонецЕсли; - -КонецПроцедуры - -// Выполняет блокировку файла или нескольких файлов -// ПараметрКоманды - либо ссылка на файл, либо массив ссылок на файлы -Процедура Занять(ПараметрКоманды, УникальныйИдентификатор = Неопределено) Экспорт - - Если ПараметрКоманды = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - РаботаСФайламиСлужебныйКлиент.ЗанятьФайлыПоСсылкам(ПараметрКоманды); - - ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); - Для Каждого ФайлСсылка Из ПараметрКоманды Цикл - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - КонецЦикла; - - Иначе - - Если РаботаСФайламиСлужебныйКлиент.ЗанятьФайлПоСсылке(ПараметрКоманды, УникальныйИдентификатор) Тогда - ОповеститьОбИзменении(ПараметрКоманды); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрКоманды); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Освобождает занятый ранее файл. -Процедура ОсвободитьФайл( - ПараметрКоманды, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - УникальныйИдентификатор = Неопределено) Экспорт - - Если ПараметрКоманды = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - РаботаСФайламиСлужебныйКлиент.ОсвободитьФайлыПоСсылкам(ПараметрКоманды); - - ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); - Для Каждого ФайлСсылка Из ПараметрКоманды Цикл - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - КонецЦикла; - - Иначе - - Если РаботаСФайламиСлужебныйКлиент.ОсвободитьФайл( - ПараметрКоманды, - ХранитьВерсии, - РедактируетТекущийПользователь, - Редактирует, - УникальныйИдентификатор) Тогда - - ОповеститьОбИзменении(ПараметрКоманды); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрКоманды); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - // Открывает файл для просмотра. Процедура Открыть(ДанныеФайла) Экспорт - ОткрытьФайл(ДанныеФайла); - - ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("Событие", "ФайлОткрыт"); - Оповестить("ФайлОткрыт", ПараметрыОповещения, ДанныеФайла.Ссылка); - -КонецПроцедуры - -// Сохраняет файл в информационной базе, но не освобождает его. -Процедура ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы) Экспорт - - Если ПараметрКоманды = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда - - РаботаСФайламиСлужебныйКлиент.ОпубликоватьФайлыПоСсылкам(ПараметрКоманды, ИдентификаторФормы); - - Для Каждого ФайлСсылка Из ПараметрКоманды Цикл - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка); - КонецЦикла; - - Иначе - - Если РаботаСФайламиСлужебныйКлиент.ОпубликоватьФайл(ПараметрКоманды, ИдентификаторФормы) Тогда - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрКоманды); - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ПараметрКоманды); - КонецЕсли; - - КонецЕсли; + РаботаСФайламиСлужебныйКлиент.ОткрытьФайлСОповещением(Неопределено, ДанныеФайла); КонецПроцедуры // Открывает каталог на локальном компьютере в котором размещен этот файл. Процедура ОткрытьКаталогФайла(ДанныеФайла) Экспорт - РаботаСФайламиСлужебныйКлиент.КаталогФайла(ДанныеФайла); - -КонецПроцедуры - -// Сохраняет текущую версию файла в выбранный каталог на жестком или сетевом диске. -Процедура СохранитьКак(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - РаботаСФайламиСлужебныйКлиент.СохранитьКак(ДанныеФайла, УникальныйИдентификатор); - -КонецПроцедуры - -// Выбирает на диске файл и создает из него новую версию. -Процедура ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Экспорт - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если РасширениеПодключено Тогда - - Если РаботаСФайламиСлужебныйКлиент.ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Тогда - ОповеститьОбИзменении(ДанныеФайла.Ссылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ДанныеФайла.Ссылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ДанныеФайла.Ссылка); - КонецЕсли; - - Иначе - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); - КонецЕсли; - -КонецПроцедуры - -// Формирует электронную подпись. -Функция СформироватьПодписьФайла(ДанныеФайла, ДанныеПодписи) Экспорт - - Если НЕ ДанныеФайла.Редактирует.Пустая() Тогда - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла()); - Возврат Ложь; - КонецЕсли; - - Если ДанныеФайла.Зашифрован Тогда - Предупреждение(ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла()); - Возврат Ложь; - КонецЕсли; - - ТолькоЛичные = Истина; - МассивСтруктурСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(ТолькоЛичные); - ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов, ОбъектСсылка", МассивСтруктурСертификатов, ДанныеФайла.Ссылка); - - СтруктураПараметровПодписи = ОткрытьФормуМодально("ОбщаяФорма.УстановкаПодписиЭЦП", ПараметрыФормы); - - Если ТипЗнч(СтруктураПараметровПодписи) = Тип("Структура") Тогда - - СтруктураВозврата = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИДвоичныеДанные(ДанныеФайла.Ссылка); - - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - - ДанныеПодписи = ЭлектроннаяЦифроваяПодписьКлиент.СформироватьДанныеПодписи( - МенеджерКриптографии, ДанныеФайла.Ссылка, - СтруктураВозврата.ДвоичныеДанные, СтруктураПараметровПодписи); - - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Зашифровать файл. -Функция Зашифровать(ДанныеФайла, - УникальныйИдентификатор, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков) Экспорт - - Если ДанныеФайла.Зашифрован Тогда - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" уже зашифрован.'"), - Строка(ДанныеФайла.Ссылка) )); - - Возврат Ложь; - КонецЕсли; - - Если НЕ ДанныеФайла.Редактирует.Пустая() Тогда - Предупреждение(НСтр("ru = 'Нельзя зашифровать занятый файл.'")); - Возврат Ложь; - КонецЕсли; - - МассивСтруктурСертификатов = - ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь); - - ОтпечатокЛичногоСертификатаДляШифрования = - ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).ОтпечатокЛичногоСертификатаДляШифрования; - - // отпечаток сохраненный в ХранилищеНастроек мог устареть - сертификат могли уже удалить - Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено - И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку( - ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные - - Если Сертификат = Неопределено Тогда - ОтпечатокЛичногоСертификатаДляШифрования = ""; - КонецЕсли; - - Иначе - МассивСтруктурЛичныхСертификатов = - ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные - - ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов", МассивСтруктурЛичныхСертификатов); - СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификата", ПараметрыФормы); - Если ТипЗнч(СтруктураВозврата) = Тип("Структура") Тогда - ОтпечатокЛичногоСертификатаДляШифрования = СтруктураВозврата.Отпечаток; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "ЭЦП", - "ОтпечатокЛичногоСертификатаДляШифрования", - ОтпечатокЛичногоСертификатаДляШифрования); - Иначе - Предупреждение(НСтр("ru = 'Не выбран персональный сертификат для шифрования.'")); - Возврат Ложь; - КонецЕсли; - - КонецЕсли; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурСертификатов); - ПараметрыФормы.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); - ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ОтпечатокЛичногоСертификатаДляШифрования); - - СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы); - - Если ТипЗнч(СтруктураВозврата) = Тип("Массив") Тогда - - Возврат РаботаСФайламиСлужебныйКлиент.Зашифровать( - ДанныеФайла.Ссылка, - СтруктураВозврата, - УникальныйИдентификатор, - ДанныеФайла, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков); - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -// Расшифровать файл. -Функция Расшифровать(ДанныеФайла, УникальныйИдентификатор, МассивДанныхДляЗанесенияВБазу) Экспорт - - Возврат РаботаСФайламиСлужебныйКлиент.Расшифровать( - ДанныеФайла.Ссылка, - УникальныйИдентификатор, - ДанныеФайла, - МассивДанныхДляЗанесенияВБазу); - -КонецФункции - -// Добавить ЭЦП из файла. -Функция ДобавитьЭЦПИзФайла(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - #Если НЕ ВебКлиент Тогда - - МассивФайловПодписей = ОткрытьФормуМодально("ОбщаяФорма.ДобавлениеПодписиИзФайла"); - - Если ТипЗнч(МассивФайловПодписей) <> Тип("Массив") ИЛИ МассивФайловПодписей.Количество() = 0 Тогда - Возврат Ложь; - КонецЕсли; - - МассивДанныхДляЗанесенияВБазу = ЭлектроннаяЦифроваяПодписьКлиент.СформироватьПодписиДляЗанесениюВБазу(ДанныеФайла.Ссылка, МассивФайловПодписей, УникальныйИдентификатор); - - Если МассивДанныхДляЗанесенияВБазу.Количество() > 0 Тогда - РаботаСФайламиСлужебныйКлиент.ЗанестиИнформациюОПодписях( - ДанныеФайла.Ссылка, - ДанныеФайла.Владелец, - МассивДанныхДляЗанесенияВБазу, - УникальныйИдентификатор); - КонецЕсли; - - Возврат Истина; - - #Иначе - Предупреждение(НСтр("ru = 'В Веб-клиенте добавление ЭЦП из файла не поддерживается.'")); - Возврат Ложь; - #КонецЕсли - -КонецФункции - -// СохранитьКак вместе с ЭЦП. -Процедура СохранитьВместеСЭЦП(ДанныеФайла, УникальныйИдентификатор) Экспорт - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если РасширениеПодключено Тогда - - Настройка = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП().ДействияПриСохраненииСЭЦП; - - Если Настройка = "Спрашивать" Тогда - ПараметрыФормы = Новый Структура("Объект, УникальныйИдентификатор", ДанныеФайла.ТекущаяВерсия, УникальныйИдентификатор); - МассивСтруктурПодписей = ОткрытьФормуМодально("ОбщаяФорма.ВыборПодписей", ПараметрыФормы); - ИначеЕсли Настройка = "СохранятьВсеПодписи" Тогда - МассивСтруктурПодписей = РаботаСФайламиСлужебныйВызовСервера.ПолучитьВсеПодписи(ДанныеФайла.Ссылка, УникальныйИдентификатор); - КонецЕсли; - - Если ТипЗнч(МассивСтруктурПодписей) = Тип("Массив") И МассивСтруктурПодписей.Количество() > 0 Тогда - - ПолноеИмяФайла = РаботаСФайламиСлужебныйКлиент.СохранитьКак( - ДанныеФайла, УникальныйИдентификатор); - - Если ПолноеИмяФайла = "" Тогда - Возврат; // пользователь нажал Отмена или это веб клиент без расширения - КонецЕсли; - - ЭлектроннаяЦифроваяПодписьКлиент.СохранитьПодписи(ДанныеФайла.Ссылка, ПолноеИмяФайла, УникальныйИдентификатор, МассивСтруктурПодписей); - КонецЕсли; - - Иначе - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); - КонецЕсли; + РаботаСФайламиСлужебныйКлиент.КаталогФайла(Неопределено, ДанныеФайла); КонецПроцедуры @@ -444,672 +58,49 @@ КонецПроцедуры -// На основе переданного пути к файлу на диске создает Файл его и открывает карточку +// Задает вопрос о продолжении закрытия формы если в форме остались захваченные файлы. +// Вызывается из ПередЗакрытием форм с файлами. // // Параметры: -// ПолноеИмяФайла - Строка - полный путь к файлу. -// ВладелецФайла - ЛюбаяСсылка - владелец файла. -// ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. +// Форма - УправляемаяФорма - Форма, в которой можно редактировать файл. +// Отказ - Булево - Параметр события ПередЗакрытием. +// ОбъектСсылка - ЛюбаяСсылка - Ссылка владельца файла. +// ИмяРеквизита - Строка - Необязательный. Имя реквизита типа Булево, +// в котором хранится признак того, что вопрос уже выводился. // -// НеОткрыватьКарточкуПослеСозданияИзФайла - Булево, когда Истина -// карточка файла не открывается после создания. +// Описание: +// По ссылке объекта проверяет остались ли захваченные файлы. +// Если захваченные файлы остались: +// - В параметре Отказ устанавливается значение Истина, +// - Пользователю задается вопрос. +// Если пользователь ответил утвердительно, тогда форма снова закрывается. // -// ИмяСоздаваемогоФайла - Строка - явно заданное имя файла -// (по умолчанию имя берется из ПолноеИмяФайла). +// Например: +// &НаКлиенте +// Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) +// РаботаСФайламиКлиент.ПоказатьПодтверждениеЗакрытияФормыСФайлами(ЭтотОбъект, Отказ, Объект.Ссылка); +// // <Если есть другой код:> +// Если Отказ Тогда +// Возврат; +// КонецЕсли; +// // <Другой прикладной код...> +// КонецПроцедуры // -Процедура СоздатьДокументНаОсновеФайла(ПолноеИмяФайла, - ВладелецФайла, - ФормаВладелец, - НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено, - ИмяСоздаваемогоФайла = Неопределено) Экспорт - - // Здесь не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), - // т.к. вызов может придти только с тонкого клиента (не с веб). - - // Здесь создается Файл ... - Файл = Новый Файл(ПолноеИмяФайла); - - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(Файл); - - ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - - Если НЕ ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере Тогда - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - Файл.ПолноеИмя, ФормаВладелец.УникальныйИдентификатор); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - - ВремяИзменения = Файл.ПолучитьВремяИзменения(); - ВремяИзмененияУниверсальное = Файл.ПолучитьУниверсальноеВремяИзменения(); - - ИмяСоздания = Файл.ИмяБезРасширения; - Если ИмяСоздаваемогоФайла <> Неопределено Тогда - ИмяСоздания = ИмяСоздаваемогоФайла; - КонецЕсли; - - ИмяФайла = ИмяСоздания + Файл.Расширение; - РазмерВМб = Файл.Размер() / (1024 * 1024); - - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идет сохранение файла ""%1"" (%2 Мб). - |Пожалуйста, подождите...'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - - - // Помещение файла во временное хранилище. - АдресВременногоХранилищаФайла = ""; - - ПомещаемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя, ""); - ПомещаемыеФайлы.Добавить(Описание); - - ПомещенныеФайлы = Новый Массив; - - Если НЕ ПоместитьФайлы(ПомещаемыеФайлы, - ПомещенныеФайлы, - , - Ложь, - ФормаВладелец.УникальныйИдентификатор) Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |во временное хранилище.'"), - Файл.ПолноеИмя); - КонецЕсли; - - Если ПомещенныеФайлы.Количество() = 1 Тогда - АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; - КонецЕсли; - - // Создание карточки Файла в БД. - Док = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией( - ВладелецФайла, - ИмяСоздания, - ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Файл.Расширение), - ВремяИзменения, - ВремяИзмененияУниверсальное, - Файл.Размер(), - АдресВременногоХранилищаФайла, - АдресВременногоХранилищаТекста, - Ложь, // Это не Веб-клиент. - Неопределено, // Пользователь. - "", // Комментарий. - Истина); // ЗаписатьВИсторию. - - Состояние(); - - ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("Владелец", ВладелецФайла); - ПараметрыОповещения.Вставить("Файл", Док); - ПараметрыОповещения.Вставить("Событие", "СозданФайл"); - Оповестить("Запись_Файл", ПараметрыОповещения); - - НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Док); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - НавигационнаяСсылка, - Док, - БиблиотекаКартинок.Информация32); - - Если НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда - Параметры = Новый Структура; - Параметры.Вставить("Ключ", Док); - Параметры.Вставить("КарточкаОткрытаПослеСозданияФайла", Истина); - - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); - КонецЕсли; - -КонецПроцедуры - -// Вернет Истина, если можно закрыть форму. -// Параметры -// ОбъектСсылка - ЛюбаяСсылка - владелец файла -// -// Возвращаемое значение: -// Булево - Истина, если можно закрыть форму. -Функция МожноЗакрытьФормуСФайлами(ОбъектСсылка) Экспорт - - МожноЗакрыть = Истина; - - Количество = РаботаСФайламиСлужебныйВызовСервера.КоличествоФайловЗанятыхТекущимПользователем(ОбъектСсылка); - - Если Количество <> 0 Тогда - - Результат = Вопрос( - НСтр("ru = 'Один или несколько файлов заняты вами для редактирования. - | - |Продолжить?'"), - РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); - - Если Результат = КодВозвратаДиалога.Нет Тогда - МожноЗакрыть = Ложь; - КонецЕсли; - - КонецЕсли; - - Возврат МожноЗакрыть; - -КонецФункции - -// Выбрать режим открытия файла и начать редактирование -Функция ВыбратьРежимИРедактироватьФайл(ДанныеФайла, ДоступностьКомандыРедактировать) Экспорт - - РедактированиеВоВстроенномРедакторе = Ложь; - ПерсональныеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - - ТекстовыеФайлыСпособОткрытия = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыСпособОткрытия; - Если ТекстовыеФайлыСпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда - - ТекстовыеФайлыРасширение = ПерсональныеНастройкиРаботыСФайлами.ТекстовыеФайлыРасширение; - - Если ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке( - ТекстовыеФайлыРасширение, ДанныеФайла.Расширение) Тогда - - РедактированиеВоВстроенномРедакторе = Истина; - КонецЕсли; - - КонецЕсли; - - ГрафическиеСхемыСпособОткрытия = ПерсональныеНастройкиРаботыСФайлами.ГрафическиеСхемыСпособОткрытия; - Если ГрафическиеСхемыСпособОткрытия = ПредопределенноеЗначение("Перечисление.СпособыОткрытияФайлаНаПросмотр.ВоВстроенномРедакторе") Тогда - - ГрафическиеСхемыРасширение = ПерсональныеНастройкиРаботыСФайлами.ГрафическиеСхемыРасширение; - Если ФайловыеФункцииСлужебныйКлиентСервер.РасширениеФайлаВСписке(ГрафическиеСхемыРасширение, ДанныеФайла.Расширение) Тогда - РедактированиеВоВстроенномРедакторе = Истина; - КонецЕсли; - - КонецЕсли; - - Если РедактированиеВоВстроенномРедакторе Тогда - Возврат "Открыть"; - КонецЕсли; - - // Если уже занят для редактирования, то не спрашивать - сразу открывать - Если ДанныеФайла.Редактирует.Пустая() Тогда - СпрашиватьРежимРедактированияПриОткрытииФайла = ПерсональныеНастройкиРаботыСФайлами.СпрашиватьРежимРедактированияПриОткрытииФайла; - Если СпрашиватьРежимРедактированияПриОткрытииФайла = Истина Тогда - - КакОткрывать = Неопределено; - - Если Не ДоступностьКомандыРедактировать Тогда - КакОткрывать = 0; // Просмотр - Иначе - - Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбораРежимаОткрытия"); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат "Отмена"; - КонецЕсли; - - БольшеНеСпрашивать = Результат.БольшеНеСпрашивать; - Если БольшеНеСпрашивать = Истина Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиОткрытияФайлов", "СпрашиватьРежимРедактированияПриОткрытииФайла", Ложь); - ОбновитьПовторноИспользуемыеЗначения(); - КонецЕсли; - - КакОткрывать = Результат.КакОткрывать; - КонецЕсли; - - Если КакОткрывать = 1 Тогда - РаботаСФайламиСлужебныйКлиент.РедактироватьФайл(ДанныеФайла); - ОповеститьОбИзменении(ДанныеФайла.Ссылка); - Возврат "Редактировать"; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - Возврат "Открыть"; - -КонецФункции - -// Открывает файл. -// -// Параметры: -// ДанныеФайла - Структура с данными файла. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -Процедура ОткрытьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - // Если Файл без файла, тогда открыть карточку. - Если ДанныеФайла.Версия.Пустая() Тогда - ОткрытьЗначение(ДанныеФайла.Ссылка); +Процедура ПоказатьПодтверждениеЗакрытияФормыСФайлами(Форма, Отказ, ОбъектСсылка, ИмяРеквизита = "МожноЗакрытьФормуСФайлами") Экспорт + Если Форма[ИмяРеквизита] Тогда Возврат; КонецЕсли; - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если РасширениеПодключено Тогда - ПолноеИмяФайла = ""; - ДополнительныеПараметры = Новый Структура("ОткрытьФайл", Истина); - - Результат = РаботаСФайламиСлужебныйКлиент.ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор, ДополнительныеПараметры); - - Если Результат Тогда - РаботаСФайламиСлужебныйКлиент.ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); - КонецЕсли; - Иначе - Если ДанныеФайла.РедактируетТекущийПользователь Тогда - ФайловыеФункцииСлужебныйКлиент.ПоказатьНапоминаниеПриРедактировании(); - КонецЕсли; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); - - // При хранении файлов на диске (на сервере) файл удаляется из временного хранилища не сразу: - // - удаляется, либо при следующем вызове ПолучитьДанныеФайлаДляОткрытия, либо не удаляется; - // - удаляется при закрытии формы автоматически. - КонецЕсли; - -КонецПроцедуры - -// Рекурсивная функция импорта файлов с диска - принимает массив файлов (или каталогов) -// - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя -// -// Параметры -// Владелец - ЛюбаяСсылка - владелец файла -// ФайлыАргумент - Массив - массив объектов "Файл" -// Индикатор - Число - число от 0 до 100 - прогресс выполнения -// МассивИменФайловСОшибками - Массив - Массив имен файлов с ошибками -// МассивСтруктурВсехФайлов - Массив - Массив структур всех файлов -// Комментарий - Строка - Комментарий -// ХранитьВерсии - Булево - Хранить версии -// Рекурсивно - Булево - Рекурсивно обходить подкаталоги -// КоличествоСуммарное - Число - Количество суммарное импортированных файлов -// Счетчик - Число - Счетчик обработанных файлов (не обязательно файл будет загружен) -// ИдентификаторФормы - уникальный идентификатор формы -// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) -// ДобавленныеФайлы - Массив - Добавленные файлы -// МассивВсехПапок - Массив - Массив всех папок -// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) -Процедура ИмпортФайлов( - Владелец, - ФайлыАргумент, - Индикатор, - МассивИменФайловСОшибками, - МассивСтруктурВсехФайлов, - Комментарий, - ХранитьВерсии, - Рекурсивно, - КоличествоСуммарное, - Счетчик, - ИдентификаторФормы, - Знач ПсевдоФайловаяСистема, - ДобавленныеФайлы, - МассивВсехПапок, - РежимЗагрузки = Ложь, - Кодировка = Неопределено) Экспорт - - Перем ПерваяПапкаСТакимЖеИменем; - Перем ДокГруппаСсылка; - - Для Каждого ВыбранныйФайл Из ФайлыАргумент Цикл - Попытка - Если ВыбранныйФайл.Существует() Тогда - - Если ВыбранныйФайл.Расширение = ".lnk" Тогда - ВыбранныйФайл = РаботаСФайламиСлужебныйКлиент.РазыменоватьLnkФайл(ВыбранныйФайл); - КонецЕсли; - - Если ВыбранныйФайл.ЭтоКаталог() Тогда - - Если Рекурсивно = Истина Тогда - НовыйПуть = Строка(ВыбранныйФайл.Путь); - НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); - МассивФайлов = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); - - // Создаем группу в справочнике - эквивалент папки на диске. - Если МассивФайлов.Количество() <> 0 Тогда - ИмяФайла = ВыбранныйФайл.Имя; - - ПапкаУжеНайдена = Ложь; - - Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ИмяФайла, Владелец, ПерваяПапкаСТакимЖеИменем) Тогда - - Если РежимЗагрузки Тогда - ПапкаУжеНайдена = Истина; - ДокГруппаСсылка = ПерваяПапкаСТакимЖеИменем; - Иначе - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Папка ""%1"" уже существует. - |Продолжить импорт папки?'"), - ИмяФайла); - - КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - - Если КодВозврата = КодВозвратаДиалога.Нет Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - Если Не ПапкаУжеНайдена Тогда - ДокГруппаСсылка = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(ИмяФайла, Владелец); - КонецЕсли; - - ИмпортФайлов( - ДокГруппаСсылка, - МассивФайлов, - Индикатор, - МассивИменФайловСОшибками, - МассивСтруктурВсехФайлов, - Комментарий, - ХранитьВерсии, - Рекурсивно, - КоличествоСуммарное, - Счетчик, - ИдентификаторФормы, - ПсевдоФайловаяСистема, - ДобавленныеФайлы, - МассивВсехПапок, - РежимЗагрузки, - Кодировка); - - МассивВсехПапок.Добавить(НовыйПуть); - КонецЕсли; - КонецЕсли; - - Продолжить; - КонецЕсли; - - Если Не ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла( - ВыбранныйФайл, Ложь, МассивИменФайловСОшибками) Тогда - Продолжить; - КонецЕсли; - - // Обновим индикатор прогресса - Счетчик = Счетчик + 1; - Индикатор = Счетчик * 100 / КоличествоСуммарное; // Считаем проценты - РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); - НадписьПодробнее = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Обрабатывается файл ""%1"" (%2 Мб)...'"), - ВыбранныйФайл.Имя, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - ТекстСостояния = НСтр("ru = 'Импорт файлов с диска...'"); - Если РежимЗагрузки Тогда - ТекстСостояния = НСтр("ru = 'Загрузка файлов с диска...'"); - КонецЕсли; - - Состояние( - ТекстСостояния, - Индикатор, - НадписьПодробнее, - БиблиотекаКартинок.Информация32); - - // Создаем Элемент справочника Файлы - ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения; - Расширение = ВыбранныйФайл.Расширение; - - Если РежимЗагрузки Тогда - Если РаботаСФайламиСлужебныйВызовСервера.ЕстьФайлСТакимИменем(ИмяБезРасширения, Владелец) Тогда - Запись = Новый Структура; - Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); - Запись.Вставить("Ошибка", НСтр("ru = 'Файл с таким именем уже есть в хранилище файлов.'")); - МассивИменФайловСОшибками.Добавить(Запись); - Продолжить; - КонецЕсли; - КонецЕсли; - - АдресВременногоХранилищаФайла = ""; - - ПомещаемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ВыбранныйФайл.ПолноеИмя, ""); - ПомещаемыеФайлы.Добавить(Описание); - - ПомещенныеФайлы = Новый Массив; - - Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка помещения файла - |""%1"" - |во временное хранилище.'"), - ВыбранныйФайл.ПолноеИмя); - КонецЕсли; - - Если ПомещенныеФайлы.Количество() = 1 Тогда - АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; - КонецЕсли; - - Если НЕ ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами( - ).ИзвлекатьТекстыФайловНаСервере Тогда - - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ВыбранныйФайл.ПолноеИмя, ИдентификаторФормы, , Кодировка); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - - // Создаем элемент справочника Файлы - РаботаСФайламиКлиентСервер.СоздатьЭлементСправочникаФайлы(ВыбранныйФайл, МассивСтруктурВсехФайлов, - Владелец, ИдентификаторФормы, Комментарий, ХранитьВерсии, ДобавленныеФайлы, - АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста, - Неопределено, - Кодировка); - - Иначе - Запись = Новый Структура; - Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); - Запись.Вставить("Ошибка", НСтр("ru = 'Файл отсутствует на диске.'")); - МассивИменФайловСОшибками.Добавить(Запись); - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); - - Запись = Новый Структура; - Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); - Запись.Вставить("Ошибка", СообщениеОбОшибке); - МассивИменФайловСОшибками.Добавить(Запись); - - КонецПопытки; - КонецЦикла; - -КонецПроцедуры - -// Создает новый файл. -// -// Параметры: -// РежимСоздания - Число: -// 1 - создать из шаблона; -// 2 - создать из файла; -// 3 - создать пустую карточку. -// -// ВладелецФайла - ЛюбаяСсылка - владелец файла. -// -// ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. -// -// НеОткрыватьКарточкуПослеСозданияИзФайла - Булево, когда Истина -// карточка файла не открывается после создания. -// -Процедура СоздатьФайл(РежимСоздания, - ВладелецФайла, - ФормаВладелец, - НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - Если РежимСоздания = 1 Тогда - - // Создание из шаблона. - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ВыборШаблона", Истина); - ПараметрыФормы.Вставить("ТекущаяСтрока", ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны")); - Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВыбора", ПараметрыФормы); - - Если Результат = Неопределено Тогда - Возврат; - КонецЕсли; - - Параметры = Новый Структура; - Параметры.Вставить("ФайлОснование", Результат); - Параметры.Вставить("ВладелецФайла", ВладелецФайла); - Параметры.Вставить("РежимСоздания", "ИзШаблона"); - - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); - - ИначеЕсли РежимСоздания = 2 Тогда - - // Создание из файла. - ПолноеИмяФайла = ""; - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если РасширениеПодключено Тогда - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'"); - ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'"); - - РабочийКаталог = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(ВладелецФайла); - ВыборФайла.Каталог = РабочийКаталог; - - Результат = ВыборФайла.Выбрать(); - ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; - - Если НЕ Результат Тогда - Возврат; - КонецЕсли; - - СоздатьДокументНаОсновеФайла( - ПолноеИмяФайла, - ВладелецФайла, - ФормаВладелец, - НеОткрыватьКарточкуПослеСозданияИзФайла); - - Иначе // Веб-клиент. - - ВремяИзменения = Дата('00010101'); // Т.к. невозможно получить дату изменения файла на диске. - ВремяИзмененияУниверсальное = Дата('00010101'); - Размер = 0; // Т.к. невозможно получить размер файла на диске. - ИмяБезРасширения = ""; - Расширение = ""; - АдресВременногоХранилищаТекста = ""; - - // Помещение файла во временное хранилище. - АдресВременногоХранилищаФайла = ""; - ИмяФайла = ""; - Если НЕ ПоместитьФайл(АдресВременногоХранилищаФайла, - ИмяФайла, - ИмяФайла, - Истина, - ФормаВладелец.УникальныйИдентификатор) Тогда - Возврат; - КонецЕсли; - - СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла); - Если СтрокиПути.Количество() >= 2 Тогда - Расширение = СтрокиПути[СтрокиПути.Количество()-1]; - ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при помещении файла - |""%1"" - |во временное хранилище.'"), - ИмяФайла); - КонецЕсли; - - // Создание карточки файла в БД. - Док = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией( - ВладелецФайла, - ИмяБезРасширения, - ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Расширение), - ВремяИзменения, - ВремяИзмененияУниверсальное, - Размер, - АдресВременногоХранилищаФайла, - АдресВременногоХранилищаТекста, - Истина); // Это Веб-клиент. - - ПараметрыОповещения = Новый Структура; - ПараметрыОповещения.Вставить("Владелец", ВладелецФайла); - ПараметрыОповещения.Вставить("Файл", Док); - ПараметрыОповещения.Вставить("Событие", "СозданФайл"); - Оповестить("Запись_Файл", ПараметрыОповещения); - - НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Док); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Создание:'"), - НавигационнаяСсылка, - Док, - БиблиотекаКартинок.Информация32); - - Если НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда - Параметры = Новый Структура; - Параметры.Вставить("Ключ", Док); - - ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", Параметры, ФормаВладелец); - КонецЕсли; - КонецЕсли; - - ИначеЕсли РежимСоздания = 3 Тогда - // Со сканера. - РаботаСФайламиСлужебныйКлиент.СканироватьИПоказатьДиалогПросмотра( - ВладелецФайла, - ФормаВладелец.УникальныйИдентификатор, - ФормаВладелец, - НеОткрыватьКарточкуПослеСозданияИзФайла); - Иначе - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверный режим создания файла: ""%1"".'"), - РежимСоздания); - КонецЕсли; - -КонецПроцедуры - -// Создает новый файл интерактивно. -// Происходит вызов диалога выбора режима создания Файла. -// -// Параметры: -// ВладелецФайла - определяет группу, в которой создается Элемент, если -// группа неизвестна в момент вызова этого метода - там будет Неопределено. -// -// ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. -// -// РежимСоздания - Число: -// 1 - создать из шаблона, -// 2 - создать из файла, -// 3 - создать пустую карточку. -// -// НеОткрыватьКарточкуПослеСозданияИзФайла - Булево, когда Истина -// карточка файла не открывается после создания. -// -Процедура СозданиеНовогоФайла(ВладелецФайла, - ФормаВладелец, - РежимСоздания = 1, - НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт - - Форма = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВыбораВариантаСозданияНовогоФайла(); - Форма.УстановитьПараметрыИспользования(РежимСоздания); - РежимСозданияРезультат = Форма.ОткрытьМодально(); - - Если ТипЗнч(РежимСозданияРезультат) = Тип("Число") Тогда - - СоздатьФайл( - РежимСозданияРезультат, - ВладелецФайла, - ФормаВладелец, - НеОткрыватьКарточкуПослеСозданияИзФайла); + Количество = РаботаСФайламиСлужебныйВызовСервера.КоличествоФайловЗанятыхТекущимПользователем(ОбъектСсылка); + Если Количество = 0 Тогда + Возврат; КонецЕсли; + Отказ = Истина; + ТекстВопроса = НСтр("ru = 'Один или несколько файлов заняты вами для редактирования. + | + |Продолжить?'"); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияПроизвольнойФормы(Форма, Отказ, ТекстВопроса, ИмяРеквизита); КонецПроцедуры // Копирует существующий файл. @@ -1128,199 +119,3 @@ КонецПроцедуры -// Обработчик события Перетаскивание в формах объектов - владельцев Файл (кроме формы ХранилищеФайлов) -// -// Параметры -// ПараметрыПеретаскивания - Параметры перетаскивания -// ВладелецФайлаСписка - ЛюбаяСсылка - владелец файла -// ЭтаФорма - Форма - форма, в которую делается перетаскивание -// НеОткрыватьКарточкуПослеСозданияИзФайла - Булево - не открывает карточку файла после создания, если Истина -Процедура ОбработкаПеретаскиванияВЛинейныйСписок(ПараметрыПеретаскивания, ВладелецФайлаСписка, ЭтаФорма, - НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт - - Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Истина Тогда - - СоздатьДокументНаОсновеФайла(ПараметрыПеретаскивания.Значение.ПолноеИмя, ВладелецФайлаСписка, ЭтаФорма, НеОткрыватьКарточкуПослеСозданияИзФайла); - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Файл") И ПараметрыПеретаскивания.Значение.ЭтоФайл() = Ложь Тогда - - Предупреждение(НСтр("ru = 'Выберите только файлы без каталогов.'")); - Возврат; - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("СправочникСсылка.Файлы") Тогда - - РаботаСФайламиСлужебныйКлиент.ПеренестиФайлВПриложенныеФайлы( - ПараметрыПеретаскивания.Значение, ВладелецФайлаСписка); - - ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - Если Не ФайлПринятый.ЭтоФайл() Тогда // только файлы, но не каталоги - Предупреждение(Нстр("ru = 'Выберите только файлы без каталогов.'")); - Возврат; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 - И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("Файл") Тогда - - Для Каждого ФайлПринятый Из ПараметрыПеретаскивания.Значение Цикл - НеОткрыватьКарточкуПослеСозданияИзФайла = Истина; - СоздатьДокументНаОсновеФайла(ФайлПринятый.ПолноеИмя, ВладелецФайлаСписка, ЭтаФорма, НеОткрыватьКарточкуПослеСозданияИзФайла); - КонецЦикла; - КонецЕсли; - - Если ПараметрыПеретаскивания.Значение.Количество() >= 1 - И ТипЗнч(ПараметрыПеретаскивания.Значение[0]) = Тип("СправочникСсылка.Файлы") Тогда - - РаботаСФайламиСлужебныйКлиент.ПеренестиФайлыВПриложенныеФайлы( - ПараметрыПеретаскивания.Значение, ВладелецФайлаСписка); - КонецЕсли; - - КонецЕсли; -КонецПроцедуры - -// По окончании Расшифровать нотифицирует -// Параметры -// ВладелецФайла - ЛюбаяСсылка - владелец файла -// ФайлСсылка - СправочникСсылка.Файлы - файл -Процедура ИнформироватьОРасшифровке(ВладелецФайла, ФайлСсылка) Экспорт - - ОповеститьОбИзменении(ФайлСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлЗашифрован"), ВладелецФайла); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" расшифрован'"), - ФайлСсылка); - Состояние(ТекстСообщения); - -КонецПроцедуры - -// По окончании Зашифровать нотифицирует -// Параметры -// МассивФайловВРабочемКаталогеДляУдаления - Массив - массив строк - путей к файлам -// ВладелецФайла - ЛюбаяСсылка - владелец файла -// ФайлСсылка - СправочникСсылка.Файлы - файл -Процедура ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, - ВладелецФайла, - ФайлСсылка) Экспорт - - ОповеститьОбИзменении(ФайлСсылка); - Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлЗашифрован"), ВладелецФайла); - Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); - - // удаляем из рабочего каталога все версии файла - Для Каждого ПутьФайла Из МассивФайловВРабочемКаталогеДляУдаления Цикл - РаботаСФайламиСлужебныйКлиент.УдалитьФайл(ПутьФайла, Ложь); // не задавать вопрос - КонецЦикла; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" зашифрован'"), - ФайлСсылка); - Состояние(ТекстСообщения); - -КонецПроцедуры - -// Закончить редактирование файлов. -// -// Параметры: -// МассивФайлов - Массив - массив файлов. -// ИдентификаторФормы - УникальныйИдентификатор управляемой формы. -// -Функция ЗакончитьРедактированиеПоСсылкам(Знач МассивФайлов, ИдентификаторФормы) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - // Получение массива данных файлов. - ДанныеФайлов = Новый Массив; - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); - ВГраницаМассива = ДанныеФайлов.ВГраница(); - - Для Инд = 0 По ВГраницаМассива Цикл - ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; - - // Проверка возможности освобождения файла. - СтрокаОшибки = ""; - Если НЕ РаботаСФайламиСлужебныйКлиент.ВозможностьОсвободитьФайл( - ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - СтрокаОшибки) Тогда - - ДанныеФайлов.Удалить(ВГраницаМассива - Инд); - КонецЕсли; - - КонецЦикла; - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); - - СоздатьНовуюВерсию = Истина; - СоздатьНовуюВерсиюДоступность = Истина; - - ВозвратМассив = Новый Массив; - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ФайлСсылка", Неопределено); - СтруктураПараметров.Вставить("КомментарийКВерсии", ""); - СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); - СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - - ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - - Результат = ФормаВозврата.ОткрытьМодально(); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат ВозвратМассив; - КонецЕсли; - - КодВозврата = Результат.КодВозврата; - Если КодВозврата <> КодВозвратаДиалога.ОК Тогда - Возврат ВозвратМассив; - КонецЕсли; - - СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; - КомментарийКВерсии = Результат.КомментарийКВерсии; - - ПрименитьКоВсем = Ложь; - ОсвобождатьФайлы = Истина; - - // Занять файлы. - Для Каждого Данные Из ДанныеФайлов Цикл - ПоказыватьОповещение = Ложь; - - РедактированиеЗакончено = РаботаСФайламиСлужебныйКлиент.ЗакончитьРедактирование( - Данные.Ссылка, - ИдентификаторФормы, - Данные.ХранитьВерсии, - Данные.РедактируетТекущийПользователь, - Данные.Редактирует, - Данные.АвторТекущейВерсии, - "", - СоздатьНовуюВерсию, - КомментарийКВерсии, - ПоказыватьОповещение, - ПрименитьКоВсем, - ОсвобождатьФайлы); - - Если РедактированиеЗакончено Тогда - ВозвратМассив.Добавить(Данные.Ссылка); - КонецЕсли; - - КонецЦикла; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Закончить редактирование файлов'"), - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Закончено редактирование файлов (%1 из %2).'"), - ВозвратМассив.Количество(), - МассивФайлов.Количество()), - БиблиотекаКартинок.Информация32); - - Возврат ВозвратМассив; - -КонецФункции diff --git a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl index fcb7ad6ba..b57efaead 100644 --- a/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиПереопределяемый/Module.bsl @@ -35,8 +35,8 @@ // ВерсииФайлов в конфигурации. // // Параметры: -// НовыйФайл - СправочникСсылка.Файлы - ссылка на новый файл, который надо заполнить -// ИсходныйФайл - СправочникСсылка.Файлы - ссылка на исходный файл, откуда надо скопировать реквизиты +// НовыйФайл - СправочникСcылка.Файлы - ссылка на новый файл, который надо заполнить +// ИсходныйФайл - СправочникСcылка.Файлы - ссылка на исходный файл, откуда надо скопировать реквизиты // Процедура ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл) Экспорт diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl index a2c7ca580..a8c629c1b 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебный/Module.bsl @@ -32,7 +32,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииДанныхОтГлавного"].Добавить( "РаботаСФайламиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда СерверныеОбработчики["СтандартныеПодсистемы.ФайловыеФункции\ПриДобавленииФайловВТомаПриРазмещении"].Добавить( "РаботаСФайламиСлужебный"); @@ -73,20 +73,24 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииИсключенийПоискаСсылок"].Добавить( "РаботаСФайламиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравПоЗначениямДоступа"].Добавить( + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов"].Добавить( "РаботаСФайламиСлужебный"); СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "РаботаСФайламиСлужебный"); - - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"].Добавить( - "РаботаСФайламиСлужебный"); КонецЕсли; СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( "РаботаСФайламиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + + СерверныеОбработчики["ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса\ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса"].Добавить( + "РаботаСФайламиСлужебный"); + + КонецЕсли; + КонецПроцедуры // Возвращает Истина, если это элемент данных, относящийся к подсистеме РаботаСФайлами @@ -113,6 +117,41 @@ //////////////////////////////////////////////////////////////////////////////// // Процедуры используемые при обмене данными +// Возвращает массив справочников, выступающих в роли владельцев файлов. +// +// Возвращаемое значение: Массив(ОбъектМетаданных). +// +Функция СправочникиФайлов() Экспорт + + Результат = Новый Массив(); + Результат.Добавить(Метаданные.Справочники.ВерсииФайлов); + Возврат Результат; + +КонецФункции + +// Возвращает массив объектов метаданных, которые используются для хранения +// двоичных данных файлов в информационной базе. +// +// Возвращаемое значение: Массив(ОбъектМетаданных). +// +Функция ОбъектыХраненияФайловИнформационнойБазе() Экспорт + + Результат = Новый Массив(); + Результат.Добавить(Метаданные.РегистрыСведений.ХранимыеФайлыВерсий); + Возврат Результат; + +КонецФункции + +// Возвращает расширение файла. +// +// Объект - СправочникОбъект. +// +Функция РасширениеФайла(Объект) Экспорт + + Возврат Объект.Расширение; + +КонецФункции + // Только для внутреннего использования // Процедура ПриОтправкеФайла(ЭлементДанных, ОтправкаЭлемента, Знач СозданиеНачальногоОбраза = Ложь, Получатель = Неопределено) Экспорт @@ -201,6 +240,24 @@ КонецПроцедуры +// Только для внутреннего использования +// +Процедура ВыгрузитьФайл(Знач ОбъектФайла, Знач ИмяНовогоФайла) Экспорт + + Если ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + ПолныйПуть = ФайловыеФункцииСлужебный.ПолныйПутьТома(ОбъектФайла.Том) + ОбъектФайла.ПутьКФайлу; + КопироватьФайл(ПолныйПуть, ИмяНовогоФайла); + + Иначе // Перечисления.ТипыХраненияФайлов.ВИнформационнойБаза + + АдресВоВременномХранилище = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуВоВременномХранилище(ОбъектФайла.Ссылка); + ПолучитьИзВременногоХранилища(АдресВоВременномХранилище).Записать(ИмяНовогоФайла); + + КонецЕсли; + +КонецПроцедуры + // Только для внутреннего использования // Процедура ПриПолученииФайла(ЭлементДанных, ПолучениеЭлемента) Экспорт @@ -283,6 +340,47 @@ КонецПроцедуры +// Только для внутреннего использования +// +Процедура ЗагрузитьФайл(Знач ОбъектФайла, Знач ПутьКФайлу) Экспорт + + ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу); + + Если ФайловыеФункцииСлужебный.ТипХраненияФайлов() = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске Тогда + + ПутьКФайлуНаТоме = ""; + СсылкаНаТом = Неопределено; + + // Добавление файла в один из томов (где есть свободное место). + ФайловыеФункцииСлужебный.ДобавитьНаДиск( + ДвоичныеДанные, + ПутьКФайлуНаТоме, + СсылкаНаТом, + ОбъектФайла.ДатаМодификацииУниверсальная, + ОбъектФайла.НомерВерсии, + ОбъектФайла.Наименование, + ОбъектФайла.Расширение, + ОбъектФайла.Размер, + ОбъектФайла.Зашифрован); + + ОбъектФайла.ПутьКФайлу = ПутьКФайлуНаТоме; + ОбъектФайла.Том = СсылкаНаТом; + ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВТомахНаДиске; + + ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + + Иначе + + ОбъектФайла.ДополнительныеСвойства.Вставить("ДвоичныеДанныеФайла", ДвоичныеДанные); + ОбъектФайла.ФайлХранилище = Новый ХранилищеЗначения(Неопределено); + ОбъектФайла.Том = Справочники.ТомаХраненияФайлов.ПустаяСсылка(); + ОбъектФайла.ПутьКФайлу = ""; + ОбъектФайла.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе; + + КонецЕсли; + +КонецПроцедуры + // Возвращает объекты, имеющие в наличии присоединенные (средствами подсистемы "Работа с файлами") файлы. // // Используется совместно с функцией ПрисоединенныеФайлы.СконвертироватьФайлыВПрисоединенные(). @@ -428,6 +526,36 @@ КонецПроцедуры +// Устанавливает пометку удаления всем версиям указанного файла. +Процедура ПометитьНаУдалениеВерсииФайла(Знач ФайлСсылка, Знач ВерсияИсключение) Экспорт + + ТекстЗапроса = + "ВЫБРАТЬ + | ВерсииФайлов.Ссылка КАК Ссылка + |ИЗ + | Справочник.ВерсииФайлов КАК ВерсииФайлов + |ГДЕ + | ВерсииФайлов.Владелец = &Владелец + | И НЕ ВерсииФайлов.ПометкаУдаления + | И ВерсииФайлов.Ссылка <> &Исключение"; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + Запрос.УстановитьПараметр("Владелец", ФайлСсылка); + Запрос.УстановитьПараметр("Исключение", ВерсияИсключение); + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + + ВерсияОбъект = Выборка.Ссылка.ПолучитьОбъект(); + ВерсияОбъект.ПометкаУдаления = Истина; + ВерсияОбъект.ДополнительныеСвойства.Вставить("КонвертацияФайлов", Истина); + ВерсияОбъект.Записать(); + + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -602,84 +730,81 @@ КонецПроцедуры -// Заполняет описания возможных прав, назначаемых по значениям доступа. +// Заполняет описания возможных прав, назначаемых для объектов, указанных типов. // // Параметры: // ВозможныеПрава - ТаблицаЗначений, содержащая поля, // описание которых см. в комментарии к функции -// РегистрыСведений.ПраваПоЗначениямДоступа.ВозможныеПрава(). +// РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). // -Процедура ПриЗаполненииВозможныхПравПоЗначениямДоступа(Знач ВозможныеПрава) Экспорт +Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт //////////////////////////////////////////////////////////// // Справочник.ПапкиФайлов - //////////////////////////////////////////////////////////// + + // Право "Чтение папок и файлов" Право = ВозможныеПрава.Добавить(); Право.ВладелецПрав = "Справочник.ПапкиФайлов"; - Право.Имя = "ЧтениеПапокИФайлов"; - Право.Синоним = НСтр("ru = 'Чтение папок и файлов'"); - Право.Сокращение = НСтр("ru = 'Чтение'"); - Право.Заголовок = НСтр("ru = 'Чт'"); + Право.Имя = "Чтение"; + Право.Заголовок = НСтр("ru = 'Чтение'"); + Право.Подсказка = НСтр("ru = 'Чтение папок и файлов'"); Право.НачальноеЗначение = Истина; - // Требуемая роль (одна из указанных) - Право.ТребуемаяРоль.Добавить("РаботаСПапкамиФайлов"); // Права для стандартных шаблонов ограничений доступа. - Право.ЧтениеВТаблицах.Добавить("Справочник.ПапкиФайлов"); - Право.ЧтениеВТаблицах.Добавить("Справочник.Файлы"); - Право.ЧтениеВТаблицах.Добавить("Справочник.ВерсииФайлов"); - Право.ЧтениеВТаблицах.Добавить("РегистрСведений.ХранимыеФайлыВерсий"); + Право.ЧтениеВТаблицах.Добавить("*"); + // Право "Изменение папок" Право = ВозможныеПрава.Добавить(); Право.ВладелецПрав = "Справочник.ПапкиФайлов"; - Право.Имя = "ДобавлениеПапокИФайлов"; - Право.Синоним = НСтр("ru = 'Добавление папок и файлов'"); - Право.Сокращение = НСтр("ru = 'Добавление'"); - Право.Заголовок = НСтр("ru = 'Доб'"); + Право.Имя = "ИзменениеПапок"; + Право.Заголовок = НСтр("ru = 'Изменение + |папок'"); + Право.Подсказка = НСтр("ru = 'Добавление, изменение и + |пометка удаления папок файлов'"); // Права, требуемые для этого права. - Право.ТребуемыеПрава.Добавить("ЧтениеПапокИФайлов"); - Право.ТребуемыеПрава.Добавить("ИзменениеПапокИФайлов"); - // Требуемая роль (одна из указанных). - Право.ТребуемаяРоль.Добавить("РаботаСПапкамиФайлов"); - // Права для стандартных шаблонов ограничений доступа. - Право.ДобавлениеВТаблицах.Добавить("Справочник.ПапкиФайлов"); - Право.ДобавлениеВТаблицах.Добавить("Справочник.Файлы"); - - Право = ВозможныеПрава.Добавить(); - Право.ВладелецПрав = "Справочник.ПапкиФайлов"; - Право.Имя = "ИзменениеПапокИФайлов"; - Право.Синоним = НСтр("ru = 'Изменение папок и файлов'"); - Право.Сокращение = НСтр("ru = 'Изменение'"); - Право.Заголовок = НСтр("ru = 'Изм'"); - // Требуемая роль (одна из указанных). - Право.ТребуемаяРоль.Добавить("РаботаСПапкамиФайлов"); - Право.ТребуемыеПрава.Добавить("ЧтениеПапокИФайлов"); + Право.ТребуемыеПрава.Добавить("Чтение"); // Права для стандартных шаблонов ограничений доступа. Право.ИзменениеВТаблицах.Добавить("Справочник.ПапкиФайлов"); - Право.ИзменениеВТаблицах.Добавить("Справочник.Файлы"); - Право.ИзменениеВТаблицах.Добавить("Справочник.ВерсииФайлов"); + // Право "Изменение файлов" Право = ВозможныеПрава.Добавить(); Право.ВладелецПрав = "Справочник.ПапкиФайлов"; - Право.Имя = "ПометкаУдаленияПапокИФайлов"; - Право.Синоним = НСтр("ru = 'Пометка удаления папок и файлов'"); - Право.Сокращение = НСтр("ru = 'Пометка удаления'"); - Право.Заголовок = НСтр("ru = 'ПомУд'"); + Право.Имя = "ИзменениеФайлов"; + Право.Заголовок = НСтр("ru = 'Изменение + |файлов'"); + Право.Подсказка = НСтр("ru = 'Изменение файлов в папке'"); // Права, требуемые для этого права. - Право.ТребуемыеПрава.Добавить("ЧтениеПапокИФайлов"); - Право.ТребуемыеПрава.Добавить("ИзменениеПапокИФайлов"); - // Требуемая роль (одна из указанных) - Право.ТребуемаяРоль.Добавить("РаботаСПапкамиФайлов"); + Право.ТребуемыеПрава.Добавить("Чтение"); + // Права для стандартных шаблонов ограничений доступа. + Право.ИзменениеВТаблицах.Добавить("*"); + + // Право "Добавление файлов" + Право = ВозможныеПрава.Добавить(); + Право.ВладелецПрав = "Справочник.ПапкиФайлов"; + Право.Имя = "ДобавлениеФайлов"; + Право.Заголовок = НСтр("ru = 'Добавление + |файлов'"); + Право.Подсказка = НСтр("ru = 'Добавление файлов в папку'"); + // Права, требуемые для этого права. + Право.ТребуемыеПрава.Добавить("ИзменениеФайлов"); + + // Право "Пометка удаления файлов" + Право = ВозможныеПрава.Добавить(); + Право.ВладелецПрав = "Справочник.ПапкиФайлов"; + Право.Имя = "ПометкаУдаленияФайлов"; + Право.Заголовок = НСтр("ru = 'Пометка + |удаления'"); + Право.Подсказка = НСтр("ru = 'Пометка удаления файлов в папке'"); + // Права, требуемые для этого права. + Право.ТребуемыеПрава.Добавить("ИзменениеФайлов"); Право = ВозможныеПрава.Добавить(); Право.ВладелецПрав = "Справочник.ПапкиФайлов"; Право.Имя = "УправлениеПравами"; - Право.Синоним = НСтр("ru = 'Управление правами папок файлов'"); - Право.Сокращение = НСтр("ru = 'Управление правами'"); - Право.Заголовок = НСтр("ru = 'Адм'"); + Право.Заголовок = НСтр("ru = 'Управление + |правами'"); + Право.Подсказка = НСтр("ru = 'Управление правами папки'"); // Права, требуемые для этого права. - Право.ТребуемыеПрава.Добавить("ЧтениеПапокИФайлов"); - // Требуемая роль (одна из указанных) - Право.ТребуемаяРоль.Добавить("РаботаСПапкамиФайлов"); + Право.ТребуемыеПрава.Добавить("Чтение"); КонецПроцедуры @@ -699,48 +824,42 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. +// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в +// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому +// ограничивается текущий объект таблицы. +// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, +// которые используются для этого вида доступа. Т.е. перечислить типы, +// которые соответствуют полю, использованному в шаблоне ограничения доступа +// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" +// нужно перечислить только те типы поля, которые есть у поля +// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт Описание = Описание + " - |Справочник.ПапкиФайлов.Чтение.ПапкиФайлов - |Справочник.ПапкиФайлов.Добавление.ПапкиФайлов - |Справочник.ПапкиФайлов.Изменение.ПапкиФайлов + |Справочник.ПапкиФайлов.Чтение.НастройкиПрав.Справочник.ПапкиФайлов + |Справочник.ПапкиФайлов.Изменение.НастройкиПрав.Справочник.ПапкиФайлов |Справочник.ВерсииФайлов.Чтение.Объект.Справочник.ПапкиФайлов + |Справочник.ВерсииФайлов.Изменение.Объект.Справочник.ПапкиФайлов |Справочник.Файлы.Чтение.Объект.Справочник.ПапкиФайлов - |Справочник.Файлы.Добавление.Объект.Справочник.ПапкиФайлов |Справочник.Файлы.Изменение.Объект.Справочник.ПапкиФайлов |РегистрСведений.ХранимыеФайлыВерсий.Чтение.Объект.Справочник.ПапкиФайлов |"; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда Описание = Описание + " |Справочник.ВерсииФайлов.Чтение.Объект.БизнесПроцесс.Задание |Справочник.Файлы.Чтение.Объект.БизнесПроцесс.Задание - |Справочник.Файлы.Добавление.Объект.БизнесПроцесс.Задание |Справочник.Файлы.Изменение.Объект.БизнесПроцесс.Задание |РегистрСведений.ХранимыеФайлыВерсий.Чтение.Объект.БизнесПроцесс.Задание |"; @@ -748,23 +867,6 @@ КонецПроцедуры -// Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. -// -// Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). -// -Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт - - Если Свойства.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].ПапкиФайлов Тогда - Свойства.Таблицы.Добавить("Справочник.ПапкиФайлов"); - Свойства.ВидДоступаЧерезПраваПоЗначениямДоступа = Истина; - КонецЕсли; - -КонецПроцедуры - // Используется для получения объектов метаданных, которые должны входить в состав плана обмена // и НЕ должны входить в состав подписок на события регистрации изменений для этого плана обмена. // Эти объекты метаданных используются только в момент создания начального образа подчиненного узла @@ -781,6 +883,18 @@ КонецПроцедуры +// Заполняет перечень обработчиков интеграции подсистемы +// "ТехнологияСервиса.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса" +// +// Параметры: +// Обработчики - Массив(Строка), имя общего модуля обработчика, +// +Процедура ПриЗаполненииОбработчиковИнтеграцииФайловыхФункцийВМоделиСервиса(Обработчики) Экспорт + + Обработчики.Добавить("РаботаСФайламиСлужебный"); + +КонецПроцедуры + ///////////////////////////////////////////////////////////////////////////////////////// // Работа с кодировками @@ -884,35 +998,59 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обработчики условных вызовов + +// Проверяет право текущего пользователя +// при использовании ограничения для папки или файла. +// +// Параметры: +// Папка - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы - Папка файлов. +// - СправочникСсылка - Владелец файлов. +// +// Места использования: +// РассылкаОтчетов.ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию(). +// Справочник.РассылкиОтчетов.Формы.ФормаЭлемента.ПравоИзмененияПапкиИФайлов(). +// +Функция ПравоДобавленияФайловВПапку(Папка) Экспорт + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + Возврат МодульУправлениеДоступом.ЕстьПраво("ДобавлениеФайлов", Папка); + КонецЕсли; + + Возврат Истина; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы -// Проверяет возможность пометки удаления для текущего пользователя +// Проверяет право текущего пользователя // при использовании ограничения для папки или файла. // // Параметры: -// Ссылка - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы, +// Право - Имя права. +// ВладелецПрав - СправочникСсылка.ПапкиФайлов, СправочникСсылка.Файлы, // <ссылка на владельца>. // -// ПометкаНаУдалениеРазрешена - Булево (возвращаемое значение). -// Начальное значение Истина. Если права нет нужно установить Ложь. -// -Процедура ПриОпределенииПраваПометкиУдаления(Ссылка, ПометкаНаУдалениеРазрешена) Экспорт +Функция ЕстьПраво(Право, ВладелецПрав) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - - Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.ПапкиФайлов") Тогда - - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); - Если НЕ МодульУправлениеДоступом.ЕстьПравоПоЗначениюДоступа("ПометкаУдаленияПапокИФайлов", Ссылка) Тогда - ПометкаНаУдалениеРазрешена = Ложь; - КонецЕсли; - - КонецЕсли; - + Если ТипЗнч(ВладелецПрав) <> Тип("СправочникСсылка.ПапкиФайлов") Тогда + Возврат Истина; КонецЕсли; -КонецПроцедуры + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + Если НЕ МодульУправлениеДоступом.ЕстьПраво(Право, ВладелецПрав) Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Возврат Истина; + +КонецФункции // Добавляет и удаляет записи в регистр сведений ОчередьИзвлеченияТекста при изменении // состояние извлечения текста версий файлов @@ -925,10 +1063,10 @@ // Процедура ПриОбновленииСостоянияОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда Если ОбщегоНазначения.ИспользованиеРазделителяСеанса() Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); МодульФайловыеФункцииСлужебныйВМоделиСервиса.ОбновитьСостояниеОчередиИзвлеченияТекста(ИсточникТекста, СостояниеИзвлеченияТекста); КонецЕсли; diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl index b6d8183e1..5e0b24cbb 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйВызовСервера/Module.bsl @@ -49,18 +49,18 @@ ВерсияОбъект = НовыйФайл.ТекущаяВерсия.ПолучитьОбъект(); ЧислоПодписей = 0; - Для Каждого Строка Из ИсходныйФайл.ТекущаяВерсия.ЭлектронныеЦифровыеПодписи Цикл - НоваяСтрока = ВерсияОбъект.ЭлектронныеЦифровыеПодписи.Добавить(); + Для Каждого Строка Из ИсходныйФайл.ТекущаяВерсия.ЭлектронныеПодписи Цикл + НоваяСтрока = ВерсияОбъект.ЭлектронныеПодписи.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); ЧислоПодписей = ЧислоПодписей + 1; КонецЦикла; Если ЧислоПодписей <> 0 Тогда ФайлОбъект = НовыйФайл.ПолучитьОбъект(); - ФайлОбъект.ПодписанЭЦП = Истина; + ФайлОбъект.ПодписанЭП = Истина; ФайлОбъект.Записать(); - ВерсияОбъект.ПодписанЭЦП = Истина; + ВерсияОбъект.ПодписанЭП = Истина; ВерсияОбъект.Записать(); КонецЕсли; @@ -84,8 +84,6 @@ КонецЕсли; - РаботаСФайламиВызовСервераПереопределяемый.ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл); - РаботаСФайламиПереопределяемый.ЗаполнитьРеквизитыФайлаИзИсходногоФайла(НовыйФайл, ИсходныйФайл); Возврат НовыйФайл; @@ -114,8 +112,6 @@ ФайлОбъект.Записать(); РазблокироватьДанныеДляРедактирования(ФайлОбъект.Ссылка, УникальныйИдентификатор); - РаботаСФайламиВызовСервераПереопределяемый.ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор); - РаботаСФайламиПереопределяемый.ПриОсвобожденииФайла(ДанныеФайла, УникальныйИдентификатор); КонецПроцедуры @@ -156,8 +152,6 @@ ДанныеФайла.НавигационнаяСсылкаТекущейВерсии = НавигационнаяСсылкаТекущейВерсии; ДанныеФайла.РабочийКаталогВладельца = РабочийКаталогВладельца; - РаботаСФайламиВызовСервераПереопределяемый.ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор); - РаботаСФайламиПереопределяемый.ПриЗахватеФайла(ДанныеФайла, УникальныйИдентификатор); Возврат Истина; @@ -1182,7 +1176,7 @@ Если НЕ ЭтоВебКлиент И Не НеМенятьЗаписьВРабочемКаталоге Тогда УдалитьИзРегистра(СтараяВерсия); НаЧтение = Ложь; - ЗаписатьИмяФайлаСПутемВРегистр(НоваяВерсия, ОтносительныйПутьКФайлу, НаЧтение, ВРабочемКаталогеВладельца); + ЗаписатьПолноеИмяФайлаВРегистр(НоваяВерсия, ОтносительныйПутьКФайлу, НаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; КонецЕсли; @@ -1410,12 +1404,12 @@ КонецЕсли; Если ВерсияСсылка <> Неопределено Тогда - ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Иначе - ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(Выборка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(Выборка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; - ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); ДанныеФайла.Вставить("ВРабочемКаталогеНаЧтение", ВРабочемКаталогеНаЧтение); ДанныеФайла.Вставить("РабочийКаталогВладельца", ""); @@ -1528,8 +1522,6 @@ ВызватьИсключение; КонецПопытки; - РаботаСФайламиВызовСервераПереопределяемый.ПриСозданииФайла(Док); - РаботаСФайламиПереопределяемый.ПриСозданииФайла(Док); Возврат Док; @@ -1688,18 +1680,18 @@ Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда - ИмяФайлаСПутемВРабочемКаталоге = ""; + ПолноеИмяФайлаВРабочемКаталоге = ""; ИмяКаталога = ""; // путь к локальному кеш здесь не используется ВРабочемКаталогеНаЧтение = Истина; // не используется ВРабочемКаталогеВладельца = Истина; Если ВерсияСсылка <> Неопределено Тогда - ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); Иначе - ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ФайлСсылка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ФайлСсылка.ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; - ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; Возврат ДанныеФайла; @@ -1773,8 +1765,8 @@ Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - ИмяФайлаСПутемВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; - ДанныеФайла.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутемВРабочемКаталоге); + ПолноеИмяФайлаВРабочемКаталоге = РабочийКаталогВладельца + ИмяФайла; + ДанныеФайла.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; ТипХраненияФайла = ДанныеФайла.Версия.ТипХраненияФайла; @@ -2205,14 +2197,14 @@ // ВРабочемКаталогеНаЧтение - Булево - файл помещен на чтение // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге) // -Функция ПолучитьИмяФайлаСПутемИзРегистра(Версия, +Функция ПолучитьПолноеИмяФайлаИзРегистра(Версия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) Экспорт УстановитьПривилегированныйРежим(Истина); - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; // Подготовить структуру отбора по измерениям СтруктураОтбора = Новый Структура; @@ -2223,14 +2215,14 @@ СтруктураРесурсов = РегистрыСведений.ФайлыВРабочемКаталоге.Получить(СтруктураОтбора); // Получить путь из регистра - ИмяФайлаСПутем = СтруктураРесурсов.Путь; + ПолноеИмяФайла = СтруктураРесурсов.Путь; ВРабочемКаталогеНаЧтение = СтруктураРесурсов.НаЧтение; ВРабочемКаталогеВладельца = СтруктураРесурсов.ВРабочемКаталогеВладельца; - Если ИмяФайлаСПутем <> "" И ВРабочемКаталогеВладельца = Ложь Тогда - ИмяФайлаСПутем = ИмяКаталога + ИмяФайлаСПутем; + Если ПолноеИмяФайла <> "" И ВРабочемКаталогеВладельца = Ложь Тогда + ПолноеИмяФайла = ИмяКаталога + ПолноеИмяФайла; КонецЕсли; - Возврат ИмяФайлаСПутем; + Возврат ПолноеИмяФайла; КонецФункции @@ -2245,7 +2237,7 @@ УстановитьПривилегированныйРежим(Истина); - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; // Подготовить структуру отбора по измерениям СтруктураОтбора = Новый Структура; @@ -2256,21 +2248,21 @@ СтруктураРесурсов = РегистрыСведений.ФайлыВРабочемКаталоге.Получить(СтруктураОтбора); // Получить путь из регистра - ИмяФайлаСПутем = СтруктураРесурсов.Путь; + ПолноеИмяФайла = СтруктураРесурсов.Путь; - Возврат ИмяФайлаСПутем; + Возврат ПолноеИмяФайла; КонецФункции // Записать в регистр сведений ФайлыВРабочемКаталоге информацию о пути файла // Параметры // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов - версия -// ИмяФайлаСПутем - имя с путем в рабочем каталоге +// ПолноеИмяФайла - имя с путем в рабочем каталоге // НаЧтение - Булево - файл помещен на чтение // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге) // -Процедура ЗаписатьИмяФайлаСПутемВРегистр(ТекущаяВерсия, - ИмяФайлаСПутем, +Процедура ЗаписатьПолноеИмяФайлаВРегистр(ТекущаяВерсия, + ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца) Экспорт @@ -2284,7 +2276,7 @@ НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Версия = ТекущаяВерсия.Ссылка; - НоваяЗапись.Путь = ИмяФайлаСПутем; + НоваяЗапись.Путь = ПолноеИмяФайла; НоваяЗапись.Размер = ТекущаяВерсия.Размер; НоваяЗапись.ДатаПомещенияВРабочийКаталог = ТекущаяДатаСеанса(); НоваяЗапись.Пользователь = Пользователи.ТекущийПользователь(); @@ -2400,11 +2392,11 @@ НаЧтение, РазмерФайла, ВРабочемКаталогеВладельца) Экспорт - ИмяФайлаСПутем = ПолныйПуть; + ПолноеИмяФайла = ПолныйПуть; Если ВРабочемКаталогеВладельца = Ложь Тогда Если Найти(ПолныйПуть, ИмяКаталога) = 1 Тогда - ИмяФайлаСПутем = Сред(ПолныйПуть, СтрДлина(ИмяКаталога) + 1); + ПолноеИмяФайла = Сред(ПолныйПуть, СтрДлина(ИмяКаталога) + 1); КонецЕсли; КонецЕсли; @@ -2418,7 +2410,7 @@ НоваяЗапись = НаборЗаписей.Добавить(); НоваяЗапись.Версия = Версия.Ссылка; - НоваяЗапись.Путь = ИмяФайлаСПутем; + НоваяЗапись.Путь = ПолноеИмяФайла; Если РазмерФайла <> 0 Тогда НоваяЗапись.Размер = РазмерФайла; @@ -3134,12 +3126,8 @@ // Процедура ЗаполнитьУсловноеОформлениеСпискаФайлов(Список) Экспорт - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - УсловноеОформлениеКД = Список.КомпоновщикНастроек.Настройки.УсловноеОформление; - УсловноеОформлениеКД.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; - Иначе - УсловноеОформлениеКД = Список.УсловноеОформление; - КонецЕсли; + УсловноеОформлениеКД = Список.КомпоновщикНастроек.Настройки.УсловноеОформление; + УсловноеОформлениеКД.ИдентификаторПользовательскойНастройки = "ОсновноеОформление"; Элемент = УсловноеОформлениеКД.Элементы.Добавить(); Элемент.Использование = Истина; @@ -3550,14 +3538,14 @@ Возврат ДанныеФайла; КонецФункции -// Возвращает ИспользоватьЭлектронныеЦифровыеПодписиИШифрование +// Возвращает ИспользоватьЭлектронныеПодписиИШифрование // Возвращаемое значение: -// Булево - константа ИспользоватьЭлектронныеЦифровыеПодписи -Функция ПолучитьИспользоватьЭлектронныеЦифровыеПодписиИШифрование() Экспорт +// Булево - константа ИспользоватьЭлектронныеПодписи +Функция ПолучитьИспользоватьЭлектронныеПодписиИШифрование() Экспорт УстановитьПривилегированныйРежим(Истина); - ИспользоватьЭлектронныеЦифровыеПодписиИШифрование = Константы.ИспользоватьЭлектронныеЦифровыеПодписи.Получить(); - Возврат ИспользоватьЭлектронныеЦифровыеПодписиИШифрование; + ИспользоватьЭлектронныеПодписиИШифрование = Константы.ИспользоватьЭлектронныеПодписи.Получить(); + Возврат ИспользоватьЭлектронныеПодписиИШифрование; КонецФункции @@ -3712,12 +3700,12 @@ АдресВременногоХранилищаТекстаТекущейВерсии = АдресВременногоХранилищаТекста; КонецЕсли; - ИмяФайлаСПутемВРабочемКаталоге = ""; + ПолноеИмяФайлаВРабочемКаталоге = ""; ВРабочемКаталогеНаЧтение = Истина; // не используется ВРабочемКаталогеВладельца = Истина; - ИмяФайлаСПутемВРабочемКаталоге = ПолучитьИмяФайлаСПутемИзРегистра(ВерсияСсылка, ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - Если НЕ ПустаяСтрока(ИмяФайлаСПутемВРабочемКаталоге) Тогда - МассивФайловВРабочемКаталогеДляУдаления.Добавить(ИмяФайлаСПутемВРабочемКаталоге); + ПолноеИмяФайлаВРабочемКаталоге = ПолучитьПолноеИмяФайлаИзРегистра(ВерсияСсылка, ИмяРабочегоКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + Если НЕ ПустаяСтрока(ПолноеИмяФайлаВРабочемКаталоге) Тогда + МассивФайловВРабочемКаталогеДляУдаления.Добавить(ПолноеИмяФайлаВРабочемКаталоге); КонецЕсли; УдалитьИзРегистра(ВерсияСсылка); @@ -3957,15 +3945,15 @@ ВерсияСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ТекущаяВерсия"); - Возврат ЭлектроннаяЦифроваяПодпись.ПолучитьВсеПодписи(ВерсияСсылка, УникальныйИдентификатор); + Возврат ЭлектроннаяПодпись.ПолучитьВсеПодписи(ВерсияСсылка, УникальныйИдентификатор); КонецФункции -// Заносит информацию о массиве ЭЦП +// Заносит информацию о массиве ЭП // // Параметры // МассивДанныхДляЗанесенияВБазу - Массив Структур - информация для занесения в табличную часть -// ЭлектронныеЦифровыеПодписи +// ЭлектронныеПодписи // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы Процедура ЗанестиИнформациюОПодписях(МассивДанныхДляЗанесенияВБазу, УникальныйИдентификатор = Неопределено) Экспорт @@ -4005,11 +3993,11 @@ КонецПроцедуры -// Заносит информацию о одной ЭЦП +// Заносит информацию о одной ЭП // // Параметры // Данные - Структура - информация для занесения в табличную часть -// ЭлектронныеЦифровыеПодписи +// ЭлектронныеПодписи // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы Процедура ЗанестиИнформациюОднойПодписи(Данные, УникальныйИдентификатор = Неопределено) Экспорт @@ -4036,10 +4024,10 @@ КонецПроцедуры -// Заносит информацию о подписи файла (добавляет запись в табл часть ЭЦП у версииФайла, и ставит реквизит ПодписанЭЦП версии и Файлу) +// Заносит информацию о подписи файла (добавляет запись в табл часть ЭП у версииФайла, и ставит реквизит ПодписанЭП версии и Файлу) // // Параметры -// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭП // НоваяПодписьДвоичныеДанные - ДвоичныеДанные - двоичные данные подписи // Отпечаток - Строка - Base64 закодированная строка с отпечатком сертификата подписавшего // ДатаПодписи - Дата - дата подписи @@ -4057,17 +4045,17 @@ НачатьТранзакцию(); Попытка - ЭлектроннаяЦифроваяПодпись.ЗанестиИнформациюОПодписи(ВерсияСсылка, + ЭлектроннаяПодпись.ЗанестиИнформациюОПодписи(ВерсияСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, ДвоичныеДанныеСертификата, УникальныйИдентификатор); - ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭЦП"); + ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭП"); Если ФайлСсылкаПодписан = Ложь Тогда ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); - ФайлОбъект.ПодписанЭЦП = Истина; + ФайлОбъект.ПодписанЭП = Истина; ФайлОбъект.Записать(); РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); @@ -4081,7 +4069,7 @@ КонецПроцедуры -// Удаляет записи из табличной части ЭЦП +// Удаляет записи из табличной части ЭП // // Параметры // ВерсияСсылка - СправочникСсылка.ВерсииФайлов - ссылка на версию файла @@ -4096,16 +4084,16 @@ Попытка КоличествоПодписей = 0; - ЭлектроннаяЦифроваяПодпись.УдалитьПодписи(ВерсияСсылка, ТаблицаВыделенныеСтроки, + ЭлектроннаяПодпись.УдалитьПодписи(ВерсияСсылка, ТаблицаВыделенныеСтроки, РеквизитПодписанИзменен, КоличествоПодписей, УникальныйИдентификатор); ФайлСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВерсияСсылка, "Владелец"); - ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭЦП"); + ФайлСсылкаПодписан = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ПодписанЭП"); Если ФайлСсылкаПодписан = Истина И КоличествоПодписей = 0 Тогда ФайлОбъект = ФайлСсылка.ПолучитьОбъект(); ЗаблокироватьДанныеДляРедактирования(ФайлСсылка, , УникальныйИдентификатор); - ФайлОбъект.ПодписанЭЦП = Ложь; + ФайлОбъект.ПодписанЭП = Ложь; ФайлОбъект.Записать(); РазблокироватьДанныеДляРедактирования(ФайлСсылка, УникальныйИдентификатор); КонецЕсли; @@ -4283,7 +4271,7 @@ // Строка - полный путь к файлу на диске Функция ПолучитьИмяФайлаСПутемКДвоичнымДанным(ВерсияСсылка, ПустойПутьДляПустыхДанных = Ложь) Экспорт - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; Если ВерсияСсылка.ТипХраненияФайла = Перечисления.ТипыХраненияФайлов.ВИнформационнойБазе Тогда @@ -4294,15 +4282,15 @@ Возврат ""; КонецЕсли; - ИмяФайлаСПутем = ПолучитьИмяВременногоФайла(ВерсияСсылка.Расширение); - ДвоичныеДанныеФайла.Записать(ИмяФайлаСПутем); + ПолноеИмяФайла = ПолучитьИмяВременногоФайла(ВерсияСсылка.Расширение); + ДвоичныеДанныеФайла.Записать(ПолноеИмяФайла); Иначе Если НЕ ВерсияСсылка.Том.Пустая() Тогда - ИмяФайлаСПутем = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; + ПолноеИмяФайла = ФайловыеФункцииСлужебный.ПолныйПутьТома(ВерсияСсылка.Том) + ВерсияСсылка.ПутьКФайлу; КонецЕсли; КонецЕсли; - Возврат ИмяФайлаСПутем; + Возврат ПолноеИмяФайла; КонецФункции @@ -4472,6 +4460,10 @@ Обработчик.Версия = "1.2.1.2"; Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаполнитьДатуЗаема"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РаботаСФайламиСлужебныйВызовСервера.ЗаменитьПраваВНастройкахПравПапокФайлов"; + КонецПроцедуры // В справочнике ВерсииФайлов из данных в Код(Строка) заполняет НомерВерсии(Число) @@ -4793,6 +4785,46 @@ КонецПроцедуры +// Переименовывает старые права в новые +Процедура ЗаменитьПраваВНастройкахПравПапокФайлов() Экспорт + + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); + + ТаблицаЗамены = МодульУправлениеДоступом.ТаблицаЗаменыПравВНастройкахПравОбъектов(); + + Строка = ТаблицаЗамены.Добавить(); + Строка.ТипВладельцев = Справочники.ПапкиФайлов.ПустаяСсылка(); + Строка.СтароеИмя = "ЧтениеПапокИФайлов"; + Строка.НовоеИмя = "Чтение"; + + Строка = ТаблицаЗамены.Добавить(); + Строка.ТипВладельцев = Справочники.ПапкиФайлов.ПустаяСсылка(); + Строка.СтароеИмя = "ДобавлениеПапокИФайлов"; + Строка.НовоеИмя = "ДобавлениеФайлов"; + + Строка = ТаблицаЗамены.Добавить(); + Строка.ТипВладельцев = Справочники.ПапкиФайлов.ПустаяСсылка(); + Строка.СтароеИмя = "ИзменениеПапокИФайлов"; + Строка.НовоеИмя = "ИзменениеФайлов"; + + Строка = ТаблицаЗамены.Добавить(); + Строка.ТипВладельцев = Справочники.ПапкиФайлов.ПустаяСсылка(); + Строка.СтароеИмя = "ИзменениеПапокИФайлов"; + Строка.НовоеИмя = "ИзменениеПапок"; + + Строка = ТаблицаЗамены.Добавить(); + Строка.ТипВладельцев = Справочники.ПапкиФайлов.ПустаяСсылка(); + Строка.СтароеИмя = "ПометкаУдаленияПапокИФайлов"; + Строка.НовоеИмя = "ПометкаУдаленияФайлов"; + + МодульУправлениеДоступом.ЗаменитьПраваВНастройкахПравОбъектов(ТаблицаЗамены); + +КонецПроцедуры + // Ставит файлу признак Зашифрован Процедура УстановитьПризнакЗашифрован(ФайлСсылка, Зашифрован, УникальныйИдентификатор = Неопределено) Экспорт diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl index 38ca48ae2..9b0527ff4 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиент/Module.bsl @@ -7,11 +7,19 @@ // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Открывает форму папки со списком файлов. +// +// Параметры: +// СтандартнаяОбработка - Булево - Передается "как есть" из параметров обработчика "Открытие". +// Папка - СправочникСсылка.Файлы - Открываемая папка. +// +// Места использования: +// Справочник.РассылкиОтчетов.Форма.ФормаЭлемента.ПапкаОткрытие(). +// Процедура РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Папка) Экспорт СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура("Папка", Папка); - ОткрытьФорму("Справочник.Файлы.Форма.ХранилищеФайлов", ПараметрыФормы, , Папка); + ОткрытьФорму("Справочник.Файлы.Форма.Файлы", ПараметрыФормы, , Папка); КонецПроцедуры @@ -24,7 +32,7 @@ Если ТипЗнч(Ответ) <> Тип("Структура") Тогда Возврат; - КонецЕсли; + КонецЕсли; // Инициализация формы индивидуального открытия и ее параметров. ПрикладнаяФормаПредупреждения = Неопределено; @@ -111,1009 +119,6 @@ КонецФункции -// Помечает файл, как занятый для редактирования. -// -// Параметры: -// ОбъектСсылка - СправочникСсылка.Файлы - файл. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Булево. Истина, если операция выполнена успешно. -// -Функция ЗанятьФайлПоСсылке(ОбъектСсылка, УникальныйИдентификатор = Неопределено) Экспорт - - Перем ДанныеФайла; - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - СтрокаОшибки = ""; - Если НЕ РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИЗанятьФайл( - ОбъектСсылка, ДанныеФайла, СтрокаОшибки, УникальныйИдентификатор) Тогда - - // Если занять нельзя, тогда выводится сообщение об ошибке. - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; - - Если РасширениеПодключено Тогда - НаЧтение = Ложь; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Редактирование файла'"), - ДанныеФайла.НавигационнаяСсылка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), - БиблиотекаКартинок.Информация32); - - Возврат Истина; - -КонецФункции - -// Помечает файлы, как занятые для редактирования. -// -// Параметры: -// МассивФайлов - Массив - массив файлов. -// -Процедура ЗанятьФайлыПоСсылкам(Знач МассивФайлов) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - // Получение массива данных файлов. - ДанныеФайлов = Новый Массив; - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); - ВГраницаМассива = ДанныеФайлов.ВГраница(); - - Для Инд = 0 По ВГраницаМассива Цикл - ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; - - СтрокаОшибки = ""; - Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) - ИЛИ НЕ ДанныеФайла.Редактирует.Пустая() Тогда // Занять невозможно. - - ДанныеФайлов.Удалить(ВГраницаМассива - Инд); - КонецЕсли; - КонецЦикла; - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - // Занять файлы. - КоличествоЗанятых = 0; - - Для Каждого ДанныеФайла Из ДанныеФайлов Цикл - - Если Не РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, "") Тогда - Продолжить; - КонецЕсли; - - Если РасширениеПодключено Тогда - НаЧтение = Ложь; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - КоличествоЗанятых = КоличествоЗанятых + 1; - КонецЦикла; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Занять файлы'"), - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файлы (%1 из %2) заняты для редактирования.'"), - КоличествоЗанятых, - МассивФайлов.Количество()), - БиблиотекаКартинок.Информация32); - -КонецПроцедуры - -// Открывает файл для редактирования. -// -// Параметры: -// ОбъектСсылка - СправочникСсылка.Файлы - файл. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// РабочийКаталогВладельца - Строка - рабочий каталог владельца. -// -// Возвращаемое значение: -// Булево. Истина, если операция выполнена успешно. -// -Функция РедактироватьФайлПоСсылке(ОбъектСсылка, - УникальныйИдентификатор = Неопределено, - РабочийКаталогВладельца = Неопределено) Экспорт - - Перем ДанныеФайла; - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - СтрокаОшибки = ""; - Если НЕ РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл(ОбъектСсылка, ДанныеФайла, - СтрокаОшибки, УникальныйИдентификатор, РабочийКаталогВладельца) Тогда - - СтандартнаяОбработка = Истина; - РаботаСФайламиКлиентПереопределяемый.ПриОшибкеЗахватаФайла(ДанныеФайла, СтандартнаяОбработка); - - Если СтандартнаяОбработка Тогда - // Если занять нельзя, тогда выводится сообщение об ошибке. - Предупреждение(СтрокаОшибки); - КонецЕсли; - - Возврат Ложь; - - КонецЕсли; - - Если РасширениеПодключено Тогда - НаЧтение = Ложь; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Редактирование файла'"), - ДанныеФайла.НавигационнаяСсылка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |занят для редактирования.'"), Строка(ДанныеФайла.Ссылка)), - БиблиотекаКартинок.Информация32); - - // Если Файл без файла, тогда открывается карточка. - Если ДанныеФайла.Версия.Пустая() Тогда - ОткрытьЗначение(ДанныеФайла.Ссылка); - Возврат Истина; - КонецЕсли; - - Если РасширениеПодключено Тогда - ПолноеИмяФайла = ""; - Результат = ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); - Если Результат Тогда - ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); - КонецЕсли; - Иначе - ФайловыеФункцииСлужебныйКлиент.ПоказатьНапоминаниеПриРедактировании(); - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); - - // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения - Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда - УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); - КонецЕсли; - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Открывает файл для редактирования. -// -// Параметры: -// ДанныеФайла - Структура с данными файла. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -Процедура РедактироватьФайл(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - СтрокаОшибки = ""; - Если НЕ РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - // Если Файл не занят, тогда занять файл. - Если ДанныеФайла.Редактирует.Пустая() Тогда - ЗанятьФайл(ДанныеФайла); - КонецЕсли; - - // Если Файл без файла, тогда открыть карточку. - Если ДанныеФайла.Версия.Пустая() Тогда - ОткрытьЗначение(ДанныеФайла.Ссылка); - Возврат; - КонецЕсли; - - Если РасширениеПодключено Тогда - ПолноеИмяФайла = ""; - - Результат = ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); - - Если Результат Тогда - ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); - КонецЕсли; - Иначе - ФайловыеФункцииСлужебныйКлиент.ПоказатьНапоминаниеПриРедактировании(); - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - ПолучитьФайл(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); - - // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения. - Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда - УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Открыть версию файла. -// -// Параметры: -// ДанныеФайла - Структура с данными файла. -// УникальныйИдентификатор - УникальныйИдентификатор формы. -// -Процедура ОткрытьВерсиюФайла(ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если РасширениеПодключено Тогда - ПолноеИмяФайла = ""; - - Результат = ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла, ПолноеИмяФайла, УникальныйИдентификатор); - - Если Результат Тогда - ОткрытьФайлПриложением(ДанныеФайла, ПолноеИмяФайла); - КонецЕсли; - Иначе - Адрес = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( - ДанныеФайла.Версия, УникальныйИдентификатор); - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - ПолучитьФайл(Адрес, ИмяФайла, Истина); - - // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения. - Если ЭтоАдресВременногоХранилища(Адрес) Тогда - УдалитьИзВременногоХранилища(Адрес); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Закончить редактирование Файла и поместить его на сервер. -// -// Параметры: -// ОбъектСсылка - СправочникСсылка.Файлы - файл. -// ИдентификаторФормы - УникальныйИдентификатор управляемой формы. -// ХранитьВерсии - Булево - хранить версии. -// -// РедактируетТекущийПользователь - Булево - файл редактирует текущий пользователь. -// -// Редактирует - СправочникСсылка.Пользователи - кто занял файл. -// АвторТекущейВерсии - СправочникСсылка.Пользователи - Автор текущей версии. -// -// ПереданныйПолныйПутьКФайлу - Строка - полный путь к файлу -// (вместо взятия пути из рабочего каталога). -// -// СоздатьНовуюВерсию - Булево - Создать новую версию. -// КомментарийКВерсии - Строка - Комментарий к версии. -// ПоказыватьОповещение - Булево - Показывать оповещение. -// ПрименитьКоВсем - Булево - Применить ко всем. -// ОсвобождатьФайлы - Булево - Освобождать файлы. -// -Функция ЗакончитьРедактирование(ОбъектСсылка, - ИдентификаторФормы, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - Знач АвторТекущейВерсии = Неопределено, - ПереданныйПолныйПутьКФайлу = "", - СоздатьНовуюВерсию = Неопределено, - КомментарийКВерсии = Неопределено, - ПоказыватьОповещение = Истина, - ПрименитьКоВсем = Ложь, - ОсвобождатьФайлы = Истина, - Кодировка = Неопределено) Экспорт - - Перем ДанныеФайла; - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если РасширениеПодключено Тогда - // Веб-клиент с расширением для работы с файлами, - // Тонкий клиент, - // Толстый клиент. - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ОбъектСсылка); - - // Проверка возможности освобождения. - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; - - ПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; - Если ПолныйПутьКФайлу = "" Тогда - - ПолныйПутьКФайлу = ФайловыеФункцииСлужебныйКлиент - .ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла); - КонецЕсли; - - // Проверка наличия файла на диске. - ФайлНовойВерсии = Новый Файл(ПолныйПутьКФайлу); - Если НЕ ФайлНовойВерсии.Существует() Тогда - - Если ПрименитьКоВсем = Ложь Тогда - - Если НЕ ПустаяСтрока(ПолныйПутьКФайлу) Тогда - СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл - |""%1"" (%2), - |в хранилище файлов, т.к. он не найден в рабочем каталоге. - | - |Освободить файл?'"), - Строка(ДанныеФайла.Ссылка), - ПолныйПутьКФайлу); - Иначе - СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл ""%1"", - |в хранилище файлов, т.к. он не найден в рабочем каталоге. - | - |Освободить файл?'"), - Строка(ДанныеФайла.Ссылка)); - СтрокаПредупреждения = СтрокаПредупреждения + "."; - КонецЕсли; - - Ответ = Вопрос(СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Да Тогда - ОсвобождатьФайлы = Истина; - Иначе - ОсвобождатьФайлы = Ложь; - КонецЕсли; - КонецЕсли; - - Если ОсвобождатьФайлы Тогда - ОсвободитьФайлБезВопроса(ДанныеФайла, ИдентификаторФормы); - Возврат Истина; - КонецЕсли; - - Возврат Ложь; - - КонецЕсли; - - Попытка - ТолькоЧтение = ФайлНовойВерсии.ПолучитьТолькоЧтение(); - ФайлНовойВерсии.УстановитьТолькоЧтение(НЕ ТолькоЧтение); - ФайлНовойВерсии.УстановитьТолькоЧтение(ТолькоЧтение); - Исключение - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл ""%1"", - |в хранилище файлов, т.к. он заблокирован другой программой.'"), - Строка(ДанныеФайла.Ссылка))); - - КонецПопытки; - - // Запрос комментария и признака хранения версии. - Если СоздатьНовуюВерсию = Неопределено Тогда - - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); - - СоздатьНовуюВерсию = Истина; - СоздатьНовуюВерсиюДоступность = Истина; - - Если ДанныеФайла.ХранитьВерсии Тогда - СоздатьНовуюВерсию = Истина; - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда - СоздатьНовуюВерсиюДоступность = Ложь; - Иначе - СоздатьНовуюВерсиюДоступность = Истина; - КонецЕсли; - Иначе - СоздатьНовуюВерсию = Ложь; - СоздатьНовуюВерсиюДоступность = Ложь; - КонецЕсли; - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); - СтруктураПараметров.Вставить("КомментарийКВерсии", ""); - СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); - СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - - ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - - Результат = ФормаВозврата.ОткрытьМодально(); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат Ложь; - КонецЕсли; - - КодВозврата = Результат.КодВозврата; - Если КодВозврата <> КодВозвратаДиалога.ОК Тогда - Возврат Ложь; - КонецЕсли; - - СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; - КомментарийКВерсии = Результат.КомментарийКВерсии; - - Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. - - Если ДанныеФайла.ХранитьВерсии Тогда - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда - СоздатьНовуюВерсию = Истина; - КонецЕсли; - - Иначе - СоздатьНовуюВерсию = Ложь; - КонецЕсли; - КонецЕсли; - - СтараяВерсия = ДанныеФайла.ТекущаяВерсия; - Интерактивно = Ложь; - - РазмерВМб = ФайлНовойВерсии.Размер() / (1024 * 1024); - ВремяИзменения = ФайлНовойВерсии.ПолучитьВремяИзменения(); - ВремяИзмененияУниверсальное = ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); - Размер = ФайлНовойВерсии.Размер(); - - // Файл с признаком шифрован снова шифруется для тех же сертификатов. - Если ДанныеФайла.Зашифрован Тогда - - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - - МассивСертификатов = Новый Массив; - - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Сертификат = Неопределено; - Если СтруктураСертификата.Сертификат <> Неопределено Тогда - Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат); - Иначе - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку( - СтруктураСертификата.Отпечаток); - КонецЕсли; - МассивСертификатов.Добавить(Сертификат); - - КонецЦикла; - - Если МассивСертификатов.Количество() = 0 Тогда - СтруктураВозврата = ВыбратьСертификатыДляШифрования(ДанныеФайла); - - Если ТипЗнч(СтруктураВозврата) = Тип("Массив") Тогда - МассивСертификатов = СтруктураВозврата; - - ЗаписатьСертификатыВТабличнуюЧасть( - ДанныеФайла.Ссылка, МассивСертификатов, ИдентификаторФормы); - Иначе - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - ИмяФайлаСПутемШифрованное = ПолныйПутьКФайлу + ".crp"; - - МенеджерКриптографии.Зашифровать( - ПолныйПутьКФайлу, ИмяФайлаСПутемШифрованное, МассивСертификатов); - - УдалитьФайл(ПолныйПутьКФайлу); - ПереместитьФайл(ИмяФайлаСПутемШифрованное, ПолныйПутьКФайлу); - КонецЕсли; - - Пока Истина Цикл - Попытка - АдресВременногоХранилища = ""; - ВыбранныйПутьКФайлу = ""; - - ИмяФайла = ФайлНовойВерсии.Имя; - - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - - ПомещаемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьКФайлу, ""); - ПомещаемыеФайлы.Добавить(Описание); - - ПомещенныеФайлы = Новый Массив; - - Если ПоместитьФайлы(ПомещаемыеФайлы, - ПомещенныеФайлы, - , - Интерактивно, - ИдентификаторФормы) Тогда - Состояние(); - - Если ПомещенныеФайлы.Количество() = 1 Тогда - АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; - КонецЕсли; - - ЭтоВебКлиент = Ложь; - - ТекстНеИзвлеченНаКлиенте = Ложь; - #Если ВебКлиент Тогда - ТекстНеИзвлеченНаКлиенте = Истина; - #КонецЕсли - - ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - - ИмяБезРасширения = ФайлНовойВерсии.ИмяБезРасширения; - Расширение = ФайлНовойВерсии.Расширение; - - Если НЕ ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда - - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ПолныйПутьКФайлу, ИдентификаторФормы, , Кодировка); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - НеМенятьЗаписьВРабочемКаталоге = Ложь; - Если ПереданныйПолныйПутьКФайлу <> "" Тогда - НеМенятьЗаписьВРабочемКаталоге = Истина; - КонецЕсли; - - ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьИОсвободитьФайл( - ДанныеФайла, - СоздатьНовуюВерсию, - АдресВременногоХранилища, - КомментарийКВерсии, - ВремяИзменения, - ВремяИзмененияУниверсальное, - Размер, - ИмяБезРасширения, - Расширение, - ПолныйПутьКФайлу, - АдресВременногоХранилищаТекста, - ЭтоВебКлиент, - ТекстНеИзвлеченНаКлиенте, - ВРабочемКаталогеВладельца, - НеМенятьЗаписьВРабочемКаталоге, - ИдентификаторФормы, - , - ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); - - НоваяВерсия = ДанныеФайла.ТекущаяВерсия; - - Если ПереданныйПолныйПутьКФайлу = "" Тогда - - УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = - ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; - - Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Неопределено Тогда - УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; - КонецЕсли; - - Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда - УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; - КонецЕсли; - - Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования Тогда - УдалитьФайлИзРабочегоКаталога(НоваяВерсия); - Иначе - Файл = Новый Файл(ПолныйПутьКФайлу); - Файл.УстановитьТолькоЧтение(Истина); - КонецЕсли; - КонецЕсли; - - Если ПоказыватьОповещение Тогда - - Если ВерсияОбновлена Тогда - ШаблонПояснения = НСтр("ru = 'Файл ""%1"" - |обновлен и освобожден.'"); - Иначе - ШаблонПояснения = НСтр("ru = 'Файл ""%1"" - |не изменился и освобожден.'"); - ПоказатьИнформациюФайлНеБылИзменен(); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Редактирование закончено'"), - ДанныеФайла.НавигационнаяСсылка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонПояснения, Строка(ДанныеФайла.Ссылка)), - БиблиотекаКартинок.Информация32); - КонецЕсли; - - // Удаление зашифрованного файла из кеша. - Если ДанныеФайла.Зашифрован Тогда - УдалитьФайл(ПолныйПутьКФайлу); - КонецЕсли; - - Возврат Истина; - Иначе - Состояние(); - Возврат Ложь; - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл ""%1"" - |в хранилище файлов по причине - |""%2"". - | - |Повторить операцию?'"), - Строка(ДанныеФайла.Ссылка), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - - КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); - - Если КодВозврата = КодВозвратаДиалога.Отмена Тогда - Возврат Ложь; - КонецЕсли; - - КонецПопытки; - КонецЦикла; - - Иначе // Веб-клиент без расширения для работы с файлами. - - Если ХранитьВерсии = Неопределено Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ОбъектСсылка); - - ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - Редактирует = ДанныеФайла.Редактирует; - АвторТекущейВерсии = ДанныеФайла.АвторТекущейВерсии; - Кодировка = ДанныеФайла.КодировкаТекущейВерсии; - КонецЕсли; - - // Проверка возможности освобождения файла. - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, - РедактируетТекущийПользователь, - Редактирует, - СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; - - ПолныйПутьКФайлу = ""; - - Если СоздатьНовуюВерсию = Неопределено Тогда - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); - - СоздатьНовуюВерсию = Истина; - СоздатьНовуюВерсиюДоступность = Истина; - - Если ХранитьВерсии Тогда - СоздатьНовуюВерсию = Истина; - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если АвторТекущейВерсии <> Редактирует Тогда - СоздатьНовуюВерсиюДоступность = Ложь; - Иначе - СоздатьНовуюВерсиюДоступность = Истина; - КонецЕсли; - Иначе - СоздатьНовуюВерсию = Ложь; - СоздатьНовуюВерсиюДоступность = Ложь; - КонецЕсли; - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ФайлСсылка", ОбъектСсылка); - СтруктураПараметров.Вставить("КомментарийКВерсии", ""); - СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); - СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - - ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - - Результат = ФормаВозврата.ОткрытьМодально(); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат Ложь; - КонецЕсли; - - КодВозврата = Результат.КодВозврата; - Если КодВозврата <> КодВозвратаДиалога.ОК Тогда - Возврат Ложь; - КонецЕсли; - - СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; - КомментарийКВерсии = Результат.КомментарийКВерсии; - - Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. - - Если ХранитьВерсии Тогда - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если АвторТекущейВерсии <> Редактирует Тогда - СоздатьНовуюВерсию = Истина; - КонецЕсли; - - Иначе - СоздатьНовуюВерсию = Ложь; - КонецЕсли; - - КонецЕсли; - - Интерактивно = Истина; - - Пока Истина Цикл - Попытка - АдресВременногоХранилища = ""; - ВыбранныйПутьКФайлу = ""; - ПоказатьНапоминаниеПередПоместитьФайл(); - - Если ПоместитьФайл(АдресВременногоХранилища, - ПолныйПутьКФайлу, - ВыбранныйПутьКФайлу, - Интерактивно, - ИдентификаторФормы) Тогда - - АдресВременногоХранилищаТекста = ""; - ИмяБезРасширения = ""; - Расширение = ""; - - ЭтоВебКлиент = Истина; - - ТекстНеИзвлеченНаКлиенте = Ложь; - #Если ВебКлиент Тогда - ТекстНеИзвлеченНаКлиенте = Истина; - #КонецЕсли - - ВремяИзменения = Дата('00010101'); // Т.к. невозможно получить дату изменения файла на диске. - ВремяИзмененияУниверсальное = Дата('00010101'); - Размер = 0; // Т.к. невозможно получить размер файла на диске. - - СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); - - Если СтрокиПути.Количество() >= 2 Тогда - Расширение = СтрокиПути[СтрокиПути.Количество()-1]; - ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; - КонецЕсли; - - ВерсияОбновлена = - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОпубликоватьИОсвободитьФайл( - ОбъектСсылка, - ДанныеФайла, - СоздатьНовуюВерсию, - АдресВременногоХранилища, - КомментарийКВерсии, - ВремяИзменения, - ВремяИзмененияУниверсальное, - Размер, - ИмяБезРасширения, - Расширение, - ПолныйПутьКФайлу, - АдресВременногоХранилищаТекста, - ЭтоВебКлиент, - ТекстНеИзвлеченНаКлиенте, - ИдентификаторФормы, - ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); - - НоваяВерсия = ДанныеФайла.ТекущаяВерсия; - - Если ПоказыватьОповещение Тогда - - Если ВерсияОбновлена Тогда - ШаблонПояснения = НСтр("ru = 'Файл ""%1"" - |обновлен и освобожден.'"); - Иначе - ШаблонПояснения = НСтр("ru = 'Файл ""%1"" - |не изменился и освобожден.'"); - ПоказатьИнформациюФайлНеБылИзменен(); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Редактирование закончено'"), - ДанныеФайла.НавигационнаяСсылка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонПояснения, Строка(ДанныеФайла.Ссылка)), - БиблиотекаКартинок.Информация32); - КонецЕсли; - - Возврат Истина; - Иначе - Возврат Ложь; - КонецЕсли; - - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл ""%1"" - |в хранилище файлов по причине - |""%2"". - | - |Повторить операцию?'"), - Строка(ОбъектСсылка), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - - КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); - - Если КодВозврата = КодВозвратаДиалога.Отмена Тогда - Возврат Ложь; - КонецЕсли; - - КонецПопытки; - КонецЦикла; - - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Освобождает файлы без обновления. -// -// Параметры: -// МассивФайлов - Массив - массив файлов -// -Процедура ОсвободитьФайлыПоСсылкам(Знач МассивФайлов) Экспорт - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - // Получение массива данных файлов. - ДанныеФайлов = Новый Массив; - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); - ВГраницаМассива = ДанныеФайлов.ВГраница(); - - Для Инд = 0 По ВГраницаМассива Цикл - ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; - - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - СтрокаОшибки) Тогда - - ДанныеФайлов.Удалить(ВГраницаМассива - Инд); - КонецЕсли; - - КонецЦикла; - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Результат = Вопрос( - НСтр("ru = 'Отмена редактирования файлов может - |привести к потере Ваших изменений. - | - |Продолжить?'"), - РежимДиалогаВопрос.ДаНет, - , - КодВозвратаДиалога.Нет); - - Если Результат <> КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - - // Занятие файлов. - Для Каждого ДанныеФайла Из ДанныеФайлов Цикл - - НеЗадаватьВопрос = Истина; - - ОсвободитьФайл( - ДанныеФайла.Ссылка, - ДанныеФайла.ХранитьВерсии, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - Неопределено, - НеЗадаватьВопрос); - КонецЦикла; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Отменить редактирование файлов'"), - , - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отменено редактирование файлов (%1 из %2).'"), - ДанныеФайлов.Количество(), - МассивФайлов.Количество()), - БиблиотекаКартинок.Информация32); - -КонецПроцедуры - -// Освобождает файл без обновления. -// -// Параметры: -// ОбъектСсылка - СправочникСсылка.Файлы - файл. -// ХранитьВерсии - Булево - хранить версии. -// -// РедактируетТекущийПользователь - Булево - файл редактирует текущий пользователь. -// -// Редактирует - СправочникСсылка.Пользователи - кто занял файл. -// УникальныйИдентификатор - УникальныйИдентификатор управляемой формы. -// -// НеЗадаватьВопрос - Булево - Не задавать вопрос "Отмена редактирования файла -// может привести к потере Ваших изменений. Продолжить?". -// -// Возвращаемое значение: -// Булево. Истина, если операция выполнена успешно. -// -Функция ОсвободитьФайл(ОбъектСсылка, - Знач ХранитьВерсии = Неопределено, - Знач РедактируетТекущийПользователь = Неопределено, - Знач Редактирует = Неопределено, - УникальныйИдентификатор = Неопределено, - НеЗадаватьВопрос = Ложь) Экспорт - - Перем ДанныеФайла; - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - Если ХранитьВерсии = Неопределено Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ОбъектСсылка); - - ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - Редактирует = ДанныеФайла.Редактирует; - КонецЕсли; - - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, - РедактируетТекущийПользователь, - Редактирует, - СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; - - ПродолжитьРаботу = Истина; - - Если НеЗадаватьВопрос = Ложь Тогда - - Результат = Вопрос(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Отмена редактирования файла - |""%1"" - |может привести к потере ваших изменений. - | - |Продолжить?'"), - Строка(ОбъектСсылка)), - РежимДиалогаВопрос.ДаНет, - , - КодВозвратаДиалога.Нет); - - Если Результат <> КодВозвратаДиалога.Да Тогда - ПродолжитьРаботу = Ложь; - КонецЕсли; - - КонецЕсли; - - Если ПродолжитьРаботу Тогда - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОсвободитьФайл( - ОбъектСсылка, ДанныеФайла, УникальныйИдентификатор); - - Если РасширениеПодключено Тогда - НаЧтение = Истина; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - Если Не НеЗадаватьВопрос Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл освобожден'"), - ДанныеФайла.НавигационнаяСсылка, - ДанныеФайла.ПолноеНаименованиеВерсии, - БиблиотекаКартинок.Информация32); - КонецЕсли; - - КонецЕсли; - - Возврат Истина; - -КонецФункции - // Освобождает файл без обновления. // // Параметры: @@ -1139,83 +144,6 @@ КонецПроцедуры -// Освобождает файлы без обновления. -// -// Параметры: -// ОбъектыСсылка - Массив - массив файлов. -// -Процедура ОсвободитьФайлы(ОбъектыСсылка) Экспорт - - СписокНевозможноОсвободить = Новый СписокЗначений; - - // Получение массива данных Файлов. - ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ОбъектыСсылка); - ВГраницаМассива = ДанныеФайлов.ВГраница(); - - Для Инд = 0 По ВГраницаМассива Цикл - ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; - - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл( - ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - СтрокаОшибки) Тогда // Освободить невозможно. - - СписокНевозможноОсвободить.Добавить(ДанныеФайла.Ссылка, СтрокаОшибки); - ДанныеФайлов.Удалить(ВГраницаМассива - Инд); - КонецЕсли; - КонецЦикла; - - // Если освободить нельзя, тогда открывается диалог. - Если СписокНевозможноОсвободить.Количество() > 0 Тогда - - Если НЕ ДиалогВопросаСоСписком( - СписокНевозможноОсвободить, - НСтр("ru = 'Освободить остальные файлы?'"), - НСтр("ru = 'При попытке освободить файлы возникли следующие ошибки:'"), - НСтр("ru = 'Освободить файлы'")) Тогда - - Возврат; - КонецЕсли; - Иначе - Ответ = Вопрос( - НСтр("ru = 'Освобождение файлов может привести - |к потере ваших изменений. - | - |Освободить файлы?'"), - РежимДиалогаВопрос.ДаНет, - , - КодВозвратаДиалога.Нет); - - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - // Освобождение файлов. - Для Каждого ДанныеФайла Из ДанныеФайлов Цикл - - РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла); - - Если РасширениеПодключено Тогда - НаЧтение = Истина; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Файл освобожден'"), - ДанныеФайла.НавигационнаяСсылка, - ДанныеФайла.ПолноеНаименованиеВерсии, - БиблиотекаКартинок.Информация32); - - КонецЦикла; - -КонецПроцедуры - // Перемещает файлы в указанную папку. // // Параметры: @@ -1244,40 +172,1815 @@ КонецПроцедуры -// Публикует файлы. +//////////////////////////////////////////////////////////////////////////////// +// Завершение редактирования Файла и помещение его на сервер. + +// Закончить редактирование Файла и поместить его на сервер. // // Параметры: -// МассивФайлов - Массив - массив файлов -// ИдентификаторФормы - УникальныйИдентификатор управляемой формы. +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ОбъектСсылка - СправочникСсылка.Файлы - файл. +// ИдентификаторФормы - УникальныйИдентификатор управляемой формы. +// ХранитьВерсии - Булево - хранить версии. // -Процедура ОпубликоватьФайлыПоСсылкам(Знач МассивФайлов, ИдентификаторФормы) Экспорт +// РедактируетТекущийПользователь - Булево - файл редактирует текущий пользователь. +// +// Редактирует - СправочникСсылка.Пользователи - кто занял файл. +// АвторТекущейВерсии - СправочникСсылка.Пользователи - Автор текущей версии. +// +// ПереданныйПолныйПутьКФайлу - Строка - полный путь к файлу +// (вместо взятия пути из рабочего каталога). +// +// СоздатьНовуюВерсию - Булево - Создать новую версию. +// КомментарийКВерсии - Строка - Комментарий к версии. +// ПоказыватьОповещение - Булево - Показывать оповещение. +// ПрименитьКоВсем - Булево - Применить ко всем. +// ОсвобождатьФайлы - Булево - Освобождать файлы. +// +// Возвращаемое значение: +// Булево. Истина, если операция выполнена успешно. +// +Процедура ЗакончитьРедактирование(ОбработчикРезультата, + ОбъектСсылка, + ИдентификаторФормы, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + Знач АвторТекущейВерсии = Неопределено, + ПереданныйПолныйПутьКФайлу = "", + СоздатьНовуюВерсию = Неопределено, + КомментарийКВерсии = Неопределено, + ПоказыватьОповещение = Истина, + ПрименитьКоВсем = Ложь, + ОсвобождатьФайлы = Истина, + Кодировка = Неопределено) Экспорт - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыОбработчика.Вставить("ХранитьВерсии", ХранитьВерсии); + ПараметрыОбработчика.Вставить("РедактируетТекущийПользователь", РедактируетТекущийПользователь); + ПараметрыОбработчика.Вставить("Редактирует", Редактирует); + ПараметрыОбработчика.Вставить("АвторТекущейВерсии", АвторТекущейВерсии); + ПараметрыОбработчика.Вставить("ПереданныйПолныйПутьКФайлу", ПереданныйПолныйПутьКФайлу); + ПараметрыОбработчика.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); + ПараметрыОбработчика.Вставить("КомментарийКВерсии", КомментарийКВерсии); + ПараметрыОбработчика.Вставить("ПоказыватьОповещение", ПоказыватьОповещение); + ПараметрыОбработчика.Вставить("ПрименитьКоВсем", ПрименитьКоВсем); + ПараметрыОбработчика.Вставить("ОсвобождатьФайлы", ОсвобождатьФайлы); + ПараметрыОбработчика.Вставить("Кодировка", Кодировка); + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения); + Иначе + ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения); + КонецЕсли; +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширением(ПараметрыВыполнения) + // Веб-клиент с расширением для работы с файлами, + // Тонкий клиент, + // Толстый клиент. + + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ОбъектСсылка); + + // Проверка возможности освобождения файла. + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь, + ПараметрыВыполнения.ДанныеФайла.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу); + Если ПараметрыВыполнения.ПолныйПутьКФайлу = "" Тогда + ПараметрыВыполнения.ПолныйПутьКФайлу = ФайловыеФункцииСлужебныйКлиент + .ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла); + КонецЕсли; + + // Проверка наличия файла на диске. + ПараметрыВыполнения.Вставить("ФайлНовойВерсии", Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу)); + Если Не ПараметрыВыполнения.ФайлНовойВерсии.Существует() Тогда + Если ПараметрыВыполнения.ПрименитьКоВсем = Ложь Тогда + Если Не ПустаяСтрока(ПараметрыВыполнения.ПолныйПутьКФайлу) Тогда + СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось поместить файл + |""%1"" (%2), + |в хранилище файлов, т.к. он не найден в рабочем каталоге. + | + |Освободить файл?'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), + ПараметрыВыполнения.ПолныйПутьКФайлу); + Иначе + СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось поместить файл ""%1"", + |в хранилище файлов, т.к. он не найден в рабочем каталоге. + | + |Освободить файл?'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); + СтрокаПредупреждения = СтрокаПредупреждения + "."; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); + Иначе + ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл(-1, ПараметрыВыполнения) + КонецЕсли; + + Возврат; + КонецЕсли; + + Попытка + ТолькоЧтение = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьТолькоЧтение(); + ПараметрыВыполнения.ФайлНовойВерсии.УстановитьТолькоЧтение(Не ТолькоЧтение); + ПараметрыВыполнения.ФайлНовойВерсии.УстановитьТолькоЧтение(ТолькоЧтение); + Исключение + ТекстОшибки = НСтр("ru = 'Не удалось поместить файл ""%1"" в хранилище файлов, + |возможно он заблокирован другой программой.'"); + ТекстОшибки = СтрЗаменить(ТекстОшибки, "%1", Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); + ВызватьИсключение ТекстОшибки + Символы.ПС + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); + КонецПопытки; + + // Запрос комментария и признака хранения версии. + Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла(); + + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + СоздатьНовуюВерсиюДоступность = Истина; + + Если ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии <> ПараметрыВыполнения.ДанныеФайла.Редактирует Тогда + СоздатьНовуюВерсиюДоступность = Ложь; + Иначе + СоздатьНовуюВерсиюДоступность = Истина; + КонецЕсли; + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Ложь; + КонецЕсли; + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ДанныеФайла.Ссылка); + СтруктураПараметров.Вставить("КомментарийКВерсии", ""); + СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); + СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); + + ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); + + ФормаВозврата.Открыть(); + + Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. + + Если ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии Тогда + + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии <> ПараметрыВыполнения.ДанныеФайла.Редактирует Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ <> -1 Тогда + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыВыполнения.ОсвобождатьФайлы = Истина; + Иначе + ПараметрыВыполнения.ОсвобождатьФайлы = Ложь; + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ОсвобождатьФайлы Тогда + ОсвободитьФайлБезВопроса(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + КонецЕсли; +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; + + ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения) Экспорт + + СтараяВерсия = ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия; + + // Файл с признаком шифрован снова шифруется для тех же сертификатов. + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + ПараметрыВыполнения.Вставить("МенеджерКриптографии", ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии()); + ПараметрыВыполнения.Вставить("МассивСертификатов", Новый Массив); + + Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл + Сертификат = Неопределено; + Если СтруктураСертификата.Сертификат <> Неопределено Тогда + Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат); + Иначе + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку( + СтруктураСертификата.Отпечаток); + КонецЕсли; + ПараметрыВыполнения.МассивСертификатов.Добавить(Сертификат); + КонецЦикла; + + Если ПараметрыВыполнения.МассивСертификатов.Количество() = 0 Тогда + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеВыбораСертификатовДляШифрования", ЭтотОбъект, ПараметрыВыполнения); + ВыбратьСертификатыДляШифрования(Обработчик, ПараметрыВыполнения.ДанныеФайла); + Возврат; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеВыбораСертификатовДляШифрования(МассивСертификатов, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(МассивСертификатов) <> Тип("Массив") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.МассивСертификатов = МассивСертификатов; + + ЗаписатьСертификатыВТабличнуюЧасть( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.МассивСертификатов, + ПараметрыВыполнения.ИдентификаторФормы); + + ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения) + + ПолноеИмяФайлаШифрованное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".crp"; + + ПараметрыВыполнения.МенеджерКриптографии.Зашифровать( + ПараметрыВыполнения.ПолныйПутьКФайлу, ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.МассивСертификатов); + + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолныйПутьКФайлу); + ПереместитьФайл(ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.ПолныйПутьКФайлу); + + ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения) + + Интерактивно = Ложь; + ТекстОшибки = ""; + АдресВременногоХранилища = ""; + ВыбранныйПутьКФайлу = ""; + + ИмяФайла = ПараметрыВыполнения.ФайлНовойВерсии.Имя; + РазмерВМб = ПараметрыВыполнения.ФайлНовойВерсии.Размер() / (1024 * 1024); + ВремяИзменения = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); + Размер = ПараметрыВыполнения.ФайлНовойВерсии.Размер(); + + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + + Состояние(ТекстПояснения); + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + ФайлыПомещены = ПоместитьФайлы( + ПомещаемыеФайлы, + ПомещенныеФайлы, + , + Интерактивно, + ПараметрыВыполнения.ИдентификаторФормы); + Состояние(); + Если Не ФайлыПомещены Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + ЭтоВебКлиент = Ложь; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + + ИмяБезРасширения = ПараметрыВыполнения.ФайлНовойВерсии.ИмяБезРасширения; + Расширение = ПараметрыВыполнения.ФайлНовойВерсии.Расширение; + + Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда + Попытка + АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ПараметрыВыполнения.ПолныйПутьКФайлу, + ПараметрыВыполнения.ИдентификаторФормы, + , + ПараметрыВыполнения.Кодировка); + Исключение + ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); + Возврат; + КонецПопытки; + Иначе + АдресВременногоХранилищаТекста = ""; + КонецЕсли; + + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + + НеМенятьЗаписьВРабочемКаталоге = Ложь; + Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу <> "" Тогда + НеМенятьЗаписьВРабочемКаталоге = Истина; + КонецЕсли; + + Попытка + ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьИОсвободитьФайл( + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.СоздатьНовуюВерсию, + АдресВременногоХранилища, + ПараметрыВыполнения.КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПараметрыВыполнения.ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + ПараметрыВыполнения.ИдентификаторФормы, + , + ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + Исключение + ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке(), ПараметрыВыполнения); + Возврат; + КонецПопытки; + + ПараметрыВыполнения.Вставить("ВерсияОбновлена", ВерсияОбновлена); + НоваяВерсия = ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия; + + Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу = "" Тогда + + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = + ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( + ).УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования; + + Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Неопределено Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; + КонецЕсли; + + Если ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "" Тогда + УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования = Ложь; + КонецЕсли; + + Если УдалятьФайлИзЛокальногоКэшаФайловПриЗавершенииРедактирования Тогда + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); + УдалитьФайлИзРабочегоКаталога(Обработчик, НоваяВерсия); + Возврат; + Иначе + Файл = Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу); + Файл.УстановитьТолькоЧтение(Истина); + КонецЕсли; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеУдаленияФайлаИзРабочегоКаталога(Результат, ПараметрыВыполнения) Экспорт + + Если ПараметрыВыполнения.ПоказыватьОповещение Тогда + Если ПараметрыВыполнения.ВерсияОбновлена Тогда + ШаблонПояснения = НСтр("ru = 'Файл ""%1"" + |обновлен и освобожден.'"); + Иначе + ШаблонПояснения = НСтр("ru = 'Файл ""%1"" + |не изменился и освобожден.'"); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование закончено'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПояснения, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + Если Не ПараметрыВыполнения.ВерсияОбновлена Тогда + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьИнформациюФайлНеБылИзменен(Обработчик); + Возврат; + КонецЕсли; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + + // Удаление зашифрованного файла из кеша. + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолныйПутьКФайлу); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемОбработкаИсключения(ИнформацияОбОшибке, ПараметрыВыполнения) + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось поместить файл ""%1"" + |в хранилище файлов по причине + |""%2"". + | + |Повторить операцию?'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ПовторитьОтмена); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСРасширениемПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ЗакончитьРедактированиеСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширения(ПараметрыВыполнения) + // Веб-клиент без расширения для работы с файлами. + + Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ПараметрыВыполнения.ОбъектСсылка); + + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; + ПараметрыВыполнения.Кодировка = ПараметрыВыполнения.ДанныеФайла.КодировкаТекущейВерсии; + КонецЕсли; + + // Проверка возможности освобождения файла. + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", ""); + + Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла(); + + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + СоздатьНовуюВерсиюДоступность = Истина; + + Если ПараметрыВыполнения.ХранитьВерсии Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда + СоздатьНовуюВерсиюДоступность = Ложь; + Иначе + СоздатьНовуюВерсиюДоступность = Истина; + КонецЕсли; + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Ложь; + КонецЕсли; + + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ОбъектСсылка); + СтруктураПараметров.Вставить("КомментарийКВерсии", ""); + СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); + СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); + + ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); + + ФормаВозврата.Открыть(); + + Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. + + Если ПараметрыВыполнения.ХранитьВерсии Тогда + + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + КонецЕсли; + + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) + + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; + + ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Экспорт + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьНапоминаниеПередПоместитьФайл(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); + СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Обработчик, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ПолныйПутьКФайлу, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт + + Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ОписаниеПереданногоФайла = ПомещенныеФайлы[0]; + ВыбранныйПутьКФайлу = ОписаниеПереданногоФайла.Имя; + АдресВременногоХранилища = ОписаниеПереданногоФайла.Хранение; + + АдресВременногоХранилищаТекста = ""; + ИмяБезРасширения = ""; + Расширение = ""; + + ЭтоВебКлиент = Истина; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ВремяИзменения = Дата('00010101'); // Т.к. невозможно получить дату изменения файла на диске. + ВремяИзмененияУниверсальное = Дата('00010101'); + Размер = 0; // Т.к. невозможно получить размер файла на диске. + + СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); + + Если СтрокиПути.Количество() >= 2 Тогда + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + КонецЕсли; + + ИнформацияОбОшибке = Неопределено; + Попытка + ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОпубликоватьИОсвободитьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.СоздатьНовуюВерсию, + АдресВременногоХранилища, + ПараметрыВыполнения.КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + Размер, + ИмяБезРасширения, + Расширение, + ПараметрыВыполнения.ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ПараметрыВыполнения.ИдентификаторФормы, + ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + КонецПопытки; + Если ИнформацияОбОшибке <> Неопределено Тогда + ЗакончитьРедактированиеОбработчикИсключения(ИнформацияОбОшибке, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + НоваяВерсия = ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия; + + Если ПараметрыВыполнения.ПоказыватьОповещение Тогда + Если ВерсияОбновлена Тогда + ШаблонПояснения = НСтр("ru = 'Файл ""%1"" + |обновлен и освобожден.'"); + Иначе + ШаблонПояснения = НСтр("ru = 'Файл ""%1"" + |не изменился и освобожден.'"); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование закончено'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонПояснения, Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + Если Не ПараметрыВыполнения.ВерсияОбновлена Тогда + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьИнформациюФайлНеБылИзменен(Обработчик); + Возврат; + КонецЕсли; + КонецЕсли; + + ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеОбработчикИсключения(ИнформацияОбОшибке, ПараметрыВыполнения) Экспорт + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось поместить файл ""%1"" + |в хранилище файлов по причине + |""%2"". + | + |Повторить операцию?'"), + Строка(ПараметрыВыполнения.ОбъектСсылка), + КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); + + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеБезРасширенияПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); + + ПоказатьВопрос(Обработчик, ТекстОшибки, РежимДиалогаВопрос.ПовторитьОтмена); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт + Если Ответ = КодВозвратаДиалога.Отмена Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Иначе + ЗакончитьРедактированиеБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Выбор файла и создание из него новой версии. + +// Выбирает на диске файл и создает из него новую версию +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ИдентификаторФормы - уникальный идентификатор формы +// +// Возвращаемое значение: +// Булево. Истина, если операция выполнена успешно. +// +Процедура ОбновитьИзФайлаНаДиске(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) Экспорт + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + + Если Не ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда + ПутьВыбора = ДанныеФайла.РабочийКаталогВладельца; + Иначе + ПутьВыбора = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла"); + КонецЕсли; + + Если ПутьВыбора = Неопределено Или ПутьВыбора = "" Тогда + + #Если Не ВебКлиент Тогда + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); + ВернутьРезультат(ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + #КонецЕсли + + ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); + + КонецЕсли; + + Диалог.Заголовок = НСтр("ru = 'Выбор файла'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.ПроверятьСуществованиеФайла = Ложь; + Диалог.МножественныйВыбор = Ложь; + Диалог.Каталог = ПутьВыбора; + + Диалог.ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + + Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл (*.%1)|*.%1|Все файлы (*.*)|*.*'"), + ДанныеФайла.Расширение, + ДанныеФайла.Расширение); + + Если Диалог.Выбрать() Тогда + + ПутьВыбораПрежний = ПутьВыбора; + ФайлНаДиске = Новый Файл(Диалог.ПолноеИмяФайла); + ПутьВыбора = ФайлНаДиске.Путь; + + Если ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда + Если ПутьВыбораПрежний <> ПутьВыбора Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла", ПутьВыбора); + КонецЕсли; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ДиалогПолноеИмяФайла", Диалог.ПолноеИмяФайла); + ПараметрыВыполнения.Вставить("СоздатьНовуюВерсию", Неопределено); + ПараметрыВыполнения.Вставить("КомментарийКВерсии", Неопределено); + + ОбновитьИзФайлаНаДискеЗапуск(ПараметрыВыполнения); + Возврат; + + КонецЕсли; + + КонецЕсли; + + ВернутьРезультат(ОбработчикРезультата, Ложь); + +КонецПроцедуры + +// Выбирает на диске файл и создает из него новую версию - реализация низкоуровневая +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ИдентификаторФормы - уникальный идентификатор формы +// ДиалогПолноеИмяФайла - Строка - полное имя файла, выбранное в диалоге +// СоздатьНовуюВерсию - Булево - Создать новую версию +// КомментарийКВерсии - Строка - Комментарий к версии +// +Процедура ОбновитьИзФайлаНаДискеЗапуск(ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Вставить("ФайлНаДиске", Неопределено); + ПараметрыВыполнения.Вставить("ИмяИРасширениеФайлаНаДиске", Неопределено); + ПараметрыВыполнения.Вставить("ВремяИзмененияВыбранное", Неопределено); + ПараметрыВыполнения.Вставить("РасширениеФайлаНаДиске", Неопределено); + ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", Неопределено); + ПараметрыВыполнения.Вставить("ИмяФайла", Неопределено); + ПараметрыВыполнения.Вставить("ФайлЗашифрован", Неопределено); + + ПараметрыВыполнения.ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ДиалогПолноеИмяФайла); + ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске = ПараметрыВыполнения.ФайлНаДиске.Имя; + ПараметрыВыполнения.ВремяИзмененияВыбранное = ПараметрыВыполнения.ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения(); + ПараметрыВыполнения.РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ПараметрыВыполнения.ФайлНаДиске.Расширение); + ПараметрыВыполнения.ИмяФайла = ПараметрыВыполнения.ФайлНаДиске.ИмяБезРасширения; + ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляЗашифрованныхФайлов; + ПараметрыВыполнения.ФайлЗашифрован = (НРег(ПараметрыВыполнения.РасширениеФайлаНаДиске) = НРег(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов)); + + Если ПараметрыВыполнения.ФайлЗашифрован Тогда + + // отрезаем .p7m в конце + Позиция = Найти(ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске, ПараметрыВыполнения.РасширениеФайлаНаДиске); + ИмяИРасширениеФайлаНаДиске = Лев(ИмяИРасширениеФайлаНаДиске, Позиция - 2); + + // отрезаем .p7m в конце + ПараметрыВыполнения.Вставить("ДиалогПолноеИмяФайлаПрежнее", ПараметрыВыполнения.ДиалогПолноеИмяФайла); + Позиция = Найти(ПараметрыВыполнения.ДиалогПолноеИмяФайла, ПараметрыВыполнения.РасширениеФайлаНаДиске); + ПараметрыВыполнения.ДиалогПолноеИмяФайла = Лев(ПараметрыВыполнения.ДиалогПолноеИмяФайла, Позиция - 2); + + ВрФайлНешифрованный = Новый Файл(ПараметрыВыполнения.ДиалогПолноеИмяФайла); + + РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( + ВрФайлНешифрованный.Расширение); + + ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( + РасширениеФайлаНаДиске); + + // Тут расшифровать и поставить ту же дату изменения, что и ДиалогПолноеИмяФайлаПрежнее. + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Введите пароль для расшифровки'")); + ПараметрыФормы.Вставить("ПредставленияСертификатов", ""); + ПараметрыФормы.Вставить("Файл", ПараметрыВыполнения.ДанныеФайла.Ссылка); + + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеВводаПароля", ЭтотОбъект, ПараметрыВыполнения); + + ОткрытьФорму("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеПослеВводаПароля(Пароль, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Пароль) <> Тип("Строка") Тогда + Пароль = ""; + КонецЕсли; + + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ДиалогПолноеИмяФайла); + + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + МенеджерКриптографии.Расшифровать(ПараметрыВыполнения.ДиалогПолноеИмяФайлаПрежнее, ПараметрыВыполнения.ДиалогПолноеИмяФайла); + + ВрФайлНешифрованный = Новый Файл(ПараметрыВыполнения.ДиалогПолноеИмяФайла); + + РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( + ВрФайлНешифрованный.Расширение); + + ВрФайлНешифрованный.УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ВремяИзмененияВыбранное); + + ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеПродолжение(ПараметрыВыполнения) + + // данные файла могли измениться - обновим + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + ПредыдущаяВерсия = ПараметрыВыполнения.ДанныеФайла.Версия; + + ИмяИРасширениеФайлаВБазе = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); + + ПараметрыВыполнения.Вставить("ДатаФайлаВБазе", ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная); + + Если ПараметрыВыполнения.ВремяИзмененияВыбранное < ПараметрыВыполнения.ДатаФайлаВБазе Тогда // В хранилище более новый. + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |в хранилище файлов имеет более позднюю дату изменения (%2), + |чем выбранный файл (%3). + | + |Операция прервана.'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), + МестноеВремя(ПараметрыВыполнения.ДатаФайлаВБазе), + МестноеВремя(ПараметрыВыполнения.ВремяИзмененияВыбранное)); + + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + // Проверка наличия файла в рабочем каталоге. + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ПолноеИмяФайла = ""; + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( + Неопределено, + ПредыдущаяВерсия, + ПолноеИмяФайла, + ВРабочемКаталогеНаЧтение, + ВРабочемКаталогеВладельца); + + Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда // Файл уже был занят. + + Если ФайлВРабочемКаталоге = Истина Тогда + ФайлВКеше = Новый Файл(ПолноеИмяФайла); + ВремяИзмененияВКеше = ФайлВКеше.ПолучитьУниверсальноеВремяИзменения(); + + Если ПараметрыВыполнения.ВремяИзмененияВыбранное < ВремяИзмененияВКеше Тогда // В рабочем каталоге более новый. + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |в рабочем каталоге имеет более позднюю дату изменения (%2), + |чем выбранный файл (%3). + | + |Операция прервана.'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), + МестноеВремя(ВремяИзмененияВКеше), + МестноеВремя(ПараметрыВыполнения.ВремяИзмененияВыбранное)); + + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + #Если Не ВебКлиент Тогда + // Проверка, что файл не занят приложением. + Попытка + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Прочитать(ПолноеИмяФайла); + Исключение + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |в рабочем каталоге открыт для редактирования. + | + |Закончите редактирование перед выполнением + |обновления из файла на диске.'"), + ПолноеИмяФайла); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецПопытки; + #КонецЕсли + + КонецЕсли; + + КонецЕсли; + + Если ФайлВРабочемКаталоге И ПараметрыВыполнения.ИмяИРасширениеФайлаНаДиске <> ИмяИРасширениеФайлаВБазе Тогда + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); + УдалитьФайлИзРабочегоКаталога(Обработчик, ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия, Истина); + Возврат; + КонецЕсли; + + ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеПослеУдаленияФайлаИзРабочегоКаталога(Результат, ПараметрыВыполнения) Экспорт + Если Результат <> -1 Тогда + Если Результат.Успех <> Истина Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + КонецЕсли; + + Если Не ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда + + ТекстОшибки = ""; + МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); + Если Не МожноЗанятьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецЕсли; + + ТекстОшибки = ""; + ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки, ПараметрыВыполнения.ИдентификаторФормы); + Если Не ФайлЗанят Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецЕсли; + + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + + КонецЕсли; + + НовоеПолноеИмяФайла = ""; + ПараметрыВыполнения.ДанныеФайла.Вставить("ПутьОбновленияИзФайлаНаДиске", ПараметрыВыполнения.ДиалогПолноеИмяФайла); + ПараметрыВыполнения.ДанныеФайла.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ПараметрыВыполнения.РасширениеФайлаНаДиске); + + // Помещение в рабочий каталог из выбранного файла на диске, + // т.к. указано свойство ПутьОбновленияИзФайлаНаДиске. + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла, НовоеПолноеИмяФайла, ПараметрыВыполнения.ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + // Обработка результата не требуется. + + Если ПараметрыВыполнения.ФайлЗашифрован Тогда + РаботаСФайламиСлужебныйВызовСервера.УстановитьПризнакЗашифрован(ПараметрыВыполнения.ДанныеФайла.Ссылка, ПараметрыВыполнения.ФайлЗашифрован); + КонецЕсли; + + ПереданныйПолныйПутьКФайлу = ""; + + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования", ЭтотОбъект, ПараметрыВыполнения); + Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда // Файл уже был занят. + ОпубликоватьФайл( + Обработчик, + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.ИдентификаторФормы, + Неопределено, + Неопределено, + Неопределено, + Неопределено, + ПереданныйПолныйПутьКФайлу, + ПараметрыВыполнения.СоздатьНовуюВерсию, + ПараметрыВыполнения.КомментарийКВерсии); + Иначе + ЗакончитьРедактирование( + Обработчик, + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии, + ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь, + ПараметрыВыполнения.ДанныеФайла.Редактирует, + ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии, + ПереданныйПолныйПутьКФайлу, + ПараметрыВыполнения.СоздатьНовуюВерсию, + ПараметрыВыполнения.КомментарийКВерсии); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеПослеЗавершенияРедактирования(РезультатРедактирования, ПараметрыВыполнения) Экспорт + + Если ПараметрыВыполнения.ФайлЗашифрован Тогда + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ДиалогПолноеИмяФайла); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Пометка файла как занятого для редактирования. + +// Помечает файл, как занятый для редактирования. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ОбъектСсылка - СправочникСсылка.Файлы - файл. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// +// Возвращаемое значение: +// Булево. Истина, если операция выполнена успешно. +// +Процедура ЗанятьФайлПоСсылке(ОбработчикРезультата, ОбъектСсылка, УникальныйИдентификатор = Неопределено) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗанятьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); + + ТекстОшибки = ""; + ДанныеФайлаПолученыИОнЗанят = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИЗанятьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.ДанныеФайла, + ТекстОшибки, + ПараметрыВыполнения.УникальныйИдентификатор); + Если Не ДанныеФайлаПолученыИОнЗанят Тогда // Если занять нельзя, тогда выводится сообщение об ошибке. + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |занят для редактирования.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Пометка файлов как занятых для редактирования. + +// Помечает файлы, как занятые для редактирования. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// МассивФайлов - Массив - массив файлов. +// +Процедура ЗанятьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов); + + Обработчик = Новый ОписаниеОповещения("ЗанятьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗанятьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт // Получение массива данных файлов. ДанныеФайлов = Новый Массив; - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(МассивФайлов, ДанныеФайлов); + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ДанныеФайлов); ВГраницаМассива = ДанныеФайлов.ВГраница(); Для Инд = 0 По ВГраницаМассива Цикл ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; - // Проверка возможности освобождения. СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - СтрокаОшибки) Тогда - + Если Не РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) + Или Не ДанныеФайла.Редактирует.Пустая() Тогда // Занять невозможно. + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); КонецЕсли; + КонецЦикла; + + // Занять файлы. + КоличествоЗанятых = 0; + + Для Каждого ДанныеФайла Из ДанныеФайлов Цикл + + Если Не РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, "") Тогда + Продолжить; + КонецЕсли; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + КоличествоЗанятых = КоличествоЗанятых + 1; + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Занять файлы'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файлы (%1 из %2) заняты для редактирования.'"), + КоличествоЗанятых, + ПараметрыВыполнения.МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открытие файла для редактирования по ссылке. + +// Открывает файл для редактирования. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ОбъектСсылка - СправочникСсылка.Файлы - файл. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// РабочийКаталогВладельца - Строка - рабочий каталог владельца. +// +// Возвращаемое значение: +// Булево. Истина, если операция выполнена успешно. +// +Процедура РедактироватьФайлПоСсылке(ОбработчикРезультата, + ОбъектСсылка, + УникальныйИдентификатор = Неопределено, + РабочийКаталогВладельца = Неопределено) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыОбработчика.Вставить("РабочийКаталогВладельца", РабочийКаталогВладельца); + + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлПоСсылкеПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); + ПараметрыВыполнения.Вставить("РасширениеПодключено", ПодключитьРасширениеРаботыСФайлами()); + + ТекстОшибки = ""; + ДанныеПолучены = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаДляОткрытияИЗанятьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.ДанныеФайла, + ТекстОшибки, + ПараметрыВыполнения.УникальныйИдентификатор, + ПараметрыВыполнения.РабочийКаталогВладельца); + + Если Не ДанныеПолучены Тогда + СтандартнаяОбработка = Истина; + РаботаСФайламиКлиентПереопределяемый.ПриОшибкеЗахватаФайла(ПараметрыВыполнения.ДанныеФайла, СтандартнаяОбработка); + + Если СтандартнаяОбработка Тогда + // Если занять нельзя, тогда выводится сообщение об ошибке. + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.РасширениеПодключено Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |занят для редактирования.'"), Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + // Если Файл без файла, тогда открывается карточка. + Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда + ВернутьРезультатПослеПоказаЗначения(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла.Ссылка, Истина); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.РасширениеПодключено Тогда + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, + ПараметрыВыполнения.ДанныеФайла, + "", + ПараметрыВыполнения.УникальныйИдентификатор); + Иначе + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПоСсылкеБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); + ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлПоСсылкеСРасширениемПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ФайлПолучен = Истина Тогда + ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла, ПараметрыВыполнения.ОбработчикРезультата); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлПоСсылкеБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла.Расширение); + + ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открытие файла для редактирования. + +// Открывает файл для редактирования. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// +Процедура РедактироватьФайл(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ТекстОшибки = ""; + МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл( + ПараметрыВыполнения.ДанныеФайла, + ТекстОшибки); + Если Не МожноЗанятьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + // Если Файл не занят, тогда занять файл. + Если ПараметрыВыполнения.ДанныеФайла.Редактирует.Пустая() Тогда + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлПослеЗанятияФайла", ЭтотОбъект, ПараметрыВыполнения); + ЗанятьФайл(Обработчик, ПараметрыВыполнения.ДанныеФайла); + Возврат; + КонецЕсли; + + РедактироватьФайлПослеЗанятияФайла(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлПослеЗанятияФайла(ДанныеФайла, ПараметрыВыполнения) Экспорт + + Если ДанныеФайла = Неопределено Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если ДанныеФайла <> -1 Тогда + ПараметрыВыполнения.ДанныеФайла = ДанныеФайла; + КонецЕсли; + + // Если Файл без файла, тогда открыть карточку. + Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда + ВернутьРезультатПослеПоказаЗначения(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла.Ссылка, Истина); + Возврат; + КонецЕсли; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, + ПараметрыВыполнения.ДанныеФайла, + "", + ПараметрыВыполнения.УникальныйИдентификатор + ); + Иначе + Обработчик = Новый ОписаниеОповещения("РедактироватьФайлБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); + ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлСРасширениемПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ФайлПолучен Тогда + ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьФайлБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла.Расширение); + + ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения. + Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открытие версии файла. + +// Открыть версию файла. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// +Процедура ОткрытьВерсиюФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьВерсиюФайлаПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, + ПараметрыВыполнения.ДанныеФайла, + "", + ПараметрыВыполнения.УникальныйИдентификатор); + Иначе + Адрес = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( + ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); + + ПолучитьФайл(Адрес, ИмяФайла, Истина); + + // При хранении файлов на диске (на сервере) удалить файл из временного хранилища после получения. + Если ЭтоАдресВременногоХранилища(Адрес) Тогда + УдалитьИзВременногоХранилища(Адрес); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьВерсиюФайлаПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ФайлПолучен Тогда + ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Освобождение файлов без обновления. + +// Освобождает файлы без обновления. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// МассивФайлов - Массив - массив файлов +// +Процедура ОсвободитьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов); + + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + // Получение массива данных файлов. + ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив); + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов); + ВГраницаМассива = ПараметрыВыполнения.ДанныеФайлов.ВГраница(); + + // Проверка возможности освобождения файлов. + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ВГраницаМассива - Инд]; + + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ДанныеФайла.Ссылка, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда + ПараметрыВыполнения.ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; КонецЦикла; РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование", ЭтотОбъект, ПараметрыВыполнения); - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); + ПоказатьВопрос( + Обработчик, + НСтр("ru = 'Отмена редактирования файлов может + |привести к потере Ваших изменений. + | + |Продолжить?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Нет); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлыПоСсылкамПослеОтветаНаВопросОтменитьРедактирование(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + // Занятие файлов. + Для Каждого ДанныеФайла Из ПараметрыВыполнения.ДанныеФайлов Цикл + НеЗадаватьВопрос = Истина; + + ОсвободитьФайл( + Неопределено, + ДанныеФайла.Ссылка, + ДанныеФайла.ХранитьВерсии, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + Неопределено, + НеЗадаватьВопрос); + КонецЦикла; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Отменить редактирование файлов'"), + , + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отменено редактирование файлов (%1 из %2).'"), + ПараметрыВыполнения.ДанныеФайлов.Количество(), + ПараметрыВыполнения.МассивФайлов.Количество()), + БиблиотекаКартинок.Информация32); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Освобождение файла без обновления. + +// Освобождает файл без обновления. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ОбъектСсылка - СправочникСсылка.Файлы - файл. +// ХранитьВерсии - Булево - хранить версии. +// +// РедактируетТекущийПользователь - Булево - файл редактирует текущий пользователь. +// +// Редактирует - СправочникСсылка.Пользователи - кто занял файл. +// УникальныйИдентификатор - УникальныйИдентификатор управляемой формы. +// +// НеЗадаватьВопрос - Булево - Не задавать вопрос "Отмена редактирования файла +// может привести к потере Ваших изменений. Продолжить?". +// +// Возвращаемое значение: +// Булево. Истина, если операция выполнена успешно. +// +Процедура ОсвободитьФайл(ОбработчикРезультата, + ОбъектСсылка, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + УникальныйИдентификатор = Неопределено, + НеЗадаватьВопрос = Ложь) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + ПараметрыОбработчика.Вставить("Версия", Неопределено); + ПараметрыОбработчика.Вставить("ХранитьВерсии", ХранитьВерсии); + ПараметрыОбработчика.Вставить("РедактируетТекущийПользователь", РедактируетТекущийПользователь); + ПараметрыОбработчика.Вставить("Редактирует", Редактирует); + ПараметрыОбработчика.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыОбработчика.Вставить("НеЗадаватьВопрос", НеЗадаватьВопрос); + + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); + ПараметрыВыполнения.Вставить("ПродолжитьРаботу", Истина); + + Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла( + ПараметрыВыполнения.ОбъектСсылка, ПараметрыВыполнения.Версия); + + Если НЕ ЗначениеЗаполнено(ПараметрыВыполнения.ОбъектСсылка) Тогда + ПараметрыВыполнения.ОбъектСсылка = ПараметрыВыполнения.ДанныеФайла.Ссылка; + КонецЕсли; + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + КонецЕсли; + + // Проверка возможности освобождения файла. + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.Редактирует, + ТекстОшибки); + + Если Не МожноОсвободитьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.НеЗадаватьВопрос = Ложь Тогда + ПараметрыВыполнения.ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования", ЭтотОбъект, ПараметрыВыполнения); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Отмена редактирования файла + |""%1"" + |может привести к потере ваших изменений. + | + |Продолжить?'"), + Строка(ПараметрыВыполнения.ОбъектСсылка)); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет); + Возврат; + КонецЕсли; + + ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлПослеОтветаНаВопросОтменаРедактирования(Ответ, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Ответ) <> -1 Тогда + Если Ответ = КодВозвратаДиалога.Да Тогда + ПараметрыВыполнения.ПродолжитьРаботу = Истина; + Иначе + ПараметрыВыполнения.ПродолжитьРаботу = Ложь; + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ПродолжитьРаботу Тогда + + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОсвободитьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.УникальныйИдентификатор); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + Если Не ПараметрыВыполнения.НеЗадаватьВопрос Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файл освобожден'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Публикация файлов. + +// Публикует файлы. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// МассивФайлов - Массив - массив файлов +// ИдентификаторФормы - УникальныйИдентификатор управляемой формы. +// +Процедура ОпубликоватьФайлыПоСсылкам(ОбработчикРезультата, Знач МассивФайлов, ИдентификаторФормы) Экспорт + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("МассивФайлов", МассивФайлов); + ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы); + + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлыПоСсылкамПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлыПоСсылкамПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + // Получение массива данных файлов. + ПараметрыВыполнения.Вставить("ДанныеФайлов", Новый Массив); + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеДляМассиваФайлов(ПараметрыВыполнения.МассивФайлов, ПараметрыВыполнения.ДанныеФайлов); + ВГраницаМассива = ПараметрыВыполнения.ДанныеФайлов.ВГраница(); + + // Проверка возможности освобождения файлов. + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ПараметрыВыполнения.ДанныеФайлов[ВГраницаМассива - Инд]; + + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ДанныеФайла.Ссылка, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + ТекстОшибки); + Если Не ТекстОшибки Тогда + ПараметрыВыполнения.ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + + КонецЦикла; + + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла(); СоздатьНовуюВерсию = Истина; СоздатьНовуюВерсиюДоступность = Истина; @@ -1290,34 +1993,46 @@ ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - Результат = ФормаВозврата.ОткрытьМодально(); + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлыПоСсылкамПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); + + ФормаВозврата.Открыть(); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлыПоСсылкамПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; КодВозврата = Результат.КодВозврата; Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); Возврат; КонецЕсли; СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; КомментарийКВерсии = Результат.КомментарийКВерсии; - Для Каждого Данные Из ДанныеФайлов Цикл + Для Каждого Данные Из ПараметрыВыполнения.ДанныеФайлов Цикл ПоказыватьОповещение = Ложь; ОпубликоватьФайл( - Данные.Ссылка, - ИдентификаторФормы, - Данные.ХранитьВерсии, - Данные.РедактируетТекущийПользователь, - Данные.Редактирует, - Данные.АвторТекущейВерсии, - "", - СоздатьНовуюВерсию, - КомментарийКВерсии, - ПоказыватьОповещение); + Неопределено, + Данные.Ссылка, + ПараметрыВыполнения.ИдентификаторФормы, + Данные.ХранитьВерсии, + Данные.РедактируетТекущийПользователь, + Данные.Редактирует, + Данные.АвторТекущейВерсии, + "", + СоздатьНовуюВерсию, + КомментарийКВерсии, + ПоказыватьОповещение); КонецЦикла; ПоказатьОповещениеПользователя( @@ -1325,15 +2040,21 @@ , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Сохранены изменения файлов (%1 из %2).'"), - ДанныеФайлов.Количество(), - МассивФайлов.Количество()), + ПараметрыВыполнения.ДанныеФайлов.Количество(), + ПараметрыВыполнения.МассивФайлов.Количество()), БиблиотекаКартинок.Информация32); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Публикация файла. + // Опубликовать файл без его освобождения. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. // ОбъектСсылка - СправочникСсылка.Файлы - файл. // ИдентификаторФормы - УникальныйИдентификатор формы. // ХранитьВерсии - Булево. @@ -1351,7 +2072,10 @@ // КомментарийКВерсии - Строка - Комментарий к версии. // ПоказыватьОповещение - Булево - Показывать оповещение. // -Функция ОпубликоватьФайл( +// Возвращаемое значение: +// Булево - Истина, если операция выполнена успешно. +// +Процедура ОпубликоватьФайл(ОбработчикРезультата, ОбъектСсылка, ИдентификаторФормы, Знач ХранитьВерсии = Неопределено, @@ -1363,435 +2087,5160 @@ КомментарийКВерсии = Неопределено, ПоказыватьОповещение = Истина) Экспорт - Перем ДанныеФайла; - Перем АдресВременногоХранилища; + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектСсылка", ОбъектСсылка); + ПараметрыОбработчика.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыОбработчика.Вставить("ХранитьВерсии", ХранитьВерсии); + ПараметрыОбработчика.Вставить("РедактируетТекущийПользователь", РедактируетТекущийПользователь); + ПараметрыОбработчика.Вставить("Редактирует", Редактирует); + ПараметрыОбработчика.Вставить("АвторТекущейВерсии", АвторТекущейВерсии); + ПараметрыОбработчика.Вставить("ПереданныйПолныйПутьКФайлу", ПереданныйПолныйПутьКФайлу); + ПараметрыОбработчика.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); + ПараметрыОбработчика.Вставить("КомментарийКВерсии", КомментарийКВерсии); + ПараметрыОбработчика.Вставить("ПоказыватьОповещение", ПоказыватьОповещение); - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт - Если РасширениеПодключено Тогда - // Код для тонкого клиента, толстого клиента и веб-клиента с подключенным расширением. - - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ОбъектСсылка); - - ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - - // Проверка возможности освобождения. - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ДанныеФайла.Ссылка, ДанныеФайла.РедактируетТекущийПользователь, ДанныеФайла.Редактирует, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; - - ПолныйПутьКФайлу = ПереданныйПолныйПутьКФайлу; - Если ПолныйПутьКФайлу = "" Тогда - - ПолныйПутьКФайлу = ФайловыеФункцииСлужебныйКлиент - .ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла); - КонецЕсли; - - НеМенятьЗаписьВРабочемКаталоге = Ложь; - Если ПереданныйПолныйПутьКФайлу <> "" Тогда - НеМенятьЗаписьВРабочемКаталоге = Истина; - КонецЕсли; - - // Проверка наличия файла на диске. - ФайлНовойВерсии = Новый Файл(ПолныйПутьКФайлу); - Если НЕ ФайлНовойВерсии.Существует() Тогда - + ПараметрыВыполнения.Вставить("ДанныеФайла", Неопределено); + ПараметрыВыполнения.Вставить("АдресВременногоХранилища", Неопределено); + ПараметрыВыполнения.Вставить("ПолныйПутьКФайлу", Неопределено); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ОпубликоватьФайлСРасширением(ПараметрыВыполнения); + Иначе + ОпубликоватьФайлБезРасширения(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширением(ПараметрыВыполнения) + // Код для тонкого клиента, толстого клиента и веб-клиента с подключенным расширением. + + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ПараметрыВыполнения.ОбъектСсылка); + + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + + // Проверка возможности освобождения файла. + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь, + ПараметрыВыполнения.ДанныеФайла.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.ПолныйПутьКФайлу = ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу; + Если ПараметрыВыполнения.ПолныйПутьКФайлу = "" Тогда + ПараметрыВыполнения.ПолныйПутьКФайлу = ФайловыеФункцииСлужебныйКлиент.ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла); + КонецЕсли; + + // Проверка наличия файла на диске. + ПараметрыВыполнения.Вставить("ФайлНовойВерсии", Новый Файл(ПараметрыВыполнения.ПолныйПутьКФайлу)); + Если Не ПараметрыВыполнения.ФайлНовойВерсии.Существует() Тогда + Если Не ПустаяСтрока(ПараметрыВыполнения.ПолныйПутьКФайлу) Тогда СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось поместить файл ""%1"", - |в хранилище файлов, т.к. он не найден в рабочем каталоге.'"), - Строка(ДанныеФайла.Ссылка)); - - Если НЕ ПустаяСтрока(ПолныйПутьКФайлу) Тогда - СтрокаПредупреждения = СтрокаПредупреждения + " (" + ПолныйПутьКФайлу + ")."; - Иначе - СтрокаПредупреждения = СтрокаПредупреждения + "."; - КонецЕсли; - - СтрокаПредупреждения = СтрокаПредупреждения + Символы.ПС + "Освободить файл?"; - - КодВозврата = Вопрос(СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); - - Если КодВозврата = КодВозвратаДиалога.Да Тогда - ОсвободитьФайлБезВопроса(ДанныеФайла, ИдентификаторФормы); - КонецЕсли; - - Возврат Ложь; - + НСтр("ru = 'Не удалось поместить файл ""%1"" в хранилище файлов: + |Файл не найден в рабочем каталоге: + |%2. + | + |Освободить файл?'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка), + ПараметрыВыполнения.ПолныйПутьКФайлу); + Иначе + СтрокаПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось поместить файл ""%1"" в хранилище файлов: + |Файл не найден в рабочем каталоге. + | + |Освободить файл?'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); КонецЕсли; - // Запрос комментария и признака хранения версии. - Если СоздатьНовуюВерсию = Неопределено Тогда + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеОтветаНаВопросОсвободитьФайл", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, СтрокаПредупреждения, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + + // Запрос комментария и признака хранения версии. + Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда + + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла(); + + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + СоздатьНовуюВерсиюДоступность = Истина; + + Если ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); - - СоздатьНовуюВерсию = Истина; - СоздатьНовуюВерсиюДоступность = Истина; - - Если ДанныеФайла.ХранитьВерсии Тогда - СоздатьНовуюВерсию = Истина; - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если ДанныеФайла.АвторТекущейВерсии <> ДанныеФайла.Редактирует Тогда - СоздатьНовуюВерсиюДоступность = Ложь; - Иначе - СоздатьНовуюВерсиюДоступность = Истина; - КонецЕсли; - Иначе - СоздатьНовуюВерсию = Ложь; + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии <> ПараметрыВыполнения.ДанныеФайла.Редактирует Тогда СоздатьНовуюВерсиюДоступность = Ложь; - КонецЕсли; - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); - СтруктураПараметров.Вставить("КомментарийКВерсии", ""); - СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); - СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", - СоздатьНовуюВерсиюДоступность); - - ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - - Результат = ФормаВозврата.ОткрытьМодально(); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат Ложь; - КонецЕсли; - - КодВозврата = Результат.КодВозврата; - Если КодВозврата <> КодВозвратаДиалога.ОК Тогда - Возврат Ложь; - КонецЕсли; - - СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; - КомментарийКВерсии = Результат.КомментарийКВерсии; - - Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. - - Если ХранитьВерсии Тогда - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если АвторТекущейВерсии <> Редактирует Тогда - СоздатьНовуюВерсию = Истина; - КонецЕсли; - Иначе - СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Истина; КонецЕсли; - + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Ложь; КонецЕсли; - Интерактивно = Ложь; - ВыбранныйПутьКФайлу = ""; + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ДанныеФайла.Ссылка); + СтруктураПараметров.Вставить("КомментарийКВерсии", ""); + СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); + СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - ИмяФайлаСПутемВременное = ""; + ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - РазмерВМб = ФайлНовойВерсии.Размер() / (1024 * 1024); - ВремяИзменения = ФайлНовойВерсии.ПолучитьВремяИзменения(); - ВремяИзмененияУниверсальное = ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); - РазмерФайла = ФайлНовойВерсии.Размер(); + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); - // Если файл с признаком шифрован, тогда при публикации - // файл снова шифруется для тех же сертификатов. - Если ДанныеФайла.Зашифрован Тогда - - МассивСертификатов = Новый Массив; - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Сертификат = Неопределено; - Если СтруктураСертификата.Сертификат <> Неопределено Тогда - Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат); - Иначе - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку( - СтруктураСертификата.Отпечаток); - КонецЕсли; - МассивСертификатов.Добавить(Сертификат); - - КонецЦикла; - - Если МассивСертификатов.Количество() = 0 Тогда - СтруктураВозврата = ВыбратьСертификатыДляШифрования(ДанныеФайла); - - Если ТипЗнч(СтруктураВозврата) = Тип("Массив") Тогда - МассивСертификатов = СтруктураВозврата; - - ЗаписатьСертификатыВТабличнуюЧасть( - ДанныеФайла.Ссылка, МассивСертификатов, ИдентификаторФормы); - Иначе - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - ИмяФайлаСПутемШифрованное = ПолныйПутьКФайлу + ".crp"; - - МенеджерКриптографии.Зашифровать( - ПолныйПутьКФайлу, ИмяФайлаСПутемШифрованное, МассивСертификатов); - - ИмяФайлаСПутемВременное = ПолныйПутьКФайлу + ".bak"; - ПереместитьФайл(ПолныйПутьКФайлу, ИмяФайлаСПутемВременное); - ПереместитьФайл(ИмяФайлаСПутемШифрованное, ПолныйПутьКФайлу); - - КонецЕсли; + ФормаВозврата.Открыть(); - ИмяФайла = ФайлНовойВерсии.Имя; - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. - Состояние(ТекстПояснения); - - ПомещаемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ПолныйПутьКФайлу, ""); - ПомещаемыеФайлы.Добавить(Описание); - - ПомещенныеФайлы = Новый Массив; - - Если ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Интерактивно, ИдентификаторФормы) Тогда - Состояние(); + Если ПараметрыВыполнения.ХранитьВерсии Тогда - Если ПомещенныеФайлы.Количество() = 1 Тогда - АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; - КонецЕсли; - - ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - ОтносительныйПутьКФайлу = ""; - - ИмяБезРасширения = ФайлНовойВерсии.ИмяБезРасширения; - Расширение = ФайлНовойВерсии.Расширение; - - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - Если ДанныеФайла.РабочийКаталогВладельца <> "" Тогда // Есть рабочий каталог. - ОтносительныйПутьКФайлу = ПолныйПутьКФайлу; - Иначе - Позиция = Найти(ПолныйПутьКФайлу, ИмяКаталога); - Если Позиция <> 0 Тогда - ОтносительныйПутьКФайлу = Сред(ПолныйПутьКФайлу, СтрДлина(ИмяКаталога) + 1); - КонецЕсли; - КонецЕсли; - - Если НЕ ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда - - АдресВременногоХранилищаТекста = - ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ПолныйПутьКФайлу, ИдентификаторФормы); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - - ЭтоВебКлиент = Ложь; - - ТекстНеИзвлеченНаКлиенте = Ложь; - #Если ВебКлиент Тогда - ТекстНеИзвлеченНаКлиенте = Истина; - #КонецЕсли - - ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьФайл( - ДанныеФайла.Ссылка, - СоздатьНовуюВерсию, - АдресВременногоХранилища, - КомментарийКВерсии, - ВремяИзменения, - ВремяИзмененияУниверсальное, - РазмерФайла, - ИмяБезРасширения, - Расширение, - ОтносительныйПутьКФайлу, - ПолныйПутьКФайлу, - АдресВременногоХранилищаТекста, - ЭтоВебКлиент, - ТекстНеИзвлеченНаКлиенте, - ВРабочемКаталогеВладельца, - НеМенятьЗаписьВРабочемКаталоге, - ИдентификаторФормы); - - Если ПоказыватьОповещение Тогда - - Если ВерсияОбновлена Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Новая версия сохранена'"), - ДанныеФайла.НавигационнаяСсылка, - ДанныеФайла.ПолноеНаименованиеВерсии, - БиблиотекаКартинок.Информация32); - Иначе - ПоказатьИнформациюФайлНеБылИзменен(); - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Новая версия не сохранена'"), - , - НСтр("ru = 'Файл не изменился'"), - БиблиотекаКартинок.Информация32); - КонецЕсли; - КонецЕсли; - - // Удаление зашифрованного файла из кеша. - Если ДанныеФайла.Зашифрован Тогда - ПереместитьФайл(ИмяФайлаСПутемВременное, ПолныйПутьКФайлу); + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; Иначе - Состояние(); + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; КонецЕсли; - Иначе // Веб-клиент без расширения для работы с файлами. - - Если ХранитьВерсии = Неопределено Тогда - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ОбъектСсылка); - ХранитьВерсии = ДанныеФайла.ХранитьВерсии; - РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - Редактирует = ДанныеФайла.Редактирует; - АвторТекущейВерсии = ДанныеФайла.АвторТекущейВерсии; - КонецЕсли; - - // Проверка возможности освобождения файла. - СтрокаОшибки = ""; - Если НЕ ВозможностьОсвободитьФайл(ОбъектСсылка, РедактируетТекущийПользователь, Редактирует, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат Ложь; - КонецЕсли; + ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); - ПолныйПутьКФайлу = ""; + КонецЕсли; + +КонецПроцедуры - Если СоздатьНовуюВерсию = Неопределено Тогда - - // Запрос комментария и признака хранения версии. - ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуВозвратаФайла(); - - СоздатьНовуюВерсию = Истина; - СоздатьНовуюВерсиюДоступность = Истина; - - Если ХранитьВерсии Тогда - СоздатьНовуюВерсию = Истина; - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если АвторТекущейВерсии <> Редактирует Тогда - СоздатьНовуюВерсиюДоступность = Ложь; - Иначе - СоздатьНовуюВерсиюДоступность = Истина; - КонецЕсли; +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеОтветаНаВопросОсвободитьФайл(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + ОсвободитьФайлБезВопроса(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ИдентификаторФормы); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + КодВозврата = Результат.КодВозврата; + Если КодВозврата <> КодВозвратаДиалога.ОК Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; + + ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеПроверкиНовойВерсии(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("ПолноеИмяФайлаВременное", ""); + + // Если файл с признаком шифрован, тогда при публикации + // файл снова шифруется для тех же сертификатов. + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + + ПараметрыВыполнения.Вставить("МассивСертификатов", Новый Массив); + ПараметрыВыполнения.Вставить("МенеджерКриптографии", ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии()); + + Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл + Сертификат = Неопределено; + Если СтруктураСертификата.Сертификат <> Неопределено Тогда + Сертификат = Новый СертификатКриптографии(СтруктураСертификата.Сертификат); Иначе - СоздатьНовуюВерсию = Ложь; + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(СтруктураСертификата.Отпечаток); + КонецЕсли; + ПараметрыВыполнения.МассивСертификатов.Добавить(Сертификат); + КонецЦикла; + + Если ПараметрыВыполнения.МассивСертификатов.Количество() = 0 Тогда + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеВыбораСертификатовДляШифрования", ЭтотОбъект, ПараметрыВыполнения); + ВыбратьСертификатыДляШифрования(Обработчик, ПараметрыВыполнения.ДанныеФайла); + Возврат; + КонецЕсли; + + ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеВыбораСертификатовДляШифрования(МассивСертификатов, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(МассивСертификатов) <> Тип("Массив") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.МассивСертификатов = МассивСертификатов; + + ЗаписатьСертификатыВТабличнуюЧасть( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.МассивСертификатов, + ПараметрыВыполнения.ИдентификаторФормы); + + ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеПроверкиКоличестваСертификатов(ПараметрыВыполнения) + + ПолноеИмяФайлаШифрованное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".crp"; + + ПараметрыВыполнения.МенеджерКриптографии.Зашифровать( + ПараметрыВыполнения.ПолныйПутьКФайлу, + ПолноеИмяФайлаШифрованное, + ПараметрыВыполнения.МассивСертификатов); + + ПараметрыВыполнения.ПолноеИмяФайлаВременное = ПараметрыВыполнения.ПолныйПутьКФайлу + ".bak"; + ПереместитьФайл(ПараметрыВыполнения.ПолныйПутьКФайлу, ПараметрыВыполнения.ПолноеИмяФайлаВременное); + ПереместитьФайл(ПолноеИмяФайлаШифрованное, ПараметрыВыполнения.ПолныйПутьКФайлу); + + ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения) + + Интерактивно = Ложь; + + ИмяФайла = ПараметрыВыполнения.ФайлНовойВерсии.Имя; + РазмерВМб = ПараметрыВыполнения.ФайлНовойВерсии.Размер() / (1024 * 1024); + ВремяИзменения = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ПараметрыВыполнения.ФайлНовойВерсии.ПолучитьУниверсальноеВремяИзменения(); + РазмерФайла = ПараметрыВыполнения.ФайлНовойВерсии.Размер(); + + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + + Состояние(ТекстПояснения); + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ПолныйПутьКФайлу, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Интерактивно, ПараметрыВыполнения.ИдентификаторФормы); + + Состояние(); + Если Не ФайлыПомещены Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Возврат; + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + ПараметрыВыполнения.АдресВременногоХранилища = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + ОбщиеНастройкиРаботыСФайлами = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + ОтносительныйПутьКФайлу = ""; + + ИмяБезРасширения = ПараметрыВыполнения.ФайлНовойВерсии.ИмяБезРасширения; + Расширение = ПараметрыВыполнения.ФайлНовойВерсии.Расширение; + + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + + Если ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> "" Тогда // Есть рабочий каталог. + ОтносительныйПутьКФайлу = ПараметрыВыполнения.ПолныйПутьКФайлу; + Иначе + Позиция = Найти(ПараметрыВыполнения.ПолныйПутьКФайлу, ИмяКаталога); + Если Позиция <> 0 Тогда + ОтносительныйПутьКФайлу = Сред(ПараметрыВыполнения.ПолныйПутьКФайлу, СтрДлина(ИмяКаталога) + 1); + КонецЕсли; + КонецЕсли; + + Если Не ОбщиеНастройкиРаботыСФайлами.ИзвлекатьТекстыФайловНаСервере Тогда + АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ПараметрыВыполнения.ПолныйПутьКФайлу, + ПараметрыВыполнения.ИдентификаторФормы); + Иначе + АдресВременногоХранилищаТекста = ""; + КонецЕсли; + + ЭтоВебКлиент = Ложь; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + НеМенятьЗаписьВРабочемКаталоге = Ложь; + Если ПараметрыВыполнения.ПереданныйПолныйПутьКФайлу <> "" Тогда + НеМенятьЗаписьВРабочемКаталоге = Истина; + КонецЕсли; + + ВерсияОбновлена = РаботаСФайламиСлужебныйВызовСервера.ОпубликоватьФайл( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.СоздатьНовуюВерсию, + ПараметрыВыполнения.АдресВременногоХранилища, + ПараметрыВыполнения.КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + РазмерФайла, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПараметрыВыполнения.ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + НеМенятьЗаписьВРабочемКаталоге, + ПараметрыВыполнения.ИдентификаторФормы); + + Если ПараметрыВыполнения.ПоказыватьОповещение Тогда + Если ВерсияОбновлена Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Новая версия сохранена'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + Иначе + ПоказатьОповещениеПользователя( + НСтр("ru = 'Новая версия не сохранена'"), + , + НСтр("ru = 'Файл не изменился'"), + БиблиотекаКартинок.Информация32); + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСРасширениемПослеПоказаОповещения", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьИнформациюФайлНеБылИзменен(Обработчик); + Возврат; + КонецЕсли; + КонецЕсли; + + ОпубликоватьФайлСРасширениемПослеПоказаОповещения(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСРасширениемПослеПоказаОповещения(Результат, ПараметрыВыполнения) Экспорт + + // Удаление зашифрованного файла из кеша. + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + ПереместитьФайл(ПараметрыВыполнения.ПолноеИмяФайлаВременное, ПараметрыВыполнения.ПолныйПутьКФайлу); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлБезРасширения(ПараметрыВыполнения) + + Если ПараметрыВыполнения.ХранитьВерсии = Неопределено Тогда + ПараметрыВыполнения.ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ПараметрыВыполнения.ОбъектСсылка); + + ПараметрыВыполнения.ХранитьВерсии = ПараметрыВыполнения.ДанныеФайла.ХранитьВерсии; + ПараметрыВыполнения.РедактируетТекущийПользователь = ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь; + ПараметрыВыполнения.Редактирует = ПараметрыВыполнения.ДанныеФайла.Редактирует; + ПараметрыВыполнения.АвторТекущейВерсии = ПараметрыВыполнения.ДанныеФайла.АвторТекущейВерсии; + КонецЕсли; + + // Проверка возможности освобождения файла. + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.РедактируетТекущийПользователь, + ПараметрыВыполнения.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.ПолныйПутьКФайлу = ""; + Если ПараметрыВыполнения.СоздатьНовуюВерсию = Неопределено Тогда + + // Запрос комментария и признака хранения версии. + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВозвратаФайла(); + + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + СоздатьНовуюВерсиюДоступность = Истина; + + Если ПараметрыВыполнения.ХранитьВерсии Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; + + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда СоздатьНовуюВерсиюДоступность = Ложь; - КонецЕсли; - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ФайлСсылка", ОбъектСсылка); - СтруктураПараметров.Вставить("КомментарийКВерсии", ""); - СтруктураПараметров.Вставить("СоздатьНовуюВерсию", СоздатьНовуюВерсию); - СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - - ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); - - Результат = ФормаВозврата.ОткрытьМодально(); - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат Ложь; - КонецЕсли; - - КодВозврата = Результат.КодВозврата; - Если КодВозврата <> КодВозвратаДиалога.ОК Тогда - Возврат Ложь; - КонецЕсли; - - СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; - КомментарийКВерсии = Результат.КомментарийКВерсии; - - Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. - - Если ХранитьВерсии Тогда - - // Если автор текущей версии не текущий пользователь, тогда - // отключается доступность флажка «Не создавать новую версию». - Если АвторТекущейВерсии <> Редактирует Тогда - СоздатьНовуюВерсию = Истина; - КонецЕсли; - Иначе - СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Истина; КонецЕсли; - + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + СоздатьНовуюВерсиюДоступность = Ложь; КонецЕсли; - Интерактивно = Истина; + СтруктураПараметров = Новый Структура; + СтруктураПараметров.Вставить("ФайлСсылка", ПараметрыВыполнения.ОбъектСсылка); + СтруктураПараметров.Вставить("КомментарийКВерсии", ""); + СтруктураПараметров.Вставить("СоздатьНовуюВерсию", ПараметрыВыполнения.СоздатьНовуюВерсию); + СтруктураПараметров.Вставить("СоздатьНовуюВерсиюДоступность", СоздатьНовуюВерсиюДоступность); - ВыбранныйПутьКФайлу = ""; - ПоказатьНапоминаниеПередПоместитьФайл(); - Если ПоместитьФайл(АдресВременногоХранилища, - ПолныйПутьКФайлу, - ВыбранныйПутьКФайлу, - Интерактивно, - ИдентификаторФормы) Тогда + ФормаВозврата.УстановитьПараметрыИспользования(СтруктураПараметров); + + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеПомещенияФайлаНаСервер", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); + + ФормаВозврата.Открыть(); + + + Иначе // Параметры СоздатьНовуюВерсию и КомментарийКВерсии переданы извне. + + Если ПараметрыВыполнения.ХранитьВерсии Тогда - ИмяБезРасширения = ""; - Расширение = ""; - ВремяИзменения = Дата('00010101'); // Т.к. невозможно получить дату изменения файла на диске. - ВремяИзмененияУниверсальное = Дата('00010101'); - РазмерФайла = 0; // Т.к. невозможно получить размер файла на диске. - - ОтносительныйПутьКФайлу = ""; - АдресВременногоХранилищаТекста = ""; - - СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); - - Если СтрокиПути.Количество() >= 2 Тогда - Расширение = СтрокиПути[СтрокиПути.Количество()-1]; - ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + // Если автор текущей версии не текущий пользователь, тогда + // отключается доступность флажка «Не создавать новую версию». + Если ПараметрыВыполнения.АвторТекущейВерсии <> ПараметрыВыполнения.Редактирует Тогда + ПараметрыВыполнения.СоздатьНовуюВерсию = Истина; КонецЕсли; + + Иначе + ПараметрыВыполнения.СоздатьНовуюВерсию = Ложь; + КонецЕсли; + + ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); + + КонецЕсли; + +КонецПроцедуры - ЭтоВебКлиент = Истина; - - ТекстНеИзвлеченНаКлиенте = Ложь; - #Если ВебКлиент Тогда - ТекстНеИзвлеченНаКлиенте = Истина; - #КонецЕсли - - ВРабочемКаталогеВладельца = Ложь; - - РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОпубликоватьФайл( - ОбъектСсылка, - ДанныеФайла, - СоздатьНовуюВерсию, - АдресВременногоХранилища, - КомментарийКВерсии, - ВремяИзменения, - ВремяИзмененияУниверсальное, - РазмерФайла, - ИмяБезРасширения, - Расширение, - ОтносительныйПутьКФайлу, - ПолныйПутьКФайлу, - АдресВременногоХранилищаТекста, - ЭтоВебКлиент, - ТекстНеИзвлеченНаКлиенте, - ВРабочемКаталогеВладельца, - ИдентификаторФормы); - - Если ПоказыватьОповещение Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Новая версия сохранена'"), - ДанныеФайла.НавигационнаяСсылка, - ДанныеФайла.ПолноеНаименованиеВерсии, - БиблиотекаКартинок.Информация32); - КонецЕсли; +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлБезРасширенияПослеПомещенияФайлаНаСервер(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + Если Результат.КодВозврата <> КодВозвратаДиалога.ОК Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.СоздатьНовуюВерсию = Результат.СоздатьНовуюВерсию; + ПараметрыВыполнения.КомментарийКВерсии = Результат.КомментарийКВерсии; + + ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлБезРасширенияПослеПроверкиНовойВерсии(ПараметрыВыполнения) Экспорт + + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьНапоминаниеПередПоместитьФайл(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт + + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); + СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла(Обработчик, ПараметрыВыполнения.ИдентификаторФормы, ПараметрыВыполнения.ПолныйПутьКФайлу, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт + + Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Возврат; + КонецЕсли; + + ОписаниеПереданногоФайла = ПомещенныеФайлы[0]; + ВыбранныйПутьКФайлу = ОписаниеПереданногоФайла.Имя; + ПараметрыВыполнения.АдресВременногоХранилища = ОписаниеПереданногоФайла.Хранение; + + ИмяБезРасширения = ""; + Расширение = ""; + ВремяИзменения = Дата('00010101'); // Т.к. невозможно получить дату изменения файла на диске. + ВремяИзмененияУниверсальное = Дата('00010101'); + РазмерФайла = 0; // Т.к. невозможно получить размер файла на диске. + + ОтносительныйПутьКФайлу = ""; + АдресВременногоХранилищаТекста = ""; + + СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ВыбранныйПутьКФайлу); + + Если СтрокиПути.Количество() >= 2 Тогда + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + КонецЕсли; + + ЭтоВебКлиент = Истина; + + ТекстНеИзвлеченНаКлиенте = Ложь; + #Если ВебКлиент Тогда + ТекстНеИзвлеченНаКлиенте = Истина; + #КонецЕсли + + ВРабочемКаталогеВладельца = Ложь; + + РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИОпубликоватьФайл( + ПараметрыВыполнения.ОбъектСсылка, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.СоздатьНовуюВерсию, + ПараметрыВыполнения.АдресВременногоХранилища, + ПараметрыВыполнения.КомментарийКВерсии, + ВремяИзменения, + ВремяИзмененияУниверсальное, + РазмерФайла, + ИмяБезРасширения, + Расширение, + ОтносительныйПутьКФайлу, + ПараметрыВыполнения.ПолныйПутьКФайлу, + АдресВременногоХранилищаТекста, + ЭтоВебКлиент, + ТекстНеИзвлеченНаКлиенте, + ВРабочемКаталогеВладельца, + ПараметрыВыполнения.ИдентификаторФормы); + + Если ПараметрыВыполнения.ПоказыватьОповещение Тогда + ПоказатьОповещениеПользователя( + НСтр("ru = 'Новая версия сохранена'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Пометка файла как занятого для редактирования. + +// Пометка файла как занятого для редактирования +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// +// Возвращаемое значение: +// * Неопределено - Если файл не занят. +// * Структура с данными файла - Если файл занят. +// +Процедура ЗанятьФайл(ОбработчикРезультата, ДанныеФайла) + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + + Обработчик = Новый ОписаниеОповещения("ЗанятьФайлПослеУстановкиРасширения", ЭтотОбъект, ПараметрыОбработчика); + + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗанятьФайлПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + ТекстОшибки = ""; + МожноЗанятьФайл = РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл( + ПараметрыВыполнения.ДанныеФайла, + ТекстОшибки); + Если Не МожноЗанятьФайл Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецЕсли; + + ТекстОшибки = ""; + ФайлЗанят = РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ПараметрыВыполнения.ДанныеФайла, ТекстОшибки); + Если Не ФайлЗанят Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецЕсли; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + НаЧтение = Ложь; + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ПараметрыВыполнения.ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Редактирование файла'"), + ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылка, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |занят для редактирования.'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)), + БиблиотекаКартинок.Информация32); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.ДанныеФайла); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Освобождение файлов без обновления. + +// Освобождает файлы без обновления. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ОбъектыСсылка - Массив - массив файлов. +// +Процедура ОсвободитьФайлы(ОбработчикРезультата, ОбъектыСсылка) Экспорт + + СписокНевозможноОсвободить = Новый СписокЗначений; + + // Получение массива данных Файлов. + ДанныеФайлов = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайла(ОбъектыСсылка); + ВГраницаМассива = ДанныеФайлов.ВГраница(); + + // Проверка возможности освобождения файлов. + Для Инд = 0 По ВГраницаМассива Цикл + ДанныеФайла = ДанныеФайлов[ВГраницаМассива - Инд]; + ТекстОшибки = ""; + МожноОсвободитьФайл = ВозможностьОсвободитьФайл( + ДанныеФайла.Ссылка, + ДанныеФайла.РедактируетТекущийПользователь, + ДанныеФайла.Редактирует, + ТекстОшибки); + Если Не МожноОсвободитьФайл Тогда // Освободить невозможно. + СписокНевозможноОсвободить.Добавить(ДанныеФайла.Ссылка, ТекстОшибки); + ДанныеФайлов.Удалить(ВГраницаМассива - Инд); + КонецЕсли; + + КонецЦикла; + + // Если освободить нельзя, тогда открывается диалог. + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ОбъектыСсылка", ОбъектыСсылка); + ПараметрыОбработчика.Вставить("ДанныеФайлов", ДанныеФайлов); + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлыПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыОбработчика); + + Если СписокНевозможноОсвободить.Количество() > 0 Тогда + ДиалогВопросаСоСписком( + Обработчик, + СписокНевозможноОсвободить, + НСтр("ru = 'Освободить остальные файлы?'"), + НСтр("ru = 'При попытке освободить файлы возникли следующие ошибки:'"), + НСтр("ru = 'Освободить файлы'")); + Иначе + ПоказатьВопрос( + Обработчик, + НСтр("ru = 'Освобождение файлов может привести + |к потере ваших изменений. + | + |Освободить файлы?'"), + РежимДиалогаВопрос.ДаНет, + , + КодВозвратаДиалога.Нет); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлыПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> КодВозвратаДиалога.Да Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + // Освобождение файлов. + Для Каждого ДанныеФайла Из ПараметрыВыполнения.ДанныеФайлов Цикл + + РаботаСФайламиСлужебныйВызовСервера.ОсвободитьФайл(ДанныеФайла); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + НаЧтение = Истина; + ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; + ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Файл освобожден'"), + ДанныеФайла.НавигационнаяСсылка, + ДанныеФайла.ПолноеНаименованиеВерсии, + БиблиотекаКартинок.Информация32); + + КонецЦикла; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открытие диалога вопроса со списком файлов или информацией. + +// Открывает диалог вопроса со списком Файлов или информации о Файлах +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// Список - СписокЗначений - список файлов +// СообщениеВопрос - Строка - текст вопроса +// СообщениеЗаголовок - Строка - текст заголовка вопроса +// Заголовок - Строка - заголовок формы +// +Процедура ДиалогВопросаСоСписком(ОбработчикРезультата, Список, СообщениеВопрос, СообщениеЗаголовок, Заголовок) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("СообщениеВопрос", СообщениеВопрос); + ПараметрыФормы.Вставить("СообщениеЗаголовок", СообщениеЗаголовок); + ПараметрыФормы.Вставить("Заголовок", Заголовок); + ПараметрыФормы.Вставить("Файлы", Список); + + РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаВопроса", ПараметрыФормы, , , , , ОбработчикРезультата, РежимОткрытияОкна); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Удаление файла. Перед удалением снимается атрибут "Только для чтения". + +// Удаление файла со снятием атрибута readonly без диалогов. +// +// Параметры +// ПолноеИмяФайла - Строка - Полное имя файла +// +Процедура УдалитьФайлБезПодтверждения(ПолноеИмяФайла) + + Файл = Новый Файл(ПолноеИмяФайла); + Если Файл.Существует() Тогда + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ПолноеИмяФайла); + КонецЕсли; + +КонецПроцедуры + +// Удаление файла со снятием атрибута readonly. +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Структура, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПолноеИмяФайла - Строка - Полное имя файла +// ЗадаватьВопрос - Булево- Задавать вопрос об удалении +// ШапкаВопроса - Строка - Шапка вопроса - добавляет текст к вопросу об удалении +// +Процедура УдалитьФайл(ОбработчикРезультата, ПолноеИмяФайла, ЗадаватьВопрос = Неопределено, ШапкаВопроса = Неопределено) Экспорт + + Если ЗадаватьВопрос = Неопределено Тогда + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + ЗадаватьВопрос = ПерсональныеНастройки.ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + + Если ЗадаватьВопрос = Истина Тогда + ТекстВопроса = + НСтр("ru = 'Удалить файл ""%1"" + |из рабочего каталога?'"); + ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПолноеИмяФайла); + Если ШапкаВопроса <> Неопределено Тогда + ТекстВопроса = ШапкаВопроса + Символы.ПС + Символы.ПС + ТекстВопроса; + КонецЕсли; + ПараметрыВыполнения.ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("УдалитьФайлПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + + УдалитьФайлПослеОтветаНаВопрос(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УдалитьФайлПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> -1 Тогда + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + КонецЕсли; + + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолноеИмяФайла); + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Получение файла из хранилища в рабочий каталог. + +// Получает Файл из хранилища файлов в рабочий каталог +// и возвращает путь к этому файлу. +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// ПолноеИмяФайла - Строка. +// НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// +// Возвращаемое значение: +// Структура - Результат. +// * ФайлПолучен - Булево - Успешно ли выполнена операция. +// * ПолноеИмяФайла - Строка - Полное имя файла. +// +Процедура ПолучитьФайлВерсииВЛокальныйКэшФайлов( + ОбработчикРезультата, + ДанныеФайла, + НаЧтение, + ИдентификаторФормы, + ДополнительныеПараметры) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + + ПолучитьФайлВерсииВЛокальныйКэшФайловЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВЛокальныйКэшФайловЗапуск(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); + ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); + + ДатаФайлаВБазе = ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная; + РазмерФайлаВБазе = ПараметрыВыполнения.ДанныеФайла.Размер; + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ВРабочемКаталогеНаЧтение, + ВРабочемКаталогеВладельца); + + Если ФайлВРабочемКаталоге = Ложь Тогда + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + Возврат; + КонецЕсли; + + // Получаем путь файла в рабочем каталоге - с проверкой на уникальность + Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Ошибка получения файла из хранилища файлов + |в рабочий каталог.'")); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Выяснено, что Файл в рабочем каталоге есть. + // Проверка даты изменения и принятие решения, что делать дальше. + Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВЛокальныйКэшФайловПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); + + ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + Обработчик, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВЛокальныйКэшФайловПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда + + Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВЛокальныйКэшФайловПослеУдаления", ЭтотОбъект, ПараметрыВыполнения); + УдалитьФайл(Обработчик, ПараметрыВыполнения.ПолноеИмяФайла); + + ИначеЕсли Результат = "ОткрытьСуществующий" Тогда + + Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение Тогда + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + + ПеререгистрироватьВРабочемКаталоге( + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.НаЧтение, + ВРабочемКаталогеВладельца); + КонецЕсли; + + ПараметрыВыполнения.ФайлПолучен = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + + Иначе // Результат = "Отмена". + ПараметрыВыполнения.ПолноеИмяФайла = ""; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВЛокальныйКэшФайловПослеУдаления(ФайлУдален, ПараметрыВыполнения) Экспорт + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Получение файла из программы на диск. + +// Получить Файл из информационной базы на локальный диск и возвращает путь +//к этому файлу в параметре +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ПолноеИмяФайла - Строка - здесь возвращается полное имя файла +// ИдентификаторФормы - уникальный идентификатор формы +// +// Возвращаемое значение: +// Структура - Результат получения файла. +// * ФайлПолучен - Булево - Успешно ли выполнена операция. +// * ПолноеИмяФайла - Строка - Полное имя файла. +// +Процедура ПолучитьФайлВерсииВРабочийКаталог( + ОбработчикРезультата, + ДанныеФайла, + ПолноеИмяФайла, + ИдентификаторФормы = Неопределено, + ДополнительныеПараметры = Неопределено) Экспорт + + ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + Если ИмяКаталога = Неопределено Или ПустаяСтрока(ИмяКаталога) Тогда + ВернутьРезультат(ОбработчикРезультата, Новый Структура("ФайлПолучен, ПолноеИмяФайла", Ложь, ПолноеИмяФайла)); + Возврат; + КонецЕсли; + + Если ДанныеФайла.РабочийКаталогВладельца = "" Или ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда + ПолучитьФайлВерсииВЛокальныйКэшФайлов( + ОбработчикРезультата, + ДанныеФайла, + ДанныеФайла.НаЧтение, + ИдентификаторФормы, + ДополнительныеПараметры); + Иначе + ПолучитьФайлВерсииВРабочийКаталогПапки( + ОбработчикРезультата, + ДанныеФайла, + ПолноеИмяФайла, + ДанныеФайла.НаЧтение, + ИдентификаторФормы, + ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открытие проводника с позиционированием на файле. + +// Процедура открывает проводник Windows, позиционируясь на Файл +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// +Процедура КаталогФайла(ОбработчикРезультата, ДанныеФайла) Экспорт + + // Если Файл без файла - эта операция не имеет смысла + Если ДанныеФайла.Версия.Пустая() Тогда + Возврат; + КонецЕсли; + + #Если ВебКлиент Тогда + Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); + Возврат; + КонецЕсли; + #КонецЕсли + + ПолноеИмяФайла = ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла); + Если ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайла) = Истина Тогда + Возврат; + КонецЕсли; + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыОбработчика.Вставить("ИмяФайла", ИмяФайла); + ПараметрыОбработчика.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + Обработчик = Новый ОписаниеОповещения("КаталогФайлаПослеОтветаНаВопросПолучитьФайл", ЭтотОбъект, ПараметрыОбработчика); + + ПоказатьВопрос( + Обработчик, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" + |отсутствует в рабочем каталоге. + | + |Получить файл из хранилища файлов?'"), + ИмяФайла), + РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура КаталогФайлаПослеОтветаНаВопросПолучитьФайл(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + Обработчик = Новый ОписаниеОповещения("КаталогФайлаПослеПолученияФайлаВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла); + Иначе + КаталогФайлаПослеПолученияФайлаВРабочийКаталог(-1, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура КаталогФайлаПослеПолученияФайлаВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат <> -1 Тогда + ПараметрыВыполнения.ПолноеИмяФайла = Результат.ПолноеИмяФайла; + ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПараметрыВыполнения.ПолноеИмяФайла); + КонецЕсли; + + // Для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда + УдалитьИзВременногоХранилища(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Удаление файла с диска и из регистра сведений. + +// Удалить с диска и из регистра сведений +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// Ссылка - СправочникСсылка.Файлы - файл +// УдалитьВРабочемКаталоге - Булево - Удалить даже в рабочем каталоге +// +// Возвращаемое значение: +// Структура - Результат удаления файла с диска и регистра сведений. +// * Успех - Булево - успешно ли выполнена операция. +// +Процедура УдалитьФайлИзРабочегоКаталога(ОбработчикРезультата, Ссылка, УдалитьВРабочемКаталоге = Ложь) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("Ссылка", Ссылка); + ПараметрыВыполнения.Вставить("Успех", Ложь); + ПараметрыВыполнения.Вставить("ИмяКаталога", ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя()); + + ПараметрыВыполнения.Вставить("ПолноеИмяФайлаИзРегистра", Неопределено); + + ВРабочемКаталогеВладельца = Ложь; + ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПолноеИмяФайлаИзРегистра( + ПараметрыВыполнения.Ссылка, ПараметрыВыполнения.ИмяКаталога, Ложь, ВРабочемКаталогеВладельца); + + Если ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра <> "" Тогда + + // Обычно в рабочем каталоге не удаляем - только если передан УдалитьВРабочемКаталоге + Если Не ВРабочемКаталогеВладельца ИЛИ УдалитьВРабочемКаталоге = Истина Тогда + + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); + + Если ФайлНаДиске.Существует() Тогда + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + + ЗарегистрироватьОписаниеОбработчика( + ПараметрыВыполнения, ЭтотОбъект, "УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла"); + + УдалитьФайл(ПараметрыВыполнения, ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; + КонецЕсли; + + УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла( + ПараметрыВыполнения.АсинхронныйДиалог.РезультатКогдаНеОткрыт, ПараметрыВыполнения); + Возврат; + + КонецЕсли; + КонецЕсли; + КонецЕсли; + + УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УдалитьФайлИзРабочегоКаталогаПослеУдаленияФайла(Результат, ПараметрыВыполнения) Экспорт + + ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога; + Позиция = Найти(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра, ОбщегоНазначенияКлиентСервер.РазделительПути()); + Если Позиция <> 0 Тогда + ПутьСПодкаталогом = ПутьСПодкаталогом + Лев(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра, Позиция); + КонецЕсли; + + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + КонецЕсли; + + УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УдалитьФайлИзРабочегоКаталогаЗавершение(ПараметрыВыполнения) + + Если ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра = "" Тогда + РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ПараметрыВыполнения.Ссылка); + Иначе + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайлаИзРегистра); + Если НЕ ФайлНаДиске.Существует() Тогда + РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ПараметрыВыполнения.Ссылка); + КонецЕсли; + КонецЕсли; + + ПараметрыВыполнения.Успех = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Очистка рабочего каталога. + +// Освободить место для помещения файла - если место есть, ничего не делает +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// РеквизитыВерсии - структура с реквизитами версии +// +Процедура ОсвободитьМестоВРабочемКаталоге(ОбработчикРезультата, РеквизитыВерсии) + + #Если ВебКлиент Тогда + // В веб-клиенте нельзя определить количество свободного места на диске + ВернутьРезультатПослеПоказаПредупреждения( + ОбработчикРезультата, + НСтр("ru = 'Очистка рабочего каталога не поддерживается в веб-клиенте.'"), + Неопределено); + Возврат; + #КонецЕсли + + МаксРазмер = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( + ).МаксимальныйРазмерЛокальногоКэшаФайлов; + + // Если размер РабочийКаталог установлен равным 0, + // то считается, что никакого ограничения нет и умолчание в 10 Мб не используется. + Если МаксРазмер = 0 Тогда + Возврат; + КонецЕсли; + + ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); + + РазмерФайловВРабочемКаталоге = 0; + КоличествоСуммарное = 0; + // Вычисление полного размера файлов в рабочем каталоге. + ФайловыеФункцииСлужебныйКлиент.ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); + + Размер = РеквизитыВерсии.Размер; + Если РазмерФайловВРабочемКаталоге + Размер > МаксРазмер Тогда + ОчиститьРабочийКаталог(ОбработчикРезультата, РазмерФайловВРабочемКаталоге, Размер, Ложь); // ОчищатьВсе = Ложь. + КонецЕсли; + +КонецПроцедуры + +// Очистка рабочего каталога - для освобождения места - в первую очередь удаляет файлы +// наиболее давно помещенные в рабочий каталог +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// РазмерФайловВРабочемКаталоге - Число - размер файлов в рабочем каталоге +// РазмерДобавляемогоФайла - Число - Размер добавляемого файла +// ОчищатьВсе - Булево - Удалять все файлы в каталоге (а не только до освобождения нужного объема места на диске) +// +Процедура ОчиститьРабочийКаталог(ОбработчикРезультата, РазмерФайловВРабочемКаталоге, РазмерДобавляемогоФайла, ОчищатьВсе) Экспорт + + #Если ВебКлиент Тогда + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, НСтр("ru = 'Очистка рабочего каталога не поддерживается в веб-клиенте.'"), Неопределено); + Возврат; + #КонецЕсли + + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("РазмерФайловВРабочемКаталоге", РазмерФайловВРабочемКаталоге); + ПараметрыОбработчика.Вставить("РазмерДобавляемогоФайла", РазмерДобавляемогоФайла); + ПараметрыОбработчика.Вставить("ОчищатьВсе", ОчищатьВсе); + + ОчиститьРабочийКаталогЗапуск(ПараметрыОбработчика); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОчиститьРабочийКаталогЗапуск(ПараметрыВыполнения) + + ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + ТаблицаФайлов = Новый Массив; + МассивФайлов = НайтиФайлы(ИмяКаталога, "*"); + ОбходФайловТаблица(ИмяКаталога, МассивФайлов, ТаблицаФайлов); + + // Вызов сервера - для сортировки + // сортировка по дате - в начале будут самые давно помещенные в рабочий каталог + РаботаСФайламиСлужебныйВызовСервера.СортироватьМассивСтруктур(ТаблицаФайлов); + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + МаксРазмер = ПерсональныеНастройки.МаксимальныйРазмерЛокальногоКэшаФайлов; + + СреднийРазмерФайла = 1000; + Если ТаблицаФайлов.Количество() <> 0 Тогда + СреднийРазмерФайла = ПараметрыВыполнения.РазмерФайловВРабочемКаталоге / ТаблицаФайлов.Количество(); + КонецЕсли; + + СколькоНадоОсвободитьМеста = МаксРазмер / 10; + Если СреднийРазмерФайла * 3 / 2 > СколькоНадоОсвободитьМеста Тогда + СколькоНадоОсвободитьМеста = СреднийРазмерФайла * 3 / 2; + КонецЕсли; + + СколькоОсталось = ПараметрыВыполнения.РазмерФайловВРабочемКаталоге + ПараметрыВыполнения.РазмерДобавляемогоФайла; + + ПараметрыВыполнения.Вставить("ИмяКаталога", ИмяКаталога); + ПараметрыВыполнения.Вставить("МаксРазмер", МаксРазмер); + ПараметрыВыполнения.Вставить("СколькоОсталось", СколькоОсталось); + ПараметрыВыполнения.Вставить("СколькоНадоОсвободитьМеста", СколькоНадоОсвободитьМеста); + + ПараметрыВыполнения.Вставить("ТаблицаФайлов", ТаблицаФайлов); + ПараметрыВыполнения.Вставить("НомерЭлемента", 1); + ПараметрыВыполнения.Вставить("КоличествоЭлементов", ТаблицаФайлов.Количество()); + ПараметрыВыполнения.Вставить("Элемент", Неопределено); + ПараметрыВыполнения.Вставить("ДаДляВсех", Ложь); + ПараметрыВыполнения.Вставить("НетДляВсех", Ложь); + + ПараметрыВыполнения.Вставить("НомерШага", 0); + ПараметрыВыполнения.Вставить("ПрерватьЦикл", Ложь); + + ЗарегистрироватьОписаниеОбработчика(ПараметрыВыполнения, ЭтотОбъект, "ОчиститьРабочийКаталогОбработчикДиалогаВЦикле"); + + ОчиститьРабочийКаталогЗапускЦикла(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОчиститьРабочийКаталогЗапускЦикла(ПараметрыВыполнения) + + Пока ПараметрыВыполнения.НомерЭлемента <= ПараметрыВыполнения.КоличествоЭлементов Цикл + ПараметрыВыполнения.Элемент = ПараметрыВыполнения.ТаблицаФайлов[ПараметрыВыполнения.НомерЭлемента - 1]; + ПараметрыВыполнения.НомерЭлемента = ПараметрыВыполнения.НомерЭлемента + 1; + + ПараметрыВыполнения.НомерШага = 1; + ОчиститьРабочийКаталогОбработчикЦикла(ПараметрыВыполнения); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. + КонецЕсли; + Если ПараметрыВыполнения.ПрерватьЦикл Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + // Действия после цикла. + Если ПараметрыВыполнения.ОчищатьВсе Тогда + РаботаСФайламиСлужебныйВызовСервера.ОчиститьВсеСвоиКромеЗанятых(); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОчиститьРабочийКаталогОбработчикЦикла(ПараметрыВыполнения) + + Если ПараметрыВыполнения.НомерШага = 1 Тогда + Если Не ПараметрыВыполнения.ДаДляВсех + И ПараметрыВыполнения.Элемент.Версия.Пустая() Тогда + + Если ПараметрыВыполнения.НетДляВсех Тогда + Возврат; // По отношению к циклу это равносильно ключевому слову "Продолжить". + КонецЕсли; + + Если ПараметрыВыполнения.ОчищатьВсе = Ложь Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется очистка рабочего каталога при добавлении файла. + | + |В хранилище файлов не найден файл + |""%1"". + | + |Удалить его из рабочего каталога?'"), + ПараметрыВыполнения.ИмяКаталога + ПараметрыВыполнения.Элемент.Путь); + Иначе + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В хранилище файлов не найден файл + |""%1"". + | + |Удалить его из рабочего каталога?'"), + ПараметрыВыполнения.ИмяКаталога + ПараметрыВыполнения.Элемент.Путь); + КонецЕсли; + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("Да", НСтр("ru = 'Да'")); + Кнопки.Добавить("ДаДляВсех", НСтр("ru = 'Да для всех'")); + Кнопки.Добавить("Нет", НСтр("ru = 'Нет'")); + Кнопки.Добавить("НетДляВсех", НСтр("ru = 'Нет для всех'")); + + ПоказатьВопрос(ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения), ТекстВопроса, Кнопки); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.НомерШага = 2; + КонецЕсли; + + Если ПараметрыВыполнения.НомерШага = 2 Тогда + ПолныйПуть = ПараметрыВыполнения.ИмяКаталога + ПараметрыВыполнения.Элемент.Путь; + ФайлНаДиске = Новый Файл(ПолныйПуть); + ФайлНаДиске.УстановитьТолькоЧтение(Ложь); + Если ПараметрыВыполнения.ОчищатьВсе = Ложь Тогда + ШапкаВопроса = НСтр("ru = 'Выполняется очистка рабочего каталога при добавлении файла.'"); + Иначе + ШапкаВопроса = НСтр("ru = 'Выполняется очистка рабочего каталога.'"); + КонецЕсли; + + УдалитьФайл(ПараметрыВыполнения, ПолныйПуть, Неопределено, ШапкаВопроса); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. + КонецЕсли; + + ПараметрыВыполнения.НомерШага = 3; + КонецЕсли; + + Если ПараметрыВыполнения.НомерШага = 3 Тогда + + ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога; + Позиция = Найти(ПараметрыВыполнения.Элемент.Путь, ОбщегоНазначенияКлиентСервер.РазделительПути()); + Если Позиция <> 0 Тогда + ПутьСПодкаталогом = ПараметрыВыполнения.ИмяКаталога + Лев(ПараметрыВыполнения.Элемент.Путь, Позиция); + КонецЕсли; + + // Если каталог стал пуст - удалить его + МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*"); + Если МассивФайловВКаталоге.Количество() = 0 Тогда + Если ПутьСПодкаталогом <> ПараметрыВыполнения.ИмяКаталога Тогда + УдалитьФайлы(ПутьСПодкаталогом); + КонецЕсли; + КонецЕсли; + + // Удаление из регистра сведений + РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ПараметрыВыполнения.Элемент.Версия); + + ПараметрыВыполнения.СколькоОсталось = ПараметрыВыполнения.СколькоОсталось - ПараметрыВыполнения.Элемент.Размер; + Если ПараметрыВыполнения.СколькоОсталось < ПараметрыВыполнения.МаксРазмер - ПараметрыВыполнения.СколькоНадоОсвободитьМеста Тогда + Если Не ПараметрыВыполнения.ОчищатьВсе Тогда + // Освободили достаточно - выход из цикла. + ПараметрыВыполнения.ПрерватьЦикл = Истина; + Возврат; + КонецЕсли; КонецЕсли; КонецЕсли; - Возврат Истина; +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОчиститьРабочийКаталогОбработчикДиалогаВЦикле(Результат, ПараметрыВыполнения) Экспорт + + Если ПараметрыВыполнения.НомерШага = 1 Тогда + Если Результат = "Нет" Тогда + ПродолжитьВыполнение = Ложь; + ИначеЕсли Результат = "НетДляВсех" Тогда + ПродолжитьВыполнение = Ложь; + ПараметрыВыполнения.НетДляВсех = Истина; + ИначеЕсли Результат = "Да" Тогда + ПродолжитьВыполнение = Истина; + ИначеЕсли Результат = "ДаДляВсех" Тогда + ПродолжитьВыполнение = Истина; + ПараметрыВыполнения.ДаДляВсех = Истина; + КонецЕсли; + ИначеЕсли ПараметрыВыполнения.НомерШага = 2 Тогда + ПродолжитьВыполнение = Истина; + КонецЕсли; + + // Продолжение удаления файла + Если ПродолжитьВыполнение Тогда + ПараметрыВыполнения.НомерШага = ПараметрыВыполнения.НомерШага + 1; + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ОчиститьРабочийКаталогОбработчикЦикла(ПараметрыВыполнения); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт Тогда + Возврат; // Пауза цикла. Стек очищается. + КонецЕсли; + КонецЕсли; + + // Продолжение цикла. + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ОчиститьРабочийКаталогЗапускЦикла(ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Получение файла с сервера и регистрация в локальном кэше. + +// Получить Файл с сервера и зарегистрировать в локальном кеше +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла +// ДатаФайлаВБазе - Дата - дата файла в базе +// НаЧтение - Булево - файл помещен на чтение +// ИдентификаторФормы - уникальный идентификатор формы +// +// Возвращаемое значение: +// Структура - Результат. +// * ФайлПолучен - Булево - Успешно ли выполнена операция. +// * ПолноеИмяФайла - Строка - Полное имя файла. +// +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов(ОбработчикРезультата, + ДанныеФайла, + ПолноеИмяФайла, + ВремяИзмененияУниверсальное, + НаЧтение, + ИдентификаторФормы = Неопределено, + ДополнительныеПараметры = Неопределено) + + // Переменные параметризации: + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + ПараметрыВыполнения.Вставить("ВремяИзмененияУниверсальное", ВремяИзмененияУниверсальное); + ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗапуск(ПараметрыВыполнения) + + // Переменные выполнения: + ПараметрыВыполнения.Вставить("ВРабочемКаталогеВладельца", ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""); + ПараметрыВыполнения.Вставить("ИмяКаталога", ""); + ПараметрыВыполнения.Вставить("ИмяКаталогаПрежнееЗначение", ""); + ПараметрыВыполнения.Вставить("ИмяФайла", ""); + ПараметрыВыполнения.Вставить("МаксимальнаяДлинаПолногоПути", 260); + ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); + + Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда + ПараметрыВыполнения.ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение = ПараметрыВыполнения.ИмяКаталога; + + // Формирование имени файла с расширением + ПараметрыВыполнения.ИмяФайла = ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии; + Если Не ПустаяСтрока(ПараметрыВыполнения.ДанныеФайла.Расширение) Тогда + ПараметрыВыполнения.ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ПараметрыВыполнения.ИмяФайла, ПараметрыВыполнения.ДанныеФайла.Расширение); + КонецЕсли; + + ПараметрыВыполнения.ПолноеИмяФайла = ""; + Если Не ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( + ПараметрыВыполнения.ИмяКаталога, + ПараметрыВыполнения.ИмяФайла, + ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + КонецЕсли; + + Если ПустаяСтрока(ПараметрыВыполнения.ИмяФайла) Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 260; + Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; // Excel Длина имени файла вместе с путем не должна превышать 218 знака + КонецЕсли; + + МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" + + Если ПараметрыВыполнения.ВРабочемКаталогеВладельца = Ложь Тогда +#Если Не ВебКлиент Тогда + Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) > ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда + ПутьКаталогаПользователя = КаталогДанныхПользователя(); + МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); + + // если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. + Если СтрДлина(ПараметрыВыполнения.ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда + ТекстСообщения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Длина пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов + |%2'"), + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, + ПараметрыВыполнения.ПолноеИмяФайла); + + ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + + НСтр("ru = 'Измените имя файла на более короткое.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстСообщения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(-1, ПараметрыВыполнения); + Возврат; + КонецЕсли; +#КонецЕсли + КонецЕсли; + + КонецЕсли; + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(Ответ, ПараметрыВыполнения) Экспорт + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Длина пути к файлу превышает %1 символов: + |%2 + | + |Выбрать другой основной рабочий каталог?'"), + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, + ПараметрыВыполнения.ПолноеИмяФайла); + Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловНачатьВыборКаталога", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловНачатьВыборКаталога(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // выбираем другой путь к рабочему каталогу + Заголовок = НСтр("ru = 'Выберите другой основной рабочий каталог'"); + КаталогВыбран = ВыбратьПутьКРабочемуКаталогу(ПараметрыВыполнения.ИмяКаталога, Заголовок, Ложь); + Если Не КаталогВыбран Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( + ПараметрыВыполнения.ИмяКаталога, + ПараметрыВыполнения.ИмяФайла, + ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + + Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда // уложились в 260 символов + Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); + ПеренестиСодержимоеРабочегоКаталога(Обработчик, ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение, ПараметрыВыполнения.ИмяКаталога); + Иначе + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПредложитьВыборКаталога(-1, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт + + Если СодержимоеПеренесено Тогда + ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ПараметрыВыполнения.ИмяКаталога); + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПродолжение(ПараметрыВыполнения) + + #Если Не ВебКлиент Тогда + Если ПараметрыВыполнения.ВРабочемКаталогеВладельца = Ложь Тогда + ОсвободитьМестоВРабочемКаталоге(, ПараметрыВыполнения.ДанныеФайла); + КонецЕсли; + #КонецЕсли + + РазмерФайла = 0; + + // Запись Файл в каталог + АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + ПараметрыВыполнения.ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла.Расширение); + + РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024); + + ФайлНаДискеПоИмени = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + ИмяИРасширениеВПути = ФайлНаДискеПоИмени.Имя; + Позиция = Найти(ПараметрыВыполнения.ПолноеИмяФайла, ИмяИРасширениеВПути); + ПутьКФайлу = ""; + Если Позиция <> 0 Тогда + ПутьКФайлу = Лев(ПараметрыВыполнения.ПолноеИмяФайла, Позиция - 1); // -1 - вычет слеша + КонецЕсли; + + //ПутьКФайлу = ФайлНаДискеПоИмени.Путь; + ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + ПараметрыВыполнения.ПолноеИмяФайла = ПутьКФайлу + ПараметрыВыполнения.ИмяФайла; // могло смениться расширение + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ПараметрыВыполнения.ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + + Состояние(ТекстПояснения); + + Если ПараметрыВыполнения.ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда + + КопироватьФайл(ПараметрыВыполнения.ДанныеФайла.ПутьОбновленияИзФайлаНаДиске, ПараметрыВыполнения.ПолноеИмяФайла); + + Иначе + + Если ПараметрыВыполнения.ДанныеФайла.Версия <> ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия Тогда + АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( + ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ИдентификаторФормы); + КонецЕсли; + + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ПараметрыВыполнения.ИмяФайла, АдресФайла); + ПередаваемыеФайлы.Добавить(Описание); + + #Если ВебКлиент Тогда + Если ПараметрыВыполнения.ДополнительныеПараметры <> Неопределено И ПараметрыВыполнения.ДополнительныеПараметры.Свойство("ОткрытьФайл") Тогда + + МассивОпераций = Новый Массив; + + ОписаниеВызова = Новый Массив; + ОписаниеВызова.Добавить("ПолучитьФайлы"); + ОписаниеВызова.Добавить(ПередаваемыеФайлы); + ОписаниеВызова.Добавить(Неопределено); // Не используется. + ОписаниеВызова.Добавить(ПутьКФайлу); + ОписаниеВызова.Добавить(Ложь); // Интерактивно = Ложь. + МассивОпераций.Добавить(ОписаниеВызова); + + ОписаниеВызова = Новый Массив; + ОписаниеВызова.Добавить("ЗапуститьПриложение"); + ОписаниеВызова.Добавить(ПараметрыВыполнения.ПолноеИмяФайла); + МассивОпераций.Добавить(ОписаниеВызова); + + Если Не ЗапроситьРазрешениеПользователя(МассивОпераций) Тогда + // Пользователь не дал разрешения. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + КонецЕсли; + #КонецЕсли + + Если Не ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Для варианта с хранением файлов на диске (на сервере) + // файл удаляется из временного хранилища после получения. + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + КонецЕсли; + + Состояние(); + + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом - для расшифровки + Если Не ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Введите пароль для расшифровки'")); + ПараметрыФормы.Вставить("ПредставленияСертификатов", ПредставленияСертификатов); + ПараметрыФормы.Вставить("Файл", ПараметрыВыполнения.ДанныеФайла.Ссылка); + Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеВводаПароляДляРасшифровки", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы, , , , , Обработчик); + Возврат; + КонецЕсли; + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловПослеВводаПароляДляРасшифровки(Пароль, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Пароль) <> Тип("Строка") Тогда + Пароль = ""; + УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); + ПараметрыВыполнения.ПолноеИмяФайла = ""; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + Попытка + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; + + ПолноеИмяФайлаРасшифрованное = ПараметрыВыполнения.ПолноеИмяФайла + ".dec"; + МенеджерКриптографии.Расшифровать(ПараметрыВыполнения.ПолноеИмяФайла, ПолноеИмяФайлаРасшифрованное); + + УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); + ПереместитьФайл(ПолноеИмяФайлаРасшифрованное, ПараметрыВыполнения.ПолноеИмяФайла); + Исключение + УдалитьФайлы(ПараметрыВыполнения.ПолноеИмяФайла); + ВызватьИсключение; + КонецПопытки; + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайловЗавершение(ПараметрыВыполнения) + + // Установим время изменения файла таким, как оно стоит в текущей версии + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ПараметрыВыполнения.ВремяИзмененияУниверсальное); + + РазмерФайла = ФайлНаДиске.Размер(); // Т.к. размер на диске может отличаться от размера в базе (при добавлении из веб клиента) + + ФайлНаДиске.УстановитьТолькоЧтение(ПараметрыВыполнения.НаЧтение); + + ПараметрыВыполнения.ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр( + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ИмяКаталога, + ПараметрыВыполнения.НаЧтение, + РазмерФайла, + ПараметрыВыполнения.ВРабочемКаталогеВладельца); + + Если ПараметрыВыполнения.ДанныеФайла.Размер <> РазмерФайла Тогда + // При обновлении из файла на диске коррекция не нужна. + Если Не ПараметрыВыполнения.ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда + + РаботаСФайламиСлужебныйВызовСервера.ОбновитьРазмерФайлаИВерсии( + ПараметрыВыполнения.ДанныеФайла, РазмерФайла, ПараметрыВыполнения.ИдентификаторФормы); + + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Версия); + + Оповестить("Запись_Файл", + Новый Структура("Событие", "ДанныеФайлаИзменены"), + ПараметрыВыполнения.ДанныеФайла.Ссылка); + КонецЕсли; + КонецЕсли; + + ПараметрыВыполнения.ФайлПолучен = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Получение файла из хранилища в рабочий каталог. + +// Получает Файл из хранилища файлов в рабочий каталог папки +// и возвращает путь к этому файлу. +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// ПолноеИмяФайла - Строка (возвращаемое значение). +// НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. +// ИдентификаторФормы - УникальныйИдентификатор формы. +// +// Возвращаемое значение: +// Структура - Результат. +// * ФайлПолучен - Булево - Успешно ли выполнена операция. +// * ПолноеИмяФайла - Строка - Полное имя файла. +// +Процедура ПолучитьФайлВерсииВРабочийКаталогПапки(ОбработчикРезультата, + ДанныеФайла, + ПолноеИмяФайла, + НаЧтение, + ИдентификаторФормы, + ДополнительныеПараметры) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + + ПолучитьФайлВерсииВРабочийКаталогПапкиЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиЗапуск(ПараметрыВыполнения) + Перем Версия; + Перем ДатаПомещения; + + ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); + + ВРабочемКаталогеВладельца = Истина; + + // Формирование имени файла с расширением + ИмяФайла = ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии; + Если Не ПустаяСтрока(ПараметрыВыполнения.ДанныеФайла.Расширение) Тогда + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ИмяФайла, ПараметрыВыполнения.ДанныеФайла.Расширение); + КонецЕсли; + + Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца + ИмяФайла; + Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВРабочийКаталогПапкиПослеПроверкиДлиныПути", ЭтотОбъект, ПараметрыВыполнения); + ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ПолноеИмяФайла, ИмяФайла) + КонецЕсли; + + ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПослеПроверкиДлиныПути(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Ложь Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Иначе + ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПродолжение(ПараметрыВыполнения) + + // Поиск регистрации файла в рабочем каталоге (полное имя с путем). + НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ПараметрыВыполнения.ПолноеИмяФайла); + ПараметрыВыполнения.Вставить("ФайлЕстьВРегистре", НайденныеСвойства.ФайлЕстьВРегистре); + Версия = НайденныеСвойства.Версия; + ДатаПомещения = ?(ПараметрыВыполнения.ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, ДатаПомещения); + Владелец = НайденныеСвойства.Владелец; + НомерВерсии = НайденныеСвойства.НомерВерсии; + ВРегистреНаЧтение = НайденныеСвойства.ВРегистреНаЧтение; + ВРегистреКодФайла = НайденныеСвойства.ВРегистреКодФайла; + ВРегистреПапка = НайденныеСвойства.ВРегистреПапка; + + ФайлНаДиске = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + ФайлНаДискеСуществует = ФайлНаДиске.Существует(); + + // Удаление регистрации файла, если он не существует. + Если ПараметрыВыполнения.ФайлЕстьВРегистре И Не ФайлНаДискеСуществует Тогда + РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Версия); + ПараметрыВыполнения.ФайлЕстьВРегистре = Ложь; + КонецЕсли; + + Если Не ПараметрыВыполнения.ФайлЕстьВРегистре И Не ФайлНаДискеСуществует Тогда + ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + Возврат; + КонецЕсли; + + // Установлено, что в рабочем каталоге файл существует. + + Если ПараметрыВыполнения.ФайлЕстьВРегистре И Версия <> ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия Тогда + + Если Владелец = ПараметрыВыполнения.ДанныеФайла.Ссылка И ВРегистреНаЧтение = Истина Тогда + // Если владелец версий файла совпадает и + // существующий файл в рабочем каталоге зарегистрирован для чтения, + // тогда можно заменить его другим файлом из хранилища. + ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ДанныеФайла.Владелец = ВРегистреПапка Тогда // Одна и та же папка. + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В рабочем каталоге уже есть файл + |""%1"", + |связанный с другим файлом в информационной базе. + | + |Код файла в хранилище файлов: %2. + |Код файла в рабочем каталоге: %3. + | + |Переименуйте один из файлов в информационной базе.'"), + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.КодФайла, + ВРегистреКодФайла); + Иначе + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В рабочем каталоге уже есть файл + |""%1"", + |связанный с другим файлом информационной базы. + | + |Код файла в хранилище файлов: %2. + |Код файла в рабочем каталоге: %3. + | + |В информационной базе измените рабочий каталог одной из папок. + |(У двух папок не должно быть одинакового рабочего каталога).'"), + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.КодФайла, + ВРегистреКодФайла); + КонецЕсли; + + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Выяснено, что Файл в рабочем каталоге есть. + // Либо файл незарегистрирован, либо зарегистрирован и версия совпадает. + + // Проверка даты изменения и принятие решения, что делать дальше. + Обработчик = Новый ОписаниеОповещения("ПолучитьФайлВерсииВРабочийКаталогПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); + + ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + Обработчик, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьФайлВерсииВРабочийКаталогПапкиПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда + + // В рабочем каталоге папки настройка подтверждения при удалении не используется. + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолноеИмяФайла); + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + + ИначеЕсли Результат = "ОткрытьСуществующий" Тогда + + Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение + Или Не ПараметрыВыполнения.ФайлЕстьВРегистре Тогда + + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + + ПеререгистрироватьВРабочемКаталоге( + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.НаЧтение, + ВРабочемКаталогеВладельца); + КонецЕсли; + + ПараметрыВыполнения.ФайлПолучен = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + + Иначе // Результат = "Отмена". + ПараметрыВыполнения.ПолноеИмяФайла = ""; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Получение файла с сервера и регистрация в рабочем каталоге. + +// Получить Файл с сервера и зарегистрировать в рабочем каталоге +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла +// ДатаФайлаВБазе - Дата - дата файла в базе +// НаЧтение - Булево - файл помещен на чтение +// ИдентификаторФормы - уникальный идентификатор формы +// +// Возвращаемое значение: +// Структура - Результат. +// * ФайлПолучен - Булево - Успешно ли выполнена операция. +// * ПолноеИмяФайла - Строка - Полное имя файла. +// +Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( + ОбработчикРезультата, + ДанныеФайла, + ПолноеИмяФайлаВРабочемКаталогеПапки, + ДатаФайлаВБазе, + НаЧтение, + ИдентификаторФормы, + ДополнительныеПараметры) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ПолноеИмяФайлаВРабочемКаталогеПапки", ПолноеИмяФайлаВРабочемКаталогеПапки); + ПараметрыВыполнения.Вставить("ДатаФайлаВБазе", ДатаФайлаВБазе); + ПараметрыВыполнения.Вставить("НаЧтение", НаЧтение); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ДополнительныеПараметры", ДополнительныеПараметры); + + ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиЗапуск(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); + ПараметрыВыполнения.Вставить("ФайлПолучен", Ложь); + + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ВРабочемКаталогеНаЧтение, + ВРабочемКаталогеВладельца); + + Если ФайлВРабочемКаталоге = Ложь Тогда + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайлаВРабочемКаталогеПапки, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + КонецЕсли; + + // Получаем путь файла в рабочем каталоге - с проверкой на уникальность + Если ПараметрыВыполнения.ПолноеИмяФайла = "" Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Ошибка получения файла из хранилища файлов + |в рабочий каталог.'")); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + // Выяснено, что Файл в рабочем каталоге есть. + // Проверка даты изменения и принятие решения, что делать дальше. + Обработчик = Новый ОписаниеОповещения("ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиПослеВыбораДействия", ЭтотОбъект, ПараметрыВыполнения); + + ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( + Обработчик, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапкиПослеВыбораДействия(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = "ВзятьИзХранилищаИОткрыть" Тогда + + // В рабочем каталоге папки настройка подтверждения при удалении не используется. + УдалитьФайлБезПодтверждения(ПараметрыВыполнения.ПолноеИмяФайла); + + ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.ДанныеФайла, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная, + ПараметрыВыполнения.НаЧтение, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ДополнительныеПараметры); + + ИначеЕсли Результат = "ОткрытьСуществующий" Тогда + + Если ПараметрыВыполнения.ДанныеФайла.ВРабочемКаталогеНаЧтение <> ПараметрыВыполнения.НаЧтение Тогда + ВРабочемКаталогеВладельца = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца <> ""; + + ПеререгистрироватьВРабочемКаталоге( + ПараметрыВыполнения.ДанныеФайла.Версия, + ПараметрыВыполнения.ПолноеИмяФайла, + ПараметрыВыполнения.НаЧтение, + ВРабочемКаталогеВладельца); + КонецЕсли; + + ПараметрыВыполнения.ФайлПолучен = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + + Иначе // Результат = "Отмена". + ПараметрыВыполнения.ПолноеИмяФайла = ""; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Проверка максимальной длины рабочего каталога с заменой и переносом файлов. + +// Проверяет максимальную длину, если нужно - меняет рабочий каталог и переносит файлы +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// ПолноеИмяФайла - Строка - полное имя файла +// НормальноеИмяФайла - Строка - имя файла (без пути) +// +// Возвращаемое значение: +// Булево - Успешно ли выполнена операция. +// * Истина если длина полного имени файла не превышает 260. +// +Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(ОбработчикРезультата, + ДанныеФайла, ПолноеИмяФайла, НормальноеИмяФайла) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ПолноеИмяФайла); + ПараметрыВыполнения.Вставить("НормальноеИмяФайла", НормальноеИмяФайла); + + ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеЗапуск(ПараметрыВыполнения) + + #Если ВебКлиент Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Возврат; + #КонецЕсли + + ПараметрыВыполнения.Вставить("ИмяКаталогаПрежнееЗначение", ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца); + ПараметрыВыполнения.Вставить("МаксимальнаяДлинаПолногоПути", 260); + Если НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xls" Или НРег(ПараметрыВыполнения.ДанныеФайла.Расширение) = "xlsx" Тогда + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути = 218; // Excel Длина имени файла вместе с путем не должна превышать 218 знака + КонецЕсли; + + МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" + + Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Возврат; + КонецЕсли; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов + |""%2"".'"), + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, + ПараметрыВыполнения.ПолноеИмяФайла); + + ПутьКаталогаПользователя = КаталогДанныхПользователя(); + МаксимальнаяДлинаИмениФайла = ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); + + // если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. + Если СтрДлина(ПараметрыВыполнения.НормальноеИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда + ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + + НСтр("ru = 'Измените имя файла на более короткое.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстСообщения, Ложь); + Возврат; + КонецЕсли; + + // Если структура папок (путь к рабочему каталогу текущей папки) превышает 260-5 (1.txt), пишем "Измените имена папок или перенесите текущую папку в другую папку" + Если СтрДлина(ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца) > ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути - 5 Тогда + ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК + + НСтр("ru = 'Измените имена папок или перенесите текущую папку в другую папку.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстСообщения, Ложь); + Возврат; + КонецЕсли; + + ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения) + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов + |""%2"". + | + |Выбрать другой основной рабочий каталог? + |(Содержимое рабочего каталога будет перенесено в выбранный каталог).'"), + ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути, ПараметрыВыполнения.ПолноеИмяФайла); + Обработчик = Новый ОписаниеОповещения("ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеНачатьВыборКаталога", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеНачатьВыборКаталога(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + // Выбираем другой путь к рабочему каталогу. + Заголовок = НСтр("ru = 'Выберите другой рабочий каталог'"); + КаталогВыбран = ВыбратьПутьКРабочемуКаталогу(ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца, Заголовок, Истина); + Если Не КаталогВыбран Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.ПолноеИмяФайла = ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца + ПараметрыВыполнения.НормальноеИмяФайла; + + Если СтрДлина(ПараметрыВыполнения.ПолноеИмяФайла) <= ПараметрыВыполнения.МаксимальнаяДлинаПолногоПути Тогда // уложились в 260 символов + Обработчик = Новый ОписаниеОповещения("ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПослеПереносаСодержимогоРабочегоКаталога", ЭтотОбъект, ПараметрыВыполнения); + ПеренестиСодержимоеРабочегоКаталога(Обработчик, ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение, ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца); + Иначе + ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПредложитьВыборКаталога(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталогеПослеПереносаСодержимогоРабочегоКаталога(СодержимоеПеренесено, ПараметрыВыполнения) Экспорт + + Если СодержимоеПеренесено Тогда + // Регистр сведений ФайлыВРабочемКаталоге - сейчас там полный путь к файлу - + // надо его менять - выделять общую часть и replace. -просто SQL запросом - + // для текущего пользователя. + РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапкиИЗаменитьПутиВРегистре( + ПараметрыВыполнения.ДанныеФайла.Владелец, + ПараметрыВыполнения.ДанныеФайла.РабочийКаталогВладельца, + ПараметрыВыполнения.ИмяКаталогаПрежнееЗначение); + КонецЕсли; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, СодержимоеПеренесено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Копирование содержимого из одного каталога в другой. + +// Копирует все файлы в указанном каталоге в другой каталог +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// КаталогИсточника - Строка - прежнее имя каталога +// КаталогПриемника - Строка - новое имя каталога +// +// Возвращаемое значение: +// Структура - Результат копирования. +// * ВозниклаОшибка - Булево - Истина когда все файлы скопированы. +// * ИнформацияОбОшибке - ИнформацияОбОшибке - Информация об ошибке. +// * ПолноеИмяСбойногоФайла - Строка - Полное имя файла, при копировании которого возникла ошибка. +// * СкопированныеФайлыИПапки - Массив - Полные имена файлов и папок приемника. +// * ОригинальныеФайлыИПапки - Массив - Полные имена файлов и папок источника. +// +Процедура СкопироватьСодержимоеКаталога(ОбработчикРезультата, Знач КаталогИсточника, Знач КаталогПриемника) + + Результат = Новый Структура; + Результат.Вставить("ВозниклаОшибка", Ложь); + Результат.Вставить("ПолноеИмяСбойногоФайла", ""); + Результат.Вставить("ИнформацияОбОшибке", ""); + Результат.Вставить("СкопированныеФайлыИПапки", Новый Массив); + Результат.Вставить("ОригинальныеФайлыИПапки", Новый Массив); + + КопироватьСодержимоеКаталога(Результат, КаталогИсточника, КаталогПриемника); + + Если Результат.ВозниклаОшибка Тогда + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось скопировать файл + |""%1"". + |Возможно он занят другим приложением. + | + |Повторить операцию?'"), + Результат.ПолноеИмяСбойногоФайла); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("КаталогИсточника", КаталогИсточника); + ПараметрыВыполнения.Вставить("КаталогПриемника", КаталогПриемника); + ПараметрыВыполнения.Вставить("Результат", Результат); + + Обработчик = Новый ОписаниеОповещения( + "СкопироватьСодержимоеКаталогаПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); + + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Иначе + ВернутьРезультат(ОбработчикРезультата, Результат); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СкопироватьСодержимоеКаталогаПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) + + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения.Результат); + Иначе + СкопироватьСодержимоеКаталога( + ПараметрыВыполнения.ОбработчикРезультата, + ПараметрыВыполнения.КаталогИсточника, + ПараметрыВыполнения.КаталогПриемника); + КонецЕсли; + +КонецПроцедуры + +// Копирует все файлы в указанном каталоге в другой каталог +// +// Параметры +// Результат - Структура - Результат копирования. См. СкопироватьСодержимоеКаталога(), возвращаемое значение. +// КаталогИсточника - Строка - прежнее имя каталога +// КаталогПриемника - Строка - новое имя каталога +// +Процедура КопироватьСодержимоеКаталога(Результат, КаталогИсточника, КаталогПриемника) + + КаталогПриемника = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогПриемника, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + КаталогИсточника = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогИсточника, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + + СоздатьКаталог(КаталогПриемника); + + Результат.СкопированныеФайлыИПапки.Добавить(КаталогПриемника); + Результат.ОригинальныеФайлыИПапки.Добавить(КаталогИсточника); + + ФайлыИсточника = НайтиФайлы(КаталогИсточника, "*"); + + Для Каждого ФайлИсточника Из ФайлыИсточника Цикл + + ФайлИсточникаПолноеИмя = ФайлИсточника.ПолноеИмя; + ФайлИсточникаИмя = ФайлИсточника.Имя; + ФайлПриемникаПолноеИмя = КаталогПриемника + ФайлИсточникаИмя; + + Если ФайлИсточника.ЭтоКаталог() Тогда + + КопироватьСодержимоеКаталога(Результат, ФайлИсточникаПолноеИмя, ФайлПриемникаПолноеИмя); + Если Результат.ВозниклаОшибка Тогда + Возврат; + КонецЕсли; + + Иначе + + Результат.ОригинальныеФайлыИПапки.Добавить(ФайлИсточникаПолноеИмя); + + ФайлПриемника = Новый Файл(ФайлПриемникаПолноеИмя); + Если ФайлПриемника.Существует() Тогда + // Это нужно для обратного копирования - в этом случае файлы уже могут существовать. + Результат.СкопированныеФайлыИПапки.Добавить(ФайлПриемникаПолноеИмя); + Иначе + Попытка + КопироватьФайл(ФайлИсточникаПолноеИмя, ФайлПриемникаПолноеИмя); + Исключение + Результат.ВозниклаОшибка = Истина; + Результат.ИнформацияОбОшибке = ИнформацияОбОшибке(); + Результат.ПолноеИмяСбойногоФайла = ФайлИсточникаПолноеИмя; + Возврат; + КонецПопытки; + Результат.СкопированныеФайлыИПапки.Добавить(ФайлПриемникаПолноеИмя); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Перенос содержимого рабочего каталога в новый. + +// Переносит все файлы в рабочем каталоге в другой каталог (в том числе и взятые на редактирование) +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// КаталогИсточника - Строка - Прежнее имя каталога. +// КаталогПриемника - Строка - Новое имя каталога. +// +// Возвращаемое значение: +// Булево - Успешно ли выполнена операция. +// +Процедура ПеренестиСодержимоеРабочегоКаталога(ОбработчикРезультата, КаталогИсточника, КаталогПриемника) Экспорт + + // Новый путь является подмножеством старого. Это запрещено, т.к. может привести к зацикливанию. + Если Найти(НРег(КаталогПриемника), НРег(КаталогИсточника)) <> 0 Тогда + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выбранный рабочий каталог + |""%1"" + |входит в старый рабочий каталог + |""%2"".'"), + КаталогПриемника, + КаталогИсточника); + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Ложь); + Возврат; + КонецЕсли; + + // Копирование файлов из старого каталога в новый. + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("КаталогИсточника", КаталогИсточника); + ПараметрыОбработчика.Вставить("КаталогПриемника", КаталогПриемника); + Обработчик = Новый ОписаниеОповещения("ПеренестиСодержимоеРабочегоКаталогаПослеКопированияВНовыйКаталог", ЭтотОбъект, ПараметрыОбработчика); + + СкопироватьСодержимоеКаталога(Обработчик, КаталогИсточника, КаталогПриемника); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПеренестиСодержимоеРабочегоКаталогаПослеКопированияВНовыйКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ВозниклаОшибка Тогда + // Возникла ошибка копирования, затем пользователь отменил операцию. + + Обработчик = Новый ОписаниеОповещения( + "ПеренестиСодержимоеРабочегоКаталогаПослеОтменыИОчисткиПриемника", + ЭтотОбъект, + ПараметрыВыполнения); + + УдалитьСодержимоеКаталога(Обработчик, Результат.СкопированныеФайлыИПапки); // Очистка папки приемника. + Иначе + // Копирование прошло успешно. Очистка старого каталога. + Обработчик = Новый ОписаниеОповещения( + "ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОчисткиИсточника", + ЭтотОбъект, + ПараметрыВыполнения); + + УдалитьСодержимоеКаталога(Обработчик, Результат.ОригинальныеФайлыИПапки); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПеренестиСодержимоеРабочегоКаталогаПослеОтменыИОчисткиПриемника(КаталогПриемникаОчищен, ПараметрыВыполнения) Экспорт + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОчисткиИсточника(КаталогИсточникаОчищен, ПараметрыВыполнения) Экспорт + + Если КаталогИсточникаОчищен Тогда + // Старый каталог очищен. Все шаги операции успешно завершены. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + Иначе + // Старый каталог не очищен. Откат всей операции. + Обработчик = Новый ОписаниеОповещения("ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОтменыОчистки", ЭтотОбъект, ПараметрыВыполнения); + СкопироватьСодержимоеКаталога(Обработчик, ПараметрыВыполнения.КаталогПриемника, ПараметрыВыполнения.КаталогИсточника); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПеренестиСодержимоеРабочегоКаталогаПослеУспехаИОтменыОчистки(Результат, ПараметрыВыполнения) Экспорт + + // Откат операции. + Если Результат.ВозниклаОшибка Тогда + // Надо предупредить, что даже во время отката операции произошла ошибка. + ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось скопировать обратно содержимое каталога + |""%1"" + |в каталог + |""%2"".'"), + ПараметрыВыполнения.КаталогПриемника, + ПараметрыВыполнения.КаталогИсточника); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, Ложь); + Иначе + // Откат операции прошел успешно. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Удаление массива путей переданных папок и файлов. + +// Удаляет все файлы и папки из переданного массива. +// Обход с конца. +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// СкопированныеФайлыИПапки - Массив - (Строка) Массив путей файлов и папок. +// +// Возвращаемое значение: +// Булево - Успешно ли выполнена операция. +// +Процедура УдалитьСодержимоеКаталога(ОбработчикРезультата, СкопированныеФайлыИПапки) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("СкопированныеФайлыИПапки", СкопированныеФайлыИПапки); + ПараметрыВыполнения.Вставить("ВГраница", СкопированныеФайлыИПапки.Количество() - 1); + ПараметрыВыполнения.Вставить("Индекс", 0); + + УдалитьСодержимоеКаталогаЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УдалитьСодержимоеКаталогаЗапуск(ПараметрыВыполнения) + + Для Индекс = ПараметрыВыполнения.Индекс По ПараметрыВыполнения.ВГраница Цикл + Путь = ПараметрыВыполнения.СкопированныеФайлыИПапки[ПараметрыВыполнения.ВГраница - Индекс]; + Файл = Новый Файл(Путь); + Если Не Файл.Существует() Тогда + Продолжить; // Например временный файл Word ~aaa.doc мог быть удален при закрытии Word + КонецЕсли; + + Попытка + Если Файл.ЭтоФайл() И Файл.ПолучитьТолькоЧтение() Тогда + Файл.УстановитьТолькоЧтение(Ложь); + КонецЕсли; + УдалитьФайлы(Путь); + ФайлУдален = Истина; + Исключение + ФайлУдален = Ложь; + КонецПопытки; + + Если Не ФайлУдален Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось удалить файл + |""%1"". + |Возможно он занят другим приложением. + | + |Повторить операцию?'"), + Путь); + ПараметрыВыполнения.Индекс = Индекс; + Обработчик = Новый ОписаниеОповещения("УдалитьСодержимоеКаталогаПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + КонецЦикла; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УдалитьСодержимоеКаталогаПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Иначе + УдалитьСодержимоеКаталогаЗапуск(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Импорт файлов с проверкой размера. + +// Импорт - с вспомогательными операциями типа проверки предельного размера и впоследствии удаления файлов и показа ошибок +// при импорте только одной папки - вернет на нее ссылку +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПапкаДляДобавления - СправочникСсылка.ПапкиФайлов - Папка для добавления +// ВыбранныеФайлы - Массив - массив объектов "Файл" +// Комментарий - Строка - Комментарий +// ХранитьВерсии - Булево - Хранить версии +// УдалятьФайлыПослеДобавления - Булево - Удалять файлы после добавления +// Рекурсивно - Булево - Рекурсивно обходить подкаталоги +// ИдентификаторФормы - уникальный идентификатор формы +// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) +// ДобавленныеФайлы - Массив - Добавленные файлы +// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) +// +// Возвращаемое значение: +// Неопределено - Если импорт не выполнен. +// Структура - Если импорт выполнен. +// * ПапкаДляДобавленияТекущая - СправочникСсылка.ПапкиФайлов - Папка для добавления +// +Процедура ИмпортФайловВыполнить(ОбработчикРезультата, + ПапкаДляДобавления, + ВыбранныеФайлы, + Комментарий, + ХранитьВерсии, + УдалятьФайлыПослеДобавления, + Рекурсивно, + ИдентификаторФормы, + Знач ПсевдоФайловаяСистема, + ДобавленныеФайлы, + РежимЗагрузки = Ложь, + Кодировка = Неопределено) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПапкаДляДобавления", ПапкаДляДобавления); + ПараметрыВыполнения.Вставить("ВыбранныеФайлы", ВыбранныеФайлы); + ПараметрыВыполнения.Вставить("Комментарий", Комментарий); + ПараметрыВыполнения.Вставить("ХранитьВерсии", ХранитьВерсии); + ПараметрыВыполнения.Вставить("УдалятьФайлыПослеДобавления", УдалятьФайлыПослеДобавления); + ПараметрыВыполнения.Вставить("Рекурсивно", Рекурсивно); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ПсевдоФайловаяСистема", ПсевдоФайловаяСистема); + ПараметрыВыполнения.Вставить("ДобавленныеФайлы", ДобавленныеФайлы); + ПараметрыВыполнения.Вставить("РежимЗагрузки", РежимЗагрузки); + ПараметрыВыполнения.Вставить("Кодировка", Кодировка); + + Обработчик = Новый ОписаниеОповещения("ИмпортФайловПослеПроверкиРазмеров", ЭтотОбъект, ПараметрыВыполнения); + ПроверитьПредельныйРазмерФайлов(Обработчик, ПараметрыВыполнения.ВыбранныеФайлы, ПараметрыВыполнения.Рекурсивно, ПараметрыВыполнения.ПсевдоФайловаяСистема, ПараметрыВыполнения.РежимЗагрузки); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловПослеПроверкиРазмеров(Результат, ПараметрыВыполнения) Экспорт + + Состояние(); + + Если Результат.Успех = Ложь Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Вставить("КоличествоСуммарное", Результат.КоличествоСуммарное); + Если ПараметрыВыполнения.КоличествоСуммарное = 0 Тогда + Если ПараметрыВыполнения.РежимЗагрузки Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Иначе + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, НСтр("ru = 'Нет файлов для добавления'"), Неопределено); + КонецЕсли; + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Вставить("ПерваяПапкаСТакимЖеИменем", Неопределено); + ПараметрыВыполнения.Вставить("ПапкаДляДобавленияТекущая", Неопределено); + ПараметрыВыполнения.Вставить("ВыбранныеФайлыВГраница", ПараметрыВыполнения.ВыбранныеФайлы.Количество()-1); + ПараметрыВыполнения.Вставить("ВыбранныеФайлыИндекс", -1); + ПараметрыВыполнения.Вставить("Индикатор", 0); + ПараметрыВыполнения.Вставить("Счетчик", 0); + ПараметрыВыполнения.Вставить("МассивФайлов", Новый Массив); + ПараметрыВыполнения.Вставить("МассивИменФайловСОшибками", Новый Массив); + ПараметрыВыполнения.Вставить("МассивСтруктурВсехФайлов", Новый Массив); + ПараметрыВыполнения.Вставить("МассивВсехПапок", Новый Массив); + ПараметрыВыполнения.Вставить("МассивФайловЭтогоКаталога", Неопределено); + ПараметрыВыполнения.Вставить("ИмяПапки", Неопределено); + ПараметрыВыполнения.Вставить("Путь", Неопределено); + ПараметрыВыполнения.Вставить("ПапкаУжеНайдена", Неопределено); + ЗарегистрироватьОписаниеОбработчика(ПараметрыВыполнения, ЭтотОбъект, "ИмпортФайловЦиклПродолжитьИмпортПослеВопросовВРекурсии"); + ИмпортФайловЦикл(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловЦикл(ПараметрыВыполнения) + + ПараметрыВыполнения.ВыбранныеФайлыИндекс = ПараметрыВыполнения.ВыбранныеФайлыИндекс + 1; + Для Индекс = ПараметрыВыполнения.ВыбранныеФайлыИндекс По ПараметрыВыполнения.ВыбранныеФайлыВГраница Цикл + ПараметрыВыполнения.ВыбранныеФайлыИндекс = Индекс; + ИмяФайла = ПараметрыВыполнения.ВыбранныеФайлы[Индекс]; + + ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); + + ВыбранКаталог = Ложь; + Если ВыбранныйФайл.Существует() Тогда + ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); + КонецЕсли; + + Если ВыбранКаталог Тогда + ПараметрыВыполнения.Путь = ИмяФайла.Значение; + ПараметрыВыполнения.МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПараметрыВыполнения.ПсевдоФайловаяСистема, ПараметрыВыполнения.Путь); + + ПараметрыВыполнения.ИмяПапки = ВыбранныйФайл.Имя; + + ПараметрыВыполнения.ПапкаУжеНайдена = Ложь; + + Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.ПапкаДляДобавления, ПараметрыВыполнения.ПерваяПапкаСТакимЖеИменем) Тогда + Если ПараметрыВыполнения.РежимЗагрузки Тогда + ПараметрыВыполнения.ПапкаУжеНайдена = Истина; + ПараметрыВыполнения.ПапкаДляДобавленияТекущая = ПараметрыВыполнения.ПерваяПапкаСТакимЖеИменем; + Иначе + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Папка ""%1"" уже существует. + | + |Продолжить импорт папки?'"), + ПараметрыВыполнения.ИмяПапки); + Обработчик = Новый ОписаниеОповещения("ИмпортФайловЦиклПослеОтветаНаВопросПродолжить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + КонецЕсли; + ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; + КонецЕсли; + Иначе + ПараметрыВыполнения.МассивФайлов.Добавить(ВыбранныйФайл); + КонецЕсли; + КонецЦикла; + + ИмпортФайловПослеЦикла(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловЦиклПослеОтветаНаВопросПродолжить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> КодВозвратаДиалога.Нет Тогда + ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения); + КонецЕсли; + + ИмпортФайловЦикл(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловЦиклПродолжитьИмпорт(ПараметрыВыполнения) + + Если Не ПараметрыВыполнения.ПапкаУжеНайдена Тогда + ПараметрыВыполнения.ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(ПараметрыВыполнения.ИмяПапки, ПараметрыВыполнения.ПапкаДляДобавления); + КонецЕсли; + + // Собственно импорт + ИмпортФайловРекурсивно( + ПараметрыВыполнения, + ПараметрыВыполнения.ПапкаДляДобавленияТекущая, + ПараметрыВыполнения.МассивФайловЭтогоКаталога, + ПараметрыВыполнения.Индикатор, + ПараметрыВыполнения.МассивИменФайловСОшибками, + ПараметрыВыполнения.МассивСтруктурВсехФайлов, + ПараметрыВыполнения.Комментарий, + ПараметрыВыполнения.ХранитьВерсии, + ПараметрыВыполнения.Рекурсивно, + ПараметрыВыполнения.КоличествоСуммарное, + ПараметрыВыполнения.Счетчик, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ПсевдоФайловаяСистема, + ПараметрыВыполнения.ДобавленныеФайлы, + ПараметрыВыполнения.МассивВсехПапок, + ПараметрыВыполнения.РежимЗагрузки, + ПараметрыВыполнения.Кодировка); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; + КонецЕсли; + + ПараметрыВыполнения.МассивВсехПапок.Добавить(ПараметрыВыполнения.Путь); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловЦиклПродолжитьИмпортПослеВопросовВРекурсии(Результат, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Ложь; + ПараметрыВыполнения.МассивВсехПапок.Добавить(ПараметрыВыполнения.Путь); + ИмпортФайловЦикл(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловПослеЦикла(ПараметрыВыполнения) + + Если ПараметрыВыполнения.МассивФайлов.Количество() <> 0 Тогда + // Собственно импорт + ЗарегистрироватьОписаниеОбработчика(ПараметрыВыполнения, ЭтотОбъект, "ИмпортФайловПослеЦиклаПослеВопросовВРекурсии"); + ИмпортФайловРекурсивно( + ПараметрыВыполнения, + ПараметрыВыполнения.ПапкаДляДобавления, + ПараметрыВыполнения.МассивФайлов, + ПараметрыВыполнения.Индикатор, + ПараметрыВыполнения.МассивИменФайловСОшибками, + ПараметрыВыполнения.МассивСтруктурВсехФайлов, + ПараметрыВыполнения.Комментарий, + ПараметрыВыполнения.ХранитьВерсии, + ПараметрыВыполнения.Рекурсивно, + ПараметрыВыполнения.КоличествоСуммарное, + ПараметрыВыполнения.Счетчик, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ПсевдоФайловаяСистема, + ПараметрыВыполнения.ДобавленныеФайлы, + ПараметрыВыполнения.МассивВсехПапок, + ПараметрыВыполнения.РежимЗагрузки, + ПараметрыВыполнения.Кодировка); + Если ПараметрыВыполнения.АсинхронныйДиалог.Открыт = Истина Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловПослеЦиклаПослеВопросовВРекурсии(Результат, ПараметрыВыполнения) Экспорт + + ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловПослеЦиклаПродолжение(ПараметрыВыполнения) + + Если ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество() > 1 Тогда + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Импорт файлов завершен. Импортировано %1 файлов'"), Строка(ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество()) ); + + Если ПараметрыВыполнения.РежимЗагрузки Тогда + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Загрузка файлов завершена. Загружено %1 файлов'"), Строка(ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество()) ); + КонецЕсли; + + Состояние(ТекстСостояния); + Иначе + Состояние(); + КонецЕсли; + + Если ПараметрыВыполнения.УдалятьФайлыПослеДобавления = Истина Тогда + ФайловыеФункцииСлужебныйКлиентСервер.УдалитьФайлыПослеДобавления( + ПараметрыВыполнения.МассивСтруктурВсехФайлов, ПараметрыВыполнения.МассивВсехПапок, ПараметрыВыполнения.РежимЗагрузки); + КонецЕсли; + + Если ПараметрыВыполнения.МассивСтруктурВсехФайлов.Количество() = 1 Тогда + Элемент0 = ПараметрыВыполнения.МассивСтруктурВсехФайлов[0]; + Ссылка = ПолучитьНавигационнуюСсылку(элемент0.Файл); + ПоказатьОповещениеПользователя( + НСтр("ru = 'Изменение:'"), + ссылка, + Элемент0.Файл, + БиблиотекаКартинок.Информация32); + КонецЕсли; + + // Вывод сообщений об ошибках + Если ПараметрыВыполнения.МассивИменФайловСОшибками.Количество() <> 0 Тогда + Параметры = Новый Структура; + Параметры.Вставить("МассивИменФайловСОшибками", ПараметрыВыполнения.МассивИменФайловСОшибками); + Если ПараметрыВыполнения.РежимЗагрузки Тогда + Параметры.Вставить("Заголовок", "Отчет о загрузке файлов"); + КонецЕсли; + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаОтчета", Параметры); + КонецЕсли; + + Если ПараметрыВыполнения.ВыбранныеФайлы.Количество() <> 1 Тогда + ПараметрыВыполнения.ПапкаДляДобавленияТекущая = Неопределено; + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Сохранение Файла на диск + +// Сохранение на диск Файла +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - структура с данными файла +// УникальныйИдентификатор - уникальный идентификатор формы +// +// Возвращаемое значение: +// Строка - выбранный полный путь файла +// +Процедура СохранитьКак(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + СохранитьКакСРасширением(ПараметрыВыполнения); + Иначе + СохранитьКакБезРасширения(ПараметрыВыполнения); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакСРасширением(ПараметрыВыполнения) Экспорт + + // Проверим - если файл уже есть в кеше, и он новее чем в базе - дадим диалог с выбором + ПараметрыВыполнения.Вставить("ПутьКФайлуВКеше", ""); + Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда + ВРабочемКаталогеНаЧтение = Истина; + ВРабочемКаталогеВладельца = Ложь; + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ""); + ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + + Если ФайлВРабочемКаталоге = Истина Тогда + + ДатаФайлаВБазе = ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная; + + ФайлВерсии = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + ДатаФайлаНаДиске = ФайлВерсии.ПолучитьУниверсальноеВремяИзменения(); + + Если ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("Файл", ПараметрыВыполнения.ПолноеИмяФайла); + + Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Дата изменения файла ""%1"" + |в рабочем каталоге более поздняя (новее), чем в хранилище файлов. + |Возможно, файл был изменен.'"), + Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); + + ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); + + Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеОтветаНаВопросДатаНовее", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("Справочник.Файлы.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакСРасширениемПослеОтветаНаВопросДатаНовее(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Или Ответ = Неопределено Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); + Возврат; + КонецЕсли; + + Если Ответ = 1 Тогда // На основе файла на локальном компьютере + ПараметрыВыполнения.ПутьКФайлуВКеше = ПараметрыВыполнения.ПолноеИмяФайла; + КонецЕсли; + + СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакСРасширениемПродолжение(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("ПутьВыбора", ПараметрыВыполнения.ДанныеФайла.ПапкаДляСохранитьКак); + Если ПараметрыВыполнения.ПутьВыбора = Неопределено Или ПараметрыВыполнения.ПутьВыбора = "" Тогда + #Если Не ВебКлиент Тогда + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); + Возврат; + КонецЕсли; + #КонецЕсли + + ПараметрыВыполнения.ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); + КонецЕсли; + + ПараметрыВыполнения.Вставить("Пароль", ""); + ПараметрыВыполнения.Вставить("СохранятьСРасшифровкой", Ложь); + ПараметрыВыполнения.Вставить("РасширениеДляЗашифрованныхФайлов", ""); + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом + Если Не ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + Заголовок = НСтр("ru = 'Выбор режима сохранения'"); + ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов", + Заголовок, ПредставленияСертификатов); + Обработчик = Новый ОписаниеОповещения("СохранитьКакСРасширениемПослеСохраненияШифрованногоФайла", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + СохранитьКакСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакСРасширениемПослеСохраненияШифрованногоФайла(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Пароль = Результат.Пароль; + ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов = Результат.РасширениеДляЗашифрованныхФайлов; + + Если Результат.СохранятьСРасшифровкой = 1 Тогда + ПараметрыВыполнения.СохранятьСРасшифровкой = Истина; + Иначе + ПараметрыВыполнения.СохранятьСРасшифровкой = Ложь; + КонецЕсли; + + СохранитьКакСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакСРасширениемПослеПроверкиЗашифрован(ПараметрыВыполнения) + + ИмяСРасширением = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); + + Расширение = ПараметрыВыполнения.ДанныеФайла.Расширение; + + Если Не ПараметрыВыполнения.СохранятьСРасшифровкой Тогда + Если Не ПустаяСтрока(ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов) Тогда + ИмяСРасширением = ИмяСРасширением + "." + ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов; + Расширение = ПараметрыВыполнения.РасширениеДляЗашифрованныхФайлов; + КонецЕсли; + КонецЕсли; + + // выбираем путь к файлу на диске + ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + ВыборФайла.МножественныйВыбор = Ложь; + ВыборФайла.ПолноеИмяФайла = ИмяСРасширением; + Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Все файлы (*.%1)|*.%1'"), Расширение, Расширение); + ВыборФайла.Фильтр = Фильтр; + ВыборФайла.Каталог = ПараметрыВыполнения.ПутьВыбора; + + Если Не ВыборФайла.Выбрать() Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); + Возврат; + КонецЕсли; + + АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + Если ПараметрыВыполнения.ДанныеФайла.ТекущаяВерсия <> ПараметрыВыполнения.ДанныеФайла.Версия Тогда + АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( + ПараметрыВыполнения.ДанныеФайла.Версия, ПараметрыВыполнения.УникальныйИдентификатор); + КонецЕсли; + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, ПараметрыВыполнения.ДанныеФайла.Расширение); + + РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024); + + ТекстПояснения = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + + Состояние(ТекстПояснения); + + Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + Если Файл.Существует() Тогда + Если ПараметрыВыполнения.ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда + Файл.УстановитьТолькоЧтение(Ложь); + УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ПутьКФайлуВКеше = "" Тогда + + ПередаваемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, АдресФайла); + ПередаваемыеФайлы.Добавить(Описание); + + ПутьКФайлу = Файл.Путь; + ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + + // Сохраним Файл из БД на диск + Если ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + Если ПараметрыВыполнения.СохранятьСРасшифровкой Тогда + ПолноеИмяФайла = ВыборФайла.ПолноеИмяФайла; + + Попытка + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПараметрыВыполнения.Пароль; + + ПолноеИмяФайлаРасшифрованное = ПолноеИмяФайла + ".dec"; + МенеджерКриптографии.Расшифровать(ПолноеИмяФайла, ПолноеИмяФайлаРасшифрованное); + + УдалитьФайлы(ПолноеИмяФайла); + ПереместитьФайл(ПолноеИмяФайлаРасшифрованное, ПолноеИмяФайла); + Исключение + УдалитьФайлы(ПолноеИмяФайла); + ВызватьИсключение; + КонецПопытки; + КонецЕсли; + + + НовыйФайл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + + НовыйФайл.УстановитьУниверсальноеВремяИзменения( + ПараметрыВыполнения.ДанныеФайла.ДатаМодификацииУниверсальная); + + Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + Иначе + Если ПараметрыВыполнения.ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда + КопироватьФайл(ПараметрыВыполнения.ПутьКФайлуВКеше, ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); + КонецЕсли; + + ПутьВыбораПрежний = ПараметрыВыполнения.ПутьВыбора; + Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); + ПараметрыВыполнения.ПутьВыбора = Файл.Путь; + Если ПутьВыбораПрежний <> ПараметрыВыполнения.ПутьВыбора Тогда + ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляСохранитьКак", ПараметрыВыполнения.ПутьВыбора); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ВыборФайла.ПолноеИмяФайла); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьКакБезРасширения(ПараметрыВыполнения) Экспорт + + АдресФайла = ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла.Расширение); + + РазмерВМб = ПараметрыВыполнения.ДанныеФайла.Размер / (1024 * 1024); + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... + |Пожалуйста, подождите.'"), + ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + Состояние(ТекстСостояния); + + // Сохраним Файл из БД на диск + ПолучитьФайл(АдресФайла, ИмяФайла, Истина); + + // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения + Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда + УдалитьИзВременногоХранилища(АдресФайла); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ""); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Показывает напоминание перед помещением файла, если оно настроено. + +// Покажет напоминание - если стоит настройка +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +Процедура ПоказатьНапоминаниеПередПоместитьФайл(ОбработчикРезультата) + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + // Кешируем форму на клиенте + Форма = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаНапоминанияПередПоместитьФайл(); + УстановитьОповещениеФормы(Форма, ОбработчикРезультата); + Форма.Открыть(); + Возврат; + КонецЕсли; + КонецЕсли; + ВернутьРезультат(ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Проверяет размер файлов. + +// Проверить Предельный Размер Файлов - вернет Ложь, если есть файлы, превышающие предельный размер, +// и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена" +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ВыбранныеФайлы - Массив - массив объектов "Файл" +// Рекурсивно - Булево - Рекурсивно обходить подкаталоги +// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) +// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) +// +// Возвращаемое значение: +// Структура - Результат. +// * Успех - Булево - Успешно ли выполнена операция. +// * КоличествоСуммарное - Число - Количество импортированных файлов. +// +Процедура ПроверитьПредельныйРазмерФайлов(ОбработчикРезультата, ВыбранныеФайлы, Рекурсивно, + Знач ПсевдоФайловаяСистема, РежимЗагрузки = Ложь) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("КоличествоСуммарное", 0); + ПараметрыВыполнения.Вставить("Успех", Ложь); + + МассивСлишкомБольшихФайлов = Новый Массив; + + Путь = ""; + + МассивФайлов = Новый Массив; + + Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл + + Путь = ИмяФайла.Значение; + ВыбранныйФайл = Новый Файл(Путь); + + ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); + ВыбранКаталог = Ложь; + + Если ВыбранныйФайл.Существует() Тогда + ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); + КонецЕсли; + + Если ВыбранКаталог Тогда + Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сбор информации о каталоге + |""%1"". + |Пожалуйста, подождите.'"), + Путь)); + + МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь); + ОбходФайловДляПроверкиПредельногоРазмера(МассивФайловЭтогоКаталога, МассивСлишкомБольшихФайлов, Рекурсивно, ПараметрыВыполнения.КоличествоСуммарное, ПсевдоФайловаяСистема); + Иначе + МассивФайлов.Добавить(ВыбранныйФайл); + КонецЕсли; + КонецЦикла; + + Если МассивФайлов.Количество() <> 0 Тогда + ОбходФайловДляПроверкиПредельногоРазмера(МассивФайлов, МассивСлишкомБольшихФайлов, Рекурсивно, ПараметрыВыполнения.КоличествоСуммарное, ПсевдоФайловаяСистема); + КонецЕсли; + + // Был хоть один слишком большой файл + Если МассивСлишкомБольшихФайлов.Количество() <> 0 Тогда + ФайлыБольшие = Новый СписокЗначений; + Параметры = Новый Структура; + + Для Каждого Файл Из МассивСлишкомБольшихФайлов Цикл + БольшойФайл = Новый Файл(Файл); + РазмерФайлаВМб = Цел(БольшойФайл.Размер() / (1024 * 1024)); + ТекстСтроки = Строка(Файл) + " (" + Строка(РазмерФайлаВМб) + " " + НСтр("ru = 'МБ)'"); + ФайлыБольшие.Добавить(ТекстСтроки); + КонецЦикла; + + Параметры.Вставить("ФайлыБольшие", ФайлыБольшие); + Параметры.Вставить("РежимЗагрузки", РежимЗагрузки); + Параметры.Вставить("Заголовок", НСтр("ru = 'Предупреждение при загрузке файлов'")); + + Обработчик = Новый ОписаниеОповещения("ПроверитьПредельныйРазмерФайловПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("Справочник.Файлы.Форма.ВопросПриИмпортеФайлов", Параметры, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Успех = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ПроверитьПредельныйРазмерФайловПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + + ПараметрыВыполнения.Успех = (Ответ = КодВозвратаДиалога.ОК); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Показывает информацию о том, что файл не был изменен. + +// Покажет напоминание - если стоит настройка +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +Процедура ПоказатьИнформациюФайлНеБылИзменен(ОбработчикРезультата) + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + Если ПерсональныеНастройки.ПоказыватьИнформациюЧтоФайлНеБылИзменен = Истина Тогда + ОткрытьФорму("Справочник.Файлы.Форма.ИнформацияФайлНеБылИзменен", , , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Иначе + ВернутьРезультат(ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открывает диалог выбора сертификатов. + +// Открыть диалог выбора сертификатов с отмеченным своим сертификатом +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла +// +Процедура ВыбратьСертификатыДляШифрования(ОбработчикРезультата, ДанныеФайла) Экспорт + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("МассивСтруктурСертификатов", ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь)); + ПараметрыВыполнения.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ПерсональныеНастройки.ОтпечатокЛичногоСертификатаДляШифрования); + + // отпечаток сохраненный в ХранилищеНастроек мог устареть - сертификат могли уже удалить + Если ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено + И Не ПустаяСтрока(ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования) Тогда + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные + Если Сертификат = Неопределено Тогда + ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования = ""; + КонецЕсли; + КонецЕсли; + + Если ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования = Неопределено + Или ПустаяСтрока(ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования) Тогда + МассивСтруктурЛичныхСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные + ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов", ПараметрыВыполнения.МассивСтруктурЛичныхСертификатов); + Обработчик = Новый ОписаниеОповещения("ВыбратьСертификатыДляШифрованияПослеВыбораЛичногоСертификата", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ПерсональныеСертификатыДляШифрования", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + ВыбратьСертификатыДляШифрованияНачатьВыборСертификатаШифрования(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ВыбратьСертификатыДляШифрованияПослеВыбораЛичногоСертификата(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ТекстПредупреждения = НСтр("ru = 'Не выбран персональный сертификат для шифрования.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, Ложь); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования = Результат.Отпечаток; + + ВыбратьСертификатыДляШифрованияНачатьВыборСертификатаШифрования(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ВыбратьСертификатыДляШифрованияНачатьВыборСертификатаШифрования(ПараметрыВыполнения) + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивСтруктурСертификатов", ПараметрыВыполнения.МассивСтруктурСертификатов); + ПараметрыФормы.Вставить("ФайлСсылка", ПараметрыВыполнения.ДанныеФайла.Ссылка); + ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", + ПараметрыВыполнения.ОтпечатокЛичногоСертификатаДляШифрования); + + ОткрытьФорму("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы, , , , , ПараметрыВыполнения.ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Загружает отредактированный файл в программу, снимает блокировку и рассылает оповещение. + +// Сохраняет отредактированный файл в ИБ и снимает с него блокировку +Процедура ЗакончитьРедактированиеСОповещением( + ОбработчикРезультата, + ПараметрКоманды, + ИдентификаторФормы, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + Знач АвторТекущейВерсии = Неопределено, + Знач Кодировка = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + ВернутьРезультат(ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); + Обработчик = Новый ОписаниеОповещения("ЗакончитьРедактированиеСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); + + ЗакончитьРедактирование( + Обработчик, + ПараметрКоманды, + ИдентификаторФормы, + ХранитьВерсии, + РедактируетТекущийПользователь, + Редактирует, + АвторТекущейВерсии, + "", //ПереданныйПолныйПутьКФайлу + Неопределено, //СоздатьНовуюВерсию + Неопределено, //КомментарийКВерсии + Истина, //ПоказыватьОповещение + Ложь, //ПрименитьКоВсем + Истина, //ОсвобождатьФайлы + Кодировка); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗакончитьРедактированиеСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + Оповестить("Запись_Файл", Новый Структура("Событие", "ЗаконченоРедактирование"), ПараметрыВыполнения.ПараметрКоманды); + ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ПараметрыВыполнения.ПараметрКоманды); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Захватывает файл, открывает диалог редактирования и рассылает оповещение. + +// Блокирует файл для редактирования и открывает его +Процедура РедактироватьСОповещением( + ОбработчикРезультата, + ОбъектСсылка, + УникальныйИдентификатор = Неопределено, + РабочийКаталогВладельца = Неопределено) Экспорт + + Если ОбъектСсылка = Неопределено Тогда + ВернутьРезультат(ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ОбъектСсылка", ОбъектСсылка); + Обработчик = Новый ОписаниеОповещения("РедактироватьСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); + РедактироватьФайлПоСсылке(Обработчик, ОбъектСсылка, УникальныйИдентификатор, РабочийКаталогВладельца); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РедактироватьСОповещениемЗавершение(ФайлОтредактирован, ПараметрыВыполнения) Экспорт + + Если ФайлОтредактирован Тогда + ОповеститьОбИзменении(ПараметрыВыполнения.ОбъектСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ОбъектСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ФайлРедактировался"), ПараметрыВыполнения.ОбъектСсылка); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Захватывает файл или несколько файлов и рассылает оповещение. + +// Выполняет блокировку файла или нескольких файлов +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПараметрКоманды - либо ссылка на файл, либо массив ссылок на файлы +// УникальныйИдентификатор +// +Процедура ЗанятьСОповещением(ОбработчикРезультата, ПараметрКоманды, УникальныйИдентификатор = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + ВернутьРезультат(ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + Обработчик = Новый ОписаниеОповещения("ЗанятьСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ЗанятьФайлыПоСсылкам(Обработчик, ПараметрКоманды); + Иначе + Обработчик = Новый ОписаниеОповещения("ЗанятьСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ЗанятьФайлПоСсылке(Обработчик, ПараметрКоманды, УникальныйИдентификатор) + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗанятьСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт + + ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); + Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + КонецЦикла; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗанятьСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Снимает блокировку файла и рассылает оповещение. + +// Освобождает занятый ранее файл. +Процедура ОсвободитьФайлСОповещением( + ОбработчикРезультата, + ПараметрКоманды, + Знач ХранитьВерсии = Неопределено, + Знач РедактируетТекущийПользователь = Неопределено, + Знач Редактирует = Неопределено, + УникальныйИдентификатор = Неопределено) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + ВернутьРезультат(ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОсвободитьФайлыПоСсылкам(Обработчик, ПараметрКоманды); + Иначе + Обработчик = Новый ОписаниеОповещения("ОсвободитьФайлСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОсвободитьФайл( + Обработчик, + ПараметрКоманды, + ХранитьВерсии, + РедактируетТекущийПользователь, + Редактирует, + УникальныйИдентификатор); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт + + ОповеститьОбИзменении(Тип("СправочникСсылка.Файлы")); + Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + КонецЦикла; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОсвободитьФайлСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + ОповеститьОбИзменении(ПараметрыВыполнения.ПараметрКоманды); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Открывает файл и рассылает оповещение. + +// Открывает файл. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// УникальныйИдентификатор - УникальныйИдентификатор - Формы. +// +Процедура ОткрытьФайлСОповещением(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + // Если Файл без файла, тогда открыть карточку. + Если ПараметрыВыполнения.ДанныеФайла.Версия.Пустая() Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьЗначение(Обработчик, ПараметрыВыполнения.ДанныеФайла.Ссылка); + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемПослеУстановкиРасширения", ЭтотОбъект, ПараметрыВыполнения); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(Обработчик); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьФайлСОповещениемПослеУстановкиРасширения(РасширениеУстановлено, ПараметрыВыполнения) Экспорт + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог", ЭтотОбъект, ПараметрыВыполнения); + ПолучитьФайлВерсииВРабочийКаталог( + Обработчик, + ПараметрыВыполнения.ДанныеФайла, + "", + ПараметрыВыполнения.УникальныйИдентификатор, + Новый Структура("ОткрытьФайл", Истина)); + Иначе + Если ПараметрыВыполнения.ДанныеФайла.РедактируетТекущийПользователь Тогда + Обработчик = Новый ОписаниеОповещения("ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания", ЭтотОбъект, ПараметрыВыполнения); + ФайловыеФункцииСлужебныйКлиент.ВывестиНапоминаниеПриРедактировании(Обработчик); + Иначе + ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания(-1, ПараметрыВыполнения); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьФайлСОповещениемСРасширениемПослеПолученияВерсииВРабочийКаталог(Результат, ПараметрыВыполнения) Экспорт + + Если Результат.ФайлПолучен = Истина Тогда + ОткрытьФайлПриложением(ПараметрыВыполнения.ДанныеФайла, Результат.ПолноеИмяФайла); + КонецЕсли; + + ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьФайлСОповещениемБезРасширенияПослеНапоминания(Результат, ПараметрыВыполнения) Экспорт + + ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( + ПараметрыВыполнения.ДанныеФайла.ПолноеНаименованиеВерсии, + ПараметрыВыполнения.ДанныеФайла.Расширение); + + ПолучитьФайл(ПараметрыВыполнения.ДанныеФайла.НавигационнаяСсылкаТекущейВерсии, ИмяФайла, Истина); + + // При хранении файлов на диске (на сервере) файл удаляется из временного хранилища не сразу: + // - удаляется, либо при следующем вызове ПолучитьДанныеФайлаДляОткрытия, либо не удаляется; + // - удаляется при закрытии формы автоматически. + + ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОткрытьФайлСОповещениемЗавершение(ПараметрыВыполнения) Экспорт + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Событие", "ФайлОткрыт"); + Оповестить("ФайлОткрыт", ПараметрыОповещения, ПараметрыВыполнения.ДанныеФайла.Ссылка); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Загружает файл в программу и рассылает оповещение. + +// Сохраняет файл в информационной базе, но не освобождает его. +Процедура ОпубликоватьФайлСОповещением(ОбработчикРезультата, ПараметрКоманды, ИдентификаторФормы) Экспорт + + Если ПараметрКоманды = Неопределено Тогда + ВернутьРезультат(ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ПараметрКоманды", ПараметрКоманды); + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") Тогда + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСОповещениемМассивФайловЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОпубликоватьФайлыПоСсылкам(Обработчик, ПараметрКоманды, ИдентификаторФормы); + Иначе + Обработчик = Новый ОписаниеОповещения("ОпубликоватьФайлСОповещениемОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОпубликоватьФайл(Обработчик, ПараметрКоманды, ИдентификаторФормы); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСОповещениемМассивФайловЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Для Каждого ФайлСсылка Из ПараметрыВыполнения.ПараметрКоманды Цикл + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ФайлСсылка); + КонецЦикла; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОпубликоватьФайлСОповещениемОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ПараметрКоманды); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ПараметрыВыполнения.ПараметрКоманды); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Показывает диалог выбора файла на диске, загружает выбранный файл в программу как версию и рассылает оповещение. + +// Выбирает на диске файл и создает из него новую версию. +Процедура ОбновитьИзФайлаНаДискеСОповещением(ОбработчикРезультата, ДанныеФайла, ИдентификаторФормы) Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + Обработчик = Новый ОписаниеОповещения("ОбновитьИзФайлаНаДискеСОповещениемЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОбновитьИзФайлаНаДиске(Обработчик, ДанныеФайла, ИдентификаторФормы); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ОбновитьИзФайлаНаДискеСОповещениемЗавершение(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Истина Тогда + ОповеститьОбИзменении(ПараметрыВыполнения.ДанныеФайла.Ссылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ПараметрыВыполнения.ДанныеФайла.Ссылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ВерсияСохранена"), ПараметрыВыполнения.ДанныеФайла.Ссылка); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Шифрование файла. + +// Зашифровать файл. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура с данными файла. +// УникальныйИдентификатор - УникальныйИдентификатор формы. +// +// Возвращаемое значение: +// Структура - Результат. +// * Успех - Булево - успешно ли выполнена операция. +// * МассивДанныхДляЗанесенияВБазу - Массив - Массив данных для записи в программу. +// * МассивОтпечатков - Массив - Массив отпечатков. +// +Процедура Зашифровать(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + ЗашифроватьЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗашифроватьЗапуск(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("Успех", Ложь); + ПараметрыВыполнения.Вставить("МассивДанныхДляЗанесенияВБазу", Новый Массив); + ПараметрыВыполнения.Вставить("МассивОтпечатков", Новый Массив); + + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + ТекстПредупреждения = НСтр("ru = 'Файл ""%1"" уже зашифрован.'"); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", Строка(ПараметрыВыполнения.ДанныеФайла.Ссылка)); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + Если Не ПараметрыВыполнения.ДанныеФайла.Редактирует.Пустая() Тогда + ТекстПредупреждения = НСтр("ru = 'Нельзя зашифровать занятый файл.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); + + ПараметрыВыполнения.Вставить("ОтпечатокЛичногоСертификата", ПерсональныеНастройки.ОтпечатокЛичногоСертификатаДляШифрования); + + // отпечаток сохраненный в ХранилищеНастроек мог устареть - сертификат могли уже удалить + Если ПараметрыВыполнения.ОтпечатокЛичногоСертификата <> Неопределено + И Не ПустаяСтрока(ПараметрыВыполнения.ОтпечатокЛичногоСертификата) Тогда + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ПараметрыВыполнения.ОтпечатокЛичногоСертификата, Истина); + Если Сертификат = Неопределено Тогда + ПараметрыВыполнения.ОтпечатокЛичногоСертификата = ""; + КонецЕсли; + Иначе + ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов", ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина)); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеПроверкиЛичногоСертификата", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ПерсональныеСертификатыДляШифрования", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + КонецЕсли; + + ЗашифроватьПослеПроверкиЛичногоСертификата(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗашифроватьПослеПроверкиЛичногоСертификата(Результат, ПараметрыВыполнения) Экспорт + + Если Результат <> -1 Тогда + Если ТипЗнч(Результат) = Тип("Структура") Тогда + ПараметрыВыполнения.ОтпечатокЛичногоСертификата = Результат.Отпечаток; + Иначе + ТекстПредупреждения = НСтр("ru = 'Не выбран персональный сертификат для шифрования.'"); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + КонецЕсли; + + МассивСтруктурСертификатов = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь); + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурСертификатов); + ПараметрыФормы.Вставить("ФайлСсылка", ПараметрыВыполнения.ДанныеФайла.Ссылка); + ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ПараметрыВыполнения.ОтпечатокЛичногоСертификата); + + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеВыбораСертификатов", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗашифроватьПослеВыбораСертификатов(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Массив") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПараметрыВыполнения.Вставить("МассивСертификатов", Результат); + + // не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные + + ПараметрыВыполнения.МассивОтпечатков = Новый Массив; + Для Каждого Сертификат Из ПараметрыВыполнения.МассивСертификатов Цикл + Отпечаток = Base64Строка(Сертификат.Отпечаток); + Представление = ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); + ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); + + ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата); + ПараметрыВыполнения.МассивОтпечатков.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + КоличествоВерсий = ПараметрыВыполнения.ДанныеФайла.КоличествоВерсий; + + Если КоличествоВерсий > 1 Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Будет выполнено шифрование всех %1 версий файла. + |Это может занять продолжительное время. + | + |Продолжить шифрование файла?'"), + КоличествоВерсий); + Обработчик = Новый ОписаниеОповещения("ЗашифроватьПослеОтветаНаВопросПродолжить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + + ЗашифроватьПослеОтветаНаВопросПродолжить(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ЗашифроватьПослеОтветаНаВопросПродолжить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> -1 Тогда + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + КонецЕсли; + + МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.УникальныйИдентификатор); + + Если МассивВерсий.Количество() = 0 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Получение всех версий файла ""%1"".'"), + ПараметрыВыполнения.ДанныеФайла.Ссылка); + Состояние(ТекстСостояния, 0); + + МассивОбъектовШифрования = Новый Массив; + Счетчик = 0; + Для Каждого СтруктураВерсии Из МассивВерсий Цикл + + Прогресс = Счетчик / МассивВерсий.Количество() * 100; + Состояние(ТекстСостояния, Прогресс); + + ПараметрыВыполнения.ДанныеФайла = СтруктураВерсии.ДанныеФайла; + АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); + + СтруктураДляШифрования = Новый Структура; + СтруктураДляШифрования.Вставить("ДвоичныеДанные", ДвоичныеДанные); + СтруктураДляШифрования.Вставить("ВерсияСсылка", СтруктураВерсии.ВерсияСсылка); + СтруктураДляШифрования.Вставить("АдресФайла", АдресФайла); + + МассивОбъектовШифрования.Добавить(СтруктураДляШифрования); + + Счетчик = Счетчик + 1; + + КонецЦикла; + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Шифрование всех версий файла ""%1"".'"), + ПараметрыВыполнения.ДанныеФайла.Ссылка); + Состояние(ТекстСостояния); + + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу = Новый Массив; + + Для Каждого СтруктураДляШифрования Из МассивОбъектовШифрования Цикл + + ДвоичныеДанные = СтруктураДляШифрования.ДвоичныеДанные; + ВерсияСсылка = СтруктураДляШифрования.ВерсияСсылка; + + ШифрованныйФайлДвоичныеДанные = МенеджерКриптографии.Зашифровать(ДвоичныеДанные, ПараметрыВыполнения.МассивСертификатов); + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ШифрованныйФайлДвоичныеДанные, ПараметрыВыполнения.УникальныйИдентификатор); + + ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка, АдресФайла, АдресВременногоХранилищаТекста", + АдресВременногоХранилища, ВерсияСсылка, СтруктураДляШифрования.АдресФайла, ""); + ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + + КонецЦикла; + + ПараметрыВыполнения.Успех = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Расшифровка файла. + +// Расшифрует объект - Файл, Версия +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ФайлСсылка - СправочникСсылка.Файлы - файл +// УникальныйИдентификатор - уникальный идентификатор формы +// ДанныеФайла - структура с данными файла +// +// Возвращаемое значение: +// Структура - Результат. +// * Успех - Булево - успешно ли выполнена операция. +// * МассивДанныхДляЗанесенияВБазу - Массив структур +// +Процедура Расшифровать(ОбработчикРезультата, ФайлСсылка, УникальныйИдентификатор, ДанныеФайла) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ФайлСсылка", ФайлСсылка); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + + РасшифроватьЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РасшифроватьЗапуск(ПараметрыВыполнения) + + ПараметрыВыполнения.Вставить("Успех", Ложь); + ПараметрыВыполнения.Вставить("МассивДанныхДляЗанесенияВБазу", Новый Массив); + // не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные + + ПредставленияСертификатов = ""; + Для Каждого СтруктураСертификата Из ПараметрыВыполнения.ДанныеФайла.МассивСертификатовШифрования Цикл + + Отпечаток = СтруктураСертификата.Отпечаток; + + ТолькоВЛичномХранилище = Истина; // тут собираем только личные сертификаты - с закрытым ключом + Сертификат = ЭлектроннаяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); + Если Сертификат <> Неопределено Тогда + Если Не ПустаяСтрока(ПредставленияСертификатов) Тогда + ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; + КонецЕсли; + ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; + КонецЕсли; + + КонецЦикла; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Введите пароль для расшифровки'")); + ПараметрыФормы.Вставить("ПредставленияСертификатов", ПредставленияСертификатов); + ПараметрыФормы.Вставить("Файл", ПараметрыВыполнения.ФайлСсылка); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеВводаПароля", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РасшифроватьПослеВводаПароля(Пароль, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Пароль) <> Тип("Строка") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + ПараметрыВыполнения.Вставить("Пароль", Пароль); + + КоличествоВерсий = ПараметрыВыполнения.ДанныеФайла.КоличествоВерсий; + Если КоличествоВерсий > 1 Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Будет выполнена расшифровка всех версий файла (%1). + |Это может занять продолжительное время. + | + |Продолжить расшифровку файла?'"), + КоличествоВерсий); + Обработчик = Новый ОписаниеОповещения("РасшифроватьПослеОтветаНаВопросПродолжить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + Возврат; + КонецЕсли; + + РасшифроватьПослеОтветаНаВопросПродолжить(-1, ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура РасшифроватьПослеОтветаНаВопросПродолжить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> -1 Тогда + Если Ответ = КодВозвратаДиалога.Нет Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + КонецЕсли; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется получение всех версий файла ""%1"".'"), + ПараметрыВыполнения.ФайлСсылка); + + Состояние(ТекстСообщения, 0); + + МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла( + ПараметрыВыполнения.ФайлСсылка, ПараметрыВыполнения.УникальныйИдентификатор); + + МассивОбъектовШифрования = Новый Массив; + Счетчик = 0; + Для Каждого СтруктураВерсии Из МассивВерсий Цикл + + Прогресс = Счетчик / МассивВерсий.Количество() * 100; + Состояние(ТекстСообщения, Прогресс); + + ПараметрыВыполнения.ДанныеФайла = СтруктураВерсии.ДанныеФайла; + АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; + + ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); + + СтруктураДляШифрования = Новый Структура("ДвоичныеДанные, ВерсияСсылка, АдресФайла, Расширение", + ДвоичныеДанные, СтруктураВерсии.ВерсияСсылка, АдресФайла, ПараметрыВыполнения.ДанныеФайла.Расширение); + + МассивОбъектовШифрования.Добавить(СтруктураДляШифрования); + Счетчик = Счетчик + 1; + + КонецЦикла; + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выполняется расшифровка всех версий файла ""%1"".'"), + ПараметрыВыполнения.ФайлСсылка); + Состояние(ТекстСообщения); + + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = ПараметрыВыполнения.Пароль; + + ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу = Новый Массив; + ИзвлекатьТекстыФайловНаСервере = + ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами( + ).ИзвлекатьТекстыФайловНаСервере; + + Для Каждого СтруктураДляШифрования Из МассивОбъектовШифрования Цикл + + ДвоичныеДанные = СтруктураДляШифрования.ДвоичныеДанные; + ВерсияСсылка = СтруктураДляШифрования.ВерсияСсылка; + + ДвоичныеДанныеРасшифрованные = МенеджерКриптографии.Расшифровать(ДвоичныеДанные); + АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРасшифрованные, ПараметрыВыполнения.УникальныйИдентификатор); + + АдресВременногоХранилищаТекста = ""; + #Если Не ВебКлиент Тогда + Если Не ИзвлекатьТекстыФайловНаСервере Тогда + ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла(СтруктураДляШифрования.Расширение); + ДвоичныеДанныеРасшифрованные.Записать(ПолныйПутьКФайлу); + + АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ПолныйПутьКФайлу, ПараметрыВыполнения.УникальныйИдентификатор); + + УдалитьФайлы(ПолныйПутьКФайлу); + Иначе + АдресВременногоХранилищаТекста = ""; + КонецЕсли; + #КонецЕсли + + ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка, АдресФайла, АдресВременногоХранилищаТекста", + АдресВременногоХранилища, ВерсияСсылка, СтруктураДляШифрования.АдресФайла, АдресВременногоХранилищаТекста); + ПараметрыВыполнения.МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); + + КонецЦикла; + + ПараметрыВыполнения.Успех = Истина; + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Сохраняет файл с электронной подписью. + +// СохранитьКак вместе с ЭП. +Процедура СохранитьСПодписью(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор) Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + ФайловыеФункцииСлужебныйКлиент.ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата); + Возврат; + КонецЕсли; + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + + Сценарий = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().ДействияПриСохраненииСЭП; + + ПараметрыВыполнения.Вставить("МассивСтруктурПодписей", Неопределено); + + Если Сценарий = "Спрашивать" Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Объект", ДанныеФайла.ТекущаяВерсия); + ПараметрыФормы.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("СохранитьСПодписьюПослеВыбораМассиваПодписей", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ВыборПодписей", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + Возврат; + + ИначеЕсли Сценарий = "СохранятьВсеПодписи" Тогда + + ПараметрыВыполнения.МассивСтруктурПодписей = РаботаСФайламиСлужебныйВызовСервера.ПолучитьВсеПодписи(ДанныеФайла.Ссылка, УникальныйИдентификатор); + СохранитьСПодписьюПослеВыбораМассиваПодписей(-1, ПараметрыВыполнения); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьСПодписьюПослеВыбораМассиваПодписей(Результат, ПараметрыВыполнения) Экспорт + + Если Результат <> -1 Тогда + ПараметрыВыполнения.МассивСтруктурПодписей = Результат; + КонецЕсли; + + Если ТипЗнч(ПараметрыВыполнения.МассивСтруктурПодписей) <> Тип("Массив") + Или ПараметрыВыполнения.МассивСтруктурПодписей.Количество() = 0 Тогда + // В сценарии "Спрашивать" - пользователь не выбрал подписи. + // В сценарии "СохранятьВсеПодписи" - подписи не найдены. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + Обработчик = Новый ОписаниеОповещения("СохранитьСПодписьюПослеСохраненияФайла", ЭтотОбъект, ПараметрыВыполнения); + СохранитьКак(Обработчик, ПараметрыВыполнения.ДанныеФайла, ПараметрыВыполнения.УникальныйИдентификатор); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СохранитьСПодписьюПослеСохраненияФайла(ПолноеИмяФайла, ПараметрыВыполнения) Экспорт + + Если ПолноеИмяФайла <> "" Тогда + ЭлектроннаяПодписьКлиент.СохранитьПодписи( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПолноеИмяФайла, + ПараметрыВыполнения.УникальныйИдентификатор, + ПараметрыВыполнения.МассивСтруктурПодписей); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Создает новый файл. + +// Создает новый файл интерактивно. +// Происходит вызов диалога выбора режима создания Файла. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено- Описание процедуры, принимающей результат работы метода. +// +// ВладелецФайла - определяет группу, в которой создается Элемент, если +// группа неизвестна в момент вызова этого метода - там будет Неопределено. +// +// ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. +// +// РежимСоздания - Число: +// 1 - создать из шаблона, +// 2 - создать из файла, +// 3 - создать пустую карточку. +// +// НеОткрыватьКарточкуПослеСозданияИзФайла - Булево, когда Истина +// карточка файла не открывается после создания. +// +Процедура ДобавитьФайл( + ОбработчикРезультата, + ВладелецФайла, + ФормаВладелец, + РежимСоздания = 1, + НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ВладелецФайла", ВладелецФайла); + ПараметрыВыполнения.Вставить("ФормаВладелец", ФормаВладелец); + ПараметрыВыполнения.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла); + + ФормаВозврата = РаботаСФайламиСлужебныйКлиентПовтИсп.ФормаВыбораВариантаСозданияНовогоФайла(); + ФормаВозврата.УстановитьПараметрыИспользования(РежимСоздания); + + Обработчик = Новый ОписаниеОповещения("ДобавитьПослеВыбораРежимаСоздания", ЭтотОбъект, ПараметрыВыполнения); + УстановитьОповещениеФормы(ФормаВозврата, Обработчик); + + ФормаВозврата.Открыть(); + +КонецПроцедуры + +// Создает новый файл. +// +// Параметры: +// РежимСоздания - Число - Режим создания файла. +// * 1 - Создать из шаблона. +// * 2 - Создать из файла. +// * 3 - Создать пустую карточку. +// ПараметрыДобавления - Структура: +// * ОбработчикРезультата - ОписаниеОповещения, Неопределено +// - Описание процедуры, принимающей результат работы метода. +// * ВладелецФайла - ЛюбаяСсылка - владелец файла. +// * ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. +// * НеОткрыватьКарточкуПослеСозданияИзФайла - Булево +// - Истина когда карточка файла не открывается после создания. +// +Процедура ДобавитьПослеВыбораРежимаСоздания(РежимСоздания, ПараметрыВыполнения) Экспорт + + Если РежимСоздания = 1 Тогда // Скопировать другой файла. + ДобавитьНаОсновеШаблона(ПараметрыВыполнения); + ИначеЕсли РежимСоздания = 2 Тогда // Загрузить из файловой системы. + Если ПодключитьРасширениеРаботыСФайлами() Тогда + ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения); + Иначе + ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); + КонецЕсли; + ИначеЕсли РежимСоздания = 3 Тогда // Считать со сканера. + ДобавитьСоСканера(ПараметрыВыполнения); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ДобавитьНаОсновеШаблона(ПараметрыВыполнения) Экспорт + + // Скопировать другой файла. + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ВыборШаблона", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ПредопределенноеЗначение("Справочник.ПапкиФайлов.Шаблоны")); + Обработчик = Новый ОписаниеОповещения("ДобавитьНаОсновеШаблонаПослеВыбораШаблона", ЭтотОбъект, ПараметрыВыполнения); + РежимОткрытия = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; + ОткрытьФорму("Справочник.Файлы.Форма.ФормаВыбора", ПараметрыФормы, , , , , Обработчик, РежимОткрытия); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ДобавитьНаОсновеШаблонаПослеВыбораШаблона(Результат, ПараметрыВыполнения) Экспорт + + Если Результат = Неопределено Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ФайлОснование", Результат); + ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); + ПараметрыФормы.Вставить("РежимСоздания", "ИзШаблона"); + ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + +КонецПроцедуры + +// На основе переданного пути к файлу на диске создает Файл его и открывает карточку +// +// ПараметрыДобавления - Структура: +// * ОбработчикРезультата - ОписаниеОповещения, Неопределено +// - Описание процедуры, принимающей результат работы метода. +// * ПолноеИмяФайла - Строка - Необязательный. Полный путь и имя файла на клиенте. +// Если не указан, то будет открыт диалог для выбора файла. +// * ВладелецФайла - ЛюбаяСсылка - владелец файла. +// * ФормаВладелец - УправляемаяФорма из которой вызвано создание файла. +// * НеОткрыватьКарточкуПослеСозданияИзФайла - Булево +// - Истина когда карточка файла не открывается после создания. +// * ИмяСоздаваемогоФайла - Строка - Необязательный. Новое имя файла. +// +Процедура ДобавитьИзФайловойСистемыСРасширением(ПараметрыВыполнения) Экспорт + + Результат = ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения); + Если Не Результат.ФайлДобавлен Тогда + Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, Результат.ТекстОшибки, Неопределено); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Ключ", Результат.ФайлСсылка); + ПараметрыФормы.Вставить("КарточкаОткрытаПослеСозданияФайла", Истина); + + ОбработчикДиалога = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикДиалога); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// На основе переданного пути к файлу на диске создает Файл его и открывает карточку +// +// ПараметрыДобавления - Структура: +// * ПолноеИмяФайла - Строка - Необязательный. Полный путь и имя файла на клиенте. +// Если не указан, то будет открыт синхронный диалог для выбора файла. +// * ВладелецФайла - ЛюбаяСсылка - владелец файла. +// * УникальныйИдентификатор - УникальныйИдентификатор - Идентификатор формы для хранения файла. +// * ИмяСоздаваемогоФайла - Строка - Необязательный. Новое имя файла. +// +// Возвращаемое значение: +// Структура - Результат. +// * ФайлДобавлен - Булево - успешно ли выполнена операция. +// * ФайлСсылка - СправочникСсылка.Файлы +// * ТекстОшибки - Строка +// +Функция ДобавитьИзФайловойСистемыСРасширениемСинхронно(ПараметрыВыполнения) Экспорт + + Результат = Новый Структура; + Результат.Вставить("ФайлДобавлен", Ложь); + Результат.Вставить("ФайлСсылка", Неопределено); + Результат.Вставить("ТекстОшибки", ""); + + Если Не ПараметрыВыполнения.Свойство("ПолноеИмяФайла") Тогда + // Загрузить из файловой системы с расширением работы с файлами. + ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + ДиалогВыбораФайла.МножественныйВыбор = Ложь; + ДиалогВыбораФайла.Заголовок = НСтр("ru = 'Выбор файла'"); + ДиалогВыбораФайла.Фильтр = НСтр("ru = 'Все файлы (*.*)|*.*'"); + ДиалогВыбораФайла.Каталог = РаботаСФайламиСлужебныйВызовСервера.РабочийКаталогПапки(ПараметрыВыполнения.ВладелецФайла); + Если НЕ ДиалогВыбораФайла.Выбрать() Тогда + Возврат Результат; + КонецЕсли; + ПараметрыВыполнения.Вставить("ПолноеИмяФайла", ДиалогВыбораФайла.ПолноеИмяФайла); + КонецЕсли; + + Если Не ПараметрыВыполнения.Свойство("ИмяСоздаваемогоФайла") Тогда + ПараметрыВыполнения.Вставить("ИмяСоздаваемогоФайла", Неопределено); + КонецЕсли; + + ФайлКлиента = Новый Файл(ПараметрыВыполнения.ПолноеИмяФайла); + + ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла(ФайлКлиента); + + ОбщиеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами(); + ИзвлекатьТекстыФайловНаКлиенте = НЕ ОбщиеНастройки.ИзвлекатьТекстыФайловНаСервере; + Если ИзвлекатьТекстыФайловНаКлиенте Тогда + АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ФайлКлиента.ПолноеИмя, + ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); + Иначе + АдресВременногоХранилищаТекста = ""; + КонецЕсли; + + ВремяИзменения = ФайлКлиента.ПолучитьВремяИзменения(); + ВремяИзмененияУниверсальное = ФайлКлиента.ПолучитьУниверсальноеВремяИзменения(); + Если ПараметрыВыполнения.ИмяСоздаваемогоФайла <> Неопределено Тогда + ИмяСоздания = ПараметрыВыполнения.ИмяСоздаваемогоФайла; + Иначе + ИмяСоздания = ФайлКлиента.ИмяБезРасширения; + КонецЕсли; + + ИмяФайла = ИмяСоздания + ФайлКлиента.Расширение; + РазмерВМб = ФайлКлиента.Размер() / (1024 * 1024); + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Идет сохранение файла ""%1"" (%2 Мб). + |Пожалуйста, подождите...'"), + ИмяФайла, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + Состояние(ТекстСостояния); + + // Помещение файла во временное хранилище. + АдресВременногоХранилищаФайла = ""; + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ФайлКлиента.ПолноеИмя, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + ФайлыПомещены = ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор); + Если НЕ ФайлыПомещены Тогда + Возврат Ложь; + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + // Создание карточки Файла в БД. + Попытка + Результат.ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией( + ПараметрыВыполнения.ВладелецФайла, + ИмяСоздания, + ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ФайлКлиента.Расширение), + ВремяИзменения, + ВремяИзмененияУниверсальное, + ФайлКлиента.Размер(), + АдресВременногоХранилищаФайла, + АдресВременногоХранилищаТекста, + Ложь, // Это не Веб-клиент. + Неопределено, // Пользователь. + "", // Комментарий. + Истина); // ЗаписатьВИсторию. + Результат.ФайлДобавлен = Истина; + Исключение + Результат.ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); + КонецПопытки; + Состояние(); + + Если Результат.ТекстОшибки <> "" Тогда + Возврат Результат; + КонецЕсли; + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Владелец", ПараметрыВыполнения.ВладелецФайла); + ПараметрыОповещения.Вставить("Файл", Результат.ФайлСсылка); + ПараметрыОповещения.Вставить("Событие", "СозданФайл"); + Оповестить("Запись_Файл", ПараметрыОповещения); + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(Результат.ФайлСсылка), + Результат.ФайлСсылка, + БиблиотекаКартинок.Информация32); + + Возврат Результат; КонецФункции +// Продолжение процедуры (см. выше). +Процедура ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения) Экспорт + + // Загрузить из файловой системы без расширения работы с файлами (веб-клиент). + Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла", ЭтотОбъект, ПараметрыВыполнения); + СтандартныеПодсистемыКлиент.ПоказатьПомещениеФайла( + Обработчик, + ПараметрыВыполнения.ФормаВладелец.УникальныйИдентификатор, + "", + Неопределено); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеЗагрузкиФайла(ПомещенныеФайлы, ПараметрыВыполнения) Экспорт + + Если ПомещенныеФайлы = Неопределено Или ПомещенныеФайлы.Количество() = 0 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + ОписаниеПереданногоФайла = ПомещенныеФайлы[0]; + ИмяФайла = ОписаниеПереданногоФайла.Имя; + АдресВременногоХранилищаФайла = ОписаниеПереданногоФайла.Хранение; + + СтрокиПути = ОбщегоНазначенияКлиентСервер.РазложитьСтрокуПоТочкамИСлэшам(ИмяФайла); + Если СтрокиПути.Количество() < 2 Тогда + ТекстВопроса = НСтр("ru = 'Необходимо указать файл с расширением.'"); + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Повторить, НСтр("ru = 'Выбрать другой файл'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + Обработчик = Новый ОписаниеОповещения("ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить", ЭтотОбъект, ПараметрыВыполнения); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки); + Возврат; + КонецЕсли; + Расширение = СтрокиПути[СтрокиПути.Количество()-1]; + ИмяБезРасширения = СтрокиПути[СтрокиПути.Количество()-2]; + + // Создание карточки файла в БД. + ТекстОшибки = ""; + Попытка + ФайлСсылка = РаботаСФайламиСлужебныйВызовСервера.СоздатьФайлСВерсией( + ПараметрыВыполнения.ВладелецФайла, + ИмяБезРасширения, + ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(Расширение), + Дата('00010101'), // Невозможно получить дату изменения файла на диске. + Дата('00010101'), // Невозможно получить дату изменения файла на диске. + 0, // Невозможно получить размер файла на диске. + АдресВременногоХранилищаФайла, + "", // АдресВременногоХранилищаТекста + Истина); // Это Веб-клиент. + Исключение + ТекстОшибки = ФайловыеФункцииСлужебныйКлиентСервер.ОшибкаСозданияНовогоФайла(ИнформацияОбОшибке()); + КонецПопытки; + Если ТекстОшибки <> "" Тогда + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстОшибки, Неопределено); + Возврат; + КонецЕсли; + + ПараметрыОповещения = Новый Структура; + ПараметрыОповещения.Вставить("Владелец", ПараметрыВыполнения.ВладелецФайла); + ПараметрыОповещения.Вставить("Файл", ФайлСсылка); + ПараметрыОповещения.Вставить("Событие", "СозданФайл"); + Оповестить("Запись_Файл", ПараметрыОповещения); + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Создание:'"), + ПолучитьНавигационнуюСсылку(ФайлСсылка), + ФайлСсылка, + БиблиотекаКартинок.Информация32); + + Если ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла <> Истина Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Ключ", ФайлСсылка); + ПараметрыФормы.Вставить("КарточкаОткрытаПослеСозданияФайла", Истина); + + ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ОткрытьФорму("Справочник.Файлы.ФормаОбъекта", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ДобавитьИзФайловойСистемыБезРасширенияПослеОтветаНаВопросПовторить(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ = КодВозвратаДиалога.Повторить Тогда + ДобавитьИзФайловойСистемыБезРасширения(ПараметрыВыполнения); + Иначе + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + КонецЕсли; + +КонецПроцедуры + +// Открывает диалог сканирования и просмотра картинки. +Процедура ДобавитьСоСканера(ПараметрыВыполнения) Экспорт + + Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация(); + ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ВладелецФайла", ПараметрыВыполнения.ВладелецФайла); + ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); + ПараметрыФормы.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", ПараметрыВыполнения.НеОткрыватьКарточкуПослеСозданияИзФайла); + + ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ОткрытьФорму("Справочник.Файлы.Форма.РезультатСканирования", ПараметрыФормы, ПараметрыВыполнения.ФормаВладелец, , , , ОбработчикРезультата); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Рассылает оповещение о завершении шифрования или расшифровки файла. + +// По окончании Зашифровать нотифицирует +// Параметры +// МассивФайловВРабочемКаталогеДляУдаления - Массив - массив строк - путей к файлам +// ВладелецФайла - ЛюбаяСсылка - владелец файла +// ФайлСсылка - СправочникСсылка.Файлы - файл +Процедура ИнформироватьОШифровании(МассивФайловВРабочемКаталогеДляУдаления, + ВладелецФайла, + ФайлСсылка) Экспорт + + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлЗашифрован"), ВладелецФайла); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + + // Удаляем из рабочего каталога все версии файла + Для Каждого ПолноеИмяФайла Из МассивФайловВРабочемКаталогеДляУдаления Цикл + УдалитьФайлБезПодтверждения(ПолноеИмяФайла); + КонецЦикла; + + ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" зашифрован'"), + ФайлСсылка); + Состояние(ТекстСостояния); + +КонецПроцедуры + +// По окончании Расшифровать нотифицирует +// Параметры +// ВладелецФайла - ЛюбаяСсылка - владелец файла +// ФайлСсылка - СправочникСсылка.Файлы - файл +Процедура ИнформироватьОРасшифровке(ВладелецФайла, ФайлСсылка) Экспорт + + ОповеститьОбИзменении(ФайлСсылка); + Оповестить("Запись_Файл", Новый Структура("Событие", "ПрисоединенныйФайлЗашифрован"), ВладелецФайла); + Оповестить("Запись_Файл", Новый Структура("Событие", "ДанныеФайлаИзменены"), ФайлСсылка); + + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Файл ""%1"" расшифрован'"), + ФайлСсылка); + Состояние(ТекстСообщения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Формирует электронную подпись файла. + +// Формирует электронную подпись. +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ДанныеФайла - Структура +// +// Возвращаемое значение: +// Структура - Результат. +// * Успех - Булево - Успешно ли выполнена операция. +// * ДанныеПодписи - Структура - Данные для занесения в табличную часть ЭП. +// +Процедура СформироватьПодписьФайла(ОбработчикРезультата, ДанныеФайла) Экспорт + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("Успех", Ложь); + ПараметрыВыполнения.Вставить("ДанныеПодписи", Неопределено); + + Если НЕ ПараметрыВыполнения.ДанныеФайла.Редактирует.Пустая() Тогда + ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗанятогоФайла(); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + Если ПараметрыВыполнения.ДанныеФайла.Зашифрован Тогда + ТекстПредупреждения = ФайловыеФункцииСлужебныйКлиентСервер.СтрокаСообщенияОНедопустимостиПодписанияЗашифрованногоФайла(); + ВернутьРезультатПослеПоказаПредупреждения(ПараметрыВыполнения.ОбработчикРезультата, ТекстПредупреждения, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ЛичныеСертификаты = ЭлектроннаяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("МассивСтруктурСертификатов", ЛичныеСертификаты); + ПараметрыФормы.Вставить("ОбъектСсылка", ПараметрыВыполнения.ДанныеФайла.Ссылка); + + Обработчик = Новый ОписаниеОповещения("СформироватьПодписьФайлаПослеУстановкиПодписи", ЭтотОбъект, ПараметрыВыполнения); + + ОткрытьФорму("ОбщаяФорма.УстановкаПодписиЭП", ПараметрыФормы, , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура СформироватьПодписьФайлаПослеУстановкиПодписи(Результат, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(Результат) <> Тип("Структура") Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + Возврат; + КонецЕсли; + + ПолученныеДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИДвоичныеДанные(ПараметрыВыполнения.ДанныеФайла.Ссылка); + + МенеджерКриптографии = ЭлектроннаяПодписьКлиент.ПолучитьМенеджерКриптографии(); + + ПараметрыВыполнения.ДанныеПодписи = ЭлектроннаяПодписьКлиент.СформироватьДанныеПодписи( + МенеджерКриптографии, + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПолученныеДанныеФайла.ДвоичныеДанные, + Результат); + ПараметрыВыполнения.Успех = Истина; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, ПараметрыВыполнения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Добавляет электронную подпись из файла. + +// Добавить электронную подпись из файла. +Процедура ДобавитьПодписьИзФайла(ОбработчикРезультата, ДанныеФайла, УникальныйИдентификатор = Неопределено) Экспорт + + #Если ВебКлиент Тогда + ТекстПредупреждения = НСтр("ru = 'В Веб-клиенте добавление электронной подписи из файла не поддерживается.'"); + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Ложь); + Возврат; + #КонецЕсли + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("ДанныеФайла", ДанныеФайла); + ПараметрыВыполнения.Вставить("УникальныйИдентификатор", УникальныйИдентификатор); + Обработчик = Новый ОписаниеОповещения("ДобавитьПодписьИзФайлаЗавершение", ЭтотОбъект, ПараметрыВыполнения); + ОткрытьФорму("ОбщаяФорма.ДобавлениеПодписиИзФайла", , , , , , Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ДобавитьПодписьИзФайлаЗавершение(МассивФайловПодписей, ПараметрыВыполнения) Экспорт + + Если ТипЗнч(МассивФайловПодписей) <> Тип("Массив") ИЛИ МассивФайловПодписей.Количество() = 0 Тогда + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Ложь); + Возврат; + КонецЕсли; + + МассивДанныхДляЗанесенияВБазу = ЭлектроннаяПодписьКлиент.СформироватьПодписиДляЗанесениюВБазу( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + МассивФайловПодписей, + ПараметрыВыполнения.УникальныйИдентификатор); + + Если МассивДанныхДляЗанесенияВБазу.Количество() > 0 Тогда + ЗанестиИнформациюОПодписях( + ПараметрыВыполнения.ДанныеФайла.Ссылка, + ПараметрыВыполнения.ДанныеФайла.Владелец, + МассивДанныхДляЗанесенияВБазу, + ПараметрыВыполнения.УникальныйИдентификатор); + КонецЕсли; + + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Загружает структуру файлов и каталогов с диска в программу. + +// Рекурсивная функция импорта файлов с диска - принимает массив файлов (или каталогов) +// - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// Владелец - ЛюбаяСсылка - владелец файла +// ФайлыАргумент - Массив - массив объектов "Файл" +// Индикатор - Число - число от 0 до 100 - прогресс выполнения +// МассивИменФайловСОшибками - Массив - Массив имен файлов с ошибками +// МассивСтруктурВсехФайлов - Массив - Массив структур всех файлов +// Комментарий - Строка - Комментарий +// ХранитьВерсии - Булево - Хранить версии +// Рекурсивно - Булево - Рекурсивно обходить подкаталоги +// КоличествоСуммарное - Число - Количество суммарное импортированных файлов +// Счетчик - Число - Счетчик обработанных файлов (не обязательно файл будет загружен) +// ИдентификаторФормы - уникальный идентификатор формы +// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) +// ДобавленныеФайлы - Массив - Добавленные файлы +// МассивВсехПапок - Массив - Массив всех папок +// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) +// +Процедура ИмпортФайловРекурсивно( + ОбработчикРезультата, + Владелец, + ФайлыАргумент, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + Знач ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки = Ложь, + Кодировка = Неопределено) + + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыВыполнения.Вставить("Владелец", Владелец); + ПараметрыВыполнения.Вставить("ФайлыАргумент", ФайлыАргумент); + ПараметрыВыполнения.Вставить("Индикатор", Индикатор); + ПараметрыВыполнения.Вставить("МассивИменФайловСОшибками", МассивИменФайловСОшибками); + ПараметрыВыполнения.Вставить("МассивСтруктурВсехФайлов", МассивСтруктурВсехФайлов); + ПараметрыВыполнения.Вставить("Комментарий", Комментарий); + ПараметрыВыполнения.Вставить("ХранитьВерсии", ХранитьВерсии); + ПараметрыВыполнения.Вставить("Рекурсивно", Рекурсивно); + ПараметрыВыполнения.Вставить("КоличествоСуммарное", КоличествоСуммарное); + ПараметрыВыполнения.Вставить("Счетчик", Счетчик); + ПараметрыВыполнения.Вставить("ИдентификаторФормы", ИдентификаторФормы); + ПараметрыВыполнения.Вставить("ПсевдоФайловаяСистема", ПсевдоФайловаяСистема); + ПараметрыВыполнения.Вставить("ДобавленныеФайлы", ДобавленныеФайлы); + ПараметрыВыполнения.Вставить("МассивВсехПапок", МассивВсехПапок); + ПараметрыВыполнения.Вставить("РежимЗагрузки", РежимЗагрузки); + ПараметрыВыполнения.Вставить("Кодировка", Кодировка); + + ИмпортФайловРекурсивноЗапуск(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловРекурсивноЗапуск(ПараметрыВыполнения); + ПараметрыВыполнения.Вставить("МассивПапокДляВопросаПапкаУжеСуществует", Новый Массив); + + ИмпортФайловРекурсивноБезДиалогов( + ПараметрыВыполнения.Владелец, + ПараметрыВыполнения.ФайлыАргумент, + ПараметрыВыполнения.Индикатор, + ПараметрыВыполнения.МассивИменФайловСОшибками, + ПараметрыВыполнения.МассивСтруктурВсехФайлов, + ПараметрыВыполнения.Комментарий, + ПараметрыВыполнения.ХранитьВерсии, + ПараметрыВыполнения.Рекурсивно, + ПараметрыВыполнения.КоличествоСуммарное, + ПараметрыВыполнения.Счетчик, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ПсевдоФайловаяСистема, + ПараметрыВыполнения.ДобавленныеФайлы, + ПараметрыВыполнения.МассивВсехПапок, + ПараметрыВыполнения.РежимЗагрузки, + ПараметрыВыполнения.Кодировка, + Истина, // ЗадаватьВопросПапкаУжеСуществует (используется только для первого уровня рекурсии). + ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует); + + Если ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда + // Задавать вопрос не требуется. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + КонецЕсли; + + // По мере ответов на вопросы + // папки из ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует + // записываются в ПараметрыВыполнения.ФайлыАргумент. + // Затем рекурсия перезапускается. + ПараметрыВыполнения.ФайлыАргумент = Новый Массив; + ПараметрыВыполнения.Вставить("ПапкаДляДобавленияВФайлыАргумент", Неопределено); + ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения) + + ПараметрыВыполнения.ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ПараметрыВыполнения.ОбработчикРезультата); + ПараметрыВыполнения.ПапкаДляДобавленияВФайлыАргумент = ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует[0]; + ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Удалить(0); + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Папка ""%1"" уже существует. + |Продолжить импорт папки?'"), + ПараметрыВыполнения.ПапкаДляДобавленияВФайлыАргумент.Имя); + + Обработчик = Новый ОписаниеОповещения("ИмпортФайловРекурсивноПослеОтветаНаВопрос", ЭтотОбъект, ПараметрыВыполнения); + + ПоказатьВопрос(Обработчик, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ИмпортФайловРекурсивноПослеОтветаНаВопрос(Ответ, ПараметрыВыполнения) Экспорт + + Если Ответ <> КодВозвратаДиалога.Нет Тогда + ПараметрыВыполнения.ФайлыАргумент.Добавить(ПараметрыВыполнения.ПапкаДляДобавленияВФайлыАргумент); + КонецЕсли; + + // После ответов на все вопросы рекурсия перезапускается. + Если ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда + ИмпортФайловРекурсивноБезДиалогов( + ПараметрыВыполнения.Владелец, + ПараметрыВыполнения.ФайлыАргумент, + ПараметрыВыполнения.Индикатор, + ПараметрыВыполнения.МассивИменФайловСОшибками, + ПараметрыВыполнения.МассивСтруктурВсехФайлов, + ПараметрыВыполнения.Комментарий, + ПараметрыВыполнения.ХранитьВерсии, + ПараметрыВыполнения.Рекурсивно, + ПараметрыВыполнения.КоличествоСуммарное, + ПараметрыВыполнения.Счетчик, + ПараметрыВыполнения.ИдентификаторФормы, + ПараметрыВыполнения.ПсевдоФайловаяСистема, + ПараметрыВыполнения.ДобавленныеФайлы, + ПараметрыВыполнения.МассивВсехПапок, + ПараметрыВыполнения.РежимЗагрузки, + ПараметрыВыполнения.Кодировка, + Ложь, // ЗадаватьВопросПапкаУжеСуществует (используется только для первого уровня рекурсии) + ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует); + + Если ПараметрыВыполнения.МассивПапокДляВопросаПапкаУжеСуществует.Количество() = 0 Тогда + // Вопросов больше не возникло. + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, Неопределено); + Возврат; + Иначе + // Возникли еще вопросы. + ПараметрыВыполнения.ФайлыАргумент = Новый Массив; + КонецЕсли; + КонецЕсли; + + ИмпортФайловРекурсивноЗадатьСледующийВопрос(ПараметрыВыполнения); + +КонецПроцедуры + +// Рекурсивная функция импорта файлов с диска - принимает массив файлов (или каталогов) +// - если файл, просто добавляет его, если каталог - создает группу и рекурсивно вызывает саму себя +// +// Параметры +// Владелец - ЛюбаяСсылка - владелец файла +// ФайлыАргумент - Массив - массив объектов "Файл" +// Индикатор - Число - число от 0 до 100 - прогресс выполнения +// МассивИменФайловСОшибками - Массив - Массив имен файлов с ошибками +// МассивСтруктурВсехФайлов - Массив - Массив структур всех файлов +// Комментарий - Строка - Комментарий +// ХранитьВерсии - Булево - Хранить версии +// Рекурсивно - Булево - Рекурсивно обходить подкаталоги +// КоличествоСуммарное - Число - Количество суммарное импортированных файлов +// Счетчик - Число - Счетчик обработанных файлов (не обязательно файл будет загружен) +// ИдентификаторФормы - уникальный идентификатор формы +// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) +// ДобавленныеФайлы - Массив - Добавленные файлы +// МассивВсехПапок - Массив - Массив всех папок +// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) +// +Процедура ИмпортФайловРекурсивноБезДиалогов( + Владелец, + ФайлыАргумент, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + Знач ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки = Ложь, + Кодировка = Неопределено, + ЗадаватьВопросПапкаУжеСуществует, + МассивПапокДляВопросаПапкаУжеСуществует) + + Перем ПерваяПапкаСТакимЖеИменем; + Перем ДокГруппаСсылка; + + Для Каждого ВыбранныйФайл Из ФайлыАргумент Цикл + Попытка + Если ВыбранныйФайл.Существует() Тогда + + Если ВыбранныйФайл.Расширение = ".lnk" Тогда + ВыбранныйФайл = РазыменоватьLnkФайл(ВыбранныйФайл); + КонецЕсли; + + Если ВыбранныйФайл.ЭтоКаталог() Тогда + + Если Рекурсивно = Истина Тогда + НовыйПуть = Строка(ВыбранныйФайл.Путь); + НовыйПуть = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(НовыйПуть, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + НовыйПуть = НовыйПуть + Строка(ВыбранныйФайл.Имя); + МассивФайлов = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, НовыйПуть); + + // Создаем группу в справочнике - эквивалент папки на диске. + Если МассивФайлов.Количество() <> 0 Тогда + ИмяФайла = ВыбранныйФайл.Имя; + + ПапкаУжеНайдена = Ложь; + + Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ИмяФайла, Владелец, ПерваяПапкаСТакимЖеИменем) Тогда + + Если РежимЗагрузки Тогда + ПапкаУжеНайдена = Истина; + ДокГруппаСсылка = ПерваяПапкаСТакимЖеИменем; + Иначе + Если ЗадаватьВопросПапкаУжеСуществует Тогда + МассивПапокДляВопросаПапкаУжеСуществует.Добавить(ВыбранныйФайл); + Продолжить; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Не ПапкаУжеНайдена Тогда + ДокГруппаСсылка = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(ИмяФайла, Владелец); + КонецЕсли; + + ИмпортФайловРекурсивноБезДиалогов( + ДокГруппаСсылка, + МассивФайлов, + Индикатор, + МассивИменФайловСОшибками, + МассивСтруктурВсехФайлов, + Комментарий, + ХранитьВерсии, + Рекурсивно, + КоличествоСуммарное, + Счетчик, + ИдентификаторФормы, + ПсевдоФайловаяСистема, + ДобавленныеФайлы, + МассивВсехПапок, + РежимЗагрузки, + Кодировка, + Истина, // Параметр ЗадаватьВопросПапкаУжеСуществует нужен + // чтобы не задавать вопрос на 1 уровне рекурсии, + // когда обходятся папки, для которых уже получен положительный ответ. + МассивПапокДляВопросаПапкаУжеСуществует); + + МассивВсехПапок.Добавить(НовыйПуть); + КонецЕсли; + КонецЕсли; + + Продолжить; + КонецЕсли; + + Если Не ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьВозможностьЗагрузкиФайла( + ВыбранныйФайл, Ложь, МассивИменФайловСОшибками) Тогда + Продолжить; + КонецЕсли; + + // Обновим индикатор прогресса + Счетчик = Счетчик + 1; + Индикатор = Счетчик * 100 / КоличествоСуммарное; // Считаем проценты + РазмерВМб = ВыбранныйФайл.Размер() / (1024 * 1024); + НадписьПодробнее = + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Обрабатывается файл ""%1"" (%2 Мб)...'"), + ВыбранныйФайл.Имя, + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); + + ТекстСостояния = НСтр("ru = 'Импорт файлов с диска...'"); + Если РежимЗагрузки Тогда + ТекстСостояния = НСтр("ru = 'Загрузка файлов с диска...'"); + КонецЕсли; + + Состояние( + ТекстСостояния, + Индикатор, + НадписьПодробнее, + БиблиотекаКартинок.Информация32); + + // Создаем Элемент справочника Файлы + ИмяБезРасширения = ВыбранныйФайл.ИмяБезРасширения; + Расширение = ВыбранныйФайл.Расширение; + + Если РежимЗагрузки Тогда + Если РаботаСФайламиСлужебныйВызовСервера.ЕстьФайлСТакимИменем(ИмяБезРасширения, Владелец) Тогда + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", НСтр("ru = 'Файл с таким именем уже есть в хранилище файлов.'")); + МассивИменФайловСОшибками.Добавить(Запись); + Продолжить; + КонецЕсли; + КонецЕсли; + + АдресВременногоХранилищаФайла = ""; + + ПомещаемыеФайлы = Новый Массив; + Описание = Новый ОписаниеПередаваемогоФайла(ВыбранныйФайл.ПолноеИмя, ""); + ПомещаемыеФайлы.Добавить(Описание); + + ПомещенныеФайлы = Новый Массив; + + Если Не ПоместитьФайлы(ПомещаемыеФайлы, ПомещенныеФайлы, , Ложь, ИдентификаторФормы) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка помещения файла + |""%1"" + |во временное хранилище.'"), + ВыбранныйФайл.ПолноеИмя); + КонецЕсли; + + Если ПомещенныеФайлы.Количество() = 1 Тогда + АдресВременногоХранилищаФайла = ПомещенныеФайлы[0].Хранение; + КонецЕсли; + + Если НЕ ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами( + ).ИзвлекатьТекстыФайловНаСервере Тогда + + АдресВременногоХранилищаТекста = + ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( + ВыбранныйФайл.ПолноеИмя, ИдентификаторФормы, , Кодировка); + Иначе + АдресВременногоХранилищаТекста = ""; + КонецЕсли; + + // Создаем элемент справочника Файлы + РаботаСФайламиКлиентСервер.СоздатьЭлементСправочникаФайлы(ВыбранныйФайл, МассивСтруктурВсехФайлов, + Владелец, ИдентификаторФормы, Комментарий, ХранитьВерсии, ДобавленныеФайлы, + АдресВременногоХранилищаФайла, АдресВременногоХранилищаТекста, + Неопределено, + Кодировка); + + Иначе + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", НСтр("ru = 'Файл отсутствует на диске.'")); + МассивИменФайловСОшибками.Добавить(Запись); + КонецЕсли; + + Исключение + ИнформацияОбОшибке = ИнформацияОбОшибке(); + + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(СообщениеОбОшибке); + + Запись = Новый Структура; + Запись.Вставить("ИмяФайла", ВыбранныйФайл.ПолноеИмя); + Запись.Вставить("Ошибка", СообщениеОбОшибке); + МассивИменФайловСОшибками.Добавить(Запись); + + КонецПопытки; + КонецЦикла; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Прочие служебные процедуры и функции. + // При переименовании Файл и ВерсияФайла обновляет информацию // в рабочем каталоге (имя файла на диске и в регистре). // @@ -1846,6 +7295,7 @@ // НаЧтение - Булево - файл помещен на чтение // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге) Процедура ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца) + // Если Файл без файла - ничего не делаем в рабочем каталоге Если ДанныеФайла.Версия.Пустая() Тогда Возврат; @@ -1863,535 +7313,15 @@ РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ДанныеФайла.ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); Файл = Новый Файл(ПолноеИмяФайла); Файл.УстановитьТолькоЧтение(НаЧтение); -КонецПроцедуры - -// Удаление файла со снятием атрибута readonly -// Параметры -// ПолноеИмяФайла - Строка - Полное имя файла -// ЗадаватьВопрос - Булево- Задавать вопрос об удалении -// ШапкаВопроса - Строка - Шапка вопроса - добавляет текст к вопросу об удалении -Процедура УдалитьФайл(ПолноеИмяФайла, ЗадаватьВопрос = Неопределено, ШапкаВопроса = Неопределено) Экспорт - - ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов - = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов; - - Если ЗадаватьВопрос <> Неопределено Тогда - ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = ЗадаватьВопрос; - КонецЕсли; - - Если ПодтверждатьПриУдаленииИзЛокальногоКэшаФайлов = Истина Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Удалить файл ""%1"" - |из рабочего каталога?'"), ПолноеИмяФайла); - - Если ШапкаВопроса <> Неопределено Тогда - ТекстВопроса = ШапкаВопроса + Символы.ПС + Символы.ПС + ТекстВопроса; - КонецЕсли; - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Файл = Новый Файл(ПолноеИмяФайла); - Если Файл.Существует() Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ПолноеИмяФайла); - КонецЕсли; КонецПроцедуры -// Получает Файл из хранилища файлов в рабочий каталог -// и возвращает путь к этому файлу. -// -// Параметры -// ДанныеФайла - Структура с данными файла. -// ИмяФайлаСПутем - Строка (возвращаемое значение). -// НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция. -// -Функция ПолучитьФайлВерсииВЛокальныйКэшФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры) - - ИмяФайлаСПутем = ""; - - ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; - РазмерФайлаВБазе = ДанныеФайла.Размер; - - ВРабочемКаталогеНаЧтение = Истина; - ВРабочемКаталогеВладельца = Ложь; - - ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( - ДанныеФайла, - ДанныеФайла.Версия, - ИмяФайлаСПутем, - ВРабочемКаталогеНаЧтение, - ВРабочемКаталогеВладельца); - - Если ФайлВРабочемКаталоге = Ложь Тогда - Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - КонецЕсли; - - // Получаем путь файла в рабочем каталоге - с проверкой на уникальность - Если ИмяФайлаСПутем = "" Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Ошибка получения файла из хранилища файлов - |в рабочий каталог.'")); - Возврат Ложь; - КонецЕсли; - - // Выяснено, что Файл в рабочем каталоге есть. - // Проверка даты изменения и принятие решения, что делать дальше. - Действие = ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( - ИмяФайлаСПутем, ДанныеФайла); - - Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда - УдалитьФайл(ИмяФайлаСПутем); - - Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - - ИначеЕсли Действие = "ОткрытьСуществующий" Тогда - - Если ДанныеФайла.ВРабочемКаталогеНаЧтение <> НаЧтение Тогда - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - ПеререгистрироватьВРабочемКаталоге( - ДанныеФайла.Версия, - ИмяФайлаСПутем, - НаЧтение, - ВРабочемКаталогеВладельца); - КонецЕсли; - - Возврат Истина; - - Иначе // Действие = "Отмена". - ИмяФайлаСПутем = ""; - Возврат Ложь; - КонецЕсли; - -КонецФункции - -// Проверяет максимальную длину, если нужно - меняет рабочий каталог и переносит файлы -// -// Параметры -// ДанныеФайла - структура с данными файла -// ИмяФайлаСПутем - Строка - полное имя файла -// ИмяФайла - Строка - имя файла (без пути) -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция - т.е. длина полного имени файла не превышает 260 -Функция ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(ДанныеФайла, ИмяФайлаСПутем, ИмяФайла) -#Если Не ВебКлиент Тогда - - ИмяКаталогаПрежнееЗначение = ДанныеФайла.РабочийКаталогВладельца; - - МаксимальнаяДлинаПолногоПути = 260; - Если НРег(ДанныеФайла.Расширение) = "xls" ИЛИ НРег(ДанныеФайла.Расширение) = "xlsx" Тогда - МаксимальнаяДлинаПолногоПути = 218; // Excel Длина имени файла вместе с путем не должна превышать 218 знака - КонецЕсли; - - МаксимальнаяДлинаИмениФайла = МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" - - Если СтрДлина(ИмяФайлаСПутем) > МаксимальнаяДлинаПолногоПути Тогда - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов - |""%2"".'"), - МаксимальнаяДлинаПолногоПути, - ИмяФайлаСПутем); - - ПутьКаталогаПользователя = КаталогДанныхПользователя(); - МаксимальнаяДлинаИмениФайла = МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); - - // если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. - Если СтрДлина(ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда - ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК - + НСтр("ru = 'Измените имя файла на более короткое.'"); - Предупреждение(ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - // Если структура папок (путь к рабочему каталогу текущей папки) превышает 260-5 (1.txt), пишем "Измените имена папок или перенесите текущую папку в другую папку" - Если СтрДлина(ДанныеФайла.РабочийКаталогВладельца) > МаксимальнаяДлинаПолногоПути - 5 Тогда - ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК - + НСтр("ru = 'Измените имена папок или перенесите текущую папку в другую папку.'"); - Предупреждение(ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - Пока Истина Цикл - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов - |""%2"".'"), - МаксимальнаяДлинаПолногоПути, ИмяФайлаСПутем); - - ТекстВопроса = ТекстСообщения + Символы.ВК + Символы.ВК - + НСтр("ru = 'Выбрать другой основной рабочий каталог? - |(Содержимое рабочего каталога будет перенесено в выбранный каталог).'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - - // Выбираем другой путь к рабочему каталогу. - Заголовок = НСтр("ru = 'Выберите другой рабочий каталог'"); - Если Не ВыбратьПутьКРабочемуКаталогу(ДанныеФайла.РабочийКаталогВладельца, Заголовок, Истина) Тогда - Возврат Ложь; - КонецЕсли; - - ИмяФайлаСПутем = ДанныеФайла.РабочийКаталогВладельца + ИмяФайла; - - Если СтрДлина(ИмяФайлаСПутем) <= МаксимальнаяДлинаПолногоПути Тогда // уложились в 260 символов - - Если ПеренестиСодержимоеРабочегоКаталога(ИмяКаталогаПрежнееЗначение, ДанныеФайла.РабочийКаталогВладельца) Тогда - // Регистр сведений ФайлыВРабочемКаталоге - сейчас там полный путь к файлу - - // надо его менять - выделять общую часть и replace. -просто SQL запросом - - // для текущего пользователя. - РаботаСФайламиСлужебныйВызовСервера.СохранитьРабочийКаталогПапкиИЗаменитьПутиВРегистре(ДанныеФайла.Владелец, - ДанныеФайла.РабочийКаталогВладельца, ИмяКаталогаПрежнееЗначение); - Иначе - Возврат Ложь; - КонецЕсли; - - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - -#КонецЕсли - Возврат Истина; -КонецФункции - -// Получает Файл из хранилища файлов в рабочий каталог папки -// и возвращает путь к этому файлу. -// -// Параметры -// ДанныеФайла - Структура с данными файла. -// ИмяФайлаСПутем - Строка (возвращаемое значение). -// НаЧтение - Булево - Ложь - для чтения, Истина для редактирования. -// ИдентификаторФормы - УникальныйИдентификатор формы. -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция. -// -Функция ПолучитьФайлВерсииВРабочийКаталогПапки( - ДанныеФайла, - ИмяФайлаСПутем, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры) - - Перем Версия; - Перем ДатаПомещения; - - ВРабочемКаталогеВладельца = Истина; - - - - // Формирование имени файла с расширением - ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; - Если НЕ ПустаяСтрока(ДанныеФайла.Расширение) Тогда - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ИмяФайла, ДанныеФайла.Расширение); - КонецЕсли; - - Если ИмяФайлаСПутем = "" Тогда - ИмяФайлаСПутем = ДанныеФайла.РабочийКаталогВладельца + ИмяФайла; - - Если НЕ ПроверитьМаксимальнуюДлинуПолногоПутиВРабочемКаталоге(ДанныеФайла, ИмяФайлаСПутем, ИмяФайла) Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - // Поиск регистрации файла в рабочем каталоге (полное имя с путем). - НайденныеСвойства = РаботаСФайламиСлужебныйВызовСервера.НайтиВРегистреПоПути(ИмяФайлаСПутем); - ФайлЕстьВРегистре = НайденныеСвойства.ФайлЕстьВРегистре; - Версия = НайденныеСвойства.Версия; - ДатаПомещения = ?(ФайлЕстьВРегистре, НайденныеСвойства.ДатаПомещения, ДатаПомещения); - Владелец = НайденныеСвойства.Владелец; - НомерВерсии = НайденныеСвойства.НомерВерсии; - ВРегистреНаЧтение = НайденныеСвойства.ВРегистреНаЧтение; - ВРегистреКодФайла = НайденныеСвойства.ВРегистреКодФайла; - ВРегистреПапка = НайденныеСвойства.ВРегистреПапка; - - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); - ФайлНаДискеСуществует = ФайлНаДиске.Существует(); - - // Удаление регистрации файла, если он не существует. - Если ФайлЕстьВРегистре И НЕ ФайлНаДискеСуществует Тогда - РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Версия); - ФайлЕстьВРегистре = Ложь; - КонецЕсли; - - Если НЕ ФайлЕстьВРегистре И НЕ ФайлНаДискеСуществует Тогда - - Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - КонецЕсли; - - // Установлено, что в рабочем каталоге файл существует. - - Если ФайлЕстьВРегистре И Версия <> ДанныеФайла.ТекущаяВерсия Тогда - - Если Владелец = ДанныеФайла.Ссылка И ВРегистреНаЧтение = Истина Тогда - // Если владелец версий файла совпадает и - // существующий файл в рабочем каталоге зарегистрирован для чтения, - // тогда можно заменить его другим файлом из хранилища. - Возврат ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - КонецЕсли; - - Если ДанныеФайла.Владелец = ВРегистреПапка Тогда // Одна и та же папка. - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В рабочем каталоге уже есть файл - |""%1"", - |связанный с другим файлом в информационной базе. - | - |Код файла в хранилище файлов: %2. - |Код файла в рабочем каталоге: %3. - | - |Переименуйте один из файлов в информационной базе.'"), - ИмяФайлаСПутем, - ДанныеФайла.КодФайла, - ВРегистреКодФайла); - Иначе - СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В рабочем каталоге уже есть файл - |""%1"", - |связанный с другим файлом информационной базы. - | - |Код файла в хранилище файлов: %2. - |Код файла в рабочем каталоге: %3. - | - |В информационной базе измените рабочий каталог одной из папок. - |(У двух папок не должно быть одинакового рабочего каталога).'"), - ИмяФайлаСПутем, - ДанныеФайла.КодФайла, - ВРегистреКодФайла); - КонецЕсли; - - Предупреждение(СтрокаСообщения); - Возврат Ложь; - КонецЕсли; - - // Выяснено, что Файл в рабочем каталоге есть. - // Либо файл незарегистрирован, либо зарегистрирован и версия совпадает. - - // Проверка даты изменения и принятие решения, что делать дальше. - Действие = ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( - ИмяФайлаСПутем, ДанныеФайла); - - Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда - // В рабочем каталоге папки настройка подтверждения при удалении не используется. - УдалитьФайл(ИмяФайлаСПутем, Ложь); - - Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - - ИначеЕсли Действие = "ОткрытьСуществующий" Тогда - - Если ДанныеФайла.ВРабочемКаталогеНаЧтение <> НаЧтение - ИЛИ НЕ ФайлЕстьВРегистре Тогда - - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - ПеререгистрироватьВРабочемКаталоге( - ДанныеФайла.Версия, - ИмяФайлаСПутем, - НаЧтение, - ВРабочемКаталогеВладельца); - КонецЕсли; - - Возврат Истина; - - Иначе // Действие = "Отмена". - ПолноеИмяФайла = ""; - Возврат Ложь; - КонецЕсли; - -КонецФункции - -// Получить Файл из информационной базы на локальный диск и возвращает путь -//к этому файлу в параметре -// -// Параметры -// ДанныеФайла - структура с данными файла -// ПолноеИмяФайла - Строка - здесь возвращается полное имя файла -// ИдентификаторФормы - уникальный идентификатор формы -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -// -Функция ПолучитьФайлВерсииВРабочийКаталог( - ДанныеФайла, - ПолноеИмяФайла, - ИдентификаторФормы = Неопределено, - ДополнительныеПараметры = Неопределено) Экспорт - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - Если ИмяКаталога = Неопределено ИЛИ ПустаяСтрока(ИмяКаталога) Тогда - Возврат Ложь; - КонецЕсли; - - РабочийКаталогВладельца = ДанныеФайла.РабочийКаталогВладельца; - - НаЧтение = ДанныеФайла.НаЧтение; - - Если (НаЧтение И РабочийКаталогВладельца = "") - ИЛИ ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда - - Возврат ПолучитьФайлВерсииВЛокальныйКэшФайлов( - ДанныеФайла, ПолноеИмяФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); - - ИначеЕсли РабочийКаталогВладельца = "" Тогда - Возврат ПолучитьФайлВерсииВЛокальныйКэшФайлов( - ДанныеФайла, ПолноеИмяФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); - - ИначеЕсли НаЧтение И РабочийКаталогВладельца <> "" Тогда - Возврат ПолучитьФайлВерсииВРабочийКаталогПапки( - ДанныеФайла, ПолноеИмяФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); - - ИначеЕсли НаЧтение = Ложь И РабочийКаталогВладельца <> "" Тогда - Возврат ПолучитьФайлВерсииВРабочийКаталогПапки( - ДанныеФайла, ПолноеИмяФайла, НаЧтение, ИдентификаторФормы, ДополнительныеПараметры); - КонецЕсли; - -КонецФункции - -// Получить Файл с сервера и зарегистрировать в рабочем каталоге -// -// Параметры -// ДанныеФайла - структура с данными файла -// ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла -// ДатаФайлаВБазе - Дата - дата файла в базе -// НаЧтение - Булево - файл помещен на чтение -// ИдентификаторФормы - уникальный идентификатор формы -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция ПолучитьССервераИЗарегистрироватьВРабочемКаталогеПапки( - ДанныеФайла, - ИмяФайлаСПутемВРабочемКаталогеПапки, - ДатаФайлаВБазе, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры) - - ИмяФайлаСПутем = ""; - - ВРабочемКаталогеНаЧтение = Истина; - ВРабочемКаталогеВладельца = Ложь; - - ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( - ДанныеФайла, - ДанныеФайла.Версия, - ИмяФайлаСПутем, - ВРабочемКаталогеНаЧтение, - ВРабочемКаталогеВладельца); - - Если ФайлВРабочемКаталоге = Ложь Тогда - Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутемВРабочемКаталогеПапки, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - КонецЕсли; - - // Получаем путь файла в рабочем каталоге - с проверкой на уникальность - Если ИмяФайлаСПутем = "" Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Ошибка получения файла из хранилища файлов - |в рабочий каталог.'")); - Возврат Ложь; - КонецЕсли; - - // Выяснено, что Файл в рабочем каталоге есть. - // Проверка даты изменения и принятие решения, что делать дальше. - Действие = ФайловыеФункцииСлужебныйКлиент.ДействиеПриОткрытииФайлаВРабочемКаталоге( - ИмяФайлаСПутем, ДанныеФайла); - - Если Действие = "ВзятьИзХранилищаИОткрыть" Тогда - // В рабочем каталоге папки настройка подтверждения при удалении не используется. - УдалитьФайл(ИмяФайлаСПутем, Ложь); - - Возврат ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - ДанныеФайла.ДатаМодификацииУниверсальная, - НаЧтение, - ИдентификаторФормы, - ДополнительныеПараметры); - - ИначеЕсли Действие = "ОткрытьСуществующий" Тогда - - Если ДанныеФайла.ВРабочемКаталогеНаЧтение <> НаЧтение Тогда - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - ПеререгистрироватьВРабочемКаталоге( - ДанныеФайла.Версия, - ИмяФайлаСПутем, - НаЧтение, - ВРабочемКаталогеВладельца); - КонецЕсли; - - Возврат Истина; - - Иначе // Действие = "Отмена". - ИмяФайлаСПутем = ""; - Возврат Ложь; - КонецЕсли; - -КонецФункции - // Функция предназначена для открытия файла соответствующим приложением // // Параметры // ДанныеФайла - структура с данными файла // ИмяОткрываемогоФайла - Строка - полное имя файла -Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла) Экспорт +Процедура ОткрытьФайлПриложением(ДанныеФайла, ИмяОткрываемогоФайла, ОбработчикРезультата = Неопределено) Экспорт РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); Если РасширениеПодключено Тогда @@ -2452,330 +7382,9 @@ // Открыть Файл ЗапуститьПриложение(ИмяОткрываемогоФайла); КонецЕсли; -КонецПроцедуры - -// Сохранение на диск Файла -// -// Параметры -// ДанныеФайла - структура с данными файла -// УникальныйИдентификатор - уникальный идентификатор формы -// -// Возвращаемое значение: -// Строка - выбранный полный путь файла -Функция СохранитьКак(ДанныеФайла, УникальныйИдентификатор) Экспорт - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если РасширениеПодключено Тогда - - // проверим - если файл уже есть в кеше, и он новее чем в базе - дадим диалог с выбором - ПутьКФайлуВКеше = ""; - Если ДанныеФайла.РедактируетТекущийПользователь Тогда - ВРабочемКаталогеНаЧтение = Истина; - ВРабочемКаталогеВладельца = Ложь; - ПолноеИмяФайла = ""; - ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ДанныеФайла.Версия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - - Если ФайлВРабочемКаталоге = Истина Тогда - - ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; - - ФайлВерсии = Новый Файл(ПолноеИмяФайла); - ДатаФайлаНаДиске = ФайлВерсии.ПолучитьУниверсальноеВремяИзменения(); - - Если ДатаФайлаНаДиске > ДатаФайлаВБазе Тогда // В рабочем каталоге более новый (изменен пользователем со стороны) - - ПараметрыОткрытияФормы = Новый Структура; - ПараметрыОткрытияФормы.Вставить("Файл", ПолноеИмяФайла); - - Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Дата изменения файла ""%1"" - |в рабочем каталоге более поздняя (новее), чем в хранилище файлов. - |Возможно, файл был изменен.'"), - Строка(ДанныеФайла.Ссылка)); - - ПараметрыОткрытияФормы.Вставить("Сообщение", Сообщение); - - Ответ = ОткрытьФормуМодально("Справочник.Файлы.Форма.РежимСозданияФайлаДляСохранитьКак", ПараметрыОткрытияФормы); - - Если Ответ = КодВозвратаДиалога.Отмена - ИЛИ Ответ = Неопределено Тогда - - Возврат ""; - КонецЕсли; - - Если Ответ = 1 Тогда // На основе файла на локальном компьютере - ПутьКФайлуВКеше = ПолноеИмяФайла; - КонецЕсли; - - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - ПутьВыбора = ДанныеФайла.ПапкаДляСохранитьКак; - Если ПутьВыбора = Неопределено ИЛИ ПутьВыбора = "" Тогда - - #Если НЕ ВебКлиент Тогда - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); - Возврат ""; - КонецЕсли; - #КонецЕсли - - ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); - - КонецЕсли; - - Пароль = ""; - СохранятьСРасшифровкой = Ложь; - РасширениеДляЗашифрованныхФайлов = ""; - Если ДанныеФайла.Зашифрован Тогда - - ПредставленияСертификатов = ""; - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Отпечаток = СтруктураСертификата.Отпечаток; - - ТолькоВЛичномХранилище = Истина; - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); - Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом - Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда - ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; - КонецЕсли; - ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; - КонецЕсли; - - КонецЦикла; - - Заголовок = НСтр("ru = 'Выбор режима сохранения'"); - ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов", - Заголовок, ПредставленияСертификатов); - КодВозврата = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВыборСохраненияШифрованногоФайла", ПараметрыФормы); - Если ТипЗнч(КодВозврата) = Тип("Структура") Тогда - - Пароль = КодВозврата.Пароль; - РасширениеДляЗашифрованныхФайлов = КодВозврата.РасширениеДляЗашифрованныхФайлов; - - Если КодВозврата.СохранятьСРасшифровкой = 1 Тогда - СохранятьСРасшифровкой = Истина; - Иначе - СохранятьСРасшифровкой = Ложь; - КонецЕсли; - - Иначе - Возврат ""; - КонецЕсли; - - КонецЕсли; - - ИмяСРасширением = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - Расширение = ДанныеФайла.Расширение; - - Если НЕ СохранятьСРасшифровкой Тогда - Если НЕ ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда - ИмяСРасширением = ИмяСРасширением + "." + РасширениеДляЗашифрованныхФайлов; - Расширение = РасширениеДляЗашифрованныхФайлов; - КонецЕсли; - КонецЕсли; - - // выбираем путь к файлу на диске - ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); - ВыборФайла.МножественныйВыбор = Ложь; - ВыборФайла.ПолноеИмяФайла = ИмяСРасширением; - Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Все файлы (*.%1)|*.%1'"), Расширение, Расширение); - ВыборФайла.Фильтр = Фильтр; - ВыборФайла.Каталог = ПутьВыбора; - - Если ВыборФайла.Выбрать() Тогда - - АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - - Если ДанныеФайла.ТекущаяВерсия <> ДанныеФайла.Версия Тогда - АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( - ДанныеФайла.Версия, УникальныйИдентификатор); - КонецЕсли; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); - - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - - Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); - Если Файл.Существует() Тогда - Если ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда - Файл.УстановитьТолькоЧтение(Ложь); - УдалитьФайлы(ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - КонецЕсли; - - Если ПутьКФайлуВКеше = "" Тогда - - ПередаваемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ВыборФайла.ПолноеИмяФайла, АдресФайла); - ПередаваемыеФайлы.Добавить(Описание); - - ПутьКФайлу = Файл.Путь; - ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - - // Сохраним Файл из БД на диск - Если ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда - - // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения - Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда - УдалитьИзВременногоХранилища(АдресФайла); - КонецЕсли; - - Если СохранятьСРасшифровкой Тогда - ИмяФайлаСПутем = ВыборФайла.ПолноеИмяФайла; - - Попытка - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; - - ИмяФайлаСПутемРасшифрованное = ИмяФайлаСПутем + ".dec"; - МенеджерКриптографии.Расшифровать(ИмяФайлаСПутем, ИмяФайлаСПутемРасшифрованное); - - УдалитьФайлы(ИмяФайлаСПутем); - ПереместитьФайл(ИмяФайлаСПутемРасшифрованное, ИмяФайлаСПутем); - Исключение - УдалитьФайлы(ИмяФайлаСПутем); - ВызватьИсключение; - КонецПопытки; - КонецЕсли; - - - НовыйФайл = Новый Файл(ВыборФайла.ПолноеИмяФайла); - - НовыйФайл.УстановитьУниверсальноеВремяИзменения( - ДанныеФайла.ДатаМодификацииУниверсальная); - - Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - Иначе - Если ПутьКФайлуВКеше <> ВыборФайла.ПолноеИмяФайла Тогда - КопироватьФайл(ПутьКФайлуВКеше, ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - Состояние(НСтр("ru = 'Файл успешно сохранен'"), , ВыборФайла.ПолноеИмяФайла); - КонецЕсли; - - ПутьВыбораПрежний = ПутьВыбора; - Файл = Новый Файл(ВыборФайла.ПолноеИмяФайла); - ПутьВыбора = Файл.Путь; - Если ПутьВыбораПрежний <> ПутьВыбора Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляСохранитьКак", ПутьВыбора); - КонецЕсли; - - Возврат ВыборФайла.ПолноеИмяФайла; - КонецЕсли; - - Иначе // веб клиент - АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); - - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется сохранение файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - - // Сохраним Файл из БД на диск - ПолучитьФайл(АдресФайла, ИмяФайла, Истина); - - // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения - Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда - УдалитьИзВременногоХранилища(АдресФайла); - КонецЕсли; - КонецЕсли; - - Возврат ""; -КонецФункции - -// Процедура открывает проводник Windows, позиционируясь на Файл -// -// Параметры -// ДанныеФайла - структура с данными файла -Процедура КаталогФайла(ДанныеФайла) Экспорт - - // Если Файл без файла - эта операция не имеет смысла - Если ДанныеФайла.Версия.Пустая() Тогда - Возврат; - КонецЕсли; - -#Если ВебКлиент Тогда - Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда - ФайловыеФункцииСлужебныйКлиент.ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(); - Возврат; - КонецЕсли; -#КонецЕсли - - ПолноеИмяФайла = ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла); - Если ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайла) = Истина Тогда - Возврат; - КонецЕсли; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - КодВозврата = Вопрос( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |отсутствует в рабочем каталоге. - | - |Получить файл из хранилища файлов?'"), - ИмяФайла), - РежимДиалогаВопрос.ДаНет); - - Если КодВозврата = КодВозвратаДиалога.Да Тогда - ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, ПолноеИмяФайла); - ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(ПолноеИмяФайла); - КонецЕсли; - - // для варианта с хранением файлов на диске (на сервере) удаляем Файл из временного хранилища после получения - Если ЭтоАдресВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии) Тогда - УдалитьИзВременногоХранилища(ДанныеФайла.НавигационнаяСсылкаТекущейВерсии); - КонецЕсли; КонецПроцедуры -// Открывает диалог вопроса со списком Файлов или информации о Файлах -// -// Параметры -// Список - СписокЗначений - список файлов -// СообщениеВопрос - Строка - текст вопроса -// СообщениеЗаголовок - Строка - текст заголовка вопроса -// Заголовок - Строка - заголовок формы -Функция ДиалогВопросаСоСписком(Список, СообщениеВопрос, СообщениеЗаголовок, Заголовок) - Параметры = Новый Структура; - Параметры.Вставить("СообщениеВопрос", СообщениеВопрос); - Параметры.Вставить("СообщениеЗаголовок", СообщениеЗаголовок); - Параметры.Вставить("Заголовок", Заголовок); - Параметры.Вставить("Файлы", Список); - - Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ФормаВопроса", Параметры); - Возврат (Результат = КодВозвратаДиалога.Да); - -КонецФункции - // переносит файл из одного списка приложенных файлов в другой // Параметры // ФайлСсылка - СправочникСсылка.Файлы - файл @@ -2810,7 +7419,7 @@ КонецЕсли; -КонецПроцедуры +КонецПроцедуры // переносит файлы из одного списка приложенных файлов в другой // Параметры @@ -2833,16 +7442,16 @@ ИначеЕсли Результат.Получить(ФайлСсылка) = "Обновить" Тогда МассивОбновить.Добавить(ФайлСсылка); КонецЕсли; - КонецЦикла; + КонецЦикла; Если МассивСкопировать.Количество() > 0 Тогда РаботаСФайламиСлужебныйВызовСервера.СкопироватьФайлВПриложенных( МассивСкопировать, ВладелецФайла); - КонецЕсли; + КонецЕсли; Если МассивОбновить.Количество() > 0 Тогда РаботаСФайламиСлужебныйВызовСервера.ОбновитьФайлВПриложенных(МассивОбновить, ВладелецФайла); - КонецЕсли; + КонецЕсли; ОбщееКоличество = МассивСкопировать.Количество() + МассивОбновить.Количество(); Если ОбщееКоличество > 0 Тогда @@ -2858,309 +7467,12 @@ ПолноеОписание, БиблиотекаКартинок.Информация32); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -// Выбирает на диске файл и создает из него новую версию - реализация низкоуровневая -// -// Параметры -// ДанныеФайла - структура с данными файла -// ИдентификаторФормы - уникальный идентификатор формы -// ДиалогПолноеИмяФайла - Строка - полное имя файла, выбранное в диалоге -// СоздатьНовуюВерсию - Булево - Создать новую версию -// КомментарийКВерсии - Строка - Комментарий к версии -Процедура ОбновитьИзФайлаНаДискеРеализация(ДанныеФайла, ИдентификаторФормы, ДиалогПолноеИмяФайла, - СоздатьНовуюВерсию = Неопределено, КомментарийКВерсии = Неопределено) Экспорт - - ФайлНаДиске = Новый Файл(ДиалогПолноеИмяФайла); - ИмяИРасширениеФайлаНаДиске = ФайлНаДиске.Имя; - ВремяИзмененияВыбранное = ФайлНаДиске.ПолучитьУниверсальноеВремяИзменения(); - РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(ФайлНаДиске.Расширение); - ИмяФайла = ФайлНаДиске.ИмяБезРасширения; - - РасширениеДляЗашифрованныхФайлов = - ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьПерсональныеНастройкиРаботыСЭЦП( - ).РасширениеДляЗашифрованныхФайлов; - - ФайлЗашифрован = Ложь; - Если НРег(РасширениеФайлаНаДиске) = НРег(РасширениеДляЗашифрованныхФайлов) Тогда - - ФайлЗашифрован = Истина; - - // отрезаем .p7m в конце - Позиция = Найти(ИмяИРасширениеФайлаНаДиске, РасширениеФайлаНаДиске); - ИмяИРасширениеФайлаНаДиске = Лев(ИмяИРасширениеФайлаНаДиске, Позиция - 2); - - // отрезаем .p7m в конце - ДиалогПолноеИмяФайлаПрежнее = ДиалогПолноеИмяФайла; - Позиция = Найти(ДиалогПолноеИмяФайла, РасширениеФайлаНаДиске); - ДиалогПолноеИмяФайла = Лев(ДиалогПолноеИмяФайла, Позиция - 2); - - ВрФайлНешифрованный = Новый Файл(ДиалогПолноеИмяФайла); - - РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( - ВрФайлНешифрованный.Расширение); - - ФайловыеФункцииСлужебныйКлиентСервер.ПроверитьРасширениеФайлаДляЗагрузки( - РасширениеФайлаНаДиске); - - // Тут расшифровать и поставить ту же дату изменения, что и ДиалогПолноеИмяФайлаПрежнее. - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Заголовок", НСтр("ru = 'Введите пароль для расшифровки'")); - ПараметрыФормы.Вставить("ПредставленияСертификатов", ""); - ПараметрыФормы.Вставить("Файл", ДанныеФайла.Ссылка); - - КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); - - Пароль = ?(ТипЗнч(КодВозврата) = Тип("Строка"), КодВозврата, ""); - - УдалитьФайл(ДиалогПолноеИмяФайла, Ложь); // на случай если есть файл с таким именем - - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; - МенеджерКриптографии.Расшифровать(ДиалогПолноеИмяФайлаПрежнее, ДиалогПолноеИмяФайла); - - ВрФайлНешифрованный = Новый Файл(ДиалогПолноеИмяФайла); - - РасширениеФайлаНаДиске = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки( - ВрФайлНешифрованный.Расширение); - - ВрФайлНешифрованный.УстановитьУниверсальноеВремяИзменения(ВремяИзмененияВыбранное); - - КонецЕсли; - - // данные файла могли измениться - обновим - ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИРабочийКаталог(ДанныеФайла.Ссылка); - - ПредыдущаяВерсия = ДанныеФайла.Версия; - - ИмяИРасширениеФайлаВБазе = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - РедактируетТекущийПользователь = ДанныеФайла.РедактируетТекущийПользователь; - - ДатаФайлаВБазе = ДанныеФайла.ДатаМодификацииУниверсальная; - - Если ВремяИзмененияВыбранное < ДатаФайлаВБазе Тогда // В хранилище более новый. - - СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |в хранилище файлов имеет более позднюю дату изменения (%2), - |чем выбранный файл (%3). - | - |Операция прервана.'"), - Строка(ДанныеФайла.Ссылка), - МестноеВремя(ДатаФайлаВБазе), - МестноеВремя(ВремяИзмененияВыбранное)); - - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - - // Проверка наличия файла в рабочем каталоге. - ВРабочемКаталогеНаЧтение = Истина; - ВРабочемКаталогеВладельца = Ложь; - ПолноеИмяФайла = ""; - ФайлВРабочемКаталоге = ФайлНаходитсяВЛокальномКэшеФайлов( - Неопределено, ПредыдущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - - Если РедактируетТекущийПользователь Тогда // Файл уже был занят. - - Если ФайлВРабочемКаталоге = Истина Тогда - ФайлВКеше = Новый Файл(ПолноеИмяФайла); - ВремяИзмененияВКеше = ФайлВКеше.ПолучитьУниверсальноеВремяИзменения(); - - Если ВремяИзмененияВыбранное < ВремяИзмененияВКеше Тогда // В рабочем каталоге более новый. - - СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |в рабочем каталоге имеет более позднюю дату изменения (%2), - |чем выбранный файл (%3). - | - |Операция прервана.'"), - Строка(ДанныеФайла.Ссылка), - МестноеВремя(ВремяИзмененияВКеше), - МестноеВремя(ВремяИзмененияВыбранное)); - - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - #Если НЕ ВебКлиент Тогда - // Проверка, что файл не занят приложением. - Попытка - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.Прочитать(ПолноеИмяФайла); - Исключение - СтрокаОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |в рабочем каталоге открыт для редактирования. - | - |Закончите редактирование перед выполнением - |обновления из файла на диске.'"), - ПолноеИмяФайла); - Предупреждение(СтрокаОшибки); - Возврат; - КонецПопытки; - #КонецЕсли - КонецЕсли; - - КонецЕсли; - - Если ФайлВРабочемКаталоге И ИмяИРасширениеФайлаНаДиске <> ИмяИРасширениеФайлаВБазе Тогда - Попытка - УдалитьФайлИзРабочегоКаталога(ДанныеФайла.ТекущаяВерсия, Истина); - ФайлВРабочемКаталоге = Ложь; - Исключение - Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - Возврат; - КонецПопытки; - КонецЕсли; - - Если Не РедактируетТекущийПользователь Тогда - - СтрокаОшибки = ""; - Если Не РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - СтрокаОшибки = ""; - Если Не РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, СтрокаОшибки, ИдентификаторФормы) Тогда - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - НаЧтение = Ложь; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - - КонецЕсли; - - ПереданныйПолныйПутьКФайлу = ""; - - НовоеПолноеИмяФайла = ""; - ДанныеФайла.Вставить("ПутьОбновленияИзФайлаНаДиске", ДиалогПолноеИмяФайла); - ДанныеФайла.Расширение = ОбщегоНазначенияКлиентСервер.РасширениеБезТочки(РасширениеФайлаНаДиске); - - // Помещение в рабочий каталог из выбранного файла на диске, - // т.к. указано свойство ПутьОбновленияИзФайлаНаДиске. - ПолучитьФайлВерсииВРабочийКаталог(ДанныеФайла, НовоеПолноеИмяФайла, ИдентификаторФормы); - - Если ФайлЗашифрован Тогда - РаботаСФайламиСлужебныйВызовСервера.УстановитьПризнакЗашифрован(ДанныеФайла.Ссылка, ФайлЗашифрован); - КонецЕсли; - - Если РедактируетТекущийПользователь Тогда // Файл уже был занят. - - ОпубликоватьФайл(ДанныеФайла.Ссылка, - ИдентификаторФормы, - Неопределено, - Неопределено, - Неопределено, - Неопределено, - ПереданныйПолныйПутьКФайлу, - СоздатьНовуюВерсию, - КомментарийКВерсии); - Иначе - - ЗакончитьРедактирование( - ДанныеФайла.Ссылка, - ИдентификаторФормы, - ДанныеФайла.ХранитьВерсии, - ДанныеФайла.РедактируетТекущийПользователь, - ДанныеФайла.Редактирует, - ДанныеФайла.АвторТекущейВерсии, - ПереданныйПолныйПутьКФайлу, - СоздатьНовуюВерсию, - КомментарийКВерсии); - - КонецЕсли; - - Если ФайлЗашифрован Тогда - УдалитьФайл(ДиалогПолноеИмяФайла, Ложь); КонецЕсли; КонецПроцедуры -// Выбирает на диске файл и создает из него новую версию -// -// Параметры -// ДанныеФайла - структура с данными файла -// ИдентификаторФормы - уникальный идентификатор формы -Функция ОбновитьИзФайлаНаДиске(ДанныеФайла, ИдентификаторФормы) Экспорт - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - Если РасширениеПодключено Тогда - - Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); - - Если НЕ ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда - ПутьВыбора = ДанныеФайла.РабочийКаталогВладельца; - Иначе - ПутьВыбора = ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекЗагрузить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла"); - КонецЕсли; - - Если ПутьВыбора = Неопределено ИЛИ ПутьВыбора = "" Тогда - - #Если НЕ ВебКлиент Тогда - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru = 'Данная команда не поддерживается в базовой версии.'")); - Возврат Ложь; - КонецЕсли; - #КонецЕсли - - ПутьВыбора = ФайловыеФункцииСлужебныйКлиент.КаталогМоиДокументы(); - - КонецЕсли; - - Диалог.Заголовок = НСтр("ru = 'Выбор файла'"); - Диалог.ПредварительныйПросмотр = Ложь; - Диалог.ПроверятьСуществованиеФайла = Ложь; - Диалог.МножественныйВыбор = Ложь; - Диалог.Каталог = ПутьВыбора; - - Диалог.ПолноеИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - Диалог.Фильтр = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл (*.%1)|*.%1|Все файлы (*.*)|*.*'"), - ДанныеФайла.Расширение, - ДанныеФайла.Расширение); - - Если Диалог.Выбрать() Тогда - - ПутьВыбораПрежний = ПутьВыбора; - ФайлНаДиске = Новый Файл(Диалог.ПолноеИмяФайла); - ПутьВыбора = ФайлНаДиске.Путь; - - Если ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда - Если ПутьВыбораПрежний <> ПутьВыбора Тогда - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("НастройкиПрограммы", "ПапкаДляОбновитьИзФайла", ПутьВыбора); - КонецЕсли; - КонецЕсли; - - ОбновитьИзФайлаНаДискеРеализация(ДанныеФайла, ИдентификаторФормы, Диалог.ПолноеИмяФайла); - - Возврат Истина; - - КонецЕсли; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - // Возвращает параметры для работы с занятыми файлами. // Возвращает: // Неопределено - если нет редактируемых файлов или работать с ними не надо. @@ -3176,7 +7488,7 @@ ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( ).ПоказыватьЗанятыеФайлыПриЗавершенииРаботы; - Если НЕ ПоказыватьЗанятыеФайлыПриЗавершенииРаботы Тогда + Если Не ПоказыватьЗанятыеФайлыПриЗавершенииРаботы Тогда Возврат Неопределено; КонецЕсли; @@ -3204,245 +7516,6 @@ ВозвращаемыеПараметры.Вставить("КоличествоЗанятыхФайлов", КоличествоЗанятыхФайлов); Возврат ВозвращаемыеПараметры; -КонецФункции - - -// Шифрует Файл -// Параметры -// ФайлСсылка - СправочникСсылка.Файлы - файл -// МассивСертификатов - Массив - массив сертификатов ЭЦП -// УникальныйИдентификаторФормы - уникальный идентификатор формы -// ДанныеФайла - структура с данными файла -// МассивДанныхДляЗанесенияВБазу - массив структур -// МассивОтпечатков - Массив - массив отпечатков сертификатов, использованных для шифрования -Функция Зашифровать(ФайлСсылка, - МассивСертификатов, - УникальныйИдентификаторФормы, - ДанныеФайла, - МассивДанныхДляЗанесенияВБазу, - МассивОтпечатков) Экспорт - - // не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные - - МассивОтпечатков = Новый Массив; - Для Каждого Сертификат Из МассивСертификатов Цикл - Отпечаток = Base64Строка(Сертификат.Отпечаток); - Представление = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); - ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); - - ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата); - МассивОтпечатков.Добавить(ОтпечатокСтруктура); - КонецЦикла; - - МассивОбъектовШифрования = Новый Массив; - - КоличествоВерсий = ДанныеФайла.КоличествоВерсий; - - Если КоличествоВерсий > 1 Тогда - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Будет выполнено шифрование всех %1 версий файла. - |Это может занять продолжительное время. - | - |Продолжить шифрование файла?'"), - КоличествоВерсий); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла(ФайлСсылка, УникальныйИдентификаторФормы); - - Если МассивВерсий.Количество() = 0 Тогда - Возврат Ложь; - КонецЕсли; - - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется получение всех версий файла ""%1"".'"), - ФайлСсылка); - - Состояние(ТекстСостояния, 0); - - Счетчик = 0; - Для Каждого СтруктураВерсии Из МассивВерсий Цикл - - Прогресс = Счетчик / МассивВерсий.Количество() * 100; - Состояние(ТекстСостояния, Прогресс); - - ДанныеФайла = СтруктураВерсии.ДанныеФайла; - АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); - - СтруктураДляШифрования = Новый Структура; - СтруктураДляШифрования.Вставить("ДвоичныеДанные", ДвоичныеДанные); - СтруктураДляШифрования.Вставить("ВерсияСсылка", СтруктураВерсии.ВерсияСсылка); - СтруктураДляШифрования.Вставить("АдресФайла", АдресФайла); - - МассивОбъектовШифрования.Добавить(СтруктураДляШифрования); - - Счетчик = Счетчик + 1; - - КонецЦикла; - - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется шифрование всех версий файла ""%1"".'"), - ФайлСсылка)); - - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - - МассивДанныхДляЗанесенияВБазу = Новый Массив; - - Для Каждого СтруктураДляШифрования Из МассивОбъектовШифрования Цикл - - ДвоичныеДанные = СтруктураДляШифрования.ДвоичныеДанные; - ВерсияСсылка = СтруктураДляШифрования.ВерсияСсылка; - - ШифрованныйФайлДвоичныеДанные = МенеджерКриптографии.Зашифровать(ДвоичныеДанные, МассивСертификатов); - АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ШифрованныйФайлДвоичныеДанные, УникальныйИдентификаторФормы); - - ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка, АдресФайла, АдресВременногоХранилищаТекста", - АдресВременногоХранилища, ВерсияСсылка, СтруктураДляШифрования.АдресФайла, ""); - МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); - - КонецЦикла; - - Возврат Истина; - -КонецФункции - -// Расшифрует объект - Файл, Версия -// Параметры -// ФайлСсылка - СправочникСсылка.Файлы - файл -// УникальныйИдентификаторФормы - уникальный идентификатор формы -// ДанныеФайла - структура с данными файла -// МассивДанныхДляЗанесенияВБазу - массив структур -Функция Расшифровать(ФайлСсылка, УникальныйИдентификаторФормы, ДанныеФайла, - МассивДанныхДляЗанесенияВБазу) Экспорт - - КоличествоВерсий = ДанныеФайла.КоличествоВерсий; - - // не нужно ПредложитьУстановкуРасширенияРаботыСФайлами(), т.к. все делается в памяти через ДвоичныеДанные - - ПредставленияСертификатов = ""; - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Отпечаток = СтруктураСертификата.Отпечаток; - - ТолькоВЛичномХранилище = Истина; // тут собираем только личные сертификаты - с закрытым ключом - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); - Если Сертификат <> Неопределено Тогда - Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда - ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; - КонецЕсли; - ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; - КонецЕсли; - - КонецЦикла; - - Пароль = ""; - Заголовок = НСтр("ru = 'Введите пароль для расшифровки'"); - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("Заголовок", Заголовок); - ПараметрыФормы.Вставить("ПредставленияСертификатов", ПредставленияСертификатов); - ПараметрыФормы.Вставить("Файл", ФайлСсылка); - - Ответ = ОткрытьФормуМодально("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); - Если ТипЗнч(Ответ) = Тип("Строка") Тогда - Пароль = Ответ; - Иначе - Возврат Ложь; - КонецЕсли; - - МассивОбъектовШифрования = Новый Массив; - - Если КоличествоВерсий > 1 Тогда - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Будет выполнена расшифровка всех %1 версий файла. - |Это может занять продолжительное время. - | - |Продолжить расшифровку файла?'"), - КоличествоВерсий); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется получение всех версий файла ""%1"".'"), - ФайлСсылка); - - Состояние(ТекстСообщения, 0); - - МассивВерсий = РаботаСФайламиСлужебныйВызовСервера.ПолучитьДанныеФайлаИНавигационнуюСсылкуВсехВерсийФайла( - ФайлСсылка, УникальныйИдентификаторФормы); - - Счетчик = 0; - Для Каждого СтруктураВерсии Из МассивВерсий Цикл - - Прогресс = Счетчик / МассивВерсий.Количество() * 100; - Состояние(ТекстСообщения, Прогресс); - - ДанныеФайла = СтруктураВерсии.ДанныеФайла; - АдресФайла = СтруктураВерсии.НавигационнаяСсылкаВерсии; - - ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайла); - - СтруктураДляШифрования = Новый Структура("ДвоичныеДанные, ВерсияСсылка, АдресФайла, Расширение", - ДвоичныеДанные, СтруктураВерсии.ВерсияСсылка, АдресФайла, ДанныеФайла.Расширение); - - МассивОбъектовШифрования.Добавить(СтруктураДляШифрования); - Счетчик = Счетчик + 1; - - КонецЦикла; - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется расшифровка всех версий файла ""%1"".'"), - ФайлСсылка); - Состояние(ТекстСообщения); - - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; - - МассивДанныхДляЗанесенияВБазу = Новый Массив; - ИзвлекатьТекстыФайловНаСервере = - ФайловыеФункцииСлужебныйКлиентСервер.ОбщиеНастройкиРаботыСФайлами( - ).ИзвлекатьТекстыФайловНаСервере; - - Для Каждого СтруктураДляШифрования Из МассивОбъектовШифрования Цикл - - ДвоичныеДанные = СтруктураДляШифрования.ДвоичныеДанные; - ВерсияСсылка = СтруктураДляШифрования.ВерсияСсылка; - - ДвоичныеДанныеРасшифрованные = МенеджерКриптографии.Расшифровать(ДвоичныеДанные); - АдресВременногоХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеРасшифрованные, УникальныйИдентификаторФормы); - - АдресВременногоХранилищаТекста = ""; - #Если НЕ ВебКлиент Тогда - Если НЕ ИзвлекатьТекстыФайловНаСервере Тогда - ПолныйПутьКФайлу = ПолучитьИмяВременногоФайла(СтруктураДляШифрования.Расширение); - ДвоичныеДанныеРасшифрованные.Записать(ПолныйПутьКФайлу); - - АдресВременногоХранилищаТекста = ФайловыеФункцииСлужебныйКлиентСервер.ИзвлечьТекстВоВременноеХранилище( - ПолныйПутьКФайлу, УникальныйИдентификаторФормы); - - УдалитьФайлы(ПолныйПутьКФайлу); - Иначе - АдресВременногоХранилищаТекста = ""; - КонецЕсли; - #КонецЕсли - - ДанныеДляЗаписиНаСервере = Новый Структура("АдресВременногоХранилища, ВерсияСсылка, АдресФайла, АдресВременногоХранилищаТекста", - АдресВременногоХранилища, ВерсияСсылка, СтруктураДляШифрования.АдресФайла, АдресВременногоХранилищаТекста); - МассивДанныхДляЗанесенияВБазу.Добавить(ДанныеДляЗаписиНаСервере); - - КонецЦикла; - - Возврат Истина; КонецФункции @@ -3470,129 +7543,12 @@ НСтр("ru = 'Добавлены подписи из файлов для |""%1"".'"), ФайлСсылка); - КонецЕсли; + КонецЕсли; Состояние(ТекстСообщения); КонецПроцедуры -// Очистка рабочего каталога - для освобождения места - в первую очередь удаляет файлы -// наиболее давно помещенные в рабочий каталог -// Параметры -// РазмерФайловВРабочемКаталоге - Число - размер файлов в рабочем каталоге -// РазмерДобавляемогоФайла - Число - Размер добавляемого файла -// ОчищатьВсе - Булево - Удалять все файлы в каталоге (а не только до освобождения нужного объема места на диске) -Процедура ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, РазмерДобавляемогоФайла, ОчищатьВсе) Экспорт - -#Если Не ВебКлиент Тогда - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - ТаблицаФайлов = Новый Массив; - - МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); - - ОбходФайловТаблица(ИмяКаталога, МассивФайлов, ТаблицаФайлов); - - // Вызов сервера - для сортировки - // сортировка по дате - в начале будут самые давно помещенные в рабочий каталог - РаботаСФайламиСлужебныйВызовСервера.СортироватьМассивСтруктур(ТаблицаФайлов); - - МаксРазмер = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).МаксимальныйРазмерЛокальногоКэшаФайлов; - - СреднийРазмерФайла = 1000; - Если ТаблицаФайлов.Количество() <> 0 Тогда - СреднийРазмерФайла = РазмерФайловВРабочемКаталоге / ТаблицаФайлов.Количество(); - КонецЕсли; - - СколькоНадоОсвободитьМеста = МаксРазмер / 10; - Если СреднийРазмерФайла * 3 / 2 > СколькоНадоОсвободитьМеста Тогда - СколькоНадоОсвободитьМеста = СреднийРазмерФайла * 3 / 2; - КонецЕсли; - - СколькоОсталось = РазмерФайловВРабочемКаталоге + РазмерДобавляемогоФайла; - - Ответ = ""; - - Для Каждого Строка из ТаблицаФайлов Цикл - - Если Строка.Версия.Пустая() Тогда - Если Ответ <> "ДаДляВсех" И Ответ <> "НетДляВсех" Тогда - - Если ОчищатьВсе = Ложь Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется очистка рабочего каталога при добавлении файла. - | - |В хранилище файлов не найден файл - |""%1"". - | - |Удалить его из рабочего каталога?'"), - ИмяКаталога + Строка.Путь); - Иначе - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В хранилище файлов не найден файл - |""%1"". - | - |Удалить его из рабочего каталога?'"), - ИмяКаталога + Строка.Путь); - КонецЕсли; - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("Да", НСтр("ru = 'Да'")); - Кнопки.Добавить("ДаДляВсех", НСтр("ru = 'Да для всех'")); - Кнопки.Добавить("Нет", НСтр("ru = 'Нет'")); - Кнопки.Добавить("НетДляВсех", НСтр("ru = 'Нет для всех'")); - - Ответ = Вопрос(ТекстВопроса, Кнопки); - КонецЕсли; - - Если Ответ = "Нет" ИЛИ Ответ = "НетДляВсех" Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - ПолныйПуть = ИмяКаталога + Строка.Путь; - ФайлНаДиске = Новый Файл(ПолныйПуть); - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - Если ОчищатьВсе = Ложь Тогда - ШапкаВопроса = НСтр("ru = 'Выполняется очистка рабочего каталога при добавлении файла.'"); - Иначе - ШапкаВопроса = НСтр("ru = 'Выполняется очистка рабочего каталога.'"); - КонецЕсли; - УдалитьФайл(ПолныйПуть, Неопределено, ШапкаВопроса); - - ПутьСПодкаталогом = ИмяКаталога; - Позиция = Найти(Строка.Путь, ОбщегоНазначенияКлиентСервер.РазделительПути()); - Если Позиция <> 0 Тогда - ПутьСПодкаталогом = ИмяКаталога + Лев(Строка.Путь, Позиция); - КонецЕсли; - - // Если каталог стал пуст - удалить его - МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); - Если МассивФайловВКаталоге.Количество() = 0 Тогда - Если ПутьСПодкаталогом <> ИмяКаталога Тогда - УдалитьФайлы(ПутьСПодкаталогом); - КонецЕсли; - КонецЕсли; - - // Удаление из регистра сведений - РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Строка.Версия); - - СколькоОсталось = СколькоОсталось - Строка.Размер; - Если СколькоОсталось < МаксРазмер - СколькоНадоОсвободитьМеста Тогда - Если НЕ ОчищатьВсе Тогда - Прервать; // Освободили достаточно - выходим - КонецЕсли; - КонецЕсли; - - КонецЦикла; - - Если ОчищатьВсе Тогда - РаботаСФайламиСлужебныйВызовСервера.ОчиститьВсеСвоиКромеЗанятых(); - КонецЕсли; -#КонецЕсли -КонецПроцедуры - // Рекурсивный обход файлов в рабочем каталоге и сбор информации о них // Параметры // Путь - Строка - путь рабочего каталога @@ -3668,56 +7624,6 @@ КонецПроцедуры -// Удалить с диска и из регистра сведений -// -// Параметры -// Ссылка - СправочникСсылка.Файлы - файл -// УдалитьДажеВРабочемКаталоге - Булево - Удалить даже в рабочем каталоге -Процедура УдалитьФайлИзРабочегоКаталога(Ссылка, УдалитьДажеВРабочемКаталоге = Неопределено) Экспорт - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - ВРабочемКаталогеНаЧтение = Ложь; - ВРабочемКаталогеВладельца = Ложь; - ПутьВРегистре = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемИзРегистра(Ссылка, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); - - // Получить путь из регистра - ИмяФайлаСПутем = ПутьВРегистре; - Если ИмяФайлаСПутем <> "" Тогда - - // обычно в рабочем каталоге не удаляем - только если передан УдалитьДажеВРабочемКаталоге - Если Не ВРабочемКаталогеВладельца Или УдалитьДажеВРабочемКаталоге = Истина Тогда - - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); - - Если ФайлНаДиске.Существует() Тогда - ФайлНаДиске.УстановитьТолькоЧтение(Ложь); - - УдалитьФайл(ИмяФайлаСПутем); - - ПутьСПодкаталогом = ИмяКаталога; - Позиция = Найти(ПутьВРегистре, ОбщегоНазначенияКлиентСервер.РазделительПути()); - Если Позиция <> 0 Тогда - ПутьСПодкаталогом = ИмяКаталога + Лев(ПутьВРегистре, Позиция); - КонецЕсли; - - МассивФайловВКаталоге = НайтиФайлы(ПутьСПодкаталогом, "*.*"); - Если МассивФайловВКаталоге.Количество() = 0 Тогда - Если ПутьСПодкаталогом <> ИмяКаталога Тогда - УдалитьФайлы(ПутьСПодкаталогом); - КонецЕсли; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Если ИмяФайлаСПутем = "" Или НЕ ФайлНаДиске.Существует() Тогда - РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(Ссылка); - КонецЕсли; - -КонецПроцедуры - // Получает относительный путь к файлу в рабочем каталоге - если есть в регистре сведений - оттуда, // если нет - сгенерируем - и запишем в регистр сведений // @@ -3729,18 +7635,18 @@ Функция ПолучитьПутьФайлаВРабочемКаталоге(ДанныеФайла) ПутьДляВозврата = ""; - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); // Сперва пытаемся найти такую запись в регистре сведений - ИмяФайлаСПутем = ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; + ПолноеИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; - Если ИмяФайлаСПутем <> "" Тогда + Если ПолноеИмяФайла <> "" Тогда // Тут надо еще на наличие на диске проверять - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); Если ФайлНаДиске.Существует() Тогда - Возврат ИмяФайлаСПутем; + Возврат ПолноеИмяФайла; КонецЕсли; КонецЕсли; @@ -3751,13 +7657,13 @@ ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением(ИмяФайла, Расширение); КонецЕсли; - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; Если Не ПустаяСтрока(ИмяФайла) Тогда - Если НЕ ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда - ИмяФайлаСПутем = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; + Если Не ПустаяСтрока(ДанныеФайла.РабочийКаталогВладельца) Тогда + ПолноеИмяФайла = ДанныеФайла.РабочийКаталогВладельца + ДанныеФайла.ПолноеНаименованиеВерсии + "." + ДанныеФайла.Расширение; Иначе - ИмяФайлаСПутем = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - КонецЕсли; + ПолноеИмяФайла = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем(ИмяКаталога, ИмяФайла, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + КонецЕсли; КонецЕсли; Если ПустаяСтрока(ИмяФайла) Тогда @@ -3767,12 +7673,12 @@ // Запишем в регистр имя файла НаЧтение = Истина; ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - РаботаСФайламиСлужебныйВызовСервера.ЗаписатьИмяФайлаСПутемВРегистр(ДанныеФайла.Версия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца); + РаботаСФайламиСлужебныйВызовСервера.ЗаписатьПолноеИмяФайлаВРегистр(ДанныеФайла.Версия, ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца); Если ДанныеФайла.РабочийКаталогВладельца = "" Тогда - ПутьДляВозврата = ИмяКаталога + ИмяФайлаСПутем; + ПутьДляВозврата = ИмяКаталога + ПолноеИмяФайла; Иначе - ПутьДляВозврата = ИмяФайлаСПутем; + ПутьДляВозврата = ПолноеИмяФайла; КонецЕсли; Возврат ПутьДляВозврата; @@ -3827,7 +7733,7 @@ Возврат Ложь; КонецЕсли; - КомпонентаTwain = Новый("AddIn.twain.AddInNativeExtension"); + КомпонентаTwain = Новый("AddIn.twain.AddInNativeExtension"); КонецЕсли; Возврат Истина; @@ -3835,38 +7741,42 @@ КонецФункции // Установка компоненты сканирования. -Процедура УстановитьКомпоненту() Экспорт +// +// Параметры +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +// Возвращаемое значение: +// Булево - Успешно ли выполнена операция. +// +// См. также: +// Переменную глобального контекста КомпонентаTwain. +// +Процедура УстановитьКомпоненту(ОбработчикРезультата) Экспорт Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + ВернутьРезультат(ОбработчикРезультата, Ложь); Возврат; КонецЕсли; - ТекстСостояния = НСтр("ru = 'Компонента сканирования уже установлена.'"); - - Если КомпонентаTwain = Неопределено Тогда - - КомпонентаПодключена = ПодключитьВнешнююКомпоненту( - "ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); - - Если КомпонентаПодключена Тогда - Состояние(ТекстСостояния); - Иначе - УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаTWAIN"); - - КомпонентаПодключена = ПодключитьВнешнююКомпоненту( - "ОбщийМакет.КомпонентаTWAIN", "twain", ТипВнешнейКомпоненты.Native); - - Если КомпонентаПодключена Тогда - РаботаСФайламиСлужебныйВызовСервера.ОчиститьНастройкиФормНовогоФайла(); - Оповестить("КомпонентаСканированияУстановлена"); - КонецЕсли; - КонецЕсли; - - КомпонентаTwain = Новый("AddIn.twain.AddInNativeExtension"); - Иначе - Состояние(ТекстСостояния); + Если ПроинициализироватьКомпоненту() Тогда + Состояние(НСтр("ru = 'Компонента сканирования уже установлена.'")); + ВернутьРезультат(ОбработчикРезультата, Истина); + Возврат; КонецЕсли; + ПараметрыВыполнения = Новый Структура; + ПараметрыВыполнения.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("УстановитьКомпонентуЗавершение", ЭтотОбъект, ПараметрыВыполнения); + НачатьУстановкуВнешнейКомпоненты(Обработчик, "ОбщийМакет.КомпонентаTWAIN"); + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура УстановитьКомпонентуЗавершение(ПараметрыВыполнения) Экспорт + + КомпонентаПодключена = ПроинициализироватьКомпоненту(); + ВернутьРезультат(ПараметрыВыполнения.ОбработчикРезультата, КомпонентаПодключена); + КонецПроцедуры // Возвращает версию компоненты сканирования. @@ -3900,31 +7810,6 @@ КонецФункции -// Открывает диалог сканирования и просмотра картинки. -Процедура СканироватьИПоказатьДиалогПросмотра( - ВладелецФайла, - УникальныйИдентификатор, - ЭтаФорма, - НеОткрыватьКарточкуПослеСозданияИзФайла = Неопределено) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - Возврат; - КонецЕсли; - - СистемнаяИнформация = Новый СистемнаяИнформация(); - ИдентификаторКлиента = СистемнаяИнформация.ИдентификаторКлиента; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ВладелецФайла", ВладелецФайла); - ПараметрыФормы.Вставить("ИдентификаторКлиента", ИдентификаторКлиента); - - ПараметрыФормы.Вставить( - "НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла); - - ОткрытьФорму("Справочник.Файлы.Форма.РезультатСканирования", ПараметрыФормы); - -КонецПроцедуры - // Проверяет установлена ли компонента сканирования и есть ли хоть один сканер. Функция ДоступнаКомандаСканировать() Экспорт @@ -3947,13 +7832,12 @@ // Возвращает настройку сканера по имени. // // Параметры: -// ИмяУстройства - Строка - Имя сканера -// -// ИмяНастройки - Строка - имя настройки, например "XRESOLUTION" или -// "PIXELTYPE" или "ROTATION" или "SUPPORTEDSIZES". +// ИмяУстройства - Строка - Имя сканера +// ИмяНастройки - Строка - Имя настройки, +// например "XRESOLUTION", или "PIXELTYPE", или "ROTATION", или "SUPPORTEDSIZES". // // Возвращаемое значение: -// Число - значение настройки сканера. +// Число - Значение настройки сканера. // Функция ПолучитьНастройку(ИмяУстройства, ИмяНастройки) Экспорт @@ -4008,67 +7892,6 @@ //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Пометка файла как занятого для редактирования -// Параметры -// ДанныеФайла - структура с данными файла -Процедура ЗанятьФайл(ДанныеФайла) - - ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - - СтрокаОшибки = ""; - Если РаботаСФайламиКлиентСервер.МожноЛиЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - - СтрокаОшибки = ""; - Если Не РаботаСФайламиСлужебныйВызовСервера.ЗанятьФайл(ДанныеФайла, СтрокаОшибки) Тогда - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - - Если РасширениеПодключено Тогда - НаЧтение = Ложь; - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - ПеререгистрироватьФайлВРабочемКаталоге(ДанныеФайла, НаЧтение, ВРабочемКаталогеВладельца); - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Редактирование файла'"), - ДанныеФайла.НавигационнаяСсылка, - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Файл ""%1"" - |занят для редактирования.'"), - Строка(ДанныеФайла.Ссылка)), - БиблиотекаКартинок.Информация32); - - Иначе - Предупреждение(СтрокаОшибки); - Возврат; - КонецЕсли; - -КонецПроцедуры - -// Покажет напоминание - если стоит настройка -Процедура ПоказатьНапоминаниеПередПоместитьФайл() - - Если ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если НЕ РасширениеПодключено Тогда - // Кешируем форму на клиенте - Форма = РаботаСФайламиСлужебныйКлиентПовтИсп.ПолучитьФормуНапоминанияПередПоместитьФайл(); - БольшеНеПоказывать = Форма.ОткрытьМодально(); - - Если БольшеНеПоказывать = Истина Тогда - ПоказыватьПодсказкиПриРедактированииФайлов = Ложь; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения("НастройкиПрограммы", "ПоказыватьПодсказкиПриРедактированииФайлов", ПоказыватьПодсказкиПриРедактированииФайлов); - КонецЕсли; - КонецЕсли; - - КонецЕсли; -КонецПроцедуры - // Находится ли в рабочем каталоге Файл для данной версии // Параметры // ДанныеФайла - структура с данными файла @@ -4076,72 +7899,39 @@ // Возвращаемое значение: // Булево - файл находится в рабочем каталоге // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов - версия файла -// ИмяФайлаСПутем - Строка - имя файла с путем +// ПолноеИмяФайла - Строка - имя файла с путем // ВРабочемКаталогеНаЧтение - Булево - файл помещен на чтение // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге) -Функция ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ТекущаяВерсия, ИмяФайлаСПутем, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) - ИмяФайлаСПутем = ""; +Функция ФайлНаходитсяВЛокальномКэшеФайлов(ДанныеФайла, ТекущаяВерсия, ПолноеИмяФайла, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца) + ПолноеИмяФайла = ""; // Если это активная версия - берем из ДанныеФайла Если ДанныеФайла <> Неопределено И ДанныеФайла.ТекущаяВерсия = ТекущаяВерсия Тогда - ИмяФайлаСПутем = ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; + ПолноеИмяФайла = ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; ВРабочемКаталогеНаЧтение = ДанныеФайла.ВРабочемКаталогеНаЧтение; Иначе ВРабочемКаталогеНаЧтение = Истина; ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); // Пытаемся найти такую запись в регистре сведений - ИмяФайлаСПутем = РаботаСФайламиСлужебныйВызовСервера.ПолучитьИмяФайлаСПутемИзРегистра(ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); + ПолноеИмяФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьПолноеИмяФайлаИзРегистра(ТекущаяВерсия, ИмяКаталога, ВРабочемКаталогеНаЧтение, ВРабочемКаталогеВладельца); КонецЕсли; - Если ИмяФайлаСПутем <> "" Тогда + Если ПолноеИмяФайла <> "" Тогда // Тут надо еще на наличие на диске проверять - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); + ФайлНаДиске = Новый Файл(ПолноеИмяФайла); Если ФайлНаДиске.Существует() Тогда - Возврат Истина; + Возврат Истина; Иначе - ИмяФайлаСПутем = ""; + ПолноеИмяФайла = ""; // Тут же удалим из регистра - т.к. в регистре есть, а на диске нет РаботаСФайламиСлужебныйВызовСервера.УдалитьИзРегистра(ТекущаяВерсия); КонецЕсли; КонецЕсли; Возврат Ложь; + КонецФункции -// Освободить место для помещения файла - если место есть, ничего не делает -// Параметры -// РеквизитыВерсии - структура с реквизитами версии -Процедура ОсвободитьМестоВРабочемКаталоге(РеквизитыВерсии) - -#Если НЕ ВебКлиент Тогда - - МаксРазмер = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).МаксимальныйРазмерЛокальногоКэшаФайлов; - - // Если размер РабочийКаталог установлен равным 0, - // то считается, что никакого ограничения нет и умолчание в 10 Мб не используется. - Если МаксРазмер = 0 Тогда - Возврат; - КонецЕсли; - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - МассивФайлов = НайтиФайлы(ИмяКаталога, "*.*"); - - РазмерФайловВРабочемКаталоге = 0; - КоличествоСуммарное = 0; - // Вычисление полного размера файлов в рабочем каталоге. - ФайловыеФункцииСлужебныйКлиент.ОбходФайловРазмер(ИмяКаталога, МассивФайлов, РазмерФайловВРабочемКаталоге, КоличествоСуммарное); - - Размер = РеквизитыВерсии.Размер; - Если РазмерФайловВРабочемКаталоге + Размер > МаксРазмер Тогда - ОчиститьРабочийКаталог(РазмерФайловВРабочемКаталоге, Размер, Ложь); // ОчищатьВсе = Ложь. - КонецЕсли; - -#КонецЕсли - -КонецПроцедуры - // Выбрать путь к рабочему каталогу // Параметры // ИмяКаталога - Строка - прежнее имя каталога @@ -4152,848 +7942,75 @@ // Булево - успешно ли выполнена операция Функция ВыбратьПутьКРабочемуКаталогу(ИмяКаталога, Заголовок, РабочийКаталогВладельца) Экспорт - Режим = РежимДиалогаВыбораФайла.ВыборКаталога; - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - ДиалогОткрытияФайла.Каталог = ИмяКаталога; - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = Заголовок; - Если ДиалогОткрытияФайла.Выбрать() Тогда + Режим = РежимДиалогаВыбораФайла.ВыборКаталога; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + ДиалогОткрытияФайла.ПолноеИмяФайла = ""; + ДиалогОткрытияФайла.Каталог = ИмяКаталога; + ДиалогОткрытияФайла.МножественныйВыбор = Ложь; + ДиалогОткрытияФайла.Заголовок = Заголовок; + + Если ДиалогОткрытияФайла.Выбрать() Тогда + + ИмяКаталога = ДиалогОткрытияФайла.Каталог; + ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); + + // Создать каталог для файлов + Попытка + СоздатьКаталог(ИмяКаталога); + ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; + СоздатьКаталог(ИмяКаталогаТестовое); + УдалитьФайлы(ИмяКаталогаТестовое); + Исключение + // нет прав на создание каталога, или такой путь отсутствует - ИмяКаталога = ДиалогОткрытияФайла.Каталог; - ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - - // Создать каталог для файлов - Попытка - СоздатьКаталог(ИмяКаталога); - ИмяКаталогаТестовое = ИмяКаталога + "ПроверкаДоступа\"; - СоздатьКаталог(ИмяКаталогаТестовое); - УдалитьФайлы(ИмяКаталогаТестовое); - Исключение - // нет прав на создание каталога, или такой путь отсутствует - - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог - |""%1"".'"), - ИмяКаталога); - Предупреждение(ТекстОшибки); - Возврат Ложь; - КонецПопытки; - - Если РабочийКаталогВладельца = Ложь Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный путь или отсутствуют права на запись в каталог + |""%1"".'"), + ИмяКаталога); + ПоказатьПредупреждение(, ТекстОшибки); + Возврат Ложь; + КонецПопытки; + + Если РабочийКаталогВладельца = Ложь Тогда #Если Не ВебКлиент Тогда - МассивФайловВКаталоге = НайтиФайлы(ИмяКаталога, "*.*"); - Если МассивФайловВКаталоге.Количество() <> 0 Тогда - ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В выбранном рабочем каталоге - |""%1"" - |уже есть файлы. - | - |Выберите другой каталог.'"), - ИмяКаталога); - Предупреждение(ТекстОшибки); - Возврат Ложь; - КонецЕсли; -#КонецЕсли + МассивФайловВКаталоге = НайтиФайлы(ИмяКаталога, "*.*"); + Если МассивФайловВКаталоге.Количество() <> 0 Тогда + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'В выбранном рабочем каталоге + |""%1"" + |уже есть файлы. + | + |Выберите другой каталог.'"), + ИмяКаталога); + ПоказатьПредупреждение(, ТекстОшибки); + Возврат Ложь; КонецЕсли; - - Возврат Истина; +#КонецЕсли КонецЕсли; + + Возврат Истина; + КонецЕсли; Возврат Ложь; -КонецФункции - - -// Копирует все файлы в указанном каталоге в другой каталог -// Параметры -// ИмяКаталогаПрежнееЗначение - Строка - прежнее имя каталога -// ИмяКаталога - Строка - новое имя каталога -// СкопированныеФайлыИПапки - Массив - массив строк - файлов и папок -// ОригинальныеФайлыИПапки - Массив - массив строк - файлов и папок -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция СкопироватьСодержимоеКаталога(ИмяКаталогаПрежнееЗначение, ИмяКаталога, - СкопированныеФайлыИПапки, ОригинальныеФайлыИПапки) - - ТекущийПутьНазначения = ИмяКаталога; - ТекущийПутьНазначения = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ТекущийПутьНазначения, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - ТекущийПутьИсточника = ИмяКаталогаПрежнееЗначение; - ТекущийПутьИсточника = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ТекущийПутьИсточника, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - - МассивФайловВКаталоге = НайтиФайлы(ТекущийПутьИсточника, "*.*"); - - Для Каждого ВыбранныйФайл Из МассивФайловВКаталоге Цикл - - Если ВыбранныйФайл.ЭтоКаталог() Тогда - - НовыйПутьНазначения = ТекущийПутьНазначения + Строка(ВыбранныйФайл.Имя); - НовыйПутьИсточника = ТекущийПутьИсточника + Строка(ВыбранныйФайл.Имя); - - СоздатьКаталог(НовыйПутьНазначения); - СкопированныеФайлыИПапки.Добавить(НовыйПутьНазначения); - ОригинальныеФайлыИПапки.Добавить(ВыбранныйФайл.ПолноеИмя); - - Если НЕ СкопироватьСодержимоеКаталога(НовыйПутьИсточника, НовыйПутьНазначения, СкопированныеФайлыИПапки, ОригинальныеФайлыИПапки) Тогда - Возврат Ложь; - КонецЕсли; - - Иначе // это файл - - ПолноеИмяФайлаНазначения = ТекущийПутьНазначения + Строка(ВыбранныйФайл.Имя); - ОригинальныеФайлыИПапки.Добавить(ВыбранныйФайл.ПолноеИмя); - - ФайлНазначения = Новый Файл(ПолноеИмяФайлаНазначения); - Если ФайлНазначения.Существует() Тогда // это нужно для обратного копирования - в этом случае файлы могут уже быть - СкопированныеФайлыИПапки.Добавить(ПолноеИмяФайлаНазначения); - Продолжить; - КонецЕсли; - - Пока Истина Цикл - - Попытка - КопироватьФайл(ВыбранныйФайл.ПолноеИмя, ПолноеИмяФайлаНазначения); - СкопированныеФайлыИПапки.Добавить(ПолноеИмяФайлаНазначения); - Прервать; - Исключение - // тут даем Вопрос - повторить или нет - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось скопировать файл - |""%1"". - |Возможно он занят другим приложением. - | - |Повторить операцию?'"), - ВыбранныйФайл.ПолноеИмя); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - - КонецПопытки; - - КонецЦикла; - - КонецЕсли; - - КонецЦикла; - - Возврат Истина; - -КонецФункции - -// Удаляет все файлы и папки из переданного массива - идем с конца -// Параметры -// СкопированныеФайлыИПапки - Массив - массив строк - файлов и папок -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция УдалитьСодержимоеКаталога(СкопированныеФайлыИПапки) - - Количество = СкопированныеФайлыИПапки.Количество(); - Для Индекс = 0 По Количество - 1 Цикл - - Путь = СкопированныеФайлыИПапки[Количество - 1 - Индекс]; - Файл = Новый Файл(Путь); - Если НЕ Файл.Существует() Тогда - Продолжить; // например временный файл Word ~aaa.doc мог быть удален при закрытии Word - КонецЕсли; - - Пока Истина Цикл - - Попытка - - Если Файл.ЭтоФайл() И Файл.ПолучитьТолькоЧтение() Тогда - Файл.УстановитьТолькоЧтение(Ложь); - КонецЕсли; - - УдалитьФайлы(Путь); - - Прервать; - - Исключение - // тут даем Вопрос - повторить или нет - - ТекстВопроса = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось удалить файл - |""%1"". - |Возможно он занят другим приложением. - | - |Повторить операцию?'"), - Путь); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - - КонецПопытки; - - КонецЦикла; - - КонецЦикла; - - Возврат Истина; - -КонецФункции - -// Переносит все файлы в рабочем каталоге в другой каталог (в том числе и взятые на редактирование) -// Параметры -// ИмяКаталогаПрежнееЗначение - Строка - прежнее имя каталога -// ИмяКаталога - Строка - новое имя каталога -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция ПеренестиСодержимоеРабочегоКаталога(ИмяКаталогаПрежнееЗначение, ИмяКаталога) Экспорт - - // новый путь является подмножеством старого - это запрещено - приведет к зацикливанию - Если Найти(ИмяКаталога, ИмяКаталогаПрежнееЗначение) <> 0 Тогда - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выбранный рабочий каталог - |""%1"" - |входит в старый рабочий каталог - |""%2"".'"), - ИмяКаталога, ИмяКаталогаПрежнееЗначение); - Предупреждение(ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - // рекурсивно обходим файлы и подкаталоги - // сперва копируем в новый путь - - // 1. фаза копирования - СкопированныеФайлыИПапки = Новый Массив; // массив строк - путей - ОригинальныеФайлыИПапки = Новый Массив; // массив строк - путей в старом пути рабочего каталога - Если НЕ СкопироватьСодержимоеКаталога(ИмяКаталогаПрежнееЗначение, ИмяКаталога, СкопированныеФайлыИПапки, ОригинальныеФайлыИПапки) Тогда - // очищаем то, что успели скопировать - УдалитьСодержимоеКаталога(СкопированныеФайлыИПапки); - Возврат Ложь; - КонецЕсли; - - // 2. Если все удачно скопировали, то удаляем исходный каталог. - Если НЕ УдалитьСодержимоеКаталога(ОригинальныеФайлыИПапки) Тогда - // возвращаем обратно в исходный каталог все, что скопировали - - СкопированныеФайлыИПапкиВторойПроход = Новый Массив; // массив строк - путей - ОригинальныеФайлыИПапкиВторойПроход = Новый Массив; // массив строк - путей в старом пути рабочего каталога - Если НЕ СкопироватьСодержимоеКаталога(ИмяКаталога, ИмяКаталогаПрежнееЗначение, СкопированныеФайлыИПапкиВторойПроход, ОригинальныеФайлыИПапкиВторойПроход) Тогда - - // Если и тут произошла ошибка, то выдаем предупреждение - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось скопировать обратно содержимое каталога - |""%1"" - |в каталог - |""%2"".'"), - ИмяКаталога, - ИмяКаталогаПрежнееЗначение)); - Возврат Ложь; - - КонецЕсли; - - КонецЕсли; - - Возврат Истина; - -КонецФункции - -// Получить Файл с сервера и зарегистрировать в локальном кеше -// Параметры -// ДанныеФайла - структура с данными файла -// ПолноеИмяФайлаВРабочемКаталоге - Строка - здесь возвращается полное имя файла -// ДатаФайлаВБазе - Дата - дата файла в базе -// НаЧтение - Булево - файл помещен на чтение -// ИдентификаторФормы - уникальный идентификатор формы -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция ПолучитьССервераИЗарегистрироватьВЛокальномКэшеФайлов( - ДанныеФайла, - ИмяФайлаСПутем, - ВремяИзмененияУниверсальное, - НаЧтение, - ИдентификаторФормы = Неопределено, - ДополнительныеПараметры = Неопределено) - - ВРабочемКаталогеВладельца = ДанныеФайла.РабочийКаталогВладельца <> ""; - - Если ИмяФайлаСПутем = "" Тогда - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - ИмяКаталогаПрежнееЗначение = ИмяКаталога; - - // Формирование имени файла с расширением - ИмяФайла = ДанныеФайла.ПолноеНаименованиеВерсии; - Если НЕ ПустаяСтрока(ДанныеФайла.Расширение) Тогда - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ИмяФайла, ДанныеФайла.Расширение); - КонецЕсли; - - ИмяФайлаСПутем = ""; - Если НЕ ПустаяСтрока(ИмяФайла) Тогда - ИмяФайлаСПутем = ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( - ИмяКаталога, ИмяФайла, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - КонецЕсли; - - Если ПустаяСтрока(ИмяФайла) Тогда - Возврат Ложь; - КонецЕсли; - - МаксимальнаяДлинаПолногоПути = 260; - Если НРег(ДанныеФайла.Расширение) = "xls" ИЛИ НРег(ДанныеФайла.Расширение) = "xlsx" Тогда - МаксимальнаяДлинаПолногоПути = 218; // Excel Длина имени файла вместе с путем не должна превышать 218 знака - КонецЕсли; - - МаксимальнаяДлинаИмениФайла = МаксимальнаяДлинаПолногоПути - 5; // 5 - минимум для "C:\1\" - - Если ВРабочемКаталогеВладельца = Ложь Тогда -#Если Не ВебКлиент Тогда - - Если СтрДлина(ИмяФайлаСПутем) > МаксимальнаяДлинаПолногоПути Тогда - - ТекстСообщения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов - |%2'"), - МаксимальнаяДлинаПолногоПути, - ИмяФайлаСПутем); - - ПутьКаталогаПользователя = КаталогДанныхПользователя(); - МаксимальнаяДлинаИмениФайла = МаксимальнаяДлинаПолногоПути - СтрДлина(ПутьКаталогаПользователя); - - // если имя файла плюс 5 превышает 260 - пишем "Измените имя файла на более короткое. ОК" и выходим. - Если СтрДлина(ИмяФайла) > МаксимальнаяДлинаИмениФайла Тогда - ТекстСообщения = ТекстСообщения + Символы.ВК + Символы.ВК - + НСтр("ru = 'Измените имя файла на более короткое.'"); - Предупреждение(ТекстСообщения); - Возврат Ложь; - КонецЕсли; - - Пока Истина Цикл - - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Длина полного пути к файлу (рабочий каталог плюс имя файла) превышает %1 символов - |%2'"), - МаксимальнаяДлинаПолногоПути, - ИмяФайлаСПутем); - - ТекстВопроса = ТекстСообщения + Символы.ВК + Символы.ВК - + НСтр("ru = 'Выбрать другой основной рабочий каталог?'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат Ложь; - КонецЕсли; - - // выбираем другой путь к рабочему каталогу - Заголовок = НСтр("ru = 'Выберите другой основной рабочий каталог'"); - Если Не ВыбратьПутьКРабочемуКаталогу(ИмяКаталога, Заголовок, Ложь) Тогда - Возврат Ложь; - КонецЕсли; - - ИмяФайлаСПутем = ИмяКаталога + ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьУникальноеИмяСПутем( - ИмяКаталога, ИмяФайла, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - - Если СтрДлина(ИмяФайлаСПутем) <= МаксимальнаяДлинаПолногоПути Тогда // уложились в 260 символов - - Если ПеренестиСодержимоеРабочегоКаталога(ИмяКаталогаПрежнееЗначение, ИмяКаталога) Тогда - ФайловыеФункцииСлужебныйКлиент.УстановитьРабочийКаталогПользователя(ИмяКаталога); - Иначе - Возврат Ложь; - КонецЕсли; - - Прервать; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - -#КонецЕсли - КонецЕсли; - - КонецЕсли; - - - Если ВРабочемКаталогеВладельца = Ложь Тогда - #Если Не ВебКлиент Тогда // в веб клиенте нельзя определить количество свободного места на диске - ОсвободитьМестоВРабочемКаталоге(ДанныеФайла); - #КонецЕсли - КонецЕсли; - - РазмерФайла = 0; - - - // Запись Файл в каталог - Попытка - - АдресФайла = ДанныеФайла.НавигационнаяСсылкаТекущейВерсии; - - ИмяФайла = ОбщегоНазначенияКлиентСервер.ПолучитьИмяСРасширением( - ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение); - - РазмерВМб = ДанныеФайла.Размер / (1024 * 1024); - - ФайлНаДискеПоИмени = Новый Файл(ИмяФайлаСПутем); - ИмяИРасширениеВПути = ФайлНаДискеПоИмени.Имя; - Позиция = Найти(ИмяФайлаСПутем, ИмяИРасширениеВПути); - ПутьКФайлу = ""; - Если Позиция <> 0 Тогда - ПутьКФайлу = Лев(ИмяФайлаСПутем, Позиция - 1); // -1 - вычет слеша - КонецЕсли; - - //ПутьКФайлу = ФайлНаДискеПоИмени.Путь; - ПутьКФайлу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПутьКФайлу, ОбщегоНазначенияКлиентПовтИсп.ТипПлатформыКлиента()); - ИмяФайлаСПутем = ПутьКФайлу + ИмяФайла; // могло смениться расширение - - ТекстПояснения = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполняется передача файла ""%1"" (%2 Мб)... - |Пожалуйста, подождите.'"), - ИмяФайла, - ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСтрокуСРазмеромФайла(РазмерВМб)); - - Состояние(ТекстПояснения); - - Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда - - КопироватьФайл(ДанныеФайла.ПутьОбновленияИзФайлаНаДиске, ИмяФайлаСПутем); - - Иначе - - Если ДанныеФайла.Версия <> ДанныеФайла.ТекущаяВерсия Тогда - АдресФайла = РаботаСФайламиСлужебныйВызовСервера.ПолучитьНавигационнуюСсылкуДляОткрытия( - ДанныеФайла.Версия, ИдентификаторФормы); - КонецЕсли; - - ПередаваемыеФайлы = Новый Массив; - Описание = Новый ОписаниеПередаваемогоФайла(ИмяФайла, АдресФайла); - ПередаваемыеФайлы.Добавить(Описание); - - #Если ВебКлиент Тогда - Если ДополнительныеПараметры <> Неопределено И ДополнительныеПараметры.Свойство("ОткрытьФайл") Тогда - - МассивОпераций = Новый Массив; - - ОписаниеВызова = Новый Массив; - ОписаниеВызова.Добавить("ПолучитьФайлы"); - ОписаниеВызова.Добавить(ПередаваемыеФайлы); - ОписаниеВызова.Добавить(Неопределено); // Не используется. - ОписаниеВызова.Добавить(ПутьКФайлу); - ОписаниеВызова.Добавить(Ложь); // Интерактивно = Ложь. - МассивОпераций.Добавить(ОписаниеВызова); - - ОписаниеВызова = Новый Массив; - ОписаниеВызова.Добавить("ЗапуститьПриложение"); - ОписаниеВызова.Добавить(ИмяФайлаСПутем); - МассивОпераций.Добавить(ОписаниеВызова); - - Если НЕ ЗапроситьРазрешениеПользователя(МассивОпераций) Тогда - // Пользователь не дал разрешения. - ИмяФайлаСПутем = ""; - Возврат Ложь; - КонецЕсли; - - КонецЕсли; - #КонецЕсли - - Если НЕ ПолучитьФайлы(ПередаваемыеФайлы,, ПутьКФайлу, Ложь) Тогда - Возврат Ложь; - КонецЕсли; - - // Для варианта с хранением файлов на диске (на сервере) - // файл удаляется из временного хранилища после получения. - Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда - УдалитьИзВременногоХранилища(АдресФайла); - КонецЕсли; - КонецЕсли; - - Состояние(); - - Если ДанныеФайла.Зашифрован Тогда - - ПредставленияСертификатов = ""; - Для Каждого СтруктураСертификата Из ДанныеФайла.МассивСертификатовШифрования Цикл - - Отпечаток = СтруктураСертификата.Отпечаток; - - ТолькоВЛичномХранилище = Истина; - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(Отпечаток, ТолькоВЛичномХранилище); - Если Сертификат <> Неопределено Тогда // тут собираем только личные сертификаты - с закрытым ключом - для расшифровки - Если НЕ ПустаяСтрока(ПредставленияСертификатов) Тогда - ПредставленияСертификатов = ПредставленияСертификатов + Символы.ПС; - КонецЕсли; - ПредставленияСертификатов = ПредставленияСертификатов + СтруктураСертификата.Представление; - КонецЕсли; - - КонецЦикла; - - Пароль = ""; - Заголовок = НСтр("ru = 'Введите пароль для расшифровки'"); - ПараметрыФормы = Новый Структура("Заголовок, ПредставленияСертификатов, Файл", - Заголовок, ПредставленияСертификатов, ДанныеФайла.Ссылка); - КодВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВводПароляСОписаниями", ПараметрыФормы); - Если ТипЗнч(КодВозврата) = Тип("Строка") Тогда - Пароль = КодВозврата; - Иначе - УдалитьФайлы(ИмяФайлаСПутем); - ИмяФайлаСПутем = ""; - Возврат Ложь; - КонецЕсли; - - Попытка - МенеджерКриптографии = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМенеджерКриптографии(); - МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; - - ИмяФайлаСПутемРасшифрованное = ИмяФайлаСПутем + ".dec"; - МенеджерКриптографии.Расшифровать(ИмяФайлаСПутем, ИмяФайлаСПутемРасшифрованное); - - УдалитьФайлы(ИмяФайлаСПутем); - ПереместитьФайл(ИмяФайлаСПутемРасшифрованное, ИмяФайлаСПутем); - Исключение - УдалитьФайлы(ИмяФайлаСПутем); - ВызватьИсключение; - КонецПопытки; - - КонецЕсли; - - // Установим время изменения файла таким, как оно стоит в текущей версии - ФайлНаДиске = Новый Файл(ИмяФайлаСПутем); - ФайлНаДиске.УстановитьУниверсальноеВремяИзменения(ВремяИзмененияУниверсальное); - - РазмерФайла = ФайлНаДиске.Размер(); // Т.к. размер на диске может отличаться от размера в базе (при добавлении из веб клиента) - - ФайлНаДиске.УстановитьТолькоЧтение(НаЧтение); - - Исключение - Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - Возврат Ложь; - КонецПопытки; - - ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр( - ДанныеФайла.Версия, - ИмяФайлаСПутем, - ИмяКаталога, - НаЧтение, - РазмерФайла, - ВРабочемКаталогеВладельца); - - Если ДанныеФайла.Размер <> РазмерФайла Тогда - // При обновлении из файла на диске коррекция не нужна. - Если НЕ ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда - - РаботаСФайламиСлужебныйВызовСервера.ОбновитьРазмерФайлаИВерсии( - ДанныеФайла, РазмерФайла, ИдентификаторФормы); - - ОповеститьОбИзменении(ДанныеФайла.Ссылка); - ОповеститьОбИзменении(ДанныеФайла.Версия); - - Оповестить("Запись_Файл", - Новый Структура("Событие", "ДанныеФайлаИзменены"), - ДанныеФайла.Ссылка); - КонецЕсли; - КонецЕсли; - - Возврат Истина; - КонецФункции // Перерегистрировать В рабочем каталоге с другим флагом НаЧтение // Параметры // ТекущаяВерсия - СправочникСсылка.ВерсииФайлов - версия файла -// ИмяФайлаСПутем - Строка - полное имя файла +// ПолноеИмяФайла - Строка - полное имя файла // НаЧтение - Булево - файл помещен на чтение // ВРабочемКаталогеВладельца - Булево - файл в рабочем каталоге владельца (а не в основном рабочем каталоге) -Процедура ПеререгистрироватьВРабочемКаталоге(ТекущаяВерсия, ИмяФайлаСПутем, НаЧтение, ВРабочемКаталогеВладельца) +Процедура ПеререгистрироватьВРабочемКаталоге(ТекущаяВерсия, ПолноеИмяФайла, НаЧтение, ВРабочемКаталогеВладельца) ИмяКаталога = ФайловыеФункцииСлужебныйКлиент.РабочийКаталогПользователя(); - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, ИмяФайлаСПутем, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); - Файл = Новый Файл(ИмяФайлаСПутем); + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюФайлаВРегистр(ТекущаяВерсия, ПолноеИмяФайла, ИмяКаталога, НаЧтение, 0, ВРабочемКаталогеВладельца); + Файл = Новый Файл(ПолноеИмяФайла); Файл.УстановитьТолькоЧтение(НаЧтение); КонецПроцедуры -// Импорт - с вспомогательными операциями типа проверки предельного размера и впоследствии удаления файлов и показа ошибок -// при импорте только одной папки - вернет на нее ссылку -// -// Параметры -// ПапкаДляДобавления - СправочникСсылка.ПапкиФайлов - Папка для добавления -// ВыбранныеФайлы - Массив - массив объектов "Файл" -// Комментарий - Строка - Комментарий -// ХранитьВерсии - Булево - Хранить версии -// УдалятьФайлыПослеДобавления - Булево - Удалять файлы после добавления -// Рекурсивно - Булево - Рекурсивно обходить подкаталоги -// ИдентификаторФормы - уникальный идентификатор формы -// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) -// ДобавленныеФайлы - Массив - Добавленные файлы -// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) -// -// Возвращаемое значение: -// СправочникСсылка.ПапкиФайлов - Папка для добавления -Функция ИмпортФайловВыполнить( - ПапкаДляДобавления, - ВыбранныеФайлы, - Комментарий, - ХранитьВерсии, - УдалятьФайлыПослеДобавления, - Рекурсивно, - ИдентификаторФормы, - Знач ПсевдоФайловаяСистема, - ДобавленныеФайлы, - РежимЗагрузки = Ложь, - Кодировка = Неопределено) Экспорт - - Перем ПерваяПапкаСТакимЖеИменем; - Перем ПапкаДляДобавленияТекущая; - - ВыбранКаталог = Ложь; - Путь = ""; - - КоличествоСуммарное = 0; - Если ПроверитьПредельныйРазмерФайлов(ВыбранныеФайлы, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема, РежимЗагрузки) = Ложь Тогда - Состояние(); - Возврат Неопределено; - КонецЕсли; - - Состояние(); - - Если КоличествоСуммарное = 0 Тогда - - Если Не РежимЗагрузки Тогда - Предупреждение(НСтр("ru = 'Нет файлов для добавления'")); - КонецЕсли; - - Возврат Неопределено; - КонецЕсли; - - Индикатор = 0; - - МассивФайлов = Новый Массив; - Счетчик = 0; - МассивИменФайловСОшибками = Новый Массив; - МассивСтруктурВсехФайлов = Новый Массив; - МассивВсехПапок = Новый Массив; - - ПапкаДляДобавленияТекущая = Неопределено; - - Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл - ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); - - ВыбранКаталог = Ложь; - Если ВыбранныйФайл.Существует() Тогда - ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); - КонецЕсли; - - Если ВыбранКаталог Тогда - Путь = ИмяФайла.Значение; - МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь); - - ИмяПапки = ВыбранныйФайл.Имя; - - ПапкаУжеНайдена = Ложь; - - Если РаботаСФайламиСлужебныйВызовСервера.ЕстьПапкаСТакимИменем(ИмяПапки, ПапкаДляДобавления, ПерваяПапкаСТакимЖеИменем) Тогда - - Если РежимЗагрузки Тогда - ПапкаУжеНайдена = Истина; - ПапкаДляДобавленияТекущая = ПерваяПапкаСТакимЖеИменем; - Иначе - - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Папка ""%1"" уже существует. - | - |Продолжить импорт папки?'"), - ИмяПапки); - - КодВозврата = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет); - - Если КодВозврата = КодВозвратаДиалога.Нет Тогда - Продолжить; - КонецЕсли; - - КонецЕсли; - КонецЕсли; - - Если Не ПапкаУжеНайдена Тогда - ПапкаДляДобавленияТекущая = РаботаСФайламиСлужебныйВызовСервера.СправочникиПапкиСоздатьЭлемент(ИмяПапки, ПапкаДляДобавления); - КонецЕсли; - - // Собственно импорт - РаботаСФайламиКлиент.ИмпортФайлов( - ПапкаДляДобавленияТекущая, - МассивФайловЭтогоКаталога, - Индикатор, - МассивИменФайловСОшибками, - МассивСтруктурВсехФайлов, - Комментарий, - ХранитьВерсии, - Рекурсивно, - КоличествоСуммарное, - Счетчик, - ИдентификаторФормы, - ПсевдоФайловаяСистема, - ДобавленныеФайлы, - МассивВсехПапок, - РежимЗагрузки, - Кодировка); - МассивВсехПапок.Добавить(Путь); - - Иначе - МассивФайлов.Добавить(ВыбранныйФайл); - КонецЕсли; - КонецЦикла; - - Если МассивФайлов.Количество() <> 0 Тогда - // Собственно импорт - РаботаСФайламиКлиент.ИмпортФайлов( - ПапкаДляДобавления, - МассивФайлов, - Индикатор, - МассивИменФайловСОшибками, - МассивСтруктурВсехФайлов, - Комментарий, - ХранитьВерсии, - Рекурсивно, - КоличествоСуммарное, - Счетчик, - ИдентификаторФормы, - ПсевдоФайловаяСистема, - ДобавленныеФайлы, - МассивВсехПапок, - РежимЗагрузки, - Кодировка); - КонецЕсли; - - Если МассивСтруктурВсехФайлов.Количество() > 1 Тогда - - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Импорт файлов завершен. Импортировано %1 файлов'"), Строка(МассивСтруктурВсехФайлов.Количество()) ); - - Если РежимЗагрузки Тогда - ТекстСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Загрузка файлов завершена. Загружено %1 файлов'"), Строка(МассивСтруктурВсехФайлов.Количество()) ); - КонецЕсли; - - Состояние(ТекстСостояния); - Иначе - Состояние(); - КонецЕсли; - - Если УдалятьФайлыПослеДобавления = Истина Тогда - ФайловыеФункцииСлужебныйКлиентСервер.УдалитьФайлыПослеДобавления( - МассивСтруктурВсехФайлов, МассивВсехПапок, РежимЗагрузки); - КонецЕсли; - - Если МассивСтруктурВсехФайлов.Количество() = 1 Тогда - Элемент0 = МассивСтруктурВсехФайлов[0]; - Ссылка = ПолучитьНавигационнуюСсылку(элемент0.Файл); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Изменение:'"), - ссылка, - Элемент0.Файл, - БиблиотекаКартинок.Информация32); - КонецЕсли; - - // Вывод сообщений об ошибках - Если МассивИменФайловСОшибками.Количество() <> 0 Тогда - - Параметры = Новый Структура; - Параметры.Вставить("МассивИменФайловСОшибками", МассивИменФайловСОшибками); - Если РежимЗагрузки Тогда - Параметры.Вставить("Заголовок", "Отчет о загрузке файлов"); - КонецЕсли; - - ОткрытьФорму("Справочник.Файлы.Форма.ФормаОтчета", Параметры); - КонецЕсли; - - Если ВыбранныеФайлы.Количество() <> 1 Тогда - ПапкаДляДобавленияТекущая = Неопределено; - КонецЕсли; - - Возврат ПапкаДляДобавленияТекущая; -КонецФункции - -// Проверить Предельный Размер Файлов - вернет Ложь, если есть файлы, превышающие предельный размер, -// и пользователь в диалоге предупреждения о наличии таких файлов выбрал "Отмена" -// Параметры -// ВыбранныеФайлы - Массив - массив объектов "Файл" -// Рекурсивно - Булево - Рекурсивно обходить подкаталоги -// КоличествоСуммарное - Число - Количество суммарное импортированных файлов -// ПсевдоФайловаяСистема - Соответствие - эмуляция файловой системы - для строки (каталога) возвращает массив строк (подкаталоги и файлы) -// РежимЗагрузки - Булево - Режим загрузки (из фонового задания ЗагрузкаФайлов) -// -// Возвращаемое значение: -// Булево - успешно ли выполнена операция -Функция ПроверитьПредельныйРазмерФайлов(ВыбранныеФайлы, Рекурсивно, КоличествоСуммарное, - Знач ПсевдоФайловаяСистема, РежимЗагрузки = Ложь) Экспорт - - МассивСлишкомБольшихФайлов = Новый Массив; - - Путь = ""; - - МассивФайлов = Новый Массив; - КоличествоСуммарное = 0; - - Для Каждого ИмяФайла Из ВыбранныеФайлы Цикл - - Путь = ИмяФайла.Значение; - ВыбранныйФайл = Новый Файл(Путь); - - ВыбранныйФайл = Новый Файл(ИмяФайла.Значение); - ВыбранКаталог = Ложь; - - Если ВыбранныйФайл.Существует() Тогда - ВыбранКаталог = ВыбранныйФайл.ЭтоКаталог(); - КонецЕсли; - - Если ВыбранКаталог Тогда - Состояние(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Идет сбор информации о каталоге - |""%1"". - |Пожалуйста, подождите.'"), - Путь)); - - МассивФайловЭтогоКаталога = ФайловыеФункцииСлужебныйКлиентСервер.НайтиФайлыПсевдо(ПсевдоФайловаяСистема, Путь); - ОбходФайловДляПроверкиПредельногоРазмера(МассивФайловЭтогоКаталога, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); - Иначе - МассивФайлов.Добавить(ВыбранныйФайл); - КонецЕсли; - КонецЦикла; - - Если МассивФайлов.Количество() <> 0 Тогда - ОбходФайловДляПроверкиПредельногоРазмера(МассивФайлов, МассивСлишкомБольшихФайлов, Рекурсивно, КоличествоСуммарное, ПсевдоФайловаяСистема); - КонецЕсли; - - // Был хоть один слишком большой файл - Если МассивСлишкомБольшихФайлов.Количество() <> 0 Тогда - - ФайлыБольшие = Новый СписокЗначений; - Параметры = Новый Структура; - - Для Каждого Файл Из МассивСлишкомБольшихФайлов Цикл - БольшойФайл = Новый Файл(Файл); - РазмерФайлаВМб = Цел(БольшойФайл.Размер() / (1024 * 1024)); - ТекстСтроки = Строка(Файл) + " (" + Строка(РазмерФайлаВМб) + " " + НСтр("ru = 'МБ)'"); - ФайлыБольшие.Добавить(ТекстСтроки); - КонецЦикла; - - Параметры.Вставить("ФайлыБольшие", ФайлыБольшие); - Параметры.Вставить("РежимЗагрузки", РежимЗагрузки); - Параметры.Вставить("Заголовок", "Предупреждение при загрузке файлов"); - - Результат = ОткрытьФормуМодально("Справочник.Файлы.Форма.ВопросПриИмпортеФайлов", Параметры); - - Возврат Результат = КодВозвратаДиалога.ОК; - - КонецЕсли; - - Возврат Истина; - -КонецФункции - // Обход Файлов рекурсивный - для определения размера файлов // Параметры // МассивФайлов - Массив - массив объектов "Файл" @@ -5058,9 +8075,9 @@ Функция РазыменоватьLnkФайл(ВыбранныйФайл) Экспорт #Если Не ВебКлиент Тогда - Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Если Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда ShellApp = Новый COMОбъект("shell.application"); - FolderObj = ShellApp.NameSpace(ВыбранныйФайл.Путь); // полный (только) путь на lnk-файл + FolderObj = ShellApp.NameSpace(ВыбранныйФайл.Путь);// полный (только) путь на lnk-файл FolderObjItem = FolderObj.items().item(ВыбранныйФайл.Имя); // только имя lnk-файла Link = FolderObjItem.GetLink(); Возврат Новый Файл(Link.path); @@ -5071,92 +8088,24 @@ КонецФункции -// Покажет напоминание - если стоит настройка -Процедура ПоказатьИнформациюФайлНеБылИзменен() - - Если ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).ПоказыватьИнформациюЧтоФайлНеБылИзменен = Истина Тогда - - БольшеНеПоказывать = ОткрытьФормуМодально("Справочник.Файлы.Форма.ИнформацияФайлНеБылИзменен"); - - Если БольшеНеПоказывать = Истина Тогда - ПоказыватьИнформациюЧтоФайлНеБылИзменен = Ложь; - - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиПрограммы", - "ПоказыватьИнформациюЧтоФайлНеБылИзменен", - ПоказыватьИнформациюЧтоФайлНеБылИзменен); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -// Открыть диалог выбора сертификатов с отмеченным своим сертификатом -Функция ВыбратьСертификатыДляШифрования(ДанныеФайла) Экспорт - - МассивСтруктурСертификатов = - ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Ложь); - - ОтпечатокЛичногоСертификатаДляШифрования - = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами( - ).ОтпечатокЛичногоСертификатаДляШифрования; - - // отпечаток сохраненный в ХранилищеНастроек мог устареть - сертификат могли уже удалить - Если ОтпечатокЛичногоСертификатаДляШифрования <> Неопределено И НЕ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - Сертификат = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьСертификатПоОтпечатку(ОтпечатокЛичногоСертификатаДляШифрования, Истина); // ТолькоЛичные - Если Сертификат = Неопределено Тогда - ОтпечатокЛичногоСертификатаДляШифрования = ""; - КонецЕсли; - КонецЕсли; - - Если ОтпечатокЛичногоСертификатаДляШифрования = Неопределено ИЛИ ПустаяСтрока(ОтпечатокЛичногоСертификатаДляШифрования) Тогда - - МассивСтруктурЛичныхСертификатов = ЭлектроннаяЦифроваяПодписьКлиент.ПолучитьМассивСтруктурСертификатов(Истина); // ТолькоЛичные - - ПараметрыФормы = Новый Структура("МассивСтруктурСертификатов", МассивСтруктурЛичныхСертификатов); - СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификата", ПараметрыФормы); - Если ТипЗнч(СтруктураВозврата) = Тип("Структура") Тогда - ОтпечатокЛичногоСертификатаДляШифрования = СтруктураВозврата.Отпечаток; - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("ЭЦП", "ОтпечатокЛичногоСертификатаДляШифрования", ОтпечатокЛичногоСертификатаДляШифрования); - ОбновитьПовторноИспользуемыеЗначения(); - Иначе - Предупреждение(НСтр("ru = 'Не выбран персональный сертификат для шифрования.'")); - Возврат Ложь; - КонецЕсли; - КонецЕсли; - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("МассивСтруктурСертификатов", МассивСтруктурСертификатов); - ПараметрыФормы.Вставить("ФайлСсылка", ДанныеФайла.Ссылка); - - ПараметрыФормы.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", - ОтпечатокЛичногоСертификатаДляШифрования); - - СтруктураВозврата = ОткрытьФормуМодально("ОбщаяФорма.ВыборСертификатовШифрования", ПараметрыФормы); - - Возврат СтруктураВозврата; - -КонецФункции - // Записывает сертификаты шифрования в табличную часть Файла Процедура ЗаписатьСертификатыВТабличнуюЧасть(ФайлСсылка, МассивСертификатов, УникальныйИдентификатор) - - МассивОтпечатков = Новый Массив; - Для Каждого Сертификат Из МассивСертификатов Цикл - Отпечаток = Base64Строка(Сертификат.Отпечаток); - Представление = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); - ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); - - ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата); - МассивОтпечатков.Добавить(ОтпечатокСтруктура); - КонецЦикла; - - РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОСертификатахШифрования(ФайлСсылка, МассивОтпечатков, УникальныйИдентификатор); - - Оповестить("Запись_Файл", Новый Структура("Событие", "ОбновленаИнформацияОСертификатахШифрования"), ФайлСсылка); - -КонецПроцедуры + + МассивОтпечатков = Новый Массив; + Для Каждого Сертификат Из МассивСертификатов Цикл + Отпечаток = Base64Строка(Сертификат.Отпечаток); + Представление = ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); + ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); + + ОтпечатокСтруктура = Новый Структура("Отпечаток, Представление, Сертификат", Отпечаток, Представление, ДвоичныеДанныеСертификата); + МассивОтпечатков.Добавить(ОтпечатокСтруктура); + КонецЦикла; + + РаботаСФайламиСлужебныйВызовСервера.ЗанестиИнформациюОСертификатахШифрования(ФайлСсылка, МассивОтпечатков, УникальныйИдентификатор); + + Оповестить("Запись_Файл", Новый Структура("Событие", "ОбновленаИнформацияОСертификатахШифрования"), ФайлСсылка); + +КонецПроцедуры // Функция предназначена для открытия файла соответствующим приложением // @@ -5168,7 +8117,7 @@ Если РасширениеПодключено Тогда // Открыть Файл СистемнаяИнфо = Новый СистемнаяИнформация; - Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда + Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ИмяОткрываемогоФайла = СтрЗаменить(ИмяОткрываемогоФайла, "/", "\"); КонецЕсли; @@ -5181,11 +8130,10 @@ Процедура СравнитьФайлы(ПутьКФайлу1, ПутьКФайлу2, СпособСравненияВерсийФайлов) Экспорт Попытка - Если СпособСравненияВерсийФайлов = "MicrosoftOfficeWord" Тогда ОбъектWord = Новый COMОбъект("Word.Application"); ОбъектWord.Visible = 0; - + Документ = ОбъектWord.Documents.Open(ПутьКФайлу1); Документ.Merge(ПутьКФайлу2, 0, 0, 0); // MergeTarget:=wdMergeTargetSelected, DetectFormatChanges:=False, UseFormattingFrom:=wdFormattingFromCurrent @@ -5219,7 +8167,7 @@ ПараметрыСравнения = Новый COMSafeArray("VT_VARIANT", 1); ПараметрыСравнения.SetValue(0, ПрисвоитьЗначениеСвойству(ServiceManager, "ShowTrackedChanges", Истина)); dispatcher.executeDispatch(frame, ".uno:ShowTrackedChanges", "", 0, ПараметрыСравнения); - + // сравнить с документом ПараметрыВызова = Новый COMSafeArray("VT_VARIANT", 1); ПараметрыВызова.SetValue(0, ПрисвоитьЗначениеСвойству(ServiceManager, "URL", ПреобразоватьВURL(ПутьКФайлу1))); @@ -5237,33 +8185,33 @@ // Функция преобразует Windows имя файла в URL OpenOffice Функция ПреобразоватьВURL(ИмяФайла) + Возврат "file:///" + СтрЗаменить(ИмяФайла, "\", "/"); + КонецФункции // создание структуры для параметров OpenOffice Функция ПрисвоитьЗначениеСвойству(Объект, ИмяСвойства, ЗначениеСвойства) - Свойства = Объект.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); - Свойства.Name = ИмяСвойства; - Свойства.Value = ЗначениеСвойства; - - Возврат Свойства; + + Свойства = Объект.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); + Свойства.Name = ИмяСвойства; + Свойства.Value = ЗначениеСвойства; + + Возврат Свойства; + КонецФункции // Возвращает каталог данных пользователя внутри стандартного каталога данных приложения. -// Этот каталог может использоваться для хранения файлов, захваченных текущим пользователем. -// Для работы метода на веб-клиенте под 8.3 необходимо предварительно подключить расширение работы с файлами. +// Этот каталог может использоваться для хранения файлов, захваченных текущим пользователем. +// Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами. // Функция КаталогДанныхПользователя() #Если ВебКлиент Тогда - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат Вычислить("РабочийКаталогДанныхПользователя()"); - Иначе - Возврат ""; - КонецЕсли; + Возврат РабочийКаталогДанныхПользователя(); #Иначе Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - Возврат Вычислить("РабочийКаталогДанныхПользователя()"); + Возврат РабочийКаталогДанныхПользователя(); Иначе Оболочка = Новый COMОбъект("WScript.Shell"); КаталогДанныхПользователя = Оболочка.ExpandEnvironmentStrings("%APPDATA%"); @@ -5272,3 +8220,159 @@ #КонецЕсли КонецФункции + +// Открывает форму перетаскивания. +Процедура ОткрытьФормуПеретаскиванияИзвне(ПапкаДляДобавления, МассивИменФайлов) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ПапкаДляДобавления", ПапкаДляДобавления); + ПараметрыФормы.Вставить("МассивИменФайлов", МассивИменФайлов); + + ОткрытьФорму("Справочник.Файлы.Форма.ФормаПеретаскивания", ПараметрыФормы); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции для асинхронных методов +// +// Общее описание параметров: +// Обработчик - ОписаниеОповещения, Неопределено, Структура - Процедура-обработчик асинхронного метода. +// * Неопределено - Обработка не требуется. +// * ОписаниеОповещения - Описание процедуры-обработчика. +// В редких случаях может потребоваться прерывать выполнение кода только тогда, +// когда необходимо показать асинхронный диалог (в циклах например). +// В таких случаях в Обработчик передается Структура параметров вызывающего кода +// с обязательным ключом АсинхронныйДиалог, +// который используется при прерывании кода и открытии асинхронного диалога: +// * Структура - Структура параметров вызывающего кода. +// ** АсинхронныйДиалог - Структура - +// *** Открыт - Булево - Истина если диалог был открыт. +// *** ИмяПроцедуры - Строка - Имя процедуры обработчика вызывающего кода. +// *** Модуль - ОбщийМодуль, УправляемаяФорма - Модуль обработчика вызывающего кода. +// В этом случае ОписаниеОповещения формируется из ключей "ИмяПроцедуры" и "Модуль". +// Внимание. Не все асинхронные процедуры поддерживают передачу типа Структура. Читайте состав типов. +// +// Результат - Произвольный - Результат, который необходимо вернуть в Обработчик. +// + + +// Показывает окно предупреждение, а после его закрытия вызывает обработчик с заданным результатом. +Процедура ВернутьРезультатПослеПоказаПредупреждения(Обработчик, ТекстПредупреждения, Результат) Экспорт + + Если Обработчик <> Неопределено Тогда + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Обработчик", ПодготовитьОбработчикДляДиалога(Обработчик)); + ПараметрыОбработчика.Вставить("Результат", Результат); + Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьПредупреждение(Обработчик, ТекстПредупреждения); + Иначе + ПоказатьПредупреждение(, ТекстПредупреждения); + КонецЕсли; + +КонецПроцедуры + +// Показывает окно просмотра значения, а после его закрытия вызывает обработчик с заданным результатом. +Процедура ВернутьРезультатПослеПоказаЗначения(Обработчик, Значение, Результат) Экспорт + + Если Обработчик <> Неопределено Тогда + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("Обработчик", ПодготовитьОбработчикДляДиалога(Обработчик)); + ПараметрыОбработчика.Вставить("Результат", Результат); + Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьЗначение(Обработчик, Значение); + Иначе + ПоказатьЗначение(, Значение); + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры (см. выше). +Процедура ВернутьРезультатПослеЗакрытияПростогоДиалога(Структура) Экспорт + + Если ТипЗнч(Структура.Обработчик) = Тип("ОписаниеОповещения") Тогда + ВыполнитьОбработкуОповещения(Структура.Обработчик, Структура.Результат); + КонецЕсли; + +КонецПроцедуры + +// Возвращает результат прямого вызова, когда не было открыто диалогов. +Процедура ВернутьРезультат(Обработчик, Результат) Экспорт + + Обработчик = ПодготовитьОбработчикДляПрямогоВызова(Обработчик, Результат); + Если ТипЗнч(Обработчик) = Тип("ОписаниеОповещения") Тогда + ВыполнитьОбработкуОповещения(Обработчик, Результат); + КонецЕсли; + +КонецПроцедуры + +// Записывает информацию, необходимую для подготовки обработчика асинхронного диалога. +Процедура ЗарегистрироватьОписаниеОбработчика(Структура, Модуль, ИмяПроцедуры) Экспорт + + Структура.Вставить("АсинхронныйДиалог", Новый Структура); + Структура.АсинхронныйДиалог.Вставить("Модуль", Модуль); + Структура.АсинхронныйДиалог.Вставить("ИмяПроцедуры", ИмяПроцедуры); + Структура.АсинхронныйДиалог.Вставить("Открыт", Ложь); + Структура.АсинхронныйДиалог.Вставить("РезультатКогдаНеОткрыт", Неопределено); + +КонецПроцедуры + +// Подготовка обработчика асинхронного диалога. +Функция ПодготовитьОбработчикДляДиалога(ОбработчикИлиСтруктура) Экспорт + + Если ТипЗнч(ОбработчикИлиСтруктура) = Тип("Структура") Тогда + // Рекурсивная регистрация всех обработчиков вызывающего кода. + Если ОбработчикИлиСтруктура.Свойство("ОбработчикРезультата") Тогда + ОбработчикИлиСтруктура.ОбработчикРезультата = ПодготовитьОбработчикДляДиалога(ОбработчикИлиСтруктура.ОбработчикРезультата); + КонецЕсли; + Если ОбработчикИлиСтруктура.Свойство("АсинхронныйДиалог") Тогда + // Регистрация открытого диалога. + ОбработчикИлиСтруктура.АсинхронныйДиалог.Открыт = Истина; + // Формирование обработчика (при этом фиксируется вся структура параметров). + Обработчик = Новый ОписаниеОповещения( + ОбработчикИлиСтруктура.АсинхронныйДиалог.ИмяПроцедуры, + ОбработчикИлиСтруктура.АсинхронныйДиалог.Модуль, + ОбработчикИлиСтруктура); + Иначе + Обработчик = Неопределено; + КонецЕсли; + Иначе + Обработчик = ОбработчикИлиСтруктура; + КонецЕсли; + + Возврат Обработчик; + +КонецФункции + +// Подготовка обработчика прямого вызова без открытия диалога. +Функция ПодготовитьОбработчикДляПрямогоВызова(ОбработчикИлиСтруктура, Результат) Экспорт + + Если ТипЗнч(ОбработчикИлиСтруктура) = Тип("Структура") Тогда + Если ОбработчикИлиСтруктура.Свойство("АсинхронныйДиалог") Тогда + ОбработчикИлиСтруктура.АсинхронныйДиалог.РезультатКогдаНеОткрыт = Результат; + КонецЕсли; + Возврат Неопределено; // Обработчик не был подготовлен для диалога => Вызывающий код не остановился. + Иначе + Возврат ОбработчикИлиСтруктура; + КонецЕсли; + +КонецФункции + +// Устанавливает обработчик закрытия формы, полученной при помощи ПолучитьФорму(). +Процедура УстановитьОповещениеФормы(Форма, Обработчик) Экспорт + + Если Обработчик <> Неопределено Тогда + // Установка обработчика закрытия формы. + Форма.ОписаниеОповещенияОЗакрытии = Обработчик; + // Форма, возвращающая значение, должна: + Если Форма.ВладелецФормы = Неопределено Тогда + // Без установленного владельца - блокировать весь интерфейс. + Форма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс; + Иначе + // С установленным владельцем - блокировать окно владельца или весь интерфейс. + Если Форма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.Независимый Тогда + Форма.РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьОкноВладельца; + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl index 605a6df01..97b017056 100644 --- a/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РаботаСФайламиСлужебныйКлиентПовтИсп/Module.bsl @@ -8,10 +8,9 @@ // Возвращает форму, которая используется при создании нового файла // для выбора варианта создания -Функция ПолучитьФормуВыбораВариантаСозданияНовогоФайла() Экспорт +Функция ФормаВыбораВариантаСозданияНовогоФайла() Экспорт ДоступнаКомандаСканировать = РаботаСФайламиСлужебныйКлиент.ДоступнаКомандаСканировать(); - ПараметрыФормы = Новый Структура("ДоступнаКомандаСканировать", ДоступнаКомандаСканировать); Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаНового", ПараметрыФормы); @@ -19,18 +18,18 @@ // Возвращает форму, которая используется для информирования // пользователей об особенностях возврата файлов в веб-клиенте -Функция ПолучитьФормуНапоминанияПередПоместитьФайл() Экспорт +Функция ФормаНапоминанияПередПоместитьФайл() Экспорт Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаНапоминанияПередПоместитьФайл"); КонецФункции // Возвращает форму, которая используется при возврате отредактированного // файла на сервер -Функция ПолучитьФормуВозвратаФайла() Экспорт +Функция ФормаВозвратаФайла() Экспорт Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФормаВозвратаФайла"); КонецФункции // Возвращает форму, которая используется для ввода // режима сохранения при экспорте папки, если на диске уже есть файл с таким именем -Функция ПолучитьФормуЭкспортаПапкиФайлСуществует() Экспорт +Функция ФормаЭкспортаПапкиФайлСуществует() Экспорт Возврат ПолучитьФорму("Справочник.Файлы.Форма.ФайлСуществует"); КонецФункции diff --git a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl index f0a5c11d6..a1f4ae4aa 100644 --- a/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетов/Module.bsl @@ -9,19 +9,19 @@ // Подготавливает параметры для функции ВыполнитьРассылку и выполняет ее. // // Параметры: -// Рассылка (СправочникСсылка.РассылкиОтчетов) Рассылка, параметры которой будут подготовлены -// ПараметрыЖурнала (Структура) Необязательный. Параметры записи в журнал регистрации -// |- ИмяСобытия (Строка) Имя события (или группы событий) -// |- Метаданные (ОбъектМетаданных) Метаданные для привязки события журнала регистрации -// |- Данные (*) Данные для привязки события журнала регистрации -// ПредварительныеНастройки (Структура) Необязательный. Настройки, которые не требуется формировать из рассылки. -// |- Получатели (Соответствие) Набор получателей и их e-mail адресов -// |- Ключ (СправочникСсылка.*) Получатель -// |- Значение (Строка) Набор e-mail адресов получателя в строке с разделителями +// Рассылка - СправочникСсылка.РассылкиОтчетов - Рассылка, параметры которой будут подготовлены. +// ПараметрыЖурнала - Структура - Необязательный. Параметры записи в журнал регистрации. +// * ИмяСобытия - Строка - Имя события (или группы событий). +// * Метаданные - ОбъектМетаданных - Метаданные для привязки события журнала регистрации. +// * Данные - Произвольный - Данные для привязки события журнала регистрации. +// ПредварительныеНастройки - Структура - Необязательный. Настройки, которые не требуется формировать из рассылки. +// * Получатели - Соответствие - Набор получателей и их e-mail адресов. +// ** Ключ - СправочникСсылка - Получатель. +// ** Значение - Строка - Набор e-mail адресов получателя в строке с разделителями. // // Возвращаемое значение: -// Истина - Рассылка выполнена -// Ложь - Рассылка не выполнена +// * Истина - Рассылка выполнена. +// * Ложь - Рассылка не выполнена. // Функция ПодготовитьПараметрыИВыполнитьРассылку(Рассылка, ПараметрыЖурнала = Неопределено, ПредварительныеНастройки = Неопределено) Экспорт @@ -236,7 +236,7 @@ Возврат ВыполнитьРассылку(ТаблицаОтчетов, ПараметрыДоставки, Рассылка, ПараметрыЖурнала); -КонецФункции // ПодготовитьПараметрыИВыполнитьРассылку() +КонецФункции // Формирует отчеты и отправляет согласно настройкам транспорта (Папка, FILE, EMAIL, FTP); // Позволяет выполнить рассылку не создавая элемент справочника "Рассылки отчетов". @@ -244,103 +244,98 @@ //////////////////////////////////////////////////////////////////////////////// // Параметры: // -// ТаблицаОтчетов (ТаблицаЗначений) Набор выгружаемых отчетов. Колонки: -// |- Отчет (...) Отчет, который необходимо сформировать. -// |- (СправочникСсылка.ВариантыОтчетов) -// |- (СправочникСсылка.ДополнительныеОтчетыИОбработки) -// |- ОтправлятьЕслиПустой (Булево) Флаг отправки отчета даже если он пустой. -// |- Настройки (...) Настройки, с которыми должен сформироваться отчет. +// ТаблицаОтчетов - ТаблицаЗначений - Набор выгружаемых отчетов. Колонки: +// * Отчет - СправочникСсылка.ВариантыОтчетов, СправочникСсылка.ДополнительныеОтчетыИОбработки - +// Отчет, который необходимо сформировать. +// * ОтправлятьЕслиПустой - Булево - Флаг отправки отчета даже если он пустой. +// * Настройки - Настройки, с которыми должен сформироваться отчет. // Дополнительно используется для определения принадлежности отчета к СКД. -// |- (Неопределено) Настройки по умолчанию. Для определения принадлежности к СКД -// будет использован реквизит объекта "СхемаКомпоновкиДанных". -// |- (ПользовательскиеНастройкиКомпоновкиДанных) Табличный документ сформируется механизмами СКД. -// |- (Структура) Табличный документ сформируется при помощи метода "Сформировать()". -// |- Ключ (Строка) Имя реквизита объекта отчета -// |- Значение (*) Значение реквизита объекта отчета -// |- Форматы (Массив) из (ПеречислениеСсылка.ФорматыСохраненияОтчетов) +// - ПользовательскиеНастройкиКомпоновкиДанных - Табличный документ сформируется механизмами СКД. +// - Структура - Табличный документ сформируется при помощи метода "Сформировать()". +// *** Ключ - Строка - Имя реквизита объекта отчета +// *** Значение - * - Значение реквизита объекта отчета +// - Неопределено - Настройки по умолчанию. Для определения принадлежности к СКД +// будет использован реквизит объекта "СхемаКомпоновкиДанных". +// * Форматы - Массив из ПеречислениеСсылка.ФорматыСохраненияОтчетов - // Форматы, в которых необходимо сохранить и отправить отчет // -// ПараметрыДоставки (Структура) Настройки транспорта (способа доставки) отчетов. +// ПараметрыДоставки - Структура - Настройки транспорта (способа доставки) отчетов. // Набор реквизитов может отличаться для разных способов доставки: -// --- Обязательные реквизиты --- // -// |- Автор (СправочникСсылка.Пользователи) Автор рассылки +// Обязательные реквизиты: +// * Автор - СправочникСсылка.Пользователи - Автор рассылки. +// * ИспользоватьПапку - Булево - Доставлять отчеты в папку подсистемы "Работа с файлами". +// * ИспользоватьСетевойКаталог - Булево - Доставлять отчеты в папку файловой системы. +// * ИспользоватьFTPРесурс - Булево - Доставлять отчеты на FTP. +// * ИспользоватьЭлектроннуюПочту - Булево - Доставлять отчеты по электронной почте. // -// |- ИспользоватьПапку (Булево) Доставка отчетов в папку подсистемы "Работа с файлами" -// |- ИспользоватьСетевойКаталог (Булево) Доставка отчетов в папку файловой системы -// |- ИспользоватьFTPРесурс (Булево) Доставка отчетов на FTP -// |- ИспользоватьЭлектроннуюПочту (Булево) Доставка отчетов по электронной почте +// Обязательные реквизиты когда { ИспользоватьПапку = Истина }: +// * Папка (СправочникСсылка.ПапкиФайлов) Папка подсистемы "Работа с файлами" // -// --- Обязательные реквизиты когда { ИспользоватьПапку = Истина } --- +// Обязательные реквизиты когда { ИспользоватьСетевойКаталог = Истина }: +// * СетевойКаталогWindows - Строка - Каталог файловой системы (локальный на сервере или сетевой) +// * СетевойКаталогLinux - Строка - Каталог файловой системы (локальный на сервере или сетевой) // -// |- Папка (СправочникСсылка.ПапкиФайлов) Папка подсистемы "Работа с файлами" +// Обязательные реквизиты когда { ИспользоватьFTPРесурс = Истина }: +// * Сервер - Строка - Имя FTP сервера. +// * Порт - Число - Порт FTP сервера. +// * Логин - Строка - Имя пользователя FTP сервера. +// * Пароль - Строка - Пароль пользователя FTP сервера. +// * Каталог - Строка - Путь к каталогу на FTP сервере. +// * ПассивноеСоединение - Булево - Использовать пассивное соединение. // -// --- Обязательные реквизиты когда { ИспользоватьСетевойКаталог = Истина } --- +// Обязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина }: +// * УчетнаяЗапись - СправочникСсылка.УчетныеЗаписиЭлектроннойПочты - Учетная запись для отправки почтового сообщения. +// * Получатели - Соответствие - Набор получателей и их e-mail адресов. +// ** Ключ - СправочникСсылка - Получатель. +// ** Значение - Строка - Набор e-mail адресов получателя в строке с разделителями. // -// |- СетевойКаталогWindows (Строка) Каталог файловой системы (локальный на сервере или сетевой) -// |- СетевойКаталогLinux (Строка) Каталог файловой системы (локальный на сервере или сетевой) +// Необязательные реквизиты: +// * Архивировать - Булево, Ложь - Архивировать все файлы сформированных отчетов в один архив +// * ИмяАрхива - Строка - Архивация может потребоваться для отчетов, которые при сохранении +// * ПарольАрхива - Строка - в формат создают каталоги (например html) // -// --- Обязательные реквизиты когда { ИспользоватьFTPРесурс = Истина } --- -// -// |- Сервер (Строка) -// |- Порт (Число) -// |- Логин (Строка) -// |- Пароль (Строка) -// |- Каталог (Строка) -// |- ПассивноеСоединение (Булево) -// -// --- Обязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина } --- -// -// |- УчетнаяЗапись (СправочникСсылка.УчетныеЗаписиЭлектроннойПочты) Учетная запись для отправки почтового сообщения -// |- Получатели (Соответствие) Набор получателей и их e-mail адресов -// |- Ключ (СправочникСсылка.*) Получатель -// |- Значение (Строка) Набор e-mail адресов получателя в строке с разделителями -// -// --- Необязательные реквизиты --- -// -// |- Персонализирована (Булево, Ложь) Рассылка персонализирована получателями -// |- Архивировать (Булево, Ложь) Архивировать все файлы сформированных отчетов в один архив -// |- ИмяАрхива (Строка) Архивация может потребоваться для отчетов, которые при сохранении -// |- ПарольАрхива (Строка) в формат создают каталоги (например html) -// -// --- Необязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина } --- -// -// |- ТолькоУведомить (Булево, Ложь) Отправлять только уведомления (не присоединять сформированные отчеты) -// |- СкрытыеКопии (Булево, Ложь) Если "Истина", то при отправке вместо "Кому" заполняется "СлепыеКопии". -// |- ШаблонТемы (Строка) Тема письма -// |- ШаблонТекста (Строка) Тело письма -// |- ПараметрыПисьма (Структура) Параметры сообщения, -// которые будут переданы подсистеме "РаботаСПочтовымиСообщениями" напрямую. -// Их обработку можно увидеть в модуле "ЭлектроннаяПочта", процедура "ОтправитьСообщение". -// Подсистемой "РассылкаОтчетов" могут использоваться: -// |- ТипТекста (ТипТекстаПочтовогоСообщения, Строка, ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем) -// |- Вложения (Соответствие) -// |- Ключ (Строка) Наименование -// |- Значение (...) Данные -// |- (Текст) Адрес во временном хранилище -// |- (ДвоичныеДанные) -// |- (ИнтернетПочтовоеСообщение) -// |- АдресОтвета (Строка) E-mail адрес ответа -// -// --- Влияние ключевых параметров --- -// -// { Персонализирована = Истина } => +// Необязательные реквизиты когда { ИспользоватьЭлектроннуюПочту = Истина }: +// * Персонализирована - Булево - Рассылка персонализирована получателями. +// Значение по умолчанию Ложь. +// Если установить значение Истина, то каждый получатель получит отчет с отбором по нему. +// Для этого в отчетах следует установить отбор "[Получатель]" по реквизиту, совпадающем с типом получателя. +// Применимо только только при доставке по почте, +// поэтому когда устанавливается в Истина, то другие способы доставки отключаются: // { ИспользоватьПапку = Ложь } // { ИспользоватьСетевойКаталог = Ложь } // { ИспользоватьFTPРесурс = Ложь } +// И соответствующая им возможность уведомления: // { ТолькоУведомить = Ложь } +// * ТолькоУведомить - Булево, Ложь - Отправлять только уведомления (не присоединять сформированные отчеты). +// * СкрытыеКопии - Булево, Ложь - Если "Истина", то при отправке вместо "Кому" заполняется "СлепыеКопии". +// * ШаблонТемы - Строка - Тема письма +// * ШаблонТекста - Строка - Тело письма +// * ПараметрыПисьма - Структура - Параметры сообщения, +// которые будут переданы подсистеме "РаботаСПочтовымиСообщениями" напрямую. +// Их обработку можно увидеть в модуле "ЭлектроннаяПочта", процедура "ОтправитьСообщение". +// Подсистемой "РассылкаОтчетов" могут использоваться: +// ** ТипТекста - ТипТекстаПочтовогоСообщения, Строка, ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем - +// Тип текста письма. +// ** Вложения - Соответствие - Вложения письма. +// *** Ключ - Строка - Наименование +// *** Значение - Данные вложения. +// - Строка - Адрес во временном хранилище, по которому размещено вложение. +// - ДвоичныеДанные - Двоичные данные вложения. +// - ИнтернетПочтовоеСообщение - В виде вложения может участвовать письмо. +// ** АдресОтвета - Строка - E-mail адрес ответа. // -// Рассылка (*) Используется как объект-инициатор для отображения ошибок и в шаблонах темы и сообщения +// Рассылка - Произвольный - Используется как объект-инициатор для отображения ошибок и в шаблонах темы и сообщения. // -// ПараметрыЖурнала (Структура) Необязательный. Параметры записи в журнал регистрации -// |- ИмяСобытия (Строка) Имя события (или группы событий) -// |- Метаданные (ОбъектМетаданных) Метаданные для привязки события журнала регистрации -// |- Данные (*) Данные для привязки события журнала регистрации +// ПараметрыЖурнала - Структура - Необязательный. Параметры записи в журнал регистрации. +// * ИмяСобытия - Строка - Имя события (или группы событий). +// * Метаданные - ОбъектМетаданных - Метаданные для привязки события журнала регистрации. +// * Данные - Произвольный - Данные для привязки события журнала регистрации. // //////////////////////////////////////////////////////////////////////////////// // Возвращаемое значение: -// Истина - Рассылка выполнена -// Ложь - Рассылка не выполнена +// Истина - Рассылка выполнена. +// Ложь - Рассылка не выполнена. // Функция ВыполнитьРассылку(ТаблицаОтчетов, ПараметрыДоставки, Рассылка, ПараметрыЖурнала = Неопределено) Экспорт РассылкаВыполнена = Ложь; @@ -365,7 +360,7 @@ "'"+ Строка(Рассылка) +"'", "'"+ Строка(ПараметрыДоставки.Автор) +"'"); - // Формирование и сохранение отчетов + // Формирование и сохранение отчетов. НомерОтчета = 1; Для Каждого СтрокаОтчет Из ТаблицаОтчетов Цикл ТекстЖурнала = НСтр("ru = 'Отчет %1 формируется'"); @@ -376,14 +371,14 @@ ТекстЖурнала, , "'"+ Строка(СтрокаОтчет.Отчет) +"'"); - // Инициализация отчета + // Инициализация отчета. ПараметрыОтчета = Новый Структура("Отчет, Настройки, Форматы, ОтправлятьЕслиПустой"); ЗаполнитьЗначенияСвойств(ПараметрыОтчета, СтрокаОтчет); Если НЕ ИнициализироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, ПараметрыДоставки.Персонализирована) Тогда Продолжить; КонецЕсли; - // Формирование табличных документов и сохранение в форматы + // Формирование табличных документов и сохранение в форматы. Попытка Если ПараметрыОтчета.Персонализирован Тогда // В разрезе получателей @@ -393,7 +388,7 @@ ПараметрыОтчета, ДеревоОтчетов, ПараметрыДоставки, - КлючИЗначение.Ключ); // Получатель + КлючИЗначение.Ключ); // Получатель. КонецЦикла; Иначе // Без персонализации @@ -415,7 +410,7 @@ КонецПопытки; КонецЦикла; - // Проверка на количество сохраненных отчетов + // Проверка на количество сохраненных отчетов. Если ДеревоОтчетов.Строки.Найти(3, "Уровень", Истина) = Неопределено Тогда ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение, НСтр("ru = 'Не сохранено ни одного отчета'"), ,); @@ -423,34 +418,33 @@ Возврат Ложь; КонецЕсли; - // Общие отчеты + // Общие отчеты. ОбщиеВложения = ПараметрыДоставки.СтрокаОбщихОтчетов.Строки.НайтиСтроки(Новый Структура("Уровень", 3), Истина); - // Отправка личных отчетов + // Отправка личных отчетов (персонализированных). Для Каждого СтрокаПолучатель Из ДеревоОтчетов.Строки Цикл - // Пропустить строку дерева общих отчетов Если СтрокаПолучатель = ПараметрыДоставки.СтрокаОбщихОтчетов Тогда - Продолжить; + Продолжить; // Пропустить строку дерева общих отчетов. КонецЕсли; - // Личные вложения + // Личные вложения. ЛичныеВложения = СтрокаПолучатель.Строки.НайтиСтроки(Новый Структура("Уровень", 3), Истина); - // Проверка на количество сохраненных персональных отчетов + // Проверка на количество сохраненных персональных отчетов. Если ЛичныеВложения.Количество() = 0 Тогда Продолжить; КонецЕсли; - // Объединение общих и личных вложений + // Объединение общих и личных вложений. ВложенияПолучателя = ОбъединитьМассивы(ОбщиеВложения, ЛичныеВложения); - // Формирование представления отчетов + // Формирование представления отчетов. СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); - // + // Архивация вложений. АрхивацияВложений(ВложенияПолучателя, ПараметрыДоставки, СтрокаПолучатель.Значение); - // Отправить отчеты получателю + // Доставка. Попытка ОтправитьОтчетыПолучателю( ВложенияПолучателя, @@ -470,19 +464,19 @@ КонецЕсли; КонецЦикла; - // Отправка общих отчетов + // Отправка общих отчетов. Если ОбщиеВложения.Количество() > 0 Тогда - // Представление отчетов + // Представление отчетов. СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель); - // + // Архивация вложений. АрхивацияВложений(ОбщиеВложения, ПараметрыДоставки, ПараметрыДоставки.КаталогВременныхФайлов); - // + // Доставка. Если ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, ОбщиеВложения) Тогда РассылкаВыполнена = Истина; КонецЕсли; - КонецЕсли; // ЕстьОбщиеОтчеты + КонецЕсли; Если РассылкаВыполнена Тогда ЗаписьЖурнала(ПараметрыЖурнала, , НСтр("ru = 'Рассылка выполнена'")); @@ -492,7 +486,7 @@ УдалитьВременныеФайлы(ПараметрыЖурнала, ПараметрыДоставки); - // + // Результат. Если ПараметрыЖурнала.Свойство("БылиОшибки") Тогда ПараметрыДоставки.БылиОшибки = ПараметрыЖурнала.БылиОшибки; КонецЕсли; @@ -502,11 +496,17 @@ РегистрыСведений.СостоянияРассылокОтчетов.ЗафиксироватьРезультатВыполненияРассылки(Рассылка, ПараметрыДоставки); Возврат РассылкаВыполнена; -КонецФункции // ВыполнитьРассылку() +КонецФункции // Для вызова из модулей "РассылкаОтчетовПереопределяемый" и "РассылкаОтчетовПовтИсп". // Добавляет формат (в случае его отсутствия) и устанавливает его параметры (если переданы). // +// Параметры: +// СписокФорматов - Передается из параметров процедуры "как есть". +// ФорматСсылка - Строка, ПеречислениеСсылка.ФорматыСохраненияОтчетов - Ссылка или имя формата. +// Картинка - Картинка - Необязательный. Картинка формата. +// ИспользоватьПоУмолчанию - Булево - Необязательный. Признак того, что формат используется по умолчанию. +// Процедура УстановитьПараметрыФормата(СписокФорматов, ФорматСсылка, Картинка = Неопределено, ИспользоватьПоУмолчанию = Неопределено) Экспорт Если ТипЗнч(ФорматСсылка) = Тип("Строка") Тогда ФорматСсылка = Перечисления.ФорматыСохраненияОтчетов[ФорматСсылка]; @@ -527,9 +527,17 @@ // Добавляет описание типа получателей в соответствующую таблицу. // // Параметры: -// ТаблицаТипов (ТаблицаЗначений) Таблица, в которой будет зарегистрирован результат -// ДоступныеТипы (Массив) Использованные типы удаляются из этого массива -// Настройки (Структура) Предустановленные настройки основного типа +// ТаблицаТипов - ТаблицаЗначений - Передается из параметров процедуры "как есть". Содержит информацию о типах. +// ДоступныеТипы - Массив - Передается из параметров процедуры "как есть". Массив неиспользованных типов. +// Настройки - Структура - Предустановленные настройки для регистрации основного типа. +// Обязательные параметры: +// * ОсновнойТип - Тип - Тип, который будет выступать как основной для описываемых получателей. +// Необязательные параметры: +// * Представление - Строка - Представление этого типа получателей в интерфейсе. +// * ВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - Основной вид или группа контактной информации +// для адресов электронной почты этого типа получателей. +// * ПутьФормыВыбора - Строка - Путь к форме выбора. +// * ДополнительныйТип - Тип - Дополнительный тип, который можно выбрать вместе с основным из формы выбора. // Процедура ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, Настройки) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -609,10 +617,10 @@ // режиме вызывается напрямую, в клиент-серверном - через фоновое задание. // // Параметры: -// ПараметрыВыполнения (Структура) Выполняемые рассылки и их параметры. -// |- МассивРассылок (Массив) из (СправочникСсылка.РассылкиОтчетов) -// |- ПредварительныеНастройки (Структура) см. функцию ПодготовитьПараметрыИВыполнитьРассылку() -// АдресРезультата (Строка) Адрес во временном хранилище, по которому будет размещен результат. +// ПараметрыВыполнения - Структура - Выполняемые рассылки и их параметры. +// * МассивРассылок - Массив из СправочникСсылка.РассылкиОтчетов - Выполняемые рассылки. +// * ПредварительныеНастройки - Структура - Параметры. См. ПодготовитьПараметрыИВыполнитьРассылку(). +// АдресРезультата - Строка - Адрес во временном хранилище, по которому будет размещен результат. // Процедура ВыполнитьРассылкиВФоновомЗадании(ПараметрыВыполнения, АдресРезультата) Экспорт МассивРассылок = ПараметрыВыполнения.МассивРассылок; @@ -670,48 +678,54 @@ КонецЕсли; КонецЦикла; - Результат = Новый Структура("Оповестить, Заголовок, Текст, ТекстОшибок"); - Всего = ТаблицаРассылок.Количество(); Подготовлено = Подготовленные.Количество(); НеВыполнено = Подготовлено - Выполнено; Если Всего = 0 Тогда - Результат.Текст = НСтр("ru = 'Выбранные группы не содержат рассылок отчетов.'"); + ТекстСообщения = НСтр("ru = 'Выбранные группы не содержат рассылок отчетов.'"); ИначеЕсли Всего <= 5 Тогда - Результат.Текст = ""; + ТекстСообщения = ""; Для Каждого СтрокаТаблицы Из ТаблицаРассылок Цикл Если НЕ СтрокаТаблицы.Подготовлена Тогда - ШаблонСообщения = НСтр("ru = 'Рассылка %1 не подготовлена'"); + ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" не подготовлена'"); ИначеЕсли НЕ СтрокаТаблицы.Выполнена Тогда - ШаблонСообщения = НСтр("ru = 'Рассылка %1 не выполнена'"); + ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" не выполнена'"); ИначеЕсли СтрокаТаблицы.СОшибками Тогда - ШаблонСообщения = НСтр("ru = 'Рассылка %1 выполнена с ошибками'"); + ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" выполнена с ошибками'"); Иначе - ШаблонСообщения = НСтр("ru = 'Рассылка %1 выполнена'"); + ШаблонСообщения = НСтр("ru = 'Рассылка ""%1"" выполнена'"); КонецЕсли; + ШаблонСообщения = СтрЗаменить(ШаблонСообщения, "%1", СтрокаТаблицы.Представление); - Результат.Текст = Результат.Текст - + ?(Результат.Текст= "", "", Символы.ПС + Символы.ПС) - + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонСообщения, - "'"+ СтрокаТаблицы.Представление +"'"); + Если ТекстСообщения = "" Тогда + ТекстСообщения = ШаблонСообщения; + Иначе + ТекстСообщения = ТекстСообщения + Символы.ПС + Символы.ПС + ШаблонСообщения; + КонецЕсли; КонецЦикла; Иначе - Результат.Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Подготовлено рассылок: %1 из %2 |Выполнено: %3 |С ошибками: %4 - |Не выполнено: %5'"), + |Не выполнено: %5'"), Формат(Подготовлено, "ЧН=0; ЧГ=0"), Формат(Всего, "ЧН=0; ЧГ=0"), - Формат(Выполнено, "ЧН=0; ЧГ=0"), - Формат(СОшибками, "ЧН=0; ЧГ=0"), + Формат(Выполнено, "ЧН=0; ЧГ=0"), + Формат(СОшибками, "ЧН=0; ЧГ=0"), Формат(НеВыполнено, "ЧН=0; ЧГ=0")); КонецЕсли; - Результат.Оповестить = Ложь; - Результат.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(МассивСообщений); - Результат.Вставить("ТипДляОбновления", ?(Всего = 1, ТаблицаРассылок[0].Рассылка, Тип("СправочникСсылка.РассылкиОтчетов"))); + Результат = СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения(); + Результат.ВыводПредупреждения.Использование = Истина; + Результат.ВыводПредупреждения.Текст = ТекстСообщения; + Результат.ВыводПредупреждения.ТекстОшибок = РассылкаОтчетовКлиентСервер.СтрокаСообщенийПользователю(МассивСообщений); + + Если Всего > 0 Тогда + ТипДляОбновления = ?(Всего = 1, ТаблицаРассылок[0].Рассылка, Тип("СправочникСсылка.РассылкиОтчетов")); + Результат.ОповещениеДинамическихСписков.Использование = Истина; + Результат.ОповещениеДинамическихСписков.СсылкаИлиТип = ТипДляОбновления; + КонецЕсли; ПоместитьВоВременноеХранилище(Результат, АдресРезультата); КонецПроцедуры @@ -724,6 +738,9 @@ // Добавляет команды создания рассылок в форму отчета. // +// Места использования: +// ОбщаяФорма.ФормаОтчета.ПриСозданииНаСервере(). +// Процедура ФормаОтчетаДобавитьКоманды(Форма, Отказ, СтандартнаяОбработка) Экспорт // Рассылки можно добавлять только если есть ссылка варианта. @@ -781,7 +798,7 @@ // Запускает рассылку и контролирует результат. // // Параметры: -// Рассылка (СправочникСсылка.РассылкиОтчетов) Рассылка, которая должна быть выполнена +// Рассылка - СправочникСсылка.РассылкиОтчетов - Выполняемая рассылка отчетов. // Процедура ВыполнитьРассылкуПоРасписанию(Рассылка) Экспорт @@ -812,12 +829,12 @@ // Формирует список получателей из табличной части "Получатели" рассылки. // // Параметры: -// Рассылка (СправочникСсылка.РассылкиОтчетов, Структура) Элемент справочника, для которого необходимо сформировать список получателей +// Рассылка - СправочникСсылка.РассылкиОтчетов, Структура - Элемент справочника, для которого необходимо сформировать список получателей. // // Возвращаемое значение: -// Результат (Структура) -// |- Получатели (Соответствие) см. функцию ВыполнитьРассылку, параметр ПараметрыДоставки.Получатели -// |- Ошибки (Строка) Ошибки, которые возникли в процессе +// Структура - Результат получения списка получателей рассылки. +// * Получатели - Соответствие - Получатели. См. ВыполнитьРассылку(), описание к "ПараметрыДоставки.Получатели". +// * Ошибки - Строка - Ошибки, которые возникли в процессе. // Функция СформироватьСписокПолучателейРассылки(ПараметрыЖурнала, Рассылка) Экспорт @@ -1011,49 +1028,43 @@ КонецЕсли; Возврат СписокПолучателей; -КонецФункции // СформироватьСписокПолучателейРассылки +КонецФункции // Подключает, проверяет и инициализирует отчет по ссылке, используется перед формированием или редактированием параметров -// +// // Параметры: -// ПараметрыОтчета (Структура) Отчет, настройки и результат его инициализации. -// ПерсонализацияВозможна (Булево) = Истина, если отчет может быть персонализирован. -// УникальныйИдентификаторФормы (УникальныйИдентификатор) Необязательный. Адрес размещения СКД. -// -// Изменяемые параметры: -// ПараметрыОтчета (Структура) -// --- Начальные параметры --- -// |- Отчет (СправочникСсылка.ВариантыОтчетов, СправочникСсылка.ДополнительныеОтчетыИОбработки) -// |- Настройки (Неопределено, ПользовательскиеНастройкиКомпоновкиДанных, ТаблицаЗначений) -// | Настройки отчета, которые необходимо использовать, -// | подробнее см. процедуру "ЗаписатьНастройкиСтрокиОтчеты" модуля "Справочник.РассылкиОтчетов.ФормаОбъекта" +// ПараметрыОтчета - Структура - Отчет, настройки и результат его инициализации. +// * Отчет - СправочникСсылка.ВариантыОтчетов, СправочникСсылка.ДополнительныеОтчетыИОбработки - Ссылка отчета. +// * Настройки - Неопределено, ПользовательскиеНастройкиКомпоновкиДанных, ТаблицаЗначений - +// Настройки отчета, которые необходимо использовать, +// подробнее см. процедуру "ЗаписатьНастройкиСтрокиОтчеты" модуля "Справочник.РассылкиОтчетов.ФормаОбъекта" +// ПерсонализацияВозможна - Булево - Истина, если отчет может быть персонализирован. +// УникальныйИдентификаторФормы - УникальныйИдентификатор - Необязательный. Адрес размещения СКД. // -// --- Заполняются для всех отчетов --- -// |- Имя (Строка) -// |- ЭтоВариант (Булево) = Истина, если поставщик - справочник "ВариантыОтчетов". -// |- СКД (Булево) = Истина, если отчет на базе СКД. -// |- Метаданные (ОбъектМетаданных) -// |- Объект (ОтчетОбъект.*) -// -// --- Заполняются для СКД отчетов --- -// |- СхемаКД (СхемаКомпоновкиДанных) -// |- КомпоновщикНастроекКД (КомпоновщикНастроекКомпоновкиДанных) -// |- НастройкиКД (НастройкиКомпоновкиДанных) -// |- АдресСхемыКД (Строка) Адрес схемы компоновки данных во временном хранилище. -// -// --- Заполняются для произвольных отчетов --- -// |- ДоступныеРеквизиты (Структура) -// |- Ключ (Строка) Имя реквизита -// |- Значение (Структура) -// |- Представление (Строка) -// |- Тип (ОписаниеТипов) -// -// --- Результат инициализации --- -// |- Инициализирован (Булево) = Истина, если инициализация прошла успешно. -// |- Ошибки (Строка) +// Параметры, изменяемые в процессе работы метода: +// ПараметрыОтчета - Структура - +// Заполняются для всех отчетов: +// * Имя - Строка - Имя отчета. +// * ЭтоВариант - Булево - Истина, если поставщик - справочник "ВариантыОтчетов". +// * СКД - Булево - Истина, если отчет на базе СКД. +// * Метаданные - ОбъектМетаданных: Отчет - Метаданные отчета. +// * Объект - ОтчетОбъект.<Имя отчета>, ВнешнийОтчет - Объект отчета. +// Заполняются для отчетов на базе СКД: +// * СхемаКД - СхемаКомпоновкиДанных - +// * КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - +// * НастройкиКД - НастройкиКомпоновкиДанных - +// * АдресСхемыКД - Строка - Адрес схемы компоновки данных во временном хранилище. +// Заполняются для произвольных отчетов: +// * ДоступныеРеквизиты - Структура - Имя и параметры реквизита. +// ** <Имя реквизита> - Структура - Параметры реквизита. +// *** Представление - Строка - Представление реквизита. +// *** Тип - ОписаниеТипов - Тип реквизита. +// Результат инициализации: +// * Инициализирован - Булево - Истина, если инициализация прошла успешно. +// * Ошибки - Строка - Текст ошибок. // // Возвращаемое значение: -// (Булево) = Истина, если инициализация прошла успешно. +// Булево - Истина, если инициализация прошла успешно (соответствует ПараметрыОтчета.Инициализирован). // Функция ИнициализироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, ПерсонализацияВозможна, УникальныйИдентификаторФормы = Неопределено) Экспорт @@ -1096,14 +1107,17 @@ Результат = Неопределено; СведенияОВнешнейОбработке = Неопределено; - Попытка - ПриПодключенииДопОтчета(ПараметрыОтчета.Отчет, ПараметрыОтчета, Результат); - СведенияОВнешнейОбработке = ПараметрыОтчета.Объект.СведенияОВнешнейОбработке(); - Исключение - ЗаписьЖурнала(ПараметрыЖурнала, , - ЗаголовокСообщенияОбОшибке, ИнформацияОбОшибке(), - "'"+ Строка(ПараметрыОтчета.Отчет) +"'"); - КонецПопытки; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Попытка + МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(ПараметрыОтчета.Отчет, ПараметрыОтчета, Результат); + СведенияОВнешнейОбработке = ПараметрыОтчета.Объект.СведенияОВнешнейОбработке(); + Исключение + ЗаписьЖурнала(ПараметрыЖурнала, , + ЗаголовокСообщенияОбОшибке, ИнформацияОбОшибке(), + "'"+ Строка(ПараметрыОтчета.Отчет) +"'"); + КонецПопытки; + КонецЕсли; Если Результат <> Истина Тогда Если Результат = Неопределено Тогда @@ -1122,13 +1136,6 @@ Возврат ПараметрыОтчета.Инициализирован; КонецЕсли; - Если НЕ СведенияОВнешнейОбработке.Свойство("РассылкаОтчетов") ИЛИ СведенияОВнешнейОбработке.РассылкаОтчетов <> Истина Тогда - ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - ЗаголовокСообщенияОбОшибке, НСтр("ru = 'Не указаны сведения о внешней обработке, необходимые для рассылки.'"), - "'"+ Строка(ПараметрыОтчета.Отчет) +"'"); - Возврат ПараметрыОтчета.Инициализирован; - КонецЕсли; - КонецЕсли; // Определение принадлежности отчета к Системе Компоновки Данных @@ -1177,8 +1184,8 @@ ВариантНастроекКД = ВариантыНастроекКД.Найти(КлючВарианта); Если ВариантНастроекКД = Неопределено Тогда ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка, - НСтр("ru = 'Вариант ""%1"" не найден для отчета ""%2""'"), , - Строка(ПараметрыОтчета.Отчет), + НСтр("ru = 'Предопределенный вариант ""%1"" не найден для отчета ""%2""'"), , + КлючВарианта, ПараметрыОтчета.Имя); Возврат ПараметрыОтчета.Инициализирован; КонецЕсли; @@ -1242,22 +1249,22 @@ // Проверка наличия реквизитов // Подготовка соответствий персональных отборов // Установка статичных значений реквизитов - Для Каждого КлючИЗначение Из ПараметрыОтчета.Настройки Цикл - Настройка = КлючИЗначение.Ключ; - ЗначениеНастройки = КлючИЗначение.Значение; + Для Каждого ОписаниеНастройки Из ПараметрыОтчета.Настройки Цикл + ИмяРеквизита = ОписаниеНастройки.Реквизит; + ЗначениеНастройки = ОписаниеНастройки.Значение; // Доступность реквизита - Если НЕ ПараметрыОтчета.ДоступныеРеквизиты.Свойство(Настройка) Тогда + Если НЕ ПараметрыОтчета.ДоступныеРеквизиты.Свойство(ИмяРеквизита) Тогда Продолжить; КонецЕсли; // Принадлежность к механизму персонализации Если ПерсонализацияВозможна И ЗначениеНастройки = "[Получатель]" Тогда // Регистрация поля персонального отбора - ПараметрыОтчета.ПерсональныеОтборы.Вставить(Настройка); + ПараметрыОтчета.ПерсональныеОтборы.Вставить(ИмяРеквизита); Иначе // Установка значения реквизита объекта отчета - ПараметрыОтчета.Объект[Настройка] = ЗначениеНастройки; + ПараметрыОтчета.Объект[ИмяРеквизита] = ЗначениеНастройки; КонецЕсли; КонецЦикла; @@ -1270,19 +1277,19 @@ ПараметрыОтчета.Инициализирован = Истина; Возврат ПараметрыОтчета.Инициализирован; -КонецФункции // ИнициализироватьОтчет() +КонецФункции // Формирует отчет, проверяя что результат пустой. // // Параметры: -// ПараметрыЖурнала (Структура) Параметры записи в журнал регистрации. См. описание к процедуре "ЗаписьЖурнала". -// ПараметрыОтчета (Структура) См. возвращаемое значение функции "ИнициализироватьОтчет" -// Получатель (СправочникСсылка.*) +// ПараметрыЖурнала - Структура - Параметры записи в журнал регистрации. См. ЗаписьЖурнала(). +// ПараметрыОтчета - Структура - См. ИнициализироватьОтчет(), возвращаемое значение. +// Получатель - СправочникСсылка - Ссылка получателя. // // Возвращаемое значение: -// Результат (Структура) -// |- ТабДок (ТабличныйДокумент) Результат формирования отчета -// |- Пустой (Булево) = Истина, если отчет не содержал ни одного значения параметра +// Структура - Результат формирования очета. +// * ТабДок - ТабличныйДокумент - Табличный документ. +// * Пустой - Булево - Истина, если отчет не содержал ни одного значения параметра. // Функция СформироватьОтчет(ПараметрыЖурнала, ПараметрыОтчета, Получатель = Неопределено) Экспорт Результат = Новый Структура("ТабДок, СФормирован, Пустой", Новый ТабличныйДокумент, Ложь, Истина); @@ -1436,19 +1443,22 @@ // Выполняет транспортировку вложений для всех способов доставки. // // Параметры: -// Автор (СправочникСсылка.*) Автор рассылки -// ПараметрыДоставки (Структура) см. функцию ВыполнитьРассылку -// Вложения (Соответствие) см. функцию ДобавитьОтчетыВоВложения +// Автор - СправочникСсылка - Автор рассылки. +// ПараметрыДоставки - Структура - см. ВыполнитьРассылку(). +// Вложения - Соответствие - см. ДобавитьОтчетыВоВложения(). // // Возвращаемое значение: -// Результат (Структура) -// |- Доставка (Строка) Представление способа доставки -// |- Выполнена (Булево) = Истина, если доставка выполнена хотя бы одним из способов. +// Структура - Результат доставки. +// * Доставка - Строка - Представление способа доставки +// * Выполнена - Булево - Истина, если доставка выполнена хотя бы одним из способов. // Функция ВыполнитьДоставку(ПараметрыЖурнала, ПараметрыДоставки, Вложения) Экспорт Результат = Ложь; ШаблонСообщенияОбОшибке = НСтр("ru = 'Ошибка доставки отчетов'"); + //////////////////////////////////////////////////////////////////////////// + // В сетевой каталог. + Если ПараметрыДоставки.ИспользоватьСетевойКаталог Тогда СетевойКаталогСервера = ПараметрыДоставки.СетевойКаталогWindows; @@ -1476,22 +1486,29 @@ ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); КонецПопытки; - КонецЕсли; // ПараметрыДоставки.ИспользоватьСетевойКаталог - + КонецЕсли; + + //////////////////////////////////////////////////////////////////////////// + // На FTP ресурс. + Если ПараметрыДоставки.ИспользоватьFTPРесурс Тогда Цель = "ftp://"+ ПараметрыДоставки.Сервер +":"+ Формат(ПараметрыДоставки.Порт, "ЧН=0; ЧГ=0") + ПараметрыДоставки.Каталог; Попытка - Прокси = Неопределено; - ПриОпределенииНастроекПрокси(Прокси); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаКлиентСервер"); + Прокси = МодульПолучениеФайловИзИнтернетаКлиентСервер.ПолучитьПрокси("ftp"); + Иначе + Прокси = Неопределено; + КонецЕсли; Соединение = Новый FTPСоединение( - ПараметрыДоставки.Сервер, - ПараметрыДоставки.Порт, - ПараметрыДоставки.Логин, - ПараметрыДоставки.Пароль, - Прокси, - ПараметрыДоставки.ПассивноеСоединение, + ПараметрыДоставки.Сервер, + ПараметрыДоставки.Порт, + ПараметрыДоставки.Логин, + ПараметрыДоставки.Пароль, + Прокси, + ПараметрыДоставки.ПассивноеСоединение, 15); Соединение.УстановитьТекущийКаталог(ПараметрыДоставки.Каталог); Для Каждого Вложение Из Вложения Цикл @@ -1511,21 +1528,30 @@ ШаблонСообщенияОбОшибке, ИнформацияОбОшибке(),); КонецПопытки; - КонецЕсли; // ПараметрыДоставки.ИспользоватьFTPРесурс + КонецЕсли; + + //////////////////////////////////////////////////////////////////////////// + // В папку. Если ПараметрыДоставки.ИспользоватьПапку Тогда - Попытка - ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения); - Результат = Истина; - ПараметрыДоставки.ВыполненаВПапку = Истина; - Исключение - ЗаписьЖурнала(ПараметрыЖурнала, , - ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); - КонецПопытки; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + Попытка + МодульРаботаСФайламиСлужебный.ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения); + Результат = Истина; + ПараметрыДоставки.ВыполненаВПапку = Истина; + Исключение + ЗаписьЖурнала(ПараметрыЖурнала, , + ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); + КонецПопытки; + КонецЕсли; - КонецЕсли; // ПараметрыДоставки.ИспользоватьПапку - + КонецЕсли; + + //////////////////////////////////////////////////////////////////////////// + // По электронной почте. + Если ПараметрыДоставки.ИспользоватьЭлектроннуюПочту Тогда Если ПараметрыДоставки.ТолькоУведомить Тогда @@ -1549,18 +1575,18 @@ ШаблонСообщенияОбОшибке, ИнформацияОбОшибке()); КонецПопытки; - КонецЕсли; // ПараметрыДоставки.ИспользоватьЭлектроннуюПочту + КонецЕсли; Возврат Результат; КонецФункции -// Получает имя пользователя базы данных по ссылке справочника "Пользователи". +// Получает имя пользователя программы по ссылке справочника "Пользователи". // // Параметры: -// Пользователь (СправочникСсылка.Пользователи) +// Пользователь - СправочникСсылка.Пользователи - Ссылка пользователя. // // Возвращаемое значение: -// (Строка) Имя пользователя +// Строка - Имя пользователя программы. // Функция ПолучитьИмяПользователяИБ(Пользователь) Экспорт Если НЕ ЗначениеЗаполнено(Пользователь) Тогда @@ -1576,7 +1602,7 @@ КонецЕсли; Возврат ПользовательИБ.Имя; -КонецФункции // ПолучитьИмяПользователяИБ +КонецФункции // Создает запись в журнале регистрации и сообщениях пользователю; // Поддерживает до 4х параметров в комментарии при помощи функции @@ -1585,19 +1611,17 @@ // ошибки добавляется в комментарий записи в журнал регистрации. // // Параметры: -// ПараметрыЖурнала (Структура) Параметры записи в журнал регистрации -// |- ИмяСобытия (Строка) Имя события (или группы событий) -// |- Метаданные (ОбъектМетаданных) Метаданные для привязки события журнала регистрации -// |- Данные (*) Данные для привязки события журнала регистрации -// УровеньЖурнала (УровеньЖурналаРегистрации) Важность сообщения для администратора. -// КомментарийСПараметрами (Строка) Комментарий, который может содержать параметры %1, %2, %3 и %4. -// ИнформацияОбОшибке (...) Информация об ошибке, которая будет размещена после комментария. -// |- (ИнформацияОбОшибке) -// |- (Строка) -// Параметр1 (Строка) Для подстановки в КомментарийСПараметрами вместо %1. -// Параметр2 (Строка) Для подстановки в КомментарийСПараметрами вместо %2. -// Параметр3 (Строка) Для подстановки в КомментарийСПараметрами вместо %3. -// Параметр4 (Строка) Для подстановки в КомментарийСПараметрами вместо %4. +// ПараметрыЖурнала - Структура - Параметры записи в журнал регистрации. +// * ИмяСобытия - Строка - Имя события (или группы событий). +// * Метаданные - ОбъектМетаданных - Метаданные для привязки события журнала регистрации. +// * Данные - Произвольный - Данные для привязки события журнала регистрации. +// УровеньЖурнала - УровеньЖурналаРегистрации - Важность сообщения для администратора. +// КомментарийСПараметрами - Строка - Комментарий, который может содержать параметры %1, %2, %3 и %4. +// ИнформацияОбОшибке - ИнформацияОбОшибке, Строка - Информация об ошибке, которая будет размещена после комментария. +// Параметр1 - Строка - Для подстановки в КомментарийСПараметрами вместо %1. +// Параметр2 - Строка - Для подстановки в КомментарийСПараметрами вместо %2. +// Параметр3 - Строка - Для подстановки в КомментарийСПараметрами вместо %3. +// Параметр4 - Строка - Для подстановки в КомментарийСПараметрами вместо %4. // Процедура ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурнала = Неопределено, КомментарийСПараметрами = "", ИнформацияОбОшибке = Неопределено, @@ -1677,17 +1701,17 @@ // и формирует отчеты в разрезах получателей (если это необходимо) // // Параметры: -// ПараметрыЖурнала (Структура) Параметры записи в журнал регистрации -// |- Префикс (Строка) Префикс для имени события журнала регистрации -// |- Метаданные (ОбъектМетаданных) Метаданные для записи в журнал регистрации -// |- Данные (*) Данные для записи в журнал регистрации -// ПараметрыОтчета (Структура) см. функцию ВыполнитьРассылку, параметр ТаблицаОтчетов -// ДеревоОтчетов (ТаблицаЗначений) Список отчетов с результатом формирования в виде табличных документов -// ПараметрыДоставки (Структура) см. функцию ВыполнитьРассылку -// Получатель (СправочникСсылка.*) +// ПараметрыЖурнала - Структура - Параметры записи в журнал регистрации +// * Префикс - Строка - Префикс для имени события журнала регистрации +// * Метаданные - ОбъектМетаданных - Метаданные для записи в журнал регистрации +// * Данные - Произвольный - Данные для записи в журнал регистрации +// ПараметрыОтчета - Структура - См. ВыполнитьРассылку(), параметр ТаблицаОтчетов. +// ДеревоОтчетов - ДеревоЗначений - Отчеты и результат формирования. +// ПараметрыДоставки - Структура - См. ВыполнитьРассылку(), параметр ПараметрыДоставки. +// Получатель - СправочникСсылка - Ссылка получателя. // -// Результат выполнения записывается в ДеревоОтчетов -// Ошибки записываются в журнал регистрации и в сообщения сеанса пользователя +// Результат выполнения записывается в ДеревоОтчетов. +// Ошибки записываются в журнал регистрации и в сообщения сеанса пользователя. // Процедура СформироватьИСохранитьОтчет(ПараметрыЖурнала, ПараметрыОтчета, ДеревоОтчетов, ПараметрыДоставки, ПолучательСсылка) @@ -1852,9 +1876,9 @@ // Вспомогательная процедура функции "ВыполнитьРассылку" - заполняет значения по умолчанию для параметров, // которые не были переданы явно. // Так же подготавливает и заполняет параметры, необходимые для рассылки -// -// Параметры -// см. функцию ВыполнитьРассылку +// +// Параметры и возвращаемое значение: +// См. ВыполнитьРассылку(). // Функция ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию(ТаблицаОтчетов, ПараметрыДоставки, Рассылка, ПараметрыЖурнала) @@ -1894,10 +1918,14 @@ Если НЕ ЗначениеЗаполнено(ПараметрыДоставки.Папка) Тогда ПараметрыДоставки.ИспользоватьПапку = Ложь; ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Предупреждение, - НСтр("ru = 'Папка не заполнена, доставка в папку отключена'"), ,); + НСтр("ru = 'Папка не заполнена, доставка в папку отключена'")); Иначе - ПравоДоступа = Истина; - ПриОпределенииПраваИзмененияПапкиИФайлов(ПараметрыДоставки.Папка, ПравоДоступа); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); + ПравоДоступа = МодульРаботаСФайламиСлужебный.ПравоДобавленияФайловВПапку(ПараметрыДоставки.Папка); + Иначе + ПравоДоступа = Истина; + КонецЕсли; Если НЕ ПравоДоступа Тогда ПараметрыДоставки.ИспользоватьПапку = Ложь; УстановитьПривилегированныйРежим(Истина); @@ -2153,19 +2181,18 @@ КонецЕсли; Возврат Истина; -КонецФункции // ЗаполнитьПараметрыРассылкиПараметрамиПоУмолчанию() +КонецФункции // Формирует список рассылки из списка получателей, подготавливает все параметры письма // и передает управление подсистеме "ЭлектроннаяПочта" -// +// Для контроля за выполнением рекомендуется вызывать в конструкции "Попытка ... Исключение". +// // Параметры: -// Вложения (Соответствие) - см. функцию СохранитьОтчетыВФорматы, параметр Результат -// ПараметрыДоставки (Структура) - см. функцию ВыполнитьРассылку, параметр называется так же -// СтрокаПолучатель - Настройки получателя: -// (СтрокаДереваЗначений) - Используется свойство строки "Получатель". -// (Неопределено) - Используется весь список получателей из "ПараметрыДоставки.Получатели". -// -// Для контроля за выполнением рекомендуется вызывать в конструкции "Попытка ... Исключение" +// Вложения - Соответствие - См. СохранитьОтчетыВФорматы(), параметр Результат. +// ПараметрыДоставки - Структура - См. ВыполнитьРассылку(), параметр ПараметрыДоставки. +// СтрокаПолучатель - Настройки получателя: +// - Неопределено - Используется весь список получателей из "ПараметрыДоставки.Получатели". +// - СтрокаДереваЗначений - Используется свойство строки "Получатель". // Процедура ОтправитьОтчетыПолучателю(Вложения, ПараметрыДоставки, СтрокаПолучатель = Неопределено) Получатель = ?(СтрокаПолучатель = Неопределено, Неопределено, СтрокаПолучатель.Ключ); @@ -2176,10 +2203,15 @@ // Вложения - предустановленные Если ПараметрыПисьма.Свойство("ПредустановленныеВложения") Тогда + ЭтоМассив = ТипЗнч(ПараметрыПисьма.Вложения) = Тип("Массив"); Для Каждого КлючИЗначение Из ПараметрыПисьма.ПредустановленныеВложения Цикл Вложение = КлючИЗначение.Значение; ЭлектроннаяПочта.ПривестиВложениеДляВставкиВПисьмо(Вложение); - ПараметрыПисьма.Вложения.Добавить(Новый Структура("Ключ, Значение", КлючИЗначение.Ключ, Вложение)); + Если ЭтоМассив Тогда + ПараметрыПисьма.Вложения.Добавить(Новый Структура("Ключ, Значение", КлючИЗначение.Ключ, Вложение)); + Иначе + ПараметрыПисьма.Вложения.Вставить(КлючИЗначение.Ключ, Вложение); + КонецЕсли; КонецЦикла; КонецЕсли; @@ -2266,7 +2298,6 @@ КонецПроцедуры // Объединяет массивы, возвращая результат объединения -// Функция ОбъединитьМассивы(Массив1, Массив2) Массив = Новый Массив; Для Каждого ЭлементМассива Из Массив1 Цикл @@ -2278,13 +2309,13 @@ Возврат Массив; КонецФункции -// Выполняет архивацию вложений в соответствии с параметрами доставки -// +// Выполняет архивацию вложений в соответствии с параметрами доставки. +// // Параметры: -// Вложения (Соответствие) - см. функцию ДобавитьОтчетыВоВложения -// ПараметрыДоставки (Структура) - см. функцию ВыполнитьРассылку -// КаталогВременныхФайлов (Строка) - каталог, в который будет выполнена архивация -// +// Вложения - Соответствие, СтрокаДереваЗначений - См. СоздатьДеревоОтчетов(), возвращаемое значение, 3й уровень. +// ПараметрыДоставки - Структура - См. ВыполнитьРассылку(), параметр ПараметрыДоставки. +// КаталогВременныхФайлов - Строка - Каталог, в который будет выполнена архивация. +// Процедура АрхивацияВложений(Вложения, ПараметрыДоставки, КаталогВременныхФайлов) Если НЕ ПараметрыДоставки.Архивировать Тогда Возврат; @@ -2339,15 +2370,16 @@ КонецПроцедуры -// Возвращает параметры, которые можно использовать для сохранения табличного документа в формат -// +// Параметры сохранения табличного документа в формат. +// // Параметры: -// Формат (ПеречислениеСсылка.ФорматыСохраненияОтчетов) - Формат, для которого необходимо получить параметры -// +// Формат - ПеречислениеСсылка.ФорматыСохраненияОтчетов - Формат, для которого необходимо получить параметры +// // Возвращаемое значение: -// Результат (Структура) - параметры записи -// |- Расширение (Строка) - расширение, с которым можно сохранить файл -// |- ТипФайла (ТипФайлаТабличногоДокумента) - тип, который необходимо передать табличному документу для сохранения +// Результат - Структура - Параметры записи. +// * Расширение - Строка - Расширение, с которым можно сохранить файл. +// * ТипФайла - ТипФайлаТабличногоДокумента - Формат сохранения табличного документа. +// Используется для определения параметра <ТипФайлаТаблицы> метода "ТабличныйДокумент.Записать". // Функция ПараметрыЗаписиТабличногоДокументаВФормат(Формат) Результат = Новый Структура("Расширение, ТипФайла"); @@ -2398,13 +2430,13 @@ Возврат Результат; КонецФункции -// Очистка временных файлов, которые использовались в рассылке -// +// Очистка временных файлов, которые использовались в рассылке. +// // Параметры -// ПараметрыЖурнала (Структура) - Параметры записи в журнал регистрации, -// см. комментарий к процедуре ЗаписьЖурнала, параметр называется так же -// ПараметрыДоставки (Структура) - ... -// |- КаталогВременныхФайлов (Строка) - Каталог, который использовался рассылкой для хранения временных файлов +// ПараметрыЖурнала - Структура - Параметры записи в журнал регистрации. См. ЗаписьЖурнала(), параметр ПараметрыЖурнала. +// ПараметрыДоставки - Структура - Параметры доставки. +// * КаталогВременныхФайлов - Строка - Каталог, который использовался рассылкой для хранения временных файлов. +// Процедура УдалитьВременныеФайлы(ПараметрыЖурнала, ПараметрыДоставки) Попытка УдалитьФайлы(ПараметрыДоставки.КаталогВременныхФайлов, "*"); @@ -2415,20 +2447,22 @@ КонецПопытки; КонецПроцедуры -// Преобразует недопустимые символы файлов в похожие допустимые +// Преобразует недопустимые символы файлов в похожие допустимые. // Работает только с именем файла, путь не поддерживается. -// +// // Параметры: -// ИсходноеИмяФайла (Строка) -// +// ИсходноеИмяФайла - Строка - Имя файла, из которого следует удалить недопустимые символы. +// // Возвращаемое значение: -// Результат (Строка) - Результат преобразования +// Результат - Строка - Результат преобразования. // Функция ПривестиИмяФайла(ИсходноеИмяФайла) Результат = Лев(СокрЛП(ИсходноеИмяФайла), 255); СоответствиеЗамен = Новый Соответствие; + + // Стандартные не поддерживаемые символы. СоответствиеЗамен.Вставить("""", "'"); СоответствиеЗамен.Вставить("/", "_"); СоответствиеЗамен.Вставить("\", "_"); @@ -2441,7 +2475,7 @@ СоответствиеЗамен.Вставить("<", "_"); СоответствиеЗамен.Вставить(">", "_"); - // Символы, не поддерживаемые + // Символы, не поддерживаемые устаревшими ОС. СоответствиеЗамен.Вставить("[", ""); СоответствиеЗамен.Вставить("]", ""); СоответствиеЗамен.Вставить(",", ""); @@ -2455,12 +2489,11 @@ Возврат Результат; КонецФункции -// Возвращает дерево значений, необходимое для формирования и доставки отчетов -// +// Дерево значений, необходимое для формирования и доставки отчетов. Функция СоздатьДеревоОтчетов() - // Уровень (вложенности): + // Уровень вложенности: // - // 1 - Получатели + // 1 - Получатели // Ключ - Ссылка // Значение - каталог получателя // @@ -2476,17 +2509,15 @@ // ДеревоОтчетов = Новый ДеревоЗначений; - ДеревоОтчетов.Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число")); - ДеревоОтчетов.Колонки.Добавить("Ключ", ); - ДеревоОтчетов.Колонки.Добавить("Значение", ); + ДеревоОтчетов.Колонки.Добавить("Уровень", Новый ОписаниеТипов("Число")); + ДеревоОтчетов.Колонки.Добавить("Ключ"); + ДеревоОтчетов.Колонки.Добавить("Значение"); ДеревоОтчетов.Колонки.Добавить("Настройки", Новый ОписаниеТипов("Структура")); Возврат ДеревоОтчетов; КонецФункции -// Проверяет права текущего пользователя на вывод информации, -// если прав нет - производится запись в журнал регистрации -// +// Проверяет право текущего пользователя на вывод информации. Если прав нет - производится запись в журнал регистрации. Функция ПравоВывода(ПараметрыЖурнала) ПравоВывода = ПравоДоступа("Вывод", Метаданные); Если НЕ ПравоВывода Тогда @@ -2497,13 +2528,13 @@ Возврат ПравоВывода; КонецФункции -// Формирует представление способов доставки в соответствии с параметрами доставки +// Формирует представление способов доставки в соответствии с параметрами доставки. // // Параметры: -// ПараметрыДоставки (Структура) - см. функцию ВыполнитьРассылку +// ПараметрыДоставки - Структура - См. ВыполнитьРассылку(), параметр ПараметрыДоставки. // -// Возвращаемое значение: -// ТекстПредставления - (Строка) описание +// Возвращаемое значение: +// Строка - Представление способов доставки. // Функция ПредставлениеСпособовДоставки(ПараметрыДоставки) Префикс = НСтр("ru = 'Результат'"); @@ -2605,10 +2636,10 @@ Возврат ТекстПредставления; КонецФункции -// Если файл существует - добавляет суффикс в имя файла +// Если файл существует - добавляет суффикс в имя файла. // // Параметры: -// ПолноеИмяФайла - (Строка) +// ПолноеИмяФайла - Строка - Имя файла, с которого надо начать поиск. // Процедура НайтиСвободноеИмяФайла(ПолноеИмяФайла) Файл = Новый Файл(ПолноеИмяФайла); @@ -2648,12 +2679,12 @@ // Создает корневую строку дерева для получателя (в случае ее отсутствия) и заполняет ее параметрами по умолчанию. // // Параметры: -// ДеревоОтчетов - (ДеревоЗначений) -// ПолучательСсылка - (СправочникСсылка.*, Неопределено) -// ПараметрыДоставки - (Структура) +// ДеревоОтчетов - ДеревоЗначений - См. СоздатьДеревоОтчетов(), возвращаемое значение, 1й уровень. +// ПолучательСсылка - СправочникСсылка, Неопределено - Ссылка получателя. +// ПараметрыДоставки - Структура - См. ВыполнитьРассылку(), параметр ПараметрыДоставки. // // Возвращаемое значение: -// СтрокаПолучатель - (СтрокаДереваЗначений) +// СтрокаДереваЗначений - См. СоздатьДеревоОтчетов(), возвращаемое значение, 1й уровень. // Функция ОпределитьСтрокуДереваДляПолучателя(ДеревоОтчетов, ПолучательСсылка, ПараметрыДоставки) @@ -2671,18 +2702,17 @@ КонецЕсли; СтрокаПолучатель = ДеревоОтчетов.Строки.Добавить(); - СтрокаПолучатель.Уровень = 1; - СтрокаПолучатель.Ключ = ПолучательСсылка; - СтрокаПолучатель.Значение = КаталогПолучателя; + СтрокаПолучатель.Уровень = 1; + СтрокаПолучатель.Ключ = ПолучательСсылка; + СтрокаПолучатель.Значение = КаталогПолучателя; КонецЕсли; Возврат СтрокаПолучатель; -КонецФункции // ОпределитьСтрокуДереваДляПолучателя +КонецФункции // Формирует представление отчетов для получателя. -// Процедура СформироватьПредставлениеОтчетовДляПолучателя(ПараметрыДоставки, СтрокаПолучатель) СформированныеОтчеты = ""; @@ -2725,10 +2755,10 @@ // Проверяет наличие внешних наборов данных. // // Параметры: -// НаборыДанных (НаборыДанныхМакетаКомпоновкиДанных) +// НаборыДанных - НаборыДанныхМакетаКомпоновкиДанных - Коллекция проверяемых наборов данных. // // Возвращаемое значение: -// (Булево) +// Булево - Истина если есть внешние наборы данных. // Функция ЕстьВнешнийНаборДанных(НаборыДанных) @@ -2753,68 +2783,3 @@ Возврат Ложь; КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Условные вызовы в друге подсистемы - -// Подключает отчет подсистемы "Дополнительные отчеты и обработки". -// Обработка исключений производится управляющим кодом. -// -// Параметры: -// ДопОтчет (СправочникСсылка.ДополнительныеОтчетыИОбработки) Отчет, который необходимо инициализировать -// ПараметрыОтчета (Структура) Набор параметров, получаемый в процессе проверки и подключения отчета -// см. описание функции "ИнициализироватьОтчет" модуля "РассылкаОтчетов" -// Результат (Булево, Неопределено) -// |- Истина - Удалось подключить дополнительный отчет -// |- Ложь - Не удалось подключить дополнительный отчет -// |- Неопределено - По умолчанию. Подсистема доп. отчетов недоступна. -// -Процедура ПриПодключенииДопОтчета(ДопОтчет, ПараметрыОтчета, Результат) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); - МодульДополнительныеОтчетыИОбработки.ПриПодключенииДопОтчета(ДопОтчет, ПараметрыОтчета, Результат); - КонецЕсли; - -КонецПроцедуры - -Процедура ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебный"); - МодульРаботаСФайламиСлужебный.ПриВыполненииДоставкиВПапку(ПараметрыДоставки, Вложения); - КонецЕсли; - -КонецПроцедуры - -// Проверяет право изменения папки. -// -// Параметры: см. описание процедуры "ВыполнитьДоставку" модуля "РассылкаОтчетов" -// -Процедура ПриОпределенииПраваИзмененияПапкиИФайлов(Папка, Результат) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); - Результат = МодульУправлениеДоступом.ЕстьПравоПоЗначениюДоступа("ИзменениеПапокИФайлов", Папка); - КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -// Получает настройки прокси на сервере. -// -Процедура ПриОпределенииНастроекПрокси(Прокси) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернета = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолучениеФайловИзИнтернета"); - МодульПолучениеФайловИзИнтернета.ПриОпределенииНастроекПрокси(Прокси); - КонецЕсли; - -КонецПроцедуры - - - - diff --git a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl index 7010892b0..091a2faea 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовВызовСервера/Module.bsl @@ -8,7 +8,6 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Для внутреннего использования. -// Функция СформироватьСписокПолучателейРассылки(Знач Параметры) Экспорт ПараметрыЖурнала = Новый Структура("ИмяСобытия, Метаданные, Данные, МассивОшибок, БылиОшибки"); ПараметрыЖурнала.ИмяСобытия = НСтр("ru = 'Рассылка отчетов. Формирование списка получателей'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); @@ -37,7 +36,6 @@ КонецФункции // Обновляет состояние фонового задания и получает результат его выполнения из временного хранилища. -// Функция ПроверитьВыполнениеФоновогоЗадания(ИдентификаторЗадания, АдресХранилища) Экспорт Результат = Новый Структура("Статус, Детали"); Попытка @@ -52,3 +50,4 @@ КонецПопытки; Возврат Результат; КонецФункции + diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl index fad1343cf..3446c8f7a 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиент/Module.bsl @@ -4,18 +4,89 @@ // Выполняется на клиенте. //////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики условных вызовов + +// Обработчик команды формы отчета. +// +// Параметры: +// Форма - УправляемаяФорма - Форма отчета. +// Команда - КомандаФормы - Команда, которая была вызвана. +// Результат - Булево - Истина, если вызов команды обработан. +// +// Места использования: +// ОбщаяФорма.ФормаОтчета.Подключаемый_Команда(). +// +Процедура ФормаОтчетаОбработчикКоманды(Форма, Команда, Результат) Экспорт + + Если Результат = Истина Тогда + + // Действие не требуется + + ИначеЕсли Команда.Имя = "РассылкаОтчетовСоздатьНовую" Тогда + + ОткрытьРассылкуИзФормыОтчета(Форма); + + Результат = Истина; + + ИначеЕсли Команда.Имя = "РассылкаОтчетовПрисоединитьКСуществующей" Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы); + ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); + + ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаВыбора", ПараметрыФормы, Форма); + + Результат = Истина; + + КонецЕсли; + +КонецПроцедуры + +// Обработчик выбора формы отчета. +// +// Параметры: +// Форма - УправляемаяФорма - Форма отчета. +// ВыбранноеЗначение - Произвольный - Результат выбора в подчиненной форме. +// ИсточникВыбора - УправляемаяФорма - Форма, где осуществлен выбор. +// Результат - Булево - Истина, если результат выбора обработан. +// +// Места использования: +// ОбщаяФорма.ФормаОтчета.ОбработкаВыбора(). +// +Процедура ФормаОтчетаОбработкаВыбора(Форма, ВыбранноеЗначение, ИсточникВыбора, Результат) Экспорт + + Если Результат = Истина Тогда + Возврат; + КонецЕсли; + + Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.РассылкиОтчетов") Тогда + + ОткрытьРассылкуИзФормыОтчета(Форма, ВыбранноеЗначение); + + Результат = Истина; + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Формирует список получателей рассылки, предлагает пользователю выбрать // конкретного получателя или всех получателей рассылки и возвращает // результат выбора пользователя. +// Вызывается из формы элемента. // -Функция ВыбратьПолучателя(Объект, МножественныйВыбор = Истина, ВозвращатьСоответствие = Истина, ЗаголовокДляОшибок = "") Экспорт +Процедура ВыбратьПолучателя(ОбработчикРезультата, Объект, МножественныйВыбор, ВозвращатьСоответствие) Экспорт Если Объект.Личная = Истина Тогда НаборПараметров = "Ссылка, ВидПочтовогоАдресаПолучателей, Личная, Автор"; - Иначе + Иначе НаборПараметров = "Ссылка, ВидПочтовогоАдресаПолучателей, Личная, ТипПолучателейРассылки, Получатели"; КонецЕсли; @@ -25,7 +96,8 @@ Если РезультатВыполнения.БылиКритичныеОшибки Тогда СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Неопределено, РезультатВыполнения); - Возврат Неопределено; + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Неопределено); + Возврат; КонецЕсли; Получатели = РезультатВыполнения.Получатели; @@ -38,165 +110,77 @@ ВозможныеПолучатели.Добавить(КлючИЗначение.Ключ, Строка(КлючИЗначение.Ключ) +" <"+ КлючИЗначение.Значение +">"); КонецЦикла; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ДополнительныеПараметры.Вставить("Получатели", Получатели); + ДополнительныеПараметры.Вставить("ВозвращатьСоответствие", ВозвращатьСоответствие); + + Обработчик = Новый ОписаниеОповещения("ВыбратьПолучателяЗавершение", ЭтотОбъект, ДополнительныеПараметры); + Если Объект.Личная И ВозможныеПолучатели.Количество() = 1 Тогда - ВыбранноеЗначение = ВозможныеПолучатели[0]; + ВыполнитьОбработкуОповещения(Обработчик, ВозможныеПолучатели[0]); Иначе - ВыбранноеЗначение = ВозможныеПолучатели.ВыбратьЭлемент(НСтр("ru = 'Выбор получателя'")); - Если ВыбранноеЗначение = Неопределено Тогда - Возврат Неопределено; - КонецЕсли; + ВозможныеПолучатели.ПоказатьВыборЭлемента(Обработчик, НСтр("ru = 'Выбор получателя'")); КонецЕсли; - - Если ВозвращатьСоответствие Тогда - Если ВыбранноеЗначение.Значение = Неопределено Тогда - Результат = Получатели; - Иначе - Результат = Новый Соответствие; - Результат.Вставить(ВыбранноеЗначение.Значение, Получатели[ВыбранноеЗначение.Значение]); - КонецЕсли; - Иначе - Результат = Новый Структура("Получатель, ПочтовыйАдрес", ВыбранноеЗначение.Значение, Получатели[ВыбранноеЗначение.Значение]); - КонецЕсли; - - Возврат Результат; -КонецФункции +КонецПроцедуры -// Выводит пользователю результат выполнения какой-либо операции, при необходимости -// оповещает об изменении типа или ссылки. -// -Процедура ПоказатьРезультат(Результат) Экспорт - Если ТипЗнч(Результат) <> Тип("Структура") Тогда - Возврат; - КонецЕсли; - - Оповестить = ?(Результат.Свойство("Оповестить"), Результат.Оповестить, Истина); - Заголовок = ?(Результат.Свойство("Заголовок"), Результат.Заголовок, ""); - Текст = ?(Результат.Свойство("Текст"), Результат.Текст, ""); - Картинка = ?(Результат.Свойство("Картинка"), Результат.Картинка, БиблиотекаКартинок.ВыполнитьЗадачу); - ТекстОшибок = ?(Результат.Свойство("ТекстОшибок"), Результат.ТекстОшибок, ""); - - Если Оповестить = Истина Тогда - ПоказатьОповещениеПользователя(Заголовок, , Текст, Картинка); +// Обработчик результата работы процедуры ВыбратьПолучателя. +Процедура ВыбратьПолучателяЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент = Неопределено Тогда + Результат = Неопределено; Иначе - Если ЗначениеЗаполнено(ТекстОшибок) Тогда - Кнопки = Новый СписокЗначений; - Кнопки.Добавить(1, НСтр("ru = 'Показать ошибки'")); - Кнопки.Добавить(КодВозвратаДиалога.Отмена); - - Ответ = Вопрос(Текст, Кнопки, , 1, Заголовок); - - Если Ответ = 1 Тогда - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.УстановитьТекст(ТекстОшибок); - Если ЗначениеЗаполнено(Заголовок) Тогда - ТекстовыйДокумент.Показать(Заголовок); - Иначе - ТекстовыйДокумент.Показать(); - КонецЕсли; + Если ДополнительныеПараметры.ВозвращатьСоответствие Тогда + Если ВыбранныйЭлемент.Значение = Неопределено Тогда + Результат = ДополнительныеПараметры.Получатели; + Иначе + Результат = Новый Соответствие; + Результат.Вставить(ВыбранныйЭлемент.Значение, ДополнительныеПараметры.Получатели[ВыбранныйЭлемент.Значение]); КонецЕсли; Иначе - Предупреждение(Текст); + Результат = Новый Структура("Получатель, ПочтовыйАдрес", ВыбранныйЭлемент.Значение, ДополнительныеПараметры.Получатели[ВыбранныйЭлемент.Значение]); КонецЕсли; КонецЕсли; - Если Результат.Свойство("ТипДляОбновления") Тогда - ОповеститьОбИзменении(Результат.ТипДляОбновления); - КонецЕсли; - + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); КонецПроцедуры // Контролирует состояние фонового задания и выводит пользователю его результат -// -Процедура ПроверитьВыполнениеФоновогоЗадания(ЭтаФорма) Экспорт +Процедура ПроверитьВыполнениеФоновогоЗадания(Форма) Экспорт - ИдентификаторЗадания = ЭтаФорма.ПараметрыФоновогоЗадания[0].Значение; - АдресХранилища = ЭтаФорма.ПараметрыФоновогоЗадания[1].Значение; - ПараметрыОбработчика = ЭтаФорма.ПараметрыФоновогоЗадания[2].Значение; - ФормаДлительнойОперации = ЭтаФорма.ПараметрыФоновогоЗадания[3].Значение; + ИдентификаторЗадания = Форма.ПараметрыФоновогоЗадания[0].Значение; + АдресХранилища = Форма.ПараметрыФоновогоЗадания[1].Значение; + ПараметрыОбработчика = Форма.ПараметрыФоновогоЗадания[2].Значение; + ФормаДлительнойОперации = Форма.ПараметрыФоновогоЗадания[3].Значение; Результат = РассылкаОтчетовВызовСервера.ПроверитьВыполнениеФоновогоЗадания(ИдентификаторЗадания, АдресХранилища); Если Результат.Статус = "ВыполненоУспешно" Тогда ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации); - ПоказатьРезультат(Результат.Детали); - ЭтаФорма.ПараметрыФоновогоЗадания.Очистить(); + СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(Форма, Результат.Детали); + Форма.ПараметрыФоновогоЗадания.Очистить(); ИначеЕсли Результат.Статус = "Исключение" Тогда - Предупреждение( + ПоказатьПредупреждение(, НСтр("ru = 'Рассылки не выполнены из-за ошибки, |Подробности см. в журнале регистрации.'")); ИначеЕсли Результат.Статус = "Выполняется" Тогда - ЭтаФорма.ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеФоновогоЗадания", ПараметрыОбработчика.ТекущийИнтервал, Истина); - ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ЭтаФорма.ПараметрыФоновогоЗадания[2].Значение); - КонецЕсли; - -КонецПроцедуры - -// Обработчик команды формы отчета. -// -// Параметры: -// ЭтаФорма (УправляемаяФорма) Форма отчета. -// Команда (КомандаФормы) Команда, которая была вызвана. -// Результат (Булево) Истина, если вызов команды обработан. -// -Процедура ФормаОтчетаОбработчикКоманды(ЭтаФорма, Команда, Результат) Экспорт - - Если Результат = Истина Тогда - - // Действие не требуется - - ИначеЕсли Команда.Имя = "РассылкаОтчетовСоздатьНовую" Тогда - - ФормаОтчетаОткрытьРассылку(ЭтаФорма); - - Результат = Истина; - - ИначеЕсли Команда.Имя = "РассылкаОтчетовПрисоединитьКСуществующей" Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("РежимВыбора", Истина); - ПараметрыФормы.Вставить("ВыборГруппИЭлементов", ИспользованиеГруппИЭлементов.Элементы); - ПараметрыФормы.Вставить("МножественныйВыбор", Ложь); - - ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаВыбора", ПараметрыФормы, ЭтаФорма); - - Результат = Истина; - - КонецЕсли; - -КонецПроцедуры - -// Обработчик выбора формы отчета. -// -// Параметры: -// ЭтаФорма (УправляемаяФорма) Форма отчета. -// ВыбранноеЗначение (*) Результат выбора в подчиненной форме. -// ИсточникВыбора (УправляемаяФорма) Форма, где осуществлен выбор. -// Результат (Булево) Истина, если результат выбора обработан. -// -Процедура ФормаОтчетаОбработкаВыбора(ЭтаФорма, ВыбранноеЗначение, ИсточникВыбора, Результат) Экспорт - - Если Результат = Истина Тогда - Возврат; - КонецЕсли; - - Если ТипЗнч(ВыбранноеЗначение) = Тип("СправочникСсылка.РассылкиОтчетов") Тогда - - ФормаОтчетаОткрытьРассылку(ЭтаФорма, ВыбранноеЗначение); - - Результат = Истина; - + Форма.ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеФоновогоЗадания", ПараметрыОбработчика.ТекущийИнтервал, Истина); + ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(Форма.ПараметрыФоновогоЗадания[2].Значение); КонецЕсли; КонецПроцедуры // Открывает рассылку отчетов из формы отчета. // -Процедура ФормаОтчетаОткрытьРассылку(ЭтаФорма, Ссылка = Неопределено) +// Параметры: +// Форма - УправляемаяФорма - Форма отчета. +// Ссылка - СправочникСсылка.РассылкиОтчетов - Необязательный. Ссылка рассылки отчетов. +// +Процедура ОткрытьРассылкуИзФормыОтчета(Форма, Ссылка = Неопределено) СтрокаОтчетыПараметры = Новый Структура; - СтрокаОтчетыПараметры.Вставить("ОтчетПолноеИмя", ЭтаФорма.КлючОбъекта); - СтрокаОтчетыПараметры.Вставить("КлючВарианта", ЭтаФорма.КлючТекущегоВарианта); - СтрокаОтчетыПараметры.Вставить("ВариантСсылка", ЭтаФорма.ВариантСсылка); - СтрокаОтчетыПараметры.Вставить("Настройки", ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); + СтрокаОтчетыПараметры.Вставить("ОтчетПолноеИмя", Форма.КлючОбъекта); + СтрокаОтчетыПараметры.Вставить("КлючВарианта", Форма.КлючТекущегоВарианта); + СтрокаОтчетыПараметры.Вставить("ВариантСсылка", Форма.ВариантСсылка); + СтрокаОтчетыПараметры.Вставить("Настройки", Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки); ПрисоединяемыеОтчеты = Новый Массив; ПрисоединяемыеОтчеты.Добавить(СтрокаОтчетыПараметры); @@ -207,32 +191,6 @@ ПараметрыФормы.Вставить("Ключ", Ссылка); КонецЕсли; - ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаОбъекта", ПараметрыФормы, , Строка(ЭтаФорма.УникальныйИдентификатор) + ".ОткрытьРассылкуОтчетов"); + ОткрытьФорму("Справочник.РассылкиОтчетов.ФормаОбъекта", ПараметрыФормы, , Строка(Форма.УникальныйИдентификатор) + ".ОткрытьРассылкуОтчетов"); КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Условные вызовы в друге подсистемы - -// Открывает форму подбора дополнительных отчетов. -// -Процедура РассылкаОтчетовПодборДопОтчета(ЭлементФормы) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); - МодульДополнительныеОтчетыИОбработкиКлиент.РассылкаОтчетовПодборДопОтчета(ЭлементФормы); - КонецЕсли; - -КонецПроцедуры - -// Открывает форму папки со списком файлов. -// -Процедура РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Папка) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент"); - МодульРаботаСФайламиСлужебныйКлиент.РассылкаОтчетовПросмотрПапки(СтандартнаяОбработка, Папка); - КонецЕсли; - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl index ec964f1df..61847b547 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовКлиентСервер/Module.bsl @@ -7,20 +7,20 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Разбирает строку FTP адреса на Логин, Пароль, Сервер, Порт и Каталог -// Подробнее - см. RFC 1738 (http://tools.ietf.org/html/rfc1738#section-3.1) -// Шаблон: ftp://<user>:<password>@<host>:<port>/<url-path> +// Разбирает строку FTP адреса на Логин, Пароль, Сервер, Порт и Каталог. +// Подробнее - см. RFC 1738 (http://tools.ietf.org/html/rfc1738#section-3.1). +// Шаблон: ftp://<user>:<password>@<host>:<port>/<url-path>. // // Параметры: -// FTPАдрес (Строка) +// FTPАдрес - Строка - Полный путь к ftp ресурсу. // // Возвращаемое значение: -// Результат (Структура) -// |- Логин (Строка) -// |- Пароль (Строка) -// |- Сервер (Строка) -// |- Порт (Число) - По умолчанию 21 -// |- Каталог (Строка) - Первый символ всегда "/" +// Результат - Структура - Результат разбора полного пути. +// * Логин - Строка - Имя пользователя ftp. +// * Пароль - Строка - Пароль пользователя ftp. +// * Сервер - Строка - Имя сервера. +// * Порт - Число - Порт сервера. По умолчанию 21 +// * Каталог - Строка - Путь к каталогу на сервере. Первый символ всегда "/". // Функция РазобратьFTPАдрес(ПолныйFTPАдрес) Экспорт Результат = Новый Структура("Логин, Пароль, Сервер, Порт, Каталог", "", "", "", 21, "/"); @@ -66,20 +66,22 @@ Возврат Результат; КонецФункции -// Заполняет шаблон из структуры параметров, поддерживает форматирование, может оставлять обрамление шаблона -// Ограничение: должны присутствовать и левый и правый элементы обрамления +// Заполняет шаблон из структуры параметров, поддерживает форматирование, может оставлять обрамление шаблона. +// Ограничение: должны присутствовать и левый и правый элементы обрамления. // // Параметры: -// Шаблон (Строка) - Исходный шаблон -// Параметры (Структура) - Набор параметров, которые необходимо подставить в шаблон -// Левый (Строка) - Начало обрамления параметра -// Правый (Строка) - Конец обрамления параметра -// ФорматЛевый (Строка) - Начало обрамления формата параметра -// ФорматПравый (Строка) - Конец обрамления формата параметра -// ВырезатьОбрамление (Булево) - Ложь означает, что обрамление параметра будет убрано из результата +// Шаблон - Строка - Исходный шаблон. Например "Добрый день, [ФИО]". +// Параметры - Структура - Набор параметров, которые необходимо подставить в шаблон. +// * Ключ - Имя параметра. Например "ФИО". +// * Значение - Строка подстановки. Например "Иванов Иван Иванович". +// Левый - Строка - Необязательный. Начало обрамления параметра. +// Правый - Строка - Необязательный. Конец обрамления параметра. +// ФорматЛевый - Строка - Необязательный. Начало обрамления формата параметра. +// ФорматПравый - Строка - Необязательный. Конец обрамления формата параметра. +// ВырезатьОбрамление - Булево - Необязательный. Истина означает, что обрамление параметра будет убрано из результата. // // Возвращаемое значение: -// Результат (Строка) - Результат заполнения +// Строка - Шаблон с заполненными параметрами. // Функция ЗаполнитьШаблон(Шаблон, Параметры) Экспорт Левый = "["; @@ -119,14 +121,12 @@ Возврат Результат; КонецФункции -// Возвращает шаблон темы по умолчанию для доставки по электронной почте -// +// Возвращает шаблон темы по умолчанию для доставки по электронной почте. Функция ШаблонТемы() Экспорт Возврат НСтр("ru = '[НаименованиеРассылки] от [ДатаВыполнения(ДЛФ=''D'')]'"); КонецФункции -// Возвращает шаблон тела сообщения по умолчанию для доставки по электронной почте -// +// Возвращает шаблон тела сообщения по умолчанию для доставки по электронной почте. Функция ШаблонТекста() Экспорт Возврат НСтр( "ru = 'Сформированы отчеты: @@ -139,14 +139,12 @@ |[ДатаВыполнения(ДЛФ=''DD'')]'"); КонецФункции -// Возвращает шаблон наименования архива по умолчанию -// +// Возвращает шаблон наименования архива по умолчанию. Функция ШаблонИмениАрхива() Экспорт Возврат НСтр("ru = '[НаименованиеРассылки]_[ДатаВыполнения(ДФ=''yyyy-MM-dd'')]'"); // Для формата даты локализация не требуется КонецФункции -// Возвращает набор шаблонов заполнения расписаний регламентного задания -// +// Возвращает набор шаблонов заполнения расписаний регламентного задания. Функция СписокВариантовЗаполненияРасписаний() Экспорт СписокВариантов = Новый СписокЗначений; @@ -166,8 +164,7 @@ Возврат СписокВариантов; КонецФункции -// Преобразует массив сообщений пользователю в одну строку -// +// Преобразует массив сообщений пользователю в одну строку. Функция СтрокаСообщенийПользователю(МассивОшибок = Неопределено, ДобавитьДежурнуюФразу = Истина) Экспорт Если МассивОшибок = Неопределено Тогда МассивОшибокПолучен = Ложь; diff --git a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl index 45f0283e8..eb972f772 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПереопределяемый/Module.bsl @@ -8,31 +8,24 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Позволяет изменить форматы по умолчанию и установить картинки -// +// Позволяет изменить форматы по умолчанию и установить картинки. +// // Параметры: -// СписокФорматов - (СписокЗначений) список форматов -// |- Значение - (ПеречислениеСсылка.ФорматыСохраненияОтчетов) Формат -// |- Представление - (Строка) Представление формата -// |- Пометка - (Булево) Признак того, что формат используется по умолчанию -// |- Картинка - (Картинка) Картинка формата +// СписокФорматов - СписокЗначений - Список форматов. +// * Значение - ПеречислениеСсылка.ФорматыСохраненияОтчетов - Ссылка формата. +// * Представление - Строка - Представление формата. +// * Пометка - Булево - Признак того, что формат используется по умолчанию. +// * Картинка - Картинка - Картинка формата. +// +// Вспомогательные методы: +// РассылкаОтчетов.УстановитьПараметрыФормата() - для изменения параметров формата. // -// Изменить настройки формата можно при помощи процедуры "РассылкаОтчетов.УстановитьПараметрыФормата": -// -// РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, ФорматСсылка, Картинка, ИспользоватьПоУмолчанию); -// Обязательные параметры: -// |- СписокФорматов (...) Передается из параметров процедуры "как есть" -// |- ФорматСсылка (Строка, ПеречислениеСсылка.ФорматыСохраненияОтчетов) Формат -// Необязательные параметры: -// |- Картинка (Картинка) Картинка формата -// |- ИспользоватьПоУмолчанию (Булево) Признак того, что формат используется по умолчанию. -// // Например: -// // РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "HTML4", , Ложь); // РассылкаОтчетов.УстановитьПараметрыФормата(СписокФорматов, "XLS" , , Истина); // -// Пример использования - см. РассылкаОтчетовПовтИсп.СписокФорматов(): +// См. также: +// Другие примеры использования в РассылкаОтчетовПовтИсп.СписокФорматов(). // Процедура ПереопределитьПараметрыФорматов(СписокФорматов) Экспорт @@ -41,55 +34,45 @@ КонецПроцедуры // Позволяет добавить описание кросс объектной связи типов для получателей рассылки. -// -// Использовать данный механизм требуется только в том случае, если: -// 1. Требуется описать и представить несколько типов как один (как в справочнике Пользователи и Группы пользователей). -// 2. Требуется изменить представление типа без изменения синонима метаданных. -// 3. Требуется указать вид контактной информации E-Mail по умолчанию. -// 4. Требуется определить группу контактной информации. // -// Зарегистрировать тип можно при помощи процедуры: -// -// РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, Настройки); -// Параметры: -// ТаблицаТипов (ТаблицаЗначений) - Не меняется -// ДоступныеТипы (Массив) - Не меняется -// Настройки (Структура) - Предустановленные настройки основного типа -// Обязательные параметры: -// |- ОсновнойТип - (Тип) Тип, который будет выступать как основной для -// описываемых получателей -// Необязательные параметры: -// |- ДополнительныйТип - (Тип) Дополнительный тип для описываемых получателей -// |- Представление - (Строка) Представление получателей -// |- ВидКИ - (СправочникСсылка.ВидыКонтактнойИнформации) Основной -// вид или группа контактной информации E-Mail -// |- ПутьФормыВыбора - (Строка) Путь к форме выбора +// Важно: +// Использовать данный механизм требуется только в том случае, если: +// 1. Требуется описать и представить несколько типов как один (как в справочнике Пользователи и Группы пользователей). +// 2. Требуется изменить представление типа без изменения синонима метаданных. +// 3. Требуется указать вид контактной информации E-Mail по умолчанию. +// 4. Требуется определить группу контактной информации. +// +// Параметры: +// ТаблицаТипов - ТаблицаЗначений - Таблица описания типов. +// ДоступныеТипы - Массив - Доступные типы. +// +// Вспомогательные методы: +// РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей() - для регистрации параметров типа. // // Например: +// Настройки = Новый Структура; +// Настройки.Вставить("ОсновнойТип", Тип("СправочникСсылка.Контрагенты")); +// Настройки.Вставить("ВидКИ", Справочники.ВидыКонтактнойИнформации.EmailКонтрагента); +// РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, Настройки); // -// РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, -// Новый Структура("ОсновнойТип, ВидКИ", -// Тип("СправочникСсылка.Контрагенты"), Справочники.ВидыКонтактнойИнформации.EmailКонтрагента -// ) -// ); -// -// Пример использования - см. РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей(): +// См. также: +// Другие примеры использования в РассылкаОтчетовПовтИсп.ТаблицаТиповПолучателей(). // Процедура ПереопределитьТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы) Экспорт - КонецПроцедуры -// Позволяет определить свой обработчик для сохранения табличного документа в формат +// Позволяет определить свой обработчик для сохранения табличного документа в формат. // // Параметры: -// СтандартнаяОбработка (Булево) Признак использования стандартных механизмов подсистемы для сохранения в формат. -// ТабличныйДокумент (ТабличныйДокумент) Сохраняемый табличный документ. -// Формат (ПеречислениеСсылка.ФорматыСохраненияОтчетов) Формат, в котором сохраняется табличный документ. -// ПолноеИмяФайла (Строка) Полное имя файла. -// Передается БЕЗ расширения, если формат был добавлен в прикладной конфигурации. +// СтандартнаяОбработка - Булево - Признак использования стандартных механизмов подсистемы для сохранения в формат. +// ТабличныйДокумент - ТабличныйДокумент - Сохраняемый табличный документ. +// Формат - ПеречислениеСсылка.ФорматыСохраненияОтчетов - Формат, в котором сохраняется табличный документ. +// ПолноеИмяФайла - Строка - Полное имя файла. +// Передается без расширения, если формат был добавлен в прикладной конфигурации. // -// Если используется нестандартная обработка (СтандартнаяОбработка меняется на Ложь), +// Важно: +// Если используется нестандартная обработка (СтандартнаяОбработка меняется на Ложь), // тогда ПолноеИмяФайла должно содержать полное имя файла с расширением. // // Например: @@ -105,15 +88,15 @@ КонецПроцедуры -// Позволяет определить свой обработчик разузлования списка получателей -// +// Позволяет определить свой обработчик разузлования списка получателей. +// // Параметры: -// ПараметрыПолучателей - (Структура) Параметры разузлования получателей рассылки -// Запрос - (Запрос) Запрос, который будет использован, если значение параметра СтандартнаяОбработка останется Истина -// СтандартнаяОбработка - (Булево) Признак использования стандартных механизмов -// Результат - (Соответствие) Получатели с их E-mail адресами -// |- Ключ - (СправочникСсылка.*) Получатель -// |- Значение - (Строка) Набор E-mail адресов в строке с разделителями +// ПараметрыПолучателей - Структура - Параметры разузлования получателей рассылки. +// Запрос - Запрос - Запрос, который будет использован, если значение параметра СтандартнаяОбработка останется Истина. +// СтандартнаяОбработка - Булево - Признак использования стандартных механизмов. +// Результат - Соответствие - Получатели с их E-mail адресами. +// * Ключ - СправочникСсылка - Получатель. +// * Значение - Строка - Набор E-mail адресов в строке с разделителями. // Процедура ПередФормированиемСпискаПолучателейРассылки(ПараметрыПолучателей, Запрос, СтандартнаяОбработка, Результат) Экспорт diff --git a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl index 9a60e3c13..5d3121fc7 100644 --- a/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РассылкаОтчетовПовтИсп/Module.bsl @@ -10,11 +10,11 @@ // Возвращает список значений перечисления "ФорматыСохраненияОтчетов" // // Возвращаемое значение: -// СписокФорматов (СписокЗначений) Список форматов, с пометками на системных форматах по умолчанию -// |- Значение (ПеречислениеСсылка.ФорматыСохраненияОтчетов) Ссылка на описываемый формат -// |- Представление (Строка) Пользовательское представление описываемого формата -// |- Пометка (Булево) Признак использования как формата по умолчанию -// |- Картинка (Картинка) Картинка формата +// СписокФорматов - СписокЗначений - Список форматов, с пометками на системных форматах по умолчанию. +// * Значение - ПеречислениеСсылка.ФорматыСохраненияОтчетов - Ссылка на описываемый формат. +// * Представление - Строка - Пользовательское представление описываемого формата. +// * Пометка - Булево - Признак использования как формата по умолчанию. +// * Картинка - Картинка - Картинка формата. // Функция СписокФорматов() Экспорт СписокФорматов = Новый СписокЗначений; @@ -49,16 +49,16 @@ Возврат СписокФорматов; КонецФункции -// Возвращает типы получателей в разрезах хранения и пользовательского представления этих типов +// Таблица типов получателей в разрезах хранения и пользовательского представления этих типов. // // Возвращаемое значение: -// ТаблицаТипов (ТаблицаЗначений) Таблица типов получателей -// |- ИОМД (СправочникСсылка.ИдентификаторыОбъектовМетаданных) Ссылка, которая хранится в базе данных -// |- ТипПолучателей (ОписаниеТипов) Тип, которым ограничиваются значения списков получателей и исключенных -// |- Представление (Строка) Представление типа для пользователей -// |- ОсновнойВидКИ (СправочникСсылка.ВидыКонтактнойИнформации) вид контактной информации: e-mail, по умолчанию -// |- ГруппаКИ (СправочникСсылка.ВидыКонтактнойИнформации) группа вида контактной информации -// |- ПутьФормыВыбора (Строка) +// ТаблицаТипов - ТаблицаЗначений - Таблица типов получателей +// * ИОМД - СправочникСсылка.ИдентификаторыОбъектовМетаданных - Ссылка, которая хранится в базе данных. +// * ТипПолучателей - ОписаниеТипов - Тип, которым ограничиваются значения списков получателей и исключенных. +// * Представление - Строка - Представление типа для пользователей. +// * ОсновнойВидКИ - СправочникСсылка.ВидыКонтактнойИнформации - Вид контактной информации: e-mail, по умолчанию. +// * ГруппаКИ - СправочникСсылка.ВидыКонтактнойИнформации - Группа вида контактной информации. +// * ПутьФормыВыбора - Строка - Путь к форме выбора. // Функция ТаблицаТиповПолучателей() Экспорт ТаблицаТипов = Новый ТаблицаЗначений; @@ -76,10 +76,10 @@ ДоступныеТипы = Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Получатели.Реквизиты.Получатель.Тип.Типы(); // Параметры справочников "Пользователи" + "Группы пользователей" - РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, - Новый Структура("ОсновнойТип, ДополнительныйТип", - Тип("СправочникСсылка.Пользователи"), - Тип("СправочникСсылка.ГруппыПользователей"))); + НастройкиТипа = Новый Структура; + НастройкиТипа.Вставить("ОсновнойТип", Тип("СправочникСсылка.Пользователи")); + НастройкиТипа.Вставить("ДополнительныйТип", Тип("СправочникСсылка.ГруппыПользователей")); + РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы, НастройкиТипа); // Механизм расширения РассылкаОтчетовПереопределяемый.ПереопределитьТаблицуТиповПолучателей(ТаблицаТипов, ДоступныеТипы); @@ -87,22 +87,19 @@ // Параметры остальных справочников ПустойМассив = Новый Массив; Для Каждого НеиспользованныйТип Из ДоступныеТипы Цикл - РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ПустойМассив, - Новый Структура("ОсновнойТип", НеиспользованныйТип)); + РассылкаОтчетов.ДобавитьЭлементВТаблицуТиповПолучателей(ТаблицаТипов, ПустойМассив, Новый Структура("ОсновнойТип", НеиспользованныйТип)); КонецЦикла; Возврат ТаблицаТипов; КонецФункции -// Получает пустое значение для поиска по таблице "Отчеты" или "ФорматыОтчетов" справочника "РассылкиОтчетов" -// +// Получает пустое значение для поиска по таблице "Отчеты" или "ФорматыОтчетов" справочника "РассылкиОтчетов". Функция ПустоеЗначениеОтчета() Экспорт УстановитьПривилегированныйРежим(Истина); Возврат Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.ФорматыОтчетов.Реквизиты.Отчет.Тип.ПривестиЗначение(); КонецФункции -// Получает заголовок системы, а если он не задан - синоним метаданных конфигурации -// +// Получает заголовок системы, а если он не задан - синоним метаданных конфигурации. Функция ИмяЭтойИнформационнойБазы() Экспорт УстановитьПривилегированныйРежим(Истина); diff --git a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl deleted file mode 100644 index 429116241..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияКлиент/Module.bsl +++ /dev/null @@ -1,29 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Запускает новый сеанс, выполняющий регламентные задания. -// Только для тонкого и обычного клиентов (Web не поддерживается). -// -// Возвращаемое значение: -// Структура -// Отказ - Булево. -// ОписаниеОшибки - Строка. -// -Функция ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий() Экспорт - - Параметры = РегламентныеЗаданияСлужебныйВызовСервера - .ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий(Ложь); - - Если НЕ Параметры.Отказ И Параметры.ТребуетсяОткрытьОтдельныйСеанс Тогда - РегламентныеЗаданияСлужебныйКлиент. - ПопыткаЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий(Параметры); - КонецЕсли; - - Возврат Параметры; - -КонецФункции diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl index 22cc1101f..dfb1530c4 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl +++ b/SSL/src/CommonModules/РегламентныеЗаданияСлужебный/Module.bsl @@ -11,66 +11,11 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( - "РегламентныеЗаданияСлужебный"); - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( "РегламентныеЗаданияСлужебный"); КонецЕсли; - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске"].Добавить( - "РегламентныеЗаданияСлужебный"); - - СерверныеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( - "РегламентныеЗаданияСлужебный"); - -КонецПроцедуры - -// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. -// -// Параметры: -// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления -// общего модуля ОбновлениеИнформационнойБазы. -// -Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "1.2.2.2"; - Обработчик.Процедура = "РегламентныеЗаданияСлужебный.КонвертироватьНастройкиВыполненияРегламентныхЗаданий_1_2_2_2"; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// при запуске конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт - - Если ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - Параметры.Вставить("ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий", - Новый ФиксированнаяСтруктура(ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий(Истина))); - КонецЕсли; - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ДобавитьПараметрыРаботыКлиента(Параметры) Экспорт - - Если ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - Параметры.Вставить("ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий", - Новый ФиксированнаяСтруктура(ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий(Истина))); - КонецЕсли; - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -85,13 +30,6 @@ КонецПроцедуры -Функция ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Экспорт - - Возврат ОбщегоНазначения.ИнформационнаяБазаФайловая() - И НЕ ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости(); - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП @@ -103,358 +41,17 @@ // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальнаяДлительностьВыполненияИсполняющегоФоновогоЗадания"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "МаксимальноеКоличествоИсполняющихФоновыхЗаданий"); КонецЕсли; КонецПроцедуры -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске(Параметры) Экспорт - - ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры); - -КонецПроцедуры - -// Заполняет структуру параметров, необходимых для работы клиентского кода -// конфигурации. -// -// Параметры: -// Параметры - Структура - структура параметров. -// -Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем(Параметры) Экспорт - - ДобавитьПараметрыРаботыКлиента(Параметры); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции для контроля выполнения - -// Определяет, что текущий сеанс выполняет регламентные задания, -// если это не так и указано установить текущий сеанс в этом качестве, -// то производится попытка установки. -// -// Параметры: -// ЗаданияВыполняютсяНормально - Булево - Истина, если нет отклонений в выполнении заданий. -// УстановитьТекущийСеансКакСеансВыполняющийРегламентныеЗадания - Булево - Истина, -// если требуется установить текущий сеанс, -// как сеанс в котором будет происходить выполнение регламентных заданий, -// если не удалось установить, тогда функция вернет Ложь. -// ОписаниеОшибки - Строка - Если НЕ ЗаданияВыполняютсяНормально, тогда описание отклонения: -// либо выполнение долго не начинается, либо выполнение слишком затянулось. -// -// Возвращаемое значение: -// Булево. -// -Функция ТекущийСеансВыполняетРегламентныеЗадания(ЗаданияВыполняютсяНормально = Неопределено, - Знач УстановитьТекущийСеансКакСеансВыполняющийРегламентныеЗадания = Ложь, - ОписаниеОшибки = "") Экспорт - - Если НЕ ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - ЗаданияВыполняютсяНормально = Истина; - ОписаниеОшибки = НСтр("ru = 'Задания выполняются на сервере.'"); - Возврат Ложь; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Состояние = ПолучитьСостояниеВыполненияРегламентныхЗаданий(); - - Сеансы = ПолучитьСеансыИнформационнойБазы(); - НайденСеансВыполняющийЗадания = Ложь; - ТекущийСеансВыполняетРегламентныеЗадания = Ложь; - ЗаданияВыполняютсяНормально = Истина; - - // Поиск сеанса выполняющего регламентные задания, - // установленного в структуре СостояниеВыполненияРегламентныхЗаданий, - // среди активных сеансов - // Поиск текущего сеанса (начало текущего сеанса может понадобится - // для инициализации Структуры). - Для каждого Сеанс Из Сеансы Цикл - Если Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы() Тогда - ТекущийСеанс = Сеанс; - КонецЕсли; - Если Сеанс.НомерСеанса = Состояние.НомерСеанса - И Сеанс.НачалоСеанса = Состояние.НачалоСеанса Тогда - // - НайденныйСеанс = Сеанс; - НайденСеансВыполняющийЗадания = Истина; - ТекущийСеансВыполняетРегламентныеЗадания = (Сеанс.НомерСеанса = НомерСеансаИнформационнойБазы()); - КонецЕсли; - КонецЦикла; - - Если НЕ НайденСеансВыполняющийЗадания И УстановитьТекущийСеансКакСеансВыполняющийРегламентныеЗадания Тогда - МоментТекущегоВремени = ТекущаяДатаСеанса(); - Состояние.НомерСеанса = ТекущийСеанс.НомерСеанса; - Состояние.НачалоСеанса = ТекущийСеанс.НачалоСеанса; - Состояние.ИмяКомпьютера = ИмяКомпьютера(); - Состояние.ИмяПриложения = ТекущийСеанс.ИмяПриложения; - Состояние.ИмяПользователя = ИмяПользователя(); - Состояние.ИдентификаторОчередногоЗадания = Неопределено; - Состояние.НачалоВыполненияОчередногоЗадания = МоментТекущегоВремени; - Состояние.ОкончаниеВыполненияОчередногоЗадания = МоментТекущегоВремени; - СохранитьСостояниеВыполненияРегламентныхЗаданий(Состояние); - НайденСеансВыполняющийЗадания = Истина; - ТекущийСеансВыполняетРегламентныеЗадания = Истина; - КонецЕсли; - - Если НЕ НайденСеансВыполняющийЗадания Тогда - ОписаниеОшибки = НСтр("ru = 'Нет сеанса, выполняющего регламентные задания.'"); - ЗаданияВыполняютсяНормально = Ложь; - // - ИначеЕсли НЕ ЗначениеЗаполнено(Состояние.ОкончаниеВыполненияОчередногоЗадания) Тогда - // Если после завершения очередного задания прошло более часа, значит задержка запуска. - Если ТекущаяДатаСеанса() - 3600 > Состояние.ОкончаниеВыполненияОчередногоЗадания Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполнение регламентных заданий не начинается уже более 1 часа. - |Возможно, требуется проверка и перезапуск сеанса. Выполнение ожидается - | на компьютере: %1, - | в приложении: %2, - | от имени пользователя: %3, - | в сеансе номер: %4.'"), - Строка(Состояние.ИмяКомпьютера), - Строка(Состояние.ИмяПриложения), - Строка(Состояние.ИмяПользователя), - Строка(Состояние.НомерСеанса) ); - ЗаданияВыполняютсяНормально = Ложь; - КонецЕсли; - Иначе - // Если выполнение продолжается более 1 часа, значить она слишком затянулось. - Если ТекущаяДатаСеанса() - 3600 > Состояние.НачалоВыполненияОчередногоЗадания Тогда - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Выполнение регламентного задания происходит непрерывно более 1 часа. - |Возможно, требуется проверка и перезапуск сеанса. Выполнение происходит - | на компьютере: %1, - | в приложении: %2, - | от имени пользователя: %3, - | в сеансе номер: %4.'"), - Строка(Состояние.ИмяКомпьютера), - Строка(Состояние.ИмяПриложения), - Строка(Состояние.ИмяПользователя), - Строка(Состояние.НомерСеанса)); - ЗаданияВыполняютсяНормально = Ложь; - КонецЕсли; - КонецЕсли; - - Возврат ТекущийСеансВыполняетРегламентныеЗадания; - -КонецФункции - -// Проверяет, что сеанс открывший этот дополнительный сеанс для выполнения -// регламентных заданий завершен, если задан. -// -// Параметры: -// ПараметрЗапуска - Строка - значение глобального свойства ПараметрЗапуска, -// требуется указывать, т.к. свойство недоступно на сервере. -// РодительскийСеансЗадан - Булево - возвращает Истина, если родительский сеанс задан, -// иначе возвращает Ложь. -// -// Возвращаемое значение: -// Булево. -// -Функция РодительскийСеансЗаданИЗавершен(Знач ПараметрЗапуска) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - РодительскийСеансЗадан = Ложь; - Если Найти(ПараметрЗапуска, "DoScheduledJobs") <> 0 Тогда - ИндексНомераСеанса = Найти(ПараметрЗапуска, "SessionNumber="); - ИндексНачалаСеанса = Найти(ПараметрЗапуска, "SessionStarted="); - - Если ИндексНомераСеанса <> 0 И - ИндексНачалаСеанса <> 0 И - ИндексНомераСеанса < ИндексНачалаСеанса Тогда - - РодительскийСеансЗадан = Истина; - - Сеансы = ПолучитьСеансыИнформационнойБазы(); - Для каждого Сеанс Из Сеансы Цикл - Если Найти(ПараметрЗапуска, "SessionNumber=" + Сеанс.НомерСеанса) <> 0 И - Найти(ПараметрЗапуска, "SessionStarted=" + Сеанс.НачалоСеанса) <> 0 Тогда - Возврат Ложь; - КонецЕсли; - КонецЦикла; - - Возврат Истина; - КонецЕсли; - КонецЕсли; - - Возврат Ложь; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с регламентными заданиями -// Возвращает настройки выполнения регламентных заданий для файлового режима. -// -// Возвращаемое значение: -// Настройки - Структура. -// -Функция ПолучитьНастройкиВыполненияРегламентныхЗаданий() Экспорт - - Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Настройки = Неопределено; - Иначе - Настройки = Константы.НастройкиВыполненияРегламентныхЗаданий.Получить(); - Настройки = ?(ТипЗнч(Настройки) = Тип("ХранилищеЗначения"), Настройки.Получить(), Неопределено); - КонецЕсли; - - Возврат ПроверитьНастройки(Настройки); - -КонецФункции - -// Устанавливает настройки выполнения регламентных заданий для файлового режима. -// -// Параметры: -// Настройки - Структура. -// -Процедура УстановитьНастройкиВыполненияРегламентныхЗаданий(Настройки) Экспорт - - Настройки = ПроверитьНастройки(Настройки); - - Константы.НастройкиВыполненияРегламентныхЗаданий.Установить(Новый ХранилищеЗначения(Настройки)); - -КонецПроцедуры - -// Эмулирует в тонком клиенте системную процедуру ВыполнитьОбработкуЗаданий(), -// но может применяться и в толстом клиенте. -// -// Место хранения экземпляров фоновых заданий - ВременноеХранилище. -// Время хранения экземпляров - до закрытия сеанса клиента, выполняющего регламентные задания. -// Максимальное количество одновременно хранимых фоновых заданий: 1000. -// -// Идентификатор сеанса, выполняющего регламентные задания находится в структуре -// СостояниеВыполненияРегламентныхЗаданий (ХранилищеЗначения), содержащее структуру -// со свойствами: -// НомерСеанса, НачалоСеанса, ИдентификаторОчередногоЗадания, -// НачалоВыполненияОчередногоЗадания, ОкончаниеВыполненияОчередногоЗадания и др. -// Логика проверки выполнения регламентных заданий в текущем сеансе: -// Если <НомерСеанса> и <НачалоСеанса> совпадают с текущим, -// тогда выполнение в текущем сеансе, если нет, -// тогда проверяется существует ли сеанс в списке сеансов, -// если не существует, тогда выполнение в текущем сеансе, -// если существует тогда нет выполнения в текущем сеансе, а вместо этого -// проверятся период выполнения/простоя. Если "выполняется"/"простаивает" дольше -// 1 час происходит уведомление пользователя (ошибка с соответствующим описанием). -// Логика порядка выполнения заданий. Задания выполняются последовательно, -// регистрируется последнее начатое задание. При новой проверке, проверятся -// задание, следующее за заданием, начатым в прошлый раз, -// чтобы получился эффект параллельности выполнения. -// Логика проверки расписания. Если произошла ошибка тогда используется аварийное -// расписание, иначе - основное. -// -// Параметры: -// ВремяВыполнения - Число(10.0) - время (в секундах) выполнения очередной -// порции регламентных заданий. Если время не задано, будет выполнен -// только один цикл выполнения (до завершения одного фонового -// задания или выполнения всех регламентных заданий без фоновых, -// т.е. только проверка расписания). -// -Процедура ВыполнитьРегламентныеЗадания(ВремяВыполнения = 0) Экспорт - - Если НЕ ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - Возврат; - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - - Если НЕ ТекущийСеансВыполняетРегламентныеЗадания() Тогда - Возврат; - КонецЕсли; - - Состояние = ПолучитьСостояниеВыполненияРегламентныхЗаданий(); - - ВремяВыполнения = ?(ТипЗнч(ВремяВыполнения) = Тип("Число"), ВремяВыполнения, 0); - - Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); - ВыполнениеЗавершено = Ложь; // Определяет, что ВремяВыполнения закончилось, или - // все возможные регламентные задания выполнены. - НачалоВыполнения = ТекущаяДатаСеанса(); - КоличествоВыполненныхЗаданий = 0; - ФоновоеЗаданиеВыполнялось = Ложь; - ИдентификаторПоследнегоЗадания = Состояние.ИдентификаторОчередногоЗадания; - - // Количество заданий проверяется каждый раз при начале выполнения, - // т.к. задания могут быть удалены в другом сеансе, а тогда будет зацикливание. - Пока НЕ ВыполнениеЗавершено И Задания.Количество() > 0 Цикл - ПервоеЗаданиеНайдено = (ИдентификаторПоследнегоЗадания = Неопределено); - ОчередноеЗаданиеНайдено = Ложь; - Для каждого Задание ИЗ Задания Цикл - // Завершение выполнения, если: - // а) время задано и вышло; - // б) время не задано и хоть одно фоновое задание выполнено; - // в) время не задано и все регламентные задания выполнены по количеству. - Если ( ВремяВыполнения = 0 И - ( ФоновоеЗаданиеВыполнялось ИЛИ - КоличествоВыполненныхЗаданий >= Задания.Количество() ) ) ИЛИ - ( ВремяВыполнения <> 0 И - НачалоВыполнения + ВремяВыполнения <= ТекущаяДатаСеанса() ) Тогда - ВыполнениеЗавершено = Истина; - Прервать; - КонецЕсли; - Если НЕ ПервоеЗаданиеНайдено Тогда - Если Строка(Задание.УникальныйИдентификатор) = ИдентификаторПоследнегоЗадания Тогда - // Найдено последнее выполненное регламентное задание, значит следующее - // регламентное задание нужно проверять на необходимость выполнения фонового задания. - ПервоеЗаданиеНайдено = Истина; - КонецЕсли; - // Если первое регламентное задание, которое нужно проверить на необходимость - // выполнения фонового задания еще не найдено, тогда текущее задание пропускается. - Продолжить; - КонецЕсли; - ОчередноеЗаданиеНайдено = Истина; - КоличествоВыполненныхЗаданий = КоличествоВыполненныхЗаданий + 1; - Состояние.ИдентификаторОчередногоЗадания = Строка(Задание.УникальныйИдентификатор); - Состояние.НачалоВыполненияОчередногоЗадания = ТекущаяДатаСеанса(); - Состояние.ОкончаниеВыполненияОчередногоЗадания = '00010101'; - СохранитьСостояниеВыполненияРегламентныхЗаданий(Состояние, - "ИдентификаторОчередногоЗадания, - |НачалоВыполненияОчередногоЗадания, - |ОкончаниеВыполненияОчередногоЗадания"); - Если Задание.Использование Тогда - ВыполнитьРегламентноеЗадание = Ложь; - СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); - - Если СвойстваПоследнегоФоновогоЗадания <> Неопределено И - СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно Тогда - // Проверка аварийного расписания. - Если СвойстваПоследнегоФоновогоЗадания.ПопыткаЗапуска <= Задание.КоличествоПовторовПриАварийномЗавершении Тогда - Если СвойстваПоследнегоФоновогоЗадания.Конец + Задание.ИнтервалПовтораПриАварийномЗавершении <= ТекущаяДатаСеанса() Тогда - // Повторный запуск фонового задания по регламентному заданию. - ВыполнитьРегламентноеЗадание = Истина; - КонецЕсли; - КонецЕсли; - Иначе - // Проверяем стандартное расписание. - ВыполнитьРегламентноеЗадание = Задание.Расписание.ТребуетсяВыполнение( - ТекущаяДатаСеанса(), - ?(СвойстваПоследнегоФоновогоЗадания = Неопределено, '00010101', СвойстваПоследнегоФоновогоЗадания.Начало), - ?(СвойстваПоследнегоФоновогоЗадания = Неопределено, '00010101', СвойстваПоследнегоФоновогоЗадания.Конец )); - КонецЕсли; - Если ВыполнитьРегламентноеЗадание Тогда - ФоновоеЗаданиеВыполнялось = ВыполнитьРегламентноеЗадание(Задание); - КонецЕсли; - КонецЕсли; - Состояние.ОкончаниеВыполненияОчередногоЗадания = ТекущаяДатаСеанса(); - СохранитьСостояниеВыполненияРегламентныхЗаданий(Состояние, "ОкончаниеВыполненияОчередногоЗадания"); - КонецЦикла; - // Если последнее выполненное задание найти не удалось, тогда - // его Идентификатор сбрасывается, - // чтобы начать проверку регламентных заданий, начиная с первого. - ИдентификаторПоследнегоЗадания = Неопределено; - КонецЦикла; - -КонецПроцедуры - // Предназначена для "ручного" немедленного выполнения процедуры регламентного задания // либо в сеансе клиента (в файловой ИБ), либо в фоновом задании на сервере (в серверной ИБ) // Применяется в любом режиме соединения @@ -490,26 +87,23 @@ Задание = РегламентныеЗаданияСервер.ПолучитьРегламентноеЗадание(Задание); Запуск = Ложь; - Если ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - Запуск = ВыполнитьРегламентноеЗадание(Задание, Истина, МоментЗапуска, МоментОкончания, НомерСеанса, НачалоСеанса); - Иначе - СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); - Если СвойстваПоследнегоФоновогоЗадания <> Неопределено - И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда - // - МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало; - Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда - ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование; - Иначе - ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание); - КонецЕсли; + СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); + + Если СвойстваПоследнегоФоновогоЗадания <> Неопределено + И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда + + МоментЗапуска = СвойстваПоследнегоФоновогоЗадания.Начало; + Если ЗначениеЗаполнено(СвойстваПоследнегоФоновогоЗадания.Наименование) Тогда + ПредставлениеФоновогоЗадания = СвойстваПоследнегоФоновогоЗадания.Наименование; Иначе - НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); - ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); - ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); - МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; - Запуск = Истина; + ПредставлениеФоновогоЗадания = ПредставлениеРегламентногоЗадания(Задание); КонецЕсли; + Иначе + НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Запуск вручную: %1'"), ПредставлениеРегламентногоЗадания(Задание)); + ФоновоеЗадание = ФоновыеЗадания.Выполнить(Задание.Метаданные.ИмяМетода, Задание.Параметры, Строка(Задание.УникальныйИдентификатор), НаименованиеФоновогоЗадания); + ИдентификаторФоновогоЗадания = Строка(ФоновоеЗадание.УникальныйИдентификатор); + МоментЗапуска = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ФоновоеЗадание.УникальныйИдентификатор).Начало; + Запуск = Истина; КонецЕсли; ПроцедураУжеВыполняется = НЕ Запуск; @@ -564,32 +158,6 @@ КонецФункции -// Возвращает значение флажка настройки выполнения регламентных заданий. -// -// Возвращаемое значение: -// Булево. -// -Функция НужноУведомлятьОНекорректномВыполненииРегламентныхЗаданий(ПериодУведомления) Экспорт - - УстановитьПривилегированныйРежим(Истина); - - УведомлятьОНекорректномСостоянии = Ложь; - - Если ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() - И НЕ СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - - Настройки = ПолучитьНастройкиВыполненияРегламентныхЗаданий(); - ПериодУведомления = Настройки.ПериодУведомленияОНекорректномВыполненииРегламентныхЗаданий; - ПериодУведомления = ?(ПериодУведомления <= 0, 1, ПериодУведомления); - УведомлятьОНекорректномСостоянии = Настройки.УведомлятьОНекорректномВыполненииРегламентныхЗаданий; - Иначе - ПериодУведомления = 1; - КонецЕсли; - - Возврат УведомлятьОНекорректномСостоянии; - -КонецФункции - // Возвращает многострочную Строку содержащую Сообщения и ОписаниеИнформацииОбОшибке, // последнее фоновое задание найдено по идентификатору регламентного задания // и сообщения/ошибки есть. @@ -614,101 +182,6 @@ КонецФункции -// Возвращает параметры запуска отдельного сеанса выполнения регламентных заданий. -// -// Параметры: -// ПоНастройкеАвтоОткрытия - Булево - открывать сеанс, если настроен -// автоматический запуск отдельного сеанса и не серверная ИБ и не Веб-клиент и -// сеанс уже не открыт. В других случаях устанавливается Отказ. -// -// Возвращаемое значение: -// Структура - ТребуетсяОткрытьОтдельныйСеанс - Булево - Истина. -// ДополнительныеПараметрыКоманднойСтроки - Строка - дополнительные параметры командной строки для -// запуска сеанса выполнения регламентных заданий. -// ВыполненаПопыткаОткрытия - Булево - Ложь, для использования в вызывающей процедуре. -// УведомлятьОНекорректномВыполнении - Булево. -// ПериодУведомления - Число. -// Отказ - Булево. -// ОписаниеОшибки - Строка. -// -Функция ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий(Знач ПоНастройкеАвтоОткрытия = Ложь) Экспорт - - Результат = Новый Структура; - Результат.Вставить("ТребуетсяОткрытьОтдельныйСеанс", Ложь); - Результат.Вставить("ВыполненаПопыткаОткрытия", Ложь); - Результат.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); - Результат.Вставить("УведомлятьОНекорректномВыполнении", Ложь); - Результат.Вставить("ПериодУведомления", Неопределено); - Результат.Вставить("Отказ", Ложь); - Результат.Вставить("ОписаниеОшибки", ""); - - Если ПоНастройкеАвтоОткрытия Тогда - Результат.Вставить("ТекущийПользовательАдминистратор", Пользователи.ЭтоПолноправныйПользователь(, Истина, Ложь)); - КонецЕсли; - - УстановитьПривилегированныйРежим(Истина); - Результат.УведомлятьОНекорректномВыполнении = НужноУведомлятьОНекорректномВыполненииРегламентныхЗаданий(Результат.ПериодУведомления); - - Настройки = ПолучитьНастройкиВыполненияРегламентныхЗаданий(); - Если ПоНастройкеАвтоОткрытия И НЕ Настройки.АвтоматическиЗапускатьОтдельныйСеансДляВыполненияРегламентныхЗаданий Тогда - Возврат Результат; - КонецЕсли; - - Если НЕ ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - - Если ПоНастройкеАвтоОткрытия Тогда - Возврат Результат; - Иначе - Результат.Отказ = Истина; - Результат.ОписаниеОшибки = НСтр("ru = 'Регламентные задания выполняются на сервере.'"); - Возврат Результат; - КонецЕсли; - - ИначеЕсли СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации() Тогда - - Если ПоНастройкеАвтоОткрытия Тогда - Возврат Результат; - Иначе - Результат.Отказ = Истина; - Результат.ОписаниеОшибки = - НСтр("ru = 'В базовой версии конфигурации отдельный сеанс - |для выполнения регламентных заданий недоступен.'"); - Возврат Результат; - КонецЕсли; - КонецЕсли; - - ЗаданияВыполняютсяНормально = Неопределено; - ТекущийСеансВыполняетРегламентныеЗадания(ЗаданияВыполняютсяНормально); - Если ЗаданияВыполняютсяНормально Тогда - Если ПоНастройкеАвтоОткрытия Тогда - Возврат Результат; - Иначе - Результат.Отказ = Истина; - Результат.ОписаниеОшибки = НСтр("ru = 'Сеанс, выполняющий регламентные задания, уже открыт.'"); - Возврат Результат; - КонецЕсли; - КонецЕсли; - - НомерТекущегоСеанса = НомерСеансаИнформационнойБазы(); - // Определение начала текущего сеанса. - НачалоТекущегоСеанса = '00010101'; - Сеансы = ПолучитьСеансыИнформационнойБазы(); - Для каждого Сеанс Из Сеансы Цикл - Если Сеанс.НомерСеанса = НомерТекущегоСеанса Тогда - НачалоТекущегоСеанса = Сеанс.НачалоСеанса; - Прервать; - КонецЕсли; - КонецЦикла; - Результат.ДополнительныеПараметрыКоманднойСтроки = """" - + " /C""DoScheduledJobs SkipMessageBox AloneIBSession From1C" - + "SessionNumber=" + НомерТекущегоСеанса + " SessionStarted=" + НачалоТекущегоСеанса + """"; - - Результат.ТребуетсяОткрытьОтдельныйСеанс = Истина; - - Возврат Результат; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с фоновыми заданиями @@ -719,11 +192,6 @@ // Процедура ОтменитьФоновоеЗадание(Идентификатор) Экспорт - Если ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - ВызватьИсключение( НСтр("ru ='Фоновые задания не используются - |в файловой информационной базе.'")); - КонецЕсли; - ВызватьИсключениеЕслиНетПраваАдминистрирования(); УстановитьПривилегированныйРежим(Истина); @@ -732,19 +200,19 @@ Если МассивФоновыхЗаданий.Количество() = 1 Тогда ФоновоеЗадание = МассивФоновыхЗаданий[0]; Иначе - ВызватьИсключение( НСтр("ru = 'Фоновое задание не найдено на сервере.'") ); + ВызватьИсключение НСтр("ru = 'Фоновое задание не найдено на сервере.'"); КонецЕсли; Если ФоновоеЗадание.Состояние <> СостояниеФоновогоЗадания.Активно Тогда - ВызватьИсключение( НСтр("ru = 'Задание не выполняется, его нельзя отменить.'") ); + ВызватьИсключение НСтр("ru = 'Задание не выполняется, его нельзя отменить.'"); КонецЕсли; ФоновоеЗадание.Отменить(); КонецПроцедуры -// "Эмулирует" функцию ФоновыеЗадания.ПолучитьФоновыеЗадания() для файловой ИБ. -// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). +// Возвращает таблицу свойств фоновых заданий. +// Структуру таблицы смотри в функции ПустаяТаблицаСвойствФоновыхЗаданий(). // // Параметры: // Отбор - Структура - допустимые поля: @@ -761,7 +229,7 @@ Таблица = ПустаяТаблицаСвойствФоновыхЗаданий(); - Если Отбор <> Неопределено И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания") Тогда Отбор.Удалить("ПолучитьПоследнееФоновоеЗаданиеРегламентногоЗадания"); ПолучитьПоследнее = Истина; Иначе @@ -771,66 +239,76 @@ РегламентноеЗадание = Неопределено; // Добавление истории фоновых заданий, полученных с сервера. - Если НЕ ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий() Тогда - Если Отбор <> Неопределено И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда - МассивФоновыхЗаданий = Новый Массив; - Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); - Если РегламентноеЗадание <> Неопределено Тогда - ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; - Если ПолучитьПоследнее И ПоследнееФоновоеЗадание <> Неопределено Тогда - МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - Иначе - ПервыйОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание); - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(ПервыйОтбор); - ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); - КонецЕсли; - КонецЕсли; - Если НЕ ПолучитьПоследнее ИЛИ МассивФоновыхЗаданий.Количество() = 0 Тогда - ВторойОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания); - ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗадания.ПолучитьФоновыеЗадания(ВторойОтбор), Таблица); - КонецЕсли; - Если ПолучитьПоследнее Тогда - Возврат Таблица; - КонецЕсли; - Иначе - ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; - Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл - ВсеИдентификаторыРегламентныхЗаданий.Вставить( - Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); - КонецЦикла; - Для каждого ТекущееЗадание Из ФоновыеЗадания.ПолучитьФоновыеЗадания() Цикл - Если ТекущееЗадание.РегламентноеЗадание = Неопределено - И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда - - МассивФоновыхЗаданий.Добавить(ТекущееЗадание); - КонецЕсли; - КонецЦикла; + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + ТекущийОтбор = Новый Структура("Ключ", Отбор.ИдентификаторРегламентногоЗадания); + ФоновыеЗаданияЗапущенныеВручную = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + Если РегламентноеЗадание <> Неопределено Тогда + ПоследнееФоновоеЗадание = РегламентноеЗадание.ПоследнееЗадание; КонецЕсли; + Если НЕ ПолучитьПоследнее ИЛИ ПоследнееФоновоеЗадание = Неопределено Тогда + ТекущийОтбор = Новый Структура("РегламентноеЗадание", РегламентноеЗадание); + АвтоматическиеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(ТекущийОтбор); + КонецЕсли; + Если ПолучитьПоследнее Тогда + Если ПоследнееФоновоеЗадание = Неопределено Тогда + ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве(АвтоматическиеФоновыеЗадания); + КонецЕсли; + + ПоследнееФоновоеЗадание = ПоследнееФоновоеЗаданиеВМассиве( + ФоновыеЗаданияЗапущенныеВручную, ПоследнееФоновоеЗадание); + + Если ПоследнееФоновоеЗадание <> Неопределено Тогда + МассивФоновыхЗаданий = Новый Массив; + МассивФоновыхЗаданий.Добавить(ПоследнееФоновоеЗадание); + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); + КонецЕсли; + Возврат Таблица; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(ФоновыеЗаданияЗапущенныеВручную, Таблица); + ДобавитьСвойстваФоновыхЗаданий(АвтоматическиеФоновыеЗадания, Таблица); Иначе - Если Отбор = Неопределено Тогда - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); - Иначе - Если Отбор.Свойство("Идентификатор") Тогда - Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); - Отбор.Удалить("Идентификатор"); + МассивФоновыхЗаданий = Новый Массив; + ВсеИдентификаторыРегламентныхЗаданий = Новый Соответствие; + Для каждого ТекущееЗадание Из РегламентныеЗадания.ПолучитьРегламентныеЗадания() Цикл + ВсеИдентификаторыРегламентныхЗаданий.Вставить( + Строка(ТекущееЗадание.УникальныйИдентификатор), Истина); + КонецЦикла; + ВсеФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Для каждого ТекущееЗадание Из ВсеФоновыеЗадания Цикл + Если ТекущееЗадание.РегламентноеЗадание = Неопределено + И ВсеИдентификаторыРегламентныхЗаданий[ТекущееЗадание.Ключ] = Неопределено Тогда + + МассивФоновыхЗаданий.Добавить(ТекущееЗадание); КонецЕсли; - МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); - Если Отбор.Свойство("УникальныйИдентификатор") Тогда - Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); - Отбор.Удалить("УникальныйИдентификатор"); - КонецЕсли; - КонецЕсли; + КонецЦикла; ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(Отбор) Тогда + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(); + Иначе + Если Отбор.Свойство("Идентификатор") Тогда + Отбор.Вставить("УникальныйИдентификатор", Новый УникальныйИдентификатор(Отбор.Идентификатор)); + Отбор.Удалить("Идентификатор"); + КонецЕсли; + МассивФоновыхЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); + Если Отбор.Свойство("УникальныйИдентификатор") Тогда + Отбор.Вставить("Идентификатор", Строка(Отбор.УникальныйИдентификатор)); + Отбор.Удалить("УникальныйИдентификатор"); + КонецЕсли; + КонецЕсли; + ДобавитьСвойстваФоновыхЗаданий(МассивФоновыхЗаданий, Таблица); КонецЕсли; - Если Отбор <> Неопределено И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда + Если ЗначениеЗаполнено(Отбор) И Отбор.Свойство("ИдентификаторРегламентногоЗадания") Тогда РегламентныеЗаданияДляОбработки = Новый Массив; Если Отбор.ИдентификаторРегламентногоЗадания <> "" Тогда Если РегламентноеЗадание = Неопределено Тогда - РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); + РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору( + Новый УникальныйИдентификатор(Отбор.ИдентификаторРегламентногоЗадания)); КонецЕсли; Если РегламентноеЗадание <> Неопределено Тогда РегламентныеЗаданияДляОбработки.Добавить(РегламентноеЗадание); @@ -840,42 +318,10 @@ РегламентныеЗаданияДляОбработки = РегламентныеЗадания.ПолучитьРегламентныеЗадания(); КонецЕсли; - // Добавление и сохранение состояний регламентных заданий - Для каждого РегламентноеЗадание Из РегламентныеЗаданияДляОбработки Цикл - ИдентификаторРегламентногоЗадания = Строка(РегламентноеЗадание.УникальныйИдентификатор); - Свойства = ХранилищеОбщихНастроек.Загрузить("СостояниеРегламентногоЗадания_" + ИдентификаторРегламентногоЗадания, , , ""); - Свойства = ?(ТипЗнч(Свойства) = Тип("ХранилищеЗначения"), Свойства.Получить(), Неопределено); - - Если ТипЗнч(Свойства) = Тип("Структура") - И Свойства.ИдентификаторРегламентногоЗадания = ИдентификаторРегламентногоЗадания - И Таблица.НайтиСтроки(Новый Структура("Идентификатор, НаСервере", Свойства.Идентификатор, Свойства.НаСервере)).Количество() = 0 Тогда - - Если Свойства.НаСервере Тогда - ХранилищеОбщихНастроек.Сохранить("СостояниеРегламентногоЗадания_" + ИдентификаторРегламентногоЗадания, , Неопределено, , ""); - Иначе - Если Свойства.Состояние = СостояниеФоновогоЗадания.Активно Тогда - НайденСеансВыполняющийЗадания = Ложь; - Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл - Если Сеанс.НомерСеанса = Свойства.НомерСеанса - И Сеанс.НачалоСеанса = Свойства.НачалоСеанса Тогда - НайденСеансВыполняющийЗадания = НомерСеансаИнформационнойБазы() <> Сеанс.НомерСеанса; - Прервать; - КонецЕсли; - КонецЦикла; - Если НЕ НайденСеансВыполняющийЗадания Тогда - Свойства.Конец = ТекущаяДатаСеанса(); - Свойства.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно; - Свойства.ОписаниеИнформацииОбОшибке = НСтр("ru = 'Не найден сеанс, выполняющий процедуру регламентного задания.'"); - КонецЕсли; - КонецЕсли; - ЗаполнитьЗначенияСвойств(Таблица.Добавить(), Свойства); - КонецЕсли; - КонецЕсли; - КонецЦикла; Таблица.Сортировать("Начало Убыв, Конец Убыв"); // Отбор фоновых заданий. - Если Отбор <> Неопределено Тогда + Если ЗначениеЗаполнено(Отбор) Тогда Начало = Неопределено; Конец = Неопределено; Состояние = Неопределено; @@ -899,7 +345,7 @@ Иначе Строки = Таблица; КонецЕсли; - // Выполнение дополнительной фильтрации по периоду и состоянию (если отбор определен). + // Выполнение дополнительного отбора по периоду и состоянию (если отбор определен). НомерЭлемента = Строки.Количество() - 1; Пока НомерЭлемента >= 0 Цикл Если Начало <> Неопределено И Начало > Строки[НомерЭлемента].Начало ИЛИ @@ -986,9 +432,6 @@ СвойстваФоновогоЗадания = ТаблицаСвойствФоновыхЗаданий[ТаблицаСвойствФоновыхЗаданий.Количество()-1]; КонецЕсли; - СохраняемоеЗначение = Новый ХранилищеЗначения(?(СвойстваФоновогоЗадания = Неопределено, Неопределено, ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СвойстваФоновогоЗадания))); - ХранилищеОбщихНастроек.Сохранить("СостояниеРегламентногоЗадания_" + ИдентификаторРегламентногоЗадания, , СохраняемоеЗначение, , ""); - Возврат СвойстваФоновогоЗадания; КонецФункции @@ -1044,7 +487,6 @@ Функция ПустаяТаблицаСвойствФоновыхЗаданий() НоваяТаблица = Новый ТаблицаЗначений; - НоваяТаблица.Колонки.Добавить("НаСервере", Новый ОписаниеТипов("Булево")); НоваяТаблица.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); НоваяТаблица.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); НоваяТаблица.Колонки.Добавить("Ключ", Новый ОписаниеТипов("Строка")); @@ -1065,218 +507,6 @@ КонецФункции -// Предназначена для заполнения/восстановления структуры свойств -// настроек, хранимых в структуре "Состояние" свойства Настройки. -// -// Параметры: -// Настройки - Неопределено, Структура. -// -// Возвращаемое значение: -// Структура - обновленные настройки. -// -Функция ПроверитьНастройки(Знач Настройки = Неопределено) - - НоваяСтруктураНастроек = Новый Структура(); - // Если нужно и можно, то при запуске клиентского приложения автоматически открывать сеанс выполнения регламентных заданий. - НоваяСтруктураНастроек.Вставить("АвтоматическиЗапускатьОтдельныйСеансДляВыполненияРегламентныхЗаданий", Ложь); - // Если задания не выполняются или выполнение "висит", уведомлять пользователя. - НоваяСтруктураНастроек.Вставить("УведомлятьОНекорректномВыполненииРегламентныхЗаданий", Ложь); - // Период, минут. - НоваяСтруктураНастроек.Вставить("ПериодУведомленияОНекорректномВыполненииРегламентныхЗаданий", 15); - - // Копирование существующих свойств. - Если ТипЗнч(Настройки) = Тип("Структура") Тогда - Для каждого КлючИзначение Из НоваяСтруктураНастроек Цикл - Если Настройки.Свойство(КлючИзначение.Ключ) Тогда - Если ТипЗнч(НоваяСтруктураНастроек[КлючИзначение.Ключ]) = ТипЗнч(Настройки[КлючИзначение.Ключ]) Тогда - НоваяСтруктураНастроек[КлючИзначение.Ключ] = Настройки[КлючИзначение.Ключ]; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Если НЕ (НоваяСтруктураНастроек.ПериодУведомленияОНекорректномВыполненииРегламентныхЗаданий >= 1 И - НоваяСтруктураНастроек.ПериодУведомленияОНекорректномВыполненииРегламентныхЗаданий <= 99 ) Тогда - - НоваяСтруктураНастроек.ПериодУведомленияОНекорректномВыполненииРегламентныхЗаданий = 15; - КонецЕсли; - - Возврат НоваяСтруктураНастроек; - -КонецФункции - -// Возвращает структуру, описывающую состояние выполнения регламентных заданий. -Функция ПолучитьСостояниеВыполненияРегламентныхЗаданий(Заблокировать = Ложь) - - // Подготовка данных для проверки или начальной установки свойств прочитанного состояния. - НоваяСтруктура = Новый Структура(); - // Хранение истории выполнения фоновых заданий. - НоваяСтруктура.Вставить("НомерСеанса", 0); - НоваяСтруктура.Вставить("НачалоСеанса", '00010101'); - НоваяСтруктура.Вставить("ИмяКомпьютера", ""); - НоваяСтруктура.Вставить("ИмяПриложения", ""); - НоваяСтруктура.Вставить("ИмяПользователя", ""); - НоваяСтруктура.Вставить("ИдентификаторОчередногоЗадания", ""); - НоваяСтруктура.Вставить("НачалоВыполненияОчередногоЗадания", '00010101'); - НоваяСтруктура.Вставить("ОкончаниеВыполненияОчередногоЗадания", '00010101'); - - Состояние = ХранилищеОбщихНастроек.Загрузить("СостояниеВыполненияРегламентныхЗаданий", , , ""); - Состояние = ?(ТипЗнч(Состояние) = Тип("ХранилищеЗначения"), Состояние.Получить(), Неопределено); - - // Копирование существующих свойств. - Если ТипЗнч(Состояние) = Тип(НоваяСтруктура) Тогда - Для каждого КлючИзначение Из НоваяСтруктура Цикл - Если Состояние.Свойство(КлючИзначение.Ключ) Тогда - Если ТипЗнч(НоваяСтруктура[КлючИзначение.Ключ]) = ТипЗнч(Состояние[КлючИзначение.Ключ]) Тогда - НоваяСтруктура[КлючИзначение.Ключ] = Состояние[КлючИзначение.Ключ]; - КонецЕсли; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Возврат НоваяСтруктура; - -КонецФункции - -// Сохраняет в структуре СостояниеВыполненияРегламентныхЗаданий переданное состояние. -// -// Параметры: -// Состояние - Структура - измененное значение функции ПолучитьСостояниеВыполненияРегламентныхЗаданий(). -// -// ИзмененныеСвойства - Неопределено - требуется записать состояние, иначе сохранить только указанные свойства. -// Строка - список имен свойств, разделенный запятыми, -// которые необходимо сохранить. -// -Процедура СохранитьСостояниеВыполненияРегламентныхЗаданий(Состояние, Знач ИзмененныеСвойства = Неопределено) - - Если ИзмененныеСвойства <> Неопределено Тогда - ТекущееСостояние = ПолучитьСостояниеВыполненияРегламентныхЗаданий(); - ЗаполнитьЗначенияСвойств(ТекущееСостояние, Состояние, ИзмененныеСвойства); - Состояние = ТекущееСостояние; - КонецЕсли; - - ХранилищеОбщихНастроек.Сохранить("СостояниеВыполненияРегламентныхЗаданий", , Новый ХранилищеЗначения(Состояние), , ""); - -КонецПроцедуры - -// Выполняет регламентное задание в режиме файловой информационной базе. -// Используется в процедуре ВыполнитьРегламентныеЗадания(). -// -// Параметры: -// Состояние - Структура. -// Задание - РегламентноеЗадание. -// ЗапускВручную - Булево. -// МоментЗапуска - Неопределено, Дата - устанавливает момент запуска или возвращает момент запуска. -// МоментОкончания - Неопределено, Дата - возвращает момент окончание. -// -// Возвращаемое значение -// Булево. Если Ложь, значит процедура регламентного задания уже выполняется. -// -Функция ВыполнитьРегламентноеЗадание(Знач Задание, - Знач ЗапускВручную = Ложь, - МоментЗапуска = Неопределено, - МоментОкончания = Неопределено, - НомерСеанса = Неопределено, - НачалоСеанса = Неопределено) - - СвойстваПоследнегоФоновогоЗадания = ПолучитьСвойстваПоследнегоФоновогоЗаданияВыполненияРегламентногоЗадания(Задание); - - Если СвойстваПоследнегоФоновогоЗадания <> Неопределено - И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно Тогда - - НомерСеанса = СвойстваПоследнегоФоновогоЗадания.НомерСеанса; - НачалоСеанса = СвойстваПоследнегоФоновогоЗадания.НачалоСеанса; - Возврат Ложь; - КонецЕсли; - - ИмяМетода = Задание.Метаданные.ИмяМетода; - НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ?(ЗапускВручную, - НСтр("ru = 'Запуск вручную: %1'"), - НСтр("ru = 'Автозапуск: %1'")), - ПредставлениеРегламентногоЗадания(Задание)); - - МоментЗапуска = ?(ТипЗнч(МоментЗапуска) <> Тип("Дата") ИЛИ НЕ ЗначениеЗаполнено(МоментЗапуска), ТекущаяДатаСеанса(), МоментЗапуска); - - // Создание свойств нового фонового псевдо-задания. - СвойстваФоновогоЗадания = ПустаяТаблицаСвойствФоновыхЗаданий().Добавить(); - СвойстваФоновогоЗадания.Идентификатор = Строка(Новый УникальныйИдентификатор()); - СвойстваФоновогоЗадания.ПопыткаЗапуска = ?( - СвойстваПоследнегоФоновогоЗадания <> Неопределено - И СвойстваПоследнегоФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно, - СвойстваПоследнегоФоновогоЗадания.ПопыткаЗапуска + 1, - 1); - СвойстваФоновогоЗадания.Наименование = НаименованиеФоновогоЗадания; - СвойстваФоновогоЗадания.ИдентификаторРегламентногоЗадания = Строка(Задание.УникальныйИдентификатор); - СвойстваФоновогоЗадания.Расположение = "\\" + ИмяКомпьютера(); - СвойстваФоновогоЗадания.ИмяМетода = ИмяМетода; - СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Активно; - СвойстваФоновогоЗадания.Начало = МоментЗапуска; - СвойстваФоновогоЗадания.НомерСеанса = НомерСеансаИнформационнойБазы(); - - Для каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл - Если Сеанс.НомерСеанса = СвойстваФоновогоЗадания.НомерСеанса Тогда - СвойстваФоновогоЗадания.НачалоСеанса = Сеанс.НачалоСеанса; - Прервать; - КонецЕсли; - КонецЦикла; - - // Подготовка команды для выполнения метода вместо фонового задания. - СтрокаПараметров = ""; - Индекс = 0; - Пока Индекс < Задание.Параметры.Количество() Цикл - СтрокаПараметров = СтрокаПараметров + "Задание.Параметры[" + Индекс + "]"; - Если Индекс < (Задание.Параметры.Количество()-1) Тогда - СтрокаПараметров = СтрокаПараметров + ","; - КонецЕсли; - Индекс = Индекс + 1; - КонецЦикла; - - // Сохранение информации о запуске. - СохраняемоеЗначение = Новый ХранилищеЗначения(ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СвойстваФоновогоЗадания)); - ХранилищеОбщихНастроек.Сохранить("СостояниеРегламентногоЗадания_" + Строка(Задание.УникальныйИдентификатор), , СохраняемоеЗначение, , ""); - - ПолучитьСообщенияПользователю(Истина); - Попытка - // Здесь нет возможности выполнения произвольного кода, т.к. метод берется из метаданных регламентного задания. - Выполнить("" + ИмяМетода + "(" + СтрокаПараметров + ");"); - СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.Завершено; - Исключение - СвойстваФоновогоЗадания.Состояние = СостояниеФоновогоЗадания.ЗавершеноАварийно; - СвойстваФоновогоЗадания.ОписаниеИнформацииОбОшибке = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); - КонецПопытки; - - // Обслуживание ошибок выполнения процедуры регламентного задания. - Пока ТранзакцияАктивна() Цикл - ОтменитьТранзакцию(); - КонецЦикла; - - // Фиксация окончания выполнения метода. - МоментОкончания = ТекущаяДатаСеанса(); - СвойстваФоновогоЗадания.Конец = МоментОкончания; - СвойстваФоновогоЗадания.СообщенияПользователю = Новый Массив; - Для каждого Сообщение Из ПолучитьСообщенияПользователю() Цикл - СвойстваФоновогоЗадания.СообщенияПользователю.Добавить(Сообщение); - КонецЦикла; - ПолучитьСообщенияПользователю(Истина); - - Свойства = ХранилищеОбщихНастроек.Загрузить("СостояниеРегламентногоЗадания_" + Строка(Задание.УникальныйИдентификатор), , , ""); - Свойства = ?(ТипЗнч(Свойства) = Тип("ХранилищеЗначения"), Свойства.Получить(), Неопределено); - - Если ТипЗнч(Свойства) <> Тип("Структура") - ИЛИ НЕ Свойства.Свойство("НомерСеанса") - ИЛИ НЕ Свойства.Свойство("НачалоСеанса") - ИЛИ( Свойства.НомерСеанса = СвойстваФоновогоЗадания.НомерСеанса - И Свойства.НачалоСеанса = СвойстваФоновогоЗадания.НачалоСеанса) Тогда - // Маловероятной перезаписи из-за отсутствия блокировки не произошло, поэтому можно записать свойства. - СохраняемоеЗначение = Новый ХранилищеЗначения(ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(СвойстваФоновогоЗадания)); - ХранилищеОбщихНастроек.Сохранить("СостояниеРегламентногоЗадания_" + Строка(Задание.УникальныйИдентификатор), , СохраняемоеЗначение, , ""); - КонецЕсли; - - Возврат Истина; - -КонецФункции - Процедура ДобавитьСвойстваФоновыхЗаданий(Знач МассивФоновыхЗаданий, Знач ТаблицаСвойствФоновыхЗаданий) Индекс = МассивФоновыхЗаданий.Количество() - 1; @@ -1284,7 +514,6 @@ ФоновоеЗадание = МассивФоновыхЗаданий[Индекс]; Строка = ТаблицаСвойствФоновыхЗаданий.Добавить(); ЗаполнитьЗначенияСвойств(Строка, ФоновоеЗадание); - Строка.НаСервере = Истина; Строка.Идентификатор = ФоновоеЗадание.УникальныйИдентификатор; РегламентноеЗадание = ФоновоеЗадание.РегламентноеЗадание; @@ -1308,23 +537,26 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы - -// Обработчик обновления настроек выполнения регламентных заданий в новом размещении. -Процедура КонвертироватьНастройкиВыполненияРегламентныхЗаданий_1_2_2_2() Экспорт +Функция ПоследнееФоновоеЗаданиеВМассиве(МассивФоновыхЗаданий, ПоследнееФоновоеЗадание = Неопределено) - УстановитьПривилегированныйРежим(Истина); - ВызватьИсключениеЕслиНетПраваАдминистрирования(); + Для каждого ТекущееФоновоеЗадание Из МассивФоновыхЗаданий Цикл + Если ПоследнееФоновоеЗадание = Неопределено Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + Продолжить; + КонецЕсли; + Если ЗначениеЗаполнено(ПоследнееФоновоеЗадание.Конец) Тогда + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + ИЛИ ПоследнееФоновоеЗадание.Конец < ТекущееФоновоеЗадание.Конец Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + Иначе + Если НЕ ЗначениеЗаполнено(ТекущееФоновоеЗадание.Конец) + И ПоследнееФоновоеЗадание.Начало < ТекущееФоновоеЗадание.Начало Тогда + ПоследнееФоновоеЗадание = ТекущееФоновоеЗадание; + КонецЕсли; + КонецЕсли; + КонецЦикла; - Настройки = ХранилищеОбщихНастроек.Загрузить("НастройкиВыполненияРегламентныхЗаданий", , , ""); - Настройки = ?(ТипЗнч(Настройки) = Тип("ХранилищеЗначения"), Настройки.Получить(), Неопределено); + Возврат ПоследнееФоновоеЗадание; - Если Настройки <> Неопределено Тогда - Настройки = ПроверитьНастройки(Настройки); - Константы.НастройкиВыполненияРегламентныхЗаданий.Установить(Настройки); - КонецЕсли; - - ХранилищеОбщихНастроек.Удалить("НастройкиВыполненияРегламентныхЗаданий", Неопределено, ""); - -КонецПроцедуры +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/Module.bsl deleted file mode 100644 index f13aa585a..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/Module.bsl +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// См. эту функцию в модуле РегламентныеЗаданияСлужебный. -Функция ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий( - Знач ПоНастройкеАвтоОткрытия = Ложь) Экспорт - - Возврат РегламентныеЗаданияСлужебный - .ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий( - ПоНастройкеАвтоОткрытия); - -КонецФункции - -// См. эту функцию в модуле РегламентныеЗаданияСлужебный. -Функция НужноУведомлятьОНекорректномВыполненииРегламентныхЗаданий(ПериодУведомления) Экспорт - - Возврат РегламентныеЗаданияСлужебный - .НужноУведомлятьОНекорректномВыполненииРегламентныхЗаданий(ПериодУведомления); - -КонецФункции - -// См. эту функцию в модуле РегламентныеЗаданияСлужебный. -Функция ТекущийСеансВыполняетРегламентныеЗадания( - ЗаданияВыполняютсяНормально = Неопределено, - Знач УстановитьТекущийСеансКакСеансВыполняющийРегламентныеЗадания = Ложь, - ОписаниеОшибки = "") Экспорт - - Возврат РегламентныеЗаданияСлужебный.ТекущийСеансВыполняетРегламентныеЗадания( - ЗаданияВыполняютсяНормально, - УстановитьТекущийСеансКакСеансВыполняющийРегламентныеЗадания, - ОписаниеОшибки); - -КонецФункции - -// См. эту процедуру в модуле РегламентныеЗаданияСлужебный. -Процедура ВыполнитьРегламентныеЗадания(ВремяВыполнения = 0) Экспорт - - РегламентныеЗаданияСлужебный.ВыполнитьРегламентныеЗадания(ВремяВыполнения); - -КонецПроцедуры diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/РегламентныеЗаданияСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/РегламентныеЗаданияСлужебныйВызовСервера.mdo deleted file mode 100644 index 482c9454e..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйВызовСервера/РегламентныеЗаданияСлужебныйВызовСервера.mdo +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="066f9ab6-ff76-4426-bddd-702e9b16aa5b"> - <name>РегламентныеЗаданияСлужебныйВызовСервера</name> - <synonym> - <key>ru</key> - <value>Регламентные задания служебный вызов сервера</value> - </synonym> - <server>true</server> - <serverCall>true</serverCall> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/Module.bsl deleted file mode 100644 index 71c595601..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/Module.bsl +++ /dev/null @@ -1,70 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Регламентные задания". -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Уведомляет пользователей о невыполнении регламентных заданий и "зависании" фоновых заданий. -// -// Процедура работает только если информационная база файловая. -// Для серверной ИБ регламентные задания выполняются сервером 1С:Предприятия. -// -// Подключается в процедуре РегламентныеЗаданияСлужебныйКлиент.ПриНачалеРаботыСистемы(). -// -Процедура УведомлятьОНекорректномВыполненииРегламентныхЗаданий() Экспорт - - ПериодУведомления = Неопределено; // Минут. - - Если РегламентныеЗаданияСлужебныйВызовСервера - .НужноУведомлятьОНекорректномВыполненииРегламентныхЗаданий(ПериодУведомления) Тогда - - ОписаниеОшибки = ""; - ЗаданияВыполняютсяНормально = Неопределено; - - РегламентныеЗаданияСлужебныйВызовСервера.ТекущийСеансВыполняетРегламентныеЗадания( - ЗаданияВыполняютсяНормально, , ОписаниеОшибки); - - Если НЕ ЗаданияВыполняютсяНормально Тогда - РегламентныеЗаданияСлужебныйКлиент.ПриОшибкеВыполненияРегламентныхЗаданий(ОписаниеОшибки); - КонецЕсли; - ПодключитьОбработчикОжидания("УведомлятьОНекорректномВыполненииРегламентныхЗаданий", ПериодУведомления * 60, Истина); - КонецЕсли; - -КонецПроцедуры - -// Выполняет очередное регламентное задание в основном сеансе. -// -// Вызывается обработчиком ожидания, который подключается в -// РегламентныеЗаданияСлужебныйКлиент.ПриНачалеРаботыСистемы(). -// -// Для выполнения в отдельном сеансе применяется форма -// Обработки.РегламентныеИФоновыеЗадания.Форма.ВыполнениеРегламентныхЗаданий. -// -Процедура ВыполнениеРегламентныхЗаданийВОсновномСеансе() Экспорт - - Если РегламентныеЗаданияСлужебныйВызовСервера.ТекущийСеансВыполняетРегламентныеЗадания() Тогда - РегламентныеЗаданияСлужебныйВызовСервера.ВыполнитьРегламентныеЗадания(); - ПодключитьОбработчикОжидания("ВыполнениеРегламентныхЗаданийВОсновномСеансе", 60, Истина); - КонецЕсли; - -КонецПроцедуры - -// Запускает отдельный сеанс для выполнения регламентных заданий. -Процедура ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийЧерезОбработчикОжидания() Экспорт - - РегламентныеЗаданияСлужебныйКлиент.ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийИАктивизироватьОкно(); - -КонецПроцедуры - -// Активизирует главное окно текущего сеанса. -Процедура АктивизироватьГлавноеОкноТекущегоСеансаПослеЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий() Экспорт - - ОсновноеОкно = РегламентныеЗаданияСлужебныйКлиент.ОсновноеОкно(); - Если ОсновноеОкно <> Неопределено Тогда - ОсновноеОкно.Активизировать(); - КонецЕсли; - -КонецПроцедуры - diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/Module.bsl deleted file mode 100644 index af884ab93..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/Module.bsl +++ /dev/null @@ -1,245 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС - -Функция ЭтоОтдельныйСеансДляВыполненияРегламентныхЗаданий() Экспорт - - Возврат Найти(ПараметрЗапуска, "DoScheduledJobs") <> 0; - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Обработчик события ПриНачалеРаботыСистемы вызывается -// для выполнения действий, требуемых для подсистемы РегламентныеЗадания. -// -Процедура ПриНачалеРаботыСистемы() Экспорт - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если Не ПараметрыРаботыКлиента.ДоступноИспользованиеРазделенныхДанных Или ПараметрыРаботыКлиента.РазделениеВключено Тогда - Возврат; - КонецЕсли; - - Если Найти(ПараметрЗапуска, "DoScheduledJobs") <> 0 Тогда - - ОбработатьПараметрыЗапуска(); - - ИначеЕсли ПараметрыРаботыКлиента.ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий Тогда - - ПараметрыТолькоЧтение = ПараметрыРаботыКлиента.ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий; - - Если ПараметрыТолькоЧтение.Отказ Тогда - ПриОшибкеВыполненияРегламентныхЗаданий(ПараметрыТолькоЧтение.ОписаниеОшибки); - ИначеЕсли ПараметрыТолькоЧтение.ТребуетсяОткрытьОтдельныйСеанс Тогда - ПодключитьОбработчикОжидания("ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийЧерезОбработчикОжидания", 1, Истина); - КонецЕсли; - - Если ПараметрыТолькоЧтение.УведомлятьОНекорректномВыполнении Тогда - ПодключитьОбработчикОжидания("УведомлятьОНекорректномВыполненииРегламентныхЗаданий", ПараметрыТолькоЧтение.ПериодУведомления * 60, Истина); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ОбработатьПараметрыЗапуска() - - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Предупреждать = (Найти(ПараметрЗапуска, "SkipMessageBox") = 0); - ОтдельныйСеанс = (Найти(ПараметрЗапуска, "AloneIBSession") <> 0); - // В веб-клиенте обработка регламентных заданий в отдельном сеансе недоступно. -#Если ВебКлиент Тогда - ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - ЗавершитьРаботуСистемы(Ложь); -#КонецЕсли - - // Для клиент-серверной базы. - Если Не ПараметрыРаботыКлиента.ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий Тогда - Если Предупреждать Тогда - Если ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая Тогда - Предупреждение(НСтр("ru = 'Регламентные задания выполняются платформой в скрытом сеансе.'")); - Иначе - Предупреждение(НСтр("ru = 'Регламентные задания выполняются на сервере.'")); - КонецЕсли; - КонецЕсли; - Если ОтдельныйСеанс Тогда - ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - ЗавершитьРаботуСистемы(Ложь); - КонецЕсли; - Возврат; - КонецЕсли; - - // Для файл-серверной базы. - ЗаданияВыполняютсяНормально = Неопределено; - ОписаниеОшибки = ""; - Если РегламентныеЗаданияСлужебныйВызовСервера.ТекущийСеансВыполняетРегламентныеЗадания(ЗаданияВыполняютсяНормально, Истина, ОписаниеОшибки) Тогда - - Префикс = НСтр("ru = 'Выполнение регламентных заданий'"); - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Выполнить("УстановитьЗаголовокКлиентскогоПриложения(Префикс +"": ""+ + ПолучитьЗаголовокКлиентскогоПриложения());"); - Иначе - Выполнить("УстановитьЗаголовокПриложения(Префикс +"": ""+ ПолучитьЗаголовокПриложения());"); - КонецЕсли; - - Если ОтдельныйСеанс Тогда - // Выполнять в отдельном сеансе. - ОсновноеОкно = ОсновноеОкно(); - - ИзПрограммы = (Найти(ПараметрЗапуска, "From1C") <> 0); - ПараметрыВФорму = Новый Структура("ЗаголовокНадписи", - ?(ИзПрограммы, НСтр("ru = 'Сеанс закроется автоматически при закрытии основного сеанса.'"), "")); - - Если ОсновноеОкно = Неопределено Тогда - ОткрытьФорму( - "Обработка.РегламентныеИФоновыеЗадания.Форма.РабочийСтолОтдельногоСеансаВыполненияРегламентныхЗаданий", - ПараметрыВФорму); - Иначе - ОткрытьФорму( - "Обработка.РегламентныеИФоновыеЗадания.Форма.РабочийСтолОтдельногоСеансаВыполненияРегламентныхЗаданий", - ПараметрыВФорму, - , - , - ОсновноеОкно); - КонецЕсли; - - ОткрытьФормуМодально("Обработка.РегламентныеИФоновыеЗадания.Форма.ВыполнениеРегламентныхЗаданий"); - Иначе - // Выполнять в этом сеансе. - ПодключитьОбработчикОжидания("ВыполнениеРегламентныхЗаданийВОсновномСеансе", 1, Истина); - КонецЕсли; - Иначе - Если Предупреждать Тогда - - Если ЗаданияВыполняютсяНормально Тогда - ТекстСообщения = НСтр("ru = 'Сеанс, обрабатывающий регламентные задания, уже открыт.'"); - Иначе - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Сеанс, выполняющий регламентные задания, уже открыт. - | - |%1'"), ОписаниеОшибки); - Предупреждение(ТекстСообщения); - КонецЕсли; - КонецЕсли; - Если ОтдельныйСеанс Тогда - ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина; - ЗавершитьРаботуСистемы(Ложь); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Выполняет попытку открытия нового сеанса, обрабатывающего регламентные задания. -// -// Параметры: -// Параметры - Структура, используемые свойства: -// ДополнительныеПараметрыКоманднойСтроки - Строка. -// Отказ - Булево, выходной параметр. -// ОписаниеОшибки - Строка, выходной параметр. -// -Процедура ПопыткаЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий(Знач Параметры) Экспорт - - #Если НЕ ВебКлиент Тогда - Попытка - Параметры.ВыполненаПопыткаОткрытия = Истина; - ЗапуститьСистему( - ?(Найти(ВРег(ПараметрЗапуска), "/DEBUG") = 0, "", "/DEBUG ") - + Параметры.ДополнительныеПараметрыКоманднойСтроки); - Исключение - Параметры.ОписаниеОшибки = ОписаниеОшибки(); - Параметры.Отказ = Истина; - КонецПопытки; - #Иначе - Параметры.Отказ = Истина; - Параметры.ОписаниеОшибки = - НСтр("ru = 'Выполнение регламентных заданий в отдельном сеансе веб-клиента невозможна. - | - |Для выполнения регламентных заданий, необходимо, чтобы администратор настроил запуск обычного - |или тонкого клиента на веб-сервере.'"); - #КонецЕсли - Параметры.ОписаниеОшибки = - ?(ПустаяСтрока(Параметры.ОписаниеОшибки), - "", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка открытия сеанса для выполнения регламентных заданий: - | - |%1'"), - Параметры.ОписаниеОшибки)); - -КонецПроцедуры - -// Оповещает пользователя об ошибке выполнения регламентных заданий. -// -// Вызывается из процедуры РегламентныеЗаданияСлужебныйГлобальный.УведомлятьОНекорректномВыполненииРегламентныхЗаданий() и -// РегламентныеЗаданияСлужебныйКлиент.ПриНачалеРаботыСистемы(). -// -// Вызов происходит, если обнаружено, что нет сеанса выполнения или -// сеанс есть, но "висит" (долго "не работает"). -// -// Параметры: -// ОписаниеОшибки - Строка. -// -Процедура ПриОшибкеВыполненияРегламентныхЗаданий(ОписаниеОшибки) Экспорт - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПараметрыЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий.ТекущийПользовательАдминистратор Тогда - ПоказатьОповещениеПользователя( - НСтр("ru = 'Регламентные задания не выполняются.'"), - "e1cib/app/Обработка.РегламентныеИФоновыеЗадания", - ОписаниеОшибки, - БиблиотекаКартинок.ОшибкаВыполненияРегламентныхЗаданий); - Иначе - ПоказатьОповещениеПользователя( - НСтр("ru = 'Регламентные задания не выполняются.'"), - , - ОписаниеОшибки + Символы.ПС + НСтр("ru = 'Обратитесь к администратору.'"), - БиблиотекаКартинок.ОшибкаВыполненияРегламентныхЗаданий); - КонецЕсли; - -КонецПроцедуры - -// Подключает глобальный обработчик ожидания в форме. -Процедура ПодключитьГлобальныйОбработчикОжидания(ИмяПроцедуры, Интервал, Однократно = Ложь) Экспорт - - ПодключитьОбработчикОжидания(ИмяПроцедуры, Интервал, Однократно); - -КонецПроцедуры - -// Отключает глобальный обработчик ожидания в форме. -Процедура ОтключитьГлобальныйОбработчикОжидания(ИмяПроцедуры) Экспорт - - ОтключитьОбработчикОжидания(ИмяПроцедуры); - -КонецПроцедуры - -// Возвращает основное окно приложения. -Функция ОсновноеОкно() Экспорт - - ОсновноеОкно = Неопределено; - - Окна = ПолучитьОкна(); - Если Окна <> Неопределено Тогда - Для каждого Окно Из Окна Цикл - Если Окно.Основное Тогда - ОсновноеОкно = Окно; - Прервать; - КонецЕсли; - КонецЦикла; - КонецЕсли; - - Возврат ОсновноеОкно; - -КонецФункции - -// Запускает отдельный сеанс для выполнения регламентных заданий. -Процедура ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданийИАктивизироватьОкно() Экспорт - - Результат = РегламентныеЗаданияКлиент.ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий(); - - Если Результат.Отказ Тогда - Предупреждение(Результат.ОписаниеОшибки); - - ИначеЕсли Результат.ВыполненаПопыткаОткрытия Тогда - - ПодключитьОбработчикОжидания("АктивизироватьГлавноеОкноТекущегоСеансаПослеЗапускаОтдельногоСеансаВыполненияРегламентныхЗаданий", 2, Истина); - КонецЕсли; - -КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/РегламентныеЗаданияСлужебныйКлиент.mdo b/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/РегламентныеЗаданияСлужебныйКлиент.mdo deleted file mode 100644 index ee68a3af3..000000000 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйКлиент/РегламентныеЗаданияСлужебныйКлиент.mdo +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8d60a95c-4035-473f-b1b1-2d52afa2e2d6"> - <name>РегламентныеЗаданияСлужебныйКлиент</name> - <synonym> - <key>ru</key> - <value>Регламентные задания служебный клиент</value> - </synonym> - <clientManagedApplication>true</clientManagedApplication> - <clientOrdinaryApplication>true</clientOrdinaryApplication> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl index 06b78994d..c761d6c76 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБВызовСервера/Module.bsl @@ -44,9 +44,9 @@ // // Возвращаемое значение - Булево - Истина, если это полноправный пользователь. // -Функция ПолучитьДоступностьРолейОповещения() Экспорт +Функция ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования() Экспорт - Возврат РезервноеКопированиеИБСервер.ПолучитьДоступностьРолейОповещения(); + Возврат РезервноеКопированиеИБСервер.ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования(); КонецФункции @@ -57,9 +57,9 @@ // // Возвращаемое значение - Число - количество работающих пользователей. // -Функция ПолучитьКоличествоАктивныхПользователей(ТолькоАдминистраторы = Ложь) Экспорт +Функция КоличествоАктивныхПользователей(ТолькоАдминистраторы = Ложь) Экспорт - Возврат РезервноеКопированиеИБСервер.ПолучитьКоличествоАктивныхПользователей(ТолькоАдминистраторы); + Возврат РезервноеКопированиеИБСервер.КоличествоАктивныхПользователей(ТолькоАдминистраторы); КонецФункции diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl index 72e4788e1..714a7e3d8 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБКлиент/Module.bsl @@ -4,11 +4,12 @@ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Процедура проверяет необходимость проведения резервного копирования // или показа пользователю необходимого информационного сообщения. -Процедура ПриНачалеРаботыСистемы(Знач ОбрабатыватьПараметрыЗапуска = Ложь) Экспорт +// +Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда Возврат; @@ -35,7 +36,7 @@ // Интерактивные действия, выполняемые при запуске. ВариантОповещения = ФиксированныеПараметрыРезервногоКопированияИБ.ПараметрОповещения; - Если ВариантОповещения = "Просрочено" Или ВариантОповещения = "Напомнить" Или ВариантОповещения = "ЕщеНеНастроено" Тогда + Если ВариантОповещения = "Просрочено" Или ВариантОповещения = "ЕщеНеНастроено" Тогда ОповеститьПользователяОРезервномКопировании(ВариантОповещения); КонецЕсли; @@ -54,13 +55,10 @@ // Заполнение глобальных переменных. Процедура ЗаполнитьЗначенияГлобальныхПеременных(ФиксированныеПараметрыРезервногоКопированияИБ) Экспорт - ПараметрыРезервногоКопированияИБ = Новый Структура("ПроцессВыполняется, МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования, ДатаПоследнегоРезервногоКопирования, ОтложенноеРезервноеКопирование, ПараметрОповещения"); + ПараметрыРезервногоКопированияИБ = Новый Структура("ПроцессВыполняется, МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования, ДатаПоследнегоРезервногоКопирования, ПараметрОповещения"); ЗаполнитьЗначенияСвойств(ПараметрыРезервногоКопированияИБ, ФиксированныеПараметрыРезервногоКопированияИБ); ПараметрыРезервногоКопированияИБ.Вставить("РасписаниеЗначение", ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(ФиксированныеПараметрыРезервногоКопированияИБ.РасписаниеКопирования)); - ОповещатьОРезервномКопированииПриЗавершенииСеанса = Ложь; - ДатаОтложенногоРезервногоКопирования = Дата('00010101'); - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -92,13 +90,47 @@ Возврат; КонецЕсли; - ПриЗавершенииРаботыСистемы(Предупреждения); + ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); + + Если ПараметрыРаботыКлиента.РазделениеВключено Или Не ПараметрыРаботыКлиента.ИнформационнаяБазаФайловая Тогда + Возврат; + КонецЕсли; + + Если ПроверитьНаличиеРезервногоКопирования() <> Истина Тогда + Возврат; + КонецЕсли; + + ТекстФлажка = НСтр("ru = 'Выполнить резервное копирование'"); + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("РежимРаботы", "ВыполнитьПриЗавершенииРаботы"); + ФормаОбработки = "Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных"; + + ДействиеПриУстановленномФлажке = Новый Структура("Форма, ПараметрыФормы", ФормаОбработки, ПараметрыФормы); + СтруктураПредупреждения = Новый Структура("ТекстФлажка, ДействиеПриУстановленномФлажке, Приоритет", + ТекстФлажка, ДействиеПриУстановленномФлажке, 70); + Предупреждения.Добавить(СтруктураПредупреждения); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Экспортные служебные процедуры и функции +// Возвращает имя формы настроек резервного копирования в зависимости от режима работы +// +Функция ИмяФормыНастроекРезервногоКопирования() Экспорт + + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда + + Возврат "Обработка.НастройкаРезервногоКопированияИБ.Форма.Форма"; + + Иначе + + Возврат "Обработка.НастройкаРезервногоКопированияИБ.Форма.НапоминаниеКлиентСервер"; + + КонецЕсли; + +КонецФункции + // Проверяет необходимость запуска автоматического резервного копирования // в процессе работы пользователя, а также повторного оповещения после игнорировании первоначального. // @@ -108,16 +140,13 @@ Возврат; КонецЕсли; - Если НеобходимостьАвтоматическогоРезервногоКопирования() Тогда + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая + И НеобходимостьАвтоматическогоРезервногоКопирования() Тогда ПровестиРезервноеКопирование(); КонецЕсли; - Если ПараметрыРезервногоКопированияИБ.ОтложенноеРезервноеКопирование Тогда - ОтложенноеИнтерактивноеРезервноеКопирование(); - КонецЕсли; - ВариантОповещения = ПараметрыРезервногоКопированияИБ.ПараметрОповещения; - Если ВариантОповещения = "Просрочено" Или ВариантОповещения = "Напомнить" Или ВариантОповещения = "ЕщеНеНастроено" Тогда + Если ВариантОповещения = "Просрочено" Или ВариантОповещения = "ЕщеНеНастроено" Тогда ОповеститьПользователяОРезервномКопировании(ВариантОповещения); КонецЕсли; @@ -154,14 +183,30 @@ КонецФункции // Запускает резервное копирование по расписанию. -// Состоит из двух этапов: 1 - очистка каталога с копиями, 2 - непосредственно резервное копирование. -Процедура ПровестиРезервноеКопирование() Экспорт +// +Процедура ПровестиРезервноеКопирование() + + УдалитьРезервныеКопииПоНастройке(); + + // Затем резервное копирование. + ДатыСледующегоАвтоматическогоКопирования = РезервноеКопированиеИБВызовСервера.СформироватьДатыСледующегоАвтоматическогоКопирования(); + ЗаполнитьЗначенияСвойств(ПараметрыРезервногоКопированияИБ, ДатыСледующегоАвтоматическогоКопирования); + + ПараметрыФормы = Новый Структура("РежимРаботы", "ВыполнитьСейчас"); + ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных", ПараметрыФормы); + +КонецПроцедуры + +// Удаляет резервные копии по заданным настройкам +// +Процедура УдалитьРезервныеКопииПоНастройке() Экспорт // Очистка архива с копиями. ФиксированныеПараметрыРезервногоКопированияИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РезервноеКопированиеИБ; КаталогХранения = ФиксированныеПараметрыРезервногоКопированияИБ.КаталогХраненияРезервныхКопий; + ПараметрыУдаления = ФиксированныеПараметрыРезервногоКопированияИБ.ПараметрыУдаления; - Если ФиксированныеПараметрыРезервногоКопированияИБ.ПроизводитьУдаление И КаталогХранения <> Неопределено Тогда + Если ПараметрыУдаления.ПроизводитьУдаление И КаталогХранения <> Неопределено Тогда Попытка Файл = Новый Файл(КаталогХранения); @@ -169,20 +214,21 @@ Возврат; КонецЕсли; - МассивФайлов = НайтиФайлы(КаталогХранения, "backup*.zip", Истина); - СписокУдаляемыхФайлов = Новый СписокЗначений; + МассивФайлов = НайтиФайлы(КаталогХранения, "backup*.zip", Ложь); + СписокУдаляемыхФайлов = Новый Массив; // Удаление резервных копий. - Если ФиксированныеПараметрыРезервногоКопированияИБ.УдалятьПоПериоду Тогда + Если ПараметрыУдаления.ТипОграничения = "ПоПериоду" Тогда Для Каждого ЭлементФайл Из МассивФайлов Цикл ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); - ПараметрУдаления = ?((ТекущаяДата - ФиксированныеПараметрыРезервногоКопированияИБ.ЗначениеПараметра) > ЭлементФайл.ПолучитьВремяИзменения(), Истина, Ложь); - Если ПараметрУдаления Тогда + ЗначениеВСекундах = КоличествоСекундВПериоде(ПараметрыУдаления.ЗначениеВЕдиницахИзмерения, ПараметрыУдаления.ЕдиницаИзмеренияПериода); + ПроизводитьУдаление = ((ТекущаяДата - ЗначениеВСекундах) > ЭлементФайл.ПолучитьВремяИзменения()); + Если ПроизводитьУдаление Тогда СписокУдаляемыхФайлов.Добавить(ЭлементФайл); КонецЕсли; КонецЦикла; - ИначеЕсли МассивФайлов.Количество() >= ФиксированныеПараметрыРезервногоКопированияИБ.ЗначениеПараметра Тогда + ИначеЕсли МассивФайлов.Количество() >= ПараметрыУдаления.КоличествоКопий Тогда СписокФайлов = Новый СписокЗначений; СписокФайлов.ЗагрузитьЗначения(МассивФайлов); @@ -191,12 +237,11 @@ КонецЦикла; СписокФайлов.СортироватьПоЗначению(НаправлениеСортировки.Убыв); - Индекс = ФиксированныеПараметрыРезервногоКопированияИБ.ЗначениеПараметра; - ДатаПоследнегоАрхива = СписокФайлов[Индекс-1].Значение; + ДатаПоследнегоАрхива = СписокФайлов[ПараметрыУдаления.КоличествоКопий-1].Значение; Для Каждого ЭлементФайл Из МассивФайлов Цикл - Если ЭлементФайл.ПолучитьВремяИзменения() < ДатаПоследнегоАрхива Тогда + Если ЭлементФайл.ПолучитьВремяИзменения() <= ДатаПоследнегоАрхива Тогда СписокУдаляемыхФайлов.Добавить(ЭлементФайл); КонецЕсли; @@ -205,52 +250,38 @@ КонецЕсли; Для Каждого УдаляемыйФайл Из СписокУдаляемыхФайлов Цикл - УдалитьФайлы(УдаляемыйФайл.Значение.ПолноеИмя); + УдалитьФайлы(УдаляемыйФайл.ПолноеИмя); КонецЦикла; Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(),"Ошибка", - НСтр("ru = 'Не удалось провести очистку каталога с резервными копиями.'"),,Истина); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + НСтр("ru = 'Не удалось провести очистку каталога с резервными копиями.'") + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); КонецПопытки; КонецЕсли; - // резервное копирование - ДатыСледующегоАвтоматическогоКопирования = РезервноеКопированиеИБВызовСервера.СформироватьДатыСледующегоАвтоматическогоКопирования(); - ЗаполнитьЗначенияСвойств(ПараметрыРезервногоКопированияИБ, ДатыСледующегоАвтоматическогоКопирования); - - ПараметрыФормы = Новый Структура("ТипВызова, ТекущаяСтраница", 2, "СтраницаИнформацииИВыполненияРезервногоКопирования"); - ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы", ПараметрыФормы); - КонецПроцедуры // При старте системы проверяет, первый ли это запуск после проведения резервного копирования. // Если да - выводит форму обработчика с результатами резервного копирования. // // Параметры: -// ПараметрыРезервногоКопирования - Структура - параметры резервного копирования. +// Параметры - Структура - параметры резервного копирования. // -Процедура ПроверитьРезервноеКопированиеИБ(ФиксированныеПараметрыРезервногоКопированияИБ) Экспорт +Процедура ПроверитьРезервноеКопированиеИБ(Параметры) Экспорт - Если ФиксированныеПараметрыРезервногоКопированияИБ.ПроведеноКопирование Тогда - - ПараметрыФормы = Новый Структура("ТипВызова", 2); - НазваниеТекущейСтраницы = ""; - - Если ФиксированныеПараметрыРезервногоКопированияИБ.РезультатКопирования Тогда - НазваниеТекущейСтраницы = "СтраницаУспешногоВыполненияКопирования"; - Иначе - НазваниеТекущейСтраницы = "СтраницаОшибокПриКопировании"; - КонецЕсли; - - ПараметрыФормы.Вставить("ТекущаяСтраница", НазваниеТекущейСтраницы); - ПараметрыФормы.Вставить("ТекстПути", ФиксированныеПараметрыРезервногоКопированияИБ.ИмяФайлаРезервнойКопии); - ФормаОповещения = ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы", ПараметрыФормы); - + Если Не Параметры.ПроведеноКопирование Тогда + Возврат; КонецЕсли; + ПараметрыФормы = Новый Структура(); + ПараметрыФормы.Вставить("РежимРаботы", ?(Параметры.РезультатКопирования, "УспешноВыполнено", "НеВыполнено")); + ПараметрыФормы.Вставить("ИмяФайлаРезервнойКопии", Параметры.ИмяФайлаРезервнойКопии); + ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеДанных", ПараметрыФормы); + КонецПроцедуры // По результатам анализа параметров резервного копирования выдает соответствующее оповещение. @@ -267,27 +298,21 @@ ПоказатьОповещениеПользователя(НСтр("ru = 'Резервное копирование.'"), "e1cib/app/Обработка.РезервноеКопированиеИБ", ТекстПояснения, БиблиотекаКартинок.Предупреждение32); - ИначеЕсли ВариантОповещения = "Напомнить" Тогда - - НастройкаОповещения = ПараметрыРезервногоКопированияИБ.ДатаПоследнегоРезервногоКопирования; - ТекстПояснения = НСтр("ru = 'Резервное копирование не выполнялось с %1.'"); - - МассивЗамены = Новый Массив; - МассивЗамены.Добавить(НастройкаОповещения); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(ТекстПояснения, МассивЗамены); - - ТекстПояснения = СтрЗаменить(ТекстПояснения,"%НастройкаОповещения%",НастройкаОповещения); - ПоказатьОповещениеПользователя(НСтр("ru = 'Резервное копирование.'"), - "e1cib/app/Обработка.РезервноеКопированиеИБ", ТекстПояснения, БиблиотекаКартинок.Предупреждение32); - ИначеЕсли ВариантОповещения = "ЕщеНеНастроено" Тогда + ИмяФормыНастроек = "e1cib/app/%1"; + ИмяФормыНастроек = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ИмяФормыНастроек, ИмяФормыНастроекРезервногоКопирования()); + ТекстПояснения = НСтр("ru = 'Рекомендуется настроить резервное копирование информационной базы.'"); ПоказатьОповещениеПользователя(НСтр("ru = 'Резервное копирование.'"), - "e1cib/app/Обработка.НастройкаРезервногоКопированияИБ", ТекстПояснения, БиблиотекаКартинок.Предупреждение32); - ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); - РезервноеКопированиеИБВызовСервера.УстановитьДатуПоследнегоНапоминания(ТекущаяДата); - КонецЕсли; + ИмяФормыНастроек, ТекстПояснения, БиблиотекаКартинок.Предупреждение32); + + КонецЕсли; + + ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); + РезервноеКопированиеИБВызовСервера.УстановитьДатуПоследнегоНапоминания(ТекущаяДата); + КонецПроцедуры // Получает каталог файла по его имени @@ -348,109 +373,27 @@ #КонецЕсли КонецФункции -// Формирует вопросы при завершении работы системы. -// -// Параметры: -// Предупреждения - Массив - список предупреждений. -// -Процедура ПриЗавершенииРаботыСистемы(Предупреждения) Экспорт - - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РазделениеВключено Тогда - Возврат; - КонецЕсли; - - Ответ = ПроверитьНаличиеРезервногоКопирования(); - ТипОтвета = ТипЗнч(Ответ); - ИмеетсяРезервноеКопирование = Ложь; - Если ТипОтвета = Тип("Дата") Тогда - ТекстФлажка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Завершить работу системы после резервного копирования %1'"), Ответ); - - МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Ответ); - ПараметрыФормы = Новый Структура("ТипВызова, ТекущаяСтраница, ЗаголовокНадписи", - 1, "СтраницаИнформацииИВыполненияРезервногоКопирования", - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(НСтр("ru = 'Резервное копирование будет произведено автоматически не позднее %1'"), - МассивПараметров)); - ФормаОбработки = "Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы"; - - ИмеетсяРезервноеКопирование = Истина; - ИначеЕсли ТипОтвета = Тип("Булево") Тогда - ТекстФлажка = НСтр("ru = 'Выполнить резервное копирование'"); - ПараметрыФормы = Новый Структура("ТипВызова, ТекущаяСтраница", 2, "СтраницаИнформацииИВыполненияРезервногоКопирования"); - ФормаОбработки = "Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы"; - - ИмеетсяРезервноеКопирование = Истина; - КонецЕсли; - - Если ИмеетсяРезервноеКопирование Тогда - ДействиеПриУстановленномФлажке = Новый Структура("Форма, ПараметрыФормы", ФормаОбработки, ПараметрыФормы); - СтруктураПредупреждения = Новый Структура("ТекстФлажка, ДействиеПриУстановленномФлажке, Приоритет", ТекстФлажка, ДействиеПриУстановленномФлажке, 70); - Предупреждения.Добавить(СтруктураПредупреждения); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Локальные служебные процедуры и функции -// Обработчик ожидания выполнения резервного копирования. -// -Процедура ОтложенноеИнтерактивноеРезервноеКопирование() - - Если ОбщегоНазначенияКлиент.ДатаСеанса() < ДатаОтложенногоРезервногоКопирования - И РезервноеКопированиеИБВызовСервера.ПолучитьКоличествоАктивныхПользователей() = 1 Тогда - - ТекстВопроса = НСтр("ru = 'В данный момент с базой больше никто не работает. Выполнить резервное копирование?'"); - ЗаголовокВопроса = Нстр("ru = 'Провести резервное копирование прямо сейчас'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Да, ЗаголовокВопроса, КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Нет Или Ответ = Неопределено Тогда - Возврат; - КонецЕсли; - - КонецЕсли; - - ПараметрыРезервногоКопированияИБ.ОтложенноеРезервноеКопирование = Ложь; - РезервноеКопированиеИБВызовСервера.УстановитьЗначениеНастройки("ОтложенноеРезервноеКопирование", Ложь); - ПараметрыФормы = Новый Структура("ТипВызова, ТекущаяСтраница, ЗаголовокНадписи", 1, "СтраницаИнформацииИВыполненияРезервногоКопирования", ""); - ФормаОбработки = ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы", ПараметрыФормы); - -КонецПроцедуры - // Функция проверяет настройки резервного копирования. // // Возвращаемое значение: -// Неопределено - если нет резервного копирования, -// Дата - если имеется отложенное резервное копирование, -// Булево - если имеется резервное копирование при завершении работы. +// Неопределено - если резервное копирование не запланировано, +// Дата - если запланировано резервное копирование на определенную дату, +// Булево - если резервное копирование запланировано сразу при завершении работы. // Функция ПроверитьНаличиеРезервногоКопирования() #Если ВебКлиент Тогда Возврат Неопределено; #КонецЕсли - Если Не СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗавершении().РезервноеКопированиеИБ.ДоступностьРолейОповещения Тогда + Параметры = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗавершении(); + Если Не Параметры.РезервноеКопированиеИБ.ДоступностьРолейОповещения Тогда Возврат Неопределено; КонецЕсли; - ОповещатьПостоянно = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗавершении().РезервноеКопированиеИБ.ПроводитьРезервноеКопированиеПриЗавершенииРаботы; - ОповещатьПостоянно = ?(ОповещатьПостоянно = Неопределено, Ложь, ОповещатьПостоянно); - КоличествоАктивныхАдминистраторов = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗавершении().РезервноеКопированиеИБ.КоличествоАктивныхПользователей; - // Переменная ОповещатьОРезервномКопированииПриЗавершенииСеанса сравнивается явно с Истина, - // так как может быть не проинициализирована при аварийном завершении. - Если ОповещатьОРезервномКопированииПриЗавершенииСеанса = Истина ИЛИ (ОповещатьПостоянно И КоличествоАктивныхАдминистраторов = 1) Тогда - Возврат Истина; - Иначе // Если нет резервного копирования при завершении работы системы. - // Переменная ДатаОтложенногоРезервногоКопирования может быть не проинициализирована при аварийном завершении. - Если ДатаОтложенногоРезервногоКопирования = Неопределено Тогда - ДатаОтложенногоРезервногоКопирования = Дата('00010101'); - КонецЕсли; - ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); - Если ДатаОтложенногоРезервногоКопирования > ТекущаяДата Тогда - Возврат ДатаОтложенногоРезервногоКопирования; - КонецЕсли; - КонецЕсли; - - Возврат Неопределено; + Возврат Параметры.РезервноеКопированиеИБ.ВыполнятьПриЗавершенииРаботы; КонецФункции @@ -475,3 +418,18 @@ Возврат 0; КонецФункции +Функция КоличествоСекундВПериоде(Период, ТипПериода) + + Если ТипПериода = "День" Тогда + Множитель = 3600 * 24; + ИначеЕсли ТипПериода = "Неделя" Тогда + Множитель = 3600 * 24 * 7; + ИначеЕсли ТипПериода = "Месяц" Тогда + Множитель = 3600 * 24 * 30; + ИначеЕсли ТипПериода = "Год" Тогда + Множитель = 3600 * 24 * 365; + КонецЕсли; + + Возврат Множитель * Период; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl index 2b5f4f1a7..dca17cf43 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеИБСервер/Module.bsl @@ -31,7 +31,9 @@ СерверныеОбработчики[ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "РезервноеКопированиеИБСервер"); - + + СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( + "РезервноеКопированиеИБСервер"); КонецПроцедуры @@ -44,39 +46,20 @@ // Возвращаемое значение: // Структура - параметры. // -Функция ПолучитьПараметрыПриЗавершенииРаботы() +Функция ПараметрыПриЗавершенииРаботы() - НастройкиРезервногоКопирования = ПолучитьНастройкиРезервногоКопирования(); - ПроводитьРезервноеКопированиеПриЗавершенииРаботы = ?(НастройкиРезервногоКопирования = Неопределено, НастройкиРезервногоКопирования, НастройкиРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы); + НастройкиРезервногоКопирования = НастройкиРезервногоКопирования(); + ВыполнятьПриЗавершенииРаботы = ?(НастройкиРезервногоКопирования = Неопределено, + Ложь, НастройкиРезервногоКопирования.ВыборПунктаНастройки = 2); - ПараметрыПриЗавершении = Новый Структура; - ПараметрыПриЗавершении.Вставить("КоличествоАктивныхПользователей", ПолучитьКоличествоАктивныхПользователей(Истина)); - ПараметрыПриЗавершении.Вставить("ДоступностьРолейОповещения", ПолучитьДоступностьРолейОповещения()); - ПараметрыПриЗавершении.Вставить("ПроводитьРезервноеКопированиеПриЗавершенииРаботы", ПроводитьРезервноеКопированиеПриЗавершенииРаботы); + ПараметрыПриЗавершении = Новый Структура; + ПараметрыПриЗавершении.Вставить("ДоступностьРолейОповещения", ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования()); + ПараметрыПриЗавершении.Вставить("ВыполнятьПриЗавершенииРаботы", ВыполнятьПриЗавершенииРаботы); Возврат ПараметрыПриЗавершении; КонецФункции -// Возвращает коэффициент, позволяющий вычислить количество секунд в каждом интервале. -// -// Параметры: -// ТипПериодаСтрока - Строка - имя интервала. -// -// Возвращаемое значение - Число - количество секунд интервала. -// -Функция ПолучитьВременнойПараметрПоСтроке(ТипПериодаСтрока) Экспорт - Если ТипПериодаСтрока = "Минута" Тогда - Возврат 60; - ИначеЕсли ТипПериодаСтрока = "Час" Тогда - Возврат 3600; - ИначеЕсли ТипПериодаСтрока = "День" Тогда - Возврат 3600 * 24; - ИначеЕсли ТипПериодаСтрока = "Неделя" Тогда - Возврат 3600 * 24 * 7; - КонецЕсли; -КонецФункции - // Возвращает значение периода по заданному интервалу времени. // // Параметры: @@ -86,7 +69,7 @@ // ТипПериода - Строка - тип периода: День, Неделя, Месяц, Год. // ЗначениеПериода - Число - длина периода для заданного типа. // -Функция ПолучитьПоИнтервалуВремениЗначениеПериода(ИнтервалВремени) Экспорт +Функция ЗначениеПериодаПоИнтервалуВремени(ИнтервалВремени) ВозвращаемаяСтруктура = Новый Структура("ТипПериода, ЗначениеПериода", "Месяц", 1); @@ -126,10 +109,10 @@ // // Возвращаемое значение - Структура - параметры резервного копирования. // -Функция ПолучитьПараметрыРезервногоКопирования() Экспорт +Функция ПараметрыРезервногоКопирования() Экспорт Параметры = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПараметрыРезервногоКопирования"); - Если Параметры = Неопределено ИЛИ Не Параметры.Свойство("ОтложенноеРезервноеКопирование") Тогда + Если Параметры = Неопределено Тогда Параметры = НачальноеЗаполнениеНастроекРезервногоКопирования(); Иначе ПривестиПараметрыРезервногоКопирования(Параметры); @@ -189,7 +172,11 @@ // Функция НеобходимостьАвтоматическогоРезервногоКопирования() Экспорт - Параметры = ПолучитьПараметрыРезервногоКопирования(); + Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + Возврат Ложь; + КонецЕсли; + + Параметры = ПараметрыРезервногоКопирования(); Если Параметры = Неопределено Тогда Возврат Ложь; КонецЕсли; @@ -223,8 +210,7 @@ Функция СформироватьДатыСледующегоАвтоматическогоКопирования(НачальнаяНастройка = Ложь) Экспорт Результат = Новый Структура; - - НастройкиРезервногоКопирования = ПолучитьНастройкиРезервногоКопирования(); + НастройкиРезервногоКопирования = НастройкиРезервногоКопирования(); ТекущаяДата = ТекущаяДатаСеанса(); Если НачальнаяНастройка Тогда @@ -238,7 +224,7 @@ Если ПериодПовтораВТечениеДня <> 0 Тогда Значение = ТекущаяДата + ПериодПовтораВТечениеДня; ИначеЕсли ПериодПовтораДней <> 0 Тогда - Значение = ТекущаяДата + ПериодПовтораДней * ПолучитьВременнойПараметрПоСтроке("День"); + Значение = ТекущаяДата + ПериодПовтораДней * 3600 * 24; Иначе Значение = НачалоДня(КонецДня(ТекущаяДата) + 1); КонецЕсли; @@ -256,9 +242,11 @@ // Используется при начале работы системы для показа формы с результатами резервного копирования. // Процедура УстановитьРезультатРезервногоКопирования() Экспорт - СтруктураПараметров = ПолучитьНастройкиРезервногоКопирования(); + + СтруктураПараметров = НастройкиРезервногоКопирования(); СтруктураПараметров.ПроведеноКопирование = Ложь; УстановитьПараметрыРезервногоКопирования(СтруктураПараметров); + КонецПроцедуры // Устанавливает значение настройки "ДатаПоследнегоРезервногоКопирования". @@ -267,9 +255,11 @@ // ДатаКопирования - дата и время последнего резервного копирования. // Процедура УстановитьДатуПоследнегоКопирования(ДатаКопирования) Экспорт - СтруктураПараметров = ПолучитьПараметрыРезервногоКопирования(); + + СтруктураПараметров = ПараметрыРезервногоКопирования(); СтруктураПараметров.ДатаПоследнегоРезервногоКопирования = ДатаКопирования; УстановитьПараметрыРезервногоКопирования(СтруктураПараметров); + КонецПроцедуры // Возвращает количество работающих с ИБ пользователей. @@ -279,7 +269,7 @@ // // Возвращаемое значение - Число - количество работающих пользователей. // -Функция ПолучитьКоличествоАктивныхПользователей(ТолькоАдминистраторы = Ложь) Экспорт +Функция КоличествоАктивныхПользователей(ТолькоАдминистраторы = Ложь) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -319,9 +309,11 @@ // ДатаНапоминания - Дата - дата и время последнего оповещения пользователя о необходимости проведения резервного копирования. // Процедура УстановитьДатуПоследнегоНапоминания(ДатаНапоминания) Экспорт - ПараметрыОповещений = ПолучитьПараметрыРезервногоКопирования(); + + ПараметрыОповещений = ПараметрыРезервногоКопирования(); ПараметрыОповещений.ДатаПоследнегоОповещения = ДатаНапоминания; УстановитьПараметрыРезервногоКопирования(ПараметрыОповещений); + КонецПроцедуры // Устанавливает настройку в параметры резервного копирования. @@ -331,62 +323,64 @@ // ЗначениеЭлемента - Произвольный тип - значение параметра. // Процедура УстановитьЗначениеНастройки(ИмяЭлемента, ЗначениеЭлемента) Экспорт - СтруктураНастроек = ПолучитьПараметрыРезервногоКопирования(); + + СтруктураНастроек = ПараметрыРезервногоКопирования(); СтруктураНастроек.Вставить(ИмяЭлемента, ЗначениеЭлемента); УстановитьПараметрыРезервногоКопирования(СтруктураНастроек); + КонецПроцедуры -// Возвращает структуру с параметрами для работы приложения. +// Возвращает структуру с параметрами резервного копирования. // // Параметры: -// НаКлиент - Булево - признак передачи параметров на клиент. +// НачалоРаботы - Булево - признак вызова при начале работы программы. // -// Возвращаемое значение - Структура - параметры резервного копирования. +// Возвращаемое значение: +// Структура - параметры резервного копирования. // -Функция ПолучитьНастройкиРезервногоКопирования(НачалоРаботы = Ложь) Экспорт +Функция НастройкиРезервногоКопирования(НачалоРаботы = Ложь) Экспорт Если Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда Возврат Неопределено; // Не выполнен вход в область данных. КонецЕсли; - Если Не ПолучитьДоступностьРолейОповещения() Тогда + Если Не ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования() Тогда Возврат Неопределено; // Текущий пользователь не обладает необходимыми правами. КонецЕсли; - СтруктураВозврата = ПолучитьПараметрыРезервногоКопирования(); - Если Не СтруктураВозврата.Свойство("ПервыйЗапуск") Тогда - СтруктураВозврата.Вставить("ПервыйЗапуск", Истина); + Результат = ПараметрыРезервногоКопирования(); + Если Не Результат.Свойство("ПервыйЗапуск") Тогда + Результат.Вставить("ПервыйЗапуск", Истина); КонецЕсли; - ВариантОповещения = ПолучитьВариантОповещения(); - Если ВариантОповещения = "Просрочено" Или ВариантОповещения = "Напомнить" Или ВариантОповещения = "ЕщеНеНастроено" Тогда - УстановитьДатуПоследнегоНапоминания(ТекущаяДатаСеанса()); - КонецЕсли; + ВариантОповещения = ВариантОповещения(); - СтруктураВозврата.Вставить("ПараметрОповещения", ВариантОповещения); - Если СтруктураВозврата.ПроведеноКопирование И СтруктураВозврата.РезультатКопирования Тогда + Результат.Вставить("ПараметрОповещения", ВариантОповещения); + Если Результат.ПроведеноКопирование И Результат.РезультатКопирования Тогда УстановитьДатуПоследнегоКопирования(ТекущаяДатаСеанса()); КонецЕсли; - Если СтруктураВозврата.ПроведеноВосстановление Тогда + Если Результат.ПроведеноВосстановление Тогда ОбновитьРезультатВосстановления(); КонецЕсли; - Если НачалоРаботы И СтруктураВозврата.ПроцессВыполняется Тогда - СтруктураВозврата.ПроцессВыполняется = Ложь; + Если НачалоРаботы И Результат.ПроцессВыполняется Тогда + Результат.ПроцессВыполняется = Ложь; УстановитьЗначениеНастройки("ПроцессВыполняется", Ложь); КонецЕсли; - Возврат СтруктураВозврата; + Возврат Результат; КонецФункции // Обновляет результат восстановления и обновляет структуру параметров резервного копирования. // Процедура ОбновитьРезультатВосстановления() - СтруктураВозврата = ПолучитьПараметрыРезервногоКопирования(); + + СтруктураВозврата = ПараметрыРезервногоКопирования(); СтруктураВозврата.ПроведеноВосстановление = Ложь; УстановитьПараметрыРезервногоКопирования(СтруктураВозврата); + КонецПроцедуры // Выбирает, какой вариант оповещения показать пользователю. @@ -396,36 +390,39 @@ // Строка: // "Недоступно" - автоматическое резервное копирование недоступно текущему пользователю. // "Просрочено" - просрочено автоматическое резервное копирование. -// "Напомнить" - необходимо сделать напоминание о резервном копировании. // "ЕщеНеНастроено" - резервное копирование еще не настроено. // "НеОповещать" - не оповещать о необходимости выполнения резервного копирования (например, если выполняется сторонними средствами) // -Функция ПолучитьВариантОповещения() Экспорт - Результат = "Недоступно"; - Если Не ПолучитьДоступностьРолейОповещения() Тогда - Возврат Результат; - КонецЕсли; - ПараметрыОповещенияОКопировании = ПолучитьПараметрыРезервногоКопирования(); - Если ПараметрыОповещенияОКопировании.ВыборПунктаНастройки = 2 Тогда - Результат = "НеОповещать"; - Возврат Результат; - КонецЕсли; - ОповещатьОНеобходимостиРезервногоКопирования = ?((ТекущаяДатаСеанса() >= (ПараметрыОповещенияОКопировании.ДатаПоследнегоОповещения + - ?(ПараметрыОповещенияОКопировании.ПериодОповещения = Неопределено, 0, ПараметрыОповещенияОКопировании.ПериодОповещения)) - И ПараметрыОповещенияОКопировании.ПериодОповещения > 0), Истина, Ложь); +Функция ВариантОповещения() Экспорт - Если ПараметрыОповещенияОКопировании.НастроеноПользователем Тогда + Результат = "Недоступно"; + Если Не ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования() Тогда + Возврат Результат; + КонецЕсли; + + ПараметрыОповещенияОКопировании = ПараметрыРезервногоКопирования(); + ОповещатьОНеобходимостиРезервногоКопирования = ТекущаяДатаСеанса() >= (ПараметрыОповещенияОКопировании.ДатаПоследнегоОповещения + 3600 * 24); + + Если ПараметрыОповещенияОКопировании.ВыборПунктаНастройки = 3 Тогда + + Результат = "НеОповещать"; + + ИначеЕсли ПараметрыОповещенияОКопировании.ВыборПунктаНастройки = 0 Тогда + + Если ОповещатьОНеобходимостиРезервногоКопирования Тогда + Результат = "ЕщеНеНастроено"; + КонецЕсли; + + Иначе + Если НеобходимостьАвтоматическогоРезервногоКопирования() Тогда Результат = "Просрочено"; - ИначеЕсли ОповещатьОНеобходимостиРезервногоКопирования Тогда - Результат = "Напомнить"; КонецЕсли; - Иначе - Если ОповещатьОНеобходимостиРезервногоКопирования Тогда - Результат = "ЕщеНеНастроено"; - КонецЕсли; + КонецЕсли; + Возврат Результат; + КонецФункции // Возвращает начальное заполнение настроек автоматического резервного копирования. @@ -439,31 +436,21 @@ ТекущаяДата = ТекущаяДатаСеанса(); Параметры = Новый Структура; - Параметры.Вставить("ПериодОповещения", 24*3600); // раз в сутки - Параметры.Вставить("ДатаПоследнегоОповещения", ТекущаяДата); - Параметры.Вставить("НастроеноПользователем", Ложь); + Параметры.Вставить("ДатаПоследнегоОповещения", '00010101'); Параметры.Вставить("ДатаПоследнегоРезервногоКопирования", ТекущаяДата); Параметры.Вставить("РасписаниеКопирования", ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Новый РасписаниеРегламентногоЗадания)); Параметры.Вставить("КаталогХраненияРезервныхКопий", ""); Параметры.Вставить("МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования", '29990101'); - Параметры.Вставить("ПроизводитьУдаление", Истина); - Параметры.Вставить("УдалятьПоПериоду", Истина); - Параметры.Вставить("ЗначениеПараметра", ДобавитьМесяц(ТекущаяДата, 6) - ТекущаяДата); Параметры.Вставить("ПроведеноКопирование", Ложь); Параметры.Вставить("ПроведеноВосстановление", Ложь); Параметры.Вставить("РезультатКопирования", Неопределено); Параметры.Вставить("ИмяФайлаРезервнойКопии", ""); - Параметры.Вставить("ВыборПунктаНастройки", 3); - Параметры.Вставить("ПроводитьРезервноеКопированиеПриЗавершенииРаботы", Ложь); + Параметры.Вставить("ВыборПунктаНастройки", 0); Параметры.Вставить("ПервыйЗапуск", Истина); Параметры.Вставить("ПроцессВыполняется", Ложь); Параметры.Вставить("АдминистраторИБ", ""); Параметры.Вставить("ПарольАдминистратораИБ", ""); - - // Параметры обработчиков ожидания. - Параметры.Вставить("ЕжечасноеОповещение", Ложь); - Параметры.Вставить("АвтоматическоеРезервноеКопирование", Ложь); - Параметры.Вставить("ОтложенноеРезервноеКопирование", Ложь); + Параметры.Вставить("ПараметрыУдаления", ПараметрыУдаленияРезервныхКопийПоУмолчанию()); Если СохранятьПараметры Тогда УстановитьПараметрыРезервногоКопирования(Параметры); @@ -477,7 +464,7 @@ // // Возвращаемое значение - Булево - Истина, если это полноправный пользователь. // -Функция ПолучитьДоступностьРолейОповещения() Экспорт +Функция ЕстьПраваНаОповещениеОНастройкеРезервногоКопирования() Экспорт Возврат Пользователи.ЭтоПолноправныйПользователь(,Истина); КонецФункции @@ -489,12 +476,14 @@ // ИмяФайлаРезервнойКопии - Строка - имя файла резервной копии. // Процедура ЗавершитьРезервноеКопирование(Результат, ИмяФайлаРезервнойКопии = "") Экспорт - СтруктураРезультата = ПолучитьНастройкиРезервногоКопирования(); + + СтруктураРезультата = НастройкиРезервногоКопирования(); СтруктураРезультата.ПроведеноКопирование = Истина; СтруктураРезультата.РезультатКопирования = Результат; СтруктураРезультата.ИмяФайлаРезервнойКопии = ИмяФайлаРезервнойКопии; СтруктураРезультата.ПервыйЗапуск = Ложь; УстановитьПараметрыРезервногоКопирования(СтруктураРезультата); + КонецПроцедуры // Вызывается из скрипта через com-соединение для @@ -504,47 +493,175 @@ // Результат - Булево - результат восстановления. // Процедура ЗавершитьВосстановление(Результат) Экспорт - СтруктураРезультата = ПолучитьНастройкиРезервногоКопирования(); + + СтруктураРезультата = НастройкиРезервногоКопирования(); СтруктураРезультата.ПроведеноВосстановление = Истина; УстановитьПараметрыРезервногоКопирования(СтруктураРезультата); + КонецПроцедуры // Возвращает текущую настройку резервного копирования строкой // Два варианта использования функции - или с передачей всех параметров или без параметров // -Функция ТекущаяНастройкаРезервногоКопирования(КодНастройки = Неопределено, - ПриЗавершенииРаботы = Неопределено, Расписание = Неопределено) Экспорт +Функция ТекущаяНастройкаРезервногоКопирования() Экспорт - Если КодНастройки = Неопределено Тогда - НастройкиРезервногоКопирования = ПолучитьНастройкиРезервногоКопирования(); - КодНастройки = НастройкиРезервногоКопирования.ВыборПунктаНастройки; - ПриЗавершенииРаботы = НастройкиРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы; - Расписание = НастройкиРезервногоКопирования.РасписаниеКопирования; + НастройкиРезервногоКопирования = НастройкиРезервногоКопирования(); + Если НастройкиРезервногоКопирования = Неопределено Тогда + Возврат НСтр("ru = 'Для настройки резервного копирования необходимо обратиться к администратору.'"); КонецЕсли; - НадписьПоУмолчанию = НСтр("ru = 'Резервное копирование не настроено, информационная база подвергается риску потери данных.'");; + КодНастройки = НастройкиРезервногоКопирования.ВыборПунктаНастройки; - Если КодНастройки = 3 Тогда - ТекущаяНастройка = НадписьПоУмолчанию; - ИначеЕсли КодНастройки = 2 Тогда - ТекущаяНастройка = НСтр("ru = 'Резервное копирование не выполняется (организовано средствами СУБД или другими сторонними программами)'"); - Иначе - Если ПриЗавершенииРаботы Тогда + ТекущаяНастройка = НСтр("ru = 'Резервное копирование не настроено, информационная база подвергается риску потери данных.'"); + + Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда + + Если КодНастройки = 3 Тогда // Не требуется + ТекущаяНастройка = НСтр("ru = 'Резервное копирование не выполняется (организовано сторонними программами).'"); + ИначеЕсли КодНастройки = 2 Тогда // При завершении работы ТекущаяНастройка = НСтр("ru = 'Резервное копирование выполняется регулярно при завершении работы.'"); - Иначе - Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(Расписание); + ИначеЕсли КодНастройки = 1 Тогда // По расписанию + Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(НастройкиРезервногоКопирования.РасписаниеКопирования); Если Не ПустаяСтрока(Расписание) Тогда - ТекущаяНастройка = НСтр("ru = 'Резервное копирование выполняется регулярно по расписанию:'") + " " + Строка(Расписание); - Иначе - ТекущаяНастройка = НадписьПоУмолчанию; + ТекущаяНастройка = НСтр("ru = 'Резервное копирование выполняется регулярно по расписанию: %1'"); + ТекущаяНастройка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекущаяНастройка, Расписание); КонецЕсли; КонецЕсли; + + ИначеЕсли КодНастройки = 3 Тогда + + ТекущаяНастройка = НСтр("ru = 'Резервное копирование не выполняется (организовано средствами СУБД).'"); + КонецЕсли; Возврат ТекущаяНастройка; КонецФункции +Функция ПараметрыУдаленияРезервныхКопийПоУмолчанию() + + ПараметрыУдаления = Новый Структура; + + ПараметрыУдаления.Вставить("ПроизводитьУдаление", Истина); + ПараметрыУдаления.Вставить("ТипОграничения", "ПоПериоду"); + + ПараметрыУдаления.Вставить("КоличествоКопий", 10); + + ПараметрыУдаления.Вставить("ЕдиницаИзмеренияПериода", "Месяц"); + ПараметрыУдаления.Вставить("ЗначениеВЕдиницахИзмерения", 6); + + Возврат ПараметрыУдаления; + +КонецФункции + +// Обновляет настройки резервного копирования +// +Процедура ОбновитьПараметрыРезервногоКопирования_2_2_1_15() Экспорт + + ПараметрыРезервногоКопирования = НастройкиРезервногоКопирования(); + + Если ПараметрыРезервногоКопирования = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не ПараметрыРезервногоКопирования.Свойство("ПроводитьРезервноеКопированиеПриЗавершенииРаботы") + Или Не ПараметрыРезервногоКопирования.Свойство("НастроеноПользователем") Тогда + + Возврат; // Уже было выполнено обновление + + КонецЕсли; + + ВыборПунктаНастройки = ПараметрыРезервногоКопирования.ВыборПунктаНастройки; + + Если ВыборПунктаНастройки = 3 Тогда + ВыборПунктаНастройки = 0; + ИначеЕсли ВыборПунктаНастройки = 2 Тогда + ВыборПунктаНастройки = 3; + Иначе + Если ПараметрыРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы Тогда + ВыборПунктаНастройки = 2; + ИначеЕсли ПараметрыРезервногоКопирования.НастроеноПользователем И ЗначениеЗаполнено(ПараметрыРезервногоКопирования.РасписаниеКопирования) Тогда + ВыборПунктаНастройки = 1; + Иначе + ВыборПунктаНастройки = 0; + КонецЕсли; + КонецЕсли; + + ПараметрыРезервногоКопирования.ВыборПунктаНастройки = ВыборПунктаНастройки; + + МассивУдаляемыхПараметров = Новый Массив; + МассивУдаляемыхПараметров.Добавить("ЕжечасноеОповещение "); + МассивУдаляемыхПараметров.Добавить("НастроеноПользователем "); + МассивУдаляемыхПараметров.Добавить("ПроводитьРезервноеКопированиеПриЗавершенииРаботы"); + МассивУдаляемыхПараметров.Добавить("АвтоматическоеРезервноеКопирование"); + МассивУдаляемыхПараметров.Добавить("ОтложенноеРезервноеКопирование"); + + Для Каждого УдаляемыйПараметр Из МассивУдаляемыхПараметров Цикл + + Если ПараметрыРезервногоКопирования.Свойство(УдаляемыйПараметр) Тогда + + ПараметрыРезервногоКопирования.Удалить(УдаляемыйПараметр); + + КонецЕсли; + + КонецЦикла; + + УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + +КонецПроцедуры + +// Обновляет настройки резервного копирования +// +Процедура ОбновитьПараметрыРезервногоКопирования_2_2_1_33() Экспорт + + ПараметрыРезервногоКопирования = НастройкиРезервногоКопирования(); + + Если ПараметрыРезервногоКопирования = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ПараметрыРезервногоКопирования.Свойство("ПараметрыУдаления") Тогда + + Возврат; // Уже было выполнено обновление + + КонецЕсли; + + ПараметрыУдаления = ПараметрыУдаленияРезервныхКопийПоУмолчанию(); + ПараметрыУдаления.ПроизводитьУдаление = ПараметрыРезервногоКопирования.ПроизводитьУдаление; + ПараметрыУдаления.ТипОграничения = ?(ПараметрыРезервногоКопирования.УдалятьПоПериоду, "ПоПериоду", "ПоКоличеству"); + + Если ПараметрыРезервногоКопирования.УдалятьПоПериоду Тогда + ПараметрыУдаления.ТипОграничения = "ПоПериоду"; + НастройкиЗначенияПериода = ЗначениеПериодаПоИнтервалуВремени(ПараметрыРезервногоКопирования.ЗначениеПараметра); + ПараметрыУдаления.ЕдиницаИзмеренияПериода = НастройкиЗначенияПериода.ТипПериода; + ПараметрыУдаления.ЗначениеВЕдиницахИзмерения = НастройкиЗначенияПериода.ЗначениеПериода; + Иначе + ПараметрыУдаления.ТипОграничения = "ПоКоличеству"; + ПараметрыУдаления.КоличествоКопий = ПараметрыУдаления.ЗначениеПараметра; + КонецЕсли; + + ПараметрыРезервногоКопирования.Вставить("ПараметрыУдаления", ПараметрыУдаления); + + МассивУдаляемыхПараметров = Новый Массив; + МассивУдаляемыхПараметров.Добавить("ПроизводитьУдаление"); + МассивУдаляемыхПараметров.Добавить("УдалятьПоПериоду "); + МассивУдаляемыхПараметров.Добавить("ЗначениеПараметра"); + МассивУдаляемыхПараметров.Добавить("ПериодОповещения"); + + Для Каждого УдаляемыйПараметр Из МассивУдаляемыхПараметров Цикл + + Если ПараметрыРезервногоКопирования.Свойство(УдаляемыйПараметр) Тогда + + ПараметрыРезервногоКопирования.Удалить(УдаляемыйПараметр); + + КонецЕсли; + + КонецЦикла; + + УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики событий подсистем БСП @@ -558,7 +675,7 @@ // Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗавершении(Параметры) Экспорт - Параметры.Вставить("РезервноеКопированиеИБ", ПолучитьПараметрыПриЗавершенииРаботы()); + Параметры.Вставить("РезервноеКопированиеИБ", ПараметрыПриЗавершенииРаботы()); КонецПроцедуры @@ -570,7 +687,7 @@ // Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске(Параметры) Экспорт - Параметры.Вставить("РезервноеКопированиеИБ", ПолучитьНастройкиРезервногоКопирования(Истина)); + Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования(Истина)); КонецПроцедуры @@ -582,6 +699,26 @@ // Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем(Параметры) Экспорт - Параметры.Вставить("РезервноеКопированиеИБ", ПолучитьНастройкиРезервногоКопирования()); + Параметры.Вставить("РезервноеКопированиеИБ", НастройкиРезервногоКопирования()); КонецПроцедуры + +// Добавляет процедуры-обработчики обновления, необходимые данной подсистеме. +// +// Параметры: +// Обработчики - ТаблицаЗначений - см. описание функции НоваяТаблицаОбработчиковОбновления +// общего модуля ОбновлениеИнформационнойБазы. +// +Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_15"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.33"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "РезервноеКопированиеИБСервер.ОбновитьПараметрыРезервногоКопирования_2_2_1_33"; + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl index 3b5b14d79..d159dafa0 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанных/Module.bsl @@ -1,4 +1,3 @@ - //////////////////////////////////////////////////////////////////////////////// // РезервноеКопированиеОбластейДанных. // @@ -29,7 +28,7 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "РезервноеКопированиеОбластейДанных"); @@ -43,9 +42,11 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииПоддерживаемыхВерсийПрограммныхИнтерфейсов"].Добавить( "РезервноеКопированиеОбластейДанных"); - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "РезервноеКопированиеОбластейДанных"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "РезервноеКопированиеОбластейДанных"); + КонецЕсли; СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( @@ -127,15 +128,15 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.Константы.ВыполнитьРезервноеКопированиеОбластиДанных); - Объекты.Добавить(Метаданные.Константы.ДатаПоследнегоСтартаКлиентскогоСеанса); + Типы.Добавить(Метаданные.Константы.ВыполнитьРезервноеКопированиеОбластиДанных); + Типы.Добавить(Метаданные.Константы.ДатаПоследнегоСтартаКлиентскогоСеанса); КонецПроцедуры @@ -147,8 +148,8 @@ // Процедура ПриЗаполненииТаблицыПараметровИБ(ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); СтрокаПараметра = МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "ПоддержкаРезервногоКопирования"); КонецЕсли; @@ -399,6 +400,14 @@ УстановитьПривилегированныйРежим(Истина); + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда + + РаботаВМоделиСервиса.ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных"); + + КонецЕсли; + + МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных"); + ИмяАрхива = Неопределено; ПараметрыБлокировки = СоединенияИБ.НовыеПараметрыБлокировкиСоединений(); @@ -408,11 +417,12 @@ СоединенияИБ.УстановитьБлокировкуСеансовОбластиДанных(ПараметрыБлокировки, Ложь); - ИмяАрхива = ВыгрузкаЗагрузкаДанных.ВыгрузитьТекущуюОбластьВАрхив(); // Блокировка области выполняется внутри операции выгрузки - НачатьТранзакцию(); + Попытка + ИмяАрхива = МодульВыгрузкаЗагрузкаОбластейДанных.ВыгрузитьТекущуюОбластьДанныхВАрхив(); + ДатаСозданияКопии = ТекущаяУниверсальнаяДата(); ОписаниеАрхива = Новый Файл(ИмяАрхива); @@ -428,22 +438,32 @@ ИдКопии = Новый УникальныйИдентификатор; - ПараметрыСообщения = Новый Структура; - ПараметрыСообщения.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); - ПараметрыСообщения.Вставить("ИДКопии", ИдКопии); - ПараметрыСообщения.Вставить("ИДФайла", ИДФайла); - ПараметрыСообщения.Вставить("ДатаСоздания", ДатаСозданияКопии); - Для каждого КлючИЗначение Из ФлагиПериодичности Цикл - ПараметрыСообщения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; + НачатьТранзакцию(); - ОтправитьСообщениеРезервнаяКопияОбластиСоздана(ПараметрыСообщения); - - ЗафиксироватьТранзакцию(); + Попытка + + ПараметрыСообщения = Новый Структура; + ПараметрыСообщения.Вставить("ОбластьДанных", ОбщегоНазначения.ЗначениеРазделителяСеанса()); + ПараметрыСообщения.Вставить("ИДКопии", ИдКопии); + ПараметрыСообщения.Вставить("ИДФайла", ИДФайла); + ПараметрыСообщения.Вставить("ДатаСоздания", ДатаСозданияКопии); + Для каждого КлючИЗначение Из ФлагиПериодичности Цикл + ПараметрыСообщения.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; + + ОтправитьСообщениеРезервнаяКопияОбластиСоздана(ПараметрыСообщения); + + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; Исключение - ОтменитьТранзакцию(); ВызватьИсключение; КонецПопытки; @@ -617,27 +637,49 @@ Возврат; КонецЕсли; - ИмяАрхива = ВыгрузкаЗагрузкаДанных.ВыгрузитьТекущуюОбластьВАрхив(); // Блокировка области выполняется внутри операции выгрузки + Если Не ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных") Тогда + + РаботаВМоделиСервиса.ВызватьИсключениеОтсутствуетПодсистемаБТС("ТехнологияСервиса.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаОбластейДанных"); + + КонецЕсли; + + МодульВыгрузкаЗагрузкаОбластейДанных = ОбщегоНазначения.ОбщийМодуль("ВыгрузкаЗагрузкаОбластейДанных"); + + + ИмяАрхива = Неопределено; - НачатьТранзакцию(); Попытка + ИмяАрхива = МодульВыгрузкаЗагрузкаОбластейДанных.ВыгрузитьТекущуюОбластьДанныхВАрхив(); ИДФайла = РаботаВМоделиСервиса.ПоместитьФайлВХранилищеМенеджераСервиса(Новый Файл(ИмяАрхива)); Попытка УдалитьФайлы(ИмяАрхива); Исключение // При невозможности удаления файла выполнение не должно прерываться КонецПопытки; - ПараметрыВыгрузки.Вставить("ИДФайла", ИДФайла); - ПараметрыВыгрузки.Вставить("ДатаСоздания", ТекущаяУниверсальнаяДата()); - ОтправитьСообщениеРезервнаяКопияОбластиСоздана(ПараметрыВыгрузки); - Если ЗначениеЗаполнено(АдресХранилища) Тогда - ПоместитьВоВременноеХранилище(ИДФайла, АдресХранилища); - КонецЕсли; - УстановитьФлагАктивностиВОбласти(ПараметрыВыгрузки.ОбластьДанных, Ложь); - ЗафиксироватьТранзакцию(); + + НачатьТранзакцию(); + + Попытка + + ПараметрыВыгрузки.Вставить("ИДФайла", ИДФайла); + ПараметрыВыгрузки.Вставить("ДатаСоздания", ТекущаяУниверсальнаяДата()); + ОтправитьСообщениеРезервнаяКопияОбластиСоздана(ПараметрыВыгрузки); + Если ЗначениеЗаполнено(АдресХранилища) Тогда + ПоместитьВоВременноеХранилище(ИДФайла, АдресХранилища); + КонецЕсли; + УстановитьФлагАктивностиВОбласти(ПараметрыВыгрузки.ОбластьДанных, Ложь); + ЗафиксироватьТранзакцию(); + + Исключение + + ОтменитьТранзакцию(); + ВызватьИсключение; + + КонецПопытки; + Исключение - ОтменитьТранзакцию(); + ЗаписьЖурналаРегистрации(НСтр("ru = 'Создание резервной копии области данных'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); Попытка diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl index 683f380de..64be25ae6 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормИнтерфейс/Module.bsl @@ -38,10 +38,10 @@ Функция Реализация() - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеОбластейДанныхМС") Тогда - Возврат ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РезервноеКопированиеОбластейДанныхДанныеФормРеализацияИБ"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеОбластейДанныхМС") Тогда + Возврат ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанныхДанныеФормРеализацияИБ"); Иначе - Возврат ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис"); + Возврат ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис"); КонецЕсли; КонецФункции \ No newline at end of file diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl index 51b6ed74c..775a3ee72 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхДанныеФормРеализацияWebСервис/Module.bsl @@ -13,7 +13,7 @@ ОбластьДанных, КлючОбласти(), ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetSettingsFormParameters"); // Имя операции не локализуется Возврат СериализаторXDTO.ПрочитатьXDTO(Параметры); @@ -26,7 +26,7 @@ ОбластьДанных, КлючОбласти(), ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetZoneSettings"); // Имя операции не локализуется Возврат СериализаторXDTO.ПрочитатьXDTO(Параметры); @@ -41,7 +41,7 @@ СериализаторXDTO.ЗаписатьXDTO(НовыеНастройки), СериализаторXDTO.ЗаписатьXDTO(ИсходныеНастройки), ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "SetZoneSettings"); // Имя операции не локализуется КонецПроцедуры @@ -50,7 +50,7 @@ ИнформацияОбОшибке = Неопределено; Параметры = Прокси().GetDefaultSettings( ИнформацияОбОшибке); - РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке); + ОбработатьИнформациюОбОшибкеWebСервиса(ИнформацияОбОшибке, "GetDefaultSettings"); // Имя операции не локализуется Возврат СериализаторXDTO.ПрочитатьXDTO(Параметры); @@ -84,3 +84,18 @@ Возврат Прокси; КонецФункции + +// Обрабатывает информация об ошибке полученную из web-сервиса. +// В случае если передана не пустая информация об ошибке, записывает +// подробное представление ошибки в журнал регистрации и вызывает +// исключение с текстом краткого представления об ошибке. +// +Процедура ОбработатьИнформациюОбОшибкеWebСервиса(Знач ИнформацияОбОшибке, Знач ИмяОперации) + + РаботаВМоделиСервиса.ОбработатьИнформациюОбОшибкеWebСервиса( + ИнформацияОбОшибке, + РезервноеКопированиеОбластейДанныхПовтИсп.ИмяПодсистемыДляСобытийЖурналаРегистрации(), + "ZoneBackupControl", // Не локализуется + ИмяОперации); + +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl index 4dfb8ed1c..b71a8efa0 100644 --- a/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/РезервноеКопированиеОбластейДанныхПовтИсп/Module.bsl @@ -77,6 +77,17 @@ КонецФункции +// Возвращает имя подсистемы, которое должно использоваться в именах +// событий журнала регистрации. +// +// Возвращаемое значение: Строка. +// +Функция ИмяПодсистемыДляСобытийЖурналаРегистрации() Экспорт + + Возврат Метаданные.Подсистемы.СтандартныеПодсистемы.Подсистемы.РаботаВМоделиСервиса.Подсистемы.РезервноеКопированиеОбластейДанных.Имя; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Фоновые задания diff --git a/SSL/src/CommonModules/СоединенияИБ/Module.bsl b/SSL/src/CommonModules/СоединенияИБ/Module.bsl index e64ccc8b2..9ba22b088 100644 --- a/SSL/src/CommonModules/СоединенияИБ/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБ/Module.bsl @@ -219,12 +219,8 @@ // Параметры – Структура – см. НовыеПараметрыБлокировкиСоединений // ПоМестномуВремени - Булево - время начала и окончания блокировки указаны в местном времени сеанса. // Если Ложь, то в универсальном времени. -// ОбластьДанных - Число(7,0) - номер области данных, для которой устанавливается блокировка. -// При вызове из сеанса, в котором заданы значения разделителей, может быть передано только значение, -// совпадающее со значением разделителя в сеансе (или опущено). -// При вызове из сеанса, в котором не заданы значения разделителей, значение параметра не может быть опущено. // -Процедура УстановитьБлокировкуСеансовОбластиДанных(Параметры, Знач ПоМестномуВремени = Истина, Знач ОбластьДанных = -1) Экспорт +Процедура УстановитьБлокировкуСеансовОбластиДанных(Параметры, Знач ПоМестномуВремени = Истина) Экспорт Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); @@ -238,22 +234,6 @@ ВызватьИсключение НСтр("ru ='Недостаточно прав для выполнения операции'"); КонецЕсли; - Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - - Если ОбластьДанных = -1 Тогда - ОбластьДанных = ОбщегоНазначения.ЗначениеРазделителяСеанса(); - ИначеЕсли ОбластьДанных <> ОбщегоНазначения.ЗначениеРазделителяСеанса() Тогда - ВызватьИсключение НСтр("ru = 'Из сеанса с используемыми значениями разделителей нельзя установить блокировку сеансов области данных, отличной от используемой в сеансе!'"); - КонецЕсли; - - Иначе - - Если ОбластьДанных = -1 Тогда - ВызватьИсключение НСтр("ru = 'Невозможно установить блокировку сеансов области данных - не указана область данных!'"); - КонецЕсли; - - КонецЕсли; - СтруктураНастроек = Параметры; Если ТипЗнч(Параметры) = Тип("БлокировкаСеансов") Тогда СтруктураНастроек = НовыеПараметрыБлокировкиСоединений(); @@ -262,12 +242,12 @@ УстановитьПривилегированныйРежим(Истина); НаборБлокировок = РегистрыСведений.БлокировкиСеансовОбластейДанных.СоздатьНаборЗаписей(); - НаборБлокировок.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(ОбластьДанных); + НаборБлокировок.Отбор.ОбластьДанныхВспомогательныеДанные.Установить(ОбщегоНазначения.ЗначениеРазделителяСеанса()); НаборБлокировок.Прочитать(); НаборБлокировок.Очистить(); Если Параметры.Установлена Тогда Блокировка = НаборБлокировок.Добавить(); - Блокировка.ОбластьДанныхВспомогательныеДанные = ОбластьДанных; + Блокировка.ОбластьДанныхВспомогательныеДанные = ОбщегоНазначения.ЗначениеРазделителяСеанса(); Блокировка.НачалоБлокировки = ?(ПоМестномуВремени И ЗначениеЗаполнено(СтруктураНастроек.Начало), УниверсальноеВремя(СтруктураНастроек.Начало), СтруктураНастроек.Начало); Блокировка.КонецБлокировки = ?(ПоМестномуВремени И ЗначениеЗаполнено(СтруктураНастроек.Конец), @@ -359,7 +339,7 @@ // КЛИЕНТСКИЕ ОБРАБОТЧИКИ. КлиентскиеОбработчики[ - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей"].Добавить( + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"].Добавить( "СоединенияИБКлиент"); КлиентскиеОбработчики[ @@ -376,7 +356,7 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "СоединенияИБ"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса\ПриЗаполненииТаблицыПараметровИБ"].Добавить( "СоединенияИБ"); КонецЕсли; @@ -384,9 +364,9 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "СоединенияИБ"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( "СоединенияИБ"); КонецЕсли; @@ -406,8 +386,8 @@ // Процедура ПриЗаполненииТаблицыПараметровИБ(Знач ТаблицаПараметров) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ДобавитьКонстантуВТаблицуПараметровИБ(ТаблицаПараметров, "СообщениеБлокировкиПриОбновленииКонфигурации"); КонецЕсли; @@ -507,14 +487,14 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносимых между моделями при выгрузке / загрузке данных. +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(Типы). // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт - Объекты.Добавить(Метаданные.РегистрыСведений.БлокировкиСеансовОбластейДанных); + Типы.Добавить(Метаданные.РегистрыСведений.БлокировкиСеансовОбластейДанных); КонецПроцедуры @@ -590,7 +570,7 @@ Если Не СтандартнаяОбработка Тогда Возврат Результат; КонецЕсли; - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда УстановитьПривилегированныйРежим(Истина); Возврат СоединенияИБКлиентСервер.ОтключитьСеанс(НомерСеанса, СообщениеОбОшибке); Иначе // Для Linux @@ -656,7 +636,7 @@ // Функция СформироватьСообщениеБлокировки(Знач Сообщение, Знач КодРазрешения) Экспорт - ПараметрыАдминистрированияИБ = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + ПараметрыАдминистрированияИБ = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); ПризнакФайловогоРежима = Ложь; ПутьКИБ = СоединенияИБКлиентСервер.ПутьКИнформационнойБазе(ПризнакФайловогоРежима, ?(ПараметрыАдминистрированияИБ.Свойство("ПортКластераСерверов"), ПараметрыАдминистрированияИБ.ПортКластераСерверов, 0)); @@ -768,7 +748,7 @@ Функция КоличествоСеансовИнформационнойБазы(УчитыватьКонсоль = Истина, СообщенияДляЖурналаРегистрации = Неопределено) Экспорт - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); СеансыИБ = ПолучитьСеансыИнформационнойБазы(); Если УчитыватьКонсоль Тогда @@ -870,9 +850,9 @@ // Процедура ПриОтключенииСеанса(НомерСеанса, Результат, СообщениеОбОшибке, СтандартнаяОбработка) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда Возврат; КонецЕсли; @@ -883,9 +863,9 @@ // Если сервер работает не под управлением ОС Microsoft Windows, то передаем управление Агенту сервиса. СтандартнаяОбработка = Ложь; УстановитьПривилегированныйРежим(Истина); - Параметры = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + Параметры = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); Попытка - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); Результат = МодульРаботаВМоделиСервиса.УдалитьСеансыИРазорватьСоединенияЧерезАгентСервиса(НомерСеанса, Параметры); Исключение СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); diff --git a/SSL/src/CommonModules/СоединенияИБПовтИсп/Module.bsl b/SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/Module.bsl similarity index 92% rename from SSL/src/CommonModules/СоединенияИБПовтИсп/Module.bsl rename to SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/Module.bsl index b55dd8a07..31a48a9e8 100644 --- a/SSL/src/CommonModules/СоединенияИБПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/Module.bsl @@ -17,6 +17,9 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + // Возвращает структуру с параметрами для принудительного отключения сеансов. // Функция ПараметрыОтключенияСеансов() Экспорт diff --git a/SSL/src/CommonModules/СоединенияИБПовтИсп/СоединенияИБПовтИсп.mdo b/SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/СоединенияИБВызовСервераПовтИсп.mdo similarity index 67% rename from SSL/src/CommonModules/СоединенияИБПовтИсп/СоединенияИБПовтИсп.mdo rename to SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/СоединенияИБВызовСервераПовтИсп.mdo index a33c6eae5..a83e8c302 100644 --- a/SSL/src/CommonModules/СоединенияИБПовтИсп/СоединенияИБПовтИсп.mdo +++ b/SSL/src/CommonModules/СоединенияИБВызовСервераПовтИсп/СоединенияИБВызовСервераПовтИсп.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c05f15b0-a659-4473-b6d0-acebc4a2da57"> - <name>СоединенияИБПовтИсп</name> + <name>СоединенияИБВызовСервераПовтИсп</name> <synonym> <key>ru</key> - <value>Соединения ИБ Повт исп</value> + <value>Соединения ИБ вызов сервера повт исп</value> </synonym> <server>true</server> <serverCall>true</serverCall> diff --git a/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl index 4f4991d35..b562e07e3 100644 --- a/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБГлобальный/Module.bsl @@ -14,7 +14,7 @@ // Получим текущее значение параметров блокировки ТекущийРежим = СоединенияИБВызовСервера.ПараметрыБлокировкиСеансов(); БлокировкаУстановлена = ТекущийРежим.Установлена; - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); Если НЕ БлокировкаУстановлена Тогда Возврат; @@ -45,21 +45,7 @@ |%3'"), ДатаВремениНачалаБлокировки, ВремяВремениНачалаБлокировки, ТекстСообщения); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - МодульРегламентныеЗаданияСлужебныйКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РегламентныеЗаданияСлужебныйКлиент"); - ЭтоОтдельныйСеансДляВыполненияРегламентныхЗаданий = - МодульРегламентныеЗаданияСлужебныйКлиент.ЭтоОтдельныйСеансДляВыполненияРегламентныхЗаданий(); - Иначе - ЭтоОтдельныйСеансДляВыполненияРегламентныхЗаданий = Ложь; - КонецЕсли; - - Если ЭтоОтдельныйСеансДляВыполненияРегламентныхЗаданий Тогда - - Если Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < 0 Тогда - ПрекратитьРаботуСистемы(Истина, "/C """ + СтрЗаменить(ПараметрЗапуска, """", """""") + """"); - КонецЕсли; - - ИначеЕсли Не ПараметрыРаботы.РазделениеВключено + Если Не ПараметрыРаботы.РазделениеВключено И (Не ЗначениеЗаполнено(ВремяНачалаБлокировки) Или ВремяНачалаБлокировки - ТекущийМомент < ИнтервалПрекратить) Тогда СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); @@ -73,16 +59,11 @@ ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалЗакрытьСЗапросом Тогда - Результат = Вопрос(ТекстСообщения + НСтр("ru = ' - |Завершить работу?'"), РежимДиалогаВопрос.ОКОтмена, 30); - Если Результат = КодВозвратаДиалога.ОК Тогда - СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); - ЗавершитьРаботуСистемы(Истина, Ложь); - КонецЕсли; + СоединенияИБКлиент.ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения); ИначеЕсли ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалПредупреждения Тогда - Предупреждение(ТекстСообщения, 30); + ПоказатьПредупреждение(, ТекстСообщения, 30); КонецЕсли; @@ -117,7 +98,7 @@ // Такой порядок отключений необходим для обновления конфигурации с помощью пакетного файла СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь); Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус, КоличествоСеансов", "Готово", КоличествоСеансов)); - ЗавершитьРаботуЭтогоСеанса(); + СоединенияИБКлиент.ЗавершитьРаботуЭтогоСеанса(); Возврат; КонецЕсли; @@ -154,7 +135,7 @@ "e1cib/app/Обработка.БлокировкаРаботыПользователей", НСтр("ru = 'Завершение сеансов выполнено успешно'"), БиблиотекаКартинок.Информация32); Оповестить("ЗавершениеРаботыПользователей", Новый Структура("Статус,КоличествоСеансов", "Готово", КоличествоСеансов)); - ЗавершитьРаботуЭтогоСеанса(); + СоединенияИБКлиент.ЗавершитьРаботуЭтогоСеанса(); Иначе СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь); ПоказатьОповещениеПользователя(НСтр("ru = 'Завершение работы пользователей'"), @@ -165,23 +146,3 @@ КонецПроцедуры -// Завершает работу (последнего) сеанса администратора, который инициировал завершение работы пользователей. -// -Процедура ЗавершитьРаботуЭтогоСеанса(ВыводитьВопрос = Истина) Экспорт - - СоединенияИБКлиент.УстановитьПризнакРаботаПользователейЗавершается(Ложь); - ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); - - Если Не ВыводитьВопрос Тогда - ЗавершитьРаботуСистемы(Ложь); - Возврат; - КонецЕсли; - - Заголовок = НСтр("ru = 'Завершение работы текущего сеанса'"); - ТекстСообщения = НСтр("ru = 'Работа пользователей с программой запрещена. Завершить работу этого сеанса?'"); - Если Вопрос(ТекстСообщения, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да, Заголовок, КодВозвратаДиалога.Да) <> КодВозвратаДиалога.Нет Тогда - СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); - ЗавершитьРаботуСистемы(Ложь); - КонецЕсли; - -КонецПроцедуры diff --git a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl index da9d4ea36..687f7fa18 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиент/Module.bsl @@ -4,44 +4,24 @@ //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС // Выполняет действия перед началом работы системы. -// -Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт +Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт - ПараметрыРаботыКлиентаПриЗапуске = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - ТекстСообщения = ""; - Если Не ПараметрыРаботыКлиентаПриЗапуске.Свойство("СеансыОбластиДанныхЗаблокированы", ТекстСообщения) Тогда + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если Не ПараметрыКлиента.Свойство("СеансыОбластиДанныхЗаблокированы") Тогда Возврат; КонецЕсли; - ТекстВопроса = ПараметрыРаботыКлиентаПриЗапуске.ПредложениеВойти; - Если Не ПустаяСтрока(ТекстВопроса) Тогда - Кнопки = Новый СписокЗначений(); - Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Войти'")); - Если ПараметрыРаботыКлиентаПриЗапуске.ВозможноСнятьБлокировку Тогда - Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Снять блокировку и войти'")); - КонецЕсли; - Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); - Ответ = Вопрос(ТекстВопроса, Кнопки, 15, КодВозвратаДиалога.Отмена,, КодВозвратаДиалога.Отмена); - Если Ответ = КодВозвратаДиалога.Да Тогда // входим в заблокированное приложение - Возврат; - ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // снимаем блокировку и входим в приложение - СоединенияИБВызовСервера.УстановитьБлокировкуСеансовОбластиДанных(Новый Структура("Установлена", Ложь)); - Возврат; - КонецЕсли; - Иначе - Предупреждение(ТекстСообщения, 15); - КонецЕсли; - - Отказ = Истина; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПередНачаломРаботыСистемы", ЭтотОбъект); КонецПроцедуры // Выполняет действия при начале работы системы. -// -Процедура ПриНачалеРаботыСистемы() Экспорт +Процедура ПослеНачалаРаботыСистемы() Экспорт ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); Если НЕ ПараметрыРаботы.ДоступноИспользованиеРазделенныхДанных Тогда @@ -49,7 +29,7 @@ КонецЕсли; Если ПолучитьСкоростьКлиентскогоСоединения() <> СкоростьКлиентскогоСоединения.Обычная Тогда - Возврат; + Возврат; КонецЕсли; РежимБлокировки = ПараметрыРаботы.ПараметрыБлокировкиСеансов; @@ -62,7 +42,7 @@ Возврат; КонецЕсли; - ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); + ПодключитьОбработчикОжидания("КонтрольРежимаЗавершенияРаботыПользователей", 60); КонецПроцедуры @@ -89,11 +69,11 @@ Если НЕ СоединенияИБВызовСервера.РазрешитьРаботуПользователей() Тогда ТекстСообщения = НСтр("ru = 'Параметр запуска РазрешитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(,ТекстСообщения); Возврат Ложь; КонецЕсли; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиентСервер.СобытиеЖурналаРегистрации(),, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СоединенияИБКлиентСервер.СобытиеЖурналаРегистрации(),, Нстр("ru = 'Выполнен запуск с параметром ""РазрешитьРаботуПользователей"". Работа программы будет завершена.'"), ,Истина); ЗавершитьРаботуСистемы(Ложь); Возврат Истина; @@ -114,16 +94,15 @@ Если НЕ СоединенияИБВызовСервера.УстановитьБлокировкуСоединений() Тогда ТекстСообщения = НСтр("ru = 'Параметр запуска ЗавершитьРаботуПользователей не отработан. Нет прав на администрирование информационной базы.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(,ТекстСообщения); Возврат Ложь; КонецЕсли; ПодключитьОбработчикОжидания("ЗавершитьРаботуПользователей", 60); ЗавершитьРаботуПользователей(); - Возврат Истина; + Возврат Ложь; // продолжить запуск программы КонецЕсли; - Возврат Ложь; КонецФункции @@ -151,27 +130,37 @@ КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Завершает работу (последнего) сеанса администратора, который инициировал завершение работы пользователей. +// +Процедура ЗавершитьРаботуЭтогоСеанса(ВыводитьВопрос = Истина) Экспорт + + УстановитьПризнакРаботаПользователейЗавершается(Ложь); + ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей"); + + Если Не ВыводитьВопрос Тогда + ЗавершитьРаботуСистемы(Ложь); + Возврат; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ЗавершитьРаботуЭтогоСеансаЗавершение", ЭтотОбъект); + ТекстСообщения = НСтр("ru = 'Работа пользователей с программой запрещена. Завершить работу этого сеанса?'"); + Заголовок = НСтр("ru = 'Завершение работы текущего сеанса'"); + ПоказатьВопрос(Оповещение, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Да, Заголовок, КодВозвратаДиалога.Да); + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в эту подсистему // Вызывается при неудачной попытке установить монопольный режим в файловой базе. -// -// Параметры: -// Отказ - булево - если Истина - завершает работу программы // -Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Отказ) Экспорт +// Параметры: +// Оповещение - ОписаниеОповещения - описывает, куда надо передать управление после закрытия формы. +// +Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение) Экспорт - ПараметрыФормы = Новый Структура; - ЗавершитьРаботуПрограммы = ОткрытьФормуМодально( - "Обработка.БлокировкаРаботыПользователей.Форма.ОшибкаУстановкиМонопольногоРежима", - ПараметрыФормы); - Если ЗавершитьРаботуПрограммы = Неопределено - Или ЗавершитьРаботуПрограммы Тогда - Отказ = Истина; - КонецЕсли; + ОткрытьФорму("Обработка.БлокировкаРаботыПользователей.Форма.ОшибкаУстановкиМонопольногоРежима", + , , , , , Оповещение); КонецПроцедуры @@ -222,4 +211,80 @@ КонецПроцедуры +/////////////////////////////////////////////////////////////////////////////// +// Обработчики оповещений. +// Предлагает снять блокировку и войти или прекратить работу системы. +Процедура ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры, Неопределен) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + ТекстВопроса = ПараметрыКлиента.ПредложениеВойти; + ТекстСообщения = ПараметрыКлиента.СеансыОбластиДанныхЗаблокированы; + + Если Не ПустаяСтрока(ТекстВопроса) Тогда + Кнопки = Новый СписокЗначений(); + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Войти'")); + Если ПараметрыКлиента.ВозможноСнятьБлокировку Тогда + Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Снять блокировку и войти'")); + КонецЕсли; + Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); + + ОбработкаОтвета = Новый ОписаниеОповещения( + "ПослеОтветаНаВопросВойтиИлиСнятьБлокировку", ЭтотОбъект, Параметры); + + ПоказатьВопрос(ОбработкаОтвета, ТекстВопроса, Кнопки, 15, + КодВозвратаДиалога.Отмена,, КодВозвратаДиалога.Отмена); + Возврат; + Иначе + Параметры.Отказ = Истина; + ПоказатьПредупреждение( + СтандартныеПодсистемыКлиент.ОповещениеБезРезультата(Параметры.ОбработкаПродолжения), + ТекстСообщения, 15); + КонецЕсли; + +КонецПроцедуры + +// Продолжение предыдущей процедуры. +Процедура ПослеОтветаНаВопросВойтиИлиСнятьБлокировку(Ответ, Параметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда // Входим в заблокированное приложение. + + ИначеЕсли Ответ = КодВозвратаДиалога.Нет Тогда // Снимаем блокировку и входим в приложение. + СоединенияИБВызовСервера.УстановитьБлокировкуСеансовОбластиДанных( + Новый Структура("Установлена", Ложь)); + Иначе + Параметры.Отказ = Истина; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +Процедура ЗадатьВопросПриЗавершенииРаботы(ТекстСообщения) Экспорт + + ТекстВопроса = НСтр("ru = '%1 + |Завершить работу?'"); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ТекстСообщения); + ОписаниеОповещения = Новый ОписаниеОповещения("ЗадатьВопросПриЗавершенииРаботыЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Да); + +КонецПроцедуры + +Процедура ЗадатьВопросПриЗавершенииРаботыЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(Истина, Ложь); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗавершитьРаботуЭтогоСеансаЗавершение(Ответ, Параметры) Экспорт + + Если Ответ <> КодВозвратаДиалога.Нет Тогда + СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(Ложь); + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl index c25052b74..9b34a9425 100644 --- a/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СоединенияИБКлиентСервер/Module.bsl @@ -80,7 +80,7 @@ #Если НаКлиенте Тогда Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Или ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда // Передаем управление на сервер Возврат СоединенияИБВызовСервера.ОтключитьСоединенияИБ(ПараметрыАдминистрированияИБ); КонецЕсли; @@ -140,7 +140,7 @@ #Если НаКлиенте Тогда Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда // Передаем управление на сервер СоединенияИБВызовСервера.ПроверитьПараметрыАдминистрированияИБ(ПараметрыАдминистрированияИБ, ПодробноеСообщениеОбОшибке); КонецЕсли; @@ -173,12 +173,12 @@ Процедура УстановитьБлокировкуРегламентныхЗаданий(Значение) Экспорт Если ИнформационнаяБазаФайловая() Тогда - ВызватьИсключение НСтр("ru = 'Невозможно установить блокировку регламентных и фоновых заданий в файловом режиме работы'"); + ВызватьИсключение НСтр("ru = 'Невозможно установить блокировку регламентных и фоновых заданий в файловом режиме работы'"); КонецЕсли; #Если НаКлиенте Тогда Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда // Передаем управление на сервер СоединенияИБВызовСервера.УстановитьБлокировкуРегламентныхЗаданий(Значение); КонецЕсли; @@ -206,7 +206,7 @@ #Если НаКлиенте Тогда Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда - Если СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + Если СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда // Передаем управление на сервер Возврат СоединенияИБВызовСервера.БлокировкаРегламентныхЗаданийУстановлена(); КонецЕсли; @@ -533,7 +533,7 @@ // Функция ПодключитьсяКТекущейИБ() - ПараметрыАдминистрированияИБ = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + ПараметрыАдминистрированияИБ = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); Подключение = ПодключитьсяКРабочемуПроцессу(ПараметрыАдминистрированияИБ); Подключение.РабочийПроцесс.AddAuthentication(ПараметрыАдминистрированияИБ.ИмяАдминистратораИБ, ПараметрыАдминистрированияИБ.ПарольАдминистратораИБ); @@ -573,7 +573,7 @@ // Подключение к агенту сервера Параметры = ПараметрыАдминистрированияИБ; Если Параметры = Неопределено Тогда - Параметры = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + Параметры = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); КонецЕсли; Подключение = ПодключитьсяКАгентуСервера(Параметры); Результат.АгентСервера = Подключение.АгентСервера; @@ -591,7 +591,7 @@ Параметры.ПарольАдминистратораКластера); // Получаем список сеансов - НомерТекущегоСеанса = СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().НомерСеансаИнформационнойБазы; + НомерТекущегоСеанса = СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().НомерСеансаИнформационнойБазы; СписокСеансов = Подключение.АгентСервера.GetSessions(Кластер); Для Каждого Сеанс из СписокСеансов Цикл Если ВРег(Сеанс.InfoBase.Name) <> ВРег(Подключение.ИмяИБ) Тогда @@ -631,7 +631,7 @@ #КонецЕсли // Подключение к агенту сервера - ПараметрыАдминистрированияИБ = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + ПараметрыАдминистрированияИБ = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); Подключение = ПодключитьсяКАгентуСервера(ПараметрыАдминистрированияИБ); // Найдем необходимый нам кластер @@ -694,7 +694,7 @@ ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), ПредопределенноеЗначение("УровеньЖурналаРегистрации." + ПредставлениеУровня),,, ТекстСобытия); #Иначе - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), ПредставлениеУровня, ТекстСобытия,,Записать); #КонецЕсли КонецПроцедуры diff --git a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl index aec2af4bd..5ebbfc83b 100644 --- a/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияАдминистрированиеОбменаДаннымиУправлениеОбработчикСообщения_2_1_2_1/Module.bsl @@ -280,11 +280,11 @@ Если НастройкиТранспорта.ВидТранспортаСообщенийОбменаПоУмолчанию = Перечисления.ВидыТранспортаСообщенийОбмена.FILE Тогда Если Не ПустаяСтрока(НастройкиТранспорта.FILEОбщийКаталогОбменаИнформацией) - И Не ПустаяСтрока(НастройкиТранспорта.ОтносительныйКаталогОбменаИнформацией) Тогда + И Не ПустаяСтрока(НастройкиТранспорта.FILEОтносительныйКаталогОбменаИнформацией) Тогда АбсолютныйКаталогОбменаИнформацией = ОбщегоНазначенияКлиентСервер.ПолучитьПолноеИмяФайла( НастройкиТранспорта.FILEОбщийКаталогОбменаИнформацией, - НастройкиТранспорта.ОтносительныйКаталогОбменаИнформацией); + НастройкиТранспорта.FILEОтносительныйКаталогОбменаИнформацией); АбсолютныйКаталог = Новый Файл(АбсолютныйКаталогОбменаИнформацией); diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl index 5f7bb6947..09274e1d6 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервиса/Module.bsl @@ -307,7 +307,7 @@ Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриОтправкеСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); КонецЕсли; @@ -345,7 +345,7 @@ Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + МодульСообщенияВМоделиСервисаРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); МодульСообщенияВМоделиСервисаРазделениеДанных.ПриПолученииСообщения(КаналСообщений, ТелоСообщения, ОбъектСообщения); КонецЕсли; diff --git a/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl b/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl index 47da17532..71be92190 100644 --- a/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl +++ b/SSL/src/CommonModules/СообщенияВМоделиСервисаОбработчикСообщений/Module.bsl @@ -18,7 +18,7 @@ УстановитьПривилегированныйРежим(Истина); Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - РазделенныйМодуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); + РазделенныйМодуль = ОбщегоНазначения.ОбщийМодуль("СообщенияВМоделиСервисаРазделениеДанных"); КонецЕсли; // Чтение сообщения diff --git a/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl b/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl index 8d3c02c08..7e779f506 100644 --- a/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl +++ b/SSL/src/CommonModules/СообщенияОбменаДаннымиОбработчикСообщения/Module.bsl @@ -121,7 +121,7 @@ СтруктураЗаписи = Новый Структура; СтруктураЗаписи.Вставить("Корреспондент", Корреспондент); СтруктураЗаписи.Вставить("КонечнаяТочкаКорреспондента", КонечнаяТочкаКорреспондента); - СтруктураЗаписи.Вставить("КаталогОбменаИнформацией", Настройки.ОтносительныйКаталогОбменаИнформацией); + СтруктураЗаписи.Вставить("КаталогОбменаИнформацией", Настройки.FILEОтносительныйКаталогОбменаИнформацией); РегистрыСведений.НастройкиТранспортаОбменаОбластиДанных.ОбновитьЗапись(СтруктураЗаписи); diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl index 9ea0875c4..735adc672 100644 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияОбработчикСообщения_1_0_3_4/Module.bsl @@ -42,8 +42,8 @@ Словарь = СообщенияУдаленногоАдминистрированияИнтерфейс; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - СловарьДОиО = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + СловарьДОиО = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиИнтерфейс"); Иначе СловарьДОиО = Неопределено; КонецЕсли; @@ -201,12 +201,12 @@ Процедура УстановитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда Попытка - МодульДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс"); - МодульДополнительныеОтчетыИОбработкиКлиентСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиентСервер"); + МодульДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервисаМанифестИнтерфейс"); + МодульДополнительныеОтчетыИОбработкиКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиентСервер"); ТелоСообщения = Сообщение.Body; @@ -330,12 +330,12 @@ ТелоСообщения.Representation, ТелоСообщения.Installation); - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); + МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.УстановитьДополнительныйОтчетИлиОбработку( ОписаниеИнсталляции, НастройкиКоманд, НастройкиРасположенияКоманд, НастройкиРазделов, НастройкиНазначения, НастройкиВариантов, ТелоСообщения.InitiatorServiceID); - + Исключение ТекстИсключения = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()); @@ -351,11 +351,11 @@ Процедура УдалитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда ТелоСообщения = Сообщение.Body; - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); + МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.УдалитьДополнительныйОтчетИлиОбработку( ТелоСообщения.Extension, ТелоСообщения.Installation); @@ -366,9 +366,9 @@ Процедура ОтключитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); + МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ОтключитьДополнительныйОтчетИлиОбработку( Сообщение.Body.Extension); @@ -379,9 +379,9 @@ Процедура ВключитьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); + МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ВключитьДополнительныйОтчетИлиОбработку( Сообщение.Body.Extension); @@ -392,9 +392,9 @@ Процедура ОтозватьДополнительныйОтчетИлиОбработку(Знач Сообщение, Знач Отправитель) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); + МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация = ОбщегоНазначения.ОбщийМодуль("СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация"); МодульСообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация.ОтозватьДополнительныйОтчетИлиОбработку( Сообщение.Body.Extension); diff --git a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl index 1d4c69bab..9c4485d5a 100644 --- a/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУдаленногоАдминистрированияРеализация/Module.bsl @@ -388,12 +388,7 @@ Знач ПредставлениеОбластиДанных, Знач ЧасовойПоясОбластиДанных = Неопределено) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ВнешнийМонопольныйРежим = РаботаВМоделиСервиса.УстановленМонопольныйРежим(); - Иначе - ВнешнийМонопольныйРежим = Ложь; - КонецЕсли; + ВнешнийМонопольныйРежим = МонопольныйРежим(); Если Не ВнешнийМонопольныйРежим Тогда РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(); @@ -419,6 +414,7 @@ Исключение ОтменитьТранзакцию(); + Если Не ВнешнийМонопольныйРежим Тогда РаботаВМоделиСервиса.РазблокироватьТекущуюОбластьДанных(); КонецЕсли; @@ -444,9 +440,9 @@ ПользовательОбластиДанных = ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса(ИдентификаторПользователяСервиса); Если ПользователиСлужебный.ЗапретРедактированияРолей() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьПринадлежностьПользователяКГруппеАдминистраторы(ПользовательОбластиДанных, ДоступРазрешен); Иначе @@ -558,11 +554,7 @@ // Процедура ПрикрепитьОбластьДанных(Параметры) Экспорт - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ВнешнийМонопольныйРежим = РаботаВМоделиСервиса.УстановленМонопольныйРежим(); - Иначе - ВнешнийМонопольныйРежим = Ложь; - КонецЕсли; + ВнешнийМонопольныйРежим = МонопольныйРежим(); Если Не ВнешнийМонопольныйРежим Тогда РаботаВМоделиСервиса.ЗаблокироватьТекущуюОбластьДанных(); @@ -587,11 +579,9 @@ КонецЕсли; МенеджерЗаписи.Статус = Перечисления.СтатусыОбластейДанных.Используется; - КопияМенеджера = РегистрыСведений.ОбластиДанных.СоздатьМенеджерЗаписи(); ЗаполнитьЗначенияСвойств(КопияМенеджера, МенеджерЗаписи); МенеджерЗаписи = КопияМенеджера; - МенеджерЗаписи.Записать(); ОбновитьПараметрыТекущейОбластиДанных(Параметры.Presentation, Параметры.TimeZone); @@ -673,9 +663,9 @@ ПользовательОбластиДанных = ПользовательОбъект.Ссылка; Если ПользователиСлужебный.ЗапретРедактированияРолей() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьПринадлежностьПользователяКГруппеАдминистраторы(ПользовательОбластиДанных, Истина); КонецЕсли; КонецЦикла; @@ -892,4 +882,4 @@ КонецЦикла; -КонецПроцедуры +КонецПроцедуры \ No newline at end of file diff --git a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиОбработчикСообщения_1_0_1_1/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиОбработчикСообщения_1_0_1_1/Module.bsl index 50d688f6f..74ae460e8 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиОбработчикСообщения_1_0_1_1/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиОбработчикСообщения_1_0_1_1/Module.bsl @@ -67,7 +67,7 @@ ТелоСообщения = Сообщение.Body; Попытка - + НастройкиКоманд = Новый ТаблицаЗначений(); НастройкиКоманд.Колонки.Добавить("Идентификатор"); НастройкиКоманд.Колонки.Добавить("БыстрыйДоступ"); diff --git a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl index f21850fb1..e0e53b646 100644 --- a/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl +++ b/SSL/src/CommonModules/СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация/Module.bsl @@ -108,7 +108,7 @@ ВариантыДополнительногоОтчета, ПолучитьПользователяОбластиПоИдентификаторуПользователяСервиса( ИдентификаторПользователяСервиса)); - + КонецПроцедуры // Обработка входящих сообщений с типом {http://www.1c.ru/1cFresh/ApplicationExtensions/Management/a.b.c.d}DeleteExtension diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl index 2f970b42a..92f25771a 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыВызовСервера/Module.bsl @@ -25,8 +25,13 @@ // Функция ПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт - Если Параметры.ПервыйЗапросПараметров Тогда + ЗапомнитьВременныеПараметры(Параметры); + + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено Тогда ОбновитьПовторноИспользуемыеЗначения(); + Если НЕ Параметры.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда + СкрытьРабочийСтолПриНачалеРаботыСистемы(Ложь); + КонецЕсли; КонецЕсли; ПривилегированныйРежимУстановленПриЗапуске = ПривилегированныйРежим(); @@ -43,11 +48,9 @@ КонецЕсли; УстановитьПривилегированныйРежим(Ложь); - // СтандартныеПодсистемы.БазоваяФункциональность Если НЕ СтандартныеПодсистемыСервер.ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Тогда - Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); + Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске"); @@ -55,7 +58,6 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗапуске(Параметры); КонецЦикла; - // СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗапуске"); @@ -63,15 +65,14 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентаПриЗапуске(Параметры); КонецЦикла; - ПрикладныеПараметры = ОбщегоНазначенияВызовСервераПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске(); + ПрикладныеПараметры = Новый Структура; ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗапуске(ПрикладныеПараметры); Для Каждого Параметр Из ПрикладныеПараметры Цикл Параметры.Вставить(Параметр.Ключ, Параметр.Значение); КонецЦикла; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); + Возврат ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры); КонецФункции @@ -89,7 +90,6 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем(Параметры); КонецЦикла; - // СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиента"); @@ -97,13 +97,12 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиента(Параметры); КонецЦикла; - ПрикладныеПараметры = ОбщегоНазначенияВызовСервераПереопределяемый.ПараметрыРаботыКлиента(); + ПрикладныеПараметры = Новый Структура; ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиента(ПрикладныеПараметры); Для Каждого Параметр Из ПрикладныеПараметры Цикл Параметры.Вставить(Параметр.Ключ, Параметр.Значение); КонецЦикла; - // Конец СтандартныеПодсистемы.БазоваяФункциональность Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); @@ -157,6 +156,43 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// Устанавливает состояние отмены при создании форм рабочего стола. +// Требуется, если при запуске программы возникает необходимость +// взаимодействия с пользователем (интерактивная обработка). +// +// Используется из одноименной процедуры в модуле СтандартныеПодсистемыКлиент. +// Прямой вызов на сервере имеет смысл для сокращения серверных вызовов, +// если при подготовке параметров клиента через модуль ПовтИсп уже +// известно, что интерактивная обработка требуется. +// +// Если прямой вызов сделан из процедуры получения параметров клиент, +// то состояние на клиенте будет обновлено автоматически, в другом случае +// это нужно сделать самостоятельно на клиенте с помощью одноименной процедуры +// в модуле СтандартныеПодсистемыКлиент. +// +// Параметры: +// Скрыть - Булево. Если установить Истина, состояние будет установлено, +// если установить Ложь, состояние будет снято (после этого +// можно выполнить метод ОбновитьИнтерфейс и формы рабочего +// стола будут пересозданы). +// +Процедура СкрытьРабочийСтолПриНачалеРаботыСистемы(Скрыть = Истина) Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); + + Если Скрыть = Истина Тогда + ТекущиеПараметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Истина); + + ИначеЕсли ТекущиеПараметры.Получить("СкрытьРабочийСтолПриНачалеРаботыСистемы") <> Неопределено Тогда + ТекущиеПараметры.Удалить("СкрытьРабочийСтолПриНачалеРаботыСистемы"); + КонецЕсли; + + ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ТекущиеПараметры); + +КонецПроцедуры + // Возвращает структуру параметров, необходимых для работы клиентского кода // конфигурации при завершении работы. // @@ -171,7 +207,6 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистемПриЗавершении(Параметры); КонецЦикла; - // СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентаПриЗавершении"); @@ -179,7 +214,7 @@ Обработчик.Модуль.ПриДобавленииПараметровРаботыКлиентаПриЗавершении(Параметры); КонецЦикла; - ПрикладныеПараметры = ОбщегоНазначенияВызовСервераПереопределяемый.ПараметрыРаботыКлиентаПриЗавершении(); + ПрикладныеПараметры = Новый Структура; ОбщегоНазначенияПереопределяемый.ПараметрыРаботыКлиентаПриЗавершении(ПрикладныеПараметры); Для Каждого Параметр Из ПрикладныеПараметры Цикл @@ -187,7 +222,6 @@ КонецЦикла; Возврат ОбщегоНазначения.ФиксированныеДанные(Параметры); - // Конец СтандартныеПодсистемы.БазоваяФункциональность КонецФункции @@ -237,6 +271,23 @@ КонецПроцедуры +// Возвращает Ложь, если установка монопольного режима возможна. +Функция ОшибкаУстановкиМонопольногоРежима() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + Отказ = Ложь; + Попытка + УстановитьМонопольныйРежим(Истина); + УстановитьМонопольныйРежим(Ложь); + Исключение + Отказ = Истина + КонецПопытки; + + Возврат Отказ; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Работа с предопределенными данными @@ -248,3 +299,40 @@ Возврат СтандартныеПодсистемыПовтИсп.ПредопределенныйЭлемент(ПолноеИмяПредопределенного); КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +Процедура ЗапомнитьВременныеПараметры(Параметры) + + Параметры.Вставить("ИменаВременныхПараметров", Новый Массив); + + Для каждого КлючИЗначение Из Параметры Цикл + Параметры.ИменаВременныхПараметров.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + +КонецПроцедуры + +Функция ФиксированныеПараметрыКлиентаБезВременныхПараметров(Параметры) + + ПараметрыКлиента = Параметры; + Параметры = Новый Структура; + + Для каждого ИмяВременногоПараметра Из ПараметрыКлиента.ИменаВременныхПараметров Цикл + Параметры.Вставить(ИмяВременногоПараметра, ПараметрыКлиента[ИмяВременногоПараметра]); + ПараметрыКлиента.Удалить(ИмяВременногоПараметра); + КонецЦикла; + Параметры.Удалить("ИменаВременныхПараметров"); + + УстановитьПривилегированныйРежим(Истина); + + Параметры.СкрытьРабочийСтолПриНачалеРаботыСистемы = + ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить( + "СкрытьРабочийСтолПриНачалеРаботыСистемы") <> Неопределено; + + УстановитьПривилегированныйРежим(Ложь); + + Возврат ОбщегоНазначения.ФиксированныеДанные(ПараметрыКлиента); + +КонецФункции + diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl new file mode 100644 index 000000000..e0e0f128a --- /dev/null +++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/Module.bsl @@ -0,0 +1,16 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Базовая функциональность". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Продолжает завершение в режиме интерактивного взаимодействия с пользователем +// после установки Отказ = Истина. +// +Процедура ОбработчикОжиданияИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы() Экспорт + + СтандартныеПодсистемыКлиент.НачатьИнтерактивнуюОбработкуПередЗавершениемРаботыСистемы(); + +КонецПроцедуры diff --git a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/РегламентныеЗаданияСлужебныйГлобальный.mdo b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/СтандартныеПодсистемыГлобальный.mdo similarity index 55% rename from SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/РегламентныеЗаданияСлужебныйГлобальный.mdo rename to SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/СтандартныеПодсистемыГлобальный.mdo index 0af1bcdd5..fce7f7ab3 100644 --- a/SSL/src/CommonModules/РегламентныеЗаданияСлужебныйГлобальный/РегламентныеЗаданияСлужебныйГлобальный.mdo +++ b/SSL/src/CommonModules/СтандартныеПодсистемыГлобальный/СтандартныеПодсистемыГлобальный.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0e2c2490-50ee-4fed-9119-5dec8385f925"> - <name>РегламентныеЗаданияСлужебныйГлобальный</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa"> + <name>СтандартныеПодсистемыГлобальный</name> <synonym> <key>ru</key> - <value>Регламентные задания служебный глобальный</value> + <value>Стандартные подсистемы глобальный</value> </synonym> <global>true</global> <clientManagedApplication>true</clientManagedApplication> diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl index aa9baaaf5..1f659ab75 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиент/Module.bsl @@ -6,6 +6,65 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Открывает форму объединения элементов справочников, планов видов характеристик, видов расчетов и счетов. +// +// Параметры: +// ОбъединяемыеЭлементы - ТаблицаФормы, Массив, СписокЗначений - список элементов к объединению. +// Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". +// +Процедура ОбъединитьВыделенные(Знач ОбъединяемыеЭлементы) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НаборСсылок", НаборСсылок(ОбъединяемыеЭлементы)); + ОткрытьФорму("Обработка.ЗаменаСсылок.Форма.ОбъединениеЭлементов", ПараметрыФормы); + +КонецПроцедуры + +// Открывает форму замены ссылок объединением. +// +// Параметры: +// ОбъединяемыеЭлементы - ТаблицаФормы, Массив, СписокЗначений - список элементов к замене. +// Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". +// +Процедура ЗаменитьВыделенные(Знач ОбъединяемыеЭлементы) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НаборСсылок", НаборСсылок(ОбъединяемыеЭлементы)); + ПараметрыФормы.Вставить("ОткрытаПоСценарию"); + ОткрытьФорму("Обработка.ЗаменаСсылок.Форма.ЗаменаЭлементов", ПараметрыФормы); + +КонецПроцедуры + +// Открывает отчет о местах использования ссылок. +// В отчет не включаются вспомогательные данные, такие как наборы записей с ведущим измерением и т.п. +// +// Параметры: +// +// Элементы - ТаблицаФормы, Массив, СписокЗначений - список элементов для анализа. +// Также можно передать произвольную коллекцию элементов с реквизитом "Ссылка". +// +// ПараметрыОткрытия - Структура - параметры открытия формы. Состоит из необязательных полей +// Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна, +// соответствующих параметрам функции ОткрытьФорму +// +Процедура ПоказатьМестаИспользования(Знач Элементы, Знач ПараметрыОткрытия = Неопределено) Экспорт + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("НаборСсылок", НаборСсылок(Элементы)); + + ПараметрыОткрытияФормы = Новый Структура("Владелец, Уникальность, Окно, НавигационнаяСсылка, ОписаниеОповещенияОЗакрытии, РежимОткрытияОкна"); + Если ПараметрыОткрытия <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(ПараметрыОткрытияФормы, ПараметрыОткрытия); + КонецЕсли; + + ОткрытьФорму("Отчет.МестаИспользованияСсылок.Форма", ПараметрыФормы, + ПараметрыОткрытияФормы.Владелец, ПараметрыОткрытияФормы.Уникальность, ПараметрыОткрытияФормы.Окно, + ПараметрыОткрытияФормы.НавигационнаяСсылка, ПараметрыОткрытияФормы.ОписаниеОповещенияОЗакрытии, + ПараметрыОткрытияФормы.РежимОткрытияОкна + ); + +КонецПроцедуры + // Устанавливает заголовок главного окна приложения, используя представление текущего пользователя, // значение константы ЗаголовокПриложения и заголовок приложения по умолчанию. // @@ -44,23 +103,9 @@ НСтр("ru = 'Не установлены разделители'"), ПараметрыКлиента.ПодробнаяИнформация); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - -#Если ВебКлиент Тогда - Результат = Вычислить("УстановитьЗаголовокКлиентскогоПриложения(ЗаголовокПриложения)"); -#Иначе - Выполнить("УстановитьЗаголовокКлиентскогоПриложения(ЗаголовокПриложения)"); -#КонецЕсли - - Иначе - -#Если ВебКлиент Тогда - Результат = Вычислить("УстановитьЗаголовокПриложения(ЗаголовокПриложения)"); -#Иначе - Выполнить("УстановитьЗаголовокПриложения(ЗаголовокПриложения)"); -#КонецЕсли - - КонецЕсли; + ОбщегоНазначенияКлиентПереопределяемый.ПриУстановкеЗаголовкаКлиентскогоПриложения(ЗаголовокПриложения, ПриЗапуске); + + УстановитьЗаголовокКлиентскогоПриложения(ЗаголовокПриложения); КонецПроцедуры @@ -72,20 +117,340 @@ КонецПроцедуры +// Показать форму вопроса. +// +// Параметры: +// ОписаниеОповещенияОЗавершении - ОписаниеОповещения - описание процедуры, которая будет вызвана после закрытия окна вопроса +// со следующими параметрами: +// РезультатВопроса - Структура - структура со свойствами: +// Значение - результат выбора пользователя: значение системного перечисления или значение, +// связанное с нажатой кнопкой. В случае закрытия диалога по истечении времени - значение Таймаут. +// БольшеНеЗадаватьЭтотВопрос - Булево - результат выбора пользователя в одноименном флажке. +// ДополнительныеПараметры - Структура +// ТекстВопроса - Строка - текст задаваемого вопроса. +// Кнопки - РежимДиалогаВопрос, СписокЗначений - может быть задан список значений, в котором +// Значение – содержит значение, связанное с +// кнопкой и возвращаемое при выборе кнопки. В качестве значения может использоваться значение +// перечисления КодВозвратаДиалога, а также другие значения, поддерживающее XDTO-сериализацию. +// Представление – задает текст кнопки. +// +// ДополнительныеПараметры - Структура - дополнительные параметры, см. описание к ПараметрыВопросаПользователю. +// +// Возвращаемое значение: +// Результат выбора пользователя будет передан в метод, описанный параметром ОписаниеОповещенияОЗавершении. +// +Процедура ПоказатьВопросПользователю(ОписаниеОповещенияОЗавершении, ТекстВопроса, Кнопки, ДополнительныеПараметры = Неопределено) Экспорт + + Если ДополнительныеПараметры <> Неопределено Тогда + Параметры = ДополнительныеПараметры; + Иначе + Параметры = ПараметрыВопросаПользователю(); + КонецЕсли; + + Если ТипЗнч(Кнопки) = Тип("РежимДиалогаВопрос") Тогда + Если Кнопки = РежимДиалогаВопрос.ДаНет Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ДаНет"; + ИначеЕсли Кнопки = РежимДиалогаВопрос.ДаНетОтмена Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ДаНетОтмена"; + ИначеЕсли Кнопки = РежимДиалогаВопрос.ОК Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ОК"; + ИначеЕсли Кнопки = РежимДиалогаВопрос.ОКОтмена Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ОКОтмена"; + ИначеЕсли Кнопки = РежимДиалогаВопрос.ПовторитьОтмена Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ПовторитьОтмена"; + ИначеЕсли Кнопки = РежимДиалогаВопрос.ПрерватьПовторитьПропустить Тогда + КнопкиПараметр = "РежимДиалогаВопрос.ПрерватьПовторитьПропустить"; + КонецЕсли; + Иначе + КнопкиПараметр = Кнопки; + КонецЕсли; + + Если ТипЗнч(Параметры.КнопкаПоУмолчанию) = Тип("КодВозвратаДиалога") Тогда + КнопкаПоУмолчаниюПараметр = КодВозвратаДиалогаВСтроку(Параметры.КнопкаПоУмолчанию); + Иначе + КнопкаПоУмолчаниюПараметр = Параметры.КнопкаПоУмолчанию; + КонецЕсли; + + Если ТипЗнч(Параметры.КнопкаТаймаута) = Тип("КодВозвратаДиалога") Тогда + КнопкаТаймаутаПараметр = КодВозвратаДиалогаВСтроку(Параметры.КнопкаТаймаута); + Иначе + КнопкаТаймаутаПараметр = Параметры.КнопкаТаймаута; + КонецЕсли; + + Параметры.Вставить("Кнопки", КнопкиПараметр); + Параметры.Вставить("Таймаут", Параметры.Таймаут); + Параметры.Вставить("КнопкаПоУмолчанию", КнопкаПоУмолчаниюПараметр); + Параметры.Вставить("Заголовок", Параметры.Заголовок); + Параметры.Вставить("КнопкаТаймаута", КнопкаТаймаутаПараметр); + Параметры.Вставить("ТекстСообщения", ТекстВопроса); + Параметры.Вставить("Картинка", Параметры.Картинка); + Параметры.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Параметры.ПредлагатьБольшеНеЗадаватьЭтотВопрос); + + ОткрытьФорму("ОбщаяФорма.Вопрос", Параметры,,,,,ОписаниеОповещенияОЗавершении); + +КонецПроцедуры + +// Возвращает новую структуру дополнительных параметров для процедуры ПоказатьВопросПользователю. +// +// Возвращаемое значение: +// Структура - параметры процедуры ПоказатьВопросПользователю: +// КнопкаПоУмолчанию - Произвольный - определяет кнопку по умолчанию по типу кнопки или по связанному с ней значению. +// Таймаут - Число - интервал времени в секундах до автоматического закрытия окна вопроса. +// КнопкаТаймаута - Произвольный - кнопка (по типу кнопки или по связанному с ней значению), +// на которой отображается количество секунд, оставшихся до истечения таймаута. +// Заголовок - Строка - заголовок вопроса. +// ПредлагатьБольшеНеЗадаватьЭтотВопрос - Булево - если Истина, то в окне вопроса будет доступен одноименный флажок. +// БольшеНеЗадаватьЭтотВопрос - Булево - принимает значение, выбранное пользователем в соответствующем флажке. +// +Функция ПараметрыВопросаПользователю() Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("КнопкаПоУмолчанию", Неопределено); + Параметры.Вставить("Таймаут", 0); + Параметры.Вставить("КнопкаТаймаута", Неопределено); + Параметры.Вставить("Заголовок", ПолучитьЗаголовокКлиентскогоПриложения()); + Параметры.Вставить("ПредлагатьБольшеНеЗадаватьЭтотВопрос", Истина); + Параметры.Вставить("БольшеНеЗадаватьЭтотВопрос", Ложь); + Параметры.Вставить("БлокироватьВесьИнтерфейс", Ложь); + Параметры.Вставить("Картинка", Неопределено); + Возврат Параметры; + +КонецФункции + +// Выполнить стандартные действия перед началом работы пользователя +// с областью данных, либо в локальном режиме работы. +// +// Предназначена для вызова из обработчика ПередНачаломРаботыСистемы модулей управляемого и обычного приложения. +// +// Параметры: +// ОповещениеЗавершения - ОписаниеОповещения - не задается при вызове из обработчика ПередНачаломРаботыСистемы +// модулей управляемого и обычного приложения. В других случаях, после запуска будет вызвано оповещение +// с параметром типа Структура со свойствами: +// - Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не выполнен; +// - Перезапустить - Булево - если требуется перезапуск программы; +// - ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. +// +Процедура ПередНачаломРаботыСистемы(Знач ОповещениеЗавершения = Неопределено) Экспорт + + Если ОповещениеЗавершения <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы", + "ОповещениеЗавершения", ОповещениеЗавершения, Тип("ОписаниеОповещения")); + КонецЕсли; + + УстановитьРазделениеСеанса(); + + Параметры = Новый Структура; + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + Параметры.Вставить("Перезапустить", Ложь); + Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", Истина); + Параметры.Вставить("ПолученныеПараметрыКлиента", Новый Структура); + + // Внутренние параметры. + Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыОбработкаЗавершения", ЭтотОбъект, Параметры)); + + ОбновитьПараметрыРаботыКлиента(Параметры, Истина); + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыПослеПроверкиВерсииПлатформы", ЭтотОбъект, Параметры)); + + Попытка + ПроверитьВерсиюПлатформыПриЗапуске(Параметры); + + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Выполнить стандартные действия при начале работы пользователя +// с областью данных, либо в локальном режиме работы. +// +// Предназначена для вызова из обработчика ПриНачалеРаботыСистемы модулей управляемого и обычного приложения. +// +// Параметры: +// ОповещениеЗавершения - ОписаниеОповещения - не задается при вызове из обработчика ПриНачалеРаботыСистемы +// модулей управляемого и обычного приложения. В других случаях, после запуска будет вызвано оповещение +// с параметром типа Структура со свойствами: +// - Отказ - Булево - Ложь, если запуск выполнен успешно, или Истина, если вход в программу не выполнен; +// - Перезапустить - Булево - если требуется перезапуск программы; +// - ДополнительныеПараметрыКоманднойСтроки - Строка - для перезапуска. +// +// НепрерывноеВыполнение - Булево - Возвращаемое значение. Только для внутреннего использования. +// Для перехода из обработчика ПередНачаломРаботыСистемы +// выполненного в режиме интерактивной обработки. +// +Процедура ПриНачалеРаботыСистемы(Знач ОповещениеЗавершения = Неопределено, НепрерывноеВыполнение = Истина) Экспорт + + Если ОповещениеЗавершения <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", + "ОповещениеЗавершения", ОповещениеЗавершения, Тип("ОписаниеОповещения")); + КонецЕсли; + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы", + "НепрерывноеВыполнение", НепрерывноеВыполнение, Тип("Булево")); + + Если ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() Тогда + Возврат; + КонецЕсли; + + Параметры = Новый Структура; + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + Параметры.Вставить("Перезапустить", Ложь); + Параметры.Вставить("ДополнительныеПараметрыКоманднойСтроки", ""); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", НепрерывноеВыполнение); + + // Внутренние параметры. + Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПриНачалеРаботыСистемыОбработкаЗавершения", ЭтотОбъект, Параметры)); + + // Подготовка перехода к следующей процедуре. + Параметры.Вставить("НомерСледующегоОбработчика", 1); + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПриНачалеРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); + + Попытка + УстановитьРасширенныйЗаголовокПриложения(Истина); // Для главного окна. + + Если НЕ ОбработатьПараметрыЗапуска() Тогда + Параметры.Отказ = Истина; + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат; + КонецЕсли; + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Выполнить стандартные действия перед завершением работы пользователя +// с областью данных, либо в локальном режиме работы. +// +// Предназначена для вызова из обработчика ПередЗавершениемРаботыСистемы модулей управляемого и обычного приложения. +// +// Параметры: +// Отказ - Булево - Возвращаемое значение. Признак отказа от завершения работы +// для обработчика события ПередЗавершениемРаботыСистемы, либо программного отказа, +// либо потребовалась интерактивная обработка. В случае успешного взаимодействия +// с пользователем, завершение работы будет продолжено. +// +// ОповещениеЗавершения - ОписаниеОповещения - не задается при вызове из обработчика ПередЗавершениемРаботыСистемы +// модулей управляемого и обычного приложения. В других случаях, при завершении будет вызвано оповещение +// с параметром типа Структура со свойством: +// - Отказ - Булево - Ложь, если завершение работы выполнено успешно, +// или Истина, если завершение работы следует отменить; +// +Процедура ПередЗавершениемРаботыСистемы(Отказ = Ложь, Знач ОповещениеЗавершения = Неопределено) Экспорт + + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы", + "Отказ", Отказ, Тип("Булево")); + Если ОповещениеЗавершения <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы", + "ОповещениеЗавершения", ОповещениеЗавершения, Тип("ОписаниеОповещения")); + КонецЕсли; + + Если ОповещениеЗавершения = Неопределено Тогда + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ДействияПередЗавершениемРаботыСистемыВыполнены") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ДействияПередЗавершениемРаботыСистемыВыполнены"); + Возврат; + КонецЕсли; + КонецЕсли; + + // При очередном выходе из приложения параметры клиента при завершении нужно получать заново. + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыРаботыКлиентаПриЗавершении") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыРаботыКлиентаПриЗавершении"); + КонецЕсли; + + Параметры = Новый Структура; + + // Внешние параметры описания результата. + Параметры.Вставить("Отказ", Ложь); + + // Внешние параметры управления выполнением. + Параметры.Вставить("ИнтерактивнаяОбработка", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("ОбработкаПродолжения", Неопределено); // ОписаниеОповещения. + Параметры.Вставить("НепрерывноеВыполнение", Истина); + + // Внутренние параметры. + Параметры.Вставить("ОповещениеЗавершения", ОповещениеЗавершения); + Параметры.Вставить("ОбработкаЗавершения", Новый ОписаниеОповещения( + "ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения", ЭтотОбъект, Параметры)); + + Параметры.Вставить("НомерСледующегоОбработчика", 1); + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередЗавершениемРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + + Если Параметры.Отказ Или НЕ Параметры.НепрерывноеВыполнение Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +// Возвращает структуру параметров, необходимых для работы +// конфигурации на клиенте при завершении, т.е. в обработчиках событий +// - ПередЗавершениемРаботыСистемы, +// - ПриЗавершенииРаботыСистемы +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - структура параметров работы клиента при завершении. +// +Функция ПараметрыРаботыКлиентаПриЗавершении() Экспорт + + Если НЕ ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыРаботыКлиентаПриЗавершении") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить("ПараметрыРаботыКлиентаПриЗавершении", + СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗавершении()); + КонецЕсли; + + Возврат ПараметрыПриЗапускеИЗавершенииПрограммы.ПараметрыРаботыКлиентаПриЗавершении; + +КонецФункции + +// ИспользованиеМодальности + +// Устарела. Следует использовать ПоказатьВопросПользователю. // Вызывает форму вопроса. +// Параметры и возвращаемое значение совместимы с функцией глобального контекста Вопрос со следующими дополнениями: // -// Параметры и возвращаемое значение совместимы с функцией глобального контекста "Вопрос" со следующими дополнениями: +// Параметры: +// Кнопки - СписокЗначений - в котором: +// Значение – содержит значение, связанное с +// кнопкой и возвращаемое при выборе кнопки. В качестве значения может использоваться значение +// перечисления КодВозвратаДиалога, а также другие значения, поддерживающее XDTO сериализацию. +// Представление – задает текст кнопки. // -// Кнопки - может принимать значение типа "СписокЗначений", в котором: -// Значение – содержит значение, связанное с -// кнопкой и возвращаемое при выборе кнопки. В качестве значения может использоваться значение -// перечисления КодВозвратаДиалога, а также другие значения, поддерживающее XDTO сериализацию. -// Представление – задает текст кнопки. +// БольшеНеЗадаватьЭтотВопрос - Булево - принимает значение, выбранное пользователем в соответствующим +// флажке диалога. // -// БольшеНеЗадаватьЭтотВопрос (Булево) - принимает значение, выбранное пользователем в соответствующим -// флажке диалога. +// ПредлагатьБольшеНеЗадаватьЭтотВопрос - Булево - флаг того, что пользователю надо предлагать вариант. // -// ПредлагатьБольшеНеЗадаватьЭтотВопрос (Булево) - флаг того, что пользователю надо предлагать вариант. +// Возвращаемое значение: +// КодВозвратаДиалога - ответ пользователя. Либо одно из значений из списка значений Кнопки. // Функция ВопросПользователю(ТекстСообщения, Кнопки, Таймаут = 0, КнопкаПоУмолчанию = Неопределено, Заголовок = "", КнопкаТаймаута = Неопределено, БольшеНеЗадаватьЭтотВопрос = Ложь, ПредлагатьБольшеНеЗадаватьЭтотВопрос=Истина) Экспорт @@ -143,68 +508,185 @@ КонецФункции -// Возвращает структуру параметров, необходимых для работы -// конфигурации на клиенте при завершении, т.е. в обработчиках событий -// - ПередЗавершениемРаботыСистемы, -// - ПриЗавершенииРаботыСистемы -// -// Возвращаемое значение: -// ФиксированнаяСтруктура - структура параметров работы клиента при завершении. -// -Функция ПараметрыРаботыКлиентаПриЗавершении() Экспорт - - Если ПараметрыРаботыКлиентаПриЗавершении = Неопределено Тогда - ПараметрыРаботыКлиентаПриЗавершении = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗавершении(); - КонецЕсли; - - Возврат ПараметрыРаботыКлиентаПриЗавершении; - -КонецФункции +// Конец ИспользованиеМодальности //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС +// После предупреждения вызывает процедуру с параметрами Результат, ДополнительныеПараметры. +// +// Параметры: +// Параметры - Структура, которая содержит свойство: +// ОбработкаПродолжения - ОписаниеОповещения, которое +// содержит процедуру с двумя параметрами: +// Результат, ДополнительныеПараметры. +// +// ТекстПредупреждения - Строка - текст предупреждения, который нужно показать. +// +Процедура ПоказатьПредупреждениеИПродолжить(Параметры, ТекстПредупреждения) Экспорт + + ОповещениеСРезультатом = Параметры.ОбработкаПродолжения; + + Если ТекстПредупреждения = Неопределено Тогда + ВыполнитьОбработкуОповещения(ОповещениеСРезультатом); + Возврат; + КонецЕсли; + + Если Параметры.Отказ Тогда + + Кнопки = Новый СписокЗначений(); + Кнопки.Добавить("Перезапустить", НСтр("ru = 'Перезапустить'")); + Кнопки.Добавить("Завершить", НСтр("ru = 'Завершить работу'")); + + ПараметрыВопроса = ПараметрыВопросаПользователю(); + ПараметрыВопроса.КнопкаПоУмолчанию = "Перезапустить"; + ПараметрыВопроса.КнопкаТаймаута = "Перезапустить"; + ПараметрыВопроса.Таймаут = 60; + ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + ПараметрыВопроса.БлокироватьВесьИнтерфейс = Истина; + ПараметрыВопроса.Картинка = БиблиотекаКартинок.Предупреждение32; + + Иначе + + Кнопки = Новый СписокЗначений(); + Кнопки.Добавить("Продолжить", НСтр("ru = 'Продолжить'")); + Кнопки.Добавить("Перезапустить", НСтр("ru = 'Перезапустить'")); + Кнопки.Добавить("Завершить", НСтр("ru = 'Завершить работу'")); + + ПараметрыВопроса = ПараметрыВопросаПользователю(); + ПараметрыВопроса.КнопкаПоУмолчанию = "Продолжить"; + ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь; + ПараметрыВопроса.БлокироватьВесьИнтерфейс = Истина; + ПараметрыВопроса.Картинка = БиблиотекаКартинок.Предупреждение32; + + КонецЕсли; + + ОповещениеОЗакрытие = Новый ОписаниеОповещения("ПоказатьПредупреждениеИПродолжитьЗавершение", ЭтотОбъект, Параметры); + ПоказатьВопросПользователю(ОповещениеОЗакрытие, ТекстПредупреждения, Кнопки, ПараметрыВопроса); + +КонецПроцедуры + +// Показывает диалог выбора файлов и помещает выбранные файлы во временное хранилище. +// Совмещает работу методов глобального метода НачатьПомещениеФайла и ПоместитьФайлы, +// возвращая идентичный результат вне зависимости от того, подключено расширение работы с файлами, или нет. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора. +// ИдентификаторФормы - УникальныйИдентификатор - Уникальный идентификатор формы, из которой выполняется размещение файла. +// НачальноеИмяФайла - Строка - Полный путь и имя файла, которые будут предложены пользователю в начале выбора. +// ПараметрыДиалога - Структура, Неопределено - См. свойства ДиалогВыбораФайла в синтакс-помощнике. +// Используется в случае, если удалось подключить расширение работы с файлами. +// +// Значение первого параметра, возвращаемого в ОбработчикРезультата: +// ПомещенныеФайлы - Результат выбора. +// * - Неопределено - Пользователь отказался от выбора. +// * - Массив из ОписаниеПереданногоФайла, Структура - Пользователь выбрал файл. +// ** Имя - Строка - Полное имя выбранного файла. +// ** Хранение - Строка - Адрес во временном хранилище, по которому размещен файл. +// +// Ограничения: +// Используется только для интерактивного выбора в диалоге. +// Не используется для выбора каталогов - эта опция не поддерживается веб-клиентом. +// Не поддерживается множественный выбор в веб-клиенте, если не установлено расширение работы с файлами. +// Не поддерживается передача адреса временного хранилища. +// +Процедура ПоказатьПомещениеФайла(ОбработчикРезультата, ИдентификаторФормы, НачальноеИмяФайла, ПараметрыДиалога) Экспорт + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + + Если ПараметрыДиалога = Неопределено Тогда + ПараметрыДиалога = Новый Структура; + КонецЕсли; + Если ПараметрыДиалога.Свойство("Режим") Тогда + Режим = ПараметрыДиалога.Режим; + Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда + ВызватьИсключение НСтр("ru = 'Выбор каталога не поддерживается'"); + КонецЕсли; + Иначе + Режим = РежимДиалогаВыбораФайла.Открытие; + КонецЕсли; + + Диалог = Новый ДиалогВыбораФайла(Режим); + Диалог.ПолноеИмяФайла = НачальноеИмяФайла; + ЗаполнитьЗначенияСвойств(Диалог, ПараметрыДиалога); + + ПомещенныеФайлы = Новый Массив; + ВыборВыполнен = ПоместитьФайлы(, ПомещенныеФайлы, Диалог, Истина, ИдентификаторФормы); + ОбработатьРезультатПомещенияФайла(ВыборВыполнен, ПомещенныеФайлы, Неопределено, ДополнительныеПараметры); + + Иначе + + Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатПомещенияФайла", ЭтотОбъект, ДополнительныеПараметры); + НачатьПомещениеФайла(Обработчик, , НачальноеИмяФайла, Истина, ИдентификаторФормы); + + КонецЕсли; + +КонецПроцедуры + +// Обработчик результата работы процедуры ПоказатьПомещениеФайла. +// +Процедура ОбработатьРезультатПомещенияФайла(ВыборВыполнен, АдресИлиРезультатВыбора, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт + Если ВыборВыполнен = Истина Тогда + Если ТипЗнч(АдресИлиРезультатВыбора) = Тип("Массив") Тогда + ПомещенныеФайлы = АдресИлиРезультатВыбора; + Иначе + ОписаниеФайла = Новый Структура; + ОписаниеФайла.Вставить("Хранение", АдресИлиРезультатВыбора); + ОписаниеФайла.Вставить("Имя", ВыбранноеИмяФайла); + ПомещенныеФайлы = Новый Массив; + ПомещенныеФайлы.Добавить(ОписаниеФайла); + КонецЕсли; + Иначе + ПомещенныеФайлы = Неопределено; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, ПомещенныеФайлы); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработка результата выполнения // Выводит результат выполнения какой-либо операции. // -// Параметры: -// ЭтаФорма (УправляемаяФорма) Форма, для которой требуется вывод. -// Результат (Структура) Результат выполнения операции, который необходимо вывести. -// |- ВыводОповещения (Структура) -// |- Использование (Булево) Выводить оповещение. -// |- Заголовок (Строка) -// |- Ссылка (Строка) Навигационная гиперссылка. -// |- Текст (Строка) -// |- Картинка (Картинка) -// |- ВыводСообщения (Структура) -// |- Использование (Булево) Выводить сообщение. -// |- Текст (Строка) -// |- ПутьКРеквизитуФормы (Строка) Путь к реквизиту формы, к которому относится сообщение. -// |- ВыводПредупреждения (Структура) -// |- Использование (Булево) Выводить предупреждение. -// |- Текст (Строка) -// |- ТекстОшибок (Строка) Необязательный. Тексты ошибок, которые при желании может просмотреть пользователь. -// |- ПутьКРеквизитуФормы (Строка) Необязательный. Путь к реквизиту формы, значение которого вызывало ошибку. -// |- ОповещениеФорм (Структура, Массив из Структура) см. справку к методу глобального контекста Оповестить(). -// |- Использование (Булево) Оповещать открытые формы. -// |- ИмяСобытия (Строка) Имя события, которое используется для первичной идентификации сообщений принимающими формами. -// |- Параметр (*) Набор данных, которые используются принимающей формой для обновления состава. -// |- Источник (*) Источник оповещения, например форма-источником. -// |- ОповещениеДинамическихСписков (Структура) см. справку к методу глобального контекста ОповеститьОбИзменении(). -// |- Использование (Булево) Оповещать динамические списки. -// |- СсылкаИлиТип (*) Ссылка, тип, или массив типов, которые необходимо обновить. -// -// Описание: -// Предназначен только для отображения результата работы сервера на клиенте, -// не предназначен для отображения промежуточных стадий - диалогов и т.п.. +// Предназначена только для отображения результата работы сервера на клиенте, +// не предназначена для отображения промежуточных стадий - диалогов и т.п.. // // См. также: // СтандартныеПодсистемыКлиентСервер.НовыйРезультатВыполнения() // СтандартныеПодсистемыКлиентСервер.ПодготовитьОповещениеДинамическихСписков() // -Процедура ПоказатьРезультатВыполнения(ЭтаФорма, Результат) Экспорт +// Параметры: +// Форма - УправляемаяФорма - Форма, для которой требуется вывод. +// Результат - Структура - Результат выполнения операции, который необходимо вывести. +// * ВыводОповещения - Структура - Всплывающее оповещение. +// ** Использование - Булево - Выводить оповещение. +// ** Заголовок - Строка - Заголовок оповещения. +// ** Текст - Строка - Текст оповещения. +// ** Ссылка - Строка - Навигационная гиперссылка текста. +// ** Картинка - Картинка - Картинка оповещения. +// * ВыводСообщения - Структура - Сообщение формы, привязанное к реквизиту. +// ** Использование - Булево - Выводить сообщение. +// ** Текст - Строка - Текст сообщения. +// ** ПутьКРеквизитуФормы - Строка - Путь к реквизиту формы, к которому относится сообщение. +// * ВыводПредупреждения - Структура - Окно предупреждения, блокирующее весь интерфейс. +// ** Использование - Булево - Выводить предупреждение. +// ** Заголовок - Строка - Заголовок окна. +// ** Текст - Строка - Текст предупреждения. +// ** ТекстОшибок - Строка - Необязательный. Тексты ошибок, которые при желании может просмотреть пользователь. +// ** ПутьКРеквизитуФормы - Строка - Необязательный. Путь к реквизиту формы, значение которого вызывало ошибку. +// * ОповещениеФорм - Структура, Массив из Структура - см. справку к методу глобального контекста Оповестить(). +// ** Использование - Булево - Оповещать открытые формы. +// ** ИмяСобытия - Строка - Имя события, которое используется для первичной идентификации сообщений принимающими формами. +// ** Параметр - Произвольный - Набор данных, которые используются принимающей формой для обновления состава. +// ** Источник - Произвольный - Источник оповещения, например форма-источником. +// * ОповещениеДинамическихСписков - Структура - см. справку к методу глобального контекста ОповеститьОбИзменении(). +// ** Использование - Булево - Оповещать динамические списки. +// ** СсылкаИлиТип - Произвольный - Ссылка, тип, или массив типов, которые необходимо обновить. +// +Процедура ПоказатьРезультатВыполнения(Форма, Результат) Экспорт Если ТипЗнч(Результат) <> Тип("Структура") И ТипЗнч(Результат) <> Тип("ФиксированнаяСтруктура") Тогда Возврат; @@ -217,8 +699,8 @@ Если Результат.Свойство("ВыводСообщения") И Результат.ВыводСообщения.Использование Тогда Сообщение = Новый СообщениеПользователю; - Если ТипЗнч(ЭтаФорма) = Тип("УправляемаяФорма") Тогда - Сообщение.ИдентификаторНазначения = ЭтаФорма.УникальныйИдентификатор; + Если ТипЗнч(Форма) = Тип("УправляемаяФорма") Тогда + Сообщение.ИдентификаторНазначения = Форма.УникальныйИдентификатор; КонецЕсли; Сообщение.Текст = Результат.ВыводСообщения.Текст; Сообщение.Поле = Результат.ВыводСообщения.ПутьКРеквизитуФормы; @@ -226,42 +708,23 @@ КонецЕсли; Если Результат.Свойство("ВыводПредупреждения") И Результат.ВыводПредупреждения.Использование Тогда - Если ЗначениеЗаполнено(Результат.ВыводПредупреждения.ТекстОшибок) Тогда + ВыводПредупреждения = Результат.ВыводПредупреждения; + Если ЗначениеЗаполнено(ВыводПредупреждения.ТекстОшибок) Тогда Кнопки = Новый СписокЗначений; Кнопки.Добавить(1, НСтр("ru = 'Показать ошибки'")); - - Если ТипЗнч(ЭтаФорма) = Тип("УправляемаяФорма") И ЗначениеЗаполнено(Результат.ВыводПредупреждения.ПутьКРеквизитуФормы) Тогда + Если ТипЗнч(Форма) = Тип("УправляемаяФорма") И ЗначениеЗаполнено(ВыводПредупреждения.ПутьКРеквизитуФормы) Тогда Кнопки.Добавить(2, НСтр("ru = 'Перейти к реквизиту'")); КонецЕсли; - Кнопки.Добавить(0, НСтр("ru = 'Продолжить'")); - Ответ = Вопрос(Результат.ВыводПредупреждения.Текст, Кнопки, , 1); - - Если Ответ = 1 Тогда - - ЗаголовокДокумента = Результат.ВыводПредупреждения.Текст; - ЗаголовокДокумента = СтрЗаменить(ЗаголовокДокумента, Символы.ПС, "; "); - Если СтрДлина(ЗаголовокДокумента) > 75 Тогда - ЗаголовокДокумента = Лев(ЗаголовокДокумента, 72) + "..."; - КонецЕсли; - - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.УстановитьТекст(Результат.ВыводПредупреждения.ТекстОшибок); - ТекстовыйДокумент.Показать(ЗаголовокДокумента); - - ИначеЕсли Ответ = 2 Тогда - - Сообщение = Новый СообщениеПользователю; - Сообщение.ИдентификаторНазначения = ЭтаФорма.УникальныйИдентификатор; - Сообщение.Текст = Результат.ВыводПредупреждения.Текст; - Сообщение.Поле = Результат.ВыводПредупреждения.ПутьКРеквизитуФормы; - Сообщение.Сообщить(); - - КонецЕсли; + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ВыводПредупреждения", ВыводПредупреждения); + ДополнительныеПараметры.Вставить("Форма", Форма); + Обработчик = Новый ОписаниеОповещения("ПоказатьРезультатВыполненияЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Обработчик, ВыводПредупреждения.Текст, Кнопки, , 1, ВыводПредупреждения.Заголовок); Иначе - Предупреждение(Результат.ВыводПредупреждения.Текст); + ПоказатьПредупреждение(, ВыводПредупреждения.Текст, , ВыводПредупреждения.Заголовок); КонецЕсли; КонецЕсли; @@ -292,220 +755,473 @@ КонецПроцедуры +// Обработчик ответа на вопрос при выводе результата выполнения. +// +Процедура ПоказатьРезультатВыполненияЗавершение(Ответ, Результат) Экспорт + + Если Ответ = 1 Тогда + + ЗаголовокДокумента = Результат.ВыводПредупреждения.Текст; + ЗаголовокДокумента = СтрЗаменить(ЗаголовокДокумента, Символы.ПС, "; "); + Если СтрДлина(ЗаголовокДокумента) > 75 Тогда + ЗаголовокДокумента = Лев(ЗаголовокДокумента, 72) + "..."; + КонецЕсли; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.УстановитьТекст(Результат.ВыводПредупреждения.ТекстОшибок); + ТекстовыйДокумент.Показать(ЗаголовокДокумента); + + ИначеЕсли Ответ = 2 Тогда + + Сообщение = Новый СообщениеПользователю; + Сообщение.ИдентификаторНазначения = Результат.Форма.УникальныйИдентификатор; + Сообщение.Текст = Результат.ВыводПредупреждения.Текст; + Сообщение.Поле = Результат.ВыводПредупреждения.ПутьКРеквизитуФормы; + Сообщение.Сообщить(); + + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы // Открывает форму ввода пароля пользователя сервиса // // Параметры: -// ПарольПользователяСервиса - Строка - пароль пользователя сервиса -// Отказ - Булево - флаг отказа от выполнения действия +// ОбработкаПродолжения - ОписаниеОповещения, которое нужно обработать после получения пароля. +// ФормаВладелец - Неопределено, УправляемаяФорма, которая запрашивает пароль. +// ПарольПользователяСервиса - Строка - текущий пароль пользователя сервиса. // -Процедура ПриЗапросеПароляДляАутентификацииВСервисе(ВладелецФормы, ПарольПользователяСервиса = Неопределено, ПарольЕщеНеВведен = Ложь) Экспорт +Процедура ПриЗапросеПароляДляАутентификацииВСервисе(ОбработкаПродолжения, ФормаВладелец = Неопределено, ПарольПользователяСервиса = Неопределено) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервисаКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервисаКлиент"); - МодульПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе(ВладелецФормы, ПарольПользователяСервиса, ПарольЕщеНеВведен); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + + МодульПользователиСлужебныйВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль( + "ПользователиСлужебныйВМоделиСервисаКлиент"); + + МодульПользователиСлужебныйВМоделиСервисаКлиент.ЗапроситьПарольДляАутентификацииВСервисе( + ОбработкаПродолжения, ФормаВладелец, ПарольПользователяСервиса); + КонецЕсли; + +КонецПроцедуры + +// Переадресует оповещение без результата на оповещение с результатом. +Функция ОповещениеБезРезультата(ОповещениеСРезультатом) Экспорт + + Возврат Новый ОписаниеОповещения("ВыполнитьОповещениеСПустымРезультатом", ЭтотОбъект, ОповещениеСРезультатом); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +//////////////////////////////////////////////////////////////////////////////// +// ПередНачаломРаботыСистемы + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыПослеПроверкиВерсииПлатформы(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + Попытка + МодульРаботаВМоделиСервисаКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВМоделиСервисаКлиент"); + МодульРаботаВМоделиСервисаКлиент.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыПослеПроверкиЛегальности", ЭтотОбъект, Параметры)); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует( + "СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда + + Попытка + МодульПроверкаЛегальностиПолученияОбновленияКлиент = + ОбщегоНазначенияКлиент.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); + + МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновленияПриЗапуске(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыПослеПроверкиЛегальности(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыПослеПовторенияЗагрузкиСообщенияОбменаДанными", ЭтотОбъект, Параметры)); + + Попытка + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + // Запрос у пользователя с или без повтора загрузки сообщения обмена данными. + МодульОбменДаннымиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбменДаннымиКлиент"); + МодульОбменДаннымиКлиент.ПередНачаломРаботыСистемы(Параметры); + КонецЕсли; + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения, Ложь); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыПослеПовторенияЗагрузкиСообщенияОбменаДанными(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + + Попытка + ОбновлениеИнформационнойБазыКлиент.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Попытка + ПользователиСлужебныйКлиент.ПроверитьАвторизациюПользователя(Параметры, Истина); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыПослеОбновленияПараметровРаботыПрограммы", ЭтотОбъект, Параметры)); + + Попытка + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если ПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы") Тогда + // Параметры работы программы должны быть обновлены до продолжения работы. + ЗагрузитьОбновитьПараметрыРаботыПрограммы(Параметры); + КонецЕсли; + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыПослеОбновленияПараметровРаботыПрограммы(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + + Попытка + ПользователиСлужебныйКлиент.ПроверитьАвторизациюПользователя(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Попытка + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если НЕ ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных + И ПараметрыКлиента.Свойство("НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы") Тогда + + // Обновление неразделенных данных ИБ в модели сервиса. + Состояние(НСтр("ru = 'Пожалуйста, подождите, выполняется обновление информационной базы...'")); + ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(, Истина); + Состояние(НСтр("ru = 'Обновление информационной базы выполнено успешно.'")); + КонецЕсли; + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + Если Не ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат; + КонецЕсли; + + УстановитьРасширенныйЗаголовокПриложения(Истина); // Для вспомогательных окон. + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыПослеОбработкиВходаСРазблокирующимКодом", ЭтотОбъект, Параметры)); + + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + + Попытка + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + МодульСоединенияИБКлиент.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыПослеОбработкиВходаСРазблокирующимКодом(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("НомерСледующегоОбработчика", 1); + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередНачаломРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); + + Попытка + ОбновлениеИнформационнойБазыКлиент.ОбновитьИнформационнуюБазу(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт + + Если НЕ ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( + "СтандартныеПодсистемы.БазоваяФункциональность\ПередНачаломРаботыСистемы"); + + КоличествоОбработчиков = ОбработчикиСобытия.Количество(); + НачальныйНомер = Параметры.НомерСледующегоОбработчика; + + Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл + Параметры.ИнтерактивнаяОбработка = Неопределено; + Параметры.НомерСледующегоОбработчика = Номер + 1; + Обработчик = ОбработчикиСобытия.Получить(Номер - 1); + + Попытка + Обработчик.Модуль.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЦикла; + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + Параметры.ИнтерактивнаяОбработка = Неопределено; + + Попытка + ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Завершение процедуры ПередНачаломРаботыСистемы. +Процедура ДействияПередНачаломРаботыСистемыОбработкаЗавершения(Неопределен, Параметры) Экспорт + + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПолученныеПараметрыКлиента"); + + Если Параметры.ОповещениеЗавершения <> Неопределено Тогда + Результат = Новый Структура; + Результат.Вставить("Отказ", Параметры.Отказ); + Результат.Вставить("Перезапустить", Параметры.Перезапустить); + Результат.Вставить("ДополнительныеПараметрыКоманднойСтроки", Параметры.ДополнительныеПараметрыКоманднойСтроки); + ВыполнитьОбработкуОповещения(Параметры.ОповещениеЗавершения, Результат); + Возврат; + КонецЕсли; + + Если Параметры.Отказ Тогда + Если Параметры.Перезапустить <> Истина Тогда + ПрекратитьРаботуСистемы(); + ИначеЕсли ЗначениеЗаполнено(Параметры.ДополнительныеПараметрыКоманднойСтроки) Тогда + ПрекратитьРаботуСистемы(Параметры.Перезапустить, Параметры.ДополнительныеПараметрыКоманднойСтроки); + Иначе + ПрекратитьРаботуСистемы(Параметры.Перезапустить); + КонецЕсли; + + ИначеЕсли НЕ Параметры.НепрерывноеВыполнение Тогда + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыОбработки") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыОбработки"); + КонецЕсли; + ПриНачалеРаботыСистемы(, Ложь); КонецЕсли; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// ПриНачалеРаботыСистемы -// Стандартные действия выполняемые перед началом работы системы. -// -// Параметры: -// Отказ - Булево - флаг отказа от выполнения операции. -// В случае установки в Истина вход в систему осуществлен не будет. -// -Процедура ДействияПередНачаломРаботыСистемы(Отказ) Экспорт - - // СтандартныеПодсистемы.БазоваяФункциональность - УстановитьРазделениеСеанса(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - ОтметитьПервыйЗапросПараметровРаботыКлиентаПриЗапуске(); - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - - Если НЕ ПустаяСтрока(ПараметрыКлиента.ИнформационнаяБазаЗаблокированаДляОбновления) Тогда - Отказ = Истина; - Предупреждение(ПараметрыКлиента.ИнформационнаяБазаЗаблокированаДляОбновления); - Возврат; - КонецЕсли; - - Если НЕ ПустаяСтрока(ПараметрыКлиента.ОшибкаЗапускаСПустымСпискомПользователей) Тогда - Отказ = Истина; - ПользователиСлужебныйКлиент.СоздатьАдминистратораИлиЗавершитьРаботу( - ПараметрыКлиента.ОшибкаЗапускаСПустымСпискомПользователей); - Возврат; - КонецЕсли; - - ОбновитьПараметрыКлиента = Ложь; - - // СтандартныеПодсистемы.ОбменДанными - Если ПараметрыКлиента.ИменаПодсистем.Получить("СтандартныеПодсистемы.ОбменДанными") <> Неопределено Тогда - МодульОбменДаннымиКлиент = Вычислить("ОбменДаннымиКлиент"); - МодульОбменДаннымиКлиент.ПередНачаломРаботыСистемы(Отказ, ПараметрыКлиента, ОбновитьПараметрыКлиента); - Если Отказ Тогда - Возврат; - КонецЕсли; - КонецЕсли; - // Конец СтандартныеПодсистемы.ОбменДанными - - // СтандартныеПодсистемы.БазоваяФункциональность - Если ПараметрыКлиента.НеобходимоОбновлениеПараметровРаботыПрограммы Тогда - ОбновитьПараметрыКлиента = Истина; - // Параметры работы программы должны быть обновлены до продолжения работы. - ЗагрузитьОбновитьПараметрыРаботыПрограммы(Отказ, ПараметрыКлиента); - Если Отказ Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Если ОбновитьПараметрыКлиента Тогда - ОбновитьПовторноИспользуемыеЗначения(); - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - // СтандартныеПодсистемы.Пользователи - ПользователиСлужебныйКлиент.ПроверитьАвторизациюПользователя(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - // Конец СтандартныеПодсистемы.Пользователи - - // СтандартныеПодсистемы.БазоваяФункциональность - Если НЕ ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных - И ПараметрыКлиента.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы Тогда - // Обновление неразделенных данных ИБ в модели сервиса. - Состояние(НСтр("ru = 'Пожалуйста, подождите, выполняется обновление информационной базы...'")); - ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(, Истина); - Состояние(НСтр("ru = 'Обновление информационной базы выполнено успешно.'")); - КонецЕсли; - - Если Не ПараметрыКлиента.ДоступноИспользованиеРазделенныхДанных Тогда - Возврат; - КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - // СтандартныеПодсистемы.БазоваяФункциональность - УстановитьРасширенныйЗаголовокПриложения(Истина); // Для вспомогательных окон. - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - // СтандартныеПодсистемы.ЗавершениеРаботыПользователей - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует( - "СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - - МодульСоединенияИБКлиент = Вычислить("СоединенияИБКлиент"); - МодульСоединенияИБКлиент.ПередНачаломРаботыСистемы(Отказ); - Если Отказ Тогда - Возврат; - КонецЕсли; - КонецЕсли; - // Конец СтандартныеПодсистемы.ЗавершениеРаботыПользователей - - // СтандартныеПодсистемы.БазоваяФункциональность - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПередНачаломРаботыСистемы"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПередНачаломРаботыСистемы(Отказ); - КонецЦикла; - - ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы(Отказ); - // Конец СтандартныеПодсистемы.БазоваяФункциональность - -КонецПроцедуры +// Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт -// Стандартные действия выполняемые при начале работы системы. -// -// Выполняется при начале работы пользователя с областью данных, -// либо в локальном режиме работы. -// Соответствует обработчику ПриНачалеРаботыСистемы. -// -Процедура ДействияПриНачалеРаботыСистемы() Экспорт - - // СтандартныеПодсистемы.БазоваяФункциональность - УстановитьРасширенныйЗаголовокПриложения(Истина); // Для главного окна. - // Конец СтандартныеПодсистемы.БазоваяФункциональность - - // СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует( - "СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления") Тогда - - МодульПроверкаЛегальностиПолученияОбновленияКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПроверкаЛегальностиПолученияОбновленияКлиент"); - МодульПроверкаЛегальностиПолученияОбновленияКлиент.ПроверитьЛегальностьПолученияОбновленияПриЗапуске(); - КонецЕсли; - // Конец СтандартныеПодсистемы.ПроверкаЛегальностиПолученияОбновления - - ВерсияАктуальна = ПроверитьВерсиюПлатформыПриЗапуске(); - Если ВерсияАктуальна Тогда - // СтандартныеПодсистемы.ОбновлениеВерсииИБ - ОбновлениеИнформационнойБазыКлиент.ОбновитьИнформационнуюБазу(, Истина); - // Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ - Иначе - // В противном случае, если версия не актуальна, то обновление информационной базы - // будет выполнено только после подтверждения пользователем. - // См. процедуру ПродолжитьРаботу модуля формы Обработка.НерекомендуемаяВерсияПлатформы.Форма.НерекомендуемаяВерсияПлатформы - КонецЕсли; - -КонецПроцедуры - -// Только для внутреннего использования. -// -Процедура ЗавершающиеДействияПриНачалеРаботыСистемы() Экспорт - - ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - // СтандартныеПодсистемы.БазоваяФункциональность - - // Обработка параметров запуска системы. - Если НЕ ОбработатьПараметрыЗапуска() Тогда + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); Возврат; КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - // СтандартныеПодсистемы.ЗавершениеРаботыПользователей - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует( - "СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - - МодульСоединенияИБКлиент = Вычислить("СоединенияИБКлиент"); - МодульСоединенияИБКлиент.ПриНачалеРаботыСистемы(); - КонецЕсли; - // Конец СтандартныеПодсистемы.ЗавершениеРаботыПользователей - - // СтандартныеПодсистемы.РегламентныеЗадания - // Прим.: подсистема РегламентныеЗадания должна настраиваться ранее многих других подсистем, - // т.к. в режиме запуска отдельного сеанса обработки регламентных заданий, - // управление не будет и не должно быть передано далее. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует( - "СтандартныеПодсистемы.РегламентныеЗадания") Тогда - - МодульРегламентныеЗаданияСлужебныйКлиент = Вычислить("РегламентныеЗаданияСлужебныйКлиент"); - МодульРегламентныеЗаданияСлужебныйКлиент.ПриНачалеРаботыСистемы(); - КонецЕсли; - // Конец СтандартныеПодсистемы.РегламентныеЗадания - - // СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриНачалеРаботыСистемы(); + КоличествоОбработчиков = ОбработчикиСобытия.Количество(); + НачальныйНомер = Параметры.НомерСледующегоОбработчика; + + Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл + Параметры.НомерСледующегоОбработчика = Номер + 1; + Обработчик = ОбработчикиСобытия.Получить(Номер - 1); + + Попытка + Обработчик.Модуль.ПриНачалеРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; КонецЦикла; - ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы(); - // Конец СтандартныеПодсистемы.БазоваяФункциональность + // Подготовка перехода к следующей процедуре. + Параметры.Вставить("НомерСледующегоОбработчика", 1); + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПослеНачалаРаботыСистемыВОбработчикахСлужебногоСобытия", ЭтотОбъект, Параметры)); - // СтандартныеПодсистемы.ОбновлениеВерсииИБ - Если Не ПараметрыКлиента.РазделениеВключено И ПараметрыКлиента.ПроверитьЛегальностьПолученияОбновления = Ложь Тогда - ОбновлениеИнформационнойБазыКлиент.ПодключитьОбработчикПроверкиСтатусаОтложенногоОбновления(); + Попытка + ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПослеНачалаРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт + + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат; + КонецЕсли; + + ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"); + + КоличествоОбработчиков = ОбработчикиСобытия.Количество(); + НачальныйНомер = Параметры.НомерСледующегоОбработчика; + + Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл + Параметры.НомерСледующегоОбработчика = Номер + 1; + Обработчик = ОбработчикиСобытия.Получить(Номер - 1); + + Попытка + Обработчик.Модуль.ПослеНачалаРаботыСистемы(); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + КонецЦикла; + + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); + Попытка + ОбщегоНазначенияКлиентПереопределяемый.ПослеНачалаРаботыСистемы(); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Завершение процедуры ПриНачалеРаботыСистемы. +Процедура ДействияПриНачалеРаботыСистемыОбработкаЗавершения(Неопределен, Параметры) Экспорт + + Если НЕ Параметры.Отказ Тогда + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПропуститьОчисткуСкрытияРабочегоСтола"); + КонецЕсли; + СкрытьРабочийСтолПриНачалеРаботыСистемы(Ложь); + КонецЕсли; + + Если Параметры.ОповещениеЗавершения <> Неопределено Тогда + + Результат = Новый Структура; + Результат.Вставить("Отказ", Параметры.Отказ); + Результат.Вставить("Перезапустить", Параметры.Перезапустить); + Результат.Вставить("ДополнительныеПараметрыКоманднойСтроки", Параметры.ДополнительныеПараметрыКоманднойСтроки); + ВыполнитьОбработкуОповещения(Параметры.ОповещениеЗавершения, Результат); + Возврат; + + Иначе + Если Параметры.Отказ Тогда + Если Параметры.Перезапустить <> Истина Тогда + ПрекратитьРаботуСистемы(); + + ИначеЕсли ЗначениеЗаполнено(Параметры.ДополнительныеПараметрыКоманднойСтроки) Тогда + ПрекратитьРаботуСистемы(Параметры.Перезапустить, Параметры.ДополнительныеПараметрыКоманднойСтроки); + Иначе + ПрекратитьРаботуСистемы(Параметры.Перезапустить); + КонецЕсли; + КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ КонецПроцедуры @@ -541,119 +1257,126 @@ КонецФункции -// Соответствует обработчику ПередЗавершениемРаботыСистемы -// -// Параметры: -// Отказ - Булево - признак отказа от завершения работы системы. -// -Процедура ДействияПередЗавершениемРаботыСистемы(Отказ) Экспорт +//////////////////////////////////////////////////////////////////////////////// +// ПередЗавершениемРаботыСистемы + +// Только для внутреннего использования. Продолжение процедуры ПередЗавершениемРаботыСистемы. +Процедура ДействияПередЗавершениемРаботыСистемыВОбработчикахСлужебногоСобытия(Неопределен, Параметры) Экспорт + + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат; + КонецЕсли; - // СтандартныеПодсистемы.БазоваяФункциональность ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.БазоваяФункциональность\ПередЗавершениемРаботыСистемы"); - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПередЗавершениемРаботыСистемы(Отказ); + КоличествоОбработчиков = ОбработчикиСобытия.Количество(); + НачальныйНомер = Параметры.НомерСледующегоОбработчика; + + Для Номер = НачальныйНомер По КоличествоОбработчиков Цикл + Параметры.НомерСледующегоОбработчика = Номер + 1; + Обработчик = ОбработчикиСобытия.Получить(Номер - 1); + Попытка + Обработчик.Модуль.ПередЗавершениемРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Завершение"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; КонецЦикла; - ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(Отказ); + Параметры.Вставить("ОбработкаПродолжения", Новый ОписаниеОповещения( + "ДействияПередЗавершениемРаботыСистемыПослеОбработчиковСлужебногоСобытия", ЭтотОбъект, Параметры)); - Если Отказ = Истина Тогда + Попытка + ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Завершение"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПередЗавершениемРаботыСистемы. +Процедура ДействияПередЗавершениемРаботыСистемыПослеОбработчиковСлужебногоСобытия(Неопределен, Параметры) Экспорт + + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); Возврат; КонецЕсли; // Если перед завершение работы есть незаписанные сообщения для журнала регистрации, // накопленные в переменной, то их необходимо записать Если ТипЗнч(СообщенияДляЖурналаРегистрации) = Тип("СписокЗначений") И СообщенияДляЖурналаРегистрации.Количество() <> 0 Тогда - ОбщегоНазначенияВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); КонецЕсли; + Параметры.Вставить("ОбработкаПродолжения", Параметры.ОбработкаЗавершения); Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ДоступноИспользованиеРазделенныхДанных Тогда - ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Отказ); + Попытка + ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Параметры); + Исключение + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Завершение"); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); КонецПроцедуры -// Показывает пользователю диалог подтверждения выхода из программы. -// -// Параметры: -// Отказ - Булево - признак отказа от завершения работы системы. -// -Процедура ВопросПользователюПередЗавершениемРаботыСистемы(Отказ) Экспорт +// Только для внутреннего использования. Завершение процедуры ПередЗавершениемРаботыСистемы. +Процедура ДействияПередЗавершениемРаботыСистемыОбработкаЗавершения(Неопределен, Параметры) Экспорт - БольшеНеЗадаватьЭтотВопрос = Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЗапрашиватьПодтверждениеПриЗавершенииПрограммы; - Если БольшеНеЗадаватьЭтотВопрос Тогда - Возврат; - КонецЕсли; - - Кнопки = Новый СписокЗначений; - Кнопки.Добавить("КодВозвратаДиалога.Да", НСтр("ru = 'Завершить'")); - Кнопки.Добавить("КодВозвратаДиалога.Нет", НСтр("ru = 'Отмена'")); - - Результат = ВопросПользователю( - НСтр("ru = 'Завершить работу с программой?'"), - Кнопки, - , - КодВозвратаДиалога.Да, - НСтр("ru = 'Завершение работы'"), - КодВозвратаДиалога.Нет, - БольшеНеЗадаватьЭтотВопрос); - - Если БольшеНеЗадаватьЭтотВопрос Тогда - СтандартныеПодсистемыВызовСервера.СохранитьНастройкуПодтвержденияПриЗавершенииПрограммы(НЕ БольшеНеЗадаватьЭтотВопрос); - КонецЕсли; - - Если Результат <> КодВозвратаДиалога.Да Тогда - Отказ = Истина; + Если Параметры.ОповещениеЗавершения <> Неопределено Тогда + + Результат = Новый Структура; + Результат.Вставить("Отказ", Параметры.Отказ); + ВыполнитьОбработкуОповещения(Параметры.ОповещениеЗавершения, Результат); + + ИначеЕсли НЕ Параметры.Отказ И НЕ Параметры.НепрерывноеВыполнение Тогда + + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить("ДействияПередЗавершениемРаботыСистемыВыполнены"); + ЗавершитьРаботуСистемы(); КонецЕсли; КонецПроцедуры -// Проверяет версию платформы, в зависимости от места вызова и возвращает Истина, -// если она подходит для запуска конфигурации. -// -// Возвращаемое значение -// Булево - если версия актуальна, тогда Истина, иначе - Ложь. -// -Функция ПроверитьВерсиюПлатформыПриЗапуске() Экспорт - - ПараметрыРаботы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); - Если ПараметрыРаботы.РазделениеВключено Тогда - Возврат Истина; - КонецЕсли; - - // Определяем минимальную версию платформы для запуска и логику входа в программу - Если ТипЗнч(ПараметрыРаботы.АвторизованныйПользователь) = Тип("СправочникСсылка.ВнешниеПользователи") Тогда - Возврат Истина; - КонецЕсли; - - Возврат ПроверитьВерсиюПлатформы(ПараметрыРаботы.МинимальноНеобходимаяВерсияПлатформы, ПараметрыРаботы.РаботаВПрограммеЗапрещена); - -КонецФункции - // Проверяет минимально допустимую версию платформы для запуска. // Если версия платформы более поздняя, чем РекомендуемаяВерсияПлатформы, то пользователю будет // показано оповещение. Работа программы будет прекращена, если ЗавершитьРаботу = Истина. // -// Параметры: -// РекомендуемаяВерсияПлатформы - Строка - версия платформы рекомендуемая для работы; -// РаботаВПрограммеЗапрещена - Булево - если Истина и текущая версия платформы меньше рекомендуемой, -// то продолжение работы в программе невозможно. +// Возвращаемое значение +// Булево - если версия актуальна, тогда Истина, иначе - Ложь. // -// Возвращаемое значение: -// Булево - Истина, если версия платформы подходит для работы. -// -Функция ПроверитьВерсиюПлатформы(знач РекомендуемаяВерсияПлатформы, знач РаботаВПрограммеЗапрещена = Ложь) Экспорт +Процедура ПроверитьВерсиюПлатформыПриЗапуске(Параметры) Экспорт - СистемнаяИнформация = Новый СистемнаяИнформация; - Если ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, РекомендуемаяВерсияПлатформы) >= 0 Тогда - Возврат Истина; + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если НЕ ПараметрыКлиента.Свойство("ПоказатьНерекомендуемуюВерсиюПлатформы") Тогда + Возврат; КонецЕсли; - ЕстьДоступДляОбновленияВерсииПлатформы = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске().ЕстьДоступДляОбновленияВерсииПлатформы; - Если РаботаВПрограммеЗапрещена Тогда - Если ЕстьДоступДляОбновленияВерсииПлатформы Тогда + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске", ЭтотОбъект, Параметры); + +КонецПроцедуры + +// Только для внутреннего использования. Продолжение процедуры ПроверитьВерсиюПлатформыПриЗапуске. +Процедура ИнтерактивнаяОбработкаПроверкиВерсииПлатформыПриЗапуске(Параметры, Неопределен) Экспорт + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + + Если ПараметрыКлиента.РаботаВПрограммеЗапрещена Тогда + Если ПараметрыКлиента.ЕстьДоступДляОбновленияВерсииПлатформы Тогда ТекстСообщения = НСтр("ru = 'Вход в программу невозможен. |Необходимо предварительно обновить версию платформы 1С:Предприятие.'"); Иначе @@ -661,7 +1384,7 @@ |Необходимо обратиться к администратору для обновления версии платформы 1С:Предприятие.'"); КонецЕсли; Иначе - Если ЕстьДоступДляОбновленияВерсииПлатформы Тогда + Если ПараметрыКлиента.ЕстьДоступДляОбновленияВерсииПлатформы Тогда ТекстСообщения = НСтр("ru='Рекомендуется завершить работу программы и обновить версию платформы 1С:Предприятия. |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); @@ -671,154 +1394,235 @@ |В противном случае некоторые возможности программы будут недоступны или будут работать некорректно.'"); КонецЕсли; КонецЕсли; - Параметры = Новый Структура; - Параметры.Вставить("ТекстСообщения", ТекстСообщения); - Параметры.Вставить("ЗавершитьРаботу", РаботаВПрограммеЗапрещена); - Параметры.Вставить("РекомендуемаяВерсияПлатформы", РекомендуемаяВерсияПлатформы); - Параметры.Вставить("ОткрытаПоСценарию", Истина); - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Результат = ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.НерекомендуемаяВерсияПлатформы", Параметры); - Иначе - Результат = ОткрытьФормуМодально("Обработка.НерекомендуемаяВерсияПлатформы.Форма.НерекомендуемаяВерсияПлатформы", Параметры); - КонецЕсли; + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекстСообщения", ТекстСообщения); + ПараметрыФормы.Вставить("ЗавершитьРаботу", ПараметрыКлиента.РаботаВПрограммеЗапрещена); + ПараметрыФормы.Вставить("РекомендуемаяВерсияПлатформы", ПараметрыКлиента.МинимальноНеобходимаяВерсияПлатформы); + ПараметрыФормы.Вставить("ОткрытаПоСценарию", Истина); + ПараметрыФормы.Вставить("ПропуститьЗавершениеРаботы", Истина); - // Если форма сегодня уже была показана - пропускаем проверку. - Если Результат = Неопределено Тогда - Возврат Истина; - КонецЕсли; + Форма = ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.НерекомендуемаяВерсияПлатформы", ПараметрыФормы, + , , , , Новый ОписаниеОповещения("ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы", ЭтотОбъект, Параметры)); - Возврат Ложь; - -КонецФункции - -// Выводит форму сообщений пользователю при закрытии программы, -// либо выводит сообщение. -// -// Параметры: -// Отказ - Булево - признак отказа от завершения работы системы. -// -Процедура ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Отказ) Экспорт - - // В веб-клиенте не выводится список предупреждений. -#Если ВебКлиент Тогда - Возврат; -#КонецЕсли - - Если ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина Тогда - Возврат; - КонецЕсли; - - Предупреждения = Новый Массив; - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииСпискаПредупрежденийЗавершенияРаботы"); - - Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриПолученииСпискаПредупрежденийЗавершенияРаботы(Предупреждения); - КонецЦикла; - - Если Предупреждения.Количество() = 0 Тогда - ВопросПользователюПередЗавершениемРаботыСистемы(Отказ); - Иначе - ПараметрыПередачи = Новый Структура; - ПараметрыПередачи.Вставить("Предупреждения", Предупреждения); - - ИмяФормы = "ОбщаяФорма.ПредупрежденияПриЗавершенииРаботы"; - - Если Предупреждения.Количество() = 1 Тогда - Результат = ОткрытьПрикладнуюФормуПредупреждения(Предупреждения[0], ИмяФормы, ПараметрыПередачи); - Иначе - Результат = ОткрытьФормуМодально(ИмяФормы, ПараметрыПередачи); - КонецЕсли; - Если Результат = Истина ИЛИ Результат = Неопределено Тогда - Отказ = Истина; - КонецЕсли; - КонецЕсли; - - // Если выход из приложения не выполнен, то необходимо "сбросить" ПараметрыРаботыКлиентаПриЗавершении, - // чтобы при следующем выходе из приложения их зачитать. - Если Отказ Тогда - ПараметрыРаботыКлиентаПриЗавершении = Неопределено; + Если Форма = Неопределено Тогда + ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы("Продолжить", Параметры); КонецЕсли; КонецПроцедуры +// Только для внутреннего использования. Продолжение процедуры ПроверитьВерсиюПлатформыПриЗапуске. +Процедура ПослеЗакрытияФормыНерекомендуемойВерсииПлатформы(Результат, Параметры) Экспорт + + Если Результат <> "Продолжить" Тогда + Параметры.Отказ = Истина; + Иначе + Параметры.ПолученныеПараметрыКлиента.Вставить("ПоказатьНерекомендуемуюВерсиюПлатформы"); + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Прочие процедуры и функции для запуска и завершения работы программы + // Вызывается при необходимости открыть форму списка активных пользователей, // которые в данный момент времени работают с системой. // -Процедура ОткрытьСписокАктивныхПользователей() Экспорт +Процедура ОткрытьСписокАктивныхПользователей(ПараметрыФормы = Неопределено) Экспорт - ИмяФормы = ""; - - ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей"); - - Для каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриОпределенииФормыАктивныхПользователей(ИмяФормы); - КонецЦикла; - - Если ЗначениеЗаполнено(ИмяФормы) Тогда - ОткрытьФорму(ИмяФормы); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + + ИмяФормы = ""; + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + МодульСоединенияИБКлиент.ПриОпределенииФормыАктивныхПользователей(ИмяФормы); + ОткрытьФорму(ИмяФормы, ПараметрыФормы); + Иначе - Предупреждение( + + ПоказатьПредупреждение(, НСтр("ru = 'Для того чтобы открыть список активных пользователей, перейдите в меню - |Все функции - Стандартные - Активные пользователи.'")); + |Все функции - Стандартные - Активные пользователи.'")); + КонецЕсли; КонецПроцедуры -// Возвращает клиентский общий модуль по имени. -Функция КлиентскийОбщийМодуль(Имя) Экспорт +// Устанавливает флаг скрытия рабочего стола при начале работы системы, +// который блокирует создание форм на рабочем столе. +// Снимает флаг скрытия и обновляет рабочий стол, когда это станет возможным, +// если скрытие выполнялось. +// +// Параметры: +// Скрыть - Булево. Если передать Ложь, тогда при условии скрытия рабочего +// стола он будет вновь показан. +// +// УжеВыполненоНаСервере - Булево. Если передать Истина, тогда уже был вызван +// метод в модуле СтандартныеПодсистемыВызовСервера, и его не требуется +// вызвать, а требуется только установить на клиенте, что рабочий стол +// был скрыт и позднее его требуется показать. +// +Процедура СкрытьРабочийСтолПриНачалеРаботыСистемы(Скрыть = Истина, УжеВыполненоНаСервере = Ложь) Экспорт - Модуль = Вычислить(Имя); - -#Если НЕ ВебКлиент Тогда - Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); + Если Скрыть Тогда + Если НЕ ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("СкрытьРабочийСтолПриНачалеРаботыСистемы") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы"); + Если НЕ УжеВыполненоНаСервере Тогда + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + КонецЕсли; + КонецЕсли; + Иначе + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("СкрытьРабочийСтолПриНачалеРаботыСистемы") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("СкрытьРабочийСтолПриНачалеРаботыСистемы"); + Если НЕ УжеВыполненоНаСервере Тогда + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(Ложь); + КонецЕсли; + ТекущееАктивноеОкно = АктивноеОкно(); + ОбновитьИнтерфейс(); + Если ТекущееАктивноеОкно <> Неопределено Тогда + ТекущееАктивноеОкно.Активизировать(); + КонецЕсли; + КонецЕсли; КонецЕсли; -#КонецЕсли - Возврат Модуль; +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ВыполнитьОповещениеСПустымРезультатом(ОповещениеСРезультатом) Экспорт -КонецФункции + ВыполнитьОбработкуОповещения(ОповещениеСРезультатом); + +КонецПроцедуры + +// Только для внутреннего использования см. процедуру ЗагрузитьОбновитьПараметрыРаботыПрограммы. +Процедура ОбработкаОшибкиУстановкиМонопольногоРежимаПриОбновленииПараметровРаботыПрограммы( + Параметры, Неопределен) Экспорт + + ОбработкаЗакрытияФормы = Новый ОписаниеОповещения( + "ПослеЗакрытияФормыБлокировкиИнформационнойБазы", ЭтотОбъект, Параметры); + + Параметры.МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима( + ОбработкаЗакрытияФормы); + +КонецПроцедуры + +// Только для внутреннего использования см. процедуру ЗагрузитьОбновитьПараметрыРаботыПрограммы. +Процедура ПослеЗакрытияФормыБлокировкиИнформационнойБазы(Отказ, Параметры) Экспорт + + Если Отказ Тогда + Параметры.Отказ = Истина; + ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + Возврат; + КонецЕсли; + + ТекстСостояния = НСтр("ru = 'Выполняется подготовка к запуску программы. Пожалуйста, подождите...'"); + Состояние(ТекстСостояния); + + Попытка + ОшибкаУстановкиМонопольногоРежима = ""; + СтандартныеПодсистемыВызовСервера.ЗагрузитьОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима); + Состояние(); + + Если ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) Тогда + ОбработкаЗакрытияФормы = Новый ОписаниеОповещения( + "ПослеЗакрытияФормыБлокировкиИнформационнойБазы", ЭтотОбъект, Параметры); + + Параметры.МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима( + ОбработкаЗакрытияФормы); + Возврат; + КонецЕсли; + ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); + Параметры.ПолученныеПараметрыКлиента.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы"); + Исключение + Параметры.ПолученныеПараметрыКлиента.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы"); + Состояние(); + ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке(), "Запуск", Истина); + КонецПопытки; + Если ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура НачатьИнтерактивнуюОбработкуПередЗавершениемРаботыСистемы() Экспорт + + Если НЕ ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыОбработкиЗавершения") Тогда + Возврат; + КонецЕсли; + + Параметры = ПараметрыПриЗапускеИЗавершенииПрограммы.ПараметрыОбработкиЗавершения; + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыОбработкиЗавершения"); + + ВыполнитьОбработкуОповещения(Параметры.ИнтерактивнаяОбработка, Параметры); + +КонецПроцедуры + +// Только для внутреннего использования. +Процедура ПослеЗакрытияФормыПредупрежденийПриЗавершенииРаботы(Результат, ДополнительныеПараметры) Экспорт + + Параметры = ДополнительныеПараметры.Параметры; + + Если ДополнительныеПараметры.ВариантФормы = "Вопрос" Тогда + + Если Результат <> Неопределено И Результат.БольшеНеЗадаватьЭтотВопрос Тогда + СтандартныеПодсистемыВызовСервера.СохранитьНастройкуПодтвержденияПриЗавершенииПрограммы( + НЕ Результат.БольшеНеЗадаватьЭтотВопрос); + КонецЕсли; + + Если Результат = Неопределено Или Результат.Значение <> КодВозвратаДиалога.Да Тогда + Параметры.Отказ = Истина; + КонецЕсли; + + ИначеЕсли ДополнительныеПараметры.ВариантФормы = "СтандартнаяФорма" Тогда + + Если Результат = Истина Или Результат = Неопределено Тогда + Параметры.Отказ = Истина; + КонецЕсли; + + Иначе // ПрикладнаяФорма + Если Результат = Истина Или Результат = Неопределено Или Результат = КодВозвратаДиалога.Нет Тогда + Параметры.Отказ = Истина; + КонецЕсли; + КонецЕсли; + + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции -// Установить разделения сеанса при запуске программы. -// -// Параметры: -// Отказ - Булево - если Истина, то запуск программы должен быть прекращен. -// -Процедура УстановитьРазделениеСеанса(Отказ) - - Если ПустаяСтрока(ПараметрЗапуска) Тогда - Возврат; +// Приводит разнотипные параметры с набором ссылок к массиву +Функция НаборСсылок(Знач НаборСсылок) + ТипПараметра = ТипЗнч(НаборСсылок); + + Если ТипЗнч(НаборСсылок) = Тип("ТаблицаФормы") Тогда + Ссылки = Новый Массив; + Для Каждого Элемент Из НаборСсылок.ВыделенныеСтроки Цикл + ДанныеСтроки = НаборСсылок.ДанныеСтроки(Элемент); + Если ДанныеСтроки <> Неопределено Тогда + Ссылки.Добавить(ДанныеСтроки.Ссылка); + КонецЕсли; + КонецЦикла; + + ИначеЕсли ТипПараметра = Тип("СписокЗначений") Тогда + Ссылки = Новый Массив; + Для Каждого Элемент Из НаборСсылок Цикл + Ссылки.Добавить(Элемент.Значение); + КонецЦикла; + + Иначе + Ссылки = НаборСсылок; + КонецЕсли; - ПараметрыЗапуска = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска, ";"); - ЗначениеПараметраЗапуска = Врег(ПараметрыЗапуска[0]); - - Если ЗначениеПараметраЗапуска <> ВРег("ВойтиВОбластьДанных") Тогда - Возврат; - КонецЕсли; - - Если ПараметрыЗапуска.Количество() < 2 Тогда - ВызватьИсключение(НСтр("ru = 'При указании параметра запуска ВойтиВОбластьДанных, - |дополнительным параметром необходимо указать значение разделителя.'")); - КонецЕсли; - - Попытка - ЗначениеРазделителя = Число(ПараметрыЗапуска[1]); - Исключение - ВызватьИсключение(НСтр("ru = 'Значением разделителя в параметре ВойтиВОбластьДанных должно быть число.'")); - КонецПопытки; - - ОбщегоНазначенияВызовСервера.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); - -КонецПроцедуры + Возврат Ссылки; +КонецФункции // Возвращает строковое представление значения типа КодВозвратаДиалога Функция КодВозвратаДиалогаВСтроку(Значение) @@ -845,155 +1649,479 @@ КонецФункции +// Установить разделения сеанса при запуске программы. +Процедура УстановитьРазделениеСеанса() + + Если ПустаяСтрока(ПараметрЗапуска) Тогда + Возврат; + КонецЕсли; + + ПараметрыЗапуска = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска, ";"); + ЗначениеПараметраЗапуска = Врег(ПараметрыЗапуска[0]); + + Если ЗначениеПараметраЗапуска <> ВРег("ВойтиВОбластьДанных") Тогда + Возврат; + КонецЕсли; + + Если ПараметрыЗапуска.Количество() < 2 Тогда + ВызватьИсключение + НСтр("ru = 'При указании параметра запуска ВойтиВОбластьДанных, + |дополнительным параметром необходимо указать значение разделителя.'"); + КонецЕсли; + + Попытка + ЗначениеРазделителя = Число(ПараметрыЗапуска[1]); + Исключение + ВызватьИсключение + НСтр("ru = 'Значением разделителя в параметре ВойтиВОбластьДанных должно быть число.'"); + КонецПопытки; + + ОбщегоНазначенияВызовСервера.УстановитьРазделениеСеанса(Истина, ЗначениеРазделителя); + +КонецПроцедуры + +// В случае отказа вызывает обработку завершения, +// если добавлен новый полученный параметр клиента, +// обновляет параметры работы клиента. +// +Функция ПродолжитьДействияПередНачаломРаботыСистемы(Параметры) + + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат Ложь; + КонецЕсли; + + ОбновитьПараметрыРаботыКлиента(Параметры); + + Возврат Истина; + +КонецФункции + +Процедура ОбновитьПараметрыРаботыКлиента(Параметры, ПервыйВызов = Ложь) + + Если ПервыйВызов Тогда + Если ТипЗнч(ПараметрыПриЗапускеИЗавершенииПрограммы) <> Тип("Структура") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы = Новый Структура; + КонецЕсли; + + ИначеЕсли Параметры.КоличествоПолученныхПараметровКлиента = + Параметры.ПолученныеПараметрыКлиента.Количество() Тогда + Возврат; + КонецЕсли; + + Параметры.Вставить("КоличествоПолученныхПараметровКлиента", + Параметры.ПолученныеПараметрыКлиента.Количество()); + + + Если Параметры.НепрерывноеВыполнение <> Истина Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить( + "ПропуститьОчисткуСкрытияРабочегоСтола"); + КонецЕсли; + + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить( + "ПолученныеПараметрыКлиента", Параметры.ПолученныеПараметрыКлиента); + + ОбновитьПовторноИспользуемыеЗначения(); + +КонецПроцедуры + +Функция ВыполняетсяИнтерактивнаяОбработкаПередНачаломРаботыСистемы() + + Если НЕ ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыОбработки") Тогда + Возврат Ложь; + КонецЕсли; + + Параметры = ПараметрыПриЗапускеИЗавершенииПрограммы.ПараметрыОбработки; + + Если Параметры.ИнтерактивнаяОбработка <> Неопределено Тогда + Параметры.НепрерывноеВыполнение = Ложь; + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыОбработки"); + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция ИнтерактивнаяОбработкаПередНачаломРаботыСистемы(Параметры) + + Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат Истина; + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + ОбновитьПараметрыРаботыКлиента(Параметры); + + Если НЕ Параметры.НепрерывноеВыполнение Тогда + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + + ИначеЕсли Параметры.ОповещениеЗавершения = Неопределено Тогда + // Выполнен вызов из обработчика события ПередНачаломРаботыСистемы для подготовки + // выполнения интерактивной обработки в обработчике события ПриНачалеРаботыСистемы. + + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить("ПараметрыОбработки", Параметры); + СкрытьРабочийСтолПриНачалеРаботыСистемы(); + Иначе + // Выполнен вызов из процедуры ПередНачаломРаботыСистемы для немедленного + // начала интерактивной обработки, т.к. процедура была вызвана программно, а не из + // обработчика события ПередНачаломРаботыСистемы. + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПараметрыОбработки") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы.Удалить("ПараметрыОбработки"); + КонецЕсли; + + Параметры.НепрерывноеВыполнение = Ложь; + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ИнтерактивнаяОбработкаПриНачалеРаботыСистемы(Параметры) + + Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат Истина; + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + + Параметры.НепрерывноеВыполнение = Ложь; + Параметры.ИнтерактивнаяОбработка = Неопределено; + + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + + Возврат Истина; + +КонецФункции + +Функция ИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы(Параметры) + + Если Параметры.ИнтерактивнаяОбработка = Неопределено Тогда + Если Параметры.Отказ Тогда + ВыполнитьОбработкуОповещения(Параметры.ОбработкаЗавершения); + Возврат Истина; + КонецЕсли; + Возврат Ложь; + КонецЕсли; + + Если НЕ Параметры.НепрерывноеВыполнение Тогда + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + + ИначеЕсли Параметры.ОповещениеЗавершения = Неопределено Тогда + // Выполнен вызов из обработчика события ПередЗавершениемРаботыСистемы для подготовки + // выполнения интерактивной обработки через обработчик ожидания. + + ПараметрыПриЗапускеИЗавершенииПрограммы.Вставить("ПараметрыОбработкиЗавершения", Параметры); + Параметры.НепрерывноеВыполнение = Ложь; + ПодключитьОбработчикОжидания( + "ОбработчикОжиданияИнтерактивнаяОбработкаПередЗавершениемРаботыСистемы", 0.1, Истина); + Иначе + // Выполнен вызов из процедуры ПередЗавершениемРаботыСистемы для немедленного + // начала интерактивной обработки, т.к. процедура была вызвана программно, а не из + // обработчика события ПередЗавершениемРаботыСистемы. + + Параметры.НепрерывноеВыполнение = Ложь; + ИнтерактивнаяОбработка = Параметры.ИнтерактивнаяОбработка; + Параметры.ИнтерактивнаяОбработка = Неопределено; + ВыполнитьОбработкуОповещения(ИнтерактивнаяОбработка, Параметры); + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммы(Параметры) + + ПараметрыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске(); + МодульСоединенияИБКлиент = Неопределено; + + Если ПараметрыКлиента.ИнформационнаяБазаФайловая + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + КонецЕсли; + + ТекстСостояния = НСтр("ru = 'Выполняется подготовка к запуску программы. Пожалуйста, подождите...'"); + Состояние(ТекстСостояния); + + ОшибкаУстановкиМонопольногоРежима = ""; + Попытка + СтандартныеПодсистемыВызовСервера.ЗагрузитьОбновитьПараметрыРаботыПрограммы( + ОшибкаУстановкиМонопольногоРежима); + + Состояние(); + Исключение + Состояние(); + ВызватьИсключение; + КонецПопытки; + + Если НЕ ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) Тогда + Параметры.ПолученныеПараметрыКлиента.Вставить( + "НеобходимоОбновлениеПараметровРаботыПрограммы"); + Возврат; + КонецЕсли; + + Если МодульСоединенияИБКлиент = Неопределено Тогда + Параметры.Отказ = Истина; + + ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ПоказатьПредупреждениеИПродолжить", + ЭтотОбъект, + ОшибкаУстановкиМонопольногоРежима); + + Параметры.ИнтерактивнаяОбработка = ИнтерактивнаяОбработка; + Возврат; + КонецЕсли; + + Параметры.Вставить("МодульСоединенияИБКлиент", МодульСоединенияИБКлиент); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ОбработкаОшибкиУстановкиМонопольногоРежимаПриОбновленииПараметровРаботыПрограммы", ЭтотОбъект); + +КонецПроцедуры + +// Выводит форму сообщений пользователю при закрытии программы, либо выводит сообщение. +Процедура ОткрытьФормуПредупрежденийПриЗавершенииРаботы(Параметры) + + // В веб-клиенте не выводится список предупреждений. +#Если ВебКлиент Тогда + Возврат; +#КонецЕсли + + Если ПропуститьПредупреждениеПередЗавершениемРаботыСистемы = Истина Тогда + Возврат; + КонецЕсли; + + Предупреждения = Новый Массив; + + ОбработчикиСобытия = ОбщегоНазначенияКлиент.ОбработчикиСлужебногоСобытия( + "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииСпискаПредупрежденийЗавершенияРаботы"); + + Для Каждого Обработчик Из ОбработчикиСобытия Цикл + Обработчик.Модуль.ПриПолученииСпискаПредупрежденийЗавершенияРаботы(Предупреждения); + КонецЦикла; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("Параметры", Параметры); + ДополнительныеПараметры.Вставить("ВариантФормы", "Вопрос"); + + ОбработкаОтвета = Новый ОписаниеОповещения("ПослеЗакрытияФормыПредупрежденийПриЗавершенииРаботы", + ЭтотОбъект, ДополнительныеПараметры); + + Если Предупреждения.Количество() = 0 Тогда + + БольшеНеЗадаватьЭтотВопрос = + Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента( + ).ЗапрашиватьПодтверждениеПриЗавершенииПрограммы; + + Если БольшеНеЗадаватьЭтотВопрос Тогда + Возврат; + КонецЕсли; + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ВопросПользователюПередЗавершениемРаботыСистемы", ЭтотОбъект, ОбработкаОтвета); + Иначе + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("Предупреждения", Предупреждения); + + ИмяФормы = "ОбщаяФорма.ПредупрежденияПриЗавершенииРаботы"; + + Если Предупреждения.Количество() = 1 Тогда + ТекстФлажка = ""; + Если Предупреждения[0].Свойство("ТекстФлажка", ТекстФлажка) Тогда + Если Не ПустаяСтрока(ТекстФлажка) Тогда + ДополнительныеПараметры.Вставить("ВариантФормы", "СтандартнаяФорма"); + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("ИмяФормы", ИмяФормы); + ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); + ПараметрыОткрытияФормы.Вставить("ОбработкаОтвета", ОбработкаОтвета); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПредупрежденийПриЗавершенииРаботы", ЭтотОбъект, ПараметрыОткрытияФормы); + КонецЕсли; + Иначе + ДополнительныеПараметры.Вставить("ВариантФормы", "ПрикладнаяФорма"); + ОткрытьПрикладнуюФормуПредупреждения(Параметры, ОбработкаОтвета, Предупреждения[0], ИмяФормы, ПараметрыФормы); + КонецЕсли; + Иначе + ДополнительныеПараметры.Вставить("ВариантФормы", "СтандартнаяФорма"); + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("ИмяФормы", ИмяФормы); + ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); + ПараметрыОткрытияФормы.Вставить("ОбработкаОтвета", ОбработкаОтвета); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПредупрежденийПриЗавершенииРаботы", ЭтотОбъект, ПараметрыОткрытияФормы); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Продолжение процедуры ОткрытьФормуПредупрежденийПриЗавершенииРаботы. +Процедура ИнтерактивнаяОбработкаПредупрежденийПриЗавершенииРаботы(Параметры, ПараметрыОткрытияФормы) Экспорт + + ОткрытьФорму( + ПараметрыОткрытияФормы.ИмяФормы, + ПараметрыОткрытияФормы.ПараметрыФормы, , , , , + ПараметрыОткрытияФормы.ОбработкаОтвета); + +КонецПроцедуры + +// Продолжение процедуры ПоказатьПредупреждениеИПродолжить. +Процедура ПоказатьПредупреждениеИПродолжитьЗавершение(Результат, Параметры) Экспорт + + Если Результат <> Неопределено Тогда + Если Результат.Значение = "Завершить" Тогда + Параметры.Отказ = Истина; + ИначеЕсли Результат.Значение = "Перезапустить" Тогда + Параметры.Отказ = Истина; + Параметры.Перезапустить = Истина; + КонецЕсли; + КонецЕсли; + ВыполнитьОбработкуОповещения(Параметры.ОбработкаПродолжения); + +КонецПроцедуры + +// Показывает пользователю диалог подтверждения выхода из программы. +Процедура ВопросПользователюПередЗавершениемРаботыСистемы(Параметры, ОбработкаОтвета) Экспорт + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить("КодВозвратаДиалога.Да", НСтр("ru = 'Завершить'")); + Кнопки.Добавить("КодВозвратаДиалога.Нет", НСтр("ru = 'Отмена'")); + + ПараметрыВопроса = ПараметрыВопросаПользователю(); + ПараметрыВопроса.БлокироватьВесьИнтерфейс = Истина; + ПараметрыВопроса.КнопкаПоУмолчанию = "КодВозвратаДиалога.Да"; + ПараметрыВопроса.Заголовок = НСтр("ru = 'Завершение работы'"); + ПараметрыВопроса.БольшеНеЗадаватьЭтотВопрос = Ложь; + + ПоказатьВопросПользователю(ОбработкаОтвета, НСтр("ru = 'Завершить работу с программой?'"), Кнопки, ПараметрыВопроса); + +КонецПроцедуры + // Формирует отображение одного вопроса. // // Если в ПредупреждениеПользователю есть свойство "ТекстГиперссылки", то открывается "ФормаИндивидуальногоОткрытия" из Структуры вопроса. // Если в ПредупреждениеПользователю есть свойство "ТекстФлажка", то открывается форма "ОбщаяФорма.ВопросПередЗавершениемРаботыСистемы". // // Параметры: -// ПредупреждениеПользователю - Структура - структура передаваемого предупреждения. -// ИмяФормы - Строка - имя общей формы с вопросами. -// ПараметрыПередачи - Структура - параметры для формы с вопросами. +// Параметры - сквозные параметры цепочки вызовов процедуры ПередЗавершениемРаботыСистемы. +// ОбработкаОтвета - ОписаниеОповещения для продолжения после получения ответа пользователя. +// ПредупреждениеПользователю - Структура - структура передаваемого предупреждения. +// ИмяФормы - Строка - имя общей формы с вопросами. +// ПараметрыФормы - Структура - параметры для формы с вопросами. // -// Возвращаемое значение: -// Булево - Истина, если форма открыта. -// -Функция ОткрытьПрикладнуюФормуПредупреждения(ПредупреждениеПользователю, ИмяФормы, ПараметрыПередачи) - Отказ = Ложь; - - ТекстФлажка = ""; - Если ПредупреждениеПользователю.Свойство("ТекстФлажка", ТекстФлажка) Тогда - Если Не ПустаяСтрока(ТекстФлажка) Тогда - Отказ = ОткрытьФормуМодально(ИмяФормы, ПараметрыПередачи); - КонецЕсли; - - Возврат Отказ; - КонецЕсли; +Процедура ОткрытьПрикладнуюФормуПредупреждения(Параметры, ОбработкаОтвета, ПредупреждениеПользователю, ИмяФормы, ПараметрыФормы) ТекстГиперссылки = ""; - Если ПредупреждениеПользователю.Свойство("ТекстГиперссылки", ТекстГиперссылки) Тогда - Если Не ПустаяСтрока(ТекстГиперссылки) Тогда - ДействиеПриНажатииГиперссылки = Неопределено; - Если ПредупреждениеПользователю.Свойство("ДействиеПриНажатииГиперссылки", ДействиеПриНажатииГиперссылки) Тогда - ДействиеГиперссылка = ПредупреждениеПользователю.ДействиеПриНажатииГиперссылки; - Форма = Неопределено; - Если ДействиеГиперссылка.Свойство("ПрикладнаяФормаПредупреждения", Форма) Тогда - ПараметрыФормы = Неопределено; - Если ДействиеГиперссылка.Свойство("ПараметрыПрикладнойФормыПредупреждения", ПараметрыФормы) Тогда - Если ТипЗнч(ПараметрыФормы) = Тип("Структура") Тогда - ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); - ИначеЕсли ПараметрыФормы = Неопределено Тогда - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); - КонецЕсли; - - ПараметрыФормы.Вставить("ЗаголовокКнопкиДа", НСтр("ru = 'Завершить'")); - ПараметрыФормы.Вставить("ЗаголовокКнопкиНет", НСтр("ru = 'Отмена'")); - - КонецЕсли; - Ответ = ОткрытьФормуМодально(Форма, ПараметрыФормы); - Отказ = ОпределитьОтветФормы(Ответ); - - Возврат Отказ; - ИначеЕсли ДействиеГиперссылка.Свойство("Форма", Форма) Тогда - ПараметрыФормы = Неопределено; - Если ДействиеГиперссылка.Свойство("ПараметрыФормы", ПараметрыФормы) Тогда - Если ТипЗнч(ПараметрыФормы) = Тип("Структура") Тогда - ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); - ИначеЕсли ПараметрыФормы = Неопределено Тогда - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); - КонецЕсли; - КонецЕсли; - Ответ = ОткрытьФормуМодально(Форма, ПараметрыФормы); - Отказ = ОпределитьОтветФормы(Ответ); - - Возврат Отказ; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - Возврат Отказ; - КонецЕсли; - - Возврат Отказ; -КонецФункции - -// Определяет отказ по ответу формы. -// -// Параметры: -// Ответ - ответ формы. -// -Функция ОпределитьОтветФормы(Ответ) - Возврат Ответ = Неопределено Или Ответ = КодВозвратаДиалога.Нет Или Ответ = Истина; -КонецФункции - -Процедура ЗагрузитьОбновитьПараметрыРаботыПрограммы(Отказ, ПараметрыКлиента) - - МодульСоединенияИБКлиент = Неопределено; - Если ПараметрыКлиента.ИнформационнаяБазаФайловая Тогда - // ВАЖНО: - // В этой процедуре нельзя использовать функции ПодсистемаСуществует и ОбщийМодуль, - // т.к. из них будет вызвана функция СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиентаПриЗапуске() - // которая будет выполнятся не в режиме ПервыйЗапросПараметров, что потенциально ведет к ошибке. - - // Проверка существования подсистемы. - ПодсистемаСуществует = ПараметрыКлиента.ИменаПодсистем.Получить( - "СтандартныеПодсистемы.ЗавершениеРаботыПользователей") <> Неопределено; - - Если ПодсистемаСуществует Тогда - // Получение общего модуля по имени. - МодульСоединенияИБКлиент = Вычислить("СоединенияИБКлиент"); - КонецЕсли; + Если НЕ ПредупреждениеПользователю.Свойство("ТекстГиперссылки", ТекстГиперссылки) Тогда + Возврат; + КонецЕсли; + Если ПустаяСтрока(ТекстГиперссылки) Тогда + Возврат; КонецЕсли; - СнятьБлокировкуФайловойБазы = Ложь; - Попытка - Пока Истина Цикл - ТекстСостояния = НСтр("ru = 'Пожалуйста, подождите, выполняется подготовка к обновлению информационной базы...'"); - Состояние(ТекстСостояния); - - ОшибкаУстановкиМонопольногоРежима = ""; - СтандартныеПодсистемыВызовСервера.ЗагрузитьОбновитьПараметрыРаботыПрограммы(ОшибкаУстановкиМонопольногоРежима); - - Если НЕ ЗначениеЗаполнено(ОшибкаУстановкиМонопольногоРежима) Тогда - Прервать; - КонецЕсли; - - Если МодульСоединенияИБКлиент = Неопределено Тогда - Предупреждение(ОшибкаУстановкиМонопольногоРежима); - Отказ = Истина; - Возврат; - КонецЕсли; - - МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Отказ); - Если Отказ Тогда - Если СнятьБлокировкуФайловойБазы Тогда - ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); - КонецЕсли; - Возврат; - КонецЕсли; - СнятьБлокировкуФайловойБазы = Истина; - КонецЦикла; - Исключение - Если СнятьБлокировкуФайловойБазы Тогда - ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; + ДействиеПриНажатииГиперссылки = Неопределено; + Если НЕ ПредупреждениеПользователю.Свойство("ДействиеПриНажатииГиперссылки", ДействиеПриНажатииГиперссылки) Тогда + Возврат; + КонецЕсли; - Если СнятьБлокировкуФайловойБазы Тогда - ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); + ДействиеГиперссылка = ПредупреждениеПользователю.ДействиеПриНажатииГиперссылки; + Форма = Неопределено; + + Если ДействиеГиперссылка.Свойство("ПрикладнаяФормаПредупреждения", Форма) Тогда + ПараметрыФормы = Неопределено; + Если ДействиеГиперссылка.Свойство("ПараметрыПрикладнойФормыПредупреждения", ПараметрыФормы) Тогда + Если ТипЗнч(ПараметрыФормы) = Тип("Структура") Тогда + ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); + ИначеЕсли ПараметрыФормы = Неопределено Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); + КонецЕсли; + + ПараметрыФормы.Вставить("ЗаголовокКнопкиДа", НСтр("ru = 'Завершить'")); + ПараметрыФормы.Вставить("ЗаголовокКнопкиНет", НСтр("ru = 'Отмена'")); + + КонецЕсли; + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("ИмяФормы", Форма); + ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); + ПараметрыОткрытияФормы.Вставить("ОбработкаОтвета", ОбработкаОтвета); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПредупрежденийПриЗавершенииРаботы", ЭтотОбъект, ПараметрыОткрытияФормы); + + ИначеЕсли ДействиеГиперссылка.Свойство("Форма", Форма) Тогда + ПараметрыФормы = Неопределено; + Если ДействиеГиперссылка.Свойство("ПараметрыФормы", ПараметрыФормы) Тогда + Если ТипЗнч(ПараметрыФормы) = Тип("Структура") Тогда + ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); + ИначеЕсли ПараметрыФормы = Неопределено Тогда + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ЗавершениеРаботыПрограммы", Истина); + КонецЕсли; + КонецЕсли; + ПараметрыОткрытияФормы = Новый Структура; + ПараметрыОткрытияФормы.Вставить("ИмяФормы", Форма); + ПараметрыОткрытияФормы.Вставить("ПараметрыФормы", ПараметрыФормы); + ПараметрыОткрытияФормы.Вставить("ОбработкаОтвета", ОбработкаОтвета); + Параметры.ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ИнтерактивнаяОбработкаПредупрежденийПриЗавершенииРаботы", ЭтотОбъект, ПараметрыОткрытияФормы); + КонецЕсли; КонецПроцедуры -Процедура ОтметитьПервыйЗапросПараметровРаботыКлиентаПриЗапуске() +Процедура ОбработатьОшибкуПриЗапускеИлиЗавершении(Параметры, ИнформацияОбОшибке, Событие, ПрекратитьРаботу = Ложь) - Если ТипЗнч(ПараметрыРаботыКлиентаПриОбновлении) <> Тип("Структура") Тогда - ПараметрыРаботыКлиентаПриОбновлении = Новый Структура; + Если Событие = "Запуск" Тогда + ИмяСобытия = НСтр("ru = 'Запуск программы'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + + Если ПрекратитьРаботу Тогда + Параметры.Отказ = Истина; + Параметры.ОбработкаПродолжения = Параметры.ОбработкаЗавершения; + + НачалоОписанияОшибки = + НСтр("ru = 'Возникла исключительная ситуация при запуске программы. Запуск программы аварийно завершен.'"); + Иначе + НачалоОписанияОшибки = + НСтр("ru = 'Возникла исключительная ситуация при запуске программы.'"); + КонецЕсли; + Иначе + ИмяСобытия = НСтр("ru = 'Завершение программы'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); + НачалоОписанияОшибки = + НСтр("ru = 'Возникла исключительная ситуация при завершении программы.'"); КонецЕсли; - ПараметрыРаботыКлиентаПриОбновлении.Вставить("ПервыйЗапросПараметров"); + ТекстОшибки = НачалоОписанияОшибки + + Символы.ПС + Символы.ПС + + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке); + + ТекстПредупреждения = НачалоОписанияОшибки + Символы.ПС + + НСтр("ru = 'Техническая информация об ошибке записана в журнал регистрации.'") + + Символы.ПС + Символы.ПС + + КраткоеПредставлениеОшибки(ИнформацияОбОшибке); + + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( + ИмяСобытия, "Ошибка", ТекстОшибки, , Истина); + + ИнтерактивнаяОбработка = Новый ОписаниеОповещения( + "ПоказатьПредупреждениеИПродолжить", + СтандартныеПодсистемыКлиент.ЭтотОбъект, + ТекстПредупреждения); + + Параметры.ИнтерактивнаяОбработка = ИнтерактивнаяОбработка; КонецПроцедуры + diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl index 17a90ede1..d45470196 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентПовтИсп/Module.bsl @@ -20,13 +20,22 @@ // Функция ПараметрыРаботыКлиентаПриЗапуске() Экспорт - ПервыйЗапросПараметров = Ложь; - Если ТипЗнч(ПараметрыРаботыКлиентаПриОбновлении) <> Тип("Структура") Тогда - ПараметрыРаботыКлиентаПриОбновлении = Новый Структура; + Если ТипЗнч(ПараметрыПриЗапускеИЗавершенииПрограммы) <> Тип("Структура") Тогда + ПараметрыПриЗапускеИЗавершенииПрограммы = Новый Структура; КонецЕсли; - Если ПараметрыРаботыКлиентаПриОбновлении.Свойство("ПервыйЗапросПараметров") Тогда - ПервыйЗапросПараметров = Истина; - ПараметрыРаботыКлиентаПриОбновлении.Удалить("ПервыйЗапросПараметров"); + + Параметры = Новый Структура; + Параметры.Вставить("ПолученныеПараметрыКлиента", Неопределено); + + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПолученныеПараметрыКлиента") + И ТипЗнч(ПараметрыПриЗапускеИЗавершенииПрограммы.ПолученныеПараметрыКлиента) = Тип("Структура") Тогда + + Параметры.Вставить("ПолученныеПараметрыКлиента", + ПараметрыПриЗапускеИЗавершенииПрограммы.ПолученныеПараметрыКлиента); + КонецЕсли; + + Если ПараметрыПриЗапускеИЗавершенииПрограммы.Свойство("ПропуститьОчисткуСкрытияРабочегоСтола") Тогда + Параметры.Вставить("ПропуститьОчисткуСкрытияРабочегоСтола"); КонецЕсли; #Если ВебКлиент Тогда @@ -39,14 +48,19 @@ ЭтоLinuxКлиент = СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 ИЛИ СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64; - Параметры = Новый Структура; - Параметры.Вставить("ПервыйЗапросПараметров", ПервыйЗапросПараметров); Параметры.Вставить("ПараметрЗапуска", ПараметрЗапуска); Параметры.Вставить("СтрокаСоединенияИнформационнойБазы", СтрокаСоединенияИнформационнойБазы()); Параметры.Вставить("ЭтоВебКлиент", ЭтоВебКлиент); Параметры.Вставить("ЭтоLinuxКлиент", ЭтоLinuxКлиент); + Параметры.Вставить("СкрытьРабочийСтолПриНачалеРаботыСистемы", Ложь); - Возврат СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры); + ПараметрыКлиента = СтандартныеПодсистемыВызовСервера.ПараметрыРаботыКлиентаПриЗапуске(Параметры); + + // Обновление состояния скрытия рабочего стола на клиенте по состоянию на сервере. + СтандартныеПодсистемыКлиент.СкрытьРабочийСтолПриНачалеРаботыСистемы( + Параметры.СкрытьРабочийСтолПриНачалеРаботыСистемы, Истина); + + Возврат ПараметрыКлиента; КонецФункции @@ -160,12 +174,12 @@ Модуль = Неопределено; Если ПерваяПопытка Тогда Попытка - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщегоНазначенияКлиент.ОбщийМодуль(Обработчик.Модуль); Исключение Возврат Неопределено; КонецПопытки; Иначе - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщегоНазначенияКлиент.ОбщийМодуль(Обработчик.Модуль); КонецЕсли; Элемент.Вставить("Модуль", Обработчик.Модуль); Элемент.Вставить("Версия", Обработчик.Версия); diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl index 0b057a2cd..3d4058882 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыКлиентСервер/Module.bsl @@ -12,7 +12,7 @@ // Формирует шаблон результата выполнения. // // Возвращаемое значение: -// Результат (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). +// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). // Функция НовыйРезультатВыполнения(Результат = Неопределено) Экспорт Если Результат = Неопределено Тогда @@ -21,39 +21,39 @@ Результат.Вставить("ВыводОповещения", Новый Структура("Использование, Заголовок, Ссылка, Текст, Картинка", Ложь)); Результат.Вставить("ВыводСообщения", Новый Структура("Использование, Текст, ПутьКРеквизитуФормы", Ложь)); - Результат.Вставить("ВыводПредупреждения", Новый Структура("Использование, Текст, ПутьКРеквизитуФормы, ТекстОшибок", Ложь)); + Результат.Вставить("ВыводПредупреждения", Новый Структура("Использование, Заголовок, Текст, ПутьКРеквизитуФормы, ТекстОшибок", Ложь)); Результат.Вставить("ОповещениеФорм", Новый Структура("Использование, ИмяСобытия, Параметр, Источник", Ложь)); Результат.Вставить("ОповещениеДинамическихСписков", Новый Структура("Использование, СсылкаИлиТип", Ложь)); Возврат Результат; КонецФункции -// Добавляет в оповещение для динамических списков типы из массива измененных объектов. +// Добавляет оповещения для обновления динамических списков по массиву ссылок объектов. // // Параметры: -// ИзмененныеОбъекты (Массив) из (*) Ссылки измененных объектов программы. -// Результат (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). +// ИзмененныеОбъекты - Массив - Ссылки измененных объектов. +// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). // -Процедура ПодготовитьОповещениеДинамическихСписков(Знач ИзмененныеОбъекты, Результат) Экспорт - Если ТипЗнч(ИзмененныеОбъекты) <> Тип("Массив") ИЛИ ИзмененныеОбъекты.Количество() = 0 Тогда +Процедура ПодготовитьОповещениеДинамическихСписков(ИзмененныеОбъекты, Результат) Экспорт + Если ТипЗнч(ИзмененныеОбъекты) <> Тип("Массив") Или ИзмененныеОбъекты.Количество() = 0 Тогда Возврат; КонецЕсли; Оповещение = Результат.ОповещениеДинамическихСписков; Оповещение.Использование = Истина; - ЗначениеОповещения = Оповещение.СсылкаИлиТип; - ЗначениеОповещенияЗаполнено = ЗначениеЗаполнено(ЗначениеОповещения); + Значение = Оповещение.СсылкаИлиТип; + ЗначениеЗаполнено = ЗначениеЗаполнено(Значение); - Если ИзмененныеОбъекты.Количество() = 1 И НЕ ЗначениеОповещенияЗаполнено Тогда + Если ИзмененныеОбъекты.Количество() = 1 И НЕ ЗначениеЗаполнено Тогда Оповещение.СсылкаИлиТип = ИзмененныеОбъекты[0]; Иначе // Преобразование оповещения в массив. - ЗначениеОповещенияТип = ТипЗнч(ЗначениеОповещения); - Если ЗначениеОповещенияТип <> Тип("Массив") Тогда + ТипЗначения = ТипЗнч(Значение); + Если ТипЗначения <> Тип("Массив") Тогда Оповещение.СсылкаИлиТип = Новый Массив; - Если ЗначениеОповещенияЗаполнено Тогда - Оповещение.СсылкаИлиТип.Добавить(?(ЗначениеОповещенияТип = Тип("Тип"), ЗначениеОповещения, ЗначениеОповещенияТип)); + Если ЗначениеЗаполнено Тогда + Оповещение.СсылкаИлиТип.Добавить(?(ТипЗначения = Тип("Тип"), Значение, ТипЗначения)); КонецЕсли; КонецЕсли; @@ -70,10 +70,10 @@ // Добавляет в оповещение для динамических списков типы из массива измененных объектов. // // Параметры: -// Результат (Структура) См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). -// ИмяСобытия (Строка) Имя события, которое используется для первичной идентификации сообщений принимающими формами. -// Параметр (*) Набор данных, которые используются принимающей формой для обновления состава. -// Источник (*) Источник оповещения, например форма-источником. +// Результат - Структура - См. СтандартныеПодсистемыКлиент.ПоказатьРезультатВыполнения(). +// ИмяСобытия - Строка - Имя события, которое используется для первичной идентификации сообщений принимающими формами. +// Параметр - * - Набор данных, которые используются принимающей формой для обновления состава. +// Источник - * - Источник оповещения, например форма-источником. // Процедура РезультатВыполненияДобавитьОповещениеОткрытыхФорм(Результат, ИмяСобытия, Параметр = Неопределено, Источник = Неопределено) Экспорт Если Не Результат.Свойство("ОповещениеФорм") Тогда diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl index 98f7847f7..8aebb9b17 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыПовтИсп/Module.bsl @@ -99,7 +99,7 @@ Для каждого ИмяМодуля Из МодулиПодсистем Цикл Описание = НовоеОписаниеПодсистемы(); - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(ИмяМодуля); + Модуль = ОбщегоНазначения.ОбщийМодуль(ИмяМодуля); Модуль.ПриДобавленииПодсистемы(Описание); Если Описание.Имя = "СтандартныеПодсистемы" Тогда @@ -363,7 +363,7 @@ Запрос.Текст = "ВЫБРАТЬ | ТекущаяТаблица.Ссылка КАК Ссылка, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных + | ТекущаяТаблица.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных |ИЗ | &ТекущаяТаблица КАК ТекущаяТаблица |ГДЕ @@ -371,22 +371,12 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ПолноеИмяОбъектаМетаданных); - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ТекущаяТаблица.ИмяПредопределенныхДанных"); - Иначе - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяОбъектаМетаданных); - КонецЕсли; - Выборка = Запрос.Выполнить().Выбрать(); ПредопределенныеЗначения = Новый Соответствие; Пока Выборка.Следующий() Цикл - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяПредопределенного = Менеджер.ПолучитьИмяПредопределенного(Выборка.Ссылка); - КонецЕсли; + ИмяПредопределенного = Выборка.ИмяПредопределенныхДанных; ПредопределенныеЗначения.Вставить(ИмяПредопределенного, Выборка.Ссылка); КонецЦикла; @@ -409,22 +399,6 @@ КонецФункции -// Возвращает Истина, если конфигурация запущена под управлением платформы 1С:Предприятие 8.3 без использования режима совместимости -// с версией 8.3.2 или более ранней. -// -Функция ЭтоПлатформа83БезРежимаСовместимости() Экспорт - - Информация = Новый СистемнаяИнформация; - Возврат Лев(Информация.ВерсияПриложения, 3) = "8.3" - И (Метаданные.РежимСовместимости = Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать - Или (Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1 - И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13 - И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_2_16"] - И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_1"] - И Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_2"])); - -КонецФункции - // Только для внутреннего использования. Функция ОтключитьСправочникИдентификаторыОбъектовМетаданных() Экспорт @@ -435,10 +409,10 @@ Возврат Ложь; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") - ИЛИ ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") - ИЛИ ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") - ИЛИ ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") + ИЛИ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") + ИЛИ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РассылкаОтчетов") + ИЛИ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда ВызватьИсключение НСтр("ru = 'Невозможно отключить справочник Идентификаторы объектов метаданных, @@ -599,12 +573,12 @@ Модуль = Неопределено; Если ПерваяПопытка Тогда Попытка - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщегоНазначения.ОбщийМодуль(Обработчик.Модуль); Исключение Возврат Неопределено; КонецПопытки; Иначе - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль(Обработчик.Модуль); + Модуль = ОбщегоНазначения.ОбщийМодуль(Обработчик.Модуль); КонецЕсли; Элемент.Вставить("Модуль", Обработчик.Модуль); Элемент.Вставить("Версия", Обработчик.Версия); diff --git a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl index 9fcf5e591..098503d98 100644 --- a/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl +++ b/SSL/src/CommonModules/СтандартныеПодсистемыСервер/Module.bsl @@ -37,8 +37,8 @@ УстановленныеПараметры.Добавить("ПараметрыКлиентаНаСервере"); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); Обработчики = Новый Соответствие; МодульОбменДаннымиСервер.ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики); ВыполнитьОбработчикиУстановкиПараметровСеанса(ИменаПараметровСеанса, Обработчики, УстановленныеПараметры); @@ -120,103 +120,78 @@ // СЕРВЕРНЫЕ СОБЫТИЯ. - // СтандартныеПодсистемы.БазоваяФункциональность ПриДобавленииСлужебныхСобытийБазовойФункциональности(КлиентскиеСобытия, СерверныеСобытия); - // Конец СтандартныеПодсистемы.БазоваяФункциональность - // СтандартныеПодсистемы.БизнесПроцессыИЗадачи - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.БизнесПроцессыИЗадачи - // СтандартныеПодсистемы.КалендарныеГрафики - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда - МодульКалендарныеГрафики = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КалендарныеГрафики"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); + КонецЕсли; + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.КалендарныеГрафики - // СтандартныеПодсистемы.НапоминанияПользователя - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - МодульНапоминанияПользователяСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("НапоминанияПользователяСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.НапоминанияПользователя - // СтандартныеПодсистемы.ОбменДанными - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.ОбменДанными - // СтандартныеПодсистемы.ОбновлениеВерсииИБ ОбновлениеИнформационнойБазы.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - // Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ - // СтандартныеПодсистемы.Пользователи ПользователиСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - // Конец СтандартныеПодсистемы.Пользователи - // СтандартныеПодсистемы.ПрисоединенныеФайлы - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); МодульПрисоединенныеФайлыСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.ПрисоединенныеФайлы - // СтандартныеПодсистемы.РаботаВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных") Тогда - МодульВыгрузкаЗагрузкаДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВыгрузкаЗагрузкаДанных"); - МодульВыгрузкаЗагрузкаДанных.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульАвтономнаяРаботаСлужебный = ОбщегоНазначения.ОбщийМодуль("АвтономнаяРаботаСлужебный"); + МодульАвтономнаяРаботаСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениями = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменСообщениями"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); МодульОбменСообщениями.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); - МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); + МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); МодульИнтерфейсыСообщенийВМоделиСервиса.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - МодульОчередьЗаданийСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); МодульОчередьЗаданийСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - МодульПоставляемыеДанные = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПоставляемыеДанные"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); МодульПоставляемыеДанные.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные - // СтандартныеПодсистемы.УправлениеДоступом - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.УправлениеДоступом - // СтандартныеПодсистемы.ФайловыеФункции - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФайловыеФункцииСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда + МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); МодульФайловыеФункцииСлужебный.ПриДобавленииСлужебныхСобытий(КлиентскиеСобытия, СерверныеСобытия); КонецЕсли; - // Конец СтандартныеПодсистемы.ФайловыеФункции КонецПроцедуры @@ -243,398 +218,308 @@ // Процедура ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики) Экспорт - // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - - // СтандартныеПодсистемы.БазоваяФункциональность ПриДобавленииОбработчиковСлужебныхСобытийБазовойФункциональности(КлиентскиеОбработчики, СерверныеОбработчики); - // Конец СтандартныеПодсистемы.БазоваяФункциональность - // СтандартныеПодсистемы.АдресныйКлассификатор - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); МодульАдресныйКлассификатор.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.АдресныйКлассификатор - // СтандартныеПодсистемы.АнализЖурналаРегистрации - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда - МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АнализЖурналаРегистрации") Тогда + МодульАнализЖурналаРегистрацииСлужебный = ОбщегоНазначения.ОбщийМодуль("АнализЖурналаРегистрацииСлужебный"); МодульАнализЖурналаРегистрацииСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.АнализЖурналаРегистрации - // СтандартныеПодсистемы.Анкетирование - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда - МодульАнкетирование = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("Анкетирование"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Анкетирование") Тогда + МодульАнкетирование = ОбщегоНазначения.ОбщийМодуль("Анкетирование"); МодульАнкетирование.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Анкетирование - // СтандартныеПодсистемы.Банки - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда - МодульРаботаСБанками = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСБанками"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Банки") Тогда + МодульРаботаСБанками = ОбщегоНазначения.ОбщийМодуль("РаботаСБанками"); МодульРаботаСБанками.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Банки - // СтандартныеПодсистемы.БизнесПроцессыИЗадачи - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.БизнесПроцессыИЗадачи - // СтандартныеПодсистемы.Валюты - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда - МодульРаботаСКурсамиВалют = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСКурсамиВалют"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Валюты") Тогда + МодульРаботаСКурсамиВалют = ОбщегоНазначения.ОбщийМодуль("РаботаСКурсамиВалют"); МодульРаботаСКурсамиВалют.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Валюты - // СтандартныеПодсистемы.ВариантыОтчетов - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); МодульВариантыОтчетов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ВариантыОтчетов - // СтандартныеПодсистемы.Взаимодействия - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда - МодульВзаимодействия = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("Взаимодействия"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия") Тогда + МодульВзаимодействия = ОбщегоНазначения.ОбщийМодуль("Взаимодействия"); МодульВзаимодействия.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульУправлениеЭлектроннойПочтой = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеЭлектроннойПочтой"); + МодульУправлениеЭлектроннойПочтой = ОбщегоНазначения.ОбщийМодуль("УправлениеЭлектроннойПочтой"); МодульУправлениеЭлектроннойПочтой.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Взаимодействия - // СтандартныеПодсистемы.ВерсионированиеОбъектов - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда - МодульВерсионированиеОбъектов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВерсионированиеОбъектов"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВерсионированиеОбъектов") Тогда + МодульВерсионированиеОбъектов = ОбщегоНазначения.ОбщийМодуль("ВерсионированиеОбъектов"); МодульВерсионированиеОбъектов.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ВерсионированиеОбъектов - // СтандартныеПодсистемы.ДатыЗапретаИзменения - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда - МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДатыЗапретаИзменения") Тогда + МодульДатыЗапретаИзмененияСлужебный = ОбщегоНазначения.ОбщийМодуль("ДатыЗапретаИзмененияСлужебный"); МодульДатыЗапретаИзмененияСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ДатыЗапретаИзменения - // СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки - // СтандартныеПодсистемы.ЗавершениеРаботыПользователей - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБ = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СоединенияИБ"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБ = ОбщегоНазначения.ОбщийМодуль("СоединенияИБ"); МодульСоединенияИБ.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ЗавершениеРаботыПользователей - // СтандартныеПодсистемы.ЗаметкиПользователя - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда - МодульЗаметкиПользователяСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗаметкиПользователяСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЗаметкиПользователя") Тогда + МодульЗаметкиПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("ЗаметкиПользователяСлужебный"); МодульЗаметкиПользователяСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ЗаметкиПользователя - // СтандартныеПодсистемы.ИнформацияПриЗапуске - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда - МодульИнформацияПриЗапуске = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ИнформацияПриЗапуске"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ИнформацияПриЗапуске") Тогда + МодульИнформацияПриЗапуске = ОбщегоНазначения.ОбщийМодуль("ИнформацияПриЗапуске"); МодульИнформацияПриЗапуске.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ИнформацияПриЗапуске - // СтандартныеПодсистемы.КалендарныеГрафики - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда - МодульКалендарныеГрафики = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КалендарныеГрафики"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КалендарныеГрафики") Тогда + МодульКалендарныеГрафики = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафики"); МодульКалендарныеГрафики.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.КалендарныеГрафики - // СтандартныеПодсистемы.КонтактнаяИнформация - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда - МодульУправлениеКонтактнойИнформацией = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеКонтактнойИнформацией"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтактнаяИнформация") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("УправлениеКонтактнойИнформацией"); МодульУправлениеКонтактнойИнформацией.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.КонтактнаяИнформация - // СтандартныеПодсистемы.КонтрольДинамическогоОбновленияКонфигурации - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольДинамическогоОбновленияКонфигурации") Тогда - МодульКонтрольДинамическогоОбновленияКонфигурации = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КонтрольДинамическогоОбновленияКонфигурации"); - МодульКонтрольДинамическогоОбновленияКонфигурации.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.КонтрольДинамическогоОбновленияКонфигурации") Тогда + МодульУправлениеКонтактнойИнформацией = ОбщегоНазначения.ОбщийМодуль("КонтрольДинамическогоОбновленияКонфигурацииСлужебный"); + МодульУправлениеКонтактнойИнформацией.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.КонтрольДинамическогоОбновленияКонфигурации - // СтандартныеПодсистемы.НапоминанияПользователя - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда - МодульНапоминанияПользователяСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("НапоминанияПользователяСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НапоминанияПользователя") Тогда + МодульНапоминанияПользователяСлужебный = ОбщегоНазначения.ОбщийМодуль("НапоминанияПользователяСлужебный"); МодульНапоминанияПользователяСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.НапоминанияПользователя - // СтандартныеПодсистемы.ОбновлениеВерсииИБ - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеВерсииИБ") Тогда - МодульОбновлениеИнформационнойБазы = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеВерсииИБ") Тогда + МодульОбновлениеИнформационнойБазы = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазы"); МодульОбновлениеИнформационнойБазы.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ - // СтандартныеПодсистемы.ОбменДанными - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ОбменДанными - // СтандартныеПодсистемы.ОбновлениеКонфигурации - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда - МодульОбновлениеКонфигурации = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеКонфигурации"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда + МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации"); МодульОбновлениеКонфигурации.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ОбновлениеКонфигурации - // СтандартныеПодсистемы.Организации - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда - МодульОрганизацииСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОрганизацииСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Организации") Тогда + МодульОрганизацииСлужебный = ОбщегоНазначения.ОбщийМодуль("ОрганизацииСлужебный"); МодульОрганизацииСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Организации - // СтандартныеПодсистемы.ОценкаПроизводительности - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - МодульОценкаПроизводительностиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиСлужебный = ОбщегоНазначения.ОбщийМодуль("ОценкаПроизводительностиСлужебный"); МодульОценкаПроизводительностиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ОценкаПроизводительности - // СтандартныеПодсистемы.Печать - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда - МодульУправлениеПечатью = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеПечатью"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда + МодульУправлениеПечатью = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатью"); МодульУправлениеПечатью.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Печать - // СтандартныеПодсистемы.ПолнотекстовыйПоиск - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда - МодульПолнотекстовыйПоискСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолнотекстовыйПоискСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолнотекстовыйПоиск") Тогда + МодульПолнотекстовыйПоискСервер = ОбщегоНазначения.ОбщийМодуль("ПолнотекстовыйПоискСервер"); МодульПолнотекстовыйПоискСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ПолнотекстовыйПоиск - // СтандартныеПодсистемы.ПолучениеФайловИзИнтернета - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда - МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда + МодульПолучениеФайловИзИнтернетаСлужебный = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернетаСлужебный"); МодульПолучениеФайловИзИнтернетаСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ПолучениеФайловИзИнтернета - // СтандартныеПодсистемы.Пользователи - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда - МодульПользователиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Пользователи") Тогда + МодульПользователиСлужебный = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебный"); МодульПользователиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Пользователи - // СтандартныеПодсистемы.ПрисоединенныеФайлы - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); МодульПрисоединенныеФайлыСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ПрисоединенныеФайлы - // СтандартныеПодсистемы.РаботаВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса") Тогда - МодульАдресныйКлассификаторСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификаторСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса") Тогда + МодульАдресныйКлассификаторСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебныйВМоделиСервиса"); МодульАдресныйКлассификаторСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.АдресныйКлассификаторВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса") Тогда - МодульБанкиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("БанкиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса") Тогда + МодульБанкиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("БанкиСлужебныйВМоделиСервиса"); МодульБанкиСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.БанкиВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда - МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса") Тогда + МодульКурсыВалютСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КурсыВалютСлужебныйВМоделиСервиса"); МодульКурсыВалютСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ВалютыВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда - МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса") Тогда + МодульДополнительныеОтчетыИОбработкиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВМоделиСервиса"); МодульДополнительныеОтчетыИОбработкиВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); + МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработкиВАвтономномРежиме"); МодульДополнительныеОтчетыИОбработкиВАвтономномРежиме.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ДополнительныеОтчетыИОбработкиВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда - МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса") Тогда + МодульКалендарныеГрафикиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("КалендарныеГрафикиСлужебныйВМоделиСервиса"); МодульКалендарныеГрафикиСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.КалендарныеГрафикиВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда - МодульОбменСообщениями = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменСообщениями"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями") Тогда + МодульОбменСообщениями = ОбщегоНазначения.ОбщийМодуль("ОбменСообщениями"); МодульОбменСообщениями.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); - МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); + МодульИнтерфейсыСообщенийВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ИнтерфейсыСообщенийВМоделиСервиса"); МодульИнтерфейсыСообщенийВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменСообщениями - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда - МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса") Тогда + МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса"); МодульОбновлениеИнформационнойБазыСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбновлениеВерсииИБВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда - МодульОчередьЗаданийСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебный"); + МодульОчередьЗаданийСлужебный = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебный"); МодульОчередьЗаданийСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); Если ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация() Тогда - МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); + МодульОчередьЗаданийСлужебныйРазделениеДанных = ОбщегоНазначения.ОбщийМодуль("ОчередьЗаданийСлужебныйРазделениеДанных"); МодульОчередьЗаданийСлужебныйРазделениеДанных.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда - МодульПоставляемыеДанные = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПоставляемыеДанные"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные") Тогда + МодульПоставляемыеДанные = ОбщегоНазначения.ОбщийМодуль("ПоставляемыеДанные"); МодульПоставляемыеДанные.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ПоставляемыеДанные - // СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда - МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); МодульРезервноеКопированиеОбластейДанных.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных - // СтандартныеПодсистемы.РаботаВМоделиСервиса.УдаленноеАдминистрирование - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УдаленноеАдминистрирование") Тогда - МодульУдаленноеАдминистрированиеСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УдаленноеАдминистрированиеСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УдаленноеАдминистрирование") Тогда + МодульУдаленноеАдминистрированиеСлужебный = ОбщегоНазначения.ОбщийМодуль("УдаленноеАдминистрированиеСлужебный"); МодульУдаленноеАдминистрированиеСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.УдаленноеАдминистрирование - // СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); МодульУправлениеДоступомСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса - // СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда - МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса") Тогда + МодульФайловыеФункцииСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебныйВМоделиСервиса"); МодульФайловыеФункцииСлужебныйВМоделиСервиса.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаВМоделиСервиса.ФайловыеФункцииВМоделиСервиса - // СтандартныеПодсистемы.РаботаСПочтовымиСообщениями - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - МодульРаботаСПочтовымиСообщениями = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСПочтовымиСообщениями"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями"); МодульРаботаСПочтовымиСообщениями.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаСПочтовымиСообщениями - // СтандартныеПодсистемы.РаботаСФайлами - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный"); МодульРаботаСФайламиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РаботаСФайлами - // СтандартныеПодсистемы.РегламентныеЗадания - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда - МодульРегламентныеЗаданияСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РегламентныеЗаданияСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РегламентныеЗадания") Тогда + МодульРегламентныеЗаданияСлужебный = ОбщегоНазначения.ОбщийМодуль("РегламентныеЗаданияСлужебный"); МодульРегламентныеЗаданияСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РегламентныеЗадания - // СтандартныеПодсистемы.РезервноеКопированиеИБ - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда - МодульРезервноеКопированиеИБСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РезервноеКопированиеИБСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РезервноеКопированиеИБ") Тогда + МодульРезервноеКопированиеИБСервер = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеИБСервер"); МодульРезервноеКопированиеИБСервер.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.РезервноеКопированиеИБ - // СтандартныеПодсистемы.Свойства - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда - МодульУправлениеСвойствамиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеСвойствамиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеСвойствамиСлужебный"); МодульУправлениеСвойствамиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.Свойства - // СтандартныеПодсистемы.УправлениеДоступом - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); МодульУправлениеДоступомСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.УправлениеДоступом - // СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда - МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами") Тогда + МодульУправлениеИтогамиИАгрегатамиСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеИтогамиИАгрегатамиСлужебный"); МодульУправлениеИтогамиИАгрегатамиСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.УправлениеИтогамиИАгрегатами - // СтандартныеПодсистемы.ФайловыеФункции - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда - МодульФайловыеФункцииСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФайловыеФункцииСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФайловыеФункции") Тогда + МодульФайловыеФункцииСлужебный = ОбщегоНазначения.ОбщийМодуль("ФайловыеФункцииСлужебный"); МодульФайловыеФункцииСлужебный.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ФайловыеФункции - // СтандартныеПодсистемы.ФизическиеЛица - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ФизическиеЛица") Тогда - МодульФизическиеЛица = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ФизическиеЛица"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ФизическиеЛица") Тогда + МодульФизическиеЛица = ОбщегоНазначения.ОбщийМодуль("ФизическиеЛица"); МодульФизическиеЛица.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ФизическиеЛица - // СтандартныеПодсистемы.ЭлектроннаяПодпись - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда - МодульЭлектроннаяЦифроваяПодпись = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЭлектроннаяЦифроваяПодпись"); - МодульЭлектроннаяЦифроваяПодпись.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда + МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись"); + МодульЭлектроннаяПодпись.ПриДобавленииОбработчиковСлужебныхСобытий(КлиентскиеОбработчики, СерверныеОбработчики); КонецЕсли; - // Конец СтандартныеПодсистемы.ЭлектроннаяПодпись КонецПроцедуры +// Получает идентификатор информационной базы. +// Если идентификатор не заполнен, то устанавливает его значение. +// Константа ИдентификаторИнформационнойБазы не должна входить в составы планов обмена и иметь +// различные значения в каждой информационной базе. +// +Функция ИдентификаторИнформационнойБазы() Экспорт + + ИдентификаторИнформационнойБазы = Константы.ИдентификаторИнформационнойБазы.Получить(); + + Если ПустаяСтрока(ИдентификаторИнформационнойБазы) Тогда + + ИдентификаторИнформационнойБазы = Новый УникальныйИдентификатор(); + Константы.ИдентификаторИнформационнойБазы.Установить(Строка(ИдентификаторИнформационнойБазы)); + + КонецЕсли; + + Возврат ИдентификаторИнформационнойБазы; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Дополнительная базовая функциональность для анализа параметров клиента на сервере @@ -815,24 +700,14 @@ КонецЕсли; Если ТребуетсяОбновление Тогда - Если ТекущийРежимЗапуска() = Неопределено Тогда - ВызватьИсключение - НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию.'"); - Иначе - ВызватьИсключение - НСтр("ru = 'Недопустимое обращение к необновленным параметрам работы программы - |(например, к некоторым параметрам сеанса): - |- если это обращение выполняется из формы на начальной странице - | (рабочем столе), то необходимо убедиться, что в ней имеется вызов - | процедуры ОбщегоНазначения.ПриСозданииНаСервере; - |- в остальных случаях необходимо перенести вызов прикладного кода - | после обновления параметров работы программы.'"); - КонецЕсли; + ВызватьИсключение + НСтр("ru = 'Вход в программу временно невозможен в связи с обновлением на новую версию.'"); КонецЕсли; КонецЕсли; КонецПроцедуры + // Возвращает изменения параметра работы программы с учетом текущей версии // конфигурации и текущей версии ИБ. // @@ -1054,31 +929,20 @@ УстановитьПривилегированныйРежим(Истина); - ПараметрыКлиентаНаСервере = Новый Соответствие; - Для каждого КлючИЗначение Из ПараметрыСеанса.ПараметрыКлиентаНаСервере Цикл - ПараметрыКлиентаНаСервере.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; + УстановитьПривилегированныйРежим(Истина); + ПараметрыКлиентаНаСервере = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); ВсеОбновленныеПараметры = ПараметрыКлиентаНаСервере.Получить("ВсеОбновленныеПараметрыРаботыПрограммы"); Если ВсеОбновленныеПараметры = Неопределено Тогда ВсеОбновленныеПараметры = Новый Соответствие; ОбновленныеПараметры = Новый Соответствие; Иначе - Соответствие = Новый Соответствие; - Для каждого КлючИЗначение Из ВсеОбновленныеПараметры Цикл - Соответствие.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; - ВсеОбновленныеПараметры = Соответствие; - ОбновленныеПараметры = ВсеОбновленныеПараметры.Получить(ИмяКонстанты); + ВсеОбновленныеПараметры = Новый Соответствие(ВсеОбновленныеПараметры); Если ОбновленныеПараметры = Неопределено Тогда ОбновленныеПараметры = Новый Соответствие; Иначе - Соответствие = Новый Соответствие; - Для каждого КлючИЗначение Из ОбновленныеПараметры Цикл - Соответствие.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение); - КонецЦикла; - ОбновленныеПараметры = Соответствие; + ОбновленныеПараметры = Новый Соответствие(ОбновленныеПараметры); КонецЕсли; КонецЕсли; ОбновленныеПараметры.Вставить(ИмяПараметра, Истина); @@ -1203,7 +1067,7 @@ ОписаниеИсключения1 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В состав плана обмена %1 должны входить следующие объекты метаданных: %2'"), ИмяПланаОбмена, - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ВключитьВСостав), ", ")); + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ВключитьВСостав), ", ")); КонецЕсли; @@ -1212,7 +1076,7 @@ ОписаниеИсключения2 = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'В состав плана обмена %1 НЕ должны входить следующие объекты метаданных: %2'"), ИмяПланаОбмена, - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ИсключитьИзСостава), ", ")); + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ИсключитьИзСостава), ", ")); КонецЕсли; @@ -1222,7 +1086,7 @@ НСтр("ru = 'В составе плана обмена %1 не должно быть объектов с установленным признаком авторегистрации. |Требуется запретить авторегистрацию для следующих объектов метаданных: %2'"), ИмяПланаОбмена, - СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ОтключитьАвторегистрацию), ", ")); + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПредставлениеОбъектовМетаданных(ОтключитьАвторегистрацию), ", ")); КонецЕсли; @@ -1371,8 +1235,8 @@ КонецЕсли; // Вставка кода от подсистемы обмена данными должна быть первой. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСобытия = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСобытия"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); МодульОбменДаннымиСобытия.ПриОтправкеДанныхКорреспонденту(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель, Ложь); Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда @@ -1392,8 +1256,8 @@ КонецЦикла; // Вставка кода от подсистемы обмена данными в модели сервиса должна быть последней. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда - МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") Тогда + МодульОбменДаннымиВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВМоделиСервиса"); МодульОбменДаннымиВМоделиСервиса.ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель); Если ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать Тогда @@ -1464,8 +1328,8 @@ КонецЦикла; // Вставка кода от подсистемы обмена данными должна быть последней. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСобытия = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСобытия"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); МодульОбменДаннымиСобытия.ПриПолученииДанныхОтПодчиненногоВКонце(ЭлементДанных, ПолучениеЭлемента, Отправитель); КонецЕсли; @@ -1485,8 +1349,8 @@ КонецЕсли; // Вставка кода от подсистемы обмена данными должна быть первой. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСобытия = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСобытия"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); МодульОбменДаннымиСобытия.ПриПолученииДанныхОтГлавногоВНачале(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель); Если ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать Тогда @@ -1507,10 +1371,10 @@ КонецЦикла; // Вставка кода от подсистемы обмена данными должна быть последней. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") И Не СозданиеНачальногоОбраза(ЭлементДанных) Тогда - МодульОбменДаннымиСобытия = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСобытия"); + МодульОбменДаннымиСобытия = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСобытия"); МодульОбменДаннымиСобытия.ПриПолученииДанныхОтГлавногоВКонце(ЭлементДанных, ПолучениеЭлемента, Отправитель); КонецЕсли; @@ -1528,7 +1392,10 @@ // Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт - + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.НастройкиПрограммы") Тогда + МодульОбработкиПанельАдминистрированияБСП = ОбщегоНазначения.ОбщийМодуль("Обработки.ПанельАдминистрированияБСП"); + МодульОбработкиПанельАдминистрированияБСП.ПриДобавленииПереименованийОбъектовМетаданных(Итог); + КонецЕсли; КонецПроцедуры @@ -1544,14 +1411,15 @@ КонецПроцедуры -// Обработчик, вызываемый при определении объектов метаданных, не переносящихся между моделями при выгрузке / загрузке данных. +// Заполняет массив типов неразделенных данных, для которых поддерживается сопоставление ссылок +// при загрузке данных в другую информационную базу. // -// Параметры -// Объекты - Массив(ОбъектМетаданных). +// Параметры: +// Типы - Массив(ОбъектМетаданных) // -Процедура ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки(Объекты) Экспорт +Процедура ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - Объекты.Добавить(Метаданные.РегистрыСведений.КэшПрограммныхИнтерфейсов); + Типы.Добавить(Метаданные.Справочники.ИдентификаторыОбъектовМетаданных); КонецПроцедуры @@ -1593,11 +1461,8 @@ Объекты.Добавить(Метаданные.Константы.ИспользоватьРазделениеПоОбластямДанных); Объекты.Добавить(Метаданные.Константы.НеИспользоватьРазделениеПоОбластямДанных); Объекты.Добавить(Метаданные.Константы.ЭтоАвтономноеРабочееМесто); - Объекты.Добавить(Метаданные.Константы.КаталогВременныхФайловДляWindows); - Объекты.Добавить(Метаданные.Константы.КаталогВременныхФайловДляLinux); Объекты.Добавить(Метаданные.РегистрыСведений.КэшПрограммныхИнтерфейсов); - Объекты.Добавить(Метаданные.РегистрыСведений.НеразделенныеПользователи); КонецЕсли; @@ -1711,7 +1576,7 @@ Запрос.Текст = "ВЫБРАТЬ | ТекущаяТаблица.Ссылка КАК Ссылка, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных + | ТекущаяТаблица.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных |ИЗ | &ТекущаяТаблица КАК ТекущаяТаблица |ГДЕ @@ -1719,12 +1584,6 @@ Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ПолноеИмя); - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ТекущаяТаблица.ИмяПредопределенныхДанных"); - Иначе - Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмя); - КонецЕсли; - ИменаПредопределенныхДанных = Новый СписокЗначений; Если ОбщегоНазначенияПовтИсп.РазделениеВключено() @@ -1739,11 +1598,7 @@ КонецПопытки; Пока Выборка.Следующий() Цикл - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяПредопределенныхДанных = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяПредопределенныхДанных = Менеджер.ПолучитьИмяПредопределенного(Выборка.Ссылка); - КонецЕсли; + ИмяПредопределенныхДанных = Выборка.ИмяПредопределенныхДанных; Если ЗначениеЗаполнено(ИмяПредопределенныхДанных) Тогда ИменаПредопределенныхДанных.Добавить(ИмяПредопределенныхДанных); КонецЕсли; @@ -1754,11 +1609,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяПредопределенныхДанных = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяПредопределенныхДанных = Менеджер.ПолучитьИмяПредопределенного(Выборка.Ссылка); - КонецЕсли; + ИмяПредопределенныхДанных = Выборка.ИмяПредопределенныхДанных; Если ЗначениеЗаполнено(ИмяПредопределенныхДанных) Тогда ИменаПредопределенныхДанных.Добавить(ИмяПредопределенныхДанных); КонецЕсли; @@ -1814,75 +1665,123 @@ Функция ДобавитьПараметрыРаботыКлиентаПриЗапуске(Параметры) Экспорт // Обязательные параметры для продолжения работы. - Параметры.Вставить("РазделениеВключено", ОбщегоНазначенияПовтИсп.РазделениеВключено()); - Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных", + Параметры.Вставить("ДоступноИспользованиеРазделенныхДанных", ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных()); + Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация()); + Параметры.Вставить("ЕстьДоступДляОбновленияВерсииПлатформы", ПравоДоступа("Администрирование", Метаданные)); Параметры.Вставить("ИменаПодсистем", СтандартныеПодсистемыПовтИсп.ИменаПодсистем()); - // Проверка продолжения работы. - Параметры.Вставить("ИнформационнаяБазаЗаблокированаДляОбновления", - ОбновлениеИнформационнойБазы.ИнформационнаяБазаЗаблокированаДляОбновления(, Истина)); + ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности(); + Параметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы); + Параметры.Вставить("РаботаВПрограммеЗапрещена", ОбщиеПараметры.РаботаВПрограммеЗапрещена); - Если ЗначениеЗаполнено(Параметры.ИнформационнаяБазаЗаблокированаДляОбновления) Тогда + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено + И Параметры.ПолученныеПараметрыКлиента.Количество() = 0 Тогда + + УстановитьПривилегированныйРежим(Истина); + ПараметрЗапускаКлиента = ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска"); + Если Найти(НРег(ПараметрЗапускаКлиента), НРег("ЗапуститьОбновлениеИнформационнойБазы")) > 0 Тогда + УстановитьЗапускОбновленияИнформационнойБазы(Истина); + КонецЕсли; + УстановитьПривилегированныйРежим(Ложь); + КонецЕсли; + + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено + И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("ПоказатьНерекомендуемуюВерсиюПлатформы") + И ПоказатьНерекомендуемуюВерсиюПлатформы(Параметры) Тогда + + Параметры.Вставить("ПоказатьНерекомендуемуюВерсиюПлатформы"); + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + Возврат Ложь; + КонецЕсли; + + // Проверка продолжения работы. + ОписаниеОшибки = ОбновлениеИнформационнойБазы.ИнформационнаяБазаЗаблокированаДляОбновления(, Истина); + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + Параметры.Вставить("ИнформационнаяБазаЗаблокированаДляОбновления", ОписаниеОшибки); // Работа будет завершена. Возврат Ложь; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - Если Параметры.РазделениеВключено И Параметры.ДоступноИспользованиеРазделенныхДанных И Параметры.ПервыйЗапросПараметров Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); - МодульРаботаВМоделиСервиса.ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(); + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено + И НЕ (Параметры.РазделениеВключено И Не Параметры.ДоступноИспользованиеРазделенныхДанных) + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + ОписаниеОшибки = ""; + МодульРаботаВМоделиСервиса.ПриПроверкеБлокировкиОбластиДанныхПриЗапуске(ОписаниеОшибки); + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + Параметры.Вставить("ОбластьДанныхЗаблокирована", ОписаниеОшибки); + // Работа будет завершена. + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + Если ОбновлениеИнформационнойБазы.ТребуетсяПроверитьЛегальностьПолученияОбновления() Тогда + Параметры.Вставить("ПроверитьЛегальностьПолученияОбновления"); + КонецЕсли; + + // Настройка автоматического создания предопределенных элементов для немигрируемых объектов метаданных. + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + Если МодульОбменДаннымиСервер.НастройкаПодчиненногоУзлаРИБ() Или (ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") + И ОбщегоНазначения.ОбщийМодуль("АвтономнаяРаботаСлужебный").НеобходимоВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске()) Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда + МодульОценкаПроизводительностиВызовСервераПолныеПрава = ОбщегоНазначения.ОбщийМодуль( + "ОценкаПроизводительностиВызовСервераПолныеПрава"); + МодульОценкаПроизводительностиВызовСервераПолныеПрава.УстановитьАвтоматическоеОбновлениеКлючевыхОперацийВРИБ(); + КонецЕсли; КонецЕсли; КонецЕсли; // Проверка запуска с пустым списком пользователей. - Параметры.Вставить("ОшибкаЗапускаСПустымСпискомПользователей", - ПользователиСлужебный.ПроверитьВозможностьЗапускаСПустымСпискомПользователейИБ(Истина)); + ОписаниеОшибки = ПользователиСлужебный.ПроверитьВозможностьЗапускаСПустымСпискомПользователейИБ(Истина); + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + Параметры.Вставить("ОшибкаЗапускаСПустымСпискомПользователей", ОписаниеОшибки); + КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиПовтИсп = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиПовтИсп"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиПовтИсп"); Если МодульОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто() Тогда // Для автономного рабочего места проверка выполняется после загрузки данных. - Параметры.ОшибкаЗапускаСПустымСпискомПользователей = ""; + Если Параметры.Свойство("ОшибкаЗапускаСПустымСпискомПользователей") Тогда + Параметры.Удалить("ОшибкаЗапускаСПустымСпискомПользователей"); + КонецЕсли; КонецЕсли; КонецЕсли; - Если ЗначениеЗаполнено(Параметры.ОшибкаЗапускаСПустымСпискомПользователей) Тогда + Если Параметры.Свойство("ОшибкаЗапускаСПустымСпискомПользователей") Тогда // Будет предложено создать администратора или завершить работу. Возврат Ложь; КонецЕсли; - Если Параметры.ПервыйЗапросПараметров + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено + И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") И ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ() - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиВызовСервера"); + МодульОбменДаннымиВызовСервера = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиВызовСервера"); Если МодульОбменДаннымиВызовСервера.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() Тогда Параметры.Вставить("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском"); + Возврат Ложь; КонецЕсли; КонецЕсли; // Проверка необходимости предварительного обновления параметров работы программы. - Если НеобходимоОбновлениеПараметровРаботыПрограммы() Тогда - Параметры.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы", Истина); - Иначе - Параметры.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы", Ложь); - Если Параметры.ПервыйЗапросПараметров Тогда - ПодтвердитьОбновлениеПараметраРаботыПрограммы("*", ""); - КонецЕсли; - КонецЕсли; - - Если Параметры.ПервыйЗапросПараметров Тогда - Если Параметры.НеобходимоОбновлениеПараметровРаботыПрограммы - ИЛИ Параметры.Свойство("ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском") Тогда + Если Параметры.ПолученныеПараметрыКлиента <> Неопределено + И НЕ Параметры.ПолученныеПараметрыКлиента.Свойство("НеобходимоОбновлениеПараметровРаботыПрограммы") Тогда - // Будет выполнено предварительная загрузка или обновление. + Если НеобходимоОбновлениеПараметровРаботыПрограммы() Тогда + // Будет выполнено предварительное обновление. + Параметры.Вставить("НеобходимоОбновлениеПараметровРаботыПрограммы"); Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); Возврат Ложь; + Иначе + ПодтвердитьОбновлениеПараметраРаботыПрограммы("*", ""); КонецЕсли; КонецЕсли; @@ -1890,18 +1789,11 @@ Параметры.Вставить("ОбработчикиКлиентскихСобытий", СтандартныеПодсистемыПовтИсп.ПараметрыПрограммныхСобытий( ).ОбработчикиСобытий.НаКлиенте); - Параметры.Вставить("ПервыйЗапускИнформационнойБазы", - ОбновлениеИнформационнойБазы.ПервыйЗапускИнформационнойБазы()); - Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация); - Параметры.Вставить("НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы", - ОбновлениеИнформационнойБазы.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы()); - - Параметры.Вставить("ЗагрузитьСообщениеОбменаДанными", Ложь); - - // При входе неразделенным пользователем в неразделенный сеанс ошибки авторизации нет. - Параметры.Вставить("ОшибкаАвторизации", ""); + Если ОбновлениеИнформационнойБазы.НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы() Тогда + Параметры.Вставить("НеобходимоОбновлениеНеразделенныхДанныхИнформационнойБазы"); + КонецЕсли; Если Параметры.РазделениеВключено И Не Параметры.ДоступноИспользованиеРазделенныхДанных Тогда Возврат Ложь; @@ -1910,29 +1802,23 @@ // Параметры для работы в локальном режиме или // в сеансе с установленными значениями разделителей в модели сервиса. - Параметры.Вставить("НеобходимоОбновлениеИнформационнойБазы", + Параметры.Вставить("НеобходимоОбновлениеИнформационнойБазы", ОбновлениеИнформационнойБазы.НеобходимоОбновлениеИнформационнойБазы()); + Если Параметры.НеобходимоОбновлениеИнформационнойБазы Тогда + СтандартныеПодсистемыВызовСервера.СкрытьРабочийСтолПриНачалеРаботыСистемы(); + КонецЕсли; + Если Не Параметры.РазделениеВключено - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); Параметры.Вставить("ЗагрузитьСообщениеОбменаДанными", МодульОбменДаннымиСервер.ЗагрузитьСообщениеОбменаДанными()); КонецЕсли; - Параметры.Вставить("ЭтоРазделеннаяКонфигурация", ОбщегоНазначенияПовтИсп.ЭтоРазделеннаяКонфигурация()); - Параметры.Вставить("ЕстьДоступДляОбновленияВерсииПлатформы", ПравоДоступа("Администрирование", Метаданные)); - - ОбщиеПараметры = ОбщегоНазначения.ОбщиеПараметрыБазовойФункциональности(); - Параметры.Вставить("МинимальноНеобходимаяВерсияПлатформы", ОбщиеПараметры.МинимальноНеобходимаяВерсияПлатформы); - Параметры.Вставить("РаботаВПрограммеЗапрещена", ОбщиеПараметры.РаботаВПрограммеЗапрещена); - - Параметры.Вставить("ОшибкаАвторизации", ПользователиСлужебный.АвторизоватьТекущегоПользователя(Истина)); - Если Параметры.ОшибкаАвторизации <> "" Тогда - Возврат Ложь; - КонецЕсли; - - Если ЗначениеЗаполнено(Параметры.ИнформационнаяБазаЗаблокированаДляОбновления) Тогда + ОшибкаАвторизации = ПользователиСлужебный.АвторизоватьТекущегоПользователя(Истина); + Если ОшибкаАвторизации <> "" Тогда + Параметры.Вставить("ОшибкаАвторизации", ОшибкаАвторизации); Возврат Ложь; КонецЕсли; @@ -1942,6 +1828,28 @@ КонецФункции +// Устанавливает состояние запуска обновления информационной. +// Требуется привилегированный режим. +// +// Параметры: +// Запуск - Булево. Если установить Истина, состояние будет установлено, +// если установить Ложь, состояние будет снято. +// +Процедура УстановитьЗапускОбновленияИнформационнойБазы(Запуск) Экспорт + + ТекущиеПараметры = Новый Соответствие(ПараметрыСеанса.ПараметрыКлиентаНаСервере); + + Если Запуск = Истина Тогда + ТекущиеПараметры.Вставить("ЗапуститьОбновлениеИнформационнойБазы", Истина); + + ИначеЕсли ТекущиеПараметры.Получить("ЗапуститьОбновлениеИнформационнойБазы") <> Неопределено Тогда + ТекущиеПараметры.Удалить("ЗапуститьОбновлениеИнформационнойБазы"); + КонецЕсли; + + ПараметрыСеанса.ПараметрыКлиентаНаСервере = Новый ФиксированноеСоответствие(ТекущиеПараметры); + +КонецПроцедуры + // Заполняет структуру параметров, необходимых для работы клиентского кода // данной подсистемы. // @@ -1963,8 +1871,6 @@ Параметры.Вставить("ПодробнаяИнформация", Метаданные.ПодробнаяИнформация); Параметры.Вставить("КодОсновногоЯзыка", Метаданные.ОсновнойЯзык.КодЯзыка); - Параметры.Вставить("ЭтоПлатформа83БезРежимаСовместимости", СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости()); - Параметры.Вставить("ЗапрашиватьПодтверждениеПриЗавершенииПрограммы", ЗапрашиватьПодтверждениеПриЗавершенииПрограммы()); @@ -1997,10 +1903,6 @@ Параметры.Вставить("ЭтоГлавныйУзел", НЕ ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ()); Параметры.Вставить("ИнформационнаяБазаФайловая", ОбщегоНазначения.ИнформационнаяБазаФайловая()); - Параметры.Вставить("ИнформационнаяБазаФайловаяБезМенеджераФоновыхЗаданий", - ОбщегоНазначения.ИнформационнаяБазаФайловая() - И НЕ ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости()); - Параметры.Вставить("ТребуетсяОбновлениеКонфигурацииУзлаРИБ", ОбщегоНазначения.ТребуетсяОбновлениеКонфигурацииПодчиненногоУзлаРИБ()); @@ -2070,7 +1972,7 @@ Продолжить; КонецЕсли; - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль( + Модуль = ОбщегоНазначения.ОбщийМодуль( Описание.ОсновнойСерверныйМодуль); Если Описание.Имя = "СтандартныеПодсистемы" Тогда @@ -2128,7 +2030,7 @@ Продолжить; КонецЕсли; - Модуль = ОбщегоНазначенияКлиентСервер.ОбщийМодуль( + Модуль = ОбщегоНазначения.ОбщийМодуль( Описание.ОсновнойСерверныйМодуль); Если Описание.Имя = "СтандартныеПодсистемы" Тогда @@ -2167,7 +2069,7 @@ ИмяСобытия = НСтр("ru = 'Обработчики событий'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()); Комментарий = НСтр("ru = 'Для следующих обязательных событий не определены обработчики:'") - + Символы.ПС + СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ОбязательныеСобытияБезОбработчиков, Символы.ПС); + + Символы.ПС + СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ОбязательныеСобытияБезОбработчиков, Символы.ПС); ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньЖурналаРегистрации.Ошибка,,, Комментарий); ВызватьИсключение НСтр("ru = 'Для обязательных событий не определены обработчики. @@ -2195,24 +2097,6 @@ КонецФункции -// Возвращает серверный общий модуль по имени. -Функция СерверныйОбщийМодуль(Имя) Экспорт - - Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда - Модуль = Вычислить(Имя); - Иначе - Модуль = Неопределено; - КонецЕсли; - - Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); - КонецЕсли; - - Возврат Модуль; - -КонецФункции - // Только для внутреннего использования. Функция НеобходимоОбновлениеПараметровРаботыПрограммы(ВыполнитьЗагрузку = Истина) Экспорт @@ -2230,22 +2114,26 @@ КонецЕсли; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); + // При запуске созданного начального образа подчиненного узла РИБ + // загрузка не требуется, а обновление нужно выполнить. Если МодульОбменДаннымиСервер.НастройкаПодчиненногоУзлаРИБ() Тогда ВыполнитьЗагрузку = Ложь; Возврат Истина; КонецЕсли; КонецЕсли; + // При переходе с предыдущей версии в которой не было БСП + // или с версии БСП 2.1.1 (и ранее) в которой не было параметров работы программы. Попытка ПользователиСлужебныйПовтИсп.Параметры(); Исключение ВыполнитьЗагрузку = Ложь; Возврат Истина; КонецПопытки; - + Возврат Ложь; КонецФункции @@ -2285,7 +2173,7 @@ СтандартнаяОбработка); Если СтандартнаяОбработка = Истина - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда Если НЕ МонопольныйРежим() Тогда Попытка @@ -2303,16 +2191,16 @@ КонецЕсли; // Загрузка идентификаторов объектов метаданных из главного узла. - МодульОбменДаннымиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер"); + МодульОбменДаннымиСервер = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиСервер"); МодульОбменДаннымиСервер.ПередПроверкойИдентификаторовОбъектовМетаданныхВПодчиненномУзлеРИБ(); КонецЕсли; // Проверка загрузки идентификаторов объектов метаданных из главного узла. - СписокКритичныхИзменений = ""; + СписокНовыхОбъектовМетаданных = ""; Попытка - Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(, , Истина, , , СписокКритичныхИзменений); + Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(, , Истина, , , СписокНовыхОбъектовМетаданных); Исключение - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда // Сброс кэша сообщения обмена. МодульОбменДаннымиСервер.ПриОшибкеПроверкиИдентификаторовОбъектовМетаданныхВПодчиненномУзлеРИБ(); КонецЕсли; @@ -2320,25 +2208,29 @@ ВызватьИсключение; КонецПопытки; - Если ЗначениеЗаполнено(СписокКритичныхИзменений) Тогда + Если ЗначениеЗаполнено(СписокНовыхОбъектовМетаданных) Тогда + + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Из главного узла не загружены идентификаторы новых объектов метаданных: + |%1.'"), + СписокНовыхОбъектовМетаданных); ЗаписьЖурналаРегистрации( - НСтр("ru = 'Идентификаторы объектов метаданных.Требуется загрузить критичные изменения'", + НСтр("ru = 'Обмен данными.Загрузка справочника ""Идентификаторы объектов метаданных""'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Ошибка, , , - СписокКритичныхИзменений); + ТекстОшибки); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда // Сброс кэша сообщения обмена, вызов исключения с пояснением дальнейших действий. МодульОбменДаннымиСервер.ПриОшибкеПроверкиИдентификаторовОбъектовМетаданныхВПодчиненномУзлеРИБ(Истина); КонецЕсли; ТекстОшибки = НСтр("ru = 'Из главного узла не загружены изменения справочника ""Идентификаторы объектов метаданных"": - |при проверке обнаружено, что требуется загрузить критичные изменения (см. подробности в журнале - |регистрации в событии ""Идентификаторы объектов метаданных.Требуется загрузить критичные изменения"").'"); + |не найдены идентификаторы новых объектов метаданных. См. подробности в журнале регистрации.'"); ВызватьИсключение ТекстОшибки; КонецЕсли; @@ -2568,7 +2460,7 @@ Возврат; КонецЕсли; - Если НЕ ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда // Действия не рассчитаны на произвольные способы разделения. Возврат; КонецЕсли; @@ -2743,6 +2635,20 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Регламентное задание для удаления помеченных + +// Точка входа регламентного задания. +// +Процедура УдалениеПомеченныхПоРасписанию() Экспорт + Если ПустаяСтрока(ИмяПользователя()) Тогда + УстановитьПривилегированныйРежим(Истина); + КонецЕсли; + + Обработки.УдалениеПомеченныхОбъектов.УдалитьПомеченныеОбъектыИзРегламентногоЗадания(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -2750,9 +2656,20 @@ // Привилегированный режим (установлен платформой). - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - МодульРаботаВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервиса"); + // Проверка основного языка программирования, установленного в конфигурации. + // БСП поддерживает только Русский. + ОбщегоНазначенияКлиентСервер.Проверить( + Метаданные.ВариантВстроенногоЯзыка = Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вариант встроенного языка конфигурации ""%1"" не поддерживается. Необходимо использовать вариант языка ""%2"".'"), + Метаданные.ВариантВстроенногоЯзыка, + Метаданные.СвойстваОбъектов.ВариантВстроенногоЯзыка.Русский)); + + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); МодульРаботаВМоделиСервиса.ПриПроверкеВключенияБезопасногоРежимаРазделенияДанных(); + КонецЕсли; // Проверка заполнения версии конфигурации. @@ -2775,11 +2692,9 @@ КонецЕсли; КонецЕсли; - ОбновитьКлючевыеОперацииВПодчиненномУзлеРИБ(); - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.РезервноеКопированиеОбластейДанных") Тогда // Установка флага активности пользователей в области - МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); + МодульРезервноеКопированиеОбластейДанных = ОбщегоНазначения.ОбщийМодуль("РезервноеКопированиеОбластейДанных"); МодульРезервноеКопированиеОбластейДанных.УстановитьФлагАктивностиПользователяВОбласти(); КонецЕсли; @@ -2909,23 +2824,36 @@ КонецФункции -Процедура ОбновитьКлючевыеОперацииВПодчиненномУзлеРИБ() +Функция ПоказатьНерекомендуемуюВерсиюПлатформы(Параметры) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОценкаПроизводительности") Тогда - - Если ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиСервер").НастройкаПодчиненногоУзлаРИБ() - ИЛИ (ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОбменДаннымиВМоделиСервиса") - И ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АвтономнаяРаботаСлужебный").НеобходимоВыполнитьНастройкуАвтономногоРабочегоМестаПриПервомЗапуске()) Тогда - - МодульОценкаПроизводительностиВызовСервераПолныеПрава = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОценкаПроизводительностиВызовСервераПолныеПрава"); - МодульОценкаПроизводительностиВызовСервераПолныеПрава.УстановитьАвтоматическоеОбновлениеКлючевыхОперацийВРИБ(); - - КонецЕсли; - + Если Параметры.РазделениеВключено Тогда + Возврат Ложь; КонецЕсли; -КонецПроцедуры + // Проверка, что пользователь не внешний. + УстановитьПривилегированныйРежим(Истина); + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ИдентификаторПользователяИБ", + ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор); + + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.ВнешниеПользователи КАК ВнешниеПользователи + |ГДЕ + | ВнешниеПользователи.ИдентификаторПользователяИБ = &ИдентификаторПользователяИБ"; + + Если НЕ Запрос.Выполнить().Пустой() Тогда + Возврат Ложь; + КонецЕсли; + + СистемнаяИнформация = Новый СистемнаяИнформация; + Возврат ОбщегоНазначенияКлиентСервер.СравнитьВерсии(СистемнаяИнформация.ВерсияПриложения, + Параметры.МинимальноНеобходимаяВерсияПлатформы) < 0; + +КонецФункции Функция ЭтоПредопределенныйЭлемент(ЭлементДанных) @@ -2959,8 +2887,7 @@ // ПриНачалеРаботыСистемы, // ПриОбработкеПараметровЗапуска, // ПередЗавершениемРаботыСистемы, -// ПриПолученииСпискаПредупрежденийЗавершенияРаботы, -// ПриОпределенииФормыАктивныхПользователей. +// ПриПолученииСпискаПредупрежденийЗавершенияРаботы. // // Серверные события: // ПриДобавленииОбработчиковУстановкиПараметровСеанса, @@ -2985,31 +2912,45 @@ // КЛИЕНТСКИЕ СОБЫТИЯ. - // Вызывается перед интерактивным началом работы пользователя с областью данных. + // Выполняется перед интерактивным началом работы пользователя с областью данных или в локальном режиме. // Соответствует событию ПередНачаломРаботыСистемы модулей приложения. // - // Параметры: - // Отказ - Булево - отказ в от начала работы. Если параметр установить - // Истина, тогда начало работы с областью данных будет прервано. + // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. // // Синтаксис: - // Процедура ПередНачаломРаботыСистемы(Отказ) Экспорт + // Процедура ПередНачаломРаботыСистемы(Параметры) Экспорт // // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПередНачаломРаботыСистемы). КлиентскиеСобытия.Добавить( "СтандартныеПодсистемы.БазоваяФункциональность\ПередНачаломРаботыСистемы"); - // Вызывается при интерактивном начале работы пользователя с областью данных. + // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. // Соответствует событию ПриНачалеРаботыСистемы модулей приложения. // + // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. + // // Синтаксис: - // Процедура ПриНачалеРаботыСистемы() Экспорт + // Процедура ПриНачалеРаботыСистемы(Параметры) Экспорт // // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы). КлиентскиеСобытия.Добавить( "СтандартныеПодсистемы.БазоваяФункциональность\ПриНачалеРаботыСистемы"); - // Вызывается при интерактивном начале работы пользователя с областью данных. + // Выполняется при интерактивном начале работы пользователя с областью данных или в локальном режиме. + // Вызывается после завершения действий ПриНачалеРаботыСистемы. + // Используется для подключения обработчиков ожидания, которые не должны вызываться + // в случае интерактивных действий перед и при начале работы системы. + // + // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. + // + // Синтаксис: + // Процедура ПослеНачалаРаботыСистемы() Экспорт + // + // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПриНачалеРаботыСистемы). + КлиентскиеСобытия.Добавить( + "СтандартныеПодсистемы.БазоваяФункциональность\ПослеНачалаРаботыСистемы"); + + // Вызывается при интерактивном начале работы пользователя с областью данных или в локальном режиме. // // Параметры: // ПервыйПараметр - Строка - первое значение параметра запуска, @@ -3026,15 +2967,13 @@ КлиентскиеСобытия.Добавить( "СтандартныеПодсистемы.БазоваяФункциональность\ПриОбработкеПараметровЗапуска"); - // Вызывается перед интерактивным завершением работы пользователя с областью данных. + // Вызывается перед интерактивным завершением работы пользователя с областью данных или в локальном режиме. // Соответствует событию ПередЗавершениемРаботыСистемы модулей приложения. // - // Параметры: - // Отказ - Булево - отказ в от начала работы. Если параметр установить - // Истина, тогда начало работы с областью данных будет прервано. + // Параметры см. в модуле ОбщегоНазначенияКлиентПереопределяемый. // // Синтаксис: - // Процедура ПередЗавершениемРаботыСистемы(Отказ) Экспорт + // Процедура ПередЗавершениемРаботыСистемы(Параметры) Экспорт // // (То же, что ОбщегоНазначенияКлиентПереопределяемый.ПередЗавершениемРаботыСистемы). КлиентскиеСобытия.Добавить( @@ -3065,17 +3004,6 @@ КлиентскиеСобытия.Добавить( "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииСпискаПредупрежденийЗавершенияРаботы"); - // Переопределяет стандартное предупреждение открытием произвольной формы активных пользователей. - // - // Параметры: - // ИмяФормы - Строка (возвращаемое значение). - // - // Синтаксис: - // Процедура ПриОткрытииФормыАктивныхПользователей(ИмяФормы) Экспорт - // - КлиентскиеСобытия.Добавить( - "СтандартныеПодсистемы.БазоваяФункциональность\ПриОпределенииФормыАктивныхПользователей"); - // СЕРВЕРНЫЕ СОБЫТИЯ. // Доопределяет обработчики установки параметров сеанса. @@ -3120,12 +3048,14 @@ // и выбрать как именно очищать ссылку: очищать значение реквизита, удалять строку таблицы или удалять весь объект. // // Параметры: - // Исключения (Массив) из - // |- (ОбъектМетаданных) Объект метаданных или его реквизит, например: - // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); - // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); - // |- (Строка) Полное имя объекта метаданных, например: - // Массив.Добавить("РегистрСведений.ВерсииОбъектов"); + // Массив - Объекты метаданных или их реквизиты, содержимое которых не должно учитывается в бизнес-логике приложения. + // * ОбъектМетаданных - Объект метаданных или его реквизит. + // * Строка - Полное имя объекта метаданных или его реквизита. + // + // Например: + // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов); + // Массив.Добавить(Метаданные.РегистрыСведений.ВерсииОбъектов.Реквизиты.АвторВерсии); + // Массив.Добавить("РегистрСведений.ВерсииОбъектов"); // // Синтаксис: // Процедура ПриДобавленииИсключенийПоискаСсылок(Исключения) Экспорт @@ -3157,7 +3087,6 @@ // Синтаксис: // Процедура ПриДобавленииПереименованийОбъектовМетаданных(Итог) Экспорт // - // (То же, что ОбщегоНазначенияПереопределяемый.ЗаполнитьТаблицуПереименованияОбъектовМетаданных). СерверныеСобытия.Добавить( "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"); @@ -3445,12 +3374,6 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "СтандартныеПодсистемыСервер"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииОбъектовМетаданныхИсключаемыхИзВыгрузкиЗагрузки"].Добавить( - "СтандартныеПодсистемыСервер"); - КонецЕсли; - СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбязательныхОбъектовПланаОбмена"].Добавить( "СтандартныеПодсистемыСервер"); @@ -3463,6 +3386,12 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПереименованийОбъектовМетаданных"].Добавить( "СтандартныеПодсистемыСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхПоддерживающихСопоставлениеСсылокПриЗагрузке"].Добавить( + "СтандартныеПодсистемыСервер"); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -3634,7 +3563,6 @@ БезИзменений = Новый Структура; КонецЕсли; - // СтандартныеПодсистемы.БазоваяФункциональность Если НЕ БезИзменений.Свойство("БазоваяФункциональностьСлужебныеСобытия") Тогда ЕстьТекущиеИзменения = Ложь; Константы.ПараметрыСлужебныхСобытий.СоздатьМенеджерЗначения().Обновить(ЕстьТекущиеИзменения, ТолькоПроверка); @@ -3653,9 +3581,7 @@ Справочники.ИдентификаторыОбъектовМетаданных.ВыполнитьОбновлениеДанных(ЕстьИзменения); КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.БазоваяФункциональность - // СтандартныеПодсистемы.Пользователи Если НЕ БезИзменений.Свойство("ПользователиПараметрыРаботы") И НЕ (ТолькоПроверка И ЕстьИзменения) Тогда @@ -3667,11 +3593,9 @@ БезИзменений.Вставить("ПользователиПараметрыРаботы"); КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.Пользователи - // СтандартныеПодсистемы.УправлениеДоступом - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступомСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); Если НЕ БезИзменений.Свойство("УправлениеДоступомПараметрыОграниченияДоступа") И НЕ (ТолькоПроверка И ЕстьИзменения) Тогда @@ -3685,7 +3609,6 @@ КонецЕсли; КонецЕсли; КонецЕсли; - // Конец СтандартныеПодсистемы.УправлениеДоступом КонецПроцедуры @@ -3700,3 +3623,4 @@ Версия) + "." + Формат(Число(Массив[3]) + 1, "ЧГ="); КонецФункции + diff --git a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl index b5b5fe460..645d4a30d 100644 --- a/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/СтроковыеФункцииКлиентСервер/Module.bsl @@ -65,7 +65,7 @@ КонецФункции -// Объединяет строки из массива в строку с разделителями. +/// Объединяет строки из массива в строку с разделителями. // // Параметры: // Массив - Массив - массив строк которые необходимо объединить в одну строку; @@ -74,19 +74,26 @@ // Возвращаемое значение: // Строка - строка с разделителями. // -Функция ПолучитьСтрокуИзМассиваПодстрок(Массив, Разделитель = ",") Экспорт +Функция СтрокаИзМассиваПодстрок(Массив, Разделитель = ",", СокращатьНепечатаемыеСимволы = Ложь) Экспорт - // возвращаемое значение функции Результат = ""; - Для Каждого Элемент Из Массив Цикл + Для Индекс = 0 По Массив.ВГраница() Цикл + Подстрока = Массив[Индекс]; - Подстрока = ?(ТипЗнч(Элемент) = Тип("Строка"), Элемент, Строка(Элемент)); + Если СокращатьНепечатаемыеСимволы Тогда + Подстрока = СокрЛП(Подстрока); + КонецЕсли; - РазделительПодстрок = ?(ПустаяСтрока(Результат), "", Разделитель); + Если ТипЗнч(Подстрока) <> Тип("Строка") Тогда + Подстрока = Строка(Подстрока); + КонецЕсли; - Результат = Результат + РазделительПодстрок + Подстрока; + Если Индекс > 0 Тогда + Результат = Результат + Разделитель; + КонецЕсли; + Результат = Результат + Подстрока; КонецЦикла; Возврат Результат; @@ -318,7 +325,7 @@ Возврат Результат; КонецФункции - + // Проверяет, содержит ли строка только цифры. // // Параметры: @@ -520,9 +527,12 @@ Возврат Ложь; КонецЕсли; Для Позиция = 1 По СтрДлина(Строка) Цикл - Если КодСимвола(Шаблон, Позиция) = 88 И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102)) - Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда - Возврат Ложь; + Если КодСимвола(Шаблон, Позиция) = 88 // X + И ((КодСимвола(Строка, Позиция) < 48 Или КодСимвола(Строка, Позиция) > 57) // 0..9 + И (КодСимвола(Строка, Позиция) < 97 Или КодСимвола(Строка, Позиция) > 102) // a..f + И (КодСимвола(Строка, Позиция) < 65 Или КодСимвола(Строка, Позиция) > 70)) // A..F + Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Строка, Позиция) <> 45 Тогда // - + Возврат Ложь; КонецЕсли; КонецЦикла; @@ -885,52 +895,29 @@ Возврат СокрЛП(Результат); КонецФункции -// Возвращает хеш по алгоритму MD5 для произвольной строки. -// -// Параметры: -// Строка - Строка - произвольная строка любой длины -// -// Возвращаемое значение: -// Строка - хеш, вычисленный из строки -Функция ВычислитьХешСтрокиПоАлгоритмуMD5(Знач Строка) Экспорт +// Преобразует исходную строку в транслит. +Функция СтрокаЛатиницей(Знач Строка) Экспорт + Результат = ""; - a = ЧислоВБинарныйМассив(1732584193); // 01 23 45 67; (шестнадцатеричное представление, сначала младший байт) - b = ЧислоВБинарныйМассив(4023233417); // 89 AB CD EF; - c = ЧислоВБинарныйМассив(2562383102); // FE DC BA 98; - d = ЧислоВБинарныйМассив(271733878); // 76 54 32 10; + Соответствие = СоответствиеКириллицыИЛатиницы(); - X = Новый Массив(16); // X - блок данных размером 512 бит, массив из 32-битных слов - - // разбиваем строку на блоки по 512 бит - МассивБлоковИзСтроки = ПолучитьМассивБлоковБайтовИзСтроки(Строка); - - // для каждого блока производим расчет - Для НомерБлока = 0 По МассивБлоковИзСтроки.Количество() - 1 Цикл - Блок = МассивБлоковИзСтроки[НомерБлока]; - Для НомерСлова = 0 По 15 Цикл - Слово = 0; - Для НомерБайта = 1 По 4 Цикл - Слово = Слово + Блок[НомерСлова * 4 + НомерБайта - 1] * Pow(256, НомерБайта - 1); - КонецЦикла; - X[НомерСлова] = Слово; - КонецЦикла; - - // в последний блок дописываем длину строки в битах - Если НомерБлока = МассивБлоковИзСтроки.Количество() - 1 Тогда - РазмерСтрокиВБитах = СтрДлина(Строка) * 8; - X[14] = РазмерСтрокиВБитах % Pow(2,32); // сначала младшие 4 байта - X[15] = Цел(РазмерСтрокиВБитах / Pow(2,32)) % Pow(2,64); // если длина превосходит (2^64 - 1) бит, то старшие биты откидываем + ПредыдущийСимвол = ""; + Для Позиция = 1 По СтрДлина(Строка) Цикл + Символ = Сред(Строка, Позиция, 1); + СимволЛатиницей = Соответствие[НРег(Символ)]; // поиск соответствия без учета регистра + Если СимволЛатиницей = Неопределено Тогда + // другие символы остаются "как есть" + СимволЛатиницей = Символ; + Иначе + Если Символ = ВРег(Символ) Тогда + СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр + КонецЕсли; КонецЕсли; - РассчитатьБлок(a, b, c, d, X); + Результат = Результат + СимволЛатиницей; + ПредыдущийСимвол = СимволЛатиницей; КонецЦикла; - Результат = ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(a)) - + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(b)) - + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(c)) - + ЧислоВШестнадцатеричномПредставлении(БинарныйМассивВЧисло(d)); - Возврат Результат; - КонецФункции //////////////////////////////////////////////////////////////////////////////// @@ -1019,235 +1006,76 @@ Возврат Результат; КонецФункции - -// ВычислитьХешСтрокиПоАлгоритмуMD5 - -Функция ПолучитьМассивБлоковБайтовИзСтроки(Знач Строка) - Результат = Новый Массив; - Строка = Строка + Символ(128); // единичный бит + выравнивание нолями до байта - Пока СтрДлина(Строка) > 0 Цикл - БлокБайтов = ПолучитьБлокБайтовИзСтроки(Лев(Строка, 64)); - Результат.Добавить(БлокБайтов); - - // если последние 8 байт получились не нулевые, то добавляем еще один нулевой блок - Если СтрДлина(Строка) > 56 И СтрДлина(Строка) < 64 Тогда - Результат.Добавить(ПолучитьБлокБайтовИзСтроки("")); - КонецЕсли; - - Строка = Сред(Строка, 65); - КонецЦикла; - Возврат Результат; +Функция СоответствиеКириллицыИЛатиницы() + // транслитерация, используемая в загранпаспортах 1997-2010 гг. + Соответствие = Новый Соответствие; + Соответствие.Вставить("а","a"); + Соответствие.Вставить("б","b"); + Соответствие.Вставить("в","v"); + Соответствие.Вставить("г","g"); + Соответствие.Вставить("д","d"); + Соответствие.Вставить("е","e"); + Соответствие.Вставить("ё","e"); + Соответствие.Вставить("ж","zh"); + Соответствие.Вставить("з","z"); + Соответствие.Вставить("и","i"); + Соответствие.Вставить("й","y"); + Соответствие.Вставить("к","k"); + Соответствие.Вставить("л","l"); + Соответствие.Вставить("м","m"); + Соответствие.Вставить("н","n"); + Соответствие.Вставить("о","o"); + Соответствие.Вставить("п","p"); + Соответствие.Вставить("р","r"); + Соответствие.Вставить("с","s"); + Соответствие.Вставить("т","t"); + Соответствие.Вставить("у","u"); + Соответствие.Вставить("ф","f"); + Соответствие.Вставить("х","kh"); + Соответствие.Вставить("ц","ts"); + Соответствие.Вставить("ч","ch"); + Соответствие.Вставить("ш","sh"); + Соответствие.Вставить("щ","shch"); + Соответствие.Вставить("ъ",""""); + Соответствие.Вставить("ы","y"); + Соответствие.Вставить("ь",""); // пропускается + Соответствие.Вставить("э","e"); + Соответствие.Вставить("ю","yu"); + Соответствие.Вставить("я","ya"); + + Возврат Соответствие; КонецФункции -Функция ПолучитьБлокБайтовИзСтроки(Знач Строка) - Результат = Новый Массив; - Для Позиция = 1 По СтрДлина(Строка) Цикл - Результат.Добавить(КодСимвола(Сред(Строка, Позиция, 1))); - КонецЦикла; +//////////////////////////////////////////////////////////////////////////////// +// УСТАРЕВШИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Устарела. Следует использовать СтрокаИзМассиваПодстрок. +// +// Объединяет строки из массива в строку с разделителями. +// +// Параметры: +// Массив - Массив - массив строк которые необходимо объединить в одну строку; +// Разделитель - Строка - любой набор символов, который будет использован в качестве разделителя. +// +// Возвращаемое значение: +// Строка - строка с разделителями. +// +Функция ПолучитьСтрокуИзМассиваПодстрок(Массив, Разделитель = ",") Экспорт - // дополняем блок нолями - Для Индекс = Позиция По 64 Цикл - Результат.Добавить(0); - КонецЦикла; - - Возврат Результат; -КонецФункции - -Процедура РассчитатьБлок(a, b, c, d, X) - aa = СкопироватьМассив(a); - bb = СкопироватьМассив(b); - cc = СкопироватьМассив(c); - dd = СкопироватьМассив(d); - - // раунд 1 - ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 0], 7, 3614090360); // 0xd76aa478 /* 1 */ - ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 1], 12, 3905402710); // 0xe8c7b756 /* 2 */ - ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 2], 17, 606105819); // 0x242070db /* 3 */ - ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 3], 22, 3250441966); // 0xc1bdceee /* 4 */ - ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 4], 7, 4118548399); // 0xf57c0faf /* 5 */ - ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 5], 12, 1200080426); // 0x4787c62a /* 6 */ - ВыполнитьОперациюСФункциейF(c,d,a,b, X[ 6], 17, 2821735955); // 0xa8304613 /* 7 */ - ВыполнитьОперациюСФункциейF(b,c,d,a, X[ 7], 22, 4249261313); // 0xfd469501 /* 8 */ - ВыполнитьОперациюСФункциейF(a,b,c,d, X[ 8], 7, 1770035416); // 0x698098d8 /* 9 */ - ВыполнитьОперациюСФункциейF(d,a,b,c, X[ 9], 12, 2336552879); // 0x8b44f7af /* 10 */ - ВыполнитьОперациюСФункциейF(c,d,a,b, X[10], 17, 4294925233); // 0xffff5bb1 /* 11 */ - ВыполнитьОперациюСФункциейF(b,c,d,a, X[11], 22, 2304563134); // 0x895cd7be /* 12 */ - ВыполнитьОперациюСФункциейF(a,b,c,d, X[12], 7, 1804603682); // 0x6b901122 /* 13 */ - ВыполнитьОперациюСФункциейF(d,a,b,c, X[13], 12, 4254626195); // 0xfd987193 /* 14 */ - ВыполнитьОперациюСФункциейF(c,d,a,b, X[14], 17, 2792965006); // 0xa679438e /* 15 */ - ВыполнитьОперациюСФункциейF(b,c,d,a, X[15], 22, 1236535329); // 0x49b40821 /* 16 */ - - // раунд 2 - ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 1], 5, 4129170786); // 0xf61e2562 /* 17 */ - ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 6], 9, 3225465664); // 0xc040b340 /* 18 */ - ВыполнитьОперациюСФункциейG(c,d,a,b, X[11], 14, 643717713); // 0x265e5a51 /* 19 */ - ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 0], 20, 3921069994); // 0xe9b6c7aa /* 20 */ - ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 5], 5, 3593408605); // 0xd62f105d /* 21 */ - ВыполнитьОперациюСФункциейG(d,a,b,c, X[10], 9, 38016083); // 0x2441453 /* 22 */ - ВыполнитьОперациюСФункциейG(c,d,a,b, X[15], 14, 3634488961); // 0xd8a1e681 /* 23 */ - ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 4], 20, 3889429448); // 0xe7d3fbc8 /* 24 */ - ВыполнитьОперациюСФункциейG(a,b,c,d, X[ 9], 5, 568446438); // 0x21e1cde6 /* 25 */ - ВыполнитьОперациюСФункциейG(d,a,b,c, X[14], 9, 3275163606); // 0xc33707d6 /* 26 */ - ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 3], 14, 4107603335); // 0xf4d50d87 /* 27 */ - ВыполнитьОперациюСФункциейG(b,c,d,a, X[ 8], 20, 1163531501); // 0x455a14ed /* 28 */ - ВыполнитьОперациюСФункциейG(a,b,c,d, X[13], 5, 2850285829); // 0xa9e3e905 /* 29 */ - ВыполнитьОперациюСФункциейG(d,a,b,c, X[ 2], 9, 4243563512); // 0xfcefa3f8 /* 30 */ - ВыполнитьОперациюСФункциейG(c,d,a,b, X[ 7], 14, 1735328473); // 0x676f02d9 /* 31 */ - ВыполнитьОперациюСФункциейG(b,c,d,a, X[12], 20, 2368359562); // 0x8d2a4c8a /* 32 */ - - // раунд 3 - ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 5], 4, 4294588738); // 0xfffa3942 /* 33 */ - ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 8], 11, 2272392833); // 0x8771f681 /* 34 */ - ВыполнитьОперациюСФункциейH(c,d,a,b, X[11], 16, 1839030562); // 0x6d9d6122 /* 35 */ - ВыполнитьОперациюСФункциейH(b,c,d,a, X[14], 23, 4259657740); // 0xfde5380c /* 36 */ - ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 1], 4, 2763975236); // 0xa4beea44 /* 37 */ - ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 4], 11, 1272893353); // 0x4bdecfa9 /* 38 */ - ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 7], 16, 4139469664); // 0xf6bb4b60 /* 39 */ - ВыполнитьОперациюСФункциейH(b,c,d,a, X[10], 23, 3200236656); // 0xbebfbc70 /* 40 */ - ВыполнитьОперациюСФункциейH(a,b,c,d, X[13], 4, 681279174); // 0x289b7ec6 /* 41 */ - ВыполнитьОперациюСФункциейH(d,a,b,c, X[ 0], 11, 3936430074); // 0xeaa127fa /* 42 */ - ВыполнитьОперациюСФункциейH(c,d,a,b, X[ 3], 16, 3572445317); // 0xd4ef3085 /* 43 */ - ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 6], 23, 76029189); // 0x4881d05 /* 44 */ - ВыполнитьОперациюСФункциейH(a,b,c,d, X[ 9], 4, 3654602809); // 0xd9d4d039 /* 45 */ - ВыполнитьОперациюСФункциейH(d,a,b,c, X[12], 11, 3873151461); // 0xe6db99e5 /* 46 */ - ВыполнитьОперациюСФункциейH(c,d,a,b, X[15], 16, 530742520); // 0x1fa27cf8 /* 47 */ - ВыполнитьОперациюСФункциейH(b,c,d,a, X[ 2], 23, 3299628645); // 0xc4ac5665 /* 48 */ - - // раунд 4 - ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 0], 6, 4096336452); // 0xf4292244 /* 49 */ - ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 7], 10, 1126891415); // 0x432aff97 /* 50 */ - ВыполнитьОперациюСФункциейI(c,d,a,b, X[14], 15, 2878612391); // 0xab9423a7 /* 51 */ - ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 5], 21, 4237533241); // 0xfc93a039 /* 52 */ - ВыполнитьОперациюСФункциейI(a,b,c,d, X[12], 6, 1700485571); // 0x655b59c3 /* 53 */ - ВыполнитьОперациюСФункциейI(d,a,b,c, X[ 3], 10, 2399980690); // 0x8f0ccc92 /* 54 */ - ВыполнитьОперациюСФункциейI(c,d,a,b, X[10], 15, 4293915773); // 0xffeff47d /* 55 */ - ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 1], 21, 2240044497); // 0x85845dd1 /* 56 */ - ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 8], 6, 1873313359); // 0x6fa87e4f /* 57 */ - ВыполнитьОперациюСФункциейI(d,a,b,c, X[15], 10, 4264355552); // 0xfe2ce6e0 /* 58 */ - ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 6], 15, 2734768916); // 0xa3014314 /* 59 */ - ВыполнитьОперациюСФункциейI(b,c,d,a, X[13], 21, 1309151649); // 0x4e0811a1 /* 60 */ - ВыполнитьОперациюСФункциейI(a,b,c,d, X[ 4], 6, 4149444226); // 0xf7537e82 /* 61 */ - ВыполнитьОперациюСФункциейI(d,a,b,c, X[11], 10, 3174756917); // 0xbd3af235 /* 62 */ - ВыполнитьОперациюСФункциейI(c,d,a,b, X[ 2], 15, 718787259); // 0x2ad7d2bb /* 63 */ - ВыполнитьОперациюСФункциейI(b,c,d,a, X[ 9], 21, 3951481745); // 0xeb86d391 /* 64 */ - - a = БинарнаяСумма(a, aa); - b = БинарнаяСумма(b, bb); - c = БинарнаяСумма(c, cc); - d = БинарнаяСумма(d, dd); -КонецПроцедуры - -Процедура ВыполнитьОперациюСФункциейF(a, b, c, d, X, s, t) - ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, c), ПобитовоеИ(ПобитовоеНе(b), d)), a, b, X, s, t); -КонецПроцедуры - -Процедура ВыполнитьОперациюСФункциейG(a, b, c, d, X, s, t) - ВыполнитьОперацию(ПобитовоеИли(ПобитовоеИ(b, d), ПобитовоеИ(ПобитовоеНе(d), c)), a, b, X, s, t); -КонецПроцедуры - -Процедура ВыполнитьОперациюСФункциейH(a, b, c, d, X, s, t) - ВыполнитьОперацию(ПобитовоеИсключающееИли(ПобитовоеИсключающееИли(b, c), d), a, b, X, s, t); -КонецПроцедуры - -Процедура ВыполнитьОперациюСФункциейI(a, b, c, d, X, s, t) - ВыполнитьОперацию(ПобитовоеИсключающееИли(ПобитовоеИли(ПобитовоеНе(d), b), c), a, b, X, s, t); -КонецПроцедуры - -Процедура ВыполнитьОперацию(q, a, b, X, s, t) - a = БинарнаяСумма(ЦиклическийСдвигВлево(БинарнаяСумма(БинарнаяСумма(a, q), ЧислоВБинарныйМассив((X + t) % Pow(2,32))), s), b); -КонецПроцедуры - -Функция ЧислоВБинарныйМассив(Знач Число, Знач ВсегоРазрядов = 32) - Результат = Новый Массив; - ТекущийРазряд = 0; - Пока ТекущийРазряд < ВсегоРазрядов Цикл - ТекущийРазряд = ТекущийРазряд + 1; - Результат.Добавить(Булево(Число % 2)); - Число = Цел(Число / 2); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция БинарныйМассивВЧисло(Массив) - Результат = 0; - Для НомерРазряда = -(Массив.Количество()-1) По 0 Цикл - Результат = Результат * 2 + Число(Массив[-НомерРазряда]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ЧислоВШестнадцатеричномПредставлении(Знач Число, Знач КоличествоБайт = 4) + // возвращаемое значение функции Результат = ""; - СтрокаСимволов = "0123456789ABCDEF"; - Для НомерБайта = 1 По КоличествоБайт Цикл - ПредставлениеБайта = ""; - Для Счетчик = 1 По 2 Цикл - ПредставлениеБайта = Сред(СтрокаСимволов, Число % 16 + 1, 1) + ПредставлениеБайта; - Число = Цел(Число / 16); - КонецЦикла; - - // порядок байтов: начиная с младшего - Результат = Результат + ПредставлениеБайта; - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеИ(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] И БинарныйМассив2[Индекс]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеИли(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] Или БинарныйМассив2[Индекс]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеИсключающееИли(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] <> БинарныйМассив2[Индекс]); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ПобитовоеНе(БинарныйМассив) - Результат = Новый Массив; - Для Каждого Элемент Из БинарныйМассив Цикл - Результат.Добавить(Не Элемент); - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция ЦиклическийСдвигВлево(БинарныйМассив, КоличествоРазрядов) - Результат = Новый Массив(БинарныйМассив.Количество()); - Для Разряд = 0 По БинарныйМассив.Количество()-1 Цикл - Результат[(Разряд + КоличествоРазрядов) % БинарныйМассив.Количество()] = БинарныйМассив[Разряд]; - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция БинарнаяСумма(БинарныйМассив1, БинарныйМассив2) - Результат = Новый Массив; - ДобавитьКРазряду = Ложь; - Для Индекс = 0 По БинарныйМассив1.Количество()-1 Цикл - Результат.Добавить(БинарныйМассив1[Индекс] <> БинарныйМассив2[Индекс] <> ДобавитьКРазряду); - ДобавитьКРазряду = (0 + БинарныйМассив1[Индекс] + БинарныйМассив2[Индекс] + ДобавитьКРазряду) > 1; - КонецЦикла; - Возврат Результат; -КонецФункции - -Функция СкопироватьМассив(Массив) - Результат = Новый Массив; + Для Каждого Элемент Из Массив Цикл - Результат.Добавить(Элемент); + + Подстрока = ?(ТипЗнч(Элемент) = Тип("Строка"), Элемент, Строка(Элемент)); + + РазделительПодстрок = ?(ПустаяСтрока(Результат), "", Разделитель); + + Результат = Результат + РазделительПодстрок + Подстрока; + КонецЦикла; + Возврат Результат; + КонецФункции -// Конец ВычислитьХешСтрокиПоАлгоритмуMD5 diff --git a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl index d80268be5..61322bc6d 100644 --- a/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/СтруктураПодчиненностиПереопределяемый/Module.bsl @@ -44,3 +44,23 @@ Возврат Неопределено; КонецФункции + +// Возвращает имя реквизита документа, в котором содержится информация о Сумме и Валюте документа для вывода в структуру подчиненности. +// По умолчанию используются реквизиты Валюта и СуммаДокумента. Если для конкретного документа или конфигурации в целом используются другие +// реквизиты, то переопределить значения по умолчанию можно в данной функции +// +// Параметры: +// ИмяДокумента - Строка - имя документа, для которого надо получить имя реквизита +// Реквизит - Строка - Строка, может принимать значения "Валюта" и "СуммаДокумента" +// +// Возвращаемое значение: +// Строка - Имя реквизита документа, в котором содержится информация о Валюте или Сумме +// +Функция ИмяРеквизитаДокумента(ИмяДокумента, Реквизит) Экспорт + + + + Возврат Неопределено; + +КонецФункции + diff --git a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl index ebe7f47a6..e8ce83237 100644 --- a/SSL/src/CommonModules/УправлениеДоступом/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступом/Module.bsl @@ -26,7 +26,7 @@ // таблица наборов значений доступа. // Пустую подготовленную таблицу можно получить с помощью функции // УправлениеДоступом.ТаблицаНаборыЗначенийДоступа() - колонки -// Чтение, Изменение, Добавление, Удаление не заполнять. +// Чтение, Изменение не заполнять. // // Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, Неопределено. // Если не заполнено, тогда право проверяется для текущего пользователя. @@ -43,19 +43,18 @@ УстановитьПривилегированныйРежим(Истина); - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Пользователь", Пользователь); - Запрос.УстановитьПараметр("Роль", Роль); - Если НаборыЗначенийДоступа = Неопределено ИЛИ НЕ ОграничиватьДоступНаУровнеЗаписей() Тогда // Проверка, что роль назначается пользователю через группу доступа по профилю. + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("АвторизованныйПользователь", Пользователь); + Запрос.УстановитьПараметр("Роль", Роль); Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА КАК ЗначениеИстина |ИЗ | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО (СоставыГруппПользователей.Пользователь = &Пользователь) + | ПО (СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь) | И (СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь) | И (СоставыГруппПользователей.Используется) | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) @@ -63,301 +62,321 @@ | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка | И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль) | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления)"; - Иначе + Возврат НЕ Запрос.Выполнить().Пустой(); + КонецЕсли; - Если ТипЗнч(НаборыЗначенийДоступа) <> Тип("ТаблицаЗначений") Тогда - СсылкаНаОбъект = НаборыЗначенийДоступа; - НаборыЗначенийДоступа = ТаблицаНаборыЗначенийДоступа(); - СсылкаНаОбъект.ПолучитьОбъект().ЗаполнитьНаборыЗначенийДоступа(НаборыЗначенийДоступа); - // Выбор только наборов значений доступа предназначенных для проверки права Чтение. - СтрокиНаборовЧтения = НаборыЗначенийДоступа.НайтиСтроки(Новый Структура("Чтение", Истина)); - НомераНаборов = Новый Соответствие; - Для каждого Строка Из СтрокиНаборовЧтения Цикл - НомераНаборов.Вставить(Строка.НомерНабора, Истина); - КонецЦикла; - Индекс = НаборыЗначенийДоступа.Количество()-1; - Пока Индекс > 0 Цикл - Если НомераНаборов[НаборыЗначенийДоступа[Индекс].НомерНабора] = Неопределено Тогда - НаборыЗначенийДоступа.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс - 1; - КонецЦикла; - НаборыЗначенийДоступа.ЗаполнитьЗначения(Ложь, "Чтение, Изменение, Добавление, Удаление") ; + Если ТипЗнч(НаборыЗначенийДоступа) = Тип("ТаблицаЗначений") Тогда + НаборыЗначенийДоступа = НаборыЗначенийДоступа.Скопировать(); + Иначе + СсылкаНаОбъект = НаборыЗначенийДоступа; + НаборыЗначенийДоступа = ТаблицаНаборыЗначенийДоступа(); + СсылкаНаОбъект.ПолучитьОбъект().ЗаполнитьНаборыЗначенийДоступа(НаборыЗначенийДоступа); + // Выбор только наборов значений доступа предназначенных для проверки права Чтение. + СтрокиНаборовЧтения = НаборыЗначенийДоступа.НайтиСтроки(Новый Структура("Чтение", Истина)); + НомераНаборов = Новый Соответствие; + Для каждого Строка Из СтрокиНаборовЧтения Цикл + НомераНаборов.Вставить(Строка.НомерНабора, Истина); + КонецЦикла; + Индекс = НаборыЗначенийДоступа.Количество()-1; + Пока Индекс > 0 Цикл + Если НомераНаборов[НаборыЗначенийДоступа[Индекс].НомерНабора] = Неопределено Тогда + НаборыЗначенийДоступа.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + НаборыЗначенийДоступа.ЗаполнитьЗначения(Ложь, "Чтение, Изменение"); + КонецЕсли; + + // Уточнение наборов значений доступа. + ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; + + Для каждого Строка Из НаборыЗначенийДоступа Цикл + + Если Строка.ВидДоступа = "" Тогда + Продолжить; КонецЕсли; - // Проверка, что роль назначается пользователю через группу доступа по профилю с разрешенными наборами значений доступа. + Если ВРег(Строка.ВидДоступа) = ВРег("ПравоЧтения") + ИЛИ ВРег(Строка.ВидДоступа) = ВРег("ПравоИзменения") Тогда + + Если ТипЗнч(Строка.ЗначениеДоступа) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Строка.ЗначениеДоступа)) Тогда + Строка.ЗначениеДоступа = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Строка.ЗначениеДоступа)); + Иначе + Строка.ЗначениеДоступа = Неопределено; + КонецЕсли; + КонецЕсли; + + Если ВРег(Строка.ВидДоступа) = ВРег("ПравоИзменения") Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции ЕстьРоль модуля УправлениеДоступом. + |В наборе значений доступа указан вид доступа ПравоИзменения + |таблицы с идентификтором ""%1"". + |В ограничении проверки роли (как дополнительного права) + |может быть зависимость только от права Чтения.'"), + Строка.ЗначениеДоступа); + КонецЕсли; + ИначеЕсли ИменаВидовДоступа.Получить(Строка.ВидДоступа) <> Неопределено + ИЛИ Строка.ВидДоступа = "НастройкиПрав" Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции ЕстьРоль модуля УправлениеДоступом. + |Набор значений доступа содержит известный вид доступа ""%2"", + |который не требуется указывать. + | + |Указывать требуется только специальные виды доступа + |""ПравоЧтения"", ""ПравоИзменения"", если они используются.'"), + ТипЗнч(СсылкаНаОбъект), + Строка.ВидДоступа); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции ЕстьРоль модуля УправлениеДоступом. + |Набор значений доступа содержит неизвестный вид доступа ""%2"".'"), + ТипЗнч(СсылкаНаОбъект), + Строка.ВидДоступа); + КонецЕсли; - Запрос.УстановитьПараметр("НаборыЗначенийДоступа", НаборыЗначенийДоступа); - Запрос.УстановитьПараметр("СвойстваВидовДоступа", УправлениеДоступомСлужебный.СвойстваВидаДоступа()); - Запрос.УстановитьПараметр("ВидДоступаПользователи", ?(ТипЗнч(Пользователь) = Тип("СправочникСсылка.Пользователи"), - ПланыВидовХарактеристик.ВидыДоступа.Пользователи, - ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи)); - - Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | НаборыЗначенийДоступа.НомерНабора, - | НаборыЗначенийДоступа.ВидДоступа, - | НаборыЗначенийДоступа.ЗначениеДоступа - |ПОМЕСТИТЬ НаборыЗначенийДоступаБезСвойств - |ИЗ - | &НаборыЗначенийДоступа КАК НаборыЗначенийДоступа - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | СвойстваВидовДоступа.ВидДоступа, - | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа - |ПОМЕСТИТЬ СвойстваВидовДоступа - |ИЗ - | &СвойстваВидовДоступа КАК СвойстваВидовДоступа - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | НаборыЗначенийДоступа.НомерНабора, - | НаборыЗначенийДоступа.ВидДоступа, - | НаборыЗначенийДоступа.ЗначениеДоступа, - | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения)) - | ТОГДА ЕСТЬNULL(Идентификаторы.ЗначениеПустойСсылки, НЕОПРЕДЕЛЕНО) - | ИНАЧЕ НЕОПРЕДЕЛЕНО - | КОНЕЦ КАК ТипЗначенияДоступа, - | Идентификаторы.Ссылка КАК Таблица - |ПОМЕСТИТЬ НаборыЗначенийДоступа - |ИЗ - | НаборыЗначенийДоступаБезСвойств КАК НаборыЗначенийДоступа - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки)) - | ЛЕВОЕ СОЕДИНЕНИЕ СвойстваВидовДоступа КАК СвойстваВидовДоступа - | ПО НаборыЗначенийДоступа.ВидДоступа = СвойстваВидовДоступа.ВидДоступа - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа - |ПОМЕСТИТЬ ГруппыДоступа - |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО (СоставыГруппПользователей.Пользователь = &Пользователь) - | И (СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь) - | И (СоставыГруппПользователей.Используется) - | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли - | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка - | И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль) - | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | ГруппыДоступа КАК ГруппыДоступа - |ГДЕ - | ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | (ВЫБРАТЬ РАЗЛИЧНЫЕ - | Наборы.НомерНабора - | ИЗ - | НаборыЗначенийДоступа КАК Наборы - | ) КАК НомераНаборов - | ГДЕ - | НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | НаборыЗначенийДоступа КАК НаборыЗначений - | ГДЕ - | НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора - | И НЕ ВЫБОР - | КОГДА НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | ТОГДА НаборыЗначений.ЗначениеДоступа <> НЕОПРЕДЕЛЕНО - | КОГДА НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) - | ТОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект - | ГДЕ - | ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа)) - | КОГДА НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) - | ТОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект - | ГДЕ - | ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) - | И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Добавление = ИСТИНА) - | КОГДА НаборыЗначений.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) - | ТОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект - | ГДЕ - | ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И ТИПЗНАЧЕНИЯ(ТаблицыГруппДоступаПроверкаПраваНаОбъект.ТипТаблицы) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) - | И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Изменение = ИСТИНА) - | КОГДА НаборыЗначений.ВидДоступаЧерезПраваПоЗначениямДоступа - | ТОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - | ПО - | ИерархияЗначений.ИспользоватьПраваСсылки - | И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа - | И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа - | И ПраваПоЗначениям.Таблица = НаборыЗначений.Таблица - | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаЗначенийДоступа - | И ПраваПоЗначениям.Чтение - | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | СоставыГруппПользователей.Пользователь = &Пользователь - | И СоставыГруппПользователей.ГруппаПользователей = ПраваПоЗначениям.Пользователь - | И СоставыГруппПользователей.Используется) - | И НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - | ПО - | ИерархияЗначений.ИспользоватьПраваСсылки - | И ИерархияЗначений.ВидДоступа = НаборыЗначений.ВидДоступа - | И ИерархияЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа - | И ПраваПоЗначениям.Таблица = НаборыЗначений.Таблица - | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаЗначенийДоступа - | И ПраваПоЗначениям.ЧтениеЗапрещено - | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | СоставыГруппПользователей.Пользователь = &Пользователь - | И СоставыГруппПользователей.ГруппаПользователей = ПраваПоЗначениям.Пользователь - | И СоставыГруппПользователей.Используется) - | ИНАЧЕ (НаборыЗначений.ВидДоступаЕдинственныйДляТипаЗначенияДоступа - | ИЛИ НЕ ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ГруппыЗначенийДоступа КАК ВидыЗначений - | ГДЕ - | ВидыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа - | И ВидыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа - | И ВидыЗначений.ТолькоВидДоступа = ИСТИНА)) - | И ВЫБОР - | КОГДА ВЫБОР - | КОГДА НаборыЗначений.ВидДоступа = &ВидДоступаПользователи - | ТОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа - | ГДЕ - | ГруппыЗначенийДоступа.ВидДоступа = &ВидДоступаПользователи - | И ГруппыЗначенийДоступа.ЗначениеДоступа = &Пользователь - | И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = НаборыЗначений.ЗначениеДоступа) - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ - | ИЛИ ВЫБОР - | КОГДА НаборыЗначений.ВидДоступаБезГруппЗначенияДоступа - | ТОГДА ВЫБОР - | КОГДА ИСТИНА В - | (ВЫБРАТЬ - | ИСТИНА - | ИЗ - | РегистрСведений.ЗначенияГруппДоступа КАК Значения - | ГДЕ - | Значения.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И Значения.ВидДоступа = НаборыЗначений.ВидДоступа - | И Значения.ТолькоВидДоступа = ЛОЖЬ - | И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ - | ИНАЧЕ ВЫБОР - | КОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК Значения - | ПО - | ГруппыЗначений.ВидДоступа = НаборыЗначений.ВидДоступа - | И ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа - | И Значения.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И Значения.ВидДоступа = НаборыЗначений.ВидДоступа - | И Значения.ТолькоВидДоступа = ГруппыЗначений.ТолькоВидДоступа - | И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ - | КОНЕЦ = ВЫБОР - | КОГДА ИСТИНА В - | (ВЫБРАТЬ - | ИСТИНА - | ИЗ - | РегистрСведений.ЗначенияГруппДоступа КАК Виды - | ГДЕ - | Виды.ГруппаДоступа = ГруппыДоступа.ГруппаДоступа - | И Виды.ВидДоступа = НаборыЗначений.ВидДоступа - | И Виды.ТолькоВидДоступа = ИСТИНА) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ - | КОНЕЦ))"; - КонецЕсли; + Строка.ВидДоступа = ""; + КонецЦикла; + + // Добавление служебных полей в набор значений доступа. + УправлениеДоступомСлужебный.ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, НаборыЗначенийДоступа, Истина); + + // Проверка, что роль назначается пользователю через группу доступа по профилю с разрешенными наборами значений доступа. + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("АвторизованныйПользователь", Пользователь); + Запрос.УстановитьПараметр("Роль", Роль); + Запрос.УстановитьПараметр("НаборыЗначенийДоступа", НаборыЗначенийДоступа); + Запрос.УстановитьПараметр("ТипыВладельцевНастроекПрав", ПараметрыСеанса.ТипыВладельцевНастроекПрав); + Запрос.Текст = + "ВЫБРАТЬ РАЗЛИЧНЫЕ + | НаборыЗначенийДоступа.НомерНабора, + | НаборыЗначенийДоступа.ЗначениеДоступа, + | НаборыЗначенийДоступа.ЗначениеБезГрупп, + | НаборыЗначенийДоступа.СтандартноеЗначение + |ПОМЕСТИТЬ НаборыЗначенийДоступа + |ИЗ + | &НаборыЗначенийДоступа КАК НаборыЗначенийДоступа + | + |ИНДЕКСИРОВАТЬ ПО + | НаборыЗначенийДоступа.НомерНабора, + | НаборыЗначенийДоступа.ЗначениеДоступа + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ГруппыДоступаПользователи.Ссылка КАК Ссылка + |ПОМЕСТИТЬ ГруппыДоступа + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО (СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь) + | И (СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь) + | И (СоставыГруппПользователей.Используется) + | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли + | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка + | И (ПрофилиГруппДоступаРоли.Роль.Имя = &Роль) + | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | Наборы.НомерНабора + |ПОМЕСТИТЬ НомераНаборов + |ИЗ + | НаборыЗначенийДоступа КАК Наборы + | + |ИНДЕКСИРОВАТЬ ПО + | Наборы.НомерНабора + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | ГруппыДоступа КАК ГруппыДоступа + |ГДЕ + | НЕ(ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | НомераНаборов КАК НомераНаборов + | ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | НаборыЗначенийДоступа КАК НаборыЗначений + | ГДЕ + | НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ГДЕ + | ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) + | И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА))) + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | НомераНаборов КАК НомераНаборов + | ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | НаборыЗначенийДоступа КАК НаборыЗначений + | ГДЕ + | НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + | И НЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ГДЕ + | ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) + | И ЗначенияПоУмолчанию.БезНастройки = ИСТИНА)) + | И НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | НаборыЗначенийДоступа КАК НаборыЗначений + | ГДЕ + | НаборыЗначений.НомерНабора = НомераНаборов.НомерНабора + | И НЕ ВЫБОР + | КОГДА НаборыЗначений.ЗначениеБезГрупп + | ТОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК Значения + | ПО + | Значения.ГруппаДоступа = ГруппыДоступа.Ссылка + | И Значения.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | ГДЕ + | ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) + | И ЕСТЬNULL(Значения.ЗначениеРазрешено, ЗначенияПоУмолчанию.ВсеРазрешены)) + | КОГДА НаборыЗначений.СтандартноеЗначение + | ТОГДА ВЫБОР + | КОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + | ГДЕ + | ГруппыЗначенийДоступа.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И ГруппыЗначенийДоступа.ГруппаЗначенийДоступа = &АвторизованныйПользователь) + | ТОГДА ИСТИНА + | ИНАЧЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений + | ПО + | ГруппыЗначений.ЗначениеДоступа = НаборыЗначений.ЗначениеДоступа + | И ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступа.Ссылка + | И ТИПЗНАЧЕНИЯ(ЗначенияПоУмолчанию.ТипЗначенийДоступа) = ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК Значения + | ПО + | Значения.ГруппаДоступа = ГруппыДоступа.Ссылка + | И Значения.ЗначениеДоступа = ГруппыЗначений.ГруппаЗначенийДоступа + | ГДЕ + | ЕСТЬNULL(Значения.ЗначениеРазрешено, ЗначенияПоУмолчанию.ВсеРазрешены)) + | КОНЕЦ + | КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен) + | ТОГДА ИСТИНА + | КОГДА НаборыЗначений.ЗначениеДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен) + | ТОГДА ЛОЖЬ + | КОГДА ТИПЗНАЧЕНИЯ(НаборыЗначений.ЗначениеДоступа) = ТИП(Справочник.ИдентификаторыОбъектовМетаданных) + | ТОГДА ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступаПроверкаПраваНаОбъект + | ГДЕ + | ТаблицыГруппДоступаПроверкаПраваНаОбъект.ГруппаДоступа = ГруппыДоступа.Ссылка + | И ТаблицыГруппДоступаПроверкаПраваНаОбъект.Таблица = НаборыЗначений.ЗначениеДоступа) + | ИНАЧЕ ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек + | ПО + | НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа + | И НастройкиПрав.Объект = НаследованиеНастроек.Родитель + | И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияЧтения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь + | И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь) + | И НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек + | ПО + | НаследованиеНастроек.Объект = НаборыЗначений.ЗначениеДоступа + | И НастройкиПрав.Объект = НаследованиеНастроек.Родитель + | И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияЧтения + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | СоставыГруппПользователей.Пользователь = &АвторизованныйПользователь + | И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь) + | КОНЕЦ)))"; Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции -// Проверяет, что у пользователя есть право, устанавливаемое по значению доступа. -// Например, по папке файлов могут устанавливаться права "УправлениеПравами", -// "ЧтениеПапокФайлов", "ЧтениеФайлов", которые являются, как правами для папки файлов, -// так и правами для файлов или для двух элементов данных сразу - "ЧтениеПапокИФайлов". +// Проверяет, что для пользователя настроено разрешение права для объекта. +// Например, для папки файлов могут быть настроены права "УправлениеПравами", +// "Чтение", "ИзменениеПапок", причем право "Чтение" являются, +// как правом для папки файлов, так и правом для файлов. // // Параметры: -// Право - Строка. +// Право - Строка - имя права, как оно указано в процедуре ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов +// общего модуля УправлениеДоступомПереопределяемый. // -// ЗначениеДоступа - СправочникСсылка, ПланВидовХарактеристикСсылка, Неопределено - значение, -// для которого нужно проверить разрешенность права, например, ссылка на папку файлов. +// СсылкаНаОбъект - СправочникСсылка, ПланВидовХарактеристикСсылка - ссылка на одного из владельцев прав, +// указанных в процедуре ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов +// общего модуля УправлениеДоступомПереопределяемый, например, ссылка на папку файлов. // -// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, Неопределено. Если не заполнено, -// тогда право проверяется для текущего пользователя. +// Пользователь - СправочникСсылка.Пользователи, СправочникСсылка.ВнешниеПользователи, Неопределено. +// Если не заполнено, тогда право проверяется для текущего пользователя. // // Возвращаемое значение: -// Булево. +// Булево. Истина - настроено разрешение права с учетом всех разрешающих и запрещающих настроек в иерархии. // -Функция ЕстьПравоПоЗначениюДоступа(Знач Право, Знач ЗначениеДоступа, Знач Пользователь = Неопределено) Экспорт +Функция ЕстьПраво(Право, СсылкаНаОбъект, Пользователь = Неопределено) Экспорт Пользователь = ?(ЗначениеЗаполнено(Пользователь), Пользователь, Пользователи.АвторизованныйПользователь()); Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда Возврат Истина; КонецЕсли; - УстановитьПривилегированныйРежим(Истина); - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + Если Не ОграничиватьДоступНаУровнеЗаписей() Тогда + Возврат Истина; + КонецЕсли; - // Подготовка массива ролей, хотя бы одна из которых требуется для права по значению доступа. - ВозможныеПрава = Параметры.ВозможныеПраваПоЗначениямДоступа; - ОписаниеПрав = ВозможныеПрава.ПоТипам.Получить(ТипЗнч(ЗначениеДоступа)); + УстановитьПривилегированныйРежим(Истина); + ОписаниеПрав = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).ВозможныеПраваДляНастройкиПравОбъектов.ПоТипам.Получить(ТипЗнч(СсылкаНаОбъект)); Если ОписаниеПрав = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найдено описание возможных прав для таблицы ""%1""'"), - ЗначениеДоступа.Метаданные().ПолноеИмя()); + СсылкаНаОбъект.Метаданные().ПолноеИмя()); КонецЕсли; ОписаниеПрава = ОписаниеПрав.Получить(Право); @@ -366,164 +385,66 @@ ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найдено описание права ""%1"" для таблицы ""%2""'"), Право, - ЗначениеДоступа.Метаданные().ПолноеИмя()); + СсылкаНаОбъект.Метаданные().ПолноеИмя()); КонецЕсли; - // Проверка, что хотя бы одна из ролей назначается пользователю через профиль его групп доступа. - Запрос = Новый Запрос( - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа - |ПОМЕСТИТЬ ГруппыДоступаПользователя - |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО (СоставыГруппПользователей.Пользователь = &Пользователь) - | И (СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь) - | И (СоставыГруппПользователей.Используется) - | И (НЕ ГруппыДоступаПользователи.Ссылка.ПометкаУдаления) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли - | ПО ГруппыДоступаПользователи.Ссылка.Профиль = ПрофилиГруппДоступаРоли.Ссылка - | И (ПрофилиГруппДоступаРоли.Роль В (&Роли)) - | И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | ГруппыДоступаПользователя КАК ГруппыДоступаПользователя"); + Если НЕ ЗначениеЗаполнено(СсылкаНаОбъект) Тогда + Возврат Ложь; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект); Запрос.УстановитьПараметр("Пользователь", Пользователь); - Запрос.УстановитьПараметр("Роли", ОписаниеПрава.ТребуемаяРоль); - Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; - ЕстьПраво = НЕ Запрос.Выполнить().Пустой(); + Запрос.УстановитьПараметр("Право", Право); - Если ЕстьПраво Тогда - // Проверка, что по виду доступа ограничение установлено в каждой группе доступа пользователя. - - Запрос.УстановитьПараметр("ВидДоступа", - Параметры.СвойстваВидовДоступа.ВидыДоступаЗначенийДоступа.ПоТипам.Получить( - ТипЗнч(ЗначениеДоступа))[0]); - - Запрос.Текст = - "ВЫБРАТЬ ПЕРВЫЕ 1 - | КОЛИЧЕСТВО(ГруппыДоступаПользователя.ГруппаДоступа) КАК КоличествоГруппДоступа, - | СУММА(ВЫБОР - | КОГДА ЗначенияГруппДоступа.ГруппаДоступа ЕСТЬ NULL - | ТОГДА 0 - | ИНАЧЕ 1 - | КОНЕЦ) КАК КоличествоВключенныхОграничений - |ИЗ - | ГруппыДоступаПользователя КАК ГруппыДоступаПользователя - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа - | ПО ГруппыДоступаПользователя.ГруппаДоступа = ЗначенияГруппДоступа.ГруппаДоступа - | И (ЗначенияГруппДоступа.ВидДоступа = &ВидДоступа) - | И (ЗначенияГруппДоступа.ТолькоВидДоступа)"; - Выборка = Запрос.Выполнить().Выбрать(); - - Выборка.Следующий(); - - // Проверка права пользователя по значению доступа. - Если Выборка.КоличествоГруппДоступа = Выборка.КоличествоВключенныхОграничений - И ЗначениеДоступа <> Неопределено - И ОграничиватьДоступНаУровнеЗаписей() Тогда - - Запрос.Текст = - "ВЫБРАТЬ - | ИСТИНА КАК ЗначениеИстина - |ГДЕ - | ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - | ПО - | ИерархияЗначений.ВидДоступа = &ВидДоступа - | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа - | И ИерархияЗначений.ИспользоватьПраваСсылки - | И ПраваПоЗначениям.Право = &Право - | И НЕ ПраваПоЗначениям.Запрещено - | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаЗначенийДоступа - | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | СоставыГруппПользователей.Пользователь = &Пользователь - | И СоставыГруппПользователей.ГруппаПользователей = ПраваПоЗначениям.Пользователь - | И СоставыГруппПользователей.Используется) - | И НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | РегистрСведений.ПраваПоЗначениямДоступа КАК ПраваПоЗначениям ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ИерархияЗначений - | ПО - | ИерархияЗначений.ВидДоступа = &ВидДоступа - | И ИерархияЗначений.ЗначениеДоступа = &ЗначениеДоступа - | И ИерархияЗначений.ИспользоватьПраваСсылки - | И ПраваПоЗначениям.Право = &Право - | И ПраваПоЗначениям.Запрещено - | И ПраваПоЗначениям.ЗначениеДоступа = ИерархияЗначений.ГруппаЗначенийДоступа - | И ПраваПоЗначениям.РаспространяетсяВИерархии >= ИерархияЗначений.СвязьСРодителем ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО - | СоставыГруппПользователей.Пользователь = &Пользователь - | И СоставыГруппПользователей.ГруппаПользователей = ПраваПоЗначениям.Пользователь - | И СоставыГруппПользователей.Используется)"; - Запрос.УстановитьПараметр("ЗначениеДоступа", ЗначениеДоступа); - Запрос.УстановитьПараметр("Право", Право); - ЕстьПраво = НЕ Запрос.Выполнить().Пустой(); - КонецЕсли; - КонецЕсли; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек + | ПО + | НаследованиеНастроек.Объект = &СсылкаНаОбъект + | И НастройкиПрав.Право = &Право + | И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияПрава + | И НастройкиПрав.Объект = НаследованиеНастроек.Родитель + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | СоставыГруппПользователей.Пользователь = &Пользователь + | И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь) + | И НЕ ЛОЖЬ В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ЛОЖЬ + | ИЗ + | РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек + | ПО + | НаследованиеНастроек.Объект = &СсылкаНаОбъект + | И НастройкиПрав.Право = &Право + | И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияПрава + | И НастройкиПрав.Объект = НаследованиеНастроек.Родитель + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | СоставыГруппПользователей.Пользователь = &Пользователь + | И СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь)"; - Возврат ЕстьПраво; - -КонецФункции - -// Проверяет, что у текущего пользователя есть право "УправлениеПравами", -// разрешающее изменять права заданного значения доступа для пользователей и групп пользователей -// или права различных значений доступа для заданного пользователя или группы пользователей. -// -// Параметры: -// СсылкаНаОбъект - СправочникСсылка.Пользователи, СправочникСсылка.ГруппыПользователей, -// или значение доступа СправочникСсылка, ПланВидовХарактеристикСсылка, -// для которого нужно проверить разрешенность права, например, ссылка на папку файлов. -// -// ОписаниеОшибки - Строка, заполнена когда разрешения нет. -// -// ТолькоПросмотр - Булево, только для внутренних нужд - не использовать. -// -// Возвращаемое значение: -// Булево. -// -Функция РазрешеноУправлениеПравамиПоЗначениямДоступа(Знач СсылкаНаОбъект, ОписаниеОшибки, ТолькоПросмотр = Неопределено) Экспорт - - Если Пользователи.ЭтоПолноправныйПользователь() Тогда - Возврат Истина; - КонецЕсли; - - РазрешеноУправлениеПравами = Истина; - - Если НЕ ЕстьПравоПоЗначениюДоступа("УправлениеПравами", СсылкаНаОбъект) Тогда - - ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 ""%2"" недоступна для управления правами.'"), - СсылкаНаОбъект.Метаданные().ПредставлениеОбъекта, - СсылкаНаОбъект); - - РазрешеноУправлениеПравами = Ложь; - КонецЕсли; - - Возврат РазрешеноУправлениеПравами; + Возврат НЕ Запрос.Выполнить().Пустой(); КонецФункции //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для получения общих настроек подсистемы -// Возвращает значение ПараметрСеанса.ОграничиватьДоступПоВиду, -// установленное по значению Константа.ОграничиватьДоступНаУровнеЗаписей. -// +// Проверяет используется ли ограничении доступа на уровне записей. Функция ОграничиватьДоступНаУровнеЗаписей() Экспорт УстановитьПривилегированныйРежим(Истина); - Возврат ПараметрыСеанса.ОграничиватьДоступПоВиду <> ""; + Возврат ПолучитьФункциональнуюОпцию("ОграничиватьДоступНаУровнеЗаписей"); КонецФункции @@ -533,9 +454,7 @@ // Настраивает форму значения доступа, которое использует группы значений доступа // при настройке разрешенных значений в группах доступа пользователей. // -// Поддерживается только для случая, когда: -// ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина и -// ВидДоступаСОднойГруппойЗначенияДоступа = Истина. +// Поддерживается только для случая, когда выбирается одна группа доступа, а не несколько. // // Для элемента формы ГруппаДоступа, связанного с реквизитом ГруппаДоступа // устанавливает список групп значений доступа в параметр выбора, которые дают @@ -564,7 +483,7 @@ // - Строка, // - Массив строк имен элементов формы. // -// ТипЗначения - Неопределено - предполагает наличие Форма.Объект.Ссылка, +// ТипЗначения - Неопределено - предполагает наличие реквизита формы Объект.Ссылка, // по которому определяется тип значения доступа. // - Тип ссылки - используется указанный тип значения доступа. // @@ -598,7 +517,7 @@ КонецЕсли; ЗаголовокОшибки = - НСтр("ru = 'Ошибка в процедуре ФормаЗначенияДоступаПриСозданииНаСервере + НСтр("ru = 'Ошибка в процедуре ПриСозданииФормыЗначенияДоступа |общего модуля УправлениеДоступом.'"); СвойстваГрупп = СвойстваГруппЗначенияДоступа(ТипЗначенияДоступа, ЗаголовокОшибки); @@ -680,12 +599,10 @@ // Возвращает массив групп значений доступа разрешающих изменять значения доступа. // -// Поддерживается только для случая, когда: -// ВидДоступаЕдинственныйДляТипаЗначенияДоступа = Истина и -// ВидДоступаСОднойГруппойЗначенияДоступа = Истина. +// Поддерживается только для случая, когда выбирается одна группа доступа, а не несколько. // // Параметры: -// ТипЗначенияДоступа - Тип ссылки. +// ТипЗначенийДоступа - Тип ссылки. // ВозвращатьВсе - Булево, если Истина, то в случае, когда нет ограничений // (доступны все) будет возвращен массив всех вместо Неопределено. // @@ -693,13 +610,13 @@ // Неопределено - все группы значений доступа разрешают изменять значения доступа. // Массив - массив найденных групп значений доступа. // -Функция ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа(ТипЗначенияДоступа, ВозвращатьВсе = Ложь) Экспорт +Функция ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа(ТипЗначенийДоступа, ВозвращатьВсе = Ложь) Экспорт ЗаголовокОшибки = НСтр("ru = 'Ошибка в процедуре ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа |общего модуля УправлениеДоступом.'"); - СвойстваГрупп = СвойстваГруппЗначенияДоступа(ТипЗначенияДоступа, ЗаголовокОшибки); + СвойстваГрупп = СвойстваГруппЗначенияДоступа(ТипЗначенийДоступа, ЗаголовокОшибки); Если НЕ ОграничиватьДоступНаУровнеЗаписей() ИЛИ НЕ УправлениеДоступомСлужебный.ВидДоступаИспользуется(СвойстваГрупп.ВидДоступа) @@ -724,10 +641,11 @@ Запрос = Новый Запрос; Запрос.УстановитьПараметр("ВидДоступа", СвойстваГрупп.ВидДоступа); Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); + Запрос.УстановитьПараметр("ТипЗначенийДоступа", СвойстваГрупп.ПустаяСсылкаТипаЗначений); Запрос.УстановитьПараметр("ИдентификаторЗначенийДоступа", - ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗначенияДоступа)); - + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗначенийДоступа)); + Запрос.Текст = "ВЫБРАТЬ | ГруппыДоступа.Ссылка @@ -748,7 +666,8 @@ | (ВЫБРАТЬ ПЕРВЫЕ 1 | ИСТИНА | ИЗ - | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи | ПО | СоставыГруппПользователей.Используется | И СоставыГруппПользователей.Пользователь = &ТекущийПользователь @@ -762,33 +681,22 @@ |ПОМЕСТИТЬ ГруппыЗначений |ИЗ | &ТаблицаГруппЗначенийДоступа КАК ГруппыЗначенийДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГруппыДоступаПользователя КАК ГруппыДоступаПользователя - | ПО (ВЫБОР - | КОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ЗначенияГруппДоступа КАК РазрешенныеЗначения - | ГДЕ - | РазрешенныеЗначения.ГруппаДоступа = ГруппыДоступаПользователя.Ссылка - | И РазрешенныеЗначения.ВидДоступа = &ВидДоступа - | И РазрешенныеЗначения.ТолькоВидДоступа = ЛОЖЬ - | И РазрешенныеЗначения.ЗначениеДоступа = ГруппыЗначенийДоступа.Ссылка) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ = ВЫБОР - | КОГДА ИСТИНА В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - | ИЗ - | РегистрСведений.ЗначенияГруппДоступа КАК РазрешенныеЗначения - | ГДЕ - | РазрешенныеЗначения.ГруппаДоступа = ГруппыДоступаПользователя.Ссылка - | И РазрешенныеЗначения.ВидДоступа = &ВидДоступа - | И РазрешенныеЗначения.ТолькоВидДоступа = ИСТИНА) - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ)"; + |ГДЕ + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ГруппыДоступаПользователя КАК ГруппыДоступаПользователя + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию + | ПО + | ЗначенияПоУмолчанию.ГруппаДоступа = ГруппыДоступаПользователя.Ссылка + | И ЗначенияПоУмолчанию.ТипЗначенийДоступа = &ТипЗначенийДоступа + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияГруппДоступа КАК Значения + | ПО + | Значения.ГруппаДоступа = ГруппыДоступаПользователя.Ссылка + | И Значения.ЗначениеДоступа = ГруппыЗначенийДоступа.Ссылка + | ГДЕ + | ЕСТЬNULL(Значения.ЗначениеРазрешено, ЗначенияПоУмолчанию.ВсеРазрешены))"; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТаблицаГруппЗначенийДоступа", СвойстваГрупп.Таблица); Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; @@ -840,13 +748,11 @@ // // Возвращаемое значение: // ТаблицаЗначений с колонками: -// НомерНабора - Число (необязательно, если набор один), -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), -// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), +// НомерНабора - Число (необязательно, если набор один), +// ВидДоступа - Строка - необязательно, кроме специальных ПравоЧтения, ПравоИзменения. +// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), // Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора. // Функция ТаблицаНаборыЗначенийДоступа() Экспорт @@ -854,36 +760,44 @@ Таблица = Новый ТаблицаЗначений; Таблица.Колонки.Добавить("НомерНабора", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(4, 0, ДопустимыйЗнак.Неотрицательный))); - Таблица.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыДоступа")); - Таблица.Колонки.Добавить("ЗначениеДоступа", Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.ЗначениеДоступа.Тип); + Таблица.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20))); + Таблица.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); Таблица.Колонки.Добавить("Чтение", Новый ОписаниеТипов("Булево")); - Таблица.Колонки.Добавить("Добавление", Новый ОписаниеТипов("Булево")); Таблица.Колонки.Добавить("Изменение", Новый ОписаниеТипов("Булево")); - Таблица.Колонки.Добавить("Удаление", Новый ОписаниеТипов("Булево")); + // Служебное поле - его нельзя заполнять и менять (заполняется автоматически). + Таблица.Колонки.Добавить("Уточнение", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); Возврат Таблица; КонецФункции -// Заполняет наборы значений доступа объекта, используя процедуру ЗаполнитьНаборыЗначенийДоступа(Таблица), -// созданную прикладным разработчиком в модуле объекта, тип которого задан в одной из подписок на событие +// Процедура ЗаполнитьНаборыЗначенийДоступа(Таблица) создается прикладным разработчиком +// в модулях объектов, тип которых задан в одной из подписок на событие // ЗаписатьНаборыЗначенийДоступа или ЗаписатьЗависимыеНаборыЗначенийДоступа. +// В процедуре выполняется заполнение наборов значений доступа по свойствам объекта. // // Параметры: +// Таблица - ТаблицаЗначений, возвращаемая функцией ТаблицаНаборыЗначенийДоступа() модуля УправлениеДоступом. +// Поля таблицы: +// НомерНабора - Число (необязательно, если набор один); +// ВидДоступа - Строка - имя вида доступа (не обязательно), +// кроме специальных ПравоЧтения, ПравоИзменения; +// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно); +// Чтение - Булево (необязательно, если набор для всех прав) +// устанавливается для одной строки набора; +// Изменение - Булево (необязательно, если набор для всех прав) +// устанавливается для одной строки набора. +// +// Процедура ЗаполнитьНаборыЗначенийДоступа(Знач Объект, Таблица, Знач СсылкаНаПодчиненныйОбъект = Неопределено) +// заполняет наборы значений доступа объекта, используя процедуру ЗаполнитьНаборыЗначенийДоступа(Таблица), +// созданную прикладным разработчиком (см. описание выше). +// +// Параметры: // Объект - СправочникОбъект, ДокументОбъект, ..., или СправочникСсылка, ДокументСсылка, ... // Если передана ссылка, то по ней будет получен объект. // -// Таблица - ТабличнаяЧасть, -// РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа, -// Неопределено, тогда будет создана таблица значений -// УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), содержащая поля: -// НомерНабора - Число (необязательно, если набор один), -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа, (обязательно), -// ЗначениеДоступа - Неопределено, СправочникСсылка или др. (обязательно), -// Чтение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Добавление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Изменение - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, -// Удаление - Булево (необязательно, если набор для всех прав) устанавливается для одной строки набора, +// Таблица - ТаблицаЗначений, возвращаемая функцией ТаблицаНаборыЗначенийДоступа() модуля УправлениеДоступом, +// Неопределено - будет создана таблица значений. // // СсылкаНаПодчиненныйОбъект - ЛюбаяСсылка, используется, когда нужно заполнить наборы значений доступа объекта-владельца // для подчиненного объекта. @@ -903,156 +817,128 @@ |ЗаписатьЗависимыеНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; Если НЕ НаборыЗаполняются Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверные параметры. - |Тип объекта ""%1"" - |не найден ни в одной из подписок на события - |""Записать наборы значений доступа"", - |""Записать зависимые наборы значений доступа"".'"), - ТипЗначенияОбъект)); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверные параметры. + |Тип объекта ""%1"" + |не найден ни в одной из подписок на события + |""Записать наборы значений доступа"", + |""Записать зависимые наборы значений доступа"".'"), + ТипЗначенияОбъект); КонецЕсли; - Таблица = ?(Таблица = Неопределено, ТаблицаНаборыЗначенийДоступа(), Таблица); + Таблица = ?(ТипЗнч(Таблица) = Тип("ТаблицаЗначений"), Таблица, ТаблицаНаборыЗначенийДоступа()); Объект.ЗаполнитьНаборыЗначенийДоступа(Таблица); Если Таблица.Количество() = 0 Тогда // Если это условие отключить, тогда зациклится регламентное задание // заполнения данных для ограничения доступа. - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Объект ""%1"" сформировал пустой набор значений доступа.'"), - ТипЗначенияОбъект)); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект ""%1"" сформировал пустой набор значений доступа.'"), + ТипЗначенияОбъект); КонецЕсли; - Если СсылкаНаПодчиненныйОбъект <> Неопределено Тогда - // Добавление наборов проверки прав Чтения, Изменения "ведущего" объекта-владельца, - // при формировании зависимых наборов значений в процедурах, - // подготовленных прикладным разработчиком. - // - // Действие не требуется при заполнении конечного набора (даже включающего зависимые наборы), - // т.к. в стандартных шаблонах проверка прав встроена в логику работы вида доступа "Объект". - - // Добавление пустого набора, чтобы установить все флажки прав и упорядочить строки наборов. - ДобавитьНаборыЗначенийДоступа(Таблица, ТаблицаНаборыЗначенийДоступа()); - - Если НЕ Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.ЗначениеДоступа.Тип.СодержитТип(ТипЗнч(СсылкаНаОбъект)) Тогда - ВызватьИсключение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'В измерении ""ЗначениеДоступа"" регистра сведений ""Наборы значений доступа"" - |не задан тип ""%1"" для значения ""%2""'"), - Строка(ТипЗнч(СсылкаНаОбъект)), - Строка(СсылкаНаОбъект) )); + УточнитьНаборыЗначенийДоступа(СсылкаНаОбъект, Таблица); + + Если СсылкаНаПодчиненныйОбъект = Неопределено Тогда + Возврат; + КонецЕсли; + + // Добавление наборов проверки прав Чтения, Изменения "ведущего" объекта-владельца, + // при формировании зависимых наборов значений в процедурах, + // подготовленных прикладным разработчиком. + // + // Действие не требуется при заполнении конечного набора (даже включающего зависимые наборы), + // т.к. в стандартных шаблонах проверка прав встроена в логику работы вида доступа "Объект". + + // Добавление пустого набора, чтобы установить все флажки прав и упорядочить строки наборов. + ДобавитьНаборыЗначенийДоступа(Таблица, ТаблицаНаборыЗначенийДоступа()); + + // Подготовка наборов объекта по отдельным правам. + НаборыЧтения = ТаблицаНаборыЗначенийДоступа(); + НаборыИзменения = ТаблицаНаборыЗначенийДоступа(); + Для каждого Строка Из Таблица Цикл + Если Строка.Чтение Тогда + НоваяСтрока = НаборыЧтения.Добавить(); + НоваяСтрока.НомерНабора = Строка.НомерНабора + 1; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + НоваяСтрока.Уточнение = Строка.Уточнение; КонецЕсли; - - // Подготовка наборов объекта по отдельным правам. - НаборыЧтения = ТаблицаНаборыЗначенийДоступа(); - НаборыДобавления = ТаблицаНаборыЗначенийДоступа(); - НаборыИзменения = ТаблицаНаборыЗначенийДоступа(); - Для каждого Строка Из Таблица Цикл - Если Строка.Чтение Тогда - НоваяСтрока = НаборыЧтения.Добавить(); - НоваяСтрока.НомерНабора = Строка.НомерНабора + 1; - НоваяСтрока.ВидДоступа = Строка.ВидДоступа; - НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; - КонецЕсли; - Если Строка.Добавление Тогда - НоваяСтрока = НаборыДобавления.Добавить(); - НоваяСтрока.НомерНабора = (Строка.НомерНабора + 1)*2; - НоваяСтрока.ВидДоступа = Строка.ВидДоступа; - НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; - КонецЕсли; - Если Строка.Изменение Тогда - НоваяСтрока = НаборыИзменения.Добавить(); - НоваяСтрока.НомерНабора = (Строка.НомерНабора + 1)*3; - НоваяСтрока.ВидДоступа = Строка.ВидДоступа; - НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; - КонецЕсли; - КонецЦикла; - - Запрос = Новый Запрос( - "ВЫБРАТЬ - | ЗависимостиПравДоступа.ПриПроверкеПраваЧтение, - | ЗависимостиПравДоступа.ПриПроверкеПраваДобавление, - | ЗависимостиПравДоступа.ПриПроверкеПраваИзменение, - | ЗависимостиПравДоступа.ПриПроверкеПраваУдаление, - | ЗависимостиПравДоступа.ОтключитьПроверкуПравВедущейТаблицы - |ИЗ - | РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа - |ГДЕ - | ЗависимостиПравДоступа.ПодчиненнаяТаблица = &ПодчиненнаяТаблица - | И ЗависимостиПравДоступа.ТипВедущейТаблицы = &ТипВедущейТаблицы"); - Запрос.УстановитьПараметр("ПодчиненнаяТаблица", СсылкаНаПодчиненныйОбъект.Метаданные().ПолноеИмя()); - МассивТипов = Новый Массив; - МассивТипов.Добавить(ТипЗнч(СсылкаНаОбъект)); - ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); - Запрос.УстановитьПараметр("ТипВедущейТаблицы", ОписаниеТипов.ПривестиЗначение(Неопределено)); - ЗависимостиПрав = Запрос.Выполнить().Выгрузить(); - - Таблица.Очистить(); - - Если ЗависимостиПрав.Количество() = 0 Тогда - - // Добавление наборов по стандартному правилу. - - // Проверка права Чтения "ведущего" объекта-владельца наборов - // при проверке права Чтения "подчиненного" объекта. - Строка = Таблица.Добавить(); - Строка.НомерНабора = 1; - Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения; - Строка.ЗначениеДоступа = СсылкаНаОбъект; - Строка.Чтение = Истина; - - // Проверка права Изменения "ведущего" объекта-владельца наборов - // при проверке прав Добавления, Изменения, Удаления "подчиненного" объекта. - Строка = Таблица.Добавить(); - Строка.НомерНабора = 2; - Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения; - Строка.ЗначениеДоступа = СсылкаНаОбъект; - Строка.Добавление = Истина; - Строка.Изменение = Истина; - Строка.Удаление = Истина; - - // Пометка прав, требующих проверки наборов ограничения права чтения "ведущего" объекта-владельца. - НаборыЧтения.ЗаполнитьЗначения(Истина, "Чтение"); - // Пометка прав, требующих проверки наборов ограничения права изменения "ведущего" объекта-владельца. - НаборыИзменения.ЗаполнитьЗначения(Истина, "Добавление, Изменение, Удаление"); - - ДобавитьНаборыЗначенийДоступа(НаборыЧтения, НаборыИзменения); - ДобавитьНаборыЗначенийДоступа(Таблица, НаборыЧтения, Истина); - Иначе - // Проверка права Чтения "ведущего" объекта-владельца наборов - // при проверке прав "подчиненного" объекта. - - ЗависимостиПрав = ЗависимостиПрав[0]; - НаборыПравДляУмножения = Таблица.Скопировать(); - НаборыОграниченийДляУмножения = Таблица.Скопировать(); - - ОбщиеПараметры = Новый Структура; - ОбщиеПараметры.Вставить("ЗависимостиПрав", ЗависимостиПрав); - ОбщиеПараметры.Вставить("Таблица", Таблица); - ОбщиеПараметры.Вставить("НаборыПравДляУмножения", НаборыПравДляУмножения); - ОбщиеПараметры.Вставить("НаборыОграниченийДляУмножения", НаборыОграниченийДляУмножения); - ОбщиеПараметры.Вставить("НаборыЧтения", НаборыЧтения); - ОбщиеПараметры.Вставить("НаборыДобавления", НаборыДобавления); - ОбщиеПараметры.Вставить("НаборыИзменения", НаборыИзменения); - ОбщиеПараметры.Вставить("СсылкаНаОбъект", СсылкаНаОбъект); - - ДобавитьНаборыДляПрава("Чтение", ОбщиеПараметры); - ДобавитьНаборыДляПрава("Добавление", ОбщиеПараметры); - ДобавитьНаборыДляПрава("Изменение", ОбщиеПараметры); - ДобавитьНаборыДляПрава("Удаление", ОбщиеПараметры); - - Если НаборыПравДляУмножения.Количество() > 0 Тогда - - ДобавитьНаборыЗначенийДоступа( - НаборыПравДляУмножения, НаборыОграниченийДляУмножения, Истина); - - Если НаборыПравДляУмножения.Количество() > 0 Тогда - ДобавитьНаборыЗначенийДоступа(Таблица, НаборыПравДляУмножения); - КонецЕсли; - КонецЕсли; - + Если Строка.Изменение Тогда + НоваяСтрока = НаборыИзменения.Добавить(); + НоваяСтрока.НомерНабора = (Строка.НомерНабора + 1)*2; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + НоваяСтрока.Уточнение = Строка.Уточнение; КонецЕсли; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа + |ГДЕ + | ЗависимостиПравДоступа.ПодчиненнаяТаблица = &ПодчиненнаяТаблица + | И ЗависимостиПравДоступа.ТипВедущейТаблицы = &ТипВедущейТаблицы"; + + Запрос.УстановитьПараметр("ПодчиненнаяТаблица", + СсылкаНаПодчиненныйОбъект.Метаданные().ПолноеИмя()); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипЗнч(СсылкаНаОбъект)); + ОписаниеТипов = Новый ОписаниеТипов(МассивТипов); + Запрос.УстановитьПараметр("ТипВедущейТаблицы", ОписаниеТипов.ПривестиЗначение(Неопределено)); + + ЗависимостиПрав = Запрос.Выполнить().Выгрузить(); + Таблица.Очистить(); + + Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(СсылкаНаОбъект)); + + Если ЗависимостиПрав.Количество() = 0 Тогда + + // Добавление наборов по стандартному правилу. + + // Проверка права Чтения "ведущего" объекта-владельца наборов + // при проверке права Чтения "подчиненного" объекта. + Строка = Таблица.Добавить(); + Строка.НомерНабора = 1; + Строка.ВидДоступа = "ПравоЧтения"; + Строка.ЗначениеДоступа = Идентификатор; + Строка.Чтение = Истина; + + // Проверка права Изменения "ведущего" объекта-владельца наборов + // при проверке прав Добавления, Изменения, Удаления "подчиненного" объекта. + Строка = Таблица.Добавить(); + Строка.НомерНабора = 2; + Строка.ВидДоступа = "ПравоИзменения"; + Строка.ЗначениеДоступа = Идентификатор; + Строка.Изменение = Истина; + + // Пометка прав, требующих проверки наборов ограничения права чтения "ведущего" объекта-владельца. + НаборыЧтения.ЗаполнитьЗначения(Истина, "Чтение"); + // Пометка прав, требующих проверки наборов ограничения права изменения "ведущего" объекта-владельца. + НаборыИзменения.ЗаполнитьЗначения(Истина, "Изменение"); + + ДобавитьНаборыЗначенийДоступа(НаборыЧтения, НаборыИзменения); + ДобавитьНаборыЗначенийДоступа(Таблица, НаборыЧтения, Истина); + Иначе + // Добавление наборов по нестандартному правилу: вместо изменения проверять чтение. + + // Проверка права Чтения "ведущего" объекта-владельца наборов + // при проверке права Чтения "подчиненного" объекта. + Строка = Таблица.Добавить(); + Строка.НомерНабора = 1; + Строка.ВидДоступа = "ПравоЧтения"; + Строка.ЗначениеДоступа = Идентификатор; + Строка.Чтение = Истина; + Строка.Изменение = Истина; + + // Пометка прав, требующих проверки наборов ограничения права чтения "ведущего" объекта-владельца. + НаборыЧтения.ЗаполнитьЗначения(Истина, "Чтение"); + НаборыЧтения.ЗаполнитьЗначения(Истина, "Изменение"); + ДобавитьНаборыЗначенийДоступа(Таблица, НаборыЧтения, Истина); КонецЕсли; КонецПроцедуры @@ -1063,12 +949,9 @@ // // Параметры: // Приемник, -// Источник - ТабличнаяЧасть или ТаблицаЗначений -// с полями, как в таблице, возвращаемой функцией -// УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(). +// Источник - ТаблицаЗначений возвращаемая функцией ТаблицаНаборыЗначенийДоступа() модуля УправлениеДоступом. // // Умножение - Булево, определяет способ логического объединения наборов приемника и источника. -// // Упростить - Булево, определяет требуется ли упрощение наборов после добавления. // Процедура ДобавитьНаборыЗначенийДоступа(Приемник, Знач Источник, Знач Умножение = Ложь, Знач Упростить = Ложь) Экспорт @@ -1080,693 +963,39 @@ Приемник.Очистить(); Источник.Очистить(); Возврат; - КонецЕсли; - Запрос = Новый Запрос; Если Приемник.Количество() = 0 Тогда - Запрос.УстановитьПараметр("Приемник", Источник); - Запрос.УстановитьПараметр("Источник", Приемник); - Иначе - Запрос.УстановитьПараметр("Приемник", Приемник); - Запрос.УстановитьПараметр("Источник", Источник); + Значение = Приемник; + Приемник = Источник; + Источник = Значение; КонецЕсли; - // Подготовка временных таблиц приемника. - Запрос.Текст = - "ВЫБРАТЬ - | Приемник.НомерНабора + 1 КАК НомерНабора, - | Приемник.ВидДоступа, - | Приемник.ЗначениеДоступа, - | Приемник.Чтение, - | Приемник.Добавление, - | Приемник.Изменение, - | Приемник.Удаление - |ПОМЕСТИТЬ Приемник - |ИЗ - | &Приемник КАК Приемник - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПраваБезНормализации.НомерНабора, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Чтение - | КОНЕЦ КАК Чтение, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Добавление - | КОНЕЦ КАК Добавление, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Изменение - | КОНЕЦ КАК Изменение, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Удаление - | КОНЕЦ КАК Удаление, - | ПраваБезНормализации.ДлинаНабора - |ПОМЕСТИТЬ ПраваНаборовПриемника - |ИЗ - | (ВЫБРАТЬ - | Приемник.НомерНабора КАК НомерНабора, - | МАКСИМУМ(Приемник.Чтение) КАК Чтение, - | МАКСИМУМ(Приемник.Добавление) КАК Добавление, - | МАКСИМУМ(Приемник.Изменение) КАК Изменение, - | МАКСИМУМ(Приемник.Удаление) КАК Удаление, - | КОЛИЧЕСТВО(Приемник.НомерНабора) КАК ДлинаНабора - | ИЗ - | Приемник КАК Приемник - | - | СГРУППИРОВАТЬ ПО - | Приемник.НомерНабора) КАК ПраваБезНормализации - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | МАКСИМУМ(Приемник.НомерНабора) КАК НомерНабораПриемника - |ПОМЕСТИТЬ Максимальный - |ИЗ - | Приемник КАК Приемник"; - - // Подготовка временных таблиц источника. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | Источник.НомерНабора + 1 КАК НомерНабора, - | Источник.ВидДоступа, - | Источник.ЗначениеДоступа, - | Источник.Чтение, - | Источник.Добавление, - | Источник.Изменение, - | Источник.Удаление - |ПОМЕСТИТЬ Источник - |ИЗ - | &Источник КАК Источник - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ПраваБезНормализации.НомерНабора, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Чтение - | КОНЕЦ КАК Чтение, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Добавление - | КОНЕЦ КАК Добавление, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Изменение - | КОНЕЦ КАК Изменение, - | ВЫБОР - | КОГДА (НЕ ПраваБезНормализации.Чтение) - | И (НЕ ПраваБезНормализации.Добавление) - | И (НЕ ПраваБезНормализации.Изменение) - | И (НЕ ПраваБезНормализации.Удаление) - | ТОГДА ИСТИНА - | ИНАЧЕ ПраваБезНормализации.Удаление - | КОНЕЦ КАК Удаление, - | ПраваБезНормализации.ДлинаНабора - |ПОМЕСТИТЬ ПраваНаборовИсточника - |ИЗ - | (ВЫБРАТЬ - | Источник.НомерНабора КАК НомерНабора, - | МАКСИМУМ(Источник.Чтение) КАК Чтение, - | МАКСИМУМ(Источник.Добавление) КАК Добавление, - | МАКСИМУМ(Источник.Изменение) КАК Изменение, - | МАКСИМУМ(Источник.Удаление) КАК Удаление, - | МАКСИМУМ(Источник.НомерНабора) КАК ДлинаНабора - | ИЗ - | Источник КАК Источник - | - | СГРУППИРОВАТЬ ПО - | Источник.НомерНабора) КАК ПраваБезНормализации"; - - // Выполнение операции логического сложения или логического умножения. - Если Умножение Тогда - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | (Приемник.НомерНабора - 1) * Максимальный.НомерНабораПриемника + Источник.НомерНабора КАК НомерНабора, - | Приемник.НомерНабора КАК НомерНабораПриемника, - | Источник.НомерНабора КАК НомерНабораИсточника, - | ВЫБОР - | КОГДА ПраваНаборовПриемника.Чтение - | И ПраваНаборовИсточника.Чтение - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Чтение, - | ВЫБОР - | КОГДА ПраваНаборовПриемника.Добавление - | И ПраваНаборовИсточника.Добавление - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Добавление, - | ВЫБОР - | КОГДА ПраваНаборовПриемника.Изменение - | И ПраваНаборовИсточника.Изменение - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Изменение, - | ВЫБОР - | КОГДА ПраваНаборовПриемника.Удаление - | И ПраваНаборовИсточника.Удаление - | ТОГДА ИСТИНА - | ИНАЧЕ ЛОЖЬ - | КОНЕЦ КАК Удаление, - | ПраваНаборовПриемника.ДлинаНабора + ПраваНаборовИсточника.ДлинаНабора КАК ДлинаНабора - |ПОМЕСТИТЬ ПраваУмноженныхНаборов - |ИЗ - | Приемник КАК Приемник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника - | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника - | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора - | ПО (ПраваНаборовПриемника.Чтение - | И ПраваНаборовИсточника.Чтение - | ИЛИ ПраваНаборовПриемника.Добавление - | И ПраваНаборовИсточника.Добавление - | ИЛИ ПраваНаборовПриемника.Изменение - | И ПраваНаборовИсточника.Изменение - | ИЛИ ПраваНаборовПриемника.Удаление - | И ПраваНаборовИсточника.Удаление) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный - | ПО (ИСТИНА)"; - Если НЕ Упростить Тогда - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | ПраваУмноженныхНаборов.НомерНабора, - | Приемник.ВидДоступа, - | Приемник.ЗначениеДоступа, - | ПраваУмноженныхНаборов.Чтение, - | ПраваУмноженныхНаборов.Добавление, - | ПраваУмноженныхНаборов.Изменение, - | ПраваУмноженныхНаборов.Удаление - |ИЗ - | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Приемник КАК Приемник - | ПО ПраваУмноженныхНаборов.НомерНабораПриемника = Приемник.НомерНабора - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | ПраваУмноженныхНаборов.НомерНабора, - | Источник.ВидДоступа, - | Источник.ЗначениеДоступа, - | ПраваУмноженныхНаборов.Чтение, - | ПраваУмноженныхНаборов.Добавление, - | ПраваУмноженныхНаборов.Изменение, - | ПраваУмноженныхНаборов.Удаление - |ИЗ - | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник - | ПО ПраваУмноженныхНаборов.НомерНабораИсточника = Источник.НомерНабора"; - Иначе - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | ПраваУмноженныхНаборов.НомерНабора, - | Приемник.ВидДоступа, - | Приемник.ЗначениеДоступа, - | ПраваУмноженныхНаборов.Чтение, - | ПраваУмноженныхНаборов.Добавление, - | ПраваУмноженныхНаборов.Изменение, - | ПраваУмноженныхНаборов.Удаление, - | ПраваУмноженныхНаборов.ДлинаНабора - |ПОМЕСТИТЬ ВсеНаборы - |ИЗ - | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Приемник КАК Приемник - | ПО ПраваУмноженныхНаборов.НомерНабораПриемника = Приемник.НомерНабора - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | ПраваУмноженныхНаборов.НомерНабора, - | Источник.ВидДоступа, - | Источник.ЗначениеДоступа, - | ПраваУмноженныхНаборов.Чтение, - | ПраваУмноженныхНаборов.Добавление, - | ПраваУмноженныхНаборов.Изменение, - | ПраваУмноженныхНаборов.Удаление, - | ПраваУмноженныхНаборов.ДлинаНабора - |ИЗ - | ПраваУмноженныхНаборов КАК ПраваУмноженныхНаборов - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Источник КАК Источник - | ПО ПраваУмноженныхНаборов.НомерНабораИсточника = Источник.НомерНабора"; - КонецЕсли; - ИначеЕсли НЕ Упростить Тогда - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Приемник.НомерНабора КАК НомерНабора, - | Приемник.ВидДоступа, - | Приемник.ЗначениеДоступа, - | ПраваНаборовПриемника.Чтение, - | ПраваНаборовПриемника.Добавление, - | ПраваНаборовПриемника.Изменение, - | ПраваНаборовПриемника.Удаление - |ИЗ - | Приемник КАК Приемник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника - | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | Источник.НомерНабора + Максимальный.НомерНабораПриемника, - | Источник.ВидДоступа, - | Источник.ЗначениеДоступа, - | ПраваНаборовИсточника.Чтение, - | ПраваНаборовИсточника.Добавление, - | ПраваНаборовИсточника.Изменение, - | ПраваНаборовИсточника.Удаление - |ИЗ - | Источник КАК Источник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника - | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный - | ПО (ИСТИНА)"; - Иначе - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | Приемник.НомерНабора КАК НомерНабора, - | Приемник.ВидДоступа, - | Приемник.ЗначениеДоступа, - | ПраваНаборовПриемника.Чтение, - | ПраваНаборовПриемника.Добавление, - | ПраваНаборовПриемника.Изменение, - | ПраваНаборовПриемника.Удаление, - | ПраваНаборовПриемника.ДлинаНабора - |ПОМЕСТИТЬ ВсеНаборы - |ИЗ - | Приемник КАК Приемник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовПриемника КАК ПраваНаборовПриемника - | ПО Приемник.НомерНабора = ПраваНаборовПриемника.НомерНабора - | - |ОБЪЕДИНИТЬ - | - |ВЫБРАТЬ - | Источник.НомерНабора + Максимальный.НомерНабораПриемника, - | Источник.ВидДоступа, - | Источник.ЗначениеДоступа, - | ПраваНаборовИсточника.Чтение, - | ПраваНаборовИсточника.Добавление, - | ПраваНаборовИсточника.Изменение, - | ПраваНаборовИсточника.Удаление, - | ПраваНаборовИсточника.ДлинаНабора - |ИЗ - | Источник КАК Источник - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваНаборовИсточника КАК ПраваНаборовИсточника - | ПО Источник.НомерНабора = ПраваНаборовИсточника.НомерНабора - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Максимальный КАК Максимальный - | ПО (ИСТИНА)"; - КонецЕсли; - - Если НЕ Упростить Тогда + Если Упростить Тогда - Если ТипЗнч(Приемник) = Тип("ТаблицаЗначений") Тогда - // Подготовка результата с избавлением от типа NULL в колонках таблицы значений. - НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); - НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); - Приемник = НаборЗаписей.Выгрузить(, "НомерНабора, ВидДоступа, ЗначениеДоступа, Чтение, Добавление, Изменение, Удаление"); - Иначе - Приемник.Загрузить(Запрос.Выполнить().Выгрузить()); - КонецЕсли; + // Определение копий наборов и копий строк в наборах в пределах прав + // в процессе добавления или умножения. + // + // "Копии" возникают из-за правил раскрытия скобок в логических выражениях: + // Для наборов в пределах права и наборов разных прав: + // X И X = X, + // X ИЛИ X = X, где X - набор строк-аргументов. + // Только для наборов в пределах права: + // (а И б И в) ИЛИ (а И б) = (а И б), где а,б,в - строки-аргументы наборов. + // Исходя из этих правил одинаковые строки в наборе и одинаковые наборы можно удалить. - Возврат; - КонецЕсли; - - // Подготовка номеров всех наборов для определения копий наборов по правам. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВсеНаборы.НомерНабора, - | ВсеНаборы.Чтение, - | ВсеНаборы.Добавление, - | ВсеНаборы.Изменение, - | ВсеНаборы.Удаление, - | ВсеНаборы.ДлинаНабора - |ПОМЕСТИТЬ ВсеНомераНаборов - |ИЗ - | ВсеНаборы КАК ВсеНаборы"; - - // Определение копий наборов в пределах прав. - // "Копии" возникают из-за правил раскрытия скобок в логических выражениях: - // Для наборов в пределах права и наборов разных прав: - // X И X = X, - // X ИЛИ X = X, где X - набор строк-аргументов. - // Только для наборов в пределах права: - // (а И б И в) ИЛИ (а И б) = (а И б), где а,б,в - строки-аргументы наборов. - // Исходя из этих правил одинаковые строки в наборе и одинаковые наборы можно удалить. - // - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | ВсеНомераНаборов1.НомерНабора, - | ВсеНомераНаборов2.НомерНабора КАК НомерКопииНабора, - | ВсеНомераНаборов2.ДлинаНабора КАК ДлинаКопииНабора - |ПОМЕСТИТЬ НомераКопийВсехНаборовПоПравуЧтение - |ИЗ - | ВсеНомераНаборов КАК ВсеНомераНаборов1 - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНомераНаборов КАК ВсеНомераНаборов2 - | ПО (ВсеНомераНаборов1.Чтение) - | И (ВсеНомераНаборов2.Чтение) - | И ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборов1.НомерНабора - | И ВсеНаборы1.Чтение - | И ВсеНаборы2.Чтение - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.Чтение - | И ВсеНаборы1.НомерНабора = ВсеНомераНаборов2.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL ))) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВсеНомераНаборов1.НомерНабора, - | ВсеНомераНаборов2.НомерНабора КАК НомерКопииНабора, - | ВсеНомераНаборов2.ДлинаНабора КАК ДлинаКопииНабора - |ПОМЕСТИТЬ НомераКопийВсехНаборовПоПравуДобавление - |ИЗ - | ВсеНомераНаборов КАК ВсеНомераНаборов1 - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНомераНаборов КАК ВсеНомераНаборов2 - | ПО (ВсеНомераНаборов1.Добавление) - | И (ВсеНомераНаборов2.Добавление) - | И ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборов1.НомерНабора - | И ВсеНаборы1.Добавление - | И ВсеНаборы2.Добавление - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.Добавление - | И ВсеНаборы1.НомерНабора = ВсеНомераНаборов2.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL ))) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВсеНомераНаборов1.НомерНабора, - | ВсеНомераНаборов2.НомерНабора КАК НомерКопииНабора, - | ВсеНомераНаборов2.ДлинаНабора КАК ДлинаКопииНабора - |ПОМЕСТИТЬ НомераКопийВсехНаборовПоПравуИзменение - |ИЗ - | ВсеНомераНаборов КАК ВсеНомераНаборов1 - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНомераНаборов КАК ВсеНомераНаборов2 - | ПО (ВсеНомераНаборов1.Изменение) - | И (ВсеНомераНаборов2.Изменение) - | И ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборов1.НомерНабора - | И ВсеНаборы1.Изменение - | И ВсеНаборы2.Изменение - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.Изменение - | И ВсеНаборы1.НомерНабора = ВсеНомераНаборов2.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL ))) - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | ВсеНомераНаборов1.НомерНабора, - | ВсеНомераНаборов2.НомерНабора КАК НомерКопииНабора, - | ВсеНомераНаборов2.ДлинаНабора КАК ДлинаКопииНабора - |ПОМЕСТИТЬ НомераКопийВсехНаборовПоПравуУдаление - |ИЗ - | ВсеНомераНаборов КАК ВсеНомераНаборов1 - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНомераНаборов КАК ВсеНомераНаборов2 - | ПО (ВсеНомераНаборов1.Удаление) - | И (ВсеНомераНаборов2.Удаление) - | И ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборов1.НомерНабора - | И ВсеНаборы1.Удаление - | И ВсеНаборы2.Удаление - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.Удаление - | И ВсеНаборы1.НомерНабора = ВсеНомераНаборов2.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL )))"; - - // Выбор номеров наборов копий по правам. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуЧтение.НомерКопииНабора) КАК НомерКопииНабора, - | ИСТИНА КАК Чтение, - | ЛОЖЬ КАК Добавление, - | ЛОЖЬ КАК Изменение, - | ЛОЖЬ КАК Удаление - |ПОМЕСТИТЬ НомераКопийВсехНаборовПоПравам - |ИЗ - | (ВЫБРАТЬ - | НомераКопийВсехНаборовПоПравуЧтение.НомерНабора КАК НомерНабора, - | НомераКопийВсехНаборовПоПравуЧтение.НомерКопииНабора КАК НомерКопииНабора - | ИЗ - | НомераКопийВсехНаборовПоПравуЧтение КАК НомераКопийВсехНаборовПоПравуЧтение - | ГДЕ - | (НомераКопийВсехНаборовПоПравуЧтение.НомерНабора, НомераКопийВсехНаборовПоПравуЧтение.ДлинаКопииНабора) В - | (ВЫБРАТЬ - | МинимальнаяДлинаКопий.НомерНабора, - | МИНИМУМ(МинимальнаяДлинаКопий.ДлинаКопииНабора) КАК МинимальнаяДлинаКопии - | ИЗ - | НомераКопийВсехНаборовПоПравуЧтение КАК МинимальнаяДлинаКопий - | СГРУППИРОВАТЬ ПО - | МинимальнаяДлинаКопий.НомерНабора)) КАК НомераМеньшихКопийВсехНаборовПоПравуЧтение - | - |СГРУППИРОВАТЬ ПО - | НомераМеньшихКопийВсехНаборовПоПравуЧтение.НомерНабора - | - |ИМЕЮЩИЕ - | (НЕ МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуЧтение.НомерКопииНабора) ЕСТЬ NULL ) - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуДобавление.НомерКопииНабора), - | ЛОЖЬ, - | ИСТИНА, - | ЛОЖЬ, - | ЛОЖЬ - |ИЗ - | (ВЫБРАТЬ - | НомераКопийВсехНаборовПоПравуДобавление.НомерНабора КАК НомерНабора, - | НомераКопийВсехНаборовПоПравуДобавление.НомерКопииНабора КАК НомерКопииНабора - | ИЗ - | НомераКопийВсехНаборовПоПравуДобавление КАК НомераКопийВсехНаборовПоПравуДобавление - | ГДЕ - | (НомераКопийВсехНаборовПоПравуДобавление.НомерНабора, НомераКопийВсехНаборовПоПравуДобавление.ДлинаКопииНабора) В - | (ВЫБРАТЬ - | МинимальнаяДлинаКопий.НомерНабора, - | МИНИМУМ(МинимальнаяДлинаКопий.ДлинаКопииНабора) КАК МинимальнаяДлинаКопии - | ИЗ - | НомераКопийВсехНаборовПоПравуДобавление КАК МинимальнаяДлинаКопий - | СГРУППИРОВАТЬ ПО - | МинимальнаяДлинаКопий.НомерНабора)) КАК НомераМеньшихКопийВсехНаборовПоПравуДобавление - | - |СГРУППИРОВАТЬ ПО - | НомераМеньшихКопийВсехНаборовПоПравуДобавление.НомерНабора - | - |ИМЕЮЩИЕ - | (НЕ МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуДобавление.НомерКопииНабора) ЕСТЬ NULL ) - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуИзменение.НомерКопииНабора), - | ЛОЖЬ, - | ЛОЖЬ, - | ИСТИНА, - | ЛОЖЬ - |ИЗ - | (ВЫБРАТЬ - | НомераКопийВсехНаборовПоПравуИзменение.НомерНабора КАК НомерНабора, - | НомераКопийВсехНаборовПоПравуИзменение.НомерКопииНабора КАК НомерКопииНабора - | ИЗ - | НомераКопийВсехНаборовПоПравуИзменение КАК НомераКопийВсехНаборовПоПравуИзменение - | ГДЕ - | (НомераКопийВсехНаборовПоПравуИзменение.НомерНабора, НомераКопийВсехНаборовПоПравуИзменение.ДлинаКопииНабора) В - | (ВЫБРАТЬ - | МинимальнаяДлинаКопий.НомерНабора, - | МИНИМУМ(МинимальнаяДлинаКопий.ДлинаКопииНабора) КАК МинимальнаяДлинаКопии - | ИЗ - | НомераКопийВсехНаборовПоПравуИзменение КАК МинимальнаяДлинаКопий - | СГРУППИРОВАТЬ ПО - | МинимальнаяДлинаКопий.НомерНабора)) КАК НомераМеньшихКопийВсехНаборовПоПравуИзменение - | - |СГРУППИРОВАТЬ ПО - | НомераМеньшихКопийВсехНаборовПоПравуИзменение.НомерНабора - | - |ИМЕЮЩИЕ - | (НЕ МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуИзменение.НомерКопииНабора) ЕСТЬ NULL ) - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ - | МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуУдаление.НомерКопииНабора), - | ЛОЖЬ, - | ЛОЖЬ, - | ЛОЖЬ, - | ИСТИНА - |ИЗ - | (ВЫБРАТЬ - | НомераКопийВсехНаборовПоПравуУдаление.НомерНабора КАК НомерНабора, - | НомераКопийВсехНаборовПоПравуУдаление.НомерКопииНабора КАК НомерКопииНабора - | ИЗ - | НомераКопийВсехНаборовПоПравуУдаление КАК НомераКопийВсехНаборовПоПравуУдаление - | ГДЕ - | (НомераКопийВсехНаборовПоПравуУдаление.НомерНабора, НомераКопийВсехНаборовПоПравуУдаление.ДлинаКопииНабора) В - | (ВЫБРАТЬ - | МинимальнаяДлинаКопий.НомерНабора, - | МИНИМУМ(МинимальнаяДлинаКопий.ДлинаКопииНабора) КАК МинимальнаяДлинаКопии - | ИЗ - | НомераКопийВсехНаборовПоПравуУдаление КАК МинимальнаяДлинаКопий - | СГРУППИРОВАТЬ ПО - | МинимальнаяДлинаКопий.НомерНабора)) КАК НомераМеньшихКопийВсехНаборовПоПравуУдаление - | - |СГРУППИРОВАТЬ ПО - | НомераМеньшихКопийВсехНаборовПоПравуУдаление.НомерНабора - | - |ИМЕЮЩИЕ - | (НЕ МИНИМУМ(НомераМеньшихКопийВсехНаборовПоПравуУдаление.НомерКопииНабора) ЕСТЬ NULL )"; - - // Подготовка номеров всех наборов для определения копий наборов между правами. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ РАЗЛИЧНЫЕ - | НомераКопийВсехНаборовПоПравам.НомерКопииНабора КАК НомерНабора, - | НомераКопийВсехНаборовПоПравам.Чтение, - | НомераКопийВсехНаборовПоПравам.Добавление, - | НомераКопийВсехНаборовПоПравам.Изменение, - | НомераКопийВсехНаборовПоПравам.Удаление - |ПОМЕСТИТЬ ВсеНомераНаборовПоПравам - |ИЗ - | НомераКопийВсехНаборовПоПравам КАК НомераКопийВсехНаборовПоПравам"; - - // Определение копий наборов. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | ВсеНомераНаборовПоПравам1.НомерНабора, - | МИНИМУМ(ВсеНомераНаборовПоПравам2.НомерНабора) КАК НомерКопииНабора - |ПОМЕСТИТЬ НомераКопийВсехНаборов - |ИЗ - | ВсеНомераНаборовПоПравам КАК ВсеНомераНаборовПоПравам1 - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНомераНаборовПоПравам КАК ВсеНомераНаборовПоПравам2 - | ПО ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборовПоПравам2.НомерНабора - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.НомерНабора = ВсеНомераНаборовПоПравам1.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL ))) - | И ((НЕ ЛОЖЬ В - | (ВЫБРАТЬ ПЕРВЫЕ 1 - | ЛОЖЬ - | ИЗ - | ВсеНаборы КАК ВсеНаборы1 ЛЕВОЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы2 - | ПО - | ВсеНаборы2.НомерНабора = ВсеНомераНаборовПоПравам1.НомерНабора - | И ВсеНаборы1.ВидДоступа = ВсеНаборы2.ВидДоступа - | И ВсеНаборы1.ЗначениеДоступа = ВсеНаборы2.ЗначениеДоступа - | ГДЕ - | ВсеНаборы1.НомерНабора = ВсеНомераНаборовПоПравам2.НомерНабора - | И ВсеНаборы2.ВидДоступа ЕСТЬ NULL ))) - | - |СГРУППИРОВАТЬ ПО - | ВсеНомераНаборовПоПравам1.НомерНабора"; - - // Выбор номеров наборов со сжатием по правам. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | НомераКопийВсехНаборов.НомерКопииНабора КАК НомерНабора, - | МАКСИМУМ(ВсеНомераНаборовПоПравам.Чтение) КАК Чтение, - | МАКСИМУМ(ВсеНомераНаборовПоПравам.Добавление) КАК Добавление, - | МАКСИМУМ(ВсеНомераНаборовПоПравам.Изменение) КАК Изменение, - | МАКСИМУМ(ВсеНомераНаборовПоПравам.Удаление) КАК Удаление - |ПОМЕСТИТЬ НомераНаборовСПравами - |ИЗ - | ВсеНомераНаборовПоПравам КАК ВсеНомераНаборовПоПравам - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ НомераКопийВсехНаборов КАК НомераКопийВсехНаборов - | ПО ВсеНомераНаборовПоПравам.НомерНабора = НомераКопийВсехНаборов.НомерНабора - | - |СГРУППИРОВАТЬ ПО - | НомераКопийВсехНаборов.НомерКопииНабора"; - - // Выбор наборов и помещение в приемник. - Запрос.Текст = Запрос.Текст + ";" + Символы.ПС + - "ВЫБРАТЬ - | НомераНаборовСПравами.НомерНабора, - | ВсеНаборы.ВидДоступа, - | ВсеНаборы.ЗначениеДоступа, - | НомераНаборовСПравами.Чтение, - | НомераНаборовСПравами.Добавление, - | НомераНаборовСПравами.Изменение, - | НомераНаборовСПравами.Удаление - |ИЗ - | НомераНаборовСПравами КАК НомераНаборовСПравами - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеНаборы КАК ВсеНаборы - | ПО НомераНаборовСПравами.НомерНабора = ВсеНаборы.НомерНабора"; - - Если ТипЗнч(Приемник) = Тип("ТаблицаЗначений") Тогда - // Подготовка результата с избавлением от типа NULL в колонках таблицы значений. - НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); - НаборЗаписей.Загрузить(Запрос.Выполнить().Выгрузить()); - Приемник = НаборЗаписей.Выгрузить(, "НомерНабора, ВидДоступа, ЗначениеДоступа, Чтение, Добавление, Изменение, Удаление"); + Если Умножение Тогда + УмножитьНаборыИУпростить(Приемник, Источник); + Иначе // Добавление + ДобавитьНаборыИУпростить(Приемник, Источник); + КонецЕсли; Иначе - Приемник.Загрузить(Запрос.Выполнить().Выгрузить()); + + Если Умножение Тогда + УмножитьНаборы(Приемник, Источник); + Иначе // Добавление + ДобавитьНаборы(Приемник, Источник); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -1780,53 +1009,7 @@ // Процедура ОбновитьНаборыЗначенийДоступа(СсылкаНаОбъект) Экспорт - УстановитьПривилегированныйРежим(Истина); - - // Если передача параметра Объект производилась с клиента на сервер, - // то передавалась ссылка, и объект требуется получить. - Объект = СсылкаНаОбъект.ПолучитьОбъект(); - ТипЗначенияОбъект = ТипЗнч(Объект); - - НаборыЗаписываются = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( - "ЗаписатьНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; - - Если НЕ НаборыЗаписываются Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверные параметры. - |Тип объекта ""%1"" - |не найден в подписке на события - |""Записать наборы значений доступа"".'"), - ТипЗначенияОбъект)); - КонецЕсли; - - Если Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип.Типы().Найти(ТипЗнч(СсылкаНаОбъект)) = Неопределено Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при записи наборов значений доступа: - |в регистре сведений НаборыЗначенийДоступа в измерении Объект - |не задан тип %1'"), - СсылкаНаОбъект.Метаданные().ПолноеИмя())); - КонецЕсли; - - Если СсылкаНаОбъект.Метаданные().ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда - // Изменение объекта не требуется - УправлениеДоступомСлужебный.ЗаписатьНаборыЗначенийДоступа(Объект); - Иначе - // Изменение объекта требуется - Таблица = УправлениеДоступомСлужебный.ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект); - - Если УправлениеДоступомСлужебный.НаборыЗначенийДоступаТабличнойЧастиИзменены( - СсылкаНаОбъект, Таблица) Тогда - - Объект.ОбменДанными.Загрузка = Истина; - Объект.ДополнительныеСвойства.Вставить("ЗаписатьНаборыЗначенийДоступа"); - Объект.ДополнительныеСвойства.Вставить("ЗаписатьЗависимыеНаборыЗначенийДоступа"); - Объект.ДополнительныеСвойства.Вставить("НаборыЗначенийДоступаТабличнойЧастиЗаполнены"); - Объект.НаборыЗначенийДоступа.Загрузить(Таблица); - Объект.Записать(); - КонецЕсли; - КонецЕсли; + УправлениеДоступомСлужебный.ОбновитьНаборыЗначенийДоступа(СсылкаНаОбъект); КонецПроцедуры @@ -1858,8 +1041,9 @@ И Объект.ДополнительныеСвойства.Свойство( "НаборыЗначенийДоступаТабличнойЧастиЗаполнены")) Тогда - Объект.НаборыЗначенийДоступа.Загрузить( - УправлениеДоступомСлужебный.ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект)); + Таблица = УправлениеДоступомСлужебный.ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект); + УправлениеДоступомСлужебный.ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, Таблица, Ложь); + Объект.НаборыЗначенийДоступа.Загрузить(Таблица); КонецЕсли; КонецПроцедуры @@ -1875,7 +1059,52 @@ // Чтобы добавить значение доступа нужно указать // полное имя предопределенного элемента, например, // "Справочник.ГруппыПользователей.ВсеПользователи". +// +// Идентификатор извлекается из реального элемента в справочнике. +// Не следует брать идентификаторы, полученные произвольным способом. +// +// Пример: // +// // Профиль "Пользователь". +// ОписаниеПрофиля = УправлениеДоступом.НовоеОписаниеПрофиляГруппДоступа(); +// ОписаниеПрофиля.Имя = "Пользователь"; +// ОписаниеПрофиля.Идентификатор = "09e56dbf-90a0-11de-862c-001d600d9ad2"; +// ОписаниеПрофиля.Наименование = НСтр("ru = 'Пользователь'"); +// ОписаниеПрофиля.Описание = +// НСтр("ru = 'Общие разрешенные действия для большинства пользователей. +// |Как правило, это права на просмотр данных информационной системы.'"); +// // Использование 1С:Предприятия. +// ОписаниеПрофиля.Роли.Добавить("ЗапускТонкогоКлиента"); +// ОписаниеПрофиля.Роли.Добавить("ВыводНаПринтерФайлБуферОбмена"); +// ОписаниеПрофиля.Роли.Добавить("СохранениеДанныхПользователя"); +// // ... +// // Использование программы. +// ОписаниеПрофиля.Роли.Добавить("БазовыеПрава"); +// ОписаниеПрофиля.Роли.Добавить("ПросмотрОписанияИзмененийПрограммы"); +// ОписаниеПрофиля.Роли.Добавить("ИзменениеТекущегоПользователя"); +// // ... +// // Использование НСИ. +// ОписаниеПрофиля.Роли.Добавить("ЧтениеБазовойНСИ"); +// // ... +// // Типовые возможности. +// ОписаниеПрофиля.Роли.Добавить("ИспользованиеВариантовОтчетов"); +// ОписаниеПрофиля.Роли.Добавить("ИспользованиеСтруктурыПодчиненности"); +// // ... +// // Основные возможности профиля. +// ОписаниеПрофиля.Роли.Добавить("ИспользованиеЗаметок"); +// ОписаниеПрофиля.Роли.Добавить("ИспользованиеНапоминаний"); +// ОписаниеПрофиля.Роли.Добавить("ДобавлениеИзменениеЗаданий"); +// ОписаниеПрофиля.Роли.Добавить("ИзменениеВыполнениеЗадач"); +// // ... +// // Виды ограничения доступа профиля. +// ОписаниеПрофиля.ВидыДоступа.Добавить("Организации"); +// ОписаниеПрофиля.ВидыДоступа.Добавить("Пользователи", "Предустановленный"); +// ОписаниеПрофиля.ВидыДоступа.Добавить("ХозяйственныеОперации", "Предустановленный"); +// ОписаниеПрофиля.ЗначенияДоступа.Добавить("ХозяйственныеОперации", +// "Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчет"); +// // ... +// ОписанияПрофилей.Добавить(ОписаниеПрофиля); +// Функция НовоеОписаниеПрофиляГруппДоступа() Экспорт НовоеОписание = Новый Структура; @@ -1892,6 +1121,35 @@ КонецФункции +// Добавляет дополнительные типы в процедуре ПриЗаполненииВидовДоступа. +// +// Параметры: +// ВидДоступа - СтрокаТаблицыЗначений, добавленная в параметр ВидыДоступа. +// ТипЗначений - Тип - дополнительный тип значений доступа. +// ТипГруппЗначений - Тип - дополнительный тип групп значений доступа, +// может совпадать с типом групп значений указанным ранее +// для этого же вида доступа. +// НесколькоГруппЗначений - Булево - Истина, если у дополнительного типа значений доступа +// можно указать несколько групп значений (есть табличная часть ГруппыДоступа). +// +Процедура ДобавитьДополнительныеТипыВидаДоступа(ВидДоступа, ТипЗначений, + ТипГруппЗначений = Неопределено, НесколькоГруппЗначений = Ложь) Экспорт + + ДополнительныеТипы = ВидДоступа.ДополнительныеТипы; + + Если ДополнительныеТипы.Колонки.Количество() = 0 Тогда + ДополнительныеТипы.Колонки.Добавить("ТипЗначений", Новый ОписаниеТипов("Тип")); + ДополнительныеТипы.Колонки.Добавить("ТипГруппЗначений", Новый ОписаниеТипов("Тип")); + ДополнительныеТипы.Колонки.Добавить("НесколькоГруппЗначений", Новый ОписаниеТипов("Булево")); + КонецЕсли; + + НоваяСтрока = ДополнительныеТипы.Добавить(); + НоваяСтрока.ТипЗначений = ТипЗначений; + НоваяСтрока.ТипГруппЗначений = ТипГруппЗначений; + НоваяСтрока.НесколькоГруппЗначений = НесколькоГруппЗначений; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые при обновлении информационной базы @@ -1906,6 +1164,190 @@ КонецФункции +// Возвращает пустую таблицу для заполнения и передачи +// в процедуру ЗаменитьПраваВНастройкахПравОбъектов. +// +Функция ТаблицаЗаменыПравВНастройкахПравОбъектов() Экспорт + + Измерения = Метаданные.РегистрыСведений.НастройкиПравОбъектов.Измерения; + + Таблица = Новый ТаблицаЗначений; + Таблица.Колонки.Добавить("ТипВладельцев", Измерения.Объект.Тип); + Таблица.Колонки.Добавить("СтароеИмя", Измерения.Право.Тип); + Таблица.Колонки.Добавить("НовоеИмя", Измерения.Право.Тип); + + Возврат Таблица; + +КонецФункции + +// Заменяет права, используемые в настройках прав объектов. +// После выполнения замены будет выполнено обновление вспомогательных данных +// регистра сведений НастройкиПравОбъектов, поэтому следует вызвать +// процедуру однократно, чтобы не снижать производительность. +// +// Параметры: +// ТаблицаЗамены - ТаблицаЗначений с колонками: +// ТипВладельцев - Пустая ссылка типа владельца прав, например пустая ссылка справочника ПапкиФайлов. +// СтароеИмя - Строка, старое имя права, относящееся к указанному типу владельцев. +// НовоеИмя - Строка, новое имя права, относящееся к указанному типу владельцев. +// Если указана пустая строка, настройка старого права будет удалена. +// Если старому имени поставлено в соответствие два новых имени, +// тогда настройка одна старая настройка будет размножена в две новых. +// +Процедура ЗаменитьПраваВНастройкахПравОбъектов(ТаблицаПереименований) Экспорт + + Запрос = Новый Запрос; + Запрос.Параметры.Вставить("ТаблицаПереименований", ТаблицаПереименований); + Запрос.Текст = + "ВЫБРАТЬ + | ТаблицаПереименований.ТипВладельцев, + | ТаблицаПереименований.СтароеИмя, + | ТаблицаПереименований.НовоеИмя + |ПОМЕСТИТЬ ТаблицаПереименований + |ИЗ + | &ТаблицаПереименований КАК ТаблицаПереименований + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НастройкиПрав.Объект, + | НастройкиПрав.Пользователь, + | НастройкиПрав.Право, + | МАКСИМУМ(НастройкиПрав.ПравоЗапрещено) КАК ПравоЗапрещено, + | МАКСИМУМ(НастройкиПрав.НаследованиеРазрешено) КАК НаследованиеРазрешено, + | МАКСИМУМ(НастройкиПрав.ПорядокНастройки) КАК ПорядокНастройки + |ПОМЕСТИТЬ СтарыеНастройкиПрав + |ИЗ + | РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав + | + |СГРУППИРОВАТЬ ПО + | НастройкиПрав.Объект, + | НастройкиПрав.Пользователь, + | НастройкиПрав.Право + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | СтарыеНастройкиПрав.Объект, + | СтарыеНастройкиПрав.Пользователь, + | ТаблицаПереименований.СтароеИмя, + | ТаблицаПереименований.НовоеИмя, + | СтарыеНастройкиПрав.ПравоЗапрещено, + | СтарыеНастройкиПрав.НаследованиеРазрешено, + | СтарыеНастройкиПрав.ПорядокНастройки + |ПОМЕСТИТЬ НастройкиПрав + |ИЗ + | СтарыеНастройкиПрав КАК СтарыеНастройкиПрав + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПереименований КАК ТаблицаПереименований + | ПО (ТИПЗНАЧЕНИЯ(СтарыеНастройкиПрав.Объект) = ТИПЗНАЧЕНИЯ(ТаблицаПереименований.ТипВладельцев)) + | И СтарыеНастройкиПрав.Право = ТаблицаПереименований.СтароеИмя + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НастройкиПрав.НовоеИмя + |ИЗ + | НастройкиПрав КАК НастройкиПрав + | + |СГРУППИРОВАТЬ ПО + | НастройкиПрав.Объект, + | НастройкиПрав.Пользователь, + | НастройкиПрав.НовоеИмя + | + |ИМЕЮЩИЕ + | НастройкиПрав.НовоеИмя <> """" И + | КОЛИЧЕСТВО(НастройкиПрав.НовоеИмя) > 1 + | + |ОБЪЕДИНИТЬ + | + |ВЫБРАТЬ + | НастройкиПрав.НовоеИмя + |ИЗ + | НастройкиПрав КАК НастройкиПрав + | ЛЕВОЕ СОЕДИНЕНИЕ СтарыеНастройкиПрав КАК СтарыеНастройкиПрав + | ПО НастройкиПрав.Объект = СтарыеНастройкиПрав.Объект + | И НастройкиПрав.Пользователь = СтарыеНастройкиПрав.Пользователь + | И НастройкиПрав.НовоеИмя = СтарыеНастройкиПрав.Право + |ГДЕ + | НЕ СтарыеНастройкиПрав.Право ЕСТЬ NULL + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ + | НастройкиПрав.Объект, + | НастройкиПрав.Пользователь, + | НастройкиПрав.СтароеИмя, + | НастройкиПрав.НовоеИмя, + | НастройкиПрав.ПравоЗапрещено, + | НастройкиПрав.НаследованиеРазрешено, + | НастройкиПрав.ПорядокНастройки + |ИЗ + | НастройкиПрав КАК НастройкиПрав"; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиПравОбъектов"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + РезультатыЗапроса = Запрос.ВыполнитьПакет(); + + ПовторяющиесяНовыеИмена = РезультатыЗапроса[РезультатыЗапроса.Количество()-2].Выгрузить(); + + Если ПовторяющиесяНовыеИмена.Количество() > 0 Тогда + ПовторяющиесяНовыеИменаПрав = ""; + Для каждого Строка Из ПовторяющиесяНовыеИмена Цикл + ПовторяющиесяНовыеИменаПрав = ПовторяющиесяНовыеИменаПрав + + ?(ЗначениеЗаполнено(ПовторяющиесяНовыеИменаПрав), "," + Символы.ПС, "") + + Строка.НовоеИмя; + КонецЦикла; + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в параметрах процедуры ПереименоватьПравоВНастройкахПравОбъектов + |общего модуля УправлениеДоступом. + | + |После обновления будут повторяться настройки следующих новых имен прав: + |%1.'"), + ПовторяющиесяНовыеИменаПрав); + КонецЕсли; + + ТаблицаЗамены = РезультатыЗапроса[РезультатыЗапроса.Количество()-1].Выгрузить(); + + НаборЗаписей = РегистрыСведений.НастройкиПравОбъектов.СоздатьНаборЗаписей(); + + Для каждого Строка Из ТаблицаЗамены Цикл + НаборЗаписей.Отбор.Объект.Установить(Строка.Объект); + НаборЗаписей.Отбор.Пользователь.Установить(Строка.Пользователь); + НаборЗаписей.Отбор.Право.Установить(Строка.СтароеИмя); + НаборЗаписей.Прочитать(); + Если НаборЗаписей.Количество() > 0 Тогда + НаборЗаписей.Очистить(); + НаборЗаписей.Записать(); + КонецЕсли; + КонецЦикла; + + НоваяЗапись = НаборЗаписей.Добавить(); + Для каждого Строка Из ТаблицаЗамены Цикл + Если Строка.НовоеИмя = "" Тогда + Продолжить; + КонецЕсли; + НаборЗаписей.Отбор.Объект.Установить(Строка.Объект); + НаборЗаписей.Отбор.Пользователь.Установить(Строка.Пользователь); + НаборЗаписей.Отбор.Право.Установить(Строка.НовоеИмя); + ЗаполнитьЗначенияСвойств(НоваяЗапись, Строка); + НоваяЗапись.Право = Строка.НовоеИмя; + НаборЗаписей.Записать(); + КонецЦикла; + + РегистрыСведений.НастройкиПравОбъектов.ОбновитьВспомогательныеДанныеРегистра(); + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции, используемые для обновления вспомогательных данных @@ -1914,60 +1356,17 @@ // Пользователи с ролью "ПолныеПрава" игнорируется. // // Параметры: -// Пользователи - СправочникСсылка.Пользователи, -// СправочникСсылка.ВнешниеПользователи. -// Массив значений указанных выше типов. -// - Неопределено - обновить роли всех пользователей. -// - Тип по которому будет найден объект метаданных: -// если будет найден Справочник.ВнешниеПользователи, -// то будут обновлены роли всех внешних пользователей, -// иначе будут обновлены роли всех пользователей. +// МассивПользователей - Массив, Неопределено, Тип - массив из +// элементов СправочникСсылка.Пользователи или СправочникСсылка.ВнешниеПользователи. +// Если Неопределено, то обновить роли всех пользователей. +// Если Тип = Справочник.ВнешниеПользователи, то будут обновлены роли всех внешних пользователей, +// иначе будут обновлены роли всех пользователей. // -// ПарольПользователяСервиса - Строка - Пароль для авторизации в менеджере -// сервиса +// ПарольПользователяСервиса - Строка - Пароль для авторизации в менеджере сервиса. // -Процедура ОбновитьРолиПользователей(Знач Пользователи1 = Неопределено, Знач ПарольПользователяСервиса = Неопределено) Экспорт +Процедура ОбновитьРолиПользователей(Знач МассивПользователей = Неопределено, Знач ПарольПользователяСервиса = Неопределено) Экспорт - УправлениеДоступомСлужебный.ОбновитьРолиПользователей(Пользователи1, ПарольПользователяСервиса); - -КонецПроцедуры - -// Перезаписывает группы значения доступа и виды доступа значения доступа -// в РегистрСведений.ГруппыЗначенийДоступа. -// -// Используется для начального заполнения иерархии папок файлов, -// например, когда ограничения по значениям доступа сделаны для старого -// справочника, который не ограничивался. Тогда требуется заполнить группы. -// -// Параметры: -// Ссылка - ссылка на значение доступа. -// -Процедура ЗаписатьГруппыИВидыДоступа(Знач ЗначениеДоступа) Экспорт - - Если ТипЗнч(ЗначениеДоступа) = Тип("СправочникОбъект.Пользователи") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникСсылка.Пользователи") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникОбъект.ВнешниеПользователи") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникСсылка.ВнешниеПользователи") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникОбъект.ГруппыПользователей") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникСсылка.ГруппыПользователей") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникОбъект.ГруппыВнешнихПользователей") - ИЛИ ТипЗнч(ЗначениеДоступа) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда - - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(); - Возврат; - КонецЕсли; - - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; - ВозможныеПраваПоЗначениямДоступа = Параметры.ВозможныеПраваПоЗначениямДоступа; - - Если ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗнч(ЗначениеДоступа)) <> Неопределено Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(ЗначениеДоступа); - КонецЕсли; - - Если ВозможныеПраваПоЗначениямДоступа.ПоТипам.Получить(ТипЗнч(ЗначениеДоступа)) <> Неопределено Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьИерархиюВладельцевНастроекПравОбъектов(ЗначениеДоступа); - КонецЕсли; + УправлениеДоступомСлужебный.ОбновитьРолиПользователей(МассивПользователей, ПарольПользователяСервиса); КонецПроцедуры @@ -1998,105 +1397,441 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// Устаревшие процедуры и функции для обратной совместимости, -// планируемые к удалению в новой редакции. +// Вспомогательные процедуры и функции -// Всегда возвращает Ложь (удаленный функционал). -Функция ДобавлятьРуководителямДоступПодчиненных() Экспорт +// Дополнение к процедуре ЗаполнитьНаборыЗначенийДоступа + +// Приводит таблицу наборов значений к формату табличной части или набора записей. +// Выполняется перед записью в регистр НаборыЗначенийДоступа или +// перед записью объекта с табличной частью НаборыЗначенийДоступа. +// +// Параметры: +// СсылкаНаОбъект - СправочникСсылка.*, ДокументСсылка.*, ... +// Таблица - РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа +// +Процедура УточнитьНаборыЗначенийДоступа(СсылкаНаОбъект, Таблица) - Возврат Ложь; + ИменаВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; + + ТипыВладельцевНастроекПрав = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; + + Для каждого Строка Из Таблица Цикл + + Если ТипыВладельцевНастроекПрав.Получить(ТипЗнч(Строка.ЗначениеДоступа)) <> Неопределено + И НЕ ЗначениеЗаполнено(Строка.Уточнение) Тогда + + Строка.Уточнение = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(СсылкаНаОбъект)); + КонецЕсли; + + Если Строка.ВидДоступа = "" Тогда + Продолжить; + КонецЕсли; + + Если Строка.ВидДоступа = "ПравоЧтения" + ИЛИ Строка.ВидДоступа = "ПравоИзменения" Тогда + + Если ТипЗнч(Строка.ЗначениеДоступа) <> Тип("СправочникСсылка.ИдентификаторыОбъектовМетаданных") Тогда + Строка.ЗначениеДоступа = + ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(Строка.ЗначениеДоступа)); + КонецЕсли; + + Если Строка.ВидДоступа = "ПравоЧтения" Тогда + Строка.Уточнение = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); + Иначе + Строка.Уточнение = Строка.ЗначениеДоступа; + КонецЕсли; + + ИначеЕсли ИменаВидовДоступа.Получить(Строка.ВидДоступа) <> Неопределено + ИЛИ Строка.ВидДоступа = "НастройкиПрав" Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект ""%1"" сформировал набор значений доступа, + |содержащий известный вид доступа ""%2"", который не требуется указывать. + | + |Указывать требуется только специальные виды доступа + |""ПравоЧтения"", ""ПравоИзменения"", если они используются.'"), + ТипЗнч(СсылкаНаОбъект), + Строка.ВидДоступа); + Иначе + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объект ""%1"" сформировал набор значений доступа, + |содержащий неизвестный вид доступа ""%2"".'"), + ТипЗнч(СсылкаНаОбъект), + Строка.ВидДоступа); + КонецЕсли; + + Строка.ВидДоступа = ""; + КонецЦикла; + +КонецПроцедуры + +// Дополнение к процедуре ДобавитьНаборыЗначенийДоступа + +Функция НаборыТаблицы(Таблица, НормализацияПрав = Ложь) + + НаборыТаблицы = Новый Соответствие; + + Для каждого Строка Из Таблица Цикл + Набор = НаборыТаблицы.Получить(Строка.НомерНабора); + Если Набор = Неопределено Тогда + Набор = Новый Структура; + Набор.Вставить("Чтение", Ложь); + Набор.Вставить("Изменение", Ложь); + Набор.Вставить("Строки", Новый Массив); + НаборыТаблицы.Вставить(Строка.НомерНабора, Набор); + КонецЕсли; + Если Строка.Чтение Тогда + Набор.Чтение = Истина; + КонецЕсли; + Если Строка.Изменение Тогда + Набор.Изменение = Истина; + КонецЕсли; + Набор.Строки.Добавить(Строка); + КонецЦикла; + + Если НормализацияПрав Тогда + Для каждого ОписаниеНабора Из НаборыТаблицы Цикл + Набор = ОписаниеНабора.Значение; + + Если НЕ Набор.Чтение И НЕ Набор.Изменение Тогда + Набор.Чтение = Истина; + Набор.Изменение = Истина; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат НаборыТаблицы; КонецФункции -// Не выполняет никаких действий. Следует удалить вызовы - вместо имен ролей -// используются ссылки справочника ИдентификаторыОбъектовМетаданных, для -// которых в случае переименования подсистем и ролей реализация вписывается -// в процедуру ЗаполнитьТаблицуПереименованияОбъектовМетаданных -// общего модуля ОбщегоНазначенияПереопределяемый. -// -Процедура ОбновитьПереименованныеРоли(ПереименованныеРоли) Экспорт +Процедура ДобавитьНаборы(Приемник, Источник) + + НаборыПриемника = НаборыТаблицы(Приемник); + НаборыИсточника = НаборыТаблицы(Источник); + + МаксимальныйНомерНабора = -1; + + Для каждого ОписаниеНабораПриемника Из НаборыПриемника Цикл + НаборПриемника = ОписаниеНабораПриемника.Значение; + + Если НЕ НаборПриемника.Чтение И НЕ НаборПриемника.Изменение Тогда + НаборПриемника.Чтение = Истина; + НаборПриемника.Изменение = Истина; + КонецЕсли; + + Для каждого Строка Из НаборПриемника.Строки Цикл + Строка.Чтение = НаборПриемника.Чтение; + Строка.Изменение = НаборПриемника.Изменение; + КонецЦикла; + + Если ОписаниеНабораПриемника.Ключ > МаксимальныйНомерНабора Тогда + МаксимальныйНомерНабора = ОписаниеНабораПриемника.Ключ; + КонецЕсли; + КонецЦикла; + + НомерНовогоНабора = МаксимальныйНомерНабора + 1; + + Для каждого ОписаниеНабораИсточника Из НаборыИсточника Цикл + НаборИсточника = ОписаниеНабораИсточника.Значение; + + Если НЕ НаборИсточника.Чтение И НЕ НаборИсточника.Изменение Тогда + НаборИсточника.Чтение = Истина; + НаборИсточника.Изменение = Истина; + КонецЕсли; + + Для каждого СтрокаИсточника Из НаборИсточника.Строки Цикл + НоваяСтрока = Приемник.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаИсточника); + НоваяСтрока.НомерНабора = НомерНовогоНабора; + НоваяСтрока.Чтение = НаборИсточника.Чтение; + НоваяСтрока.Изменение = НаборИсточника.Изменение; + КонецЦикла; + + НомерНовогоНабора = НомерНовогоНабора + 1; + КонецЦикла; КонецПроцедуры -// Не выполняет никаких действий. Следует удалить вызовы, а значения -// параметров, отличных от значений по умолчанию установить в параметре -// ПараметрыОбновления процедуры ЗаполнитьПоставляемыеПрофилиГруппДоступа -// общего модуля УправлениеДоступомПереопределяемый. -// -Процедура ОбновитьПоставляемыеПрофилиИГруппыДоступа(ТолькоНеИзмененные = Истина, - ОбновлятьГруппыДоступа = Истина, - УдаляемыеВидыДоступаБезНастройки = Истина) Экспорт +Процедура УмножитьНаборы(Приемник, Источник) + + НаборыПриемника = НаборыТаблицы(Приемник); + НаборыИсточника = НаборыТаблицы(Источник, Истина); + Таблица = ТаблицаНаборыЗначенийДоступа(); + + ТекущийНомерНабора = 1; + Для каждого ОписаниеНабораПриемника Из НаборыПриемника Цикл + НаборПриемника = ОписаниеНабораПриемника.Значение; + + Если НЕ НаборПриемника.Чтение И НЕ НаборПриемника.Изменение Тогда + НаборПриемника.Чтение = Истина; + НаборПриемника.Изменение = Истина; + КонецЕсли; + + Для каждого ОписаниеНабораИсточника Из НаборыИсточника Цикл + НаборИсточника = ОписаниеНабораИсточника.Значение; + + УмножениеЧтения = НаборПриемника.Чтение И НаборИсточника.Чтение; + УмножениеИзменения = НаборПриемника.Изменение И НаборИсточника.Изменение; + Если НЕ УмножениеЧтения И НЕ УмножениеИзменения Тогда + Продолжить; + КонецЕсли; + Для каждого СтрокаПриемника Из НаборПриемника.Строки Цикл + Строка = Таблица.Добавить(); + ЗаполнитьЗначенияСвойств(Строка, СтрокаПриемника); + Строка.НомерНабора = ТекущийНомерНабора; + Строка.Чтение = УмножениеЧтения; + Строка.Изменение = УмножениеИзменения; + КонецЦикла; + Для каждого СтрокаИсточника Из НаборИсточника.Строки Цикл + Строка = Таблица.Добавить(); + ЗаполнитьЗначенияСвойств(Строка, СтрокаИсточника); + Строка.НомерНабора = ТекущийНомерНабора; + Строка.Чтение = УмножениеЧтения; + Строка.Изменение = УмножениеИзменения; + КонецЦикла; + ТекущийНомерНабора = ТекущийНомерНабора + 1; + КонецЦикла; + КонецЦикла; + + Приемник = Таблица; КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Вспомогательные процедуры и функции - -Процедура ДобавитьНаборыДляПрава(Право, Параметры) +Процедура ДобавитьНаборыИУпростить(Приемник, Источник) - // Определение права, которое требуется проверить. - ВидДоступаПроверяемогоПрава = Неопределено; - // Определение наборов ограничения, которые требуется использовать. - НаборыОграничений = Неопределено; + НаборыПриемника = НаборыТаблицы(Приемник); + НаборыИсточника = НаборыТаблицы(Источник); - Если Параметры.ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Чтение" Тогда - НаборыОграничений = Параметры.НаборыЧтения; - ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения; - - ИначеЕсли Параметры.ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Добавление" Тогда - НаборыОграничений = Параметры.НаборыДобавления; - ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления; + НаборыРезультата = Новый Соответствие; + КодыТипов = Новый Соответствие; + КодыПеречислений = Новый Соответствие; + ТаблицаСтрокНабора = Новый ТаблицаЗначений; - ИначеЕсли Параметры.ЗависимостиПрав["ПриПроверкеПрава" + Право] = "Изменение" Тогда - НаборыОграничений = Параметры.НаборыИзменения; - ВидДоступаПроверяемогоПрава = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения; - КонецЕсли; + ЗаполнитьКодыТиповИТаблицуСтрокНабора(КодыТипов, КодыПеречислений, ТаблицаСтрокНабора); - Если Параметры.ЗависимостиПрав.ОтключитьПроверкуПравВедущейТаблицы Тогда - ВидДоступаПроверяемогоПрава = Неопределено; - КонецЕсли; + ТекущийНомерНабора = 1; - Если ВидДоступаПроверяемогоПрава <> Неопределено И НаборыОграничений <> Неопределено Тогда - - Строка = Параметры.НаборыПравДляУмножения.Добавить(); - Строка.НомерНабора = Параметры.НаборыПравДляУмножения.Количество(); - Строка.ВидДоступа = ВидДоступаПроверяемогоПрава; - Строка.ЗначениеДоступа = Параметры.СсылкаНаВедущийОбъект; - Строка[Право] = Истина; - - НовыеНаборы = НаборыОграничений.Скопировать(); - НовыеНаборы.ЗаполнитьЗначения(Истина, Право); - ДобавитьНаборыЗначенийДоступа(Параметры.НаборыОграниченийДляУмножения, НовыеНаборы); - - ИначеЕсли ВидДоступаПроверяемогоПрава <> Неопределено Тогда - - НовыеНаборы = Параметры.НаборыПравДляУмножения.Скопировать(); - НовыеНаборы.Очистить(); - Строка.НомерНабора = Параметры.НаборыПравДляУмножения.Количество(); - Строка.ВидДоступа = ВидДоступаПроверяемогоПрава; - Строка.ЗначениеДоступа = Параметры.СсылкаНаВедущийОбъект; - Строка[Право] = Истина; - ДобавитьНаборыЗначенийДоступа(Параметры.Таблица, НовыеНаборы); - - ИначеЕсли НаборыОграничений <> Неопределено Тогда - - НовыеНаборы = НаборыОграничений.Скопировать(); - НовыеНаборы.ЗаполнитьЗначения(Истина, Право); - ДобавитьНаборыЗначенийДоступа(Параметры.Таблица, НовыеНаборы); - - КонецЕсли; + ДобавитьНаборыКРезультатуСУпрощением( + НаборыРезультата, НаборыПриемника, ТекущийНомерНабора, КодыТипов, КодыПеречислений, ТаблицаСтрокНабора); + + ДобавитьНаборыКРезультатуСУпрощением( + НаборыРезультата, НаборыИсточника, ТекущийНомерНабора, КодыТипов, КодыПеречислений, ТаблицаСтрокНабора); + + ЗаполнитьПриемникПоНаборамРезультата(Приемник, НаборыРезультата); КонецПроцедуры +Процедура УмножитьНаборыИУпростить(Приемник, Источник) + + НаборыПриемника = НаборыТаблицы(Приемник); + НаборыИсточника = НаборыТаблицы(Источник, Истина); + + НаборыРезультата = Новый Соответствие; + КодыТипов = Новый Соответствие; + КодыПеречислений = Новый Соответствие; + ТаблицаСтрокНабора = Новый ТаблицаЗначений; + + ЗаполнитьКодыТиповИТаблицуСтрокНабора(КодыТипов, КодыПеречислений, ТаблицаСтрокНабора); + + ТекущийНомерНабора = 1; + + Для каждого ОписаниеНабораПриемника Из НаборыПриемника Цикл + НаборПриемника = ОписаниеНабораПриемника.Значение; + + Если НЕ НаборПриемника.Чтение И НЕ НаборПриемника.Изменение Тогда + НаборПриемника.Чтение = Истина; + НаборПриемника.Изменение = Истина; + КонецЕсли; + + Для каждого ОписаниеНабораИсточника Из НаборыИсточника Цикл + НаборИсточника = ОписаниеНабораИсточника.Значение; + + УмножениеЧтения = НаборПриемника.Чтение И НаборИсточника.Чтение; + УмножениеИзменения = НаборПриемника.Изменение И НаборИсточника.Изменение; + Если НЕ УмножениеЧтения И НЕ УмножениеИзменения Тогда + Продолжить; + КонецЕсли; + + СтрокиНабора = ТаблицаСтрокНабора.Скопировать(); + + Для каждого СтрокаПриемника Из НаборПриемника.Строки Цикл + Строка = СтрокиНабора.Добавить(); + Строка.ВидДоступа = СтрокаПриемника.ВидДоступа; + Строка.ЗначениеДоступа = СтрокаПриемника.ЗначениеДоступа; + Строка.Уточнение = СтрокаПриемника.Уточнение; + ЗаполнитьИдентификаторСтроки(Строка, КодыТипов, КодыПеречислений); + КонецЦикла; + Для каждого СтрокаИсточника Из НаборИсточника.Строки Цикл + Строка = СтрокиНабора.Добавить(); + Строка.ВидДоступа = СтрокаИсточника.ВидДоступа; + Строка.ЗначениеДоступа = СтрокаИсточника.ЗначениеДоступа; + Строка.Уточнение = СтрокаИсточника.Уточнение; + ЗаполнитьИдентификаторСтроки(Строка, КодыТипов, КодыПеречислений); + КонецЦикла; + + СтрокиНабора.Свернуть("ИдентификаторСтроки, ВидДоступа, ЗначениеДоступа, Уточнение"); + СтрокиНабора.Сортировать("ИдентификаторСтроки"); + + ИдентификаторНабора = ""; + Для каждого Строка Из СтрокиНабора Цикл + ИдентификаторНабора = ИдентификаторНабора + Строка.ИдентификаторСтроки + Символы.ПС; + КонецЦикла; + + СуществующийНабор = НаборыРезультата.Получить(ИдентификаторНабора); + Если СуществующийНабор = Неопределено Тогда + + СвойстваНабора = Новый Структура; + СвойстваНабора.Вставить("Чтение", УмножениеЧтения); + СвойстваНабора.Вставить("Изменение", УмножениеИзменения); + СвойстваНабора.Вставить("Строки", СтрокиНабора); + СвойстваНабора.Вставить("НомерНабора", ТекущийНомерНабора); + НаборыРезультата.Вставить(ИдентификаторНабора, СвойстваНабора); + ТекущийНомерНабора = ТекущийНомерНабора + 1; + Иначе + Если УмножениеЧтения Тогда + СуществующийНабор.Чтение = Истина; + КонецЕсли; + Если УмножениеИзменения Тогда + СуществующийНабор.Изменение = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ЗаполнитьПриемникПоНаборамРезультата(Приемник, НаборыРезультата); + +КонецПроцедуры + +Процедура ЗаполнитьКодыТиповИТаблицуСтрокНабора(КодыТипов, КодыПеречислений, ТаблицаСтрокНабора) + + КодыПеречислений = УправлениеДоступомСлужебныйПовтИсп.КодыПеречислений(); + + КодыТипов = УправлениеДоступомСлужебныйПовтИсп.КодыТиповСсылок("ОпределяемыйТип.ЗначениеДоступа"); + + ДлинаКодаТипа = 0; + Для каждого КлючИЗначение Из КодыТипов Цикл + ДлинаКодаТипа = СтрДлина(КлючИЗначение.Значение); + Прервать; + КонецЦикла; + + ДлинаИдентификатораСтроки = + 20 // Строка имени вида доступа + + ДлинаКодаТипа + + 36 // Длина строкового представления уникального идентификатора (значения доступа) + + 36 // Длина строкового представления уникального идентификатора (уточнения) + + 6; // Место для разделителей + + ТаблицаСтрокНабора = Новый ТаблицаЗначений; + ТаблицаСтрокНабора.Колонки.Добавить("ИдентификаторСтроки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(ДлинаИдентификатораСтроки))); + ТаблицаСтрокНабора.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(20))); + ТаблицаСтрокНабора.Колонки.Добавить("ЗначениеДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + ТаблицаСтрокНабора.Колонки.Добавить("Уточнение", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); + +КонецПроцедуры + +Процедура ЗаполнитьИдентификаторСтроки(Строка, КодыТипов, КодыПеречислений) + + Если Строка.ЗначениеДоступа = Неопределено Тогда + ИдентификаторЗначенияДоступа = ""; + Иначе + ИдентификаторЗначенияДоступа = КодыПеречислений.Получить(Строка.ЗначениеДоступа); + Если ИдентификаторЗначенияДоступа = Неопределено Тогда + ИдентификаторЗначенияДоступа = Строка(Строка.ЗначениеДоступа.УникальныйИдентификатор()); + КонецЕсли; + КонецЕсли; + + Строка.ИдентификаторСтроки = Строка.ВидДоступа + ";" + + КодыТипов.Получить(ТипЗнч(Строка.ЗначениеДоступа)) + ";" + + ИдентификаторЗначенияДоступа + ";" + + Строка.Уточнение.УникальныйИдентификатор() + ";"; + +КонецПроцедуры + +Процедура ДобавитьНаборыКРезультатуСУпрощением(НаборыРезультата, ДобавляемыеНаборы, ТекущийНомерНабора, КодыТипов, КодыПеречислений, ТаблицаСтрокНабора) + + Для каждого ОписаниеДобавляемогоНабора Из ДобавляемыеНаборы Цикл + ДобавляемыйНабор = ОписаниеДобавляемогоНабора.Значение; + + Если НЕ ДобавляемыйНабор.Чтение И НЕ ДобавляемыйНабор.Изменение Тогда + ДобавляемыйНабор.Чтение = Истина; + ДобавляемыйНабор.Изменение = Истина; + КонецЕсли; + + СтрокиНабора = ТаблицаСтрокНабора.Скопировать(); + + Для каждого СтрокаДобавляемогоНабора Из ДобавляемыйНабор.Строки Цикл + Строка = СтрокиНабора.Добавить(); + Строка.ВидДоступа = СтрокаДобавляемогоНабора.ВидДоступа; + Строка.ЗначениеДоступа = СтрокаДобавляемогоНабора.ЗначениеДоступа; + Строка.Уточнение = СтрокаДобавляемогоНабора.Уточнение; + ЗаполнитьИдентификаторСтроки(Строка, КодыТипов, КодыПеречислений); + КонецЦикла; + + СтрокиНабора.Свернуть("ИдентификаторСтроки, ВидДоступа, ЗначениеДоступа, Уточнение"); + СтрокиНабора.Сортировать("ИдентификаторСтроки"); + + ИдентификаторНабора = ""; + Для каждого Строка Из СтрокиНабора Цикл + ИдентификаторНабора = ИдентификаторНабора + Строка.ИдентификаторСтроки + Символы.ПС; + КонецЦикла; + + СуществующийНабор = НаборыРезультата.Получить(ИдентификаторНабора); + Если СуществующийНабор = Неопределено Тогда + + СвойстваНабора = Новый Структура; + СвойстваНабора.Вставить("Чтение", ДобавляемыйНабор.Чтение); + СвойстваНабора.Вставить("Изменение", ДобавляемыйНабор.Изменение); + СвойстваНабора.Вставить("Строки", СтрокиНабора); + СвойстваНабора.Вставить("НомерНабора", ТекущийНомерНабора); + НаборыРезультата.Вставить(ИдентификаторНабора, СвойстваНабора); + + ТекущийНомерНабора = ТекущийНомерНабора + 1; + Иначе + Если ДобавляемыйНабор.Чтение Тогда + СуществующийНабор.Чтение = Истина; + КонецЕсли; + Если ДобавляемыйНабор.Изменение Тогда + СуществующийНабор.Изменение = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры + +Функция ЗаполнитьПриемникПоНаборамРезультата(Приемник, НаборыРезультата) + + Приемник = ТаблицаНаборыЗначенийДоступа(); + + Для каждого ОписаниеНабора Из НаборыРезультата Цикл + СвойстваНабора = ОписаниеНабора.Значение; + Для каждого Строка Из СвойстваНабора.Строки Цикл + НоваяСтрока = Приемник.Добавить(); + НоваяСтрока.НомерНабора = СвойстваНабора.НомерНабора; + НоваяСтрока.ВидДоступа = Строка.ВидДоступа; + НоваяСтрока.ЗначениеДоступа = Строка.ЗначениеДоступа; + НоваяСтрока.Уточнение = Строка.Уточнение; + НоваяСтрока.Чтение = СвойстваНабора.Чтение; + НоваяСтрока.Изменение = СвойстваНабора.Изменение; + КонецЦикла; + КонецЦикла; + +КонецФункции + +// Дополнение к процедурам: +// - ПриСозданииФормыЗначенияДоступа +// - ГруппыЗначенийДоступаРазрешающиеИзменениеЗначенийДоступа + Функция СвойстваГруппЗначенияДоступа(ТипЗначенияДоступа, ЗаголовокОшибки) УстановитьПривилегированныйРежим(Истина); СвойстваГрупп = Новый Структура; - СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + СвойстваВидаДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).СвойстваВидовДоступа.ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗначенияДоступа); - Если СвойстваВидовДоступа.ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗначенияДоступа) = Неопределено Тогда + Если СвойстваВидаДоступа = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ЗаголовокОшибки + Символы.ПС + Символы.ПС + НСтр("ru = 'Для значений доступа типа ""%1"" @@ -2104,40 +1839,14 @@ Строка(ТипЗначенияДоступа)); КонецЕсли; - ВидыДоступа = СвойстваВидовДоступа.ВидыДоступаЗначенийДоступа.ПоТипам.Получить(ТипЗначенияДоступа); + СвойстваГрупп.Вставить("ВидДоступа", СвойстваВидаДоступа.Имя); + СвойстваГрупп.Вставить("Тип", СвойстваВидаДоступа.ТипГруппЗначений); - Если ВидыДоступа.Количество() > 1 Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + Символы.ПС + Символы.ПС + - НСтр("ru = 'Для значений доступа типа ""%1"" - |используется более одного вида доступа.'"), - Строка(ТипЗначенияДоступа)); - КонецЕсли; + СвойстваГрупп.Вставить("Таблица", Метаданные.НайтиПоТипу( + СвойстваВидаДоступа.ТипГруппЗначений).ПолноеИмя()); - ВидДоступа = ВидыДоступа[0]; - - ОписаниеТипов = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидДоступа, "ТипЗначения"); - - Если ОписаниеТипов = Неопределено - ИЛИ ОписаниеТипов.Типы().Количество() <> 1 - ИЛИ НЕ ОбщегоНазначения.ЭтоСсылка(ОписаниеТипов.Типы()[0]) Тогда - - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ЗаголовокОшибки + Символы.ПС + Символы.ПС + - НСтр("ru = 'Для значений доступа типа ""%1"" - |используются вид доступа ""%2"", - |который не имеет единственного типа в - |плане видов характеристик ""Виды доступа"".'"), - Строка(ТипЗначенияДоступа), - Строка(ВидДоступа)); - КонецЕсли; - - ТипГруппЗначенийДоступа = ОписаниеТипов.Типы()[0]; - ТаблицаГруппЗначенийДоступа = Метаданные.НайтиПоТипу(ТипГруппЗначенийДоступа).ПолноеИмя(); - - СвойстваГрупп.Вставить("ВидДоступа", ВидДоступа); - СвойстваГрупп.Вставить("Тип", ТипГруппЗначенийДоступа); - СвойстваГрупп.Вставить("Таблица", ТаблицаГруппЗначенийДоступа); + СвойстваГрупп.Вставить("ПустаяСсылкаТипаЗначений", + УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(ТипЗначенияДоступа)); Возврат СвойстваГрупп; diff --git a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl index 7cf76c2de..d14475a4c 100644 --- a/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомПереопределяемый/Module.bsl @@ -6,6 +6,26 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС +// Заполняет виды доступа, используемые в ограничениях прав доступа. +// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. +// Их можно удалить, если они не требуются для ограничения прав доступа. +// +// Параметры: +// ВидыДоступа - ТаблицаЗначений с полями: +// - Имя - Строка - имя используемое в описании поставляемых +// профилей групп доступа и текстах ОДД. +// - Представление - Строка - представляет вид доступа в профилях и группах доступа. +// - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). +// - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). +// - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), +// можно выбрать несколько групп значений (Групп доступа номенклатуры). +// +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт + + + +КонецПроцедуры + // Заполняет описания поставляемых профилей групп доступа и // переопределяет параметры обновления профилей и групп доступа. // @@ -33,47 +53,115 @@ // сделанные администратором по виду доступа, который удален из // профиля, будут удалены из группы доступа. // -Процедура ЗаполнитьПоставляемыеПрофилиГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт +Процедура ПриЗаполненииПоставляемыхПрофилейГруппДоступа(ОписанияПрофилей, ПараметрыОбновления) Экспорт КонецПроцедуры -// Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. +// Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, +// от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. +// +// Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект": +// 1) стандартно при чтении "подчиненного" объекта +// проверяется наличие права чтения "ведущего" объекта +// и проверяется отсутствие ограничения чтения "ведущего" объекта; +// 2) стандартно при добавлении, изменении, удалении "подчиненного" объекта +// проверяется наличие права изменения "ведущего" объекта +// и проверяется отсутствие ограничения изменения "ведущего" объекта. +// +// Допускается только одно переназначение по сравнению со стандартным: +// в пункте "2)" вместо проверки права изменения "ведущего" объекта установить +// проверку права чтения "ведущего" объекта. // // Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). +// ЗависимостиПрав - ТаблицаЗначений с колонками: +// - ВедущаяТаблица - Строка, например, "БизнесПроцесс.Задание" +// - ПодчиненнаяТаблица - Строка, например, "Задача.ЗадачаИсполнителя" // -Процедура ЗаполнитьСвойстваВидаДоступа(Знач Свойства) Экспорт +Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт КонецПроцедуры -// Заполняет использование видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. -// -// Параметры: -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа. -// Использование - Булево (возвращаемое значение). Начальное значение Истина. -// -Процедура ЗаполнитьИспользованиеВидаДоступа(Знач ВидДоступа, Использование) Экспорт - - - -КонецПроцедуры - -// Заполняет описания возможных прав, назначаемых по значениям доступа. +// Заполняет описания возможных прав, назначаемых для объектов, указанных типов. // // Параметры: // ВозможныеПрава - ТаблицаЗначений, содержащая поля, // описание которых см. в комментарии к функции -// РегистрыСведений.ПраваПоЗначениямДоступа.ВозможныеПрава(). +// РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). // -Процедура ЗаполнитьВозможныеПраваПоЗначениямДоступа(Знач ВозможныеПрава) Экспорт +Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(ВозможныеПрава) Экспорт + + + +КонецПроцедуры + +// Определяет вид используемого интерфейса пользователя для настройки доступа. +// +// Упрощенный интерфейс удобен для конфигураций с небольшим количеством пользователей, +// так как много функций не требуются и они могут быть скрыты (скрытие не может быть +// выполнено только лишь функциональной опцией, так как потребуется пересмотр +// содержимого групп доступа и профилей). +// +// Параметры: +// УпрощенныйИнтерфейс - Булево (возвращаемое значение). Начальное значение Ложь. +// +Процедура ПриОпределенииИнтерфейсаНастройкиДоступа(УпрощенныйИнтерфейс) Экспорт + + + +КонецПроцедуры + +// Заполняет использование видов доступа в зависимости от функциональных опций конфигурации, +// например, ИспользоватьГруппыДоступаНоменклатуры. +// +// Параметры: +// ВидДоступа - Строка. Имя вида доступа заданное в процедуре ПриЗаполненииВидовДоступа. +// Использование - Булево (возвращаемое значение). Начальное значение Истина. +// +Процедура ПриЗаполненииИспользованияВидаДоступа(ИмяВидаДоступа, Использование) Экспорт + + + +КонецПроцедуры + +// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. +// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. +// +// Обязательно требуется заполнить только виды доступа, используемые +// в шаблонах ограничения доступа явно, а виды доступа, используемые +// в наборах значений доступа могут быть получены из текущего состояния +// регистра сведений НаборыЗначенийДоступа. +// +// Для автоматической подготовки содержимого процедуры следует +// воспользоваться инструментами разработчика для подсистемы +// Управление доступом. +// +// Параметры: +// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] +// Например, Документ.ПриходнаяНакладная.Чтение.Организации +// Документ.ПриходнаяНакладная.Чтение.Контрагенты +// Документ.ПриходнаяНакладная.Изменение.Организации +// Документ.ПриходнаяНакладная.Изменение.Контрагенты +// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма +// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма +// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов +// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо +// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов +// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо +// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в +// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому +// ограничивается текущий объект таблицы. +// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, +// которые используются для этого вида доступа. Т.е. перечислить типы, +// которые соответствуют полю, использованному в шаблоне ограничения доступа +// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" +// нужно перечислить только те типы поля, которые есть у поля +// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. +// +Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт @@ -93,100 +181,7 @@ // Содержит ссылки на объекты с зависимыми наборами значений доступа // Начальное значение - пустой массив. // -Процедура ПриИзмененииНаборовЗначенийДоступа(Знач Ссылка, СсылкиНаЗависимыеОбъекты) Экспорт - - - -КонецПроцедуры - -// Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, -// от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. -// -// Зависимости прав используются в стандартном шаблоне ограничения доступа для вида доступа "Объект": -// 1) стандартно при чтении "подчиненного" объекта -// проверяется наличие права чтения "ведущего" объекта -// и проверяется отсутствие ограничения чтения "ведущего" объекта; -// 2) стандартно при добавлении, изменении, удалении "подчиненного" объекта -// проверяется наличие права изменения "ведущего" объекта -// и проверяется отсутствие ограничения изменения "ведущего" объекта. -// -// Параметры: -// Таблица - РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа. -// Допустимые значения ресурсов: -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения", -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления", -// "ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения". -// -// Если задано недопустимое значение, будет установлено значение по умолчанию: -// для права Чтение - ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения, -// для прав Добавление, Изменение, Удаление - ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения. -// -// Следует иметь в виду, что обычная "жесткость" условия ограничения доступа -// уменьшается в порядке "Добавление", "Изменение", "Чтение", -// Т.е. то, что можно добавить, можно и изменить и прочитать, -// соответственно, то что можно изменить можно и прочитать, но не наоборот. -// -Процедура ЗаполнитьЗависимостиПравДоступа(Знач Таблица) Экспорт - - - -КонецПроцедуры - -// Возвращает вид используемого интерфейса для настройки прав доступа. -// -// Упрощенный интерфейс удобен для конфигураций с небольшим количеством пользователей, -// так как много функций не требуются и они могут быть скрыты (скрытие не может быть -// выполнено только лишь функциональной опцией, так как потребуется пересмотр -// содержимого групп доступа и профилей). -// -// Возвращаемое значение: -// Булево -// -Функция УпрощенныйИнтерфейсНастройкиПравДоступа() Экспорт - - Возврат Ложь; - -КонецФункции - -// Заполняет состав видов доступа, используемых при ограничении прав объектов метаданных. -// Если состав видов доступа не заполнен, отчет "Права доступа" покажет некорректные сведения. -// -// Обязательно требуется заполнить только виды доступа, используемые -// в шаблонах ограничения доступа явно, а виды доступа, используемые -// в наборах значений доступа могут быть получены из текущего состояния -// регистра сведений НаборыЗначенийДоступа. -// -// Для автоматической подготовки содержимого процедуры следует -// воспользоваться инструментами разработчика для подсистемы -// Управление доступом. -// -// Параметры: -// Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] -// Например, Документ.ПриходнаяНакладная.Чтение.Организации -// Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты -// Документ.ПриходнаяНакладная.Изменение.Организации -// Документ.ПриходнаяНакладная.Изменение.Контрагенты -// Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма -// Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. -// -Процедура ЗаполнитьВидыОграниченийПравОбъектовМетаданных(Описание) Экспорт +Процедура ПриИзмененииНаборовЗначенийДоступа(Ссылка, СсылкиНаЗависимыеОбъекты) Экспорт diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl index 5a9b9c453..1ff92875e 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебный/Module.bsl @@ -12,10 +12,10 @@ // Объявляет события подсистемы УправлениеДоступом: // // Серверные события: -// ПриЗаполненииВозможныхПравПоЗначениямДоступа, +// ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов, // ПриЗаполненииЗависимостейПравДоступа, // ПриЗаполненииВидовОграниченийПравОбъектовМетаданных, -// ПриЗаполненииСвойствВидаДоступа, +// ПриЗаполненииВидовДоступа, // ПриЗаполненииПоставляемыхПрофилейГруппДоступа, // ПриЗаполненииИспользованияВидаДоступа, // ПриИзмененииНаборовЗначенийДоступа, @@ -25,19 +25,19 @@ // СЕРВЕРНЫЕ СОБЫТИЯ. - // Заполняет описания возможных прав, назначаемых по значениям доступа. + // Заполняет описания возможных прав, назначаемых для объектов, указанных типов. // // Параметры: // ВозможныеПрава - ТаблицаЗначений, содержащая поля, // описание которых см. в комментарии к функции - // РегистрыСведений.ПраваПоЗначениямДоступа.ВозможныеПрава(). + // РегистрыСведений.НастройкиПравОбъектов.ВозможныеПрава(). // // Синтаксис: - // Процедура ПриЗаполненииВозможныхПравПоЗначениямДоступа(Знач ВозможныеПрава) Экспорт + // Процедура ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов(Знач ВозможныеПрава) Экспорт // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьВозможныеПраваПоЗначениямДоступа). + // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов). // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравПоЗначениямДоступа"); + СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВозможныхПравДляНастройкиПравОбъектов"); // Заполняет зависимости прав доступа "подчиненного" объекта, например, задачи ЗадачаИсполнителя, // от "ведущего" объекта, например, бизнес-процесса Задание, которые отличаются от стандартных. @@ -50,26 +50,19 @@ // проверяется наличие права изменения "ведущего" объекта // и проверяется отсутствие ограничения изменения "ведущего" объекта. // - // Параметры: - // Таблица - РегистрСведенийНаборЗаписей.ЗависимостиПравДоступа. - // Допустимые значения ресурсов: - // "ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения", - // "ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления", - // "ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения". + // Допускается только одно переназначение по сравнению со стандартным: + // в пункте "2)" вместо проверки права изменения "ведущего" объекта установить + // проверку права чтения "ведущего" объекта. // - // Если задано недопустимое значение, будет установлено значение по умолчанию: - // для права Чтение - ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения, - // для прав Добавление, Изменение, Удаление - ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения. - // - // Следует иметь в виду, что обычная "жесткость" условия ограничения доступа - // уменьшается в порядке "Добавление", "Изменение", "Чтение", - // Т.е. то, что можно добавить, можно и изменить и прочитать, - // соответственно, то что можно изменить можно и прочитать, но не наоборот. + // Параметры: + // ЗависимостиПрав - ТаблицаЗначений с колонками: + // - ВедущаяТаблица - Строка, например, "БизнесПроцесс.Задание" + // - ПодчиненнаяТаблица - Строка, например, "Задача.ЗадачаИсполнителя" // // Синтаксис: - // Процедура ПриЗаполненииЗависимостейПравДоступа(Знач Таблица) Экспорт + // Процедура ПриЗаполненииЗависимостейПравДоступа(ЗависимостиПрав) Экспорт // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьЗависимостиПравДоступа). + // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииЗависимостейПравДоступа). // СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииЗависимостейПравДоступа"); @@ -89,49 +82,51 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты - // Документ.ПриходнаяНакладная.Добавление.Организации - // Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма - // Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо - // Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов - // Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо - // Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах - // ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, - // как "ссылка" на другой объект, по которому ограничивается таблица. - // Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются - // для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, - // использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". - // При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, - // которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. + // Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в + // шаблонах ограничений доступа, как "ссылка" на другой объект, по которому + // ограничивается текущий объект таблицы. + // Когда вид доступа "Объект" задан, также требуется задать типы таблиц, + // которые используются для этого вида доступа. Т.е. перечислить типы, + // которые соответствуют полю, использованному в шаблоне ограничения доступа + // в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" + // нужно перечислить только те типы поля, которые есть у поля + // РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. // // Синтаксис: // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьВидыОграниченийПравОбъектовМетаданных). + // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных). // СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"); - // Заполняет свойства видов доступа, добавленных прикладным разработчиком - // в план видов характеристик ВидыДоступа, как предопределенные элементы. + // Заполняет виды доступа, используемые в ограничениях прав доступа. + // Виды доступа Пользователи и ВнешниеПользователи уже заполнены. + // Их можно удалить, если они не требуются для ограничения прав доступа. // // Параметры: - // Свойства - Структура со свойствами, - // описание которых см. в комментарии к функции - // ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). + // ВидыДоступа - ТаблицаЗначений с полями: + // - Имя - Строка - имя используемое в описании поставляемых + // профилей групп доступа и текстах ОДД. + // - Представление - Строка - представляет вид доступа в профилях и группах доступа. + // - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). + // - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). + // - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), + // можно выбрать несколько групп значений (Групп доступа номенклатуры). // // Синтаксис: - // Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт + // Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьСвойстваВидаДоступа). + // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа). // - СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"); + СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"); // Заполняет описания поставляемых профилей групп доступа и // переопределяет параметры обновления профилей и групп доступа. @@ -167,17 +162,17 @@ // СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииПоставляемыхПрофилейГруппДоступа"); - // Заполняет использование видов доступа, добавленных прикладным разработчиком - // в план видов характеристик ВидыДоступа, как предопределенные элементы. + // Заполняет использование видов доступа в зависимости от функциональных опций конфигурации, + // например, ИспользоватьГруппыДоступаНоменклатуры. // // Параметры: - // ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа. + // ВидДоступа - Строка. Имя вида доступа заданное в процедуре ПриЗаполненииВидовДоступа. // Использование - Булево (возвращаемое значение). Начальное значение Истина. - // + // // Синтаксис: - // Процедура ПриЗаполненииИспользованияВидаДоступа(Знач ВидДоступа, Использование) Экспорт + // Процедура ПриЗаполненииИспользованияВидаДоступа(ИмяВидаДоступа, Использование) Экспорт // - // (То же, что УправлениеДоступомПереопределяемый.ЗаполнитьИспользованиеВидаДоступа). + // (То же, что УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа). // СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"); @@ -202,6 +197,17 @@ // СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриИзмененииНаборовЗначенийДоступа"); + // Вызывается при обновлении ролей пользователя информационной базы. + // + // Параметры: + // ИдентификаторПользователяИБ - УникальныйИдентификатор, + // Отказ - Булево. При установке значения параметра в значение Ложь внутри обработчика события + // обновление ролей для этого пользователя информационной базы будет пропущено. + // + // Синтаксис: + // Процедура ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ) Экспорт + СерверныеСобытия.Добавить("СтандартныеПодсистемы.УправлениеДоступом\ПриОбновленииРолейПользователяИБ"); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -245,9 +251,10 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( "УправлениеДоступомСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных") Тогда - СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ВыгрузкаЗагрузкаДанных\ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных"].Добавить( - "УправлениеДоступомСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( + "УправлениеДоступомСлужебный"); КонецЕсли; // Добавление обработчиков событий подсистемы Пользователи. @@ -347,151 +354,139 @@ Если НЕ Константы.ОграничиватьДоступНаУровнеЗаписей.Получить() Тогда // Для корректной работы препроцессора в ограничениях доступа, требуется инициализации всех // параметров сеанса, которые могут быть востребованы в работе препроцессора. - Если ИмяПараметра = "ВидыДоступаЕдинственныеДляТипаЗначенияДоступа" ИЛИ - ИмяПараметра = "ВидыДоступаБезГруппЗначенияДоступа" Тогда - ПараметрыСеанса[ИмяПараметра] = Новый ФиксированныйМассив(Новый Массив); - Иначе - ПараметрыСеанса[ИмяПараметра] = ""; - КонецЕсли; - УстановленныеПараметры.Добавить(ИмяПараметра); + ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ""; + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = ""; + ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = ""; + ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = ""; + + ПараметрыСеанса.ТипыЗначенийДоступаСГруппами + = Новый ФиксированныйМассив(Новый Массив); + + ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ""; + + ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав + = Новый ФиксированныйМассив(Новый Массив); + + ПараметрыСеанса.ТипыВладельцевНастроекПрав + = Новый ФиксированныйМассив(Новый Массив); + + УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); + УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); + УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); + УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); Возврат; КонецЕсли; - // Следующие виды доступа не самостоятельные, - // поэтому не учитываются при расчете необходимости ограничения в целом. - // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, - // а в препроцессоре проверка использования не выполнятся. - ПараметрыСеанса.ОграничиватьДоступПоВидуУсловие = ""; - ПараметрыСеанса.ОграничиватьДоступПоВидуОбъект = ""; - УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуУсловие"); - УстановленныеПараметры.Добавить("ОграничиватьДоступПоВидуОбъект"); - Запрос = Новый Запрос; Запрос.УстановитьПараметр("ТекущийПользователь", Пользователи.АвторизованныйПользователь()); Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ - | ВидыДоступаПрофилейГруппДоступа.ВидДоступа + | ЗначенияПоУмолчанию.ТипЗначенийДоступа КАК ТипЗначений, + | ЗначенияПоУмолчанию.БезНастройки КАК БезНастройки + |ПОМЕСТИТЬ ЗначенияПоУмолчаниюДляПользователя |ИЗ - | Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ВидыДоступаПрофилейГруппДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа - | ПО (ГруппыДоступа.Профиль = ВидыДоступаПрофилейГруппДоступа.Ссылка) - | И (НЕ ВидыДоступаПрофилейГруппДоступа.Ссылка.ПометкаУдаления) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - | ПО (ГруппыДоступа.Ссылка = ГруппыДоступаПользователи.Ссылка) - | И (НЕ ГруппыДоступа.ПометкаУдаления) - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей - | ПО (СоставыГруппПользователей.Пользователь = &ТекущийПользователь) - | И (СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь) - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ЗначенияДоступаПрофилейГруппДоступа - | ПО (ЗначенияДоступаПрофилейГруппДоступа.Ссылка = ГруппыДоступа.Ссылка) - | И (ЗначенияДоступаПрофилейГруппДоступа.ВидДоступа = ВидыДоступаПрофилейГруппДоступа.ВидДоступа) - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ВидыДоступа КАК ВидыДоступаГруппДоступа - | ПО (ВидыДоступаГруппДоступа.Ссылка = ГруппыДоступа.Ссылка) - | И (ВидыДоступаГруппДоступа.ВидДоступа = ВидыДоступаПрофилейГруппДоступа.ВидДоступа) - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ЗначенияДоступаГруппДоступа - | ПО (ЗначенияДоступаГруппДоступа.Ссылка = ГруппыДоступа.Ссылка) - | И (ЗначенияДоступаГруппДоступа.ВидДоступа = ВидыДоступаПрофилейГруппДоступа.ВидДоступа) + | РегистрСведений.ЗначенияГруппДоступаПоУмолчанию КАК ЗначенияПоУмолчанию |ГДЕ - | НЕ(НЕ(ВидыДоступаПрофилейГруппДоступа.Предустановленный - | И НЕ ВидыДоступаПрофилейГруппДоступа.ДоступРазрешен) - | И ЗначенияДоступаПрофилейГруппДоступа.ВидДоступа ЕСТЬ NULL - | И ЕСТЬNULL(ВидыДоступаГруппДоступа.ДоступРазрешен, ИСТИНА) - | И ЗначенияДоступаГруппДоступа.ВидДоступа ЕСТЬ NULL )"; - ОграничиваемыеВидыДоступа = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ВидДоступа"); - - Запрос = Новый Запрос( - "ВЫБРАТЬ - | ВидыДоступа.Ссылка КАК ВидДоступа, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных + | ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей + | ПО + | ГруппыДоступаПользователи.Ссылка = ЗначенияПоУмолчанию.ГруппаДоступа + | И ГруппыДоступаПользователи.Пользователь = СоставыГруппПользователей.ГруппаПользователей + | И СоставыГруппПользователей.Пользователь = &ТекущийПользователь) + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗЛИЧНЫЕ + | ЗначенияПоУмолчанию.ТипЗначений |ИЗ - | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа - |ГДЕ - | ВидыДоступа.Предопределенный = ИСТИНА"); - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ВидыДоступа.ИмяПредопределенныхДанных"); - КонецЕсли; - Выборка = Запрос.Выполнить().Выбрать(); + | ЗначенияПоУмолчаниюДляПользователя КАК ЗначенияПоУмолчанию + | + |СГРУППИРОВАТЬ ПО + | ЗначенияПоУмолчанию.ТипЗначений + | + |ИМЕЮЩИЕ + | МИНИМУМ(ЗначенияПоУмолчанию.БезНастройки) = ИСТИНА"; - КаждыйВидЕдинственный = Истина; - КаждыйВидБезГрупп = Истина; + ТипыЗначенийБезНастройки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ТипЗначений"); - ВидыДоступаБезОграничения = Новый Массив; - ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый Массив; - ВидыДоступаБезГруппЗначенияДоступа = Новый Массив; - ВидыДоступаЧерезПраваПоЗначениямДоступа = Новый Массив; + // Установка параметров ВсеВидыДоступаКромеСпециальных, ВидыДоступаСОтключеннымИспользованием. + ВсеВидыДоступаКромеСпециальных = Новый Массив; + ВидыДоступаСОтключеннымИспользованием = Новый Массив; - Пока Выборка.Следующий() Цикл + Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + + Для каждого СвойстваВидаДоступа Из Параметры.СвойстваВидовДоступа.Массив Цикл + ВсеВидыДоступаКромеСпециальных.Добавить(СвойстваВидаДоступа.Имя); - СвойстваВидаДоступа = СвойстваВидаДоступа(Выборка.ВидДоступа); - - Если СвойстваВидаДоступа.ВидДоступаИспользуетсяВсегда Тогда - // Такие виды доступа не самостоятельные, поэтому не учитываются при расчете - // необходимости ограничения в целом. - // В стандартных шаблонах проверка по этим видам доступа всегда выполняется, - // а в препроцессоре проверка использования не выполнятся. - ОписаниеВидаДоступа = ""; + Если НЕ ВидДоступаИспользуется(СвойстваВидаДоступа.Ссылка) + ИЛИ ТипыЗначенийБезНастройки.Найти(СвойстваВидаДоступа.Ссылка) <> Неопределено Тогда - ИначеЕсли НЕ ВидДоступаИспользуется(Выборка.ВидДоступа) Тогда - ОписаниеВидаДоступа = ""; - ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); - - ИначеЕсли ОграничиваемыеВидыДоступа.Найти(Выборка.ВидДоступа) = Неопределено Тогда - ОписаниеВидаДоступа = ""; - ВидыДоступаБезОграничения.Добавить(Выборка.ВидДоступа); - - ИначеЕсли СвойстваВидаДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа Тогда - ОписаниеВидаДоступа = "ЧерезПраваПоЗначениямДоступа"; - ВидыДоступаЧерезПраваПоЗначениямДоступа.Добавить(Выборка.ВидДоступа); - Иначе - Если СвойстваВидаДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа Тогда - ОписаниеВидаДоступа = "ЕдинственныйВид, "; - ВидыДоступаЕдинственныеДляТипаЗначенияДоступа.Добавить(Выборка.ВидДоступа); - Иначе - ОписаниеВидаДоступа = "ОдинИзМногихВидов,"; - КаждыйВидЕдинственный = Ложь; - КонецЕсли; - Если СвойстваВидаДоступа.ВидДоступаБезГруппЗначенияДоступа Тогда - ОписаниеГрупп = "БезГрупп"; - ВидыДоступаБезГруппЗначенияДоступа.Добавить(Выборка.ВидДоступа); - Иначе - ОписаниеГрупп = ?(СвойстваВидаДоступа.ВидДоступаСОднойГруппойЗначенияДоступа, "ОднаГруппа", "МножествоГрупп"); - КаждыйВидБезГрупп = Ложь; - КонецЕсли; - ОписаниеВидаДоступа = ОписаниеВидаДоступа + ОписаниеГрупп; + ВидыДоступаСОтключеннымИспользованием.Добавить(СвойстваВидаДоступа.Имя); КонецЕсли; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяВидаДоступа = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяВидаДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(Выборка.ВидДоступа); - КонецЕсли; - ПараметрыСеанса["ОграничиватьДоступПоВиду" + ИмяВидаДоступа] = ОписаниеВидаДоступа; - УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду" + ИмяВидаДоступа); КонецЦикла; - ПараметрыСеанса.ВидыДоступаБезОграничения = Новый ФиксированныйМассив(ВидыДоступаБезОграничения); - УстановленныеПараметры.Добавить("ВидыДоступаБезОграничения"); + ПараметрыСеанса.ВсеВидыДоступаКромеСпециальных = ВсеКомбинацииВидовДоступа(ВсеВидыДоступаКромеСпециальных); - ПараметрыСеанса.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаЕдинственныеДляТипаЗначенияДоступа); - УстановленныеПараметры.Добавить("ВидыДоступаЕдинственныеДляТипаЗначенияДоступа"); + УстановленныеПараметры.Добавить("ВсеВидыДоступаКромеСпециальных"); - ПараметрыСеанса.ВидыДоступаБезГруппЗначенияДоступа = Новый ФиксированныйМассив(ВидыДоступаБезГруппЗначенияДоступа); - УстановленныеПараметры.Добавить("ВидыДоступаБезГруппЗначенияДоступа"); + ВсеВидыДоступаКромеСпециальныхОтключены = (ВсеВидыДоступаКромеСпециальных.Количество() + = ВидыДоступаСОтключеннымИспользованием.Количество()); - ПараметрыСеанса.ВидыДоступаЧерезПраваПоЗначениямДоступа = ?(ВидыДоступаЧерезПраваПоЗначениямДоступа.Количество() = 0, - "", - Новый ФиксированныйМассив(ВидыДоступаЧерезПраваПоЗначениямДоступа)); - УстановленныеПараметры.Добавить("ВидыДоступаЧерезПраваПоЗначениямДоступа"); - - Если КаждыйВидЕдинственный И КаждыйВидБезГрупп Тогда - ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный, КаждыйВидБезГрупп"; - ИначеЕсли КаждыйВидЕдинственный Тогда - ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидЕдинственный"; - ИначеЕсли КаждыйВидБезГрупп Тогда - ПараметрыСеанса.ОграничиватьДоступПоВиду = "КаждыйВидБезГрупп"; + Если ВсеВидыДоступаКромеСпециальныхОтключены Тогда + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием = "Все"; Иначе - ПараметрыСеанса.ОграничиватьДоступПоВиду = "Да"; + ПараметрыСеанса.ВидыДоступаСОтключеннымИспользованием + = ВсеКомбинацииВидовДоступа(ВидыДоступаСОтключеннымИспользованием); КонецЕсли; - УстановленныеПараметры.Добавить("ОграничиватьДоступПоВиду"); + + УстановленныеПараметры.Добавить("ВидыДоступаСОтключеннымИспользованием"); + + // Установка параметров ВидыДоступаБезГруппДляЗначенияДоступа, + // ВидыДоступаСОднойГруппойДляЗначенияДоступа, ТипыЗначенийДоступаСГруппами. + ПараметрыСеанса.ВидыДоступаБезГруппДляЗначенияДоступа = + ВсеКомбинацииВидовДоступа(Параметры.СвойстваВидовДоступа.БезГруппДляЗначенияДоступа); + ПараметрыСеанса.ВидыДоступаСОднойГруппойДляЗначенияДоступа = + ВсеКомбинацииВидовДоступа(Параметры.СвойстваВидовДоступа.СОднойГруппойДляЗначенияДоступа); + + ТипыЗначенийДоступаСГруппами = Новый Массив; + Для каждого КлючИЗначение Из Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами Цикл + ТипыЗначенийДоступаСГруппами.Добавить(КлючИЗначение.Значение); + КонецЦикла; + ПараметрыСеанса.ТипыЗначенийДоступаСГруппами = Новый ФиксированныйМассив(ТипыЗначенийДоступаСГруппами); + + УстановленныеПараметры.Добавить("ВидыДоступаБезГруппДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ВидыДоступаСОднойГруппойДляЗначенияДоступа"); + УстановленныеПараметры.Добавить("ТипыЗначенийДоступаСГруппами"); + + // Установка параметров ТаблицыСОтдельнымиНастройкамиПрав, + // ИдентификаторыТаблицСОтдельнымиНастройкамиПрав, ТипыВладельцевНастроекПрав. + ОтдельныеТаблицы = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ОтдельныеТаблицы; + ТаблицыСОтдельнымиНастройкамиПрав = ""; + ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = Новый Массив; + Для каждого КлючИЗначение Из ОтдельныеТаблицы Цикл + ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав + + "|" + КлючИЗначение.Значение + ";" + Символы.ПС; + ИдентификаторыТаблицСОтдельнымиНастройкамиПрав.Добавить(КлючИЗначение.Ключ); + КонецЦикла; + + ПараметрыСеанса.ТаблицыСОтдельнымиНастройкамиПрав = ТаблицыСОтдельнымиНастройкамиПрав; + + ПараметрыСеанса.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав = + Новый ФиксированныйМассив(ИдентификаторыТаблицСОтдельнымиНастройкамиПрав); + + ПараметрыСеанса.ТипыВладельцевНастроекПрав = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ТипыВладельцев; + + УстановленныеПараметры.Добавить("ТаблицыСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав"); + УстановленныеПараметры.Добавить("ТипыВладельцевНастроекПрав"); КонецПроцедуры @@ -503,6 +498,7 @@ // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт + // Обработчики обновления неразделенных данных. Обработчик = Обработчики.Добавить(); Обработчик.ОбщиеДанные = Истина; Обработчик.УправлениеОбработчиками = Истина; @@ -511,6 +507,7 @@ Обработчик.МонопольныйРежим = Истина; Обработчик.Процедура = "УправлениеДоступомСлужебный.ЗаполнитьОбработчикиРазделенныхДанных"; + // Обработчики обновления разделенных данных. Обработчик = Обработчики.Добавить(); Обработчик.Версия = "*"; Обработчик.МонопольныйРежим = Истина; @@ -546,6 +543,7 @@ Обработчик.ВыполнятьВГруппеОбязательных = Истина; Обработчик.Приоритет = 1; + // Должен выполнятся после обработчика ЗаполнитьИдентификаторыПоставляемыхДанных. Обработчик = Обработчики.Добавить(); Обработчик.НачальноеЗаполнение = Истина; Обработчик.Процедура = "Справочники.ГруппыДоступа.ЗаполнитьПрофильГруппыДоступаАдминистраторы"; @@ -553,6 +551,48 @@ Обработчик.ВыполнятьВГруппеОбязательных = Истина; Обработчик.Приоритет = 1; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "Справочники.ПрофилиГруппДоступа.ПреобразоватьИдентификаторыВидовДоступа"; + Обработчик.РежимВыполнения = "Монопольно"; + Обработчик.ВыполнятьВГруппеОбязательных = Истина; + Обработчик.Приоритет = 1; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РегистрыСведений.ЗначенияГруппДоступа.ОбновитьДанныеРегистра"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РегистрыСведений.УдалитьГруппыЗначенийДоступа.ПереместитьДанныеВНовыйРегистр"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РегистрыСведений.НаследованиеНастроекПравОбъектов.ОбновитьДанныеРегистра"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "РегистрыСведений.НастройкиПравОбъектов.ОбновитьВспомогательныеДанныеРегистра"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.Процедура = "УправлениеДоступомСлужебный.ВключитьЗаполнениеДанныхДляОграниченияДоступа"; + Обработчик.РежимВыполнения = "Монопольно"; + + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.35"; + Обработчик.Процедура = "РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыПустыхЗначенийДоступа"; + Обработчик.РежимВыполнения = "Оперативно"; + КонецПроцедуры // Переопределяет поведение после получения данных в распределенной ИБ. @@ -571,7 +611,7 @@ Процедура ДобавитьПараметрыРаботыКлиента(Параметры) Экспорт Параметры.Вставить("УпрощенныйИнтерфейсНастройкиПравДоступа", - УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа()); + УпрощенныйИнтерфейсНастройкиПравДоступа()); КонецПроцедуры @@ -600,6 +640,15 @@ КонецПроцедуры +// Проверяет существование вида доступа с указанным именем. +// Применяется для автоматизации условного встраивания подсистем. +// +Функция ВидДоступаСуществует(ИмяВидаДоступа) Экспорт + + Возврат СвойстваВидаДоступа(ИмяВидаДоступа) <> Неопределено; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в эту подсистему @@ -630,23 +679,29 @@ Процедура ПриАвторизацииАдминистратораПриНачалеРаботыСистемы(Администратор) Экспорт // Администратор автоматически добавляется в группу доступа Администраторы при авторизации. - Если ПривилегированныйРежим() Тогда - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Пользователь", Администратор); - Запрос.Текст = - "ВЫБРАТЬ - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи - |ГДЕ - | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) - | И ГруппыДоступаПользователи.Пользователь = &Пользователь"; - Если Запрос.Выполнить().Пустой() Тогда - Объект = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); - Объект.Пользователи.Добавить().Пользователь = Администратор; - Объект.ДополнительныеСвойства.Вставить("НезависимоеИзменениеОбъекта"); - Объект.Записать(); - КонецЕсли; + Если НЕ Пользователи.ЭтоПолноправныйПользователь(, Не ОбщегоНазначенияПовтИсп.РазделениеВключено()) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Недостаточно прав для добавления пользователя ""%1"" + |в группу доступа Администраторы.'"), + Строка(Администратор)); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Пользователь", Администратор); + Запрос.Текст = + "ВЫБРАТЬ + | ИСТИНА КАК ЗначениеИстина + |ИЗ + | Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи + |ГДЕ + | ГруппыДоступаПользователи.Ссылка = ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.Администраторы) + | И ГруппыДоступаПользователи.Пользователь = &Пользователь"; + + Если Запрос.Выполнить().Пустой() Тогда + Объект = Справочники.ГруппыДоступа.Администраторы.ПолучитьОбъект(); + Объект.Пользователи.Добавить().Пользователь = Администратор; + Объект.ДополнительныеСвойства.Вставить("НезависимоеИзменениеОбъекта"); + Объект.Записать(); КонецЕсли; КонецПроцедуры @@ -654,39 +709,38 @@ // Содержит настройки размещения вариантов отчетов в панели отчетов. // // Параметры: -// Настройки (Коллекция) Используется для описания настроек отчетов и вариантов +// Настройки - Коллекция - Используется для описания настроек отчетов и вариантов // см. описание к ВариантыОтчетов.ДеревоНастроекВариантовОтчетовКонфигурации() // // Описание: // В данной процедуре необходимо указать каким именно образом предопределенные варианты отчетов // будут регистрироваться в программе и показываться в панели отчетов. // -// Вспомогательные функции: +// Вспомогательные методы: // НастройкиОтчета = ВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.<ИмяОтчета>); // НастройкиВарианта = ВариантыОтчетов.ОписаниеВарианта(Настройки, НастройкиОтчета, "<ИмяВарианта>"); // // Данные функции получают соответственно настройки отчета и настройки варианта отчета следующей структуры: -// |- Включен (Булево) -// Если Ложь, то вариант отчета не регистрируется в подсистеме. -// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. -// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи -// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). -// |- ВидимостьПоУмолчанию (Булево) -// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. -// Пользователь может "включить" его в режиме настройки панели отчетов -// или открыть через форму "Все отчеты". -// |- Описание (Строка) -// Дополнительная информация по варианту отчета. -// В панели отчетов выводится в качестве подсказки. -// Должно расшифровывать для пользователя содержимое варианта отчета -// и не должно дублировать наименование варианта отчета. -// |- Размещение (Соответствие) Настройки размещения варианта отчета в разделах -// |- Ключ (ОбъектМетаданных) Подсистема, в которой размещается отчет или вариант отчета -// |- Значение (Строка) Необязательный. Настройки размещения в подсистеме. -// |- "" - Выводить отчет в своей группе обычным шрифтом. -// |- "Важный" - Выводить отчет в своей группе жирным шрифтом. -// |- "СмТакже" - Выводить отчет в группе "См. также". -// |- ФункциональныеОпции (Массив) из (Строка) +// * Включен - Булево - +// Если Ложь, то вариант отчета не регистрируется в подсистеме. +// Используется для удаления технических и контекстных вариантов отчетов из всех интерфейсов. +// Эти варианты отчета по прежнему можно открывать в форме отчета программно при помощи +// параметров открытия (см. справку по "Расширение управляемой формы для отчета.КлючВарианта"). +// * ВидимостьПоУмолчанию - Булево - +// Если Ложь, то вариант отчета по умолчанию скрыт в панели отчетов. +// Пользователь может "включить" его в режиме настройки панели отчетов +// или открыть через форму "Все отчеты". +// * Описание - Строка - Дополнительная информация по варианту отчета. +// В панели отчетов выводится в качестве подсказки. +// Должно расшифровывать для пользователя содержимое варианта отчета +// и не должно дублировать наименование варианта отчета. +// * Размещение - Соответствие - Настройки размещения варианта отчета в разделах. +// ** Ключ - ОбъектМетаданных: Подсистема - Подсистема, в которой размещается отчет или вариант отчета +// ** Значение - Строка - Необязательный. Настройки размещения в подсистеме. +// "" - Выводить отчет в своей группе обычным шрифтом. +// "Важный" - Выводить отчет в своей группе жирным шрифтом. +// "СмТакже" - Выводить отчет в группе "См. также". +// * ФункциональныеОпции - Массив из Строка - // Имена функциональных опций варианта отчета. // // Например: @@ -743,7 +797,7 @@ // Процедура ПриНастройкеВариантовОтчетов(Настройки) Экспорт - МодульВариантыОтчетов = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ВариантыОтчетов"); + МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов"); Отчет = МодульВариантыОтчетов.ОписаниеОтчета(Настройки, Метаданные.Отчеты.ПраваДоступа); Отчет.Включен = Ложь; @@ -829,8 +883,12 @@ ИдентификаторПользователяИБ = ОписаниеПользователя.ИдентификаторПользователяИБ; НовыйАдминистраторИБ = Ложь; - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И Пользователи.ЭтоНеразделенныйПользователь(ИдентификаторПользователяИБ) Тогда + Отказ = Ложь; + Обработчики = ОбщегоНазначения.ОбработчикиСлужебногоСобытия("СтандартныеПодсистемы.УправлениеДоступом\ПриОбновленииРолейПользователяИБ"); + Для Каждого Обработчик Из Обработчики Цикл + Обработчик.Модуль.ПриОбновленииРолейПользователяИБ(ИдентификаторПользователяИБ, Отказ); + КонецЦикла; + Если Отказ Тогда Продолжить; КонецЕсли; @@ -992,8 +1050,23 @@ // Процедура ПриДобавленииОбработчиковУстановкиПараметровСеанса(Обработчики) Экспорт - Обработчики.Вставить("ОграничиватьДоступПоВиду*", "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); - Обработчики.Вставить("ВидыДоступа*", "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + Обработчики.Вставить("ВидыДоступа*", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ВсеВидыДоступаКромеСпециальных", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ТаблицыСОтдельнымиНастройкамиПрав", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ТипыЗначенийДоступаСГруппами", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ТипыВладельцевНастроекПрав", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); + + Обработчики.Вставить("ИдентификаторыТаблицСОтдельнымиНастройкамиПрав", + "УправлениеДоступомСлужебный.УстановкаПараметровСеанса"); КонецПроцедуры @@ -1008,9 +1081,11 @@ Массив.Добавить(Метаданные.РегистрыСведений.ГруппыЗначенийДоступа.ПолноеИмя()); Массив.Добавить(Метаданные.РегистрыСведений.ЗависимостиПравДоступа.ПолноеИмя()); Массив.Добавить(Метаданные.РегистрыСведений.ЗначенияГруппДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.ЗначенияГруппДоступаПоУмолчанию.ПолноеИмя()); Массив.Добавить(Метаданные.РегистрыСведений.НаборыЗначенийДоступа.ПолноеИмя()); Массив.Добавить(Метаданные.РегистрыСведений.ПраваРолей.ПолноеИмя()); - Массив.Добавить(Метаданные.РегистрыСведений.ПраваПоЗначениямДоступа.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.НаследованиеНастроекПравОбъектов.ПолноеИмя()); + Массив.Добавить(Метаданные.РегистрыСведений.НастройкиПравОбъектов.ПолноеИмя()); Массив.Добавить(Метаданные.РегистрыСведений.ТаблицыГруппДоступа.ПолноеИмя()); КонецПроцедуры @@ -1034,7 +1109,7 @@ ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ГруппыЗначенийДоступа") ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ЗначенияГруппДоступа") ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа") - ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ПраваПоЗначениямДоступа") + ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.НастройкиПравОбъектов") ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.УдалитьПраваПоЗначениямДоступа") ИЛИ ТипЗнч(ЭлементДанных) = Тип("РегистрСведенийНаборЗаписей.ТаблицыГруппДоступа") Тогда @@ -1109,7 +1184,6 @@ Если РаспределеннаяИнформационнаяБаза Тогда Объекты.Добавить(Метаданные.Константы.ПараметрыОграниченияДоступа); - Объекты.Добавить(Метаданные.ПланыВидовХарактеристик.ВидыДоступа); Объекты.Добавить(Метаданные.РегистрыСведений.ПраваРолей); Объекты.Добавить(Метаданные.РегистрыСведений.ЗависимостиПравДоступа); @@ -1135,15 +1209,18 @@ КонецПроцедуры -// Заполняет массив типов неразделенных данных, всегда содержащих только предопределенные элементы. -// Он используется при обновлении ссылок при загрузке-выгрузке данных. -// -// Параметры: -// МассивТипов - массив +// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок +// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок +// гарантируется с помощью других механизмов. // -Процедура ПриОпределенииСтандартныхТиповОбщихПредопределенныхДанных(МассивТипов) Экспорт +// Параметры: +// Типы - Массив(ОбъектМетаданных) +// +Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт - МассивТипов.Добавить(Тип("ПланВидовХарактеристикСсылка.ВидыДоступа")); + // В разделенных данных используются ссылки только на предопределенные элементы + // плана видов характеристик УдалитьВидыДоступа. + Типы.Добавить(Метаданные.ПланыВидовХарактеристик.УдалитьВидыДоступа); КонецПроцедуры @@ -1224,9 +1301,11 @@ //////////////////////////////////////////////////////////////////////////////// // Обработчики подписок на события -// Обработчик подписки ОбновитьГруппыЗначенийДоступа на событие ПередЗаписью -// вызывает метод записи групп значений доступа в -// РегистрСведений.ГруппыЗначенийДоступа, для требуемых объектов метаданных. +// Обработчик подписки ОбновитьГруппыЗначенийДоступа на событие ПередЗаписью: +// - вызывает метод записи групп значений доступа в +// РегистрСведений.ГруппыЗначенийДоступа для требуемых объектов метаданных; +// - вызывает метод записи иерархии владельцев настроек прав объектов в +// РегистрСведений.НаследованиеНастроекПравОбъектов для требуемых объектов метаданных. // Процедура ОбновитьГруппыЗначенийДоступа(Знач Объект, Отказ) Экспорт @@ -1234,20 +1313,16 @@ Возврат; КонецЕсли; - Если ТипЗнч(Объект) = Тип("ПланВидовХарактеристикОбъект.ВидыДоступа") Тогда - Возврат; - КонецЕсли; - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; - ВозможныеПраваПоЗначениямДоступа = Параметры.ВозможныеПраваПоЗначениямДоступа; + ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; + ВозможныеПраваПоТипам = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипам; Если ЗначенияДоступаСГруппами.ПоТипам.Получить(ТипЗнч(Объект)) <> Неопределено Тогда РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(Объект); КонецЕсли; - Если ВозможныеПраваПоЗначениямДоступа.ПоТипам.Получить(ТипЗнч(Объект)) <> Неопределено Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьИерархиюВладельцевНастроекПравОбъектов(Объект); + Если ВозможныеПраваПоТипам.Получить(ТипЗнч(Объект)) <> Неопределено Тогда + РегистрыСведений.НаследованиеНастроекПравОбъектов.ОбновитьДанныеРегистра(Объект); КонецЕсли; КонецПроцедуры @@ -1305,10 +1380,8 @@ // наборы значений доступа не будут заполнены. // При отключении режима ограничения доступа на уровне записей наборы значений доступа // (заполненные ранее) удаляются при перезаписи объектов, а не все сразу. -// Независимо от режима ограничения доступа на уровне записей обновляет вторичные -// данные: группы значений доступа и дополнительные поля в существующих наборах значений доступа. -// После завершения всех обновлений и заполнений отключает использование регламентного -// задания. +// Независимо от режима ограничения доступа на уровне записей обновляет кэш-реквизиты. +// После завершения всех обновлений и заполнений отключает использование регламентного задания. // // Сведения о состоянии работы записываются в журнал регистрации. // @@ -1317,310 +1390,219 @@ // с помощью которой можно сделать интерактивное обновление данных ограничения доступа // при обновлении информационной базы. // -Процедура ЗаполнениеДанныхДляОграниченияДоступа(КоличествоДанных = 0) Экспорт +Процедура ЗаполнениеДанныхДляОграниченияДоступа(КоличествоДанных = 0, ТолькоКэшРеквизиты = Ложь, ЕстьИзменения = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); - ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; - ВидыДоступаЗначенийДоступа = Параметры.СвойстваВидовДоступа.ВидыДоступаЗначенийДоступа; - ВозможныеПраваПоЗначениямДоступа = Параметры.ВозможныеПраваПоЗначениямДоступа; + ЗначенияДоступаСГруппами = Параметры.СвойстваВидовДоступа.ЗначенияДоступаСГруппами; - Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() И НЕ ТолькоКэшРеквизиты Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппировкиПользователей(); - - // Заполнение РегистрСведений.ГруппыЗначенийДоступа. - ТипыОбъектов = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( - "ОбновитьГруппыЗначенийДоступа"); - - Для каждого ОписаниеТипа Из ТипыОбъектов Цикл - Тип = ОписаниеТипа.Ключ; + // Заполнение групп значений доступа в регистре сведений ГруппыЗначенийДоступа. + Для каждого ИмяТаблицы Из ЗначенияДоступаСГруппами.ИменаТаблиц Цикл - Если Тип = Тип("ПланВидовХарактеристикОбъект.ВидыДоступа") Тогда - Продолжить; - КонецЕсли; - - ВидыДоступа = ВидыДоступаЗначенийДоступа.ПоТипам[Тип]; - Если ВидыДоступа.Количество() = 1 И - ( ВидыДоступа[0] = ПланыВидовХарактеристик.ВидыДоступа.Пользователи ИЛИ - ВидыДоступа[0] = ПланыВидовХарактеристик.ВидыДоступа.ВнешниеПользователи ) Тогда - Продолжить; - КонецЕсли; - - Если КоличествоДанных < 1000 И Тип <> Тип("Строка") Тогда + Если КоличествоДанных < 10000 Тогда Запрос = Новый Запрос; Запрос.Текст = - "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 - | Таблица.Ссылка + "ВЫБРАТЬ ПЕРВЫЕ 10000 + | ТекущаяТаблица.Ссылка КАК Ссылка |ИЗ - | ПодставляемаяТаблица КАК Таблица - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК РегистрСведенийГруппыЗначенийДоступа - | ПО Таблица.Ссылка = РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа + | &ТекущаяТаблица КАК ТекущаяТаблица + | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначенийДоступа + | ПО ТекущаяТаблица.Ссылка = ГруппыЗначенийДоступа.ЗначениеДоступа + | И (ГруппыЗначенийДоступа.ГруппаДанных = 0) |ГДЕ - | РегистрСведенийГруппыЗначенийДоступа.ЗначениеДоступа ЕСТЬ NULL "; + | ГруппыЗначенийДоступа.ЗначениеДоступа ЕСТЬ NULL "; - Запрос.Текст = СтрЗаменить( - Запрос.Текст, "ПодставляемаяТаблица", Метаданные.НайтиПоТипу(Тип).ПолноеИмя() ); + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", ИмяТаблицы); + Значения = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"); - Выгрузка = Запрос.Выполнить().Выгрузить(); - КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); - - Для каждого СтрокаТЧ Из Выгрузка Цикл - - Если ЗначенияДоступаСГруппами.ПоТипам.Получить(Тип) <> Неопределено Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(СтрокаТЧ.Ссылка); - - ИначеЕсли ВозможныеПраваПоЗначениямДоступа.ПоТипам.Получить(Тип) <> Неопределено Тогда - РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьИерархиюВладельцевНастроекПравОбъектов(СтрокаТЧ.Ссылка); - КонецЕсли; - КонецЦикла; + РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьГруппыЗначенийДоступа(Значения, ЕстьИзменения); + КоличествоДанных = КоличествоДанных + Значения.Количество(); КонецЕсли; + КонецЦикла; - Если КоличествоДанных < 1000 Тогда + Если КоличествоДанных < 10000 + И НЕ РегистрыСведений.УдалитьНаборыЗначенийДоступа.ПереместитьДанныеВНовыйРегистр() Тогда + // Перед заполнением наборов значений доступа выполняется перенос + // наборов значений доступа из старого регистра. + Возврат; - // Заполнение РегистрСведений.НаборыЗначенийДоступа. + ИначеЕсли КоличествоДанных < 10000 Тогда + + // Заполнение регистра сведений НаборыЗначенийДоступа. ТипыОбъектов = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( "ЗаписатьНаборыЗначенийДоступа"); Для каждого ОписаниеТипа Из ТипыОбъектов Цикл Тип = ОписаниеТипа.Ключ; - Если Тип = Тип("ПланВидовХарактеристикОбъект.ВидыДоступа") Тогда - Продолжить; - КонецЕсли; + Если КоличествоДанных < 10000 И Тип <> Тип("Строка") Тогда - ЗаполнитьТабличнуюЧасть = Метаданные.НайтиПоТипу(Тип).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") <> Неопределено; - - Если КоличествоДанных < 1000 И Тип <> Тип("Строка") Тогда - - Запрос = Новый Запрос(СтрЗаменить( - "ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 - | Таблица.Ссылка + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ ПЕРВЫЕ 10000 + | ТекущаяТаблица.Ссылка КАК Ссылка |ИЗ - | ПодставляемаяТаблица КАК Таблица + | &ТекущаяТаблица КАК ТекущаяТаблица | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаборыЗначенийДоступа КАК РегистрСведенийНаборыЗначенийДоступа - | ПО Таблица.Ссылка = РегистрСведенийНаборыЗначенийДоступа.Объект + | ПО ТекущаяТаблица.Ссылка = РегистрСведенийНаборыЗначенийДоступа.Объект |ГДЕ - | РегистрСведенийНаборыЗначенийДоступа.Объект ЕСТЬ NULL ", "ПодставляемаяТаблица", Метаданные.НайтиПоТипу(Тип).ПолноеИмя())); - Выгрузка = Запрос.Выполнить().Выгрузить(); - КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + | РегистрСведенийНаборыЗначенийДоступа.Объект ЕСТЬ NULL "; + Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ТекущаяТаблица", Метаданные.НайтиПоТипу(Тип).ПолноеИмя()); + Выборка = Запрос.Выполнить().Выбрать(); + КоличествоДанных = КоличествоДанных + Выборка.Количество(); - Для каждого СтрокаТЧ Из Выгрузка Цикл - Если ЗаполнитьТабличнуюЧасть Тогда - // Запись наборов табличной части и наборов регистра (без зависимых наборов). - Объект = СтрокаТЧ.Ссылка.ПолучитьОбъект(); - Объект.ОбменДанными.Загрузка = Истина; - Объект.ДополнительныеСвойства.Вставить("ЗаписатьНаборыЗначенийДоступа"); - Объект.Записать(); - Иначе - // Запись только наборов регистра (без зависимых наборов). - ЗаписатьНаборыЗначенийДоступа(СтрокаТЧ.Ссылка); - КонецЕсли; + Пока Выборка.Следующий() Цикл + ОбновитьНаборыЗначенийДоступа(Выборка.Ссылка, ЕстьИзменения); КонецЦикла; - КонецЕсли; КонецЦикла; КонецЕсли; - + Иначе + РегистрыСведений.УдалитьНаборыЗначенийДоступа.ПереместитьДанныеВНовыйРегистр(); КонецЕсли; - Если КоличествоДанных < 1000 Тогда - // Обновление вторичных данных в наборах значений доступа: свойств видов доступа , и других. - - Запрос = Новый Запрос( + // Обновление кэш-реквизитов в наборах значений доступа. + Если КоличествоДанных < 10000 Тогда + + ТипыЗначенийДоступа = Параметры.СвойстваВидовДоступа.ПоТипамЗначений; + ТипыЗначенийДоступаСГруппами = Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; + + ТаблицаТиповЗначений = Новый ТаблицаЗначений; + ТаблицаТиповЗначений.Колонки.Добавить("ТипЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + Для каждого КлючИЗначение Из ТипыЗначенийДоступа Цикл + ТаблицаТиповЗначений.Добавить().ТипЗначений = ПустаяСсылкаОбъектаМетаданных(КлючИЗначение.Ключ); + КонецЦикла; + + ТаблицаТиповЗначенийСГруппами = Новый ТаблицаЗначений; + ТаблицаТиповЗначенийСГруппами.Колонки.Добавить("ТипЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + Для каждого КлючИЗначение Из ТипыЗначенийДоступаСГруппами Цикл + ТаблицаТиповЗначенийСГруппами.Добавить().ТипЗначений = ПустаяСсылкаОбъектаМетаданных(КлючИЗначение.Ключ); + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("ТаблицаТиповЗначений", ТаблицаТиповЗначений); + Запрос.УстановитьПараметр("ТаблицаТиповЗначенийСГруппами", ТаблицаТиповЗначенийСГруппами); + Запрос.Текст = "ВЫБРАТЬ - | СвойстваВидовДоступа.ВидДоступа, - | СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - | СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа - |ПОМЕСТИТЬ ТаблицаСвойств + | ТаблицаТипов.ТипЗначений + |ПОМЕСТИТЬ ТаблицаТиповЗначений |ИЗ - | &СвойстваВидовДоступа КАК СвойстваВидовДоступа + | &ТаблицаТиповЗначений КАК ТаблицаТипов + | + |ИНДЕКСИРОВАТЬ ПО + | ТаблицаТипов.ТипЗначений |; | |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000 + |ВЫБРАТЬ + | ТаблицаТипов.ТипЗначений + |ПОМЕСТИТЬ ТаблицаТиповЗначенийСГруппами + |ИЗ + | &ТаблицаТиповЗначенийСГруппами КАК ТаблицаТипов + | + |ИНДЕКСИРОВАТЬ ПО + | ТаблицаТипов.ТипЗначений + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ ПЕРВЫЕ 10000 | НаборыЗначенийДоступа.Объект, | НаборыЗначенийДоступа.НомерНабора, - | НаборыЗначенийДоступа.ВидДоступа, | НаборыЗначенийДоступа.ЗначениеДоступа, + | НаборыЗначенийДоступа.Уточнение, | НаборыЗначенийДоступа.Чтение, - | НаборыЗначенийДоступа.Добавление, - | НаборыЗначенийДоступа.Изменение, - | НаборыЗначенийДоступа.Удаление, - | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, ЛОЖЬ) КАК ВидДоступаБезГруппЗначенияДоступа, - | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, ЛОЖЬ) КАК ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - | ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, ЛОЖЬ) КАК ВидДоступаЧерезПраваПоЗначениямДоступа, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.Чтение - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ КАК ВидДоступаПравоЧтения, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.Добавление - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ КАК ВидДоступаПравоДобавления, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.Изменение - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ КАК ВидДоступаПравоИзменения, - | НаборыЗначенийДоступа.ТипОбъекта, - | ЕСТЬNULL(Идентификаторы.ЗначениеПустойСсылки, НЕОПРЕДЕЛЕНО) КАК ТипЗначенияДоступа + | НаборыЗначенийДоступа.Изменение |ИЗ | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа - | ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаСвойств КАК СвойстваВидовДоступа - | ПО НаборыЗначенийДоступа.ВидДоступа = СвойстваВидовДоступа.ВидДоступа - | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа) = ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки)) - | И (НаборыЗначенийДоступа.ВидДоступа В (ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения))) |ГДЕ - | (НЕ(НаборыЗначенийДоступа.ВидДоступаБезГруппЗначенияДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаБезГруппЗначенияДоступа, ЛОЖЬ) - | И НаборыЗначенийДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, ЛОЖЬ) - | И НаборыЗначенийДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа = ЕСТЬNULL(СвойстваВидовДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа, ЛОЖЬ) - | И НаборыЗначенийДоступа.ТипЗначенияДоступа = ЕСТЬNULL(Идентификаторы.ЗначениеПустойСсылки, НЕОПРЕДЕЛЕНО) - | И НаборыЗначенийДоступа.ВидДоступаПравоЧтения = ВЫБОР - | КОГДА НаборыЗначенийДоступа.Чтение - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоЧтения) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ - | И НаборыЗначенийДоступа.ВидДоступаПравоДобавления = ВЫБОР - | КОГДА НаборыЗначенийДоступа.Добавление - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоДобавления) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ - | И НаборыЗначенийДоступа.ВидДоступаПравоИзменения = ВЫБОР - | КОГДА НаборыЗначенийДоступа.Изменение - | ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПравоИзменения) - | ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.ПустаяСсылка) - | КОНЕЦ))"); - Запрос.УстановитьПараметр("СвойстваВидовДоступа", СвойстваВидаДоступа()); - Выгрузка = Запрос.Выполнить().Выгрузить(); - КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); + | ВЫБОР + | КОГДА НаборыЗначенийДоступа.СтандартноеЗначение <> ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТаблицаТиповЗначений КАК ТаблицаТиповЗначений + | ГДЕ + | ТИПЗНАЧЕНИЯ(ТаблицаТиповЗначений.ТипЗначений) = ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа)) + | ТОГДА ИСТИНА + | КОГДА НаборыЗначенийДоступа.СтандартноеЗначение = ИСТИНА + | ТОГДА НаборыЗначенийДоступа.ЗначениеБезГрупп = ИСТИНА В + | (ВЫБРАТЬ ПЕРВЫЕ 1 + | ИСТИНА + | ИЗ + | ТаблицаТиповЗначенийСГруппами КАК ТаблицаТиповЗначенийСГруппами + | ГДЕ + | ТИПЗНАЧЕНИЯ(ТаблицаТиповЗначенийСГруппами.ТипЗначений) = ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.ЗначениеДоступа)) + | ИНАЧЕ НаборыЗначенийДоступа.ЗначениеБезГрупп = ИСТИНА + | КОНЕЦ"; + Выборка = Запрос.Выполнить().Выбрать(); + КоличествоДанных = КоличествоДанных + Выборка.Количество(); - Для каждого СтрокаТЧ Из Выгрузка Цикл + Пока Выборка.Следующий() Цикл МенеджерЗаписи = РегистрыСведений.НаборыЗначенийДоступа.СоздатьМенеджерЗаписи(); - ЗаполнитьЗначенияСвойств( - МенеджерЗаписи, - СтрокаТЧ, - "Объект, - |НомерНабора, - |ВидДоступа, - |ЗначениеДоступа, - |Чтение, - |Добавление, - |Изменение, - |Удаление, - |ВидДоступаБезГруппЗначенияДоступа, - |ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - |ВидДоступаЧерезПраваПоЗначениямДоступа, - |ВидДоступаПравоЧтения, - |ВидДоступаПравоДобавления, - |ВидДоступаПравоИзменения, - |ТипОбъекта, - |ТипЗначенияДоступа"); - МенеджерЗаписи.Записать(); - КонецЦикла; - КонецЕсли; - - Если КоличествоДанных < 1000 Тогда - // Обновление вторичных данных в наборах значений доступа: ТипОбъекта - - Запрос = Новый Запрос( - "ВЫБРАТЬ ПЕРВЫЕ 1000 - | ТипыОбъектов.Объект - |ИЗ - | (ВЫБРАТЬ - | НаборыЗначенийДоступа.Объект КАК Объект, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.ТипОбъекта <> НЕОПРЕДЕЛЕНО - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК ТипЗадан, - | ВЫБОР - | КОГДА НаборыЗначенийДоступа.ТипОбъекта <> НЕОПРЕДЕЛЕНО - | И НаборыЗначенийДоступа.ТипОбъекта <> Идентификаторы.ЗначениеПустойСсылки - | ТОГДА 1 - | ИНАЧЕ 0 - | КОНЕЦ КАК НеверныйТип - | ИЗ - | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа - | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы - | ПО (ТИПЗНАЧЕНИЯ(НаборыЗначенийДоступа.Объект) = ТИПЗНАЧЕНИЯ(Идентификаторы.ЗначениеПустойСсылки))) КАК ТипыОбъектов - | - |СГРУППИРОВАТЬ ПО - | ТипыОбъектов.Объект - | - |ИМЕЮЩИЕ - | (СУММА(ТипыОбъектов.ТипЗадан) <> 1 - | ИЛИ СУММА(ТипыОбъектов.НеверныйТип) <> 0)"); - Выгрузка = Запрос.Выполнить().Выгрузить(); - КоличествоДанных = КоличествоДанных + Выгрузка.Количество(); - - НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); - Для каждого СтрокаТЧ Из Выгрузка Цикл - - НаборЗаписей.Отбор.Объект.Установить(СтрокаТЧ.Объект); - НаборЗаписей.Прочитать(); - ПерваяЗапись = Истина; + ЗаполнитьЗначенияСвойств(МенеджерЗаписи, Выборка); - Для каждого Запись Из НаборЗаписей Цикл - - Если ПерваяЗапись Тогда - ТипыОбъекта = Новый Массив; - ТипыОбъекта.Добавить(ТипЗнч(Запись.Объект)); - ОписаниеТипаОбъекта = Новый ОписаниеТипов(ТипыОбъекта); - - Запись.ТипОбъекта = ОписаниеТипаОбъекта.ПривестиЗначение(Неопределено); - ПерваяЗапись = Ложь; - Иначе - Запись.ТипОбъекта = Неопределено; + ТипЗначенияДоступа = ТипЗнч(Выборка.ЗначениеДоступа); + + Если ТипыЗначенийДоступа.Получить(ТипЗначенияДоступа) <> Неопределено Тогда + МенеджерЗаписи.СтандартноеЗначение = Истина; + Если ТипыЗначенийДоступаСГруппами.Получить(ТипЗначенияДоступа) = Неопределено Тогда + МенеджерЗаписи.ЗначениеБезГрупп = Истина; КонецЕсли; - КонецЦикла; - НаборЗаписей.Записать(); + КонецЕсли; + + МенеджерЗаписи.Записать(); + ЕстьИзменения = Истина; КонецЦикла; КонецЕсли; - Если КоличествоДанных < 1000 Тогда + Если КоличествоДанных < 10000 Тогда ЗаписьЖурналаРегистрации( НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация, , , НСтр("ru = 'Завершено заполнение данных для ограничения доступа.'"), РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПриВключенииЗаполненияДанныхДляОграниченияДоступа(Ложь); - Иначе - Задание = РегламентныеЗадания.НайтиПредопределенное( - Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); - - Задание.Использование = Ложь; - Задание.Записать(); - КонецЕсли; + УстановитьЗаполнениеДанныхДляОграниченияДоступа(Ложь); Иначе ЗаписьЖурналаРегистрации( НСтр("ru = 'Управление доступом.Заполнение данных для ограничения доступа'", - ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), + ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()), УровеньЖурналаРегистрации.Информация, , , - НСтр("ru = 'Выполнена запись порции данных для ограничения доступа.'"), + НСтр("ru = 'Выполнена запись части данных для ограничения доступа.'"), РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПриВключенииЗаполненияДанныхДляОграниченияДоступа(Истина); - Иначе - Задание = РегламентныеЗадания.НайтиПредопределенное( - Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); - Задание.Использование = Истина; + КонецЕсли; + +КонецПроцедуры + +// Устанавливает использование регламентного задания заполнения данных управления доступом. +// +// Параметры: +// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. +// +Процедура УстановитьЗаполнениеДанныхДляОграниченияДоступа(Знач Использование) Экспорт + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьЗаполнениеДанныхДляОграниченияДоступа(Использование); + КонецЕсли; + Иначе + Задание = РегламентныеЗадания.НайтиПредопределенное( + Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); + + Если Задание.Использование <> Использование Тогда + Задание.Использование = Использование; Задание.Записать(); КонецЕсли; КонецЕсли; @@ -1708,38 +1690,34 @@ // Возвращает использование вида доступа. // Параметры: -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа. +// ВидДоступа - Строка, имя вида доступа. // // Возвращаемое значение: // Булево. // Функция ВидДоступаИспользуется(Знач ВидДоступа) Экспорт - СвойстваВидаДоступа = СвойстваВидаДоступа(ВидДоступа); - - Если СвойстваВидаДоступа = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - ТипыВидаДоступа = СвойстваВидаДоступа.Таблицы; - Используется = Ложь; - Для Каждого ТипВидаДоступа Из ТипыВидаДоступа Цикл - ВидДоступаОМД = Метаданные.НайтиПоПолномуИмени(ТипВидаДоступа); - - Если ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ВидДоступаОМД) Тогда - Используется = Истина; - КонецЕсли; - КонецЦикла; + СвойстваВидаДоступа = СвойстваВидаДоступа(ВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + Возврат Используется; + КонецЕсли; + + ТипЗначенийОМД = Метаданные.НайтиПоТипу(СвойстваВидаДоступа.ТипЗначений); + + Если ОбщегоНазначения.ОбъектМетаданныхДоступенПоФункциональнымОпциям(ТипЗначенийОМД) Тогда + Используется = Истина; + КонецЕсли; ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииИспользованияВидаДоступа"); + Для Каждого Обработчик Из ОбработчикиСобытия Цикл - Обработчик.Модуль.ПриЗаполненииИспользованияВидаДоступа(ВидДоступа, Используется); + Обработчик.Модуль.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); КонецЦикла; - УправлениеДоступомПереопределяемый.ЗаполнитьИспользованиеВидаДоступа(ВидДоступа, Используется); + УправлениеДоступомПереопределяемый.ПриЗаполненииИспользованияВидаДоступа(СвойстваВидаДоступа.Имя, Используется); Возврат Используется; @@ -1748,101 +1726,38 @@ // Возвращает свойства вида доступа или всех видов доступа. // // Параметры: -// ВидДоступа - Строка, ПланВидовХарактеристикСсылка.ВидыДоступа, Неопределено. +// ВидДоступа - Ссылка - пустая ссылка основного типа, +// - Строка - имя вида доступа +// - Неопределено - вернуть массив свойств всех видов доступа. // // Возвращаемое значение: // Неопределено - когда для вида доступа свойств не найдено, -// ТаблицаЗначений или Структура со свойствами, +// Структура - свойства найденного вида доступа, +// Массив Структур со свойствами, // описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). +// СвойстваВидовДоступа в модуле менеджера константы ПараметрыОграниченияДоступа. // Функция СвойстваВидаДоступа(Знач ВидДоступа = Неопределено) Экспорт Свойства = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; Если ВидДоступа = Неопределено Тогда - Возврат Свойства.Таблица.Получить(); - - ИначеЕсли ТипЗнч(ВидДоступа) = Тип("Строка") Тогда - Возврат Свойства.ПоИменам.Получить(ВидДоступа); - + Возврат Свойства.Массив; КонецЕсли; - Возврат Свойства.ПоСсылкам.Получить(ВидДоступа); + СвойстваВидаДоступа = Свойства.ПоИменам.Получить(ВидДоступа); + + Если СвойстваВидаДоступа = Неопределено Тогда + СвойстваВидаДоступа = Свойства.ПоСсылкам.Получить(ВидДоступа); + КонецЕсли; + + Возврат СвойстваВидаДоступа; КонецФункции //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для работы с наборами значений доступа -// Заполняет вспомогательные данные, ускоряющие работу шаблонов ограничений доступа. -// Выполняется перед записью в регистр НаборыЗначенийДоступа или -// перед записью объекта с табличной частью НаборыЗначенийДоступа. -// -// Параметры: -// СсылкаНаОбъект - СправочникСсылка.*, ДокументСсылка.*, ... -// Таблица - ТабличнаяЧасть (или ТаблицаЗначений), РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа -// -Процедура ПодготовкаНаборовЗначенийДоступаПередЗаписью(СсылкаНаОбъект, Таблица) Экспорт - - ПодготовкаНабораЗаписей = ТипЗнч(Таблица) = Тип("РегистрСведенийНаборЗаписей.НаборыЗначенийДоступа"); - - // Нормализация ресурсов Чтение, Добавление, Изменение, Удаление. - НомерНабора = -1; - Для каждого Строка Из Таблица Цикл - - Если ПодготовкаНабораЗаписей Тогда - // Установка значения измерения Объект - Строка.Объект = СсылкаНаОбъект; - // Заполнение свойств вида доступа: - // ВидДоступаБезГруппЗначенияДоступа, - // ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - // ВидДоступаЧерезПраваПоЗначениямДоступа - СвойстваВидаДоступа = СвойстваВидаДоступа(Строка.ВидДоступа); - Если СвойстваВидаДоступа <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(Строка, СвойстваВидаДоступа(Строка.ВидДоступа)); - КонецЕсли; - // Установка типа объекта для одной строки всех наборов (в качестве типа пустая ссылка) - Если НомерНабора = -1 Тогда - ТипыОбъекта = Новый Массив; - ТипыОбъекта.Добавить(ТипЗнч(СсылкаНаОбъект)); - ОписаниеТипаОбъекта = Новый ОписаниеТипов(ТипыОбъекта); - Строка.ТипОбъекта = ОписаниеТипаОбъекта.ПривестиЗначение(Неопределено); - КонецЕсли; - // Установка типа значения доступа для значений доступа по видам доступа - // ПравоЧтения, ПравоДобавления, ПравоИзменения (в качестве типа пустая ссылка) - Если Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения - ИЛИ Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления - ИЛИ Строка.ВидДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения Тогда - МенеджерОбъекта = ?(Строка.ЗначениеДоступа <> Неопределено, ОбщегоНазначения.МенеджерОбъектаПоСсылке(Строка.ЗначениеДоступа), Неопределено); - Если МенеджерОбъекта <> Неопределено Тогда - Строка.ТипЗначенияДоступа = МенеджерОбъекта.ПустаяСсылка(); - КонецЕсли; - КонецЕсли; - КонецЕсли; - - // Очистка флажков прав и соответствующих им вторичных данных - // для всех строк каждого набора, кроме первой строки - Если НомерНабора = Строка.НомерНабора Тогда - Строка.Чтение = Ложь; - Строка.Добавление = Ложь; - Строка.Изменение = Ложь; - Строка.Удаление = Ложь; - Иначе - НомерНабора = Строка.НомерНабора; - КонецЕсли; - - Если ПодготовкаНабораЗаписей Тогда - // Описание прав Чтение, Добавление, Изменение через ссылки видов доступа для - // оптимизации работы механизма зависимостей по правам в шаблоне ограничения доступа - Строка.ВидДоступаПравоЧтения = ?(Строка.Чтение, ПланыВидовХарактеристик.ВидыДоступа.ПравоЧтения, ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка()); - Строка.ВидДоступаПравоДобавления = ?(Строка.Добавление, ПланыВидовХарактеристик.ВидыДоступа.ПравоДобавления, ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка()); - Строка.ВидДоступаПравоИзменения = ?(Строка.Изменение, ПланыВидовХарактеристик.ВидыДоступа.ПравоИзменения, ПланыВидовХарактеристик.ВидыДоступа.ПустаяСсылка()); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - // Возвращает новые наборы для заполнения табличной части. Функция ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект) Экспорт @@ -1850,50 +1765,24 @@ ТипЗначенияОбъект = ТипЗнч(Объект); Если Объект.Метаданные().ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверные параметры. - |Тип объекта ""%1"" - |не найдена табличная часть ""Наборы значений доступа"".'"), - ТипЗначенияОбъект)); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверные параметры. + |У объекта типа ""%1"" + |не найдена табличная часть ""Наборы значений доступа"".'"), + ТипЗначенияОбъект); КонецЕсли; Таблица = УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(); - Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда - - НаборыЗаполняются = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( - "ЗаписатьНаборыЗначенийДоступа - |ЗаписатьЗависимыеНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; - - Если НЕ НаборыЗаполняются Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверные параметры. - |Тип объекта ""%1"" - |не найден ни в одной из подписок на события - |""Записать наборы значений доступа"", - |""Записать зависимые наборы значений доступа"".'"), - ТипЗначенияОбъект)); - КонецЕсли; - - Объект.ЗаполнитьНаборыЗначенийДоступа(Таблица); - - Если Таблица.Количество() = 0 Тогда - // Если это условие отключить, тогда зациклится регламентное задание - // заполнения данных для ограничения доступа. - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Объект ""%1"" сформировал пустой набор значений доступа.'"), - ТипЗначенияОбъект)); - КонецЕсли; - - УправлениеДоступом.ДобавитьНаборыЗначенийДоступа(Таблица, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); - - ПодготовкаНаборовЗначенийДоступаПередЗаписью(СсылкаНаОбъект, Таблица); - + Если НЕ УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда + Возврат Таблица; КонецЕсли; + УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(Объект, Таблица); + + УправлениеДоступом.ДобавитьНаборыЗначенийДоступа( + Таблица, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); + Возврат Таблица; КонецФункции @@ -1915,7 +1804,7 @@ // В случае вызова с клиента можно передать только ссылку, а нужен объект. // Если получена ссылка, то по ней будет получен объект. // -Процедура ЗаписатьНаборыЗначенийДоступа(Знач Объект) Экспорт +Процедура ЗаписатьНаборыЗначенийДоступа(Знач Объект, ЕстьИзменения = Неопределено) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -1929,43 +1818,70 @@ "ЗаписатьНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; Если НЕ НаборыЗаписываются Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверные параметры. |Тип объекта ""%1"" - |не найден в подписке на события + |не найден в подписках на события |""Записать наборы значений доступа"".'"), - ТипЗначенияОбъект)); + ТипЗначенияОбъект); КонецЕсли; - Если Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип.Типы().Найти(ТипЗнч(СсылкаНаОбъект)) = Неопределено Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ВозможныеТипыОбъектов = УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы( + "РегистрСведений.НаборыЗначенийДоступа.Измерение.Объект"); + + Если ВозможныеТипыОбъектов.Получить(ТипЗнч(СсылкаНаОбъект)) = Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Ошибка при записи наборов значений доступа: |в регистре сведений НаборыЗначенийДоступа в измерении Объект - |не задан тип %1'"), - СсылкаНаОбъект.Метаданные().ПолноеИмя())); + |не задан тип ""%1"".'"), + СсылкаНаОбъект.Метаданные().ПолноеИмя()); КонецЕсли; - НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); - Если УправлениеДоступом.ОграничиватьДоступНаУровнеЗаписей() Тогда Если Метаданные.НайтиПоТипу(ТипЗначенияОбъект).ТабличныеЧасти.Найти("НаборыЗначенийДоступа") = Неопределено Тогда - УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(Объект, НаборЗаписей); + Таблица = УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(); + УправлениеДоступом.ЗаполнитьНаборыЗначенийДоступа(Объект, Таблица); УправлениеДоступом.ДобавитьНаборыЗначенийДоступа( - НаборЗаписей, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); + Таблица, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); Иначе + ТабличнаяЧастьЗаполняется = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( + "ЗаполнитьНаборыЗначенийДоступаТабличныхЧастей").Получить(ТипЗначенияОбъект) <> Неопределено; + + Если НЕ ТабличнаяЧастьЗаполняется Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверные параметры. + |Тип объекта ""%1"" + |не найден в подписках на события + |""Заполнить наборы значений доступа табличных частей"".'"), + ТипЗначенияОбъект); + КонецЕсли; // Записан объект с уже заполненной табличной частью НаборыЗначенийДоступа - НаборЗаписей.Загрузить(Объект.НаборыЗначенийДоступа.Выгрузить()); + Таблица = Объект.НаборыЗначенийДоступа.Выгрузить(); КонецЕсли; - НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект); - ПодготовкаНаборовЗначенийДоступаПередЗаписью(СсылкаНаОбъект, НаборЗаписей); - Если НаборыЗначенийДоступаРегистраИзменены(СсылкаНаОбъект, НаборЗаписей) Тогда - НаборЗаписей.Записать(); + ПодготовитьНаборыЗначенийДоступаКЗаписи(СсылкаНаОбъект, Таблица, Истина); + + ФиксированныйОтбор = Новый Структура; + ФиксированныйОтбор.Вставить("Объект", СсылкаНаОбъект); + + НачатьТранзакцию(); + Попытка + ОбновитьНаборыЗаписей( + РегистрыСведений.НаборыЗначенийДоступа, + Таблица, , , , , , , , , + ФиксированныйОтбор, + ЕстьИзменения); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + + Если ЕстьИзменения = Истина Тогда ПриИзмененииНаборовЗначенийДоступа(СсылкаНаОбъект); КонецЕсли; Иначе @@ -1983,8 +1899,10 @@ // Очистка устаревшего набора. // Запись нового набора будет выполнена регламентным заданием, // после включения ограничения на уровне записей. + НаборЗаписей = РегистрыСведений.НаборыЗначенийДоступа.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Объект.Установить(СсылкаНаОбъект); НаборЗаписей.Записать(); + ЕстьИзменения = Истина; // Очистка устаревших зависимых наборов. ПриИзмененииНаборовЗначенийДоступа(СсылкаНаОбъект); @@ -2026,89 +1944,131 @@ "ЗаписатьЗависимыеНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; Если НЕ ЭтоВедущийОбъект Тогда - ВызватьИсключение( - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Неверные параметры. - |Тип объекта ""%1"" - |не найден в подписке на события - |""Записать зависимые наборы значений доступа"".'"), - ТипЗначенияОбъект)); + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверные параметры. + |Тип объекта ""%1"" + |не найден в подписке на события + |""Записать зависимые наборы значений доступа"".'"), + ТипЗначенияОбъект); КонецЕсли; ПриИзмененииНаборовЗначенийДоступа(СсылкаНаОбъект); КонецПроцедуры -// Проверяет, что наборы в табличной части отличаются от новых наборов. -Функция НаборыЗначенийДоступаТабличнойЧастиИзменены(СсылкаНаОбъект, НовыеНаборы) Экспорт +// Выполняет обновление наборов значений доступа объекта, если они изменились. +// Наборы обновляются в табличной части (если используется) и +// в регистре сведений НаборыЗначенийДоступа. +// +// Параметры: +// СсылкаНаОбъект - СправочникСсылка, ДокументСсылка, ... +// +Процедура ОбновитьНаборыЗначенийДоступа(СсылкаНаОбъект, ЕстьИзменения = Неопределено) Экспорт - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("СтарыеНаборы", ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаОбъект, "НаборыЗначенийДоступа")); - Запрос.УстановитьПараметр("НовыеНаборы", НовыеНаборы); - Запрос.Текст = - "ВЫБРАТЬ - | НовыеНаборы.НомерНабора, - | НовыеНаборы.ВидДоступа, - | НовыеНаборы.ЗначениеДоступа, - | НовыеНаборы.Чтение, - | НовыеНаборы.Добавление, - | НовыеНаборы.Изменение, - | НовыеНаборы.Удаление - |ПОМЕСТИТЬ НовыеНаборы - |ИЗ - | &НовыеНаборы КАК НовыеНаборы - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ - | СтарыеНаборы.НомерНабора, - | СтарыеНаборы.ВидДоступа, - | СтарыеНаборы.ЗначениеДоступа, - | СтарыеНаборы.Чтение, - | СтарыеНаборы.Добавление, - | СтарыеНаборы.Изменение, - | СтарыеНаборы.Удаление - |ПОМЕСТИТЬ СтарыеНаборы - |ИЗ - | &СтарыеНаборы КАК СтарыеНаборы - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | СтарыеНаборы КАК СтарыеНаборы - | ЛЕВОЕ СОЕДИНЕНИЕ НовыеНаборы КАК НовыеНаборы - | ПО СтарыеНаборы.НомерНабора = НовыеНаборы.НомерНабора - | И СтарыеНаборы.ВидДоступа = НовыеНаборы.ВидДоступа - | И СтарыеНаборы.ЗначениеДоступа = НовыеНаборы.ЗначениеДоступа - | И СтарыеНаборы.Чтение = НовыеНаборы.Чтение - | И СтарыеНаборы.Добавление = НовыеНаборы.Добавление - | И СтарыеНаборы.Изменение = НовыеНаборы.Изменение - | И СтарыеНаборы.Удаление = НовыеНаборы.Удаление - |ГДЕ - | НовыеНаборы.НомерНабора ЕСТЬ NULL - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - |ИЗ - | НовыеНаборы КАК НовыеНаборы - | ЛЕВОЕ СОЕДИНЕНИЕ СтарыеНаборы КАК СтарыеНаборы - | ПО (СтарыеНаборы.НомерНабора = НовыеНаборы.НомерНабора) - | И (СтарыеНаборы.ВидДоступа = НовыеНаборы.ВидДоступа) - | И (СтарыеНаборы.ЗначениеДоступа = НовыеНаборы.ЗначениеДоступа) - | И (СтарыеНаборы.Чтение = НовыеНаборы.Чтение) - | И (СтарыеНаборы.Добавление = НовыеНаборы.Добавление) - | И (СтарыеНаборы.Изменение = НовыеНаборы.Изменение) - | И (СтарыеНаборы.Удаление = НовыеНаборы.Удаление) - |ГДЕ - | СтарыеНаборы.НомерНабора ЕСТЬ NULL "; + УстановитьПривилегированныйРежим(Истина); - Возврат НЕ Запрос.Выполнить().Пустой(); + // Если передача параметра Объект производилась с клиента на сервер, + // то передавалась ссылка, и объект требуется получить. + Объект = СсылкаНаОбъект.ПолучитьОбъект(); + ТипЗначенияОбъект = ТипЗнч(Объект); -КонецФункции + НаборыЗаписываются = УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( + "ЗаписатьНаборыЗначенийДоступа").Получить(ТипЗначенияОбъект) <> Неопределено; + + Если НЕ НаборыЗаписываются Тогда + ВызватьИсключение( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверные параметры. + |Тип объекта ""%1"" + |не найден в подписке на события + |""Записать наборы значений доступа"".'"), + ТипЗначенияОбъект)); + КонецЕсли; + + Если Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип.Типы().Найти(ТипЗнч(СсылкаНаОбъект)) = Неопределено Тогда + ВызватьИсключение( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при записи наборов значений доступа: + |в регистре сведений НаборыЗначенийДоступа в измерении Объект + |не задан тип %1'"), + СсылкаНаОбъект.Метаданные().ПолноеИмя())); + КонецЕсли; + + Если СсылкаНаОбъект.Метаданные().ТабличныеЧасти.Найти("НаборыЗначенийДоступа") <> Неопределено Тогда + // Обновление объекта требуется + Таблица = ПолучитьНаборыЗначенийДоступаТабличнойЧасти(Объект); + + Если НаборыЗначенийДоступаТабличнойЧастиИзменены(СсылкаНаОбъект, Таблица) Тогда + ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, Таблица, Ложь); + + Объект.ОбменДанными.Загрузка = Истина; + Объект.ДополнительныеСвойства.Вставить("ЗаписатьНаборыЗначенийДоступа"); + Объект.ДополнительныеСвойства.Вставить("ЗаписатьЗависимыеНаборыЗначенийДоступа"); + Объект.ДополнительныеСвойства.Вставить("НаборыЗначенийДоступаТабличнойЧастиЗаполнены"); + Объект.НаборыЗначенийДоступа.Загрузить(Таблица); + Объект.Записать(); + ЕстьИзменения = Истина; + КонецЕсли; + КонецЕсли; + + // Обновление объекта не требуется или объект уже обновлен. + ЗаписатьНаборыЗначенийДоступа(Объект, ЕстьИзменения); + +КонецПроцедуры + +// Заполняет вспомогательные данные, ускоряющие работу шаблонов ограничений доступа. +// Выполняется перед записью в регистр НаборыЗначенийДоступа. +// +// Параметры: +// СсылкаНаОбъект - СправочникСсылка.*, ДокументСсылка.*, ... +// Таблица - ТаблицаЗначений. +// +Процедура ПодготовитьНаборыЗначенийДоступаКЗаписи(СсылкаНаОбъект, Таблица, ДобавитьКэшРеквизиты = Ложь) Экспорт + + Если ДобавитьКэшРеквизиты Тогда + + Таблица.Колонки.Добавить("Объект", Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип); + Таблица.Колонки.Добавить("СтандартноеЗначение", Новый ОписаниеТипов("Булево")); + Таблица.Колонки.Добавить("ЗначениеБезГрупп", Новый ОписаниеТипов("Булево")); + + Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + + ТипыЗначенийДоступаСГруппами = Параметры.СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами; + ТипыЗначенийДоступа = Параметры.СвойстваВидовДоступа.ПоТипамЗначений; + ОтдельныеТаблицы = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ОтдельныеТаблицы; + ТипыВладельцевНастроекПрав = Параметры.ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; + КонецЕсли; + + // Нормализация ресурсов Чтение, Изменение. + НомерНабора = -1; + Для каждого Строка Из Таблица Цикл + + Если ДобавитьКэшРеквизиты Тогда + // Установка значения измерения Объект + Строка.Объект = СсылкаНаОбъект; + + ТипЗначенияДоступа = ТипЗнч(Строка.ЗначениеДоступа); + + Если ТипыЗначенийДоступа.Получить(ТипЗначенияДоступа) <> Неопределено Тогда + Строка.СтандартноеЗначение = Истина; + Если ТипыЗначенийДоступаСГруппами.Получить(ТипЗначенияДоступа) = Неопределено Тогда + Строка.ЗначениеБезГрупп = Истина; + КонецЕсли; + КонецЕсли; + + КонецЕсли; + + // Очистка флажков прав и соответствующих им вторичных данных + // для всех строк каждого набора, кроме первой строки + Если НомерНабора = Строка.НомерНабора Тогда + Строка.Чтение = Ложь; + Строка.Изменение = Ложь; + Иначе + НомерНабора = Строка.НомерНабора; + КонецЕсли; + КонецЦикла; + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // Процедуры и функции для действий при изменений настроек подсистемы @@ -2133,128 +2093,29 @@ НСтр("ru = 'Начато заполнение данных для ограничения доступа.'"), РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная); - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - ПриВключенииЗаполненияДанныхДляОграниченияДоступа(Истина); - Иначе - Задание = РегламентныеЗадания.НайтиПредопределенное( - Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа); - Задание.Использование = Истина; - Задание.Записать(); - КонецЕсли; + УстановитьЗаполнениеДанныхДляОграниченияДоступа(Истина); КонецЕсли; // Обновление параметров сеанса. // Требуется для того, чтобы администратор не выполнял перезапуск. УстановленныеПараметры = Новый Массив; - УстановкаПараметровСеанса("ОграничиватьДоступПоВиду", УстановленныеПараметры); + УстановкаПараметровСеанса("", УстановленныеПараметры); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции для работы интерфейсов пользователей - -// Возвращает список значений доступа не помеченных на удаление. -// Используется в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. -// -// Параметры: -// Текст - Строка, символы введенные пользователем. -// ВключаяГруппы - Булево, если Истина, включать группы пользователей и внешних пользователей. -// ВидДоступа - ПланыВидовХарактеристикСсылка.ВидыДоступа, значения доступа которого выбираются. -// -Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) Экспорт +// Возвращает вид интерфейса пользователя для настройки доступа. +Функция УпрощенныйИнтерфейсНастройкиПравДоступа() Экспорт - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("Текст", Текст + "%"); - Запрос.УстановитьПараметр("ВключаяГруппы", ВключаяГруппы); - Запрос.Текст = - "ВЫБРАТЬ - | ПредставленияПеречислений.Ссылка, - | ПредставленияПеречислений.Наименование КАК Наименование - |ПОМЕСТИТЬ ПредставленияПеречислений - |ИЗ - | &ПредставленияПеречислений КАК ПредставленияПеречислений - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | НЕОПРЕДЕЛЕНО КАК Ссылка, - | """" КАК Наименование - |ГДЕ - | ЛОЖЬ"; + УпрощенныйИнтерфейс = Ложь; + УправлениеДоступомПереопределяемый.ПриОпределенииИнтерфейсаНастройкиДоступа(УпрощенныйИнтерфейс); - ЗапросПредставленийПеречислений = Новый Запрос; - ЗапросПредставленийПеречислений.Текст = - "ВЫБРАТЬ - | """" КАК Ссылка, - | """" КАК Наименование - |ГДЕ - | ЛОЖЬ"; - - Для каждого Тип Из ВидДоступа.ТипЗначения.Типы() Цикл - - МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); - - ПолноеИмяТаблицы = МетаданныеТипа.ПолноеИмя(); - - Если ( Метаданные.Справочники.Содержит(МетаданныеТипа) - ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеТипа) ) - И МетаданныеТипа.Иерархический - И МетаданныеТипа.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов - И НЕ ВключаяГруппы Тогда - - УсловиеДляГруппы = "НЕ Таблица.ЭтоГруппа"; - Иначе - УсловиеДляГруппы = "Истина"; - КонецЕсли; - - Если Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда - // - ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; - ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + СтрЗаменить( - "ВЫБРАТЬ - | Таблица.Ссылка, - | ПРЕДСТАВЛЕНИЕ(Таблица.Ссылка) КАК Наименование - |ИЗ - | &ПолноеИмяТаблицы КАК Таблица", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы); - Иначе - Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; - Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить( - "ВЫБРАТЬ - | Таблица.Ссылка, - | Таблица.Наименование - |ИЗ - | &ПолноеИмяТаблицы КАК Таблица - |ГДЕ - | (НЕ Таблица.ПометкаУдаления) - | И Таблица.Наименование ПОДОБНО &Текст - | И &УсловиеДляГруппы", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы), "&УсловиеДляГруппы", УсловиеДляГруппы); - КонецЕсли; - КонецЦикла; - - Запрос.УстановитьПараметр("ПредставленияПеречислений", ЗапросПредставленийПеречислений.Выполнить().Выгрузить()); - Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; - Запрос.Текст = Запрос.Текст + - "ВЫБРАТЬ - | ПредставленияПеречислений.Ссылка, - | ПредставленияПеречислений.Наименование - |ИЗ - | ПредставленияПеречислений КАК ПредставленияПеречислений - |ГДЕ - | ПредставленияПеречислений.Наименование ПОДОБНО &Текст"; - - ДанныеВыбора = Новый СписокЗначений; - - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - - ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); - КонецЦикла; - - Возврат ДанныеВыбора; + Возврат УпрощенныйИнтерфейс = Истина; КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции для работы интерфейсов пользователей + // Возвращает название объекта метаданных с учетом заданных свойств в порядке: // - РасширенноеПредставлениеОбъекта, // - ПредставлениеОбъекта, @@ -2283,6 +2144,187 @@ КонецФункции +//////////////////////////////////////////////////////////////////////////////// +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования + +// Заполняет вспомогательные данные, требуемые для работы формы, +// которые не зависят от содержания объекта или заполняются для нового объекта. +// +// Форма должна содержать реквизиты, указанные ниже. +// Реквизиты отмеченные символом * заполняются автоматически, но их нужно создать в форме. +// Реквизиты отмеченные символом # должны быть созданы в форме, если +// в форме будет создан реквизит ТекущаяГруппаДоступа (см. ниже). +// Реквизиты отмеченные символом @ будут созданы автоматически. +// +// ТекущаяГруппаДоступа - необязательный реквизит, +// если не создан в форме, тогда не используется. +// +// ВидыДоступа - Таблица с полями: +// #ГруппаДоступа - СправочникСсылка.ГруппыДоступа, +// ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, +// Предустановленный - Булево (только для профиля), +// ВсеРазрешены - Булево, +// *ВидДоступаПредставление - Строка - представление настройки, +// *ВсеРазрешеныПредставление - Строка - представление настройки, +// @Используется - Булево. +// +// ЗначенияДоступа - Таблица с полями: +// #ГруппаДоступа - СправочникСсылка.ГруппыДоступа, +// *ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, +// ЗначениеДоступа - ОпределяемыйТип.ЗначениеДоступа, +// *НомерСтрокиПоВиду - Число. +// +// *ИспользоватьВнешнихПользователей - Булево - реквизит будет создан, если нет в форме. +// *НадписьВидДоступа - Строка - представление текущего вида доступа в форме. +// @ЭтоПрофильГруппДоступа - Булево. +// @ТекущийВидДоступа - ОпределяемыйТип.ЗначениеДоступа. +// @ТекущиеТипыВыбираемыхЗначений - СписокЗначений. +// @ТекущийТипВыбираемыхЗначений - ОпределяемыйТип.ЗначениеДоступа. +// @ИмяРеквизитаХранилищаТаблиц - Строка. +// @ВидДоступаПользователи - ОпределяемыйТип.ЗначениеДоступа. +// @ВидДоступаВнешниеПользователи - ОпределяемыйТип.ЗначениеДоступа. +// +// @ВсеВидыДоступа - Таблица с полями: +// @Ссылка - ОпределяемыйТип.ЗначениеДоступа, +// @Представление - Строка, +// @Используется - Булево. +// +// @ПредставленияВсеРазрешены - Таблица с полями: +// @Имя - Строка, +// @Представление - Строка. +// +// @ВсеТипыВыбираемыхЗначений - Таблица с полями: +// @ВидДоступа - ОпределяемыйТип.ЗначениеДоступа, +// @ТипЗначений - ОпределяемыйТип.ЗначениеДоступа, +// @ПредставлениеТипа - Строка, +// @ИмяТаблицы - Строка. +// +// Параметры: +// Форма - УправляемаяФорма, которую требуется настроить для +// редактирования разрешенных значений. +// +// ЭтоПрофиль - Булево - указывает, что возможна настройка видов доступа +// в том числе представление настройки содержит 4 значения, а не 2. +// +// ИмяРеквизитаХранилищаТаблиц - Строка, содержащая, например, строку "Объект", которая +// содержит таблицы ВидыДоступа и ЗначенияДоступа (см. ниже). +// Если указана пустая строка, тогда считается, +// что таблицы хранятся в реквизитах формы. +// +Процедура ПриСозданииНаСервереФормыРедактированияРазрешенныхЗначений(Форма, ЭтоПрофиль = Ложь, ИмяРеквизитаХранилищаТаблиц = "Объект") Экспорт + + ДобавитьРеквизитыВспомогательныхДанныхВФорму(Форма, ИмяРеквизитаХранилищаТаблиц); + + Форма.ИмяРеквизитаХранилищаТаблиц = ИмяРеквизитаХранилищаТаблиц; + Форма.ЭтоПрофильГруппДоступа = ЭтоПрофиль; + + // Заполнение типов значений доступа всех видов доступа. + Для каждого СвойстваВидаДоступа Из СвойстваВидаДоступа() Цикл + Для каждого Тип Из СвойстваВидаДоступа.ТипыВыбираемыхЗначений Цикл + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип); + ОписаниеТипа = Новый ОписаниеТипов(МассивТипов); + + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + Если Метаданные.Перечисления.Найти(МетаданныеТипа.Имя) = МетаданныеТипа Тогда + ПредставлениеТипа = МетаданныеТипа.Представление(); + Иначе + ПредставлениеТипа = ?(ЗначениеЗаполнено(МетаданныеТипа.ПредставлениеОбъекта), + МетаданныеТипа.ПредставлениеОбъекта, + МетаданныеТипа.Представление()); + КонецЕсли; + + НоваяСтрока = Форма.ВсеТипыВыбираемыхЗначений.Добавить(); + НоваяСтрока.ВидДоступа = СвойстваВидаДоступа.Ссылка; + НоваяСтрока.ТипЗначений = ОписаниеТипа.ПривестиЗначение(Неопределено); + НоваяСтрока.ПредставлениеТипа = ПредставлениеТипа; + НоваяСтрока.ИмяТаблицы = МетаданныеТипа.ПолноеИмя(); + КонецЦикла; + КонецЦикла; + + Форма.ВидДоступаПользователи = Справочники.Пользователи.ПустаяСсылка(); + Форма.ВидДоступаВнешниеПользователи = Справочники.ВнешниеПользователи.ПустаяСсылка(); + Форма.ИспользоватьВнешнихПользователей = ВнешниеПользователи.ИспользоватьВнешнихПользователей(); + + ЗаполнитьТаблицуВсеВидыДоступаВФорме(Форма); + + ЗаполнитьТаблицуПредставленияВсеРазрешеныВФорме(Форма, ЭтоПрофиль); + + ОформитьТаблицуВидыДоступаВФорме(Форма); + + УдалитьНесуществующиеВидыИЗначенияДоступа(Форма); + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(Форма); + + ОбновитьОтображениеНеиспользуемыхВидовДоступа(Форма, Истина); + +КонецПроцедуры + +// При повторном чтении заполняет или обновляет вспомогательные данные, +// требуемые для работы формы, которые зависят от содержания объекта. +// +Процедура ПриПовторномЧтенииНаСервереФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект) Экспорт + + УдалитьНесуществующиеВидыИЗначенияДоступа(Форма, ТекущийОбъект); + УдалитьНесуществующиеВидыИЗначенияДоступа(Форма); + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(Форма); + + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + +КонецПроцедуры + +// Удаляет лишние значения доступа перед записью. +// Лишние значения доступа могут появиться, если заменить или удалить вид доступа, +// для которого введены значения доступа. +// +Процедура ПередЗаписьюНаСервереФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект) Экспорт + + УдалитьЛишниеЗначенияДоступа(Форма, ТекущийОбъект); + УдалитьЛишниеЗначенияДоступа(Форма); + +КонецПроцедуры + +// Обновляет свойства видов доступа. +Процедура ПослеЗаписиНаСервереФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект, ПараметрыЗаписи) Экспорт + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(Форма); + +КонецПроцедуры + +// Скрывает или показывает неиспользуемые виды доступа. +Процедура ОбновитьОтображениеНеиспользуемыхВидовДоступа(Форма, ПриСозданииНаСервере = Ложь) Экспорт + + Элементы = Форма.Элементы; + + Если Не ПриСозданииНаСервере Тогда + Элементы.ПоказыватьНеИспользуемыеВидыДоступа.Пометка = + НЕ Элементы.ПоказыватьНеИспользуемыеВидыДоступа.Пометка; + КонецЕсли; + + Отбор = УправлениеДоступомСлужебныйКлиентСервер.ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма); + + Если Не Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка Тогда + Отбор.Вставить("Используется", Истина); + КонецЕсли; + + Элементы.ВидыДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор); + + Элементы.ВидыДоступаВидДоступаПредставление.СписокВыбора.Очистить(); + + Для каждого Строка Из Форма.ВсеВидыДоступа Цикл + + Если Не Элементы.ПоказыватьНеиспользуемыеВидыДоступа.Пометка + И Не Строка.Используется Тогда + + Продолжить; + КонецЕсли; + + Элементы.ВидыДоступаВидДоступаПредставление.СписокВыбора.Добавить(Строка.Представление); + КонецЦикла; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Универсальные процедуры и функции @@ -2937,6 +2979,52 @@ КонецПроцедуры +// Возвращает пустую ссылку объекта метаданных ссылочного типа. +// +// Параметры: +// ОписаниеОбъектаМетаданных - ОбъектМетаданных, +// - Тип, по которому можно найти объект метаданных, +// - Строка - полное имя объекта метаданных. +// Возвращаемое значение: +// Ссылка. +// +Функция ПустаяСсылкаОбъектаМетаданных(ОписаниеОбъектаМетаданных) Экспорт + + Если ТипЗнч(ОписаниеОбъектаМетаданных) = Тип("ОбъектМетаданных") Тогда + ОбъектМетаданных = ОписаниеОбъектаМетаданных; + + ИначеЕсли ТипЗнч(ОписаниеОбъектаМетаданных) = Тип("Тип") Тогда + ОбъектМетаданных = Метаданные.НайтиПоТипу(ОписаниеОбъектаМетаданных); + Иначе + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ОписаниеОбъектаМетаданных); + КонецЕсли; + + Если ОбъектМетаданных = Неопределено Тогда + ВызватьИсключение + НСтр("ru = 'Ошибка в функции ПустаяСсылкаОбъектаМетаданных + |общего модуля УправлениеДоступомСлужебный. + | + |Наверный параметр ОписаниеОбъектаМетаданных.'"); + КонецЕсли; + + ПустаяСсылка = Неопределено; + Попытка + МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + ПустаяСсылка = МенеджерОбъекта.ПустаяСсылка(); + Исключение + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка в функции ПустаяСсылкаОбъектаМетаданных + |общего модуля УправлениеДоступомСлужебный. + | + |Не удалось получить пустую ссылка для объекта метаданных + |""%1"".'"), + ОбъектМетаданных.ПолноеИмя()); + КонецПопытки; + + Возврат ПустаяСсылка; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции @@ -3123,8 +3211,8 @@ // Процедура ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, ЗначениеПараметра, НетГруппИсполнителей) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда - МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.БизнесПроцессыИЗадачи") Тогда + МодульБизнесПроцессыИЗадачиСервер = ОбщегоНазначения.ОбщийМодуль("БизнесПроцессыИЗадачиСервер"); МодульБизнесПроцессыИЗадачиСервер.ПриОпределенииГруппИсполнителей(МенеджерВременныхТаблиц, СодержаниеПараметра, ЗначениеПараметра); НетГруппИсполнителей = Ложь; Иначе @@ -3133,20 +3221,6 @@ КонецПроцедуры -// Устанавливает использование регламентного задания заполнения данных управления доступом. -// -// Параметры: -// Использование - Булево - Истина, если задание нужно включить, иначе Ложь. -// -Процедура ПриВключенииЗаполненияДанныхДляОграниченияДоступа(Знач Использование) - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда - МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); - МодульУправлениеДоступомСлужебныйВМоделиСервиса.ВключитьЗаполнениеДанныхДляОграниченияДоступа(Использование); - КонецЕсли; - -КонецПроцедуры - // Создает / обновляет запись запись пользователя сервиса. // // Параметры: @@ -3158,8 +3232,8 @@ // Процедура ПриЗаписиПользователяСервиса(Знач Пользователь, Знач СоздатьПользователяСервиса, Знач ПарольПользователяСервиса) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); МодульПользователиСлужебныйВМоделиСервиса.ЗаписатьПользователяСервиса(Пользователь, СоздатьПользователяСервиса, ПарольПользователяСервиса); КонецЕсли; @@ -3176,13 +3250,311 @@ // Процедура ПриПолученииДействийСПользователемСервиса(ДоступныеДействия, Знач Пользователь = Неопределено) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда - МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда + МодульПользователиСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("ПользователиСлужебныйВМоделиСервиса"); ДоступныеДействия = МодульПользователиСлужебныйВМоделиСервиса.ПолучитьДействияСПользователемСервиса(Пользователь); КонецЕсли; КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// Обновление информационной базы + +// Заполняет обработчик разделенных данных, зависимый от изменения неразделенных данных. +// +// Параметры: +// Обработчики - ТаблицаЗначений, Неопределено - см. описание +// функции НоваяТаблицаОбработчиковОбновления общего модуля +// ОбновлениеИнформационнойБазы. +// В случае прямого вызова (не через механизм обновления +// версии ИБ) передается Неопределено. +// +Процедура ЗаполнитьОбработчикиРазделенныхДанных(Параметры = Неопределено) Экспорт + + Если Параметры <> Неопределено И ЕстьИзмененияПараметровОграниченияДоступа() Тогда + Обработчики = Параметры.РазделенныеОбработчики; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "*"; + Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации"; + КонецЕсли; + +КонецПроцедуры + +// Обновляет вспомогательные данные, которые зависят только +// от конфигурации. +// Записывает изменения этих данных по версиям конфигурации +// (если изменения есть), чтобы использовать эти изменения +// при обновлении остальных вспомогательных данных, например, +// в обработчике ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации. +// +Процедура ОбновитьПараметрыОграниченияДоступа(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваРолей"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗависимостиПравДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + + Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда + СнятьМонопольныйРежим = Ложь; + Иначе + СнятьМонопольныйРежим = Истина; + УстановитьМонопольныйРежим(Истина); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра( + ЕстьИзменения, ТолькоПроверка); + + Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда + РегистрыСведений.ЗависимостиПравДоступа.ОбновитьДанныеРегистра( + ЕстьИзменения, ТолькоПроверка); + КонецЕсли; + + Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда + Константы["ПараметрыОграниченияДоступа"].СоздатьМенеджерЗначения( + ).ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения, ТолькоПроверка); + КонецЕсли; + + Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда + Справочники.ПрофилиГруппДоступа.ОбновитьОписаниеПоставляемыхПрофилей( + ЕстьИзменения, ТолькоПроверка); + КонецЕсли; + + Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда + Справочники.ПрофилиГруппДоступа.ОбновитьСоставПредопределенныхПрофилей( + ЕстьИзменения, ТолькоПроверка); + КонецЕсли; + + Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда + РегистрыСведений.НастройкиПравОбъектов.ОбновитьВозможныеПраваДляНастройкиПравОбъектов( + ЕстьИзменения, ТолькоПроверка); + КонецЕсли; + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + Если СнятьМонопольныйРежим Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + Если СнятьМонопольныйРежим Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + +КонецПроцедуры + +// Очищает вспомогательные данные, которые зависят только +// от конфигурации. +// Используется как обработчик очистки вспомогательных данных, +// которые зависят только от конфигурации, чтобы вызвать проверку и +// обновление остальных вспомогательных данных при обновлении ИБ, +// например, в обработчике ОбновитьВспомогательныеДанныеПриОбновленииИБ. +// +Процедура ОчиститьПараметрыОграниченияДоступа() Экспорт + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваРолей"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗависимостиПравДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + + Если МонопольныйРежим() Тогда + СнятьМонопольныйРежим = Ложь; + Иначе + СнятьМонопольныйРежим = Истина; + УстановитьМонопольныйРежим(Истина); + КонецЕсли; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + // Очистка прав ролей. + НаборЗаписей = РегистрыСведений.ПраваРолей.СоздатьНаборЗаписей(); + НаборЗаписей.Записать(); + + // Очистка зависимостей прав. + НаборЗаписей = РегистрыСведений.ЗависимостиПравДоступа.СоздатьНаборЗаписей(); + НаборЗаписей.Записать(); + + // Очистка остальных данных построенных по метаданным и их изменений. + Константы.ПараметрыОграниченияДоступа.Установить(Новый ХранилищеЗначения(Неопределено)); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + Если СнятьМонопольныйРежим Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + ВызватьИсключение; + КонецПопытки; + + Если СнятьМонопольныйРежим Тогда + УстановитьМонопольныйРежим(Ложь); + КонецЕсли; + +КонецПроцедуры + +// Проверяет были ли изменения неразделенных данных для какой-нибудь области данных. +Функция ЕстьИзмененияПараметровОграниченияДоступа() Экспорт + + УстановитьПривилегированныйРежим(Истина); + + ПроверяемыеПараметры = Новый Массив; + ПроверяемыеПараметры.Добавить("ОбъектыМетаданныхПравРолей"); + ПроверяемыеПараметры.Добавить("ВозможныеПраваДляНастройкиПравОбъектов"); + ПроверяемыеПараметры.Добавить("ПоставляемыеПрофилиГруппДоступа"); + ПроверяемыеПараметры.Добавить("ПредопределенныеПрофилиГруппДоступа"); + ПроверяемыеПараметры.Добавить("ТипыГруппИЗначенийДоступа"); + + Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + + Для каждого ПроверяемыйПараметр Из ПроверяемыеПараметры Цикл + + ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы( + Параметры, ПроверяемыйПараметр); + + Если ПоследниеИзменения = Неопределено + ИЛИ ПоследниеИзменения.Количество() > 0 Тогда + + Возврат Истина; + КонецЕсли; + + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +// Обновляет вспомогательные данные, которые зависят от конфигурации частично. +// +// Обновляется при наличии изменений конфигурации, записанных в параметры +// ограничения доступа при обновлении базы данных на текущую версию конфигурации. +// +Процедура ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации(Параметры = Неопределено) Экспорт + + Если Параметры <> Неопределено + И НЕ Параметры.МонопольныйРежим + И ЕстьИзмененияПараметровОграниченияДоступа() Тогда + + Параметры.МонопольныйРежим = Истина; + Возврат; + КонецЕсли; + + Блокировка = Новый БлокировкаДанных; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиПравОбъектов"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); + ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + + НачатьТранзакцию(); + Попытка + Блокировка.Заблокировать(); + + РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистраПоИзменениямКонфигурации(); + РегистрыСведений.ГруппыЗначенийДоступа.ОбновитьВспомогательныеДанныеРегистраПоИзменениямКонфигурации(); + РегистрыСведений.НастройкиПравОбъектов.ОбновитьВспомогательныеДанныеРегистраПоИзменениямКонфигурации(); + Справочники.ПрофилиГруппДоступа.ОбновитьПоставляемыеПрофилиПоИзменениямКонфигурации(); + Справочники.ГруппыДоступа.ПометитьНаУдалениеГруппыДоступаПомеченныхПрофилей(); + РегистрыСведений.НаборыЗначенийДоступа.ОбновитьВспомогательныеДанныеРегистраПоИзменениямКонфигурации(); + + ЗафиксироватьТранзакцию(); + Исключение + ОтменитьТранзакцию(); + ВызватьИсключение; + КонецПопытки; + +КонецПроцедуры + +// Преобразует реквизит УдалитьРоль в реквизит Роль в табличной части Роли +// справочника Профили групп доступа. +// +Процедура ПреобразоватьИменаРолейВИдентификаторы() Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | Роли.Ссылка КАК Ссылка + |ИЗ + | Справочник.ПрофилиГруппДоступа.Роли КАК Роли + |ГДЕ + | НЕ(Роли.Роль <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) + | И Роли.УдалитьРоль = """")"; + + Выборка = Запрос.Выполнить().Выбрать(); + + Пока Выборка.Следующий() Цикл + Объект = Выборка.Ссылка.ПолучитьОбъект(); + Индекс = Объект.Роли.Количество()-1; + Пока Индекс >= 0 Цикл + Строка = Объект.Роли[Индекс]; + Если ЗначениеЗаполнено(Строка.Роль) Тогда + Строка.УдалитьРоль = ""; + ИначеЕсли ЗначениеЗаполнено(Строка.УдалитьРоль) Тогда + МетаданныеРоли = Метаданные.Роли.Найти(Строка.УдалитьРоль); + Если МетаданныеРоли <> Неопределено Тогда + Строка.УдалитьРоль = ""; + Строка.Роль = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( + МетаданныеРоли); + Иначе + Объект.Роли.Удалить(Индекс); + КонецЕсли; + Иначе + Объект.Роли.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс-1; + КонецЦикла; + ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); + КонецЦикла; + +КонецПроцедуры + +// Обновляет настройки и включает регламентное задание. +Процедура ВключитьЗаполнениеДанныхДляОграниченияДоступа() Экспорт + + ЗаданиеМетаданные = Метаданные.РегламентныеЗадания.ЗаполнениеДанныхДляОграниченияДоступа; + + Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.УправлениеДоступомВМоделиСервиса") Тогда + МодульУправлениеДоступомСлужебныйВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебныйВМоделиСервиса"); + МодульУправлениеДоступомСлужебныйВМоделиСервиса.УстановитьЗаполнениеДанныхДляОграниченияДоступа(Истина); + КонецЕсли; + Иначе + Расписание = Новый РасписаниеРегламентногоЗадания; + Расписание.ПериодНедель = 1; + Расписание.ПериодПовтораДней = 1; + Расписание.ПериодПовтораВТечениеДня = 300; + Расписание.ПаузаПовтора = 90; + + Задание = РегламентныеЗадания.НайтиПредопределенное(ЗаданиеМетаданные); + Задание.Использование = Истина; + Задание.Расписание = Расписание; + + Задание.ИнтервалПовтораПриАварийномЗавершении + = ЗаданиеМетаданные.ИнтервалПовтораПриАварийномЗавершении; + + Задание.КоличествоПовторовПриАварийномЗавершении + = ЗаданиеМетаданные.КоличествоПовторовПриАварийномЗавершении; + + Задание.Записать(); + КонецЕсли; + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции @@ -3211,6 +3583,7 @@ Если НЕ НаборыЗначенийДоступаТабличнойЧастиИзменены(СсылкаНаЗависимыйОбъект, Таблица) Тогда Продолжить; КонецЕсли; + ПодготовитьНаборыЗначенийДоступаКЗаписи(Неопределено, Таблица, Ложь); Попытка ЗаблокироватьДанныеДляРедактирования(СсылкаНаЗависимыйОбъект, Объект.ВерсияДанных); Объект.ОбменДанными.Загрузка = Истина; @@ -3235,90 +3608,6 @@ КонецПроцедуры -Функция НаборыЗначенийДоступаРегистраИзменены(СсылкаНаОбъект, НаборЗаписей) - - Запрос = Новый Запрос; - Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект); - Запрос.УстановитьПараметр("НовыеНаборы", НаборЗаписей.Выгрузить()); - Запрос.Текст = - "ВЫБРАТЬ - | НовыеНаборы.Объект, - | НовыеНаборы.НомерНабора, - | НовыеНаборы.ВидДоступа, - | НовыеНаборы.ЗначениеДоступа, - | НовыеНаборы.Чтение, - | НовыеНаборы.Добавление, - | НовыеНаборы.Изменение, - | НовыеНаборы.Удаление, - | НовыеНаборы.ВидДоступаБезГруппЗначенияДоступа, - | НовыеНаборы.ВидДоступаЕдинственныйДляТипаЗначенияДоступа, - | НовыеНаборы.ВидДоступаЧерезПраваПоЗначениямДоступа, - | НовыеНаборы.ВидДоступаПравоЧтения, - | НовыеНаборы.ВидДоступаПравоДобавления, - | НовыеНаборы.ВидДоступаПравоИзменения, - | НовыеНаборы.ТипОбъекта, - | НовыеНаборы.ТипЗначенияДоступа - |ПОМЕСТИТЬ НовыеНаборы - |ИЗ - | &НовыеНаборы КАК НовыеНаборы - |; - | - |//////////////////////////////////////////////////////////////////////////////// - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА КАК ЗначениеИстина - |ИЗ - | РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа - | ЛЕВОЕ СОЕДИНЕНИЕ НовыеНаборы КАК НовыеНаборы - | ПО НаборыЗначенийДоступа.Объект = НовыеНаборы.Объект - | И НаборыЗначенийДоступа.НомерНабора = НовыеНаборы.НомерНабора - | И НаборыЗначенийДоступа.ВидДоступа = НовыеНаборы.ВидДоступа - | И НаборыЗначенийДоступа.ЗначениеДоступа = НовыеНаборы.ЗначениеДоступа - | И НаборыЗначенийДоступа.Чтение = НовыеНаборы.Чтение - | И НаборыЗначенийДоступа.Добавление = НовыеНаборы.Добавление - | И НаборыЗначенийДоступа.Изменение = НовыеНаборы.Изменение - | И НаборыЗначенийДоступа.Удаление = НовыеНаборы.Удаление - | И НаборыЗначенийДоступа.ВидДоступаБезГруппЗначенияДоступа = НовыеНаборы.ВидДоступаБезГруппЗначенияДоступа - | И НаборыЗначенийДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = НовыеНаборы.ВидДоступаЕдинственныйДляТипаЗначенияДоступа - | И НаборыЗначенийДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа = НовыеНаборы.ВидДоступаЧерезПраваПоЗначениямДоступа - | И НаборыЗначенийДоступа.ВидДоступаПравоЧтения = НовыеНаборы.ВидДоступаПравоЧтения - | И НаборыЗначенийДоступа.ВидДоступаПравоДобавления = НовыеНаборы.ВидДоступаПравоДобавления - | И НаборыЗначенийДоступа.ВидДоступаПравоИзменения = НовыеНаборы.ВидДоступаПравоИзменения - | И НаборыЗначенийДоступа.ТипОбъекта = НовыеНаборы.ТипОбъекта - | И НаборыЗначенийДоступа.ТипЗначенияДоступа = НовыеНаборы.ТипЗначенияДоступа - |ГДЕ - | НаборыЗначенийДоступа.Объект = &СсылкаНаОбъект - | И НовыеНаборы.Объект ЕСТЬ NULL - | - |ОБЪЕДИНИТЬ ВСЕ - | - |ВЫБРАТЬ ПЕРВЫЕ 1 - | ИСТИНА - |ИЗ - | НовыеНаборы КАК НовыеНаборы - | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаборыЗначенийДоступа КАК НаборыЗначенийДоступа - | ПО (НаборыЗначенийДоступа.Объект = НовыеНаборы.Объект) - | И (НаборыЗначенийДоступа.НомерНабора = НовыеНаборы.НомерНабора) - | И (НаборыЗначенийДоступа.ВидДоступа = НовыеНаборы.ВидДоступа) - | И (НаборыЗначенийДоступа.ЗначениеДоступа = НовыеНаборы.ЗначениеДоступа) - | И (НаборыЗначенийДоступа.Чтение = НовыеНаборы.Чтение) - | И (НаборыЗначенийДоступа.Добавление = НовыеНаборы.Добавление) - | И (НаборыЗначенийДоступа.Изменение = НовыеНаборы.Изменение) - | И (НаборыЗначенийДоступа.Удаление = НовыеНаборы.Удаление) - | И (НаборыЗначенийДоступа.ВидДоступаБезГруппЗначенияДоступа = НовыеНаборы.ВидДоступаБезГруппЗначенияДоступа) - | И (НаборыЗначенийДоступа.ВидДоступаЕдинственныйДляТипаЗначенияДоступа = НовыеНаборы.ВидДоступаЕдинственныйДляТипаЗначенияДоступа) - | И (НаборыЗначенийДоступа.ВидДоступаЧерезПраваПоЗначениямДоступа = НовыеНаборы.ВидДоступаЧерезПраваПоЗначениямДоступа) - | И (НаборыЗначенийДоступа.ВидДоступаПравоЧтения = НовыеНаборы.ВидДоступаПравоЧтения) - | И (НаборыЗначенийДоступа.ВидДоступаПравоДобавления = НовыеНаборы.ВидДоступаПравоДобавления) - | И (НаборыЗначенийДоступа.ВидДоступаПравоИзменения = НовыеНаборы.ВидДоступаПравоИзменения) - | И (НаборыЗначенийДоступа.ТипОбъекта = НовыеНаборы.ТипОбъекта) - | И (НаборыЗначенийДоступа.ТипЗначенияДоступа = НовыеНаборы.ТипЗначенияДоступа) - |ГДЕ - | НаборыЗначенийДоступа.Объект ЕСТЬ NULL "; - - Возврат НЕ Запрос.Выполнить().Пустой(); - -КонецФункции - // Для процедур ВключитьПользователяВГруппуДоступа, ИсключитьПользователяИзГруппыДоступа // и функции НайтиПользователяВГруппеДоступа. @@ -3370,7 +3659,7 @@ ГруппаДоступа = Неопределено; - Если УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда + Если УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда Если ТипЗнч(Пользователь) <> Тип("СправочникСсылка.Пользователи") И ТипЗнч(Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда @@ -3468,7 +3757,7 @@ ГруппаДоступа = ГруппаДоступа.ПолучитьОбъект(); - Если НЕ УправлениеДоступомПереопределяемый.УпрощенныйИнтерфейсНастройкиПравДоступа() + Если НЕ УпрощенныйИнтерфейсНастройкиПравДоступа() И НЕ ГруппаДоступа.ОсновнаяГруппаДоступаПоставляемогоПрофиля Тогда ГруппаДоступа.ОсновнаяГруппаДоступаПоставляемогоПрофиля = Истина; @@ -4221,257 +4510,360 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Обновление информационной базы +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования -// Заполняет обработчик разделенных данных, зависимый от изменения неразделенных данных. -// -// Параметры: -// Обработчики - ТаблицаЗначений, Неопределено - см. описание -// функции НоваяТаблицаОбработчиковОбновления общего модуля -// ОбновлениеИнформационнойБазы.. -// В случае прямого вызова (не через механизм обновления -// версии ИБ) передается Неопределено. -// -Процедура ЗаполнитьОбработчикиРазделенныхДанных(Параметры = Неопределено) Экспорт +Процедура ДобавитьРеквизитыВспомогательныхДанныхВФорму(Форма, ИмяРеквизитаХранилищаТаблиц) - Если Параметры <> Неопределено И ЕстьИзмененияПараметровОграниченияДоступа() Тогда - Обработчики = Параметры.РазделенныеОбработчики; - Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "*"; - Обработчик.Процедура = "УправлениеДоступомСлужебный.ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации"; + ДобавляемыеРеквизиты = Новый Массив; + ОписаниеТиповЗначенийДоступа = Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип; + + ПутьКОбъекту = ?(ЗначениеЗаполнено(ИмяРеквизитаХранилищаТаблиц), ИмяРеквизитаХранилищаТаблиц + ".", ""); + + // Добавление реквизитов в таблицу ВидыДоступа + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Используется", Новый ОписаниеТипов("Булево"), ПутьКОбъекту + "ВидыДоступа")); + + // Добавление отдельных реквизитов + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ТекущийВидДоступа", ОписаниеТиповЗначенийДоступа)); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ТекущиеТипыВыбираемыхЗначений", Новый ОписаниеТипов("СписокЗначений"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ТекущийТипВыбираемыхЗначений", ОписаниеТиповЗначенийДоступа)); + + Если НЕ РеквизитФормыСуществует(Форма, "ИспользоватьВнешнихПользователей") Тогда + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ИспользоватьВнешнихПользователей", Новый ОписаниеТипов("Булево"))); КонецЕсли; + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ИмяРеквизитаХранилищаТаблиц", Новый ОписаниеТипов("Строка"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ЭтоПрофильГруппДоступа", Новый ОписаниеТипов("Булево"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ВидДоступаПользователи", ОписаниеТиповЗначенийДоступа)); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ВидДоступаВнешниеПользователи", ОписаниеТиповЗначенийДоступа)); + + // Добавление таблицы ВсеВидыДоступа + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ВсеВидыДоступа", Новый ОписаниеТипов("ТаблицаЗначений"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Ссылка", ОписаниеТиповЗначенийДоступа, "ВсеВидыДоступа")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Представление", Новый ОписаниеТипов("Строка"), "ВсеВидыДоступа")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Используется", Новый ОписаниеТипов("Булево"), "ВсеВидыДоступа")); + + // Добавление таблицы ПредставленияВсеРазрешены + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ПредставленияВсеРазрешены", Новый ОписаниеТипов("ТаблицаЗначений"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Имя", Новый ОписаниеТипов("Строка"), "ПредставленияВсеРазрешены")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "Представление", Новый ОписаниеТипов("Строка"), "ПредставленияВсеРазрешены")); + + // Добавление таблицы ВсеТипыВыбираемыхЗначений + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ВсеТипыВыбираемыхЗначений", Новый ОписаниеТипов("ТаблицаЗначений"))); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ВидДоступа", ОписаниеТиповЗначенийДоступа, "ВсеТипыВыбираемыхЗначений")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ТипЗначений", ОписаниеТиповЗначенийДоступа, "ВсеТипыВыбираемыхЗначений")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ПредставлениеТипа", Новый ОписаниеТипов("Строка"), "ВсеТипыВыбираемыхЗначений")); + + ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы( + "ИмяТаблицы", Новый ОписаниеТипов("Строка"), "ВсеТипыВыбираемыхЗначений")); + + Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); + КонецПроцедуры -// Обновляет вспомогательные данные, которые зависят только -// от конфигурации. -// Записывает изменения этих данных по версиям конфигурации -// (если изменения есть), чтобы использовать эти изменения -// при обновлении остальных вспомогательных данных, например, -// в обработчике ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации. -// -Процедура ОбновитьПараметрыОграниченияДоступа(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт +Процедура ЗаполнитьТаблицуВсеВидыДоступаВФорме(Форма) - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваРолей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗависимостиПравДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Для каждого СвойстваВидаДоступа Из СвойстваВидаДоступа() Цикл + Строка = Форма.ВсеВидыДоступа.Добавить(); + Строка.Ссылка = СвойстваВидаДоступа.Ссылка; + Строка.Используется = ВидДоступаИспользуется(Строка.Ссылка); + // Обеспечение уникальности представлений. + Представление = СвойстваВидаДоступа.Представление; + Отбор = Новый Структура("Представление", Представление); + Пока Форма.ВсеВидыДоступа.НайтиСтроки(Отбор).Количество() > 0 Цикл + Отбор.Представление = Отбор.Представление + " "; + КонецЦикла; + Строка.Представление = Представление; + КонецЦикла; - Если ТолькоПроверка ИЛИ МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; +КонецПроцедуры + +Процедура ЗаполнитьТаблицуПредставленияВсеРазрешеныВФорме(Форма, ЭтоПрофиль) + + Если ЭтоПрофиль Тогда + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВначалеВсеЗапрещены"; + Строка.Представление = НСтр("ru = 'Все запрещены, исключения назначаются в группах доступа'"); + + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВначалеВсеРазрешены"; + Строка.Представление = НСтр("ru = 'Все разрешены, исключения назначаются в группах доступа'"); + + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВсеЗапрещены"; + Строка.Представление = НСтр("ru = 'Все запрещены, исключения назначаются в профиле'"); + + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВсеРазрешены"; + Строка.Представление = НСтр("ru = 'Все разрешены, исключения назначаются в профиле'"); Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВсеЗапрещены"; + Строка.Представление = НСтр("ru = 'Все запрещены'"); + + Строка = Форма.ПредставленияВсеРазрешены.Добавить(); + Строка.Имя = "ВсеРазрешены"; + Строка.Представление = НСтр("ru = 'Все разрешены'"); КонецЕсли; - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - Константы.ПараметрыОграниченияДоступа.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры(ЕстьИзменения, ТолькоПроверка); - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - РегистрыСведений.ПраваРолей.ОбновитьДанныеРегистра(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - РегистрыСведений.ЗависимостиПравДоступа.ОбновитьДанныеРегистра(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - ПланыВидовХарактеристик.ВидыДоступа.ОбновитьОписаниеСвойств(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - Справочники.ПрофилиГруппДоступа.ОбновитьОписаниеПоставляемыхПрофилей(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - Справочники.ПрофилиГруппДоступа.ОбновитьСоставПредопределенныхПрофилей(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - Если НЕ (ТолькоПроверка И ЕстьИзменения) Тогда - РегистрыСведений.ПраваПоЗначениямДоступа.ОбновитьВозможныеПраваПоЗначенияДоступа(ЕстьИзменения, ТолькоПроверка); - КонецЕсли; - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; + СписокВыбора = Форма.Элементы.ВидыДоступаВсеРазрешеныПредставление.СписокВыбора; - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; + Для каждого Строка Из Форма.ПредставленияВсеРазрешены Цикл + СписокВыбора.Добавить(Строка.Представление); + КонецЦикла; КонецПроцедуры -// Очищает вспомогательные данные, которые зависят только -// от конфигурации. -// Используется как обработчик очистки вспомогательных данных, -// которые зависят только от конфигурации, чтобы вызвать проверку и -// обновление остальных вспомогательных данных при обновлении ИБ, -// например, в обработчике ОбновитьВспомогательныеДанныеПриОбновленииИБ. -// -Процедура ОчиститьПараметрыОграниченияДоступа() Экспорт +Процедура ОформитьТаблицуВидыДоступаВФорме(Форма) - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваРолей"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЗависимостиПравДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); - Если МонопольныйРежим() Тогда - СнятьМонопольныйРежим = Ложь; - Иначе - СнятьМонопольныйРежим = Истина; - УстановитьМонопольныйРежим(Истина); - КонецЕсли; + // Оформление отображения неиспользуемых видов доступа. + ЭлементУсловногоОформления = Форма.УсловноеОформление.Элементы.Добавить(); - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - // Очистка прав ролей. - НаборЗаписей = РегистрыСведений.ПраваРолей.СоздатьНаборЗаписей(); - НаборЗаписей.Записать(); - - // Очистка зависимостей прав. - НаборЗаписей = РегистрыСведений.ЗависимостиПравДоступа.СоздатьНаборЗаписей(); - НаборЗаписей.Записать(); - - // Очистка остальных данных построенных по метаданным и их изменений. - Константы.ПараметрыОграниченияДоступа.Установить(Новый ХранилищеЗначения(Неопределено)); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; - ВызватьИсключение; - КонецПопытки; + ЭлементЦветаОформления = ЭлементУсловногоОформления.Оформление.Элементы.Найти("TextColor"); + ЭлементЦветаОформления.Значение = WebЦвета.Серый; + ЭлементЦветаОформления.Использование = Истина; - Если СнятьМонопольныйРежим Тогда - УстановитьМонопольныйРежим(Ложь); - КонецЕсли; + ГруппаЭлементовОтбораДанных = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); + ГруппаЭлементовОтбораДанных.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; + ГруппаЭлементовОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Параметры.ПутьКТаблицам + "ВидыДоступа.ВидДоступа"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно; + ЭлементОтбораДанных.ПравоеЗначение = Неопределено; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОтбораДанных = ГруппаЭлементовОтбораДанных.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбораДанных.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(Параметры.ПутьКТаблицам + "ВидыДоступа.Используется"); + ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбораДанных.ПравоеЗначение = Ложь; + ЭлементОтбораДанных.Использование = Истина; + + ЭлементОформляемогоПоля = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ЭлементОформляемогоПоля.Поле = Новый ПолеКомпоновкиДанных("ВидыДоступа"); + ЭлементОформляемогоПоля.Использование = Истина; КонецПроцедуры -// Проверяет были ли изменения неразделенных данных для какой-нибудь области данных. -Функция ЕстьИзмененияПараметровОграниченияДоступа() Экспорт +Процедура УдалитьЛишниеЗначенияДоступа(Форма, ТекущийОбъект = Неопределено) - УстановитьПривилегированныйРежим(Истина); + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект); - ПроверяемыеПараметры = Новый Массив; - ПроверяемыеПараметры.Добавить("ОбъектыМетаданныхПравРолей"); - ПроверяемыеПараметры.Добавить("ВозможныеПраваПоЗначениямДоступа"); - ПроверяемыеПараметры.Добавить("ПоставляемыеПрофилиГруппДоступа"); - ПроверяемыеПараметры.Добавить("ПредопределенныеПрофилиГруппДоступа"); + ПоТипамГруппИЗначений = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).СвойстваВидовДоступа.ПоТипамГруппИЗначений; - Параметры = УправлениеДоступомСлужебныйПовтИсп.Параметры(); + Отбор = УправлениеДоступомСлужебныйКлиентСервер.ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма, ""); - Для каждого ПроверяемыйПараметр Из ПроверяемыеПараметры Цикл + Индекс = Параметры.ЗначенияДоступа.Количество()-1; + Пока Индекс >= 0 Цикл + ЗначениеДоступа = Параметры.ЗначенияДоступа[Индекс].ЗначениеДоступа; - ПоследниеИзменения = СтандартныеПодсистемыСервер.ИзмененияПараметраРаботыПрограммы( - Параметры, ПроверяемыйПараметр); + СвойстваВидаДоступа = ПоТипамГруппИЗначений.Получить(ТипЗнч(ЗначениеДоступа)); + Если СвойстваВидаДоступа <> Неопределено Тогда + ЗаполнитьЗначенияСвойств(Отбор, Параметры.ЗначенияДоступа[Индекс]); + Отбор.Вставить("ВидДоступа", СвойстваВидаДоступа.Ссылка); + КонецЕсли; - Если ПоследниеИзменения = Неопределено - ИЛИ ПоследниеИзменения.Количество() > 0 Тогда + Если СвойстваВидаДоступа = Неопределено + ИЛИ Параметры.ЗначенияДоступа[Индекс].ВидДоступа <> Отбор.ВидДоступа + ИЛИ Параметры.ВидыДоступа.НайтиСтроки(Отбор).Количество() = 0 Тогда + Параметры.ЗначенияДоступа.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + +КонецПроцедуры + +Процедура УдалитьНесуществующиеВидыИЗначенияДоступа(Форма, ТекущийОбъект = Неопределено) + + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект); + + Индекс = Параметры.ВидыДоступа.Количество()-1; + Пока Индекс >= 0 Цикл + ВидДоступа = Параметры.ВидыДоступа[Индекс].ВидДоступа; + Если СвойстваВидаДоступа(ВидДоступа) = Неопределено Тогда + Параметры.ВидыДоступа.Удалить(Индекс); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + УдалитьЛишниеЗначенияДоступа(Форма, ТекущийОбъект); + +КонецПроцедуры + +Функция ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект = Неопределено) + + Возврат УправлениеДоступомСлужебныйКлиентСервер.ПараметрыФормыРедактированияРазрешенныхЗначений( + Форма, ТекущийОбъект); + +КонецФункции + +Функция РеквизитФормыСуществует(Форма, ИмяРеквизита) + + Структура = Новый Структура(ИмяРеквизита, Null); + + ЗаполнитьЗначенияСвойств(Структура, Форма); + + Возврат Структура[ИмяРеквизита] <> Null; + +КонецФункции + +// Для процедуры УстановкаПараметровСеанса + +Функция ВсеКомбинацииВидовДоступа(НеупорядоченныйМассивИмен) Экспорт + + // Ограничение на максимальную длину комбинации, чтобы не допустить + // перегрузку параметров сеанса и препроцессора шаблонов ОДД. + МаксимальнаяДлинаКомбинации = 7; + + Список = Новый СписокЗначений; + Если ТипЗнч(НеупорядоченныйМассивИмен) = Тип("ФиксированныйМассив") Тогда + Список.ЗагрузитьЗначения(Новый Массив(НеупорядоченныйМассивИмен)); + Иначе + Список.ЗагрузитьЗначения(НеупорядоченныйМассивИмен); + КонецЕсли; + Список.СортироватьПоЗначению(); + МассивИмен = Список.ВыгрузитьЗначения(); + + Итог = ""; + + // Полный список поддерживается всегда. + Для каждого Имя Из МассивИмен Цикл + Итог = Итог + "," + Имя; + КонецЦикла; + + Итог = Итог + "," + Символы.ПС; + + Если МассивИмен.Количество() < 3 Тогда + Возврат Итог; + КонецЕсли; + + ПервоеИмя = МассивИмен[0]; + МассивИмен.Удалить(0); + + ПоследнееИмя = МассивИмен[МассивИмен.Количество()-1]; + МассивИмен.Удалить(МассивИмен.Количество()-1); + + КоличествоИменВКомбинации = МассивИмен.Количество(); + + Если КоличествоИменВКомбинации > 1 Тогда + + Если (КоличествоИменВКомбинации-1) <= МаксимальнаяДлинаКомбинации Тогда + ДлинаКомбинации = КоличествоИменВКомбинации-1; + Иначе + ДлинаКомбинации = МаксимальнаяДлинаКомбинации; + КонецЕсли; + + ПозицииИменВКомбинации = Новый Массив; + Для Счетчик = 1 По ДлинаКомбинации Цикл + ПозицииИменВКомбинации.Добавить(Счетчик); + КонецЦикла; + + Пока ДлинаКомбинации > 0 Цикл + Пока Истина Цикл + // Добавление комбинации из текущих позиций + Итог = Итог + "," + ПервоеИмя; + Для Индекс = 0 По ДлинаКомбинации-1 Цикл + Итог = Итог + "," + МассивИмен[ПозицииИменВКомбинации[Индекс]-1]; + КонецЦикла; + Итог = Итог + "," + ПоследнееИмя + "," + Символы.ПС; + // Продвижение позиции в комбинации + Индекс = ДлинаКомбинации-1; + Пока Индекс >= 0 Цикл + Если ПозицииИменВКомбинации[Индекс] < КоличествоИменВКомбинации - (ДлинаКомбинации - (Индекс+1)) Тогда + ПозицииИменВКомбинации[Индекс] = ПозицииИменВКомбинации[Индекс] + 1; + // Заполнение старших позиций начальными значениями + Для ИндексСтаршейПозиции = Индекс+1 По ДлинаКомбинации-1 Цикл + ПозицииИменВКомбинации[ИндексСтаршейПозиции] = + ПозицииИменВКомбинации[Индекс] + ИндексСтаршейПозиции - Индекс; + КонецЦикла; + Прервать; + Иначе + Индекс = Индекс - 1; + КонецЕсли; + КонецЦикла; + Если Индекс < 0 Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ДлинаКомбинации = ДлинаКомбинации - 1; + Для Индекс = 0 По ДлинаКомбинации - 1 Цикл + ПозицииИменВКомбинации[Индекс] = Индекс + 1; + КонецЦикла; + КонецЦикла; + КонецЕсли; + + Итог = Итог + "," + ПервоеИмя+ "," + ПоследнееИмя + "," + Символы.ПС; + + Возврат Итог; + +КонецФункции + +// Для процедур ОбновитьНаборыЗначенийДоступа, ПриИзмененииНаборовЗначенийДоступа + +// Проверяет, что наборы в табличной части отличаются от новых наборов. +Функция НаборыЗначенийДоступаТабличнойЧастиИзменены(СсылкаНаОбъект, НовыеНаборы) + + СтарыеНаборы = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( + СсылкаНаОбъект, "НаборыЗначенийДоступа").Выгрузить(); + + Если СтарыеНаборы.Количество() <> НовыеНаборы.Количество() Тогда + Возврат Истина; + КонецЕсли; + + СтарыеНаборы.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("Строка")); + УправлениеДоступом.ДобавитьНаборыЗначенийДоступа( + СтарыеНаборы, УправлениеДоступом.ТаблицаНаборыЗначенийДоступа(), Ложь, Истина); + + ПоляПоиска = "НомерНабора, ЗначениеДоступа, Уточнение, Чтение, Изменение"; + + НовыеНаборы.Индексы.Добавить(ПоляПоиска); + Отбор = Новый Структура(ПоляПоиска); + + Для каждого Строка Из СтарыеНаборы Цикл + ЗаполнитьЗначенияСвойств(Отбор, Строка); + Если НовыеНаборы.НайтиСтроки(Отбор).Количество() <> 1 Тогда Возврат Истина; КонецЕсли; - КонецЦикла; Возврат Ложь; КонецФункции -// Обновляет вспомогательные данные, которые зависят от конфигурации частично. -// -// Обновляется при наличии изменений конфигурации, записанных в параметры -// ограничения доступа при обновлении базы данных на текущую версию конфигурации. -// -Процедура ОбновитьВспомогательныеДанныеПоИзменениямКонфигурации(Параметры = Неопределено) Экспорт - - Если Параметры <> Неопределено - И НЕ Параметры.МонопольныйРежим - И ЕстьИзмененияПараметровОграниченияДоступа() Тогда - - Параметры.МонопольныйРежим = Истина; - Возврат; - КонецЕсли; - - Блокировка = Новый БлокировкаДанных; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ТаблицыГруппДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ПраваПоЗначениямДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ПрофилиГруппДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - ЭлементБлокировки = Блокировка.Добавить("Справочник.ГруппыДоступа"); - ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; - - НачатьТранзакцию(); - Попытка - Блокировка.Заблокировать(); - - РегистрыСведений.ТаблицыГруппДоступа.ОбновитьДанныеРегистраПоИзменениямКонфигурации(); - РегистрыСведений.ПраваПоЗначениямДоступа.ОбновитьВспомогательныеДанныеРегистраПоИзменениямКонфигурации(); - Справочники.ПрофилиГруппДоступа.ОбновитьПоставляемыеПрофилиПоИзменениямКонфигурации(); - Справочники.ГруппыДоступа.ПометитьНаУдалениеГруппыДоступаПомеченныхПрофилей(); - - ЗафиксироватьТранзакцию(); - Исключение - ОтменитьТранзакцию(); - ВызватьИсключение; - КонецПопытки; - -КонецПроцедуры - -// Преобразует реквизит УдалитьРоль в реквизит Роль в табличной части Роли -// справочника Профили групп доступа. -// -Процедура ПреобразоватьИменаРолейВИдентификаторы() Экспорт - - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | Роли.Ссылка КАК Ссылка - |ИЗ - | Справочник.ПрофилиГруппДоступа.Роли КАК Роли - |ГДЕ - | НЕ(Роли.Роль <> ЗНАЧЕНИЕ(Справочник.ИдентификаторыОбъектовМетаданных.ПустаяСсылка) - | И Роли.УдалитьРоль = """")"; - - Выборка = Запрос.Выполнить().Выбрать(); - - Пока Выборка.Следующий() Цикл - Объект = Выборка.Ссылка.ПолучитьОбъект(); - Индекс = Объект.Роли.Количество()-1; - Пока Индекс >= 0 Цикл - Строка = Объект.Роли[Индекс]; - Если ЗначениеЗаполнено(Строка.Роль) Тогда - Строка.УдалитьРоль = ""; - ИначеЕсли ЗначениеЗаполнено(Строка.УдалитьРоль) Тогда - МетаданныеРоли = Метаданные.Роли.Найти(Строка.УдалитьРоль); - Если МетаданныеРоли <> Неопределено Тогда - Строка.УдалитьРоль = ""; - Строка.Роль = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( - МетаданныеРоли); - Иначе - Объект.Роли.Удалить(Индекс); - КонецЕсли; - Иначе - Объект.Роли.Удалить(Индекс); - КонецЕсли; - Индекс = Индекс-1; - КонецЦикла; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецЦикла; - -КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl index a47d247d9..2c9d549c1 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВМоделиСервиса/Module.bsl @@ -15,15 +15,17 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "УправлениеДоступомСлужебныйВМоделиСервиса"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "УправлениеДоступомСлужебныйВМоделиСервиса"); КонецЕсли; - СерверныеОбработчики[ - "СтандартныеПодсистемы.РаботаВМоделиСервиса\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( - "УправлениеДоступомСлужебныйВМоделиСервиса"); + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПослеЗагрузкиДанныхИзДругойМодели"].Добавить( + "УправлениеДоступомСлужебныйВМоделиСервиса"); + КонецЕсли; КонецПроцедуры @@ -48,7 +50,7 @@ // Параметры: // Использование - Булево - новое значения флага использования. // -Процедура ВключитьЗаполнениеДанныхДляОграниченияДоступа(Знач Использование) Экспорт +Процедура УстановитьЗаполнениеДанныхДляОграниченияДоступа(Использование) Экспорт Шаблон = ОчередьЗаданий.ШаблонПоИмени("ЗаполнениеДанныхДляОграниченияДоступа"); @@ -73,6 +75,11 @@ Обработчик.Версия = "2.1.0.4"; Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьГруппыДоступаАдминистраторовВМоделиСервиса"; + Обработчик = Обработчики.Добавить(); + Обработчик.Версия = "2.2.1.15"; + Обработчик.ОбщиеДанные = Истина; + Обработчик.Процедура = "УправлениеДоступомСлужебныйВМоделиСервиса.ОбновитьРасписаниеШаблонаЗаполнениеДанныхДляОграниченияДоступа"; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -147,6 +154,27 @@ КонецПроцедуры +// Обновляет настройки регламентного задания. +Процедура ОбновитьРасписаниеШаблонаЗаполнениеДанныхДляОграниченияДоступа() Экспорт + + Если НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда + Возврат; + КонецЕсли; + + Шаблон = ОчередьЗаданий.ШаблонПоИмени("ЗаполнениеДанныхДляОграниченияДоступа"); + ШаблонОбъект = Шаблон.ПолучитьОбъект(); + + Расписание = Новый РасписаниеРегламентногоЗадания; + Расписание.ПериодНедель = 1; + Расписание.ПериодПовтораДней = 1; + Расписание.ПериодПовтораВТечениеДня = 300; + Расписание.ПаузаПовтора = 90; + + ШаблонОбъект.Расписание = Новый ХранилищеЗначения(Расписание); + ШаблонОбъект.Записать(); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl new file mode 100644 index 000000000..5499f6d12 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/Module.bsl @@ -0,0 +1,130 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Управление доступом". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +//////////////////////////////////////////////////////////////////////////////// +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования + +// Только для внутреннего использования +Функция СформироватьДанныеВыбораПользователя(Знач Текст, + Знач ВключаяГруппы = Истина, + Знач ВключаяВнешнихПользователей = Неопределено, + Знач БезПользователей = Ложь) Экспорт + + Возврат Пользователи.СформироватьДанныеВыбораПользователя( + Текст, + ВключаяГруппы, + ВключаяВнешнихПользователей, + БезПользователей); + +КонецФункции + +// Возвращает список значений доступа не помеченных на удаление. +// Используется в обработчиках событий ОкончаниеВводаТекста и АвтоПодбор. +// +// Параметры: +// Текст - Строка, символы введенные пользователем. +// ВключаяГруппы - Булево, если Истина, включать группы пользователей и внешних пользователей. +// ВидДоступа - Ссылка - пустая ссылка основного типа значения доступа, +// - Строка - имя вида доступа, значения доступа которого выбираются. +// +Функция СформироватьДанныеВыбораЗначенияДоступа(Знач Текст, Знач ВидДоступа, ВключаяГруппы = Истина) Экспорт + + СвойстваВидаДоступа = УправлениеДоступомСлужебный.СвойстваВидаДоступа(ВидДоступа); + Если СвойстваВидаДоступа = Неопределено Тогда + Возврат Новый СписокЗначений; + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Текст", Текст + "%"); + Запрос.УстановитьПараметр("ВключаяГруппы", ВключаяГруппы); + Запрос.Текст = + "ВЫБРАТЬ + | ПредставленияПеречислений.Ссылка, + | ПредставленияПеречислений.Наименование КАК Наименование + |ПОМЕСТИТЬ ПредставленияПеречислений + |ИЗ + | &ПредставленияПеречислений КАК ПредставленияПеречислений + |; + | + |//////////////////////////////////////////////////////////////////////////////// + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | НЕОПРЕДЕЛЕНО КАК Ссылка, + | """" КАК Наименование + |ГДЕ + | ЛОЖЬ"; + + ЗапросПредставленийПеречислений = Новый Запрос; + ЗапросПредставленийПеречислений.Текст = + "ВЫБРАТЬ + | """" КАК Ссылка, + | """" КАК Наименование + |ГДЕ + | ЛОЖЬ"; + + Для каждого Тип Из СвойстваВидаДоступа.ТипыВыбираемыхЗначений Цикл + + МетаданныеТипа = Метаданные.НайтиПоТипу(Тип); + + ПолноеИмяТаблицы = МетаданныеТипа.ПолноеИмя(); + + Если ( Метаданные.Справочники.Содержит(МетаданныеТипа) + ИЛИ Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеТипа) ) + И МетаданныеТипа.Иерархический + И МетаданныеТипа.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов + И НЕ ВключаяГруппы Тогда + + УсловиеДляГруппы = "НЕ Таблица.ЭтоГруппа"; + Иначе + УсловиеДляГруппы = "Истина"; + КонецЕсли; + + Если Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда + // + ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + ЗапросПредставленийПеречислений.Текст = ЗапросПредставленийПеречислений.Текст + СтрЗаменить( + "ВЫБРАТЬ + | Таблица.Ссылка, + | ПРЕДСТАВЛЕНИЕ(Таблица.Ссылка) КАК Наименование + |ИЗ + | &ПолноеИмяТаблицы КАК Таблица", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы); + Иначе + Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + Запрос.Текст = Запрос.Текст + СтрЗаменить(СтрЗаменить( + "ВЫБРАТЬ + | Таблица.Ссылка, + | Таблица.Наименование + |ИЗ + | &ПолноеИмяТаблицы КАК Таблица + |ГДЕ + | (НЕ Таблица.ПометкаУдаления) + | И Таблица.Наименование ПОДОБНО &Текст + | И &УсловиеДляГруппы", "&ПолноеИмяТаблицы", ПолноеИмяТаблицы), "&УсловиеДляГруппы", УсловиеДляГруппы); + КонецЕсли; + КонецЦикла; + + Запрос.УстановитьПараметр("ПредставленияПеречислений", ЗапросПредставленийПеречислений.Выполнить().Выгрузить()); + Запрос.Текст = Запрос.Текст + Символы.ПС + Символы.ПС + " ОБЪЕДИНИТЬ ВСЕ " + Символы.ПС + Символы.ПС; + Запрос.Текст = Запрос.Текст + + "ВЫБРАТЬ + | ПредставленияПеречислений.Ссылка, + | ПредставленияПеречислений.Наименование + |ИЗ + | ПредставленияПеречислений КАК ПредставленияПеречислений + |ГДЕ + | ПредставленияПеречислений.Наименование ПОДОБНО &Текст"; + + ДанныеВыбора = Новый СписокЗначений; + + Выборка = Запрос.Выполнить().Выбрать(); + Пока Выборка.Следующий() Цикл + ДанныеВыбора.Добавить(Выборка.Ссылка, Выборка.Наименование); + КонецЦикла; + + Возврат ДанныеВыбора; + +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/УправлениеДоступомСлужебныйВызовСервера.mdo b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/УправлениеДоступомСлужебныйВызовСервера.mdo new file mode 100644 index 000000000..f19c0c1f2 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйВызовСервера/УправлениеДоступомСлужебныйВызовСервера.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="01a73950-3e8f-4f56-903f-af0d9574e72e"> + <name>УправлениеДоступомСлужебныйВызовСервера</name> + <synonym> + <key>ru</key> + <value>Управление доступом служебный вызов сервера</value> + </synonym> + <server>true</server> + <serverCall>true</serverCall> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl new file mode 100644 index 000000000..56f753f97 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/Module.bsl @@ -0,0 +1,453 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Управление доступом". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +//////////////////////////////////////////////////////////////////////////////// +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий таблицы формы ЗначенияДоступа + +// Только для внутреннего использования +Процедура ЗначенияДоступаПриИзменении(Форма, Элемент) Экспорт + + Элементы = Форма.Элементы; + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Если Элемент.ТекущиеДанные <> Неопределено + И Элемент.ТекущиеДанные.ВидДоступа = Неопределено Тогда + + Отбор = УправлениеДоступомСлужебныйКлиентСервер.ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма, Форма.ТекущийВидДоступа); + + ЗаполнитьЗначенияСвойств(Элемент.ТекущиеДанные, Отбор); + + Элемент.ТекущиеДанные.НомерСтрокиПоВиду = Параметры.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); + КонецЕсли; + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьНомераСтрокЗначенийДоступаПоВиду( + Форма, Элементы.ВидыДоступа.ТекущиеДанные); + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьВсеРазрешеныПредставление( + Форма, Элементы.ВидыДоступа.ТекущиеДанные); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначенияДоступаПриНачалеРедактирования(Форма, Элемент, НоваяСтрока, Копирование) Экспорт + + Элементы = Форма.Элементы; + + Если Элемент.ТекущиеДанные.ЗначениеДоступа = Неопределено Тогда + Элемент.ТекущиеДанные.ЗначениеДоступа = Форма.ТекущиеТипыВыбираемыхЗначений[0].Значение; + КонецЕсли; + + Элементы.ЗначенияДоступаЗначениеДоступа.КнопкаОчистки + = Форма.ТекущийТипВыбираемыхЗначений <> Неопределено + И Форма.ТекущиеТипыВыбираемыхЗначений.Количество() > 1; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначениеДоступаНачалоВыбора(Форма, Элемент, ДанныеВыбора, СтандартнаяОбработка) Экспорт + + СтандартнаяОбработка = Ложь; + + Если Форма.ТекущийТипВыбираемыхЗначений <> Неопределено Тогда + + ЗначениеДоступаНачалоВыбораЗавершение(Форма); + Возврат; + + ИначеЕсли Форма.ТекущиеТипыВыбираемыхЗначений.Количество() = 1 Тогда + + Форма.ТекущийТипВыбираемыхЗначений = Форма.ТекущиеТипыВыбираемыхЗначений[0].Значение; + + ЗначениеДоступаНачалоВыбораЗавершение(Форма); + Возврат; + + ИначеЕсли Форма.ТекущиеТипыВыбираемыхЗначений.Количество() > 0 Тогда + + Если Форма.ТекущиеТипыВыбираемыхЗначений.Количество() = 2 Тогда + + Если Форма.ТекущиеТипыВыбираемыхЗначений.НайтиПоЗначению(ПредопределенноеЗначение( + "Справочник.Пользователи.ПустаяСсылка")) <> Неопределено + + И Форма.ТекущиеТипыВыбираемыхЗначений.НайтиПоЗначению(ПредопределенноеЗначение( + "Справочник.ГруппыПользователей.ПустаяСсылка")) <> Неопределено Тогда + + Форма.ТекущийТипВыбираемыхЗначений = ПредопределенноеЗначение( + "Справочник.Пользователи.ПустаяСсылка"); + + ЗначениеДоступаНачалоВыбораЗавершение(Форма); + Возврат; + КонецЕсли; + + Если Форма.ТекущиеТипыВыбираемыхЗначений.НайтиПоЗначению(ПредопределенноеЗначение( + "Справочник.ВнешниеПользователи.ПустаяСсылка")) <> Неопределено + + И Форма.ТекущиеТипыВыбираемыхЗначений.НайтиПоЗначению(ПредопределенноеЗначение( + "Справочник.ГруппыВнешнихПользователей.ПустаяСсылка")) <> Неопределено Тогда + + Форма.ТекущийТипВыбираемыхЗначений = ПредопределенноеЗначение( + "Справочник.ВнешниеПользователи.ПустаяСсылка"); + + ЗначениеДоступаНачалоВыбораЗавершение(Форма); + Возврат; + КонецЕсли; + КонецЕсли; + + Форма.ТекущиеТипыВыбираемыхЗначений.ПоказатьВыборЭлемента( + Новый ОписаниеОповещения("ЗначениеДоступаНачалоВыбораПродолжение", ЭтотОбъект, Форма), + НСтр("ru = 'Выбор типа данных'"), + Форма.ТекущиеТипыВыбираемыхЗначений[0]); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначениеДоступаОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Экспорт + + ТекущиеДанные = Форма.Элементы.ЗначенияДоступа.ТекущиеДанные; + + Если ВыбранноеЗначение = Тип("СправочникСсылка.Пользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыПользователей") Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); + + ИначеЕсли ВыбранноеЗначение = Тип("СправочникСсылка.ВнешниеПользователи") ИЛИ + ВыбранноеЗначение = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда + + СтандартнаяОбработка = Ложь; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначенияДоступаПриОкончанииРедактирования(Форма, Элемент, НоваяСтрока, ОтменаРедактирования) Экспорт + + Если Форма.ТекущийВидДоступа = Неопределено Тогда + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Отбор = Новый Структура("ВидДоступа", Неопределено); + + НайденныеСтроки = Параметры.ЗначенияДоступа.НайтиСтроки(Отбор); + + Для каждого Строка Из НайденныеСтроки Цикл + Параметры.ЗначенияДоступа.Удалить(Строка); + КонецЦикла; + + ОтменаРедактирования = Истина; + КонецЕсли; + + Если ОтменаРедактирования Тогда + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначениеДоступаОчистка(Форма, Элемент, СтандартнаяОбработка) Экспорт + + Элементы = Форма.Элементы; + + СтандартнаяОбработка = Ложь; + ТекущийТипВыбираемыхЗначений = Неопределено; + + Элементы.ЗначенияДоступа.ТекущиеДанные.ЗначениеДоступа = Форма.ТекущиеТипыВыбираемыхЗначений[0].Значение; + Элементы.ЗначенияДоступаЗначениеДоступа.КнопкаОчистки = Ложь; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначениеДоступаАвтоПодбор(Форма, Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) Экспорт + + СформироватьДанныеВыбораЗначенияДоступа(Форма, Текст, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗначениеДоступаОкончаниеВводаТекста(Форма, Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) Экспорт + + СформироватьДанныеВыбораЗначенияДоступа(Форма, Текст, ДанныеВыбора, СтандартнаяОбработка); + +КонецПроцедуры + +// Продолжение обработчика события ЗначениеДоступаНачалоВыбора +Процедура ЗначениеДоступаНачалоВыбораПродолжение(ВыбранныйЭлемент, Форма) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + Форма.ТекущийТипВыбираемыхЗначений = ВыбранныйЭлемент.Значение; + ЗначениеДоступаНачалоВыбораЗавершение(Форма); + КонецЕсли; + +КонецПроцедуры + +// Завершение обработчика события ЗначениеДоступаНачалоВыбора +Процедура ЗначениеДоступаНачалоВыбораЗавершение(Форма) Экспорт + + Элементы = Форма.Элементы; + Элемент = Элементы.ЗначенияДоступаЗначениеДоступа; + ТекущиеДанные = Элементы.ЗначенияДоступа.ТекущиеДанные; + + Если НЕ ЗначениеЗаполнено(ТекущиеДанные.ЗначениеДоступа) + И ТекущиеДанные.ЗначениеДоступа <> Форма.ТекущийТипВыбираемыхЗначений Тогда + + ТекущиеДанные.ЗначениеДоступа = Форма.ТекущийТипВыбираемыхЗначений; + КонецЕсли; + + Элементы.ЗначенияДоступаЗначениеДоступа.КнопкаОчистки + = Форма.ТекущийТипВыбираемыхЗначений <> Неопределено + И Форма.ТекущиеТипыВыбираемыхЗначений.Количество() > 1; + + Если Форма.ТекущийТипВыбираемыхЗначений + = ПредопределенноеЗначение("Справочник.Пользователи.ПустаяСсылка") + ИЛИ Форма.ТекущийТипВыбираемыхЗначений + = ПредопределенноеЗначение("Справочник.ГруппыПользователей.ПустаяСсылка") Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппПользователей", Истина); + + ОткрытьФорму("Справочник.Пользователи.ФормаВыбора", ПараметрыФормы, Элемент); + Возврат; + + ИначеЕсли Форма.ТекущийТипВыбираемыхЗначений + = ПредопределенноеЗначение("Справочник.ВнешниеПользователи.ПустаяСсылка") + + ИЛИ Форма.ТекущийТипВыбираемыхЗначений + = ПредопределенноеЗначение("Справочник.ГруппыВнешнихПользователей.ПустаяСсылка") Тогда + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); + ПараметрыФормы.Вставить("ВыборГруппВнешнихПользователей", Истина); + + ОткрытьФорму("Справочник.ВнешниеПользователи.ФормаВыбора", ПараметрыФормы, Элемент); + Возврат; + КонецЕсли; + + Отбор = Новый Структура("ТипЗначений", Форма.ТекущийТипВыбираемыхЗначений); + НайденныеСтроки = Форма.ВсеТипыВыбираемыхЗначений.НайтиСтроки(Отбор); + + Если НайденныеСтроки.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("РежимВыбора", Истина); + ПараметрыФормы.Вставить("ТекущаяСтрока", ТекущиеДанные.ЗначениеДоступа); + + ОткрытьФорму(НайденныеСтроки[0].ИмяТаблицы + ".ФормаВыбора", ПараметрыФормы, Элемент); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Обработчики событий таблицы формы ВидыДоступа + +// Только для внутреннего использования +Процедура ВидыДоступаПриАктивизацииСтроки(Форма, Элемент) Экспорт + + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаПриАктивизацииЯчейки(Форма, Элемент) Экспорт + + Если Форма.ЭтоПрофильГруппДоступа Тогда + Возврат; + КонецЕсли; + + Элементы = Форма.Элементы; + + Если Элементы.ВидыДоступа.ТекущийЭлемент <> Элементы.ВидыДоступаВсеРазрешеныПредставление Тогда + Элементы.ВидыДоступа.ТекущийЭлемент = Элементы.ВидыДоступаВсеРазрешеныПредставление; + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаПередНачаломДобавления(Форма, Элемент, Отказ, Копирование, Родитель, Группа) Экспорт + + Если Копирование Тогда + Отказ = Истина; + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаПередУдалением(Форма, Элемент, Отказ) Экспорт + + ТекущийВидДоступа = Неопределено; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаПриНачалеРедактирования(Форма, Элемент, НоваяСтрока, Копирование) Экспорт + + ТекущиеДанные = Форма.Элементы.ВидыДоступа.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если НоваяСтрока Тогда + ТекущиеДанные.Используется = Истина; + КонецЕсли; + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьВсеРазрешеныПредставление(Форма, ТекущиеДанные, Ложь); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаПриОкончанииРедактирования(Форма, Элемент, НоваяСтрока, ОтменаРедактирования) Экспорт + + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаВидДоступаПредставлениеПриИзменении(Форма, Элемент) Экспорт + + ТекущиеДанные = Форма.Элементы.ВидыДоступа.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ВидДоступаПредставление = "" Тогда + ТекущиеДанные.ВидДоступа = Неопределено; + ТекущиеДанные.Используется = Истина; + КонецЕсли; + + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьСвойстваВидовДоступаВФорме(Форма); + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаВидДоступаПредставлениеОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Экспорт + + ТекущиеДанные = Форма.Элементы.ВидыДоступа.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Отбор = Новый Структура("ВидДоступаПредставление", ВыбранноеЗначение); + Строки = Параметры.ВидыДоступа.НайтиСтроки(Отбор); + + Если Строки.Количество() > 0 + И Строки[0].ПолучитьИдентификатор() <> Форма.Элементы.ВидыДоступа.ТекущаяСтрока Тогда + + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Вид доступа ""%1"" уже выбран. + |Выберите другой.'"), + ВыбранноеЗначение)); + + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + Отбор = Новый Структура("Представление", ВыбранноеЗначение); + ТекущиеДанные.ВидДоступа = Форма.ВсеВидыДоступа.НайтиСтроки(Отбор)[0].Ссылка; + +КонецПроцедуры + + +// Только для внутреннего использования +Процедура ВидыДоступаВсеРазрешеныПредставлениеПриИзменении(Форма, Элемент) Экспорт + + ТекущиеДанные = Форма.Элементы.ВидыДоступа.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ТекущиеДанные.ВсеРазрешеныПредставление = "" Тогда + ТекущиеДанные.ВсеРазрешены = Ложь; + Если Форма.ЭтоПрофильГруппДоступа Тогда + ТекущиеДанные.Предустановленный = Ложь; + КонецЕсли; + КонецЕсли; + + Если Форма.ЭтоПрофильГруппДоступа Тогда + УправлениеДоступомСлужебныйКлиентСервер.ПриИзмененииТекущегоВидаДоступа(Форма); + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьВсеРазрешеныПредставление(Форма, ТекущиеДанные, Ложь); + Иначе + Форма.Элементы.ВидыДоступа.ЗакончитьРедактированиеСтроки(Ложь); + УправлениеДоступомСлужебныйКлиентСервер.ЗаполнитьВсеРазрешеныПредставление(Форма, ТекущиеДанные); + КонецЕсли; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ВидыДоступаВсеРазрешеныПредставлениеОбработкаВыбора(Форма, Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Экспорт + + ТекущиеДанные = Форма.Элементы.ВидыДоступа.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + СтандартнаяОбработка = Ложь; + Возврат; + КонецЕсли; + + Отбор = Новый Структура("Представление", ВыбранноеЗначение); + Имя = Форма.ПредставленияВсеРазрешены.НайтиСтроки(Отбор)[0].Имя; + + Если Форма.ЭтоПрофильГруппДоступа Тогда + ТекущиеДанные.Предустановленный = (Имя = "ВсеРазрешены" ИЛИ Имя = "ВсеЗапрещены"); + КонецЕсли; + + ТекущиеДанные.ВсеРазрешены = (Имя = "ВначалеВсеРазрешены" ИЛИ Имя = "ВсеРазрешены"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры и функции + +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования + +Функция ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект = Неопределено) + + Возврат УправлениеДоступомСлужебныйКлиентСервер.ПараметрыФормыРедактированияРазрешенныхЗначений( + Форма, ТекущийОбъект); + +КонецФункции + +Процедура СформироватьДанныеВыбораЗначенияДоступа(Форма, Текст, ДанныеВыбора, СтандартнаяОбработка) + + Если ЗначениеЗаполнено(Текст) Тогда + СтандартнаяОбработка = Ложь; + + Если Форма.ТекущийВидДоступа = Форма.ВидДоступаВнешниеПользователи + ИЛИ Форма.ТекущийВидДоступа = Форма.ВидДоступаПользователи Тогда + + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораПользователя( + Текст, + , + Форма.ТекущийВидДоступа = Форма.ВидДоступаВнешниеПользователи, + Форма.ТекущийВидДоступа <> Форма.ВидДоступаПользователи); + Иначе + ДанныеВыбора = УправлениеДоступомСлужебныйВызовСервера.СформироватьДанныеВыбораЗначенияДоступа( + Текст, Форма.ТекущийВидДоступа, Ложь); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/УправлениеДоступомСлужебныйКлиент.mdo b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/УправлениеДоступомСлужебныйКлиент.mdo new file mode 100644 index 000000000..16c950c06 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиент/УправлениеДоступомСлужебныйКлиент.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="14bd0844-c829-4325-aa7f-0f417bf955dc"> + <name>УправлениеДоступомСлужебныйКлиент</name> + <synonym> + <key>ru</key> + <value>Управление доступом служебный клиент</value> + </synonym> + <clientManagedApplication>true</clientManagedApplication> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl new file mode 100644 index 000000000..a908c2964 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/Module.bsl @@ -0,0 +1,430 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Управление доступом". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +//////////////////////////////////////////////////////////////////////////////// +// Обслуживание таблиц ВидыДоступа и ЗначенияДоступа в формах редактирования + +// Только для внутреннего использования +Процедура ЗаполнитьВсеРазрешеныПредставление(Форма, ОписаниеВидаДоступа, ДобавитьКоличествоЗначений = Истина) Экспорт + + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Если ОписаниеВидаДоступа.ВсеРазрешены Тогда + Если Форма.ЭтоПрофильГруппДоступа И НЕ ОписаниеВидаДоступа.Предустановленный Тогда + Имя = "ВначалеВсеРазрешены"; + Иначе + Имя = "ВсеРазрешены"; + КонецЕсли; + Иначе + Если Форма.ЭтоПрофильГруппДоступа И НЕ ОписаниеВидаДоступа.Предустановленный Тогда + Имя = "ВначалеВсеЗапрещены"; + Иначе + Имя = "ВсеЗапрещены"; + КонецЕсли; + КонецЕсли; + + ОписаниеВидаДоступа.ВсеРазрешеныПредставление = + Форма.ПредставленияВсеРазрешены.НайтиСтроки(Новый Структура("Имя", Имя))[0].Представление; + + Если НЕ ДобавитьКоличествоЗначений Тогда + Возврат; + КонецЕсли; + + Если Форма.ЭтоПрофильГруппДоступа И НЕ ОписаниеВидаДоступа.Предустановленный Тогда + Возврат; + КонецЕсли; + + Отбор = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений(Форма, ОписаниеВидаДоступа.ВидДоступа); + + КоличествоЗначений = Параметры.ЗначенияДоступа.НайтиСтроки(Отбор).Количество(); + + Если Форма.ЭтоПрофильГруппДоступа Тогда + Если КоличествоЗначений = 0 Тогда + ЧислоИПредмет = НСтр("ru = 'не назначены'"); + Иначе + ПрописьЧисла = ЧислоПрописью( + КоличествоЗначений, + "Л = ru_RU", + НСтр("ru = ',,,,,,,,0'")); + + ПрописьЧислаИПредмета = ЧислоПрописью( + КоличествоЗначений, + "Л = ru_RU", + НСтр("ru = 'значение,значения,значений,,,,,,0'")); + + ЧислоИПредмет = СтрЗаменить( + ПрописьЧислаИПредмета, + ПрописьЧисла, + Формат(КоличествоЗначений, "ЧГ=") + " "); + КонецЕсли; + + ОписаниеВидаДоступа.ВсеРазрешеныПредставление = + ОписаниеВидаДоступа.ВсеРазрешеныПредставление + + " (" + ЧислоИПредмет + ")"; + Возврат; + КонецЕсли; + + Если КоличествоЗначений = 0 Тогда + Представление = ?(ОписаниеВидаДоступа.ВсеРазрешены, + НСтр("ru = 'Все разрешены, без исключений'"), + НСтр("ru = 'Все запрещены, без исключений'")); + Иначе + ПрописьЧисла = ЧислоПрописью( + КоличествоЗначений, + "Л = ru_RU", + НСтр("ru = ',,,,,,,,0'")); + + ПрописьЧислаИПредмета = ЧислоПрописью( + КоличествоЗначений, + "Л = ru_RU", + НСтр("ru = '-го значения,-х значений,-и значений,,,,,,0'")); + + ЧислоИПредмет = СтрЗаменить( + ПрописьЧислаИПредмета, + ПрописьЧисла, + Формат(КоличествоЗначений, "ЧГ=")); + + Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ?(ОписаниеВидаДоступа.ВсеРазрешены, + НСтр("ru = 'Все разрешены, кроме %1'"), + НСтр("ru = 'Все запрещены, кроме %1'")), + ЧислоИПредмет); + КонецЕсли; + + ОписаниеВидаДоступа.ВсеРазрешеныПредставление = Представление; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ЗаполнитьНомераСтрокЗначенийДоступаПоВиду(Форма, ОписаниеВидаДоступа) Экспорт + + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Отбор = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений(Форма, ОписаниеВидаДоступа.ВидДоступа); + ЗначенияДоступаПоВиду = Параметры.ЗначенияДоступа.НайтиСтроки(Отбор); + + ТекущийНомер = 1; + Для каждого Строка Из ЗначенияДоступаПоВиду Цикл + Строка.НомерСтрокиПоВиду = ТекущийНомер; + ТекущийНомер = ТекущийНомер + 1; + КонецЦикла; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ПриИзмененииТекущегоВидаДоступа(Форма) Экспорт + + Элементы = Форма.Элементы; + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + ЗначенияРедактируются = Ложь; + + #Если Клиент Тогда + ТекущиеДанные = Элементы.ВидыДоступа.ТекущиеДанные; + #Иначе + ТекущиеДанные = Параметры.ВидыДоступа.НайтиПоИдентификатору( + ?(Элементы.ВидыДоступа.ТекущаяСтрока = Неопределено, + -1, + Элементы.ВидыДоступа.ТекущаяСтрока)); + #КонецЕсли + + Если ТекущиеДанные <> Неопределено Тогда + + Если ТекущиеДанные.ВидДоступа <> Неопределено + И НЕ ТекущиеДанные.Используется Тогда + + Если НЕ Элементы.ТекстВидДоступаНеИспользуется.Видимость Тогда + Элементы.ТекстВидДоступаНеИспользуется.Видимость = Истина; + КонецЕсли; + Иначе + Если Элементы.ТекстВидДоступаНеИспользуется.Видимость Тогда + Элементы.ТекстВидДоступаНеИспользуется.Видимость = Ложь; + КонецЕсли; + КонецЕсли; + + Форма.ТекущийВидДоступа = ТекущиеДанные.ВидДоступа; + + Если НЕ Форма.ЭтоПрофильГруппДоступа ИЛИ ТекущиеДанные.Предустановленный Тогда + ЗначенияРедактируются = Истина; + КонецЕсли; + + Если ЗначенияРедактируются Тогда + + Если Форма.ЭтоПрофильГруппДоступа Тогда + Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ПредустановленныйВидДоступа; + КонецЕсли; + + // Установка отбора значений. + ОбновитьОтборСтрок = Ложь; + ОтборСтрок = Элементы.ЗначенияДоступа.ОтборСтрок; + Отбор = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений(Форма, ТекущиеДанные.ВидДоступа); + + Если ОтборСтрок = Неопределено Тогда + ОбновитьОтборСтрок = Истина; + + ИначеЕсли Отбор.Свойство("ГруппаДоступа") И ОтборСтрок.ГруппаДоступа <> Отбор.ГруппаДоступа Тогда + ОбновитьОтборСтрок = Истина; + + ИначеЕсли ОтборСтрок.ВидДоступа <> Отбор.ВидДоступа + И НЕ (ОтборСтрок.ВидДоступа = "" И Отбор.ВидДоступа = Неопределено) Тогда + + ОбновитьОтборСтрок = Истина; + КонецЕсли; + + Если ОбновитьОтборСтрок Тогда + Если ТекущиеДанные.ВидДоступа = Неопределено Тогда + Отбор.ВидДоступа = ""; + КонецЕсли; + Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура(Отбор); + КонецЕсли; + + ИначеЕсли Форма.ЭтоПрофильГруппДоступа Тогда + Элементы.ТипыВидовДоступа.ТекущаяСтраница = Элементы.ОбычныйВидДоступа; + КонецЕсли; + + Если ТекущиеДанные.ВидДоступа = Форма.ВидДоступаПользователи Тогда + ШаблонНадписи = ?(ТекущиеДанные.ВсеРазрешены, + НСтр("ru = 'Запрещенные значения (%1) - текущий пользователь всегда разрешен'"), + НСтр("ru = 'Разрешенные значения (%1) - текущий пользователь всегда разрешен'") ); + + ИначеЕсли ТекущиеДанные.ВидДоступа = Форма.ВидДоступаВнешниеПользователи Тогда + ШаблонНадписи = ?(ТекущиеДанные.ВсеРазрешены, + НСтр("ru = 'Запрещенные значения (%1) - текущий внешний пользователь всегда разрешен'"), + НСтр("ru = 'Разрешенные значения (%1) - текущий внешний пользователь всегда разрешен'") ); + Иначе + ШаблонНадписи = ?(ТекущиеДанные.ВсеРазрешены, + НСтр("ru = 'Запрещенные значения (%1)'"), + НСтр("ru = 'Разрешенные значения (%1)'") ); + КонецЕсли; + + // Обновление поля НадписьВидДоступа. + Форма.НадписьВидДоступа = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ШаблонНадписи, Строка(ТекущиеДанные.ВидДоступаПредставление)); + + ЗаполнитьВсеРазрешеныПредставление(Форма, ТекущиеДанные); + Иначе + Если Элементы.ТекстВидДоступаНеИспользуется.Видимость Тогда + Элементы.ТекстВидДоступаНеИспользуется.Видимость = Ложь; + КонецЕсли; + + Форма.ТекущийВидДоступа = Неопределено; + Элементы.ЗначенияДоступа.ОтборСтрок = Новый ФиксированнаяСтруктура( + ОтборВТаблицахФормыРедактированияРазрешенныхЗначений(Форма, Неопределено)); + + Если Параметры.ВидыДоступа.Количество() = 0 Тогда + Параметры.ЗначенияДоступа.Очистить(); + КонецЕсли; + КонецЕсли; + + Форма.ТекущийТипВыбираемыхЗначений = Неопределено; + Форма.ТекущиеТипыВыбираемыхЗначений = Новый СписокЗначений; + + Если ЗначенияРедактируются Тогда + Отбор = Новый Структура("ВидДоступа", ТекущиеДанные.ВидДоступа); + ОписаниеТиповВидовДоступа = Форма.ВсеТипыВыбираемыхЗначений.НайтиСтроки(Отбор); + Для каждого ОписаниеТипаВидаДоступа Из ОписаниеТиповВидовДоступа Цикл + + Форма.ТекущиеТипыВыбираемыхЗначений.Добавить( + ОписаниеТипаВидаДоступа.ТипЗначений, + ОписаниеТипаВидаДоступа.ПредставлениеТипа); + КонецЦикла; + Иначе + Если ТекущиеДанные <> Неопределено Тогда + + Отбор = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма, ТекущиеДанные.ВидДоступа); + + Для каждого Строка Из Параметры.ЗначенияДоступа.НайтиСтроки(Отбор) Цикл + Параметры.ЗначенияДоступа.Удалить(Строка); + КонецЦикла + КонецЕсли; + КонецЕсли; + + Если Форма.ТекущиеТипыВыбираемыхЗначений.Количество() = 0 Тогда + Форма.ТекущиеТипыВыбираемыхЗначений.Добавить(Неопределено, НСтр("ru = 'Неопределено'")); + КонецЕсли; + + Элементы.ЗначенияДоступа.Доступность = ЗначенияРедактируются; + Элементы.ЗначенияДоступаДобавить.Доступность = ЗначенияРедактируются; + +КонецПроцедуры + +// Только для внутреннего использования +Функция ПараметрыФормыРедактированияРазрешенныхЗначений(Форма, ТекущийОбъект = Неопределено) Экспорт + + Параметры = Новый Структура; + Параметры.Вставить("ПутьКТаблицам", ""); + + Если ТекущийОбъект <> Неопределено Тогда + ХранилищеТаблиц = ТекущийОбъект; + + ИначеЕсли ЗначениеЗаполнено(Форма.ИмяРеквизитаХранилищаТаблиц) Тогда + Параметры.Вставить("ПутьКТаблицам", Форма.ИмяРеквизитаХранилищаТаблиц + "."); + ХранилищеТаблиц = Форма[Форма.ИмяРеквизитаХранилищаТаблиц]; + Иначе + ХранилищеТаблиц = Форма; + КонецЕсли; + + Параметры.Вставить("ВидыДоступа", ХранилищеТаблиц.ВидыДоступа); + Параметры.Вставить("ЗначенияДоступа", ХранилищеТаблиц.ЗначенияДоступа); + + Возврат Параметры; + +КонецФункции + +// Только для внутреннего использования +Функция ОтборВТаблицахФормыРедактированияРазрешенныхЗначений(Форма, ВидДоступа = "БезОтбораПоВидуДоступа") Экспорт + + Отбор = Новый Структура; + + Структура = Новый Структура("ТекущаяГруппаДоступа", "РеквизитНеСуществует"); + ЗаполнитьЗначенияСвойств(Структура, Форма); + + Если Структура.ТекущаяГруппаДоступа <> "РеквизитНеСуществует" Тогда + Отбор.Вставить("ГруппаДоступа", Структура.ТекущаяГруппаДоступа); + КонецЕсли; + + Если ВидДоступа <> "БезОтбораПоВидуДоступа" Тогда + Отбор.Вставить("ВидДоступа", ВидДоступа); + КонецЕсли; + + Возврат Отбор; + +КонецФункции + +// Только для внутреннего использования +Процедура ЗаполнитьСвойстваВидовДоступаВФорме(Форма) Экспорт + + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + Для каждого Строка Из Параметры.ВидыДоступа Цикл + + Строка.Используется = Истина; + + Если Строка.ВидДоступа <> Неопределено Тогда + Отбор = Новый Структура("Ссылка", Строка.ВидДоступа); + НайденныеСтроки = Форма.ВсеВидыДоступа.НайтиСтроки(Отбор); + Если НайденныеСтроки.Количество() > 0 Тогда + Строка.ВидДоступаПредставление = НайденныеСтроки[0].Представление; + Строка.Используется = НайденныеСтроки[0].Используется; + КонецЕсли; + КонецЕсли; + + ЗаполнитьВсеРазрешеныПредставление(Форма, Строка); + + ЗаполнитьНомераСтрокЗначенийДоступаПоВиду(Форма, Строка); + КонецЦикла; + +КонецПроцедуры + +// Только для внутреннего использования +Процедура ОбработкаПроверкиЗаполненияНаСервереФормыРедактированияРазрешенныхЗначений( + Форма, Отказ, ПроверенныеРеквизитыТаблиц, Ошибки, НеПроверять = Ложь) Экспорт + + Элементы = Форма.Элементы; + Параметры = ПараметрыФормыРедактированияРазрешенныхЗначений(Форма); + + ПроверенныеРеквизитыТаблиц.Добавить(Параметры.ПутьКТаблицам + "ВидыДоступа.ВидДоступа"); + ПроверенныеРеквизитыТаблиц.Добавить(Параметры.ПутьКТаблицам + "ЗначенияДоступа.ВидДоступа"); + ПроверенныеРеквизитыТаблиц.Добавить(Параметры.ПутьКТаблицам + "ЗначенияДоступа.ЗначениеДоступа"); + + Если НеПроверять Тогда + Возврат; + КонецЕсли; + + ОтборВидовДоступа = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма); + + ВидыДоступа = Параметры.ВидыДоступа.НайтиСтроки(ОтборВидовДоступа); + ИндексВидаДоступа = ВидыДоступа.Количество()-1; + + // Проверка незаполненных и повторяющихся видов доступа. + Пока НЕ Отказ И ИндексВидаДоступа >= 0 Цикл + + СтрокаВидаДоступа = ВидыДоступа[ИндексВидаДоступа]; + + // Проверка заполнения вида доступа. + Если СтрокаВидаДоступа.ВидДоступа = Неопределено Тогда + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, + Параметры.ПутьКТаблицам + "ВидыДоступа[%1].ВидДоступа", + НСтр("ru = 'Вид доступа не выбран.'"), + "ВидыДоступа", + ВидыДоступа.Найти(СтрокаВидаДоступа), + НСтр("ru = 'Вид доступа в строке %1 не выбран.'"), + Параметры.ВидыДоступа.Индекс(СтрокаВидаДоступа)); + Отказ = Истина; + Прервать; + КонецЕсли; + + // Проверка наличия повторяющихся видов доступа. + ОтборВидовДоступа.Вставить("ВидДоступа", СтрокаВидаДоступа.ВидДоступа); + НайденныеВидыДоступа = Параметры.ВидыДоступа.НайтиСтроки(ОтборВидовДоступа); + + Если НайденныеВидыДоступа.Количество() > 1 Тогда + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, + Параметры.ПутьКТаблицам + "ВидыДоступа[%1].ВидДоступа", + НСтр("ru = 'Вид доступа повторяется.'"), + "ВидыДоступа", + ВидыДоступа.Найти(СтрокаВидаДоступа), + НСтр("ru = 'Вид доступа в строке %1 повторяется.'"), + Параметры.ВидыДоступа.Индекс(СтрокаВидаДоступа)); + Отказ = Истина; + Прервать; + КонецЕсли; + + ОтборЗначенийДоступа = ОтборВТаблицахФормыРедактированияРазрешенныхЗначений( + Форма, СтрокаВидаДоступа.ВидДоступа); + + ЗначенияДоступа = Параметры.ЗначенияДоступа.НайтиСтроки(ОтборЗначенийДоступа); + ИндексЗначенияДоступа = ЗначенияДоступа.Количество()-1; + + Пока НЕ Отказ И ИндексЗначенияДоступа >= 0 Цикл + + СтрокаЗначенияДоступа = ЗначенияДоступа[ИндексЗначенияДоступа]; + + // Проверка заполнения значения доступа. + Если НЕ ЗначениеЗаполнено(СтрокаЗначенияДоступа.ЗначениеДоступа) Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = СтрокаВидаДоступа.ПолучитьИдентификатор(); + Элементы.ЗначенияДоступа.ТекущаяСтрока = СтрокаЗначенияДоступа.ПолучитьИдентификатор(); + + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, + Параметры.ПутьКТаблицам + "ЗначенияДоступа[%1].ЗначениеДоступа", + НСтр("ru = 'Значение не выбрано.'"), + "ЗначенияДоступа", + ЗначенияДоступа.Найти(СтрокаЗначенияДоступа), + НСтр("ru = 'Значение в строке %1 не выбрано.'"), + Параметры.ЗначенияДоступа.Индекс(СтрокаЗначенияДоступа)); + Отказ = Истина; + Прервать; + КонецЕсли; + + // Проверка наличия повторяющихся значений. + ОтборЗначенийДоступа.Вставить("ЗначениеДоступа", СтрокаЗначенияДоступа.ЗначениеДоступа); + НайденныеЗначения = Параметры.ЗначенияДоступа.НайтиСтроки(ОтборЗначенийДоступа); + + Если НайденныеЗначения.Количество() > 1 Тогда + Элементы.ВидыДоступа.ТекущаяСтрока = СтрокаВидаДоступа.ПолучитьИдентификатор(); + Элементы.ЗначенияДоступа.ТекущаяСтрока = СтрокаЗначенияДоступа.ПолучитьИдентификатор(); + + ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки, + Параметры.ПутьКТаблицам + "ЗначенияДоступа[%1].ЗначениеДоступа", + НСтр("ru = 'Значение повторяется.'"), + "ЗначенияДоступа", + ЗначенияДоступа.Найти(СтрокаЗначенияДоступа), + НСтр("ru = 'Значение в строке %1 повторяется.'"), + Параметры.ЗначенияДоступа.Индекс(СтрокаЗначенияДоступа)); + Отказ = Истина; + Прервать; + КонецЕсли; + + ИндексЗначенияДоступа = ИндексЗначенияДоступа - 1; + КонецЦикла; + ИндексВидаДоступа = ИндексВидаДоступа - 1; + КонецЦикла; + +КонецПроцедуры diff --git a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/ПрисоединенныеФайлыКлиентСервер.mdo b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/УправлениеДоступомСлужебныйКлиентСервер.mdo similarity index 58% rename from SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/ПрисоединенныеФайлыКлиентСервер.mdo rename to SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/УправлениеДоступомСлужебныйКлиентСервер.mdo index 2de5d6dc9..70c8b792e 100644 --- a/SSL/src/CommonModules/ПрисоединенныеФайлыКлиентСервер/ПрисоединенныеФайлыКлиентСервер.mdo +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйКлиентСервер/УправлениеДоступомСлужебныйКлиентСервер.mdo @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="57df7810-817b-430d-9e62-bc1ac302434e"> - <name>ПрисоединенныеФайлыКлиентСервер</name> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="7f1cd658-ca10-49c6-80ef-b8956f3269ea"> + <name>УправлениеДоступомСлужебныйКлиентСервер</name> <synonym> <key>ru</key> - <value>Присоединенные файлы клиент сервер</value> + <value>Управление доступом служебный клиент сервер</value> </synonym> <clientManagedApplication>true</clientManagedApplication> <server>true</server> diff --git a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl index cba234f6a..b5486a8e7 100644 --- a/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/УправлениеДоступомСлужебныйПовтИсп/Module.bsl @@ -16,19 +16,15 @@ СтандартныеПодсистемыСервер.ПроверитьОбновлениеПараметровРаботыПрограммы( "ПараметрыОграниченияДоступа", - "ВсеПустыеСсылки, - |ВозможныеПраваПоЗначениямДоступа, + "ВозможныеПраваДляНастройкиПравОбъектов, |ПоставляемыеПрофилиГруппДоступа, |ПредопределенныеПрофилиГруппДоступа, |СвойстваВидовДоступа"); ПредставлениеПараметра = ""; - Если НЕ СохраненныеПараметры.Свойство("ВсеПустыеСсылки") Тогда - ПредставлениеПараметра = НСтр("ru = 'Общие параметры'"); - - ИначеЕсли НЕ СохраненныеПараметры.Свойство("ВозможныеПраваПоЗначениямДоступа") Тогда - ПредставлениеПараметра = НСтр("ru = 'Возможные права по значениям доступа'"); + Если НЕ СохраненныеПараметры.Свойство("ВозможныеПраваДляНастройкиПравОбъектов") Тогда + ПредставлениеПараметра = НСтр("ru = 'Возможные права для настройки прав объектов'"); ИначеЕсли НЕ СохраненныеПараметры.Свойство("ПоставляемыеПрофилиГруппДоступа") Тогда ПредставлениеПараметра = НСтр("ru = 'Поставляемые профили групп доступа'"); @@ -65,13 +61,14 @@ // // Возвращаемое значение: // ТаблицаЗначений: -// Таблица - Строка - имя таблицы объекта метаданных, например, Справочник.Файлы -// Право - Строка: "Чтение", "Добавление", "Изменение", "Удаление" -// ВидДоступа - ПланВидовХарактеристикСсылка.ВидыДоступа -// ТаблицаОбъекта - Строка - имя таблицы объекта метаданных, через который ограничивается -// доступ, используя наборы значений доступа, например, Справочник.ПапкиФайлов -// Непустая строка, если ВидДоступа пустая ссылка, что -// в данном случае соответствует виду доступа Объект. +// Таблица - Строка - имя таблицы объекта метаданных, например, Справочник.Файлы +// Право - Строка: "Чтение", "Изменение" +// ВидДоступа - Ссылка - пустая ссылка основного типа значений вида доступа, +// пустая ссылка владельца настроек прав. +// - Неопределено - для вида доступа Объект. +// ТаблицаОбъекта - Ссылка - пустая ссылка объекта метаданных, через который ограничивается доступ, +// используя наборы значений доступа, например, Справочник.ПапкиФайлов. +// - Неопределено, если ВидДоступа <> Неопределено. // Функция ПостоянныеВидыОграниченийПравОбъектовМетаданных() Экспорт @@ -80,32 +77,8 @@ ВидыДоступаПрав = Новый ТаблицаЗначений; ВидыДоступаПрав.Колонки.Добавить("Таблица", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); ВидыДоступаПрав.Колонки.Добавить("Право", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(20))); - ВидыДоступаПрав.Колонки.Добавить("ВидДоступа", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыДоступа")); - ВидыДоступаПрав.Колонки.Добавить("ТаблицаОбъекта", Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных")); - - ПредопределенныеВидыДоступа = Новый Соответствие; - Запрос = Новый Запрос; - Запрос.Текст = - "ВЫБРАТЬ - | ВидыДоступа.Ссылка КАК Ссылка, - | НЕОПРЕДЕЛЕНО КАК ИмяПредопределенныхДанных - |ИЗ - | ПланВидовХарактеристик.ВидыДоступа КАК ВидыДоступа - |ГДЕ - | ВидыДоступа.Предопределенный = ИСТИНА"; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Запрос.Текст = СтрЗаменить(Запрос.Текст, "НЕОПРЕДЕЛЕНО", "ВидыДоступа.ИмяПредопределенныхДанных"); - КонецЕсли; - - Выборка = Запрос.Выполнить().Выбрать(); - Пока Выборка.Следующий() Цикл - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяВидаДоступа = Выборка.ИмяПредопределенныхДанных; - Иначе - ИмяВидаДоступа = ПланыВидовХарактеристик.ВидыДоступа.ПолучитьИмяПредопределенного(Выборка.Ссылка); - КонецЕсли; - ПредопределенныеВидыДоступа.Вставить(ИмяВидаДоступа, Выборка.Ссылка); - КонецЦикла; + ВидыДоступаПрав.Колонки.Добавить("ВидДоступа", ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав()); + ВидыДоступаПрав.Колонки.Добавить("ТаблицаОбъекта", Метаданные.РегистрыСведений.НаборыЗначенийДоступа.Измерения.Объект.Тип); ОграниченияПрав = ""; @@ -116,7 +89,9 @@ Обработчик.Модуль.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(ОграниченияПрав); КонецЦикла; - УправлениеДоступомПереопределяемый.ЗаполнитьВидыОграниченийПравОбъектовМетаданных(ОграниченияПрав); + УправлениеДоступомПереопределяемый.ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(ОграниченияПрав); + + ВидыДоступаПоИменам = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа.ПоИменам; Для НомерСтроки = 1 По СтрЧислоСтрок(ОграниченияПрав) Цикл ТекущаяСтрока = СтрПолучитьСтроку(ОграниченияПрав, НомерСтроки); @@ -138,27 +113,46 @@ ВидДоступа = Сред(ТекущаяСтрока, ПозицияВидаДоступа + 1, ПозицияТаблицыОбъекта - ПозицияВидаДоступа - 1); ТаблицаОбъекта = Сред(ТекущаяСтрока, ПозицияТаблицыОбъекта + 1); КонецЕсли; + Если Метаданные.НайтиПоПолномуИмени(Таблица) = Неопределено Тогда ПояснениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найдена таблица ""%1"".'"), Таблица); - ИначеЕсли Право <> "Чтение" - И Право <> "Добавление" - И Право <> "Изменение" - И Право <> "Удаление" Тогда + + ИначеЕсли Право <> "Чтение" И Право <> "Изменение" Тогда ПояснениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найдено право ""%1"".'"), Право); + ИначеЕсли ВРег(ВидДоступа) = ВРег("Объект") Тогда Если Метаданные.НайтиПоПолномуИмени(ТаблицаОбъекта) = Неопределено Тогда ПояснениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найдена таблица объекта ""%1"".'"), ТаблицаОбъекта); + Иначе + ВидДоступаСсылка = Неопределено; + ТаблицаОбъектаСсылка = УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных( + ТаблицаОбъекта); КонецЕсли; - ИначеЕсли ПредопределенныеВидыДоступа.Получить(ВидДоступа) = Неопределено Тогда + + ИначеЕсли ВРег(ВидДоступа) = ВРег("НастройкиПрав") Тогда + Если Метаданные.НайтиПоПолномуИмени(ТаблицаОбъекта) = Неопределено Тогда + ПояснениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найдена таблица владельца настроек прав ""%1"".'"), + ТаблицаОбъекта); + Иначе + ВидДоступаСсылка = УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных( + ТаблицаОбъекта); + ТаблицаОбъектаСсылка = Неопределено; + КонецЕсли; + + ИначеЕсли ВидыДоступаПоИменам.Получить(ВидДоступа) = Неопределено Тогда ПояснениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не найден вид доступа ""%1"".'"), ВидДоступа); + Иначе + ВидДоступаСсылка = ВидыДоступаПоИменам.Получить(ВидДоступа).Ссылка; + ТаблицаОбъектаСсылка = Неопределено; КонецЕсли; КонецЕсли; @@ -169,19 +163,62 @@ | |'"), ТекущаяСтрока) + ПояснениеОшибки); Иначе + СвойстваВидаДоступа = ВидыДоступаПоИменам.Получить(ВидДоступа); НовоеОписание = ВидыДоступаПрав.Добавить(); НовоеОписание.Таблица = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Таблица); НовоеОписание.Право = Право; - НовоеОписание.ВидДоступа = ПредопределенныеВидыДоступа.Получить(ВидДоступа); - Если ЗначениеЗаполнено(ТаблицаОбъекта) Тогда - НовоеОписание.ТаблицаОбъекта = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТаблицаОбъекта); - Иначе - НовоеОписание.ТаблицаОбъекта = Справочники.ИдентификаторыОбъектовМетаданных.ПустаяСсылка(); - КонецЕсли; + НовоеОписание.ВидДоступа = ВидДоступаСсылка; + НовоеОписание.ТаблицаОбъекта = ТаблицаОбъектаСсылка; КонецЕсли; КонецЕсли; КонецЦикла; + // Добавление видов доступа объектов, которые определяются не только через наборы значений доступа. + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ЗависимостиПравДоступа.ПодчиненнаяТаблица, + | ЗависимостиПравДоступа.ТипВедущейТаблицы + |ИЗ + | РегистрСведений.ЗависимостиПравДоступа КАК ЗависимостиПравДоступа"; + ЗависимостиПрав = Запрос.Выполнить().Выгрузить(); + + ПрекратитьПопытки = Ложь; + Пока НЕ ПрекратитьПопытки Цикл + ПрекратитьПопытки = Истина; + Отбор = Новый Структура("ВидДоступа", Неопределено); + ВидыДоступаОбъект = ВидыДоступаПрав.НайтиСтроки(Отбор); + Для каждого Строка Из ВидыДоступаОбъект Цикл + ИдентификаторТаблицы = ОбщегоНазначения.ИдентификаторОбъектаМетаданных( + ТипЗнч(Строка.ТаблицаОбъекта)); + + Отбор = Новый Структура; + Отбор.Вставить("ПодчиненнаяТаблица", Строка.Таблица); + Отбор.Вставить("ТипВедущейТаблицы", Строка.ТаблицаОбъекта); + Если ЗависимостиПрав.НайтиСтроки(Отбор).Количество() = 0 Тогда + ВедущееПраво = Строка.Право; + Иначе + ВедущееПраво = "Чтение"; + КонецЕсли; + Отбор = Новый Структура("Таблица, Право", ИдентификаторТаблицы, ВедущееПраво); + ВидыДоступаВедущейТаблицы = ВидыДоступаПрав.НайтиСтроки(Отбор); + Для каждого ОписаниеВидаДоступа Из ВидыДоступаВедущейТаблицы Цикл + Если ОписаниеВидаДоступа.ВидДоступа = Неопределено Тогда + // Вид доступа объект нельзя добавлять. + Продолжить; + КонецЕсли; + Отбор = Новый Структура; + Отбор.Вставить("Таблица", Строка.Таблица); + Отбор.Вставить("Право", Строка.Право); + Отбор.Вставить("ВидДоступа", ОписаниеВидаДоступа.ВидДоступа); + Если ВидыДоступаПрав.НайтиСтроки(Отбор).Количество() = 0 Тогда + ЗаполнитьЗначенияСвойств(ВидыДоступаПрав.Добавить(), Отбор); + ПрекратитьПопытки = Ложь; + КонецЕсли; + КонецЦикла; + КонецЦикла; + КонецЦикла; + Возврат ВидыДоступаПрав; КонецФункции @@ -215,13 +252,14 @@ КонецФункции // Только для внутреннего использования. -Функция ТипыПоляТаблицы(Таблица, ГруппаПолей, Поле) Экспорт +Функция ТипыПоляТаблицы(ПолноеИмяПоля) Экспорт - ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(Таблица); + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ПолноеИмяПоля); + + МассивТипов = ОбъектМетаданных.Тип.Типы(); ТипыПоля = Новый Соответствие; - - Для каждого Тип Из ОбъектМетаданных[ГруппаПолей][Поле].Тип.Типы() Цикл + Для каждого Тип Из МассивТипов Цикл ТипыПоля.Вставить(Тип, Истина); КонецЦикла; @@ -235,7 +273,7 @@ // ИменаПодписок - Строка - многострочная строка, содержащая // строки начала имени подписки. // -Функция ТипыОбъектовВПодпискахНаСобытия(ИменаПодписок) Экспорт +Функция ТипыОбъектовВПодпискахНаСобытия(ИменаПодписок, МассивПустыхСсылок = Ложь) Экспорт ТипыОбъектов = Новый Соответствие; @@ -244,7 +282,9 @@ Для НомерСтроки = 1 По СтрЧислоСтрок(ИменаПодписок) Цикл НачалоИмени = СтрПолучитьСтроку(ИменаПодписок, НомерСтроки); - Если ВРег(Лев(Подписка.Имя, СтрДлина(НачалоИмени))) = ВРег(НачалоИмени) Тогда + ИмяПодписки = Подписка.Имя; + + Если ВРег(Лев(ИмяПодписки, СтрДлина(НачалоИмени))) = ВРег(НачалоИмени) Тогда Для каждого Тип Из Подписка.Источник.Типы() Цикл ТипыОбъектов.Вставить(Тип, Истина); @@ -255,6 +295,218 @@ КонецЦикла; - Возврат Новый ФиксированноеСоответствие(ТипыОбъектов); + Если Не МассивПустыхСсылок Тогда + Возврат Новый ФиксированноеСоответствие(ТипыОбъектов); + КонецЕсли; + + Массив = Новый Массив; + Для каждого КлючИЗначение Из ТипыОбъектов Цикл + Массив.Добавить(УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных( + КлючИЗначение.Ключ)); + КонецЦикла; + + Возврат Новый ФиксированныйМассив(Массив); + +КонецФункции + +// Только для внутреннего использования +Функция ТаблицаПустогоНабораЗаписей(ПолноеИмяРегистра) Экспорт + + Менеджер = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПолноеИмяРегистра); + + Возврат Менеджер.СоздатьНаборЗаписей().Выгрузить(); + +КонецФункции + +// Только для внутреннего использования +Функция ТаблицаПустыхСсылокУказанныхТипов(ПолноеИмяРеквизита) Экспорт + + ОписаниеТипов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРеквизита).Тип; + + ПустыеСсылки = Новый ТаблицаЗначений; + ПустыеСсылки.Колонки.Добавить("ПустаяСсылка", ОписаниеТипов); + + Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл + Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда + ПустыеСсылки.Добавить().ПустаяСсылка = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка(); + КонецЕсли; + КонецЦикла; + + Возврат ПустыеСсылки; + +КонецФункции + +// Только для внутреннего использования +Функция СоответствиеПустыхСсылокУказаннымТипамСсылок(ПолноеИмяРеквизита) Экспорт + + ОписаниеТипов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРеквизита).Тип; + + ПустыеСсылки = Новый Соответствие; + + Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл + Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда + ПустыеСсылки.Вставить(ТипЗначения, ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка() ); + КонецЕсли; + КонецЦикла; + + Возврат Новый ФиксированноеСоответствие(ПустыеСсылки); + +КонецФункции + +// Только для внутреннего использования +Функция КодыТиповСсылок(ПолноеИмяРеквизита) Экспорт + + ОписаниеТипов = Метаданные.НайтиПоПолномуИмени(ПолноеИмяРеквизита).Тип; + + ЧисловыеКодыТипов = Новый Соответствие; + ТекущийКод = 0; + + Для каждого ТипЗначения Из ОписаниеТипов.Типы() Цикл + Если ОбщегоНазначения.ЭтоСсылка(ТипЗначения) Тогда + ЧисловыеКодыТипов.Вставить(ТипЗначения, ТекущийКод); + КонецЕсли; + ТекущийКод = ТекущийКод + 1; + КонецЦикла; + + СтроковыеКодыТипов = Новый Соответствие; + + ДлинаСтроковогоКода = СтрДлина(Формат(ТекущийКод-1, "ЧН=0; ЧГ=")); + ФорматнаяСтрокаКода = "ЧЦ=" + Формат(ДлинаСтроковогоКода, "ЧН=0; ЧГ=") + "; ЧН=0; ЧВН=; ЧГ="; + + Для каждого КлючИЗначение Из ЧисловыеКодыТипов Цикл + СтроковыеКодыТипов.Вставить( + КлючИЗначение.Ключ, + Формат(КлючИЗначение.Значение, ФорматнаяСтрокаКода)); + КонецЦикла; + + Возврат СтроковыеКодыТипов; + +КонецФункции + +// Только для внутреннего использования +Функция КодыПеречислений() Экспорт + + КодыПеречислений = Новый Соответствие; + + Для каждого ТипЗначенияДоступа Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл + МетаданныеТипа = Метаданные.НайтиПоТипу(ТипЗначенияДоступа); + Если МетаданныеТипа = Неопределено ИЛИ НЕ Метаданные.Перечисления.Содержит(МетаданныеТипа) Тогда + Продолжить; + КонецЕсли; + Для каждого ЗначениеПеречисления Из МетаданныеТипа.ЗначенияПеречисления Цикл + ИмяЗначения = ЗначениеПеречисления.Имя; + КодыПеречислений.Вставить(Перечисления[МетаданныеТипа.Имя][ИмяЗначения], ИмяЗначения); + КонецЦикла; + КонецЦикла; + + Возврат Новый ФиксированноеСоответствие(КодыПеречислений);; + +КонецФункции + +// Только для внутреннего использования +Функция ТипыЗначенийВидовДоступа() Экспорт + + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + + ТипыЗначенийВидовДоступа = Новый ТаблицаЗначений; + ТипыЗначенийВидовДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + ТипыЗначенийВидовДоступа.Колонки.Добавить("ТипЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + + Для каждого КлючИЗначение Из СвойстваВидовДоступа.ПоТипамЗначений Цикл + Строка = ТипыЗначенийВидовДоступа.Добавить(); + Строка.ВидДоступа = КлючИЗначение.Значение.Ссылка; + + Типы = Новый Массив; + Типы.Добавить(КлючИЗначение.Ключ); + ОписаниеТипа = Новый ОписаниеТипов(Типы); + + Строка.ТипЗначений = ОписаниеТипа.ПривестиЗначение(Неопределено); + КонецЦикла; + + Возврат ТипыЗначенийВидовДоступа; + +КонецФункции + +// Только для внутреннего использования +Функция ТипыГруппИЗначенийВидовДоступа() Экспорт + + СвойстваВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.Параметры().СвойстваВидовДоступа; + + ТипыГруппИЗначенийВидовДоступа = Новый ТаблицаЗначений; + ТипыГруппИЗначенийВидовДоступа.Колонки.Добавить("ВидДоступа", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + ТипыГруппИЗначенийВидовДоступа.Колонки.Добавить("ТипГруппИЗначений", Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип); + + Для каждого КлючИЗначение Из СвойстваВидовДоступа.ПоТипамГруппИЗначений Цикл + Строка = ТипыГруппИЗначенийВидовДоступа.Добавить(); + Строка.ВидДоступа = КлючИЗначение.Значение.Ссылка; + + Типы = Новый Массив; + Типы.Добавить(КлючИЗначение.Ключ); + ОписаниеТипа = Новый ОписаниеТипов(Типы); + + Строка.ТипГруппИЗначений = ОписаниеТипа.ПривестиЗначение(Неопределено); + КонецЦикла; + + Возврат ТипыГруппИЗначенийВидовДоступа; + +КонецФункции + +// Только для внутреннего использования +Функция ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав() Экспорт + + Типы = Новый Массив; + Для каждого Тип Из Метаданные.ОпределяемыеТипы.ЗначениеДоступа.Тип.Типы() Цикл + Типы.Добавить(Тип); + КонецЦикла; + + Для каждого Тип Из Метаданные.ОпределяемыеТипы.ВладелецНастроекПрав.Тип.Типы() Цикл + Типы.Добавить(Тип); + КонецЦикла; + + Возврат Новый ОписаниеТипов(Типы); + +КонецФункции + +// Только для внутреннего использования +Функция ТипыЗначенийВидовДоступаИВладельцевНастроекПрав() Экспорт + + ТипыЗначенийВидовДоступаИВладельцевНастроекПрав = Новый ТаблицаЗначений; + + ТипыЗначенийВидовДоступаИВладельцевНастроекПрав.Колонки.Добавить("ВидДоступа", + УправлениеДоступомСлужебныйПовтИсп.ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав()); + + ТипыЗначенийВидовДоступаИВладельцевНастроекПрав.Колонки.Добавить("ТипЗначений", + УправлениеДоступомСлужебныйПовтИсп.ОписаниеТиповЗначенийДоступаИВладельцевНастроекПрав()); + + ТипыЗначенийВидовДоступа = УправлениеДоступомСлужебныйПовтИсп.ТипыЗначенийВидовДоступа(); + + Для каждого Строка Из ТипыЗначенийВидовДоступа Цикл + ЗаполнитьЗначенияСвойств(ТипыЗначенийВидовДоступаИВладельцевНастроекПрав.Добавить(), Строка); + КонецЦикла; + + ВладельцыПрав = УправлениеДоступомСлужебныйПовтИсп.Параметры( + ).ВозможныеПраваДляНастройкиПравОбъектов.ПоТипамСсылок; + + Для каждого КлючИЗначение Из ВладельцыПрав Цикл + + Типы = Новый Массив; + Типы.Добавить(КлючИЗначение.Ключ); + ОписаниеТипа = Новый ОписаниеТипов(Типы); + + Строка = ТипыЗначенийВидовДоступаИВладельцевНастроекПрав.Добавить(); + Строка.ВидДоступа = ОписаниеТипа.ПривестиЗначение(Неопределено); + Строка.ТипЗначений = ОписаниеТипа.ПривестиЗначение(Неопределено); + КонецЦикла; + + Возврат ТипыЗначенийВидовДоступаИВладельцевНастроекПрав; + +КонецФункции + +// Только для внутреннего использования +Функция ВидыОграниченийПравОбъектовМетаданных() Экспорт + + Возврат Новый Структура("ДатаОбновления, Таблица", '00010101'); КонецФункции diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиВызовСервера/Module.bsl index 4e4350196..9673a6c7e 100644 --- a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиВызовСервера/Module.bsl @@ -7,7 +7,6 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ // Сдвиг границы рассчитанных итогов. -// Процедура УстановкаПериодаРассчитанныхИтогов() Экспорт Если НЕ УправлениеИтогамиИАгрегатамиСлужебный.НадоСдвинутьГраницуИтогов() Тогда diff --git a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl index 2e9f71cfe..351fb5e85 100644 --- a/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеИтогамиИАгрегатамиСлужебный/Module.bsl @@ -28,7 +28,7 @@ СерверныеОбработчики["СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПослеОбновленияИнформационнойБазы"].Добавить( "УправлениеИтогамиИАгрегатамиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики["СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "УправлениеИтогамиИАгрегатамиСлужебный"); КонецЕсли; @@ -46,11 +46,6 @@ // Процедура ПриДобавленииОбработчиковОбновления(Обработчики) Экспорт - Обработчик = Обработчики.Добавить(); - Обработчик.НачальноеЗаполнение = Истина; - Обработчик.Процедура = "УправлениеИтогамиИАгрегатамиСлужебный.ИнициироватьПараметрыИтоговИАгрегатов"; - Обработчик.ОбщиеДанные = Истина; - Обработчик = Обработчики.Добавить(); Обработчик.Версия = "2.1.3.7"; Обработчик.Процедура = "УправлениеИтогамиИАгрегатамиСлужебный.УстановитьИспользованиеРегламентныхЗаданий"; @@ -113,16 +108,11 @@ Процедура ПослеОбновленияИнформационнойБазы(Знач ПредыдущаяВерсия, Знач ТекущаяВерсия, Знач ВыполненныеОбработчики, ВыводитьОписаниеОбновлений, МонопольныйРежим) Экспорт - Если ПредыдущаяВерсия = "0.0.0.0" Или ПустаяСтрока(ПредыдущаяВерсия) Тогда - Возврат; - КонецЕсли; - Если НЕ РежимРаботыЛокальныйФайловый() Тогда Возврат; КонецЕсли; - Параметры = СформироватьПараметрыИтоговИАгрегатов(); - ЗаписатьПараметрыИтоговИАгрегатов(Параметры); + СформироватьПараметрыИтоговИАгрегатов(); КонецПроцедуры @@ -156,16 +146,16 @@ КонецЕсли; ДатаСеанса = ТекущаяДатаСеанса(); - РегистрНакопленияПериод = КонецМесяца(ДобавитьМесяц(ДатаСеанса, -1)); - РегистрБухгалтерииПериод = КонецМесяца(ДатаСеанса); + РегистрНакопленияПериод = КонецМесяца(ДобавитьМесяц(ДатаСеанса, -1)); // Конец прошлого месяца. + РегистрБухгалтерииПериод = КонецМесяца(ДатаСеанса); // Конец текущего месяца. // Расчет итогов для регистров накопления. ВидОстатки = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки; Для Каждого РегистрМетаданные Из Метаданные.РегистрыНакопления Цикл Если РегистрМетаданные.ВидРегистра = ВидОстатки Тогда РегистрНакопленияМенеджер = РегистрыНакопления[РегистрМетаданные.Имя]; - Если ПолучитьПериодРассчитанныхИтогов(РегистрНакопленияМенеджер) < РегистрНакопленияПериод Тогда - УстановитьПериодРассчитанныхИтогов(РегистрНакопленияМенеджер, РегистрНакопленияПериод); + Если РегистрНакопленияМенеджер.ПолучитьМаксимальныйПериодРассчитанныхИтогов() < РегистрНакопленияПериод Тогда + РегистрНакопленияМенеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(РегистрНакопленияПериод); Если РегистрНакопленияМенеджер.ПолучитьИспользованиеТекущихИтогов() Тогда РегистрНакопленияМенеджер.ПересчитатьТекущиеИтоги(); КонецЕсли; @@ -176,8 +166,8 @@ // Расчет итогов для регистров бухгалтерии. Для Каждого РегистрМетаданные Из Метаданные.РегистрыБухгалтерии Цикл РегистрБухгалтерииМенеджер = РегистрыБухгалтерии[РегистрМетаданные.Имя]; - Если ПолучитьПериодРассчитанныхИтогов(РегистрБухгалтерииМенеджер) < РегистрБухгалтерииПериод Тогда - УстановитьПериодРассчитанныхИтогов(РегистрБухгалтерииМенеджер, РегистрБухгалтерииПериод); + Если РегистрБухгалтерииМенеджер.ПолучитьМаксимальныйПериодРассчитанныхИтогов() < РегистрБухгалтерииПериод Тогда + РегистрБухгалтерииМенеджер.УстановитьМаксимальныйПериодРассчитанныхИтогов(РегистрБухгалтерииПериод); Если РегистрБухгалтерииМенеджер.ПолучитьИспользованиеТекущихИтогов() Тогда РегистрБухгалтерииМенеджер.ПересчитатьТекущиеИтоги(); КонецЕсли; @@ -241,8 +231,7 @@ // Определяет актуальность итогов и агрегатов. Если нет регистров, то возвращает Истина. Функция НадоСдвинутьГраницуИтогов() Экспорт Параметры = ПараметрыИтоговИАгрегатов(); - Возврат Пользователи.ЭтоПолноправныйПользователь() - И Параметры.ЕстьРегистрыИтогов И ДобавитьМесяц(Параметры.ДатаРасчетаИтогов, 1) < ТекущаяДатаСеанса(); + Возврат Параметры.ЕстьРегистрыИтогов И ДобавитьМесяц(Параметры.ДатаРасчетаИтогов, 1) < ТекущаяДатаСеанса(); КонецФункции // Получает значение константы "ПараметрыИтоговИАгрегатов". @@ -264,15 +253,18 @@ ВидОстатки = Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки; Для Каждого РегистрМетаданные Из Метаданные.РегистрыНакопления Цикл Если РегистрМетаданные.ВидРегистра = ВидОстатки Тогда + Дата = РегистрыНакопления[РегистрМетаданные.Имя].ПолучитьМаксимальныйПериодРассчитанныхИтогов() + 1; Параметры.ЕстьРегистрыИтогов = Истина; - Параметры.ДатаРасчетаИтогов = Мин(Параметры.ДатаРасчетаИтогов, ПолучитьПериодРассчитанныхИтогов(РегистрыНакопления[РегистрМетаданные.Имя])); + Параметры.ДатаРасчетаИтогов = Мин(Параметры.ДатаРасчетаИтогов, Дата); КонецЕсли; КонецЦикла; Если НЕ Параметры.ЕстьРегистрыИтогов Тогда - Параметры.ДатаРасчетаИтогов = '00010101'; + Параметры.Вставить("ДатаРасчетаИтогов", '00010101'); КонецЕсли; + ЗаписатьПараметрыИтоговИАгрегатов(Параметры); + Возврат Параметры; КонецФункции @@ -281,59 +273,16 @@ Константы.ПараметрыИтоговИАгрегатов.Установить(Новый ХранилищеЗначения(Параметры)); КонецПроцедуры -// Возвращает период рассчитанных итогов для регистров. -Функция ПолучитьПериодРассчитанныхИтогов(МенеджерРегистра) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат МенеджерРегистра.ПолучитьМаксимальныйПериодРассчитанныхИтогов(); - Иначе - Возврат МенеджерРегистра.ПолучитьПериодРассчитанныхИтогов(); - КонецЕсли; - -КонецФункции - -// Устанавливает период, на который рассчитаны итоги в регистре. -Процедура УстановитьПериодРассчитанныхИтогов(МенеджерРегистра, Период) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - МенеджерРегистра.УстановитьМаксимальныйПериодРассчитанныхИтогов(Период); - Иначе - МенеджерРегистра.УстановитьПериодРассчитанныхИтогов(Период); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы -// Устанавливает параметры подсистемы при первом запуске программы. -// -Процедура ИнициироватьПараметрыИтоговИАгрегатов() Экспорт - - Если НЕ РежимРаботыЛокальныйФайловый() Тогда - Возврат; - КонецЕсли; - - Параметры = Константы.ПараметрыИтоговИАгрегатов.Получить().Получить(); - Если ТипЗнч(Параметры) <> Тип("Структура") Тогда - Параметры = СформироватьПараметрыИтоговИАгрегатов(); - Параметры.ДатаРасчетаИтогов = ТекущаяДатаСеанса(); - ЗаписатьПараметрыИтоговИАгрегатов(Параметры); - КонецЕсли; - -КонецПроцедуры - // Устанавливает расписания и использование регламентных заданий подсистемы // в значения по умолчанию. Используется только при перехода на версию // 2.1.3 библиотеки. // Процедура УстановитьИспользованиеРегламентныхЗаданий() Экспорт - ПустоеРасписание = ОбщегоНазначения.ЗначениеИзСтрокиXML( - "<JobSchedule xmlns=""http://v8.1c.ru/8.1/data/enterprise"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""JobSchedule"" BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""00:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""0"" WeeksPeriod=""1"" DaysRepeatPeriod=""0""> - | <WeekDays/> - | <Months/> - |</JobSchedule>"); + ПустоеРасписание = РасписаниеЗаданияПоУмолчанию(""); ПроверятьИспользование = НЕ ОбщегоНазначенияПовтИсп.РазделениеВключено(); @@ -367,40 +316,45 @@ // Другие Функция РасписаниеЗаданияПоУмолчанию(Знач Имя) + Расписание = Новый РасписаниеРегламентногоЗадания; + Если Имя = "" Тогда + Возврат Расписание; + КонецЕсли; + Расписание.ПериодПовтораДней = 1; Если Имя = "ОбновлениеАгрегатов" Тогда - РасписаниеXML = - "<JobSchedule xmlns=""http://v8.1c.ru/8.1/data/enterprise"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""JobSchedule"" BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""01:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""0"" WeeksPeriod=""1"" DaysRepeatPeriod=""1""> - | <WeekDays>1 2 3 4 5 6 7</WeekDays> - | <Months>1 2 3 4 5 6 7 8 9 10 11 12</Months> - | <DetailedDailySchedules BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""01:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""0"" WeeksPeriod=""1"" DaysRepeatPeriod=""0""> - | <WeekDays/> - | <Months/> - | </DetailedDailySchedules> - | <DetailedDailySchedules BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""14:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""0"" WeeksPeriod=""1"" DaysRepeatPeriod=""0""> - | <WeekDays/> - | <Months/> - | </DetailedDailySchedules> - |</JobSchedule>"; + Расписание.ВремяНачала = Дата(1, 1, 1, 01, 00, 00); + ДобавитьДетальноеРасписание(Расписание, "ВремяНачала", Дата(1, 1, 1, 01, 00, 00)); + ДобавитьДетальноеРасписание(Расписание, "ВремяНачала", Дата(1, 1, 1, 14, 00, 00)); ИначеЕсли Имя = "ПерестроениеАгрегатов" Тогда - РасписаниеXML = - "<JobSchedule xmlns=""http://v8.1c.ru/8.1/data/enterprise"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""JobSchedule"" BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""03:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""0"" WeeksPeriod=""1"" DaysRepeatPeriod=""1""> - | <WeekDays>6</WeekDays> - | <Months>1 2 3 4 5 6 7 8 9 10 11 12</Months> - |</JobSchedule>"; + Расписание.ВремяНачала = Дата(1, 1, 1, 03, 00, 00); + УстановитьДниНедели(Расписание, "6"); ИначеЕсли Имя = "УстановкаПериодаРассчитанныхИтогов" Тогда - РасписаниеXML = - "<JobSchedule xmlns=""http://v8.1c.ru/8.1/data/enterprise"" xmlns:xs=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:type=""JobSchedule"" BeginDate=""0001-01-01"" EndDate=""0001-01-01"" BeginTime=""01:00:00"" EndTime=""00:00:00"" CompletionTime=""00:00:00"" CompletionInterval=""0"" RepeatPeriodInDay=""0"" RepeatPause=""0"" WeekDayInMonth=""0"" DayInMonth=""5"" WeeksPeriod=""1"" DaysRepeatPeriod=""1""> - | <WeekDays>1 2 3 4 5 6 7</WeekDays> - | <Months>1 2 3 4 5 6 7 8 9 10 11 12</Months> - |</JobSchedule>"; + Расписание.ВремяНачала = Дата(1, 1, 1, 01, 00, 00); + Расписание.ДеньВМесяце = 5; Иначе ШаблонСообщения = НСтр("ru = 'Неизвестное имя задания %1'"); ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Имя); ВызватьИсключение(ТекстСообщения); КонецЕсли; - Возврат ОбщегоНазначения.ЗначениеИзСтрокиXML(РасписаниеXML); - + Возврат Расписание; КонецФункции +Процедура ДобавитьДетальноеРасписание(Расписание, Ключ, Значение) + ДетальноеРасписание = Новый РасписаниеРегламентногоЗадания; + ЗаполнитьЗначенияСвойств(ДетальноеРасписание, Новый Структура(Ключ, Значение)); + Массив = Расписание.ДетальныеРасписанияДня; + Массив.Добавить(ДетальноеРасписание); + Расписание.ДетальныеРасписанияДня = Массив; +КонецПроцедуры + +Процедура УстановитьДниНедели(Расписание, ДниНеделиВСтроке) + ДниНедели = Новый Массив; + МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ДниНеделиВСтроке); + Для Каждого СтрокаНомерДняНедели Из МассивСтрок Цикл + ДниНедели.Добавить(Число(СтрокаНомерДняНедели)); + КонецЦикла; + Расписание.ДниНедели = ДниНедели; +КонецПроцедуры + diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl index 9a39f6078..bc1124c74 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформацией/Module.bsl @@ -10,6 +10,7 @@ // Обработчики событий формы и модуля объекта // Обработчик для события формы ПриСозданииНаСервере +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы // // Параметры: // Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной @@ -57,28 +58,24 @@ ГруппаВидовКИ = Справочники.ВидыКонтактнойИнформации[ИмяГруппыВидовКИ]; ИмяОбъекта = МетаданныеОбъекта.Имя; - Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ИдентификаторСтрокиТабличнойЧасти")=Неопределено Тогда + Если МетаданныеОбъекта.ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ИдентификаторСтрокиТабличнойЧасти") = Неопределено Тогда ДанныеИдентификатораСтрокиТабличнойЧасти = "0"; Иначе ДанныеИдентификатораСтрокиТабличнойЧасти = "ЕСТЬNULL(КонтактнаяИнформация.ИдентификаторСтрокиТабличнойЧасти, 0)"; КонецЕсли; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - РеквизитИмениПредопределенного = "ВидыКонтактнойИнформации.ИмяПредопределенныхДанных"; - Иначе - РеквизитИмениПредопределенного = "НЕОПРЕДЕЛЕНО"; - КонецЕсли; - Запрос = Новый Запрос; Если ЗначениеЗаполнено(СсылкаНаОбъект) Тогда Запрос.Текст =" |ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка КАК Вид, - | " + РеквизитИмениПредопределенного + " КАК ИмяПредопределенныхДанных, + | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, | ВидыКонтактнойИнформации.Тип КАК Тип, | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение, | ВидыКонтактнойИнформации.Подсказка КАК Подсказка, | ВидыКонтактнойИнформации.Наименование КАК Наименование, + | ВидыКонтактнойИнформации.Наименование КАК Заголовок, + | | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти, | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания, | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление, @@ -97,8 +94,8 @@ |ГДЕ | НЕ ВидыКонтактнойИнформации.ПометкаУдаления | И ( - | ВидыКонтактнойИнформации.Родитель=&ГруппаВидовКИ - | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель=&ГруппаВидовКИ + | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ + | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ | ) |УПОРЯДОЧИТЬ ПО | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ @@ -121,11 +118,13 @@ | |ВЫБРАТЬ | ВидыКонтактнойИнформации.Ссылка КАК Вид, - | " + РеквизитИмениПредопределенного + " КАК ИмяПредопределенныхДанных, + | ВидыКонтактнойИнформации.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, | ВидыКонтактнойИнформации.Тип КАК Тип, | ВидыКонтактнойИнформации.ОбязательноеЗаполнение КАК ОбязательноеЗаполнение, | ВидыКонтактнойИнформации.Подсказка КАК Подсказка, | ВидыКонтактнойИнформации.Наименование КАК Наименование, + | ВидыКонтактнойИнформации.Наименование КАК Заголовок, + | | ВидыКонтактнойИнформации.ЭтоГруппа КАК ЭтоРеквизитТабличнойЧасти, | ВидыКонтактнойИнформации.РеквизитДопУпорядочивания КАК РеквизитДопУпорядочивания, | ЕСТЬNULL(КонтактнаяИнформация.Представление, """") КАК Представление, @@ -143,8 +142,8 @@ |ГДЕ | НЕ ВидыКонтактнойИнформации.ПометкаУдаления | И ( - | ВидыКонтактнойИнформации.Родитель=&ГруппаВидовКИ - | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель=&ГруппаВидовКИ + | ВидыКонтактнойИнформации.Родитель = &ГруппаВидовКИ + | ИЛИ ВидыКонтактнойИнформации.Родитель.Родитель = &ГруппаВидовКИ | ) |УПОРЯДОЧИТЬ ПО | ВидыКонтактнойИнформации.Ссылка ИЕРАРХИЯ @@ -167,11 +166,6 @@ Если ОбъектКонтактнойИнформации.ЭтоРеквизитТабличнойЧасти Тогда ИмяВидаКИ = ОбъектКонтактнойИнформации.ИмяПредопределенныхДанных; - Если ИмяВидаКИ=Неопределено Тогда - // 8.2 или совместимость - ИмяВидаКИ = Справочники.ВидыКонтактнойИнформации.ПолучитьИмяПредопределенного(ОбъектКонтактнойИнформации.Вид); - КонецЕсли; - Поз = Найти(ИмяВидаКИ, ИмяОбъекта); ИмяТабличнойЧасти = Сред(ИмяВидаКИ, Поз + СтрДлина(ИмяОбъекта)); @@ -192,7 +186,8 @@ ИмяРеквизита = "КонтактнаяИнформацияПоле" + ИмяТабличнойЧасти + ОбъектКонтактнойИнформации.Строки.Индекс(СтрокаКИ); ПутьРеквизитов = "Объект." + ИмяТабличнойЧасти; - МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Строка500, ПутьРеквизитов, СтрокаКИ.Наименование, Истина)); + + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита, Строка500, ПутьРеквизитов, СтрокаКИ.Заголовок, Истина)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ИмяРеквизита + "ЗначенияПолей", Новый ОписаниеТипов("СписокЗначений, Строка"), ПутьРеквизитов,, Истина)); ПредыдущийВид = ТекущийВид; @@ -205,7 +200,7 @@ Иначе ОбъектКонтактнойИнформации.ИмяРеквизита = "КонтактнаяИнформацияПоле" + КонтактнаяИнформация.Индекс(ОбъектКонтактнойИнформации); - МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, Строка500, , ОбъектКонтактнойИнформации.Наименование, Истина)); + МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(ОбъектКонтактнойИнформации.ИмяРеквизита, Строка500, , ОбъектКонтактнойИнформации.Заголовок, Истина)); // При обнаружении ошибок распознавания не прерываем генерацию Попытка @@ -215,7 +210,7 @@ УровеньЖурналаРегистрации.Ошибка, , ОбъектКонтактнойИнформации.ЗначенияПолей, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()) ); ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru='Ошибка анализа контактной информации, возможно неверный формат значений полей.'"), , + НСтр("ru = 'Ошибка анализа контактной информации, возможно неверный формат значений полей.'"), , ОбъектКонтактнойИнформации.ИмяРеквизита); КонецПопытки; КонецЕсли; @@ -354,11 +349,11 @@ ГруппаКоманды = Группа("ГруппаКонтактнаяИнформацияДобавитьПолеВвода", Форма, Родитель, ГруппировкаПодчиненныхЭлементовФормы.Горизонтальная, 5); - ГруппаКоманды.Отображение = ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыОтступ(); + ГруппаКоманды.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; ИмяКоманды = "КонтактнаяИнформацияДобавитьПолеВвода"; Команда = Форма.Команды.Добавить(ИмяКоманды); - Команда.Подсказка = НСтр("ru='Добавить дополнительное поле контактной информации'"); + Команда.Подсказка = НСтр("ru = 'Добавить дополнительное поле контактной информации'"); Команда.Отображение = ОтображениеКнопки.КартинкаИТекст; Команда.Картинка = БиблиотекаКартинок.ДобавитьЭлементСписка; Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; @@ -367,7 +362,7 @@ ДобавитьОписаниеЭлемента(Форма, ИмяКоманды, 9, Истина); Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), ГруппаКоманды); - Кнопка.Заголовок = НСтр("ru='Добавить'"); + Кнопка.Заголовок = НСтр("ru = 'Добавить'"); Кнопка.ИмяКоманды = ИмяКоманды; ДобавитьОписаниеЭлемента(Форма, ИмяКоманды, 2); @@ -376,6 +371,12 @@ КонецПроцедуры // Обработчик для события формы ПриЧтенииНаСервере +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы +// +// Параметры: +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации +// Объект - Объект-владелец контактной информации +// Процедура ПриЧтенииНаСервере(Форма, Объект) Экспорт СписокРеквизитовФормы = Форма.ПолучитьРеквизиты(); @@ -425,6 +426,12 @@ КонецПроцедуры // Обработчик для события формы ПослеЗаписиНаСервере +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы +// +// Параметры: +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации +// Объект - Объект-владелец контактной информации +// Процедура ПослеЗаписиНаСервере(Форма, Объект) Экспорт ИмяОбъекта = Объект.Ссылка.Метаданные().Имя; @@ -462,6 +469,12 @@ КонецПроцедуры // Обработчик для события формы ОбработкаПроверкиЗаполненияНаСервере +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы +// +// Параметры: +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации +// Объект - Объект-владелец контактной информации +// Процедура ОбработкаПроверкиЗаполненияНаСервере(Форма, Объект, Отказ) Экспорт ИмяОбъекта = Объект.Ссылка.Метаданные().Имя; @@ -542,6 +555,12 @@ КонецПроцедуры // Обработчик для события формы ПередЗаписьюНаСервере +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы +// +// Параметры: +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации +// Объект - Объект-владелец контактной информации +// Процедура ПередЗаписьюНаСервере(Форма, Объект, Отказ = Ложь) Экспорт Объект.КонтактнаяИнформация.Очистить(); @@ -585,20 +604,28 @@ КонецПроцедуры -// Добавляет (удаляет) поле ввода или комментарий на форму +// Добавляет (удаляет) поле ввода или комментарий на форму, обновляя данные +// Вызывается из модуля формы объекта-владельца КИ при внедрении подсистемы +// +// Параметры: +// Форма - УправляемаяФорма - Форма объекта-владельца, предназначенная для вывода контактной информации +// Объект - Объект-владелец контактной информации +// Результат - Необязательный служебный реквизит, полученный из предыдущего обработчика события. // Функция ОбновитьКонтактнуюИнформацию(Форма, Объект, Результат = Неопределено) Экспорт - Если Результат.Свойство("ЭтоДобавлениеКомментария") Тогда + Если Результат = Неопределено Тогда + Возврат Неопределено; + ИначеЕсли Результат.Свойство("ЭтоДобавлениеКомментария") Тогда ИзменитьКомментарий(Форма, Результат.ИмяРеквизита, Результат.ЭтоДобавлениеКомментария); ИначеЕсли Результат.Свойство("ДобавляемыйВид") Тогда - ДобавитьСтрокуКонтактнойИнформации(Форма, Результат); КонецЕсли; + Возврат Неопределено; КонецФункции //////////////////////////////////////////////////////////////////////////////// @@ -629,7 +656,7 @@ // - ИмяПоля - Строка, название элемента в структуре адреса // - Сообщение - строка, подробный текст ошибки для поля // -Функция ПроверитьАдрес(Знач СтруктураПолейАдреса, ВидКонтактнойИнформации=Неопределено) Экспорт +Функция ПроверитьАдрес(Знач СтруктураПолейАдреса, ВидКонтактнойИнформации = Неопределено) Экспорт Возврат КонтактнаяИнформацияСлужебный.ОшибкиЗаполненияАдреса(СтруктураПолейАдреса, ВидКонтактнойИнформации, Истина); КонецФункции @@ -645,7 +672,7 @@ // // Возвращаемое значение - строка XML данных контактной информации // -Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление="", Знач ОжидаемыйВид=Неопределено) Экспорт +Функция КонтактнаяИнформацияВXML(Знач ЗначенияПолей, Знач Представление = "", Знач ОжидаемыйВид = Неопределено) Экспорт Результат = КонтактнаяИнформацияXML.ПривестиКонтактнуюИнформациюXML(Новый Структура( "ЗначенияПолей, Представление, ВидКонтактнойИнформации", @@ -669,7 +696,7 @@ // XMLСтрока - строка, описывающая контактную информацию. Может быть изменена если указан второй параметр. // НовоеЗначение - если этот параметр указан, то представление в XMLСтрока устанавливается на новое значение // -Функция ПредставлениеКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение=Неопределено) Экспорт +Функция ПредставлениеКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение = Неопределено) Экспорт Возврат КонтактнаяИнформацияСлужебный.ПредставлениеКонтактнойИнформации(XMLСтрока, НовоеЗначение); КонецФункции @@ -680,9 +707,9 @@ // ВидКонтактнойИнформации - СправочникСсылка.ВидыКонтактнойИнформации, Структура - набор флагов, описывающих // параметры генерации представления // -Функция ПредставлениеКонтактнойИнформацииПоЗначениюПолей(Знач XMLСтрока, Знач ВидКонтактнойИнформации=Неопределено) Экспорт +Функция ПредставлениеКонтактнойИнформацииПоЗначениюПолей(Знач XMLСтрока, Знач ВидКонтактнойИнформации = Неопределено) Экспорт - Если ВидКонтактнойИнформации=Неопределено Тогда + Если ВидКонтактнойИнформации = Неопределено Тогда Вид = СтруктураВидаКонтактнойИнформации(); Вид.Тип = КонтактнаяИнформацияXML.ТипКонтактнойИнформации(XMLСтрока); Иначе @@ -698,7 +725,7 @@ // XMLСтрока - строка, описывающая контактную информацию. Может быть изменена если указан второй параметр. // НовоеЗначение - если этот параметр указан, то комментарий в XMLСтрока устанавливается на новое значение // -Функция КомментарийКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение=Неопределено) Экспорт +Функция КомментарийКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение = Неопределено) Экспорт Возврат КонтактнаяИнформацияСлужебный.КомментарийКонтактнойИнформации(XMLСтрока, НовоеЗначение); КонецФункции @@ -710,7 +737,7 @@ // // Если переданная строка не содержит информации об адресе РФ, то будет вызвано исключение // -Функция АдресПоДокументуКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение=Неопределено) Экспорт +Функция АдресПоДокументуКонтактнойИнформации(XMLСтрока, Знач НовоеЗначение = Неопределено) Экспорт Если ПустаяСтрока(XMLСтрока) Тогда Возврат ""; КонецЕсли; @@ -720,11 +747,11 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); АдресРФ = КонтактнаяИнформацияСлужебный.РоссийскийАдрес(XDTOАдрес.Состав); - Если АдресРФ=Неопределено Тогда - ВызватьИсключение НСтр("ru='Невозможно определить адрес по документу, ожидается адрес РФ'"); + Если АдресРФ = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить адрес по документу, ожидается адрес РФ'"); КонецЕсли; - Если НовоеЗначение<>Неопределено Тогда + Если НовоеЗначение <> Неопределено Тогда АдресРФ.Адрес_по_документу = НовоеЗначение; XMLСтрока = КонтактнаяИнформацияСлужебный.СериализацияКонтактнойИнформации(XDTOАдрес); КонецЕсли; @@ -760,13 +787,13 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Адрес = XDTOАдрес.Состав; - Если Адрес=Неопределено Или Адрес.Тип()<>ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru='Невозможно определить страну, ожидается адрес.'"); + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить страну, ожидается адрес.'"); КонецЕсли; Результат.Наименование = СокрЛП(Адрес.Страна); ДанныеСтраны = Справочники.СтраныМира.ДанныеСтраныМира(, Результат.Наименование); - Возврат ?(ДанныеСтраны=Неопределено, Результат, ДанныеСтраны); + Возврат ?(ДанныеСтраны = Неопределено, Результат, ДанныеСтраны); КонецФункции // Возвращает наименование субъекта РФ для адреса или пустую строку, если субъект не определен @@ -786,12 +813,12 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Адрес = XDTOАдрес.Состав; - Если Адрес=Неопределено Или Адрес.Тип()<>ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru='Невозможно определить субъекта РФ, ожидается адрес.'"); + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить субъекта РФ, ожидается адрес.'"); КонецЕсли; АдресРФ = КонтактнаяИнформацияСлужебный.РоссийскийАдрес(Адрес); - Возврат ?(АдресРФ=Неопределено, "", СокрЛП(АдресРФ.СубъектРФ)); + Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.СубъектРФ)); КонецФункции // Возвращает наименование города для адреса РФ или пустую строку для иностранного адреса @@ -811,12 +838,12 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Адрес = XDTOАдрес.Состав; - Если Адрес=Неопределено Или Адрес.Тип()<>ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда - ВызватьИсключение НСтр("ru='Невозможно определить город, ожидается адрес.'"); + Если Адрес = Неопределено Или Адрес.Тип() <> ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + ВызватьИсключение НСтр("ru = 'Невозможно определить город, ожидается адрес.'"); КонецЕсли; АдресРФ = КонтактнаяИнформацияСлужебный.РоссийскийАдрес(Адрес); - Возврат ?(АдресРФ=Неопределено, "", СокрЛП(АдресРФ.Город)); + Возврат ?(АдресРФ = Неопределено, "", СокрЛП(АдресРФ.Город)); КонецФункции // Возвращает домен сетевого адреса для веб-ссылки или адреса электронной почты @@ -834,26 +861,26 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Состав = XDTOАдрес.Состав; - Если Состав<>Неопределено Тогда + Если Состав <> Неопределено Тогда Тип = Состав.Тип(); - Если Тип=ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда ДоменАдреса = СокрЛП(Состав.Значение); Позиция = Найти(ДоменАдреса, "://"); - Если Позиция>0 Тогда + Если Позиция > 0 Тогда ДоменАдреса = Сред(ДоменАдреса, Позиция + 3); КонецЕсли; Позиция = Найти(ДоменАдреса, "/"); - Возврат ?(Позиция=0, ДоменАдреса, Лев(ДоменАдреса, Позиция - 1)); + Возврат ?(Позиция = 0, ДоменАдреса, Лев(ДоменАдреса, Позиция - 1)); - ИначеЕсли Тип=ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "ЭлектроннаяПочта") Тогда ДоменАдреса = СокрЛП(Состав.Значение); Позиция = Найти(ДоменАдреса, "@"); - Возврат ?(Позиция=0, ДоменАдреса, Сред(ДоменАдреса, Позиция + 1)); + Возврат ?(Позиция = 0, ДоменАдреса, Сред(ДоменАдреса, Позиция + 1)); КонецЕсли; КонецЕсли; - ВызватьИсключение НСтр("ru='Невозможно определить домен, ожидается электронная почта или веб-ссылка.'"); + ВызватьИсключение НСтр("ru = 'Невозможно определить домен, ожидается электронная почта или веб-ссылка.'"); КонецФункции // Возвращает строку с номером телефона без кода и дополнительного номера @@ -871,18 +898,18 @@ Чтение.УстановитьСтроку(XMLСтрока); XDTOАдрес = ФабрикаXDTO.ПрочитатьXML(Чтение, ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация")); Состав = XDTOАдрес.Состав; - Если Состав<>Неопределено Тогда + Если Состав <> Неопределено Тогда Тип = Состав.Тип(); - Если Тип=ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + Если Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда Возврат СокрЛП(Состав.Номер); - ИначеЕсли Тип=ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда + ИначеЕсли Тип = ФабрикаXDTO.Тип(ПространствоИмен, "НомерФакса") Тогда Возврат СокрЛП(Состав.Номер); КонецЕсли; КонецЕсли; - ВызватьИсключение НСтр("ru='Невозможно определить номер, ожидается телефона или факс.'"); + ВызватьИсключение НСтр("ru = 'Невозможно определить номер, ожидается телефона или факс.'"); КонецФункции // Сравнивает два экземпляра контактной инфромации. @@ -925,7 +952,7 @@ // Возвращаемое значение: // Строка с набором пар ключ-значение, разделенных переносом строки // -Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СтарыйСоставПолей=Ложь) Экспорт +Функция ПредыдущийФорматКонтактнойИнформацииXML(Знач Данные, Знач СтарыйСоставПолей = Ложь) Экспорт Если КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда СтарыйФормат = КонтактнаяИнформацияСлужебный.КонтактнаяИнформацияВСтаруюСтруктуру(Данные, СтарыйСоставПолей); @@ -939,21 +966,21 @@ // Преобразует данные нового формата XML контактной информации в структуру старого формата // // Параметры: -// Данные - строка значений полей, в новом формате (xml) или в старом (ключ=значение) +// Данные - строка значений полей, в новом формате (xml) или в старом (ключ = значение) // ВидКонтактнойИнформации - необязательная ссылка на справочник вида, или совместимая по полям структура // используется, если "Данные" - пустая строка // // Возвращаемое значение: // Структура с набором пар ключ-значение // -Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации=Неопределено) Экспорт +Функция ПредыдущаяСтруктураКонтактнойИнформацииXML(Знач Данные, Знач ВидКонтактнойИнформации = Неопределено) Экспорт Если КонтактнаяИнформацияКлиентСервер.ЭтоКонтактнаяИнформацияВXML(Данные) Тогда // Новый формат КИ Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураЗначенийПолей( ПредыдущийФорматКонтактнойИнформацииXML(Данные)); - ИначеЕсли ПустаяСтрока(Данные) И ВидКонтактнойИнформации<>Неопределено Тогда + ИначеЕсли ПустаяСтрока(Данные) И ВидКонтактнойИнформации <> Неопределено Тогда // Генерируем по виду Возврат УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу( ВидКонтактнойИнформации.Тип); @@ -978,7 +1005,7 @@ // // Если страна не найдена ни в адресе, ни в классификаторе, то возвращается значение Неопределено // -Функция ДанныеСтраныМира(Знач КодСтраны=Неопределено, Знач Наименование=Неопределено) Экспорт +Функция ДанныеСтраныМира(Знач КодСтраны = Неопределено, Знач Наименование = Неопределено) Экспорт Возврат Справочники.СтраныМира.ДанныеСтраныМира(КодСтраны, Наименование); КонецФункции @@ -1104,12 +1131,12 @@ // ЗначенияПолей // Представление // -Процедура СоздатьВТКонтактнаяИнформация(МенеджерВременныхТаблиц, МассивОбъектов, ТипыКИ=Неопределено, ВидыКИ=Неопределено) Экспорт +Процедура СоздатьВТКонтактнаяИнформация(МенеджерВременныхТаблиц, МассивОбъектов, ТипыКИ = Неопределено, ВидыКИ = Неопределено) Экспорт Если ТипЗнч(МассивОбъектов) = Тип("Массив") И МассивОбъектов.Количество() > 0 Тогда Ссылка = МассивОбъектов.Получить(0); Иначе - ВызватьИсключение НСтр("ru='Неверное значение для массива владельцев контактной информации.'"); + ВызватьИсключение НСтр("ru = 'Неверное значение для массива владельцев контактной информации.'"); КонецЕсли; Запрос = Новый Запрос(" @@ -1124,8 +1151,8 @@ | " + Ссылка.Метаданные().ПолноеИмя() + ".КонтактнаяИнформация КАК КонтактнаяИнформация |ГДЕ | КонтактнаяИнформация.Ссылка В (&МассивОбъектов) - | " + ?(ТипыКИ=Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКИ)") + " - | " + ?(ВидыКИ=Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКИ)") + " + | " + ?(ТипыКИ = Неопределено, "", "И КонтактнаяИнформация.Тип В (&ТипыКИ)") + " + | " + ?(ВидыКИ = Неопределено, "", "И КонтактнаяИнформация.Вид В (&ВидыКИ)") + " |"); Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц; @@ -1290,11 +1317,11 @@ Результат = Неопределено; Тип = ТипЗнч(ВидИнформации); - Если Тип=Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда + Если Тип = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда Результат = ВидИнформации; - ИначеЕсли Тип=Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда + ИначеЕсли Тип = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда Результат = ВидИнформации.Тип; - ИначеЕсли ВидИнформации<>Неопределено Тогда + ИначеЕсли ВидИнформации <> Неопределено Тогда Данные = Новый Структура("Тип"); ЗаполнитьЗначенияСвойств(Данные, ВидИнформации); Результат = Данные.Тип; @@ -1306,35 +1333,81 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -Процедура ОбработкаЗаполненияКонтактнойИнформации(Источник, ДанныеЗаполнения, СтандартнаяОбработка) Экспорт +// Обработчик подписки события "ОбработкаЗаполнения" +// +Процедура ОбработкаЗаполненияКонтактнойИнформации(Источник, ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка) Экспорт + + ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Источник, ДанныеЗаполнения); + +КонецПроцедуры + +// Обработчик подписки события "ОбработкаЗаполнения" для документов +// +Процедура ОбработкаЗаполненияКонтактнойИнформацииДокумента(Источник, ДанныеЗаполнения, СтандартнаяОбработка) Экспорт + + ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Источник, ДанныеЗаполнения); + +КонецПроцедуры + +Процедура ОбработкаЗаполненияКонтактнойИнформацииОбъекта(Объект, Знач ДанныеЗаполнения) Если ТипЗнч(ДанныеЗаполнения) <> Тип("Структура") Тогда Возврат; КонецЕсли; - // Заполним наименование - Наименование = ""; - Если ДанныеЗаполнения.Свойство("Наименование", Наименование) Тогда - Источник.Наименование = Наименование; + // Наименование, если есть в объекте-приемнике + Наименование = Неопределено; + Если ДанныеЗаполнения.Свойство("Наименование", Наименование) + И ЕстьРеквизитОбъекта("Наименование", Объект) + Тогда + Объект.Наименование = Наименование; КонецЕсли; - // Заполним контактную информацию + // Таблица контактной информации, заполняется только если КИ не находится в другой ТЧ КонтактнаяИнформация = Неопределено; - Если ДанныеЗаполнения.Свойство("КонтактнаяИнформация", КонтактнаяИнформация) Тогда - Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл + Если ДанныеЗаполнения.Свойство("КонтактнаяИнформация", КонтактнаяИнформация) + И ЕстьРеквизитОбъекта("КонтактнаяИнформация", Объект) + Тогда + + Если ТипЗнч(КонтактнаяИнформация) = Тип("ТаблицаЗначений") Тогда + КолонкиТаблицы = КонтактнаяИнформация.Колонки; + Иначе + КолонкиТаблицы = КонтактнаяИнформация.ВыгрузитьКолонки().Колонки; + КонецЕсли; + + Если КолонкиТаблицы.Найти("ИдентификаторСтрокиТабличнойЧасти") = Неопределено Тогда - НоваяСтрокаКИ = Источник.КонтактнаяИнформация.Добавить(); - ЗаполнитьЗначенияСвойств(НоваяСтрокаКИ, СтрокаКИ); + Для Каждого СтрокаКИ Из КонтактнаяИнформация Цикл + НоваяСтрокаКИ = Объект.КонтактнаяИнформация.Добавить(); + ЗаполнитьЗначенияСвойств(НоваяСтрокаКИ, СтрокаКИ, , "ЗначенияПолей"); + НоваяСтрокаКИ.ЗначенияПолей = КонтактнаяИнформацияВXML(СтрокаКИ.ЗначенияПолей, СтрокаКИ.Представление, СтрокаКИ.Вид); + КонецЦикла; - Если ТипЗнч(СтрокаКИ.ЗначенияПолей) = Тип("СписокЗначений") Тогда - НоваяСтрокаКИ.ЗначенияПолей = Новый ХранилищеЗначения(СтрокаКИ.ЗначенияПолей); - КонецЕсли; - - КонецЦикла; + КонецЕсли; + КонецЕсли; КонецПроцедуры +// Определяет, есть ли у объекта реквизит с заданным именем +// +// Параметры: +// ИмяРеквизита - Строка - Имя реквизита, наличие которого проверяется +// Объект - Произвольный - Проверяемый объект +// +Функция ЕстьРеквизитОбъекта(Знач ИмяРеквизита, Знач Объект) + ПроверкаРеквизита = Новый Структура(ИмяРеквизита, Неопределено); + ЗаполнитьЗначенияСвойств(ПроверкаРеквизита, Объект); + Если ПроверкаРеквизита[ИмяРеквизита] <> Неопределено Тогда + Возврат Истина; + КонецЕсли; + + ПроверкаРеквизита[ИмяРеквизита] = ""; + ЗаполнитьЗначенияСвойств(ПроверкаРеквизита, Объект); + Возврат ПроверкаРеквизита.Наименование = Неопределено; +КонецФункции + + // Обновляет поля контактной информации из ТаблицыЗначений (например объекта другого вида справочника) // // Параметры: @@ -1356,11 +1429,6 @@ КонецПроцедуры -// Устарело. Будет удалено в следующем релизе БСП. Необходимо использовать "ЗаполнитьКонтактнуюИнформацию" -Процедура ЗаполнитьКонтактнуюИнофрмацию(Источник, Приемник) Экспорт - ЗаполнитьКонтактнуюИнформацию(Источник, Приемник); -КонецПроцедуры - Процедура ДобавитьОписаниеЭлемента(Форма, ИмяЭлемента, Приоритет, ЭтоКоманда = Ложь, ЭтоРеквизитТабличнойЧасти = Ложь) НоваяСтрока = Форма.ДобавленныеЭлементыКонтактнойИнформации.Добавить(); @@ -1642,9 +1710,9 @@ ИмяКоманды = "КонтекстноеМеню" + ИмяРеквизита; Команда = Форма.Команды.Добавить(ИмяКоманды); Кнопка = Форма.Элементы.Добавить(ИмяКоманды,Тип("КнопкаФормы"), Элемент.КонтекстноеМеню); - Команда.Подсказка = НСтр("ru='Ввести комментарий'"); + Команда.Подсказка = НСтр("ru = 'Ввести комментарий'"); Команда.Действие = "Подключаемый_КонтактнаяИнформацияВыполнитьКоманду"; - Кнопка.Заголовок = НСтр("ru='Ввести комментарий'"); + Кнопка.Заголовок = НСтр("ru = 'Ввести комментарий'"); Кнопка.ИмяКоманды = ИмяКоманды; Команда.ИзменяетСохраняемыеДанные = Истина; @@ -1693,21 +1761,21 @@ Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда - Элемент.Заголовок = НСтр("ru='Заполнить'"); - Команда.Подсказка = НСтр("ru='Заполнить адрес'"); + Элемент.Заголовок = НСтр("ru = 'Заполнить'"); + Команда.Подсказка = НСтр("ru = 'Заполнить адрес'"); Команда.Картинка = БиблиотекаКартинок.ПереместитьВлево; Команда.ИзменяетСохраняемыеДанные = Истина; ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда - Элемент.Заголовок = НСтр("ru='Перейти'"); - Команда.Подсказка = НСтр("ru='Перейти по ссылке'"); + Элемент.Заголовок = НСтр("ru = 'Перейти'"); + Команда.Подсказка = НСтр("ru = 'Перейти по ссылке'"); Команда.Картинка = БиблиотекаКартинок.КонтактнаяИнформацияПерейтиПоСсылке; ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда - Элемент.Заголовок = НСтр("ru='Написать письмо'"); - Команда.Подсказка = НСтр("ru='Написать письмо'"); + Элемент.Заголовок = НСтр("ru = 'Написать письмо'"); + Команда.Подсказка = НСтр("ru = 'Написать письмо'"); Команда.Картинка = БиблиотекаКартинок.ОтправитьЭлектронноеПисьмо; КонецЕсли; @@ -1790,11 +1858,11 @@ Адрес = Источник.Состав; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - ЭтоАдрес = ТипЗнч(Адрес)=Тип("ОбъектXDTO") И Адрес.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес"); - Если ЭтоАдрес И Адрес.Состав<>Неопределено Тогда + ЭтоАдрес = ТипЗнч(Адрес) = Тип("ОбъектXDTO") И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес"); + Если ЭтоАдрес И Адрес.Состав <> Неопределено Тогда СтрокаТабличнойЧасти.Страна = Адрес.Страна; АдресРФ = КонтактнаяИнформацияСлужебный.РоссийскийАдрес(Адрес); - Если АдресРФ<>Неопределено Тогда + Если АдресРФ <> Неопределено Тогда // Российский адрес СтрокаТабличнойЧасти.Регион = АдресРФ.СубъектРФ; СтрокаТабличнойЧасти.Город = АдресРФ.Город; @@ -1839,7 +1907,7 @@ Телефон = Источник.Состав; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - Если Телефон<>Неопределено И Телефон.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда + Если Телефон <> Неопределено И Телефон.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "НомерТелефона") Тогда КодСтраны = Телефон.КодСтраны; КодГорода = Телефон.КодГорода; НомерТелефона = Телефон.Номер; @@ -1877,14 +1945,14 @@ АдресСтраницы = Источник.Состав; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - Если АдресСтраницы<>Неопределено И АдресСтраницы.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда + Если АдресСтраницы <> Неопределено И АдресСтраницы.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "ВебСайт") Тогда АдресСтрокой = АдресСтраницы.Значение; //Удалим протокол АдресСервера = Прав(АдресСтрокой, СтрДлина(АдресСтрокой) - Найти(АдресСтрокой, "://") ); Поз = Найти(АдресСервера, "/"); //Удалим путь - АдресСервера = ?(Поз=0, АдресСервера, Лев(АдресСервера, Поз-1)); + АдресСервера = ?(Поз = 0, АдресСервера, Лев(АдресСервера, Поз-1)); СтрокаТабличнойЧасти.ДоменноеИмяСервера = АдресСервера; @@ -1941,7 +2009,7 @@ // ВидИнформации - ссылка на справочник видов КИ с настройками проверки // ИмяРеквизита - необязательно имя реквизита для привязки сообщения об ошибке // -Функция ОшибкиЗаполненияЭлектроннойПочты(Источник, ВидИнформации, Знач ИмяРеквизита="", ПолеРеквизита = "") +Функция ОшибкиЗаполненияЭлектроннойПочты(Источник, ВидИнформации, Знач ИмяРеквизита = "", ПолеРеквизита = "") Если Не ВидИнформации.ПроверятьКорректность Тогда Возврат 0; @@ -1983,7 +2051,7 @@ // ВидИнформации - ссылка на справочник видов КИ с настройками проверки // ИмяРеквизита - необязательно имя реквизита для привязки сообщения об ошибке // -Функция ОшибкиЗаполненияАдреса(Источник, ВидИнформации, ИмяРеквизита="", ПолеРеквизита = "") +Функция ОшибкиЗаполненияАдреса(Источник, ВидИнформации, ИмяРеквизита = "", ПолеРеквизита = "") Если Не ВидИнформации.ПроверятьКорректность Тогда Возврат 0; КонецЕсли; @@ -1991,7 +2059,7 @@ Адрес = Источник.Состав; ПространствоИмен = КонтактнаяИнформацияКлиентСерверПовтИсп.ПространствоИмен(); - Если Адрес<>Неопределено И Адрес.Тип()=ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда + Если Адрес <> Неопределено И Адрес.Тип() = ФабрикаXDTO.Тип(ПространствоИмен, "Адрес") Тогда СписокОшибок = КонтактнаяИнформацияСлужебный.ОшибкиЗаполненияАдреса(Адрес, ВидИнформации); Для Каждого Элемент Из СписокОшибок Цикл ВывестиСообщениеПользователю(Элемент.Представление, ИмяРеквизита, ПолеРеквизита); @@ -2016,7 +2084,7 @@ // ВидИнформации - ссылка на справочник видов КИ с настройками проверки // ИмяРеквизита - необязательно имя реквизита для привязки сообщения об ошибке // -Функция ОшибкиЗаполненияТелефона(Источник, ВидИнформации, ИмяРеквизита="") +Функция ОшибкиЗаполненияТелефона(Источник, ВидИнформации, ИмяРеквизита = "") Возврат 0; КонецФункции @@ -2028,7 +2096,7 @@ // ВидИнформации - ссылка на справочник видов КИ с настройками проверки // ИмяРеквизита - необязательно имя реквизита для привязки сообщения об ошибке // -Функция ОшибкиЗаполненияВебСтраницы(Источник, ВидИнформации, ИмяРеквизита="") +Функция ОшибкиЗаполненияВебСтраницы(Источник, ВидИнформации, ИмяРеквизита = "") Возврат 0; КонецФункции @@ -2074,15 +2142,15 @@ КонецЕсли; // Проверка - Если ТипИнформации=Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда УровеньОшибок = ОшибкиЗаполненияЭлектроннойПочты(ОбъектКИ, ВидИнформации, ИмяРеквизита, ПутьКРеквизиту); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда УровеньОшибок = ОшибкиЗаполненияАдреса(ОбъектКИ, ВидИнформации, ИмяРеквизита); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда УровеньОшибок = ОшибкиЗаполненияТелефона(ОбъектКИ, ВидИнформации, ИмяРеквизита); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Факс Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда УровеньОшибок = ОшибкиЗаполненияТелефона(ОбъектКИ, ВидИнформации, ИмяРеквизита); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда УровеньОшибок = ОшибкиЗаполненияВебСтраницы(ОбъектКИ, ВидИнформации, ИмяРеквизита); Иначе // Другое(прочее) не проверяем @@ -2143,7 +2211,7 @@ // Процедура ЗаполнитьДополнительныеРеквизитыКонтактнойИнформации(СтрокаКИ, Представление, ЗначенияПолей) - Если ТипЗнч(ЗначенияПолей)=Тип("ОбъектXDTO") Тогда + Если ТипЗнч(ЗначенияПолей) = Тип("ОбъектXDTO") Тогда ОбъектКИ = ЗначенияПолей; Иначе ОбъектКИ = КонтактнаяИнформацияСлужебный.ДесериализацияКонтактнойИнформации(ЗначенияПолей, СтрокаКИ.Вид); @@ -2151,19 +2219,19 @@ ТипИнформации = СтрокаКИ.Тип; - Если ТипИнформации=Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда + Если ТипИнформации = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда ЗаполнитьРеквизитыТабличнойЧастиДляАдресаЭлектроннойПочты(СтрокаКИ, ОбъектКИ); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Адрес Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда ЗаполнитьРеквизитыТабличнойЧастиДляАдреса(СтрокаКИ, ОбъектКИ); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Телефон Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКИ, ОбъектКИ); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.Факс Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.Факс Тогда ЗаполнитьРеквизитыТабличнойЧастиДляТелефона(СтрокаКИ, ОбъектКИ); - ИначеЕсли ТипИнформации=Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда + ИначеЕсли ТипИнформации = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда ЗаполнитьРеквизитыТабличнойЧастиДляВебСтраницы(СтрокаКИ, ОбъектКИ); КонецЕсли; @@ -2315,10 +2383,10 @@ // Штатное обновление классификатора без добавления новых стран Обработчик = Обработчики.Добавить(); - Обработчик.Версия = "2.1.8.3"; + Обработчик.Версия = "2.2.1.21"; Обработчик.Процедура = "УправлениеКонтактнойИнформацией.ОбработчикОбновленияСуществующихСтранМира"; Обработчик.РежимВыполнения = "Монопольно"; - Обработчик.ОбщиеДанные = Ложь; + Обработчик.ОбщиеДанные = Ложь; КонецПроцедуры @@ -2329,7 +2397,7 @@ // Контроль версии базы ИмяРегистраЭталона = "УдалитьСтраныМира"; - Если Метаданные.РегистрыСведений.Найти(ИмяРегистраЭталона)=Неопределено Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяРегистраЭталона) = Неопределено Тогда Возврат; КонецЕсли; @@ -2363,8 +2431,8 @@ |ИЗ | РегистрСведений.ОбластиДанных |ГДЕ - | Статус=ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется) - | И ОбластьДанныхВспомогательныеДанные<>0 + | Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОбластейДанных.Используется) + | И ОбластьДанныхВспомогательныеДанные <> 0 |"; Отбор = Набор.Отбор.ОбластьДанных; Выборка = Запрос.Выполнить().Выбрать(); @@ -2383,7 +2451,7 @@ // Контроль версии базы ИмяРегистраЭталона = "УдалитьСтраныМира"; - Если Метаданные.РегистрыСведений.Найти(ИмяРегистраЭталона)=Неопределено Тогда + Если Метаданные.РегистрыСведений.Найти(ИмяРегистраЭталона) = Неопределено Тогда Возврат; КонецЕсли; @@ -2454,135 +2522,102 @@ // Обновляет один вид контактной информации. // // Параметры: -// ВидКИ - Справочник.ВидыКонтактнойИнформации - вид контактной информации. -// Тип - Перечисление.ТипыКонтактнойИнформации - тип контактной информации. -// МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять способ редактирования, Ложь - иначе. -// РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге, Ложь - иначе. -// АдресТолькоРоссийский - Булево - Истина, если адрес только российский, Ложь - Иначе. -// Порядок - Неопределено или Число - порядок вида контактной информации. -// -Процедура ОбновитьВидКИ(ВидКИ, Тип, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге, АдресТолькоРоссийский, - Порядок = Неопределено) Экспорт - - Объект = ВидКИ.ПолучитьОбъект(); - Объект.Тип = Тип; - Объект.МожноИзменятьСпособРедактирования = МожноИзменятьСпособРедактирования; - Объект.РедактированиеТолькоВДиалоге = РедактированиеТолькоВДиалоге; - Объект.АдресТолькоРоссийский = АдресТолькоРоссийский; - Если Порядок <> Неопределено Тогда - Объект.РеквизитДопУпорядочивания = Порядок; - КонецЕсли; - ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - -КонецПроцедуры - -// Обновляет один вид контактной информации. -// -// Параметры: -// Вид - Справочник.ВидыКонтактнойИнформации - вид контактной информации. -// Тип - Перечисление.ТипыКонтактнойИнформации - тип контактной информации. -// Подсказка - Строка - Подсказка к виду контактной информации. -// МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять настройки вида, Ложь - иначе. -// РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге, Ложь - иначе. -// ОбязательноеЗаполнение - Булево - Истина, если требуется обязательное заполнение поля, Ложь - иначе. -// Порядок - Неопределено или Число - порядок вида контактной информации, положение в списке относительно других элементов: -// Неопределено - не переназначать; -// 0 - назначить автоматически; -// Число > 0 - назначить указанный порядок. -// РазрешитьВводНесколькихЗначений - Булево - Признак возможности использования дополнительных полей ввода для данного вида. -// НастройкиПроверки -// Для типа Адрес - Структура -// АдресТолькоРоссийский - Булево - Истина, если используются только российские адреса, Ложь - иначе. -// ПроверятьКорректность - Булево - Истина, если используется проверка адреса по классификатору (Только если АдресТолькоРоссийский = Истина), Ложь - иначе. -// ЗапрещатьВводНекорректного - - Булево - Истина, если требуется запрещать пользователю записывать некорректный адрес (Только если ПроверятьКорректность = Истина), Ложь - иначе. -// СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при вводе(Только если АдресТолькоРоссийский = Истина), Ложь - иначе. +// Вид - СправочникСсылка.ВидыКонтактнойИнформации, Строка - Ссылка на вид контактной информации или идентификатор предопределенного элемента +// Тип - ПеречислениеСсылка.ТипыКонтактнойИнформации, Строка - Тип контактной информации или его идентификатор. +// Подсказка - Строка - Подсказка к виду контактной информации. +// МожноИзменятьСпособРедактирования - Булево - Истина, если есть возможность изменять настройки вида, Ложь - иначе. +// РедактированиеТолькоВДиалоге - Булево - Истина, если редактировать только в диалоге, Ложь - иначе. +// ОбязательноеЗаполнение - Булево - Истина, если требуется обязательное заполнение поля, Ложь - иначе. +// Порядок - Число, Неопределено - Порядок вида контактной информации, положение в списке относительно других элементов: +// Неопределено - не переназначать; +// 0 - назначить автоматически; +// Число > 0 - назначить указанный порядок. +// РазрешитьВводНесколькихЗначений - Булево - Признак возможности использования дополнительных полей ввода для данного вида. +// НастройкиПроверки - Структура, Неопределено - Настройки проверки для вида контактной информации. +// Для типа Адрес - структура, содержащая поля: +// АдресТолькоРоссийский - Булево - Истина, если используются только российские адреса, Ложь - иначе. +// ПроверятьКорректность - Булево - Истина, если используется проверка адреса по классификатору (Только если АдресТолькоРоссийский = Истина), Ложь - иначе. +// ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать некорректный адрес (Только если ПроверятьКорректность = Истина), Ложь - иначе. +// СкрыватьНеактуальныеАдреса - Булево - Истина, если не требуется показывать неактуальные адреса при вводе(Только если АдресТолькоРоссийский = Истина), Ложь - иначе. // ВключатьСтрануВПредставление - Булево - Истина, если требуется включать наименование страны в представление адреса, Ложь - иначе. -// Для типа АдресЭлектроннойПочты - Структура -// ПроверятьКорректность - Булево - Истина, если требуется проверка адреса электронной почты на корректность, Ложь - иначе. +// Для типа АдресЭлектроннойПочты - структура, содержащая поля: +// ПроверятьКорректность - Булево - Истина, если требуется проверка адреса электронной почты на корректность, Ложь - иначе. // ЗапрещатьВводНекорректного - Булево - Истина, если требуется запрещать пользователю записывать некорректный адрес (Только если ПроверятьКорректность = Истина), Ложь - иначе. -// Для остальных типов или для задания настроек по умолчанию используется Неопределено +// Для остальных типов или для задания настроек по умолчанию используется Неопределено // // Примечание: -// Установка параметра ПроверятьКорректность в значение Истина требует так же установить параметр -// ЗапрещатьВводНекорректного в значение Истина. +// Установка параметра ПроверятьКорректность в значение Истина требует так же установить параметр ЗапрещатьВводНекорректного в значение Истина. // -// При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. Если после выполнения обновления значения -// порядка окажутся неуникальными в пределах группы, то настройка порядка пользователем будет невозможна. -// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением 0 (порядок будет назначен автоматически в подсистеме -// "Настройка порядка элементов" при выполнении процедуры). -// Для размещения видов КИ в определённой последовательности относительно друг друга без явного размещения в начале списка достаточно вызывать данную процедуру -// в нужной последовательности для каждого вида КИ с указанием порядка 0. -// Если добавляется предопределённый вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок в явном виде. +// При использовании параметра Порядок следует внимательно следить за уникальностью назначаемого значения. Если после выполнения обновления значения +// порядка окажутся неуникальными в пределах группы, то настройка порядка пользователем будет невозможна. +// В общем случае рекомендуется не использовать этот параметр (порядок не изменится), либо заполнять его значением 0 (порядок будет назначен автоматически в подсистеме +// "Настройка порядка элементов" при выполнении процедуры). +// Для размещения видов КИ в определённой последовательности относительно друг друга без явного размещения в начале списка достаточно вызывать данную процедуру +// в нужной последовательности для каждого вида КИ с указанием порядка 0. +// Если добавляется предопределённый вид КИ к уже существующим в ИБ, не рекомендуется назначать порядок в явном виде. // -Процедура ОбновитьВидКонтактнойИнформации(Вид, Тип, Подсказка, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге, - ОбязательноеЗаполнение, Порядок = Неопределено, РазрешитьВводНесколькихЗначений = Ложь, НастройкиПроверки = Неопределено) Экспорт +Процедура ОбновитьВидКонтактнойИнформации(Вид, Тип, Подсказка, МожноИзменятьСпособРедактирования, РедактированиеТолькоВДиалоге, ОбязательноеЗаполнение, Порядок = Неопределено, РазрешитьВводНесколькихЗначений = Ложь, НастройкиПроверки = Неопределено) Экспорт - Объект = Вид.ПолучитьОбъект(); - Объект.Тип = Тип; + Если ТипЗнч(Вид) = Тип("Строка") Тогда + Объект = Справочники.ВидыКонтактнойИнформации[Вид].ПолучитьОбъект(); + Иначе + Объект = Вид.ПолучитьОбъект(); + КонецЕсли; + + Если ТипЗнч(Тип) = Тип("Строка") Тогда + УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации[Тип]; + Иначе + УстанавливаемыйТип = Тип; + КонецЕсли; + + Объект.Тип = УстанавливаемыйТип; Объект.Подсказка = Подсказка; Объект.МожноИзменятьСпособРедактирования = МожноИзменятьСпособРедактирования; Объект.РедактированиеТолькоВДиалоге = РедактированиеТолькоВДиалоге; Объект.ОбязательноеЗаполнение = ОбязательноеЗаполнение; Объект.РазрешитьВводНесколькихЗначений = РазрешитьВводНесколькихЗначений; - Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес И ТипЗнч(НастройкиПроверки) = Тип("Структура") Тогда - - ТекстИсключения = НСтр("ru='Некорректно заполнены настройки проверки адреса'"); - + ПроверятьНастройки = ТипЗнч(НастройкиПроверки) = Тип("Структура"); + ОшибкаПараметров = НСтр("ru = 'Некорректно заполнены настройки проверки адреса'"); + + Если ПроверятьНастройки И УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда Если НастройкиПроверки.АдресТолькоРоссийский Тогда - Если Не НастройкиПроверки.ПроверятьКорректность Тогда - Если НастройкиПроверки.ЗапрещатьВводНекорректного Тогда - ВызватьИсключение ТекстИсключения; + ВызватьИсключение ОшибкаПараметров; КонецЕсли; - Иначе - - // см. примечание + // См. примечание Если Не НастройкиПроверки.ЗапрещатьВводНекорректного Тогда - ВызватьИсключение ТекстИсключения; + ВызватьИсключение ОшибкаПараметров; КонецЕсли; - КонецЕсли; Иначе - - Если НастройкиПроверки.ПроверятьКорректность - Или НастройкиПроверки.ЗапрещатьВводНекорректного - Или НастройкиПроверки.СкрыватьНеактуальныеАдреса Тогда - - ВызватьИсключение ТекстИсключения; - + Если НастройкиПроверки.ПроверятьКорректность Или НастройкиПроверки.ЗапрещатьВводНекорректного Или НастройкиПроверки.СкрыватьНеактуальныеАдреса Тогда + ВызватьИсключение ОшибкаПараметров; КонецЕсли; КонецЕсли; ЗаполнитьЗначенияСвойств(Объект, НастройкиПроверки); - ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты И ТипЗнч(НастройкиПроверки) = Тип("Структура") Тогда - + ИначеЕсли ПроверятьНастройки И УстанавливаемыйТип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда Если Не НастройкиПроверки.ПроверятьКорректность Тогда - Если НастройкиПроверки.ЗапрещатьВводНекорректного Тогда - - ВызватьИсключение ТекстИсключения; - + ВызватьИсключение ОшибкаПараметров; КонецЕсли; - Иначе - - // см. примечание + // См. примечание Если Не НастройкиПроверки.ЗапрещатьВводНекорректного Тогда - ВызватьИсключение ТекстИсключения; + ВызватьИсключение ОшибкаПараметров; КонецЕсли; - КонецЕсли; - УстановитьЗначенияРеквизитовПроверки(Объект, НастройкиПроверки); Иначе УстановитьЗначенияРеквизитовПроверки(Объект); + КонецЕсли; Если Порядок <> Неопределено Тогда @@ -2590,7 +2625,6 @@ КонецЕсли; ОбновлениеИнформационнойБазы.ЗаписатьДанные(Объект); - КонецПроцедуры // Загружаем все страны мира из классификатора принудительно @@ -2710,7 +2744,38 @@ Возврат Результат; КонецФункции - +// Возвращает список значений +Функция ДоступныеДляКопированияАдреса(Знач ЗначенияПолейДляАнализа, Знач ВидАдреса) Экспорт + + ТекущийТолькоРусский = ВидАдреса.АдресТолькоРоссийский; + + Результат = Новый СписокЗначений; + + Для Каждого Адрес Из ЗначенияПолейДляАнализа Цикл + ДопустимыйИсточник = Истина; + + Представление = Адрес.Представление; + Если ПустаяСтрока(Представление) Тогда + // Не пустое представление + ДопустимыйИсточник = Ложь; + Иначе + Если ТекущийТолькоРусский Тогда + // В адрес, ограниченный Россией, нельзя копировать иностранный адрес + XMLАдрес = КонтактнаяИнформацияВXML(Адрес.ЗначениеПолей, Представление, ВидАдреса); + XDTOАдрес = КонтактнаяИнформацияСлужебный.ДесериализацияКонтактнойИнформации(XMLАдрес, ВидАдреса); + Если Не КонтактнаяИнформацияСлужебный.ЭтоРоссийскийАдрес(XDTOАдрес) Тогда + ДопустимыйИсточник = Ложь; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ДопустимыйИсточник Тогда + Результат.Добавить(Адрес.Идентификатор, Строка(Адрес.ВидАдреса) + ": " + Представление); + КонецЕсли; + КонецЦикла; + + Возврат Результат; +КонецФункции //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -2722,7 +2787,7 @@ // Процедура ПриОпределенииИспользованияКлассификатора(Используются) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда Используются = Истина; КонецЕсли; @@ -2741,8 +2806,8 @@ // Процедура ПриОпределенииЗаписейПоИндексу(Индекс, АдресныеОбъекты) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); АдресныеОбъекты = МодульАдресныйКлассификатор.НайтиЗаписиПоИндексу(Индекс); КонецЕсли; @@ -2762,8 +2827,8 @@ // Процедура ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты(КодАдресногоЭлемента, Результат) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); МодульАдресныйКлассификатор.ПоКодуАдресногоЭлементаВСтруктуруПолучитьЕгоКомпоненты(КодАдресногоЭлемента, Результат); КонецЕсли; @@ -2789,8 +2854,8 @@ // Процедура ПриОпределенииСтруктурыАдреса(СтруктураАдреса, КодАдресногоЭлемента, Дом = "", Корпус = "", Квартира = "") Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); МодульАдресныйКлассификатор.ПолучитьСтруктуруАдреса(КодАдресногоЭлемента, Дом, Корпус, Квартира); КонецЕсли; @@ -2813,8 +2878,8 @@ Процедура ПриОпределенииИндекса(Индекс, НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы, НомерДома, НомерКорпуса, РодительИндекса = Неопределено) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); Индекс = МодульАдресныйКлассификатор.ПолучитьИндекс(НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы, НомерДома, НомерКорпуса, РодительИндекса); КонецЕсли; @@ -2840,8 +2905,8 @@ Процедура ПриОпределенииСпискаАвтоПодбораТекстаВАдресномЭлементе(СписокАвтоПодбора, Текст, Регион, Район, Город, НаселенныйПункт, УровеньЭлемента, ПризнакАктуальности = 0) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); СписокАвтоПодбора = МодульАдресныйКлассификатор.АвтоПодборТекстВАдресномЭлементе(Текст, Регион, Район, Город, НаселенныйПункт, УровеньЭлемента, ПризнакАктуальности); КонецЕсли; @@ -2874,8 +2939,8 @@ Процедура ПриОпределенииСоответствияАдресаКЛАДРу(СтруктураПроверки, УказанныйИндекс = "", НазваниеРегиона = "", НазваниеРайона = "", НазваниеГорода = "", НазваниеНаселенногоПункта = "", НазваниеУлицы = "", НомерДома = "", НомерКорпуса = "") Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); СтруктураПроверки = МодульАдресныйКлассификатор.ПроверитьСоответствиеАдресаКЛАДРу(УказанныйИндекс, НазваниеРегиона,НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы, НомерДома , НомерКорпуса); КонецЕсли; @@ -2899,8 +2964,8 @@ Процедура ПриОпределенииЗагруженностиАдресногоЭлемента(АдресныйЭлементЗагружен, НазваниеРегиона, НазваниеРайона = "", НазваниеГорода = "", НазваниеНаселенногоПункта = "", НазваниеУлицы = "", Уровень = 1) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); АдресныйЭлементЗагружен = МодульАдресныйКлассификатор.АдресныйЭлементЗагружен(НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы, Уровень); КонецЕсли; @@ -2916,8 +2981,8 @@ // Процедура ПриОпределенииИмениИАдресногоСокращение(ИмяИАдресноеСокращение, СтрокаЭлемента, АдресноеСокращение) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); ИмяИАдресноеСокращение = МодульАдресныйКлассификатор.ПолучитьИмяИАдресноеСокращение(СтрокаЭлемента, АдресноеСокращение); КонецЕсли; @@ -2942,8 +3007,8 @@ Процедура ПриОпределенииСтруктурыЗагруженныхЭлементовАдреса(СтруктураЗагруженныхЭлементовАдреса, НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); СтруктураЗагруженныхЭлементовАдреса = МодульАдресныйКлассификатор.СтруктураЗагруженныхЭлементовАдреса(НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы); КонецЕсли; @@ -2958,8 +3023,8 @@ // Процедура ПриОпределенииНаименованияРегионаПоКоду(НаименованиеРегиона, КодРегиона) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); НаименованиеРегиона = МодульАдресныйКлассификатор.ПолучитьНаименованиеРегионаПоКоду(КодРегиона); КонецЕсли; @@ -2973,8 +3038,8 @@ // Процедура ПриОпределенииКодаРегионаПоНаименованию(КодРегиона, Регион) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); КодРегиона = МодульАдресныйКлассификатор.ПолучитьКодРегионаПоНаименованию(Регион); КонецЕсли; @@ -2992,8 +3057,8 @@ // Процедура ПриОпределенииСтрокиАдресногоКлассификатораПоАдреснымЭлементам(СтруктураАдресногоКлассификатора, НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); СтруктураАдресногоКлассификатора = МодульАдресныйКлассификатор.ВернутьСтруктуруАдресногоКлассификатораПоАдреснымЭлементам( НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы); КонецЕсли; @@ -3015,34 +3080,11 @@ // Процедура ПриОчисткеПотомковПоУровнюАдресногоЭлемента(Регион, Район, Город, НаселенныйПункт, Улица, Дом, Корпус, Квартира, Уровень) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификатор = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификатор"); МодульАдресныйКлассификатор.ОчиститьПотомковПоУровнюАдресногоЭлемента(Регион, Район, Город, НаселенныйПункт, Улица, Дом, Корпус, Квартира, Уровень); КонецЕсли; КонецПроцедуры -// Определяет используется ли в конфигурации запрет редактирования реквизитов -// -// Параметры: -// Используется - Булево - Истина, если используется, Ложь - иначе. -// -Процедура ПриОпределенииИспользованияЗапретаРедактированияРеквизитов(Используется) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - Используется = Истина; - КонецЕсли; - -КонецПроцедуры - -// Блокирует запрещенные для редактирования реквизиты -// -Процедура ПриБлокировкеРеквизитовОбъекта(Форма) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектов = Вычислить("ЗапретРедактированияРеквизитовОбъектов"); - МодульЗапретРедактированияРеквизитовОбъектов.ЗаблокироватьРеквизиты(Форма); - КонецЕсли; - -КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl deleted file mode 100644 index d95ba8af1..000000000 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/Module.bsl +++ /dev/null @@ -1,87 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// Подсистема "Контактная информация". -// Устаревший модуль. Будет удален в следующей редакции БСП. -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Устаревший программный интерфейс. Будет удален в следующей редакции БСП. - -// Устарела. Определяет соответствие адреса КЛАДРу по переданным индексу, региону, району, городу, населенному пункту, -// улице, дому и корпусу. -// -// Параметры: -// УказанныйИндекс - Строка - индекс -// НазваниеРегиона - Строка - название региона(с сокращением) -// НазваниеРайона - Строка - название района(с сокращением) -// НазваниеГорода - Строка - название города(с сокращением) -// НазваниеНаселенногоПункта - Строка - название населенного пункта(с сокращением) -// НазваниеУлицы - Строка - название улицы(с сокращением) -// НомерДома - Строка - номер дома, для которого необходимо получить индекс -// НомерКорпуса - Строка - номер корпуса -// -// Возвращаемое значение: -// Структура с полями: -// Регион - Структура - структура полей найденного региона -// Район - Структура - структура полей найденного района -// Город - Структура - структура полей найденного города -// НаселенныйПункт - Структура - структура полей найденного населенного пункта -// Улица - Структура - структура полей найденной улицы -// Дом - Структура - структура полей найденного дома -// ЕстьОшибки - Булево - найдены ли ошибки при проверке -// СтруктураОшибок - Структура - структура в которой в качестве ключа выступает название элемента -// а в качестве значения - подробный текст ошибки. -// -Функция ПроверитьСоответствиеАдресаКЛАДРу(УказанныйИндекс = "", НазваниеРегиона = "", НазваниеРайона = "", - НазваниеГорода = "", НазваниеНаселенногоПункта = "", НазваниеУлицы = "", НомерДома = "", НомерКорпуса = "") Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификатор = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификатор"); - Возврат МодульАдресныйКлассификатор.ПроверитьСоответствиеАдресаКЛАДРу(УказанныйИндекс, - НазваниеРегиона, НазваниеРайона, НазваниеГорода, НазваниеНаселенногоПункта, - НазваниеУлицы, НомерДома); - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -// Устарела. Определяет Используются ли в конфигурации классификаторы -// -// Возвращаемое значение: -// Булево - Истина, если используются, Ложь - иначе. -// -Функция ИспользуютсяКлассификаторы() Экспорт - - ИспользуютсяКлассификаторы = Ложь; - - УправлениеКонтактнойИнформацией.ПриОпределенииИспользованияКлассификатора(ИспользуютсяКлассификаторы); - - Возврат ИспользуютсяКлассификаторы; - -КонецФункции - -// Устарела. Возвращает строку(структуру) адресного классификатора по значениям адресных элементов -// -// Параметры: -// НазваниеРегиона - название региона( с сокращением) -// НазваниеРайона - название района( с сокращением) -// НазваниеГорода - название города( с сокращением) -// НазваниеНаселенногоПункта - название населенного пункта( с сокращением) -// НазваниеУлицы - название улицы( с сокращением) -// -// Возвращаемое значение: -// Неопределено или Структура - Структура полей по найденому адресному элементу (см. функцию "АдресныйКлассификаторКлиентСервер.ПустаяСтруктураАдреса()") -// -Функция ВернутьСтрокуАдресногоКлассификатораПоАдреснымЭлементам(Знач НазваниеРегиона, Знач НазваниеРайона, - Знач НазваниеГорода, Знач НазваниеНаселенногоПункта, Знач НазваниеУлицы) Экспорт - - СтруктураАдресногоКлассификатора = Неопределено; - - УправлениеКонтактнойИнформацией.ПриОпределенииСтрокиАдресногоКлассификатораПоАдреснымЭлементам(СтруктураАдресногоКлассификатора, НазваниеРегиона, НазваниеРайона, - НазваниеГорода, НазваниеНаселенногоПункта, НазваниеУлицы); - - Возврат СтруктураАдресногоКлассификатора; - -КонецФункции - diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo deleted file mode 100644 index f096a3499..000000000 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлассификаторы/УправлениеКонтактнойИнформациейКлассификаторы.mdo +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="2b3cab9a-fd05-42a8-811a-f443aee5e192"> - <name>УправлениеКонтактнойИнформациейКлассификаторы</name> - <synonym> - <key>ru</key> - <value>Управление контактной информацией классификаторы</value> - </synonym> - <server>true</server> - <externalConnection>true</externalConnection> - <clientOrdinaryApplication>true</clientOrdinaryApplication> - <serverCall>true</serverCall> -</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl index cf7997f28..a8216bb55 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиент/Module.bsl @@ -6,8 +6,15 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Событие ПриИзменении в колонке Представление таблицы контактной информации -Процедура ПредставлениеПриИзменении(Форма, Элемент, КИТабличнойЧасти = Ложь) Экспорт +// Обработчик события ПриИзменении поля формы контактной информации. +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// Элемент - ПолеФормы - Элемент формы, содержащий представление контактной информации +// ЭтоТабличнаяЧасть - Булево - Флаг того, что элемент является частью таблицы формы +// +Процедура ПредставлениеПриИзменении(Форма, Элемент, ЭтоТабличнаяЧасть = Ложь) Экспорт ЭтоТабличнаяЧасть = ЭтоТабличнаяЧасть(Элемент); @@ -22,7 +29,7 @@ // Если это очистка, то сбрасываем представление ДанныеСтроки = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть); - Если ДанныеСтроки=Неопределено Тогда + Если ДанныеСтроки = Неопределено Тогда Возврат; КонецЕсли; @@ -46,10 +53,18 @@ КонецПроцедуры -// Событие НачалоВыбора в колонке Представление таблицы контактной информации +// Обработчик события НачалоВыбора поля формы контактной информации. +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// Элемент - ПолеФормы - Элемент формы, содержащий представление контактной информации +// Модифицированность - Булево - Устанавливаемый флаг модифицированности формы +// СтандартнаяОбработка - Булево - Устанавливаемый флаг стандартной обработки события формы +// Функция ПредставлениеНачалоВыбора(Форма, Элемент, Модифицированность = Истина, СтандартнаяОбработка = Ложь) Экспорт - СтандартнаяОбработка = Ложь; + Результат = Новый Структура; Результат.Вставить("ИмяРеквизита", Элемент.Имя); @@ -58,7 +73,7 @@ Если ЭтоТабличнаяЧасть Тогда ДанныеЗаполнения = Форма.Элементы[Форма.ТекущийЭлемент.Имя].ТекущиеДанные; Если ДанныеЗаполнения = Неопределено Тогда - Возврат Результат; + Возврат Неопределено; КонецЕсли; Иначе ДанныеЗаполнения = Форма; @@ -67,7 +82,7 @@ ДанныеСтроки = ПолучитьСтрокуДополнительныхЗначений(Форма, Элемент, ЭтоТабличнаяЧасть); // Если представление было изменено в поле и не соответствует реквизиту, то приводим в соответствие - Если ДанныеЗаполнения[Элемент.Имя]<>Элемент.ТекстРедактирования Тогда + Если ДанныеЗаполнения[Элемент.Имя] <> Элемент.ТекстРедактирования Тогда ДанныеЗаполнения[Элемент.Имя] = Элемент.ТекстРедактирования; ПредставлениеПриИзменении(Форма, Элемент, ЭтоТабличнаяЧасть); Форма.Модифицированность = Истина; @@ -82,155 +97,160 @@ ПараметрыОткрытия.Вставить("Комментарий", ДанныеСтроки.Комментарий); КонецЕсли; - РезультатОткрытияФормы = ОткрытьФормуКонтактнойИнформацииМодально(ПараметрыОткрытия); - Если ТипЗнч(РезультатОткрытияФормы)<>Тип("Структура") Тогда - Возврат Результат; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПредставлениеНачалоВыбораЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ДанныеЗаполнения", ДанныеЗаполнения); + Оповещение.ДополнительныеПараметры.Вставить("ЭтоТабличнаяЧасть", ЭтоТабличнаяЧасть); + Оповещение.ДополнительныеПараметры.Вставить("ДанныеСтроки", ДанныеСтроки); + Оповещение.ДополнительныеПараметры.Вставить("Элемент", Элемент); + Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); + Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); - ТекстПредставления = РезультатОткрытияФормы.Представление; + ОткрытьФормуКонтактнойИнформации(ПараметрыОткрытия, , , , Оповещение); - Если ЭтоТабличнаяЧасть Тогда - ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = РезультатОткрытияФормы.КонтактнаяИнформация; - - Иначе - Если ПустаяСтрока(ДанныеСтроки.Комментарий) И Не ПустаяСтрока(РезультатОткрытияФормы.Комментарий) Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Истина); - - ИначеЕсли Не ПустаяСтрока(ДанныеСтроки.Комментарий) И ПустаяСтрока(РезультатОткрытияФормы.Комментарий) Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); - - Иначе - Если Не ПустаяСтрока(ДанныеСтроки.Комментарий) Тогда - Форма.Элементы["Комментарий" + Элемент.Имя].Заголовок = РезультатОткрытияФормы.Комментарий; - КонецЕсли; - - КонецЕсли; - - ДанныеСтроки.Представление = ТекстПредставления; - ДанныеСтроки.ЗначенияПолей = РезультатОткрытияФормы.КонтактнаяИнформация; - ДанныеСтроки.Комментарий = РезультатОткрытияФормы.Комментарий; - КонецЕсли; - - ДанныеЗаполнения[Элемент.Имя] = ТекстПредставления; - - Форма.Модифицированность = Истина; - - Возврат Результат; + Возврат Неопределено; КонецФункции -// Событие Очистка в колонке Представление таблицы контактной информации -Функция ПредставлениеОчистка(Форма, ИмяРеквизита) Экспорт +// Обработчик события Очистка поля формы контактной информации. +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// ИмяРеквизита - Строка - Имя реквизита формы, связанного с представление контактной информации +// +Функция ПредставлениеОчистка(Знач Форма, Знач ИмяРеквизита) Экспорт Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); НайденнаяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; НайденнаяСтрока.ЗначенияПолей = ""; НайденнаяСтрока.Представление = ""; - - Если ЗначениеЗаполнено(НайденнаяСтрока.Комментарий) Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); - КонецЕсли; - НайденнаяСтрока.Комментарий = ""; + НайденнаяСтрока.Комментарий = ""; Форма[ИмяРеквизита] = ""; Форма.Модифицированность = Истина; - Возврат Результат; - + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат); + Возврат Неопределено; КонецФункции -// Событие ОбработкаВыбора в поле ввода страны мира +// Обработчик команды, связанной с контактной информации (написать письмо, открыть адрес, и т.п.) +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// ИмяКоманды - Строка - Имя автоматически сгенерированной команды действия +// +Функция ПодключаемаяКоманда(Знач Форма, Знач ИмяКоманды) Экспорт + + Если ИмяКоманды = "КонтактнаяИнформацияДобавитьПолеВвода" Тогда + Оповещение = Новый ОписаниеОповещения("КонтактнаяИнформацияДобавитьПолеВводаЗавершение", ЭтотОбъект, Новый Структура); + + Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); + Форма.ПоказатьВыборИзМеню(Оповещение, Форма.СписокДобавляемыхЭлементовКонтактнойИнформации, Форма.Элементы.КонтактнаяИнформацияДобавитьПолеВвода); + Возврат Неопределено; + + ИначеЕсли Лев(ИмяКоманды, 7) = "Команда" Тогда + ИмяРеквизита = СтрЗаменить(ИмяКоманды, "Команда", ""); + КомандаКонтекстногоМеню = Ложь; + + Иначе + ИмяРеквизита = СтрЗаменить(ИмяКоманды, "КонтекстноеМеню", ""); + КомандаКонтекстногоМеню = Истина; + + КонецЕсли; + + Результат = Новый Структура("ИмяРеквизита", ИмяРеквизита); + НайденнаяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; + ТипКонтактнойИнформации = НайденнаяСтрока.Тип; + + Если КомандаКонтекстногоМеню Тогда + ВвестиКомментарий(Форма, ИмяРеквизита, НайденнаяСтрока, Результат); + + ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда + ЗаполнитьАдрес(Форма, ИмяРеквизита, НайденнаяСтрока, Результат); + + ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда + АдресПочты = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; + СоздатьЭлектронноеПисьмо("", АдресПочты, ТипКонтактнойИнформации); + + ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда + АдресСсылки = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; + ПерейтиПоВебСсылке("", АдресСсылки, ТипКонтактнойИнформации); + + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +// Открытие формы адреса формы контактной информации. +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// Результат - Произвольный - Данные, переданные обработчиком команды +// +Процедура ОткрытьФормуВводаАдреса(Форма, Результат) Экспорт + + Если Результат <> Неопределено Тогда + + Если Результат.Свойство("ЭлементФормыАдреса") Тогда + ПредставлениеНачалоВыбора(Форма, Форма.Элементы[Результат.ЭлементФормыАдреса]); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +// Обработчик возможного обновления формы контактной информации +// Вызывается из подключаемых действий при внедрении подсистемы "Контактная информация" +// +// Параметры: +// Форма - УправляемаяФорма - Форма владельца контактной информации +// Результат - Произвольный - Данные, переданные обработчиком команды +// +Процедура КонтрольОбновленияФормы(Форма, Результат) Экспорт + + // Анализ на обратный вызов формы ввода адреса + ОткрытьФормуВводаАдреса(Форма, Результат); + +КонецПроцедуры + +// Обработчик события ОбработкаВыбора страны мира. +// Реализует функционал автоматического заведения элемента справочника СтраныМира после выбора. +// +// Параметры: +// Элемент - ПолеФормы - Элемент, содержащий редактируемую страну мира +// ВыбранноеЗначение - Произвольный - Значение выбора +// СтандартнаяОбработка - Булево - Устанавливаемый флаг стандартной обработки события формы +// Процедура СтранаМираОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Экспорт Если Не СтандартнаяОбработка Тогда Возврат; КонецЕсли; ТипВыбранного = ТипЗнч(ВыбранноеЗначение); - Если ТипВыбранного=Тип("Массив") Тогда + Если ТипВыбранного = Тип("Массив") Тогда СписокПреобразования = Новый Соответствие; - Для Индекс=0 По ВыбранноеЗначение.ВГраница() Цикл + Для Индекс = 0 По ВыбранноеЗначение.ВГраница() Цикл Данные = ВыбранноеЗначение[Индекс]; - Если ТипЗнч(Данные)=Тип("Структура") И Данные.Свойство("Код") Тогда + Если ТипЗнч(Данные) = Тип("Структура") И Данные.Свойство("Код") Тогда СписокПреобразования.Вставить(Индекс, Данные.Код); КонецЕсли; КонецЦикла; - Если СписокПреобразования.Количество()>0 Тогда + Если СписокПреобразования.Количество() > 0 Тогда КонтактнаяИнформацияСлужебныйВызовСервера.КоллекцияСтранМираПоДаннымКлассификатора(СписокПреобразования); Для Каждого КлючЗначение Из СписокПреобразования Цикл ВыбранноеЗначение[КлючЗначение.Ключ] = КлючЗначение.Значение; КонецЦикла; КонецЕсли; - ИначеЕсли ТипВыбранного=Тип("Структура") И ВыбранноеЗначение.Свойство("Код") Тогда + ИначеЕсли ТипВыбранного = Тип("Структура") И ВыбранноеЗначение.Свойство("Код") Тогда ВыбранноеЗначение = КонтактнаяИнформацияСлужебныйВызовСервера.СтранаМираПоДаннымКлассификатора(ВыбранноеЗначение.Код); КонецЕсли; КонецПроцедуры -// Обработчик дополнительной команды (копирование, активация и.т.п) контактной информации -Функция ПодключаемаяКоманда(Форма, Знач ИмяКоманды) Экспорт - - Результат = Новый Структура; - - Если ИмяКоманды = "КонтактнаяИнформацияДобавитьПолеВвода" Тогда - - ВыбраннаяСтрока = Форма.ВыбратьИзМеню(Форма.СписокДобавляемыхЭлементовКонтактнойИнформации, Форма.Элементы.КонтактнаяИнформацияДобавитьПолеВвода); - - Если ВыбраннаяСтрока <> Неопределено Тогда - Результат.Вставить("ДобавляемыйВид", ВыбраннаяСтрока.Значение); - Форма.Модифицированность = Истина; - КонецЕсли; - - Возврат Результат; - - ИначеЕсли Лев(ИмяКоманды, 7) = "Команда" Тогда - ИмяРеквизита = СтрЗаменить(ИмяКоманды, "Команда", ""); - КомандаКонтекстногоМеню = Ложь; - Иначе - ИмяРеквизита = СтрЗаменить(ИмяКоманды, "КонтекстноеМеню", ""); - КомандаКонтекстногоМеню = Истина; - КонецЕсли; - - Результат.Вставить("ИмяРеквизита", ИмяРеквизита); - НайденнаяСтрока = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Результат)[0]; - ТипКонтактнойИнформации = НайденнаяСтрока.Тип; - - Если КомандаКонтекстногоМеню Тогда - - ВвестиКомментарий(Форма, ИмяРеквизита, НайденнаяСтрока, Результат); - - Иначе - - Если ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.Адрес") Тогда - - ЗаполнитьАдрес(Форма, ИмяРеквизита, НайденнаяСтрока, Результат); - - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда - - НаписатьПисьмо(Форма, ИмяРеквизита); - - ИначеЕсли ТипКонтактнойИнформации = ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда - - ПерейтиПоСсылке(Форма, ИмяРеквизита); - - КонецЕсли; - - КонецЕсли; - - Возврат Результат; - -КонецФункции - -// Обработчик открытия формы адреса -Процедура ОткрытьФормуВводаАдреса(Форма, Результат) Экспорт - - Если Результат.Свойство("ЭлементФормыАдреса") Тогда - ПредставлениеНачалоВыбора(Форма, Форма.Элементы[Результат.ЭлементФормыАдреса]); - КонецЕсли; - -КонецПроцедуры - // Конструктор для структуры параметров открытия формы контактной информации // // Параметры: @@ -238,7 +258,7 @@ // Значение - строка с сериализованным значением полей контактной информации // Представление - необязательное представление // -Функция ПараметрыФормыКонтактнойИнформации(ВидКонтактнойИнформации, Значение, Представление=Неопределено, Комментарий=Неопределено) Экспорт +Функция ПараметрыФормыКонтактнойИнформации(ВидКонтактнойИнформации, Значение, Представление = Неопределено, Комментарий = Неопределено) Экспорт Возврат Новый Структура("ВидКонтактнойИнформации, ЗначенияПолей, Представление, Комментарий", ВидКонтактнойИнформации, Значение, Представление, Комментарий); КонецФункции @@ -250,28 +270,28 @@ // Владелец - параметр для открываемой формы // Уникальность - параметр для открываемой формы // Окно - параметр для открываемой формы +// Оповещение - ОписаниеОповещения - для обработки закрытия формы // // Возвращаемое значение: необходимая форма // -Функция ОткрытьФормуКонтактнойИнформации(Параметры, Владелец=Неопределено, Уникальность=Неопределено, Окно=Неопределено) Экспорт - Возврат ОткрытьФормуКонтактнойИнформацииВнутр(Параметры, Владелец, Уникальность, Окно); +Функция ОткрытьФормуКонтактнойИнформации(Параметры, Владелец = Неопределено, Уникальность = Неопределено, Окно = Неопределено, Оповещение = Неопределено) Экспорт + ВидИнформации = Параметры.ВидКонтактнойИнформации; + + ИмяОткрываемойФормы = КонтактнаяИнформацияКлиентСерверПовтИсп.ИмяФормыВводаКонтактнойИнформации(ВидИнформации); + Если ИмяОткрываемойФормы = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Не обрабатываемый тип адреса: """ + ВидИнформации + """'"); + КонецЕсли; + + Если Не Параметры.Свойство("Заголовок") Тогда + Параметры.Вставить("Заголовок", Строка(КонтактнаяИнформацияСлужебныйВызовСервера.ТипВидаКонтактнойИнформации(ВидИнформации))); + КонецЕсли; + + Параметры.Вставить("ОткрытаПоСценарию", Истина); + + Возврат ОткрытьФорму(ИмяОткрываемойФормы, Параметры, Владелец, Уникальность, Окно, , Оповещение); КонецФункции -// Модально открывает подходящую форму контактной информации для редактирования или просмотра -// -// Параметры: -// Параметры - результат функции ПараметрыФормыКонтактнойИнформации -// Владелец - параметр для открываемой формы -// Уникальность - параметр для открываемой формы -// Окно - параметр для открываемой формы -// -// Возвращаемое значение: необходимая форма -// -Функция ОткрытьФормуКонтактнойИнформацииМодально(Параметры, Владелец=Неопределено, Уникальность=Неопределено, Окно=Неопределено) Экспорт - Возврат ОткрытьФормуКонтактнойИнформацииВнутр(Параметры, Владелец, Уникальность, Окно, Истина); -КонецФункции - -// Производит действие для экземпляра контактной информации по его типу +// Создает письмо по контактной информации // // Параметры: // ЗначенияПолей - строка (XML или старый формат ключ-значение), структура, соответствие или список значений, @@ -282,26 +302,306 @@ // объект с полем "Тип". Используется для определения типа, если его невозможно вычислить // по полю ЗначенияПолей // -Процедура АктивироватьКонтактнуюИнформацию(Знач ЗначенияПолей, Знач Представление="", ОжидаемыйВид=Неопределено) Экспорт +Процедура СоздатьЭлектронноеПисьмо(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено) Экспорт КонтактнаяИнформация = КонтактнаяИнформацияСлужебныйВызовСервера.ПривестиКонтактнуюИнформациюXML( Новый Структура("ЗначенияПолей, Представление, ВидКонтактнойИнформации", ЗначенияПолей, Представление, ОжидаемыйВид)); ТипИнформации = КонтактнаяИнформация.ТипКонтактнойИнформации; - ВсеВиды = "Перечисление.ТипыКонтактнойИнформации."; - Если ТипИнформации=ПредопределенноеЗначение(ВсеВиды + "АдресЭлектроннойПочты") Тогда - СоздатьПисьмоПоКонтактнойИнформации(КонтактнаяИнформация.ДанныеXML); - - ИначеЕсли ТипИнформации=ПредопределенноеЗначение(ВсеВиды + "ВебСтраница") Тогда - ОткрытьСсылкуПоКонтактнойИнформации(КонтактнаяИнформация.ДанныеXML); - - Иначе - ВызватьИсключение СтрЗаменить(НСтр("ru='Нельзя активировать контактную информацию с типом ""%1""'"), + Если ТипИнформации <> ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты") Тогда + ВызватьИсключение СтрЗаменить(НСтр("ru = 'Нельзя создать письмо по контактной информацию с типом ""%1""'"), "%1", ТипИнформации); + КонецЕсли; + + XMLДанные = КонтактнаяИнформация.ДанныеXML; + + АдресПочты = КонтактнаяИнформацияСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); + Если ТипЗнч(АдресПочты) <> Тип("Строка") Тогда + ВызватьИсключение НСтр("ru = 'Ошибка получения адреса электронной почты, неверный тип контактной информации'"); КонецЕсли; + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда + МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); + МодульРаботаСПочтовымиСообщениямиКлиент.ОткрытьФормуОтправкиПочтовогоСообщения(, АдресПочты); + Возврат; + КонецЕсли; + + // Нет подсистемы почты, запускаем системное + Оповещение = Новый ОписаниеОповещения("СоздатьПисьмоПоКонтактнойИнформацииЗавершение", ЭтотОбъект, АдресПочты); + ТекстПредложения = НСтр("ru = 'Для отправки письма необходимо установить расширение для работы с файлами.'"); + ОбщегоНазначенияКлиент.ПроверитьРасширениеРаботыСФайламиПодключено(Оповещение, ТекстПредложения); КонецПроцедуры +// Открывает ссылку по контактной информации +// +// Параметры: +// ЗначенияПолей - строка (XML или старый формат ключ-значение), структура, соответствие или список значений, +// описывающие контактную информацию. +// Представление - строка представления. Используется, если невозможно определить представление из параметра +// ЗначенияПолей (отсутствие поля "Представление") +// ОжидаемыйВид - ссылка на справочник ВидыКонтактнойИнформации или перечисление ТипыКонтактнойИнформации, +// объект с полем "Тип". Используется для определения типа, если его невозможно вычислить +// по полю ЗначенияПолей +// +Процедура ПерейтиПоВебСсылке(Знач ЗначенияПолей, Знач Представление = "", ОжидаемыйВид = Неопределено) Экспорт + + КонтактнаяИнформация = КонтактнаяИнформацияСлужебныйВызовСервера.ПривестиКонтактнуюИнформациюXML( + Новый Структура("ЗначенияПолей, Представление, ВидКонтактнойИнформации", ЗначенияПолей, Представление, ОжидаемыйВид)); + ТипИнформации = КонтактнаяИнформация.ТипКонтактнойИнформации; + + Если ТипИнформации <> ПредопределенноеЗначение("Перечисление.ТипыКонтактнойИнформации.ВебСтраница") Тогда + ВызватьИсключение СтрЗаменить(НСтр("ru = 'Нельзя открыть ссылку по контактной информации с типом ""%1""'"), + "%1", ТипИнформации); + КонецЕсли; + + XMLДанные = КонтактнаяИнформация.ДанныеXML; + + АдресСсылки = КонтактнаяИнформацияСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); + Если ТипЗнч(АдресСсылки) <> Тип("Строка") Тогда + ВызватьИсключение НСтр("ru = 'Ошибка получения ссылки, неверный тип контактной информации'"); + КонецЕсли; + + Если Найти(АдресСсылки, "://") > 0 Тогда + ПерейтиПоНавигационнойСсылке(АдресСсылки); + Иначе + ПерейтиПоНавигационнойСсылке("http://" + АдресСсылки); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Завершение немодальных диалогов +Процедура ПредставлениеНачалоВыбораЗавершение(Знач РезультатЗакрытия, Знач ДополнительныеПараметры) Экспорт + Если ТипЗнч(РезультатЗакрытия) <> Тип("Структура") Тогда + Возврат; + КонецЕсли; + + ДанныеЗаполнения = ДополнительныеПараметры.ДанныеЗаполнения; + ДанныеСтроки = ДополнительныеПараметры.ДанныеСтроки; + Результат = ДополнительныеПараметры.Результат; + Элемент = ДополнительныеПараметры.Элемент; + Форма = ДополнительныеПараметры.Форма; + + ТекстПредставления = СтрЗаменить(РезультатЗакрытия.Представление, Символы.ПС, " "); + + Если ДополнительныеПараметры.ЭтоТабличнаяЧасть Тогда + ДанныеЗаполнения[Элемент.Имя + "ЗначенияПолей"] = РезультатЗакрытия.КонтактнаяИнформация; + + Иначе + Если ПустаяСтрока(ДанныеСтроки.Комментарий) И Не ПустаяСтрока(РезультатЗакрытия.Комментарий) Тогда + Результат.Вставить("ЭтоДобавлениеКомментария", Истина); + + ИначеЕсли Не ПустаяСтрока(ДанныеСтроки.Комментарий) И ПустаяСтрока(РезультатЗакрытия.Комментарий) Тогда + Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); + + Иначе + Если Не ПустаяСтрока(ДанныеСтроки.Комментарий) Тогда + Форма.Элементы["Комментарий" + Элемент.Имя].Заголовок = РезультатЗакрытия.Комментарий; + КонецЕсли; + + КонецЕсли; + + ДанныеСтроки.Представление = ТекстПредставления; + ДанныеСтроки.ЗначенияПолей = РезультатЗакрытия.КонтактнаяИнформация; + ДанныеСтроки.Комментарий = РезультатЗакрытия.Комментарий; + КонецЕсли; + + ДанныеЗаполнения[Элемент.Имя] = ТекстПредставления; + + Форма.Модифицированность = Истина; + ОбновитьКонтактнуюИнформациюФормы(Форма, Результат); +КонецПроцедуры + +// Завершение немодальных диалогов +Процедура КонтактнаяИнформацияДобавитьПолеВводаЗавершение(Знач ВыбранныйЭлемент, Знач ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент = Неопределено Тогда + // Отказ от выбора + Возврат; + КонецЕсли; + + Результат = Новый Структура("ДобавляемыйВид", ВыбранныйЭлемент.Значение); + + ДополнительныеПараметры.Форма.Модифицированность = Истина; + ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, Результат); +КонецПроцедуры + +// Обработчик события НачалоВыбора для улицы +// +// Параметры: +// Элемент - вызывающий элемент формы +// КодКлассификатораНаселенногоПункта - ограничение по населенному пункту +// ТекущееЗначение - текущее значение - или код классификатора, или текст +// ПараметрыФормы - необязательная дополнительная структура параметров для формы подбора +// +Процедура НачалоВыбораУлицы(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, ПараметрыФормы = Неопределено) Экспорт + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант = "КЛАДР" Тогда + НачалоВыбораУлицыКЛАДР(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, ПараметрыФормы); + КонецЕсли; + + // Нет подсистемы классификатора +КонецПроцедуры + +// Обработчик события НачалоВыбора для элемента адреса (субъект РФ, район, город и т.п.) +// +// Параметры: +// Элемент - вызывающий элемент формы +// КодЧастиАдреса - идентификатор обрабатываемой части адреса, зависит от классификатора +// ЧастиАдреса - значения для других частей адреса, зависит от классификатора +// ПараметрыФормы - необязательная дополнительная структура параметров для формы подбора +// +Процедура НачалоВыбораЭлементаАдреса(Элемент, КодЧастиАдреса, ЧастиАдреса, ПараметрыФормы = Неопределено) Экспорт + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант = "КЛАДР" Тогда + НачалоВыбораЭлементаАдресаКЛАДР(Элемент, КодЧастиАдреса, ЧастиАдреса, ПараметрыФормы); + КонецЕсли; + + // Нет подсистемы классификатора +КонецПроцедуры + +// Возвращает полное наименование для населенного пункта. Под населенным пунктом понимается синтетическое +// поле, характеризующее все, что больше улицы +// +// Параметры: +// ЧастиАдреса - значения для частей адреса, зависит от классификатора +// +Функция НаименованиеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса) Экспорт + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант = "КЛАДР" Тогда + Возврат НаименованиеНаселенногоПунктаПоЧастямАдресаКЛАДР(ЧастиАдреса) + КонецЕсли; + + // Нет подсистемы классификатора + Возврат ""; +КонецФункции + +// Предлагает загрузить адресный классификатор +// +// Параметры: +// Текст - строка с дополнительным текстов предложения +// +Процедура ПредложениеЗагрузкиКлассификатора(Текст = "") Экспорт + +#Если ВебКлиент Тогда + Возврат; +#КонецЕсли + + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант <> "КЛАДР" Тогда + // Нет подсистемы классификатора + Возврат; + КонецЕсли; + + ТекстЗаголовка = НСтр("ru = 'Подтверждение'"); + ТекстВопроса = Текст + Символы.ПС + НСтр("ru = 'Загрузить классификатор сейчас?'"); + + Оповещение = Новый ОписаниеОповещения("ПредложениеЗагрузкиКлассификатораЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); +КонецПроцедуры + +Процедура ПредложениеЗагрузкиКлассификатораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ЗагрузитьАдресныйКлассификатор(); + КонецЕсли; +КонецПроцедуры + +// Загружает адресный классификатор +// +Процедура ЗагрузитьАдресныйКлассификатор() Экспорт +#Если ВебКлиент Тогда + Возврат; +#КонецЕсли + + Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + + Если Вариант = "КЛАДР" Тогда + МодульКЛАДР = КлиентскийМодульКЛАДР(); + МодульКЛАДР.ЗагрузитьАдресныйКлассификатор(); + КонецЕсли; + + // Нет подсистемы классификатора +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Завершение модального диалога создания письма +Процедура СоздатьПисьмоПоКонтактнойИнформацииЗавершение(Действие, АдресПочты) Экспорт + + ЗапуститьПриложение("mailto:" + АдресПочты); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Реализация КЛАДР +// + +Функция КлиентскийМодульКЛАДР() + + Возврат ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); + +КонецФункции + +Процедура НачалоВыбораУлицыКЛАДР(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, Параметры = Неопределено) + ПараметрыФормы = ?(Параметры = Неопределено, Новый Структура, Параметры); + + ПараметрыФормы.Вставить("Уровень", 5); + ПараметрыФормы.Вставить("Улица", Строка(ТекущееЗначение)); + + МодульКЛАДР = КлиентскийМодульКЛАДР(); + МодульКЛАДР.ОткрытьФормуВыбораКЛАДР(ПараметрыФормы, Элемент); +КонецПроцедуры + +Процедура НачалоВыбораЭлементаАдресаКЛАДР(Элемент, КодЧастиАдреса, ЧастиАдреса, Параметры = Неопределено) + + ПараметрыФормы = ?(Параметры = Неопределено, Новый Структура, Параметры); + + ПараметрыФормы.Вставить("Регион", ЧастиАдреса.Регион.Значение); + ПараметрыФормы.Вставить("Район", ЧастиАдреса.Район.Значение); + ПараметрыФормы.Вставить("Город", ЧастиАдреса.Город.Значение); + ПараметрыФормы.Вставить("НаселенныйПункт", ЧастиАдреса.НаселенныйПункт.Значение); + + КодРеквизита = ВРег(КодЧастиАдреса); + Если КодРеквизита = "РЕГИОН" Тогда + Уровень = 1; + ИначеЕсли КодРеквизита = "РАЙОН" Тогда + Уровень = 2; + ИначеЕсли КодРеквизита = "ГОРОД" Тогда + Уровень = 3; + ИначеЕсли КодРеквизита = "НАСЕЛЕННЫЙПУНКТ" Тогда + Уровень = 4; + ИначеЕсли КодРеквизита = "УЛИЦА" Тогда + Уровень = 5; + Иначе + Возврат; + КонецЕсли; + ПараметрыФормы.Вставить("Уровень", Уровень); + + МодульКЛАДР = КлиентскийМодульКЛАДР(); + МодульКЛАДР.ОткрытьФормуВыбораКЛАДР(ПараметрыФормы, Элемент); +КонецПроцедуры + +Функция НаименованиеНаселенногоПунктаПоЧастямАдресаКЛАДР(ЧастиАдреса) + Возврат КонтактнаяИнформацияКлиентСервер.ПолноеНаименование( + ЗначениеИлиНаименование(ЧастиАдреса.НаселенныйПункт), "", + ЗначениеИлиНаименование(ЧастиАдреса.Город), "", + ЗначениеИлиНаименование(ЧастиАдреса.Район), "", + ЗначениеИлиНаименование(ЧастиАдреса.Регион), "", ); +КонецФункции + +//////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ЗначениеИлиНаименование(ЧастьАдреса) + Если ПустаяСтрока(ЧастьАдреса.Значение) Тогда + Возврат СокрЛП("" + ЧастьАдреса.Наименование + " " + ЧастьАдреса.Сокращение); + КонецЕсли; + Возврат ЧастьАдреса.Значение; +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -352,128 +652,101 @@ КонецФункции -Процедура НаписатьПисьмо(Форма, ИмяРеквизита) +// Заполнение адреса другим адресом +Процедура ЗаполнитьАдрес(Знач Форма, Знач ИмяРеквизита, Знач НайденнаяСтрока, Знач Результат) - АдресПочты = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; - - МодульПочты = МодульКлиентаПочты(); - Если МодульПочты=Неопределено Тогда - // Нет подсистемы почты - ЗапуститьПриложение("mailto:" + АдресПочты); - Иначе - // Используем встроенную - МодульПочты.ОткрытьФормуОтправкиПочтовогоСообщения(, АдресПочты); - КонецЕсли; - -КонецПроцедуры - -Процедура ПерейтиПоСсылке(Форма, ИмяРеквизита) - - АдресСсылки = Форма.Элементы[ИмяРеквизита].ТекстРедактирования; - - Попытка - ПерейтиПоНавигационнойСсылке(АдресСсылки); - Исключение - Попытка - АдресСсылкиHttp = "http://" + АдресСсылки; - ПерейтиПоНавигационнойСсылке(АдресСсылкиHttp); - Исключение - ПерейтиПоНавигационнойСсылке(АдресСсылки); - КонецПопытки; - КонецПопытки; - -КонецПроцедуры - -Процедура ЗаполнитьАдрес(Форма, ИмяРеквизита, НайденнаяСтрока, Результат) - - Отбор = Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", НайденнаяСтрока.Тип, Ложь); - НайденныеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов.НайтиСтроки(Отбор); - - НайденныеСтроки.Удалить(НайденныеСтроки.Найти(НайденнаяСтрока)); - - АдресаДляЗаполнения = Новый СписокЗначений; + // Все строки - адреса, + ВсеСтроки = Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + НайденныеСтроки = ВсеСтроки.НайтиСтроки( Новый Структура("Тип, ЭтоРеквизитТабличнойЧасти", НайденнаяСтрока.Тип, Ложь) ); + НайденныеСтроки.Удалить( НайденныеСтроки.Найти(НайденнаяСтрока) ); + ЗначенияПолейДляАнализа = Новый Массив; Для Каждого Адрес Из НайденныеСтроки Цикл - - Если ПустаяСтрока(Адрес.Представление) Тогда - Продолжить; - КонецЕсли; - - АдресаДляЗаполнения.Добавить(Адрес, Строка(Адрес.Вид) + ": " + Адрес.Представление); - + ЗначенияПолейДляАнализа.Добавить(Новый Структура("Идентификатор, Представление, ЗначениеПолей, ВидАдреса", + Адрес.ПолучитьИдентификатор(), Адрес.Представление, Адрес.ЗначенияПолей, Адрес.Вид)); КонецЦикла; - КоличествоАдресов = АдресаДляЗаполнения.Количество(); - - Если КоличествоАдресов = 1 Тогда - - ВыбранныйАдрес = АдресаДляЗаполнения[0]; - - ИначеЕсли КоличествоАдресов > 1 Тогда - - ВыбранныйАдрес = Форма.ВыбратьИзМеню(АдресаДляЗаполнения, Форма.Элементы["Команда" + ИмяРеквизита]); - - Иначе - - ВыбранныйАдрес = Неопределено; + АдресаДляЗаполнения = КонтактнаяИнформацияСлужебныйВызовСервера.ДоступныеДляКопированияАдреса(ЗначенияПолейДляАнализа, НайденнаяСтрока.Вид); + Если АдресаДляЗаполнения.Количество() = 0 Тогда + Возврат; КонецЕсли; - Если ВыбранныйАдрес <> Неопределено Тогда - - СтрокаДляКопирования = ВыбранныйАдрес.Значение; - - Если ПустаяСтрока(НайденнаяСтрока.Комментарий) И Не ПустаяСтрока(СтрокаДляКопирования.Комментарий) Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Истина); - ИначеЕсли Не ПустаяСтрока(НайденнаяСтрока.Комментарий) И ПустаяСтрока(СтрокаДляКопирования.Комментарий) Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); - КонецЕсли; - - НайденнаяСтрока.ЗначенияПолей = СтрокаДляКопирования.ЗначенияПолей; - НайденнаяСтрока.Представление = СтрокаДляКопирования.Представление; - НайденнаяСтрока.Комментарий = СтрокаДляКопирования.Комментарий; - - Форма[ИмяРеквизита] = СтрокаДляКопирования.Представление; - - Форма.Модифицированность = Истина; - - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ЗаполнитьАдресЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); + Оповещение.ДополнительныеПараметры.Вставить("НайденнаяСтрока", НайденнаяСтрока); + Оповещение.ДополнительныеПараметры.Вставить("ИмяРеквизита", ИмяРеквизита); + Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); + Форма.ПоказатьВыборИзМеню(Оповещение, АдресаДляЗаполнения, Форма.Элементы["Команда" + ИмяРеквизита]); КонецПроцедуры -Процедура ВвестиКомментарий(Форма, ИмяРеквизита, НайденнаяСтрока, Результат) - - ИмяКомментарияРеквизита = НСтр("ru='Комментарий'") + ИмяРеквизита; +Процедура ЗаполнитьАдресЗавершение(Знач ВыбранныйЭлемент, Знач ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент = Неопределено Тогда + Возврат; + КонецЕсли; + ВсеСтроки = ДополнительныеПараметры.Форма.КонтактнаяИнформацияОписаниеДополнительныхРеквизитов; + СтрокаИсточник = ВсеСтроки.НайтиПоИдентификатору(ВыбранныйЭлемент.Значение); + Если СтрокаИсточник = Неопределено Тогда + Возврат; + КонецЕсли; + + ДополнительныеПараметры.НайденнаяСтрока.ЗначенияПолей = СтрокаИсточник.ЗначенияПолей; + ДополнительныеПараметры.НайденнаяСтрока.Представление = СтрокаИсточник.Представление; + ДополнительныеПараметры.НайденнаяСтрока.Комментарий = СтрокаИсточник.Комментарий; + + ДополнительныеПараметры.Форма[ДополнительныеПараметры.ИмяРеквизита] = СтрокаИсточник.Представление; + + ДополнительныеПараметры.Форма.Модифицированность = Истина; + ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Результат); + +КонецПроцедуры + +// Ввод комментария из контекстного меню +Процедура ВвестиКомментарий(Знач Форма, Знач ИмяРеквизита, Знач НайденнаяСтрока, Знач Результат) Комментарий = НайденнаяСтрока.Комментарий; - КомментарийБылПустой = ПустаяСтрока(Комментарий); + Оповещение = Новый ОписаниеОповещения("ВвестиКомментарийЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("Форма", Форма); + Оповещение.ДополнительныеПараметры.Вставить("ИмяРеквизитаКомментария", "Комментарий" + ИмяРеквизита); + Оповещение.ДополнительныеПараметры.Вставить("НайденнаяСтрока", НайденнаяСтрока); + Оповещение.ДополнительныеПараметры.Вставить("ПредыдущийКомментарий", Комментарий); + Оповещение.ДополнительныеПараметры.Вставить("Результат", Результат); - КомментарийИзменился = Ложь; - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Комментарий, Комментарий, КомментарийИзменился); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияМногострочногоТекста(Оповещение, Комментарий, + НСтр("ru = 'Комментарий'")); +КонецПроцедуры + +Процедура ВвестиКомментарийЗавершение(Знач Комментарий, Знач ДополнительныеПараметры) Экспорт + Если Комментарий = Неопределено Или Комментарий = ДополнительныеПараметры.ПредыдущийКомментарий Тогда + // Отказ от ввода или нет изменений + Возврат; + КонецЕсли; + КомментарийБылПустой = ПустаяСтрока(ДополнительныеПараметры.ПредыдущийКомментарий); КомментарийСталПустой = ПустаяСтрока(Комментарий); - ТребуетсяПерерисовка = Ложь; + ДополнительныеПараметры.НайденнаяСтрока.Комментарий = Комментарий; - Если КомментарийИзменился Тогда - - Форма.Модифицированность = Истина; - НайденнаяСтрока.Комментарий = Комментарий; - - Если КомментарийБылПустой И Не КомментарийСталПустой Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Истина); - ИначеЕсли Не КомментарийБылПустой И КомментарийСталПустой Тогда - Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); - Иначе - - КомментарийЭлемента = Форма.Элементы[ИмяКомментарияРеквизита]; - КомментарийЭлемента.Заголовок = Комментарий; - - КонецЕсли; - + Если КомментарийБылПустой И Не КомментарийСталПустой Тогда + ДополнительныеПараметры.Результат.Вставить("ЭтоДобавлениеКомментария", Истина); + ИначеЕсли Не КомментарийБылПустой И КомментарийСталПустой Тогда + ДополнительныеПараметры.Результат.Вставить("ЭтоДобавлениеКомментария", Ложь); + Иначе + Элемент = ДополнительныеПараметры.Форма.Элементы[ДополнительныеПараметры.ИмяРеквизитаКомментария]; + Элемент.Заголовок = Комментарий; КонецЕсли; + ДополнительныеПараметры.Форма.Модифицированность = Истина; + ОбновитьКонтактнуюИнформациюФормы(ДополнительныеПараметры.Форма, ДополнительныеПараметры.Результат) +КонецПроцедуры + +// Контекстный вызов +Процедура ОбновитьКонтактнуюИнформациюФормы(Форма, Результат) + + Форма.ОбновитьКонтактнуюИнформацию(Результат); + КонецПроцедуры Функция ЭтоТабличнаяЧасть(Элемент) @@ -501,280 +774,9 @@ // Процедура ПриЗагрузкеАдресногоКлассификатора() Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("АдресныйКлассификаторКлиент"); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда + МодульАдресныйКлассификаторКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("АдресныйКлассификаторКлиент"); МодульАдресныйКлассификаторКлиент.ЗагрузитьАдресныйКлассификатор(); КонецЕсли; КонецПроцедуры - -// Проверяет возможность изменения заблокированных реквизитов формы -// -Процедура ПриРазрешенииРедактированияРеквизитовОбъекта(Форма, РедактированиеРазрешено) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); - РедактированиеРазрешено = МодульЗапретРедактированияРеквизитовОбъектовКлиент.РазрешитьРедактированиеРеквизитовОбъекта(Форма); - КонецЕсли; - -КонецПроцедуры - -// Устанавливает доступность элементов формы -// -Процедура ПриУстановкеДоступностиЭлементовФормы(Форма) Экспорт - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда - МодульЗапретРедактированияРеквизитовОбъектовКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); - МодульЗапретРедактированияРеквизитовОбъектовКлиент.УстановитьДоступностьЭлементовФормы(Форма); - КонецЕсли; - -КонецПроцедуры - -// Проверяет использование подсистемы "Работа с почтовыми сообщениями", возвращает клиентский модуль для работы -// -Функция МодульКлиентаПочты() - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - Возврат ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - КонецЕсли; - Возврат Неопределено; -КонецФункции - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС - -// Обработчик события НачалоВыбора для улицы -// -// Параметры: -// Элемент - вызывающий элемент формы -// КодКлассификатораНаселенногоПункта - ограничение по населенному пункту -// ТекущееЗначение - текущее значение - или код классификатора, или текст -// ПараметрыФормы - необязательная дополнительная структура параметров для формы подбора -// -Процедура НачалоВыбораУлицы(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, ПараметрыФормы=Неопределено) Экспорт - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант=ПредопределенноеЗначение(ИмяПеречисленияКЛАДР) Тогда - НачалоВыбораУлицыКЛАДР(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, ПараметрыФормы); - КонецЕсли; - -КонецПроцедуры - -// Обработчик события НачалоВыбора для элемента адреса (субъект РФ, район, город и т.п.) -// -// Параметры: -// Элемент - вызывающий элемент формы -// КодЧастиАдреса - идентификатор обрабатываемой части адреса, зависит от классификатора -// ЧастиАдреса - значения для других частей адреса, зависит от классификатора -// ПараметрыФормы - необязательная дополнительная структура параметров для формы подбора -// -Процедура НачалоВыбораЭлементаАдреса(Элемент, КодЧастиАдреса, ЧастиАдреса, ПараметрыФормы=Неопределено) Экспорт - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант=ПредопределенноеЗначение(ИмяПеречисленияКЛАДР) Тогда - НачалоВыбораЭлементаАдресаКЛАДР(Элемент, КодЧастиАдреса, ЧастиАдреса, ПараметрыФормы); - КонецЕсли; - -КонецПроцедуры - -// Возвращает полное наименование для населенного пункта. Под населенным пунктом понимается синтетическое -// поле, характеризующее все, что больше улицы -// -// Параметры: -// ЧастиАдреса - значения для частей адреса, зависит от классификатора -// -Функция НаименованиеНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса) Экспорт - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат ""; - ИначеЕсли Вариант=ПредопределенноеЗначение(ИмяПеречисленияКЛАДР) Тогда - Возврат НаименованиеНаселенногоПунктаПоЧастямАдресаКЛАДР(ЧастиАдреса) - КонецЕсли; - - Возврат ""; -КонецФункции - -// Предлагает загрузить адресный классификатор -// -// Параметры: -// Текст - строка с дополнительным текстов предложения -// -Процедура ПредложениеЗагрузкиКлассификатора(Текст="") Экспорт - -#Если ВебКлиент Тогда - Возврат; -#КонецЕсли - - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант<>ПредопределенноеЗначение(ИмяПеречисленияКЛАДР) Тогда - Возврат; - КонецЕсли; - - ТекстЗаголовка = НСтр("ru='Подтверждение'"); - ТекстВопроса = Текст + Символы.ПС + НСтр("ru='Загрузить классификатор сейчас?'"); - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); - Если Ответ=КодВозвратаДиалога.Да Тогда - ЗагрузитьАдресныйКлассификатор(); - КонецЕсли; - -КонецПроцедуры - -// Загружает адресный классификатор -// -Процедура ЗагрузитьАдресныйКлассификатор() Экспорт -#Если ВебКлиент Тогда - Возврат; -#КонецЕсли - - Вариант = КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); - ИмяПеречисленияКЛАДР = "Перечисление.ВариантыАдресногоКлассификатора.КЛАДР"; - - Если Вариант=Неопределено Тогда - // Нет подсистемы классификатора - Возврат; - ИначеЕсли Вариант=ПредопределенноеЗначение(ИмяПеречисленияКЛАДР) Тогда - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор") Тогда - МодульКЛАДР = Вычислить("АдресныйКлассификаторКлиент"); - МодульКЛАДР.ЗагрузитьАдресныйКлассификатор(); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ОткрытьФормуКонтактнойИнформацииВнутр(Параметры, Владелец, Уникальность, Окно, Модально=Ложь) - - ВидИнформации = Параметры.ВидКонтактнойИнформации; - - ИмяОткрываемойФормы = КонтактнаяИнформацияКлиентСерверПовтИсп.ИмяФормыВводаКонтактнойИнформации(ВидИнформации); - Если ИмяОткрываемойФормы=Неопределено Тогда - ВызватьИсключение НСтр("ru='Не обрабатываемый тип адреса: """ + ВидИнформации + """'"); - КонецЕсли; - - Если Не Параметры.Свойство("Заголовок") Тогда - Параметры.Вставить("Заголовок", Строка(КонтактнаяИнформацияСлужебныйВызовСервера.ТипВидаКонтактнойИнформации(ВидИнформации))); - КонецЕсли; - - Параметры.Вставить("ОткрытаПоСценарию", Истина); - - Если Модально Тогда - Возврат ОткрытьФормуМодально(ИмяОткрываемойФормы, Параметры, Владелец); - КонецЕсли; - - Возврат ОткрытьФорму(ИмяОткрываемойФормы, Параметры, Владелец, Уникальность, Окно); -КонецФункции - -Процедура СоздатьПисьмоПоКонтактнойИнформации(Знач XMLДанные) - АдресПочты = КонтактнаяИнформацияСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); - Если ТипЗнч(АдресПочты)<>Тип("Строка") Тогда - ВызватьИсключение НСтр("ru='Ошибка получения адреса электронной почты, неверный тип контактной информации'"); - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда - // Используем встроенную почту - МодульПочты = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент"); - МодульПочты.ОткрытьФормуОтправкиПочтовогоСообщения(, АдресПочты); - Возврат; - КонецЕсли; - - // Нет подсистемы почты, запускаем системное -#Если ВебКлиент Тогда - ТекстПредложения = НСтр("ru='Для отправки почты из веб-клиента необходимо установить расширение для работы с файлами.'"); - Если Не ОбщегоНазначенияКлиент.РасширениеРаботыСФайламиПодключено(ТекстПредложения) Тогда - Возврат; - КонецЕсли; -#КонецЕсли - - ЗапуститьПриложение("mailto:" + АдресПочты); -КонецПроцедуры - -Процедура ОткрытьСсылкуПоКонтактнойИнформации(Знач XMLДанные) - АдресСсылки = КонтактнаяИнформацияСлужебныйВызовСервера.СтрокаСоставаКонтактнойИнформации(XMLДанные); - Если ТипЗнч(АдресСсылки)<>Тип("Строка") Тогда - ВызватьИсключение НСтр("ru='Ошибка получения ссылки, неверный тип контактной информации'"); - КонецЕсли; - - Если Найти(АдресСсылки, "://")>0 Тогда - ПерейтиПоНавигационнойСсылке(АдресСсылки); - Иначе - ПерейтиПоНавигационнойСсылке("http://" + АдресСсылки); - КонецЕсли; -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Реализация КЛАДР -// - -Процедура НачалоВыбораУлицыКЛАДР(Элемент, КодКлассификатораНаселенногоПункта, ТекущееЗначение, Параметры=Неопределено) - ПараметрыФормы = ?(Параметры=Неопределено, Новый Структура, Параметры); - - ПараметрыФормы.Вставить("Уровень", 5); - ПараметрыФормы.Вставить("Улица", Строка(ТекущееЗначение)); - - ИмяФормыКЛАДР = "РегистрСведений.АдресныйКлассификатор.Форма.ФормаВыбора"; - ОткрытьФорму(ИмяФормыКЛАДР, ПараметрыФормы, Элемент); -КонецПроцедуры - -Процедура НачалоВыбораЭлементаАдресаКЛАДР(Элемент, КодЧастиАдреса, ЧастиАдреса, Параметры=Неопределено) - - ПараметрыФормы = ?(Параметры=Неопределено, Новый Структура, Параметры); - - ПараметрыФормы.Вставить("Регион", ЧастиАдреса.Регион.Значение); - ПараметрыФормы.Вставить("Район", ЧастиАдреса.Район.Значение); - ПараметрыФормы.Вставить("Город", ЧастиАдреса.Город.Значение); - ПараметрыФормы.Вставить("НаселенныйПункт", ЧастиАдреса.НаселенныйПункт.Значение); - - КодРеквизита = ВРег(КодЧастиАдреса); - Если КодРеквизита="РЕГИОН" Тогда - Уровень = 1; - ИначеЕсли КодРеквизита="РАЙОН" Тогда - Уровень = 2; - ИначеЕсли КодРеквизита="ГОРОД" Тогда - Уровень = 3; - ИначеЕсли КодРеквизита="НАСЕЛЕННЫЙПУНКТ" Тогда - Уровень = 4; - ИначеЕсли КодРеквизита="УЛИЦА" Тогда - Уровень = 5; - Иначе - Возврат; - КонецЕсли; - ПараметрыФормы.Вставить("Уровень", Уровень); - - ИмяФормыКЛАДР = "РегистрСведений.АдресныйКлассификатор.Форма.ФормаВыбора"; - ОткрытьФорму(ИмяФормыКЛАДР, ПараметрыФормы, Элемент); -КонецПроцедуры - -Функция НаименованиеНаселенногоПунктаПоЧастямАдресаКЛАДР(ЧастиАдреса) - Возврат КонтактнаяИнформацияКлиентСервер.ПолноеНаименование( - ЗначениеИлиНаименование(ЧастиАдреса.НаселенныйПункт), "", - ЗначениеИлиНаименование(ЧастиАдреса.Город), "", - ЗначениеИлиНаименование(ЧастиАдреса.Район), "", - ЗначениеИлиНаименование(ЧастиАдреса.Регион), "", ); -КонецФункции - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -Функция ЗначениеИлиНаименование(ЧастьАдреса) - Если ПустаяСтрока(ЧастьАдреса.Значение) Тогда - Возврат СокрЛП("" + ЧастьАдреса.Наименование + " " + ЧастьАдреса.Сокращение); - КонецЕсли; - Возврат ЧастьАдреса.Значение; -КонецФункции - diff --git a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl index 0c4d54442..9b1ad5ab0 100644 --- a/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/УправлениеКонтактнойИнформациейКлиентСервер/Module.bsl @@ -61,7 +61,7 @@ Функция СформироватьПредставлениеТелефона(КодСтраны, КодГорода, НомерТелефона, Добавочный, Комментарий) Экспорт Представление = СокрЛП(КодСтраны); - Если Не ПустаяСтрока(Представление) И Лев(Представление,1)<>"+" Тогда + Если Не ПустаяСтрока(Представление) И Лев(Представление,1) <> "+" Тогда Представление = "+" + Представление; КонецЕсли; @@ -241,7 +241,7 @@ // // Возвращаемое значение - строка, преобразованная из списка // -Функция ПреобразоватьСписокПолейВСтроку(СоответствиеПолей, БезПустыхПолей=Истина) Экспорт +Функция ПреобразоватьСписокПолейВСтроку(СоответствиеПолей, БезПустыхПолей = Истина) Экспорт СтруктураЗначенийПолей = Новый Структура; Для Каждого Элемент Из СоответствиеПолей Цикл @@ -276,15 +276,15 @@ КонецФункции -// Преобразует строку полей вида ключ=значение в структуру +// Преобразует строку полей вида ключ = значение в структуру // // Параметры: -// СтрокаПолей - строка полей с данными в виде ключ=значение +// СтрокаПолей - строка полей с данными в виде ключ = значение // ВидКонтактнойИнформации - необязательный вид КИ для определения состава незаполненных полей // // Возвращаемое значение: структура значений полей. // -Функция СтруктураЗначенийПолей(СтрокаПолей, ВидКонтактнойИнформации=Неопределено) Экспорт +Функция СтруктураЗначенийПолей(СтрокаПолей, ВидКонтактнойИнформации = Неопределено) Экспорт Если ВидКонтактнойИнформации = Неопределено Тогда Результат = Новый Структура; @@ -328,7 +328,7 @@ // // Возвращаемое значение - строка, преобразованная из структуры // -Функция СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей=Истина) Экспорт +Функция СтрокаПолей(СтруктураЗначенийПолей, БезПустыхПолей = Истина) Экспорт Результат = ""; Для Каждого ЗначениеПоля Из СтруктураЗначенийПолей Цикл @@ -341,4 +341,4 @@ КонецЦикла; Возврат Результат; -КонецФункции \ No newline at end of file +КонецФункции diff --git a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl index a2eae98cc..8d2100b81 100644 --- a/SSL/src/CommonModules/УправлениеПечатью/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатью/Module.bsl @@ -151,8 +151,8 @@ КонецЕсли; КонецЦикла; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриПолученииКомандПечати(КомандыПечати, ИмяФормы); КонецЕсли; КонецЕсли; @@ -168,6 +168,7 @@ ЧастиИмени = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИмяФормы, ".", Истина); КраткоеИмяФормы = ЧастиИмени[ЧастиИмени.Количество()-1]; + // фильтр по именам форм Для НомерСтроки = -КомандыПечати.Количество() + 1 По 0 Цикл КомандаПечати = КомандыПечати[-НомерСтроки]; СписокФорм = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(КомандаПечати.СписокФорм, ",", Истина); @@ -286,6 +287,10 @@ // параметр не указан, производится запись объекта в случае, если в форме // объекта установлен признак модифицированности. // +// ТребуетсяРасширениеРаботыСФайлами - Булево - (необязательный) Признак необходимости подключения расширения работы +// с файлами перед выполнением команды. Если параметр не указан, подключение +// расширения работы с файлами выполняться не будет. +// Функция СоздатьКоллекциюКомандПечати() Экспорт Результат = Новый ТаблицаЗначений; @@ -330,6 +335,9 @@ // по умолчанию выполняется запись модифицированного объекта перед выполнением команды. Результат.Колонки.Добавить("НеВыполнятьЗаписьВФорме", Новый ОписаниеТипов("Булево")); + // для использования макетов офисных документов в веб-клиенте + Результат.Колонки.Добавить("ТребуетсяРасширениеРаботыСФайлами", Новый ОписаниеТипов("Булево")); + Возврат Результат; КонецФункции @@ -348,7 +356,7 @@ // СтрокаТаблицы // Список // -Процедура ДобавитьОписаниеОбласти(НаборОбластей, знач ИмяОбласти, знач ТипОбласти) Экспорт +Процедура ДобавитьОписаниеОбласти(НаборОбластей, Знач ИмяОбласти, Знач ТипОбласти) Экспорт НоваяОбласть = Новый Структура; @@ -367,9 +375,9 @@ // ИменаМакетов - строка - имена макетов, по которым будут формироваться печатные формы // СоставДокументов - массив ссылок - ссылки на объекты информационной базы (должны быть одного типа) // -Функция ПолучитьМакетыИДанныеОбъектов(знач ИмяМенеджераПечати, - знач ИменаМакетов, - знач СоставДокументов) Экспорт +Функция ПолучитьМакетыИДанныеОбъектов(Знач ИмяМенеджераПечати, + Знач ИменаМакетов, + Знач СоставДокументов) Экспорт МассивИменМакетов = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрЗаменить(ИменаМакетов, " ", ""), ","); @@ -465,215 +473,6 @@ КонецФункции -//////////////////////////////////////////////////////////////////////////////// -// Печать QR кода - -// Возвращает двоичные данные для формирования 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Кода(Отказ); - Если Отказ Тогда - Возврат Неопределено; - КонецЕсли; - - Попытка - ДвоичныеДанныеКартинки = ГенераторQRКода.GenerateQRCode(QRСтрока, УровеньКоррекции, Размер); - Исключение - ЗаписьЖурналаРегистрации(НСтр("ru = 'Формирование QR-кода'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),УровеньЖурналаРегистрации.Ошибка,,, - ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); - КонецПопытки; - - Возврат ДвоичныеДанныеКартинки; - -КонецФункции - -// Формирует форматную строку согласно "Унифицированному формату электронных банковских сообщений" для ее отображения в виде QR-кода -// Параметры: -// ДанныеДокумента - Структура - содержит значения полей документа -// - Данные документа будут закодированы согласно стандарту -// "СТАНДАРТЫ ФИНАНСОВЫХ ОПЕРАЦИЙ Символы двумерного штрихового кода для осуществления платежей физических лиц" -// - ДанныеДокумента должны содержать информацию в полях, описанных ниже. -// -// - Обязательные поля структуры -// * ТекстПолучателя - Наименование получателя платежа - Макс. 160 символов; -// * НомерСчетаПолучателя - Номер счета получателя платежа - Макс. 20 символов; -// * НаименованиеБанкаПолучателя - Наименование банка получателя платежа - Макс. 45 символов; -// * БИКБанкаПолучателя - БИК - Макс. 9 символов; -// * СчетБанкаПолучателя - Номер кор./сч. банка получателя платежа - Макс. 20 символов; -// - Дополнительные поля структуры -// * СуммаЧислом - Сумма платежа, в рублях - Макс. 16 символов -// * НазначениеПлатежа - Наименование платежа (назначение) - Макс. 210 символов; -// * ИННПолучателя - ИНН получателя платежа - Макс. 12 символов; -// * ИННПлательщика - ИНН плательщика - Макс. 12 символов; -// * СтатусСоставителя - Статус составителя платежного документа - Макс. 2 символа; -// * КПППолучателя - КПП получателя платежа - Макс. 9 символов -// * КодБК - КБК - Макс. 20 символов; -// * КодОКТМО - Код КодОКТМО - Макс. 11 символов; -// * ПоказательОснования - Основание налогового платежа - Макс. 2 символа; -// * ПоказательПериода - Налоговый период - Макс. 10 символов; -// * ПоказательНомера - Номер документа - Макс. 15 символов; -// * ПоказательДаты - Дата документа - Макс. 10 символ -// * ПоказательТипа - Тип платежа - Макс. 2 символа -// - Прочие дополнительные поля -// * ФамилияПлательщика - Фамилия плательщика -// * ИмяПлательщика - Имя плательщика -// * ОтчествоПлательщика - Отчество плательщика -// * АдресПлательщика - Адрес плательщика -// * ЛицевойСчетБюджетногоПолучателя - Лицевой счет бюджетного получателя -// * ИндексПлатежногоДокумента - Индекс платежного документа -// * СНИЛС - № лицевого счета в системе персонифицированного учета в ПФР - СНИЛС -// * НомерДоговора - Номер договора -// * НомерЛицевогоСчетаПлательщика - Номер лицевого счета плательщика в организации (в системе учета ПУ) -// * НомерКвартиры - Номер квартиры -// * НомерТелефона - Номер телефона -// * ВидПлательщика - Вид ДУЛ плательщика -// * НомерПлательщик - Номер ДУЛ плательщика -// * ФИОРебенка - Ф.И.О. ребенка/учащегося -// * ДатаРождения - Дата рождения -// * СрокПлатежа - Срок платежа/дата выставления счета -// * ПериодОплаты - Период оплаты -// * ВидПлатежа - Вид платежа -// * КодУслуги - Код услуги/название прибора учета -// * НомерПрибораУчета - Номер прибора учета -// * ПоказаниеПрибораУчета - Показание прибора учета -// * НомерИзвещения - Номер извещения, начисления, счета -// * ДатаИзвещения - Дата извещения/начисления/счета/постановления (для ГИБДД) -// * НомерУчреждения - Номер учреждения (образовательного, медицинского) -// * НомерГруппы - Номер группы детсада/класса школы -// * ФИОПреподавателя - ФИО преподавателя, специалиста, оказывающего услугу -// * СуммаСтраховки - Сумма страховки/дополнительной услуги/Сумма пени (в копейках) -// * НомерПостановления - Номер постановления (для ГИБДД) -// * НомерИсполнительногоПроизводства - Номер исполнительного производства -// * КодВидаПлатежа - Код вида платежа (например, для платежей в адрес Росреестра) -// * ИдентификаторНачисления - Уникальный идентификатор начисления -// * ТехническийКод - Технический код, рекомендуемый для заполнения поставщиком услуг. -// Может использоваться принимающей организацией для вызова соответствующей обрабатывающей ИТ-системы. -// Перечень значений кода представлен ниже. -// -// Код назначения Наименование назначения платежа -// платежа -// -// 01 Мобильная связь, стационарный телефон -// 02 Коммунальные услуги, ЖКХ -// 03 ГИБДД, налоги, пошлины, бюджетные платежи -// 04 Охранные услуги -// 05 Услуги, оказываемые УФМС -// 06 ПФР -// 07 Погашение кредитов -// 08 Образовательные учреждения -// 09 Интернет и ТВ -// 10 Электронные деньги -// 11 Отдых и путешествия -// 12 Инвестиции и страхование -// 13 Спорт и здоровье -// 14 Благотворительные и общественные организации -// 15 Прочие услуги -// -// Возвращаемое значение: -// Строка - строка данных в формате УФЭБС -// -Функция ФорматнаяСтрокаУФЭБС(ДанныеДокумента) Экспорт - - ТекстОшибки = ""; - СтрокаОбязательныхРеквизитов = СтрокаОбязательныхРеквизитов(ДанныеДокумента, ТекстОшибки); - - Если ПустаяСтрока(СтрокаОбязательныхРеквизитов) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , , ,); - Возврат ""; - КонецЕсли; - - СтруктураПредставленийИРеквизитов = СтруктураПредставленийИРеквизитов(); - СтрокаДополнительныхРеквизитов = ""; - ДополнительныеРеквизиты = Новый Структура; - ДобавитьДополнительныеРеквизиты(ДополнительныеРеквизиты); - - Для Каждого Элемент Из ДополнительныеРеквизиты Цикл - - Если Не ДанныеДокумента.Свойство(Элемент.Ключ) Тогда - ДанныеДокумента.Вставить(Элемент.Ключ, ""); - Продолжить; - КонецЕсли; - - Если ЗначениеЗаполнено(ДанныеДокумента[Элемент.Ключ]) Тогда - Если Элемент.Ключ = "СуммаЧислом" Тогда - ЗначениеСтрокой = Формат(ДанныеДокумента.СуммаЧислом * 100, "ЧГ="); - Иначе - ЗначениеСтрокой = СтрЗаменить(СокрЛП(Строка(ДанныеДокумента[Элемент.Ключ])), "|", ""); - КонецЕсли; - СтрокаДополнительныхРеквизитов = СтрокаДополнительныхРеквизитов + СтруктураПредставленийИРеквизитов[Элемент.Ключ] - + "=" + ЗначениеСтрокой + "|"; - КонецЕсли; - КонецЦикла; - - Если Не ПустаяСтрока(СтрокаДополнительныхРеквизитов) Тогда - ДлинаСтроки = СтрДлина(СтрокаДополнительныхРеквизитов); - СтрокаДополнительныхРеквизитов = Сред(СтрокаДополнительныхРеквизитов, 1, ДлинаСтроки - 1); - КонецЕсли; - - ПрочиеДополнительныеРеквизиты = Новый Структура; - ДобавитьПрочиеДополнительныеРеквизиты(ПрочиеДополнительныеРеквизиты); - СтрокаПрочихДополнительныхРеквизитов = ""; - - Для Каждого Элемент Из ПрочиеДополнительныеРеквизиты Цикл - - Если Не ДанныеДокумента.Свойство(Элемент.Ключ) Тогда - ДанныеДокумента.Вставить(Элемент.Ключ, ""); - Продолжить; - КонецЕсли; - - Если ЗначениеЗаполнено(ДанныеДокумента[Элемент.Ключ]) Тогда - ЗначениеСтрокой = СтрЗаменить(СокрЛП(Строка(ДанныеДокумента[Элемент.Ключ])), "|", ""); - СтрокаПрочихДополнительныхРеквизитов = СтрокаПрочихДополнительныхРеквизитов - + СтруктураПредставленийИРеквизитов[Элемент.Ключ] + "=" + ЗначениеСтрокой - + "|"; - КонецЕсли; - КонецЦикла; - - Если Не ПустаяСтрока(СтрокаПрочихДополнительныхРеквизитов) Тогда - ДлинаСтроки = СтрДлина(СтрокаПрочихДополнительныхРеквизитов); - СтрокаПрочихДополнительныхРеквизитов = Сред(СтрокаПрочихДополнительныхРеквизитов, 1, ДлинаСтроки - 1); - КонецЕсли; - - ИтоговаяСтрока = СтрокаОбязательныхРеквизитов - + ?(ПустаяСтрока(СтрокаДополнительныхРеквизитов), "", "|" + СтрокаДополнительныхРеквизитов) - + ?(ПустаяСтрока(СтрокаПрочихДополнительныхРеквизитов), "", "|" + СтрокаПрочихДополнительныхРеквизитов); - - Возврат ИтоговаяСтрока; - -КонецФункции - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС @@ -799,10 +598,10 @@ ПрефиксВнешнихПечатныхФорм = "ВнешняяПечатнаяФорма."; ИсточникВнешнихПечатныхФорм = ИмяМенеджераПечати; - Если МассивОбъектов <> Неопределено И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(МассивОбъектов)) Тогда + Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(МассивОбъектов)) Тогда ИсточникВнешнихПечатныхФорм = МассивОбъектов.Метаданные().ПолноеИмя(); - ИначеЕсли ТипЗнч(МассивОбъектов) = Тип("Массив") Тогда - Если МассивОбъектов.Количество() > 0 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(МассивОбъектов[0])) Тогда + Иначе + Если МассивОбъектов.Количество() > 0 Тогда ИсточникВнешнихПечатныхФорм = МассивОбъектов[0].Метаданные().ПолноеИмя(); КонецЕсли; КонецЕсли; @@ -816,7 +615,7 @@ ИдентификаторыВнешнихПечатныхФорм = ВнешниеПечатныеФормы.ВыгрузитьЗначения(); Для Каждого Идентификатор Из ИдентификаторыВнешнихПечатныхФорм Цикл - Если ИменаМакетов.Найти(ПрефиксВнешнихПечатныхФорм + Идентификатор) = Неопределено Тогда + Если ИменаМакетов.Найти(Идентификатор) = Неопределено Тогда ИменаМакетов.Добавить(ПрефиксВнешнихПечатныхФорм + Идентификатор); ДобавленныеВнешниеПечатныеФормы.Добавить(ПрефиксВнешнихПечатныхФорм + Идентификатор); КонецЕсли; @@ -850,92 +649,47 @@ ИмяДополнительногоМенеджераПечати = Лев(Идентификатор, Позиция - 1); Идентификатор = Сред(Идентификатор, Позиция + 1); КонецЕсли; - - // определение внутреннего менеджера печати - ИспользуемыйМенеджерПечати = ИмяДополнительногоМенеджераПечати; - Если ПустаяСтрока(ИспользуемыйМенеджерПечати) Тогда - ИспользуемыйМенеджерПечати = ИмяМенеджераПечати; - КонецЕсли; - - // проверка соответствия печатаемых объектов выбранной печатной форме - ОжидаемыйТипОбъекта = Неопределено; - ОбъектыСоответствующиеПечатнойФорме = МассивОбъектов; - - СтандартнаяОбработка = Истина; - УправлениеПечатьюПереопределяемый.ПередПроверкойСоответствияПечатнойФормыОбъекту(СтандартнаяОбработка); - - Если СтандартнаяОбработка Тогда - МетаданныеМенеджера = Метаданные.НайтиПоПолномуИмени(ИспользуемыйМенеджерПечати); - Если МетаданныеМенеджера <> Неопределено - И (Метаданные.Документы.Содержит(МетаданныеМенеджера) - Или Метаданные.Справочники.Содержит(МетаданныеМенеджера) - Или Метаданные.БизнесПроцессы.Содержит(МетаданныеМенеджера) - Или Метаданные.Задачи.Содержит(МетаданныеМенеджера) - Или Метаданные.ПланыВидовРасчета.Содержит(МетаданныеМенеджера) - Или Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеМенеджера) - Или Метаданные.ПланыОбмена.Содержит(МетаданныеМенеджера)) Тогда - ОжидаемыйТипОбъекта = Тип(СтрЗаменить(ИспользуемыйМенеджерПечати, ".", "Ссылка.")); - КонецЕсли; - - Если ОжидаемыйТипОбъекта <> Неопределено Тогда - Если ТипЗнч(МассивОбъектов) = Тип("Массив") Тогда - ОбъектыСоответствующиеПечатнойФорме = Новый Массив; - Для Каждого Объект Из МассивОбъектов Цикл - Если ТипЗнч(Объект) <> ОжидаемыйТипОбъекта Тогда - СообщитьПечатнаяФормаНедоступна(Объект); - Иначе - ОбъектыСоответствующиеПечатнойФорме.Добавить(Объект); - КонецЕсли; - КонецЦикла; - Если ОбъектыСоответствующиеПечатнойФорме.Количество() = 0 Тогда - ОбъектыСоответствующиеПечатнойФорме = Неопределено; - КонецЕсли; - ИначеЕсли ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивОбъектов) Тогда - Если ТипЗнч(МассивОбъектов) <> ОжидаемыйТипОбъекта Тогда - СообщитьПечатнаяФормаНедоступна(МассивОбъектов); - ОбъектыСоответствующиеПечатнойФорме = Неопределено; - КонецЕсли; - КонецЕсли; - КонецЕсли; - КонецЕсли; ВременнаяКоллекцияДляОднойПечатнойФормы = ПодготовитьКоллекциюПечатныхФорм(Идентификатор); // вызов процедуры Печать из менеджера печати Если ВнешняяПечатнаяФорма <> Неопределено Тогда // менеджер печати во внешней печатной форме - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику( ВнешняяПечатнаяФорма(ВнешняяПечатнаяФорма.Значение, ИсточникВнешнихПечатныхФорм), - Новый Структура("ИдентификаторКоманды, ОбъектыНазначения", ВнешняяПечатнаяФорма.Значение, ОбъектыСоответствующиеПечатнойФорме), + Новый Структура("ИдентификаторКоманды, ОбъектыНазначения", ВнешняяПечатнаяФорма.Значение, МассивОбъектов), ВременнаяКоллекцияДляОднойПечатнойФормы, ОбъектыПечати, ПараметрыВывода); Иначе + // определение внутреннего менеджера печати + ИспользуемыйМенеджерПечати = ИмяДополнительногоМенеджераПечати; + Если ПустаяСтрока(ИспользуемыйМенеджерПечати) Тогда + ИспользуемыйМенеджерПечати = ИмяМенеджераПечати; + КонецЕсли; + Если Не ПустаяСтрока(ИспользуемыйМенеджерПечати) Тогда МенеджерПечати = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ИспользуемыйМенеджерПечати); - // печать внутренней печатной формы - Если ОбъектыСоответствующиеПечатнойФорме <> Неопределено Тогда - МенеджерПечати.Печать(ОбъектыСоответствующиеПечатнойФорме, ПараметрыПечати, ВременнаяКоллекцияДляОднойПечатнойФормы, ОбъектыПечати, ПараметрыВывода); - Иначе - ВременнаяКоллекцияДляОднойПечатнойФормы[0].ТабличныйДокумент = Новый ТабличныйДокумент; - КонецЕсли; + + // печать из внутреннего менеджера печати + МенеджерПечати.Печать(МассивОбъектов, ПараметрыПечати, ВременнаяКоллекцияДляОднойПечатнойФормы, ОбъектыПечати, ПараметрыВывода); КонецЕсли; КонецЕсли; // проверка корректности заполнения коллекции печатных форм, полученной из менеджера печати Для Каждого ОписаниеПечатнойФормы Из ВременнаяКоллекцияДляОднойПечатнойФормы Цикл - Если Не (ТипЗнч(ОписаниеПечатнойФормы.Экземпляров) = Тип("Число") И ОписаниеПечатнойФормы.Экземпляров > 0) Тогда - ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ОбщегоНазначенияКлиентСервер.Проверить( + ТипЗнч(ОписаниеПечатнойФормы.Экземпляров) = Тип("Число") И ОписаниеПечатнойФормы.Экземпляров > 0, + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не задано количество экземпляров для печатной формы ""%1"".'"), ?(ПустаяСтрока(ОписаниеПечатнойФормы.СинонимМакета), ОписаниеПечатнойФормы.ИмяМакета, ОписаниеПечатнойФормы.СинонимМакета) - ); - КонецЕсли; + )); КонецЦикла; - + // обновление коллекции Отказ = ВременнаяКоллекцияДляОднойПечатнойФормы.Количество() = 0; - // предполагается одна печатная форма, но для обратной совместимости принимается вся коллекция. + // предполагается одна печатная форма, но для обратной совместимости принимается вся коллекция Для Каждого ВременнаяПечатнаяФорма Из ВременнаяКоллекцияДляОднойПечатнойФормы Цикл Если ВременнаяПечатнаяФорма.ТабличныйДокумент <> Неопределено Тогда ПечатнаяФорма = КоллекцияПечатныхФорм.Добавить(); @@ -1291,203 +1045,6 @@ Запись.Записать(); КонецПроцедуры -Функция СтрокаОбязательныхРеквизитов(ДанныеДокумента, ТекстСообщения) - - ОбязательныеРеквизиты = Новый Структура(); - СтруктураПредставленийИРеквизитов = СтруктураПредставленийИРеквизитов(); - ДобавитьОбязательныеРеквизиты(ОбязательныеРеквизиты); - - Если Не ЗначениеЗаполнено(ДанныеДокумента.СчетБанкаПолучателя) Тогда - ДанныеДокумента.СчетБанкаПолучателя = "0"; - КонецЕсли; - - СлужебныеДанные = "ST00012"; - ОбязательныеДанные = ""; - - Для Каждого Элемент Из ОбязательныеРеквизиты Цикл - Если Не ЗначениеЗаполнено(ДанныеДокумента[Элемент.Ключ]) Тогда - ТекстСообщения = Нстр("ru = 'Не заполнен обязательный реквизит: %1'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, Элемент.Ключ); - Возврат ""; - КонецЕсли; - - ЗначениеСтрокой = СтрЗаменить(СокрЛП(Строка(ДанныеДокумента[Элемент.Ключ])), "|", ""); - - ОбязательныеДанные = ОбязательныеДанные + "|" + СтруктураПредставленийИРеквизитов[Элемент.Ключ] + "=" - + ЗначениеСтрокой; - - КонецЦикла; - - Если СтрДлина(ОбязательныеДанные) > 300 Тогда - Шаблон = НСтр("ru = 'Невозможно создать QR-код для документа %1 - |Строка обязательных реквизитов должна быть меньше 300 символов: - |""%2""'"); - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, - ДанныеДокумента.Ссылка, - ОбязательныеДанные); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения); - Возврат ""; - КонецЕсли; - - Возврат СлужебныеДанные + ОбязательныеДанные; - -КонецФункции - -Функция СтруктураПредставленийИРеквизитов() - - СтруктураВозврата = Новый Структура(); - - СтруктураВозврата.Вставить("ТекстПолучателя", "Name"); - СтруктураВозврата.Вставить("НомерСчетаПолучателя", "PersonalAcc"); - СтруктураВозврата.Вставить("НаименованиеБанкаПолучателя", "BankName"); - СтруктураВозврата.Вставить("БИКБанкаПолучателя", "BIC"); - СтруктураВозврата.Вставить("СчетБанкаПолучателя", "CorrespAcc"); - - СтруктураВозврата.Вставить("СуммаЧислом", "Sum"); - СтруктураВозврата.Вставить("НазначениеПлатежа", "Purpose"); - СтруктураВозврата.Вставить("ИННПолучателя", "PayeeINN"); - СтруктураВозврата.Вставить("ИННПлательщика", "PayerINN"); - СтруктураВозврата.Вставить("СтатусСоставителя", "DrawerStatus"); - СтруктураВозврата.Вставить("КПППолучателя", "KPP"); - СтруктураВозврата.Вставить("КодБК", "CBC"); - СтруктураВозврата.Вставить("КодОКТМО", "OKTMO"); - СтруктураВозврата.Вставить("ПоказательОснования", "PaytReason"); - СтруктураВозврата.Вставить("ПоказательПериода", "TaxPeriod"); - СтруктураВозврата.Вставить("ПоказательНомера", "DocNo"); - СтруктураВозврата.Вставить("ПоказательДаты", "DocDate"); - СтруктураВозврата.Вставить("ПоказательТипа", "TaxPaytKind"); - - СтруктураВозврата.Вставить("ФамилияПлательщика", "lastName"); - СтруктураВозврата.Вставить("ИмяПлательщика", "firstName"); - СтруктураВозврата.Вставить("ОтчествоПлательщика", "middleName"); - СтруктураВозврата.Вставить("АдресПлательщика", "payerAddress"); - СтруктураВозврата.Вставить("ЛицевойСчетБюджетногоПолучателя", "personalAccount"); - СтруктураВозврата.Вставить("ИндексПлатежногоДокумента", "docIdx"); - СтруктураВозврата.Вставить("СНИЛС", "pensAcc"); - СтруктураВозврата.Вставить("НомерДоговора", "contract"); - СтруктураВозврата.Вставить("НомерЛицевогоСчетаПлательщика", "persAcc"); - СтруктураВозврата.Вставить("НомерКвартиры", "flat"); - СтруктураВозврата.Вставить("НомерТелефона", "phone"); - СтруктураВозврата.Вставить("ВидПлательщика", "payerIdType"); - СтруктураВозврата.Вставить("НомерПлательщика", "payerIdNum"); - СтруктураВозврата.Вставить("ФИОРебенка", "childFio"); - СтруктураВозврата.Вставить("ДатаРождения", "birthDate"); - СтруктураВозврата.Вставить("СрокПлатежа", "paymTerm"); - СтруктураВозврата.Вставить("ПериодОплаты", "paymPeriod"); - СтруктураВозврата.Вставить("ВидПлатежа", "category"); - СтруктураВозврата.Вставить("КодУслуги", "serviceName"); - СтруктураВозврата.Вставить("НомерПрибораУчета", "counterId"); - СтруктураВозврата.Вставить("ПоказаниеПрибораУчета", "counterVal"); - СтруктураВозврата.Вставить("НомерИзвещения", "quittId"); - СтруктураВозврата.Вставить("ДатаИзвещения", "quittDate"); - СтруктураВозврата.Вставить("НомерУчреждения", "instNum"); - СтруктураВозврата.Вставить("НомерГруппы", "classNum"); - СтруктураВозврата.Вставить("ФИОПреподавателя", "specFio"); - СтруктураВозврата.Вставить("СуммаСтраховки", "addAmount"); - СтруктураВозврата.Вставить("НомерПостановления", "ruleId"); - СтруктураВозврата.Вставить("НомерИсполнительногоПроизводства", "execId"); - СтруктураВозврата.Вставить("КодВидаПлатежа", "regType"); - СтруктураВозврата.Вставить("ИдентификаторНачисления", "uin"); - СтруктураВозврата.Вставить("ТехническийКод", "TechCode"); - - Возврат СтруктураВозврата; - -КонецФункции - -Функция КомпонентаФормированияQRКода(Отказ) - - СистемнаяИнформация = Новый СистемнаяИнформация; - Платформа = СистемнаяИнформация.ТипПлатформы; - - ТекстОшибки = НСтр("ru = 'Не удалось подключить внешнюю компоненту для генерации QR-кода'"); - - Попытка - Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиQRКода", "QR") Тогда - QRCodeGenerator = Новый("AddIn.QR.QRCodeExtension"); - Иначе - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки, , , , Отказ); - КонецЕсли - Исключение - ПодробноеПредставлениеОшибки = ПодробноеПредставлениеОшибки(ОписаниеОшибки()); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки + Символы.ПС + ПодробноеПредставлениеОшибки, , , , Отказ); - КонецПопытки; - - Возврат QRCodeGenerator; - -КонецФункции - -Процедура ДобавитьОбязательныеРеквизиты(СтруктураДанных) - - СтруктураДанных.Вставить("ТекстПолучателя"); - СтруктураДанных.Вставить("НомерСчетаПолучателя"); - СтруктураДанных.Вставить("НаименованиеБанкаПолучателя"); - СтруктураДанных.Вставить("БИКБанкаПолучателя"); - СтруктураДанных.Вставить("СчетБанкаПолучателя"); - -КонецПроцедуры - -Процедура ДобавитьДополнительныеРеквизиты(СтруктураДанных) - - СтруктураДанных.Вставить("СуммаЧислом"); - СтруктураДанных.Вставить("НазначениеПлатежа"); - СтруктураДанных.Вставить("ИННПолучателя"); - СтруктураДанных.Вставить("ИННПлательщика"); - СтруктураДанных.Вставить("СтатусСоставителя"); - СтруктураДанных.Вставить("КПППолучателя"); - СтруктураДанных.Вставить("КодБК"); - СтруктураДанных.Вставить("КодОКТМО"); - СтруктураДанных.Вставить("ПоказательОснования"); - СтруктураДанных.Вставить("ПоказательПериода"); - СтруктураДанных.Вставить("ПоказательНомера"); - СтруктураДанных.Вставить("ПоказательДаты"); - СтруктураДанных.Вставить("ПоказательТипа"); - -КонецПроцедуры - -Процедура ДобавитьПрочиеДополнительныеРеквизиты(СтруктураДанных) - - СтруктураДанных.Вставить("ФамилияПлательщика"); - СтруктураДанных.Вставить("ИмяПлательщика"); - СтруктураДанных.Вставить("ОтчествоПлательщика"); - СтруктураДанных.Вставить("АдресПлательщика"); - СтруктураДанных.Вставить("ЛицевойСчетБюджетногоПолучателя"); - СтруктураДанных.Вставить("ИндексПлатежногоДокумента"); - СтруктураДанных.Вставить("СНИЛС"); - СтруктураДанных.Вставить("НомерДоговора"); - СтруктураДанных.Вставить("НомерЛицевогоСчетаПлательщика"); - СтруктураДанных.Вставить("НомерКвартиры"); - СтруктураДанных.Вставить("НомерТелефона"); - СтруктураДанных.Вставить("ВидПлательщика"); - СтруктураДанных.Вставить("НомерПлательщика"); - СтруктураДанных.Вставить("ФИОРебенка"); - СтруктураДанных.Вставить("ДатаРождения"); - СтруктураДанных.Вставить("СрокПлатежа"); - СтруктураДанных.Вставить("ПериодОплаты"); - СтруктураДанных.Вставить("ВидПлатежа"); - СтруктураДанных.Вставить("КодУслуги"); - СтруктураДанных.Вставить("НомерПрибораУчета"); - СтруктураДанных.Вставить("ПоказаниеПрибораУчета"); - СтруктураДанных.Вставить("НомерИзвещения"); - СтруктураДанных.Вставить("ДатаИзвещения"); - СтруктураДанных.Вставить("НомерУчреждения"); - СтруктураДанных.Вставить("НомерГруппы"); - СтруктураДанных.Вставить("ФИОПреподавателя"); - СтруктураДанных.Вставить("СуммаСтраховки"); - СтруктураДанных.Вставить("НомерПостановления"); - СтруктураДанных.Вставить("НомерИсполнительногоПроизводства"); - СтруктураДанных.Вставить("КодВидаПлатежа"); - СтруктураДанных.Вставить("ИдентификаторНачисления"); - СтруктураДанных.Вставить("ТехническийКод"); - -КонецПроцедуры - -Процедура СообщитьПечатнаяФормаНедоступна(Объект) - ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Печать %1 не выполнена: выбранная печатная форма недоступна.'"), - Объект); - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, Объект); -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // Обработчики условных вызовов в другие подсистемы @@ -1501,8 +1058,8 @@ // Процедура ПриПрисоединенииПечатнойФормыКОбъекту(СсылкаНаОбъект, ИмяФайла, АдресВоВременномХранилище) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); МодульПрисоединенныеФайлы.ДобавитьФайл(СсылкаНаОбъект, ИмяФайла, , , , АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'")); КонецЕсли; @@ -1517,8 +1074,8 @@ // Процедура ПриПроверкеВозможностиПрисоединенияФайловКОбъекту(СсылкаНаОбъект, МожноПрисоединять) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлы = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлы"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + МодульПрисоединенныеФайлы = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлы"); МожноПрисоединять = МодульПрисоединенныеФайлы.КОбъектуМожноПрисоединятьФайлы(СсылкаНаОбъект); КонецЕсли; @@ -1534,8 +1091,8 @@ // Процедура ПриПолученииСпискаВнешнихПечатныхФорм(ВнешниеПечатныеФормы, ПолноеИмяОбъектаМетаданных) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриПолученииСпискаВнешнихПечатныхФорм(ВнешниеПечатныеФормы, ПолноеИмяОбъектаМетаданных); КонецЕсли; @@ -1545,10 +1102,11 @@ // Процедура ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработки = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщегоНазначения.ОбщийМодуль("ДополнительныеОтчетыИОбработки"); МодульДополнительныеОтчетыИОбработки.ПриПолученииВнешнейПечатнойФормы(Идентификатор, ПолноеИмяОбъектаМетаданных, ВнешняяПечатнаяФормаСсылка); КонецЕсли; КонецПроцедуры + diff --git a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl index 4ad8a7fd2..ce2f2d59b 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюMSWordКлиент/Module.bsl @@ -30,13 +30,12 @@ // Функция ИнициализироватьПечатнуюФормуMSWord(Макет) Экспорт - Handler = Новый Структура("Тип", "DOC"); Попытка COMОбъект = Новый COMОбъект("Word.Application"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -47,8 +46,7 @@ Исключение COMОбъект.Quit(0); COMОбъект = 0; - Handler.COMОбъект = 0; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -73,6 +71,8 @@ КонецПопытки; КонецЦикла; КонецЕсли; + // запомнить вид просмотра документа + Handler.Вставить("ViewType", COMОбъект.Application.ActiveWindow.View.Type); Возврат Handler; @@ -87,13 +87,13 @@ // Возвращаемое значение: // структура - ссылка макет // -Функция ПолучитьМакетMSWord(знач ДвоичныеДанныеМакета, знач ИмяВременногоФайла = "") Экспорт +Функция ПолучитьМакетMSWord(Знач ДвоичныеДанныеМакета, Знач ИмяВременногоФайла = "") Экспорт Handler = Новый Структура("Тип", "DOC"); Попытка COMОбъект = Новый COMОбъект("Word.Application"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); КонецПопытки; @@ -108,9 +108,8 @@ Исключение COMОбъект.Quit(0); COMОбъект = 0; - Handler.COMОбъект = 0; УдалитьФайлы(ИмяВременногоФайла); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); ВызватьИсключение(НСтр("ru = 'Ошибка при открытии файла шаблона.'") + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -139,7 +138,7 @@ // Handler - ссылка на печатную форму или макет // ЗакрытьПриложение - булево - требуется ли закрыть приложение // -Процедура ЗакрытьСоединение(Handler, знач ЗакрытьПриложение) Экспорт +Процедура ЗакрытьСоединение(Handler, Знач ЗакрытьПриложение) Экспорт Если ЗакрытьПриложение Тогда Handler.COMСоединение.Quit(0); @@ -158,10 +157,14 @@ // Устанавливает свойство видимости у приложения MS Word // Handler - ссылка на печатную форму // -Процедура ПоказатьДокументMSWord(знач Handler) Экспорт +Процедура ПоказатьДокументMSWord(Знач Handler) Экспорт COMСоединение = Handler.COMСоединение; COMСоединение.Application.Selection.Collapse(); + + // восстановить вид просмотра документа + COMСоединение.Application.ActiveWindow.View.Type = Handler.ViewType; + COMСоединение.Application.Visible = Истина; COMСоединение.Activate(); @@ -187,10 +190,10 @@ // есть символ перевода строки, который не нужно включать в // получаемую область. // -Функция ПолучитьОбластьМакетаMSWord(знач Handler, - знач ИмяОбласти, - знач СмещениеНачало = 1, - знач СмещениеОкончание = -1) Экспорт +Функция ПолучитьОбластьМакетаMSWord(Знач Handler, + Знач ИмяОбласти, + Знач СмещениеНачало = 1, + Знач СмещениеОкончание = -1) Экспорт Результат = Новый Структура("Document,Start,End"); @@ -215,7 +218,7 @@ // Возвращаемое значение // ссылка на верхний колонтитул // -Функция ПолучитьОбластьВерхнегоКолонтитула(знач Handler) Экспорт +Функция ПолучитьОбластьВерхнегоКолонтитула(Знач Handler) Экспорт Возврат Новый Структура("Header", Handler.COMСоединение.ActiveDocument.Sections(1).Headers.Item(1)); @@ -330,10 +333,10 @@ // Возвращаемое значение: // КоординатыОбласти // -Функция ПрисоединитьОбласть(знач ПечатнаяФорма, - знач ОбластьHandler, - знач ПереходНаСледСтроку = Истина, - знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт +Функция ПрисоединитьОбласть(Знач ПечатнаяФорма, + Знач ОбластьHandler, + Знач ПереходНаСледСтроку = Истина, + Знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт ОбластьHandler.Document.Range(ОбластьHandler.Start, ОбластьHandler.End).Copy(); @@ -396,10 +399,10 @@ // ДанныеОбъекта - ДанныеОбъекта // ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области // -Процедура ПрисоединитьИЗаполнитьНабор(знач ПечатнаяФорма, - знач ОбластьHandler, - знач ДанныеОбъекта = Неопределено, - знач ПереходНаСледСтроку = Истина) Экспорт +Процедура ПрисоединитьИЗаполнитьНабор(Знач ПечатнаяФорма, + Знач ОбластьHandler, + Знач ДанныеОбъекта = Неопределено, + Знач ПереходНаСледСтроку = Истина) Экспорт ОбластьHandler.Document.Range(ОбластьHandler.Start, ОбластьHandler.End).Copy(); @@ -436,10 +439,10 @@ // ДанныеОбъекта - ДанныеОбъекта // ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области // -Процедура ПрисоединитьИЗаполнитьОбластьТаблицы(знач ПечатнаяФорма, - знач ОбластьHandler, - знач ДанныеОбъекта = Неопределено, - знач ПереходНаСледСтроку = Истина) Экспорт +Процедура ПрисоединитьИЗаполнитьОбластьТаблицы(Знач ПечатнаяФорма, + Знач ОбластьHandler, + Знач ДанныеОбъекта = Неопределено, + Знач ПереходНаСледСтроку = Истина) Экспорт Если ДанныеОбъекта = Неопределено Или ДанныеОбъекта.Количество() = 0 Тогда Возврат; @@ -499,7 +502,7 @@ // Параметры // Handler - ссылка на документ MS Word в который требуется вставить разрыв // -Процедура ВставитьРазрывНаНовуюСтроку(знач Handler) Экспорт +Процедура ВставитьРазрывНаНовуюСтроку(Знач Handler) Экспорт ActiveDocument = Handler.COMСоединение.ActiveDocument; ПозицияОкончанияДокумента = ActiveDocument.Range().End; ActiveDocument.Range(ПозицияОкончанияДокумента-1, ПозицияОкончанияДокумента-1).InsertParagraphAfter(); @@ -508,7 +511,7 @@ //////////////////////////////////////////////////////////////////////////////// // Прочие процедуры и функции -Функция ПолучитьПозициюНачалаОбласти(знач COMСоединение, знач ИдентификаторОбласти) +Функция ПолучитьПозициюНачалаОбласти(Знач COMСоединение, Знач ИдентификаторОбласти) ИдентификаторОбласти = "{v8 Область." + ИдентификаторОбласти + "}"; @@ -529,7 +532,7 @@ КонецФункции -Функция ПолучитьПозициюОкончанияОбласти(знач COMСоединение, знач ИдентификаторОбласти) +Функция ПолучитьПозициюОкончанияОбласти(Знач COMСоединение, Знач ИдентификаторОбласти) ИдентификаторОбласти = "{/v8 Область." + ИдентификаторОбласти + "}"; diff --git a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl index 92cb7238a..0f8e5e637 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюOOWriterКлиент/Module.bsl @@ -25,7 +25,7 @@ Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при связи с сервис менеджером (com.sun.star.ServiceManager).'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); @@ -34,7 +34,7 @@ Попытка Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при запуске сервиса Desktop (com.sun.star.frame.Desktop).'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); @@ -83,14 +83,14 @@ // Возвращаемое значение: // структура - ссылка макет // -Функция ПолучитьМакетOOWriter(знач ДвоичныеДанныеШаблона, ИмяВременногоФайла) Экспорт +Функция ПолучитьМакетOOWriter(Знач ДвоичныеДанныеШаблона, ИмяВременногоФайла) Экспорт Handler = Новый Структура("ServiceManager,Desktop,Document,ИмяФайла"); Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при связи с сервис менеджером (com.sun.star.ServiceManager).'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); @@ -99,7 +99,7 @@ Попытка Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при запуске сервиса Desktop (com.sun.star.frame.Desktop).'") + + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,Истина); НеУдалосьСформироватьПечатнуюФорму(ИнформацияОбОшибке()); @@ -133,7 +133,7 @@ // Закрывает макет печатной формы и затирает ссылки на COM объект // -Функция ЗакрытьСоединение(Handler, знач ЗакрытьПриложение) Экспорт +Функция ЗакрытьСоединение(Handler, Знач ЗакрытьПриложение) Экспорт Если ЗакрытьПриложение Тогда Handler.Document.Close(0); @@ -155,7 +155,7 @@ // Устанавливает свойство видимости у приложения OO Writer // Handler - ссылка на печатную форму // -Процедура ПоказатьДокументOOWriter(знач Handler) Экспорт +Процедура ПоказатьДокументOOWriter(Знач Handler) Экспорт ContainerWindow = Handler.Document.getCurrentController().getFrame().getContainerWindow(); ContainerWindow.setVisible(Истина); @@ -177,7 +177,7 @@ // смещение по умолчанию: -11 - означает что область берется без символа // перевода строки, перед операторной скобкой закрытия области // -Функция ПолучитьОбластьМакета(знач Handler, знач ИмяОбласти) Экспорт +Функция ПолучитьОбластьМакета(Знач Handler, Знач ИмяОбласти) Экспорт Результат = Новый Структура("Document,Start,End"); @@ -191,7 +191,7 @@ // Получает область верхнего колонтитула // -Функция ПолучитьОбластьВерхнегоКолонтитула(знач МакетСсылка) Экспорт +Функция ПолучитьОбластьВерхнегоКолонтитула(Знач МакетСсылка) Экспорт Возврат Новый Структура("Document, ServiceManager", МакетСсылка.Document, МакетСсылка.ServiceManager); @@ -212,7 +212,7 @@ // Параметры // Handler - ссылка на документ MS Word в который требуется вставить разрыв // -Процедура ВставитьРазрывНаНовуюСтроку(знач Handler) Экспорт +Процедура ВставитьРазрывНаНовуюСтроку(Знач Handler) Экспорт oText = Handler.Document.getText(); oCursor = oText.createTextCursor(); @@ -223,8 +223,8 @@ // Добавляет верхний колонтитул к печатной форме // -Процедура ДобавитьВерхнийКолонтитул(знач ПечатнаяФорма, - знач Область) Экспорт +Процедура ДобавитьВерхнийКолонтитул(Знач ПечатнаяФорма, + Знач Область) Экспорт Макет_oTxtCrsr = УстановитьОсновнойКурсорНаВерхнийКолонтитул(Область); Пока Макет_oTxtCrsr.goRight(1, Истина) Цикл @@ -238,8 +238,8 @@ // Добавляет нижний колонтитул к печатной форме // -Процедура ДобавитьНижнийКолонтитул(знач ПечатнаяФорма, - знач Область) Экспорт +Процедура ДобавитьНижнийКолонтитул(Знач ПечатнаяФорма, + Знач Область) Экспорт Макет_oTxtCrsr = УстановитьОсновнойКурсорНаНижнийКолонтитул(Область); Пока Макет_oTxtCrsr.goRight(1, Истина) Цикл @@ -263,10 +263,10 @@ // Возвращаемое значение: // КоординатыОбласти // -Процедура ПрисоединитьОбласть(знач ПечатнаяФормаHandler, - знач ОбластьHandler, - знач ПереходНаСледСтроку = Истина, - знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт +Процедура ПрисоединитьОбласть(Знач ПечатнаяФормаHandler, + Знач ОбластьHandler, + Знач ПереходНаСледСтроку = Истина, + Знач ПрисоединитьСтрокуТаблицы = Ложь) Экспорт Макет_oTxtCrsr = ОбластьHandler.Document.getCurrentController().getViewCursor(); Макет_oTxtCrsr.gotoRange(ОбластьHandler.Start, Ложь); @@ -308,11 +308,11 @@ // Добавляет область коллекции к печатной форме // -Процедура ПрисоединитьИЗаполнитьКоллекцию(знач ПечатнаяФормаHandler, - знач ОбластьHandler, - знач Данные, - знач ЭтоСтрокаТаблицы = Ложь, - знач ПереходНаСледСтроку = Истина) Экспорт +Процедура ПрисоединитьИЗаполнитьКоллекцию(Знач ПечатнаяФормаHandler, + Знач ОбластьHandler, + Знач Данные, + Знач ЭтоСтрокаТаблицы = Ложь, + Знач ПереходНаСледСтроку = Истина) Экспорт Макет_oTxtCrsr = ОбластьHandler.Document.getCurrentController().getViewCursor(); Макет_oTxtCrsr.gotoRange(ОбластьHandler.Start, Ложь); @@ -340,7 +340,7 @@ // Устанавливает курсор в конец документа ДокументСсылка // -Процедура УстановитьОсновнойКурсорНаТелоДокумента(знач ДокументСсылка) Экспорт +Процедура УстановитьОсновнойКурсорНаТелоДокумента(Знач ДокументСсылка) Экспорт oDoc = ДокументСсылка.Document; oViewCursor = oDoc.getCurrentController().getViewCursor(); @@ -352,7 +352,7 @@ // Устанавливает курсор на верхний колонтитул // -Функция УстановитьОсновнойКурсорНаВерхнийКолонтитул(знач ДокументСсылка) Экспорт +Функция УстановитьОсновнойКурсорНаВерхнийКолонтитул(Знач ДокументСсылка) Экспорт xCursor = ДокументСсылка.Document.getCurrentController().getViewCursor(); PageStyleName = xCursor.getPropertyValue("PageStyleName"); @@ -366,7 +366,7 @@ // Устанавливает курсор на нижний колонтитул // -Функция УстановитьОсновнойКурсорНаНижнийКолонтитул(знач ДокументСсылка) Экспорт +Функция УстановитьОсновнойКурсорНаНижнийКолонтитул(Знач ДокументСсылка) Экспорт xCursor = ДокументСсылка.Document.getCurrentController().getViewCursor(); PageStyleName = xCursor.getPropertyValue("PageStyleName"); @@ -384,7 +384,7 @@ // Получает специальную структуру, через которую объектам UNO устанавливаются // параметры. // -Функция СвойствоЗначение(знач ServiceManager, знач Свойство, знач Значение) +Функция СвойствоЗначение(Знач ServiceManager, Знач Свойство, Знач Значение) PropertyValue = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue"); PropertyValue.Name = Свойство; @@ -394,7 +394,7 @@ КонецФункции -Функция ПолучитьПозициюНачалаОбласти(знач xDocument, знач ИмяОбласти) +Функция ПолучитьПозициюНачалаОбласти(Знач xDocument, Знач ИмяОбласти) ТекстДляПоиска = "{v8 Область." + ИмяОбласти + "}"; @@ -410,7 +410,7 @@ КонецФункции -Функция ПолучитьПозициюОкончанияОбласти(знач xDocument, знач ИмяОбласти) +Функция ПолучитьПозициюОкончанияОбласти(Знач xDocument, Знач ИмяОбласти) ТекстДляПоиска = "{/v8 Область." + ИмяОбласти + "}"; diff --git a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl index 1bb091059..e19cf9e23 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюВызовСервера/Module.bsl @@ -13,7 +13,7 @@ // // Подробнее - см. описание УправлениеПечатью.ПолучитьМакетыИДанныеОбъектов(). // -Функция ПолучитьМакетыИДанныеОбъектов(знач ИмяМенеджераПечати, знач ИменаМакетов, знач СоставДокументов) Экспорт +Функция ПолучитьМакетыИДанныеОбъектов(Знач ИмяМенеджераПечати, Знач ИменаМакетов, Знач СоставДокументов) Экспорт Возврат УправлениеПечатью.ПолучитьМакетыИДанныеОбъектов(ИмяМенеджераПечати, ИменаМакетов, СоставДокументов); diff --git a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl index 2d1998335..9d7d7bfc8 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюКлиент/Module.bsl @@ -13,6 +13,8 @@ // настройки количества копий не будут восстановлены, и не запишутся. Процедура ВыполнитьКомандуПечати(ИмяМенеджераПечати, ИменаМакетов, ПараметрКоманды, ВладелецФормы, ПараметрыПечати = Неопределено) Экспорт + ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ВыполнитьКомандуПечати", "ПараметрКоманды", ПараметрКоманды, Тип("Массив")); + // Проверим количество объектов Если НЕ ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) Тогда Возврат; @@ -109,6 +111,599 @@ КонецПроцедуры +// Выполняет интерактивное проведение документов перед печатью. +// Если есть непроведенные документы, предлагает выполнить проведение. Спрашивает +// пользователя о продолжении, если какие-то из документов не провелись и имеются проведенные. +// +// Параметры: +// ОписаниеПроцедурыЗавершения - ОписаниеОповещения - процедура, в которую необходимо передать управление после выполнения. +// Параметры вызываемой процедуры: +// СписокДокументов - Массив - проведенные документы; +// ДополнительныеПараметры - значение, которое было указано при создании объекта оповещения. +// СписокДокументов - Массив - ссылки на документы, которые требуется провести. +// Форма - УправляемаяФорма - форма, из которой было вызвана команда. Параметр требуется, когда процедура +// вызвана из формы объекта, для того, чтобы перечитать форму. +Процедура ПроверитьПроведенностьДокументов(ОписаниеПроцедурыЗавершения, СписокДокументов, Форма = Неопределено) Экспорт + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОписаниеПроцедурыЗавершения", ОписаниеПроцедурыЗавершения); + ДополнительныеПараметры.Вставить("СписокДокументов", СписокДокументов); + ДополнительныеПараметры.Вставить("Форма", Форма); + + НепроведенныеДокументы = ОбщегоНазначенияВызовСервера.ПроверитьПроведенностьДокументов(СписокДокументов); + ЕстьНепроведенныеДокументы = НепроведенныеДокументы.Количество() > 0; + Если ЕстьНепроведенныеДокументы Тогда + ДополнительныеПараметры.Вставить("НепроведенныеДокументы", НепроведенныеДокументы); + УправлениеПечатьюСлужебныйКлиент.ПроверитьПроведенностьДокументовДиалогПроведения(ДополнительныеПараметры); + Иначе + ВыполнитьОбработкуОповещения(ОписаниеПроцедурыЗавершения, СписокДокументов); + КонецЕсли; + +КонецПроцедуры + +// Обработчик динамически подключаемой команды печати. +// +// Команда - КомандаФормы - подключаемая команда формы, выполняющая обработчик Подключаемый_ВыполнитьКомандуПечати. +// (альтернативный вызов*) Структура - строка таблицы КомандыПечати, преобразованная в структуру. +// Источник - ТаблицаФормы Или ДанныеФормыСтруктура - источник объектов печати (Форма.Объект, Форма.Элементы.Список). +// (альтернативный вызов*) Массив - список объектов печати. +// +// *Альтернативный вызов - указанные типы используются в случае, если вызов выполняется не из штатного +// обработчика Подключаемый_ВыполнитьКомандуПечати. +// +Процедура ВыполнитьПодключаемуюКомандуПечати(Знач Команда, Знач Форма, Знач Источник) Экспорт + + ОписаниеКоманды = Команда; + Если ТипЗнч(Команда) = Тип("КомандаФормы") Тогда + ОписаниеКоманды = ОписаниеКомандыПечати(Команда.Имя, Форма.ИмяФормы); + КонецЕсли; + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОписаниеКоманды", ОписаниеКоманды); + ДополнительныеПараметры.Вставить("Форма", Форма); + ДополнительныеПараметры.Вставить("Источник", Источник); + + Если Не ОписаниеКоманды.НеВыполнятьЗаписьВФорме И ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура") + И (Источник.Ссылка.Пустая() Или Форма.Модифицированность) Тогда + + Если Источник.Ссылка.Пустая() Тогда + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Данные еще не записаны. + |Выполнение действия ""%1"" возможно только после записи данных. + |Данные будут записаны.'"), + ОписаниеКоманды.Представление); + + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи", УправлениеПечатьюСлужебныйКлиент, ДополнительныеПараметры); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена); + Возврат; + КонецЕсли; + УправлениеПечатьюСлужебныйКлиент.ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(КодВозвратаДиалога.ОК, ДополнительныеПараметры); + Возврат; + КонецЕсли; + + УправлениеПечатьюСлужебныйКлиент.ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(Неопределено, ДополнительныеПараметры); + +КонецПроцедуры + +// Возвращает описание команды по имени элемента формы. +// +// См. УправлениеПечатью.ОписаниеКомандыПечати +// +Функция ОписаниеКомандыПечати(ИмяКоманды, ИмяФормы) Экспорт + + Возврат УправлениеПечатьюКлиентПовтИсп.ОписаниеКомандыПечати(ИмяКоманды, ИмяФормы); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Работа с макетами офисных документов + +// Секция содержит интерфейсные функции (API), используемые при создании +// печатных форм основанных на офисных документах. На данный момент поддерживается +// два офисных пакета MS Office (шаблоны MS Word) и Open Office (шаблоны OO Writer). +// +//////////////////////////////////////////////////////////////////////////////// +// типы используемых данных (определяется конкретными реализациями) +// СсылкаПечатнаяФорма - ссылка на печатную форму +// СсылкаМакет - ссылка на макет +// Область - ссылка на область в печатной форме или макете (структура) +// доопределяется в интерфейсном модуле служебной информацией +// об области +// ОписаниеОбласти - описание области макета (см. ниже) +// ДанныеЗаполнения - либо структура, либо массив структур (для случая +// списков и таблиц +//////////////////////////////////////////////////////////////////////////////// +// ОписаниеОбласти - структура, описывающая подготовленные пользователем области макета +// ключ ИмяОбласти - имя области +// ключ ТипТипОбласти - ВерхнийКолонтитул +// НижнийКолонтитул +// Общая +// СтрокаТаблицы +// Список +// + +//////////////////////////////////////////////////////////////////////////////// +// Функции инициализации и закрытия ссылок + +// Создает соединение с выходной печатной формой. +// Необходимо вызвать перед любыми действиями над формой. +// Параметры: +// ТипДокумента - Строка - тип печатной формы "DOC" или "ODT"; +// НастройкиСтраницыМакета - Соответствие - параметры из структуры, возвращаемой функцией ИнициализироватьМакет; +// Макет - Структура - результат функции ИнициализироватьМакет. +// +// Возвращаемое значение: +// Структура. +// +// Примечание: параметр НастройкиСтраницыМакета устарел, его следует пропускать и использовать параметр Макет. +// +Функция ИнициализироватьПечатнуюФорму(Знач ТипДокумента, Знач НастройкиСтраницыМакета = Неопределено, Макет = Неопределено) Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + Возврат Неопределено; + КонецЕсли; + + Если ВРег(ТипДокумента) = "DOC" Тогда + Параметр = ?(Макет = Неопределено, НастройкиСтраницыМакета, Макет); // для обратной совместимости + ПечатнаяФорма = УправлениеПечатьюMSWordКлиент.ИнициализироватьПечатнуюФормуMSWord(Параметр); + ПечатнаяФорма.Вставить("Тип", "DOC"); + ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); + Возврат ПечатнаяФорма; + ИначеЕсли ВРег(ТипДокумента) = "ODT" Тогда + ПечатнаяФорма = УправлениеПечатьюOOWriterКлиент.ИнициализироватьПечатнуюФормуOOWriter(Макет); + ПечатнаяФорма.Вставить("Тип", "ODT"); + ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); + Возврат ПечатнаяФорма; + КонецЕсли; + +КонецФункции + +// Создает COM-соединение с макетом. В дальнейшем это соединение используется при получении из него областей (тегов и таблиц). +// +// Параметры: +// ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета; +// ТипМакета - Строка - тип макета печатной формы "DOC" или "ODT"; +// ИмяМакета - Строка - имя, которое будет использовано при создании временного файла макета. +// Возвращаемое значение: +// Структура. +// +Функция ИнициализироватьМакетОфисногоДокумента(Знач ДвоичныеДанныеМакета, Знач ТипМакета, Знач ИмяМакета = "") Экспорт + + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Расширение для работы с файлами не подключено. Печать невозможна.'")); + Возврат Неопределено; + КонецЕсли; + + Макет = Неопределено; + ИмяВременногоФайла = ""; + + #Если ВебКлиент Тогда + Если ПустаяСтрока(ИмяМакета) Тогда + ИмяВременногоФайла = Строка(Новый УникальныйИдентификатор) + "." + НРег(ТипМакета); + Иначе + ИмяВременногоФайла = ИмяМакета + "." + НРег(ТипМакета); + КонецЕсли; + + ОписанияФайлов = Новый Массив; + ОписанияФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяВременногоФайла, ПоместитьВоВременноеХранилище(ДвоичныеДанныеМакета))); + + Если НЕ ПолучитьФайлы(ОписанияФайлов, , КаталогВременныхФайлов(), Ложь) Тогда + Возврат Неопределено; + КонецЕсли; + + ИмяВременногоФайла = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогВременныхФайлов()) + ИмяВременногоФайла; + #КонецЕсли + + Если ВРег(ТипМакета) = "DOC" Тогда + Макет = УправлениеПечатьюMSWordКлиент.ПолучитьМакетMSWord(ДвоичныеДанныеМакета, ИмяВременногоФайла); + Макет.Вставить("Тип", "DOC"); + ИначеЕсли ВРег(ТипМакета) = "ODT" Тогда + Макет = УправлениеПечатьюOOWriterКлиент.ПолучитьМакетOOWriter(ДвоичныеДанныеМакета, ИмяВременногоФайла); + Макет.Вставить("Тип", "ODT"); + Макет.Вставить("НастройкиСтраницыМакета", Неопределено); + КонецЕсли; + + Возврат Макет; + +КонецФункции + +// Освобождает ссылки в созданном интерфейсе связи с офисным приложением. +// Необходимо вызывать каждый раз после завершения формирования макета и выводе +// печатной формы пользователю. +// Параметры: +// Handler - СсылкаПечатнаяФорма, СсылкаМакет +// ЗакрытьПриложение - булево - признак, требуется ли закрыть приложение. +// Соединение с макетом требуется закрывать с закрытием приложения. +// ПечатнуюФорму не требуется закрывать. +// +Процедура ОчиститьСсылки(Handler, Знач ЗакрытьПриложение = Истина) Экспорт + + Если Handler <> Неопределено Тогда + Если Handler.Тип = "DOC" Тогда + УправлениеПечатьюMSWordКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); + Иначе + УправлениеПечатьюOOWriterКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); + КонецЕсли; + Handler = Неопределено; + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функция отображения печатной формы пользователю + +// Показывает сформированный документ пользователю. +// Фактически устанавливает ему признак видимости. +// Параметры +// Handler - СсылкаПечатнаяФорма +// +Процедура ПоказатьДокумент(Знач Handler) Экспорт + + Если Handler.Тип = "DOC" Тогда + УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(Handler); + ИначеЕсли Handler.Тип = "ODT" Тогда + УправлениеПечатьюOOWriterКлиент.ПоказатьДокументOOWriter(Handler); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Функции получения областей из макета, вывода в печатную форму областей макета +// и заполнение параметров в них + +// Получает область из макета. +// Параметры +// СсылкаМакет - СсылкаМакет - ссылка на макет +// ОписаниеОбласти - ОписаниеОбласти - описание области +// +// Возвращаемое значение +// Область - область из макета +// +Функция ПолучитьОбласть(Знач СсылкаМакет, Знач ОписаниеОбласти) Экспорт + + Область = Неопределено; + Если СсылкаМакет.Тип = "DOC" Тогда + + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда + Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ТипОбласти); + КонецЕсли; + + Если Область <> Неопределено Тогда + Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); + КонецЕсли; + ИначеЕсли СсылкаМакет.Тип = "ODT" Тогда + + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаМакет); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" + ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" + ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда + Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьМакета(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); + Иначе + ВызватьИсключение + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ИмяОбласти); + КонецЕсли; + + Если Область <> Неопределено Тогда + Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); + КонецЕсли; + КонецЕсли; + + Возврат Область; + +КонецФункции + +// Присоединяет область в печатную форму из макета. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма - ссылка на печатную форму +// ОбластьМакета - Область - область из макета +// ПереходНаСледующуюСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьОбласть(Знач ПечатнаяФорма, + Знач ОбластьМакета, + Знач ПереходНаСледующуюСтроку = Истина) Экспорт + + Если ОбластьМакета = Неопределено Тогда + Возврат; + КонецЕсли; + + Попытка + ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; + + Если ПечатнаяФорма.Тип = "DOC" Тогда + + ВыведеннаяОбласть = Неопределено; + + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + УправлениеПечатьюMSWordКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + УправлениеПечатьюMSWordКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" Тогда + ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда + ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда + Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть <> Неопределено + И ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "СтрокаТаблицы" + И НЕ ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ПереходНаСледующуюСтроку Тогда + ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина); + Иначе + ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); + КонецЕсли; + Иначе + ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно.'")); + КонецЕсли; + + ОписаниеОбласти.Вставить("Область", ВыведеннаяОбласть); + ОписаниеОбласти.Вставить("ПереходНаСледующуюСтроку", ПереходНаСледующуюСтроку); + + ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; // содержит тип области, и границы области (если требуется) + + ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + УправлениеПечатьюOOWriterКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + УправлениеПечатьюOOWriterКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" + ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда + УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); + УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда + УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); + УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина); + Иначе + ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + КонецЕсли; + ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; // содержит тип области, и границы области (если требуется) + КонецЕсли; + Исключение + СообщениеОбОшибке = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОШибке())); + СообщениеОбОшибке = ?(Прав(СообщениеОбОшибке, 1) = ".", СообщениеОбОшибке, СообщениеОбОшибке + "."); + СообщениеОбОшибке = СообщениеОбОшибке + " " + + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка при попытке вывести область ""%1"" из макета.'"), + ОбластьМакета.ОписаниеОбласти.ИмяОбласти); + ВызватьИсключение СообщениеОбОшибке; + КонецПопытки; + +КонецПроцедуры + +// Заполняет параметры области печатной формы +// +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма, Область - область печатной формы, либо сама печатная форма +// Данные - ДанныеЗаполнения +// +Процедура ЗаполнитьПараметры(Знач ПечатнаяФорма, Знач Данные) Экспорт + + ОписаниеОбласти = ПечатнаяФорма.ПоследняяВыведеннаяОбласть; + + Если ПечатнаяФорма.Тип = "DOC" Тогда + Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда + УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметрыВерхнегоКолонтитула(ПечатнаяФорма, Данные); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда + УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметрыНижнегоКолонтитула(ПечатнаяФорма, Данные); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" + ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" + ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда + УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметры(ПечатнаяФорма.ПоследняяВыведеннаяОбласть.Область, Данные); + Иначе + ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + КонецЕсли; + ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда + Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "ВерхнийКолонтитул" Тогда + УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаВерхнийКолонтитул(ПечатнаяФорма); + ИначеЕсли ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "НижнийКолонтитул" Тогда + УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаНижнийКолонтитул(ПечатнаяФорма); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" + ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" + ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда + УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); + КонецЕсли; + УправлениеПечатьюOOWriterКлиент.ЗаполнитьПараметры(ПечатнаяФорма, Данные); + КонецЕсли; + +КонецПроцедуры + +// Добавляет область в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма +// ОбластьМакета - Область +// Данные - ДанныеОбъекта +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьОбластьИЗаполнитьПараметры(Знач ПечатнаяФорма, + Знач ОбластьМакета, + Знач Данные, + Знач ПереходНаСледующуюСтроку = Истина) Экспорт + + Если ОбластьМакета <> Неопределено Тогда + ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); + ЗаполнитьПараметры(ПечатнаяФорма, Данные) + КонецЕсли; + +КонецПроцедуры + +// Добавляет область в печатную форму из макета, при этом заменяя +// параметры в области значениями из данных объекта. +// Применяется при одиночном выводе области. +// +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма +// ОбластьМакета - Область - область макета +// Данные - ДанныеОбъекта (массив структур) +// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области +// +Процедура ПрисоединитьИЗаполнитьКоллекцию(Знач ПечатнаяФорма, + Знач ОбластьМакета, + Знач Данные, + Знач ПереходНаСледСтроку = Истина) Экспорт + Если ОбластьМакета = Неопределено Тогда + Возврат; + КонецЕсли; + + ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; + + Если ПечатнаяФорма.Тип = "DOC" Тогда + Если ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда + УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьОбластьТаблицы(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда + УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьНабор(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку); + Иначе + ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + КонецЕсли; + ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда + Если ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда + УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Истина, ПереходНаСледСтроку); + ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда + УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Ложь, ПереходНаСледСтроку); + Иначе + ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +// Вставляет разрыв между строками в виде символа перевода строки +// Параметры +// ПечатнаяФорма - СсылкаПечатнаяФорма +// +Процедура ВставитьРазрывНаНовуюСтроку(Знач ПечатнаяФорма) Экспорт + + Если ПечатнаяФорма.Тип = "DOC" Тогда + УправлениеПечатьюMSWordКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда + УправлениеПечатьюOOWriterКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Перед выполнением команды печати проверить, был ли передан хотя бы один объект, так как +// для команд с множественным режимом использования может быть передан пустой массив. +Функция ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) + + Если ТипЗнч(ПараметрКоманды) = Тип("Массив") И ПараметрКоманды.Количество() = 0 Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; + +КонецФункции + +// ИспользованиеМодальности + +#Если ВебКлиент Тогда +// Устарела. Используется устаревшей функцией ИнициализироватьМакет. +// +// Функция получает файл(ы) c сервера в локальный каталог на диск и возвращает +// имя каталога, в который они были сохранены +// Параметры: +// ПутьККаталогу - строка - путь к каталогу, в который должны быть сохранены файлы +// ПолучаемыеФайлы - соответствие - +// ключ - имя файла +// значение - двоичные данные файла +// +Функция ПолучитьФайлыВКаталогФайловПечати(ПутьККаталогу, ПолучаемыеФайлы) Экспорт + + ТребуетсяУстановитьКаталогПечати = Не ЗначениеЗаполнено(ПутьККаталогу); + Если Не ТребуетсяУстановитьКаталогПечати Тогда + Файл = Новый Файл(ПутьККаталогу); + Если НЕ Файл.Существует() Тогда + ТребуетсяУстановитьКаталогПечати = Истина; + КонецЕсли; + КонецЕсли; + + Если ТребуетсяУстановитьКаталогПечати Тогда + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.НастройкаКаталогаФайловПечати"); + Если ТипЗнч(Результат) <> Тип("Строка") Тогда + Возврат Неопределено; + КонецЕсли; + ПутьККаталогу = Результат; + КонецЕсли; + + ПовторятьПечать = Истина; + + Пока ПовторятьПечать Цикл + ПовторятьПечать = Ложь; + Попытка + ФайлыВоВременномХранилище = ПолучитьАдресаФайловВоВременномХранилище(ПолучаемыеФайлы); + + ОписанияФайлов = Новый Массив; + + Для Каждого ФайлВоВременномХранилище Из ФайлыВоВременномХранилище Цикл + ОписанияФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ФайлВоВременномХранилище.Ключ,ФайлВоВременномХранилище.Значение)); + КонецЦикла; + + Если НЕ ПолучитьФайлы(ОписанияФайлов, , ПутьККаталогу, Ложь) Тогда + Возврат Неопределено; + КонецЕсли; + Исключение + СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.ДиалогПовтораПечати", Новый Структура("СообщениеОбОшибке", СообщениеОбОшибке)); + Если ТипЗнч(Результат) = Тип("Строка") Тогда + ПовторятьПечать = Истина; + ПутьККаталогу = Результат; + Иначе + Возврат Неопределено; + КонецЕсли; + КонецПопытки; + КонецЦикла; + + Если Прав(ПутьККаталогу, 1) <> "\" Тогда + ПутьККаталогу = ПутьККаталогу + "\"; + КонецЕсли; + + Возврат ПутьККаталогу; + +КонецФункции + +// Устарела. Используется устаревшей функцией ПолучитьФайлыВКаталогФайловПечати. +// Помещает набор двоичных данных во временное хранилище +// Параметры: +// НаборЗначений - соответствие, ключ - ключ, связанный с двоичными данными +// значение - ДвоичныеДанные +// Возвращаемое значение: +// соответствие: ключ - ключ, связанный с адресом во временном хранилище +// значение - адрес во временном хранилище +// +Функция ПолучитьАдресаФайловВоВременномХранилище(НаборЗначений) + + Результат = Новый Соответствие; + + Для Каждого КлючЗначение Из НаборЗначений Цикл + Результат.Вставить(КлючЗначение.Ключ, ПоместитьВоВременноеХранилище(КлючЗначение.Значение)); + КонецЦикла; + + Возврат Результат; + +КонецФункции +#КонецЕсли + +// Устарела. Следует использовать ПроверитьПроведенностьДокументов. +// // Выполняет интерактивное проведение документов перед печатью. // Если есть непроведенные документы, предлагает выполнить проведение. Спрашивает // пользователя о продолжении, если какие-то из документов не провелись и имеются проведенные. @@ -205,155 +800,8 @@ КонецФункции -// Обработчик динамически подключаемой команды печати. +// Устарела. Следует использовать процедуру ИнициализироватьМакетОфисногоДокумента. // -// Команда - КомандаФормы - подключаемая команда формы, выполняющая обработчик Подключаемый_ВыполнитьКомандуПечати. -// (альтернативный вызов*) Структура - строка таблицы КомандыПечати, преобразованная в структуру. -// Источник - ТаблицаФормы Или ДанныеФормыСтруктура - источник объектов печати (Форма.Объект, Форма.Элементы.Список). -// (альтернативный вызов*) Массив - список объектов печати. -// -// *Альтернативный вызов - указанные типы используются в случае, если вызов выполняется не из штатного -// обработчика Подключаемый_ВыполнитьКомандуПечати. -// -Процедура ВыполнитьПодключаемуюКомандуПечати(Знач Команда, Знач Форма, Знач Источник) Экспорт - - ОписаниеКоманды = Команда; - Если ТипЗнч(Команда) = Тип("КомандаФормы") Тогда - ОписаниеКоманды = ОписаниеКомандыПечати(Команда.Имя, Форма.ИмяФормы); - КонецЕсли; - - Если Не ОписаниеКоманды.НеВыполнятьЗаписьВФорме И ТипЗнч(Источник) = Тип("ДанныеФормыСтруктура") - И (Источник.Ссылка.Пустая() Или Форма.Модифицированность) Тогда - - Если Источник.Ссылка.Пустая() Тогда - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Данные еще не записаны. - |Выполнение действия ""%1"" возможно только после записи данных. - |Данные будут записаны.'"), - ОписаниеКоманды.Представление); - Если Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена) = КодВозвратаДиалога.Отмена Тогда - Возврат; - КонецЕсли; - КонецЕсли; - - Форма.Записать(); - Если Источник.Ссылка.Пустая() Или Форма.Модифицированность Тогда - Возврат; // запись не удалась, сообщения о причинах выводит платформа - КонецЕсли; - КонецЕсли; - - ОбъектыПечати = Источник; - Если ТипЗнч(Источник) <> Тип("Массив") Тогда - ОбъектыПечати = ОбъектыПечати(Источник); - КонецЕсли; - - Если ОбъектыПечати.Количество() = 0 Тогда - ВызватьИсключение НСтр("ru = 'Команда не может быть выполнена для указанного объекта!'") - КонецЕсли; - - Если ОписаниеКоманды.ПроверкаПроведенияПередПечатью - И Не ПроверитьДокументыПроведены(ОбъектыПечати, Форма) Тогда - Возврат; - КонецЕсли; - - ОписаниеКоманды = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ОписаниеКоманды); - ОписаниеКоманды.Вставить("ОбъектыПечати", ОбъектыПечати); - - Если ОписаниеКоманды.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" - И ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда - МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); - МодульДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуПечати(ОписаниеКоманды, Форма); - Возврат; - КонецЕсли; - - Если Не ПустаяСтрока(ОписаниеКоманды.Обработчик) Тогда - ОписаниеКоманды.Вставить("Форма", Форма); - ИмяОбработчика = ОписаниеКоманды.Обработчик; - Обработчик = ИмяОбработчика + "(ОписаниеКоманды)"; - Результат = Вычислить(Обработчик); - Возврат; - КонецЕсли; - - Если ОписаниеКоманды.СразуНаПринтер Тогда - ВыполнитьКомандуПечатиНаПринтер(ОписаниеКоманды.МенеджерПечати, ОписаниеКоманды.Идентификатор, - ОбъектыПечати, ОписаниеКоманды.ДополнительныеПараметры); - Иначе - ВыполнитьКомандуПечати(ОписаниеКоманды.МенеджерПечати, ОписаниеКоманды.Идентификатор, - ОбъектыПечати, Форма, ОписаниеКоманды); - КонецЕсли; - -КонецПроцедуры - -// Возвращает описание команды по имени элемента формы. -// -// См. УправлениеПечатью.ОписаниеКомандыПечати -// -Функция ОписаниеКомандыПечати(ИмяКоманды, ИмяФормы) Экспорт - - Возврат УправлениеПечатьюКлиентПовтИсп.ОписаниеКомандыПечати(ИмяКоманды, ИмяФормы); - -КонецФункции - -//////////////////////////////////////////////////////////////////////////////// -// Работа с макетами офисных документов -// -// Краткое описание: -// Секция содержит интерфейсные функции (API), используемые при создании -// печатных форм основанных на офисных документах. На данный момент поддерживается -// два офисных пакета MS Office (шаблоны MS Word) и Open Office (шаблоны OO Writer). -// -//////////////////////////////////////////////////////////////////////////////// -// типы используемых данных (определяется конкретными реализациями) -// СсылкаПечатнаяФорма - ссылка на печатную форму -// СсылкаМакет - ссылка на макет -// Область - ссылка на область в печатной форме или макете (структура) -// доопределяется в интерфейсном модуле служебной информацией -// об области -// ОписаниеОбласти - описание области макета (см. ниже) -// ДанныеЗаполнения - либо структура, либо массив структур (для случая -// списков и таблиц -//////////////////////////////////////////////////////////////////////////////// -// ОписаниеОбласти - структура, описывающая подготовленные пользователем области макета -// ключ ИмяОбласти - имя области -// ключ ТипТипОбласти - ВерхнийКолонтитул -// НижнийКолонтитул -// Общая -// СтрокаТаблицы -// Список -// - -//////////////////////////////////////////////////////////////////////////////// -// Функции инициализации и закрытия ссылок - -// Создает соединение с выходной печатной формой. -// Необходимо вызвать перед любыми действиями над формой. -// Параметры: -// ТипДокумента - Строка - тип печатной формы "DOC" или "ODT"; -// НастройкиСтраницыМакета - Соответствие - параметры из структуры, возвращаемой функцией ИнициализироватьМакет; -// Макет - Структура - результат функции ИнициализироватьМакет. -// -// Возвращаемое значение: -// Структура. -// -// Примечание: параметр НастройкиСтраницыМакета устарел, его следует пропускать и использовать параметр Макет. -// -Функция ИнициализироватьПечатнуюФорму(знач ТипДокумента, знач НастройкиСтраницыМакета = Неопределено, Макет = Неопределено) Экспорт - - Если ВРег(ТипДокумента) = "DOC" Тогда - Параметр = ?(Макет = Неопределено, НастройкиСтраницыМакета, Макет); // для обратной совместимости - ПечатнаяФорма = УправлениеПечатьюMSWordКлиент.ИнициализироватьПечатнуюФормуMSWord(Параметр); - ПечатнаяФорма.Вставить("Тип", "DOC"); - ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); - Возврат ПечатнаяФорма; - ИначеЕсли ВРег(ТипДокумента) = "ODT" Тогда - ПечатнаяФорма = УправлениеПечатьюOOWriterКлиент.ИнициализироватьПечатнуюФормуOOWriter(Макет); - ПечатнаяФорма.Вставить("Тип", "ODT"); - ПечатнаяФорма.Вставить("ПоследняяВыведеннаяОбласть", Неопределено); - Возврат ПечатнаяФорма; - КонецЕсли; - -КонецФункции - // Создает соединение с макетом. В дальнейшем это соединение используется // при получении из него областей (тегов и таблиц). // @@ -363,7 +811,7 @@ // Возвращаемое значение: // Структура. // -Функция ИнициализироватьМакет(знач ДвоичныеДанныеМакета, знач ТипМакета, знач ПутьККаталогу = "", знач ИмяМакета = "") Экспорт +Функция ИнициализироватьМакет(Знач ДвоичныеДанныеМакета, Знач ТипМакета, Знач ПутьККаталогу = "", Знач ИмяМакета = "") Экспорт #Если ВебКлиент Тогда ТекстСообщения = НСтр("ru = 'Для продолжения печати необходимо установить расширение работы с файлами.'"); @@ -404,417 +852,4 @@ КонецФункции -// Освобождает ссылки в созданном интерфейсе связи с офисным приложением. -// Необходимо вызывать каждый раз после завершения формирования макета и выводе -// печатной формы пользователю. -// Параметры: -// Handler - СсылкаПечатнаяФорма, СсылкаМакет -// ЗакрытьПриложение - булево - признак, требуется ли закрыть приложение. -// Соединение с макетом требуется закрывать с закрытием приложения. -// ПечатнуюФорму не требуется закрывать. -// -Процедура ОчиститьСсылки(Handler, знач ЗакрытьПриложение = Истина) Экспорт - - Если Handler <> Неопределено Тогда - Если Handler.Тип = "DOC" Тогда - УправлениеПечатьюMSWordКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); - Иначе - УправлениеПечатьюOOWriterКлиент.ЗакрытьСоединение(Handler, ЗакрытьПриложение); - КонецЕсли; - Handler = Неопределено; - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Функция отображения печатной формы пользователю - -// Показывает сформированный документ пользователю. -// Фактически устанавливает ему признак видимости. -// Параметры -// Handler - СсылкаПечатнаяФорма -// -Процедура ПоказатьДокумент(знач Handler) Экспорт - - Если Handler.Тип = "DOC" Тогда - УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(Handler); - ИначеЕсли Handler.Тип = "ODT" Тогда - УправлениеПечатьюOOWriterКлиент.ПоказатьДокументOOWriter(Handler); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Функции получения областей из макета, вывода в печатную форму областей макета -// и заполнение параметров в них - -// Получает область из макета. -// Параметры -// СсылкаМакет - СсылкаМакет - ссылка на макет -// ОписаниеОбласти - ОписаниеОбласти - описание области -// -// Возвращаемое значение -// Область - область из макета -// -Функция ПолучитьОбласть(знач СсылкаМакет, знач ОписаниеОбласти) Экспорт - - Область = Неопределено; - Если СсылкаМакет.Тип = "DOC" Тогда - - Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда - Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаМакет); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда - Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаМакет); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" Тогда - Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда - Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда - Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0); - Иначе - ВызватьИсключение - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ТипОбласти); - КонецЕсли; - - Если Область <> Неопределено Тогда - Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); - КонецЕсли; - ИначеЕсли СсылкаМакет.Тип = "ODT" Тогда - - Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда - Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаМакет); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда - Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаМакет); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" - ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" - ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда - Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьМакета(СсылкаМакет, ОписаниеОбласти.ИмяОбласти); - Иначе - ВызватьИсключение - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Тип области не указан или указан не корректно: %1.'"), ОписаниеОбласти.ИмяОбласти); - КонецЕсли; - - Если Область <> Неопределено Тогда - Область.Вставить("ОписаниеОбласти", ОписаниеОбласти); - КонецЕсли; - КонецЕсли; - - Возврат Область; - -КонецФункции - -// Присоединяет область в печатную форму из макета. -// Применяется при одиночном выводе области. -// -// Параметры -// ПечатнаяФорма - СсылкаПечатнаяФорма - ссылка на печатную форму -// ОбластьМакета - Область - область из макета -// ПереходНаСледующуюСтроку - булево, требуется ли вставлять разрыв после вывода области -// -Процедура ПрисоединитьОбласть(знач ПечатнаяФорма, - знач ОбластьМакета, - знач ПереходНаСледующуюСтроку = Истина) Экспорт - - Если ОбластьМакета = Неопределено Тогда - Возврат; - КонецЕсли; - - Попытка - ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; - - Если ПечатнаяФорма.Тип = "DOC" Тогда - - ВыведеннаяОбласть = Неопределено; - - Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда - УправлениеПечатьюMSWordКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда - УправлениеПечатьюMSWordКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" Тогда - ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда - ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда - Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть <> Неопределено - И ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "СтрокаТаблицы" - И НЕ ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ПереходНаСледующуюСтроку Тогда - ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина); - Иначе - ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); - КонецЕсли; - Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно.'")); - КонецЕсли; - - ОписаниеОбласти.Вставить("Область", ВыведеннаяОбласть); - ОписаниеОбласти.Вставить("ПереходНаСледующуюСтроку", ПереходНаСледующуюСтроку); - - ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; // содержит тип области, и границы области (если требуется) - - ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда - Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда - УправлениеПечатьюOOWriterКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда - УправлениеПечатьюOOWriterКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" - ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда - УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); - УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда - УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); - УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина); - Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); - КонецЕсли; - ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти; // содержит тип области, и границы области (если требуется) - КонецЕсли; - Исключение - СообщениеОбОшибке = СокрЛП(КраткоеПредставлениеОшибки(ИнформацияОбОШибке())); - СообщениеОбОшибке = ?(Прав(СообщениеОбОшибке, 1) = ".", СообщениеОбОшибке, СообщениеОбОшибке + "."); - СообщениеОбОшибке = СообщениеОбОшибке + " " + - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Ошибка при попытке вывести область ""%1"" из макета.'"), - ОбластьМакета.ОписаниеОбласти.ИмяОбласти); - ВызватьИсключение СообщениеОбОшибке; - КонецПопытки; - -КонецПроцедуры - -// Заполняет параметры области печатной формы -// -// Параметры -// ПечатнаяФорма - СсылкаПечатнаяФорма, Область - область печатной формы, либо сама печатная форма -// Данные - ДанныеЗаполнения -// -Процедура ЗаполнитьПараметры(знач ПечатнаяФорма, знач Данные) Экспорт - - ОписаниеОбласти = ПечатнаяФорма.ПоследняяВыведеннаяОбласть; - - Если ПечатнаяФорма.Тип = "DOC" Тогда - Если ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда - УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметрыВерхнегоКолонтитула(ПечатнаяФорма, Данные); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда - УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметрыНижнегоКолонтитула(ПечатнаяФорма, Данные); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" - ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" - ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда - УправлениеПечатьюMSWordКлиент.ЗаполнитьПараметры(ПечатнаяФорма.ПоследняяВыведеннаяОбласть.Область, Данные); - Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); - КонецЕсли; - ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда - Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "ВерхнийКолонтитул" Тогда - УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаВерхнийКолонтитул(ПечатнаяФорма); - ИначеЕсли ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "НижнийКолонтитул" Тогда - УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаНижнийКолонтитул(ПечатнаяФорма); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Общая" - ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" - ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда - УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма); - КонецЕсли; - УправлениеПечатьюOOWriterКлиент.ЗаполнитьПараметры(ПечатнаяФорма, Данные); - КонецЕсли; - -КонецПроцедуры - -// Добавляет область в печатную форму из макета, при этом заменяя -// параметры в области значениями из данных объекта. -// Применяется при одиночном выводе области. -// -// Параметры -// ПечатнаяФорма - СсылкаПечатнаяФорма -// ОбластьМакета - Область -// Данные - ДанныеОбъекта -// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области -// -Процедура ПрисоединитьОбластьИЗаполнитьПараметры(знач ПечатнаяФорма, - знач ОбластьМакета, - знач Данные, - знач ПереходНаСледующуюСтроку = Истина) Экспорт - - Если ОбластьМакета <> Неопределено Тогда - ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку); - ЗаполнитьПараметры(ПечатнаяФорма, Данные) - КонецЕсли; - -КонецПроцедуры - -// Добавляет область в печатную форму из макета, при этом заменяя -// параметры в области значениями из данных объекта. -// Применяется при одиночном выводе области. -// -// Параметры -// ПечатнаяФорма - СсылкаПечатнаяФорма -// ОбластьМакета - Область - область макета -// Данные - ДанныеОбъекта (массив структур) -// ПереходНаСледСтроку - булево, требуется ли вставлять разрыв после вывода области -// -Процедура ПрисоединитьИЗаполнитьКоллекцию(знач ПечатнаяФорма, - знач ОбластьМакета, - знач Данные, - знач ПереходНаСледСтроку = Истина) Экспорт - Если ОбластьМакета = Неопределено Тогда - Возврат; - КонецЕсли; - - ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти; - - Если ПечатнаяФорма.Тип = "DOC" Тогда - Если ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда - УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьОбластьТаблицы(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда - УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьНабор(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку); - Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); - КонецЕсли; - ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда - Если ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда - УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Истина, ПереходНаСледСтроку); - ИначеЕсли ОписаниеОбласти.ТипОбласти = "Список" Тогда - УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Ложь, ПереходНаСледСтроку); - Иначе - ВызватьИсключение(НСтр("ru = 'Тип области не указан или указан не корректно'")); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -// Вставляет разрыв между строками в виде символа перевода строки -// Параметры -// ПечатнаяФорма - СсылкаПечатнаяФорма -// -Процедура ВставитьРазрывНаНовуюСтроку(знач ПечатнаяФорма) Экспорт - - Если ПечатнаяФорма.Тип = "DOC" Тогда - УправлениеПечатьюMSWordКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); - ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда - УправлениеПечатьюOOWriterКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма); - КонецЕсли; - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -// Перед выполнением команды печати проверить, был ли передан хотя бы один объект, так как -// для команд с множественным режимом использования может быть передан пустой массив. -Функция ПроверитьКоличествоПереданныхОбъектов(ПараметрКоманды) - - Если ТипЗнч(ПараметрКоманды) = Тип("Массив") И ПараметрКоманды.Количество() = 0 Тогда - Возврат Ложь; - Иначе - Возврат Истина; - КонецЕсли; - -КонецФункции - -#Если ВебКлиент Тогда -// Функция получает файл(ы) c сервера в локальный каталог на диск и возвращает -// имя каталога, в который они были сохранены -// Параметры: -// ПутьККаталогу - строка - путь к каталогу, в который должны быть сохранены файлы -// ПолучаемыеФайлы - соответствие - -// ключ - имя файла -// значение - двоичные данные файла -// -Функция ПолучитьФайлыВКаталогФайловПечати(ПутьККаталогу, ПолучаемыеФайлы) Экспорт - - ТребуетсяУстановитьКаталогПечати = Не ЗначениеЗаполнено(ПутьККаталогу); - Если Не ТребуетсяУстановитьКаталогПечати Тогда - Файл = Новый Файл(ПутьККаталогу); - Если НЕ Файл.Существует() Тогда - ТребуетсяУстановитьКаталогПечати = Истина; - КонецЕсли; - КонецЕсли; - - Если ТребуетсяУстановитьКаталогПечати Тогда - Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.НастройкаКаталогаФайловПечати"); - Если ТипЗнч(Результат) <> Тип("Строка") Тогда - Возврат Неопределено; - КонецЕсли; - ПутьККаталогу = Результат; - КонецЕсли; - - ПовторятьПечать = Истина; - - Пока ПовторятьПечать Цикл - ПовторятьПечать = Ложь; - Попытка - ФайлыВоВременномХранилище = ПолучитьАдресаФайловВоВременномХранилище(ПолучаемыеФайлы); - - ОписанияФайлов = Новый Массив; - - Для Каждого ФайлВоВременномХранилище Из ФайлыВоВременномХранилище Цикл - ОписанияФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ФайлВоВременномХранилище.Ключ,ФайлВоВременномХранилище.Значение)); - КонецЦикла; - - Если НЕ ПолучитьФайлы(ОписанияФайлов, , ПутьККаталогу, Ложь) Тогда - Возврат Неопределено; - КонецЕсли; - Исключение - СообщениеОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - Результат = ОткрытьФормуМодально("РегистрСведений.ПользовательскиеМакетыПечати.Форма.ДиалогПовтораПечати", Новый Структура("СообщениеОбОшибке", СообщениеОбОшибке)); - Если ТипЗнч(Результат) = Тип("Строка") Тогда - ПовторятьПечать = Истина; - ПутьККаталогу = Результат; - Иначе - Возврат Неопределено; - КонецЕсли; - КонецПопытки; - КонецЦикла; - - Если Прав(ПутьККаталогу, 1) <> "\" Тогда - ПутьККаталогу = ПутьККаталогу + "\"; - КонецЕсли; - - Возврат ПутьККаталогу; - -КонецФункции - -// Помещает набор двоичных данных во временное хранилище -// Параметры: -// НаборЗначений - соответствие, ключ - ключ, связанный с двоичными данными -// значение - ДвоичныеДанные -// Возвращаемое значение: -// соответствие: ключ - ключ, связанный с адресом во временном хранилище -// значение - адрес во временном хранилище -// -Функция ПолучитьАдресаФайловВоВременномХранилище(НаборЗначений) - - Результат = Новый Соответствие; - - Для Каждого КлючЗначение Из НаборЗначений Цикл - Результат.Вставить(КлючЗначение.Ключ, ПоместитьВоВременноеХранилище(КлючЗначение.Значение)); - КонецЦикла; - - Возврат Результат; - -КонецФункции -#КонецЕсли - -// Возвращает ссылки на объекты, выбранные в данный момент на форме. -Функция ОбъектыПечати(Источник) - - Результат = Новый Массив; - - Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда - ВыделенныеСтроки = Источник.ВыделенныеСтроки; - Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл - Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда - Продолжить; - КонецЕсли; - ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); - Если ТекущаяСтрока <> Неопределено Тогда - Результат.Добавить(ТекущаяСтрока.Ссылка); - КонецЕсли; - КонецЦикла; - Иначе - Результат.Добавить(Источник.Ссылка); - КонецЕсли; - - Возврат Результат; - -КонецФункции - +// Конец ИспользованиеМодальности diff --git a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl index 17415c237..005a7ceb7 100644 --- a/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/УправлениеПечатьюПереопределяемый/Module.bsl @@ -26,8 +26,4 @@ КонецПроцедуры -// Предназначена для отключения проверки соответствия печатной формы объекту. -// Для отключения необходимо присвоить параметру СтандартнаяОбработка значение Ложь. -Процедура ПередПроверкойСоответствияПечатнойФормыОбъекту(СтандартнаяОбработка) Экспорт - -КонецПроцедуры \ No newline at end of file + diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl new file mode 100644 index 000000000..cfeed5180 --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/Module.bsl @@ -0,0 +1,237 @@ +//////////////////////////////////////////////////////////////////////////////// +// Подсистема "Печать". +// +//////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. +Процедура ВыполнитьПодключаемуюКомандуПечатиПодтверждениеЗаписи(РезультатВопроса, ДополнительныеПараметры) Экспорт + + ОписаниеКоманды = ДополнительныеПараметры.ОписаниеКоманды; + Форма = ДополнительныеПараметры.Форма; + Источник = ДополнительныеПараметры.Источник; + + Если РезультатВопроса = КодВозвратаДиалога.ОК Тогда + Форма.Записать(); + Если Источник.Ссылка.Пустая() Или Форма.Модифицированность Тогда + Возврат; // запись не удалась, сообщения о причинах выводит платформа + КонецЕсли; + ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + ВыполнитьПодключаемуюКомандуПечатиПодготовкаОбъектовПечати(ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. +Процедура ВыполнитьПодключаемуюКомандуПечатиПодготовкаОбъектовПечати(ДополнительныеПараметры) + + ОбъектыПечати = ДополнительныеПараметры.Источник; + Если ТипЗнч(ОбъектыПечати) <> Тип("Массив") Тогда + ОбъектыПечати = ОбъектыПечати(ОбъектыПечати); + КонецЕсли; + + Если ОбъектыПечати.Количество() = 0 Тогда + ВызватьИсключение НСтр("ru = 'Команда не может быть выполнена для указанного объекта!'") + КонецЕсли; + + Если ДополнительныеПараметры.ОписаниеКоманды.ПроверкаПроведенияПередПечатью Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами", ЭтотОбъект, ДополнительныеПараметры); + УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов(ОписаниеОповещения, ОбъектыПечати, ДополнительныеПараметры.Форма); + Возврат; + КонецЕсли; + + ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами(ОбъектыПечати, ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. +Процедура ВыполнитьПодключаемуюКомандуПечатиПодключениеРасширенияРаботыСФайлами(ОбъектыПечати, ДополнительныеПараметры) Экспорт + + Если ОбъектыПечати.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + ДополнительныеПараметры.Вставить("ОбъектыПечати", ОбъектыПечати); + + Если ДополнительныеПараметры.ОписаниеКоманды.ТребуетсяРасширениеРаботыСФайлами Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьПодключаемуюКомандуПечатиЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения); + Возврат; + КонецЕсли; + + ВыполнитьПодключаемуюКомандуПечатиЗавершение(Истина, ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры УправлениеПечатьюКлиент.ВыполнитьПодключаемуюКомандуПечати. +Процедура ВыполнитьПодключаемуюКомандуПечатиЗавершение(РасширениеРаботыСФайламиПодключено, ДополнительныеПараметры) Экспорт + + Если Не РасширениеРаботыСФайламиПодключено Тогда + Возврат; + КонецЕсли; + + ОписаниеКоманды = ДополнительныеПараметры.ОписаниеКоманды; + Форма = ДополнительныеПараметры.Форма; + ОбъектыПечати = ДополнительныеПараметры.ОбъектыПечати; + + ОписаниеКоманды = ОбщегоНазначенияКлиентСервер.СкопироватьСтруктуру(ОписаниеКоманды); + ОписаниеКоманды.Вставить("ОбъектыПечати", ОбъектыПечати); + + Если ОписаниеКоманды.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" + И ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработкиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиент"); + МодульДополнительныеОтчетыИОбработкиКлиент.ВыполнитьНазначаемуюКомандуПечати(ОписаниеКоманды, Форма); + Возврат; + КонецЕсли; + + Если Не ПустаяСтрока(ОписаниеКоманды.Обработчик) Тогда + ОписаниеКоманды.Вставить("Форма", Форма); + ИмяОбработчика = ОписаниеКоманды.Обработчик; + Обработчик = ИмяОбработчика + "(ОписаниеКоманды)"; + Результат = Вычислить(Обработчик); + Возврат; + КонецЕсли; + + Если ОписаниеКоманды.СразуНаПринтер Тогда + УправлениеПечатьюКлиент.ВыполнитьКомандуПечатиНаПринтер(ОписаниеКоманды.МенеджерПечати, ОписаниеКоманды.Идентификатор, + ОбъектыПечати, ОписаниеКоманды.ДополнительныеПараметры); + Иначе + УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(ОписаниеКоманды.МенеджерПечати, ОписаниеКоманды.Идентификатор, + ОбъектыПечати, Форма, ОписаниеКоманды); + КонецЕсли; + +КонецПроцедуры + + +// Продолжение процедуры УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов. +Процедура ПроверитьПроведенностьДокументовДиалогПроведения(Параметры) Экспорт + + Если Параметры.НепроведенныеДокументы.Количество() = 1 Тогда + ТекстВопроса = НСтр("ru = 'Для того чтобы распечатать документ, его необходимо предварительно провести. Выполнить проведение документа и продолжить?'"); + Иначе + ТекстВопроса = НСтр("ru = 'Для того чтобы распечатать документы, их необходимо предварительно провести. Выполнить проведение документов и продолжить?'"); + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьПроведенностьДокументовПроведениеДокументов", ЭтотОбъект, Параметры); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет); + +КонецПроцедуры + +// Продолжение процедуры УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов. +Процедура ПроверитьПроведенностьДокументовПроведениеДокументов(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ДанныеОНепроведенныхДокументах = ОбщегоНазначенияВызовСервера.ПровестиДокументы(ДополнительныеПараметры.НепроведенныеДокументы); + ШаблонСообщения = НСтр("ru = 'Документ %1 не проведен: %2'"); + НепроведенныеДокументы = Новый Массив; + Для Каждого ИнформацияОДокументе Из ДанныеОНепроведенныхДокументах Цикл + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСообщения, Строка(ИнформацияОДокументе.Ссылка), + ИнформацияОДокументе.ОписаниеОшибки), ИнформацияОДокументе.Ссылка); + НепроведенныеДокументы.Добавить(ИнформацияОДокументе.Ссылка); + КонецЦикла; + ДополнительныеПараметры.Вставить("НепроведенныеДокументы", НепроведенныеДокументы); + + ПроведенныеДокументы = ОбщегоНазначенияКлиентСервер.СократитьМассив(ДополнительныеПараметры.СписокДокументов, НепроведенныеДокументы); + ДополнительныеПараметры.Вставить("ПроведенныеДокументы", ПроведенныеДокументы); + + // оповещаем открытые формы о том, что были проведены документы + ТипыПроведенныхДокументов = Новый Соответствие; + Для Каждого ПроведенныйДокумент Из ПроведенныеДокументы Цикл + ТипыПроведенныхДокументов.Вставить(ТипЗнч(ПроведенныйДокумент)); + КонецЦикла; + Для Каждого Тип Из ТипыПроведенныхДокументов Цикл + ОповеститьОбИзменении(Тип.Ключ); + КонецЦикла; + + // Если команда была вызвана из формы, то зачитываем в форму актуальную (проведенную) копию из базы. + Если ТипЗнч(ДополнительныеПараметры.Форма) = Тип("УправляемаяФорма") Тогда + Попытка + ДополнительныеПараметры.Форма.Прочитать(); + Исключение + // Если метода Прочитать нет, значит печать выполнена не из формы объекта. + КонецПопытки; + КонецЕсли; + + Если НепроведенныеДокументы.Количество() > 0 Тогда + // спрашиваем пользователя о необходимости продолжения печати при наличии непроведенных документов + ТекстДиалога = НСтр("ru = 'Не удалось провести один или несколько документов.'"); + + КнопкиДиалога = Новый СписокЗначений; + Если ПроведенныеДокументы.Количество() > 0 Тогда + ТекстДиалога = ТекстДиалога + " " + НСтр("ru = 'Продолжить?'"); + КнопкиДиалога.Добавить(КодВозвратаДиалога.Пропустить, НСтр("ru = 'Продолжить'")); + КнопкиДиалога.Добавить(КодВозвратаДиалога.Отмена); + Иначе + КнопкиДиалога.Добавить(КодВозвратаДиалога.ОК); + КонецЕсли; + + ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьПроведенностьДокументовЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(ОписаниеОповещения, ТекстДиалога, КнопкиДиалога); + Возврат; + КонецЕсли; + + ПроверитьПроведенностьДокументовЗавершение(Неопределено, ДополнительныеПараметры); + +КонецПроцедуры + +// Продолжение процедуры УправлениеПечатьюКлиент.ПроверитьПроведенностьДокументов. +Процедура ПроверитьПроведенностьДокументовЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса <> Неопределено И РезультатВопроса <> КодВозвратаДиалога.Пропустить Тогда + Возврат; + КонецЕсли; + + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОписаниеПроцедурыЗавершения, ДополнительныеПараметры.ПроведенныеДокументы); + +КонецПроцедуры + + +// Возвращает ссылки на объекты, выбранные в данный момент на форме. +Функция ОбъектыПечати(Источник) + + Результат = Новый Массив; + + Если ТипЗнч(Источник) = Тип("ТаблицаФормы") Тогда + ВыделенныеСтроки = Источник.ВыделенныеСтроки; + Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл + Если ТипЗнч(ВыделеннаяСтрока) = Тип("СтрокаГруппировкиДинамическогоСписка") Тогда + Продолжить; + КонецЕсли; + ТекущаяСтрока = Источник.ДанныеСтроки(ВыделеннаяСтрока); + Если ТекущаяСтрока <> Неопределено Тогда + Результат.Добавить(ТекущаяСтрока.Ссылка); + КонецЕсли; + КонецЦикла; + Иначе + Результат.Добавить(Источник.Ссылка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Проверяет наличие установленного расширения работы с файлами в веб-клиенте и предлагает установку в случае отсутствия. +// +// Параметры: +// ОписаниеОповещения - ОписаниеОповещения - описание процедуры, вызов которой будет произведен после проверки. +// Процедура должна содержать следующие параметры: +// Результат - (не используется); +// ДополнительныеПараметры - (не используется). +// +Процедура ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения) Экспорт + #Если ВебКлиент Тогда + ТекстСообщения = НСтр("ru = 'Для продолжения печати необходимо установить расширение работы с файлами.'"); + ОбщегоНазначенияКлиент.ПоказатьВопросОбУстановкеРасширенияРаботыСФайлами(ОписаниеОповещения, ТекстСообщения, Ложь); + Возврат; + #КонецЕсли + ВыполнитьОбработкуОповещения(ОписаниеОповещения, Истина); +КонецПроцедуры + diff --git a/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/УправлениеПечатьюСлужебныйКлиент.mdo b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/УправлениеПечатьюСлужебныйКлиент.mdo new file mode 100644 index 000000000..97534a4bb --- /dev/null +++ b/SSL/src/CommonModules/УправлениеПечатьюСлужебныйКлиент/УправлениеПечатьюСлужебныйКлиент.mdo @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361"> + <name>УправлениеПечатьюСлужебныйКлиент</name> + <synonym> + <key>ru</key> + <value>Управление печатью служебный клиент</value> + </synonym> + <clientManagedApplication>true</clientManagedApplication> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> diff --git a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl index 3496f2f77..839503eec 100644 --- a/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствами/Module.bsl @@ -203,7 +203,10 @@ // Объект - СправочникОбъект, ДокументОбъект, ... // ДанныеФормыСтруктура (по типу объекта). // -Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено) Экспорт +// ПоляНадписей - Булево - начальное значение Ложь, если указать Истина, +// то вместо полей ввода на форме будут созданы поля надписей. +// +Процедура ЗаполнитьДополнительныеРеквизитыВФорме(Форма, Объект = Неопределено, ПоляНадписей = Ложь) Экспорт Если НЕ Форма.Свойства_ИспользоватьСвойства ИЛИ НЕ Форма.Свойства_ИспользоватьДопРеквизиты Тогда @@ -351,21 +354,70 @@ Если ОписаниеСвойства.Булево И ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда Элемент.Вид = ВидПоляФормы.ПолеФлажка Иначе - Элемент.Вид = ВидПоляФормы.ПолеВвода; - Элемент.АвтоОтметкаНезаполненного = ОписаниеСвойства.ЗаполнятьОбязательно И НЕ ОписаниеСвойства.Удалено; + Если ПоляНадписей Тогда + Элемент.Вид = ВидПоляФормы.ПолеНадписи; + Элемент.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.Одинарная); + Иначе + Элемент.Вид = ВидПоляФормы.ПолеВвода; + Элемент.АвтоОтметкаНезаполненного = ОписаниеСвойства.ЗаполнятьОбязательно И НЕ ОписаниеСвойства.Удалено; + КонецЕсли; КонецЕсли; Элемент.ПутьКДанным = ОписаниеСвойства.ИмяРеквизитаЗначение; Элемент.Подсказка = ОписаниеСвойства.Свойство.Подсказка; Если ОписаниеСвойства.Свойство.МногострочноеПолеВвода > 0 Тогда - Элемент.МногострочныйРежим = Истина; - Элемент.Высота= ОписаниеСвойства.Свойство.МногострочноеПолеВвода; + Если НЕ ПоляНадписей Тогда + Элемент.МногострочныйРежим = Истина; + КонецЕсли; + Элемент.Высота = ОписаниеСвойства.Свойство.МногострочноеПолеВвода; КонецЕсли; Если НЕ ПустаяСтрока(ОписаниеСвойства.ФорматСвойства) Тогда - Элемент.Формат = ОписаниеСвойства.ФорматСвойства; - Элемент.ФорматРедактирования = ОписаниеСвойства.ФорматСвойства; + Если ПоляНадписей Тогда + Элемент.Формат = ОписаниеСвойства.ФорматСвойства; + Иначе + ФорматнаяСтрока = ""; + Массив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( + ОписаниеСвойства.ФорматСвойства, ";"); + + Для каждого Подстрока Из Массив Цикл + Если Найти(Подстрока, "ДП=") > 0 ИЛИ Найти(Подстрока, "DE=") > 0 Тогда + Продолжить; + КонецЕсли; + Если Найти(Подстрока, "ЧН=") > 0 ИЛИ Найти(Подстрока, "NZ=") > 0 Тогда + Продолжить; + КонецЕсли; + Если Найти(Подстрока, "ДФ=") > 0 ИЛИ Найти(Подстрока, "DF=") > 0 Тогда + Если Найти(Подстрока, "ддд") > 0 ИЛИ Найти(Подстрока, "ddd") > 0 Тогда + Подстрока = СтрЗаменить(Подстрока, "ддд", "дд"); + Подстрока = СтрЗаменить(Подстрока, "ddd", "dd"); + КонецЕсли; + Если Найти(Подстрока, "дддд") > 0 ИЛИ Найти(Подстрока, "dddd") > 0 Тогда + Подстрока = СтрЗаменить(Подстрока, "дддд", "дд"); + Подстрока = СтрЗаменить(Подстрока, "dddd", "dd"); + КонецЕсли; + Если Найти(Подстрока, "МММ") > 0 ИЛИ Найти(Подстрока, "MMM") > 0 Тогда + Подстрока = СтрЗаменить(Подстрока, "МММ", "ММ"); + Подстрока = СтрЗаменить(Подстрока, "MMM", "MM"); + КонецЕсли; + Если Найти(Подстрока, "ММММ") > 0 ИЛИ Найти(Подстрока, "MMMM") > 0 Тогда + Подстрока = СтрЗаменить(Подстрока, "ММММ", "ММ"); + Подстрока = СтрЗаменить(Подстрока, "MMMM", "MM"); + КонецЕсли; + КонецЕсли; + Если Найти(Подстрока, "ДЛФ=") > 0 ИЛИ Найти(Подстрока, "DLF=") > 0 Тогда + Если Найти(Подстрока, "ДД") > 0 ИЛИ Найти(Подстрока, "DD") > 0 Тогда + Подстрока = СтрЗаменить(Подстрока, "ДД", "Д"); + Подстрока = СтрЗаменить(Подстрока, "DD", "D"); + КонецЕсли; + КонецЕсли; + ФорматнаяСтрока = ФорматнаяСтрока + ?(ФорматнаяСтрока = "", "", ";") + Подстрока; + КонецЦикла; + + Элемент.Формат = ФорматнаяСтрока; + Элемент.ФорматРедактирования = ФорматнаяСтрока; + КонецЕсли; КонецЕсли; Если ОписаниеСвойства.Удалено Тогда @@ -375,10 +427,12 @@ Элемент.КнопкаОчистки = Истина; Элемент.КнопкаВыбора = Ложь; Элемент.КнопкаОткрытия = Ложь; - Элемент.КнопкаСпискаВыбора = Ложь; + Элемент.КнопкаВыпадающегоСписка = Ложь; Элемент.РедактированиеТекста = Ложь; КонецЕсли; - Иначе + + ИначеЕсли НЕ ПоляНадписей Тогда + ТипыДополнительныхЗначений = Новый Соответствие; ТипыДополнительныхЗначений.Вставить(Тип("СправочникСсылка.ЗначенияСвойствОбъектов"), Истина); ТипыДополнительныхЗначений.Вставить(Тип("СправочникСсылка.ЗначенияСвойствОбъектовИерархия"), Истина); @@ -395,7 +449,7 @@ КонецЕсли; КонецЕсли; - Если ОписаниеСвойства.ИмяРеквизитаСвойство <> "" Тогда + Если НЕ ПоляНадписей И ОписаниеСвойства.ИмяРеквизитаСвойство <> "" Тогда Связь = Новый СвязьПараметраВыбора("Отбор.Владелец", ОписаниеСвойства.ИмяРеквизитаСвойство); Связи = Новый Массив; Связи.Добавить(Связь); @@ -438,31 +492,35 @@ Значение = Форма[Строка.ИмяРеквизитаЗначение]; - Если ЗначениеЗаполнено(Значение) Тогда - Если ТипЗнч(Значение) = Тип("Булево") И Значение = Ложь Тогда - Продолжить; - КонецЕсли; + Если Значение = Неопределено Тогда + Продолжить; + КонецЕсли; + + Если Строка.ТипЗначения.Типы().Количество() = 1 + И (НЕ ЗначениеЗаполнено(Значение) Или Значение = Ложь) Тогда - Если Строка.Удалено Тогда + Продолжить; + КонецЕсли; + + Если Строка.Удалено Тогда + Если ЗначениеЗаполнено(Значение) Тогда ЗаполнитьЗначенияСвойств( ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(), СтарыеЗначения.Найти(Строка.Свойство, "Свойство")); - Продолжить; - КонецЕсли; - - НоваяСтрока = ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(); - НоваяСтрока.Свойство = Строка.Свойство; - НоваяСтрока.Значение = Значение; - - // Поддержка строк неограниченной длины. - Свойство = Строка.Свойство.ПолучитьОбъект(); - - ИспользоватьНеограниченнуюСтроку = УправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку( - Свойство.ТипЗначения, Свойство.МногострочноеПолеВвода); - - Если ИспользоватьНеограниченнуюСтроку Тогда - НоваяСтрока.ТекстоваяСтрока = Значение; КонецЕсли; + Продолжить; + КонецЕсли; + + НоваяСтрока = ОписаниеОбъекта.ДополнительныеРеквизиты.Добавить(); + НоваяСтрока.Свойство = Строка.Свойство; + НоваяСтрока.Значение = Значение; + + // Поддержка строк неограниченной длины. + ИспользоватьНеограниченнуюСтроку = УправлениеСвойствамиСлужебный.ИспользоватьНеограниченнуюСтроку( + Строка.ТипЗначения, Строка.МногострочноеПолеВвода); + + Если ИспользоватьНеограниченнуюСтроку Тогда + НоваяСтрока.ТекстоваяСтрока = Значение; КонецЕсли; КонецЦикла; @@ -801,7 +859,9 @@ // Функция ИспользоватьДопРеквизиты(ВладелецСвойств) Экспорт - Возврат ВладелецСвойств.Метаданные().ТабличныеЧасти.Найти("ДополнительныеРеквизиты") <> Неопределено; + МетаданныеВладельца = ВладелецСвойств.Метаданные(); + Возврат МетаданныеВладельца.ТабличныеЧасти.Найти("ДополнительныеРеквизиты") <> Неопределено + И МетаданныеВладельца <> Метаданные.Справочники.НаборыДополнительныхРеквизитовИСведений; КонецФункции @@ -923,17 +983,23 @@ Реквизиты.Добавить(Новый РеквизитФормы( "ИмяРеквизитаСвойство", Новый ОписаниеТипов("Строка"), ИмяОписания)); - + Реквизиты.Добавить(Новый РеквизитФормы( "Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"), ИмяОписания)); + Реквизиты.Добавить(Новый РеквизитФормы( + "ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов"), ИмяОписания)); + + Реквизиты.Добавить(Новый РеквизитФормы( + "МногострочноеПолеВвода", Новый ОписаниеТипов("Булево"), ИмяОписания)); + Реквизиты.Добавить(Новый РеквизитФормы( "Удалено", Новый ОписаниеТипов("Булево"), ИмяОписания)); Реквизиты.Добавить(Новый РеквизитФормы( "ЗаполнятьОбязательно", Новый ОписаниеТипов("Булево"), ИмяОписания)); - + Реквизиты.Добавить(Новый РеквизитФормы( "Наименование", Новый ОписаниеТипов("Строка"), ИмяОписания)); diff --git a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl index 1c62dd6a6..4037eb9b4 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиКлиент/Module.bsl @@ -7,7 +7,6 @@ // ПРОГРАММНЫЙ ИНТЕРФЕЙС // Открывает форму редактирования набора дополнительных реквизитов. -// Если наборов несколько предлагает выбрать набор. // // Параметры: // Форма - УправляемаяФорма, предварительно настроенная в процедуре @@ -20,7 +19,7 @@ Если Наборы.Количество() = 0 ИЛИ НЕ ЗначениеЗаполнено(Наборы[0].Значение) Тогда - Предупреждение( + ПоказатьПредупреждение(, НСтр("ru = 'Не удалось получить наборы дополнительных реквизитов объекта. | |Возможно у объекта не заполнены необходимые реквизиты.'")); diff --git a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl index f22de4308..45e9367ed 100644 --- a/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl +++ b/SSL/src/CommonModules/УправлениеСвойствамиСлужебный/Module.bsl @@ -23,11 +23,11 @@ СерверныеОбработчики["СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовНачальногоОбразаПланаОбмена"].Добавить( "УправлениеСвойствамиСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовОграниченийПравОбъектовМетаданных"].Добавить( "УправлениеСвойствамиСлужебный"); - СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииСвойствВидаДоступа"].Добавить( + СерверныеОбработчики["СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"].Добавить( "УправлениеСвойствамиСлужебный"); КонецЕсли; @@ -73,6 +73,67 @@ КонецПроцедуры +// Возвращает список всех свойств для объекта метаданных. +// +// Параметры: +// ВидОбъектов - Строка - полное имя объекта метаданных; +// ВидСвойств - Строка - "ДополнительныеРеквизиты" или "ДополнительныеСведения". +// +// ВозвращаемоеЗначение: +// ТаблицаЗначений - Свойство, Наименование, ТипЗначения. +// Неопределено - для указанного вида объекта нет набора свойств. +// +Функция СписокСвойствДляВидаОбъектов(ВидОбъектов, Знач ВидСвойств) Экспорт + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | НаборыСвойств.Ссылка КАК Ссылка, + | НаборыСвойств.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных + |ИЗ + | Справочник.НаборыДополнительныхРеквизитовИСведений КАК НаборыСвойств + |ГДЕ + | НаборыСвойств.Предопределенный"; + Выборка = Запрос.Выполнить().Выбрать(); + + ИмяПредопределенныхДанных = СтрЗаменить(ВидОбъектов, ".", "_"); + НаборСсылка = Неопределено; + + Пока Выборка.Следующий() Цикл + Если Выборка.ИмяПредопределенныхДанных = ИмяПредопределенныхДанных Тогда + НаборСсылка = Выборка.Ссылка; + Прервать; + КонецЕсли; + КонецЦикла; + + Если НаборСсылка = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + ТекстЗапроса = + "ВЫБРАТЬ + | ТаблицаСвойств.Свойство КАК Свойство, + | ТаблицаСвойств.Свойство.Наименование КАК Наименование, + | ТаблицаСвойств.Свойство.ТипЗначения КАК ТипЗначения + |ИЗ + | &ТаблицаСвойств КАК ТаблицаСвойств + |ГДЕ + | ТаблицаСвойств.Ссылка В ИЕРАРХИИ(&Ссылка)"; + + ПолноеИмяТаблицы = "Справочник.НаборыДополнительныхРеквизитовИСведений." + ВидСвойств; + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТаблицаСвойств", ПолноеИмяТаблицы); + + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.УстановитьПараметр("Ссылка", НаборСсылка); + + Результат = Запрос.Выполнить().Выгрузить(); + Результат.Свернуть("Свойство,Наименование,ТипЗначения"); + Результат.Сортировать("Наименование Возр"); + + Возврат Результат; + +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -657,52 +718,64 @@ // Описание - Строка, многострочная строка формата <Таблица>.<Право>.<ВидДоступа>[.Таблица объекта] // Например, Документ.ПриходнаяНакладная.Чтение.Организации // Документ.ПриходнаяНакладная.Чтение.Контрагенты -// Документ.ПриходнаяНакладная.Добавление.Организации -// Документ.ПриходнаяНакладная.Добавление.Контрагенты // Документ.ПриходнаяНакладная.Изменение.Организации // Документ.ПриходнаяНакладная.Изменение.Контрагенты // Документ.ЭлектронныеПисьма.Чтение.Объект.Документ.ЭлектронныеПисьма -// Документ.ЭлектронныеПисьма.Добавление.Объект.Документ.ЭлектронныеПисьма // Документ.ЭлектронныеПисьма.Изменение.Объект.Документ.ЭлектронныеПисьма // Документ.Файлы.Чтение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Чтение.Объект.Документ.ЭлектронноеПисьмо -// Документ.Файлы.Добавление.Объект.Справочник.ПапкиФайлов -// Документ.Файлы.Добавление.Объект.Документ.ЭлектронноеПисьмо // Документ.Файлы.Изменение.Объект.Справочник.ПапкиФайлов // Документ.Файлы.Изменение.Объект.Документ.ЭлектронноеПисьмо -// Вид доступа Объект предопределен, как литерал, его нет в предопределенных элементах -// ПланыВидовХарактеристик.ВидыДоступа. Этот вид доступа используется в шаблонах ограничений доступа, -// как "ссылка" на другой объект, по которому ограничивается таблица. -// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, которые используются -// для этого вида доступа. Т.е. перечислить типы, которые соответствующие полю, -// использованному в шаблоне ограничения доступа в паре с видом доступа "Объект". -// При перечислении типов по виду доступа "Объект" нужно перечислить только те типы поля, -// которые есть у поля РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. +// Вид доступа Объект предопределен, как литерал. Этот вид доступа используется в +// шаблонах ограничений доступа, как "ссылка" на другой объект, по которому +// ограничивается текущий объект таблицы. +// Когда вид доступа "Объект" задан, также требуется задать типы таблиц, +// которые используются для этого вида доступа. Т.е. перечислить типы, +// которые соответствуют полю, использованному в шаблоне ограничения доступа +// в паре с видом доступа "Объект". При перечислении типов по виду доступа "Объект" +// нужно перечислить только те типы поля, которые есть у поля +// РегистрыСведений.НаборыЗначенийДоступа.Объект, остальные типы лишние. // Процедура ПриЗаполненииВидовОграниченийПравОбъектовМетаданных(Описание) Экспорт - Описание = Описание + - " - |ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Чтение.ДополнительныеСведения - |РегистрСведений.ДополнительныеСведения.Чтение.ДополнительныеСведения - |РегистрСведений.ДополнительныеСведения.Изменение.ДополнительныеСведения - |"; + Если НЕ ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + Возврат; + КонецЕсли; + + МодульУправлениеДоступомСлужебный = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступомСлужебный"); + + Если МодульУправлениеДоступомСлужебный.ВидДоступаСуществует("ДополнительныеСведения") Тогда + + Описание = Описание + + " + |ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.Чтение.ДополнительныеСведения + |РегистрСведений.ДополнительныеСведения.Чтение.ДополнительныеСведения + |РегистрСведений.ДополнительныеСведения.Изменение.ДополнительныеСведения + |"; + КонецЕсли; КонецПроцедуры -// Заполняет свойства видов доступа, добавленных прикладным разработчиком -// в план видов характеристик ВидыДоступа, как предопределенные элементы. +// Заполняет виды доступа, используемые в ограничениях прав доступа. +// Виды доступа Пользователи и ВнешниеПользователи уже заполнены. +// Их можно удалить, если они не требуются для ограничения прав доступа. // // Параметры: -// Свойства - Структура со свойствами, -// описание которых см. в комментарии к функции -// ПланыВидовХарактеристик.ВидыДоступа.СвойстваВидовДоступа(). +// ВидыДоступа - ТаблицаЗначений с полями: +// - Имя - Строка - имя используемое в описании поставляемых +// профилей групп доступа и текстах ОДД. +// - Представление - Строка - представляет вид доступа в профилях и группах доступа. +// - ТипЗначений - Тип - тип ссылки значений доступа. Например, Тип("СправочникСсылка.Номенклатура"). +// - ТипГруппЗначений - Тип - тип ссылки групп значений доступа. Например, Тип("СправочникСсылка.ГруппыДоступаНоменклатуры"). +// - НесколькоГруппЗначений - Булево - Истина указывает, что для значения доступа (Номенклатуры), +// можно выбрать несколько групп значений (Групп доступа номенклатуры). // -Процедура ПриЗаполненииСвойствВидаДоступа(Знач Свойства) Экспорт +Процедура ПриЗаполненииВидовДоступа(ВидыДоступа) Экспорт - Если Свойства.ВидДоступа = ПланыВидовХарактеристик["ВидыДоступа"].ДополнительныеСведения Тогда - Свойства.Таблицы.Добавить("ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения"); - КонецЕсли; + ВидДоступа = ВидыДоступа.Добавить(); + ВидДоступа.Имя = "ДополнительныеСведения"; + ВидДоступа.Представление = НСтр("ru = 'Дополнительные сведения'"); + ВидДоступа.ТипЗначений = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"); КонецПроцедуры diff --git a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl index 394403020..6ffc42251 100644 --- a/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl +++ b/SSL/src/CommonModules/УправлениеЭлектроннойПочтой/Module.bsl @@ -11,7 +11,7 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриПолученииСпискаШаблонов"].Добавить( "УправлениеЭлектроннойПочтой"); @@ -40,6 +40,10 @@ //Выполняет процедуру отправки и получения электронных писем. Процедура ПолучениеИОтправкаЭлектронныхПисем() Экспорт + Если НЕ ПолучитьФункциональнуюОпцию("ИспользоватьПочтовыйКлиент") Тогда + Возврат; + КонецЕсли; + УстановитьПривилегированныйРежим(Истина); ЗаписьЖурналаРегистрации(СобытиеЖурналаРегистрации(), @@ -139,6 +143,7 @@ ПисьмоОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; ПисьмоОбъект.Размер = Взаимодействия.ОценитьРазмерИсходящегоЭлектронногоПисьма(ПисьмоОбъект.Ссылка); ПисьмоОбъект.ДатаОтправления = ТекущаяДатаСеанса(); + ПисьмоОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ПисьмоОбъект.Записать(РежимЗаписиДокумента.Запись); Если ВыборкаПисьма.ТребуетсяОпределениеПапки Тогда МассивПисем.Добавить(ВыборкаПисьма.Ссылка); @@ -151,7 +156,9 @@ КонецЦикла; + Взаимодействия.ЗаполнитьКонтактыМассиваВзаимодействий(МассивПисем); Взаимодействия.УстановитьПапкиДляМассиваПисем(МассивПисем); + Взаимодействия.РассчитатьРассмотреноПоКонтактам(МассивПисем); //отправим уведомления о прочтении Запрос = Новый Запрос; @@ -262,7 +269,9 @@ ПолучитьПисьма(Выборка.Ссылка, ЕстьОшибки, Получено, МассивПисем, Выборка.ПомещатьПисьмоВПапкуПисьмаОснования); ПолученоПисем = ПолученоПисем + Получено; + Взаимодействия.ЗаполнитьКонтактыМассиваВзаимодействий(МассивПисем); Взаимодействия.УстановитьПапкиДляМассиваПисем(МассивПисем); + Взаимодействия.РассчитатьРассмотреноПоКонтактам(МассивПисем); КонецЦикла; @@ -344,6 +353,7 @@ ПисьмоОбъект.СтатусПисьма = Перечисления.СтатусыИсходящегоЭлектронногоПисьма.Отправлено; ПисьмоОбъект.Размер = Взаимодействия.ОценитьРазмерИсходящегоЭлектронногоПисьма(ПисьмоОбъект.Ссылка); ПисьмоОбъект.ДатаОтправления = ТекущаяДатаСеанса(); + ПисьмоОбъект.ДополнительныеСвойства.Вставить("НеЗаписыватьКонтакты", Истина); ПисьмоОбъект.Записать(РежимЗаписиДокумента.Запись); Если ВыборкаПисьма.ТребуетсяОпределениеПапки Тогда МассивПисем.Добавить(ВыборкаПисьма.Ссылка); @@ -730,8 +740,9 @@ Письмо.Записать(); //Установим папку письма и предмет - Взаимодействия.УстановитьПредметПапкуВзаимодействия( - Письмо.Ссылка,Папка,?(ЗначениеЗаполнено(Предмет),Предмет,Письмо.Ссылка)); + СтруктураДляЗаписи = ВзаимодействияКлиентСервер.СтруктураРеквизитовВзаимодействияДляЗаписи( + Папка,?(ЗначениеЗаполнено(Предмет),Предмет,Письмо.Ссылка), , , Ложь); + ВзаимодействияВызовСервера.ЗаписьРегистрРеквизитыВзаимодействия(Письмо.Ссылка, СтруктураДляЗаписи); МассивИменВложений = Новый Массив; //Запишем вложения @@ -739,10 +750,7 @@ МассивИменВложений.Добавить(Вложение.ИмяФайла); КонецЦикла; - РасширениеДляФайловПодписи = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляФайловПодписи"); - Если РасширениеДляФайловПодписи = Неопределено ИЛИ ПустаяСтрока(РасширениеДляФайловПодписи) Тогда - РасширениеДляФайловПодписи = "p7s"; - КонецЕсли; + РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи; СоответствиеВложенийИПодписей = ФайловыеФункцииСлужебныйКлиентСервер.ПолучитьСоответствиеФайловИПодписей(МассивИменВложений, РасширениеДляФайловПодписи); @@ -1286,19 +1294,19 @@ Если ЕстьПодписи Тогда Для Каждого ПодписьВложения Из МассивПодписей Цикл - ЭЦП = ВложениеПисьмаОбъект.ЭлектронныеЦифровыеПодписи.Добавить(); + ЭП = ВложениеПисьмаОбъект.ЭлектронныеПодписи.Добавить(); - ДанныеПодписи = ЭлектроннаяЦифроваяПодпись.ПрочитатьДанныеПодписи(ПодписьВложения.Данные); + ДанныеПодписи = ЭлектроннаяПодпись.ПрочитатьДанныеПодписи(ПодписьВложения.Данные); Если ДанныеПодписи <> Неопределено Тогда - ЗаполнитьЗначенияСвойств(ЭЦП, ДанныеПодписи); + ЗаполнитьЗначенияСвойств(ЭП, ДанныеПодписи); КонецЕсли; - ЭЦП.Подпись = Новый ХранилищеЗначения(ПодписьВложения.Данные); - ЭЦП.Комментарий = НСтр("ru = 'Вложение электронного письма'"); - ЭЦП.ДатаПодписи = ТекущаяДатаСеанса(); + ЭП.Подпись = Новый ХранилищеЗначения(ПодписьВложения.Данные); + ЭП.Комментарий = НСтр("ru = 'Вложение электронного письма'"); + ЭП.ДатаПодписи = ТекущаяДатаСеанса(); КонецЦикла; - ВложениеПисьмаОбъект.ПодписанЭЦП = Истина; + ВложениеПисьмаОбъект.ПодписанЭП = Истина; КонецЕсли; @@ -1347,7 +1355,7 @@ | Файлы.ИндексКартинки, | Файлы.Размер, | Файлы.ИДФайлаЭлектронногоПисьма, - | Файлы.ПодписанЭЦП, + | Файлы.ПодписанЭП, | ВЫБОР | КОГДА Файлы.Расширение = &ПустаяСтрока | ТОГДА Файлы.Наименование @@ -1749,16 +1757,27 @@ | УчетныеЗаписиЭлектроннойПочты.Ссылка КАК УчетнаяЗапись, | УчетныеЗаписиЭлектроннойПочты.ИмяПользователя, | УчетныеЗаписиЭлектроннойПочты.АдресЭлектроннойПочты, - | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.УдалятьПисьмаПослеОтправки, ЛОЖЬ) КАК УдалятьПослеОтправки + | ЕСТЬNULL(НастройкиУчетныхЗаписейЭлектроннойПочты.УдалятьПисьмаПослеОтправки, ЛОЖЬ) КАК УдалятьПослеОтправки, + | ВЫБОР + | КОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем = &ТекущийПользователь + | И НастройкиУчетныхЗаписейЭлектроннойПочты.ПерсональнаяУчетнаяЗапись + | ТОГДА 0 + | КОГДА НастройкиУчетныхЗаписейЭлектроннойПочты.ОтветственныйЗаОбработкуПисем = &ТекущийПользователь + | ТОГДА 1 + | ИНАЧЕ 2 + | КОНЕЦ КАК ЗначениеУпорядочивания |ИЗ | Справочник.УчетныеЗаписиЭлектроннойПочты КАК УчетныеЗаписиЭлектроннойПочты | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиУчетныхЗаписейЭлектроннойПочты КАК НастройкиУчетныхЗаписейЭлектроннойПочты | ПО (НастройкиУчетныхЗаписейЭлектроннойПочты.УчетнаяЗаписьЭлектроннойПочты = УчетныеЗаписиЭлектроннойПочты.Ссылка) |ГДЕ | УчетныеЗаписиЭлектроннойПочты.ИспользоватьДляОтправки - | И НЕ НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте"; + | И НЕ НастройкиУчетныхЗаписейЭлектроннойПочты.НеИспользоватьВоВстроенномПочтовомКлиенте + | + |УПОРЯДОЧИТЬ ПО + | ЗначениеУпорядочивания"; - Запрос.УстановитьПараметр("Пользователь",Пользователи.ТекущийПользователь()); + Запрос.УстановитьПараметр("ТекущийПользователь",Пользователи.ТекущийПользователь()); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат; diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl index fbac81c3b..3aae850a4 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебный/Module.bsl @@ -114,7 +114,7 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ФайловыеФункцииСлужебный"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииИспользованияРегламентныхЗаданий"].Добавить( "ФайловыеФункцииСлужебный"); @@ -124,6 +124,16 @@ "СтандартныеПодсистемы.БазоваяФункциональность\ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем"].Добавить( "ФайловыеФункцииСлужебный"); + СерверныеОбработчики[ + "СтандартныеПодсистемы.БазоваяФункциональность\ПриПолученииОбъектовИсключенийПланаОбмена"].Добавить( + "ФайловыеФункцииСлужебный"); + + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке"].Добавить( + "ФайловыеФункцииСлужебный"); + КонецЕсли; + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -470,7 +480,7 @@ КонецФункции //////////////////////////////////////////////////////////////////////////////// -// ЭЦП для файлов +// ЭП для файлов // Проверяет подписи в строках коллекции. // @@ -487,9 +497,9 @@ УстановитьПривилегированныйРежим(Истина); - ПровайдерЭЦП = Константы.ПровайдерЭЦП.Получить(); - ПутьМодуляКриптографии = ЭлектроннаяЦифроваяПодписьПовтИсп.ПутьМодуляКриптографии(); - ТипПровайдераЭЦП = Константы.ТипПровайдераЭЦП.Получить(); + ПровайдерЭП = Константы.ПровайдерЭП.Получить(); + ПутьМодуляКриптографии = ЭлектроннаяПодписьПовтИсп.ПутьМодуляКриптографии(); + ТипПровайдераЭП = Константы.ТипПровайдераЭП.Получить(); АлгоритмПодписи = Константы.АлгоритмПодписи.Получить(); АлгоритмХеширования = Константы.АлгоритмХеширования.Получить(); АлгоритмШифрования = Константы.АлгоритмШифрования.Получить(); @@ -497,7 +507,7 @@ УстановитьПривилегированныйРежим(Ложь); МенеджерКриптографии = Новый МенеджерКриптографии( - ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + ПровайдерЭП, ПутьМодуляКриптографии, ТипПровайдераЭП); МенеджерКриптографии.АлгоритмПодписи = АлгоритмПодписи; МенеджерКриптографии.АлгоритмХеширования = АлгоритмХеширования; @@ -731,6 +741,42 @@ КонецПроцедуры +// Используется для получения объектов метаданных, которые не следует включать в состав плана обмена. +// Если подсистема имеет объекты метаданных, которые не следует включать в состав плана обмена, +// то в параметр <Объект> необходимо добавить эти объекты метаданных. +// +// Параметры: +// Объекты – Массив. Массив объектов метаданных конфигурации, которые не следует включать в состав плана обмена. +// РаспределеннаяИнформационнаяБаза (только чтение) – Булево. Признак получения объектов для плана обмена РИБ. +// Истина – требуется получить список объектов-исключений плана обмена РИБ; +// Ложь – требуется получить список для плана обмена НЕ РИБ. +// +Процедура ПриПолученииОбъектовИсключенийПланаОбмена(Объекты, Знач РаспределеннаяИнформационнаяБаза) Экспорт + + Объекты.Добавить(Метаданные.Константы.ИзвлекатьТекстыФайловНаСервере); + Объекты.Добавить(Метаданные.Константы.ХранитьФайлыВТомахНаДиске); + + Объекты.Добавить(Метаданные.Справочники.ТомаХраненияФайлов); + +КонецПроцедуры + +// Заполняет массив типов неразделенных данных, для которых не требуется сопоставление ссылок +// при загрузке данных в другую информационную базу, т.к. корректное сопоставление ссылок +// гарантируется с помощью других механизмов. +// +// Параметры: +// Типы - Массив(ОбъектМетаданных) +// +Процедура ПриЗаполненииТиповОбщихДанныхНеТребующихСопоставлениеСсылокПриЗагрузке(Типы) Экспорт + + // В процессе выгрузки данных ссылки на справочник ТомаХраненияФайлов очищаются, + // а при загрузке загрузка производится относительно настройки томов в ИБ, в которую + // производится загрузка, а не относительно настройки томов в ИБ, из которой были + // выгружены данные. + Типы.Добавить(Метаданные.Справочники.ТомаХраненияФайлов); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обмен файлами @@ -1270,7 +1316,7 @@ ДвоичныеДанныеПодписи = СтруктураВозврата.ДвоичныеДанныеПодписи; Попытка - ЭлектроннаяЦифроваяПодпись.ПроверитьПодпись( + ЭлектроннаяПодпись.ПроверитьПодпись( МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи); ДанныеСтроки.Статус = НСтр("ru = 'Верна'"); @@ -1295,8 +1341,8 @@ // Дополняет структуру, содержащую общие и персональные настройки по работе с файлами. Процедура ПриДобавленииНастроекРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); МодульРаботаСФайламиСлужебныйВызовСервера.ДобавитьНастройкиРаботыСФайлами(ОбщиеНастройки, ПерсональныеНастройки); КонецЕсли; @@ -1307,13 +1353,13 @@ РазмерФайлов = 0; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); РазмерФайлов = РазмерФайлов + МодульРаботаСФайламиСлужебныйВызовСервера.ПодсчитатьРазмерФайловНаТоме(СсылкаТома); КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда - МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрисоединенныеФайлы") Тогда + МодульПрисоединенныеФайлыСлужебный = ОбщегоНазначения.ОбщийМодуль("ПрисоединенныеФайлыСлужебный"); РазмерФайлов = РазмерФайлов + МодульПрисоединенныеФайлыСлужебный.ПодсчитатьРазмерФайловНаТоме(СсылкаТома); КонецЕсли; @@ -1328,8 +1374,8 @@ // Строка кодировки Процедура ПриОпределенииКодировкиВерсииФайла(ВерсияСсылка, Кодировка) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда - МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда + МодульРаботаСФайламиСлужебныйВызовСервера = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебныйВызовСервера"); Кодировка = МодульРаботаСФайламиСлужебныйВызовСервера.ПолучитьКодировкуВерсииФайла(ВерсияСсылка); КонецЕсли; diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl index ced14f54d..55fe4cd66 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйВМоделиСервиса/Module.bsl @@ -15,7 +15,7 @@ "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"].Добавить( "ФайловыеФункцииСлужебныйВМоделиСервиса"); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий") Тогда СерверныеОбработчики[ "СтандартныеПодсистемы.РаботаВМоделиСервиса.ОчередьЗаданий\ПриОпределенииПсевдонимовОбработчиков"].Добавить( "ФайловыеФункцииСлужебныйВМоделиСервиса"); @@ -25,6 +25,12 @@ "ФайловыеФункцииСлужебныйВМоделиСервиса"); КонецЕсли; + Если ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.ВыгрузкаЗагрузкаДанных") Тогда + СерверныеОбработчики[ + "ТехнологияСервиса.ВыгрузкаЗагрузкаДанных\ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки"].Добавить( + "ФайловыеФункцииСлужебныйВМоделиСервиса"); + КонецЕсли; + КонецПроцедуры // Обработчик события ПриОпределенииПсевдонимовОбработчиков. @@ -62,6 +68,17 @@ КонецПроцедуры +// Заполняет массив типов, исключаемых из выгрузки и загрузки данных. +// +// Параметры: +// Типы - Массив(Типы). +// +Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт + + Типы.Добавить(Метаданные.РегистрыСведений.ОчередьИзвлеченияТекста); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Стандартный программный интерфейс diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl index 05463465e..a7bee9806 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиент/Module.bsl @@ -9,72 +9,54 @@ // Показывает напоминание о порядке работы с файлом в веб-клиенте, // если включена настройка "Показывать подсказки при редактировании файлов". // -Процедура ПоказатьНапоминаниеПриРедактировании() Экспорт - +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// +Процедура ВывестиНапоминаниеПриРедактировании(ОбработчикРезультата) Экспорт ПерсональныеНастройки = ФайловыеФункцииСлужебныйКлиентСервер.ПерсональныеНастройкиРаботыСФайлами(); - Если ПерсональныеНастройки.ПоказыватьПодсказкиПриРедактированииФайлов = Истина Тогда - - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); - Если НЕ РасширениеПодключено Тогда - + Если НЕ ПодключитьРасширениеРаботыСФайлами() Тогда Форма = ФайловыеФункцииСлужебныйКлиентПовтИсп.ПолучитьФормуНапоминанияПриРедактировании(); - БольшеНеПоказывать = Форма.ОткрытьМодально(); - - Если БольшеНеПоказывать = Истина Тогда - ПоказыватьПодсказкиПриРедактированииФайлов = Ложь; - - ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранитьИОбновитьПовторноИспользуемыеЗначения( - "НастройкиПрограммы", - "ПоказыватьПодсказкиПриРедактированииФайлов", - ПоказыватьПодсказкиПриРедактированииФайлов); - КонецЕсли; + УстановитьОповещениеФормы(Форма, ОбработчикРезультата); + Форма.Открыть(); + Возврат; КонецЕсли; - КонецЕсли; - + ВернутьРезультат(ОбработчикРезультата, Неопределено); КонецПроцедуры // Показывает стандартное предупреждение. -// -// Параметры: -// ПредставлениеКоманды - Строка, если указано то будет уточнена команда, -// для которой необходимо расширение. // -Процедура ПредупредитьОНеобходимостиРасширенияРаботыСФайлами(ПредставлениеКоманды = "") Экспорт - +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПредставлениеКоманды - Строка - Необязательный. Имя команды, для выполнения которой необходимо расширение. +// +Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСФайлами(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт + ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо + |установить расширение работы с файлами.'"); Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для выполнения команды ""%1"" необходимо - |установить расширение работы с файлами.'"), - ПредставлениеКоманды)); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды); Иначе - Предупреждение(НСтр("ru = 'Для выполнения команды необходимо - |установить расширение работы с файлами.'")); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, " ""%1""", ""); КонецЕсли; - + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Неопределено); КонецПроцедуры // Показывает стандартное предупреждение. -// -// Параметры: -// ПредставлениеКоманды - Строка, если указано то будет уточнена команда, -// для которой необходимо расширение. // -Процедура ПредупредитьОНеобходимостиРасширенияРаботыСКриптографией(ПредставлениеКоманды = "") Экспорт - +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. +// ПредставлениеКоманды - Строка - Необязательный. Имя команды, для выполнения которой необходимо расширение. +// +Процедура ПоказатьПредупреждениеОНеобходимостиРасширенияРаботыСКриптографией(ОбработчикРезультата, ПредставлениеКоманды = "") Экспорт + ТекстПредупреждения = НСтр("ru = 'Для выполнения команды ""%1"" необходимо + |установить расширение работы с криптографией.'"); Если ЗначениеЗаполнено(ПредставлениеКоманды) Тогда - - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Для выполнения команды ""%1"" необходимо - |установить расширение работы с криптографией.'"), - ПредставлениеКоманды)); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, "%1", ПредставлениеКоманды); Иначе - Предупреждение(НСтр("ru = 'Для выполнения команды необходимо - |установить расширение работы с криптографией.'")); + ТекстПредупреждения = СтрЗаменить(ТекстПредупреждения, " ""%1""", ""); КонецЕсли; - + ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Неопределено); КонецПроцедуры // Возвращает путь к рабочему каталогу пользователя. @@ -126,26 +108,7 @@ // Возвращает каталог "Мои Документы". // Функция КаталогМоиДокументы() Экспорт - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Возврат Вычислить("КаталогДокументов()"); - КонецЕсли; - - #Если ВебКлиент Тогда - Возврат ""; - #Иначе - Оболочка = Новый COMОбъект("MSScriptControl.ScriptControl"); - Оболочка.Language = "vbscript"; - Оболочка.AddCode(" - |Function SpecialFoldersName(Name) - |set Shell=CreateObject(""WScript.Shell"") - |SpecialFoldersName=Shell.SpecialFolders(Name) - |End Function"); - - КаталогМоиДокументы = Оболочка.Run("SpecialFoldersName", "MyDocuments"); - Возврат ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(КаталогМоиДокументы); - #КонецЕсли - + Возврат КаталогДокументов(); КонецФункции // Показывает пользователю диалог выбора файлов и возвращает @@ -281,7 +244,7 @@ // Возвращает полный путь к файлу. Функция ПолучитьПолныйПутьКФайлуВРабочемКаталоге(ДанныеФайла) Экспорт - Возврат ДанныеФайла.ИмяФайлаСПутемВРабочемКаталоге; + Возврат ДанныеФайла.ПолноеИмяФайлаВРабочемКаталоге; КонецФункции @@ -291,68 +254,10 @@ Функция ВыбратьПутьККаталогуДанныхПользователя() Экспорт ИмяКаталога = ""; - - ВыбратьРабочийКаталогПользователя = Ложь; - -#Если Не ВебКлиент Тогда - - Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - ИмяКаталога = Вычислить("РабочийКаталогДанныхПользователя()"); - Иначе - ПараметрыРаботыКлиента = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента(); - - Если ПараметрыРаботыКлиента.ЭтоБазоваяВерсияКонфигурации Тогда - ВыбратьРабочийКаталогПользователя = Истина; - Иначе - Оболочка = Новый COMОбъект("WScript.Shell"); - Путь = Оболочка.ExpandEnvironmentStrings("%APPDATA%"); - Путь = Путь + "\1C\Файлы\"; - - Путь = Путь - + ПараметрыРаботыКлиента.ИмяКонфигурации - + ОбщегоНазначенияКлиентСервер.РазделительПути(); - - ИмяПользователя = ПользователиКлиентСервер.ТекущийПользователь(); - - ИмяКаталога = Путь + ИмяПользователя; - ИмяКаталога = СтрЗаменить(ИмяКаталога, "<", " "); - ИмяКаталога = СтрЗаменить(ИмяКаталога, ">", " "); - ИмяКаталога = СокрЛП(ИмяКаталога); - - ИмяКаталога = ИмяКаталога + ОбщегоНазначенияКлиентСервер.РазделительПути(); - КонецЕсли; - - КонецЕсли; - -#Иначе // ВебКлиент - РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); Если РасширениеПодключено Тогда - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ИмяКаталога = Вычислить("РабочийКаталогДанныхПользователя()"); - Иначе - ВыбратьРабочийКаталогПользователя = Истина; - КонецЕсли; - - КонецЕсли; - -#КонецЕсли - - Если ВыбратьРабочийКаталогПользователя Тогда - - Режим = РежимДиалогаВыбораФайла.ВыборКаталога; - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - ДиалогОткрытияФайла.ПолноеИмяФайла = ""; - ДиалогОткрытияФайла.Каталог = ""; - ДиалогОткрытияФайла.МножественныйВыбор = Ложь; - ДиалогОткрытияФайла.Заголовок = НСтр("ru = 'Выберите путь к рабочему каталогу'"); - - Если ДиалогОткрытияФайла.Выбрать() Тогда - ИмяКаталога = ДиалогОткрытияФайла.Каталог; - ИмяКаталога = ИмяКаталога + ОбщегоНазначенияКлиентСервер.РазделительПути(); - КонецЕсли; + ИмяКаталога = РабочийКаталогДанныхПользователя(); КонецЕсли; Возврат ИмяКаталога; @@ -364,19 +269,17 @@ ФайлНаДиске = Новый Файл(ПолноеИмяФайла); - Если ФайлНаДиске.Существует() Тогда - - Если Лев(ПолноеИмяФайла, 0) <> """" Тогда - ПолноеИмяФайла = """" + ПолноеИмяФайла + """"; - КонецЕсли; - - ЗапуститьПриложение("explorer.exe /select, " + ПолноеИмяФайла); - - Возврат Истина; - + Если НЕ ФайлНаДиске.Существует() Тогда + Возврат Ложь; КонецЕсли; - Возврат Ложь; + Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + ЗапуститьПриложение(ФайлНаДиске.Путь); + Иначе + ЗапуститьПриложение("explorer.exe /select, """ + ФайлНаДиске.ПолноеИмя + """"); + КонецЕсли; + + Возврат Истина; КонецФункции @@ -384,6 +287,7 @@ // если требуется уточняет у пользователя и возвращает действие. // // Параметры: +// ОбработчикРезультата - ОписаниеОповещения, Неопределено - Описание процедуры, принимающей результат работы метода. // ИмяФайлаСПутем - Строка - полное имя файла с путем в рабочем каталоге. // // ДанныеФайла - Структура со свойствами: @@ -395,17 +299,18 @@ // Строка - возможные строки: // "ОткрытьСуществующий", "ВзятьИзХранилищаИОткрыть", "Отменить". // -Функция ДействиеПриОткрытииФайлаВРабочемКаталоге(ИмяФайлаСПутем, ДанныеФайла) Экспорт +Процедура ДействиеПриОткрытииФайлаВРабочемКаталоге(ОбработчикРезультата, ИмяФайлаСПутем, ДанныеФайла) Экспорт Если ДанныеФайла.Свойство("ПутьОбновленияИзФайлаНаДиске") Тогда - Возврат "ВзятьИзХранилищаИОткрыть"; + ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); + Возврат; КонецЕсли; Параметры = Новый Структура; Параметры.Вставить("ДействиеНадФайлом", "ОткрытиеВРабочемКаталоге"); - Параметры.Вставить("ИмяФайлаСПутемВРабочемКаталоге", ИмяФайлаСПутем); + Параметры.Вставить("ПолноеИмяФайлаВРабочемКаталоге", ИмяФайлаСПутем); - Файл = Новый Файл(Параметры.ИмяФайлаСПутемВРабочемКаталоге); + Файл = Новый Файл(Параметры.ПолноеИмяФайлаВРабочемКаталоге); Параметры.Вставить("ДатаИзмененияУниверсальнаяВХранилищеФайлов", ДанныеФайла.ДатаМодификацииУниверсальная); @@ -445,7 +350,8 @@ |открыть существующий без обновления?'")); Иначе // Все совпадает - и дата, и размер. - Возврат "ОткрытьСуществующий"; + ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); + Возврат; КонецЕсли; ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге @@ -467,7 +373,8 @@ // Файл в рабочем каталоге для чтения. // Обновление из хранилища файлов без вопросов. - Возврат "ВзятьИзХранилищаИОткрыть"; + ВернутьРезультат(ОбработчикРезультата, "ВзятьИзХранилищаИОткрыть"); + Возврат; КонецЕсли; ИначеЕсли Параметры.ДатаИзмененияУниверсальнаяВРабочемКаталоге @@ -478,13 +385,15 @@ И ДанныеФайла.Редактирует = ПользователиКлиентСервер.ТекущийПользователь() Тогда // Файл в рабочем каталоге для редактирования и занят текущим пользователем. - Возврат "ОткрытьСуществующий"; + ВернутьРезультат(ОбработчикРезультата, "ОткрытьСуществующий"); + Возврат; Иначе // Файл в рабочем каталоге для чтения. Параметры.Вставить("Заголовок", НСтр("ru = 'В рабочем каталоге новый файл'")); - Параметры.Вставить("Сообщение", + Параметры.Вставить( + "Сообщение", НСтр("ru = 'Файл в рабочем каталоге имеет более позднюю дату изменения (новее), |чем в хранилище файлов. Возможно, он был изменен. | @@ -494,9 +403,9 @@ КонецЕсли; //ВыборДействияПриОбнаруженииОтличийФайла - Возврат ОткрытьФормуМодально("ОбщаяФорма.ВыборДействияПриОбнаруженииОтличийФайла", Параметры); + ОткрытьФорму("ОбщаяФорма.ВыборДействияПриОбнаруженииОтличийФайла", Параметры, , , , , ОбработчикРезультата, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс); -КонецФункции +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ @@ -540,11 +449,10 @@ ТекстовыйФайл.Записать(Текст); ТекстовыйФайл.Закрыть(); - ПоместитьФайл(АдресВременногоХранилищаТекста, - ИмяВременногоФайла, - , - Ложь, - УникальныйИдентификатор); + РезультатЗагрузки = ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); + Если РезультатЗагрузки <> Неопределено Тогда + АдресВременногоХранилищаТекста = РезультатЗагрузки; + КонецЕсли; УдалитьФайлы(ИмяВременногоФайла); КонецЕсли; @@ -563,3 +471,60 @@ КонецПроцедуры #КонецЕсли + +// Загружает файл с клиента во временное хранилище на сервере. Не работает без расширения работы с файлами. +Функция ПоместитьФайлСДискаВоВременноеХранилище(ПолноеИмяФайла, АдресФайла = "", УникальныйИдентификатор = Неопределено) Экспорт + Если Не ПодключитьРасширениеРаботыСФайлами() Тогда + Возврат Неопределено; + КонецЕсли; + ЧтоЗагрузить = Новый Массив; + ЧтоЗагрузить.Добавить(Новый ОписаниеПередаваемогоФайла(ПолноеИмяФайла, АдресФайла)); + РезультатЗагрузки = Новый Массив; + ФайлЗагружен = ПоместитьФайлы(ЧтоЗагрузить, РезультатЗагрузки, , Ложь, УникальныйИдентификатор); + Если Не ФайлЗагружен Или РезультатЗагрузки.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + Возврат РезультатЗагрузки[0].Хранение; +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Вспомогательные процедуры для поддержки асинхронной модели. +// +// Общее описание параметров: +// ОбработчикРезультата - Процедура-обработчик асинхронного метода. +// - Неопределено - Обработка не требуется. +// - ОписаниеОповещения - Описание процедуры-обработчика. +// Результат - * - Значение, которое необходимо вернуть в ОбработчикРезультата. + +// Показывает текст и вызывает обработчик с заданным результатом. +Процедура ВернутьРезультатПослеПоказаПредупреждения(ОбработчикРезультата, ТекстПредупреждения, Результат) Экспорт + Если ТипЗнч(ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда + ПараметрыОбработчика = Новый Структура; + ПараметрыОбработчика.Вставить("ОбработчикРезультата", ОбработчикРезультата); + ПараметрыОбработчика.Вставить("Результат", Результат); + Обработчик = Новый ОписаниеОповещения("ВернутьРезультатПослеЗакрытияПростогоДиалога", ЭтотОбъект, ПараметрыОбработчика); + ПоказатьПредупреждение(Обработчик, ТекстПредупреждения); + Иначе + ПоказатьПредупреждение(, ТекстПредупреждения); + КонецЕсли; +КонецПроцедуры + +// Обработчик результата работы процедуры ВернутьРезультатПослеПоказаПредупреждения. +Процедура ВернутьРезультатПослеЗакрытияПростогоДиалога(Структура) Экспорт + ВыполнитьОбработкуОповещения(Структура.ОбработчикРезультата, Структура.Результат); +КонецПроцедуры + +// Возвращает результат прямого вызова, когда не потребовалось открывать диалог. +Процедура ВернутьРезультат(ОбработчикРезультата, Результат) Экспорт + Если ТипЗнч(ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда + ВыполнитьОбработкуОповещения(ОбработчикРезультата, Результат); + КонецЕсли; +КонецПроцедуры + +// Устанавливает обработчик закрытия окна формы, полученной при помощи метода ПолучитьФорму. +Процедура УстановитьОповещениеФормы(Форма, ОбработчикРезультата) + Если ТипЗнч(ОбработчикРезультата) = Тип("ОписаниеОповещения") Тогда + Форма.ОписаниеОповещенияОЗакрытии = ОбработчикРезультата; + КонецЕсли; +КонецПроцедуры + diff --git a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl index 762985ea4..41de50e42 100644 --- a/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ФайловыеФункцииСлужебныйКлиентСервер/Module.bsl @@ -88,28 +88,31 @@ АдресВременногоХранилища = ""; -#Если Не ВебКлиент Тогда - - Текст = ИзвлечьТекст(ПолноеИмяФайла, Отказ, Кодировка); - - Если ПустаяСтрока(Текст) Тогда - Возврат ""; - КонецЕсли; - - ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); - ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); - ТекстовыйФайл.Записать(Текст); - ТекстовыйФайл.Закрыть(); - -#Если Клиент Тогда - ПоместитьФайл(АдресВременногоХранилища, ИмяВременногоФайла, , Ложь, УникальныйИдентификатор); -#Иначе - Возврат Текст; -#КонецЕсли - - УдалитьФайлы(ИмяВременногоФайла); - -#КонецЕсли + #Если Не ВебКлиент Тогда + + Текст = ИзвлечьТекст(ПолноеИмяФайла, Отказ, Кодировка); + + Если ПустаяСтрока(Текст) Тогда + Возврат ""; + КонецЕсли; + + ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); + ТекстовыйФайл = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.UTF8); + ТекстовыйФайл.Записать(Текст); + ТекстовыйФайл.Закрыть(); + + #Если Клиент Тогда + РезультатЗагрузки = ФайловыеФункцииСлужебныйКлиент.ПоместитьФайлСДискаВоВременноеХранилище(ИмяВременногоФайла, , УникальныйИдентификатор); + Если РезультатЗагрузки <> Неопределено Тогда + АдресВременногоХранилища = РезультатЗагрузки; + КонецЕсли; + #Иначе + Возврат Текст; + #КонецЕсли + + УдалитьФайлы(ИмяВременногоФайла); + + #КонецЕсли Возврат АдресВременногоХранилища; diff --git a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl index 6a59938ef..0703793de 100644 --- a/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ФизическиеЛицаКлиентСервер/Module.bsl @@ -123,14 +123,14 @@ Возврат Ложь; ИначеЕсли СтрДлина(ЧастьСерии2) <> 2 Или Не ПустаяСтрока(СтроковыеФункцииКлиентСервер.ЗаменитьОдниСимволыДругими("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", ЧастьСерии2, " ")) Тогда - ТекстОшибки = НСтр("ru = 'После разделителя ""-"" в серии документа должны быть ДВЕ русские заглавные буквы.'"); + ТекстОшибки = НСтр("ru = 'После разделителя ""-"" в серии документа должны быть ДВЕ pусcкие заглавные буквы.'"); Возврат Ложь; КонецЕсли; ИначеЕсли ТипДокумента = 2 Тогда // серия - две буквы: военный билет, ... Если СтрДлина(Серия) <> 2 Или Не ПустаяСтрока(СтроковыеФункцииКлиентСервер.ЗаменитьОдниСимволыДругими("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", Серия, " ")) Тогда - ТекстОшибки = НСтр("ru = 'В серии документа должны быть ДВЕ русские заглавные буквы.'"); + ТекстОшибки = НСтр("ru = 'В серии документа должны быть ДВЕ pусcкие заглавные буквы.'"); Возврат Ложь; КонецЕсли; @@ -238,7 +238,12 @@ СтруктураФИО.Вставить("Имя", МассивПодстрок[1]); КонецЕсли; Если МассивПодстрок.Количество() > 2 Тогда - СтруктураФИО.Вставить("Отчество", МассивПодстрок[2]); + Отчество = ""; + Для Шаг = 2 По МассивПодстрок.Количество()-1 Цикл + Отчество = Отчество + МассивПодстрок[Шаг] + " "; + КонецЦикла; + СтроковыеФункцииКлиентСервер.УдалитьПоследнийСимволВСтроке(Отчество, 1); + СтруктураФИО.Вставить("Отчество", Отчество); КонецЕсли; КонецЕсли; diff --git a/SSL/src/CommonModules/ФормаОтчетаКлиентПереопределяемый/Module.bsl b/SSL/src/CommonModules/ФормаОтчетаКлиентПереопределяемый/Module.bsl index 015ff0116..fcbc2eb11 100644 --- a/SSL/src/CommonModules/ФормаОтчетаКлиентПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ФормаОтчетаКлиентПереопределяемый/Module.bsl @@ -9,58 +9,73 @@ // Обработчик расшифровки табличного документа формы отчета. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Элемент (ПолеФормы) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение поля формы для поля табличного документа" в справке. +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// Элемент - ПолеФормы - Табличный документ. +// Расшифровка - Передается из параметров обработчика "как есть". +// СтандартнаяОбработка - Передается из параметров обработчика "как есть". // -Процедура ОбработкаРасшифровки(ЭтаФорма, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт +// См. также: +// "Расширение поля формы для поля табличного документа.ОбработкаРасшифровки" в синтакс-помощнике. +// +Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт КонецПроцедуры // Обработчик дополнительной расшифровки (меню табличного документа формы отчета). // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Элемент (ПолеФормы) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение поля формы для поля табличного документа" в справке. +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// Элемент - ПолеФормы - Табличный документ. +// Расшифровка - Передается из параметров обработчика "как есть". +// СтандартнаяОбработка - Передается из параметров обработчика "как есть". // -Процедура ОбработкаДополнительнойРасшифровки(ЭтаФорма, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт +// См. также: +// "Расширение поля формы для поля табличного документа.ОбработкаДополнительнойРасшифровки" в синтакс-помощнике. +// +Процедура ОбработкаДополнительнойРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт КонецПроцедуры -// Обработчик команд, добавленных динамически. +// Обработчик команд, добавленных динамически и подключенных к обработчику "Подключаемый_Команда". // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма отчета. -// Команда (КомандаФормы) Команда, которая была вызвана. -// Результат (Булево) Истина, если вызов команды обработан. +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// Команда - КомандаФормы - Команда, которая была вызвана. +// Результат - Булево - Истина, если вызов команды обработан. // -Процедура ОбработчикКоманды(ЭтаФорма, Команда, Результат) Экспорт +// Вспомогательные методы: +// ОбщаяФорма.ФормаОтчета.ВыполнитьКонтекстныйВызовСервера() -> ФормаОтчетаПереопределяемый.КонтекстныйВызовСервера(). +// +Процедура ОбработчикКоманды(ФормаОтчета, Команда, Результат) Экспорт КонецПроцедуры // Обработчик результата выбора подчиненной формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма отчета. -// ВыбранноеЗначение (*) Результат выбора в подчиненной форме. -// ИсточникВыбора (УправляемаяФорма) Форма, где осуществлен выбор. -// Результат (Булево) Истина, если результат выбора обработан. +// ФормаОтчета - УправляемаяФорма - Форма отчета. +// ВыбранноеЗначение - Произвольное значение - Результат выбора в подчиненной форме. +// ИсточникВыбора - УправляемаяФорма - Форма, где осуществлен выбор. +// Результат - Булево - Истина, если результат выбора обработан. // -Процедура ОбработкаВыбора(ЭтаФорма,ВыбранноеЗначение, ИсточникВыбора, Результат) Экспорт +// См. также: +// "УправляемаяФорма.ОбработкаВыбора" в синтакс-помощнике. +// +Процедура ОбработкаВыбора(ФормаОтчета, ВыбранноеЗначение, ИсточникВыбора, Результат) Экспорт КонецПроцедуры // Обработчик широковещательного оповещения формы отчета. // // Параметры: -// ЭтаФорма (УправляемаяФорма) Форма отчета. -// Остальные параметры передаются из параметров обработчика "как есть", -// см. "УправляемаяФорма.ОбработкаОповещения" в синтакс-помощнике. +// ЭтаФорма - УправляемаяФорма - Форма отчета. +// ИмяСобытия - Передается из параметров обработчика "как есть". +// Параметр - Передается из параметров обработчика "как есть". +// Источник - Передается из параметров обработчика "как есть". +// +// См. также: +// "УправляемаяФорма.ОбработкаОповещения" в синтакс-помощнике. // Процедура ОбработкаОповещения(ЭтаФорма, ИмяСобытия, Параметр, Источник) Экспорт КонецПроцедуры - diff --git a/SSL/src/CommonModules/ФормаОтчетаПереопределяемый/Module.bsl b/SSL/src/CommonModules/ФормаОтчетаПереопределяемый/Module.bsl index fbe20dfad..16075a5b1 100644 --- a/SSL/src/CommonModules/ФормаОтчетаПереопределяемый/Module.bsl +++ b/SSL/src/CommonModules/ФормаОтчетаПереопределяемый/Module.bsl @@ -10,10 +10,10 @@ // конфигурации, которые будут использоваться для связи настроек отчетов. // // Параметры: -// СвязиОбъектовМетаданных (ТаблицаЗначений) -// |- ПодчиненныйРеквизит (Строка) Имя реквизита подчиненного объекта метаданных -// |- ПодчиненныйТип (Тип) Тип подчиненного объекта метаданных -// |- ВедущийТип (Тип) Тип ведущего объекта метаданных +// СвязиОбъектовМетаданных - ТаблицаЗначений - Таблица связей. +// * ПодчиненныйРеквизит - Строка - Имя реквизита подчиненного объекта метаданных. +// * ПодчиненныйТип - Тип - Тип подчиненного объекта метаданных. +// * ВедущийТип - Тип - Тип ведущего объекта метаданных. // Процедура ДополнитьСвязиОбъектовМетаданных(СвязиОбъектовМетаданных) Экспорт @@ -24,77 +24,99 @@ // Вызывается в одноименном обработчике формы отчета после выполнения кода формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "УправляемаяФорма" в справке. +// Форма - УправляемаяФорма - Форма отчета. +// Отказ - Передается из параметров обработчика "как есть". +// СтандартнаяОбработка - Передается из параметров обработчика "как есть". // -Процедура ПриСозданииНаСервере(ЭтаФорма, Отказ, СтандартнаяОбработка) Экспорт +// См. также: +// "УправляемаяФорма.ПриСозданииНаСервере" в синтакс-помощнике. +// +Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт + + КонецПроцедуры // Вызывается в обработчике "ПриЗагрузкеВариантаНаСервере" формы отчета до выполнения кода формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение управляемой формы для отчета" в справке. +// Форма - УправляемаяФорма - Форма отчета. +// НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек. // -Процедура ПередЗагрузкойВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт +// См. также: +// "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс-помощнике. +// +Процедура ПередЗагрузкойВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт КонецПроцедуры // Вызывается в одноименном обработчике формы отчета после выполнения кода формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение управляемой формы для отчета" в справке. +// Форма - УправляемаяФорма - Форма отчета. +// НовыеНастройкиКД - НастройкиКомпоновкиДанных - Настройки для загрузки в компоновщик настроек. // -Процедура ПриЗагрузкеВариантаНаСервере(ЭтаФорма, НовыеНастройкиКД) Экспорт +// См. также: +// "Расширение управляемой формы для отчета.ПриЗагрузкеВариантаНаСервере" в синтакс-помощнике. +// +Процедура ПриЗагрузкеВариантаНаСервере(Форма, НовыеНастройкиКД) Экспорт + КонецПроцедуры -// Вызывается в обработчике "ПриЗагрузкеПользовательскихНастроекНаСервере" -// формы отчета до выполнения кода формы. +// Вызывается в обработчике "ПриЗагрузкеПользовательскихНастроекНаСервере" формы отчета до выполнения кода формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение управляемой формы для отчета" в справке. +// Форма - УправляемаяФорма - Форма отчета. +// НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных - +// Пользовательские настройки для загрузки в компоновщик настроек. // -Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(ЭтаФорма, НовыеПользовательскиеНастройкиКД) Экспорт +// См. также: +// "Расширение управляемой формы для отчета.ПриЗагрузкеПользовательскихНастроекНаСервере" в синтакс-помощнике. +// +Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт КонецПроцедуры // Вызывается в одноименном обработчике формы отчета после выполнения кода формы. // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Остальные параметры передаются из параметров обработчика "как есть", -// см. события для "Расширение управляемой формы для отчета" в справке. +// Форма - УправляемаяФорма - Форма отчета. +// НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных - +// Пользовательские настройки для загрузки в компоновщик настроек. // -Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(ЭтаФорма, НовыеПользовательскиеНастройкиКД) Экспорт +// См. также: +// "Расширение управляемой формы для отчета.ПриЗагрузкеПользовательскихНастроекНаСервере" в синтакс-помощнике. +// +Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Форма, НовыеПользовательскиеНастройкиКД) Экспорт + + КонецПроцедуры // Вызывается после перезаполнения панели быстрых настроек. // // Параметры: -// ЭтаФорма (УправляемаяФорма) +// Форма - УправляемаяФорма - Форма отчета. // -Процедура ПослеЗаполненияПанелиБыстрыхНастроек(ЭтаФорма) Экспорт +Процедура ПослеЗаполненияПанелиБыстрыхНастроек(Форма) Экспорт КонецПроцедуры // Обработчик контекстного вызова сервера. +// Позволяет выполнить контекстный вызов сервера когда это требуется из клиентского общего модуля. +// Например, из ФормаОтчетаКлиентПереопределяемый.ОбработчикКоманды(). // // Параметры: -// ЭтаФорма (УправляемаяФорма) -// Ключ (Строка) Ключ операции, которую необходимо выполнить в контекстном вызове. -// Параметры (Структура) Параметры вызова сервера. -// Результат (Структура) Результат работы сервера, возвращается на клиент. +// Форма - УправляемаяФорма +// Ключ - Строка - Ключ операции, которую необходимо выполнить в контекстном вызове. +// Параметры - Структура - Параметры вызова сервера. +// Результат - Структура - Результат работы сервера, возвращается на клиент. // -Процедура КонтекстныйВызовСервера(ЭтаФорма, Ключ, Параметры, Результат) Экспорт +// См. также: +// ОбщаяФорма.ФормаОтчета.ВыполнитьКонтекстныйВызовСервера(). +// +Процедура КонтекстныйВызовСервера(Форма, Ключ, Параметры, Результат) Экспорт КонецПроцедуры diff --git a/SSL/src/CommonModules/ФункцииОтчетовКлиентСервер/Module.bsl b/SSL/src/CommonModules/ФункцииОтчетовКлиентСервер/Module.bsl index 8e83e48e0..4c4be1818 100644 --- a/SSL/src/CommonModules/ФункцииОтчетовКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ФункцииОтчетовКлиентСервер/Module.bsl @@ -9,11 +9,11 @@ // Формирует настройки отчета по умолчанию. // // Возвращаемое значение: -// Настройки (Структура) -// |- СоответствиеПериодичностиПараметров (Соответствие) -// |- Ключ (ПараметрКомпоновкиДанных) -// |- Значение (ПеречислениеСсылка.ДоступныеПериодыОтчета) -// |- ПараметрыПечатиПоУмолчанию (Структура) +// Настройки - Структура - Настройки отчета. +// * СоответствиеПериодичностиПараметров - Соответствие - Настройки полей ввода периодов. +// ** Ключ - ПараметрКомпоновкиДанных - Параметр отчета. +// ** Значение - ПеречислениеСсылка.ДоступныеПериодыОтчета - Доступный период. +// * ПараметрыПечатиПоУмолчанию - Структура - Параметры печати табличного документа "по умолчанию". // Функция ПолучитьНастройкиОтчетаПоУмолчанию() Экспорт @@ -39,10 +39,10 @@ // Формирует краткое представление ошибки. // // Параметры: -// ИнформацияОбОшибке (ИнформацияОбОшибке) +// ИнформацияОбОшибке - ИнформацияОбОшибке - Информация об ошибке. // // Возвращаемое значение: -// (Строка) +// Строка - Краткое представление ошибки. // Функция КраткоеПредставлениеОшибкиФормированияОтчета(ИнформацияОбОшибке) Экспорт @@ -63,34 +63,42 @@ // Находит доступную настройку для отбора или параметра. // // Параметры: -// НастройкиКД (НастройкиКомпоновкиДанных) -// ОбщаяНастройка (ЭлементОтбораКомпоновкиДанных, ЗначениеПараметраНастроекКомпоновкиДанных) -// ТипОбщейНастройки (Тип) +// НастройкиКД - НастройкиКомпоновкиДанных - Коллекции настроек. +// ОбщаяНастройка - ЭлементОтбораКомпоновкиДанных, ЗначениеПараметраНастроекКомпоновкиДанных, +// НастройкиВложенногоОбъектаКомпоновкиДанных - Значение элемента настройки. // -Функция НайтиДоступнуюНастройку(НастройкиКД, ОбщаяНастройка, ЭтоОтбор = Неопределено) Экспорт - Если ЭтоОтбор = Неопределено Тогда - ТипОбщейНастройки = ТипЗнч(ОбщаяНастройка); - Если ТипОбщейНастройки = Тип("ЭлементОтбораКомпоновкиДанных") Тогда - ЭтоОтбор = Истина; - ИначеЕсли ТипОбщейНастройки = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда - ЭтоОтбор = Ложь; - ИначеЕсли ТипОбщейНастройки = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда - Возврат НастройкиКД.ДоступныеОбъекты.Элементы.Найти(ОбщаяНастройка.ИдентификаторОбъекта); - Иначе - Возврат Неопределено; - КонецЕсли; +// Возвращаемое значение: +// ДоступноеПолеКомпоновкиДанных, ДоступныйПараметрКомпоновкиДанных, ДоступныйОбъектНастройкиКомпоновкиДанных - Доступная настройка. +// Неопределено - Если доступная настройка не найдена. +// +Функция НайтиДоступнуюНастройку(НастройкиКД, ОбщаяНастройка) Экспорт + ТипОбщейНастройки = ТипЗнч(ОбщаяНастройка); + Если ТипОбщейНастройки = Тип("ЭлементОтбораКомпоновкиДанных") Тогда + Возврат НайтиДоступноеПолеКД(НастройкиКД, ОбщаяНастройка.ЛевоеЗначение); + ИначеЕсли ТипОбщейНастройки = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда + Возврат НайтиДоступныйПараметрКД(НастройкиКД, ОбщаяНастройка.Параметр); + ИначеЕсли ТипОбщейНастройки = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда + Возврат НастройкиКД.ДоступныеОбъекты.Элементы.Найти(ОбщаяНастройка.ИдентификаторОбъекта); КонецЕсли; - Если ЭтоОтбор Тогда - ДоступнаяНастройка = НастройкиКД.ДоступныеПоляОтбора.НайтиПоле(ОбщаяНастройка.ЛевоеЗначение); - Иначе - Если НастройкиКД.ПараметрыДанных.ДоступныеПараметры = Неопределено Тогда - ДоступнаяНастройка = Неопределено; // Настройки, которым принадлежат параметры данных, не связаны с источником доступных настроек. - Иначе - ДоступнаяНастройка = НастройкиКД.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(ОбщаяНастройка.Параметр); - КонецЕсли; + Возврат Неопределено; +КонецФункции + +// Находит доступную настройку поля компоновки данных. +// +// Параметры: +// НастройкиКД - НастройкиКомпоновкиДанных - Коллекции настроек. +// ПолеКД - ПолеКомпоновкиДанных - Имя поля. +// +// Возвращаемое значение: +// ДоступноеПолеКомпоновкиДанных, Неопределено - Доступная настройка для поля. +// +Функция НайтиДоступноеПолеКД(НастройкиКД, ПолеКД) Экспорт + Если ПолеКД = Неопределено Тогда + Возврат Неопределено; КонецЕсли; + ДоступнаяНастройка = НастройкиКД.ДоступныеПоляОтбора.НайтиПоле(ПолеКД); Если ДоступнаяНастройка <> Неопределено Тогда Возврат ДоступнаяНастройка; КонецЕсли; @@ -98,38 +106,90 @@ МассивСтруктур = Новый Массив; МассивСтруктур.Добавить(НастройкиКД.Структура); Пока МассивСтруктур.Количество() > 0 Цикл + СтруктураКД = МассивСтруктур[0]; МассивСтруктур.Удалить(0); + Для Каждого ЭлементСтруктурыКД Из СтруктураКД Цикл Если ТипЗнч(ЭлементСтруктурыКД) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда - Если ЭтоОтбор Тогда - ДоступнаяНастройка = ЭлементСтруктурыКД.Настройки.ДоступныеПоляОтбора.НайтиПоле(ОбщаяНастройка.ЛевоеЗначение); - Иначе - Если ЭлементСтруктурыКД.Настройки.ПараметрыДанных.ДоступныеПараметры = Неопределено Тогда - ДоступнаяНастройка = Неопределено; // Настройки, которым принадлежат параметры данных, не связаны с источником доступных настроек. - Иначе - ДоступнаяНастройка = ЭлементСтруктурыКД.Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(ОбщаяНастройка.Параметр); - КонецЕсли; - КонецЕсли; + ДоступнаяНастройка = ЭлементСтруктурыКД.Настройки.ДоступныеПоляОтбора.НайтиПоле(ПолеКД); Если ДоступнаяНастройка <> Неопределено Тогда Возврат ДоступнаяНастройка; КонецЕсли; МассивСтруктур.Добавить(ЭлементСтруктурыКД.Настройки.Структура); + ИначеЕсли ТипЗнч(ЭлементСтруктурыКД) = Тип("ГруппировкаКомпоновкиДанных") Тогда - Если ЭтоОтбор Тогда - ДоступнаяНастройка = ЭлементСтруктурыКД.Отбор.ДоступныеПоляОтбора.НайтиПоле(ОбщаяНастройка.ЛевоеЗначение); + + ДоступнаяНастройка = ЭлементСтруктурыКД.Отбор.ДоступныеПоляОтбора.НайтиПоле(ПолеКД); + Если ДоступнаяНастройка <> Неопределено Тогда + Возврат ДоступнаяНастройка; + КонецЕсли; + + МассивСтруктур.Добавить(ЭлементСтруктурыКД.Структура); + + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Возврат Неопределено; +КонецФункции + +// Находит доступную настройку параметра компоновки данных. +// +// Параметры: +// НастройкиКД - НастройкиКомпоновкиДанных - Коллекции настроек. +// ПараметрКД - ПараметрКомпоновкиДанных - Имя параметра. +// +// Возвращаемое значение: +// ДоступныйПараметрКомпоновкиДанных, Неопределено - Доступная настройка для параметра. +// +Функция НайтиДоступныйПараметрКД(НастройкиКД, ПараметрКД) Экспорт + Если ПараметрКД = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если НастройкиКД.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда + // Настройки, которым принадлежат параметры данных, связаны с источником доступных настроек. + ДоступнаяНастройка = НастройкиКД.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(ПараметрКД); + Если ДоступнаяНастройка <> Неопределено Тогда + Возврат ДоступнаяНастройка; + КонецЕсли; + КонецЕсли; + + МассивСтруктур = Новый Массив; + МассивСтруктур.Добавить(НастройкиКД.Структура); + Пока МассивСтруктур.Количество() > 0 Цикл + + СтруктураКД = МассивСтруктур[0]; + МассивСтруктур.Удалить(0); + + Для Каждого ЭлементСтруктурыКД Из СтруктураКД Цикл + + Если ТипЗнч(ЭлементСтруктурыКД) = Тип("НастройкиВложенногоОбъектаКомпоновкиДанных") Тогда + + Если ЭлементСтруктурыКД.Настройки.ПараметрыДанных.ДоступныеПараметры <> Неопределено Тогда + // Настройки, которым принадлежат параметры данных, связаны с источником доступных настроек. + ДоступнаяНастройка = ЭлементСтруктурыКД.Настройки.ПараметрыДанных.ДоступныеПараметры.НайтиПараметр(ПараметрКД); Если ДоступнаяНастройка <> Неопределено Тогда Возврат ДоступнаяНастройка; КонецЕсли; КонецЕсли; + МассивСтруктур.Добавить(ЭлементСтруктурыКД.Настройки.Структура); + + ИначеЕсли ТипЗнч(ЭлементСтруктурыКД) = Тип("ГруппировкаКомпоновкиДанных") Тогда + МассивСтруктур.Добавить(ЭлементСтруктурыКД.Структура); + КонецЕсли; КонецЦикла; + КонецЦикла; Возврат Неопределено; @@ -138,8 +198,8 @@ // Находит пользовательскую настройку по ее идентификатору. // // Параметры: -// ПользовательскиеНастройкиКД (ПользовательскиеНастройкиКомпоновкиДанных) -// Идентификатор (Строка) +// ПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных - Коллекция пользовательских настроек. +// Идентификатор - Строка - // Функция НайтиПользовательскуюНастройку(ПользовательскиеНастройкиКД, Идентификатор) Экспорт Для Каждого ПользовательскаяНастройка Из ПользовательскиеНастройкиКД.Элементы Цикл @@ -152,7 +212,6 @@ КонецФункции // Находит вложенную пользовательскую настройку по ее идентификатору. -// Функция НайтиВложеннуюПользовательскуюНастройку(ПользовательскаяНастройка, Идентификатор) Экспорт Для Каждого ВложеннаяНастройка Из ПользовательскаяНастройка.Элементы Цикл @@ -173,8 +232,8 @@ // Находит общую настройку по идентификатору пользовательской настройки. // // Параметры: -// Настройки (НастройкиКомпоновкиДанных) -// ИдентификаторПользовательскойНастройки (Строка) +// Настройки - НастройкиКомпоновкиДанных - Коллекции настроек. +// ИдентификаторПользовательскойНастройки - Строка - // Функция ПолучитьОбъектПоПользовательскомуИдентификатору(Настройки, ИдентификаторПользовательскойНастройки) Экспорт @@ -322,7 +381,6 @@ КонецФункции // Загружает значения элемента настроек в таблицу. -// Процедура ДобавитьЭлементыНастройки(ФормаОтчета, Таблица, ЭлементНастройки, ЭлементВыбора, ДобавлятьИерархическиеПоля, Отступ = "") Экспорт Для каждого ПолеВыбора Из ЭлементВыбора.Элементы Цикл @@ -350,7 +408,6 @@ КонецПроцедуры // Возвращает список периодов в диапазоне периода. -// Функция ПолучитьСтруктуруОтборов(ФормаОтчета, КомпоновщикНастроек, СтрокаИдентификатора, ТипОтбора = Неопределено, СтрокаТипаОтбора = Неопределено) Экспорт СтруктураПараметров = Новый Структура(); @@ -404,12 +461,13 @@ // Добавляет выбранное поле компоновки данных. // // Параметры: -// Куда (КомпоновщикНастроекКомпоновкиДанных, НастройкиКомпоновкиДанных, ВыбранныеПоляКомпоновкиДанных) -// ИмяИлиПолеКД (Строка, ПолеКомпоновкиДанных) -// Заголовок (Строка) Необязательный. +// Куда - КомпоновщикНастроекКомпоновкиДанных, НастройкиКомпоновкиДанных, ВыбранныеПоляКомпоновкиДанных - +// Коллекция в которую требуется добавить выбранное поле. +// ИмяИлиПолеКД - Строка, ПолеКомпоновкиДанных - Имя поля. +// Заголовок - Строка - Необязательный. Представление поля. // // Возвращаемое значение: -// (ВыбранноеПолеКомпоновкиДанных) +// ВыбранноеПолеКомпоновкиДанных - Добавленное выбранное поле. // Функция ДобавитьВыбранноеПоле(Куда, ИмяИлиПолеКД, Заголовок = "") Экспорт @@ -466,16 +524,17 @@ КонецФункции // Находит пользовательскую настройку по имени параметра. -// Если пользовательская настройка не найдена (например, +// Если пользовательская настройка не найдена (например, // если параметр не выведен в пользовательские настройки), // то получает общую настройку параметра. // // Параметры: -// КомпоновщикНастроекКД (КомпоновщикНастроекКомпоновкиДанных) -// ИмяПараметра (Строка) +// КомпоновщикНастроекКД - КомпоновщикНастроекКомпоновкиДанных - Компоновщик настроек. +// ИмяПараметра - Строка - Имя параметра. // // Возвращаемое значение: -// (ЗначениеПараметраНастроекКомпоновкиДанных, Неопределено) +// ЗначениеПараметраНастроекКомпоновкиДанных - Пользовательская настройка параметра. +// Неопределено - Если параметр не найден. // Функция ПолучитьПараметр(КомпоновщикНастроекКД, ИмяПараметра) Экспорт ПараметрКД = Новый ПараметрКомпоновкиДанных(ИмяПараметра); @@ -607,7 +666,6 @@ // Локальные служебные процедуры и функции // Добавляет вложенные поля группировки. -// Процедура ДобавитьПоляГруппировки(Структура, СписокПолей, БезПользовательскихПолей) Для каждого ЭлементСтруктуры Из Структура Цикл @@ -632,7 +690,6 @@ КонецПроцедуры // Добавляет вложенные группировки элемента структуры. -// Процедура ДобавитьГруппировки(Структура, СписокГруппировок, ПоказыватьГруппировкиТаблиц = Истина) Для каждого ЭлементСтруктуры Из Структура Цикл @@ -653,7 +710,6 @@ КонецПроцедуры // Находит выбранное поле компоновки данных по идентификатору. -// Функция НайтиПолеВыбора(ЭлементНастроек, Идентификатор, Группа) НайденноеПолеВыбора = Неопределено; @@ -675,7 +731,6 @@ КонецФункции // Находит общую настройку компоновки данных по идентификатору. -// Функция НайтиЭлементНастройки(ЭлементНастройки, ИдентификаторПользовательскойНастройки) // Поиск элемента с заданным значением свойства ИдентификаторПользовательскойНастройки (ИПН). @@ -715,7 +770,6 @@ // Для работы с механизмом периодичности // Возвращает дату начала периода. -// Функция НачалоПериодаОтчета(ВидПериода, ДатаПериода) Экспорт НачалоПериода = ДатаПериода; @@ -752,7 +806,6 @@ КонецФункции // Возвращает дату окончания периода. -// Функция КонецПериодаОтчета(ВидПериода, ДатаПериода) Экспорт КонецПериода = ДатаПериода; @@ -789,7 +842,6 @@ КонецФункции // Возвращает список периодов в диапазоне начала периода. -// Функция СписокФиксированныхПериодов(Знач НачалоПериода, ВидПериода) Экспорт СписокПериодов = Новый СписокЗначений; @@ -835,7 +887,7 @@ // Добавление значений. Для Счетчик = 1 По 7 Цикл - СписокПериодов.Добавить(Период, Формат(Период, "ДФ='dd MMMM yyyy, dddd'") + ?(Период = Сегодня, " - " + НСтр("ru = 'текущий'"), "")); + СписокПериодов.Добавить(Период, Формат(Период, "ДФ='dd MMMM yyyy, dddd'") + ?(Период = Сегодня, " - " + НСтр("ru = 'сегодня'"), "")); Период = Период + 86400; КонецЦикла; @@ -877,7 +929,7 @@ КонецПериода = КонецНедели(Период); ПредставлениеПериода = Формат(Период, "ДФ=dd.MM") + " - " + Формат(КонецПериода, "ДЛФ=D") + " (" + НеделяГода(КонецПериода) + " " + НСтр("ru = 'неделя года'") + ")"; Если Период = ТекущееНачалоНедели Тогда - ПредставлениеПериода = ПредставлениеПериода + " - " + НСтр("ru = 'текущая'"); + ПредставлениеПериода = ПредставлениеПериода + " - " + НСтр("ru = 'эта неделя'"); КонецЕсли; СписокПериодов.Добавить(Период, ПредставлениеПериода); КонецЦикла; @@ -935,7 +987,7 @@ Месяц = Цел(Переменная/3) + 1; Декада = Переменная - (Месяц-1)*3 + 1; Период = Дата(Год, Месяц, (Декада - 1) * 10 + 1); - Представление = Формат(Период, "ДФ='MMMM yyyy'") + ", " + Лев("III", Декада) + " " + СтрокаДекада + ?(Счетчик = ТекущаяДекадаАбсолютно, " - " + НСтр("ru = 'текущая'"), ""); + Представление = Формат(Период, "ДФ='MMMM yyyy'") + ", " + Лев("III", Декада) + " " + СтрокаДекада + ?(Счетчик = ТекущаяДекадаАбсолютно, " - " + НСтр("ru = 'эта декада'"), ""); СписокПериодов.Добавить(Период, Представление); КонецЦикла; @@ -989,7 +1041,7 @@ Год = Цел((Счетчик - 1) / 12); Месяц = Счетчик - Год * 12; Период = Дата(Год, Месяц, 1); - СписокПериодов.Добавить(Период, Формат(Период, "ДФ='MMMM yyyy'") + ?(Год = ТекущийГод И ТекущийМесяц = Счетчик, " - " + НСтр("ru = 'текущий'"), "")); + СписокПериодов.Добавить(Период, Формат(Период, "ДФ='MMMM yyyy'") + ?(Год = ТекущийГод И ТекущийМесяц = Счетчик, " - " + НСтр("ru = 'этот месяц'"), "")); КонецЦикла; // Добавление навигационного пункта "<Позже>..." для перехода к более поздним периодам. @@ -1044,7 +1096,7 @@ Квартал = Счетчик - Год*4 + 1; Месяц = (Квартал-1)*3 + 1; Период = Дата(Год, Месяц, 1); - Представление = ?(Квартал = 4, "IV", Лев("III", Квартал)) + " " + СтрокаКвартал + " " + Формат(Период, "ДФ='yyyy'") + ?(Счетчик = ТекущийКварталАбсолютно, " - " + НСтр("ru = 'текущий'"), ""); + Представление = ?(Квартал = 4, "IV", Лев("III", Квартал)) + " " + СтрокаКвартал + " " + Формат(Период, "ДФ='yyyy'") + ?(Счетчик = ТекущийКварталАбсолютно, " - " + НСтр("ru = 'этот квартал'"), ""); СписокПериодов.Добавить(Период, Представление); КонецЦикла; @@ -1099,7 +1151,7 @@ Полугодие = Счетчик - Год*2 + 1; Месяц = (Полугодие-1)*6 + 1; Период = Дата(Год, Месяц, 1); - Представление = Лев("II", Полугодие) + " " + СтрокаПолугодие + " " + Формат(Период, "ДФ='yyyy'") + ?(Счетчик = ТекущееПолугодиеАбсолютно, " - " + НСтр("ru = 'текущее'"), ""); + Представление = Лев("II", Полугодие) + " " + СтрокаПолугодие + " " + Формат(Период, "ДФ='yyyy'") + ?(Счетчик = ТекущееПолугодиеАбсолютно, " - " + НСтр("ru = 'это полугодие'"), ""); СписокПериодов.Добавить(Период, Представление); КонецЦикла; @@ -1133,7 +1185,7 @@ // Добавление значений. Для Год = НачальныйГод По КонечныйГод Цикл - СписокПериодов.Добавить(Дата(Год, 1, 1), Формат(Год, "ЧГ=") + ?(Год = ТекущийГод, " - " + НСтр("ru = 'текущий'"), "")); + СписокПериодов.Добавить(Дата(Год, 1, 1), Формат(Год, "ЧГ=") + ?(Год = ТекущийГод, " - " + НСтр("ru = 'этот год'"), "")); КонецЦикла; // Добавление навигационного пункта "<Позже>..." для перехода к более поздним периодам. @@ -1145,7 +1197,6 @@ КонецФункции // Возвращает список периодов в диапазоне начала периода. -// Функция СписокВычисляемыхПериодов(ВидПериода) Экспорт СписокПериодов = Новый СписокЗначений; @@ -1210,7 +1261,6 @@ КонецФункции // Возвращает представление периода, используя его вид и указанное значение. -// Функция ПредставлениеСтандартногоПериода(СтандартныйПериод, ВидПериода) Экспорт Если СтандартныйПериод.Вариант = ВариантСтандартногоПериода.Месяц Тогда @@ -1233,7 +1283,6 @@ КонецФункции // Возвращает вид периода. -// Функция ПолучитьВидПериода(НачалоПериода, КонецПериода, ДоступныеПериоды = Неопределено) Экспорт ВидПериода = Неопределено; @@ -1302,7 +1351,6 @@ КонецФункции // Возвращает вид периода. В отличии от функции ПолучитьВидПериода на вход принимает СтандартныйПериод. -// Функция ПолучитьВидСтандартногоПериода(СтандартныйПериод, ДоступныеПериоды = Неопределено) Экспорт Если СтандартныйПериод.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод Тогда @@ -1383,7 +1431,6 @@ КонецФункции // Возвращает доступные периоды в порядке возрастания периодичности. -// Функция ПолучитьСписокДоступныхПериодов() Экспорт СписокДоступныхПериодов = Новый Массив; @@ -1399,148 +1446,3 @@ Возврат СписокДоступныхПериодов; КонецФункции - -// Устарела. Следует использовать функции СписокФиксированныхПериодов() и СписокСтандартныхПериодов(). -// Возвращает список периодов в диапазоне начала периода. -// -Функция ПолучитьСписокПериодов(НачалоПериода, ВидПериода) Экспорт - СписокПериодов = Новый СписокЗначений; - Если НачалоПериода = '00010101' Тогда - Возврат Новый СписокЗначений; - Иначе - ЗначениеНачалоПериода = НачалоПериода; - КонецЕсли; - - Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Год") Тогда - ТекущийГод = Год(ЗначениеНачалоПериода); - - СписокПериодов.Добавить(Дата(ТекущийГод - 4, 1, 1), НСтр("ru = 'Предыдущие годы...'")); - - Для Счетчик = ТекущийГод - 3 По ТекущийГод + 3 Цикл - СписокПериодов.Добавить(Дата(Счетчик, 1, 1), Формат(Счетчик, "ЧГ=0")); - КонецЦикла; - - СписокПериодов.Добавить(Дата(ТекущийГод + 4, 1, 1), НСтр("ru = 'Последующие годы...'")); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Полугодие") Тогда - ТекущийГод = Год(ЗначениеНачалоПериода); - - СписокПериодов.Добавить(Дата(ТекущийГод - 2, 1, 1), Формат(ТекущийГод - 2, "ЧГ=0") + "..."); - - Для Счетчик = ТекущийГод - 1 По ТекущийГод + 1 Цикл - СписокПериодов.Добавить(Дата(Счетчик, 1, 1), НСтр("ru = 'I полугодие'") + " " + Формат(Счетчик, "ЧГ=0")); - СписокПериодов.Добавить(Дата(Счетчик, 7, 1), НСтр("ru = 'II полугодие'") + " " + Формат(Счетчик, "ЧГ=0")); - КонецЦикла; - - СписокПериодов.Добавить(Дата(ТекущийГод + 2, 1, 1), Формат(ТекущийГод + 2, "ЧГ=0") + "..."); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Квартал") Тогда - ТекущийГод = Год(ЗначениеНачалоПериода); - - СписокПериодов.Добавить(Дата(ТекущийГод-1, 1, 1), Формат(ТекущийГод-1, "ЧГ=0") + "..."); - - Для Счетчик = ТекущийГод По ТекущийГод Цикл - СуффиксПериода = " " + Формат(Счетчик, "ЧГ=0"); - СписокПериодов.Добавить(Дата(Счетчик, 1, 1), НСтр("ru = 'I квартал'") + СуффиксПериода); - СписокПериодов.Добавить(Дата(Счетчик, 4, 1), НСтр("ru = 'II квартал'") + СуффиксПериода); - СписокПериодов.Добавить(Дата(Счетчик, 7, 1), НСтр("ru = 'III квартал'") + СуффиксПериода); - СписокПериодов.Добавить(Дата(Счетчик, 10, 1), НСтр("ru = 'IV квартал'") + СуффиксПериода); - КонецЦикла; - - СписокПериодов.Добавить(Дата(ТекущийГод+1, 1, 1), Формат(ТекущийГод+1, "ЧГ=0") + "..."); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Месяц") Тогда - ТекущийГод = Год(ЗначениеНачалоПериода); - - СписокПериодов.Добавить(Дата(ТекущийГод-1, 1, 1), Формат(ТекущийГод-1, "ЧГ=0") + "..."); - - Для Счетчик = 1 По 12 Цикл - СписокПериодов.Добавить(Дата(ТекущийГод, Счетчик, 1), Формат(Дата(ТекущийГод, Счетчик, 1), "ДФ='MMMM yyyy'")); - КонецЦикла; - - СписокПериодов.Добавить(Дата(ТекущийГод+1, 1, 1), Формат(ТекущийГод+1, "ЧГ=0") + "..."); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Декада") Тогда - ТекущийГод = Год(ЗначениеНачалоПериода); - ТекущийМесяц = Месяц(ЗначениеНачалоПериода); - - СчМесяц = ?(ТекущийМесяц - 4 < 1, 12 + ТекущийМесяц - 4, ТекущийМесяц - 4); - СчГод = ?(ТекущийМесяц - 4 < 1, ТекущийГод-1, ТекущийГод); - Сч = 6; - - СписокПериодов.Добавить(Дата(?(СчМесяц <> 1, СчГод, СчГод-1), ?(СчМесяц > 1, СчМесяц-1, 12), 1), Формат(Дата(?(СчМесяц <> 1, СчГод, СчГод-1), ?(СчМесяц > 1, СчМесяц-1, 12), 1), "ДФ='MMMM yyyy'") + "..."); - - Пока Сч >0 Цикл - СуффиксПериода = " " + Нрег(Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'")); - СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 1), НСтр("ru = 'I дек.'") + СуффиксПериода); - СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 11), НСтр("ru = 'II дек.'") + СуффиксПериода); - СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 21), НСтр("ru = 'III дек.'") + СуффиксПериода); - СчМесяц = СчМесяц + 1; - Если СчМесяц > 12 Тогда - СчГод = СчГод + 1; - СчМесяц = 1; - КонецЕсли; - Сч = Сч - 1; - КонецЦикла; - - СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 1), Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'") + "..."); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Неделя") Тогда - НачалоНедели = НачалоНедели(ЗначениеНачалоПериода)-21*86400; - ШаблонПериода = НСтр("ru = '%1 - %2 (%3 неделя года)'"); - - СписокПериодов.Добавить(НачалоНедели-7*86400, НСтр("ru = 'Пред. недели ...'")); - - Для Сч = 0 По 6 Цикл - НачНедели = НачалоНедели + 7*Сч*86400; - КонНедели = КонецНедели(НачНедели); - ПредставлениеПериода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонПериода, - Формат(НачНедели, "ДФ=dd.MM"), - Формат(КонНедели, "ДФ=dd.MM"), - НеделяГода(КонНедели)); - СписокПериодов.Добавить(НачНедели, ПредставлениеПериода); - КонецЦикла; - - СписокПериодов.Добавить(НачалоНедели + 7*7*86400, НСтр("ru = 'След. недели ...'")); - - ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.День") Тогда - КонецНедели = КонецНедели(ЗначениеНачалоПериода); - ДатаДняНедели = НачалоНедели(ЗначениеНачалоПериода); - - СписокПериодов.Добавить(ДатаДняНедели - 86400, НСтр("ru = 'Предыдущая неделя'")); - - Пока ДатаДняНедели < КонецНедели Цикл - СписокПериодов.Добавить(ДатаДняНедели, Формат(ДатаДняНедели, "ДФ='dd MMMM yyyy (ddd)'")); - ДатаДняНедели = ДатаДняНедели + 86400; - КонецЦикла; - - СписокПериодов.Добавить(КонецНедели + 1, НСтр("ru = 'Следующая неделя'")); - - КонецЕсли; - - Возврат СписокПериодов; -КонецФункции - -// Устарела. Следует использовать функцию ПредставлениеСтандартногоПериода(). -// Возвращает представление периода, используя его вид и указанное значение. -// -Функция ПолучитьПредставлениеПериода(ВидПериода, НачалоПериода, КонецПериода) Экспорт - - Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод") Тогда - Возврат Формат(НачалоПериода, "ДФ='dd MMMM yyyy'") + " - " + Формат(КонецПериода, "ДФ='dd MMMM yyyy'"); - - Иначе - Список = ПолучитьСписокПериодов(НачалоПериода, ВидПериода); - ЭлементСписка = Список.НайтиПоЗначению(НачалоПериода); - Если ЭлементСписка <> Неопределено Тогда - Возврат ЭлементСписка.Представление; - Иначе - Возврат ""; - КонецЕсли; - - КонецЕсли; - - Возврат ""; -КонецФункции - diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl similarity index 69% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/Module.bsl rename to SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl index e594ae472..9b6e69c07 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/Module.bsl @@ -6,7 +6,7 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Удаляет записи из табличной части ЭЦП +// Удаляет записи из табличной части ЭП // // Параметры // ТаблицаВыделенныеСтроки - ТаблицаЗначений - таблица, содержащая данные - ссылка на объект и номер строки в его табличной части @@ -29,9 +29,9 @@ УдалитьПодпись(ПодписанныйОбъект, ДанныеПодписи); КонецЦикла; - КоличествоПодписей = ПодписанныйОбъект.ЭлектронныеЦифровыеПодписи.Количество(); - ПодписанныйОбъект.ПодписанЭЦП = (КоличествоПодписей <> 0); - РеквизитПодписанИзменен = НЕ ПодписанныйОбъект.ПодписанЭЦП; + КоличествоПодписей = ПодписанныйОбъект.ЭлектронныеПодписи.Количество(); + ПодписанныйОбъект.ПодписанЭП = (КоличествоПодписей <> 0); + РеквизитПодписанИзменен = НЕ ПодписанныйОбъект.ПодписанЭП; ПодписанныйОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); // чтобы прошла запись ранее подписанного объекта УстановитьПривилегированныйРежим(Истина); @@ -44,9 +44,9 @@ // генерируя исключительную ситуацию в случае неудачи. // // Параметры: -// МенеджерКриптографии (МенеджерКриптографии) -// ДвоичныеДанныеФайла (ДвоичныеДанные) Файл для проверки. -// ДвоичныеДанныеПодписи (ДвоичныеДанные) Подпись. +// МенеджерКриптографии - МенеджерКриптографии - Менеджер криптографии. +// ДвоичныеДанныеФайла - ДвоичныеДанные - Файл для проверки. +// ДвоичныеДанныеПодписи - ДвоичныеДанные - Подпись. // Процедура ПроверитьПодпись(МенеджерКриптографии, ДвоичныеДанныеФайла, ДвоичныеДанныеПодписи) Экспорт @@ -71,7 +71,7 @@ // СЕРВЕРНЫЕ ОБРАБОТЧИКИ. - ИмяМодуля = "ЭлектроннаяЦифроваяПодпись"; + ИмяМодуля = "ЭлектроннаяПодпись"; ИмяСобытия = "СтандартныеПодсистемы.ОбновлениеВерсииИБ\ПриДобавленииОбработчиковОбновления"; СерверныеОбработчики[ИмяСобытия].Добавить(ИмяМодуля); @@ -97,11 +97,11 @@ Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.0.7.1"; - Обработчик.Процедура = "ЭлектроннаяЦифроваяПодпись.ЗаполнитьНазначенияСертификатовЭЦП"; + Обработчик.Процедура = "ЭлектроннаяПодпись.ЗаполнитьНазначенияСертификатовЭП"; Обработчик = Обработчики.Добавить(); Обработчик.Версия = "1.1.1.8"; - Обработчик.Процедура = "ЭлектроннаяЦифроваяПодпись.УдалитьСтарыеИЗаполнитьНазначенияСертификатовЭЦП"; + Обработчик.Процедура = "ЭлектроннаяПодпись.УдалитьСтарыеИЗаполнитьНазначенияСертификатовЭП"; КонецПроцедуры @@ -115,9 +115,13 @@ Библиотека = "СтандартныеПодсистемы"; + СтароеИмя = "Роль.ИспользованиеЭЦП"; + НовоеИмя = "Роль.ИспользованиеЭП"; + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); + СтароеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяЦифроваяПодпись"; НовоеИмя = "Подсистема.СтандартныеПодсистемы.Подсистема.ЭлектроннаяПодпись"; - ОбщегоНазначения.ДобавитьПереименование(Итог, "2.1.6.1", СтароеИмя, НовоеИмя, Библиотека); + ОбщегоНазначения.ДобавитьПереименование(Итог, "2.2.1.7", СтароеИмя, НовоеИмя, Библиотека); КонецПроцедуры @@ -130,8 +134,11 @@ Процедура ПриДобавленииПараметровРаботыКлиентскойЛогикиСтандартныхПодсистем(Параметры) Экспорт Если ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - ПерсональныеНастройкиРаботыСЭЦП = ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер(); - Параметры.Вставить("ПерсональныеНастройкиРаботыСЭЦП", Новый ФиксированнаяСтруктура(ПерсональныеНастройкиРаботыСЭЦП)); + НастройкиПодсистемы = Новый Структура; + НастройкиПодсистемы.Вставить("ПерсональныеНастройки", ПерсональныеНастройки()); + НастройкиПодсистемы.Вставить("ОбщиеНастройки", ОбщиеНастройки()); + НастройкиПодсистемы = Новый ФиксированнаяСтруктура(НастройкиПодсистемы); + Параметры.Вставить("ЭлектроннаяПодпись", НастройкиПодсистемы); КонецЕсли; КонецПроцедуры @@ -142,7 +149,7 @@ // Заносит информацию о подписи объекта // // Параметры -// ПодписываемыйОбъектСсылка - любая ссылка / объект - в табличную часть которого будет занесена информация о ЭЦП +// ПодписываемыйОбъектСсылка - любая ссылка / объект - в табличную часть которого будет занесена информация о ЭП // в случае если ссылка - будет получен объект, блокировка, запись в ИБ // в случае объекта за блокировку и запись отвечает вызывающий код // НоваяПодписьДвоичныеДанные - ДвоичныеДанные - двоичные данные подписи @@ -175,7 +182,7 @@ ДатаПодписи = ТекущаяДатаСеанса(); КонецЕсли; - НоваяЗапись = ПодписываемыйОбъект.ЭлектронныеЦифровыеПодписи.Добавить(); + НоваяЗапись = ПодписываемыйОбъект.ЭлектронныеПодписи.Добавить(); НоваяЗапись.КомуВыданСертификат = КомуВыданСертификат; НоваяЗапись.ДатаПодписи = ДатаПодписи; @@ -186,7 +193,7 @@ НоваяЗапись.УстановившийПодпись = Пользователи.ТекущийПользователь(); НоваяЗапись.Сертификат = Новый ХранилищеЗначения(ДвоичныеДанныеСертификата); - ПодписываемыйОбъект.ПодписанЭЦП = Истина; + ПодписываемыйОбъект.ПодписанЭП = Истина; ПодписываемыйОбъект.ДополнительныеСвойства.Вставить("ЗаписьПодписанногоОбъекта", Истина); // чтобы прошла запись ранее подписанного объекта Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ПодписываемыйОбъектСсылка)) Тогда @@ -215,9 +222,9 @@ | "; Запрос.Текст = Запрос.Текст + ОбщегоНазначения.ИмяТаблицыПоСсылке(ОбъектСсылка); - Запрос.Текст = Запрос.Текст + ".ЭлектронныеЦифровыеПодписи КАК ЭлектронныеЦифровыеПодписи + Запрос.Текст = Запрос.Текст + ".ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | ЭлектронныеЦифровыеПодписи.Ссылка = &ОбъектСсылка"; + | ЭлектронныеПодписи.Ссылка = &ОбъектСсылка"; Запрос.Параметры.Вставить("ОбъектСсылка", ОбъектСсылка); @@ -232,63 +239,90 @@ КонецФункции -// Возвращает структуру, содержащую различные персональные настройки по работе с ЭЦП +// Возвращает настройки текущего пользователя для работы с электронной подписью. +// // Возвращаемое значение: -// Структура - структура с настройками -Функция ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер() Экспорт +// Структура - Персональные настройки для работы с электронной подписью. +// * ДействияПриСохраненииСЭП - Строка - Что делать при сохранении файлов с электронной подписью: +// ** "Спрашивать" - +// ** "СохранятьВсеПодписи" - +// * ПутьМодуляКриптографии - Строка - +// * РасширениеДляФайловПодписи - Строка - +// * РасширениеДляЗашифрованныхФайлов - Строка - +// * ОтпечатокЛичногоСертификатаДляШифрования - Строка - +// +// См. также: +// ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки() - программный интерфейс для получения. +// ОбщаяФорма.ПерсональныеНастройкиЭП - место определения данных параметров и их текстовые описания. +// +Функция ПерсональныеНастройки(ТолькоЗначенияПоУмолчанию = Ложь) Экспорт + ПерсональныеНастройки = Новый Структура; - Настройки = Новый Структура; + // Значения "по умолчанию". + ПерсональныеНастройки.Вставить("ДействияПриСохраненииСЭП", "Спрашивать"); + ПерсональныеНастройки.Вставить("ПутьМодуляКриптографии", ""); + ПерсональныеНастройки.Вставить("РасширениеДляФайловПодписи", "p7s"); + ПерсональныеНастройки.Вставить("РасширениеДляЗашифрованныхФайлов", "p7m"); + ПерсональныеНастройки.Вставить("ОтпечатокЛичногоСертификатаДляШифрования", ""); + + Если ТолькоЗначенияПоУмолчанию Тогда + Возврат ПерсональныеНастройки; + КонецЕсли; + + КлючПодсистемы = "ЭЦП"; + + Для Каждого КлючИЗначение Из ПерсональныеНастройки Цикл + СохраненноеЗначение = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить(КлючПодсистемы, КлючИЗначение.Ключ); + Если ЗначениеЗаполнено(СохраненноеЗначение) Тогда + ПерсональныеНастройки.Вставить(КлючИЗначение.Ключ, СохраненноеЗначение); + КонецЕсли; + КонецЦикла; + + Если ПерсональныеНастройки.ДействияПриСохраненииСЭП = Перечисления.ДействияПриСохраненииСЭП.Спрашивать Тогда + ПерсональныеНастройки.ДействияПриСохраненииСЭП = "Спрашивать"; + ИначеЕсли ПерсональныеНастройки.ДействияПриСохраненииСЭП = Перечисления.ДействияПриСохраненииСЭП.СохранятьВсеПодписи Тогда + ПерсональныеНастройки.ДействияПриСохраненииСЭП = "СохранятьВсеПодписи"; + КонецЕсли; + + Возврат ПерсональныеНастройки; +КонецФункции + +// Возвращает настройки текущего пользователя для работы с электронной подписью. +// +// Параметры: +// СтруктураОснование - Структура - Необязательный. Структура, в которую будут добавлены ключи общих настроек. +// +// Возвращаемое значение: +// Структура - Общие настройки подсистемы для работы с электронной подписью. +// * ПровайдерЭП - Строка - +// * ТипПровайдераЭП - Число - +// * ВыполнятьПроверкуЭПНаСервере - Булево - +// * АлгоритмПодписи - Строка - +// * АлгоритмХеширования - Строка - +// * АлгоритмШифрования - Строка - +// +// См. также: +// ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки() - единая точка входа. +// ОбщаяФорма.НастройкиКриптографии - место определения данных параметров и их текстовые описания. +// +Функция ОбщиеНастройки(СтруктураОснование = Неопределено) Экспорт + Если ТипЗнч(СтруктураОснование) = Тип("Структура") Тогда + ОбщиеНастройки = СтруктураОснование; + Иначе + ОбщиеНастройки = Новый Структура; + КонецЕсли; УстановитьПривилегированныйРежим(Истина); - ПровайдерЭЦП = Константы.ПровайдерЭЦП.Получить(); - Настройки.Вставить("ПровайдерЭЦП", ПровайдерЭЦП); - ТипПровайдераЭЦП = Константы.ТипПровайдераЭЦП.Получить(); - Настройки.Вставить("ТипПровайдераЭЦП", ТипПровайдераЭЦП); - ВыполнятьПроверкуЭЦПНаСервере = Константы.ВыполнятьПроверкуЭЦПНаСервере.Получить(); - Настройки.Вставить("ВыполнятьПроверкуЭЦПНаСервере", ВыполнятьПроверкуЭЦПНаСервере); + ОбщиеНастройки.Вставить("ПровайдерЭП", Константы.ПровайдерЭП.Получить()); + ОбщиеНастройки.Вставить("ТипПровайдераЭП", Константы.ТипПровайдераЭП.Получить()); + ОбщиеНастройки.Вставить("ВыполнятьПроверкуЭПНаСервере", Константы.ВыполнятьПроверкуЭПНаСервере.Получить()); - АлгоритмПодписи = Константы.АлгоритмПодписи.Получить(); - Настройки.Вставить("АлгоритмПодписи", АлгоритмПодписи); - АлгоритмХеширования = Константы.АлгоритмХеширования.Получить(); - Настройки.Вставить("АлгоритмХеширования", АлгоритмХеширования); - АлгоритмШифрования = Константы.АлгоритмШифрования.Получить(); - Настройки.Вставить("АлгоритмШифрования", АлгоритмШифрования); - - ПутьМодуляКриптографии = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ПутьМодуляКриптографии"); - Если ПутьМодуляКриптографии = Неопределено Тогда - ПутьМодуляКриптографии = ""; - КонецЕсли; - Настройки.Вставить("ПутьМодуляКриптографии", ПутьМодуляКриптографии); - - ДействияПриСохраненииСЭЦП = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "ДействияПриСохраненииСЭЦП"); - Если ДействияПриСохраненииСЭЦП = Неопределено Тогда - ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать; - КонецЕсли; - - СтрокаДействияПриСохраненииСЭЦП = ""; - Если ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.Спрашивать Тогда - СтрокаДействияПриСохраненииСЭЦП = "Спрашивать"; - ИначеЕсли ДействияПриСохраненииСЭЦП = Перечисления.ДействияПриСохраненииСЭЦП.СохранятьВсеПодписи Тогда - СтрокаДействияПриСохраненииСЭЦП = "СохранятьВсеПодписи"; - КонецЕсли; - - Настройки.Вставить("ДействияПриСохраненииСЭЦП", СтрокаДействияПриСохраненииСЭЦП); - - РасширениеДляФайловПодписи = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляФайловПодписи"); - Если РасширениеДляФайловПодписи = Неопределено ИЛИ ПустаяСтрока(РасширениеДляФайловПодписи) Тогда - РасширениеДляФайловПодписи = "p7s"; - КонецЕсли; - Настройки.Вставить("РасширениеДляФайловПодписи", РасширениеДляФайловПодписи); - - РасширениеДляЗашифрованныхФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ЭЦП", "РасширениеДляЗашифрованныхФайлов"); - Если РасширениеДляЗашифрованныхФайлов = Неопределено ИЛИ ПустаяСтрока(РасширениеДляЗашифрованныхФайлов) Тогда - РасширениеДляЗашифрованныхФайлов = "p7m"; - КонецЕсли; - Настройки.Вставить("РасширениеДляЗашифрованныхФайлов", РасширениеДляЗашифрованныхФайлов); - - Возврат Настройки; + ОбщиеНастройки.Вставить("АлгоритмПодписи", Константы.АлгоритмПодписи.Получить()); + ОбщиеНастройки.Вставить("АлгоритмХеширования", Константы.АлгоритмХеширования.Получить()); + ОбщиеНастройки.Вставить("АлгоритмШифрования", Константы.АлгоритмШифрования.Получить()); + Возврат ОбщиеНастройки; КонецФункции // Преобразует назначения сертификатов в дружественный вид @@ -314,7 +348,7 @@ Представление = Лев(Строка, Позиция - 1); Код = Сред(Строка, Позиция + 1, СтрДлина(Строка) - Позиция - 1); - СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Код); + СпрСсылка = Справочники.НазначенияСертификатовЭП.НайтиПоКоду(Код); Если СпрСсылка <> Неопределено И НЕ СпрСсылка.Пустая() Тогда Представление = СпрСсылка.Наименование; КонецЕсли; @@ -346,18 +380,18 @@ МассивВозврата = Новый Массив; //ВерсияСсылка = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФайлСсылка, "ТекущаяВерсия"); - ПолноеИмяОбъектаСЭЦП = СсылкаНаОбъект.Метаданные().ПолноеИмя(); + ПолноеИмяОбъектаСЭП = СсылкаНаОбъект.Метаданные().ПолноеИмя(); ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ЭлектронныеЦифровыеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, - | ЭлектронныеЦифровыеПодписи.Подпись КАК Подпись, - | ЭлектронныеЦифровыеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи + | ЭлектронныеПодписи.КомуВыданСертификат КАК КомуВыданСертификат, + | ЭлектронныеПодписи.Подпись КАК Подпись, + | ЭлектронныеПодписи.ИмяФайлаПодписи КАК ИмяФайлаПодписи |ИЗ - | [ПолноеИмяОбъектаСЭЦП].ЭлектронныеЦифровыеПодписи КАК ЭлектронныеЦифровыеПодписи + | [ПолноеИмяОбъектаСЭП].ЭлектронныеПодписи КАК ЭлектронныеПодписи |ГДЕ - | ЭлектронныеЦифровыеПодписи.Ссылка = &СсылкаНаОбъект"; + | ЭлектронныеПодписи.Ссылка = &СсылкаНаОбъект"; - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъектаСЭЦП]", ПолноеИмяОбъектаСЭЦП); + ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ПолноеИмяОбъектаСЭП]", ПолноеИмяОбъектаСЭП); Запрос = Новый Запрос; Запрос.Текст = ТекстЗапроса; @@ -379,7 +413,7 @@ КонецФункции -// Возвращает структуру данных из файла подписи +// Возвращает структурe данных из файла подписи // // Параметры // Подпись - ДвоичныеДанные - файл подписи. @@ -413,7 +447,7 @@ Результат = Новый Структура; Результат.Вставить("Отпечаток", Base64Строка(Сертификат.Отпечаток)); - Результат.Вставить("КомуВыданСертификат", ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект)); + Результат.Вставить("КомуВыданСертификат", ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект)); Результат.Вставить("ДвоичныеДанныеСертификата", Сертификат.Выгрузить()); Результат.Вставить("Подпись", Новый ХранилищеЗначения(Подпись)); Результат.Вставить("Сертификат", Новый ХранилищеЗначения(Сертификат.Выгрузить())); @@ -423,7 +457,7 @@ КонецФункции -// Удаляет одну запись из табл части ЭЦП +// Удаляет одну запись из табл части ЭП // // Параметры // ПодписываемыйОбъект - СправочникОбъект - подписываемый объект @@ -432,7 +466,7 @@ НомерСтроки = ДанныеПодписи.НомерСтроки; - СтрокаТабличнойЧасти = ПодписанныйОбъект.ЭлектронныеЦифровыеПодписи.Найти(НомерСтроки, "НомерСтроки"); + СтрокаТабличнойЧасти = ПодписанныйОбъект.ЭлектронныеПодписи.Найти(НомерСтроки, "НомерСтроки"); Если СтрокаТабличнойЧасти <> Неопределено Тогда Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда @@ -441,45 +475,57 @@ КонецЕсли; КонецЕсли; - ПодписанныйОбъект.ЭлектронныеЦифровыеПодписи.Удалить(СтрокаТабличнойЧасти); + ПодписанныйОбъект.ЭлектронныеПодписи.Удалить(СтрокаТабличнойЧасти); Иначе ВызватьИсключение НСтр("ru = 'Строка с подписью не найдена.'"); КонецЕсли; КонецПроцедуры +// Получает менеджер на основе общих настроек криптографии. Функция СоздатьМенеджерКриптографии() - Настройки = ПолучитьПерсональныеНастройкиРаботыСЭЦПСервер(); - - Если Не Настройки.ВыполнятьПроверкуЭЦПНаСервере Тогда + ОбщиеНастройки = ОбщиеНастройки(); + + Если Не ОбщиеНастройки.ВыполнятьПроверкуЭПНаСервере Тогда Возврат Неопределено; КонецЕсли; Попытка - МенеджерКриптографии = Новый МенеджерКриптографии(Настройки.ПровайдерЭЦП, Настройки.ПутьМодуляКриптографии, Настройки.ТипПровайдераЭЦП); + МенеджерКриптографии = Новый МенеджерКриптографии( + ОбщиеНастройки.ПровайдерЭП, + ОбщиеНастройки.ПутьМодуляКриптографии, + ОбщиеНастройки.ТипПровайдераЭП); Исключение Возврат Неопределено; КонецПопытки; - ЗаполнитьЗначенияСвойств(МенеджерКриптографии, Настройки); - + ЗаполнитьЗначенияСвойств(МенеджерКриптографии, ОбщиеНастройки); + Возврат МенеджерКриптографии; КонецФункции +// Сохраняет настройки текущего пользователя для работы с электронной подписью. +Процедура СохранитьПерсональныеНастройки(ПерсональныеНастройки) Экспорт + КлючПодсистемы = "ЭЦП"; + Для Каждого КлючИЗначение Из ПерсональныеНастройки Цикл + ОбщегоНазначения.ХранилищеОбщихНастроекСохранить(КлючПодсистемы, КлючИЗначение.Ключ, КлючИЗначение.Значение); + КонецЦикла; +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Обновление информационной базы -// Заполняет справочник НазначенияСертификатовЭЦП значениями из макета -Процедура УдалитьСтарыеИЗаполнитьНазначенияСертификатовЭЦП() Экспорт +// Заполняет справочник НазначенияСертификатовЭП значениями из макета +Процедура УдалитьСтарыеИЗаполнитьНазначенияСертификатовЭП() Экспорт УстановитьПривилегированныйРежим(Истина); - МакетУдаленный = Справочники.НазначенияСертификатовЭЦП.ПолучитьМакет("УдаленныйНазначенияСертификатов"); + МакетУдаленный = Справочники.НазначенияСертификатовЭП.ПолучитьМакет("УдаленныйНазначенияСертификатов"); ТабЗначенийУдаленный = ОбщегоНазначения.ПрочитатьXMLВТаблицу(МакетУдаленный.ПолучитьТекст()).Данные; - Макет = Справочники.НазначенияСертификатовЭЦП.ПолучитьМакет("НазначенияСертификатов"); + Макет = Справочники.НазначенияСертификатовЭП.ПолучитьМакет("НазначенияСертификатов"); ТабЗначений = ОбщегоНазначения.ПрочитатьXMLВТаблицу(Макет.ПолучитьТекст()).Данные; НачатьТранзакцию(); @@ -487,7 +533,7 @@ Для Каждого Запись Из ТабЗначенийУдаленный Цикл - СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Запись.Code); + СпрСсылка = Справочники.НазначенияСертификатовЭП.НайтиПоКоду(Запись.Code); Если СпрСсылка <> Неопределено И НЕ СпрСсылка.Пустая() Тогда СправочникОбъект = СпрСсылка.ПолучитьОбъект(); @@ -499,9 +545,9 @@ Для Каждого Запись Из ТабЗначений Цикл - СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Запись.Code); + СпрСсылка = Справочники.НазначенияСертификатовЭП.НайтиПоКоду(Запись.Code); Если СпрСсылка = Неопределено ИЛИ СпрСсылка.Пустая() Тогда - Элемент = Справочники.НазначенияСертификатовЭЦП.СоздатьЭлемент(); + Элемент = Справочники.НазначенияСертификатовЭП.СоздатьЭлемент(); Элемент.Код = Запись.Code; Элемент.Наименование = Запись.Name; ОбновлениеИнформационнойБазы.ЗаписатьДанные(Элемент); @@ -517,11 +563,11 @@ КонецПроцедуры -// Заполняет справочник НазначенияСертификатовЭЦП значениями из макета -Процедура ЗаполнитьНазначенияСертификатовЭЦП() Экспорт +// Заполняет справочник НазначенияСертификатовЭП значениями из макета +Процедура ЗаполнитьНазначенияСертификатовЭП() Экспорт УстановитьПривилегированныйРежим(Истина); - Макет = Справочники.НазначенияСертификатовЭЦП.ПолучитьМакет("НазначенияСертификатов"); + Макет = Справочники.НазначенияСертификатовЭП.ПолучитьМакет("НазначенияСертификатов"); ТабЗначений = ОбщегоНазначения.ПрочитатьXMLВТаблицу(Макет.ПолучитьТекст()).Данные; НачатьТранзакцию(); @@ -529,9 +575,9 @@ Для Каждого Запись Из ТабЗначений Цикл - СпрСсылка = Справочники.НазначенияСертификатовЭЦП.НайтиПоКоду(Запись.Code); + СпрСсылка = Справочники.НазначенияСертификатовЭП.НайтиПоКоду(Запись.Code); Если СпрСсылка = Неопределено ИЛИ СпрСсылка.Пустая() Тогда - Элемент = Справочники.НазначенияСертификатовЭЦП.СоздатьЭлемент(); + Элемент = Справочники.НазначенияСертификатовЭП.СоздатьЭлемент(); Элемент.Код = Запись.Code; Элемент.Наименование = Запись.Name; ОбновлениеИнформационнойБазы.ЗаписатьДанные(Элемент); diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/ЭлектроннаяЦифроваяПодпись.mdo b/SSL/src/CommonModules/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo similarity index 86% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/ЭлектроннаяЦифроваяПодпись.mdo rename to SSL/src/CommonModules/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo index bc57a6daa..99d031d43 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодпись/ЭлектроннаяЦифроваяПодпись.mdo +++ b/SSL/src/CommonModules/ЭлектроннаяПодпись/ЭлектроннаяПодпись.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1681dd7a-de80-4b8d-9657-c9702a19d653"> - <name>ЭлектроннаяЦифроваяПодпись</name> + <name>ЭлектроннаяПодпись</name> <synonym> <key>ru</key> <value>Электронная подпись</value> diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl similarity index 80% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/Module.bsl rename to SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl index 37bea789e..4e58dbb5f 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/Module.bsl @@ -15,7 +15,7 @@ // СтруктураПараметровПодписи - Структура - информация о подписи - выбранный сертификат, пароль, комментарий // // Возвращаемое значение: -// Структура - данные для занесения в табличную часть ЭЦП +// Структура - данные для занесения в табличную часть ЭП Функция СформироватьДанныеПодписи( МенеджерКриптографии, ОбъектДляПодписиСсылка, @@ -28,7 +28,7 @@ НоваяПодписьДвоичныеДанные = МенеджерКриптографии.Подписать(ДвоичныеДанные, СтруктураПараметровПодписи.Сертификат); Отпечаток = Base64Строка(СтруктураПараметровПодписи.Сертификат.Отпечаток); - КомуВыданСертификат = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(СтруктураПараметровПодписи.Сертификат.Субъект); + КомуВыданСертификат = ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(СтруктураПараметровПодписи.Сертификат.Субъект); ДвоичныеДанныеСертификата = СтруктураПараметровПодписи.Сертификат.Выгрузить(); ДанныеПодписи = Новый Структура("ОбъектСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, АдресФайла, ДвоичныеДанныеСертификата", @@ -64,16 +64,51 @@ КонецПроцедуры -// Открывает персональные настройки ЭЦП. +// Открывает персональные настройки ЭП. // // Параметры: // Модально - Булево - Открывать форму поверх всех остальных. // -Процедура ОткрытьФормуНастройкиЭЦП() Экспорт +Процедура ОткрытьФормуНастройкиЭП() Экспорт ПараметрыФормы = Новый Структура("ПоказыватьНастройкиШифрования", Истина); - ОткрытьФорму("ОбщаяФорма.ПерсональныеНастройкиЭЦП", ПараметрыФормы); + ОткрытьФорму("ОбщаяФорма.ПерсональныеНастройкиЭП", ПараметрыФормы); + +КонецПроцедуры + +// Показывает диалог установки расширения работы с криптографией. +// +// Параметры: +// ОбработчикРезультата - ОписаниеОповещения - Описание процедуры, принимающей результат выбора. +// ТекстВопроса - Строка - Текст вопроса. +// ЗаголовокВопроса - Строка - Заголовок вопроса. +// +// Значение первого параметра, возвращаемого в обработчик вызывающего кода: +// РасширениеУстановлено +// * Истина - Пользователь подтвердил установку, после установки расширение было успешно подключено. +// * Ложь - Пользователь подтвердил установку, однако после установки расширение не удалось подключить. +// * Неопределено - Пользователь отказался от установки. +// +Процедура УстановитьРасширение(ОбработчикРезультата, ТекстВопроса = "", ЗаголовокВопроса = "") Экспорт + + Если ПустаяСтрока(ЗаголовокВопроса) Тогда + ЗаголовокВопроса = НСтр("ru = 'Расширение работы с криптографией'"); + КонецЕсли; + + Если ПустаяСтрока(ТекстВопроса) Тогда + ТекстВопроса = НСтр("ru = 'Для продолжения необходимо установить + |расширение работы с криптографией.'"); + КонецЕсли; + + Кнопки = Новый СписокЗначений; + Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Установить'")); + Кнопки.Добавить(КодВозвратаДиалога.Отмена); + + ДополнительныеПараметры = Новый Структура; + ДополнительныеПараметры.Вставить("ОбработчикРезультата", ОбработчикРезультата); + Обработчик = Новый ОписаниеОповещения("УстановитьРасширениеПослеОтвета", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВопрос(Обработчик, ТекстВопроса, Кнопки, 60, КодВозвратаДиалога.Да, ЗаголовокВопроса); КонецПроцедуры @@ -83,7 +118,7 @@ // По окончании подписания нотифицирует о подписании // // Параметры -// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +// ОбъектСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭП Процедура ИнформироватьОПодписанииОбъекта(ОбъектСсылка) Экспорт ОповеститьОбИзменении(ОбъектСсылка); @@ -147,11 +182,11 @@ Сертификат = ХранилищеСертификатов.НайтиПоОтпечатку(ДвоичныеДанныеОтпечатка); Если Сертификат = Неопределено Тогда - Предупреждение(НСтр("ru = 'Сертификат не найден'")); + ПоказатьПредупреждение(, НСтр("ru = 'Сертификат не найден'")); Возврат Неопределено; КонецЕсли; - Возврат ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + Возврат ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); КонецФункции @@ -162,7 +197,7 @@ // // Возвращаемое значение: // Массив - массив структур с полями сертификата -Функция ПолучитьМассивСтруктурСертификатов(знач ТолькоЛичные) Экспорт +Функция ПолучитьМассивСтруктурСертификатов(Знач ТолькоЛичные) Экспорт МассивСтруктурСертификатов = Новый Массив; @@ -184,7 +219,7 @@ Продолжить; // Пропуск истекших сертификатов. КонецЕсли; - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Если СтруктураСертификата <> Неопределено Тогда СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток); @@ -205,7 +240,7 @@ Продолжить; // Пропуск истекших сертификатов. КонецЕсли; - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Если СтруктураСертификата <> Неопределено Тогда СтрокаОтпечатка = Base64Строка(Сертификат.Отпечаток); @@ -234,32 +269,33 @@ Возврат Неопределено; КонецЕсли; - ПерсональныеНастройкиРаботыСЭЦП = ПолучитьПерсональныеНастройкиРаботыСЭЦП(); - ПровайдерЭЦП = ПерсональныеНастройкиРаботыСЭЦП.ПровайдерЭЦП; - ПутьМодуляКриптографии = ПерсональныеНастройкиРаботыСЭЦП.ПутьМодуляКриптографии; - ТипПровайдераЭЦП = ПерсональныеНастройкиРаботыСЭЦП.ТипПровайдераЭЦП; + ПерсональныеНастройки = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки(); + ОбщиеНастройки = ЭлектроннаяПодписьКлиентСервер.ОбщиеНастройки(); + ПровайдерЭП = ОбщиеНастройки.ПровайдерЭП; + ТипПровайдераЭП = ОбщиеНастройки.ТипПровайдераЭП; + ПутьМодуляКриптографии = ПерсональныеНастройки.ПутьМодуляКриптографии; - Если ПустаяСтрока(ПровайдерЭЦП) Тогда + Если ПустаяСтрока(ПровайдерЭП) Тогда ВызватьИсключение - НСтр("ru = 'Не указан провайдер ЭЦП. - |В настройках криптографии укажите провайдера ЭЦП, + НСтр("ru = 'Не указан провайдер ЭП. + |В настройках криптографии укажите провайдера ЭП, |тип провайдера, алгоритмы подписи и хеширования.'"); КонецЕсли; - МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭЦП, ПутьМодуляКриптографии, ТипПровайдераЭЦП); + МенеджерКриптографии = Новый МенеджерКриптографии(ПровайдерЭП, ПутьМодуляКриптографии, ТипПровайдераЭП); - МенеджерКриптографии.АлгоритмПодписи = ПерсональныеНастройкиРаботыСЭЦП.АлгоритмПодписи; - МенеджерКриптографии.АлгоритмХеширования = ПерсональныеНастройкиРаботыСЭЦП.АлгоритмХеширования; - МенеджерКриптографии.АлгоритмШифрования = ПерсональныеНастройкиРаботыСЭЦП.АлгоритмШифрования; + МенеджерКриптографии.АлгоритмПодписи = ОбщиеНастройки.АлгоритмПодписи; + МенеджерКриптографии.АлгоритмХеширования = ОбщиеНастройки.АлгоритмХеширования; + МенеджерКриптографии.АлгоритмШифрования = ОбщиеНастройки.АлгоритмШифрования; Возврат МенеджерКриптографии; КонецФункции -// Открывает форму просмотра сертификата ЭЦП +// Открывает форму просмотра сертификата ЭП // // Параметры -// Отпечаток - Строка - отпечаток сертификата ЭЦП +// Отпечаток - Строка - отпечаток сертификата ЭП // Процедура ОткрытьСертификат(Отпечаток) Экспорт @@ -270,16 +306,16 @@ СтруктураСертификата = ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); Если СтруктураСертификата <> Неопределено Тогда ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток", СтруктураСертификата, Отпечаток); - ОткрытьФорму("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы); + ОткрытьФорму("ОбщаяФорма.СертификатЭП", ПараметрыФормы); КонецЕсли; КонецПроцедуры -// Открывает форму просмотра сертификата ЭЦП +// Открывает форму просмотра сертификата ЭП // // Параметры // СтруктураСертификата - Структура с полями сертификата -// Отпечаток - Строка - отпечаток сертификата ЭЦП +// Отпечаток - Строка - отпечаток сертификата ЭП // АдресСертификата - Строка - адрес сертификата во временном хранилище // Процедура ОткрытьСертификатСоСтруктурой(СтруктураСертификата, Отпечаток, АдресСертификата) Экспорт @@ -291,17 +327,12 @@ Если СтруктураСертификата <> Неопределено Тогда ПараметрыФормы = Новый Структура("СтруктураСертификата, Отпечаток, АдресСертификата", СтруктураСертификата, Отпечаток, АдресСертификата); - ОткрытьФорму("ОбщаяФорма.СертификатЭЦП", ПараметрыФормы); + ОткрытьФорму("ОбщаяФорма.СертификатЭП", ПараметрыФормы); КонецЕсли; КонецПроцедуры -// Возвращает структуру, содержащую различные персональные настройки -Функция ПолучитьПерсональныеНастройкиРаботыСЭЦП() Экспорт - Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ПерсональныеНастройкиРаботыСЭЦП; -КонецФункции - -// Открывает форму просмотра сертификата ЭЦП +// Открывает форму просмотра сертификата ЭП Процедура ОткрытьСертификатПоОтпечаткуИАдресу(Отпечаток, АдресСертификата) Экспорт Если ОбщегоНазначенияКлиентПовтИсп.ЭтоВебКлиентПодMacOS() Тогда @@ -316,7 +347,7 @@ Если НЕ ПустаяСтрока(АдресСертификата) Тогда ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(АдресСертификата); Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Иначе СтруктураСертификата = ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); КонецЕсли; @@ -327,7 +358,7 @@ КонецПроцедуры -// Открывает форму просмотра подписи ЭЦП +// Открывает форму просмотра подписи ЭП Процедура ОткрытьПодпись(ТекущиеДанные) Экспорт Если ТекущиеДанные = Неопределено Тогда @@ -358,7 +389,7 @@ Если НЕ ПустаяСтрока(ТекущиеДанные.АдресСертификата) Тогда ДвоичныеДанныеСертификата = ПолучитьИзВременногоХранилища(ТекущиеДанные.АдресСертификата); Сертификат = Новый СертификатКриптографии(ДвоичныеДанныеСертификата); - СтруктураСертификата = ЭлектроннаяЦифроваяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); + СтруктураСертификата = ЭлектроннаяПодписьКлиентСервер.ЗаполнитьСтруктуруСертификата(Сертификат); Иначе СтруктураСертификата = ЗаполнитьСтруктуруСертификатаПоОтпечатку(Отпечаток); КонецЕсли; @@ -368,7 +399,7 @@ СтруктураСертификата, Отпечаток, ТекущиеДанные.АдресСертификата, ТекущиеДанные.УстановившийПодпись, ТекущиеДанные.Комментарий, ТекущиеДанные.АдресПодписи, ТекущиеДанные.ДатаПодписи); - ОткрытьФорму("ОбщаяФорма.ПодписьЭЦП", ПараметрыФормы); + ОткрытьФорму("ОбщаяФорма.ПодписьЭП", ПараметрыФормы); КонецЕсли; КонецЕсли; @@ -391,7 +422,7 @@ МассивИмен = Новый Массив; МассивИмен.Добавить(ОсновнойФайл.Имя); - РасширениеДляФайловПодписи = ПолучитьПерсональныеНастройкиРаботыСЭЦП().РасширениеДляФайловПодписи; + РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи; Для Каждого СтруктураПодписи Из МассивСтруктурПодписей Цикл ИмяФайлаПодписи = СтруктураПодписи.ИмяФайлаПодписи; @@ -456,10 +487,10 @@ КонецПроцедуры -// Добавляет ЭЦП из файла (файлов) +// Добавляет ЭП из файла (файлов) // // Параметры -// ФайлСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭЦП +// ФайлСсылка - любая ссылка - объект, в табличную часть которого будет занесена информация о ЭП // МассивФайловПодписей - Массив структур - массив структур (ПутьКФайлу, Комментарий) // УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы // ВладелецФайла - любая ссылка - значение реквизита ВладелецФайла у ФайлСсылка @@ -493,7 +524,7 @@ ИмяФайлаПодписи = Файл.Имя; Отпечаток = Base64Строка(Сертификат.Отпечаток); - КомуВыданСертификат = ЭлектроннаяЦифроваяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); + КомуВыданСертификат = ЭлектроннаяПодписьКлиентСервер.ПолучитьПредставлениеПользователя(Сертификат.Субъект); ДвоичныеДанныеСертификата = Сертификат.Выгрузить(); ДанныеПодписи = Новый Структура("ОбъектСсылка, НоваяПодписьДвоичныеДанные, Отпечаток, ДатаПодписи, Комментарий, ИмяФайлаПодписи, КомуВыданСертификат, АдресФайла, ДвоичныеДанныеСертификата", @@ -526,7 +557,7 @@ Возврат; КонецЕсли; - РасширениеДляФайловПодписи = ПолучитьПерсональныеНастройкиРаботыСЭЦП().РасширениеДляФайловПодписи; + РасширениеДляФайловПодписи = ЭлектроннаяПодписьКлиентСервер.ПерсональныеНастройки().РасширениеДляФайловПодписи; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); @@ -563,3 +594,22 @@ КонецЕсли; КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Служебные обработчики асинхронных диалогов + +// Обработчик результата работы процедуры "УстановитьРасширение". +Процедура УстановитьРасширениеПослеОтвета(Ответ, ДополнительныеПараметры) Экспорт + Если Ответ = КодВозвратаДиалога.Да Тогда + Обработчик = Новый ОписаниеОповещения("УстановитьРасширениеПослеЗавершения", ЭтотОбъект, ДополнительныеПараметры); + НачатьУстановкуРасширенияРаботыСКриптографией(Обработчик); + Иначе + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Неопределено); + КонецЕсли; +КонецПроцедуры + +// Обработчик результата работы процедуры "УстановитьРасширениеПослеОтвета". +Процедура УстановитьРасширениеПослеЗавершения(ДополнительныеПараметры) Экспорт + Результат = ПодключитьРасширениеРаботыСКриптографией(); + ВыполнитьОбработкуОповещения(ДополнительныеПараметры.ОбработчикРезультата, Результат); +КонецПроцедуры diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/ЭлектроннаяЦифроваяПодписьКлиент.mdo b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/ЭлектроннаяПодписьКлиент.mdo similarity index 84% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/ЭлектроннаяЦифроваяПодписьКлиент.mdo rename to SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/ЭлектроннаяПодписьКлиент.mdo index 7e5d0e311..5c58e206b 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиент/ЭлектроннаяЦифроваяПодписьКлиент.mdo +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиент/ЭлектроннаяПодписьКлиент.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="10d796e9-a3d4-4ef0-87d5-8315aa12f1c8"> - <name>ЭлектроннаяЦифроваяПодписьКлиент</name> + <name>ЭлектроннаяПодписьКлиент</name> <synonym> <key>ru</key> <value>Электронная подпись клиент</value> diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl similarity index 59% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/Module.bsl rename to SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl index 9364738cd..6e24a8297 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/Module.bsl @@ -6,14 +6,14 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Получает представление поля КомуВыдан или КемВыдан сертификата ЭЦП +// Получает представление поля КомуВыдан или КемВыдан сертификата. // // Параметры -// СтруктураПользователя - Структура - структура поля КомуВыдан или КемВыдан сертификата -// Возвращаемое значение - Строка - представление +// СтруктураПользователя - Структура - структура поля КомуВыдан или КемВыдан сертификата. // // Возвращаемое значение: -// Строка - представление +// Строка - Представление поля. +// Функция ПолучитьПредставлениеПользователя(СтруктураПользователя) Экспорт Перем SN, GN, T, CN, O, OU; @@ -56,13 +56,14 @@ КонецФункции -// Заполняет структуру полями сертификата +// Заполняет структуру полями сертификата. // // Параметры -// Сертификат - СертификатКриптографии - сертификат криптографии +// Сертификат - СертификатКриптографии - Сертификат криптографии. // // Возвращаемое значение: -// Структура - структура с полями сертификата +// Структура - Структура с полями сертификата. +// Функция ЗаполнитьСтруктуруСертификата(Сертификат) Экспорт КомуВыдан = ПолучитьПредставлениеПользователя(Сертификат.Субъект); @@ -86,13 +87,37 @@ Возврат СтруктураВозврата; КонецФункции +// Возвращает структуру, содержащую различные персональные настройки. +// +// Возвращаемое значение: +// Структура - Персональные настройки для работы с электронной подписью. +// * ДействияПриСохраненииСЭП - Строка - Что делать при сохранении файлов с электронной подписью: +// ** "Спрашивать" - +// ** "СохранятьВсеПодписи" - +// * ПутьМодуляКриптографии - Строка - +// * РасширениеДляФайловПодписи - Строка - +// * РасширениеДляЗашифрованныхФайлов - Строка - +// * ОтпечатокЛичногоСертификатаДляШифрования - Строка - +// +// См. также: +// ОбщаяФорма.ПерсональныеНастройкиЭП - место определения данных параметров и их текстовые описания. +// +Функция ПерсональныеНастройки() Экспорт + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Возврат ЭлектроннаяПодпись.ПерсональныеНастройки(); + #Иначе + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ПерсональныеНастройки; + #КонецЕсли +КонецФункции + //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Получает назначение сертификата ЭЦП +// Получает назначение сертификата. // // Параметры -// ФиксированныйМассивСвойств - ФиксированныйМассив - массив расширенных свойств сертификата (EKU) +// ФиксированныйМассивСвойств - ФиксированныйМассив - массив расширенных свойств сертификата (EKU). +// Функция ПолучитьНазначение(ФиксированныйМассивСвойств) Назначение = ""; @@ -104,5 +129,21 @@ Возврат Назначение; -КонецФункции +КонецФункции + +// Возвращает структуру, содержащую различные общие настройки. +// +// Возвращаемое значение: +// См. ЭлектроннаяПодпись.ОбщиеНастройки(). +// +// См. также: +// ОбщаяФорма.НастройкиКриптографии - место определения данных параметров и их текстовые описания. +// +Функция ОбщиеНастройки() Экспорт + #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Возврат ЭлектроннаяПодпись.ОбщиеНастройки(); + #Иначе + Возврат СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭлектроннаяПодпись.ОбщиеНастройки; + #КонецЕсли +КонецФункции diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/ЭлектроннаяЦифроваяПодписьКлиентСервер.mdo b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/ЭлектроннаяПодписьКлиентСервер.mdo similarity index 84% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/ЭлектроннаяЦифроваяПодписьКлиентСервер.mdo rename to SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/ЭлектроннаяПодписьКлиентСервер.mdo index 130dc8087..e25e571f4 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьКлиентСервер/ЭлектроннаяЦифроваяПодписьКлиентСервер.mdo +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьКлиентСервер/ЭлектроннаяПодписьКлиентСервер.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9f593f27-8009-40c0-94d6-53f177ce55f4"> - <name>ЭлектроннаяЦифроваяПодписьКлиентСервер</name> + <name>ЭлектроннаяПодписьКлиентСервер</name> <synonym> <key>ru</key> <value>Электронная подпись клиент сервер</value> diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/Module.bsl similarity index 93% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/Module.bsl rename to SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/Module.bsl index c6a623423..33948adb8 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/Module.bsl @@ -6,8 +6,7 @@ //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Возвращает путь модуля криптографии для текущего компьютера -// +// Путь модуля криптографии для текущего компьютера. Функция ПутьМодуляКриптографии() Экспорт ТипПлатформыСервера = ОбщегоНазначенияПовтИсп.ТипПлатформыСервера(); diff --git a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/ЭлектроннаяЦифроваяПодписьПовтИсп.mdo b/SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/ЭлектроннаяПодписьПовтИсп.mdo similarity index 85% rename from SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/ЭлектроннаяЦифроваяПодписьПовтИсп.mdo rename to SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/ЭлектроннаяПодписьПовтИсп.mdo index a544a06db..dfbb10355 100644 --- a/SSL/src/CommonModules/ЭлектроннаяЦифроваяПодписьПовтИсп/ЭлектроннаяЦифроваяПодписьПовтИсп.mdo +++ b/SSL/src/CommonModules/ЭлектроннаяПодписьПовтИсп/ЭлектроннаяПодписьПовтИсп.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="820bb4b4-895b-4ccf-a350-2545bf8a2f7e"> - <name>ЭлектроннаяЦифроваяПодписьПовтИсп</name> + <name>ЭлектроннаяПодписьПовтИсп</name> <synonym> <key>ru</key> <value>Электронная подпись повт исп</value> diff --git a/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl b/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl index df2cdc869..100d04200 100644 --- a/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl +++ b/SSL/src/CommonModules/ЭлектроннаяПочта/Module.bsl @@ -14,9 +14,9 @@ // Примечание: параметр ПараметрыПисьма.Вложения может содержать вместо двоичных данных адреса во // временном хранилище, по которым хранятся эти данные. // -Функция ОтправитьПочтовоеСообщение(знач УчетнаяЗапись, - знач ПараметрыПисьма, - знач Соединение = Неопределено) Экспорт +Функция ОтправитьПочтовоеСообщение(Знач УчетнаяЗапись, + Знач ПараметрыПисьма, + Знач Соединение = Неопределено) Экспорт Если ТипЗнч(УчетнаяЗапись) <> Тип("СправочникСсылка.УчетныеЗаписиЭлектроннойПочты") ИЛИ НЕ ЗначениеЗаполнено(УчетнаяЗапись) Тогда @@ -75,8 +75,8 @@ // // параметры к функции см. в функции ЗагрузитьСообщения. // -Функция ЗагрузитьПочтовыеСообщения(знач УчетнаяЗапись, - знач ПараметрыЗагрузки = Неопределено) Экспорт +Функция ЗагрузитьПочтовыеСообщения(Знач УчетнаяЗапись, + Знач ПараметрыЗагрузки = Неопределено) Экспорт ИспользоватьДляПолучения = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(УчетнаяЗапись, "ИспользоватьДляПолучения"); Если НЕ ИспользоватьДляПолучения Тогда @@ -119,9 +119,9 @@ // Наименование - Строка - Наименование учетной записи // Адрес - Строка - Адрес электронной почты // -Функция ПолучитьДоступныеУчетныеЗаписи(знач ДляОтправки = Неопределено, - знач ДляПолучения = Неопределено, - знач ВключатьСистемнуюУчетнуюЗапись = Истина) Экспорт +Функция ПолучитьДоступныеУчетныеЗаписи(Знач ДляОтправки = Неопределено, + Знач ДляПолучения = Неопределено, + Знач ВключатьСистемнуюУчетнуюЗапись = Истина) Экспорт Если Не ПравоДоступа("Чтение", Метаданные.Справочники.УчетныеЗаписиЭлектроннойПочты) Тогда Возврат Новый ТаблицаЗначений; @@ -269,8 +269,8 @@ // // ПРИМЕЧАНИЕ: функция может вызвать исключение, которое требуется обработать // -Функция ОтправитьСообщение(знач УчетнаяЗапись, - знач ПараметрыПисьма, +Функция ОтправитьСообщение(Знач УчетнаяЗапись, + Знач ПараметрыПисьма, Соединение = Неопределено) Экспорт // Объявление переменных перед первым использованием в качестве @@ -463,8 +463,8 @@ // они сами не возвращаются но возвращаются их вложения - двоичные // данные и их тексты в виде двоичных данных, рекурсивно // -Функция ЗагрузитьСообщения(знач УчетнаяЗапись, - знач ПараметрыЗагрузки = Неопределено) +Функция ЗагрузитьСообщения(Знач УчетнаяЗапись, + Знач ПараметрыЗагрузки = Неопределено) // Используется для проверки возможности входа на почтовый ящик Перем РежимТестирования; @@ -599,10 +599,10 @@ // Возвращаемое значение // Почтовый профиль (тип ИнтернетПочтовыйПрофиль) // -Функция СформироватьИнтернетПрофиль(знач УчетнаяЗапись, - знач Пароль = Неопределено, - знач ФормироватьSMTPПрофиль = Истина, - знач ФормироватьPOP3Профиль = Истина) Экспорт +Функция СформироватьИнтернетПрофиль(Знач УчетнаяЗапись, + Знач Пароль = Неопределено, + Знач ФормироватьSMTPПрофиль = Истина, + Знач ФормироватьPOP3Профиль = Истина) Экспорт НастройкиСоединения = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( УчетнаяЗапись, @@ -683,7 +683,7 @@ // Значения колонок, типы которых не поддерживаются для оперирования на клиенте // преобразуются к строковому виду. // -Функция ПолучитьАдаптированныйНаборПисем(знач НаборПисем, знач Колонки = Неопределено) +Функция ПолучитьАдаптированныйНаборПисем(Знач НаборПисем, Знач Колонки = Неопределено) Результат = СоздатьАдаптированноеОписаниеПисьма(Колонки); @@ -951,8 +951,8 @@ // если Ложь - ошибка при входе на сервер pop3 // ключ "СообщениеОбОшибке" - строка - если статус Ложь - содержит сообщение об ошибке // -Процедура ПроверитьВозможностьОтправкиТестовогоСообщения(знач УчетнаяЗапись, - знач Пароль = Неопределено) +Процедура ПроверитьВозможностьОтправкиТестовогоСообщения(Знач УчетнаяЗапись, + Знач Пароль = Неопределено) ПараметрыПисьма = Новый Структура; @@ -986,8 +986,8 @@ // если Ложь - ошибка при входе на сервер pop3 // ключ "СообщениеОбОшибке" - строка - если статус Ложь - содержит сообщение об ошибке // -Процедура ПроверитьВходНаСерверВходящейЭлектроннойПочты(знач УчетнаяЗапись, - знач Пароль = Неопределено) +Процедура ПроверитьВходНаСерверВходящейЭлектроннойПочты(Знач УчетнаяЗапись, + Знач Пароль = Неопределено) ПараметрыЗагрузки = Новый Структура("РежимТестирования", Истина); diff --git a/SSL/src/CommonPictures/НастройкаИАдминистрирование48/Picture.png b/SSL/src/CommonPictures/Администрирование48/Picture.png similarity index 100% rename from SSL/src/CommonPictures/НастройкаИАдминистрирование48/Picture.png rename to SSL/src/CommonPictures/Администрирование48/Picture.png diff --git a/SSL/src/CommonPictures/НастройкаИАдминистрирование48/НастройкаИАдминистрирование48.mdo b/SSL/src/CommonPictures/Администрирование48/Администрирование48.mdo similarity index 60% rename from SSL/src/CommonPictures/НастройкаИАдминистрирование48/НастройкаИАдминистрирование48.mdo rename to SSL/src/CommonPictures/Администрирование48/Администрирование48.mdo index 3c3473ac8..250160fdd 100644 --- a/SSL/src/CommonPictures/НастройкаИАдминистрирование48/НастройкаИАдминистрирование48.mdo +++ b/SSL/src/CommonPictures/Администрирование48/Администрирование48.mdo @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="93c347d8-66cb-406c-9ee6-b1962482893f"> - <name>НастройкаИАдминистрирование48</name> + <name>Администрирование48</name> <synonym> <key>ru</key> - <value>Настройка и администрирование</value> + <value>Администрирование</value> </synonym> </mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png b/SSL/src/CommonPictures/ДополнительныеРеквизитыСведения/Picture.png index 5875d4f3a06fe372999ffc4d0db1e0d7ea5a5311..d48733b3263888d3a6f7dbc31cb554ec9263063e 100644 GIT binary patch literal 1421 zcmV;81#<d{P)<h;3K|Lk000e1NJLTq0058x000mO1^@s6`S$i;000G4Nkl<ZXo2mS zZEO@p9LAsB+q-LfrO;ApXe?R`qJ}_A(O5_Y1dANhk{Dw|#6SZCV<169<V6$s27I81 zfsjCeSWLkfg>a@tAW$p<Hc+4j1X54h1Y2nD{dQ+(cKmS1wRhah9$HTHo@BFgGxN;+ z{{PI)&F%@DbEK8l!%9pwKw6KtBmlVd^~5(J<bEP%kdjaf=dff7>z;Z2*rt@x=~S9O zh2os!!ogP#Yl@v~ay!?Qn_N?Fa^`E}U6)sB=l0Fs&pF4x`AYMr?ven2le}_BMsU{I zx3VN)P|*}&XpdNZdgrU%2BQ&1qv?KYtI2rpo04~$cRu<h|De+Rsgnc%ir)v${9x+c zutu)AFmn9loRQ-vht+r4+o%0<qMnxkDGvZh^QTf008mPyQ8%c+^MMXB@!<Y*nh?Ab ztqb57_lOu1D$SodNdTZR3QoOX{yWioMMR(}y)g$|yX*T60M<uqV;Y6VI2=yr#$9V_ zK8x08?!M87IYSkd`(7^)uNEr%T?_z@G;VBv<9=P5KXv?pGZ3SJi}+(;MMOYJ%m9cY zuV3=^Y%q<1G7XF|P!=fDV0rugZ`T8e8i4BMRW)-L!K-@UB2IWz7u>P~gs4zu1&Uw6 zMO#Nz7+oBG(L5Z6j42QeT~K<Dhxp58ZOGBXZ!sA_Tuva%g1au?L-CgiQ=w&=(D3{2 zr1^tAg7<%4{v`kqMG*owK+w!F!NTJ)#tA^dnJc#f6RH%7ss_rGLLn*$Rbi5(n0{5! z(0us}D5X$U3PKbRSpii8eyY+3Jn{IAnPbtt=tFR~1Nr+_gL;3%kfLh17cMjRNCuK; zYccijAIU%A*+M+Ic0Rb<0kY{3Z0Fjr;@w&3s4U@Gl0l91NAgb}IS<9F_kg<{cxm$o zsBf*sg31+Pe!ck@&BI~LDMenEjIlY+Y(WqZ`65_P{teK;IcK6M8UTcik!=10JCMc! zWB?c(H-J9H`lbMiqI}hG?8kZW+>#`1jMe7rVMl&CdbKK6dr(LEe~8bYflR8vZOOs) zg<J7_-8S4_@DU`-VEEh)V_pLO!t6;H74+wR`X0(Z-il%CYQSRnBl*WkuF(8XuigXe z%B3jZRv+fqlYh}%045dT_Sx-l+`R`%RYUV$s}+DP9)F}(m7Qu-vRK8111FlA_gbyx z?;kyizT;KG{BM~srcoKgD$du<ZeWzx3Y>EsubtRkF@HzC>THV{K!4r4^9Qb+Z|I)2 z>|}v1!vHHDzi7&ZMtWgix(#NN2`~d5w+e?$F!^MQ5M{Wi`gP{Ze4zY#@^2pcB5s}C z0!xMyL-Wn(w0m)*&DA(_W#bIJ3>OboHw=3svogY8iGB+xS$}W`(pr1}yfKY<UAjO# z9v=izyrdU=pcS7#P*?E9=V)8BE>v53=wR%VXcWEh!_UI0sb!(PKAFXn$gd~=xfT_U zt~+>Y{1CVtDl|oaqlZ)^!=T8lB0t~!kNPD5C@jK(mc}nN&Us0qK>z@P&^n@!)F(6f zKq?XcbCVWZuFYSQ<?si7dJBeFaAHPv?wppZy5~4Hv6T1se^)k!&uO`;dlAL+>&gGv z=_9f!C58^W*Q6-|I_y5kKHj7|005$hrVhKeGQwZ^cl^Tt;otbWQN`Sp9XO!Ab@7_8 zdvq}e0FRGg`R&exiy+m001yNLXZKpIz1`|^M-QoxeY{Ckc<tgHr)`PdePh@*zt#}p z4?6=T>yQ07^dFK(R^6c5pe5~g0RU>Qw+nTnin)t2^>Oe6p(iC9A`Z>TC^$ysnMwC9 b8qNO~f1Y_ruCM*{00000NkvXXu0mjf1irJQ literal 1100 zcmV-S1he~zP)<h;3K|Lk000e1NJLTq003YB000mO1^@s6>AHIP000CNNkl<ZScUDF zZ)_Ar7{;I7+q+(SSZKv2HezfIq9#fU#?TTih#_jJkSI|RNoZ3I#?%D=RcSS$-{1>W z6A4L4N+en!Cem0_DiRG4QJYer1Qab5YOsa&djDs3W?nyRd$iZv>tS-#OMQ~f&doc| z?C*Vd=Vr4S5#fJLpY-VlnCUVA;MC`(&q2$1Pj~a8XoLu!Os($Tr#iMx8(or0Yknfa z&-))gq*x!RNG~aNkrcZ~GSou@r{7g4n^)~6BK((+bmlhzfOu{R3@1qT-?%ddaNE3P z+U-O7>K}GJG3anQ;dHvjqTMd%^@Bw(o!E8jADPKYXMO_!SU3cdVMz1Zgdiy&3Kx}S z7cMHB&_B@EyW*GcTBrz^_5^_R<~IO92mvMh5aIqw10p<tvG*ix^vu-&Kv;N-7^hS^ z^BVx5qyUK^WcX_QQ85`PHf%fLmfc@%1yCO^CY6Aa1n<a5!|o5NK8!bJUGsuNBvBzE zH(rl<P(|Bep9Fx`!wtR9j`gK8zqJQQVI4edgB6p3;I;{H7O8*jg;kJBLP!NEC4{uv zVzm9q-Y@F`#7)2qQbpCeY6Q&ye0&4}(+7XV3(ifL5e61!=xV!CF@Y`tzn*a?9PVY% z9Rpy)N22_T%eQ7H!|!o9z<nb?mIv2-p?}3+tSyJibfNuH(<FWa0CZi4Mh<8y!?v&! zL{8ffXAH;A{B9M@6kw)lwS@rVCb%%+G7MY4$rMhUJ_aEKOjCe!1|DG$rsWr=nB+;s z@63D{gVk?<{9ep$u7wExiaGOE!(UmGF=RM+Zd<2o{P<Y@NAAnVU0XJQ{9f>F2heu1 z2b*6m$CZ^ulw~-~Sbr@4lZES1P`d}@_u|p*ucM`VCpNC!9Q9i(KoI~pfZ2%)AC=uo z0T^SSwRe2GK9Sonj0U?{Xh^mm|N3l&U3^rn<9{UPcOz3U_&wRUP`LvS>}$m3jc>v5 z%tpxXb>>dNpFe9U=8yVw-hTxp@9e-Gbybiy{#gEnhA(>kdusRKnYTBgq_HLH*N6y5 zc9sr4w&Byc=19*Jd0V=E^-rAnseQ1#=4f70h7>CizwXL`;=}0M)QAk13&;QheiPmZ zN7>O%EzWdtb?)gUlnVdo3Q*m{fB&|E2YpFR76^o(>H4W;FP>^8=C}ItKK=+j)pgO{ z;sg8bcj7pD@S7jC@0Tx*?yNUc{6v0@h;Z)UlFCbeWxhy6MfOvSlcsgwozK5`==tMK zHv^F>O~rrz(pNoy)NIf4hONKOyg42W`xw@Ao=v)l9i_#T3cofJzJ~6bUqG%|)&{+{ z>%7*qpnw1%5aM|Aa{rV?Or?KDd<_jmO#hHKjI~|oH2|o((5tx>poBE1+y4*4ZxqZz S1rk*N0000<MNUMnLSTZKI|_gR diff --git a/SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/Picture.png deleted file mode 100644 index 7b4c372893d8a884ed4832ec5f3d11ec4830c8e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmV;a0#^NrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!OG!jQRCwBAWPpOE3KI)UD+lktf4}@c zdT8tB=Kja0LE``a|7Rcw&K$^U{`2eJzkh$<{0HG*-!K0=ve~8vW&l3SP>~~P@jl=8 z|Hq<;|9`$82jdU1?*G5Op8B^jjn|Zr0ZjU;4Bo7Tk_^9ZoMrg&auvgSJzoZv7F~uP zag&+!b(!4>xt{6I_fP-7J=(?a_th(g?@v!M{QLKV;ro+A41X%VF);r5N6`B$XRiL; z>};l7!>n?j@$XMT28P-84F6g#GW>t|g+cAz4^iuztAc^*K-eFMHv;k6qtnCI!VF*p z5qsyG*Ba<~Hv-LLgb4rsclhj?uC8-2@;Zvbq2Vs-Ow-n1ViM$K|Ift0@b}97x2u7Q zN`VGFWrUejovLJPWp3)t$nc-x+_}?Rw*BiUaWIk%t4p+C2FbI#C^CfDOl44&6=Yyy zV*GpH+~ZY11ELtQ#j|zhs$fk8;T01LoLFFD!Bv|WxH%zQRT)8sHy^+Mx&Gj71QU+1 z2@bSZWBT)#fdPhDn3))U0|WKL=bsFxufJgU_y0f0Wx==%u&~gUX5#l!1Zw^d#{d5P zWBB>&FW8_NxBD5My!;IEegF#&15O+`|3uzm-94bS5P{iMzDUx34Cz;%{OenOVgoK0 ztlfO%_CJ{I*f2;Qqz-2iwaQqztZ?$tKX;!0`47VX?dAW&*dTF`JV+f2o<vr9^6C>% zXotF6s51Roc9-eQ)u;b<p1A$*?h{Bl04F3u*%cI}(3EHa3LEs42oPWZMlf@W&g<g? P00000NkvXXu0mjfez#aH diff --git a/SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий.mdo b/SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий.mdo deleted file mode 100644 index 2c5c5e8fe..000000000 --- a/SSL/src/CommonPictures/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий/ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий.mdo +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9c7f2728-10a9-463b-b04c-01ee26f3d4c5"> - <name>ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий</name> - <synonym> - <key>ru</key> - <value>Запустить отдельный сеанс для выполнения регламентных заданий</value> - </synonym> - <transparentPixel> - <x>10</x> - <y>2</y> - </transparentPixel> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации/Picture.png index b4293611e3de1f8bf178fef9f18e51f39758fd72..5a4892322064e4ada83304a86111ac96a45d195f 100644 GIT binary patch literal 16887 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 Z|K)1q{l^b?YzA$%_jL7hS?83{1OQNaV|M@m literal 43519 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 LO}1LvJmh}>%x1E{ diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/Picture.png b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/Picture.png deleted file mode 100644 index 5a4892322064e4ada83304a86111ac96a45d195f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16887 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 Z|K)1q{l^b?YzA$%_jL7hS?83{1OQNaV|M@m diff --git a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/ЗаставкаВнешнейОперации83.mdo b/SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/ЗаставкаВнешнейОперации83.mdo deleted file mode 100644 index a759c01d1..000000000 --- a/SSL/src/CommonPictures/ЗаставкаВнешнейОперации83/ЗаставкаВнешнейОперации83.mdo +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="20397e0c-b6e7-4ce0-8262-d9aacd87bb23"> - <name>ЗаставкаВнешнейОперации83</name> - <synonym> - <key>ru</key> - <value>Заставка внешней операции 8.3</value> - </synonym> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png b/SSL/src/CommonPictures/КоличествоРассмотрено/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..62611691577ac4fe273ce83403b9db9db47111c5 GIT binary patch literal 3013 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 Hu0mjfA~%;T literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/КоличествоРассмотрено/КоличествоРассмотрено.mdo b/SSL/src/CommonPictures/КоличествоРассмотрено/КоличествоРассмотрено.mdo new file mode 100644 index 000000000..9ec43c6e0 --- /dev/null +++ b/SSL/src/CommonPictures/КоличествоРассмотрено/КоличествоРассмотрено.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="06fc381d-f27a-433c-95c3-e0981e01f22b"> + <name>КоличествоРассмотрено</name> + <synonym> + <key>ru</key> + <value>Количество рассмотрено</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/Picture.png deleted file mode 100644 index 708bc331004e439aa033a27d8b588505e034348e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 882 zcmV-&1C9KNP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#6iGxuRCwBalSxbyVHC&zGu`)AY@yTz z2dxot3m1(h8V(x0m|!HRK@WJ)M9_nYCdP}#n{iJ}#0&04ZGs1v3sEDIXe6|;2rY<I zV1O>rMM|fg`J5SOH6DD)``$Op@BiMsHy;Qgklg$Hd9}ymNl5#)wzgF3-PY>Dv;R3I zE%(~)C5&ckKtU@v(zH@XQ6v+IO!^cwstzAHY{7p_>GgW6^#(&=E|cFfG&BH}N)4OM zrYkEg-P|`E<^sVH;ozlrf<~!InT?vDyWDZ}_LDCU3IbHS$CJ|PEQ+3<UfuEvCgohp zWZBW-#afLL$>a>8Q!E;fHskE=k6`0zu(4#;X*YLvUaQ+93DEoN>rI(VR##GDhjST| zsa##TNNdo;pf`eo5@&X8$I^y%sBxE}W~B?8*DTj$GWnggC%rEv0R^*yNl>&x&}wz6 znRv`F!A?*DHwUZ5icn|(oq;~MFF!)(=P?iw(5h9?Y1DLocxsuiKmCKw<#Jo&@u^;# zreL#L;INtDush)Q`^8?EaHQ!NUU!emu<YVuGwR{6nlvGHs+n#&+Vs_AG^`DVS#EGJ z2%q1F?(PpzsR_o}pC~UcgFybk3p+895y@Y3Zd$q}jcP}2t%~E)INjWYJU@$lb^CDc z`~}Qr2}0p%FfJ>YC010pY`FH~05-Xu$ma5<;t#RoL^~HvaAfw*Rl?;7iKYY+NeE<e zh9~T_Kt`iH8Hw;@Xp$$fTUW@ZV47?_-p<j5d6ro8k*>f5lJzZ^P77icKwhjpFDyi{ za$bx?ypGnjAT%12nWBKvp!W9!CuA@u!Mq?wGA|^$Aj~^2R}6gpJ_(b^6a_Y}aNT&< zGm;tz$BGayXI}tic)pR}$K&Yo{YXhnQQ%ZV)hnmn)bZ@?w`}ldd|rU3V10TWOhctO z2~vbR-ha!M+sz%P4^_RA57Xav;NqM6<B{avZ5t{~Ynf84a+Sz~8yt(tWlNbQ`0@E& zjq+LeS3t7M5Bqla4v)2@esSw#iCKH0$<jAVWlNb0@BS8G0Ft@6UdW0P(*OVf07*qo IM6N<$g0*R((f|Me diff --git a/SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/НастройкаВыполненияРегламентныхЗаданий.mdo b/SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/НастройкаВыполненияРегламентныхЗаданий.mdo deleted file mode 100644 index 369d238a5..000000000 --- a/SSL/src/CommonPictures/НастройкаВыполненияРегламентныхЗаданий/НастройкаВыполненияРегламентныхЗаданий.mdo +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c2768e31-9e61-4d8d-838d-90b2e2683148"> - <name>НастройкаВыполненияРегламентныхЗаданий</name> - <synonym> - <key>ru</key> - <value>Настройка выполнения регламентных заданий</value> - </synonym> - <transparentPixel> - <x>14</x> - <y>13</y> - </transparentPixel> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/Picture.png b/SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/Picture.png deleted file mode 100644 index c3687db9032f4f8ce2325c0314ea731c9ce4e7b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 802 zcmV+-1Ks?IP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!#7RU!RCwBqlU+ztVHn5%JIqbphcnwk zXJFIq!XUMvGAioAY6b}lLMx$*qHbCdL04UM>xI@u7kLvI2}+?|ND7uhV4#xuF`aF5 zPG{=A+UDlA^U?dBd6r%TJ@9Pf;r;*K|MNdP%!=)t;A^NANI_~}LyZu$9!>9_{i~S* zHU&<l#gw&P04Z0~S%Fg(A(3YD@E;|klsW53L8(vxN+2G~AhMkX*Y?5L`Egpk9!}^3 zktCy(=f$*YrPESoc=57(qH7O;*2wu|f;6=Bj`D7Qgh{gkEC);Q{<8~Xvwp0F;#dnt zQ>A+C@Nm1WF$WkrRVPG}Nl|RjsSu8)aAkZ397hJPJCN7ajwe^U!Sg^Mn!vnolPk!V z4-R+O8f9Ho6@o&o6vgJAQFh|;2|4{8Po#0rvnoQm2c1}03WFyeX;a9zd2i}Wb=7Sq zzMYAMB1!D)9CQwi`{cLgJjmxMf`LFz^J3Zn-A`=tQLHW`PBqHKwT=6XO06{C^>}5k z`lr>kW&=`WZ`-UJcU(TO1jLDuzhVhxC{`o7wQXT;I$Y~?yg|~gD&LR7OD3?yHcLQR z0I;|mhRLXdsa%H&V=>zMTTo{yMJmH;<WlmKPKC+q50K$@?%}gLKWaTrvJk-0Gh`Op zu;W5~B?iV8ct!%06cuhdya7b7*$GI<y5O@e#BU+H4uuA6b}X(0MNJN%Rw;f=I)8~m z>VPHQGZKh2eT1~Rols}o>(CHQ4p4i@_<Us28(UZo=0qHywao8iL06z+w?BlhQ%f<b z$pIcVR}YlxHGREb94V(Slm&1y=z2O}YOc&ZPAcvjb)?Gl+P=p(st0m^WvN=8eR|{H zj5eLFsn8rY9e~+bA_n?%H7MGqH&gMurx#oIybHUl?d_cPyJyuN+e#k^{!Zwnkm=6U gHoaLo`$vEQ08)Opq~Orn?*IS*07*qoM6N<$g4&L8(f|Me diff --git a/SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/ОшибкаВыполненияРегламентныхЗаданий.mdo b/SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/ОшибкаВыполненияРегламентныхЗаданий.mdo deleted file mode 100644 index 4a9a99d08..000000000 --- a/SSL/src/CommonPictures/ОшибкаВыполненияРегламентныхЗаданий/ОшибкаВыполненияРегламентныхЗаданий.mdo +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8943233f-5c9a-4e6b-b1c2-3bbb94b6c4a7"> - <name>ОшибкаВыполненияРегламентныхЗаданий</name> - <synonym> - <key>ru</key> - <value>Ошибка выполнения регламентных заданий</value> - </synonym> - <transparentPixel> - <x>14</x> - <y>3</y> - </transparentPixel> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.png b/SSL/src/CommonPictures/ПиктограммыЭлементов/Picture.png index 713ebb05bcde69ddcd6b8d00fc4aa5888a5dd7b1..4d9b265c2fdcf9f3a90f77e9584757500502333c 100644 GIT binary patch literal 6571 zcmV;c8C2$pP)<h;3K|Lk000e1NJLTq00N)@000mO1^@s6$!X1*00004XF*Lt006O% z3;baP00009a7bBm000ic000ic0Tn1pfB*mh8gxZibW?9;ba!ELWdKlNX>N2bPDNB8 zb~7$DE-^7j^FlWO02wDqL_t(|UhSP}R20{?$K(C{*8Aj5o-r>sH*qC;lV}nXjd31B zOh98KiHR{zafo@*5C>E=4yeS5K@>$q83Y9dK|q-ru$c#up#ho4Mr}l9=mu)PvkOnB zy6Nhw?gmlQto2`Ab?WRh?5eK*)jsDGFT7y>Gkf4U^}yLf^IrEjH1E~tw0q`m4Wb7c z?#4oG>IJpRQm%lQ>Pi!LNN*k-)lZoIB<#i1Va{XrfY}4jw+9r{-+-Ghz98zJH5i`A z$jE@0n3y4}e=z#=+?N^duzDX+htJkU%&84?!QuOl;g7H0-)Bh2OHwx35rHm6|6yfg zNLkNvUcbXL561Yd?vC{SQFZB<#pY+ZFXpxz=K*6NvZ$yCVq;^WI>8xw>tdj{Hk$p+ z3b5n7naYYwrGeKYrMCMIOGE9)06;uZHb>!r>3AIT<rNldz^JMA#(BqVW%hvC1JAk# z5Hb-qx&5H<dFrK?1|0wqG7&bp^;7ut^70Z_f41MGud@B;r{@IEQK=O)TUB~v&Q>ue zXsGSQwDDQUL*Ns-%97!JMhFx~c|wxce%QTeoVb(txPu6ujph4LmxwGM3%4Q5YlT5& zJqte5)y8|dTZUab`FR7=n+>Sola_M6zHD>}TupSy2(894huZ#GJx7DtZet*lwg=%8 zw<{xdf-3tskt6$=;kAMHyMs_!R8b4nH8pT~@B0Ki_Ys}pXdjziU0nl3<u%|Ha7_b1 zO|_?OZ))q5WR>5SL}Zmp!m~=$!hK9{>FAQ^^Si0`y2{?-eam~@>6^e6rVZx#H<xYp zz~99K2$@_6<-%uOa<bm<`#|^zA(IQCT=<m9Wa8@22$&YiD64?!ssKh=%Br_R1`l$# zGHG642;MA)+I}D$`81S40MsY+zzT3&H4_dlnLyz4J=kIOjzJO7oOl~H`iTHa`-Iyi zDH|c)dGX%@Kz$ERb1%<#1g0l}l`O@c@pG7cK-W1&@Fb*Q@ZX}JcceT9&>^+g?o&X{ z18_;GV&x<$XLU5Xgq6*?D8ch@s{PaOJu(I&wE?s^;xMGUeXADk^Y!hJi@OvrpsK2B zh`Z(tzHZy$@V3v@!hKA~<Eri+usv{G13*o+r|mj<Jq5C=8lbWr`YFDs4t9B5*L(g= zwb$jJ)vgiH)Y%Qiigs2ZnWeCbq&*GSiMb6=mj~>;VqnxtN43PZE@R>-co6KbzNTb9 zE(A=gJj6e0p{wk;xHxcibyZ7j{l31wP+VNBu0J9o0x&H#HFeOhbA(JTgd&XM{*!=D z^bbNN7eWz6abGliVj=0i3l&VS9C}q58tQx$0j2S_%?WNZ6^S166a+@8Vo20;9X&xq zZ7=phdD`<$Utw!Wl!@)cPuw@O%?P0Jm#rZ;-WHNWRzO<V8nV3|;yo5akln07|3Vnr z-hs}4FK<1Ge$H)RdcvT$rGOP~2cNLe83pA6X!_k+2$bgY3Xju2T>xsTeQiTC$g1x1 z3Xf~oukF9z&)$HAdoRL@laVZR;^$nO6Mb5}UGV&yYR_%Yx}Z|9a*h+MlkXZZ)}8{W zArML1aP;WWe(j~@2?1zxODo*F|9}NeZDBed*9V}++S7Jrmefg<J&fdj7eIru4?^=F zDj}h~5%veA!JFUxq4!)EYmX7l<<8;26^(K(bqs|&HIE=9w+=#yTq1764~`+~cI4;h zNur~pKuF=?5fBm*0#~nIfy<XKLsnK68(pcWsE}l4W&#SMFLayk(=>#E#Kc5MNJs#Q zM1sH|7@b+2_z|E6`W_{=yyWC$K#9%&tmnh~*5N=Y+g}7xvHjr!XpQS(xIK3~bk$W0 zo?q?q0|Eln{zecLTR#^-Z{NNRSWatetHJe)txr227eb#TeA0GsA=F^_#6qNJ=P7zs zWuR)mp`nh4mw;)x(NFjCPC=OS^k~|Ep|+>(*m36CJ|fViZEja!i)$eKbiji*qR6%1 zNy^!EHdHM`?X}w=WY2|9+8<*elmckN2@6QrHMvhGJ`)9?E-o(nh(MPd9UbA=v171% z_ikSQ4YfV`&DUY7dwK3oGW1>qZ;X7I71JF8vZUX^|LClKQPAft0?NHPA%G%y8hc|i z)*iu;!XpAGmDqNeYHtWcrso$+$6GB2@?GmEOvmFnVSajjNF$hH!{~ewP-E>s`u!z% zciD?Ddci-j2uW@uz@?mruqQMRR=GvN+-)8({uftx>uX!KAMgLHIXBEy`|pp1Kuu#i zB$p~6xkLfyZluEZNBbaivBMRR-mM4Egd$e<mlMF6q|s{u!PA&OKfk_nf}q*i*=bM_ zjg5`$JYS*fab?_xuq^BY!F)pH7<>HIty>To8TrKP@4THLy|;HQlr8=U>g`rRM{2C7 z1$4BZb#-;*p(2`%gkk%utHr_K_+L(eS4_4^0E+NQAk--MJA3vl<mTqG^&1PI2%iX{ z#-4Mo-MPpt2}(>^6hgU?Pebf=)q!9sHj+spl$&3)eVp4YMR&&?=xFfJsdkc%qQ|Rq z_CT1^^ar%jLv2snvDxJkl-zHFqWWgYuYCkLWH^e<eS)--dPpj&g#=j@Sa0KhveLG1 zY43uj<`!t~P(l;gM*AR18t=trZ2h|6(^v>i3$WP`?Y0!c?XAIY<xEz%jcIsH-^G07 z$Ptjs<xoTBvQ<`ALRncEJG4+xPyl&(d2r{>9oV>WBX9q;?eRw6(9i%69y~D0-q8B* z<ya33J~6X_>2d|=t$-0DMzCUfa>?`(R|q;Wr(V1N&szj^C;^lY9JvsxFCuEJy{Qn1 z_LHsG!ouGU!op2`!hKAK>U`<l&5Hp)`Mx^{pbW!6c3uJa2Z!?tk7GVv0BVYTNL&Cc z*glzsPzs<yMQ!kBOd0&*odOFSu0dgqLW0LwC_FG(<2!7s{o;dx5S>#6=VJ50lW4D3 zBv_L)tjltrKb#6rfvui5VXFt33+fmEmV5siE=2%s?(8AzW{2vd)AM2FA1-hyGWl_O z-!Xc;Z@UM$0NT^j15^Zd0Ea+v9&mSew>q7h2e-wn(0v*J^ybZ*0|GN*Acp2a_-yt) z20f7%pmNO&sQvXDgW7=biN6(i{|*ccWFyx?_2*UImtfR0r@WrMMvaMp;*h&`^b^xC zLdun{q51pw?@JIm@zYoU#VEUW^b^xCLduoU&^&@8cPavIiviJAxtwjgvG(*FQJBOB z2rBX$E(pRDJ`J{yb)BYAwIo4njlFJFlXTSM<CW<fH2`#|?WyB_J>muDV{+h3L?*a~ zq{6W)QaI!%fqmXlu+t+Pww%5O-|ys)2x;3_KWKv5MKhpg?t4%!Z-CM|1r(ImlKpY; z@Ust!wZBxx)UR*lyD6*U-QC@5SFT(MHa0e}WXTf28vypj-rgR<!^0ssIGFt+UA%Y^ z&YwRI_+*G*PA4ZP*t~f&Z&}**_%vC()ROgIdU`r*9~BkV=ReB{rP}^8wSM12AG?=j zu4S0Eg8<z{Y5>J;rtJ{qC9DAdBU3b@pwDUqG`pbqq0mj;*a#*qSFF8QaHJsm_RnsB zqV@3E#}?EB6>!r4|8-+kaCbGPk5k`swoDVEsXN_;k4q;C^q}9jR=CC3HFe1hNfZ z0PgGZIRdDvhk*`Nub_H*bpxm=_BN-NLuh;;U?fuwpoOh)IHsHhP%8qUn2yIWALi%w zgU>!s-U6wm4<I(LO2a<mZlZ?0<sM%MN-BUOR}xumK6wQ&4ePMj<#U|~v~-=;j{sV# z=wNj<;SMa@<qX%8a$psK(0eUPb-L||i|Pn9=H&utdwV;eN=iyt*g^2Y`&d_37qqpt zvFSMMPJc`>FCTy+bp9AMo)vCed%wp<K~Wa_-x0iz!k#q%8<&D=tu-|N_yycsJQFG` zJ_Om6F%UWaEkS#XdSY8KLW|ot-2fpJBZ-F(^Up)3{*+3k>^&AC9Pi`){{G<M;lYk- zk<lx``mr30eD*}12bIfj(7Jve6n^}wC_CB)^fR7=w6rt`3k!pjCr=96pNYs|rw-9F zD1d6u3&nIy<6gg9xUBa+qZ5=Ui1OVt$&?QEH;*2t5m4=Up_q<o+;X^ZnV+ApvwjMq z`tI4fz|jy8HPv1hIC3FWXn5Ud`xxg>6v{^l&{DROM>|M5s_%GZ@_G#b)o0(;5C?5F z5ukh&uVG)7b-A6M3{&f;<*c=L_xX0)G0>-_JDqulkhSfDC8_YxY7$f~oCbF+J_cD? zHI!OSW%p}lkL~xR;;a8p&tSM+SO$&Ftr!96<z9sPR=%6EDn2PG$z%Wi{bbJ6Ran1% zz2FT1+q7%fE}u=CHi1470Oj?cwmsfBx&Fg_ef~40{`%BUh6OuKYG4{|fN8P?vUC|n zz49`QB17=FjcIu7s?#SLQP9DRfO6+^;@nd19MUjJQVsf?Tfe?JpkxIzJIr_`*B#bh z{S@xhB?+EWT!3WC5IovPWfTh5L$7CiP(f)&Jo&&=`(~_dkMKz!0C5|k6~XiI15Cem znF5j6mb+E;(#0F>06$elnbPbZW<pmo0htsc@`?N1Bwf4R2%zoV3`nyJ!80(NS9n~> z1E75Nvf>J$;<Kj_&Ge!w2?1Gl2>xo(UjVwmA%q1;jF4ia6eFJ8KJeKifKvYx`+BsO zWJUDz|GXWZV1FSL)*bPIb%%Xm>F!f7Z@Z_c>juFprJ@;9iN4$61efBnLD8yWVe>{x z9(YD(vfG$m`-lLgvWFD~P@LnbP$*bkxpD;x3kzBB^z`(E^73+a<OKl?M{y85F)E7U z1JI=*AF$9#HQ(WFK+UlmBMLxkttP{riEpsVnD8dtn(!9fnD90PPZ$es<Aebg!4aX8 z>iF^FfZDrvFE}_j2>R69+nb##g*FJR2M!!y!PC~(7S^m;BWRD;MZMi>s9ZaPg-`is z??TnGFGShVYYNXPo(qIeY!603^??^2TXys+?DqL<T7-54l!B<Pa_Ah;(jEWDMmn3* zllnoR5P;%?OMHBMKLDlmQ4rNtKb-@L4-B|nU*8wS<^JgdP%+@B4Wbuf?x^c9)m{uZ z>H|?z?O%|bn4(ZMCPHh;K2fSn`c(r!_1P;)x%4K6+gL{vdAHu<D545alGys&tIvX} zDHB@i6Um5Jc!$tMJy6GG786-;Dz%=<f@u5<!{-IbLcW}TJHRS3#ryM)G~dr7lP}Dl zkL}a9^4*kG@#Kqt&CSh?1<>u=g%_U;l&^G^W2*o7e8;WJ_rUnGrSWsfdm9%LeM#mm zUxuAOS+K(G-nuW@W4SkGz(t3T4pG~|j)2y$|Bj6SbN}$#FI_mbQyV~qCbA)X&OSW? zcIVF{3pwTr-qZ&QK<W3F>u){?#5~#{sU7hYy4I*YLMQhD2JQ4cz~FIR5ZScL8k%+! zkxxE|q-`pfE2Nz{$<kEI4?(_W7PQ4)h1$hr6vX0vb{o@s8Xwe={>w=epIz970NUKq z4f3WgL3NTSsjeY-KKr(=Zm3<c2x_cn18$>zR<2B=embYqYL^H2WGesxG^kK>2p$0x z=ZGRiVkDG%4*2X5K)L=8mR!>L0BLFG={;+UJ8(7g=YvJs3zNvcI`T>D#~=R4!iTI7 zH08}oNUv%J*X!x*{`Whb;6hX;I|PsEG%p2E@}SL58zS=#;mnyc(9zMsPW!=mcs@Qp zEC`XP6sS}x7E&>9ZEdZnA$WvP1W%#sb+C>jgznk1=ZV*kb3Sp{y>Q~IEPS>`T{mbB zD9-uB^NLYd>_cg3sovq+Bv}<Z<cyzGbf5ZG41hk8#saQ@*R=>qAAn+eF|vuDRCJ%# zF9twy>KZ;k=vss{P!UircxqpFVn9@%y%><xHz(9+`&j461VA$h96F0qWzu%dA$UFZ z%Ek<hn;7nE|A>gGzrETYTI7jPbYnTB`dC8Zc?%_lxWT#saLYyLq%x*HgwL9UZ=gfA z3`!!tf`}t?BZbN_WmP;G{<b4G<V*xmJ3GT(M<LWMV~(5RKOx`M#QysqLC3~F>?xfJ zJ!MnL^v^yq4P+4=5#8@CC&x*it4BXnM?nWW0?PdX#|WqPwXZ7z+DqmM#+C%Ju!+%5 z1kdzpi5fnw{YUqM2wmp{U&Ulf1QhKt0%|A((zYN-a);Uty>8GRBc6snz-U7xf~0&c z5q=UOL?UGBYfoExyfl8woA4;q7Zg?#p<=-lxIJ$Is1)^e<Q&S$D2SYlf~Wzsp}m_# z>~g`?FGNF_R{pS4tv01@0Ohl<kdx@%51&H?`C-lZc0S-xeg2}^N^bqMA73B31isk~ zj{&q5{*3J#g4dn{%GYmQ_BaGD<bS?JNPG*Exb+8;VNVK`_=%uN_YpX8pF$}&9|ceZ z1B`Bx)$r`Rb){0te&RlfM6uCOvLcz?rs?E|QWStLK0j_q0Tla)kxxUvH_uvr?dYDa zS22kJQ0zBCC;}*gXm@jy8hrHuDEHM%+S`TzDCR{7MF2$*CD)?5elY+_>(U0v|Exa+ z`oK{LL=Cmq1(ISHBVk(%wvTa|q);~Afwqc^qEwY~h^&I2p<aX}WUp$H>Ai^w*<-u9 zTZ*A5at#;?aRc#XjGFWw1ibeaD+H<F58gKTrht*pP6D6zla|2U;Kks#eY)NVuBofy z$#6n4MnHptf`%MGP4%CU?|k-+Jy&>r45KO-!*t&r&GZzHW|$@~=8gX)L-4PXRq$lH zr?~H!QZ|~&3LL}u+K+R<Yh$n@pcvKE^#iVJ2%Z}OMey95HXZ&fU%-MVjeJu06f*?x zDy=aIK)Lop5Hb+oGks+k^8iC3vczgE0spapp9qzhE~dTB(kN-<J0n1G$pdodeh6h> z&r_075IGqIk(2hQU+aYtP<c})<kdC{3V}*j1XQ1WLu(i0fAblXEVY92)e9i)i)l)3 z{j@LcH#6a2a0YqpQWNwoLi%eC==(n%7JLsVpFPe2)#rb{MM!)LleoUe*C`=r87lf3 zCVZU|4yRM$+(~`=^q82}Fil<l4$QLokHPnPG1r!uJj<6ahb>#S3|akR+Bgt-5IFtg z`&OURKiuaI!;1w_3ZXa@U-Zi|b(ul{icxZI{kYFv2`?rBO6?IsaVQ=aW6?B20F(=& zhJdFo5H-bK^eT3qi$Jt}^zn%?_X-1{I@3**WYN1I{KTv%TCW)U=K9+jH?ivcunI%$ zTOY_s<kJcafw+PAa`=vVO%0z|p2wT70m_NYFEpfl9CpXZC&Fi}(|qvUIE^;~IuNVk zb8>RNp#ZvL#}0$qYDm9?@(zUm^!e^?@bG^G{`qcWYwB>OBYQa0l{cI~=5VI>(FNv> zkt4_)&=Ju4$eT^WV;#4LGp#AZnE;2e_pt56*A_$}Mu;887h@k1ms-UA0mpq}$7@gK z3)dlFB6R+8>tooOHJud~KBH2y6NG&4l_7_pk6$+W+-ut#1A#(q6m#5^2N(*GITJ?$ z!X)mCsgveuj18Aw|JQ#*m%OG9p^u7N1_EeJLmOn4EBYymq;d7AO{o(=h3xM)bwI*` zIgt3}T!@-GNvW$3_03(9l%iURYfOP;vuCtq+2Ko)MSHy@8%|u691Bd4)IDs`I~1zR zKE0^AUdaD^i;(yhCK=*?bKd9Q1NiRY<O0oCHQ_#{)86X?P*XjGph%!m<GX?TT!7RE zpr+RUx3`xCPFxx8JR=HUtt3j$Goo_?KUqZ`CuENcj`ZEcgzT|RIOh|G-Ni!OK%Lan zuZ&DS{hH<~K!mE}|MOCbA$6pXIiEP}j*(A<&ok?$vU5P`pU{eTq2t<ZNl8ihioCls z4Ts=|5<t(5eydcM{~TW#*>4p*pFj2a?#QN*(_>Eki)n}*#xx}kV_MRNF>RTBQdON| zMfdR-=E1xXPOmekY+oK>$T>7Nuh0)TU%3Q8XCQ<w2_2(`PfRnm9j4eB+XqwXMB9OQ zfT0kHpT@L@ywtjm^j}U!Kv*G!l2H(K1Qh?3ri{EDgG^rpvVKNGO(cyge2a#zf5oZK zzN-fy?(;ctZT1uhnmGw#Eha0u^&8VCu{L7-&$kH4*o8@A+h)#Z_JG*~W)BE@K+H`{ zun>|#2;#()VQ3zo(XaoPp*F_k7h3TybX-@RWCf%RnMW7;G|T}t#wTKJ{PvG64R?Nx z33Ggf33Gmh33t&gJcfC~onB)u+K<f>TfQmzOuhCAaE>R7Mlx~X$WXzjseLfTf8+rM zcphL3itIj&3^fWqA49MjK5?InfXGo~6oiG)lJZI^LMTQ;g@pNX3hrvOMW20c;oUl~ zcg86FCyrxPSyNYcVf<Jnw|-OnD`YFi|77veb?rq+lhz+8)=tBGLiL%Cn>}FmfY}2B z>H!i(Y~hI_va8_DfBIL$qkl|U5&w7aujB78zUs2&pCe9eCEE64pKKqC?&C3%2lGBD zpA19<_(`>uuO2ZFGSqDx%=$_H<>daQ@vmG7l*>sJU+2Gf9q6_Ub^Qa~A9HzT512h* d_5ga|{{fb-`ABGy3R?gG002ovPDHLkV1nV}jc)(| delta 1626 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 Yzx6}uoS*MZ1^@s607*qoM6N<$f^^p;wg3PC diff --git a/SSL/src/CommonPictures/ПодписанЭЦП/Picture.png b/SSL/src/CommonPictures/ПодписанЭП/Picture.png similarity index 100% rename from SSL/src/CommonPictures/ПодписанЭЦП/Picture.png rename to SSL/src/CommonPictures/ПодписанЭП/Picture.png diff --git a/SSL/src/CommonPictures/ПодписанЭЦП/ПодписанЭЦП.mdo b/SSL/src/CommonPictures/ПодписанЭП/ПодписанЭП.mdo similarity index 87% rename from SSL/src/CommonPictures/ПодписанЭЦП/ПодписанЭЦП.mdo rename to SSL/src/CommonPictures/ПодписанЭП/ПодписанЭП.mdo index 375732d3b..00903f86c 100644 --- a/SSL/src/CommonPictures/ПодписанЭЦП/ПодписанЭЦП.mdo +++ b/SSL/src/CommonPictures/ПодписанЭП/ПодписанЭП.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="cd6f96c7-33ee-42b1-bb81-ce7d9652337c"> - <name>ПодписанЭЦП</name> + <name>ПодписанЭП</name> <synonym> <key>ru</key> <value>Подписан ЭП</value> diff --git a/SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png b/SSL/src/CommonPictures/РаспространяетсяВИерархии/Picture.png deleted file mode 100644 index 84366587974cde0ca6a48f362f16e0bbc9a12814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0ZsmiP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004bNkl<ZIE|%} zO(?^07{@<<{t3I$T$ENyNo-z5rYt5SyRjS`9d>qeaB*_B5{@oAJ9znTrb#4PUZ!10 z(M~u>SpM%0D=gb=?K%DG_dMUe&-e2P>GzaL8C6lvFo5`9L*($B-Pjob<3qiS4t5nU z5RTs?#m?~i+yJa>Y+}~d;q9?~_Y_=Veqjl}&yB0Q6<2pFgMA%H+fufJqvR6@m#II) z$;&tZ%b^%=Mh#x4jlj$VbBk;2A79}auxA7!r?&*AedvacrW@$Gj;8Ch+Zx!ZuEaAk zOh}63b!Ke)M*7)`p8N<Xvdq!-9g3o&sv5GYX5N}cQ(G^|)C*N&c2tSinx7Ty%?*V2 zqJ^Sh(>2b1VRWX|ZCTUB$Fm5lTIz&anWd#fs7BAQ7A@{g5uCb%c*+62U0|gwOP2 zmIK330LVw@cR5??5lz#``I(Q-&FvikvZfM};)sx2pb#BdQBgFNDpAbupjbLW`t2c` cf>2tnU!_;Q6|PSnr2qf`07*qoM6N<$f;zd!)Bpeg diff --git a/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo b/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo deleted file mode 100644 index 90b4826d8..000000000 --- a/SSL/src/CommonPictures/РаспространяетсяВИерархии/РаспространяетсяВИерархии.mdo +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9ad979d3-74ad-4d90-b279-c3a2bea36ea7"> - <name>РаспространяетсяВИерархии</name> - <synonym> - <key>ru</key> - <value>Распространяется в иерархии</value> - </synonym> -</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/Успешно32/Picture.png b/SSL/src/CommonPictures/Успешно32/Picture.png new file mode 100644 index 0000000000000000000000000000000000000000..15cc29c8228cd1481d933e7019b5c3f98b8fd8b7 GIT binary patch literal 983 zcmV;|11S87P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#c}YY;RCwC#m;Xx>aTv!RH@`bbrnBYL zQm5i-Zgco;WTavcs6h}0{WtZW^ji=_Q6R=jh$IZZ;Md%oHl5S$w%c^u>Au`u&*${a zwo~U!_d^}Lx$VQ<z249B+&%YP4$t$D%}oYb-m-2Wcj!g?Kal}B>Tb3Ss8Q1zwfYP0 z-=d1H(g1;5EoQTRcyIvBdi_wc3EAbtTXpriQgDW+p~X~%Chqj(`g_qt?q$NeT3dBB zO-0}iF9PW{p(q79Lj&NS-pToSl8FI%Q;#P3WCdy%<wb=vfU8iS1$bj2c$rlYdL4@6 zS%|~~P+L_EY&5@~^81}K3FqU@TJ1~R&!UVOz{fg_MqPD70eBb(kWPDC2`&zc&N*1H z*<yI?oGb}G)@d^7A9Qy^pT$BhW<7_ABRGkCJK_M2<5NU?qcHW=N8ry;6SCtq>ol60 zZfX@^qsO7Nl7-$bixSsI(=Z{x+YK1G7U5w`I|nJEy)l^m78K#H#ixMO+}dF@=_>2; z!4+D9-KZZg;((It5$NgcRGnes0N!HIRn-^3R(J&?<x)gbQJ9|);7>)kXrRBYrbef! z%|qx4I^~b#XIxNH!NC3BCiD_;Yuh0_`Fv3UjC|qyjtGB~+=wPt*Vn0;<ps%_`G^Ts z1n#wWi1&p454hf-*VGn(JG3HQb1DXlQ@aHIBpEIm*hD>CU5wCP*S=%~zK9DHD(1L} z-UE0G!t-G}WS5Q{;XkHBBK)0H{c;AMw~4>aB+a)Pi<PPy`I5yhFRlVMq=W^#4Q@9y zLg6*$Ang*z2K{lc&qq#$C%58BRNqe<Lwns($#i<d8^9M+VCiTExnc*?ZU<K4xPb2n z{`fSwR4bk#CY<&?E2dCcu1?K_Ke7ol<A#$)xg9zIjwMEfe>ig>kysN<tULCt7>%;5 zA}{SWxEn~onr)xJAE8FlnutzV7fiU;qN8X+r7S=DofQhQ;B-Xy4kI5)*Ys&uCMF)Z zov~4#<yEC+@{{4a9JtnE=Z2><4+ti<Tyct~62K<76p@-|3Qu<+5lnd82`b=A0EbXf zB<=2v#NK&op6N^|+!K_Cqk=RG9E<QB7PdB75&rQirs6qb!bkB`Fu;Rnn<wyri@-CP z35khr+RwitWkG$q@P|nT=PVz-)&9zs^Z(;C+Xj9KFaX%<Kkxhao}T~!002ovPDHLk FV1iFI(V+kU literal 0 HcmV?d00001 diff --git a/SSL/src/CommonPictures/Успешно32/Успешно32.mdo b/SSL/src/CommonPictures/Успешно32/Успешно32.mdo new file mode 100644 index 000000000..3a191555a --- /dev/null +++ b/SSL/src/CommonPictures/Успешно32/Успешно32.mdo @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ece15c4e-4a4b-421b-9f00-10f698da476b"> + <name>Успешно32</name> + <synonym> + <key>ru</key> + <value>Успешно (32x32)</value> + </synonym> +</mdclass:CommonPicture> diff --git a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзамодействия/Picture.png b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.png similarity index 100% rename from SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзамодействия/Picture.png rename to SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/Picture.png diff --git a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзамодействия/УстановитьПризнакРассмотреноДляВзамодействия.mdo b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/УстановитьПризнакРассмотреноДляВзаимодействия.mdo similarity index 90% rename from SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзамодействия/УстановитьПризнакРассмотреноДляВзамодействия.mdo rename to SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/УстановитьПризнакРассмотреноДляВзаимодействия.mdo index cc4116161..595cb8659 100644 --- a/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзамодействия/УстановитьПризнакРассмотреноДляВзамодействия.mdo +++ b/SSL/src/CommonPictures/УстановитьПризнакРассмотреноДляВзаимодействия/УстановитьПризнакРассмотреноДляВзаимодействия.mdo @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b6bbfb59-8249-47af-9394-be262f118811"> - <name>УстановитьПризнакРассмотреноДляВзамодействия</name> + <name>УстановитьПризнакРассмотреноДляВзаимодействия</name> <synonym> <key>ru</key> <value>Установить признак рассмотрено для взаимодействия</value> diff --git a/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/Template.bin b/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/Template.bin deleted file mode 100644 index 879825385..000000000 --- a/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/Template.bin +++ /dev/null @@ -1,66 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:ns2="http://v8.1c.ru/8.1/data/enterprise" xmlns:v8="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - - <xsl:output method="xml" version="1.0" indent="yes"/> - - <xsl:template match="/"> - <Data xmlns:ns1="http://v8.1c.ru/8.1/data/core" xmlns:ns2="http://v8.1c.ru/8.1/data/enterprise" xmlns:v8="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <ns1:ValueTable> - <ns1:column> - <ns1:Name xsi:type="xs:string">Ссылка</ns1:Name> - <ns1:ValueType> - <ns1:TypeSet>v8:CatalogRef</ns1:TypeSet> - </ns1:ValueType> - </ns1:column> - <ns1:column> - <ns1:Name xsi:type="xs:string">Код</ns1:Name> - <ns1:ValueType> - <ns1:Type>xs:string</ns1:Type> - <ns1:Type>xs:decimal</ns1:Type> - <ns1:NumberQualifiers> - <ns1:Digits>20</ns1:Digits> - <ns1:FractionDigits>0</ns1:FractionDigits> - <ns1:AllowedSign>Nonnegative</ns1:AllowedSign> - </ns1:NumberQualifiers> - <ns1:StringQualifiers> - <ns1:Length>50</ns1:Length> - <ns1:AllowedLength>Variable</ns1:AllowedLength> - </ns1:StringQualifiers> - </ns1:ValueType> - </ns1:column> - <ns1:column> - <ns1:Name xsi:type="xs:string">ЭтоГруппа</ns1:Name> - <ns1:ValueType> - <ns1:TypeSet>xs:boolean</ns1:TypeSet> - </ns1:ValueType> - </ns1:column> - <xsl:for-each select="DataDumpPart/Data/*"> - <xsl:if test="v8:Code"> - <ns1:row> - <ns1:Value> - <xsl:attribute name="xsi:type"> - <xsl:value-of select="v8:Ref/@xsi:type"/> - </xsl:attribute> - <xsl:value-of select="v8:Ref"/> - </ns1:Value> - <ns1:Value> - <xsl:attribute name="xsi:type"> - <xsl:value-of select="v8:Code/@xsi:type"/> - </xsl:attribute> - <xsl:value-of select="v8:Code"/> - </ns1:Value> - <ns1:Value> - <xsl:if test="not(v8:IsFolder)"> - <xsl:attribute name="xsi:nil"> - <xsl:text>true</xsl:text> - </xsl:attribute> - </xsl:if> - <xsl:value-of select="v8:IsFolder"/> - </ns1:Value> - </ns1:row> - </xsl:if> - </xsl:for-each> - </ns1:ValueTable> - </Data> - </xsl:template> -</xsl:stylesheet> diff --git a/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/ИзвлечениеКодовОбщихДанных.mdo b/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/ИзвлечениеКодовОбщихДанных.mdo deleted file mode 100644 index 061bcb5a2..000000000 --- a/SSL/src/CommonTemplates/ИзвлечениеКодовОбщихДанных/ИзвлечениеКодовОбщихДанных.mdo +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="57b9edd2-16d2-40f2-ae9c-33462eda5fb4"> - <name>ИзвлечениеКодовОбщихДанных</name> - <synonym> - <key>ru</key> - <value>Извлечение кодов общих данных</value> - </synonym> - <templateType>BinaryData</templateType> -</mdclass:CommonTemplate> diff --git a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html index b5649a155..0745cfe88 100644 --- a/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html +++ b/SSL/src/CommonTemplates/ИнструкцияКакВыполнитьУстановкуОбновленияВручную/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <h1><font color="#00008b">Установка обновления конфигурации <hr></hr></font></h1> <p>Для установки обновления конфигурации необходимо выполнить следующие действия:</p> diff --git a/SSL/src/CommonTemplates/КомпонентаПечатиQRКода/Template.bin b/SSL/src/CommonTemplates/КомпонентаПечатиQRКода/Template.bin deleted file mode 100644 index 7ea5f933742a8538e2e3eff1724c648607809e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 406366 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≦_2^i3G(&n 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�npLTqhIvX`S4}izMS%tW)BJ$gkAc1?79o7kMz0= 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 diff --git a/SSL/src/CommonTemplates/КомпонентаПечатиQRКода/КомпонентаПечатиQRКода.mdo b/SSL/src/CommonTemplates/КомпонентаПечатиQRКода/КомпонентаПечатиQRКода.mdo deleted file mode 100644 index bb7954836..000000000 --- a/SSL/src/CommonTemplates/КомпонентаПечатиQRКода/КомпонентаПечатиQRКода.mdo +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="536761fe-c3d3-425b-812d-94b3c12e6f7f"> - <name>КомпонентаПечатиQRКода</name> - <synonym> - <key>ru</key> - <value>Компонента печати QR кода</value> - </synonym> - <comment>Компонента печати QR кода</comment> - <templateType>BinaryData</templateType> -</mdclass:CommonTemplate> diff --git a/SSL/src/Configuration/Configuration.mdo b/SSL/src/Configuration/Configuration.mdo index e64fed6a4..17d5afb31 100644 --- a/SSL/src/Configuration/Configuration.mdo +++ b/SSL/src/Configuration/Configuration.mdo @@ -1,23 +1,23 @@ <?xml version="1.0" encoding="UTF-8"?> -<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="68f0e468-2a6f-4349-9898-4450082ac96d"> +<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="28abc37f-78f7-42d8-8794-05a2bde17d21"> <name>БиблиотекаСтандартныхПодсистем</name> <synonym> <key>ru</key> - <value>Библиотека стандартных подсистем, редакция 2.1</value> + <value>Библиотека стандартных подсистем, редакция 2.2</value> </synonym> - <containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="3907b069-cfb9-40a9-9561-ac7945fc8c89"/> - <containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="10d37262-ec17-4764-aefe-981af6d5ec3c"/> - <containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="ef96c61d-5021-455d-9c0f-9e7bc557b541"/> - <containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="a9a4d3d0-0264-48be-abba-48c74c945660"/> - <containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="48358d30-71f4-4d4d-beac-2e39302d5cb9"/> - <containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="ad748910-7f3d-4f43-aa40-7c67fe673568"/> - <containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="dd6347a9-288e-41ff-8d84-a3469d28a371"/> + <containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="6a482546-8053-4b49-a5c7-d10a9d202ed8"/> + <containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="cd4d098e-3d3f-4027-962e-c15c09c6f665"/> + <containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="796872eb-d15b-42f3-9dbb-e830b540bcad"/> + <containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="b60aaabe-fc86-4c2d-89d8-eabf15956a88"/> + <containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="b613cfcb-2e8f-4bd4-a938-2ac1faff9a23"/> + <containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="e4196973-6540-4c0b-ac6a-1a2342581701"/> + <containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="039f9f89-f65a-4207-bdba-3f470090bec1"/> <defaultRunMode>ManagedApplication</defaultRunMode> <usePurposes>PersonalComputer</usePurposes> <scriptVariant>Russian</scriptVariant> <defaultRoles>Role.ПолныеПрава</defaultRoles> <vendor>Фирма "1С"</vendor> - <version>2.1.9.2</version> + <version>2.2.1.35</version> <updateCatalogAddress>http://downloads.v8.1c.ru/tmplts/</updateCatalogAddress> <includeHelpInContents>true</includeHelpInContents> <usedMobileApplicationFunctionalities> @@ -33,11 +33,11 @@ <defaultLanguage>Language.Русский</defaultLanguage> <briefInformation> <key>ru</key> - <value>Библиотека стандартных подсистем, редакция 2.1</value> + <value>Библиотека стандартных подсистем, редакция 2.2</value> </briefInformation> <detailedInformation> <key>ru</key> - <value>Библиотека стандартных подсистем, редакция 2.1</value> + <value>Библиотека стандартных подсистем, редакция 2.2</value> </detailedInformation> <logo/> <splash/> @@ -51,8 +51,9 @@ </vendorInformationAddress> <dataLockControlMode>Managed</dataLockControlMode> <objectAutonumerationMode>NotAutoFree</objectAutonumerationMode> - <interfaceCompatibilityMode>Version8_2</interfaceCompatibilityMode> - <compatibilityMode>8.2.16</compatibilityMode> + <modalityUseMode>UseWithWarnings</modalityUseMode> + <interfaceCompatibilityMode>Version8_2EnableTaxi</interfaceCompatibilityMode> + <compatibilityMode>8.3.3</compatibilityMode> <languages uuid="db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e"> <name>Русский</name> <synonym> @@ -61,7 +62,7 @@ </synonym> <languageCode>ru</languageCode> </languages> - <subsystems>Subsystem.НастройкаИАдминистрирование</subsystems> + <subsystems>Subsystem.Администрирование</subsystems> <subsystems>Subsystem.СтандартныеПодсистемы</subsystems> <styleItems>StyleItem.ВидДняПроизводственногоКалендаряВоскресеньеЦвет</styleItems> <styleItems>StyleItem.ВидДняПроизводственногоКалендаряНеУказанЦвет</styleItems> @@ -100,6 +101,7 @@ <styleItems>StyleItem.ФайлЗанятыйДругимПользователем</styleItems> <styleItems>StyleItem.ФайлЗанятыйТекущимПользователем</styleItems> <styleItems>StyleItem.ФонУправляющегоПоля</styleItems> + <commonPictures>CommonPicture.Администрирование48</commonPictures> <commonPictures>CommonPicture.АрхивАнкета</commonPictures> <commonPictures>CommonPicture.БыстрыеНастройкиОтчета</commonPictures> <commonPictures>CommonPicture.БыстрыйДоступ</commonPictures> @@ -160,9 +162,7 @@ <commonPictures>CommonPicture.ЗанятьФайл</commonPictures> <commonPictures>CommonPicture.ЗапланированноеВзаимодействие</commonPictures> <commonPictures>CommonPicture.ЗаполнитьФорму</commonPictures> - <commonPictures>CommonPicture.ЗапуститьОтдельныйСеансДляВыполненияРегламентныхЗаданий</commonPictures> <commonPictures>CommonPicture.ЗаставкаВнешнейОперации</commonPictures> - <commonPictures>CommonPicture.ЗаставкаВнешнейОперации83</commonPictures> <commonPictures>CommonPicture.Зашифрован</commonPictures> <commonPictures>CommonPicture.ЗнакСтоп</commonPictures> <commonPictures>CommonPicture.ЗнакСтопЧБ</commonPictures> @@ -176,6 +176,7 @@ <commonPictures>CommonPicture.ИспользоватьПользовательскийМакет</commonPictures> <commonPictures>CommonPicture.ИспользоватьПоставляемыйМакет</commonPictures> <commonPictures>CommonPicture.ИсторияВерсий</commonPictures> + <commonPictures>CommonPicture.КоличествоРассмотрено</commonPictures> <commonPictures>CommonPicture.КоллекцияВариантыВажности</commonPictures> <commonPictures>CommonPicture.КоллекцияВидыАктивныхПользователей</commonPictures> <commonPictures>CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации</commonPictures> @@ -204,8 +205,6 @@ <commonPictures>CommonPicture.КурсивноеНачертание</commonPictures> <commonPictures>CommonPicture.НаписатьSMS</commonPictures> <commonPictures>CommonPicture.Напоминание</commonPictures> - <commonPictures>CommonPicture.НастройкаВыполненияРегламентныхЗаданий</commonPictures> - <commonPictures>CommonPicture.НастройкаИАдминистрирование48</commonPictures> <commonPictures>CommonPicture.НетГраницы</commonPictures> <commonPictures>CommonPicture.ОбновитьФайлИзФайлаНаДиске</commonPictures> <commonPictures>CommonPicture.ОбъединитьЯчейки</commonPictures> @@ -221,7 +220,6 @@ <commonPictures>CommonPicture.ОтправитьПолучитьПочту</commonPictures> <commonPictures>CommonPicture.ОтправитьЭлектронноеПисьмо</commonPictures> <commonPictures>CommonPicture.Ошибка32</commonPictures> - <commonPictures>CommonPicture.ОшибкаВыполненияРегламентныхЗаданий</commonPictures> <commonPictures>CommonPicture.Папка</commonPictures> <commonPictures>CommonPicture.Папки</commonPictures> <commonPictures>CommonPicture.ПапкиЭлектронныхПисем</commonPictures> @@ -232,7 +230,7 @@ <commonPictures>CommonPicture.ПиктограммыПланОбменаУзел</commonPictures> <commonPictures>CommonPicture.ПиктограммыЭлементов</commonPictures> <commonPictures>CommonPicture.Подменю</commonPictures> - <commonPictures>CommonPicture.ПодписанЭЦП</commonPictures> + <commonPictures>CommonPicture.ПодписанЭП</commonPictures> <commonPictures>CommonPicture.Подсистема</commonPictures> <commonPictures>CommonPicture.Подчеркивание</commonPictures> <commonPictures>CommonPicture.ПоказатьОтличия</commonPictures> @@ -252,7 +250,6 @@ <commonPictures>CommonPicture.РабочийКаталогПоУмолчанию</commonPictures> <commonPictures>CommonPicture.РазорватьСоединение</commonPictures> <commonPictures>CommonPicture.РазрешитьРедактированиеРеквизитовОбъекта</commonPictures> - <commonPictures>CommonPicture.РаспространяетсяВИерархии</commonPictures> <commonPictures>CommonPicture.Рассчитать</commonPictures> <commonPictures>CommonPicture.РассылкаОтчетов</commonPictures> <commonPictures>CommonPicture.РедактироватьМакет</commonPictures> @@ -307,9 +304,10 @@ <commonPictures>CommonPicture.УдалитьПользовательскийМакет</commonPictures> <commonPictures>CommonPicture.УменьшитьШрифт</commonPictures> <commonPictures>CommonPicture.Успешно</commonPictures> + <commonPictures>CommonPicture.Успешно32</commonPictures> <commonPictures>CommonPicture.УстановитьОтветственногоЗаВзаимодействие</commonPictures> <commonPictures>CommonPicture.УстановитьПредметВзаимодействия</commonPictures> - <commonPictures>CommonPicture.УстановитьПризнакРассмотреноДляВзамодействия</commonPictures> + <commonPictures>CommonPicture.УстановитьПризнакРассмотреноДляВзаимодействия</commonPictures> <commonPictures>CommonPicture.ФорматExcel</commonPictures> <commonPictures>CommonPicture.ФорматExcel2007</commonPictures> <commonPictures>CommonPicture.ФорматHTML</commonPictures> @@ -326,27 +324,17 @@ <commonPictures>CommonPicture.ЭлектронноеПисьмо</commonPictures> <commonPictures>CommonPicture.ЭлектронноеПисьмоВходящее</commonPictures> <commonPictures>CommonPicture.ЭлектронноеПисьмоИсходящее</commonPictures> - <sessionParameters>SessionParameter.ВидыДоступаБезГруппЗначенияДоступа</sessionParameters> - <sessionParameters>SessionParameter.ВидыДоступаБезОграничения</sessionParameters> - <sessionParameters>SessionParameter.ВидыДоступаЕдинственныеДляТипаЗначенияДоступа</sessionParameters> - <sessionParameters>SessionParameter.ВидыДоступаЧерезПраваПоЗначениямДоступа</sessionParameters> + <sessionParameters>SessionParameter.АвторизованныйПользователь</sessionParameters> + <sessionParameters>SessionParameter.ВидыДоступаБезГруппДляЗначенияДоступа</sessionParameters> + <sessionParameters>SessionParameter.ВидыДоступаСОднойГруппойДляЗначенияДоступа</sessionParameters> + <sessionParameters>SessionParameter.ВидыДоступаСОтключеннымИспользованием</sessionParameters> + <sessionParameters>SessionParameter.ВсеВидыДоступаКромеСпециальных</sessionParameters> <sessionParameters>SessionParameter.ВыполняетсяОбновлениеИБ</sessionParameters> <sessionParameters>SessionParameter.ДатаОбновленияПовторноИспользуемыхЗначенийМРО</sessionParameters> + <sessionParameters>SessionParameter.ИдентификаторыТаблицСОтдельнымиНастройкамиПрав</sessionParameters> <sessionParameters>SessionParameter.ИспользуемыеПланыОбмена</sessionParameters> <sessionParameters>SessionParameter.ОбластьДанныхЗначение</sessionParameters> <sessionParameters>SessionParameter.ОбластьДанныхИспользование</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВиду</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуВнешниеПользователи</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуДополнительныеСведения</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуОбъект</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуОрганизации</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуПапкиФайлов</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуПользователи</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуПравоДобавления</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуПравоИзменения</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуПравоЧтения</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуУсловие</sessionParameters> - <sessionParameters>SessionParameter.ОграничиватьДоступПоВидуУчетныеЗаписиЭлектроннойПочты</sessionParameters> <sessionParameters>SessionParameter.ПараметрыКлиентаНаСервере</sessionParameters> <sessionParameters>SessionParameter.ПаролиСинхронизацииДанных</sessionParameters> <sessionParameters>SessionParameter.ПравилаВыборочнойРегистрацииОбъектов</sessionParameters> @@ -354,8 +342,11 @@ <sessionParameters>SessionParameter.ПриоритетныеДанныеОбмена</sessionParameters> <sessionParameters>SessionParameter.ПропуститьПроверкуЗапретаИзменения</sessionParameters> <sessionParameters>SessionParameter.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском</sessionParameters> + <sessionParameters>SessionParameter.ТаблицыСОтдельнымиНастройкамиПрав</sessionParameters> <sessionParameters>SessionParameter.ТекущийВнешнийПользователь</sessionParameters> <sessionParameters>SessionParameter.ТекущийПользователь</sessionParameters> + <sessionParameters>SessionParameter.ТипыВладельцевНастроекПрав</sessionParameters> + <sessionParameters>SessionParameter.ТипыЗначенийДоступаСГруппами</sessionParameters> <roles>Role.АдминистраторСистемы</roles> <roles>Role.Администрирование</roles> <roles>Role.БазовыеПрава</roles> @@ -395,7 +386,7 @@ <roles>Role.ИспользованиеНапоминаний</roles> <roles>Role.ИспользованиеСтруктурыПодчиненности</roles> <roles>Role.ИспользованиеУчетныхЗаписейЭлектроннойПочты</roles> - <roles>Role.ИспользованиеЭЦП</roles> + <roles>Role.ИспользованиеЭП</roles> <roles>Role.НастройкаИОценкаПроизводительности</roles> <roles>Role.НастройкаСинхронизацииДанных</roles> <roles>Role.ОбновлениеКонфигурацииБазыДанных</roles> @@ -421,10 +412,8 @@ <roles>Role.ЧтениеОтветовНаВопросыАнкет</roles> <roles>Role.ЧтениеПерсональныхДанныхФизическихЛиц</roles> <roles>Role.ЧтениеФизическихЛиц</roles> - <commonTemplates>CommonTemplate.ИзвлечениеКодовОбщихДанных</commonTemplates> <commonTemplates>CommonTemplate.ИнструкцияКакВыполнитьУстановкуОбновленияВручную</commonTemplates> <commonTemplates>CommonTemplate.КомпонентаTWAIN</commonTemplates> - <commonTemplates>CommonTemplate.КомпонентаПечатиQRКода</commonTemplates> <commonTemplates>CommonTemplate.КомпонентаСклоненияФИО</commonTemplates> <commonTemplates>CommonTemplate.ПолучениеДереваОбработчиковОбновления</commonTemplates> <commonTemplates>CommonTemplate.СтруктураПодчиненности</commonTemplates> @@ -466,8 +455,8 @@ <commonModules>CommonModule.ВзаимодействияПереопределяемый</commonModules> <commonModules>CommonModule.ВзаимодействияСобытия</commonModules> <commonModules>CommonModule.ВнешниеПользователи</commonModules> - <commonModules>CommonModule.ВыгрузкаЗагрузкаДанных</commonModules> - <commonModules>CommonModule.ВыгрузкаЗагрузкаДанныхПереопределяемый</commonModules> + <commonModules>CommonModule.ГрафикиРаботы</commonModules> + <commonModules>CommonModule.ГрафикиРаботыКлиентСервер</commonModules> <commonModules>CommonModule.ГрупповоеИзменениеОбъектовКлиент</commonModules> <commonModules>CommonModule.ДатыЗапретаИзменения</commonModules> <commonModules>CommonModule.ДатыЗапретаИзмененияПереопределяемый</commonModules> @@ -499,11 +488,13 @@ <commonModules>CommonModule.ДополнительныеОтчетыИОбработкиРегламентныеЗадания</commonModules> <commonModules>CommonModule.ДополнительныеОтчетыИОбработкиРегламентныеЗаданияВМоделиСервиса</commonModules> <commonModules>CommonModule.ЖурналРегистрации</commonModules> + <commonModules>CommonModule.ЖурналРегистрацииВызовСервера</commonModules> <commonModules>CommonModule.ЖурналРегистрацииКлиент</commonModules> <commonModules>CommonModule.ЗаметкиПользователяСлужебный</commonModules> <commonModules>CommonModule.ЗапретРедактированияРеквизитовОбъектов</commonModules> <commonModules>CommonModule.ЗапретРедактированияРеквизитовОбъектовКлиент</commonModules> <commonModules>CommonModule.ЗащитаПерсональныхДанных</commonModules> + <commonModules>CommonModule.ЗащитаПерсональныхДанныхКлиент</commonModules> <commonModules>CommonModule.ЗащитаПерсональныхДанныхПереопределяемый</commonModules> <commonModules>CommonModule.ЗащитаПерсональныхДанныхПовтИсп</commonModules> <commonModules>CommonModule.ИнтерфейсыСообщенийВМоделиСервиса</commonModules> @@ -511,20 +502,18 @@ <commonModules>CommonModule.ИнформацияПриЗапуске</commonModules> <commonModules>CommonModule.ИнформацияПриЗапускеКлиент</commonModules> <commonModules>CommonModule.КалендарныеГрафики</commonModules> - <commonModules>CommonModule.КалендарныеГрафикиКлиентСервер</commonModules> <commonModules>CommonModule.КалендарныеГрафикиПереопределяемый</commonModules> <commonModules>CommonModule.КалендарныеГрафикиСлужебныйВМоделиСервиса</commonModules> - <commonModules>CommonModule.КомандыРаботыСБизнесПроцессамиКлиент</commonModules> - <commonModules>CommonModule.КомандыРаботыСФайламиКлиент</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияXML</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияКлиентСервер</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияКлиентСерверПовтИсп</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияСлужебный</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияСлужебныйВызовСервера</commonModules> <commonModules>CommonModule.КонтактнаяИнформацияСлужебныйПовтИсп</commonModules> - <commonModules>CommonModule.КонтрольДинамическогоОбновленияКонфигурации</commonModules> + <commonModules>CommonModule.КонтрольДинамическогоОбновленияКонфигурацииВызовСервера</commonModules> <commonModules>CommonModule.КонтрольДинамическогоОбновленияКонфигурацииГлобальный</commonModules> <commonModules>CommonModule.КонтрольДинамическогоОбновленияКонфигурацииКлиент</commonModules> + <commonModules>CommonModule.КонтрольДинамическогоОбновленияКонфигурацииСлужебный</commonModules> <commonModules>CommonModule.КурсыВалютСлужебныйВМоделиСервиса</commonModules> <commonModules>CommonModule.НапоминанияПользователяВызовСервера</commonModules> <commonModules>CommonModule.НапоминанияПользователяГлобальный</commonModules> @@ -576,7 +565,7 @@ <commonModules>CommonModule.ОбновлениеКонфигурацииПереопределяемый</commonModules> <commonModules>CommonModule.ОбщегоНазначения</commonModules> <commonModules>CommonModule.ОбщегоНазначенияВызовСервера</commonModules> - <commonModules>CommonModule.ОбщегоНазначенияВызовСервераПереопределяемый</commonModules> + <commonModules>CommonModule.ОбщегоНазначенияГлобальный</commonModules> <commonModules>CommonModule.ОбщегоНазначенияКлиент</commonModules> <commonModules>CommonModule.ОбщегоНазначенияКлиентПереопределяемый</commonModules> <commonModules>CommonModule.ОбщегоНазначенияКлиентПовтИсп</commonModules> @@ -588,11 +577,11 @@ <commonModules>CommonModule.ОтправкаSMSПереопределяемый</commonModules> <commonModules>CommonModule.ОтправкаSMSЧерезБилайн</commonModules> <commonModules>CommonModule.ОтправкаSMSЧерезМТС</commonModules> + <commonModules>CommonModule.ОценкаПроизводительностиВызовСервераПовтИсп</commonModules> <commonModules>CommonModule.ОценкаПроизводительностиВызовСервераПолныеПрава</commonModules> <commonModules>CommonModule.ОценкаПроизводительностиКлиент</commonModules> <commonModules>CommonModule.ОценкаПроизводительностиКлиентГлобальный</commonModules> <commonModules>CommonModule.ОценкаПроизводительностиКлиентСервер</commonModules> - <commonModules>CommonModule.ОценкаПроизводительностиПовтИсп</commonModules> <commonModules>CommonModule.ОценкаПроизводительностиСлужебный</commonModules> <commonModules>CommonModule.ОчередьЗаданий</commonModules> <commonModules>CommonModule.ОчередьЗаданийПереопределяемый</commonModules> @@ -601,7 +590,6 @@ <commonModules>CommonModule.ОчередьЗаданийСлужебныйРазделениеДанных</commonModules> <commonModules>CommonModule.ПерепрефиксацияОбъектов</commonModules> <commonModules>CommonModule.ПодсистемыКонфигурацииПереопределяемый</commonModules> - <commonModules>CommonModule.ПолнотекстовыйПоискКлиент</commonModules> <commonModules>CommonModule.ПолнотекстовыйПоискСервер</commonModules> <commonModules>CommonModule.ПолучениеФайловИзИнтернета</commonModules> <commonModules>CommonModule.ПолучениеФайловИзИнтернетаКлиент</commonModules> @@ -613,28 +601,28 @@ <commonModules>CommonModule.ПользователиСлужебный</commonModules> <commonModules>CommonModule.ПользователиСлужебныйВМоделиСервиса</commonModules> <commonModules>CommonModule.ПользователиСлужебныйВМоделиСервисаКлиент</commonModules> + <commonModules>CommonModule.ПользователиСлужебныйВМоделиСервисаПовтИсп</commonModules> <commonModules>CommonModule.ПользователиСлужебныйВызовСервера</commonModules> <commonModules>CommonModule.ПользователиСлужебныйКлиент</commonModules> <commonModules>CommonModule.ПользователиСлужебныйКлиентСервер</commonModules> <commonModules>CommonModule.ПользователиСлужебныйПовтИсп</commonModules> <commonModules>CommonModule.ПоставляемыеДанные</commonModules> <commonModules>CommonModule.ПоставляемыеДанныеПереопределяемый</commonModules> - <commonModules>CommonModule.ПрефиксацияОбъектовВызовСервера</commonModules> <commonModules>CommonModule.ПрефиксацияОбъектовКлиентСервер</commonModules> <commonModules>CommonModule.ПрефиксацияОбъектовКлиентСерверПереопределяемый</commonModules> <commonModules>CommonModule.ПрефиксацияОбъектовПереопределяемый</commonModules> <commonModules>CommonModule.ПрефиксацияОбъектовПовтИсп</commonModules> + <commonModules>CommonModule.ПрефиксацияОбъектовСлужебный</commonModules> <commonModules>CommonModule.ПрефиксацияОбъектовСобытия</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлы</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлыКлиент</commonModules> - <commonModules>CommonModule.ПрисоединенныеФайлыКлиентСервер</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлыПереопределяемый</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлыСлужебный</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлыСлужебныйВызовСервера</commonModules> <commonModules>CommonModule.ПрисоединенныеФайлыСлужебныйКлиент</commonModules> - <commonModules>CommonModule.ПроверкаЛегальностиПолученияОбновленияГлобальный</commonModules> <commonModules>CommonModule.ПроверкаЛегальностиПолученияОбновленияКлиент</commonModules> <commonModules>CommonModule.РаботаВМоделиСервиса</commonModules> + <commonModules>CommonModule.РаботаВМоделиСервисаКлиент</commonModules> <commonModules>CommonModule.РаботаВМоделиСервисаПереопределяемый</commonModules> <commonModules>CommonModule.РаботаВМоделиСервисаПовтИсп</commonModules> <commonModules>CommonModule.РаботаСБанками</commonModules> @@ -651,8 +639,6 @@ <commonModules>CommonModule.РаботаСПочтовымиСообщениями</commonModules> <commonModules>CommonModule.РаботаСПочтовымиСообщениямиКлиент</commonModules> <commonModules>CommonModule.РаботаСФайлами</commonModules> - <commonModules>CommonModule.РаботаСФайламиВызовСервера</commonModules> - <commonModules>CommonModule.РаботаСФайламиВызовСервераПереопределяемый</commonModules> <commonModules>CommonModule.РаботаСФайламиКлиент</commonModules> <commonModules>CommonModule.РаботаСФайламиКлиентПереопределяемый</commonModules> <commonModules>CommonModule.РаботаСФайламиКлиентСервер</commonModules> @@ -668,12 +654,8 @@ <commonModules>CommonModule.РассылкаОтчетовПереопределяемый</commonModules> <commonModules>CommonModule.РассылкаОтчетовПовтИсп</commonModules> <commonModules>CommonModule.РегламентированныеДанныеКлиентСервер</commonModules> - <commonModules>CommonModule.РегламентныеЗаданияКлиент</commonModules> <commonModules>CommonModule.РегламентныеЗаданияСервер</commonModules> <commonModules>CommonModule.РегламентныеЗаданияСлужебный</commonModules> - <commonModules>CommonModule.РегламентныеЗаданияСлужебныйВызовСервера</commonModules> - <commonModules>CommonModule.РегламентныеЗаданияСлужебныйГлобальный</commonModules> - <commonModules>CommonModule.РегламентныеЗаданияСлужебныйКлиент</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБВызовСервера</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБКлиент</commonModules> <commonModules>CommonModule.РезервноеКопированиеИБКлиентГлобальный</commonModules> @@ -684,10 +666,10 @@ <commonModules>CommonModule.РезервноеКопированиеОбластейДанныхПовтИсп</commonModules> <commonModules>CommonModule.СоединенияИБ</commonModules> <commonModules>CommonModule.СоединенияИБВызовСервера</commonModules> + <commonModules>CommonModule.СоединенияИБВызовСервераПовтИсп</commonModules> <commonModules>CommonModule.СоединенияИБГлобальный</commonModules> <commonModules>CommonModule.СоединенияИБКлиент</commonModules> <commonModules>CommonModule.СоединенияИБКлиентСервер</commonModules> - <commonModules>CommonModule.СоединенияИБПовтИсп</commonModules> <commonModules>CommonModule.СообщенияАдминистрированиеОбменаДаннымиКонтрольИнтерфейс</commonModules> <commonModules>CommonModule.СообщенияАдминистрированиеОбменаДаннымиКонтрольОбработчикСообщения_2_1_2_1</commonModules> <commonModules>CommonModule.СообщенияАдминистрированиеОбменаДаннымиУправлениеИнтерфейс</commonModules> @@ -726,6 +708,7 @@ <commonModules>CommonModule.СообщенияУправленияДополнительнымиОтчетамиИОбработкамиРеализация</commonModules> <commonModules>CommonModule.СообщенияУправленияПриложениямиИнтерфейс</commonModules> <commonModules>CommonModule.СтандартныеПодсистемыВызовСервера</commonModules> + <commonModules>CommonModule.СтандартныеПодсистемыГлобальный</commonModules> <commonModules>CommonModule.СтандартныеПодсистемыКлиент</commonModules> <commonModules>CommonModule.СтандартныеПодсистемыКлиентПовтИсп</commonModules> <commonModules>CommonModule.СтандартныеПодсистемыКлиентСервер</commonModules> @@ -741,12 +724,14 @@ <commonModules>CommonModule.УправлениеДоступомПереопределяемый</commonModules> <commonModules>CommonModule.УправлениеДоступомСлужебный</commonModules> <commonModules>CommonModule.УправлениеДоступомСлужебныйВМоделиСервиса</commonModules> + <commonModules>CommonModule.УправлениеДоступомСлужебныйВызовСервера</commonModules> + <commonModules>CommonModule.УправлениеДоступомСлужебныйКлиент</commonModules> + <commonModules>CommonModule.УправлениеДоступомСлужебныйКлиентСервер</commonModules> <commonModules>CommonModule.УправлениеДоступомСлужебныйПовтИсп</commonModules> <commonModules>CommonModule.УправлениеИтогамиИАгрегатамиВызовСервера</commonModules> <commonModules>CommonModule.УправлениеИтогамиИАгрегатамиКлиент</commonModules> <commonModules>CommonModule.УправлениеИтогамиИАгрегатамиСлужебный</commonModules> <commonModules>CommonModule.УправлениеКонтактнойИнформацией</commonModules> - <commonModules>CommonModule.УправлениеКонтактнойИнформациейКлассификаторы</commonModules> <commonModules>CommonModule.УправлениеКонтактнойИнформациейКлиент</commonModules> <commonModules>CommonModule.УправлениеКонтактнойИнформациейКлиентСервер</commonModules> <commonModules>CommonModule.УправлениеПечатью</commonModules> @@ -756,6 +741,7 @@ <commonModules>CommonModule.УправлениеПечатьюКлиент</commonModules> <commonModules>CommonModule.УправлениеПечатьюКлиентПовтИсп</commonModules> <commonModules>CommonModule.УправлениеПечатьюПереопределяемый</commonModules> + <commonModules>CommonModule.УправлениеПечатьюСлужебныйКлиент</commonModules> <commonModules>CommonModule.УправлениеСвойствами</commonModules> <commonModules>CommonModule.УправлениеСвойствамиКлиент</commonModules> <commonModules>CommonModule.УправлениеСвойствамиПереопределяемый</commonModules> @@ -776,12 +762,12 @@ <commonModules>CommonModule.ФормаОтчетаКлиентПереопределяемый</commonModules> <commonModules>CommonModule.ФормаОтчетаПереопределяемый</commonModules> <commonModules>CommonModule.ФункцииОтчетовКлиентСервер</commonModules> + <commonModules>CommonModule.ЭлектроннаяПодпись</commonModules> + <commonModules>CommonModule.ЭлектроннаяПодписьКлиент</commonModules> + <commonModules>CommonModule.ЭлектроннаяПодписьКлиентСервер</commonModules> + <commonModules>CommonModule.ЭлектроннаяПодписьПовтИсп</commonModules> <commonModules>CommonModule.ЭлектроннаяПочта</commonModules> <commonModules>CommonModule.ЭлектроннаяПочтаВызовСервера</commonModules> - <commonModules>CommonModule.ЭлектроннаяЦифроваяПодпись</commonModules> - <commonModules>CommonModule.ЭлектроннаяЦифроваяПодписьКлиент</commonModules> - <commonModules>CommonModule.ЭлектроннаяЦифроваяПодписьКлиентСервер</commonModules> - <commonModules>CommonModule.ЭлектроннаяЦифроваяПодписьПовтИсп</commonModules> <commonAttributes>CommonAttribute.ОбластьДанныхВспомогательныеДанные</commonAttributes> <commonAttributes>CommonAttribute.ОбластьДанныхОсновныеДанные</commonAttributes> <exchangePlans>ExchangePlan.ОбменСообщениями</exchangePlans> @@ -793,7 +779,6 @@ <xDTOPackages>XDTOPackage.ApplicationExtensionsManifest_1_0_0_1</xDTOPackages> <xDTOPackages>XDTOPackage.ApplicationExtensionsPermissions_1_0_0_1</xDTOPackages> <xDTOPackages>XDTOPackage.CurrencyRates</xDTOPackages> - <xDTOPackages>XDTOPackage.DataDump_1_0_1_1</xDTOPackages> <xDTOPackages>XDTOPackage.SuppliedData</xDTOPackages> <xDTOPackages>XDTOPackage.АдминистрированиеОбменаДанными</xDTOPackages> <xDTOPackages>XDTOPackage.АдминистрированиеОбменаДаннымиКонтроль</xDTOPackages> @@ -824,6 +809,7 @@ <webServices>WebService.RemoteAdministrationOfExchange</webServices> <webServices>WebService.RemoteAdministrationOfExchange_2_0_1_6</webServices> <webServices>WebService.RemoteAdministrationOfExchange_2_1_6_1</webServices> + <wsReferences>WSReference.ОтправкаSMSЧерезМТС</wsReferences> <eventSubscriptions>EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанных</eventSubscriptions> <eventSubscriptions>EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхДокумент</eventSubscriptions> <eventSubscriptions>EventSubscription.АвтономнаяРаботаПроверитьВозможностьЗаписиОбщихДанныхКонстанта</eventSubscriptions> @@ -867,6 +853,7 @@ <eventSubscriptions>EventSubscription.ПриПолученииДанныхОтГлавного</eventSubscriptions> <eventSubscriptions>EventSubscription.ПриПолученииДанныхОтПодчиненного</eventSubscriptions> <eventSubscriptions>EventSubscription.ПроверитьВозможностьИзмененияНастроекОбменаДанными</eventSubscriptions> + <eventSubscriptions>EventSubscription.ПроверитьЗначениеОпцииИспользоватьНесколькоОрганизаций</eventSubscriptions> <eventSubscriptions>EventSubscription.ПроверитьИзменениеФильтровОграниченияМиграцииДанных</eventSubscriptions> <eventSubscriptions>EventSubscription.ПроверитьИзмененияДатВПредмете</eventSubscriptions> <eventSubscriptions>EventSubscription.ПроверитьУстранениеПроблемыДокумента</eventSubscriptions> @@ -875,6 +862,7 @@ <eventSubscriptions>EventSubscription.СоздатьПредопределенныеПапкиЭлектронныхПисем</eventSubscriptions> <eventSubscriptions>EventSubscription.УдалитьИнформациюОбАвтореВерсии</eventSubscriptions> <eventSubscriptions>EventSubscription.УстановитьПометкуУдаленияЗадач</eventSubscriptions> + <eventSubscriptions>EventSubscription.УстановитьПометкуУдаленияЗаметкамПользователя</eventSubscriptions> <eventSubscriptions>EventSubscription.УстановитьПометкуУдаленияПрисоединенныхФайловВзаимодействия</eventSubscriptions> <scheduledJobs>ScheduledJob.ЗагрузкаКлассификатораБанковРФССайтаРБК</scheduledJobs> <scheduledJobs>ScheduledJob.ЗагрузкаКурсовВалют</scheduledJobs> @@ -901,6 +889,7 @@ <scheduledJobs>ScheduledJob.СлияниеИндексаППД</scheduledJobs> <scheduledJobs>ScheduledJob.УведомлениеИсполнителейОНовыхЗадачах</scheduledJobs> <scheduledJobs>ScheduledJob.УдалениеНеактуальнойИнформацииСинхронизации</scheduledJobs> + <scheduledJobs>ScheduledJob.УдалениеПомеченных</scheduledJobs> <scheduledJobs>ScheduledJob.УстановкаПериодаРассчитанныхИтогов</scheduledJobs> <scheduledJobs>ScheduledJob.ЭкспортОценкиПроизводительности</scheduledJobs> <settingsStorages>SettingsStorage.ХранилищеВариантовОтчетов</settingsStorages> @@ -925,6 +914,7 @@ <functionalOptions>FunctionalOption.ИспользоватьДополнительныеРеквизитыИСведения</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьЗаметки</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьНапоминанияПользователя</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьНесколькоОрганизаций</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьНесколькоПроизводственныхКалендарей</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьОбщиеДополнительныеЗначения</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьОбщиеДополнительныеРеквизитыИСведения</functionalOptions> @@ -938,9 +928,10 @@ <functionalOptions>FunctionalOption.ИспользоватьСинхронизациюДанныхВМоделиСервиса</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьСинхронизациюДанныхВМоделиСервисаСЛокальнойПрограммой</functionalOptions> <functionalOptions>FunctionalOption.ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете</functionalOptions> - <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеЦифровыеПодписи</functionalOptions> - <functionalOptions>FunctionalOption.ИспользоватьЭЦПВПрисоединенныхФайлах</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭлектронныеПодписи</functionalOptions> + <functionalOptions>FunctionalOption.ИспользоватьЭПВПрисоединенныхФайлах</functionalOptions> <functionalOptions>FunctionalOption.НезависимоеИспользованиеДополнительныхОтчетовИОбработокВМоделиСервиса</functionalOptions> + <functionalOptions>FunctionalOption.НеИспользоватьНесколькоОрганизаций</functionalOptions> <functionalOptions>FunctionalOption.ОграничиватьДоступНаУровнеЗаписей</functionalOptions> <functionalOptions>FunctionalOption.ОтправлятьПисьмаВФорматеHTML</functionalOptions> <functionalOptions>FunctionalOption.ПоддержкаРезервногоКопирования</functionalOptions> @@ -957,30 +948,26 @@ <functionalOptionsParameters>FunctionalOptionsParameter.ДополнительныеОтчетыИОбработкиТипФормы</functionalOptionsParameters> <functionalOptionsParameters>FunctionalOptionsParameter.Организация</functionalOptionsParameters> <functionalOptionsParameters>FunctionalOptionsParameter.ТипВерсионируемогоОбъекта</functionalOptionsParameters> + <definedTypes>DefinedType.ВладелецНастроекПрав</definedTypes> + <definedTypes>DefinedType.ЗначениеДоступа</definedTypes> <commonCommands>CommonCommand.АвтономнаяРабота</commonCommands> <commonCommands>CommonCommand.АвтономнаяРаботаВМоделиСервиса</commonCommands> - <commonCommands>CommonCommand.ВыгрузитьДанныеВЛокальнуюВерсию</commonCommands> - <commonCommands>CommonCommand.ВыгрузитьДанныеДляПереходаВСервис</commonCommands> <commonCommands>CommonCommand.ВыполнитьОбменДанными</commonCommands> <commonCommands>CommonCommand.ВыполнитьОбменДаннымиИнтерактивно</commonCommands> <commonCommands>CommonCommand.ДобавитьПользователейСервиса</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОбработкиАдминистрирование</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОтчетыАдминистрирование</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОтчетыИОбработкиЗаполнениеОбъекта</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОтчетыИОбработкиОтчеты</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОтчетыИОбработкиПечатныеФормы</commonCommands> - <commonCommands>CommonCommand.ДополнительныеОтчетыИОбработкиСозданиеСвязанныхОбъектов</commonCommands> + <commonCommands>CommonCommand.ДополнительныеПечатныеФормыОбъекта</commonCommands> <commonCommands>CommonCommand.ДополнительныеСведенияКоманднаяПанель</commonCommands> <commonCommands>CommonCommand.ДополнительныеСведенияПанельНавигации</commonCommands> - <commonCommands>CommonCommand.ЗагрузитьДанныеВОбласть</commonCommands> - <commonCommands>CommonCommand.ЗагрузитьДанныеИзСервиса</commonCommands> <commonCommands>CommonCommand.ЗагрузитьКурсыВалют</commonCommands> <commonCommands>CommonCommand.ЗадачиПоБизнесПроцессу</commonCommands> <commonCommands>CommonCommand.ЗадачиПоПредмету</commonCommands> - <commonCommands>CommonCommand.ЗаметкиПоПредмету</commonCommands> + <commonCommands>CommonCommand.ЗаполнениеОбъекта</commonCommands> <commonCommands>CommonCommand.ИсторияИзменений</commonCommands> <commonCommands>CommonCommand.КартаМаршрутаБизнесПроцесса</commonCommands> + <commonCommands>CommonCommand.МоиЗаметкиПоПредмету</commonCommands> + <commonCommands>CommonCommand.Напомнить</commonCommands> <commonCommands>CommonCommand.НастроитьПараметрыТранспортаСообщенийОбмена</commonCommands> + <commonCommands>CommonCommand.НастроитьПрава</commonCommands> <commonCommands>CommonCommand.НастройкаОбменаСообщениями</commonCommands> <commonCommands>CommonCommand.НастройкаСистемнойУчетнойЗаписиЭлектроннойПочты</commonCommands> <commonCommands>CommonCommand.ОбменСообщениями</commonCommands> @@ -989,13 +976,12 @@ <commonCommands>CommonCommand.ОткрытьПравилаРегистрацииОбъектов</commonCommands> <commonCommands>CommonCommand.ОткрытьРезультатыОбменаДанными</commonCommands> <commonCommands>CommonCommand.ОткрытьСценарииОбменовДанными</commonCommands> - <commonCommands>CommonCommand.ПанельОтчетовНастройкаИАдминистрирование</commonCommands> + <commonCommands>CommonCommand.ОтчетыОбъекта</commonCommands> <commonCommands>CommonCommand.ПерейтиВЖурналРегистрацииСобытийВыгрузкиДанных</commonCommands> <commonCommands>CommonCommand.ПерейтиВЖурналРегистрацииСобытийЗагрузкиДанных</commonCommands> <commonCommands>CommonCommand.ПерсональнаяНастройкаПроксиСервера</commonCommands> <commonCommands>CommonCommand.ПолучитьНастройкиОбменаДаннымиДляВторойИнформационнойБазы</commonCommands> <commonCommands>CommonCommand.ПраваДоступа</commonCommands> - <commonCommands>CommonCommand.ПраваПоЗначениямДоступа</commonCommands> <commonCommands>CommonCommand.ПрисоединенныеФайлы</commonCommands> <commonCommands>CommonCommand.ПрисоединенныеФайлыКОбъекту</commonCommands> <commonCommands>CommonCommand.РазместитьФайлыНачальногоОбраза</commonCommands> @@ -1003,12 +989,12 @@ <commonCommands>CommonCommand.СведенияОПользователе</commonCommands> <commonCommands>CommonCommand.СинхронизацияДанныхВМоделиСервиса</commonCommands> <commonCommands>CommonCommand.СозданиеНачальногоОбразаСФайлами</commonCommands> + <commonCommands>CommonCommand.СозданиеСвязанныхОбъектов</commonCommands> <commonCommands>CommonCommand.СоздатьЗаметкуПоПредмету</commonCommands> <commonCommands>CommonCommand.СоздатьРезервнуюКопию</commonCommands> <commonCommands>CommonCommand.СоставОтправляемыхДанных</commonCommands> <commonCommands>CommonCommand.СтруктураПодчиненности</commonCommands> <commonCommands>CommonCommand.УдалитьНастройкуСинхронизации</commonCommands> - <commonCommands>CommonCommand.УстановитьНапоминаниеПоПредмету</commonCommands> <commonCommands>CommonCommand.УстановитьРасширениеРаботыСФайлами</commonCommands> <commonCommands>CommonCommand.ФайлыВТоме</commonCommands> <commandGroups>CommandGroup.Взаимодействия</commandGroups> @@ -1028,7 +1014,7 @@ <constants>Constant.ВнутреннийАдресМенеджераСервиса</constants> <constants>Constant.ВыполнитьРезервноеКопированиеОбластиДанных</constants> <constants>Constant.ВыполнятьЗамерыПроизводительности</constants> - <constants>Constant.ВыполнятьПроверкуЭЦПНаСервере</constants> + <constants>Constant.ВыполнятьПроверкуЭПНаСервере</constants> <constants>Constant.ДатаОбновленияПовторноИспользуемыхЗначенийМРО</constants> <constants>Constant.ДатаПоследнегоСтартаКлиентскогоСеанса</constants> <constants>Constant.ДатаПоследнейВыгрузкиЗамеровПроизводительностиUTC</constants> @@ -1038,6 +1024,7 @@ <constants>Constant.ЗагрузитьСообщениеОбменаДанными</constants> <constants>Constant.ЗапрещатьЗагрузкуФайловПоРасширению</constants> <constants>Constant.ЗарегистрированыИзмененияДанных</constants> + <constants>Constant.ИдентификаторИнформационнойБазы</constants> <constants>Constant.ИзвлекатьТекстыФайловНаСервере</constants> <constants>Constant.ИзменятьЗаданияЗаднимЧислом</constants> <constants>Constant.ИмяПользователяАгентаСервиса</constants> @@ -1055,6 +1042,7 @@ <constants>Constant.ИспользоватьДополнительныеРеквизитыИСведения</constants> <constants>Constant.ИспользоватьЗаметки</constants> <constants>Constant.ИспользоватьНапоминанияПользователя</constants> + <constants>Constant.ИспользоватьНесколькоОрганизаций</constants> <constants>Constant.ИспользоватьНесколькоПроизводственныхКалендарей</constants> <constants>Constant.ИспользоватьОбщиеДополнительныеЗначения</constants> <constants>Constant.ИспользоватьОбщиеДополнительныеРеквизитыИСведения</constants> @@ -1069,9 +1057,11 @@ <constants>Constant.ИспользоватьСинхронизациюДанныхВМоделиСервиса</constants> <constants>Constant.ИспользоватьСинхронизациюДанныхВМоделиСервисаСЛокальнойПрограммой</constants> <constants>Constant.ИспользоватьСинхронизациюДанныхВМоделиСервисаСПриложениемВИнтернете</constants> - <constants>Constant.ИспользоватьЭлектронныеЦифровыеПодписи</constants> - <constants>Constant.КаталогВременныхФайловДляLinux</constants> - <constants>Constant.КаталогВременныхФайловДляWindows</constants> + <constants>Constant.ИспользоватьЭлектронныеПодписи</constants> + <constants>Constant.КаталогОбменаФайламиВМоделиСервиса</constants> + <constants>Constant.КаталогОбменаФайламиВМоделиСервисаLinux</constants> + <constants>Constant.КаталогСообщенийОбменаДаннымиДляLinux</constants> + <constants>Constant.КаталогСообщенийОбменаДаннымиДляWindows</constants> <constants>Constant.КлючОбластиДанных</constants> <constants>Constant.КонечнаяТочкаМенеджераСервиса</constants> <constants>Constant.КопироватьОбластиДанныхИзЭталонной</constants> @@ -1087,9 +1077,8 @@ <constants>Constant.НастройкиВыполненияРегламентныхЗаданий</constants> <constants>Constant.НастройкиПодчиненногоУзлаРИБ</constants> <constants>Constant.НезависимоеИспользованиеДополнительныхОтчетовИОбработокВМоделиСервиса</constants> + <constants>Constant.НеИспользоватьНесколькоОрганизаций</constants> <constants>Constant.НеИспользоватьРазделениеПоОбластямДанных</constants> - <constants>Constant.ОбщийКаталогВременныхФайлов</constants> - <constants>Constant.ОбщийКаталогВременныхФайловLinux</constants> <constants>Constant.ОграничиватьДоступНаУровнеЗаписей</constants> <constants>Constant.ОтправлятьПисьмаВФорматеHTML</constants> <constants>Constant.ОценкаПроизводительностиПериодЗаписи</constants> @@ -1111,7 +1100,7 @@ <constants>Constant.ПрефиксПоследнегоАвтономногоРабочегоМеста</constants> <constants>Constant.ПрефиксУзлаРаспределеннойИнформационнойБазы</constants> <constants>Constant.ПровайдерSMS</constants> - <constants>Constant.ПровайдерЭЦП</constants> + <constants>Constant.ПровайдерЭП</constants> <constants>Constant.РазделыОписанияИзмененийСистемы</constants> <constants>Constant.РазмерБлокаПередачиФайла</constants> <constants>Constant.РазрешитьВыполнениеДополнительныхОтчетовИОбработокРегламентнымиЗаданиямиВМоделиСервиса</constants> @@ -1127,7 +1116,7 @@ <constants>Constant.СписокРасширенийФайловOpenDocument</constants> <constants>Constant.СписокРасширенийФайловOpenDocumentОбластиДанных</constants> <constants>Constant.СтатусОбновленияКонфигурации</constants> - <constants>Constant.ТипПровайдераЭЦП</constants> + <constants>Constant.ТипПровайдераЭП</constants> <constants>Constant.УдалитьПоказыватьКомандуДополнительныеПечатныеФормы</constants> <constants>Constant.ХранитьФайлыВТомахНаДиске</constants> <constants>Constant.ЧасовойПоясОбластиДанных</constants> @@ -1137,7 +1126,6 @@ <commonForms>CommonForm.АдреснаяКнига</commonForms> <commonForms>CommonForm.АутентификацияВСервисе</commonForms> <commonForms>CommonForm.ВводПароляСОписаниями</commonForms> - <commonForms>CommonForm.ВключениеЖурналаРегистрации</commonForms> <commonForms>CommonForm.Вопрос</commonForms> <commonForms>CommonForm.ВопросОбУстановкеРасширенияРаботыСФайлами</commonForms> <commonForms>CommonForm.ВходВОбластьДанных</commonForms> @@ -1152,11 +1140,9 @@ <commonForms>CommonForm.ВыборПроизвольногоПериода</commonForms> <commonForms>CommonForm.ВыборПутиКАрхивуФайловТомов</commonForms> <commonForms>CommonForm.ВыборРолиИсполнителя</commonForms> - <commonForms>CommonForm.ВыборСертификата</commonForms> <commonForms>CommonForm.ВыборСертификатовШифрования</commonForms> <commonForms>CommonForm.ВыборУзловПлановОбмена</commonForms> <commonForms>CommonForm.ВыборФорматаВложений</commonForms> - <commonForms>CommonForm.ВыгрузкаДанных</commonForms> <commonForms>CommonForm.ГруппыПользователей</commonForms> <commonForms>CommonForm.ДлительнаяОперация</commonForms> <commonForms>CommonForm.ДлительнаяОперацияДополнительныхОтчетовИОбработок</commonForms> @@ -1164,10 +1150,6 @@ <commonForms>CommonForm.ДополнительноеОписание</commonForms> <commonForms>CommonForm.ДополнительныеОтчетыИОбработки</commonForms> <commonForms>CommonForm.ДополнительныеПараметрыПроксиСервера</commonForms> - <commonForms>CommonForm.ЗагрузкаДанныхВОбласть</commonForms> - <commonForms>CommonForm.ЗагрузкаДанныхИзСервиса</commonForms> - <commonForms>CommonForm.ЗагрузкаСообщенияОбменаСИзменениямиКонфигурации</commonForms> - <commonForms>CommonForm.ИнформацияНеразделенногоПользователя</commonForms> <commonForms>CommonForm.МастерАнкетыПоРазделам</commonForms> <commonForms>CommonForm.МониторСинхронизацииДанныхВМоделиСервиса</commonForms> <commonForms>CommonForm.НапоминаниеПриРедактировании</commonForms> @@ -1176,8 +1158,9 @@ <commonForms>CommonForm.НастройкаОсновногоРабочегоКаталога</commonForms> <commonForms>CommonForm.НастройкаОтправкиSMS</commonForms> <commonForms>CommonForm.НастройкиАгентаСервиса</commonForms> + <commonForms>CommonForm.НастройкиКриптографии</commonForms> + <commonForms>CommonForm.НастройкиПравОбъектов</commonForms> <commonForms>CommonForm.НастройкиРегистрацииСобытийДоступаКПерсональнымДанным</commonForms> - <commonForms>CommonForm.НастройкиЭЦП</commonForms> <commonForms>CommonForm.ОбменыДанными</commonForms> <commonForms>CommonForm.ОписаниеИзмененийСистемы</commonForms> <commonForms>CommonForm.ОтключениеАвтономногоРабочегоМеста</commonForms> @@ -1187,30 +1170,29 @@ <commonForms>CommonForm.ПанельОтчетов</commonForms> <commonForms>CommonForm.ПараметрыАдминистрированияСервернойИБ</commonForms> <commonForms>CommonForm.ПараметрыПроксиСервера</commonForms> - <commonForms>CommonForm.ПерсональныеНастройкиЭЦП</commonForms> + <commonForms>CommonForm.ПерсональныеНастройкиЭП</commonForms> + <commonForms>CommonForm.ПерсональныеСертификатыДляШифрования</commonForms> <commonForms>CommonForm.ПечатьДокументов</commonForms> <commonForms>CommonForm.ПодготовкаНовогоПисьма</commonForms> <commonForms>CommonForm.ПодключениеКонечнойТочки</commonForms> - <commonForms>CommonForm.ПодписьЭЦП</commonForms> + <commonForms>CommonForm.ПодписьЭП</commonForms> <commonForms>CommonForm.ПодтверждениеПароляУчетнойЗаписи</commonForms> - <commonForms>CommonForm.ПоискПоИндексу</commonForms> <commonForms>CommonForm.ПользователиСервиса</commonForms> <commonForms>CommonForm.ПраваДоступа</commonForms> <commonForms>CommonForm.ПраваДоступаУпрощенно</commonForms> - <commonForms>CommonForm.ПраваПоЗначениямДоступа</commonForms> <commonForms>CommonForm.ПредупрежденияПриЗавершенииРаботы</commonForms> <commonForms>CommonForm.ПрисоединенныеФайлы</commonForms> <commonForms>CommonForm.ПрисоединенныйФайл</commonForms> <commonForms>CommonForm.РедактированиеДополнительныхСведений</commonForms> <commonForms>CommonForm.РедактированиеТабличногоДокумента</commonForms> - <commonForms>CommonForm.СертификатЭЦП</commonForms> + <commonForms>CommonForm.СертификатЭП</commonForms> <commonForms>CommonForm.СинхронизацияДанныхВМоделиСервиса</commonForms> <commonForms>CommonForm.СозданиеНачальногоОбразаСФайлами</commonForms> <commonForms>CommonForm.СозданиеРезервнойКопии</commonForms> <commonForms>CommonForm.СохранениеПечатнойФормы</commonForms> <commonForms>CommonForm.СтруктураПодчиненности</commonForms> <commonForms>CommonForm.УстановкаВедущейКонечнойТочки</commonForms> - <commonForms>CommonForm.УстановкаПодписиЭЦП</commonForms> + <commonForms>CommonForm.УстановкаПодписиЭП</commonForms> <commonForms>CommonForm.УточнениеКонтактов</commonForms> <commonForms>CommonForm.ФайлыВТоме</commonForms> <commonForms>CommonForm.ФормаВариантаОтчета</commonForms> @@ -1240,7 +1222,7 @@ <catalogs>Catalog.КлассификаторБанковРФ</catalogs> <catalogs>Catalog.КлючевыеОперации</catalogs> <catalogs>Catalog.НаборыДополнительныхРеквизитовИСведений</catalogs> - <catalogs>Catalog.НазначенияСертификатовЭЦП</catalogs> + <catalogs>Catalog.НазначенияСертификатовЭП</catalogs> <catalogs>Catalog.Организации</catalogs> <catalogs>Catalog.ОчередьЗаданий</catalogs> <catalogs>Catalog.ОчередьЗаданийОбластейДанных</catalogs> @@ -1259,6 +1241,7 @@ <catalogs>Catalog.СообщенияОбластейДанных</catalogs> <catalogs>Catalog.СообщенияСистемы</catalogs> <catalogs>Catalog.СтраныМира</catalogs> + <catalogs>Catalog.СтроковыеКонтактыВзаимодействий</catalogs> <catalogs>Catalog.СценарииОбменовДанными</catalogs> <catalogs>Catalog.ТелефонныйЗвонокПрисоединенныеФайлы</catalogs> <catalogs>Catalog.ТомаХраненияФайлов</catalogs> @@ -1291,8 +1274,9 @@ <enums>Enum.ВидыПравилДляОбменаДанными</enums> <enums>Enum.ВидыТранспортаСообщенийОбмена</enums> <enums>Enum.ДействияПриОбмене</enums> - <enums>Enum.ДействияПриСохраненииСЭЦП</enums> + <enums>Enum.ДействияПриСохраненииСЭП</enums> <enums>Enum.ДействияСФайламиПоДвойномуЩелчку</enums> + <enums>Enum.ДополнительныеЗначенияДоступа</enums> <enums>Enum.ДоступныеПериодыОтчета</enums> <enums>Enum.ИсточникиПравилДляОбменаДанными</enums> <enums>Enum.ПериодичностиРасписанийРассылокОтчетов</enums> @@ -1353,6 +1337,7 @@ <reports>Report.Задания</reports> <reports>Report.Задачи</reports> <reports>Report.ЗадачиИстекающиеНаДату</reports> + <reports>Report.МестаИспользованияСсылок</reports> <reports>Report.ПраваДоступа</reports> <reports>Report.ПросроченныеЗадачи</reports> <dataProcessors>DataProcessor.АвтоматическоеИзвлечениеТекстов</dataProcessors> @@ -1365,6 +1350,7 @@ <dataProcessors>DataProcessor.ЖурналРегистрации</dataProcessors> <dataProcessors>DataProcessor.ЗагрузкаКурсовВалют</dataProcessors> <dataProcessors>DataProcessor.ЗагрузкаПравилРегистрацииОбъектов</dataProcessors> + <dataProcessors>DataProcessor.ЗаменаСсылок</dataProcessors> <dataProcessors>DataProcessor.ЗащитаПерсональныхДанных</dataProcessors> <dataProcessors>DataProcessor.ИнтерактивноеИзменениеВыгрузки</dataProcessors> <dataProcessors>DataProcessor.ИнформацияПриЗапуске</dataProcessors> @@ -1380,6 +1366,7 @@ <dataProcessors>DataProcessor.ОбновлениеКонфигурации</dataProcessors> <dataProcessors>DataProcessor.ОценкаПроизводительности</dataProcessors> <dataProcessors>DataProcessor.ПанельАдминистрированияБСП</dataProcessors> + <dataProcessors>DataProcessor.ПанельАдминистрированияБСПВМоделиСервиса</dataProcessors> <dataProcessors>DataProcessor.ПереносФайловВТома</dataProcessors> <dataProcessors>DataProcessor.ПолнотекстовыйПоискВДанных</dataProcessors> <dataProcessors>DataProcessor.ПомощникИнтерактивногоОбменаДанными</dataProcessors> @@ -1403,7 +1390,6 @@ <dataProcessors>DataProcessor.УправлениеПолнотекстовымПоиском</dataProcessors> <informationRegisters>InformationRegister.АдресныеСокращения</informationRegisters> <informationRegisters>InformationRegister.АдресныйКлассификатор</informationRegisters> - <informationRegisters>InformationRegister.АктивныеПредметыВзаимодействий</informationRegisters> <informationRegisters>InformationRegister.БлокировкиСеансовОбластейДанных</informationRegisters> <informationRegisters>InformationRegister.ВерсииОбъектов</informationRegisters> <informationRegisters>InformationRegister.ВерсииОбъектовАдресногоКлассификатора</informationRegisters> @@ -1418,6 +1404,7 @@ <informationRegisters>InformationRegister.ЗависимостиПравДоступа</informationRegisters> <informationRegisters>InformationRegister.ЗамерыВремени</informationRegisters> <informationRegisters>InformationRegister.ЗначенияГруппДоступа</informationRegisters> + <informationRegisters>InformationRegister.ЗначенияГруппДоступаПоУмолчанию</informationRegisters> <informationRegisters>InformationRegister.ИдентификаторыПолученныхЭлектронныхПисем</informationRegisters> <informationRegisters>InformationRegister.ИзмененияОбщихДанныхУзлов</informationRegisters> <informationRegisters>InformationRegister.ИсполнителиЗадач</informationRegisters> @@ -1425,20 +1412,22 @@ <informationRegisters>InformationRegister.ИспользованиеПоставляемыхДополнительныхОтчетовИОбработокВОбластяхДанных</informationRegisters> <informationRegisters>InformationRegister.КалендарныеГрафики</informationRegisters> <informationRegisters>InformationRegister.КодировкиВерсийФайлов</informationRegisters> + <informationRegisters>InformationRegister.КонтактыВзаимодействий</informationRegisters> <informationRegisters>InformationRegister.КурсыВалют</informationRegisters> <informationRegisters>InformationRegister.КэшПрограммныхИнтерфейсов</informationRegisters> <informationRegisters>InformationRegister.НаборыЗначенийДоступа</informationRegisters> <informationRegisters>InformationRegister.НазначениеДополнительныхОбработок</informationRegisters> <informationRegisters>InformationRegister.НаличиеПрисоединенныхФайлов</informationRegisters> <informationRegisters>InformationRegister.НапоминанияПользователя</informationRegisters> + <informationRegisters>InformationRegister.НаследованиеНастроекПравОбъектов</informationRegisters> <informationRegisters>InformationRegister.НастройкиВариантовОтчетов</informationRegisters> <informationRegisters>InformationRegister.НастройкиВерсионированияОбъектов</informationRegisters> <informationRegisters>InformationRegister.НастройкиОтправителя</informationRegisters> + <informationRegisters>InformationRegister.НастройкиПравОбъектов</informationRegisters> <informationRegisters>InformationRegister.НастройкиТранспортаОбмена</informationRegisters> <informationRegisters>InformationRegister.НастройкиТранспортаОбменаОбластейДанных</informationRegisters> <informationRegisters>InformationRegister.НастройкиТранспортаОбменаОбластиДанных</informationRegisters> <informationRegisters>InformationRegister.НастройкиУчетныхЗаписейЭлектроннойПочты</informationRegisters> - <informationRegisters>InformationRegister.НеразделенныеПользователи</informationRegisters> <informationRegisters>InformationRegister.НомераОтсканированныхФайлов</informationRegisters> <informationRegisters>InformationRegister.ОбластиДанных</informationRegisters> <informationRegisters>InformationRegister.ОбластиПерсональныхДанных</informationRegisters> @@ -1451,7 +1440,6 @@ <informationRegisters>InformationRegister.ПользовательскиеМакетыПечати</informationRegisters> <informationRegisters>InformationRegister.ПользовательскиеНастройкиДоступаКОбработкам</informationRegisters> <informationRegisters>InformationRegister.ПоставляемыеДанныеТребующиеОбработки</informationRegisters> - <informationRegisters>InformationRegister.ПраваПоЗначениямДоступа</informationRegisters> <informationRegisters>InformationRegister.ПраваРолей</informationRegisters> <informationRegisters>InformationRegister.ПравилаДляОбменаДанными</informationRegisters> <informationRegisters>InformationRegister.ПредметыПапкиВзаимодействий</informationRegisters> @@ -1466,16 +1454,22 @@ <informationRegisters>InformationRegister.СообщенияОбменаДаннымиОбластейДанных</informationRegisters> <informationRegisters>InformationRegister.СоответствияОбъектовИнформационныхБаз</informationRegisters> <informationRegisters>InformationRegister.СоставыГруппПользователей</informationRegisters> + <informationRegisters>InformationRegister.СостоянияКонтактовВзаимодействий</informationRegisters> <informationRegisters>InformationRegister.СостоянияОбменовДанными</informationRegisters> <informationRegisters>InformationRegister.СостоянияОбменовДаннымиОбластейДанных</informationRegisters> + <informationRegisters>InformationRegister.СостоянияПапокПисем</informationRegisters> + <informationRegisters>InformationRegister.СостоянияПредметовВзаимодействий</informationRegisters> <informationRegisters>InformationRegister.СостоянияРассылокОтчетов</informationRegisters> <informationRegisters>InformationRegister.СостоянияУспешныхОбменовДанными</informationRegisters> <informationRegisters>InformationRegister.СостоянияУспешныхОбменовДаннымиОбластейДанных</informationRegisters> <informationRegisters>InformationRegister.ТаблицыГруппДоступа</informationRegisters> <informationRegisters>InformationRegister.УведомленияОПрочтении</informationRegisters> + <informationRegisters>InformationRegister.Удалить_АктивныеПредметыВзаимодействий</informationRegisters> <informationRegisters>InformationRegister.УдалитьБлокировкиСеансовОбластиДанных</informationRegisters> <informationRegisters>InformationRegister.УдалитьВерсииПодсистем</informationRegisters> + <informationRegisters>InformationRegister.УдалитьГруппыЗначенийДоступа</informationRegisters> <informationRegisters>InformationRegister.УдалитьЗамерыВремени</informationRegisters> + <informationRegisters>InformationRegister.УдалитьНаборыЗначенийДоступа</informationRegisters> <informationRegisters>InformationRegister.УдалитьОбластиДанных</informationRegisters> <informationRegisters>InformationRegister.УдалитьОбластиКРезервномуКопированию</informationRegisters> <informationRegisters>InformationRegister.УдалитьОчередьЗаданий</informationRegisters> @@ -1484,11 +1478,11 @@ <informationRegisters>InformationRegister.УдалитьСтраныМира</informationRegisters> <informationRegisters>InformationRegister.ФайлыВРабочемКаталоге</informationRegisters> <informationRegisters>InformationRegister.ХранимыеФайлыВерсий</informationRegisters> - <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.ВидыДоступа</chartsOfCharacteristicTypes> <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.ВопросыДляАнкетирования</chartsOfCharacteristicTypes> <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.ДополнительныеРеквизитыИСведения</chartsOfCharacteristicTypes> <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.ОбъектыАдресацииЗадач</chartsOfCharacteristicTypes> <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.РазделыДатЗапретаИзменения</chartsOfCharacteristicTypes> + <chartsOfCharacteristicTypes>ChartOfCharacteristicTypes.УдалитьВидыДоступа</chartsOfCharacteristicTypes> <businessProcesses>BusinessProcess.Задание</businessProcesses> <tasks>Task.ЗадачаИсполнителя</tasks> </mdclass:Configuration> diff --git a/SSL/src/Configuration/Logo.png b/SSL/src/Configuration/Logo.png index 043c67ce39a6f38e3f98d081eacb113f1b4bafda..52f87233b798ff14ee8d516ba48bba9c6739d5bc 100644 GIT binary patch delta 937 zcmV;a16KTtBH0|UzY2c?gh@m}RCwC#nn8#oMHGg=_a=+7IujAS3F2AymbobEWyy?4 z#H*LgfB_FO2hDYfJ%iUd1#g2p1Vs@+B%+fMLA(ggTs-N?lODV|nH7{}-}6$nw7tou zlXNy|u%PLxR0ZDu-e3Q#sxEPN%3Lb3k~C|tsLCGjteLN=3IKm*PON9!qw16T=cr!- zXF$))ze#%M4j}GM(yZ+RHvlP#<G%oQlHU1H_IGM^;A=A%RWaZLGyhCghAR{SQI%(a zH-Q&I-}h#Iy#l-gC}6;D=lJZy74`ZL2fLde1MdPI;3eP<+25(%0v<8*Pm<pG>t*0i z(yV=@DleP)k7|GBSIyjk&r2je9|fDQsj7&o2=G^l0Q?zjepo4asf19Ju0*@j6e?AT zHdpct-aFiK;4<^`dbd50y~C}!4C%H9^8qn)zaNeE4!4Hg_CSF3OxI-qHe4o!Dlrsh zP7V;G`j$o^Gxy3ge+nKSSLA;cS`>xyltxt?pnu_#ZjXN}aohu?P#%LCRq<HwU$~^( zqX5rKy@@K+Z4Wl`Mj#rM_I?DBePaLV(YDV)p}%ucC=ZCVmq*cO9Azd^Z32a;EMfk6 zpiP`J^n<#Mlj^xBl<^kb_CUJrfy8<+MrH(Yk4#UH>cy$htdW>?DKQg;>a7zwJ=*qq z>qPR*iE)1llqWgnrPI`jEP}`@t+P(jg;FSjI6d0-MpbfwNF}-=*Fw`#D0;r$I*~}D zxR}e*C7TN}++W^WC`+Mq1hUJCtoKuZmb)X1-mkY#q<`W6dB!EM%or(xLd#x_N~0>d z6zxIg0q<Y<B`}Qd5j(lNnK+$=r<Kn*iHkf|83upD?%8?<&JQPL;vAc%g>GoB+|RJ0 zGx1Cmnvle90}oA*N+~K6&rG3o4hV_N8&&a&unyeHvuj(4J#jXX<vCsn5?Tm|MV!n% zx{Q;#B2`GjM9wp=I3NWBxIM+#)i@W*$l%5l2Fg5O%6>Y%7Hl?6slt;b0`Poz|Dk67 zTL^zgD{0nN{)<i0tX%`%3O0YIs`6zB$8)Ok{=x3%l~pzVV0ZIHRXGK&s>&UpEBiaO zr-7f$d?Nt)#msN2%Fn=^75UKpgsQv>yaue9xvNU2bA0w*ylQYA_!M}o1pNO8xRLbE z4<X!@2;6!~Ro(`+%>3~cyX;}A@;mS?aMU3=KKu2q7MK0H&A$TxmF&7}Fp1St00000 LNkvXXu0mjfsu#|j delta 1632 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 diff --git a/SSL/src/Configuration/ManagedApplicationModule.bsl b/SSL/src/Configuration/ManagedApplicationModule.bsl index b40a81585..8ebfad4eb 100644 --- a/SSL/src/Configuration/ManagedApplicationModule.bsl +++ b/SSL/src/Configuration/ManagedApplicationModule.bsl @@ -10,10 +10,10 @@ Перем ПредлагатьУстановкуРасширенияРаботыСФайлами Экспорт; // Признак того, что в данном сеансе не нужно запрашивать стандартное подтверждение при выходе Перем ПропуститьПредупреждениеПередЗавершениемРаботыСистемы Экспорт; -// Структура параметров для клиентской логики по завершению работы в программе. -Перем ПараметрыРаботыКлиентаПриЗавершении Экспорт; -// Структура, содержащая в себе время начала и окончания обновления программы. -Перем ПараметрыРаботыКлиентаПриОбновлении Экспорт; +// Структура параметров, используемая в процессе запуска и завершения программы. +Перем ПараметрыПриЗапускеИЗавершенииПрограммы Экспорт; +// Структура параметров подтверждения закрытия формы. +Перем ПараметрыПодтвержденияЗакрытияФормы Экспорт; // Конец СтандартныеПодсистемы.БазоваяФункциональность @@ -45,10 +45,6 @@ // Параметры для резервного копирования Перем ПараметрыРезервногоКопированияИБ Экспорт; -// Признак выполнения резервного копирования при завершении сеанса -Перем ОповещатьОРезервномКопированииПриЗавершенииСеанса Экспорт; -// Максимальная дата отложенного резервного копирования -Перем ДатаОтложенногоРезервногоКопирования Экспорт; // Конец СтандартныеПодсистемы.РезервноеКопированиеИБ @@ -62,10 +58,10 @@ // Конец СтандартныеПодсистемы -Процедура ПередНачаломРаботыСистемы(Отказ) +Процедура ПередНачаломРаботыСистемы() // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПередНачаломРаботыСистемы(Отказ); + СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы(); // Конец СтандартныеПодсистемы КонецПроцедуры @@ -73,7 +69,7 @@ Процедура ПриНачалеРаботыСистемы() // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПриНачалеРаботыСистемы(); + СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы(); // Конец СтандартныеПодсистемы КонецПроцедуры @@ -81,7 +77,7 @@ Процедура ПередЗавершениемРаботыСистемы(Отказ) // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ); + СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы(Отказ); // Конец СтандартныеПодсистемы КонецПроцедуры diff --git a/SSL/src/Configuration/OrdinaryApplicationModule.bsl b/SSL/src/Configuration/OrdinaryApplicationModule.bsl index b40a81585..8ebfad4eb 100644 --- a/SSL/src/Configuration/OrdinaryApplicationModule.bsl +++ b/SSL/src/Configuration/OrdinaryApplicationModule.bsl @@ -10,10 +10,10 @@ Перем ПредлагатьУстановкуРасширенияРаботыСФайлами Экспорт; // Признак того, что в данном сеансе не нужно запрашивать стандартное подтверждение при выходе Перем ПропуститьПредупреждениеПередЗавершениемРаботыСистемы Экспорт; -// Структура параметров для клиентской логики по завершению работы в программе. -Перем ПараметрыРаботыКлиентаПриЗавершении Экспорт; -// Структура, содержащая в себе время начала и окончания обновления программы. -Перем ПараметрыРаботыКлиентаПриОбновлении Экспорт; +// Структура параметров, используемая в процессе запуска и завершения программы. +Перем ПараметрыПриЗапускеИЗавершенииПрограммы Экспорт; +// Структура параметров подтверждения закрытия формы. +Перем ПараметрыПодтвержденияЗакрытияФормы Экспорт; // Конец СтандартныеПодсистемы.БазоваяФункциональность @@ -45,10 +45,6 @@ // Параметры для резервного копирования Перем ПараметрыРезервногоКопированияИБ Экспорт; -// Признак выполнения резервного копирования при завершении сеанса -Перем ОповещатьОРезервномКопированииПриЗавершенииСеанса Экспорт; -// Максимальная дата отложенного резервного копирования -Перем ДатаОтложенногоРезервногоКопирования Экспорт; // Конец СтандартныеПодсистемы.РезервноеКопированиеИБ @@ -62,10 +58,10 @@ // Конец СтандартныеПодсистемы -Процедура ПередНачаломРаботыСистемы(Отказ) +Процедура ПередНачаломРаботыСистемы() // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПередНачаломРаботыСистемы(Отказ); + СтандартныеПодсистемыКлиент.ПередНачаломРаботыСистемы(); // Конец СтандартныеПодсистемы КонецПроцедуры @@ -73,7 +69,7 @@ Процедура ПриНачалеРаботыСистемы() // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПриНачалеРаботыСистемы(); + СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы(); // Конец СтандартныеПодсистемы КонецПроцедуры @@ -81,7 +77,7 @@ Процедура ПередЗавершениемРаботыСистемы(Отказ) // СтандартныеПодсистемы - СтандартныеПодсистемыКлиент.ДействияПередЗавершениемРаботыСистемы(Отказ); + СтандартныеПодсистемыКлиент.ПередЗавершениемРаботыСистемы(Отказ); // Конец СтандартныеПодсистемы КонецПроцедуры diff --git a/SSL/src/Configuration/ParentConfigurations.bin b/SSL/src/Configuration/ParentConfigurations.bin index 663ec58c5..3498cce9d 100644 --- a/SSL/src/Configuration/ParentConfigurations.bin +++ b/SSL/src/Configuration/ParentConfigurations.bin @@ -1 +1 @@ -{6,1,1,d7a0608a-5ad4-4463-b431-0cdb287490ab,1,88de8c75-2e9b-4010-bc03-fd3767c23b2c,"2.1.9.2","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",4467,1,0,68f0e468-2a6f-4349-9898-4450082ac96d,68f0e468-2a6f-4349-9898-4450082ac96d,0,1,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,0,1,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,0,1,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,0,1,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,0,1,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,0,1,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,0,1,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,0,1,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,0,1,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,0,1,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,0,1,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,0,1,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,0,1,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,0,1,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,0,1,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,0,1,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,0,1,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,0,1,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,0,1,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,0,1,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,0,1,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,0,1,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,0,1,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,0,1,9e36087a-baa8-4812-956a-6e1ac73aa7e0,9e36087a-baa8-4812-956a-6e1ac73aa7e0,0,1,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,0,1,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,0,1,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,0,1,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,0,1,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,0,1,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,0,1,cb8da2f3-f8bb-4736-8381-7c153670e3e2,cb8da2f3-f8bb-4736-8381-7c153670e3e2,0,1,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,0,1,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,0,1,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,0,1,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,0,1,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,0,1,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,0,1,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,0,1,c53df2d1-4564-47a7-b66e-6a23ba28270e,c53df2d1-4564-47a7-b66e-6a23ba28270e,0,1,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,0,1,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,0,1,83192b3e-e7a9-4595-8887-24cda84457a9,83192b3e-e7a9-4595-8887-24cda84457a9,0,1,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,0,1,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,0,1,08eeb8f1-944f-4450-83f6-ef20aaab7d86,08eeb8f1-944f-4450-83f6-ef20aaab7d86,0,1,ac4742ed-1bc2-4a97-8c1a-bcdfbc20db82,ac4742ed-1bc2-4a97-8c1a-bcdfbc20db82,0,1,cbfef589-e7fb-4cbc-9103-e234861879ac,cbfef589-e7fb-4cbc-9103-e234861879ac,0,1,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,0,1,52176b25-0232-4326-9548-495db32b2660,52176b25-0232-4326-9548-495db32b2660,0,1,2fd12dba-5311-4f31-949c-f6b15decc0cc,2fd12dba-5311-4f31-949c-f6b15decc0cc,0,1,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,0,1,35895e12-52b6-49a1-acdf-6d828a948af0,35895e12-52b6-49a1-acdf-6d828a948af0,0,1,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0,1,060b6f18-538c-4ea1-9748-00efe0b1ab57,060b6f18-538c-4ea1-9748-00efe0b1ab57,0,1,307b6821-fd82-4a1c-9fdb-a26293d4f713,307b6821-fd82-4a1c-9fdb-a26293d4f713,0,1,a952960b-be1b-4ec4-bd76-80915065a60b,a952960b-be1b-4ec4-bd76-80915065a60b,0,1,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,0,1,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,0,1,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,0,1,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,0,1,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,0,1,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,0,1,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,0,1,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,0,1,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,0,1,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,0,1,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,0,1,739bd762-01fc-41a8-87df-844eb201962f,739bd762-01fc-41a8-87df-844eb201962f,0,1,7ef99dd3-d799-4f53-ab56-5528b4c9d782,7ef99dd3-d799-4f53-ab56-5528b4c9d782,0,1,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,0,1,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,0,1,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,0,1,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,0,1,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,0,1,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,0,1,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,0,1,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,0,1,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,0,1,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,0,1,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,0,1,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,0,1,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,0,1,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,0,1,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,0,1,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,0,1,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,0,1,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,0,1,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,0,1,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,0,1,0d0ada8a-09bb-4634-bf50-199f3779dad5,0d0ada8a-09bb-4634-bf50-199f3779dad5,0,1,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,0,1,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,0,1,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,0,1,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,0,1,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,0,1,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,0,1,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,0,1,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,0,1,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,0,1,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,0,1,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,0,1,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,0,1,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,0,1,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,0,1,2c8e45b8-7d80-4137-85db-66cd1db94526,2c8e45b8-7d80-4137-85db-66cd1db94526,0,1,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,0,1,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,0,1,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,0,1,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,0,1,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,0,1,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,0,1,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,0,1,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,0,1,87472d14-0d8c-4813-8a3e-2721bbb26811,87472d14-0d8c-4813-8a3e-2721bbb26811,0,1,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,0,1,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,0,1,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,0,1,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,0,1,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,0,1,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,0,1,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,0,1,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,0,1,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,0,1,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,0,1,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,0,1,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,0,1,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,0,1,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,0,1,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,0,1,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,0,1,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,0,1,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,0,1,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,0,1,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,0,1,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,0,1,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,0,1,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,0,1,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,0,1,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,0,1,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,0,1,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,0,1,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,0,1,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,0,1,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,0,1,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,0,1,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,0,1,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,0,1,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,0,1,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,0,1,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,0,1,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,0,1,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,0,1,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,0,1,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,0,1,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,0,1,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,0,1,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,0,1,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,0,1,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,0,1,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,0,1,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,0,1,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,0,1,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,0,1,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,0,1,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,0,1,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,0,1,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,0,1,9c7f2728-10a9-463b-b04c-01ee26f3d4c5,9c7f2728-10a9-463b-b04c-01ee26f3d4c5,0,1,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,0,1,20397e0c-b6e7-4ce0-8262-d9aacd87bb23,20397e0c-b6e7-4ce0-8262-d9aacd87bb23,0,1,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,0,1,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,0,1,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,0,1,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,0,1,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,0,1,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,0,1,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,0,1,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,0,1,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,0,1,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,0,1,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,0,1,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,0,1,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,0,1,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,0,1,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,0,1,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,0,1,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,0,1,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,0,1,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,0,1,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,0,1,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,0,1,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,0,1,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,0,1,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,0,1,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,0,1,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,0,1,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,0,1,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,0,1,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,0,1,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,0,1,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,0,1,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,0,1,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,0,1,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,0,1,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,0,1,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,0,1,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,0,1,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,0,1,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,0,1,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,0,1,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,0,1,c2768e31-9e61-4d8d-838d-90b2e2683148,c2768e31-9e61-4d8d-838d-90b2e2683148,0,1,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,0,1,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,0,1,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,0,1,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,0,1,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,0,1,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,0,1,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,0,1,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,0,1,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,0,1,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,0,1,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,0,1,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,0,1,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,0,1,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,0,1,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,0,1,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,0,1,8943233f-5c9a-4e6b-b1c2-3bbb94b6c4a7,8943233f-5c9a-4e6b-b1c2-3bbb94b6c4a7,0,1,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,0,1,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,0,1,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,0,1,041daf91-e5b3-471d-934d-55229f8a81d6,041daf91-e5b3-471d-934d-55229f8a81d6,0,1,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,0,1,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,0,1,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,0,1,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,0,1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,0,1,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,0,1,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,0,1,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,0,1,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,0,1,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,0,1,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,0,1,e70a6eab-791f-4c70-bb92-f069c7486d1b,e70a6eab-791f-4c70-bb92-f069c7486d1b,0,1,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,0,1,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,0,1,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,0,1,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,0,1,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,0,1,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,0,1,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,0,1,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,0,1,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,0,1,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,0,1,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,0,1,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,0,1,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,0,1,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,0,1,9ad979d3-74ad-4d90-b279-c3a2bea36ea7,9ad979d3-74ad-4d90-b279-c3a2bea36ea7,0,1,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,0,1,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,0,1,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,0,1,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,0,1,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,0,1,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0,1,89574884-bce2-406d-9961-d1656b306eb8,89574884-bce2-406d-9961-d1656b306eb8,0,1,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,0,1,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,0,1,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,0,1,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,0,1,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,0,1,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,0,1,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,0,1,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,0,1,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,0,1,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,0,1,3fe0ef25-ce56-435d-b343-eadfec91a636,3fe0ef25-ce56-435d-b343-eadfec91a636,0,1,6cb35d15-936f-4ca8-a196-8a9a75ce54dd,6cb35d15-936f-4ca8-a196-8a9a75ce54dd,0,1,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,0,1,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,0,1,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,0,1,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,0,1,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,0,1,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,0,1,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,0,1,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,0,1,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,0,1,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,0,1,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,0,1,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,0,1,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,0,1,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,0,1,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,0,1,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,0,1,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,0,1,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,0,1,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,0,1,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,0,1,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,0,1,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,0,1,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,0,1,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,0,1,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,0,1,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,0,1,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,0,1,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,0,1,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,0,1,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,0,1,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,0,1,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,0,1,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,0,1,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,0,1,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,0,1,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,0,1,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,0,1,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,0,1,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,0,1,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,0,1,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,0,1,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,0,1,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,0,1,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,0,1,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,0,1,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,0,1,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,0,1,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,0,1,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,0,1,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,0,1,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,0,1,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,0,1,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,0,1,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,0,1,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,0,1,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,0,1,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,0,1,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,0,1,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,0,1,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,0,1,ecfc7ede-fffb-4bea-9598-3e18845f603d,ecfc7ede-fffb-4bea-9598-3e18845f603d,0,1,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,0,1,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,0,1,eaae534f-b506-4c86-b649-5b103cf5791d,eaae534f-b506-4c86-b649-5b103cf5791d,0,1,18b4773a-5380-4e71-8b51-ef10e19df17e,18b4773a-5380-4e71-8b51-ef10e19df17e,0,1,42f454f7-cfc4-459b-898f-86cace30410c,42f454f7-cfc4-459b-898f-86cace30410c,0,1,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,0,1,e700ab8e-ff33-4968-9bd0-8918a7d2b83f,e700ab8e-ff33-4968-9bd0-8918a7d2b83f,0,1,330933ca-c4d5-4014-8a6d-910124dfdc7e,330933ca-c4d5-4014-8a6d-910124dfdc7e,0,1,910b3640-790c-4185-88b5-a7c7466374c0,910b3640-790c-4185-88b5-a7c7466374c0,0,1,b5eceb60-76ba-47e3-90bd-52078d4bae4e,b5eceb60-76ba-47e3-90bd-52078d4bae4e,0,1,b8869f44-b87f-4e3e-a0d5-2aec5ccda4e2,b8869f44-b87f-4e3e-a0d5-2aec5ccda4e2,0,1,f7c23753-ff8c-4c26-bdc5-58e3b038668d,f7c23753-ff8c-4c26-bdc5-58e3b038668d,0,1,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,0,1,10197638-2cde-4424-8390-3bc9abe9852e,10197638-2cde-4424-8390-3bc9abe9852e,0,1,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,0,1,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,0,1,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,0,1,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,0,1,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,0,1,4da65544-5f6e-4d56-96df-2b4949245f2e,4da65544-5f6e-4d56-96df-2b4949245f2e,0,1,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,0,1,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,0,1,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,ed394820-a216-4c4b-81ae-5dea33ced43b,ed394820-a216-4c4b-81ae-5dea33ced43b,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,8d8b91c0-c0ab-4b9d-b854-b867063ddb5b,8d8b91c0-c0ab-4b9d-b854-b867063ddb5b,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,dacd15cd-ffdc-444d-a45f-9b0c7776a7c5,dacd15cd-ffdc-444d-a45f-9b0c7776a7c5,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,5bfd74f4-811a-45db-b33d-8f93ba9c873a,5bfd74f4-811a-45db-b33d-8f93ba9c873a,1,0,852bd696-9a9e-4952-b676-4108f757ad9b,852bd696-9a9e-4952-b676-4108f757ad9b,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,c4d67026-2c97-4126-b8be-49aa6f567e2d,c4d67026-2c97-4126-b8be-49aa6f567e2d,1,0,fda2906d-f499-4016-b13a-99f7f713b898,fda2906d-f499-4016-b13a-99f7f713b898,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,497ce8f3-f6f0-4da8-aeb0-0fa01bb26dc6,497ce8f3-f6f0-4da8-aeb0-0fa01bb26dc6,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,6f9fba85-7c04-4e07-bc93-8ad79cbdca85,6f9fba85-7c04-4e07-bc93-8ad79cbdca85,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,40a52f83-f0e2-470d-9c17-7fdc8cc646b7,40a52f83-f0e2-470d-9c17-7fdc8cc646b7,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,3da31d2f-24dd-469b-bd3b-073fa3b3d585,3da31d2f-24dd-469b-bd3b-073fa3b3d585,1,0,737404de-5b9d-4445-81c5-2c5b50b36846,737404de-5b9d-4445-81c5-2c5b50b36846,1,0,1ae364d3-0bec-4089-af23-c60d2a274c85,1ae364d3-0bec-4089-af23-c60d2a274c85,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,b3847d64-46b8-4bd1-9362-d88d82b34254,b3847d64-46b8-4bd1-9362-d88d82b34254,1,0,14b58f6d-9243-47cd-a430-8408fcddd8d8,14b58f6d-9243-47cd-a430-8408fcddd8d8,0,1,57b9edd2-16d2-40f2-ae9c-33462eda5fb4,57b9edd2-16d2-40f2-ae9c-33462eda5fb4,0,1,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,0,1,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,0,1,536761fe-c3d3-425b-812d-94b3c12e6f7f,536761fe-c3d3-425b-812d-94b3c12e6f7f,0,1,b107a4a8-0db8-44f4-93f7-9f231e850398,b107a4a8-0db8-44f4-93f7-9f231e850398,0,1,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,0,1,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,0,1,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,0,1,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,0,1,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,0,1,a5cc5ae2-be80-4957-8aca-9e477433dfcc,a5cc5ae2-be80-4957-8aca-9e477433dfcc,0,1,62fa393c-687c-49bf-8a25-81adc04430fb,62fa393c-687c-49bf-8a25-81adc04430fb,0,1,36d7d739-b198-487d-8644-76589356c2ec,36d7d739-b198-487d-8644-76589356c2ec,0,1,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,0,1,e51ae56c-d311-46b7-8d4c-19a432f4cd16,e51ae56c-d311-46b7-8d4c-19a432f4cd16,0,1,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,0,1,40d3ed07-3b56-4c9f-8b96-d94455202ef0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,0,1,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,0,1,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,0,1,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,0,1,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,0,1,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,0,1,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,0,1,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0,1,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,0,1,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,0,1,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,0,1,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,0,1,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,0,1,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,0,1,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,0,1,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,0,1,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,0,1,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,0,1,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,0,1,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,0,1,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,0,1,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,0,1,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,0,1,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,0,1,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,0,1,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,0,1,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,0,1,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,0,1,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,0,1,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,0,1,27bfc94e-e438-4854-9a9d-39a3b984c9b4,27bfc94e-e438-4854-9a9d-39a3b984c9b4,0,1,a7f1af69-f0f1-4c24-bf4f-b8dc15f4dec2,a7f1af69-f0f1-4c24-bf4f-b8dc15f4dec2,0,1,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,0,1,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,0,1,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,0,1,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,0,1,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,0,1,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,0,1,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,0,1,a3d599b9-89d1-4386-8c5b-1c2a9905e6e2,a3d599b9-89d1-4386-8c5b-1c2a9905e6e2,0,1,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,0,1,7ea3206a-2a16-460d-ad6d-849103f50bdb,7ea3206a-2a16-460d-ad6d-849103f50bdb,0,1,60c04f0a-78a8-4c55-8844-b86906350fd1,60c04f0a-78a8-4c55-8844-b86906350fd1,0,1,851306a7-8847-4b43-8214-898bfc24b0ab,851306a7-8847-4b43-8214-898bfc24b0ab,0,1,af8d4bc9-2f0f-44d3-89ce-2593877055c8,af8d4bc9-2f0f-44d3-89ce-2593877055c8,0,1,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,0,1,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,0,1,f7f99dab-9f1e-4814-84e6-e05eb425f67e,f7f99dab-9f1e-4814-84e6-e05eb425f67e,0,1,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,0,1,10302ca9-850c-4561-a774-d099c20b1919,10302ca9-850c-4561-a774-d099c20b1919,0,1,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,0,1,d693bfcf-e117-445b-b0e1-d895bc5227c4,d693bfcf-e117-445b-b0e1-d895bc5227c4,0,1,cc9be940-db0c-4fad-9655-f5ce2b3ac57e,cc9be940-db0c-4fad-9655-f5ce2b3ac57e,0,1,211ca200-977e-4d48-a0c2-6b4e47bc1838,211ca200-977e-4d48-a0c2-6b4e47bc1838,0,1,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,0,1,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,0,1,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,0,1,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,0,1,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,0,1,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,0,1,5a4c6511-f8ed-40e4-a251-e28f62629cf2,5a4c6511-f8ed-40e4-a251-e28f62629cf2,0,1,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0,1,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,0,1,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,0,1,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,0,1,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,0,1,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,0,1,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,0,1,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,0,1,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,0,1,96d66cdd-d40c-43a3-92ce-40aef2101b64,96d66cdd-d40c-43a3-92ce-40aef2101b64,0,1,9daa8270-4782-4d83-af03-c8d2b11057ff,9daa8270-4782-4d83-af03-c8d2b11057ff,0,1,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,0,1,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,0,1,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,0,1,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,0,1,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,0,1,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,0,1,bd97e481-cfc4-4a40-8438-985020f06abd,bd97e481-cfc4-4a40-8438-985020f06abd,0,1,120c5162-b03c-46ce-8a2a-8ef501971715,120c5162-b03c-46ce-8a2a-8ef501971715,0,1,caf79125-bde8-4f52-8ad2-f915c7a884cc,caf79125-bde8-4f52-8ad2-f915c7a884cc,0,1,a9a0db31-6808-4790-be72-f345197b0c6e,a9a0db31-6808-4790-be72-f345197b0c6e,0,1,36554213-9af4-4fec-8944-35f50b306eda,36554213-9af4-4fec-8944-35f50b306eda,0,1,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,0,1,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,0,1,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,0,1,33343620-673e-4aa3-9e58-c6a25f738001,33343620-673e-4aa3-9e58-c6a25f738001,0,1,8aaf780f-ed74-4f44-9598-c14180053ff9,8aaf780f-ed74-4f44-9598-c14180053ff9,0,1,dbd4d09d-f410-4453-9143-bd72da5464cc,dbd4d09d-f410-4453-9143-bd72da5464cc,0,1,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,0,1,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,0,1,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,0,1,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,0,1,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,0,1,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,0,1,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,0,1,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,0,1,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,0,1,e3476d0e-0ab4-4734-9261-04aef6281086,e3476d0e-0ab4-4734-9261-04aef6281086,0,1,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,0,1,29c37223-de1c-49fb-8488-77e44dd79edd,29c37223-de1c-49fb-8488-77e44dd79edd,0,1,f561be64-9420-46ec-a4f7-9df0bea2e28b,f561be64-9420-46ec-a4f7-9df0bea2e28b,0,1,e9e242b7-0077-4c47-8f45-df50e7cc90cf,e9e242b7-0077-4c47-8f45-df50e7cc90cf,0,1,820383e1-9b95-4c0f-8464-722f1fe64ad5,820383e1-9b95-4c0f-8464-722f1fe64ad5,0,1,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,0,1,292bfe6b-703e-40cb-856d-abb470e6709f,292bfe6b-703e-40cb-856d-abb470e6709f,0,1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,0,1,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,0,1,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,0,1,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,0,1,a84891cc-e996-489a-abde-5b5af166a057,a84891cc-e996-489a-abde-5b5af166a057,0,1,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,0,1,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,0,1,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,0,1,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,0,1,19a307b1-9ef0-4fc6-bf4f-7636e9118399,19a307b1-9ef0-4fc6-bf4f-7636e9118399,0,1,666244a4-5636-4405-89dd-bbd8f4278071,666244a4-5636-4405-89dd-bbd8f4278071,0,1,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,0,1,29a627a9-debc-4074-88d0-ec3561e1ef9c,29a627a9-debc-4074-88d0-ec3561e1ef9c,0,1,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,0,1,39f5e272-9a10-40b0-8a10-92037828b206,39f5e272-9a10-40b0-8a10-92037828b206,0,1,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,0,1,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,0,1,958033a6-2a8e-473a-903b-34eee6507f5a,958033a6-2a8e-473a-903b-34eee6507f5a,0,1,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,0,1,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,0,1,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,0,1,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,0,1,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,0,1,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,0,1,d9e08c12-1999-41d8-b530-90187303be0a,d9e08c12-1999-41d8-b530-90187303be0a,0,1,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,0,1,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,0,1,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,0,1,19b9cbbb-1fcc-4492-9385-687742cb3d0b,19b9cbbb-1fcc-4492-9385-687742cb3d0b,0,1,247c41dd-c8dc-43dd-b348-1ba31ee92065,247c41dd-c8dc-43dd-b348-1ba31ee92065,0,1,dbad3cee-0d5c-41f6-819f-1a2b5251b62c,dbad3cee-0d5c-41f6-819f-1a2b5251b62c,0,1,da673406-078d-44c8-9d27-80ef172c4b5e,da673406-078d-44c8-9d27-80ef172c4b5e,0,1,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,0,1,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,0,1,3a46c243-bdf5-4429-895a-edeae1c0396e,3a46c243-bdf5-4429-895a-edeae1c0396e,0,1,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,0,1,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,0,1,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,0,1,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,0,1,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,0,1,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,0,1,0a646724-b49d-42cd-82e6-e800466ed127,0a646724-b49d-42cd-82e6-e800466ed127,0,1,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,0,1,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,0,1,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,0,1,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,0,1,12cf9412-baf5-4d32-a563-a11ac3d5e0ed,12cf9412-baf5-4d32-a563-a11ac3d5e0ed,0,1,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,0,1,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,0,1,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,0,1,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,0,1,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,0,1,642154b8-97da-4c4f-bf34-c1124215077d,642154b8-97da-4c4f-bf34-c1124215077d,0,1,abc10867-39ae-46bf-8bd7-90f645919235,abc10867-39ae-46bf-8bd7-90f645919235,0,1,b3396504-8ccb-43d6-9a0f-ab259ba0a542,b3396504-8ccb-43d6-9a0f-ab259ba0a542,0,1,f59f91c5-026a-4dc5-996e-0d59814a9604,f59f91c5-026a-4dc5-996e-0d59814a9604,0,1,aac9966f-e9ea-4106-97bb-6b9822939bc7,aac9966f-e9ea-4106-97bb-6b9822939bc7,0,1,a752fba8-5084-4fa2-9d0b-7074a42b1312,a752fba8-5084-4fa2-9d0b-7074a42b1312,0,1,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,0,1,832fe1ae-ba81-44b2-9474-a29f36c3b863,832fe1ae-ba81-44b2-9474-a29f36c3b863,0,1,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,0,1,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,0,1,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,0,1,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,0,1,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,0,1,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0,1,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,0,1,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,0,1,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,0,1,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,0,1,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,0,1,6ae6e515-5cd4-4eca-8602-c6abe6d66276,6ae6e515-5cd4-4eca-8602-c6abe6d66276,0,1,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,0,1,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,0,1,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,0,1,2e17464f-9cef-4812-865f-4eb77ff16b6a,2e17464f-9cef-4812-865f-4eb77ff16b6a,0,1,e5ecbb1f-981d-4928-9335-22216879f7e2,e5ecbb1f-981d-4928-9335-22216879f7e2,0,1,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,0,1,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,0,1,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,0,1,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0,1,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,0,1,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,0,1,a50fcacc-6d2d-496c-bea0-9c73cd153437,a50fcacc-6d2d-496c-bea0-9c73cd153437,0,1,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,0,1,57df7810-817b-430d-9e62-bc1ac302434e,57df7810-817b-430d-9e62-bc1ac302434e,0,1,a5633248-8611-4e9b-b223-2f59e7b84a65,a5633248-8611-4e9b-b223-2f59e7b84a65,0,1,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,0,1,e40b8882-737a-40c0-83b4-c35dc042f4a5,e40b8882-737a-40c0-83b4-c35dc042f4a5,0,1,d60c1e9d-1395-4293-8462-6ea2c93a0c86,d60c1e9d-1395-4293-8462-6ea2c93a0c86,0,1,a2b2f025-3108-4f13-9440-8909b5e685f5,a2b2f025-3108-4f13-9440-8909b5e685f5,0,1,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,0,1,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,0,1,6ac7db0c-18ed-4d3b-956a-5985214db474,6ac7db0c-18ed-4d3b-956a-5985214db474,0,1,267103e0-6703-4a74-bb4f-af610d7ef332,267103e0-6703-4a74-bb4f-af610d7ef332,0,1,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,0,1,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,0,1,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,0,1,cdac5b57-bb40-4783-a506-37251d7714a4,cdac5b57-bb40-4783-a506-37251d7714a4,0,1,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,0,1,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,0,1,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,0,1,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,0,1,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,0,1,071ee250-f4eb-4ff8-a998-e34fa4812013,071ee250-f4eb-4ff8-a998-e34fa4812013,0,1,d4655391-144c-4ba6-aee5-1edafebe862c,d4655391-144c-4ba6-aee5-1edafebe862c,0,1,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,0,1,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,0,1,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,0,1,68caf9e5-9a79-4b77-b0f4-ca9c0fe4fa16,68caf9e5-9a79-4b77-b0f4-ca9c0fe4fa16,0,1,75c4e24f-b8d4-4b29-a9ce-e1d141c60fae,75c4e24f-b8d4-4b29-a9ce-e1d141c60fae,0,1,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,0,1,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,0,1,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,0,1,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,0,1,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,0,1,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,0,1,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,0,1,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,0,1,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,0,1,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0,1,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,0,1,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,0,1,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,0,1,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,0,1,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,0,1,aa368dd9-86e1-46f9-a296-591c3639734d,aa368dd9-86e1-46f9-a296-591c3639734d,0,1,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,0,1,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,0,1,066f9ab6-ff76-4426-bddd-702e9b16aa5b,066f9ab6-ff76-4426-bddd-702e9b16aa5b,0,1,0e2c2490-50ee-4fed-9119-5dec8385f925,0e2c2490-50ee-4fed-9119-5dec8385f925,0,1,8d60a95c-4035-473f-b1b1-2d52afa2e2d6,8d60a95c-4035-473f-b1b1-2d52afa2e2d6,0,1,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,0,1,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,0,1,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,0,1,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,0,1,f3bd841b-fb36-4462-9627-b51801e563cd,f3bd841b-fb36-4462-9627-b51801e563cd,0,1,0a23f273-5589-4a48-be3a-eee7565749aa,0a23f273-5589-4a48-be3a-eee7565749aa,0,1,494eb9d9-4a10-4e85-b511-375408f21bbe,494eb9d9-4a10-4e85-b511-375408f21bbe,0,1,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,0,1,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,0,1,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,0,1,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,0,1,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,0,1,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,0,1,c05f15b0-a659-4473-b6d0-acebc4a2da57,c05f15b0-a659-4473-b6d0-acebc4a2da57,0,1,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,0,1,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,0,1,b953eafc-20be-4463-8c3e-903184e18402,b953eafc-20be-4463-8c3e-903184e18402,0,1,dcefdde9-645e-43c7-9244-384dadc75439,dcefdde9-645e-43c7-9244-384dadc75439,0,1,bbdfeebd-cda0-4911-8f31-553d751340a7,bbdfeebd-cda0-4911-8f31-553d751340a7,0,1,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,0,1,20aad006-5b1e-4cc2-94ef-668dd002667b,20aad006-5b1e-4cc2-94ef-668dd002667b,0,1,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,0,1,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,0,1,fa787228-aed5-4a16-b958-d102b78bf776,fa787228-aed5-4a16-b958-d102b78bf776,0,1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,0,1,2befb2e3-7354-4a01-83d6-b24262704a5e,2befb2e3-7354-4a01-83d6-b24262704a5e,0,1,5b93975e-b2a4-4102-a060-2667f5813c94,5b93975e-b2a4-4102-a060-2667f5813c94,0,1,ca75d086-cd01-4f54-b57d-1b35bcb1272a,ca75d086-cd01-4f54-b57d-1b35bcb1272a,0,1,b4a27991-2e18-4ead-80e8-f2956a7539e3,b4a27991-2e18-4ead-80e8-f2956a7539e3,0,1,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,0,1,be900d20-c02d-476d-9ede-2bc5303ef6cb,be900d20-c02d-476d-9ede-2bc5303ef6cb,0,1,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,0,1,07b53437-cc8d-4834-a1e0-7007538b6eab,07b53437-cc8d-4834-a1e0-7007538b6eab,0,1,0dbec644-cb98-4368-ab76-5997259cbce7,0dbec644-cb98-4368-ab76-5997259cbce7,0,1,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,0,1,dcdc9c65-c2d5-4531-a325-f64b3861cbab,dcdc9c65-c2d5-4531-a325-f64b3861cbab,0,1,ca542a9e-3040-419f-9a98-2a8de230b734,ca542a9e-3040-419f-9a98-2a8de230b734,0,1,c9fc5155-1df3-4872-a83d-72872baf43c4,c9fc5155-1df3-4872-a83d-72872baf43c4,0,1,9f9adb67-66bd-4c28-8319-44ae097ae1fe,9f9adb67-66bd-4c28-8319-44ae097ae1fe,0,1,0bae3704-b370-48be-b094-f18a2e62ad1b,0bae3704-b370-48be-b094-f18a2e62ad1b,0,1,e097bf94-9235-4a27-b0eb-d6387d22cd62,e097bf94-9235-4a27-b0eb-d6387d22cd62,0,1,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,0,1,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,0,1,8d2bfd40-f185-4eab-b374-872d49310eb2,8d2bfd40-f185-4eab-b374-872d49310eb2,0,1,523de426-e5a6-49e0-8144-c637f80d8ddd,523de426-e5a6-49e0-8144-c637f80d8ddd,0,1,09256328-6205-4b04-b908-3287ae8ded75,09256328-6205-4b04-b908-3287ae8ded75,0,1,05a6e161-9791-4c5b-8753-bd6370cc4cc9,05a6e161-9791-4c5b-8753-bd6370cc4cc9,0,1,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,0,1,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,0,1,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,0,1,6362facc-bf95-4adf-8ee7-c65f90972a1c,6362facc-bf95-4adf-8ee7-c65f90972a1c,0,1,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,0,1,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,0,1,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,0,1,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,0,1,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,0,1,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,0,1,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,0,1,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,0,1,1abeb10b-0558-4478-8f51-d0964ba3c274,1abeb10b-0558-4478-8f51-d0964ba3c274,0,1,38325a66-588a-4db0-8e0c-21d239408369,38325a66-588a-4db0-8e0c-21d239408369,0,1,7c27e885-33fd-4da2-a60d-50336c0189b0,7c27e885-33fd-4da2-a60d-50336c0189b0,0,1,4b849c66-6a36-4efd-815e-af4467c6f064,4b849c66-6a36-4efd-815e-af4467c6f064,0,1,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,0,1,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,0,1,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,0,1,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,0,1,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,0,1,68f6d1b2-9c08-4b37-ba23-1e15539a9c35,68f6d1b2-9c08-4b37-ba23-1e15539a9c35,0,1,cb6df70e-c7cd-4343-bfa9-5bdb907b4580,cb6df70e-c7cd-4343-bfa9-5bdb907b4580,0,1,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,0,1,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,0,1,2b3cab9a-fd05-42a8-811a-f443aee5e192,2b3cab9a-fd05-42a8-811a-f443aee5e192,0,1,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,0,1,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,0,1,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,0,1,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,0,1,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,0,1,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,0,1,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,0,1,c7f817ee-9f6a-454c-95a0-b279fd08055e,c7f817ee-9f6a-454c-95a0-b279fd08055e,0,1,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,0,1,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,0,1,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,0,1,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,0,1,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,0,1,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,0,1,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,0,1,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,0,1,39355e82-30a6-431e-9697-e2c42e82de83,39355e82-30a6-431e-9697-e2c42e82de83,0,1,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,0,1,edc01b03-8b01-4551-939a-f7e257892040,edc01b03-8b01-4551-939a-f7e257892040,0,1,15d09274-9508-4f64-9ea3-678c5aa50f0f,15d09274-9508-4f64-9ea3-678c5aa50f0f,0,1,4debe032-12e4-4777-b2fc-70b150f2aad1,4debe032-12e4-4777-b2fc-70b150f2aad1,0,1,37558fa2-0833-46d6-9e4f-63d4a3136870,37558fa2-0833-46d6-9e4f-63d4a3136870,0,1,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,0,1,361271fa-2faa-497d-adfe-dea8b825405e,361271fa-2faa-497d-adfe-dea8b825405e,0,1,5dceae8b-1ff3-4760-a1c4-975a92be1023,5dceae8b-1ff3-4760-a1c4-975a92be1023,0,1,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,0,1,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,0,1,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,0,1,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,0,1,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,0,1,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,0,1,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,0,1,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,0,1,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,0,1,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,0,1,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,0,1,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,0,1,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0,1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,0,1,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0,1,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,0,1,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,0,1,be15e947-f671-4848-ada1-51239af73615,be15e947-f671-4848-ada1-51239af73615,0,1,d3e0dd8f-886a-4441-8f05-fd629da80f07,d3e0dd8f-886a-4441-8f05-fd629da80f07,0,1,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,0,1,2c04d747-c363-4218-92c9-5c83393e928b,2c04d747-c363-4218-92c9-5c83393e928b,0,1,093b8255-7ee5-4463-bd20-542b1d63e799,093b8255-7ee5-4463-bd20-542b1d63e799,0,1,5afb95e0-51a3-4a0f-bea7-e06716421974,5afb95e0-51a3-4a0f-bea7-e06716421974,0,1,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,0,1,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,0,1,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,0,1,e2c0bc7a-7197-4972-b703-a2356d2a36ad,e2c0bc7a-7197-4972-b703-a2356d2a36ad,0,1,33c66a15-e48e-406a-a77c-02af72ae96d5,33c66a15-e48e-406a-a77c-02af72ae96d5,0,1,77fe53c2-de9d-4483-97c9-f7d44e137d5e,77fe53c2-de9d-4483-97c9-f7d44e137d5e,0,1,593be64c-6792-46d9-8618-84c50c9ad9e4,593be64c-6792-46d9-8618-84c50c9ad9e4,0,1,208d29cb-040f-4282-b8e8-dda8417b8e92,208d29cb-040f-4282-b8e8-dda8417b8e92,0,1,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,0,1,459ed297-0c0d-4bdb-90a3-da387868f040,459ed297-0c0d-4bdb-90a3-da387868f040,0,1,ccb5b9a7-1a10-4803-b455-0350afe4b584,ccb5b9a7-1a10-4803-b455-0350afe4b584,0,1,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,0,1,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,0,1,ba5e7c41-0442-4f74-ba41-631d864eafb4,ba5e7c41-0442-4f74-ba41-631d864eafb4,0,1,3913f78f-ce34-4ae3-840a-ccdf06319cbb,3913f78f-ce34-4ae3-840a-ccdf06319cbb,0,1,104cf3e3-2104-4ac2-bdc6-792750a63ea0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,0,1,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,0,1,d3c9b925-6b74-42db-8b21-ab21d24797d1,d3c9b925-6b74-42db-8b21-ab21d24797d1,0,1,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,0,1,39261a2d-7c46-40b1-9f8f-02d970aa04bc,39261a2d-7c46-40b1-9f8f-02d970aa04bc,0,1,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,0,1,124a516f-cdab-49ce-95d1-359921140342,124a516f-cdab-49ce-95d1-359921140342,0,1,e4294611-a770-4e67-9578-a1f370879476,e4294611-a770-4e67-9578-a1f370879476,0,1,c5033dd2-0911-4124-8688-dc9dabf3155f,c5033dd2-0911-4124-8688-dc9dabf3155f,0,1,274357df-cb5c-407d-ae72-58046c310db2,274357df-cb5c-407d-ae72-58046c310db2,0,1,5467001e-d025-4669-b16e-26381ac4403f,5467001e-d025-4669-b16e-26381ac4403f,0,1,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,0,1,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,0,1,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,0,1,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,0,1,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,0,1,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,0,1,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,0,1,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,0,1,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,0,1,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,0,1,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,0,1,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,0,1,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,0,1,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,0,1,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,0,1,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,0,1,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,0,1,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,0,1,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,0,1,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,0,1,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,0,1,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,0,1,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,0,1,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,0,1,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,0,1,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,0,1,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,0,1,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,0,1,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,0,1,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,0,1,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,0,1,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,0,1,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,0,1,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,0,1,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,0,1,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,0,1,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,0,1,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,0,1,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,0,1,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,0,1,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,0,1,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,0,1,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,0,1,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,0,1,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,0,1,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,0,1,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,0,1,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,0,1,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,0,1,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,0,1,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,0,1,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,0,1,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,0,1,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,0,1,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,0,1,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,0,1,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,0,1,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0,1,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,0,1,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,0,1,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,0,1,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,0,1,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,0,1,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,0,1,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0,1,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,0,1,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,0,1,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,0,1,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,0,1,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,0,1,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,0,1,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,0,1,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,0,1,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,0,1,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,0,1,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,0,1,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,0,1,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,0,1,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,0,1,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,0,1,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,0,1,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,0,1,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,0,1,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,0,1,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,0,1,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,0,1,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,0,1,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,0,1,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,0,1,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,0,1,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,0,1,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,0,1,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,0,1,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,0,1,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,0,1,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,0,1,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,0,1,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,0,1,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,0,1,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,0,1,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,0,1,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,0,1,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,0,1,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,0,1,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,0,1,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,0,1,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,0,1,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,0,1,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,0,1,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,0,1,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,0,1,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,0,1,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,0,1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,0,1,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,0,1,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,0,1,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,0,1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,0,1,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,0,1,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,0,1,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,0,1,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,0,1,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,0,1,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,0,1,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,0,1,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,0,1,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,0,1,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,0,1,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,0,1,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,0,1,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,0,1,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,0,1,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,0,1,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,0,1,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,0,1,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,0,1,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,0,1,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,0,1,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,0,1,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,0,1,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,0,1,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,0,1,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,0,1,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,0,1,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,0,1,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,0,1,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,0,1,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,0,1,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,0,1,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,0,1,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,0,1,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,0,1,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,0,1,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,0,1,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,0,1,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,0,1,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,0,1,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,0,1,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,0,1,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,0,1,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,0,1,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,0,1,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,0,1,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,0,1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,0,1,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,0,1,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,0,1,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,0,1,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,0,1,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,0,1,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,0,1,b19f1223-5ebe-4446-bacc-bc7d53486f2e,b19f1223-5ebe-4446-bacc-bc7d53486f2e,0,1,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,0,1,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,0,1,bf3167d6-3047-482a-b280-184f446ae7a3,bf3167d6-3047-482a-b280-184f446ae7a3,0,1,50c47c0a-a199-4020-9df4-91b17c159454,50c47c0a-a199-4020-9df4-91b17c159454,0,1,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,0,1,faecdc33-fed8-4b44-96f4-4215c26959b6,faecdc33-fed8-4b44-96f4-4215c26959b6,0,1,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,0,1,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,0,1,9df3792e-a4ee-4a2c-9296-c1384925521e,9df3792e-a4ee-4a2c-9296-c1384925521e,0,1,03d423db-f98a-468f-9040-5b76454e5a98,03d423db-f98a-468f-9040-5b76454e5a98,0,1,08f394f9-d254-4fe5-8651-a69c96de7a62,08f394f9-d254-4fe5-8651-a69c96de7a62,0,1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,0,1,6aff6b2f-660b-4d75-9064-fed7a6b0feac,6aff6b2f-660b-4d75-9064-fed7a6b0feac,0,1,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,0,1,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,0,1,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,0,1,e60a9221-7676-456f-8a01-b317b03a278b,e60a9221-7676-456f-8a01-b317b03a278b,0,1,4e81ec90-f668-49ca-9193-22337bafb01b,4e81ec90-f668-49ca-9193-22337bafb01b,0,1,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,0,1,cd60adec-52d6-4fa8-85ca-26551196432c,cd60adec-52d6-4fa8-85ca-26551196432c,0,1,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,0,1,b71ddbdb-08bb-46be-a79d-319c4a557e76,b71ddbdb-08bb-46be-a79d-319c4a557e76,0,1,d3dfa867-3d52-4872-a69e-f27636abe1bd,d3dfa867-3d52-4872-a69e-f27636abe1bd,0,1,6952d1aa-7132-4e40-8542-f64a4dc1e029,6952d1aa-7132-4e40-8542-f64a4dc1e029,0,1,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,0,1,1621811b-dfd3-4c58-8e15-ced16690147a,1621811b-dfd3-4c58-8e15-ced16690147a,0,1,3f266e51-0476-4b7f-8d61-6f9f4456049d,3f266e51-0476-4b7f-8d61-6f9f4456049d,0,1,2b9ce591-ff13-4c2d-85c4-632a2609a211,2b9ce591-ff13-4c2d-85c4-632a2609a211,0,1,689ca0ec-61ce-4590-b73b-ac81e8f1d459,689ca0ec-61ce-4590-b73b-ac81e8f1d459,0,1,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,0,1,55ad36d7-399e-4b82-8d1c-d45bd890abfe,55ad36d7-399e-4b82-8d1c-d45bd890abfe,0,1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0,1,1b39a65f-5425-4bcb-85bd-1425274af8a8,1b39a65f-5425-4bcb-85bd-1425274af8a8,0,1,392a0618-a41a-4713-a561-f3a80b85abd8,392a0618-a41a-4713-a561-f3a80b85abd8,0,1,a453384d-658d-40f1-ac69-578aa3a24e39,a453384d-658d-40f1-ac69-578aa3a24e39,0,1,2215a441-b9b1-4e5c-8df3-e6cee9226c43,2215a441-b9b1-4e5c-8df3-e6cee9226c43,0,1,2a8d4908-ea0d-4837-be3f-bd78f6b61254,2a8d4908-ea0d-4837-be3f-bd78f6b61254,0,1,ec1deb79-7369-4b26-8e91-f51399e8052a,ec1deb79-7369-4b26-8e91-f51399e8052a,0,1,75dde4fb-3a1a-450c-95c2-c1f95a781db9,75dde4fb-3a1a-450c-95c2-c1f95a781db9,0,1,0ae3ac56-160a-417e-9952-719d02e7f089,0ae3ac56-160a-417e-9952-719d02e7f089,0,1,f5b3983d-d22d-44a8-9069-0a60d8b858bf,f5b3983d-d22d-44a8-9069-0a60d8b858bf,0,1,48659b94-ace8-45f4-a043-6b2731ec6925,48659b94-ace8-45f4-a043-6b2731ec6925,0,1,3a8e60f9-19cb-42a6-a448-ad211261d9b8,3a8e60f9-19cb-42a6-a448-ad211261d9b8,0,1,74320602-094a-4645-b2c9-3053377a3ac3,74320602-094a-4645-b2c9-3053377a3ac3,0,1,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,0,1,b066c732-9c5f-4504-894f-96d457b0768f,b066c732-9c5f-4504-894f-96d457b0768f,0,1,9366463d-aa8a-4e89-86d8-c7f746f9551b,9366463d-aa8a-4e89-86d8-c7f746f9551b,0,1,e25da569-d435-45b2-b4e8-fc76d7f1c8df,e25da569-d435-45b2-b4e8-fc76d7f1c8df,0,1,a51a7f57-9c52-4457-819c-13e1b6f886e1,a51a7f57-9c52-4457-819c-13e1b6f886e1,0,1,7d08daba-5e36-4ce3-8a70-17750959b89e,7d08daba-5e36-4ce3-8a70-17750959b89e,0,1,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,0,1,39344a8c-2662-48ff-937b-12951bb268fb,39344a8c-2662-48ff-937b-12951bb268fb,0,1,b577663f-ead2-4b18-a4f6-f7f303e89319,b577663f-ead2-4b18-a4f6-f7f303e89319,0,1,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,0,1,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,0,1,72663843-4010-42ed-989b-0b58bf9f7146,72663843-4010-42ed-989b-0b58bf9f7146,0,1,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,0,1,3adcceea-867e-4b88-a633-4f8d4ccb43c0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,0,1,a132189c-6584-4bb1-9cfd-1415cd83228a,a132189c-6584-4bb1-9cfd-1415cd83228a,0,1,7ba50e13-0a78-4cca-821f-006b1c83b0b0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,0,1,a3670f95-5abe-49ee-8ea5-d7e4438801ba,a3670f95-5abe-49ee-8ea5-d7e4438801ba,0,1,4443dea1-5143-4e76-97a7-c35dbe1665e4,4443dea1-5143-4e76-97a7-c35dbe1665e4,0,1,0d780521-0767-425a-b44d-315d2dc42d04,0d780521-0767-425a-b44d-315d2dc42d04,0,1,c5b1572d-28f5-42f3-b2e0-8b54f091642e,c5b1572d-28f5-42f3-b2e0-8b54f091642e,0,1,0986c1b6-b677-428d-b49f-a93e40e77171,0986c1b6-b677-428d-b49f-a93e40e77171,0,1,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,0,1,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,0,1,b6662b2e-7e93-4eaa-9e4b-b5647285932b,b6662b2e-7e93-4eaa-9e4b-b5647285932b,0,1,4a180f2c-dc54-4591-8f62-f236d1e07799,4a180f2c-dc54-4591-8f62-f236d1e07799,0,1,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,0,1,a9a51e79-4c79-4a43-931b-c0321c1cd65b,a9a51e79-4c79-4a43-931b-c0321c1cd65b,0,1,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,0,1,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,0,1,22f2696e-0ac1-4a74-bca9-987b267b2b59,22f2696e-0ac1-4a74-bca9-987b267b2b59,0,1,d705cacc-3485-46d7-9ff4-48c3c0757c81,d705cacc-3485-46d7-9ff4-48c3c0757c81,0,1,98f043ea-633c-4a03-a56f-efbc9e6ef288,98f043ea-633c-4a03-a56f-efbc9e6ef288,0,1,2033b92a-0750-478a-a12d-cf4f74d0a9da,2033b92a-0750-478a-a12d-cf4f74d0a9da,0,1,92fa2196-d8e5-45f9-9d2e-59d837b163ea,92fa2196-d8e5-45f9-9d2e-59d837b163ea,0,1,25dc2290-e283-4449-81c1-1ce15b58067f,25dc2290-e283-4449-81c1-1ce15b58067f,0,1,c534a865-a17f-41e7-88b9-c6af89c9d202,c534a865-a17f-41e7-88b9-c6af89c9d202,0,1,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0,1,0127937c-94c0-43fe-9630-cc2ec6904ad8,0127937c-94c0-43fe-9630-cc2ec6904ad8,0,1,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,0,1,8df5b3cd-7788-4198-a530-e88be83f1cdf,8df5b3cd-7788-4198-a530-e88be83f1cdf,0,1,ffaeea66-66d5-4741-a9b5-875afebfce7f,ffaeea66-66d5-4741-a9b5-875afebfce7f,0,1,4e36184e-d818-4f38-9257-6d91d9cc85ae,4e36184e-d818-4f38-9257-6d91d9cc85ae,0,1,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,0,1,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,0,1,3893a258-a9c7-441a-b80c-1cc8c3f4735c,3893a258-a9c7-441a-b80c-1cc8c3f4735c,0,1,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,0,1,c66d0377-45bb-4ef0-bf9b-b44a9c510d38,c66d0377-45bb-4ef0-bf9b-b44a9c510d38,0,1,420748d8-4042-4e1e-aca1-ac0190cdf54e,420748d8-4042-4e1e-aca1-ac0190cdf54e,0,1,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,0,1,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,0,1,f8a456fa-a533-444c-a504-0e74306ada44,f8a456fa-a533-444c-a504-0e74306ada44,0,1,4751a91a-f211-4f66-8238-9bb5668cbc67,4751a91a-f211-4f66-8238-9bb5668cbc67,0,1,f1381abc-e09f-407d-b6b5-c59e7c9e2fd7,f1381abc-e09f-407d-b6b5-c59e7c9e2fd7,0,1,e6c871d6-e06f-420b-ae04-dbf735d3233d,e6c871d6-e06f-420b-ae04-dbf735d3233d,0,1,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,0,1,6287eded-23d8-4b04-8415-1d9afa17713b,6287eded-23d8-4b04-8415-1d9afa17713b,0,1,8ce3513d-d086-46f4-81c3-1761594a64c5,8ce3513d-d086-46f4-81c3-1761594a64c5,0,1,79cb147c-8c6b-4f6e-8d5d-dfa29a6e6e53,79cb147c-8c6b-4f6e-8d5d-dfa29a6e6e53,0,1,704f07f2-0513-4a54-bb41-27ca3deb5834,704f07f2-0513-4a54-bb41-27ca3deb5834,0,1,0504ea28-d8ed-43ac-afa5-c3f32c21b385,0504ea28-d8ed-43ac-afa5-c3f32c21b385,0,1,2ccbc9aa-52d3-4cf3-8e83-77aaef82a38d,2ccbc9aa-52d3-4cf3-8e83-77aaef82a38d,0,1,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,0,1,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,0,1,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,0,1,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,0,1,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,0,1,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,0,1,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,0,1,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,0,1,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,0,1,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,0,1,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,0,1,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,0,1,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,0,1,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,0,1,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,0,1,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,0,1,bb6e6574-4328-4cf5-a043-a7d8f6c81414,bb6e6574-4328-4cf5-a043-a7d8f6c81414,0,1,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,0,1,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,0,1,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,0,1,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,0,1,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,0,1,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,0,1,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0,1,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,0,1,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,0,1,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,0,1,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,0,1,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,0,1,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,0,1,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,0,1,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,0,1,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,0,1,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,0,1,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,0,1,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,0,1,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,0,1,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,0,1,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,0,1,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,0,1,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,0,1,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,0,1,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,0,1,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,0,1,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,0,1,e1314cd1-e662-4c29-ad51-492cb0029883,e1314cd1-e662-4c29-ad51-492cb0029883,0,1,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,0,1,9bc09758-a7ce-44e0-baa3-a3e909869d9b,9bc09758-a7ce-44e0-baa3-a3e909869d9b,0,1,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,0,1,9690842c-7a2c-4b5d-a238-f730afc49a7b,9690842c-7a2c-4b5d-a238-f730afc49a7b,0,1,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,0,1,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,0,1,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,0,1,554320a0-55dc-4289-bb08-63d405cb4ca5,554320a0-55dc-4289-bb08-63d405cb4ca5,0,1,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,0,1,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,0,1,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,0,1,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,0,1,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,0,1,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,0,1,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,0,1,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,0,1,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,0,1,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,0,1,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,0,1,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,0,1,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,0,1,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,0,1,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,0,1,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,0,1,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,0,1,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,0,1,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,0,1,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,0,1,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,0,1,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,0,1,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,0,1,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,0,1,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,0,1,f0ffe529-481f-4eed-8fc8-02a9d8f08f7a,f0ffe529-481f-4eed-8fc8-02a9d8f08f7a,0,1,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,0,1,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,0,1,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,0,1,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,0,1,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0,1,1511c2e3-aeb4-422a-b6ae-03412b714c93,1511c2e3-aeb4-422a-b6ae-03412b714c93,0,1,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,0,1,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,0,1,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,0,1,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,0,1,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,0,1,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,0,1,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,0,1,caea53be-d2f7-4109-8017-d2bfdfde8c6f,caea53be-d2f7-4109-8017-d2bfdfde8c6f,0,1,60f30706-9919-4767-a17c-660754b9d542,60f30706-9919-4767-a17c-660754b9d542,0,1,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,0,1,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0,1,28dc34df-1daa-49a2-a12e-db91ee963459,28dc34df-1daa-49a2-a12e-db91ee963459,0,1,e590825f-10c6-4fdd-98cd-3da01da2ed4f,e590825f-10c6-4fdd-98cd-3da01da2ed4f,0,1,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,0,1,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,0,1,3cda70d0-3116-4508-82ea-5ea0f0921262,3cda70d0-3116-4508-82ea-5ea0f0921262,0,1,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,0,1,c2ef8d6b-de7b-430d-ac30-76cdaf0579c2,c2ef8d6b-de7b-430d-ac30-76cdaf0579c2,0,1,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0,1,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,0,1,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,0,1,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,0,1,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,0,1,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,0,1,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,0,1,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,0,1,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,0,1,8ca0258c-96d8-4a12-b94f-db968195ee0a,8ca0258c-96d8-4a12-b94f-db968195ee0a,0,1,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,0,1,75ffd0b9-79be-4600-a310-591fddb6d63e,75ffd0b9-79be-4600-a310-591fddb6d63e,0,1,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,0,1,b4b8dd52-0cc4-4c69-9ec7-f06f2d79586b,b4b8dd52-0cc4-4c69-9ec7-f06f2d79586b,0,1,4e550d28-7174-412b-bfed-559a3dc753f6,4e550d28-7174-412b-bfed-559a3dc753f6,0,1,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,0,1,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,0,1,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,0,1,4aac940e-334b-42d2-bff1-0db9dfeff272,4aac940e-334b-42d2-bff1-0db9dfeff272,0,1,c33bcfcd-b5e2-46db-ba70-c373db613394,c33bcfcd-b5e2-46db-ba70-c373db613394,0,1,fef727fa-f63b-4467-9367-73a2425b19e3,fef727fa-f63b-4467-9367-73a2425b19e3,0,1,bfa90848-930f-433d-8f6f-c11ac2c5eba2,bfa90848-930f-433d-8f6f-c11ac2c5eba2,0,1,2baf6d7a-12ed-4f22-ad96-92bb31b747ff,2baf6d7a-12ed-4f22-ad96-92bb31b747ff,0,1,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,0,1,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,0,1,9376b18c-cffd-488b-8a1e-cca598f018bc,9376b18c-cffd-488b-8a1e-cca598f018bc,0,1,d78b5faf-b34b-4fa2-89a5-f4bc45203528,d78b5faf-b34b-4fa2-89a5-f4bc45203528,0,1,942a962a-bccb-42c0-b279-077a9b33c70a,942a962a-bccb-42c0-b279-077a9b33c70a,0,1,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,0,1,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,0,1,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,0,1,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,0,1,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,0,1,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,0,1,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,0,1,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1e63c656-a0e7-4b33-8bac-2a196e028ffa,0,1,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,0,1,b3152292-5546-4896-ad24-cb41057698d8,b3152292-5546-4896-ad24-cb41057698d8,0,1,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,0,1,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,0,1,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,0,1,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,0,1,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,0,1,ffe7858a-6c92-4951-8dbf-327215894ace,ffe7858a-6c92-4951-8dbf-327215894ace,0,1,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,0,1,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,0,1,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,0,1,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0,1,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0,1,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,0,1,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,0,1,e7d51ada-f286-4519-bfae-ece95dd4d7b0,e7d51ada-f286-4519-bfae-ece95dd4d7b0,0,1,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,0,1,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,0,1,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,0,1,95a71c2e-aa39-42ec-8889-2390a553f146,95a71c2e-aa39-42ec-8889-2390a553f146,0,1,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,0,1,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,0,1,68e82adf-bc03-4f23-9ec4-749ed42241da,68e82adf-bc03-4f23-9ec4-749ed42241da,0,1,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,0,1,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,0,1,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,0,1,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,0,1,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,0,1,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,0,1,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,0,1,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,0,1,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,0,1,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,0,1,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,0,1,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,0,1,831f4abd-4f96-417f-a71a-9ff481c23922,831f4abd-4f96-417f-a71a-9ff481c23922,0,1,387d3bbf-cddd-4506-b14f-89c1f37adbbc,387d3bbf-cddd-4506-b14f-89c1f37adbbc,0,1,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,0,1,64f667e5-6a8f-448f-aed5-a4d461232845,64f667e5-6a8f-448f-aed5-a4d461232845,0,1,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,0,1,037842ca-aeaf-4e27-9a0e-e929438b6f40,037842ca-aeaf-4e27-9a0e-e929438b6f40,0,1,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,0,1,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,0,1,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,0,1,eaf6045f-9ac0-43ef-b165-a45be75a4d44,eaf6045f-9ac0-43ef-b165-a45be75a4d44,0,1,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,0,1,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,0,1,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,0,1,405c52c4-25fe-45ff-abab-bf01041e768d,405c52c4-25fe-45ff-abab-bf01041e768d,0,1,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,0,1,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0,1,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,0,1,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,0,1,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,0,1,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,0,1,a687748a-0b2a-4277-b935-07616d28430d,a687748a-0b2a-4277-b935-07616d28430d,0,1,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,0,1,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,0,1,b95681f4-8f91-483e-a9c5-c8a21058679a,b95681f4-8f91-483e-a9c5-c8a21058679a,0,1,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,0,1,9059defa-047f-4dac-9749-3d0a6a77308a,9059defa-047f-4dac-9749-3d0a6a77308a,0,1,6010c27f-e857-4fc3-be13-1eea51f02ea7,6010c27f-e857-4fc3-be13-1eea51f02ea7,0,1,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,0,1,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,0,1,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,0,1,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,0,1,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,0,1,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,0,1,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,0,1,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,0,1,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,0,1,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,0,1,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,0,1,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,0,1,4093fe34-7557-4f15-831b-d654b94b8010,4093fe34-7557-4f15-831b-d654b94b8010,0,1,ee10023f-5c63-4cb3-8e6c-db566c788c9d,ee10023f-5c63-4cb3-8e6c-db566c788c9d,0,1,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,0,1,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,0,1,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,0,1,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,0,1,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,0,1,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,0,1,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,0,1,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,0,1,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,0,1,fbbb2449-9a07-4229-8ea5-bee0afab5f56,fbbb2449-9a07-4229-8ea5-bee0afab5f56,0,1,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,0,1,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,0,1,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,0,1,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,0,1,3e2828b4-2b55-471e-ac69-55119c2480f8,3e2828b4-2b55-471e-ac69-55119c2480f8,0,1,9da32b56-ff89-4739-bb99-615074b72298,9da32b56-ff89-4739-bb99-615074b72298,0,1,08baf3ee-b8ca-4f29-89fc-c15344064ad3,08baf3ee-b8ca-4f29-89fc-c15344064ad3,0,1,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,0,1,01b85e3a-9920-425a-9de5-5079fffeef93,01b85e3a-9920-425a-9de5-5079fffeef93,0,1,82e12316-cc64-4d2f-83fa-054b5a738f02,82e12316-cc64-4d2f-83fa-054b5a738f02,0,1,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,0,1,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,0,1,9039f720-5728-4918-87d5-8b2d07cabcfd,9039f720-5728-4918-87d5-8b2d07cabcfd,0,1,f3e2f35e-53f8-44e8-b24c-8385ba2c6974,f3e2f35e-53f8-44e8-b24c-8385ba2c6974,0,1,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,0,1,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,0,1,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,0,1,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,0,1,3705a086-46e6-4090-a52a-535908eea8a5,3705a086-46e6-4090-a52a-535908eea8a5,0,1,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,0,1,44b28019-01c0-468d-9b60-e050ff8b71ac,44b28019-01c0-468d-9b60-e050ff8b71ac,0,1,69f6173c-a570-41ff-b07f-5b85f7187515,69f6173c-a570-41ff-b07f-5b85f7187515,0,1,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,0,1,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,0,1,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,0,1,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,0,1,cd8244d1-0996-40ea-9263-7179c1e8aa26,cd8244d1-0996-40ea-9263-7179c1e8aa26,0,1,bb129cf2-5a5a-433a-924a-a1d0d895644a,bb129cf2-5a5a-433a-924a-a1d0d895644a,0,1,faa34cb8-2d48-4851-a839-fc40536a0234,faa34cb8-2d48-4851-a839-fc40536a0234,0,1,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,0,1,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,0,1,67aed41e-9707-4007-bb3c-7273476664bb,67aed41e-9707-4007-bb3c-7273476664bb,0,1,954e7804-e8b1-42aa-9d49-bef73f9d13d1,954e7804-e8b1-42aa-9d49-bef73f9d13d1,0,1,de25a90c-4b46-4340-b649-93e16dde33de,de25a90c-4b46-4340-b649-93e16dde33de,0,1,5462f1ab-2095-4515-875e-471900f05db9,5462f1ab-2095-4515-875e-471900f05db9,0,1,4f2d0398-49f4-410c-a451-436cbf96a262,4f2d0398-49f4-410c-a451-436cbf96a262,0,1,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,0,1,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,0,1,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,0,1,8c472f51-47ec-43c4-9858-fd19ac3e17f3,8c472f51-47ec-43c4-9858-fd19ac3e17f3,0,1,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,0,1,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,0,1,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,0,1,b2c8bd74-21c9-4495-93e2-ca5355698350,b2c8bd74-21c9-4495-93e2-ca5355698350,0,1,712c2b73-4697-4581-a095-70555aee8be2,712c2b73-4697-4581-a095-70555aee8be2,0,1,c1508d67-ac6d-41e3-884d-b3bdd54659f8,c1508d67-ac6d-41e3-884d-b3bdd54659f8,0,1,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,0,1,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,0,1,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,0,1,df48bfa3-5502-4a61-a79f-1dea043dac36,df48bfa3-5502-4a61-a79f-1dea043dac36,0,1,adee37e6-f087-422f-91b3-681f3d73189c,adee37e6-f087-422f-91b3-681f3d73189c,0,1,35103a27-230c-45c0-a8c9-24bd46608bbb,35103a27-230c-45c0-a8c9-24bd46608bbb,0,1,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,0,1,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,0,1,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,0,1,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,0,1,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,0,1,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,0,1,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,0,1,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,0,1,5b7eb8bc-ad6b-4191-a6c1-92561bb944f2,5b7eb8bc-ad6b-4191-a6c1-92561bb944f2,0,1,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,0,1,93016393-c637-4d81-8675-aa5e51e678e0,93016393-c637-4d81-8675-aa5e51e678e0,0,1,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,0,1,1f3057c2-135f-44b2-9f86-34481fbc5596,1f3057c2-135f-44b2-9f86-34481fbc5596,0,1,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,0,1,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,0,1,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,0,1,1fca06d9-b015-4fc8-abdd-3e2397e0c307,1fca06d9-b015-4fc8-abdd-3e2397e0c307,0,1,295a5554-f6cc-437b-9e89-c6f653a8b858,295a5554-f6cc-437b-9e89-c6f653a8b858,0,1,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,0,1,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,0,1,4a1e6d25-89e7-468a-aef1-6ded0154dca2,4a1e6d25-89e7-468a-aef1-6ded0154dca2,0,1,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,0,1,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,0,1,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,0,1,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,0,1,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,0,1,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,0,1,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,0,1,f811b0b7-41b5-4591-9910-780f08780236,f811b0b7-41b5-4591-9910-780f08780236,0,1,6b10167a-f5c3-4d7b-b444-d5ff6e705ea4,6b10167a-f5c3-4d7b-b444-d5ff6e705ea4,0,1,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,0,1,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,0,1,7e089889-cf8d-4f5f-879c-0a1bcca1c19b,7e089889-cf8d-4f5f-879c-0a1bcca1c19b,0,1,7e2ba519-fbb9-4163-b20b-b99898e6ac57,7e2ba519-fbb9-4163-b20b-b99898e6ac57,0,1,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,0,1,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,0,1,0a5e38b7-2794-419f-8c29-076490c7b5ce,0a5e38b7-2794-419f-8c29-076490c7b5ce,0,1,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,0,1,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,0,1,4212bb94-7c24-4d4f-8bb8-4060bd21a135,4212bb94-7c24-4d4f-8bb8-4060bd21a135,0,1,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,0,1,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,0,1,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,0,1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,0,1,230b80c7-620a-40d3-b473-b6289cfce8c0,230b80c7-620a-40d3-b473-b6289cfce8c0,0,1,6a03be63-e2b1-4f26-a7bf-1c9fe0d7a15f,6a03be63-e2b1-4f26-a7bf-1c9fe0d7a15f,0,1,5efd2e2e-9b83-4c0d-9bbd-4075b5127d92,5efd2e2e-9b83-4c0d-9bbd-4075b5127d92,0,1,3e4361e9-2baf-407b-9320-b2a265b44e46,3e4361e9-2baf-407b-9320-b2a265b44e46,0,1,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,0,1,e2c76c41-4c47-4588-a081-7bd81ac1698b,e2c76c41-4c47-4588-a081-7bd81ac1698b,0,1,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,0,1,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,0,1,d9f1f56b-75c8-43e9-8043-89076c225f78,d9f1f56b-75c8-43e9-8043-89076c225f78,0,1,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,0,1,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,0,1,138e674b-c9d4-4b89-b5ac-a50bd5313b98,138e674b-c9d4-4b89-b5ac-a50bd5313b98,0,1,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,0,1,6c34eef9-9405-4de0-9177-1bae85251ae4,6c34eef9-9405-4de0-9177-1bae85251ae4,0,1,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,0,1,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,0,1,5e380276-2a08-435c-927e-a7f56f5a4dbc,5e380276-2a08-435c-927e-a7f56f5a4dbc,0,1,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,0,1,7badb97b-c359-42af-9066-6bbfc0650cf9,7badb97b-c359-42af-9066-6bbfc0650cf9,0,1,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,0,1,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,0,1,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,0,1,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,0,1,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,0,1,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,0,1,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,0,1,fd3a6a7e-203d-447a-aebd-7626579387fb,fd3a6a7e-203d-447a-aebd-7626579387fb,0,1,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,0,1,cbc1c36d-7bbf-4892-8220-a33ec91a7b1f,cbc1c36d-7bbf-4892-8220-a33ec91a7b1f,0,1,5d4e67ae-7029-46d2-86f9-834a04a9dd71,5d4e67ae-7029-46d2-86f9-834a04a9dd71,0,1,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,0,1,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,0,1,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,0,1,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,0,1,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,0,1,b3554203-b930-496d-a712-353bc13a0946,b3554203-b930-496d-a712-353bc13a0946,0,1,59775ce0-f778-45f6-9453-bbd0a0ec1f27,59775ce0-f778-45f6-9453-bbd0a0ec1f27,0,1,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,0,1,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,0,1,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,0,1,f08afb10-3467-4af8-804c-ba7761f1dac9,f08afb10-3467-4af8-804c-ba7761f1dac9,0,1,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,0,1,41462827-fd8b-4ee6-a739-a884d704bba5,41462827-fd8b-4ee6-a739-a884d704bba5,0,1,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,0,1,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,0,1,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0,1,b65afceb-a200-42d5-9948-831a5ad84b1b,b65afceb-a200-42d5-9948-831a5ad84b1b,0,1,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,0,1,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,0,1,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,0,1,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,0,1,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,0,1,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,0,1,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,0,1,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,0,1,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,0,1,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,0,1,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,0,1,cdce186a-229d-492d-8811-147fc4d7cdf5,cdce186a-229d-492d-8811-147fc4d7cdf5,0,1,f750d4d3-059f-41a5-85b4-16bb4c63d3f2,f750d4d3-059f-41a5-85b4-16bb4c63d3f2,0,1,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,0,1,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,0,1,543f976e-fea3-4a51-9962-b8e0fcd3f707,543f976e-fea3-4a51-9962-b8e0fcd3f707,0,1,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,0,1,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,0,1,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,0,1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,0,1,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,0,1,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,0,1,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,0,1,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,0,1,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,0,1,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,0,1,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,0,1,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,0,1,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,0,1,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,0,1,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,0,1,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,0,1,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,0,1,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,0,1,06afe397-1c7e-400e-bb24-f8e611d114e8,06afe397-1c7e-400e-bb24-f8e611d114e8,0,1,f0105e51-9510-426a-8aa0-af827d93ffd9,f0105e51-9510-426a-8aa0-af827d93ffd9,0,1,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,0,1,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,0,1,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,0,1,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0,1,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,0,1,11fe3a42-98c4-49ba-b697-86ffb172f16f,11fe3a42-98c4-49ba-b697-86ffb172f16f,0,1,07b53818-7318-4400-8af5-457fac012755,07b53818-7318-4400-8af5-457fac012755,0,1,292b47e7-5cf3-462d-a466-dac6253a7f03,292b47e7-5cf3-462d-a466-dac6253a7f03,0,1,8ecc070f-f6fb-46b1-9636-b77aa80f8804,8ecc070f-f6fb-46b1-9636-b77aa80f8804,0,1,8405be9d-465b-4744-b04f-03933b52f02e,8405be9d-465b-4744-b04f-03933b52f02e,0,1,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,0,1,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,0,1,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,0,1,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,0,1,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,0,1,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,0,1,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,0,1,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,0,1,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,0,1,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,0,1,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,0,1,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,0,1,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,0,1,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,0,1,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,0,1,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,0,1,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,0,1,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,0,1,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,0,1,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,0,1,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,0,1,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,0,1,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,0,1,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,0,1,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,0,1,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,0,1,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,0,1,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,0,1,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,0,1,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,0,1,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,0,1,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,0,1,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,0,1,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,0,1,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,0,1,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,0,1,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,0,1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,0,1,b99c2068-15ea-43a1-9e9f-db29647e2387,b99c2068-15ea-43a1-9e9f-db29647e2387,0,1,9a4a0b04-3dfb-4551-90f0-16231f64b14f,9a4a0b04-3dfb-4551-90f0-16231f64b14f,0,1,98edcd6b-1c50-45c6-9a4c-390827a4ba52,98edcd6b-1c50-45c6-9a4c-390827a4ba52,0,1,2fcde115-5c5a-465c-a326-d7ba379675fc,2fcde115-5c5a-465c-a326-d7ba379675fc,0,1,346cb8b7-a20e-4a06-823e-26dfb2e3e741,346cb8b7-a20e-4a06-823e-26dfb2e3e741,0,1,6d83f50f-32e9-45a6-8b5e-d91ba005ae95,6d83f50f-32e9-45a6-8b5e-d91ba005ae95,0,1,538f0963-de90-4659-987d-df71a9586548,538f0963-de90-4659-987d-df71a9586548,0,1,9afe457f-3c88-4cd3-94e7-7cea8a1a99a1,9afe457f-3c88-4cd3-94e7-7cea8a1a99a1,0,1,86ff5ea0-394a-4d8f-9601-acc2eb841bf6,86ff5ea0-394a-4d8f-9601-acc2eb841bf6,0,1,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,0,1,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,0,1,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,0,1,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,0,1,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,0,1,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,0,1,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,0,1,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,0,1,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,0,1,5f6c6be3-058a-43c8-aa33-3e89af2ea3f1,5f6c6be3-058a-43c8-aa33-3e89af2ea3f1,0,1,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,0,1,aa7ceeee-3b3c-49e2-95c2-bfb34e381aa3,aa7ceeee-3b3c-49e2-95c2-bfb34e381aa3,0,1,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,0,1,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,0,1,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,0,1,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,0,1,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,0,1,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,0,1,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,0,1,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,0,1,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,0,1,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,0,1,bbfd9834-12b4-49ca-bdae-5c94efa80482,bbfd9834-12b4-49ca-bdae-5c94efa80482,0,1,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,0,1,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,0,1,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,0,1,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,0,1,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0,1,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,0,1,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,0,1,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,0,1,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,0,1,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,0,1,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,0,1,79a0746b-4dbe-4068-8832-4d0da08d6fd3,79a0746b-4dbe-4068-8832-4d0da08d6fd3,0,1,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,0,1,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,0,1,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,0,1,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,0,1,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,0,1,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,0,1,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,0,1,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,0,1,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,0,1,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,0,1,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,0,1,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,0,1,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,0,1,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,0,1,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,0,1,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,0,1,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,0,1,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,0,1,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,0,1,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,0,1,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,0,1,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,0,1,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,0,1,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,0,1,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,0,1,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,0,1,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,0,1,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,0,1,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,0,1,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,0,1,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,0,1,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,0,1,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,0,1,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,0,1,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,0,1,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,0,1,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,0,1,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,0,1,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,0,1,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,0,1,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,0,1,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,0,1,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,0,1,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,0,1,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,0,1,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,0,1,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,0,1,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,0,1,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,0,1,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,0,1,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,0,1,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,0,1,fb79315a-8d27-4c5e-9cfb-c7778dabedef,fb79315a-8d27-4c5e-9cfb-c7778dabedef,0,1,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,0,1,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,0,1,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,0,1,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,0,1,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,0,1,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,0,1,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,0,1,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,0,1,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,0,1,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,0,1,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,0,1,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,0,1,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,0,1,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,0,1,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,0,1,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,0,1,e3ca64af-7766-48e2-b7c6-2a96f4539905,e3ca64af-7766-48e2-b7c6-2a96f4539905,0,1,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,0,1,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,0,1,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,0,1,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,0,1,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,0,1,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,0,1,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,0,1,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,0,1,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,0,1,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,0,1,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,0,1,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,0,1,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,0,1,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,0,1,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,0,1,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,0,1,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,0,1,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,0,1,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,0,1,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,0,1,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,0,1,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,0,1,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,0,1,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,0,1,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,0,1,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,0,1,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,0,1,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,0,1,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,0,1,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,0,1,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,0,1,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0,1,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,0,1,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,0,1,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,0,1,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,0,1,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,0,1,295f3692-0721-4c41-a69b-171ef20a5018,295f3692-0721-4c41-a69b-171ef20a5018,0,1,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,0,1,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,0,1,8d31ce6a-4d44-46c6-a11c-47fb33e88691,8d31ce6a-4d44-46c6-a11c-47fb33e88691,0,1,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,0,1,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,0,1,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,0,1,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,0,1,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,0,1,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,0,1,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,0,1,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,0,1,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,0,1,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,0,1,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,0,1,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,0,1,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,0,1,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,0,1,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,0,1,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,0,1,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,0,1,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,0,1,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,0,1,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,0,1,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,0,1,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,0,1,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,0,1,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,0,1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,0,1,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,0,1,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,0,1,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,0,1,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,0,1,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,0,1,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,0,1,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,0,1,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,0,1,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,0,1,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,0,1,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,0,1,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,0,1,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,0,1,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,0,1,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,0,1,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,0,1,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,0,1,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,0,1,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,0,1,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,0,1,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,0,1,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,0,1,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,0,1,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,0,1,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,0,1,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,0,1,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,0,1,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,0,1,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,0,1,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,0,1,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,0,1,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,0,1,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,0,1,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,0,1,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,0,1,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,0,1,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,0,1,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,0,1,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,0,1,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,0,1,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,0,1,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,0,1,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,0,1,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,0,1,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,0,1,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,0,1,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,0,1,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,0,1,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,0,1,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,0,1,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,0,1,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,0,1,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,0,1,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,0,1,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,0,1,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,0,1,426cbebb-880b-49c5-b046-83c5e071273e,426cbebb-880b-49c5-b046-83c5e071273e,0,1,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,0,1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,0,1,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,0,1,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,0,1,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,0,1,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,0,1,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,0,1,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,0,1,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,0,1,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,0,1,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,0,1,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,0,1,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,0,1,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,0,1,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,0,1,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,0,1,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,0,1,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,0,1,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,0,1,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,0,1,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,0,1,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,0,1,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,0,1,4f97b909-68f9-482a-b958-b4caa9b83763,4f97b909-68f9-482a-b958-b4caa9b83763,0,1,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,0,1,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,0,1,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,0,1,30f18fbf-4240-4708-a71a-189f8fc324f3,30f18fbf-4240-4708-a71a-189f8fc324f3,0,1,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,0,1,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,0,1,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,0,1,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,0,1,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,0,1,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,0,1,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,0,1,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0,1,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,0,1,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,0,1,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,0,1,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,0,1,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,0,1,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,0,1,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,0,1,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,0,1,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,0,1,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,0,1,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,0,1,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,0,1,c46fd680-efbe-49a8-91f0-73e36d791fa9,c46fd680-efbe-49a8-91f0-73e36d791fa9,0,1,6995567b-5a3c-4e03-9fb4-e22363ed6555,6995567b-5a3c-4e03-9fb4-e22363ed6555,0,1,32c38c2b-072d-4cf2-bf9a-f9c4b4c463e8,32c38c2b-072d-4cf2-bf9a-f9c4b4c463e8,0,1,b8a966ba-3452-44df-91d0-7040ecd3e4c2,b8a966ba-3452-44df-91d0-7040ecd3e4c2,0,1,80d6883d-c608-4fe5-acae-78bc45e40e5f,80d6883d-c608-4fe5-acae-78bc45e40e5f,0,1,213b173a-c3b7-449c-a618-d479c4dc38e8,213b173a-c3b7-449c-a618-d479c4dc38e8,0,1,7a64dffc-5cfe-41e2-bd55-fbf4957559a4,7a64dffc-5cfe-41e2-bd55-fbf4957559a4,0,1,a78249aa-ca9f-4bee-b00d-68ff59ea81a4,a78249aa-ca9f-4bee-b00d-68ff59ea81a4,0,1,7534148d-0124-49a2-a446-c6205d153153,7534148d-0124-49a2-a446-c6205d153153,0,1,32ed8a10-7177-4e45-866e-04a1b6831570,32ed8a10-7177-4e45-866e-04a1b6831570,0,1,e2a90d7a-5480-47cd-b296-8d60d8baf7f9,e2a90d7a-5480-47cd-b296-8d60d8baf7f9,0,1,8190a432-1037-4334-b2c7-bae39f7f9442,8190a432-1037-4334-b2c7-bae39f7f9442,0,1,4733e5c1-8198-408b-8903-866d3b0fdc43,4733e5c1-8198-408b-8903-866d3b0fdc43,0,1,e1fc5146-37c5-4207-af05-7250976bd406,e1fc5146-37c5-4207-af05-7250976bd406,0,1,60038cd9-8d01-44b1-9d3f-f3a31e59e5db,60038cd9-8d01-44b1-9d3f-f3a31e59e5db,0,1,f0bfb98b-cc43-4b6c-8166-9b81b4c22cb0,f0bfb98b-cc43-4b6c-8166-9b81b4c22cb0,0,1,f5e27159-789a-4d34-ac51-fd99d753b83a,f5e27159-789a-4d34-ac51-fd99d753b83a,0,1,f1cb02ff-a2f0-4a34-93fa-e47c6e210ee1,f1cb02ff-a2f0-4a34-93fa-e47c6e210ee1,0,1,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,0,1,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,0,1,4347f77e-bad9-4525-90a0-794787f03585,4347f77e-bad9-4525-90a0-794787f03585,0,1,cfde3330-2bed-4273-8d69-c213ebdde247,cfde3330-2bed-4273-8d69-c213ebdde247,0,1,2d6ca049-89a5-437e-971c-b8e42f61b460,2d6ca049-89a5-437e-971c-b8e42f61b460,0,1,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,0,1,271d58d0-4449-40cc-bae9-cc4c50eebd9b,271d58d0-4449-40cc-bae9-cc4c50eebd9b,0,1,58df9322-c786-4dd1-af49-7cd164b378da,58df9322-c786-4dd1-af49-7cd164b378da,0,1,8d48de7f-61d6-4462-9c14-f728206a482c,8d48de7f-61d6-4462-9c14-f728206a482c,0,1,a87e890a-8924-4f56-9e37-04579b95297a,a87e890a-8924-4f56-9e37-04579b95297a,0,1,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,0,1,4c1f2581-ee42-4df5-9169-20205a18a9be,4c1f2581-ee42-4df5-9169-20205a18a9be,0,1,bb3d9ea3-8895-4950-9ee9-4249ca983d48,bb3d9ea3-8895-4950-9ee9-4249ca983d48,0,1,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,0,1,b806d2b6-bbd1-4abd-9471-7791603a2fcf,b806d2b6-bbd1-4abd-9471-7791603a2fcf,0,1,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,0,1,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,0,1,34f50dd9-de16-4013-a2ef-6595d9c28930,34f50dd9-de16-4013-a2ef-6595d9c28930,0,1,56fcca65-3429-4409-bce7-f434f6530a74,56fcca65-3429-4409-bce7-f434f6530a74,0,1,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,0,1,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,0,1,b286f047-a4d0-4808-b1b4-27997ead6d49,b286f047-a4d0-4808-b1b4-27997ead6d49,0,1,49da2d3a-657a-4cfd-8e37-422b96d2cda5,49da2d3a-657a-4cfd-8e37-422b96d2cda5,0,1,fced16ae-abee-4fbe-9582-dfd368d5610a,fced16ae-abee-4fbe-9582-dfd368d5610a,0,1,afe60bad-1585-487f-9a39-9b9e031f9576,afe60bad-1585-487f-9a39-9b9e031f9576,0,1,4c4f0475-bd11-40c8-af0d-8affec6f838d,4c4f0475-bd11-40c8-af0d-8affec6f838d,0,1,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,0,1,855439d7-a621-48f5-b6d9-bc2bbd11ad90,855439d7-a621-48f5-b6d9-bc2bbd11ad90,0,1,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,0,1,2f25e742-555b-4db8-bff2-2d345ce2a93a,2f25e742-555b-4db8-bff2-2d345ce2a93a,0,1,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,0,1,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,0,1,a7fee9d3-569d-4b5b-bd47-44790e0095f5,a7fee9d3-569d-4b5b-bd47-44790e0095f5,0,1,a258fe12-7e55-4f89-86fa-962b1d2947ac,a258fe12-7e55-4f89-86fa-962b1d2947ac,0,1,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,0,1,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,0,1,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,0,1,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,0,1,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,0,1,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,0,1,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,0,1,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,0,1,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,0,1,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,0,1,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,0,1,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,0,1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,0,1,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,0,1,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,0,1,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,0,1,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,0,1,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,0,1,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,0,1,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,0,1,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,0,1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,0,1,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,0,1,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,0,1,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,0,1,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,0,1,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,0,1,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,0,1,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,0,1,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,0,1,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,0,1,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,0,1,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,0,1,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,0,1,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,0,1,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,0,1,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,0,1,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,0,1,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,0,1,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,0,1,80cf54ed-8677-4c89-a378-0abef6c64010,80cf54ed-8677-4c89-a378-0abef6c64010,0,1,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,0,1,56ee3afd-5ae6-421e-b9f3-26505e40f100,56ee3afd-5ae6-421e-b9f3-26505e40f100,0,1,63c9a839-78b2-4706-b380-5aedf6914930,63c9a839-78b2-4706-b380-5aedf6914930,0,1,40f5c1cb-2654-4738-bb44-6734b0e3490b,40f5c1cb-2654-4738-bb44-6734b0e3490b,0,1,2ec484b1-95eb-43a7-9430-1c1ef49f05af,2ec484b1-95eb-43a7-9430-1c1ef49f05af,0,1,1a314ce2-03bc-4267-89a9-bb5bb866f552,1a314ce2-03bc-4267-89a9-bb5bb866f552,0,1,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,0,1,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,0,1,e859dd18-8baf-49c0-b7a0-1205b6c125d3,e859dd18-8baf-49c0-b7a0-1205b6c125d3,0,1,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,0,1,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,0,1,4dbf114a-5402-40b0-9cab-19601aa8328e,4dbf114a-5402-40b0-9cab-19601aa8328e,0,1,a0856ca2-6a66-4108-b6d4-82443cdccca6,a0856ca2-6a66-4108-b6d4-82443cdccca6,0,1,378b0708-a0a1-4c82-b55a-796acb27e696,378b0708-a0a1-4c82-b55a-796acb27e696,0,1,8e462c0e-c67a-45e9-9871-1f976b01632d,8e462c0e-c67a-45e9-9871-1f976b01632d,0,1,c5335e1f-3e47-46b7-b695-0653f825d855,c5335e1f-3e47-46b7-b695-0653f825d855,0,1,d7faad11-1e35-460c-8943-49370f328c03,d7faad11-1e35-460c-8943-49370f328c03,0,1,e4726010-85c5-4ccc-b574-4b3b55f0d391,e4726010-85c5-4ccc-b574-4b3b55f0d391,0,1,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,0,1,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,0,1,1f4f839a-4e19-45b8-a988-13ee604c269c,1f4f839a-4e19-45b8-a988-13ee604c269c,0,1,b3aa97e1-baef-45f4-9179-052f35527a5e,b3aa97e1-baef-45f4-9179-052f35527a5e,0,1,d613941f-ed4c-4957-b469-ea6b0d2a121d,d613941f-ed4c-4957-b469-ea6b0d2a121d,0,1,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0,1,af0178fe-eb3a-485b-9acf-35c8702aa330,af0178fe-eb3a-485b-9acf-35c8702aa330,0,1,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,0,1,c513ceb0-0855-43ce-a311-c9bea88e2563,c513ceb0-0855-43ce-a311-c9bea88e2563,0,1,974bfc13-85c2-454a-b562-e72384eb4c31,974bfc13-85c2-454a-b562-e72384eb4c31,0,1,69cd6adc-b129-4fbc-804d-8d5aaef77280,69cd6adc-b129-4fbc-804d-8d5aaef77280,0,1,3431a3de-cb9d-46dc-b597-3203831796a9,3431a3de-cb9d-46dc-b597-3203831796a9,0,1,f3866271-04ed-4963-852e-cf41e9e18e1d,f3866271-04ed-4963-852e-cf41e9e18e1d,0,1,b77e5ec2-35cd-43ae-957f-af35214fa621,b77e5ec2-35cd-43ae-957f-af35214fa621,0,1,4a04d83d-cadd-4f36-9ec8-f926259c18ba,4a04d83d-cadd-4f36-9ec8-f926259c18ba,0,1,85e670c0-1616-4611-984c-3d40e890b2e9,85e670c0-1616-4611-984c-3d40e890b2e9,0,1,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,0,1,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,0,1,f1693207-2637-412a-972f-2bc79b9c7fc8,f1693207-2637-412a-972f-2bc79b9c7fc8,0,1,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,0,1,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,0,1,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,0,1,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,0,1,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,0,1,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,0,1,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,0,1,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,0,1,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,0,1,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,0,1,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,0,1,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,0,1,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,0,1,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,0,1,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,0,1,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,0,1,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,0,1,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,0,1,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,0,1,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,0,1,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,0,1,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,0,1,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,0,1,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,0,1,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,0,1,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,0,1,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,0,1,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,0,1,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,0,1,f3d8590a-dcfa-4d41-8d03-642b99ffa040,f3d8590a-dcfa-4d41-8d03-642b99ffa040,0,1,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,0,1,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,0,1,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,0,1,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,0,1,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,0,1,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,0,1,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,0,1,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,0,1,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,0,1,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,0,1,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,0,1,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,0,1,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,0,1,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,0,1,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,0,1,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,0,1,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,0,1,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,0,1,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,0,1,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,0,1,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,0,1,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,0,1,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,0,1,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,0,1,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,0,1,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,0,1,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,0,1,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,0,1,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,0,1,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,0,1,150c9d05-4ccc-4cb7-879d-b1d9c3534343,150c9d05-4ccc-4cb7-879d-b1d9c3534343,0,1,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,0,1,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,0,1,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,0,1,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,0,1,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,0,1,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,0,1,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,0,1,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,0,1,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,0,1,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,0,1,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,0,1,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,0,1,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,0,1,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,0,1,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,0,1,65000437-bd07-4841-a458-679d44768c46,65000437-bd07-4841-a458-679d44768c46,0,1,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,0,1,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,0,1,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,0,1,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,0,1,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,0,1,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,0,1,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,0,1,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,0,1,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,0,1,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,0,1,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,0,1,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,0,1,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,0,1,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,0,1,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,0,1,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,0,1,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,0,1,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,0,1,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,0,1,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,0,1,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,0,1,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,0,1,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,0,1,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,0,1,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,0,1,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,0,1,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,0,1,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,0,1,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,0,1,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,0,1,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,0,1,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,0,1,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,0,1,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,0,1,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,0,1,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,0,1,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,0,1,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,0,1,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,0,1,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,0,1,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,0,1,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,0,1,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,0,1,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,0,1,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,0,1,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,0,1,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,0,1,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,0,1,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,0,1,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,0,1,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,0,1,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,0,1,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,0,1,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,0,1,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,0,1,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,0,1,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,0,1,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,0,1,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,0,1,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,0,1,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,0,1,52c016dd-f0df-4251-94c2-2e29ed5bc2d6,52c016dd-f0df-4251-94c2-2e29ed5bc2d6,0,1,c559ab26-8ed8-418e-9342-0559442dbcbf,c559ab26-8ed8-418e-9342-0559442dbcbf,0,1,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1685c406-d0cb-4e0a-a3b0-036c8c22942a,0,1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,0,1,81db41a6-2580-4a69-b1fd-57cfd48a7efa,81db41a6-2580-4a69-b1fd-57cfd48a7efa,0,1,0db8b3b2-bf24-4006-9897-797084c241ef,0db8b3b2-bf24-4006-9897-797084c241ef,0,1,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,0,1,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,0,1,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,0,1,20091427-d173-40ca-b2c4-53ee99b0b5ae,20091427-d173-40ca-b2c4-53ee99b0b5ae,0,1,14cbde39-a39a-48e5-9b72-b798a0bcea3f,14cbde39-a39a-48e5-9b72-b798a0bcea3f,0,1,56871c10-e3af-4679-afad-3baa910d73bb,56871c10-e3af-4679-afad-3baa910d73bb,0,1,f81b51c5-57e4-41f8-9ad5-3d2717351b95,f81b51c5-57e4-41f8-9ad5-3d2717351b95,0,1,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,0,1,de0a39e0-d37d-47c6-a019-e44836edc8d1,de0a39e0-d37d-47c6-a019-e44836edc8d1,0,1,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1fdcc1e7-ad53-409e-ba13-84c6429740cd,0,1,71d544bf-15c1-4581-8baa-ac126308425c,71d544bf-15c1-4581-8baa-ac126308425c,0,1,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,0,1,7acfe30e-73cb-465a-88f2-92b7275dc49b,7acfe30e-73cb-465a-88f2-92b7275dc49b,0,1,8e387dac-5029-49da-a013-355df0a51a44,8e387dac-5029-49da-a013-355df0a51a44,0,1,13859664-8307-40e8-855b-557b9cf2f1ec,13859664-8307-40e8-855b-557b9cf2f1ec,0,1,e4397fba-507f-497c-9414-7d08ccd4d799,e4397fba-507f-497c-9414-7d08ccd4d799,0,1,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,0,1,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,0,1,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,0,1,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,0,1,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,0,1,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,0,1,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,0,1,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,0,1,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,0,1,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,0,1,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,0,1,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,0,1,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,0,1,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,0,1,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,0,1,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,0,1,840a1d4d-e5f6-4a88-886f-03830fe4f99a,840a1d4d-e5f6-4a88-886f-03830fe4f99a,0,1,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,0,1,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,0,1,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,0,1,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,0,1,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,0,1,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,0,1,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,0,1,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,0,1,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,0,1,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,0,1,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,0,1,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,0,1,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,0,1,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,0,1,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,0,1,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,0,1,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,0,1,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,0,1,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,0,1,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,0,1,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,0,1,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,0,1,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,0,1,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,0,1,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,0,1,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,0,1,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,0,1,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,0,1,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,0,1,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,0,1,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,0,1,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,0,1,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,0,1,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,0,1,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,0,1,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,0,1,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,0,1,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,0,1,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,0,1,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,0,1,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,0,1,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,0,1,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,0,1,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,0,1,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,0,1,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,0,1,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,0,1,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,0,1,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,0,1,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,0,1,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,0,1,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0,1,40b08a20-51a3-438b-ba54-466917ea809f,40b08a20-51a3-438b-ba54-466917ea809f,0,1,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0,1,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,0,1,144d5498-bb61-4bec-bef3-85a5a4aec3d5,144d5498-bb61-4bec-bef3-85a5a4aec3d5,0,1,ff18803b-4c3a-4720-a718-7547f04c6e2f,ff18803b-4c3a-4720-a718-7547f04c6e2f,0,1,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,0,1,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,0,1,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,0,1,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,0,1,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,0,1,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,0,1,57a0f5f3-6573-4b35-af25-cea3a25641f1,57a0f5f3-6573-4b35-af25-cea3a25641f1,0,1,21d296a1-6809-4ff6-a4da-b455cad86cc2,21d296a1-6809-4ff6-a4da-b455cad86cc2,0,1,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,0,1,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,0,1,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,0,1,56b570b1-93b0-468a-9672-9c71113753f3,56b570b1-93b0-468a-9672-9c71113753f3,0,1,e693eac3-f55d-4102-ac6d-b14ef33fb2e7,e693eac3-f55d-4102-ac6d-b14ef33fb2e7,0,1,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,0,1,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,0,1,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,0,1,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,0,1,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,0,1,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,0,1,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,0,1,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,0,1,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,0,1,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0,1,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,0,1,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,0,1,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,0,1,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,0,1,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,0,1,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,0,1,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,0,1,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,0,1,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,0,1,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,0,1,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,0,1,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,0,1,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,0,1,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,0,1,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,0,1,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,0,1,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,0,1,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,0,1,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,0,1,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,0,1,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,0,1,8f088f33-92d7-4e35-915d-6cda1129dd80,8f088f33-92d7-4e35-915d-6cda1129dd80,0,1,9a8578a2-8a92-4ab3-a480-173340f8b34a,9a8578a2-8a92-4ab3-a480-173340f8b34a,0,1,4889d27b-435b-4059-a34d-6afdf3c77fa3,4889d27b-435b-4059-a34d-6afdf3c77fa3,0,1,4ebf0988-ccc3-440c-bd0f-2d01636bd730,4ebf0988-ccc3-440c-bd0f-2d01636bd730,0,1,69f42341-268b-4e74-9d6d-527800d018ab,69f42341-268b-4e74-9d6d-527800d018ab,0,1,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,0,1,ca6ecedc-f4c5-4c14-8a02-6255ce45033a,ca6ecedc-f4c5-4c14-8a02-6255ce45033a,0,1,7eb5217f-684d-4a9e-8aef-48cedc809cbb,7eb5217f-684d-4a9e-8aef-48cedc809cbb,0,1,4b54d626-dc59-4e49-a708-0a7f98833b9a,4b54d626-dc59-4e49-a708-0a7f98833b9a,0,1,1c90a423-ef1b-42dc-a43b-1fda89672481,1c90a423-ef1b-42dc-a43b-1fda89672481,0,1,095cf2d6-5a7c-452d-8d60-991afb6e52bd,095cf2d6-5a7c-452d-8d60-991afb6e52bd,0,1,2c155a03-2aff-4632-adb2-be3266e0fac3,2c155a03-2aff-4632-adb2-be3266e0fac3,0,1,f9213a70-bfd6-464f-b28b-ed35bdf351c0,f9213a70-bfd6-464f-b28b-ed35bdf351c0,0,1,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,0,1,eb81610a-eb2f-4068-ba74-75e0f5bbace8,eb81610a-eb2f-4068-ba74-75e0f5bbace8,0,1,21826316-0b49-4034-a49e-6d34c15ceb5c,21826316-0b49-4034-a49e-6d34c15ceb5c,0,1,3abffa47-8d47-4173-897b-708e1a06ef39,3abffa47-8d47-4173-897b-708e1a06ef39,0,1,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,0,1,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,0,1,38692186-a62a-42d1-87cd-7dbc6d4816ed,38692186-a62a-42d1-87cd-7dbc6d4816ed,0,1,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,0,1,3a28cea9-7fd7-4834-ab89-2a74331a64e3,3a28cea9-7fd7-4834-ab89-2a74331a64e3,0,1,0f881709-4520-4f18-af9d-cf08757693ff,0f881709-4520-4f18-af9d-cf08757693ff,0,1,c5151ca9-5103-42b2-8573-273c15416db8,c5151ca9-5103-42b2-8573-273c15416db8,0,1,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,0,1,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,0,1,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,0,1,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,0,1,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,0,1,c13fb1cd-fe72-48a6-b383-55b6323619ce,c13fb1cd-fe72-48a6-b383-55b6323619ce,0,1,956fc8ee-96be-4309-b1e8-209372f151ab,956fc8ee-96be-4309-b1e8-209372f151ab,0,1,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,0,1,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,0,1,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,0,1,12f85e09-1190-4483-b531-630ab718db7f,12f85e09-1190-4483-b531-630ab718db7f,0,1,52f4453e-e968-4290-a79a-470f68fbd07f,52f4453e-e968-4290-a79a-470f68fbd07f,0,1,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,0,1,33e0072d-7d5b-4298-ae77-31a7cb358f5d,33e0072d-7d5b-4298-ae77-31a7cb358f5d,0,1,1051c0c7-1058-427c-8bf5-5e30b8fbfb54,1051c0c7-1058-427c-8bf5-5e30b8fbfb54,0,1,b27688c3-6682-45e1-a03f-0d2e8b1214e4,b27688c3-6682-45e1-a03f-0d2e8b1214e4,0,1,c8158812-024b-4f94-bd07-c3f1fd59e8a1,c8158812-024b-4f94-bd07-c3f1fd59e8a1,0,1,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,0,1,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,0,1,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,0,1,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,0,1,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,0,1,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,0,1,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,0,1,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,0,1,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,0,1,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,0,1,5422610d-b92c-4213-a58c-8db067d93b66,5422610d-b92c-4213-a58c-8db067d93b66,0,1,8f59a635-9e0e-470d-8fda-a47a262a59c2,8f59a635-9e0e-470d-8fda-a47a262a59c2,0,1,ffb50eb9-149a-46ec-9472-d8f20ad09810,ffb50eb9-149a-46ec-9472-d8f20ad09810,0,1,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,0,1,7a6449e2-e90a-4720-a769-192284ef69c1,7a6449e2-e90a-4720-a769-192284ef69c1,0,1,02118b98-2349-46b1-a328-d6e2b5781f7e,02118b98-2349-46b1-a328-d6e2b5781f7e,0,1,67de9cbb-5c80-4cff-bfbe-269a958e08e6,67de9cbb-5c80-4cff-bfbe-269a958e08e6,0,1,2228a457-6805-41ee-85af-5ebca9568bf4,2228a457-6805-41ee-85af-5ebca9568bf4,0,1,96b71795-e230-4ecb-b98d-4feb3f8b9662,96b71795-e230-4ecb-b98d-4feb3f8b9662,0,1,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,0,1,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,0,1,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,0,1,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,0,1,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,0,1,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,0,1,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,0,1,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,0,1,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,0,1,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,0,1,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,0,1,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,0,1,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,0,1,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,0,1,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,0,1,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,0,1,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,0,1,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,0,1,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,0,1,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,0,1,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,0,1,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,0,1,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,0,1,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,0,1,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,0,1,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,0,1,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,0,1,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,0,1,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,0,1,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,0,1,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,0,1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,0,1,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,0,1,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,0,1,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,0,1,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,0,1,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,0,1,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,0,1,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,0,1,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,0,1,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,0,1,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,0,1,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,0,1,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,0,1,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,0,1,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,0,1,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,0,1,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,0,1,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,0,1,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,0,1,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,0,1,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,0,1,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,0,1,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,0,1,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,0,1,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,0,1,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,0,1,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,0,1,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,0,1,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,0,1,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,0,1,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,0,1,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,0,1,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,0,1,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,0,1,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,0,1,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,0,1,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,0,1,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,0,1,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,0,1,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,0,1,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,0,1,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,0,1,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,0,1,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,0,1,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,0,1,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,0,1,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,0,1,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,0,1,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,0,1,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,0,1,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,0,1,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,0,1,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,0,1,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,0,1,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,0,1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,0,1,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,0,1,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,0,1,c656771c-dcb7-4c78-9a16-e62806d5bb5a,c656771c-dcb7-4c78-9a16-e62806d5bb5a,0,1,ec42c45c-18ca-44b0-9c59-1cb204552a43,ec42c45c-18ca-44b0-9c59-1cb204552a43,0,1,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,0,1,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,0,1,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,0,1,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,0,1,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,0,1,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,0,1,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,0,1,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,0,1,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,0,1,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,0,1,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,0,1,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,0,1,a915df5f-7330-4fc3-aecd-08d228b8fd23,a915df5f-7330-4fc3-aecd-08d228b8fd23,0,1,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,0,1,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,0,1,6e20df72-c643-4952-8f9c-f386d2915004,6e20df72-c643-4952-8f9c-f386d2915004,0,1,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,0,1,0e5074b0-bc15-416d-9c87-dad6824186e1,0e5074b0-bc15-416d-9c87-dad6824186e1,0,1,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,0,1,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,0,1,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,0,1,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,0,1,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,0,1,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,0,1,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,0,1,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,0,1,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,0,1,699f734b-43d2-4351-bff8-e0e21e164a42,699f734b-43d2-4351-bff8-e0e21e164a42,0,1,95f0792a-7ac4-450a-b05c-219741e61abd,95f0792a-7ac4-450a-b05c-219741e61abd,0,1,742a2e8c-496e-4e02-931d-d33f7afe07a5,742a2e8c-496e-4e02-931d-d33f7afe07a5,0,1,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,0,1,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,0,1,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,0,1,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,0,1,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,0,1,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,0,1,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,0,1,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,0,1,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,0,1,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,0,1,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,0,1,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,0,1,abacbda3-b4c1-446b-95e7-a45adec16174,abacbda3-b4c1-446b-95e7-a45adec16174,0,1,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,0,1,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,0,1,91a7a0f7-19e8-43d1-935c-e9bd1ac24d03,91a7a0f7-19e8-43d1-935c-e9bd1ac24d03,0,1,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,0,1,868da26b-f32e-48d1-a647-44dac7520d86,868da26b-f32e-48d1-a647-44dac7520d86,0,1,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,0,1,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,0,1,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,0,1,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,0,1,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,0,1,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,0,1,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,0,1,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,0,1,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,0,1,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,0,1,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0,1,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,0,1,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,0,1,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,0,1,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,0,1,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,0,1,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,0,1,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,0,1,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,0,1,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,0,1,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,0,1,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,0,1,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,0,1,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,0,1,cfa55ab3-1335-4712-8352-03c2f0277708,cfa55ab3-1335-4712-8352-03c2f0277708,0,1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,0,1,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,0,1,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,0,1,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,0,1,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,0,1,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,0,1,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,0,1,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,0,1,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,0,1,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,0,1,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,0,1,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,0,1,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,0,1,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,0,1,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,0,1,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,0,1,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,0,1,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,0,1,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,0,1,3e3eb4de-4811-4282-917d-9b28e9b87a44,3e3eb4de-4811-4282-917d-9b28e9b87a44,0,1,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,0,1,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,0,1,88879822-e4a6-47e2-b849-2ec0783cda6b,88879822-e4a6-47e2-b849-2ec0783cda6b,0,1,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,0,1,80bfaf42-86b7-46b0-aae2-20e8d773b00e,80bfaf42-86b7-46b0-aae2-20e8d773b00e,0,1,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,0,1,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,0,1,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,0,1,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,0,1,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,0,1,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,0,1,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,0,1,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0,1,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0,1,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,0,1,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,0,1,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,0,1,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,0,1,fa9572ee-0303-4421-9125-70cf3dd5a8c7,fa9572ee-0303-4421-9125-70cf3dd5a8c7,0,1,4cdd7920-0c49-4950-b92f-fdf6e34578b2,4cdd7920-0c49-4950-b92f-fdf6e34578b2,0,1,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0,1,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,0,1,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,0,1,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,0,1,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,0,1,bad3d1fa-9618-427a-93e0-90f151e468bf,bad3d1fa-9618-427a-93e0-90f151e468bf,0,1,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,0,1,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,0,1,ec7cfc56-00fd-4494-be90-49308a3c34a0,ec7cfc56-00fd-4494-be90-49308a3c34a0,0,1,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,0,1,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,0,1,719cdbdd-13b3-44fc-8739-0b788693a8d0,719cdbdd-13b3-44fc-8739-0b788693a8d0,0,1,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,0,1,5de9fbf9-f075-4acf-b9f9-89688d2006af,5de9fbf9-f075-4acf-b9f9-89688d2006af,0,1,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,0,1,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,0,1,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,0,1,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,0,1,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,0,1,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,0,1,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,0,1,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,0,1,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,0,1,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,0,1,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,0,1,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,0,1,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,0,1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,0,1,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,0,1,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,0,1,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,0,1,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,0,1,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,0,1,d97c6204-3656-4591-aea9-6ebedffe1247,d97c6204-3656-4591-aea9-6ebedffe1247,0,1,7caabe33-184f-45db-bef4-59d4e9cd2394,7caabe33-184f-45db-bef4-59d4e9cd2394,0,1,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,0,1,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,0,1,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,0,1,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,0,1,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,0,1,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,0,1,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,0,1,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,0,1,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,0,1,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,0,1,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,0,1,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,0,1,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,0,1,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,0,1,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,0,1,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,0,1,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,0,1,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,0,1,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,0,1,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,0,1,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,0,1,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,0,1,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,0,1,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,0,1,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,0,1,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,0,1,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,0,1,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,0,1,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,0,1,837e4559-2f2d-48e9-a03b-2d52b25569ec,837e4559-2f2d-48e9-a03b-2d52b25569ec,0,1,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,0,1,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,0,1,3660618a-0cab-458f-b448-867c4d1aba1b,3660618a-0cab-458f-b448-867c4d1aba1b,0,1,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,0,1,22f34fd5-4bda-48c1-8772-74d9c6479a30,22f34fd5-4bda-48c1-8772-74d9c6479a30,0,1,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,0,1,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,0,1,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,0,1,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,0,1,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,0,1,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,0,1,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,0,1,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,0,1,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,0,1,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,0,1,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,0,1,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,0,1,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,0,1,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,0,1,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,0,1,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,0,1,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0,1,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,0,1,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,0,1,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,0,1,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,0,1,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,0,1,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,0,1,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,0,1,05558ce4-8568-4009-b1d7-307d54967515,05558ce4-8568-4009-b1d7-307d54967515,0,1,74380324-9b7b-49f6-9458-88deb9405f98,74380324-9b7b-49f6-9458-88deb9405f98,0,1,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,0,1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0,1,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,0,1,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,0,1,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,0,1,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,0,1,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,0,1,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,0,1,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,0,1,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,0,1,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,0,1,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,0,1,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,0,1,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,0,1,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,0,1,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,0,1,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,0,1,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,0,1,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,0,1,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,0,1,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,0,1,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,0,1,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,0,1,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,0,1,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,0,1,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,0,1,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,0,1,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,0,1,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,0,1,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,0,1,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,0,1,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,0,1,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,0,1,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,0,1,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,0,1,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,0,1,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,0,1,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,0,1,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,0,1,d826fe6f-d9f6-41f2-8dd6-bd840af25183,d826fe6f-d9f6-41f2-8dd6-bd840af25183,0,1,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,0,1,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,0,1,5e6a6f8f-5cb1-475d-b2d8-f2f143ef7b19,5e6a6f8f-5cb1-475d-b2d8-f2f143ef7b19,0,1,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,0,1,7bc5fa42-7d72-433e-8db6-a046b583a316,7bc5fa42-7d72-433e-8db6-a046b583a316,0,1,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,0,1,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,0,1,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,0,1,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,0,1,b6ae3a72-c686-409d-9cda-9d1a00be1d8d,b6ae3a72-c686-409d-9cda-9d1a00be1d8d,0,1,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,0,1,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,0,1,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,0,1,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,0,1,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,0,1,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,0,1,6ffd2da8-db97-46fc-9a53-8e665a598e3c,6ffd2da8-db97-46fc-9a53-8e665a598e3c,0,1,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,0,1,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,0,1,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,0,1,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,0,1,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,0,1,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,0,1,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,0,1,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,0,1,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,0,1,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,0,1,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,0,1,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,0,1,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,0,1,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,0,1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,0,1,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,0,1,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,0,1,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,0,1,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,0,1,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,0,1,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,0,1,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,0,1,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,0,1,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,0,1,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,0,1,483dfce4-9c66-4739-94d4-17a005d64f5b,483dfce4-9c66-4739-94d4-17a005d64f5b,0,1,19506116-43ef-433c-822c-ef8717b0da6b,19506116-43ef-433c-822c-ef8717b0da6b,0,1,464b92cc-b577-4350-ae9f-e697390248d7,464b92cc-b577-4350-ae9f-e697390248d7,0,1,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,0,1,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,0,1,2fac5a7b-cb3e-4442-892f-77f338035eeb,2fac5a7b-cb3e-4442-892f-77f338035eeb,0,1,f2076747-0bc4-41dd-bab9-33cec85111f0,f2076747-0bc4-41dd-bab9-33cec85111f0,0,1,9f74c0bb-b876-4a37-b954-c93898a21067,9f74c0bb-b876-4a37-b954-c93898a21067,0,1,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,0,1,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,0,1,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,0,1,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,0,1,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,0,1,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,0,1,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,0,1,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,0,1,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,0,1,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,0,1,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,0,1,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,0,1,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,0,1,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,0,1,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,0,1,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,0,1,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,0,1,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,0,1,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,0,1,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,0,1,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,0,1,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,0,1,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,0,1,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,0,1,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,0,1,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0,1,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,0,1,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,0,1,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,0,1,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,0,1,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,0,1,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,0,1,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,0,1,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,0,1,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,0,1,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,0,1,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,0,1,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,0,1,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,0,1,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,0,1,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,0,1,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,0,1,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,0,1,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,0,1,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,0,1,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,0,1,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,0,1,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,0,1,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,0,1,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,0,1,b2265070-9cd3-4176-92c8-6d9f32c2ca84,b2265070-9cd3-4176-92c8-6d9f32c2ca84,0,1,b347e774-2261-4f76-9bdb-3c6736983589,b347e774-2261-4f76-9bdb-3c6736983589,0,1,be7e2715-1243-49a8-8c7c-55d632d3cf6c,be7e2715-1243-49a8-8c7c-55d632d3cf6c,0,1,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,0,1,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,0,1,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,0,1,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,0,1,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,0,1,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,0,1,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,0,1,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,0,1,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,0,1,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,0,1,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,0,1,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,0,1,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,0,1,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,0,1,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,0,1,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,0,1,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,0,1,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,0,1,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,0,1,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,0,1,c35904cf-4954-434e-96fd-5ca537a88c66,c35904cf-4954-434e-96fd-5ca537a88c66,0,1,5545798f-72dc-4630-a5ba-88039f4bfe3c,5545798f-72dc-4630-a5ba-88039f4bfe3c,0,1,f293ac4b-91ed-4c97-90b3-bfe98c983a0f,f293ac4b-91ed-4c97-90b3-bfe98c983a0f,0,1,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,0,1,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,0,1,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,0,1,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,0,1,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,0,1,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,0,1,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,0,1,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,0,1,c343495b-5947-4fe7-a94b-d1f2b2455b4f,c343495b-5947-4fe7-a94b-d1f2b2455b4f,0,1,fbce7316-bb9a-40c1-af3c-352f4b559ab6,fbce7316-bb9a-40c1-af3c-352f4b559ab6,0,1,a3721457-b33b-4742-b6e1-531af10969d1,a3721457-b33b-4742-b6e1-531af10969d1,0,1,9619a603-e578-4f30-bcc6-adfddfa915c0,9619a603-e578-4f30-bcc6-adfddfa915c0,0,1,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,0,1,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,0,1,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,0,1,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,0,1,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,0,1,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,0,1,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,0,1,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,0,1,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,0,1,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,0,1,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,0,1,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,0,1,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,0,1,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,0,1,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,0,1,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,0,1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,0,1,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,0,1,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,0,1,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,0,1,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,0,1,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,0,1,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,0,1,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,0,1,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,0,1,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,0,1,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,0,1,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,0,1,a23e6c77-8c12-4f99-ae2d-68a12274be38,a23e6c77-8c12-4f99-ae2d-68a12274be38,0,1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,0,1,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,0,1,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,0,1,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,0,1,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,0,1,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,0,1,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,0,1,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,0,1,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,0,1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,0,1,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,0,1,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,0,1,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,0,1,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,0,1,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,0,1,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,0,1,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,0,1,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,0,1,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,0,1,118a0e62-c0bb-435b-9e3e-c64563efa602,118a0e62-c0bb-435b-9e3e-c64563efa602,0,1,b57bc8a9-8a59-4192-a442-2e1982e83179,b57bc8a9-8a59-4192-a442-2e1982e83179,0,1,5b06ccda-2a70-4621-8273-78408cbe72a9,5b06ccda-2a70-4621-8273-78408cbe72a9,0,1,89753385-64fd-4e76-9857-bfd5d7c23f71,89753385-64fd-4e76-9857-bfd5d7c23f71,0,1,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,0,1,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,0,1,e20bcb57-2f68-4709-8a11-105d561a2dda,e20bcb57-2f68-4709-8a11-105d561a2dda,0,1,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,0,1,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,0,1,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,0,1,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,0,1,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,0,1,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,0,1,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,0,1,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0,1,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,0,1,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,0,1,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,0,1,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,0,1,d3211832-c8ca-437a-8810-82e06cbb48de,d3211832-c8ca-437a-8810-82e06cbb48de,0,1,8131d701-1014-4196-9b67-914e451f8a3a,8131d701-1014-4196-9b67-914e451f8a3a,0,1,2b102933-c660-4e74-ae9a-5061a88ed672,2b102933-c660-4e74-ae9a-5061a88ed672,0,1,56c897b7-d34e-4d7d-9a3b-d0779be5c189,56c897b7-d34e-4d7d-9a3b-d0779be5c189,0,1,3ac81c80-56bd-4750-b135-07ab522e3eab,3ac81c80-56bd-4750-b135-07ab522e3eab,0,1,5657872f-c7d5-446f-bcc3-d0b86ad63a42,5657872f-c7d5-446f-bcc3-d0b86ad63a42,0,1,d5214cb9-67e2-469f-989f-3f2b662ae830,d5214cb9-67e2-469f-989f-3f2b662ae830,0,1,69679e88-4f2b-4dd6-8cb2-b88293d07b55,69679e88-4f2b-4dd6-8cb2-b88293d07b55,0,1,68679208-9972-4854-8649-49bdf6212255,68679208-9972-4854-8649-49bdf6212255,0,1,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,0,1,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,0,1,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,0,1,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,0,1,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,0,1,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,0,1,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0,1,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,0,1,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,0,1,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,0,1,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,0,1,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,0,1,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,0,1,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,0,1,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,0,1,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,0,1,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,0,1,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,0,1,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,0,1,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,0,1,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,0,1,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,0,1,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,0,1,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,0,1,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,0,1,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,0,1,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,0,1,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,0,1,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,0,1,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,0,1,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,0,1,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,0,1,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,0,1,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,0,1,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,0,1,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,0,1,985106b7-7476-4b48-90ac-ad86876395b5,985106b7-7476-4b48-90ac-ad86876395b5,0,1,0d8db0c9-adbc-478d-997c-3d7feccac99b,0d8db0c9-adbc-478d-997c-3d7feccac99b,0,1,3fd2ef04-c178-47bf-ab62-7baf83236d99,3fd2ef04-c178-47bf-ab62-7baf83236d99,0,1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,0,1,320bf2e6-a3a8-490b-8aa0-21369ffb121b,320bf2e6-a3a8-490b-8aa0-21369ffb121b,0,1,a3bafc54-8fe4-4841-acc6-74a87baf9caf,a3bafc54-8fe4-4841-acc6-74a87baf9caf,0,1,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,0,1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0,1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,0,1,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,0,1,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,0,1,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,0,1,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,0,1,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,0,1,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,0,1,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,0,1,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,0,1,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,0,1,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,0,1,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,0,1,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,0,1,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,0,1,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,0,1,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,0,1,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,0,1,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,0,1,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,0,1,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,0,1,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,0,1,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,0,1,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,0,1,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,0,1,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,0,1,972c2fa0-0ca9-40da-a8c1-a06b81bd0bcf,972c2fa0-0ca9-40da-a8c1-a06b81bd0bcf,0,1,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,0,1,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,0,1,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,0,1,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,0,1,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,0,1,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,0,1,fc1476f7-26e6-4374-b99b-e515d86c050a,fc1476f7-26e6-4374-b99b-e515d86c050a,0,1,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,0,1,59fe985a-f169-495b-bd6d-4b64401f81b0,59fe985a-f169-495b-bd6d-4b64401f81b0,0,1,184d1023-fba9-4e56-b592-519254abe922,184d1023-fba9-4e56-b592-519254abe922,0,1,cb68b275-f191-4632-a8ea-aa8809256804,cb68b275-f191-4632-a8ea-aa8809256804,0,1,174011b9-8fe2-43f5-adea-21f6d73835ff,174011b9-8fe2-43f5-adea-21f6d73835ff,0,1,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,0,1,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,0,1,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,0,1,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,0,1,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,0,1,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,0,1,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,0,1,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,0,1,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,0,1,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,0,1,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,0,1,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,0,1,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,0,1,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,0,1,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,0,1,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,0,1,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,0,1,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,0,1,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,0,1,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,0,1,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,0,1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,0,1,d8601e95-af94-4805-974a-99c539725d74,d8601e95-af94-4805-974a-99c539725d74,0,1,6d98f877-f3bb-4795-9025-2631468a331f,6d98f877-f3bb-4795-9025-2631468a331f,0,1,89b9379d-ace9-48cc-b979-a66fd45aeb1d,89b9379d-ace9-48cc-b979-a66fd45aeb1d,0,1,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,0,1,9767a113-5a42-4749-bf40-0f349e85615d,9767a113-5a42-4749-bf40-0f349e85615d,0,1,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,0,1,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,0,1,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,0,1,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,0,1,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,0,1,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,0,1,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,0,1,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,0,1,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,0,1,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,0,1,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,0,1,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,0,1,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,0,1,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,0,1,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,0,1,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,0,1,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,0,1,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,0,1,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,0,1,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,0,1,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,0,1,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,0,1,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,0,1,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,0,1,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,0,1,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,0,1,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,0,1,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,0,1,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,0,1,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,0,1,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,0,1,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,0,1,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,0,1,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,0,1,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,0,1,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,0,1,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,0,1,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,0,1,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,0,1,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,0,1,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,0,1,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,0,1,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,0,1,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,0,1,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,0,1,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,0,1,094d5482-286d-4e1a-8888-c0452d2e5af0,094d5482-286d-4e1a-8888-c0452d2e5af0,0,1,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,0,1,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,0,1,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,0,1,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,0,1,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,0,1,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,0,1,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,0,1,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,0,1,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,0,1,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,0,1,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,0,1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,0,1,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,0,1,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,0,1,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,0,1,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,0,1,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,0,1,e61eef89-b3de-4b73-b7d9-af75318093e5,e61eef89-b3de-4b73-b7d9-af75318093e5,0,1,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,0,1,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,0,1,a330acd1-bc97-4ef8-8ecb-5604868ca044,a330acd1-bc97-4ef8-8ecb-5604868ca044,0,1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,0,1,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,0,1,8928693b-1933-4e02-8a33-99b6f05b1c57,8928693b-1933-4e02-8a33-99b6f05b1c57,0,1,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,0,1,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,0,1,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,0,1,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,0,1,61f283c7-f887-432b-a2d7-c27483e04317,61f283c7-f887-432b-a2d7-c27483e04317,0,1,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,0,1,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,0,1,079bc65d-da8e-431d-847c-ec46868ca92d,079bc65d-da8e-431d-847c-ec46868ca92d,0,1,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,0,1,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,0,1,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,0,1,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,0,1,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,0,1,1f169cd2-573f-408d-92e7-3eee7ff4528a,1f169cd2-573f-408d-92e7-3eee7ff4528a,0,1,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,0,1,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,0,1,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,0,1,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,0,1,9ed016b2-2a4a-43a1-a336-6b13d68b3d0a,9ed016b2-2a4a-43a1-a336-6b13d68b3d0a,0,1,75b9ab9f-7cbb-4468-9570-39f719fd682b,75b9ab9f-7cbb-4468-9570-39f719fd682b,0,1,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,0,1,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,0,1,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,0,1,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,0,1,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,0,1,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,0,1,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,0,1,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,0,1,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,0,1,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0,1,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,0,1,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,0,1,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,0,1,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,0,1,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,0,1,0c5e261f-961e-4780-877a-06589400b88a,0c5e261f-961e-4780-877a-06589400b88a,0,1,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,0,1,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,0,1,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,0,1,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,0,1,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,0,1,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,0,1,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0,1,b6bd2b39-07ae-48a7-8a5b-f44b5034afa9,b6bd2b39-07ae-48a7-8a5b-f44b5034afa9,0,1,5500d5c6-fdbf-4614-b43b-fabf56e3968c,5500d5c6-fdbf-4614-b43b-fabf56e3968c,0,1,a08eeef7-1c81-4985-8628-6b35ac73e135,a08eeef7-1c81-4985-8628-6b35ac73e135,0,1,c446f732-097a-4197-8384-91a6925c6bdd,c446f732-097a-4197-8384-91a6925c6bdd,0,1,cc33ec52-aed4-4807-90b5-700d307b4f57,cc33ec52-aed4-4807-90b5-700d307b4f57,0,1,6f9ece3d-aeca-4313-9e6a-44e562fc83ff,6f9ece3d-aeca-4313-9e6a-44e562fc83ff,0,1,6b04b6f1-2c9d-4de0-b871-6cc377b13e33,6b04b6f1-2c9d-4de0-b871-6cc377b13e33,0,1,82ea249e-ecba-4916-b9a1-c7e6119b353a,82ea249e-ecba-4916-b9a1-c7e6119b353a,0,1,d5406849-57b3-44f4-8efa-e73523939ae5,d5406849-57b3-44f4-8efa-e73523939ae5,0,1,9ce5f33f-4331-491d-b084-9913c38f4c7d,9ce5f33f-4331-491d-b084-9913c38f4c7d,0,1,0603113a-f2f1-43e6-9838-64c5e98417f0,0603113a-f2f1-43e6-9838-64c5e98417f0,0,1,43055a56-a079-41e2-87eb-723769109bed,43055a56-a079-41e2-87eb-723769109bed,0,1,930f2bc5-417d-4b97-b440-8d5e81e5c896,930f2bc5-417d-4b97-b440-8d5e81e5c896,0,1,c8f487aa-544a-41dc-b7c3-7cf21d2720f2,c8f487aa-544a-41dc-b7c3-7cf21d2720f2,0,1,e506f7d3-2572-4c54-ac98-e40f083ac578,e506f7d3-2572-4c54-ac98-e40f083ac578,0,1,bdf93aa5-86a4-4791-bdb0-172532029b7c,bdf93aa5-86a4-4791-bdb0-172532029b7c,0,1,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,0,1,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,0,1,778e79ee-eb1a-4d52-8a31-58e781c78fe4,778e79ee-eb1a-4d52-8a31-58e781c78fe4,0,1,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,0,1,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,0,1,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,0,1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,0,1,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,0,1,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,0,1,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,0,1,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,0,1,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,0,1,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,0,1,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,0,1,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,0,1,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,0,1,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,0,1,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,0,1,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,0,1,ff700f82-aba3-417c-be1b-b1b37ad98543,ff700f82-aba3-417c-be1b-b1b37ad98543,0,1,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,0,1,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,0,1,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,0,1,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,0,1,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,0,1,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,0,1,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,0,1,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,0,1,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,0,1,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,0,1,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,0,1,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,0,1,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,0,1,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,0,1,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,0,1,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,0,1,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,0,1,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,0,1,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,0,1,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,0,1,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,0,1,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,0,1,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,0,1,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,0,1,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,0,1,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,0,1,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,0,1,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,0,1,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,0,1,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,0,1,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,0,1,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,0,1,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,0,1,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,0,1,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,0,1,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,0,1,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0,1,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,0,1,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,0,1,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,0,1,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,0,1,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,0,1,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,0,1,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,0,1,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,0,1,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,0,1,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,0,1,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,0,1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,0,1,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,0,1,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,0,1,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,0,1,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,0,1,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,0,1,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,0,1,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,0,1,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,0,1,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,0,1,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,0,1,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,0,1,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,0,1,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,0,1,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,0,1,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,0,1,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,0,1,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0,1,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,0,1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,0,1,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,0,1,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,0,1,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,0,1,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,0,1,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,0,1,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,0,1,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,0,1,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,0,1,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,0,1,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,0,1,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,0,1,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,0,1,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,0,1,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,0,1,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,0,1,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,0,1,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,0,1,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,0,1,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,0,1,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,0,1,436162a0-263f-4126-aa3a-7508505cc4a8,436162a0-263f-4126-aa3a-7508505cc4a8,0,1,9e4fbc61-8736-435d-bdd4-eb3bbaa14b92,9e4fbc61-8736-435d-bdd4-eb3bbaa14b92,0,1,0b750d40-1ee5-414c-b8a5-244c666787ae,0b750d40-1ee5-414c-b8a5-244c666787ae,0,1,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,0,1,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,0,1,0ff797f5-007d-4379-aa14-5d3f5babeb84,0ff797f5-007d-4379-aa14-5d3f5babeb84,0,1,767176d4-4fe9-4de5-9246-59b7fec09c53,767176d4-4fe9-4de5-9246-59b7fec09c53,0,1,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,0,1,8e587969-0263-4789-a501-a6c2e102f88e,8e587969-0263-4789-a501-a6c2e102f88e,0,1,f26bfc01-7d8a-43a7-b869-c2deb18218e5,f26bfc01-7d8a-43a7-b869-c2deb18218e5,0,1,8c72a0b2-20cb-43ff-b010-25256aa8011d,8c72a0b2-20cb-43ff-b010-25256aa8011d,0,1,a913b023-0ec5-4c60-880d-2f8ddad2d5ce,a913b023-0ec5-4c60-880d-2f8ddad2d5ce,0,1,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,0,1,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,0,1,afe96dc2-7840-4010-a7d4-1eeac36f0fd3,afe96dc2-7840-4010-a7d4-1eeac36f0fd3,0,1,02ec2b85-3cc8-45bb-911f-c5f7c8668fd5,02ec2b85-3cc8-45bb-911f-c5f7c8668fd5,0,1,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,0,1,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,0,1,a3b47ee8-b7b9-4bdf-afa8-025447ea9d5b,a3b47ee8-b7b9-4bdf-afa8-025447ea9d5b,0,1,36475bf5-5da6-48ad-8077-4de4426f7e10,36475bf5-5da6-48ad-8077-4de4426f7e10,0,1,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,0,1,e33df42d-4c64-4475-8294-6b05ecdb4e02,e33df42d-4c64-4475-8294-6b05ecdb4e02,0,1,6094a0ed-2051-4649-ad75-dfeb389d3cbb,6094a0ed-2051-4649-ad75-dfeb389d3cbb,0,1,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,0,1,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,0,1,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,0,1,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,0,1,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,0,1,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,0,1,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,0,1,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,0,1,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,0,1,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,0,1,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,0,1,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,0,1,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,0,1,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,0,1,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,0,1,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,0,1,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,0,1,a35baee5-66cd-4888-8db3-de2c8e2509c4,a35baee5-66cd-4888-8db3-de2c8e2509c4,0,1,2f474bb6-7c65-4e09-a3a4-f8cea664f2a0,2f474bb6-7c65-4e09-a3a4-f8cea664f2a0,0,1,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,0,1,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,0,1,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,0,1,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,0,1,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,0,1,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,0,1,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,0,1,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,0,1,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,0,1,84796b00-79db-42ba-94d0-5bf543e09cd6,84796b00-79db-42ba-94d0-5bf543e09cd6,0,1,e85695f1-ec94-42ce-8f80-2bda4c90685b,e85695f1-ec94-42ce-8f80-2bda4c90685b,0,1,6f08cc54-d4b1-4c6f-96dc-e0b6891c81b6,6f08cc54-d4b1-4c6f-96dc-e0b6891c81b6,0,1,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,0,1,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,0,1,840dc727-288a-4bf2-8b1a-47629d28229c,840dc727-288a-4bf2-8b1a-47629d28229c,0,1,314ac8ca-8845-40c2-b844-91beb05fb601,314ac8ca-8845-40c2-b844-91beb05fb601,0,1,db15717d-1b6a-42fd-9b8f-959e1d5841e9,db15717d-1b6a-42fd-9b8f-959e1d5841e9,0,1,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,0,1,37ae1946-9436-47ef-8b8c-17ed0a24971c,37ae1946-9436-47ef-8b8c-17ed0a24971c,0,1,0d3cd7ca-089f-4858-a4a6-0ed373aa77bf,0d3cd7ca-089f-4858-a4a6-0ed373aa77bf,0,1,d844d861-fbe9-4391-89e3-00e505b33b33,d844d861-fbe9-4391-89e3-00e505b33b33,0,1,495ddb5f-f75d-46c9-b134-e925c814b890,495ddb5f-f75d-46c9-b134-e925c814b890,0,1,0a4ded35-1cfa-4e53-91c7-139ee0b94ade,0a4ded35-1cfa-4e53-91c7-139ee0b94ade,0,1,c0688817-fd73-4ead-b9dd-ec966780a2c2,c0688817-fd73-4ead-b9dd-ec966780a2c2,0,1,b1fbfbfe-766f-4018-9491-507748193808,b1fbfbfe-766f-4018-9491-507748193808,0,1,65d9f3a7-6258-49f3-8252-0a60e2735ff3,65d9f3a7-6258-49f3-8252-0a60e2735ff3,0,1,a0ba7e86-b894-4a63-8687-bb2a840fe1ab,a0ba7e86-b894-4a63-8687-bb2a840fe1ab,0,1,e55dfadb-8e12-4808-ad90-e891a4644548,e55dfadb-8e12-4808-ad90-e891a4644548,0,1,a1155588-882f-430d-85a6-19558b5b7256,a1155588-882f-430d-85a6-19558b5b7256,0,1,a792b3dc-ac80-492b-bd94-83eb0438ba9f,a792b3dc-ac80-492b-bd94-83eb0438ba9f,0,1,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,0,1,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,0,1,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,0,1,b9ba3ce3-9059-4135-9d31-725f01907431,b9ba3ce3-9059-4135-9d31-725f01907431,0,1,f637a14d-08ed-4c62-a873-ca36cdcd1e88,f637a14d-08ed-4c62-a873-ca36cdcd1e88,0,1,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,0,1,4d2b3767-7c96-44a6-bb1b-ab74b103b90e,4d2b3767-7c96-44a6-bb1b-ab74b103b90e,0,1,fc9fc58f-c888-41f0-9f57-70748b21706e,fc9fc58f-c888-41f0-9f57-70748b21706e,0,1,fc761833-aa85-4c6d-a36c-d1ed060e3bb1,fc761833-aa85-4c6d-a36c-d1ed060e3bb1,0,1,f0ba2ff2-b353-4f84-8e45-23e47ee6c1b6,f0ba2ff2-b353-4f84-8e45-23e47ee6c1b6,0,1,bb8bade2-5c1b-49a6-b66f-79a3ebff86f7,bb8bade2-5c1b-49a6-b66f-79a3ebff86f7,0,1,33596560-3d45-4d3e-b6ec-1c22162110ad,33596560-3d45-4d3e-b6ec-1c22162110ad,0,1,d3e82a06-daae-4f4d-b3f8-45a406e31664,d3e82a06-daae-4f4d-b3f8-45a406e31664,0,1,af76c3c9-d8dc-4156-9e10-80ee02fcf4fe,af76c3c9-d8dc-4156-9e10-80ee02fcf4fe,0,1,ac6a184d-1247-4b54-a023-f0d16daa5fe9,ac6a184d-1247-4b54-a023-f0d16daa5fe9,0,1,f9af5fe6-0b4f-4d48-92a4-1f2a29972155,f9af5fe6-0b4f-4d48-92a4-1f2a29972155,0,1,3ca1682d-5ff5-4b2b-96c2-54d2dd5297a9,3ca1682d-5ff5-4b2b-96c2-54d2dd5297a9,0,1,a687d346-73cf-4aea-a4d0-f29824f0f6f1,a687d346-73cf-4aea-a4d0-f29824f0f6f1,0,1,f51fda72-56d9-4b45-a775-a0e1dfbf3a27,f51fda72-56d9-4b45-a775-a0e1dfbf3a27,0,1,8bf73614-81a4-4702-88b9-3c6f2594d204,8bf73614-81a4-4702-88b9-3c6f2594d204,0,1,b8d4410b-f626-41b8-87c8-67102256bae2,b8d4410b-f626-41b8-87c8-67102256bae2,0,1,484eeb5f-12af-4139-a081-4dcac067a712,484eeb5f-12af-4139-a081-4dcac067a712,0,1,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,0,1,2f3bdc3c-4c5d-4fcb-85bb-932fe1747d98,2f3bdc3c-4c5d-4fcb-85bb-932fe1747d98,0,1,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,0,1,16099d54-e84f-47c5-aaf3-f8ced3cba5e0,16099d54-e84f-47c5-aaf3-f8ced3cba5e0,0,1,39fce130-be22-42d9-8bcd-b162ae00fc7a,39fce130-be22-42d9-8bcd-b162ae00fc7a,0,1,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,0,1,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,0,1,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,0,1,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,0,1,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,0,1,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,0,1,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,0,1,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,0,1,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,0,1,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,0,1,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,0,1,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,0,1,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,0,1,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,0,1,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,0,1,6c205eae-9113-46c1-a245-25d29173646e,6c205eae-9113-46c1-a245-25d29173646e,0,1,4cc4aa90-49fb-4602-9f9c-d4d47d223988,4cc4aa90-49fb-4602-9f9c-d4d47d223988,0,1,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,0,1,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,0,1,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,0,1,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,0,1,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,0,1,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,0,1,04d8ae53-67d9-40a5-b942-59fdebfd6ed7,04d8ae53-67d9-40a5-b942-59fdebfd6ed7,0,1,8c83a662-50e5-402c-913b-5e548b57201d,8c83a662-50e5-402c-913b-5e548b57201d,0,1,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,0,1,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,0,1,c224e520-7204-4f4a-aac9-b6221ea9ce44,c224e520-7204-4f4a-aac9-b6221ea9ce44,0,1,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,0,1,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,0,1,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,0,1,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,0,1,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,0,1,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,0,1,59364444-4564-42d9-8b94-01ed1b4a1204,59364444-4564-42d9-8b94-01ed1b4a1204,0,1,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,0,1,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,0,1,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,0,1,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,0,1,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,0,1,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,0,1,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,0,1,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,0,1,6fe57ea6-fe5e-48b1-bb31-5d42e4c2c6c7,6fe57ea6-fe5e-48b1-bb31-5d42e4c2c6c7,0,1,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,0,1,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,0,1,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,0,1,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,0,1,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,0,1,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,0,1,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,0,1,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,0,1,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,0,1,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,0,1,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,0,1,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,0,1,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,0,1,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,0,1,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,0,1,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,0,1,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,0,1,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,0,1,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,0,1,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,0,1,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,0,1,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,0,1,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,0,1,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,0,1,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,0,1,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,0,1,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,0,1,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,0,1,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,0,1,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,0,1,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,0,1,4a2d2790-debf-4dc2-8216-878d8808d161,4a2d2790-debf-4dc2-8216-878d8808d161,0,1,836d0590-a8ee-40d0-a649-41cf4fae36a6,836d0590-a8ee-40d0-a649-41cf4fae36a6,0,1,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,0,1,6ddbc80a-38c8-4eda-8cdf-6d64331818a3,6ddbc80a-38c8-4eda-8cdf-6d64331818a3,0,1,eda3c675-04b7-4c14-b78a-0caa22843ac0,eda3c675-04b7-4c14-b78a-0caa22843ac0,0,1,fc097ab3-8b3e-4b8f-9e51-d888735a69bd,fc097ab3-8b3e-4b8f-9e51-d888735a69bd,0,1,23c2c28b-867e-41d0-ba61-b9ee20fa38d1,23c2c28b-867e-41d0-ba61-b9ee20fa38d1,0,1,e5ddc65a-e886-4ed6-9598-bec30ddb7341,e5ddc65a-e886-4ed6-9598-bec30ddb7341,0,1,6cf48813-8097-44ae-8630-58f5b002ff31,6cf48813-8097-44ae-8630-58f5b002ff31,0,1,e0cee0ee-24b9-400a-95af-c61debec912b,e0cee0ee-24b9-400a-95af-c61debec912b,0,1,578bc873-5e23-4222-a655-7d653d761a4c,578bc873-5e23-4222-a655-7d653d761a4c,0,1,09bccd03-1492-4ebe-bfb4-8ace744d367f,09bccd03-1492-4ebe-bfb4-8ace744d367f,0,1,4d9294db-1abd-4e34-812f-fdcac0cf657d,4d9294db-1abd-4e34-812f-fdcac0cf657d,0,1,14bc3be4-3075-418d-90ec-be5d2686f875,14bc3be4-3075-418d-90ec-be5d2686f875,0,1,adffd81c-a566-4b4f-89d5-6abc705da36f,adffd81c-a566-4b4f-89d5-6abc705da36f,0,1,9f67e6d4-0b7c-4318-b127-7c8b7daf1d1b,9f67e6d4-0b7c-4318-b127-7c8b7daf1d1b,0,1,23ced9be-cb9d-451f-aea7-aa211054bd4d,23ced9be-cb9d-451f-aea7-aa211054bd4d,0,1,3991175c-0152-44c6-8e1c-4090d960050a,3991175c-0152-44c6-8e1c-4090d960050a,0,1,aa2760cf-b8cd-4eb3-b2f1-0e1fbdec09a8,aa2760cf-b8cd-4eb3-b2f1-0e1fbdec09a8,0,1,d1fabcdd-c072-4341-85d4-9a9ba168f301,d1fabcdd-c072-4341-85d4-9a9ba168f301,0,1,030a9c93-322b-4421-ad70-0acaa94870a2,030a9c93-322b-4421-ad70-0acaa94870a2,0,1,7121d241-9450-4bf2-b7ff-a0e963bbfd0a,7121d241-9450-4bf2-b7ff-a0e963bbfd0a,0,1,01a3ab71-56fa-4ddc-a5a3-9c923ee9c74a,01a3ab71-56fa-4ddc-a5a3-9c923ee9c74a,0,1,5c660f50-c63a-466d-bb32-de5699ad8a95,5c660f50-c63a-466d-bb32-de5699ad8a95,0,1,032587fa-2993-463c-af9f-bdd67f12604f,032587fa-2993-463c-af9f-bdd67f12604f,0,1,64d4aaed-e068-431b-bed0-faef7b5358f3,64d4aaed-e068-431b-bed0-faef7b5358f3,0,1,4507a92e-abb6-4329-88b2-3429bc694bc6,4507a92e-abb6-4329-88b2-3429bc694bc6,0,1,2694c1b4-536b-4187-adf6-0f8757aaae76,2694c1b4-536b-4187-adf6-0f8757aaae76,0,1,e523f88b-b3de-476e-a3cc-592970492dec,e523f88b-b3de-476e-a3cc-592970492dec,0,1,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,0,1,00c29d0d-338a-4eb0-9e0f-5b64f6521e6e,00c29d0d-338a-4eb0-9e0f-5b64f6521e6e,0,1,ea0843f4-60fb-4d44-abf4-0021867c636b,ea0843f4-60fb-4d44-abf4-0021867c636b,0,1,59aadc03-adbc-481f-89bc-d7f391789522,59aadc03-adbc-481f-89bc-d7f391789522,0,1,254f6ccd-0451-4231-91c9-4abe57b647be,254f6ccd-0451-4231-91c9-4abe57b647be,0,1,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,0,1,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0,1,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,0,1,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,0,1,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,0,1,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,0,1,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,0,1,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,0,1,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,0,1,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,0,1,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,0,1,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,0,1,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,0,1,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,0,1,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,0,1,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,0,1,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,0,1,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,0,1,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,0,1,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,0,1,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,0,1,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,0,1,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,0,1,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,0,1,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,0,1,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,0,1,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,0,1,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,0,1,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,0,1,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,0,1,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,0,1,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,0,1,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,0,1,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,0,1,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,0,1,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,0,1,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,0,1,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,0,1,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,0,1,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,0,1,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,0,1,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,0,1,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,0,1,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,0,1,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,0,1,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,0,1,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0,1,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,0,1,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,0,1,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,0,1,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,0,1,9ab0fe18-4dd7-4eed-958d-8537d4896d84,9ab0fe18-4dd7-4eed-958d-8537d4896d84,0,1,2278dc46-46ce-4d00-9289-4de1640782d7,2278dc46-46ce-4d00-9289-4de1640782d7,0,1,1f983a04-c2df-40bb-bee2-b326474d89f8,1f983a04-c2df-40bb-bee2-b326474d89f8,0,1,f03f1b68-e924-4c06-b0aa-8033a9a2f592,f03f1b68-e924-4c06-b0aa-8033a9a2f592,0,1,5e453d10-235d-4e53-86b1-20eed3247992,5e453d10-235d-4e53-86b1-20eed3247992,0,1,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0,1,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,0,1,738228ad-c30a-42f4-a6ad-bde0edba6266,738228ad-c30a-42f4-a6ad-bde0edba6266,0,1,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,0,1,df8e8344-d7bc-4cf2-b498-88d3abb66c09,df8e8344-d7bc-4cf2-b498-88d3abb66c09,0,1,e6d13536-3021-45b2-a8e1-bdb0e0be850c,e6d13536-3021-45b2-a8e1-bdb0e0be850c,0,1,b49f538c-b2b2-4a1f-a6b4-a911033b1666,b49f538c-b2b2-4a1f-a6b4-a911033b1666,0,1,794e952b-6b03-4a1e-ad3f-453376bccf45,794e952b-6b03-4a1e-ad3f-453376bccf45,0,1,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,0,1,5cd997ba-f123-47b3-8cde-fbba45a4a11c,5cd997ba-f123-47b3-8cde-fbba45a4a11c,0,1,0d746247-c4f4-47a5-a373-45ec4023d3ef,0d746247-c4f4-47a5-a373-45ec4023d3ef,0,1,a25bcf4e-1a47-472b-9f93-f6ab45abf461,a25bcf4e-1a47-472b-9f93-f6ab45abf461,0,1,958b7dab-0aba-423f-ab81-b70f2b93a027,958b7dab-0aba-423f-ab81-b70f2b93a027,0,1,a17ec3be-2255-42af-a6ee-d3fb8bb00519,a17ec3be-2255-42af-a6ee-d3fb8bb00519,0,1,add0b22d-ff5a-41f7-88a1-ef34880e50c9,add0b22d-ff5a-41f7-88a1-ef34880e50c9,0,1,7dc10935-69aa-4f2b-8b01-798dbbaa6cc6,7dc10935-69aa-4f2b-8b01-798dbbaa6cc6,0,1,9c15b35b-d658-4e52-a441-3b79294d65eb,9c15b35b-d658-4e52-a441-3b79294d65eb,0,1,d5fdac2a-e3aa-4859-8485-0cf114748c87,d5fdac2a-e3aa-4859-8485-0cf114748c87,0,1,eb3d278b-e8fe-4d43-90a8-dd361009196f,eb3d278b-e8fe-4d43-90a8-dd361009196f,0,1,d30fbeae-e97f-422d-b5c4-289aaeaa2ae4,d30fbeae-e97f-422d-b5c4-289aaeaa2ae4,0,1,a3582d0c-6a63-442e-8422-83f251df0ed9,a3582d0c-6a63-442e-8422-83f251df0ed9,0,1,9aae5d2a-81b7-4f1c-8b65-b3e4a8a9bc4d,9aae5d2a-81b7-4f1c-8b65-b3e4a8a9bc4d,0,1,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,0,1,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,0,1,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,0,1,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,0,1,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,0,1,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,0,1,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,0,1,8dfd2d08-c80f-4db4-b72a-1469ba4df5e2,8dfd2d08-c80f-4db4-b72a-1469ba4df5e2,0,1,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,0,1,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,0,1,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,0,1,c34c330a-991a-4ec9-a0ad-73c04c6a6fc3,c34c330a-991a-4ec9-a0ad-73c04c6a6fc3,0,1,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,0,1,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,0,1,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,0,1,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,0,1,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,0,1,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,0,1,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,0,1,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,0,1,707e64f3-ad8b-470a-aa4f-57fddecc2159,707e64f3-ad8b-470a-aa4f-57fddecc2159,0,1,682da7d7-6e27-4133-90fc-a445c156f908,682da7d7-6e27-4133-90fc-a445c156f908,0,1,64751704-f39d-4859-adc6-8168897d6aec,64751704-f39d-4859-adc6-8168897d6aec,0,1,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,0,1,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,0,1,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,0,1,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,0,1,f0dca5f2-1479-42bf-b895-9abd345522f5,f0dca5f2-1479-42bf-b895-9abd345522f5,0,1,8eaa91e0-88d9-4e4e-b2d6-752696bafadf,8eaa91e0-88d9-4e4e-b2d6-752696bafadf,0,1,93d6dda2-dd7c-42d1-b9bc-284929931585,93d6dda2-dd7c-42d1-b9bc-284929931585,0,1,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,0,1,abc44046-a839-4c4a-8161-ecba29abc27d,abc44046-a839-4c4a-8161-ecba29abc27d,0,1,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,0,1,12dd81dd-31f5-47f2-a163-ea6c670299c5,12dd81dd-31f5-47f2-a163-ea6c670299c5,0,1,1b9e77bf-639a-4e81-a0fd-4f2bd66feeba,1b9e77bf-639a-4e81-a0fd-4f2bd66feeba,0,1,8238c710-09ff-473e-b0ed-40b31bfccab8,8238c710-09ff-473e-b0ed-40b31bfccab8,0,1,fe59f9ba-11e3-41ba-ac6f-4b4e3dbf35ae,fe59f9ba-11e3-41ba-ac6f-4b4e3dbf35ae,0,1,15845f89-0f9e-4a93-b7e8-ef101694b1b8,15845f89-0f9e-4a93-b7e8-ef101694b1b8,0,1,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,0,1,60f8daf5-06c2-4db6-8fea-5cbb72130113,60f8daf5-06c2-4db6-8fea-5cbb72130113,0,1,e389b86a-7a48-4b31-b5cb-27b3d7dfed82,e389b86a-7a48-4b31-b5cb-27b3d7dfed82,0,1,91e7c98e-fadf-4c08-bd76-1e4e4d140265,91e7c98e-fadf-4c08-bd76-1e4e4d140265,0,1,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,0,1,8247a93d-c2d3-4c9b-a442-619240d35113,8247a93d-c2d3-4c9b-a442-619240d35113,0,1,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,0,1,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,0,1,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,0,1,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,0,1,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,0,1,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,0,1,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,0,1,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,0,1,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,0,1,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,0,1,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,0,1,a388ed70-a68d-4713-a280-881315351f07,a388ed70-a68d-4713-a280-881315351f07,0,1,fd9e84c9-2322-4aa7-b5fe-31d0c8f373c7,fd9e84c9-2322-4aa7-b5fe-31d0c8f373c7,0,1,2c81edc8-02b9-42dd-be4d-e7ad595421a0,2c81edc8-02b9-42dd-be4d-e7ad595421a0,0,1,83cb38ff-1174-449f-b8ce-44d5e064f2df,83cb38ff-1174-449f-b8ce-44d5e064f2df,0,1,d11b51ac-708a-4ee1-b73e-ae62e162101e,d11b51ac-708a-4ee1-b73e-ae62e162101e,0,1,17a50950-6091-4306-9f15-2a621a29c1a0,17a50950-6091-4306-9f15-2a621a29c1a0,0,1,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,0,1,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,0,1,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,0,1,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,0,1,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,0,1,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,0,1,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,0,1,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,0,1,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,0,1,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,0,1,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,0,1,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,0,1,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,0,1,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,0,1,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,0,1,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,0,1,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,0,1,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,0,1,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,0,1,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,0,1,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,0,1,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,0,1,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,0,1,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,0,1,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,0,1,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,0,1,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,0,1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,0,1,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,0,1,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,0,1,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,0,1,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,0,1,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,0,1,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,0,1,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,0,1,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,0,1,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,0,1,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,0,1,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,0,1,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,0,1,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,0,1,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,0,1,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,0,1,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,0,1,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,0,1,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,0,1,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,0,1,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,0,1,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,0,1,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,0,1,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,0,1,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,0,1,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,0,1,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,0,1,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,0,1,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,0,1,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,0,1,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,0,1,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,0,1,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,0,1,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,0,1,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,0,1,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,0,1,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,0,1,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,0,1,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,0,1,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,0,1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,0,1,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,0,1,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,0,1,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,0,1,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,0,1,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,0,1,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,0,1,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,0,1,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,0,1,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,0,1,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,0,1,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,0,1,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,0,1,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,0,1,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,0,1,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,0,1,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,0,1,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,0,1,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,0,1,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,0,1,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,0,1,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,0,1,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,0,1,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,0,1,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,0,1,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,0,1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,0,1,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,0,1,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,0,1,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,0,1,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,0,1,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,0,1,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,0,1,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,0,1,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,0,1,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,0,1,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,0,1,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,0,1,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,0,1,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,0,1,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,0,1,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,0,1,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,0,1,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,0,1,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,0,1,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,0,1,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,0,1,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,0,1,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,0,1,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,0,1,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,0,1,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,0,1,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,0,1,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,0,1,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,0,1,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,0,1,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,0,1,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,0,1,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,0,1,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,0,1,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,0,1,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,0,1,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,0,1,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,0,1,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,0,1,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,0,1,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,0,1,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,0,1,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,0,1,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,0,1,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,0,1,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,0,1,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,0,1,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,0,1,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,0,1,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,0,1,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,0,1,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,0,1,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,0,1,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,0,1,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,0,1,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,0,1,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,0,1,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,0,1,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,0,1,029e7c7a-5b50-4d38-9fd0-d8a5a15b38ec,029e7c7a-5b50-4d38-9fd0-d8a5a15b38ec,0,1,506bf43b-f7df-4b42-b614-e5925b45b5e9,506bf43b-f7df-4b42-b614-e5925b45b5e9,0,1,58570514-a2cf-4e09-ba7a-d9efd8178269,58570514-a2cf-4e09-ba7a-d9efd8178269,0,1,c23aa057-42f4-4167-9224-693e904598c6,c23aa057-42f4-4167-9224-693e904598c6,0,1,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,0,1,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,0,1,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0,1,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,0,1,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,0,1,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,0,1,8e755ce0-c571-4ed5-b0bb-9470edcb7c73,8e755ce0-c571-4ed5-b0bb-9470edcb7c73,0,1,02e1c293-7302-4751-a248-4bbeed9cbad5,02e1c293-7302-4751-a248-4bbeed9cbad5,0,1,c946cde8-c0d7-4acb-a3be-8858e392fc40,c946cde8-c0d7-4acb-a3be-8858e392fc40,0,1,3a111e0d-6466-46fd-95a2-1798b6e51ba0,3a111e0d-6466-46fd-95a2-1798b6e51ba0,0,1,645edcb0-e358-4d32-a9a9-9534af0398ca,645edcb0-e358-4d32-a9a9-9534af0398ca,0,1,efa1b4e5-d16c-4921-a48a-fe700e39dc71,efa1b4e5-d16c-4921-a48a-fe700e39dc71,0,1,e93402db-e7dd-465e-8c62-2a41efd811b8,e93402db-e7dd-465e-8c62-2a41efd811b8,0,1,e0157f72-a362-4b9f-a272-68ca8078b91c,e0157f72-a362-4b9f-a272-68ca8078b91c,0,1,422155c7-1640-48c4-bb21-36595b405c66,422155c7-1640-48c4-bb21-36595b405c66,0,1,16d37b5a-88db-4787-b2de-fb50da0ca94b,16d37b5a-88db-4787-b2de-fb50da0ca94b,0,1,f653bcbf-5659-4605-9bb9-3737f19e79dd,f653bcbf-5659-4605-9bb9-3737f19e79dd,0,1,8b980868-fe63-49ff-ba3d-4c29732e1b90,8b980868-fe63-49ff-ba3d-4c29732e1b90,0,1,54668731-4963-4ec3-b188-9feacaefa182,54668731-4963-4ec3-b188-9feacaefa182,0,1,3702135e-5380-4ca6-82f5-63eff1b043e9,3702135e-5380-4ca6-82f5-63eff1b043e9,0,1,29b2104b-fd02-4d51-951f-51ea213b8ebd,29b2104b-fd02-4d51-951f-51ea213b8ebd,0,1,ba5c945e-554f-45a2-a2de-3157b2d7e931,ba5c945e-554f-45a2-a2de-3157b2d7e931,0,1,f7085f33-f122-4443-a3f5-4e765300175e,f7085f33-f122-4443-a3f5-4e765300175e,0,1,b7e4c512-b856-4679-a025-5f0f28918593,b7e4c512-b856-4679-a025-5f0f28918593,0,1,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,0,1,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,0,1,a9362ac4-85ee-4214-80c1-048fab769885,a9362ac4-85ee-4214-80c1-048fab769885,0,1,a4e89d2a-d6f7-4966-ac3c-57f1ef1d1a3a,a4e89d2a-d6f7-4966-ac3c-57f1ef1d1a3a,0,1,20f1114a-0b98-464f-aed8-80ce706b808e,20f1114a-0b98-464f-aed8-80ce706b808e,0,1,988b05ae-987a-4433-b446-bcc7bf5d9ea4,988b05ae-987a-4433-b446-bcc7bf5d9ea4,0,1,07e3de4e-28d9-48dc-9253-a2c39c34f827,07e3de4e-28d9-48dc-9253-a2c39c34f827,0,1,241db5c5-e3bc-4db8-bc88-39db84bb60e9,241db5c5-e3bc-4db8-bc88-39db84bb60e9,0,1,c147916d-1fb6-473d-bde0-8dd528dde8eb,c147916d-1fb6-473d-bde0-8dd528dde8eb,0,1,00359e00-aba0-4afb-8b58-2e1247dbe04f,00359e00-aba0-4afb-8b58-2e1247dbe04f,0,1,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,0,1,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0,1,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,0,1,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,0,1,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,0,1,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,0,1,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,0,1,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0,1,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,0,1,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,0,1,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,0,1,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,0,1,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,0,1,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,0,1,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0,1,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,0,1,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,0,1,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,0,1,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,0,1,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,0,1,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,0,1,a75ed1c8-20c2-49a8-a730-22237ef91366,a75ed1c8-20c2-49a8-a730-22237ef91366,0,1,1c0ebdfd-1913-48fe-b80a-10c30201129b,1c0ebdfd-1913-48fe-b80a-10c30201129b,0,1,22ad3db7-1ad3-4868-8598-b0b90db3fa1f,22ad3db7-1ad3-4868-8598-b0b90db3fa1f,0,1,14025e38-09af-43b2-a49b-403e398a28ea,14025e38-09af-43b2-a49b-403e398a28ea,0,1,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,0,1,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,0,1,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,0,1,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,0,1,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,0,1,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,0,1,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,0,1,d5012e69-89bc-40af-8e4f-377a042854ee,d5012e69-89bc-40af-8e4f-377a042854ee,0,1,02f79fd8-5315-4c90-b520-db67dcb6e371,02f79fd8-5315-4c90-b520-db67dcb6e371,0,1,7f90681d-6534-40ee-bbb7-5356c0ed9de2,7f90681d-6534-40ee-bbb7-5356c0ed9de2,0,1,d1aca4be-1e1e-4bbd-b0a6-a68bc7c8c586,d1aca4be-1e1e-4bbd-b0a6-a68bc7c8c586,0,1,9bb52788-4a3a-48b5-a551-5ca753b6c059,9bb52788-4a3a-48b5-a551-5ca753b6c059,0,1,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,0,1,872a0c47-fab5-4a54-8ab9-23940bbdefbb,872a0c47-fab5-4a54-8ab9-23940bbdefbb,0,1,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,0,1,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,0,1,ec1755ed-d203-4548-9f1d-dd62ce331ecf,ec1755ed-d203-4548-9f1d-dd62ce331ecf,0,1,4d83ed3c-755c-4b9b-a2b8-17fa2c5c3a61,4d83ed3c-755c-4b9b-a2b8-17fa2c5c3a61,0,1,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,0,1,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,0,1,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,0,1,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,0,1,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,0,1,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,0,1,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,0,1,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,0,1,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,0,1,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,0,1,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,0,1,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,0,1,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,0,1,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,0,1,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,0,1,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,0,1,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,0,1,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,0,1,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,0,1,5083530c-9a24-4def-99c1-6eb9514e9b33,5083530c-9a24-4def-99c1-6eb9514e9b33,0,1,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,0,1,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,0,1,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,0,1,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,0,1,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,0,1,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,0,1,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,0,1,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0,1,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,0,1,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,0,1,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,0,1,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,0,1,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,0,1,1a4991f8-7832-4ca9-8809-88a97de88749,1a4991f8-7832-4ca9-8809-88a97de88749,0,1,4f44c1c0-0480-415e-8058-41b28f2f43a0,4f44c1c0-0480-415e-8058-41b28f2f43a0,0,1,3b708ec7-6543-40ff-8ea2-16d4ddb7d56f,3b708ec7-6543-40ff-8ea2-16d4ddb7d56f,0,1,433e502d-ab5c-4e8e-a7c0-0fde1aa6f767,433e502d-ab5c-4e8e-a7c0-0fde1aa6f767,0,1,6bd65f02-9531-4dd4-bd4a-4132aa3c4787,6bd65f02-9531-4dd4-bd4a-4132aa3c4787,0,1,5d9863e6-aab7-4808-a516-8bc42dae5d01,5d9863e6-aab7-4808-a516-8bc42dae5d01,0,1,a2910bb8-fdd2-480c-8ae2-78661d7d18e0,a2910bb8-fdd2-480c-8ae2-78661d7d18e0,0,1,218302fa-674d-45e1-a7e2-2cce2d011342,218302fa-674d-45e1-a7e2-2cce2d011342,0,1,70264a0a-95c5-426f-a1bf-0f57b86d4030,70264a0a-95c5-426f-a1bf-0f57b86d4030,0,1,ba3ba1ac-e7c6-4bab-9771-4ef522011c52,ba3ba1ac-e7c6-4bab-9771-4ef522011c52,0,1,3291428e-6727-43cc-a1f8-c62f90320e90,3291428e-6727-43cc-a1f8-c62f90320e90,0,1,d867720c-c937-4689-b241-0afda05ef993,d867720c-c937-4689-b241-0afda05ef993,0,1,1390da8f-bac6-44ee-8413-1438f1f66074,1390da8f-bac6-44ee-8413-1438f1f66074,0,1,9616956d-a537-44fd-9d3f-5071fb5f4883,9616956d-a537-44fd-9d3f-5071fb5f4883,0,1,4ad1eed9-89ff-4086-b0ff-4eadcebcdce9,4ad1eed9-89ff-4086-b0ff-4eadcebcdce9,0,1,41d31712-6181-4cfe-9aa4-02b7a50150b0,41d31712-6181-4cfe-9aa4-02b7a50150b0,0,1,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,0,1,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,0,1,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,0,1,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,0,1,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,0,1,6b02f5e0-2b50-492d-ada4-d8fe43b0a748,6b02f5e0-2b50-492d-ada4-d8fe43b0a748,0,1,bbfc7a9c-ac22-47b1-bb18-74993b7ec5b0,bbfc7a9c-ac22-47b1-bb18-74993b7ec5b0,0,1,17dcf8bc-6830-4623-b1b2-9084c5495e20,17dcf8bc-6830-4623-b1b2-9084c5495e20,0,1,a3114825-cf97-4051-907d-9a31e1ac88eb,a3114825-cf97-4051-907d-9a31e1ac88eb,0,1,9886143e-70dd-4c1e-8b00-dc5587403246,9886143e-70dd-4c1e-8b00-dc5587403246,0,1,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,0,1,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,0,1,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,0,1,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,0,1,bb264e83-49f4-4b7a-8be2-094712fc0640,bb264e83-49f4-4b7a-8be2-094712fc0640,0,1,07bf650d-e61e-44f3-9643-6ffc95b913fb,07bf650d-e61e-44f3-9643-6ffc95b913fb,0,1,6b90ed05-813c-4324-8a69-02c2268856b2,6b90ed05-813c-4324-8a69-02c2268856b2,0,1,081ed48d-cb87-459d-97d6-9af121edbabb,081ed48d-cb87-459d-97d6-9af121edbabb,0,1,6c4074b2-f631-451d-b412-1c8c096a71b1,6c4074b2-f631-451d-b412-1c8c096a71b1,0,1,f9931a20-8391-4b13-8c6d-1836f2492e53,f9931a20-8391-4b13-8c6d-1836f2492e53,0,1,c6eec20b-13b9-44a0-968f-1325680c399b,c6eec20b-13b9-44a0-968f-1325680c399b,0,1,02fbf083-1bdd-4900-9dc1-62f415b792a4,02fbf083-1bdd-4900-9dc1-62f415b792a4,0,1,35454c2d-7088-487b-abb3-f95f2dfdcffa,35454c2d-7088-487b-abb3-f95f2dfdcffa,0,1,2178ab47-1bb1-4fe0-940d-6876b66333c1,2178ab47-1bb1-4fe0-940d-6876b66333c1,0,1,8cc09f48-2ef2-434b-b33e-ab9b021816de,8cc09f48-2ef2-434b-b33e-ab9b021816de,0,1,2ca1741b-1e65-4a54-a4a5-489e73cfb4f3,2ca1741b-1e65-4a54-a4a5-489e73cfb4f3,0,1,360b086c-53e3-4514-a4f5-9379ab368b76,360b086c-53e3-4514-a4f5-9379ab368b76,0,1,e6feefa1-7298-4ab0-85d3-9abee571a627,e6feefa1-7298-4ab0-85d3-9abee571a627,0,1,063ef64f-97ec-451e-8470-d3cdf6d08947,063ef64f-97ec-451e-8470-d3cdf6d08947,0,1,b76492d0-17f3-49c0-b23b-6a140122f20f,b76492d0-17f3-49c0-b23b-6a140122f20f,0,1,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,0,1,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,0,1,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,0,1,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,0,1,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,0,1,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,0,1,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,0,1,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,0,1,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,0,1,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,0,1,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,0,1,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,0,1,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,0,1,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,0,1,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,0,1,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,0,1,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0,1,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,0,1,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,0,1,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,0,1,bdc51d67-5fc2-4d28-8875-69e33e625be6,bdc51d67-5fc2-4d28-8875-69e33e625be6,0,1,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,0,1,b494ca7b-6548-4fa2-932c-acdf8c62a78a,b494ca7b-6548-4fa2-932c-acdf8c62a78a,0,1,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,0,1,f335aa38-4e9e-4653-9a76-b6d4ae178c93,f335aa38-4e9e-4653-9a76-b6d4ae178c93,0,1,a62894bc-fab4-4ed4-a57d-cbe725527198,a62894bc-fab4-4ed4-a57d-cbe725527198,0,1,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,0,1,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,0,1,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,0,1,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,0,1,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,0,1,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,0,1,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,0,1,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,0,1,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,0,1,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,0,1,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,0,1,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,0,1,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,0,1,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,0,1,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,0,1,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,0,1,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,0,1,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,0,1,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,0,1,01579044-5659-4a73-a989-c52cfabaae66,01579044-5659-4a73-a989-c52cfabaae66,0,1,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,0,1,6a798c80-459f-49ef-a8c2-83842ce4252c,6a798c80-459f-49ef-a8c2-83842ce4252c,0,1,911baaa1-a4de-4558-b00e-51644144a762,911baaa1-a4de-4558-b00e-51644144a762,0,1,d6400a59-6e02-4212-bb5a-9e49767aa8d6,d6400a59-6e02-4212-bb5a-9e49767aa8d6,0,1,6016d26e-fe39-4c16-b2b5-15f8c663125e,6016d26e-fe39-4c16-b2b5-15f8c663125e,0,1,6c19d9b0-1a41-4f82-a289-9fe05e272079,6c19d9b0-1a41-4f82-a289-9fe05e272079,0,1,df8063e2-47f1-4230-8e3c-eeee2143c72a,df8063e2-47f1-4230-8e3c-eeee2143c72a,0,1,89856ba2-f39a-41cd-be94-61243c6a0b96,89856ba2-f39a-41cd-be94-61243c6a0b96,0,1,8bdb0483-6ea9-4553-91ac-9cde267aae19,8bdb0483-6ea9-4553-91ac-9cde267aae19,0,1,56c9fa68-467b-4c1b-813e-6bc7ac0375cb,56c9fa68-467b-4c1b-813e-6bc7ac0375cb,0,1,bf30f5a1-6542-469f-b3fe-eee726110ffb,bf30f5a1-6542-469f-b3fe-eee726110ffb,0,1,13367a31-c2c9-43ea-b248-8a92e95ecd53,13367a31-c2c9-43ea-b248-8a92e95ecd53,0,1,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,0,1,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,0,1,4e036eff-92a8-4010-89b2-ed949c123311,4e036eff-92a8-4010-89b2-ed949c123311,0,1,38160114-dc22-4d0b-86a5-d650f4756932,38160114-dc22-4d0b-86a5-d650f4756932,0,1,50ee876f-6860-443b-9857-aca772d711ea,50ee876f-6860-443b-9857-aca772d711ea,0,1,6955edb2-d481-432c-b282-58dc07fd067b,6955edb2-d481-432c-b282-58dc07fd067b,0,1,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,0,1,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,0,1,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,0,1,64ac2c2a-2726-4ab9-9a6a-3d08f3fc0618,64ac2c2a-2726-4ab9-9a6a-3d08f3fc0618,0,1,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,0,1,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,0,1,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,0,1,6a675752-fd31-46a5-8a62-2a1ede437c68,6a675752-fd31-46a5-8a62-2a1ede437c68,0,1,8ff109f7-db33-4713-92bf-000f70d2014a,8ff109f7-db33-4713-92bf-000f70d2014a,0,1,97a65f49-845f-4eed-ae81-61266ed3e05b,97a65f49-845f-4eed-ae81-61266ed3e05b,0,1,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,0,1,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,0,1,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,0,1,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,0,1,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,0,1,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0,1,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,0,1,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,0,1,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,0,1,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,0,1,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,0,1,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,0,1,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,0,1,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,0,1,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,0,1,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,0,1,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,0,1,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,0,1,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,0,1,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,0,1,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,0,1,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,0,1,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,0,1,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,0,1,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,0,1,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,0,1,60aaa289-1f07-438c-8f10-81058ac671c3,60aaa289-1f07-438c-8f10-81058ac671c3,0,1,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,0,1,c44b0868-bd7f-4230-973b-544ff4dd2afe,c44b0868-bd7f-4230-973b-544ff4dd2afe,0,1,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,0,1,6236ac73-5b9f-4fb5-bb2c-a5d8e205c5db,6236ac73-5b9f-4fb5-bb2c-a5d8e205c5db,0,1,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,0,1,0153e60e-daca-48ac-b1c6-adecc89f579e,0153e60e-daca-48ac-b1c6-adecc89f579e,0,1,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,0,1,a896bc34-30a6-48b6-acfc-786c24c186bd,a896bc34-30a6-48b6-acfc-786c24c186bd,0,1,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,0,1,da8ae00a-7207-4ceb-b739-9114888c5b27,da8ae00a-7207-4ceb-b739-9114888c5b27,0,1,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,0,1,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0,1,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,0,1,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,0,1,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,0,1,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,0,1,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,0,1,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,0,1,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,0,1,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,0,1,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,0,1,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,0,1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0,1,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,0,1,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,0,1,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,0,1,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,0,1,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,0,1,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,0,1,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,0,1,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,0,1,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,0,1,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,0,1,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,0,1,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,0,1,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,0,1,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,0,1,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,0,1,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,0,1,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,0,1,32eb2a75-ff35-4795-bf0c-12b1328441ee,32eb2a75-ff35-4795-bf0c-12b1328441ee,0,1,8e877990-a64c-4c45-91f1-007d47618cc7,8e877990-a64c-4c45-91f1-007d47618cc7,0,1,73c6640e-2fe6-4132-9237-d6f28cbacc1c,73c6640e-2fe6-4132-9237-d6f28cbacc1c,0,1,46c3341c-352c-43fb-b338-15c8ad487fbf,46c3341c-352c-43fb-b338-15c8ad487fbf,0,1,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,0,1,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,0,1,f9450d6a-849c-4621-b528-9cafc4819b44,f9450d6a-849c-4621-b528-9cafc4819b44,0,1,5b7cac99-2fca-4dbb-8d49-b84f310a2496,5b7cac99-2fca-4dbb-8d49-b84f310a2496,0,1,bb11c22e-0fbd-4985-be67-0866df7f7e61,bb11c22e-0fbd-4985-be67-0866df7f7e61,0,1,a4673d5c-9dae-48f7-9c91-53c1302a266a,a4673d5c-9dae-48f7-9c91-53c1302a266a,0,1,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,0,1,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,0,1,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0,1,3f410b53-e762-41fe-9469-d538dfec3a9a,3f410b53-e762-41fe-9469-d538dfec3a9a,0,1,d08857b9-bc84-48f8-a7a1-09db961427c9,d08857b9-bc84-48f8-a7a1-09db961427c9,0,1,53ea8238-cae6-42c0-b92d-b4539c71c34a,53ea8238-cae6-42c0-b92d-b4539c71c34a,0,1,92ea60c0-1027-4337-9130-40028951f09b,92ea60c0-1027-4337-9130-40028951f09b,0,1,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,0,1,d64f18a4-ff93-4284-9eca-085109eafd24,d64f18a4-ff93-4284-9eca-085109eafd24,0,1,bf428e7a-2970-4bab-8c8e-35ea16151c0e,bf428e7a-2970-4bab-8c8e-35ea16151c0e,0,1,232dbd5f-b7f1-4463-946c-b8fbf93ac466,232dbd5f-b7f1-4463-946c-b8fbf93ac466,0,1,a1a74b34-4174-4769-8f03-bd4a32e83418,a1a74b34-4174-4769-8f03-bd4a32e83418,0,1,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,0,1,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,0,1,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,0,1,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,0,1,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,0,1,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,0,1,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,0,1,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,0,1,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,0,1,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,0,1,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,0,1,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,0,1,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,0,1,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,0,1,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,0,1,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,0,1,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,0,1,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,0,1,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,0,1,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,0,1,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,0,1,8e07a76d-db30-491c-b296-181c8e689382,8e07a76d-db30-491c-b296-181c8e689382,0,1,4f1752ae-42d0-477d-854b-de143c428a85,4f1752ae-42d0-477d-854b-de143c428a85,0,1,1a41acdd-3503-4c69-b93b-eb1cb6749712,1a41acdd-3503-4c69-b93b-eb1cb6749712,0,1,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,0,1,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,0,1,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,0,1,554b1360-d3cb-48c5-bfa6-ebcba5c9afc9,554b1360-d3cb-48c5-bfa6-ebcba5c9afc9,0,1,61b947a5-edca-43ca-82c4-5a7b529d8f82,61b947a5-edca-43ca-82c4-5a7b529d8f82,0,1,59eb6a7a-1d96-4985-8d8e-575162759415,59eb6a7a-1d96-4985-8d8e-575162759415,0,1,68564573-ed49-4519-a8b3-997865fe70a6,68564573-ed49-4519-a8b3-997865fe70a6,0,1,6c789969-d066-489d-ad88-92e2a5a6ec69,6c789969-d066-489d-ad88-92e2a5a6ec69,0,1,2a07d696-75d6-4a12-a310-30d6598b4a4c,2a07d696-75d6-4a12-a310-30d6598b4a4c,0,1,dde88f56-417c-4559-a893-85dc91e7e623,dde88f56-417c-4559-a893-85dc91e7e623,0,1,963eedab-6976-4a98-b9ad-b81f89239661,963eedab-6976-4a98-b9ad-b81f89239661,0,1,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,0,1,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,0,1,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,0,1,36baa776-83c4-413d-b70c-cbbc45e25662,36baa776-83c4-413d-b70c-cbbc45e25662,0,1,b65f9165-c20d-4053-8a0b-cff3f693b762,b65f9165-c20d-4053-8a0b-cff3f693b762,0,1,51af096b-687f-44f4-a0d8-306f670fc5ce,51af096b-687f-44f4-a0d8-306f670fc5ce,0,1,75972f88-aedd-4338-a3b5-320cd632a2e6,75972f88-aedd-4338-a3b5-320cd632a2e6,0,1,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,0,1,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,0,1,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,0,1,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,0,1,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,0,1,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0,1,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,0,1,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,0,1,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,0,1,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,0,1,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,0,1,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,0,1,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,0,1,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,0,1,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,0,1,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,0,1,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,0,1,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,0,1,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,0,1,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,0,1,703453e8-cb49-491b-8e19-a17b89894d1e,703453e8-cb49-491b-8e19-a17b89894d1e,0,1,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,0,1,0c24858a-7e64-426f-9b59-392449aecaf5,0c24858a-7e64-426f-9b59-392449aecaf5,0,1,b1d61e28-f3dc-418b-b5df-f75622a4b980,b1d61e28-f3dc-418b-b5df-f75622a4b980,0,1,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,0,1,4033f86b-d250-475a-8837-071bf31664b0,4033f86b-d250-475a-8837-071bf31664b0,0,1,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,0,1,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,0,1,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,0,1,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,0,1,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,0,1,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,0,1,b57eca91-04c2-4412-b5e2-f3c71f8ec602,b57eca91-04c2-4412-b5e2-f3c71f8ec602,0,1,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,0,1,744a52c8-6e4d-4356-a35a-3d2b01ad4a9f,744a52c8-6e4d-4356-a35a-3d2b01ad4a9f,0,1,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,0,1,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,0,1,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,0,1,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,0,1,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,0,1,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,0,1,0544376f-461c-42c3-a102-e0ae65e3c0c6,0544376f-461c-42c3-a102-e0ae65e3c0c6,0,1,6df8d316-6ac3-4626-8951-1ad36d7049ed,6df8d316-6ac3-4626-8951-1ad36d7049ed,0,1,f211b418-899d-4220-a14b-4a7302183e46,f211b418-899d-4220-a14b-4a7302183e46,0,1,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,0,1,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,0,1,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,0,1,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,0,1,c7b89521-f006-4749-b213-d7f7b0c8a004,c7b89521-f006-4749-b213-d7f7b0c8a004,0,1,401e8f3a-82a4-4f12-9ff1-27440d0a0ed6,401e8f3a-82a4-4f12-9ff1-27440d0a0ed6,0,1,7918eee4-7c9e-4a7a-808e-4ed0fd7bbe41,7918eee4-7c9e-4a7a-808e-4ed0fd7bbe41,0,1,81f8f558-c98b-4999-83f3-4ac06fb79dca,81f8f558-c98b-4999-83f3-4ac06fb79dca,0,1,7b8f082d-0a64-4fad-a33d-af7011a7f33d,7b8f082d-0a64-4fad-a33d-af7011a7f33d,0,1,49f61632-e899-425a-b16a-769f795bdf5f,49f61632-e899-425a-b16a-769f795bdf5f,0,1,c264a337-b573-408a-b77b-c6524ca1687b,c264a337-b573-408a-b77b-c6524ca1687b,0,1,92396874-0d4a-4d8e-b15b-01bc7504d5da,92396874-0d4a-4d8e-b15b-01bc7504d5da,0,1,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,0,1,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,0,1,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,0,1,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,0,1,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,0,1,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,0,1,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,0,1,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,0,1,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,0,1,f8d8f958-bf7b-4070-9b5a-8410b9786cbf,f8d8f958-bf7b-4070-9b5a-8410b9786cbf,0,1,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,0,1,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,0,1,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,0,1,1faacc47-680d-48ac-8933-daa76519f24f,1faacc47-680d-48ac-8933-daa76519f24f,0,1,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,0,1,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,0,1,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,0,1,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0,1,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,0,1,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,0,1,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,0,1,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,0,1,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,0,1,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,0,1,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,0,1,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,0,1,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,0,1,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,0,1,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,0,1,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,0,1,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,0,1,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,0,1,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,0,1,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,0,1,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,0,1,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,0,1,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,0,1,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,0,1,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,0,1,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,0,1,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,0,1,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,0,1,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,0,1,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,0,1,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,0,1,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,0,1,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,0,1,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,0,1,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,0,1,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,0,1,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,0,1,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,0,1,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,0,1,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,0,1,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,0,1,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,0,1,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,0,1,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,0,1,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,0,1,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,0,1,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,0,1,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0,1,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,0,1,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,0,1,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,0,1,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,0,1,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,0,1,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,0,1,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,0,1,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,0,1,d6aed0fd-686c-430d-b884-74494177422e,d6aed0fd-686c-430d-b884-74494177422e,0,1,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,0,1,3ed64288-8bf0-4049-8d44-1b424f31d40f,3ed64288-8bf0-4049-8d44-1b424f31d40f,0,1,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,0,1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,0,1,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,0,1,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,0,1,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0,1,4e892154-3279-492c-9eae-124304225c5d,4e892154-3279-492c-9eae-124304225c5d,0,1,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,0,1,575a135a-6ffd-4ae8-a597-7e584df9bac4,575a135a-6ffd-4ae8-a597-7e584df9bac4,0,1,693a7196-f525-4bd2-a417-e902977f21cb,693a7196-f525-4bd2-a417-e902977f21cb,0,1,9bb39184-08b7-440e-a8f8-5caf0083ba0f,9bb39184-08b7-440e-a8f8-5caf0083ba0f,0,1,d48e817e-f6a4-47e5-a052-35d09e066490,d48e817e-f6a4-47e5-a052-35d09e066490,0,1,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,0,1,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,0,1,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,0,1,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,0,1,b69b611d-18d3-4e78-8a09-f010bcf9c261,b69b611d-18d3-4e78-8a09-f010bcf9c261,0,1,e8e087c1-9131-4037-8562-8bce8c38f78c,e8e087c1-9131-4037-8562-8bce8c38f78c,0,1,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,0,1,6adaef8e-82b6-4664-9748-4f41b170d91a,6adaef8e-82b6-4664-9748-4f41b170d91a,0,1,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,0,1,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,0,1,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,0,1,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,0,1,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,0,1,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,0,1,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,0,1,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,0,1,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,0,1,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,0,1,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,0,1,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,0,1,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,0,1,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,0,1,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,0,1,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,0,1,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,0,1,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,0,1,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,0,1,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,0,1,a27244c2-ac65-423f-afce-42efd288a83d,a27244c2-ac65-423f-afce-42efd288a83d,0,1,d4002184-8e08-4dcc-9070-62f595e82e23,d4002184-8e08-4dcc-9070-62f595e82e23,0,1,62163fda-1a09-4d4f-b290-76ff324042ab,62163fda-1a09-4d4f-b290-76ff324042ab,0,1,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,0,1,6e6a1557-06fa-45c0-ad98-c43809553cd7,6e6a1557-06fa-45c0-ad98-c43809553cd7,0,1,179f7436-e328-42b8-9382-19ee6f10c768,179f7436-e328-42b8-9382-19ee6f10c768,0,1,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,0,1,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,0,1,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,0,1,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,0,1,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,0,1,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,0,1,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,0,1,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,0,1,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,0,1,aec7df6a-21a1-495d-b0a9-3769e1069888,aec7df6a-21a1-495d-b0a9-3769e1069888,0,1,463b98bf-b4d4-4edb-995d-0a75ff29b60d,463b98bf-b4d4-4edb-995d-0a75ff29b60d,0,1,317f88a7-12a4-4d21-b637-3050525406f4,317f88a7-12a4-4d21-b637-3050525406f4,0,1,2d9d2319-68fb-436d-b431-98858b88a75a,2d9d2319-68fb-436d-b431-98858b88a75a,0,1,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,0,1,a8e14d2e-911d-4096-9027-deb7a08838e0,a8e14d2e-911d-4096-9027-deb7a08838e0,0,1,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,0,1,6200ebce-5189-473a-9824-db733d78fcb2,6200ebce-5189-473a-9824-db733d78fcb2,0,1,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,0,1,600092a5-0fc4-4ea1-91bd-8fadcc137d8a,600092a5-0fc4-4ea1-91bd-8fadcc137d8a,0,1,c6e65fa9-3077-43c2-aff7-61cc05760fac,c6e65fa9-3077-43c2-aff7-61cc05760fac,0,1,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,0,1,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,0,1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,0,1,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,0,1,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,0,1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,0,1,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,0,1,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0,1,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,0,1,4ec242e0-75d1-4bf7-be18-783e7aa4f236,4ec242e0-75d1-4bf7-be18-783e7aa4f236,0,1,e02b1366-9d7a-462f-86a1-436bbf4532ff,e02b1366-9d7a-462f-86a1-436bbf4532ff,0,1,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,0,1,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,0,1,8811cc64-99d9-4f13-8309-c29965783f5a,8811cc64-99d9-4f13-8309-c29965783f5a,0,1,7c737071-e850-4a3f-8942-697ef52a8ecc,7c737071-e850-4a3f-8942-697ef52a8ecc,0,1,62eff222-7b74-4cab-9138-880db1f05147,62eff222-7b74-4cab-9138-880db1f05147,0,1,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,0,1,860f8893-22fe-4b13-adb1-24e1ea8c6544,860f8893-22fe-4b13-adb1-24e1ea8c6544,0,1,95266e9f-073f-4de3-83c6-cc0d9ee9334f,95266e9f-073f-4de3-83c6-cc0d9ee9334f,0,1,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,0,1,b6c94efd-5994-4c4c-a641-b062ecc38b65,b6c94efd-5994-4c4c-a641-b062ecc38b65,0,1,98501228-7f0e-45a3-b58f-4c654f393f80,98501228-7f0e-45a3-b58f-4c654f393f80,0,1,502384c9-edb7-451a-b7ea-de006f657a6e,502384c9-edb7-451a-b7ea-de006f657a6e,0,1,4e1a4fe0-dca4-40ba-9369-73be303a4aef,4e1a4fe0-dca4-40ba-9369-73be303a4aef,0,1,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,0,1,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,0,1,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,0,1,50968921-76f3-4108-835a-96b153671c8d,50968921-76f3-4108-835a-96b153671c8d,0,1,b773f510-1485-4886-9071-afcbf49ff856,b773f510-1485-4886-9071-afcbf49ff856,0,1,964403f2-0a87-49e1-b183-dbe3624e3805,964403f2-0a87-49e1-b183-dbe3624e3805,0,1,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,0,1,8b3da21b-ea3f-47cf-af48-15b886b21f20,8b3da21b-ea3f-47cf-af48-15b886b21f20,0,1,32c4750b-0096-4bbc-8dcd-c1f717734233,32c4750b-0096-4bbc-8dcd-c1f717734233,0,1,be6740b1-1f57-4c01-a67a-d48152931dc8,be6740b1-1f57-4c01-a67a-d48152931dc8,0,1,40fd038d-a93a-4be7-9221-d8ae83350ca0,40fd038d-a93a-4be7-9221-d8ae83350ca0,0,1,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,0,1,29adc9e5-a994-48ab-a5a1-919d01119c3a,29adc9e5-a994-48ab-a5a1-919d01119c3a,0,1,c47ffce7-c905-4e88-8b1f-156f47047ccd,c47ffce7-c905-4e88-8b1f-156f47047ccd,0,1,e1755eed-88cf-42c1-83e4-f9047f2c30bf,e1755eed-88cf-42c1-83e4-f9047f2c30bf,0,1,c6ec9d48-9131-4735-9cf7-b498705a57e4,c6ec9d48-9131-4735-9cf7-b498705a57e4,0,1,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,0,1,706c421a-74ce-4985-9443-b4a2032481f6,706c421a-74ce-4985-9443-b4a2032481f6,0,1,64da4c24-4aaf-42c8-8595-7f60ff3bc344,64da4c24-4aaf-42c8-8595-7f60ff3bc344,0,1,fb9577e1-00d9-4d52-8de9-23914929a683,fb9577e1-00d9-4d52-8de9-23914929a683,0,1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,0,1,529253ae-9c92-4426-b150-8444ba622f89,529253ae-9c92-4426-b150-8444ba622f89,0,1,06a1955a-2ef0-4607-9dcb-a480a7951af7,06a1955a-2ef0-4607-9dcb-a480a7951af7,0,1,6f8fcc96-bfed-444a-908d-95c5b1c64972,6f8fcc96-bfed-444a-908d-95c5b1c64972,0,1,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,0,1,a84c89d9-2cfe-405f-9bb0-5392b3171695,a84c89d9-2cfe-405f-9bb0-5392b3171695,0,1,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,0,1,91e26e73-027f-4a10-9083-e5182e768723,91e26e73-027f-4a10-9083-e5182e768723,0,1,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,0,1,54433668-4391-4dea-8baf-43e9aa1d624e,54433668-4391-4dea-8baf-43e9aa1d624e,0,1,fc309616-060a-42c3-8401-dfef0f359bc5,fc309616-060a-42c3-8401-dfef0f359bc5,0,1,b968398d-973d-4643-95a5-16633d7e48bc,b968398d-973d-4643-95a5-16633d7e48bc,0,1,b9507495-2536-4895-b68b-62acd74343f6,b9507495-2536-4895-b68b-62acd74343f6,0,1,e05a14cc-9051-4c38-9725-19856e36d260,e05a14cc-9051-4c38-9725-19856e36d260,0,1,8154aa0f-ecd6-4ab0-9498-56ef25486a55,8154aa0f-ecd6-4ab0-9498-56ef25486a55,0,1,9d6429f7-23da-4596-822a-04818deb3088,9d6429f7-23da-4596-822a-04818deb3088,0,1,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,0,1,acb533e7-4610-4f92-b548-1a4ff1a423d4,acb533e7-4610-4f92-b548-1a4ff1a423d4,0,1,8697999d-9cdb-43d8-979b-3f283daffdd3,8697999d-9cdb-43d8-979b-3f283daffdd3,0,1,23378687-249c-4ec6-99b8-b13fb04b8643,23378687-249c-4ec6-99b8-b13fb04b8643,0,1,66315b12-7abf-46e0-a994-894b827b1301,66315b12-7abf-46e0-a994-894b827b1301,0,1,dba174fb-8392-4451-8069-ae8145658e34,dba174fb-8392-4451-8069-ae8145658e34,0,1,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,0,1,4435d99d-a1df-43e6-97ab-5e651017c61d,4435d99d-a1df-43e6-97ab-5e651017c61d,0,1,fb58d277-b2a5-4a72-8d45-170c6f6263f9,fb58d277-b2a5-4a72-8d45-170c6f6263f9,0,1,325ed391-8558-4f03-9784-cde1f2a32944,325ed391-8558-4f03-9784-cde1f2a32944,0,1,f6cda05a-0f8f-4aa2-9686-1735c4207db3,f6cda05a-0f8f-4aa2-9686-1735c4207db3,0,1,0761ea58-8358-49ba-8e2d-e6afe88f6899,0761ea58-8358-49ba-8e2d-e6afe88f6899,0,1,da09e340-7cc0-4830-917a-5a59c42bbbf7,da09e340-7cc0-4830-917a-5a59c42bbbf7,0,1,c325aa12-9564-4033-8d3e-3103df55427f,c325aa12-9564-4033-8d3e-3103df55427f,0,1,9f4d4834-6994-4573-b99d-a5051746e5f9,9f4d4834-6994-4573-b99d-a5051746e5f9,0,1,c8ef3db5-2562-4f80-a679-86c2ba288ebf,c8ef3db5-2562-4f80-a679-86c2ba288ebf,0,1,2398d69d-ecdd-4d34-bdae-34ed5507a61e,2398d69d-ecdd-4d34-bdae-34ed5507a61e,0,1,a707035a-0172-4b55-b589-fa4a8be9b596,a707035a-0172-4b55-b589-fa4a8be9b596,0,1,c4456e94-8c76-49b1-b85a-433e0f65bdb0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,0,1,4a347209-3a07-48ea-b407-6ee37f1d69f2,4a347209-3a07-48ea-b407-6ee37f1d69f2,0,1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,0,1,df31eee8-387d-40d1-98df-1f7d8176b50e,df31eee8-387d-40d1-98df-1f7d8176b50e,0,1,c8364283-5525-4bef-8e96-abced54c6a4a,c8364283-5525-4bef-8e96-abced54c6a4a,0,1,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,0,1,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,0,1,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,0,1,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,0,1,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,0,1,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,0,1,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,0,1,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,0,1,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,0,1,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,0,1,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,0,1,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,0,1,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,0,1,83d23220-0226-4efe-a81c-6809459443a2,83d23220-0226-4efe-a81c-6809459443a2,0,1,ee30252f-ea25-4d50-b49c-163514bee342,ee30252f-ea25-4d50-b49c-163514bee342,0,1,02afc219-6b86-4282-ab6f-2688203542b7,02afc219-6b86-4282-ab6f-2688203542b7,0,1,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,0,1,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,0,1,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0,1,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,0,1,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,0,1,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,0,1,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,0,1,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,0,1,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,0,1,f71bd0e8-8784-452e-bea9-3696c875d69d,f71bd0e8-8784-452e-bea9-3696c875d69d,0,1,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,0,1,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,0,1,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,0,1,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,0,1,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,0,1,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,0,1,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,0,1,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,0,1,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,0,1,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,0,1,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,0,1,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,0,1,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,0,1,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,0,1,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,0,1,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,0,1,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,0,1,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,0,1,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,0,1,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,0,1,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,0,1,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,0,1,98422d20-9a71-40e4-966e-6958d44eaefb,98422d20-9a71-40e4-966e-6958d44eaefb,0,1,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,0,1,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,0,1,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,0,1,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,0,1,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,0,1,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0,1,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,0,1,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,0,1,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,0,1,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0,1,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,0,1,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,0,1,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,0,1,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,0,1,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,0,1,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,0,1,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,0,1,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,0,1,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,0,1,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,0,1,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,0,1,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,0,1,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,0,1,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,0,1,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,0,1,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,0,1,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,0,1,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0,1,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,0,1,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,0,1,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,0,1,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,0,1,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,0,1,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,0,1,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,0,1,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,0,1,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,0,1,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,0,1,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,0,1,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,0,1,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,0,1,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,0,1,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,0,1,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,0,1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,0,1,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,0,1,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,0,1,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,0,1,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,0,1,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,0,1,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,0,1,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,0,1,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,0,1,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,0,1,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,0,1,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,0,1,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,0,1,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,0,1,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,0,1,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,0,1,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0,1,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,0,1,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file +{6,1,1,09fd0c7d-b8b9-4578-b82b-1395e59538e0,1,d89b8c93-e278-49ee-b8ef-11b158ebd816,"2.2.1.35","Фирма ""1С""","БиблиотекаСтандартныхПодсистем",4418,1,0,28abc37f-78f7-42d8-8794-05a2bde17d21,28abc37f-78f7-42d8-8794-05a2bde17d21,0,1,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,db4a9ccb-9ef5-4b3c-8577-b6fe5db1b62e,0,1,9233322b-dfdb-4c66-91fe-1299292d40a5,9233322b-dfdb-4c66-91fe-1299292d40a5,0,1,0421b67e-ed26-491d-ab98-ec59002ed4ce,0421b67e-ed26-491d-ab98-ec59002ed4ce,0,1,bb47ced2-31f9-4870-8633-20b986e53ccc,bb47ced2-31f9-4870-8633-20b986e53ccc,0,1,7d8acec9-f5a9-411e-921c-446ed0dd3332,7d8acec9-f5a9-411e-921c-446ed0dd3332,0,1,739c01a9-1125-45ef-ab4e-8c73af4eeff0,739c01a9-1125-45ef-ab4e-8c73af4eeff0,0,1,cdbd26b1-9583-46e8-adf7-8cc705639892,cdbd26b1-9583-46e8-adf7-8cc705639892,0,1,c0e38c3e-7088-4e35-9d84-2d0ab9655402,c0e38c3e-7088-4e35-9d84-2d0ab9655402,0,1,1098786f-dd24-4cce-b212-be0cb5f01735,1098786f-dd24-4cce-b212-be0cb5f01735,0,1,3c0037f3-4422-4836-b116-8c72e32bdd55,3c0037f3-4422-4836-b116-8c72e32bdd55,0,1,6f7c6c31-206b-4010-bdad-1ad2e304f154,6f7c6c31-206b-4010-bdad-1ad2e304f154,0,1,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,a8659e53-8c6b-4b0c-9736-fe93a91e4d69,0,1,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,fe9a1d1a-19c0-499f-8e1b-09cadabe882f,0,1,b4629308-42de-4ce8-8591-cf0c2399a9a2,b4629308-42de-4ce8-8591-cf0c2399a9a2,0,1,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,c7e984ae-1dbb-4041-b18a-bfd0d63a002f,0,1,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,bb0424b8-dfd1-4a27-bd66-9dea3ffc77c4,0,1,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,a4ac0a50-ee39-4dc1-b84f-eec8fe485f03,0,1,1861ee4f-fd8c-4afa-8441-c074bf51f67e,1861ee4f-fd8c-4afa-8441-c074bf51f67e,0,1,b93b8760-6200-40ee-8bdc-875ba80a6155,b93b8760-6200-40ee-8bdc-875ba80a6155,0,1,e8b248d9-9049-456a-9c7d-7a0462cc67ab,e8b248d9-9049-456a-9c7d-7a0462cc67ab,0,1,d4562287-440d-4462-9de2-7097ccbf3764,d4562287-440d-4462-9de2-7097ccbf3764,0,1,ec797c75-02c5-4cf5-9dd4-26cd46c99519,ec797c75-02c5-4cf5-9dd4-26cd46c99519,0,1,6fccdf59-fc99-4a2b-a144-fffe438a147c,6fccdf59-fc99-4a2b-a144-fffe438a147c,0,1,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,af8bd73a-d8e8-487d-8f36-d835ab10ea3a,0,1,9e36087a-baa8-4812-956a-6e1ac73aa7e0,9e36087a-baa8-4812-956a-6e1ac73aa7e0,0,1,da9b32e6-5b93-45a6-84b2-238d57541e18,da9b32e6-5b93-45a6-84b2-238d57541e18,0,1,e43d69c8-b284-47da-b236-611bc94a15b6,e43d69c8-b284-47da-b236-611bc94a15b6,0,1,31eeaa05-6c49-41fe-b840-1edbad4ccac7,31eeaa05-6c49-41fe-b840-1edbad4ccac7,0,1,842c8662-8f39-405e-9665-cbdabc116159,842c8662-8f39-405e-9665-cbdabc116159,0,1,fca4b033-02c4-4d61-9e51-87783c3cef1a,fca4b033-02c4-4d61-9e51-87783c3cef1a,0,1,396ef757-d7f6-411f-8c4c-1acb1106a009,396ef757-d7f6-411f-8c4c-1acb1106a009,0,1,cb8da2f3-f8bb-4736-8381-7c153670e3e2,cb8da2f3-f8bb-4736-8381-7c153670e3e2,0,1,9aecf4f5-46ed-4d1c-a584-cd028e467895,9aecf4f5-46ed-4d1c-a584-cd028e467895,0,1,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,a1c379be-43d3-4e02-83bb-d2e7de2d4ae3,0,1,a1f10624-22e9-4a04-b370-fd085bdd0f67,a1f10624-22e9-4a04-b370-fd085bdd0f67,0,1,3323ca68-1382-4710-a933-23fc56588935,3323ca68-1382-4710-a933-23fc56588935,0,1,d6b12775-3255-42b8-88b2-62684f873e7d,d6b12775-3255-42b8-88b2-62684f873e7d,0,1,cc23d903-ccc5-42f4-862f-5e7278c4e346,cc23d903-ccc5-42f4-862f-5e7278c4e346,0,1,98f033e0-fa40-46e0-b51a-87a066749a35,98f033e0-fa40-46e0-b51a-87a066749a35,0,1,c53df2d1-4564-47a7-b66e-6a23ba28270e,c53df2d1-4564-47a7-b66e-6a23ba28270e,0,1,e8b4cb2d-1180-4101-954a-4cb5464f198c,e8b4cb2d-1180-4101-954a-4cb5464f198c,0,1,f765c4ba-c677-42ac-8d0c-43bb485405b9,f765c4ba-c677-42ac-8d0c-43bb485405b9,0,1,83192b3e-e7a9-4595-8887-24cda84457a9,83192b3e-e7a9-4595-8887-24cda84457a9,0,1,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,2fd1287d-d96d-4480-baf7-8815ae5ffbfb,0,1,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,c8a4c5da-bc88-4f6e-9787-1c22c2f41be7,0,1,08eeb8f1-944f-4450-83f6-ef20aaab7d86,08eeb8f1-944f-4450-83f6-ef20aaab7d86,0,1,cbfef589-e7fb-4cbc-9103-e234861879ac,cbfef589-e7fb-4cbc-9103-e234861879ac,0,1,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,8d77dd4a-e646-4105-8dcf-8ce8fc3da0b4,0,1,52176b25-0232-4326-9548-495db32b2660,52176b25-0232-4326-9548-495db32b2660,0,1,2fd12dba-5311-4f31-949c-f6b15decc0cc,2fd12dba-5311-4f31-949c-f6b15decc0cc,0,1,d7cf3981-cf63-4a21-868b-8175a7704a8f,d7cf3981-cf63-4a21-868b-8175a7704a8f,0,1,35895e12-52b6-49a1-acdf-6d828a948af0,35895e12-52b6-49a1-acdf-6d828a948af0,0,1,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0ae93712-74e8-41c7-8f2d-4dfc8983697d,0,1,060b6f18-538c-4ea1-9748-00efe0b1ab57,060b6f18-538c-4ea1-9748-00efe0b1ab57,0,1,307b6821-fd82-4a1c-9fdb-a26293d4f713,307b6821-fd82-4a1c-9fdb-a26293d4f713,0,1,a952960b-be1b-4ec4-bd76-80915065a60b,a952960b-be1b-4ec4-bd76-80915065a60b,0,1,64f548c8-c1fc-434e-b3ee-5be367ead1db,64f548c8-c1fc-434e-b3ee-5be367ead1db,0,1,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,9e4dfdfa-ec05-4c9e-89bd-fc24f60f2678,0,1,cd592a5d-b184-4558-8a28-7079ccf28b89,cd592a5d-b184-4558-8a28-7079ccf28b89,0,1,2009c673-c1a5-45fc-8da2-a36c435085a6,2009c673-c1a5-45fc-8da2-a36c435085a6,0,1,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,ab7e5f9a-1dfe-4165-a540-21f45ae1d94d,0,1,5d16e042-3889-4851-86f1-bc43bf06ee88,5d16e042-3889-4851-86f1-bc43bf06ee88,0,1,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,e5a0e7c2-6186-43a3-a1c5-1f16990602a4,0,1,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,3d47838b-e1aa-4acb-96bf-6de2f9be8bdb,0,1,e39ecc8a-ce81-483d-85de-b0488c8b7749,e39ecc8a-ce81-483d-85de-b0488c8b7749,0,1,1514eaff-faea-4d82-9465-d0d5292bb31d,1514eaff-faea-4d82-9465-d0d5292bb31d,0,1,6d39c6df-8cd4-47ad-9125-252b37d94575,6d39c6df-8cd4-47ad-9125-252b37d94575,0,1,739bd762-01fc-41a8-87df-844eb201962f,739bd762-01fc-41a8-87df-844eb201962f,0,1,7ef99dd3-d799-4f53-ab56-5528b4c9d782,7ef99dd3-d799-4f53-ab56-5528b4c9d782,0,1,ad7c6165-2e44-4808-a77a-526882cf5dea,ad7c6165-2e44-4808-a77a-526882cf5dea,0,1,b7e435a9-6107-4d02-a949-cff793462e31,b7e435a9-6107-4d02-a949-cff793462e31,0,1,f0cda8f5-56f5-423b-8c1c-7113433ebf25,f0cda8f5-56f5-423b-8c1c-7113433ebf25,0,1,1a220e88-428b-4d85-926d-e572bf19997c,1a220e88-428b-4d85-926d-e572bf19997c,0,1,ca0d938b-244e-421f-9fa4-320784b9f416,ca0d938b-244e-421f-9fa4-320784b9f416,0,1,a108b11d-a489-4684-84ea-d5377c7394de,a108b11d-a489-4684-84ea-d5377c7394de,0,1,289a2d84-2477-4177-a6ef-507e2cadeea2,289a2d84-2477-4177-a6ef-507e2cadeea2,0,1,757b547b-b79c-459a-a64a-eef19a09a38f,757b547b-b79c-459a-a64a-eef19a09a38f,0,1,61cd6eab-6bab-4382-986e-4c7fc44f369b,61cd6eab-6bab-4382-986e-4c7fc44f369b,0,1,cbbe7903-842c-470e-a2d6-7928df8f13e9,cbbe7903-842c-470e-a2d6-7928df8f13e9,0,1,e02597c4-bf45-4bb6-931d-62d2244f6c58,e02597c4-bf45-4bb6-931d-62d2244f6c58,0,1,42544966-445d-41b8-b6a0-a52c64758232,42544966-445d-41b8-b6a0-a52c64758232,0,1,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,a92d8a5c-b595-4c6c-9f1d-5e85b1c996b4,0,1,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,bd68dd13-66bb-40ed-8f4b-0767b7063ffd,0,1,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,e07ac651-07b9-4664-95e8-f3f5a51ea6c8,0,1,0c44fdea-7b81-45be-87f5-d64456a9d379,0c44fdea-7b81-45be-87f5-d64456a9d379,0,1,d09d6f21-cdd0-485e-bd2c-92092a1aefef,d09d6f21-cdd0-485e-bd2c-92092a1aefef,0,1,2fc92784-d7b0-4209-ba06-e54bed2f160f,2fc92784-d7b0-4209-ba06-e54bed2f160f,0,1,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,e5b8ea5c-1d08-4f0a-a8f6-358b41e2e9f2,0,1,a4e4c91c-fd95-4369-98e3-51ffba79937b,a4e4c91c-fd95-4369-98e3-51ffba79937b,0,1,0d0ada8a-09bb-4634-bf50-199f3779dad5,0d0ada8a-09bb-4634-bf50-199f3779dad5,0,1,d343d4e4-d07f-48c3-9db1-774b0d6c1134,d343d4e4-d07f-48c3-9db1-774b0d6c1134,0,1,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,14ef2331-6d9b-4cf1-90f3-7d4ac410439d,0,1,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,04ab13b1-ffc2-47f5-aa0d-5850dcbd4a62,0,1,968588bb-ee60-4399-955a-3ec4228d3c40,968588bb-ee60-4399-955a-3ec4228d3c40,0,1,23dbb528-7ea8-44ae-a1f2-b7608118666e,23dbb528-7ea8-44ae-a1f2-b7608118666e,0,1,b9627855-6773-4a59-b7d3-f9e2e565cd9e,b9627855-6773-4a59-b7d3-f9e2e565cd9e,0,1,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,ad87bd29-0ad1-4da4-ac62-38e714e0cb9f,0,1,283ce432-3553-4de9-94a2-ca9a590437f5,283ce432-3553-4de9-94a2-ca9a590437f5,0,1,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,7102d4fa-92f2-4fba-ad09-a33dbc71bef2,0,1,34b0e268-497d-44d4-b822-84909d0685aa,34b0e268-497d-44d4-b822-84909d0685aa,0,1,8961a859-2203-4678-ae1f-63e2474a787a,8961a859-2203-4678-ae1f-63e2474a787a,0,1,fe63db47-3ece-4518-b6a2-0b6499f60a61,fe63db47-3ece-4518-b6a2-0b6499f60a61,0,1,654523be-93d9-4faa-9a35-ce2fede13820,654523be-93d9-4faa-9a35-ce2fede13820,0,1,671afc3e-7589-49d8-95a5-1cf195c3b2f8,671afc3e-7589-49d8-95a5-1cf195c3b2f8,0,1,2c8e45b8-7d80-4137-85db-66cd1db94526,2c8e45b8-7d80-4137-85db-66cd1db94526,0,1,47accdc7-8fa0-4996-9305-c42b6ca12df9,47accdc7-8fa0-4996-9305-c42b6ca12df9,0,1,5abc496c-5745-4220-9fdc-bac092717871,5abc496c-5745-4220-9fdc-bac092717871,0,1,93c347d8-66cb-406c-9ee6-b1962482893f,93c347d8-66cb-406c-9ee6-b1962482893f,0,1,7df36398-7752-4f51-9978-1bcb4bcdd062,7df36398-7752-4f51-9978-1bcb4bcdd062,0,1,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,9fd55b7f-209b-4b74-99d6-965b8f6f2df9,0,1,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,f818fde9-1b06-4507-a69f-4dcb0ce8cd7a,0,1,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,a6690ef1-b16a-4d58-bc31-a8089b2c00d8,0,1,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,316f94ec-81ed-4b5c-aa9d-98d2cfe1c641,0,1,f4885af5-6ed6-40e8-81a5-0e9537f943d7,f4885af5-6ed6-40e8-81a5-0e9537f943d7,0,1,87472d14-0d8c-4813-8a3e-2721bbb26811,87472d14-0d8c-4813-8a3e-2721bbb26811,0,1,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,44cf6d0a-0a5b-4ca1-b91e-af61f40fb825,0,1,e8faa1a9-807a-4916-b3c5-76ba2199754c,e8faa1a9-807a-4916-b3c5-76ba2199754c,0,1,99b5c632-61fe-41f5-ac00-ea530633bf28,99b5c632-61fe-41f5-ac00-ea530633bf28,0,1,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,a3c9c4e7-d36a-4db1-bd95-a50886c4be60,0,1,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,4c53f94e-d7e8-457c-b337-59d3b3c5bf24,0,1,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,bd6d7dcd-421c-402e-b6b8-f6ce6b18c140,0,1,485911f7-a964-450d-82da-cab020836eb2,485911f7-a964-450d-82da-cab020836eb2,0,1,cedd0b47-07cb-4dae-86b5-31d396b693c7,cedd0b47-07cb-4dae-86b5-31d396b693c7,0,1,c08391e1-c4e3-42aa-8738-061031d0cb75,c08391e1-c4e3-42aa-8738-061031d0cb75,0,1,bf4c6723-e586-4643-9f03-9e672afea26f,bf4c6723-e586-4643-9f03-9e672afea26f,0,1,23204b0b-bf77-4f7c-9945-e73ad924ebb4,23204b0b-bf77-4f7c-9945-e73ad924ebb4,0,1,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,dd9d3586-775b-4d5b-ab2d-78db0870ecdd,0,1,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,44c610c3-9c0b-4bf0-95d6-f17100d3e98d,0,1,a54f2d41-a05e-4878-80c6-81ca2899fa4c,a54f2d41-a05e-4878-80c6-81ca2899fa4c,0,1,23a898d9-5bcb-4744-ab6c-97b17dc98f20,23a898d9-5bcb-4744-ab6c-97b17dc98f20,0,1,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,50a04251-ac9c-4a21-a37f-ebc9ac3ef233,0,1,f8f56806-ed7e-4059-a0c8-940538c14c98,f8f56806-ed7e-4059-a0c8-940538c14c98,0,1,9ff9f92b-c509-48da-82ce-15b524a895d6,9ff9f92b-c509-48da-82ce-15b524a895d6,0,1,c8bf96c8-f359-4940-8e87-3d190371d6d3,c8bf96c8-f359-4940-8e87-3d190371d6d3,0,1,477f0b81-0eb1-4de1-8cb5-38f1e0823947,477f0b81-0eb1-4de1-8cb5-38f1e0823947,0,1,d914eaa9-ce85-4df7-a545-2d411ef915b0,d914eaa9-ce85-4df7-a545-2d411ef915b0,0,1,41881344-82b7-4904-9ab8-0207d9bcd0a9,41881344-82b7-4904-9ab8-0207d9bcd0a9,0,1,21032fa5-9426-40bd-91e4-ace1e4ceb013,21032fa5-9426-40bd-91e4-ace1e4ceb013,0,1,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,ddfe5401-e136-4f20-aa65-aeb42a61a1f0,0,1,27a80757-c0fd-40c7-ad24-4c819c1ba72b,27a80757-c0fd-40c7-ad24-4c819c1ba72b,0,1,7fce9e49-e558-4760-9d95-dde6ac6c1e78,7fce9e49-e558-4760-9d95-dde6ac6c1e78,0,1,e5aba4a3-6056-4ef3-827c-d74283175393,e5aba4a3-6056-4ef3-827c-d74283175393,0,1,63039e62-7314-42ff-bdc6-c251f38b3827,63039e62-7314-42ff-bdc6-c251f38b3827,0,1,8a4b7aab-b602-4581-8fa4-fab66791f701,8a4b7aab-b602-4581-8fa4-fab66791f701,0,1,7c92c579-4651-4fe3-90dc-6c9b594b76f0,7c92c579-4651-4fe3-90dc-6c9b594b76f0,0,1,a2be2d7a-cca0-460f-a915-dadfb9cd588b,a2be2d7a-cca0-460f-a915-dadfb9cd588b,0,1,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,35bac3e3-1329-4aa6-866f-f6fcaed8cd6e,0,1,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,ed53b24d-5338-4ae1-8659-0ea6450dc7bb,0,1,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,6add2712-48e8-4b22-a7bb-7d8c808ac5fc,0,1,1f4408f5-460e-431b-9842-bc6875ccf0ae,1f4408f5-460e-431b-9842-bc6875ccf0ae,0,1,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,ec09aa2d-758f-4ae8-96b7-0f05b8187dda,0,1,7bfc6163-a62f-45e8-9112-40a5d675ba4a,7bfc6163-a62f-45e8-9112-40a5d675ba4a,0,1,542ff510-0245-4a08-80ac-a9941c66ae93,542ff510-0245-4a08-80ac-a9941c66ae93,0,1,03297623-eaa2-4db0-bf1b-ce2076faf20a,03297623-eaa2-4db0-bf1b-ce2076faf20a,0,1,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,3c6ef64e-c9bd-4cba-98a4-ffcc5b93b6da,0,1,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,700c2edd-c457-47b7-a7d3-5fb3d9078d1f,0,1,82a3802c-b6d6-4511-bd8b-eeec003afa33,82a3802c-b6d6-4511-bd8b-eeec003afa33,0,1,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,8b59dec8-12b8-455f-8dfc-7c3f03b4ffa5,0,1,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,b5eb2e12-c39c-44fa-b940-09b4dcd2817c,0,1,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,5d5ffb56-e18b-4831-94f0-d7a76c2eee6f,0,1,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,590f29f4-2db1-47c6-83a0-f44d4bbe6e3e,0,1,a755cb43-492d-4069-9b6a-29b92ebb5b0e,a755cb43-492d-4069-9b6a-29b92ebb5b0e,0,1,86d09107-f511-4148-b5d9-d97e92addfde,86d09107-f511-4148-b5d9-d97e92addfde,0,1,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,c14c1f91-f4b9-44d6-b560-8dcdb5faf5f9,0,1,55b78834-3d90-4858-a6f7-e0368b1d8c41,55b78834-3d90-4858-a6f7-e0368b1d8c41,0,1,059b9a75-f53a-4518-a48a-afc72ab9ee36,059b9a75-f53a-4518-a48a-afc72ab9ee36,0,1,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,bc0dcb68-bfb8-49f4-8eb4-2ca953d852bd,0,1,31e95872-97c7-49e3-bd1b-8df4de07014d,31e95872-97c7-49e3-bd1b-8df4de07014d,0,1,8b9be02b-cd1f-4231-a895-6c9be26348c2,8b9be02b-cd1f-4231-a895-6c9be26348c2,0,1,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,c52c4b8c-6be7-460a-9b54-6cdf64e3f8fe,0,1,fa4f0b33-5253-4a5f-8121-feae3e1968a6,fa4f0b33-5253-4a5f-8121-feae3e1968a6,0,1,e0d21be2-91dc-4a04-9078-49420ddddcd5,e0d21be2-91dc-4a04-9078-49420ddddcd5,0,1,56c97764-7dba-42e0-8ba0-82712aca20e9,56c97764-7dba-42e0-8ba0-82712aca20e9,0,1,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,03ad9b3d-8f3a-4482-a777-f6a3b3d953d6,0,1,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,3f05dcf9-be52-42e1-b5ff-dea14d97a26f,0,1,ea868745-71fc-483c-aa6e-f242c06c673f,ea868745-71fc-483c-aa6e-f242c06c673f,0,1,7f3c6269-ea41-492f-87b7-7eaaf712762e,7f3c6269-ea41-492f-87b7-7eaaf712762e,0,1,a5d037b0-c666-4179-9d6a-5f48c4a126a8,a5d037b0-c666-4179-9d6a-5f48c4a126a8,0,1,f0850411-4dee-4f1d-baec-7d6c96b10637,f0850411-4dee-4f1d-baec-7d6c96b10637,0,1,12f95031-b81f-4802-b2f3-6f70def90db0,12f95031-b81f-4802-b2f3-6f70def90db0,0,1,5732112a-f31d-41cd-9a7f-312a27395502,5732112a-f31d-41cd-9a7f-312a27395502,0,1,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,bbf8342b-24f0-4d11-bb5a-4c89d5ea7766,0,1,06fc381d-f27a-433c-95c3-e0981e01f22b,06fc381d-f27a-433c-95c3-e0981e01f22b,0,1,f646835e-61eb-4ebd-811e-dac5e70bd1b4,f646835e-61eb-4ebd-811e-dac5e70bd1b4,0,1,61b49c4c-3021-4868-834a-9137476ae169,61b49c4c-3021-4868-834a-9137476ae169,0,1,58911911-5192-45fe-87cf-c4a222a521a1,58911911-5192-45fe-87cf-c4a222a521a1,0,1,70067937-9f27-4442-b87b-6c4576ce1b78,70067937-9f27-4442-b87b-6c4576ce1b78,0,1,115d5d06-a2fc-453e-aab5-c869b6d5850b,115d5d06-a2fc-453e-aab5-c869b6d5850b,0,1,d33ca006-d81d-4ef8-8503-7878e81c599f,d33ca006-d81d-4ef8-8503-7878e81c599f,0,1,123bb339-b95e-44c3-b1e9-482dcaa6f297,123bb339-b95e-44c3-b1e9-482dcaa6f297,0,1,f4119605-beb3-46b6-b372-ecdb74f10a33,f4119605-beb3-46b6-b372-ecdb74f10a33,0,1,d2a2e332-a52c-4277-bd19-5ea8ef198469,d2a2e332-a52c-4277-bd19-5ea8ef198469,0,1,e440c594-14bb-4a6e-af53-a4519c7d5548,e440c594-14bb-4a6e-af53-a4519c7d5548,0,1,4165bdaa-8e27-40de-bcdc-0379c34e8868,4165bdaa-8e27-40de-bcdc-0379c34e8868,0,1,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,a9a3fde2-99d5-4ebf-88b1-eccd9d74276e,0,1,e606f8eb-952a-4abb-b1ae-4211204bed84,e606f8eb-952a-4abb-b1ae-4211204bed84,0,1,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,7ddc3d13-fa6f-4fa9-870e-a34d5b2d9582,0,1,1c2ad932-150a-4b15-b958-62eaa8a1eebc,1c2ad932-150a-4b15-b958-62eaa8a1eebc,0,1,b4deaebf-2c21-47d7-9436-10c94c94667c,b4deaebf-2c21-47d7-9436-10c94c94667c,0,1,f8295f29-2533-4013-981b-240f017d9f7c,f8295f29-2533-4013-981b-240f017d9f7c,0,1,538b316b-3876-4da6-8b97-ad8ef59de17d,538b316b-3876-4da6-8b97-ad8ef59de17d,0,1,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,f70f09fd-59e1-47b6-aaf3-cb4cc4ceaa7e,0,1,ebc5f182-482b-4dec-9961-ce3a448abd0e,ebc5f182-482b-4dec-9961-ce3a448abd0e,0,1,83e618f5-1bf4-474a-9d65-389f1e4b16c3,83e618f5-1bf4-474a-9d65-389f1e4b16c3,0,1,1357512e-3ed3-455d-bc91-81db3b92f9fe,1357512e-3ed3-455d-bc91-81db3b92f9fe,0,1,82223d0f-41d9-45a6-9612-ae4d8408fa1b,82223d0f-41d9-45a6-9612-ae4d8408fa1b,0,1,3ee058a9-aff5-46f0-8928-8a417e7800d4,3ee058a9-aff5-46f0-8928-8a417e7800d4,0,1,c9a03f19-42bb-4e07-8ce8-1b954e431ada,c9a03f19-42bb-4e07-8ce8-1b954e431ada,0,1,ed4edc6f-048a-40d5-8f61-989895c95cf3,ed4edc6f-048a-40d5-8f61-989895c95cf3,0,1,dc17d8b6-d277-43eb-8823-71d440ae1e90,dc17d8b6-d277-43eb-8823-71d440ae1e90,0,1,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,c5b8bf21-5c8f-4e5b-8b85-bfac387ce99a,0,1,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,d9a6706e-3dcd-4aec-b9d1-542330ba6e2e,0,1,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,7cbf0398-2bc7-4f40-9a9e-af4135c6a2d2,0,1,cc770616-f6f6-4054-876c-f319b1f8c6cf,cc770616-f6f6-4054-876c-f319b1f8c6cf,0,1,8486e623-1a54-4ad9-ab44-591b6a559bc3,8486e623-1a54-4ad9-ab44-591b6a559bc3,0,1,dce82d28-9a7b-4d4c-af13-90f459cf4af2,dce82d28-9a7b-4d4c-af13-90f459cf4af2,0,1,cb9f2231-49bb-4b14-a124-8996628afead,cb9f2231-49bb-4b14-a124-8996628afead,0,1,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,dc1b8bce-49c5-4fd2-a597-27f1fbc98648,0,1,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,ac4c6275-3c23-4a1f-b19e-c674fd685e8f,0,1,896de79f-3c34-4436-a4e2-4dd4f45c3e20,896de79f-3c34-4436-a4e2-4dd4f45c3e20,0,1,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,25d118f0-bfb7-4f08-84b1-0511b0fc92e8,0,1,e6c42b5d-57fd-42ce-a968-653620e797f6,e6c42b5d-57fd-42ce-a968-653620e797f6,0,1,724fb328-fec6-4afe-bc99-0ff0951b184b,724fb328-fec6-4afe-bc99-0ff0951b184b,0,1,f6259a3b-98f5-4649-8fd0-da0a0285f375,f6259a3b-98f5-4649-8fd0-da0a0285f375,0,1,c565bf25-c55e-4324-851a-cec497f5114a,c565bf25-c55e-4324-851a-cec497f5114a,0,1,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,b50994d0-23f9-4bf4-93d2-cf9bcffa6fc9,0,1,5b0e250c-4d2d-4e37-ade1-593854610d3f,5b0e250c-4d2d-4e37-ade1-593854610d3f,0,1,148f63d5-23ad-4824-a24c-14d5a54c62d3,148f63d5-23ad-4824-a24c-14d5a54c62d3,0,1,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,d6cdd049-b31b-48aa-a2aa-a24b0bdf3337,0,1,041daf91-e5b3-471d-934d-55229f8a81d6,041daf91-e5b3-471d-934d-55229f8a81d6,0,1,eabfa8b7-fb65-43dd-9308-787f7cce88c9,eabfa8b7-fb65-43dd-9308-787f7cce88c9,0,1,30213cef-b2bc-4e6c-8094-74a61f28b2ed,30213cef-b2bc-4e6c-8094-74a61f28b2ed,0,1,8c72f824-b667-4d74-84aa-30eccfbbd2f0,8c72f824-b667-4d74-84aa-30eccfbbd2f0,0,1,ec7b492d-5d38-4f31-90e0-577ad181514e,ec7b492d-5d38-4f31-90e0-577ad181514e,0,1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,da0686ce-25e2-4d2c-b152-283f5e4cf4b1,0,1,4807629d-8421-4bd9-beb4-5b2940197958,4807629d-8421-4bd9-beb4-5b2940197958,0,1,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,cd6f96c7-33ee-42b1-bb81-ce7d9652337c,0,1,766c7fb5-727e-4975-9ea1-3b0df4739620,766c7fb5-727e-4975-9ea1-3b0df4739620,0,1,ba59393c-c499-4999-91d4-b9e34d94db0e,ba59393c-c499-4999-91d4-b9e34d94db0e,0,1,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,fcf6a4cd-d0c9-4f83-b9b0-514baed3ccb9,0,1,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,3f92cffe-b4ea-45e3-b2b9-a9e316405a8c,0,1,e70a6eab-791f-4c70-bb92-f069c7486d1b,e70a6eab-791f-4c70-bb92-f069c7486d1b,0,1,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,f74f97b7-4cbf-4124-b441-d8bb5d9b1634,0,1,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,a3a9a48b-f241-45b2-b93b-d34bba0a8a66,0,1,f58bffe7-4a02-4c4e-bfed-7895177a400c,f58bffe7-4a02-4c4e-bfed-7895177a400c,0,1,fe285122-2257-4fb2-ab7e-1683c31db1c6,fe285122-2257-4fb2-ab7e-1683c31db1c6,0,1,0facc6eb-a178-45ee-a6bc-4bf085d80453,0facc6eb-a178-45ee-a6bc-4bf085d80453,0,1,f74eef36-9441-4b6f-b21c-de9643832f9f,f74eef36-9441-4b6f-b21c-de9643832f9f,0,1,ac2e5217-aaeb-4b6f-b063-538c84f2da06,ac2e5217-aaeb-4b6f-b063-538c84f2da06,0,1,b5e73fbe-499c-4666-a482-0ef399c97c1e,b5e73fbe-499c-4666-a482-0ef399c97c1e,0,1,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,a0811e0a-91b6-4c4b-a6d2-a57b9185983b,0,1,4ac77dea-3c2b-4566-8857-ba99f7b025c9,4ac77dea-3c2b-4566-8857-ba99f7b025c9,0,1,09fec67d-6e45-428c-b858-9ae20979676c,09fec67d-6e45-428c-b858-9ae20979676c,0,1,58ffc4d9-d711-4b68-905c-d2ac4f78b547,58ffc4d9-d711-4b68-905c-d2ac4f78b547,0,1,94ab750f-46b4-427c-a7f2-4e94fb9b0678,94ab750f-46b4-427c-a7f2-4e94fb9b0678,0,1,397d9926-31a3-4c03-acb7-74478f9863e1,397d9926-31a3-4c03-acb7-74478f9863e1,0,1,264dd12a-b4c5-44bf-b3c0-ef9225505f76,264dd12a-b4c5-44bf-b3c0-ef9225505f76,0,1,90b8fdf3-3e42-442f-a002-6a28ad0edc99,90b8fdf3-3e42-442f-a002-6a28ad0edc99,0,1,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,92f35bea-50b8-4a1c-8fb2-a8c7df7a50db,0,1,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,82ba8c13-6567-4f0c-be0e-0884ce19bbcc,0,1,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,a3e9afe9-1587-47c7-8e7b-b8df6b3a2664,0,1,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0e31d69a-8d2c-4ad0-b3ac-93ba5afcefdf,0,1,89574884-bce2-406d-9961-d1656b306eb8,89574884-bce2-406d-9961-d1656b306eb8,0,1,3de28e34-3c1e-4e7f-a720-3418c8c9c496,3de28e34-3c1e-4e7f-a720-3418c8c9c496,0,1,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,7f2d69b4-2f87-40f4-a78c-fe4cabc2a502,0,1,dacb236e-42a5-47e5-b239-ff18ae48e21e,dacb236e-42a5-47e5-b239-ff18ae48e21e,0,1,5cdb6e71-fd20-461a-83db-d59ccdb5b366,5cdb6e71-fd20-461a-83db-d59ccdb5b366,0,1,388b8576-9ba4-460f-b71b-3d644663656a,388b8576-9ba4-460f-b71b-3d644663656a,0,1,d4d38827-fce6-4c39-a4b4-51c7d7edc475,d4d38827-fce6-4c39-a4b4-51c7d7edc475,0,1,2d40609d-b56f-4082-9a6f-8216817ebd24,2d40609d-b56f-4082-9a6f-8216817ebd24,0,1,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,b238b4b2-beaf-4b5d-a728-8aebac3bacb5,0,1,732b19c8-4f22-4748-a796-71538e46fc2f,732b19c8-4f22-4748-a796-71538e46fc2f,0,1,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,9fb2169b-fc77-4a3f-a1d8-b939079d9d9d,0,1,3fe0ef25-ce56-435d-b343-eadfec91a636,3fe0ef25-ce56-435d-b343-eadfec91a636,0,1,6cb35d15-936f-4ca8-a196-8a9a75ce54dd,6cb35d15-936f-4ca8-a196-8a9a75ce54dd,0,1,74f02619-7fa8-4c6d-81d6-230156ee45f4,74f02619-7fa8-4c6d-81d6-230156ee45f4,0,1,a103cca0-8243-40e9-bcdd-97a1cc8a3943,a103cca0-8243-40e9-bcdd-97a1cc8a3943,0,1,80fd89d7-160d-4528-9aa0-05b8dac64b4c,80fd89d7-160d-4528-9aa0-05b8dac64b4c,0,1,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,4eb24fcd-85f6-4fa6-bc9f-baef3861664e,0,1,da551cf6-4f86-4e37-8967-a84c80e1fb13,da551cf6-4f86-4e37-8967-a84c80e1fb13,0,1,5fb2c120-fd14-4e78-a35f-c8e9478b3235,5fb2c120-fd14-4e78-a35f-c8e9478b3235,0,1,9d514ce1-f9bd-4018-8107-545cdd372fbd,9d514ce1-f9bd-4018-8107-545cdd372fbd,0,1,fe6b732f-3a33-460f-9686-cffdd5f7d99b,fe6b732f-3a33-460f-9686-cffdd5f7d99b,0,1,06250212-aeb1-4cb8-8785-ea71b1dad848,06250212-aeb1-4cb8-8785-ea71b1dad848,0,1,0c068a61-e5e6-4475-96fa-b7c1d825da42,0c068a61-e5e6-4475-96fa-b7c1d825da42,0,1,1047e34d-397a-42cc-80e6-1be755bd6462,1047e34d-397a-42cc-80e6-1be755bd6462,0,1,1cd473c3-4e36-47a9-b466-73d86ec244b0,1cd473c3-4e36-47a9-b466-73d86ec244b0,0,1,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,c3e31dfd-b79b-49b9-9dc0-e2439bfe5ab7,0,1,b406b5f9-eeaf-43a0-8930-067554d783c9,b406b5f9-eeaf-43a0-8930-067554d783c9,0,1,47718840-2939-4e30-a72c-a20c88ac4c17,47718840-2939-4e30-a72c-a20c88ac4c17,0,1,58a38994-9fe4-4783-967d-79d1141b90f3,58a38994-9fe4-4783-967d-79d1141b90f3,0,1,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,6e23a4b2-f53c-41ea-9fef-8f4561b8e0cc,0,1,7c2e35a8-d05d-4e52-baee-a1e13585c502,7c2e35a8-d05d-4e52-baee-a1e13585c502,0,1,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,5d8b60e5-d407-4d8a-b4fb-e26a36ab8180,0,1,f551f78a-2f05-4932-ac33-cfa1b077f46f,f551f78a-2f05-4932-ac33-cfa1b077f46f,0,1,a96091a7-d3a5-4893-8440-f360231bf468,a96091a7-d3a5-4893-8440-f360231bf468,0,1,9ce6eef0-5280-4374-9714-474ac571e4e2,9ce6eef0-5280-4374-9714-474ac571e4e2,0,1,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,aeb54e92-a1d0-46a1-b4cb-87d3c29fa30b,0,1,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,8395bfb2-3cf4-4bec-b19b-eb6dd3aa7a39,0,1,eca79a64-3d00-4178-b4eb-cf5468622c96,eca79a64-3d00-4178-b4eb-cf5468622c96,0,1,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,60cd8bc4-6a5d-4d36-83d0-76a8477eda6a,0,1,6dc4c216-e49f-4833-b45f-6060b67995ef,6dc4c216-e49f-4833-b45f-6060b67995ef,0,1,4655fa12-9169-4d08-bdab-9b3174d0b223,4655fa12-9169-4d08-bdab-9b3174d0b223,0,1,6c07ddfb-8823-4953-9905-9550b847dc3f,6c07ddfb-8823-4953-9905-9550b847dc3f,0,1,2362a8d5-dca2-4527-acc0-63782377f28a,2362a8d5-dca2-4527-acc0-63782377f28a,0,1,dfd6d85c-a734-4458-83b0-87b5949f9c68,dfd6d85c-a734-4458-83b0-87b5949f9c68,0,1,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,4e3b0b9f-45b7-48a8-86c6-cc14a921aa78,0,1,ba5574bd-53ca-413f-a245-272f468a80fb,ba5574bd-53ca-413f-a245-272f468a80fb,0,1,79b6ecf5-8a6b-44a4-9587-5f8764463228,79b6ecf5-8a6b-44a4-9587-5f8764463228,0,1,cd49148c-e385-4b75-a758-a93196e73dba,cd49148c-e385-4b75-a758-a93196e73dba,0,1,ece15c4e-4a4b-421b-9f00-10f698da476b,ece15c4e-4a4b-421b-9f00-10f698da476b,0,1,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,6cb136cd-dc5c-4d85-8a0d-70b9f8bf70d5,0,1,300ecdd6-144f-48c8-9fd4-6166f1de1047,300ecdd6-144f-48c8-9fd4-6166f1de1047,0,1,b6bbfb59-8249-47af-9394-be262f118811,b6bbfb59-8249-47af-9394-be262f118811,0,1,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,15dab650-f7ed-42bc-8ca3-c104c3e68ce4,0,1,fb63d488-fb91-4d08-8f8c-f4836538216f,fb63d488-fb91-4d08-8f8c-f4836538216f,0,1,b8be6c09-6880-45d3-a2d1-06ad72d069c9,b8be6c09-6880-45d3-a2d1-06ad72d069c9,0,1,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,3c1b10c7-3667-43f0-ac03-8cdaa84cb177,0,1,148dd521-8754-451b-803b-cbee7c3d3965,148dd521-8754-451b-803b-cbee7c3d3965,0,1,38bc48c7-3938-47be-be3f-844f19561301,38bc48c7-3938-47be-be3f-844f19561301,0,1,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,4bdd09d5-6bc9-421f-99f0-ae905340f0d4,0,1,147038fb-6154-41f3-aad6-547db27d1e43,147038fb-6154-41f3-aad6-547db27d1e43,0,1,832fa9d3-deab-4c57-b6e2-dee5d24d6100,832fa9d3-deab-4c57-b6e2-dee5d24d6100,0,1,dd4270ef-6b4c-491e-8871-959dbec14c53,dd4270ef-6b4c-491e-8871-959dbec14c53,0,1,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,c2b115d3-04f8-43c8-aed9-c61280b8cc3b,0,1,8ccd9be8-ef26-49b9-8cee-03ae4e500386,8ccd9be8-ef26-49b9-8cee-03ae4e500386,0,1,ddca925c-fdcd-40ce-a504-4fca1758de3f,ddca925c-fdcd-40ce-a504-4fca1758de3f,0,1,f64de21f-5a7c-4a1a-a929-07fc53049f6c,f64de21f-5a7c-4a1a-a929-07fc53049f6c,0,1,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,470cdf43-07f4-46d5-aab2-d41f1e5da3cd,0,1,ea653eca-f96a-447d-8b09-7a7cb6929ed6,ea653eca-f96a-447d-8b09-7a7cb6929ed6,0,1,5efc4bc4-b711-4620-8d2e-9d947c6cc141,5efc4bc4-b711-4620-8d2e-9d947c6cc141,0,1,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,ae52e48c-20ec-43cd-a9a5-b1753558e1d2,0,1,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,5e08154e-bd8b-4e61-8a6c-b5b500f12b99,0,1,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,39af0f4c-0f0d-4e9a-aa63-d0eee3985b4e,0,1,2b72fe1c-afe1-4905-8db2-2bb1baca6295,2b72fe1c-afe1-4905-8db2-2bb1baca6295,0,1,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,4bc4c6db-0ef8-405f-8875-b4cb1540aeb5,0,1,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,dbd8391c-a174-43d6-a8db-d9ab76b4edbe,0,1,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,ce5f5470-b704-4f55-8dc8-17cf2c2b367a,0,1,ecfc7ede-fffb-4bea-9598-3e18845f603d,ecfc7ede-fffb-4bea-9598-3e18845f603d,0,1,fa44433b-1c44-45a0-9487-47aa092442cf,fa44433b-1c44-45a0-9487-47aa092442cf,0,1,041cecfd-cef2-45d9-90e8-afe0d97d2d95,041cecfd-cef2-45d9-90e8-afe0d97d2d95,0,1,d9d14a24-c023-4b69-ad57-30d1474e1232,d9d14a24-c023-4b69-ad57-30d1474e1232,0,1,0943dd00-1653-4760-a9fe-ebc083ffa660,0943dd00-1653-4760-a9fe-ebc083ffa660,0,1,4fb8564e-2338-4c23-84a4-31f768047ced,4fb8564e-2338-4c23-84a4-31f768047ced,0,1,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,6179c7bf-08d6-4600-8cdc-ea6d4187bd55,0,1,f93c9a7f-0249-421e-b3d0-55f02d130017,f93c9a7f-0249-421e-b3d0-55f02d130017,0,1,062c507a-9d35-4eb5-bb91-d106a535a503,062c507a-9d35-4eb5-bb91-d106a535a503,0,1,fd317d96-380e-4ee7-a25b-401e8521cc7a,fd317d96-380e-4ee7-a25b-401e8521cc7a,0,1,3b380a63-9232-42c2-bfa2-e8fc89448bbd,3b380a63-9232-42c2-bfa2-e8fc89448bbd,0,1,e18b4527-8727-4a10-9e99-a80012debe6c,e18b4527-8727-4a10-9e99-a80012debe6c,0,1,1ed910db-e434-4efd-9b12-c25353a31d5a,1ed910db-e434-4efd-9b12-c25353a31d5a,0,1,10556a26-ea4b-46b4-84d1-175eb13b333f,10556a26-ea4b-46b4-84d1-175eb13b333f,0,1,f1e600b0-55ed-4611-b147-f04d5621796b,f1e600b0-55ed-4611-b147-f04d5621796b,1,0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,76702e9e-fa7a-4b98-befa-f9b37db2dae0,1,0,101a4eb3-cdda-47af-8c69-615a6920347a,101a4eb3-cdda-47af-8c69-615a6920347a,1,0,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,cf19f220-f6d4-4c9e-b5d5-9d94234f0a2c,1,0,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,f410a5db-8698-44ca-9ff6-2c530e1f5c2a,1,0,f79bada2-838f-4e4f-a017-935cf671a70c,f79bada2-838f-4e4f-a017-935cf671a70c,1,0,ed394820-a216-4c4b-81ae-5dea33ced43b,ed394820-a216-4c4b-81ae-5dea33ced43b,1,0,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,3f3a0b1b-04ce-47c1-928d-5e3483e9fd73,1,0,8a310493-c06f-46db-b2b5-14d6ed203312,8a310493-c06f-46db-b2b5-14d6ed203312,1,0,b68ec95b-64f3-4a2b-9683-231d50f01eeb,b68ec95b-64f3-4a2b-9683-231d50f01eeb,1,0,4a008342-f72f-4ca1-bad1-64b59b509911,4a008342-f72f-4ca1-bad1-64b59b509911,1,0,cefa1723-a4d4-44c4-bd57-ffa713f9306c,cefa1723-a4d4-44c4-bd57-ffa713f9306c,1,0,8d8b91c0-c0ab-4b9d-b854-b867063ddb5b,8d8b91c0-c0ab-4b9d-b854-b867063ddb5b,1,0,4920aabf-6f53-4f91-932a-8ace24631a74,4920aabf-6f53-4f91-932a-8ace24631a74,1,0,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,ce7a7f72-9d7d-4240-b852-e83b4b8d944b,1,0,dacd15cd-ffdc-444d-a45f-9b0c7776a7c5,dacd15cd-ffdc-444d-a45f-9b0c7776a7c5,1,0,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,7309e58d-b0d4-4e0f-a74d-68cab03fea8e,1,0,bbec9c3d-31dd-484e-ab32-41ef845f1370,bbec9c3d-31dd-484e-ab32-41ef845f1370,1,0,8692ba41-d91d-4af0-8aba-69dd5409d593,8692ba41-d91d-4af0-8aba-69dd5409d593,1,0,5bfd74f4-811a-45db-b33d-8f93ba9c873a,5bfd74f4-811a-45db-b33d-8f93ba9c873a,1,0,852bd696-9a9e-4952-b676-4108f757ad9b,852bd696-9a9e-4952-b676-4108f757ad9b,1,0,a95b564a-c895-40f2-b947-ea08462bb2a0,a95b564a-c895-40f2-b947-ea08462bb2a0,1,0,ca63ca2f-703d-4317-8c5d-0650ea638f3f,ca63ca2f-703d-4317-8c5d-0650ea638f3f,1,0,aa2256c7-9847-40a5-9e49-11c508e0d45b,aa2256c7-9847-40a5-9e49-11c508e0d45b,1,0,a04493f4-508c-4047-b0e3-b7d4bde6427b,a04493f4-508c-4047-b0e3-b7d4bde6427b,1,0,418982cd-d403-47cf-a7ef-993a36104947,418982cd-d403-47cf-a7ef-993a36104947,1,0,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,485ebc6a-0e3e-4278-8ef1-c6194d6d5015,1,0,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,816c8143-8b02-4f4a-8eb1-44c7fb36afcc,1,0,35eea3b8-d017-442a-b5a0-a1571165b9a9,35eea3b8-d017-442a-b5a0-a1571165b9a9,1,0,7e84901c-cb7f-437c-a135-0902cd47acb6,7e84901c-cb7f-437c-a135-0902cd47acb6,1,0,c4d67026-2c97-4126-b8be-49aa6f567e2d,c4d67026-2c97-4126-b8be-49aa6f567e2d,1,0,fda2906d-f499-4016-b13a-99f7f713b898,fda2906d-f499-4016-b13a-99f7f713b898,1,0,da2b47f5-4109-4f72-a4a5-70be24a6881f,da2b47f5-4109-4f72-a4a5-70be24a6881f,1,0,849f034e-85dc-4515-aae6-240c1e0d46d9,849f034e-85dc-4515-aae6-240c1e0d46d9,1,0,de4d37c9-b278-4c0c-bc10-1b63ecd72947,de4d37c9-b278-4c0c-bc10-1b63ecd72947,1,0,1c7e9baa-7728-4afd-829a-806cee13ecdb,1c7e9baa-7728-4afd-829a-806cee13ecdb,1,0,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,5d75aae8-9d9c-4a47-b8c0-2ce56431fe53,1,0,5a741cf6-8160-4409-9396-2e6d1e67e6fa,5a741cf6-8160-4409-9396-2e6d1e67e6fa,1,0,8242daae-181a-47df-b28e-c1de3fce0359,8242daae-181a-47df-b28e-c1de3fce0359,1,0,5cc3a29d-aa98-42bf-9800-f584229c8e46,5cc3a29d-aa98-42bf-9800-f584229c8e46,1,0,db82191f-77bd-44da-8b33-86f01018e25a,db82191f-77bd-44da-8b33-86f01018e25a,1,0,acfa1919-07ce-4464-8552-6b104e284dca,acfa1919-07ce-4464-8552-6b104e284dca,1,0,497ce8f3-f6f0-4da8-aeb0-0fa01bb26dc6,497ce8f3-f6f0-4da8-aeb0-0fa01bb26dc6,1,0,f4cff4ff-68e9-4072-971e-1b359d3aa980,f4cff4ff-68e9-4072-971e-1b359d3aa980,1,0,6f9fba85-7c04-4e07-bc93-8ad79cbdca85,6f9fba85-7c04-4e07-bc93-8ad79cbdca85,1,0,fdb012c9-583a-42af-95da-070e75a58078,fdb012c9-583a-42af-95da-070e75a58078,1,0,40a52f83-f0e2-470d-9c17-7fdc8cc646b7,40a52f83-f0e2-470d-9c17-7fdc8cc646b7,1,0,7d069b11-cddd-463d-97be-3cbeaaf0954c,7d069b11-cddd-463d-97be-3cbeaaf0954c,1,0,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,8c5fae4c-b5b6-4e05-9453-4ac5de07c54c,1,0,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,7531fb7c-a4ae-42df-b8e5-d8bfcb66be52,1,0,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,d1b950b0-dd66-49f9-998e-3ae5e820ae7f,1,0,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,57e39881-cbf9-4cac-9ed0-bf4a6ea667ee,1,0,b9004626-915c-44c8-9cb7-25e5b627ee83,b9004626-915c-44c8-9cb7-25e5b627ee83,1,0,63c6cfad-124d-491a-829d-b298463c95e6,63c6cfad-124d-491a-829d-b298463c95e6,1,0,3da31d2f-24dd-469b-bd3b-073fa3b3d585,3da31d2f-24dd-469b-bd3b-073fa3b3d585,1,0,737404de-5b9d-4445-81c5-2c5b50b36846,737404de-5b9d-4445-81c5-2c5b50b36846,1,0,1ae364d3-0bec-4089-af23-c60d2a274c85,1ae364d3-0bec-4089-af23-c60d2a274c85,1,0,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1c1a5bf8-bbe6-4a69-973e-11445175dac2,1,0,f11ffcfd-3588-4785-b222-cebe80455303,f11ffcfd-3588-4785-b222-cebe80455303,1,0,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,5d216c28-0724-4e7d-86cf-b6f75e7e28b7,1,0,bfdc6346-db5b-427f-acca-9b48db8fefd0,bfdc6346-db5b-427f-acca-9b48db8fefd0,1,0,1c3f258c-345e-47f6-9e29-98b1222fb348,1c3f258c-345e-47f6-9e29-98b1222fb348,1,0,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,dfafcdf3-cdeb-4822-9f41-a730d9d3fb24,1,0,35c938f4-065f-47f5-a75b-637ed0080725,35c938f4-065f-47f5-a75b-637ed0080725,1,0,b3847d64-46b8-4bd1-9362-d88d82b34254,b3847d64-46b8-4bd1-9362-d88d82b34254,1,0,14b58f6d-9243-47cd-a430-8408fcddd8d8,14b58f6d-9243-47cd-a430-8408fcddd8d8,0,1,e14c0841-226c-4c79-bec9-cfc8d2c3a160,e14c0841-226c-4c79-bec9-cfc8d2c3a160,0,1,6f3c5b90-b030-4267-a973-33d12c2c7680,6f3c5b90-b030-4267-a973-33d12c2c7680,0,1,b107a4a8-0db8-44f4-93f7-9f231e850398,b107a4a8-0db8-44f4-93f7-9f231e850398,0,1,88b879b7-1bb3-4478-b569-35bdb5c56939,88b879b7-1bb3-4478-b569-35bdb5c56939,0,1,7a62d031-c340-4b1e-90af-fff697a2e979,7a62d031-c340-4b1e-90af-fff697a2e979,0,1,18bf6916-83cc-41e5-a35b-1489450ae632,18bf6916-83cc-41e5-a35b-1489450ae632,0,1,ebab97cf-5335-4648-9845-8ca41f79fb49,ebab97cf-5335-4648-9845-8ca41f79fb49,0,1,bb29fa44-6772-4426-a0b8-422115e14288,bb29fa44-6772-4426-a0b8-422115e14288,0,1,a5cc5ae2-be80-4957-8aca-9e477433dfcc,a5cc5ae2-be80-4957-8aca-9e477433dfcc,0,1,62fa393c-687c-49bf-8a25-81adc04430fb,62fa393c-687c-49bf-8a25-81adc04430fb,0,1,36d7d739-b198-487d-8644-76589356c2ec,36d7d739-b198-487d-8644-76589356c2ec,0,1,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,e4da2959-0fb0-48fb-a5aa-e7a5589d69c3,0,1,e51ae56c-d311-46b7-8d4c-19a432f4cd16,e51ae56c-d311-46b7-8d4c-19a432f4cd16,0,1,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,e000d04e-37eb-4d95-a833-b0a9b10ee0b9,0,1,40d3ed07-3b56-4c9f-8b96-d94455202ef0,40d3ed07-3b56-4c9f-8b96-d94455202ef0,0,1,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,b5365cb6-a4e7-479b-82f4-f4ad80fcd7c9,0,1,84282afa-21f5-40db-9386-e6f741c9a06c,84282afa-21f5-40db-9386-e6f741c9a06c,0,1,5b3b3da9-8619-4fbd-b140-3528875cd179,5b3b3da9-8619-4fbd-b140-3528875cd179,0,1,99e5e866-7ac6-4916-ab66-3e2909822c56,99e5e866-7ac6-4916-ab66-3e2909822c56,0,1,03363877-2752-4a03-95f2-d73b732e0bfd,03363877-2752-4a03-95f2-d73b732e0bfd,0,1,8d9d2284-e592-44c5-93bb-247037ab6b95,8d9d2284-e592-44c5-93bb-247037ab6b95,0,1,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0b0d2b7c-d52e-4163-83cf-a7e86bb47c47,0,1,78051e10-74ab-44be-adca-e4c93824a386,78051e10-74ab-44be-adca-e4c93824a386,0,1,73629419-83d8-4727-88a9-76c851d104c9,73629419-83d8-4727-88a9-76c851d104c9,0,1,a9c3065b-db68-4f59-9235-33f9fbfdaafd,a9c3065b-db68-4f59-9235-33f9fbfdaafd,0,1,3715cf3d-0abc-4711-8ac9-d41f0be7878f,3715cf3d-0abc-4711-8ac9-d41f0be7878f,0,1,8e8d8078-8b32-4c24-b26e-89a92bf60160,8e8d8078-8b32-4c24-b26e-89a92bf60160,0,1,f96cbb27-7619-41e0-8577-e623ef02dc58,f96cbb27-7619-41e0-8577-e623ef02dc58,0,1,d74dfd31-2016-435b-8652-15fdbca59490,d74dfd31-2016-435b-8652-15fdbca59490,0,1,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,ba8111a9-1d33-4615-ad0b-b3e923b2f3bd,0,1,27651e0e-d560-434b-a49c-f473a5b20c4d,27651e0e-d560-434b-a49c-f473a5b20c4d,0,1,dab1491b-0685-442d-b945-2bfde3f37933,dab1491b-0685-442d-b945-2bfde3f37933,0,1,ce85554b-81ba-4149-a951-d09bdc14fa16,ce85554b-81ba-4149-a951-d09bdc14fa16,0,1,23a1ef35-1469-44ea-8535-fa9c7f535cae,23a1ef35-1469-44ea-8535-fa9c7f535cae,0,1,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,8c7d74bf-2865-47d9-8a16-5b0db1104a3a,0,1,2558d812-ac0a-49ba-87db-3f661209a3c4,2558d812-ac0a-49ba-87db-3f661209a3c4,0,1,20d712ef-77c1-4374-92e1-f20a3ebc7eab,20d712ef-77c1-4374-92e1-f20a3ebc7eab,0,1,65d23ce8-e326-45ee-86b0-6dcf35797201,65d23ce8-e326-45ee-86b0-6dcf35797201,0,1,a2683c3f-1b21-47d8-951d-7d30cde51efc,a2683c3f-1b21-47d8-951d-7d30cde51efc,0,1,54c77053-1728-4914-a354-73fe8853a0e1,54c77053-1728-4914-a354-73fe8853a0e1,0,1,21136691-078f-4bf7-bddd-f41416a76d86,21136691-078f-4bf7-bddd-f41416a76d86,0,1,30a121c7-c4f5-45c4-9504-9778ed85d9e3,30a121c7-c4f5-45c4-9504-9778ed85d9e3,0,1,c68e2157-2541-4f80-966a-d68ce603f131,c68e2157-2541-4f80-966a-d68ce603f131,0,1,e5dfee58-f748-48ee-81a3-7c6133f06365,e5dfee58-f748-48ee-81a3-7c6133f06365,0,1,68500931-89e0-491e-aba8-b013c9e6f8c3,68500931-89e0-491e-aba8-b013c9e6f8c3,0,1,70b79e56-bb71-4f38-93cf-94dda79d9b4c,70b79e56-bb71-4f38-93cf-94dda79d9b4c,0,1,5c4c9931-3fb0-47a8-9e4f-d552de12b355,5c4c9931-3fb0-47a8-9e4f-d552de12b355,0,1,2a498baf-ec2e-4dda-b568-801bb60db225,2a498baf-ec2e-4dda-b568-801bb60db225,0,1,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,8a32af97-cdb5-46b4-ab7b-e1509e26ecc3,0,1,35989876-16b1-4b02-9381-444a06a7a21d,35989876-16b1-4b02-9381-444a06a7a21d,0,1,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,9f59f8cd-8d61-4fbc-ae6e-32f28ce0035a,0,1,f7608000-1e8a-4ca4-afb7-e04ef547b70a,f7608000-1e8a-4ca4-afb7-e04ef547b70a,0,1,26cea519-19d0-4707-be0a-1a43fde6e563,26cea519-19d0-4707-be0a-1a43fde6e563,0,1,a3d599b9-89d1-4386-8c5b-1c2a9905e6e2,a3d599b9-89d1-4386-8c5b-1c2a9905e6e2,0,1,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,9fb3e902-3154-4bab-9bfe-9a266dc49fa5,0,1,7ea3206a-2a16-460d-ad6d-849103f50bdb,7ea3206a-2a16-460d-ad6d-849103f50bdb,0,1,60c04f0a-78a8-4c55-8844-b86906350fd1,60c04f0a-78a8-4c55-8844-b86906350fd1,0,1,851306a7-8847-4b43-8214-898bfc24b0ab,851306a7-8847-4b43-8214-898bfc24b0ab,0,1,af8d4bc9-2f0f-44d3-89ce-2593877055c8,af8d4bc9-2f0f-44d3-89ce-2593877055c8,0,1,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,344fb829-a1cc-4b17-8f98-2d4f93bfcd6a,0,1,eb35bff2-8467-48fe-bf93-ece2aa40f506,eb35bff2-8467-48fe-bf93-ece2aa40f506,0,1,f7f99dab-9f1e-4814-84e6-e05eb425f67e,f7f99dab-9f1e-4814-84e6-e05eb425f67e,0,1,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,f26bdf61-8dc9-47e3-bc13-e6b7d8252ebd,0,1,10302ca9-850c-4561-a774-d099c20b1919,10302ca9-850c-4561-a774-d099c20b1919,0,1,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,c62c30d6-ffac-43e0-bb20-25fa8eeb62fd,0,1,d693bfcf-e117-445b-b0e1-d895bc5227c4,d693bfcf-e117-445b-b0e1-d895bc5227c4,0,1,cc9be940-db0c-4fad-9655-f5ce2b3ac57e,cc9be940-db0c-4fad-9655-f5ce2b3ac57e,0,1,211ca200-977e-4d48-a0c2-6b4e47bc1838,211ca200-977e-4d48-a0c2-6b4e47bc1838,0,1,68cf55da-b29e-4a65-815b-c9cdc8e5888e,68cf55da-b29e-4a65-815b-c9cdc8e5888e,0,1,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,a9f927ef-22a2-4d77-8648-4bb25eeaccf2,0,1,1041ed81-c1f7-43b2-9087-914865a3076e,1041ed81-c1f7-43b2-9087-914865a3076e,0,1,5d7174d2-42b3-4e12-b705-4209dd73b53b,5d7174d2-42b3-4e12-b705-4209dd73b53b,0,1,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,b1b5bf08-1c57-4875-87bb-ad1fa1a3251f,0,1,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,e00dcab4-5e92-44e3-bcdf-a31dd32a195f,0,1,5a4c6511-f8ed-40e4-a251-e28f62629cf2,5a4c6511-f8ed-40e4-a251-e28f62629cf2,0,1,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0508e7ab-3dd9-42b4-9542-089ce0656bbb,0,1,cfe59dfd-a509-4f83-b926-b3ff94234a43,cfe59dfd-a509-4f83-b926-b3ff94234a43,0,1,17df1591-61b0-4204-8379-8d1f58445968,17df1591-61b0-4204-8379-8d1f58445968,0,1,9020fa9d-e7de-4574-ab65-db6651b5b610,9020fa9d-e7de-4574-ab65-db6651b5b610,0,1,f9aa933e-6684-48de-b802-96c8e61b1fe6,f9aa933e-6684-48de-b802-96c8e61b1fe6,0,1,9de4d430-95ec-4435-b3e8-4fc85778d517,9de4d430-95ec-4435-b3e8-4fc85778d517,0,1,205b8908-fa21-42bd-bff0-fb95e6787f15,205b8908-fa21-42bd-bff0-fb95e6787f15,0,1,5320abf1-b09b-4de0-9adf-4cb1da31df6f,5320abf1-b09b-4de0-9adf-4cb1da31df6f,0,1,3916ddbd-9023-42a4-849e-9cda6e591408,3916ddbd-9023-42a4-849e-9cda6e591408,0,1,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,5e9e42c5-dcbc-422f-acce-4f11a63dbb85,0,1,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,6903ffe4-42c1-4708-a1b0-bb67cd3f9e4c,0,1,96d66cdd-d40c-43a3-92ce-40aef2101b64,96d66cdd-d40c-43a3-92ce-40aef2101b64,0,1,9daa8270-4782-4d83-af03-c8d2b11057ff,9daa8270-4782-4d83-af03-c8d2b11057ff,0,1,4b8927df-e124-4bf6-9d70-6e91b4796d90,4b8927df-e124-4bf6-9d70-6e91b4796d90,0,1,871b63a2-c7a6-4343-8d8b-7dda1b0def87,871b63a2-c7a6-4343-8d8b-7dda1b0def87,0,1,fc78d8df-ab27-4544-a65c-73908b9c5425,fc78d8df-ab27-4544-a65c-73908b9c5425,0,1,f8a090d2-b2d1-4ead-a8bf-6325a7552743,f8a090d2-b2d1-4ead-a8bf-6325a7552743,0,1,84f935da-9fe5-44ea-845b-b447b8b0a6f5,84f935da-9fe5-44ea-845b-b447b8b0a6f5,0,1,caf79125-bde8-4f52-8ad2-f915c7a884cc,caf79125-bde8-4f52-8ad2-f915c7a884cc,0,1,a9a0db31-6808-4790-be72-f345197b0c6e,a9a0db31-6808-4790-be72-f345197b0c6e,0,1,36554213-9af4-4fec-8944-35f50b306eda,36554213-9af4-4fec-8944-35f50b306eda,0,1,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,c770bdd5-c7c0-4751-b31d-46c0ea1f49b7,0,1,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,6afcc089-7f15-42e8-97b5-6aad6cf2e6f9,0,1,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,cce4c615-dc29-42b3-9d3d-b277dde4a2e4,0,1,33343620-673e-4aa3-9e58-c6a25f738001,33343620-673e-4aa3-9e58-c6a25f738001,0,1,8aaf780f-ed74-4f44-9598-c14180053ff9,8aaf780f-ed74-4f44-9598-c14180053ff9,0,1,dbd4d09d-f410-4453-9143-bd72da5464cc,dbd4d09d-f410-4453-9143-bd72da5464cc,0,1,f1bc5034-a4b5-4fa9-97db-d43c2b7e8d36,f1bc5034-a4b5-4fa9-97db-d43c2b7e8d36,0,1,c4fe10b6-d025-4736-be23-3113bd7fe7b4,c4fe10b6-d025-4736-be23-3113bd7fe7b4,0,1,65530aca-7cf2-4a52-b5be-5dcbc15a049e,65530aca-7cf2-4a52-b5be-5dcbc15a049e,0,1,15eb2c2d-305d-42c0-9aec-936b82114bdb,15eb2c2d-305d-42c0-9aec-936b82114bdb,0,1,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,bb99bc44-f83e-48bb-93fd-7b07ca7da6a7,0,1,cbca7272-2aae-4e21-b3f5-12786f085648,cbca7272-2aae-4e21-b3f5-12786f085648,0,1,7718bd0b-7b8a-4ffc-b228-f05683b5531a,7718bd0b-7b8a-4ffc-b228-f05683b5531a,0,1,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,38aeb32b-9e3b-4b4a-9a61-97da63cdea48,0,1,881f53bc-a52e-4312-b09d-3d3f53ddf84b,881f53bc-a52e-4312-b09d-3d3f53ddf84b,0,1,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,2e36a7b3-5331-4fab-a0a3-31b42a8387fe,0,1,e3476d0e-0ab4-4734-9261-04aef6281086,e3476d0e-0ab4-4734-9261-04aef6281086,0,1,945ae8d2-b74a-41e9-b740-c82acdd40d04,945ae8d2-b74a-41e9-b740-c82acdd40d04,0,1,29c37223-de1c-49fb-8488-77e44dd79edd,29c37223-de1c-49fb-8488-77e44dd79edd,0,1,f561be64-9420-46ec-a4f7-9df0bea2e28b,f561be64-9420-46ec-a4f7-9df0bea2e28b,0,1,e9e242b7-0077-4c47-8f45-df50e7cc90cf,e9e242b7-0077-4c47-8f45-df50e7cc90cf,0,1,820383e1-9b95-4c0f-8464-722f1fe64ad5,820383e1-9b95-4c0f-8464-722f1fe64ad5,0,1,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,3d6cf2ab-29b2-45af-a6e2-8796284acf2d,0,1,292bfe6b-703e-40cb-856d-abb470e6709f,292bfe6b-703e-40cb-856d-abb470e6709f,0,1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,276c42ca-f5e0-4bb4-9b89-a925def35cb1,0,1,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,41a9cabc-5667-4ca0-a798-ba0b22bd1aa0,0,1,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,1bf44c42-87c0-4f2e-846c-b04d0b7e8d7d,0,1,8811ea1a-1221-47b7-9574-3f36ff15a3cf,8811ea1a-1221-47b7-9574-3f36ff15a3cf,0,1,a84891cc-e996-489a-abde-5b5af166a057,a84891cc-e996-489a-abde-5b5af166a057,0,1,1d715463-691b-4c01-ae39-57c261f2a6ad,1d715463-691b-4c01-ae39-57c261f2a6ad,0,1,4c3d007f-a62c-4fd9-beda-58dbf08ad188,4c3d007f-a62c-4fd9-beda-58dbf08ad188,0,1,c35373a9-f0b0-4ddb-a985-409ac9c64609,c35373a9-f0b0-4ddb-a985-409ac9c64609,0,1,c1c40916-fee5-46e3-90fc-10e7595866c9,c1c40916-fee5-46e3-90fc-10e7595866c9,0,1,19a307b1-9ef0-4fc6-bf4f-7636e9118399,19a307b1-9ef0-4fc6-bf4f-7636e9118399,0,1,666244a4-5636-4405-89dd-bbd8f4278071,666244a4-5636-4405-89dd-bbd8f4278071,0,1,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,8b79f0e3-9024-4073-aa6b-a42beed9b0c6,0,1,29a627a9-debc-4074-88d0-ec3561e1ef9c,29a627a9-debc-4074-88d0-ec3561e1ef9c,0,1,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,5a01a002-8833-4c89-b8d6-9b63fc49d3b6,0,1,39f5e272-9a10-40b0-8a10-92037828b206,39f5e272-9a10-40b0-8a10-92037828b206,0,1,87dad256-122b-4d7e-b249-a2c313a9cf33,87dad256-122b-4d7e-b249-a2c313a9cf33,0,1,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,57a030fb-ed57-4ffc-a462-c7bbd2435c3d,0,1,958033a6-2a8e-473a-903b-34eee6507f5a,958033a6-2a8e-473a-903b-34eee6507f5a,0,1,b722d6e1-fd6f-4bb4-923d-01764393722d,b722d6e1-fd6f-4bb4-923d-01764393722d,0,1,ac5f945e-2d03-44fb-a8cf-5d786194cefd,ac5f945e-2d03-44fb-a8cf-5d786194cefd,0,1,698ec00f-bf75-420e-81ab-a98808daf3f7,698ec00f-bf75-420e-81ab-a98808daf3f7,0,1,f441907c-d02e-431e-baf4-1854e48a1f50,f441907c-d02e-431e-baf4-1854e48a1f50,0,1,783dd4ba-a597-45ba-8989-2ed5224d62bc,783dd4ba-a597-45ba-8989-2ed5224d62bc,0,1,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,97aaede5-d32f-4eba-b0e0-5ae5f094a8b7,0,1,d9e08c12-1999-41d8-b530-90187303be0a,d9e08c12-1999-41d8-b530-90187303be0a,0,1,dad9710a-73ca-4e0d-b98b-75f955d0822d,dad9710a-73ca-4e0d-b98b-75f955d0822d,0,1,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,d01beeab-7c42-4d5e-a2f6-f190b9f703a5,0,1,2191939f-6f71-47c9-a3d2-57acbf7f411e,2191939f-6f71-47c9-a3d2-57acbf7f411e,0,1,19b9cbbb-1fcc-4492-9385-687742cb3d0b,19b9cbbb-1fcc-4492-9385-687742cb3d0b,0,1,247c41dd-c8dc-43dd-b348-1ba31ee92065,247c41dd-c8dc-43dd-b348-1ba31ee92065,0,1,dbad3cee-0d5c-41f6-819f-1a2b5251b62c,dbad3cee-0d5c-41f6-819f-1a2b5251b62c,0,1,da673406-078d-44c8-9d27-80ef172c4b5e,da673406-078d-44c8-9d27-80ef172c4b5e,0,1,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,75e77f99-b9d1-4bc0-93aa-c77a93d760d3,0,1,a2c36563-126d-4c3a-9714-5b7a4903073b,a2c36563-126d-4c3a-9714-5b7a4903073b,0,1,2e4da82c-dddb-4462-b34f-6511cd2a8356,2e4da82c-dddb-4462-b34f-6511cd2a8356,0,1,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,c7da3115-3cee-4282-a2f2-4e0b5558e4fc,0,1,2976c29f-f482-463d-8f6e-6a632fb50893,2976c29f-f482-463d-8f6e-6a632fb50893,0,1,701964a1-7762-45ee-a9a4-41dd9ce94783,701964a1-7762-45ee-a9a4-41dd9ce94783,0,1,55d1909e-f552-441f-8e14-47d2e604cf6a,55d1909e-f552-441f-8e14-47d2e604cf6a,0,1,eae627db-c52b-4e41-94d1-58db28cd0063,eae627db-c52b-4e41-94d1-58db28cd0063,0,1,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,cafc86e1-d7f1-4cd2-ac20-04fa0917556a,0,1,0a646724-b49d-42cd-82e6-e800466ed127,0a646724-b49d-42cd-82e6-e800466ed127,0,1,47058e36-a281-43a5-a41d-691b3ef32b5b,47058e36-a281-43a5-a41d-691b3ef32b5b,0,1,e620e93c-4382-478f-a700-ad2faa67362b,e620e93c-4382-478f-a700-ad2faa67362b,0,1,a4a8693b-dc91-4762-92e6-35360c8768db,a4a8693b-dc91-4762-92e6-35360c8768db,0,1,2ae236ec-28a7-44e0-a0ba-be62fe52d817,2ae236ec-28a7-44e0-a0ba-be62fe52d817,0,1,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,fcb46a8a-3461-4ec2-9aa0-685aedb9dd50,0,1,12cf9412-baf5-4d32-a563-a11ac3d5e0ed,12cf9412-baf5-4d32-a563-a11ac3d5e0ed,0,1,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,bdde9030-5718-4f5e-a9e2-f641f4ce69f9,0,1,ed137e05-1996-411d-9927-45a3d7e3ee3b,ed137e05-1996-411d-9927-45a3d7e3ee3b,0,1,fbebf341-9842-41e1-8e4d-490fa02065ce,fbebf341-9842-41e1-8e4d-490fa02065ce,0,1,067f88f6-ccd2-491e-a466-94345a1f220f,067f88f6-ccd2-491e-a466-94345a1f220f,0,1,642154b8-97da-4c4f-bf34-c1124215077d,642154b8-97da-4c4f-bf34-c1124215077d,0,1,abc10867-39ae-46bf-8bd7-90f645919235,abc10867-39ae-46bf-8bd7-90f645919235,0,1,b3396504-8ccb-43d6-9a0f-ab259ba0a542,b3396504-8ccb-43d6-9a0f-ab259ba0a542,0,1,f59f91c5-026a-4dc5-996e-0d59814a9604,f59f91c5-026a-4dc5-996e-0d59814a9604,0,1,aac9966f-e9ea-4106-97bb-6b9822939bc7,aac9966f-e9ea-4106-97bb-6b9822939bc7,0,1,a752fba8-5084-4fa2-9d0b-7074a42b1312,a752fba8-5084-4fa2-9d0b-7074a42b1312,0,1,640d7486-8abd-40aa-a244-2ed899b7225a,640d7486-8abd-40aa-a244-2ed899b7225a,0,1,c05f87b4-ec5f-4d14-981f-02ca8ba89863,c05f87b4-ec5f-4d14-981f-02ca8ba89863,0,1,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,560a5f44-e4e6-46d9-a9fe-3609842d0e3e,0,1,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,98f68a75-ebf9-4c59-b6a8-b3634089ca6b,0,1,875d1fc1-8172-4e48-8192-035882e1665d,875d1fc1-8172-4e48-8192-035882e1665d,0,1,26132b28-98cc-4690-92ad-139f91839ba2,26132b28-98cc-4690-92ad-139f91839ba2,0,1,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0bd85b79-cc32-4c1d-b629-567a1bdfac56,0,1,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,b87ce4f9-aaa6-4a4c-af80-0bd9adc83506,0,1,ca81e0ea-c428-47f9-aedb-078214104a2f,ca81e0ea-c428-47f9-aedb-078214104a2f,0,1,9518d09c-6996-4439-9278-3c71d5ae8fce,9518d09c-6996-4439-9278-3c71d5ae8fce,0,1,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,9dd6e7d6-cd98-4928-b50c-38bdbc61c211,0,1,5fbd9a13-012d-4c36-b72c-da3bc4157cff,5fbd9a13-012d-4c36-b72c-da3bc4157cff,0,1,1126157b-64c0-4d64-8551-f31c5ed0fd29,1126157b-64c0-4d64-8551-f31c5ed0fd29,0,1,6ae6e515-5cd4-4eca-8602-c6abe6d66276,6ae6e515-5cd4-4eca-8602-c6abe6d66276,0,1,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,44b8472b-0f70-49cc-8f71-9c9d3e9cfbcc,0,1,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,b071a44e-9a34-4af3-a59a-35aa5f3a74b4,0,1,35a28677-0653-47f9-82e1-02c4b9266fee,35a28677-0653-47f9-82e1-02c4b9266fee,0,1,2e17464f-9cef-4812-865f-4eb77ff16b6a,2e17464f-9cef-4812-865f-4eb77ff16b6a,0,1,e5ecbb1f-981d-4928-9335-22216879f7e2,e5ecbb1f-981d-4928-9335-22216879f7e2,0,1,461be12a-9f16-4826-978a-436608ca8733,461be12a-9f16-4826-978a-436608ca8733,0,1,9b143299-d300-4b6c-b667-5552fb3bdcde,9b143299-d300-4b6c-b667-5552fb3bdcde,0,1,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0de070f4-d8b7-48bb-bfc9-027dd727a4ad,0,1,74973d06-f57d-403e-945c-5cd2f4fc4869,74973d06-f57d-403e-945c-5cd2f4fc4869,0,1,259564b8-172e-4eed-9360-d561ec6dad69,259564b8-172e-4eed-9360-d561ec6dad69,0,1,91c799d7-2b3d-4d1a-87ff-221057a428c6,91c799d7-2b3d-4d1a-87ff-221057a428c6,0,1,a50fcacc-6d2d-496c-bea0-9c73cd153437,a50fcacc-6d2d-496c-bea0-9c73cd153437,0,1,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,a6846c5a-7cf6-4df2-a159-2fd33d18d18f,0,1,a5633248-8611-4e9b-b223-2f59e7b84a65,a5633248-8611-4e9b-b223-2f59e7b84a65,0,1,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,6ec3463a-1e94-4de7-a8c0-b0e42f38573e,0,1,e40b8882-737a-40c0-83b4-c35dc042f4a5,e40b8882-737a-40c0-83b4-c35dc042f4a5,0,1,d60c1e9d-1395-4293-8462-6ea2c93a0c86,d60c1e9d-1395-4293-8462-6ea2c93a0c86,0,1,5a2d5d8a-afd9-4954-9868-7c82bad00426,5a2d5d8a-afd9-4954-9868-7c82bad00426,0,1,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,14fcf5e5-5856-4b5f-8c3f-75eaba0f7268,0,1,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,0a0af8bf-0caa-40df-9a69-71f98ca9ff89,0,1,6ac7db0c-18ed-4d3b-956a-5985214db474,6ac7db0c-18ed-4d3b-956a-5985214db474,0,1,267103e0-6703-4a74-bb4f-af610d7ef332,267103e0-6703-4a74-bb4f-af610d7ef332,0,1,b98ca634-25a5-4366-af04-815ba34c8bb2,b98ca634-25a5-4366-af04-815ba34c8bb2,0,1,14d69108-4d26-401a-b7ae-2c86dadf831c,14d69108-4d26-401a-b7ae-2c86dadf831c,0,1,d6251f65-d366-4bc9-a5db-42063fe03594,d6251f65-d366-4bc9-a5db-42063fe03594,0,1,22c60cbc-429f-40d9-bf8b-681b7786c41d,22c60cbc-429f-40d9-bf8b-681b7786c41d,0,1,31dd320b-06aa-4314-9914-2c2420f572a1,31dd320b-06aa-4314-9914-2c2420f572a1,0,1,56730848-3bef-4b8c-b449-fe9d09c9c374,56730848-3bef-4b8c-b449-fe9d09c9c374,0,1,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,43c477d2-1234-4c4a-a18a-022c0ddf2fd5,0,1,91d8c5e4-eaec-4951-9224-16882fda08f6,91d8c5e4-eaec-4951-9224-16882fda08f6,0,1,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,4304ffb9-7ede-4c59-bef8-26fe3e8f0103,0,1,4654d192-74bf-430f-abee-6f4dc431b182,4654d192-74bf-430f-abee-6f4dc431b182,0,1,d4655391-144c-4ba6-aee5-1edafebe862c,d4655391-144c-4ba6-aee5-1edafebe862c,0,1,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,1ea750ae-5ec4-43c5-b34f-fd28999d41d7,0,1,8ceea1e8-42ce-469f-823a-ceffdbd6b112,8ceea1e8-42ce-469f-823a-ceffdbd6b112,0,1,6995ee71-5901-46d9-a5c1-b35d795bda20,6995ee71-5901-46d9-a5c1-b35d795bda20,0,1,e93a4293-0497-4f11-b8b9-40300104fb96,e93a4293-0497-4f11-b8b9-40300104fb96,0,1,93531e5d-5dfc-42e8-be52-2e83f37262b0,93531e5d-5dfc-42e8-be52-2e83f37262b0,0,1,61bf78c0-7004-4a74-b362-e979c7316e05,61bf78c0-7004-4a74-b362-e979c7316e05,0,1,c4351896-eff1-4e4d-8823-028d63a9d6bf,c4351896-eff1-4e4d-8823-028d63a9d6bf,0,1,475f83a2-ba5a-4072-94f8-1324b1f198a4,475f83a2-ba5a-4072-94f8-1324b1f198a4,0,1,cd7c15c1-c573-46c9-b109-339b8b54c3ee,cd7c15c1-c573-46c9-b109-339b8b54c3ee,0,1,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,efd89929-4db9-4c58-b3cb-a8d9a41a1df2,0,1,deee8bde-381f-4094-8794-7a06248860dd,deee8bde-381f-4094-8794-7a06248860dd,0,1,2757ee75-4b36-4901-bff1-044708754edb,2757ee75-4b36-4901-bff1-044708754edb,0,1,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0e6bab27-bf94-4732-8549-dbd9b8a5f4e9,0,1,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,774c92d6-9b9b-422a-83d7-8d42ae2a9f60,0,1,71144539-6472-4727-8887-0139f6221370,71144539-6472-4727-8887-0139f6221370,0,1,bff07da4-ae19-48a9-806b-14b285d42485,bff07da4-ae19-48a9-806b-14b285d42485,0,1,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,659cd4f6-d18c-4d75-a7e6-7c124a63ab9a,0,1,b0ccc05d-8d39-4f57-8e87-6846014f92ea,b0ccc05d-8d39-4f57-8e87-6846014f92ea,0,1,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,64fbfed7-9dda-481b-a4f7-fe440f24ba7e,0,1,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,b2835a5b-5c91-448c-9eb1-1bb1c9a5e727,0,1,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,447fb310-0588-4e0d-8f6d-5fc1f3bb1180,0,1,8986c155-54be-4b1b-b31a-5c00b88bc40d,8986c155-54be-4b1b-b31a-5c00b88bc40d,0,1,d91441cf-d793-4dfa-9225-f0c16818edde,d91441cf-d793-4dfa-9225-f0c16818edde,0,1,42a39785-144c-4d2d-92c6-fd8b345f687b,42a39785-144c-4d2d-92c6-fd8b345f687b,0,1,f3bd841b-fb36-4462-9627-b51801e563cd,f3bd841b-fb36-4462-9627-b51801e563cd,0,1,0a23f273-5589-4a48-be3a-eee7565749aa,0a23f273-5589-4a48-be3a-eee7565749aa,0,1,494eb9d9-4a10-4e85-b511-375408f21bbe,494eb9d9-4a10-4e85-b511-375408f21bbe,0,1,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,a161dd07-4a6e-4d0f-b72c-702d0d3a83a3,0,1,a275802f-937a-49f4-92da-fcdd185a036d,a275802f-937a-49f4-92da-fcdd185a036d,0,1,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,ec6ed9cb-85a2-4303-9906-cfb4ce6500bf,0,1,c05f15b0-a659-4473-b6d0-acebc4a2da57,c05f15b0-a659-4473-b6d0-acebc4a2da57,0,1,f2dc9319-ba60-421a-8340-be3e3a291393,f2dc9319-ba60-421a-8340-be3e3a291393,0,1,bf4eb62a-bc74-4845-bad2-58a2a8302a65,bf4eb62a-bc74-4845-bad2-58a2a8302a65,0,1,b66eb190-1c16-4f20-a94f-954bcdf313b8,b66eb190-1c16-4f20-a94f-954bcdf313b8,0,1,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,b8d07e97-f67d-4669-972a-96ce0f5e8c0d,0,1,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,5c9c5f87-e85f-49b3-a7ca-01e2220d4f39,0,1,b953eafc-20be-4463-8c3e-903184e18402,b953eafc-20be-4463-8c3e-903184e18402,0,1,dcefdde9-645e-43c7-9244-384dadc75439,dcefdde9-645e-43c7-9244-384dadc75439,0,1,bbdfeebd-cda0-4911-8f31-553d751340a7,bbdfeebd-cda0-4911-8f31-553d751340a7,0,1,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,dc7adfb7-41e7-4019-a18d-5d9f5d227b71,0,1,20aad006-5b1e-4cc2-94ef-668dd002667b,20aad006-5b1e-4cc2-94ef-668dd002667b,0,1,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,af6af7ae-d68a-4e12-ba2c-a360ce2920a7,0,1,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,b0f5bce4-2ad3-416e-9b1e-3fb23deaa040,0,1,fa787228-aed5-4a16-b958-d102b78bf776,fa787228-aed5-4a16-b958-d102b78bf776,0,1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,d511a261-4f9b-44e8-b3a1-1e6d393ec6e1,0,1,2befb2e3-7354-4a01-83d6-b24262704a5e,2befb2e3-7354-4a01-83d6-b24262704a5e,0,1,5b93975e-b2a4-4102-a060-2667f5813c94,5b93975e-b2a4-4102-a060-2667f5813c94,0,1,ca75d086-cd01-4f54-b57d-1b35bcb1272a,ca75d086-cd01-4f54-b57d-1b35bcb1272a,0,1,b4a27991-2e18-4ead-80e8-f2956a7539e3,b4a27991-2e18-4ead-80e8-f2956a7539e3,0,1,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,ac8c40d6-be1e-4733-be2e-ae83bde4ec15,0,1,be900d20-c02d-476d-9ede-2bc5303ef6cb,be900d20-c02d-476d-9ede-2bc5303ef6cb,0,1,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,ddce1d3c-4a23-4c92-8083-c395dd3b7f6d,0,1,07b53437-cc8d-4834-a1e0-7007538b6eab,07b53437-cc8d-4834-a1e0-7007538b6eab,0,1,0dbec644-cb98-4368-ab76-5997259cbce7,0dbec644-cb98-4368-ab76-5997259cbce7,0,1,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,c05a7d33-8a58-4b5f-a433-4ba54c88d5f4,0,1,dcdc9c65-c2d5-4531-a325-f64b3861cbab,dcdc9c65-c2d5-4531-a325-f64b3861cbab,0,1,ca542a9e-3040-419f-9a98-2a8de230b734,ca542a9e-3040-419f-9a98-2a8de230b734,0,1,c9fc5155-1df3-4872-a83d-72872baf43c4,c9fc5155-1df3-4872-a83d-72872baf43c4,0,1,9f9adb67-66bd-4c28-8319-44ae097ae1fe,9f9adb67-66bd-4c28-8319-44ae097ae1fe,0,1,0bae3704-b370-48be-b094-f18a2e62ad1b,0bae3704-b370-48be-b094-f18a2e62ad1b,0,1,e097bf94-9235-4a27-b0eb-d6387d22cd62,e097bf94-9235-4a27-b0eb-d6387d22cd62,0,1,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,eccded1c-f3ca-40d3-a8cd-71947bfed7b8,0,1,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,4d243f2b-14d9-4e96-9707-4ead5d12e0a2,0,1,8d2bfd40-f185-4eab-b374-872d49310eb2,8d2bfd40-f185-4eab-b374-872d49310eb2,0,1,523de426-e5a6-49e0-8144-c637f80d8ddd,523de426-e5a6-49e0-8144-c637f80d8ddd,0,1,09256328-6205-4b04-b908-3287ae8ded75,09256328-6205-4b04-b908-3287ae8ded75,0,1,05a6e161-9791-4c5b-8753-bd6370cc4cc9,05a6e161-9791-4c5b-8753-bd6370cc4cc9,0,1,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,966ecce5-ec91-4f8e-82b2-364b38eb7ff4,0,1,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,66a2df23-3a08-40d2-8e6c-2db10a3bca7a,0,1,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,5ee4b3ee-b795-48c1-9bad-f4010b559b0e,0,1,6362facc-bf95-4adf-8ee7-c65f90972a1c,6362facc-bf95-4adf-8ee7-c65f90972a1c,0,1,08dbba81-68fb-49ef-8aac-9631fcfa87c6,08dbba81-68fb-49ef-8aac-9631fcfa87c6,0,1,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,dd7191b6-cbc0-4b0b-a51a-c27a1e1720fa,0,1,8170a27d-45e9-48b1-860b-c2d9cc5961cd,8170a27d-45e9-48b1-860b-c2d9cc5961cd,0,1,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,f1c08fed-f3db-4f72-8a8e-7c626b8cc130,0,1,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,e8c3b796-bfd8-4108-ab5f-d0f21b7bd9a6,0,1,f41d01ec-983a-4b39-9c11-a6d25d08df4f,f41d01ec-983a-4b39-9c11-a6d25d08df4f,0,1,3247e64e-b57e-4c33-8086-7ab93c5b6371,3247e64e-b57e-4c33-8086-7ab93c5b6371,0,1,e5dca369-dc9a-4332-a509-f734b8787e13,e5dca369-dc9a-4332-a509-f734b8787e13,0,1,722af623-156c-4e63-8b2a-93da760f1559,722af623-156c-4e63-8b2a-93da760f1559,0,1,1abeb10b-0558-4478-8f51-d0964ba3c274,1abeb10b-0558-4478-8f51-d0964ba3c274,0,1,38325a66-588a-4db0-8e0c-21d239408369,38325a66-588a-4db0-8e0c-21d239408369,0,1,7c27e885-33fd-4da2-a60d-50336c0189b0,7c27e885-33fd-4da2-a60d-50336c0189b0,0,1,4b849c66-6a36-4efd-815e-af4467c6f064,4b849c66-6a36-4efd-815e-af4467c6f064,0,1,f6939587-ff87-4eca-ae52-10e1bd2abfce,f6939587-ff87-4eca-ae52-10e1bd2abfce,0,1,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,a8e4d97f-e2da-4aa8-a221-3cbcc135f403,0,1,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,f2b0eab2-e34b-42f8-9b24-5596b4c17d7f,0,1,3cb575a9-dc82-45e0-81f0-d651e12246da,3cb575a9-dc82-45e0-81f0-d651e12246da,0,1,01a73950-3e8f-4f56-903f-af0d9574e72e,01a73950-3e8f-4f56-903f-af0d9574e72e,0,1,14bd0844-c829-4325-aa7f-0f417bf955dc,14bd0844-c829-4325-aa7f-0f417bf955dc,0,1,7f1cd658-ca10-49c6-80ef-b8956f3269ea,7f1cd658-ca10-49c6-80ef-b8956f3269ea,0,1,b0d9086f-cef7-47a8-ad62-d85fea28ebda,b0d9086f-cef7-47a8-ad62-d85fea28ebda,0,1,68f6d1b2-9c08-4b37-ba23-1e15539a9c35,68f6d1b2-9c08-4b37-ba23-1e15539a9c35,0,1,cb6df70e-c7cd-4343-bfa9-5bdb907b4580,cb6df70e-c7cd-4343-bfa9-5bdb907b4580,0,1,49c010fc-f5cc-45f4-ba46-132e7661c3dd,49c010fc-f5cc-45f4-ba46-132e7661c3dd,0,1,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,3f3b592d-ca61-40c7-be1f-e5d3224a1eb3,0,1,2c02a558-8d12-44cf-be6b-9c399b9032e5,2c02a558-8d12-44cf-be6b-9c399b9032e5,0,1,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,d94d4931-7c81-4ee8-93ea-b2c54b152fa5,0,1,9c267aa6-5f23-49f6-868a-3324ef2845ff,9c267aa6-5f23-49f6-868a-3324ef2845ff,0,1,495eeeee-d7bf-4063-99e2-86daa066451a,495eeeee-d7bf-4063-99e2-86daa066451a,0,1,b6184698-79e4-4c19-9440-092ccd9dabf8,b6184698-79e4-4c19-9440-092ccd9dabf8,0,1,7d01fc0c-378e-421d-ab70-6a418eed5941,7d01fc0c-378e-421d-ab70-6a418eed5941,0,1,6eeb4867-bf9d-48dc-b96b-934a0c293010,6eeb4867-bf9d-48dc-b96b-934a0c293010,0,1,c7f817ee-9f6a-454c-95a0-b279fd08055e,c7f817ee-9f6a-454c-95a0-b279fd08055e,0,1,e1803e54-ec5e-4a82-8097-5e2331820991,e1803e54-ec5e-4a82-8097-5e2331820991,0,1,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,f69ec1f9-826e-4eb4-b52c-3f6a3dfc3361,0,1,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,4cbb0b91-dbdd-472f-93c5-061076b6a8d3,0,1,8506dbe9-7066-444b-83b6-fb2d71a336e7,8506dbe9-7066-444b-83b6-fb2d71a336e7,0,1,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,240b4df5-0d75-4e5a-9ae8-d0bc7cc51722,0,1,6686d828-3129-4d44-a8a2-a64657d424cb,6686d828-3129-4d44-a8a2-a64657d424cb,0,1,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,90433152-f389-4d45-8ccc-3eb6c7a7e1f0,0,1,ce235ab9-1dec-459a-9fec-498c262ece56,ce235ab9-1dec-459a-9fec-498c262ece56,0,1,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,9ec53d1a-ed7a-41e8-b5d0-6c2181fd63a5,0,1,39355e82-30a6-431e-9697-e2c42e82de83,39355e82-30a6-431e-9697-e2c42e82de83,0,1,a9ae364f-b668-4fb4-b976-f227951ffb6b,a9ae364f-b668-4fb4-b976-f227951ffb6b,0,1,edc01b03-8b01-4551-939a-f7e257892040,edc01b03-8b01-4551-939a-f7e257892040,0,1,15d09274-9508-4f64-9ea3-678c5aa50f0f,15d09274-9508-4f64-9ea3-678c5aa50f0f,0,1,4debe032-12e4-4777-b2fc-70b150f2aad1,4debe032-12e4-4777-b2fc-70b150f2aad1,0,1,37558fa2-0833-46d6-9e4f-63d4a3136870,37558fa2-0833-46d6-9e4f-63d4a3136870,0,1,d92cb614-ed09-47db-b70b-d3e533c44c6a,d92cb614-ed09-47db-b70b-d3e533c44c6a,0,1,361271fa-2faa-497d-adfe-dea8b825405e,361271fa-2faa-497d-adfe-dea8b825405e,0,1,5dceae8b-1ff3-4760-a1c4-975a92be1023,5dceae8b-1ff3-4760-a1c4-975a92be1023,0,1,e660c8bf-af5f-4525-a56e-68925d2b96fa,e660c8bf-af5f-4525-a56e-68925d2b96fa,0,1,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,b18bdc5f-a2b6-4b15-81c3-37b27a5a3176,0,1,528d96cc-8838-49ea-8d76-ea56747882e0,528d96cc-8838-49ea-8d76-ea56747882e0,0,1,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,c996916d-7f1c-4fbf-939f-3e1bafe81f7d,0,1,1681dd7a-de80-4b8d-9657-c9702a19d653,1681dd7a-de80-4b8d-9657-c9702a19d653,0,1,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,10d796e9-a3d4-4ef0-87d5-8315aa12f1c8,0,1,9f593f27-8009-40c0-94d6-53f177ce55f4,9f593f27-8009-40c0-94d6-53f177ce55f4,0,1,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,820bb4b4-895b-4ccf-a350-2545bf8a2f7e,0,1,086d69d6-e2fa-45cb-84b6-f8f3e2919160,086d69d6-e2fa-45cb-84b6-f8f3e2919160,0,1,4678c704-933a-45ef-9d41-89b8f39016bb,4678c704-933a-45ef-9d41-89b8f39016bb,0,1,530a3164-4ef1-4b3b-8269-13764ef4bf15,530a3164-4ef1-4b3b-8269-13764ef4bf15,0,1,6df2bb92-558c-4453-9de4-e4176e8f93dc,6df2bb92-558c-4453-9de4-e4176e8f93dc,0,1,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0ce4c8a4-b20b-4550-bee3-f677e9ec64e9,0,1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,30d5c2a6-b3cf-4ed5-ba75-850bcae932d1,0,1,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0bf5e9c1-905a-4202-8b96-ed831b41be4b,0,1,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,e92ae368-0d7c-4fb7-b6d0-5ab63dc95a6a,0,1,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,f30c9c4b-aa6c-4b15-9ac7-888c0c0cabd9,0,1,be15e947-f671-4848-ada1-51239af73615,be15e947-f671-4848-ada1-51239af73615,0,1,d3e0dd8f-886a-4441-8f05-fd629da80f07,d3e0dd8f-886a-4441-8f05-fd629da80f07,0,1,6417d7c8-6436-4907-98eb-44cd7638f3f1,6417d7c8-6436-4907-98eb-44cd7638f3f1,0,1,2c04d747-c363-4218-92c9-5c83393e928b,2c04d747-c363-4218-92c9-5c83393e928b,0,1,093b8255-7ee5-4463-bd20-542b1d63e799,093b8255-7ee5-4463-bd20-542b1d63e799,0,1,5afb95e0-51a3-4a0f-bea7-e06716421974,5afb95e0-51a3-4a0f-bea7-e06716421974,0,1,ba49877b-6e30-4177-a67c-00e65aa498fb,ba49877b-6e30-4177-a67c-00e65aa498fb,0,1,25b39aeb-94c3-4199-9d56-5bd87e325bf2,25b39aeb-94c3-4199-9d56-5bd87e325bf2,0,1,2bd80198-4739-4e8f-9af1-40addc91a05b,2bd80198-4739-4e8f-9af1-40addc91a05b,0,1,33c66a15-e48e-406a-a77c-02af72ae96d5,33c66a15-e48e-406a-a77c-02af72ae96d5,0,1,77fe53c2-de9d-4483-97c9-f7d44e137d5e,77fe53c2-de9d-4483-97c9-f7d44e137d5e,0,1,593be64c-6792-46d9-8618-84c50c9ad9e4,593be64c-6792-46d9-8618-84c50c9ad9e4,0,1,208d29cb-040f-4282-b8e8-dda8417b8e92,208d29cb-040f-4282-b8e8-dda8417b8e92,0,1,9935d602-668e-4df9-a338-0f542def878b,9935d602-668e-4df9-a338-0f542def878b,0,1,459ed297-0c0d-4bdb-90a3-da387868f040,459ed297-0c0d-4bdb-90a3-da387868f040,0,1,ccb5b9a7-1a10-4803-b455-0350afe4b584,ccb5b9a7-1a10-4803-b455-0350afe4b584,0,1,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,ebce49ef-755a-4ace-aeb1-b99db2a8bf6c,0,1,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,0cd18f4c-aeb9-456b-9dcd-9649d1dd486b,0,1,ba5e7c41-0442-4f74-ba41-631d864eafb4,ba5e7c41-0442-4f74-ba41-631d864eafb4,0,1,3913f78f-ce34-4ae3-840a-ccdf06319cbb,3913f78f-ce34-4ae3-840a-ccdf06319cbb,0,1,104cf3e3-2104-4ac2-bdc6-792750a63ea0,104cf3e3-2104-4ac2-bdc6-792750a63ea0,0,1,c86aa97a-5898-4cb2-ae62-598bddf8e99f,c86aa97a-5898-4cb2-ae62-598bddf8e99f,0,1,d3c9b925-6b74-42db-8b21-ab21d24797d1,d3c9b925-6b74-42db-8b21-ab21d24797d1,0,1,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,4d348ec3-9de8-4f5b-960c-4b507d0fd7ce,0,1,39261a2d-7c46-40b1-9f8f-02d970aa04bc,39261a2d-7c46-40b1-9f8f-02d970aa04bc,0,1,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,3a07e5a5-2ab1-43ef-b97f-d45cd7775d67,0,1,124a516f-cdab-49ce-95d1-359921140342,124a516f-cdab-49ce-95d1-359921140342,0,1,e4294611-a770-4e67-9578-a1f370879476,e4294611-a770-4e67-9578-a1f370879476,0,1,c5033dd2-0911-4124-8688-dc9dabf3155f,c5033dd2-0911-4124-8688-dc9dabf3155f,0,1,274357df-cb5c-407d-ae72-58046c310db2,274357df-cb5c-407d-ae72-58046c310db2,0,1,5467001e-d025-4669-b16e-26381ac4403f,5467001e-d025-4669-b16e-26381ac4403f,0,1,a4e56049-4de9-40a3-8197-a5c84a11f516,a4e56049-4de9-40a3-8197-a5c84a11f516,0,1,339c9220-fd5b-45d3-b300-cdcc8788f87e,339c9220-fd5b-45d3-b300-cdcc8788f87e,0,1,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,02d7d401-3c0c-4fd0-b096-1f73b6ec14c3,0,1,9042a6de-5048-432d-a448-7e21f2d1d24a,9042a6de-5048-432d-a448-7e21f2d1d24a,0,1,350d46bf-114e-48e7-90c6-6708d949f20d,350d46bf-114e-48e7-90c6-6708d949f20d,0,1,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,d047caa8-7bcf-41ac-a18e-97877d6e0a2a,0,1,aac20ff3-5873-432e-b763-14411e623d41,aac20ff3-5873-432e-b763-14411e623d41,0,1,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,fbc4df3e-c235-4197-8c1f-a5e39ac63a8c,0,1,6df44466-8750-481a-9baf-c924f0d45353,6df44466-8750-481a-9baf-c924f0d45353,0,1,110121eb-a0eb-4662-8911-3dcc3d341a73,110121eb-a0eb-4662-8911-3dcc3d341a73,0,1,f8980c18-6b9c-4e45-919a-22e976d2a846,f8980c18-6b9c-4e45-919a-22e976d2a846,0,1,c946efb7-c67e-49c1-bf56-d3c2d7220acd,c946efb7-c67e-49c1-bf56-d3c2d7220acd,0,1,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,7ed6bd83-b61d-4db4-8549-acacbdda6ca2,0,1,6b7c9f74-f2b6-463e-acb9-9f82901986cf,6b7c9f74-f2b6-463e-acb9-9f82901986cf,0,1,fc4c1d64-132b-4687-a37d-05000fdb4ba5,fc4c1d64-132b-4687-a37d-05000fdb4ba5,0,1,528777cd-090b-4b70-82f5-56def98c5893,528777cd-090b-4b70-82f5-56def98c5893,0,1,49dbe467-8832-4ede-9a05-494248619aeb,49dbe467-8832-4ede-9a05-494248619aeb,0,1,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,460ed9ca-10c2-491c-a641-b92ffc2a8e7c,0,1,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,bd5fadd3-9264-4c3b-9bd5-51e91847a6fb,0,1,09c73108-8528-4970-9b7f-fff9eda7816a,09c73108-8528-4970-9b7f-fff9eda7816a,0,1,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,40aa936e-cb1c-4ae9-85f1-6d930a5815cc,0,1,f568245a-d158-45dc-af92-2d411f12db7b,f568245a-d158-45dc-af92-2d411f12db7b,0,1,0f17cdac-aa17-45e6-b3d0-220b13345390,0f17cdac-aa17-45e6-b3d0-220b13345390,0,1,c675db75-d0c3-4026-b97c-6b23ecbb336a,c675db75-d0c3-4026-b97c-6b23ecbb336a,0,1,469f67fa-98b0-44b0-abd4-cae136c02834,469f67fa-98b0-44b0-abd4-cae136c02834,0,1,16a18458-999c-420e-80df-8fc10855746c,16a18458-999c-420e-80df-8fc10855746c,0,1,b794f222-0fde-439f-97a3-0da74075b415,b794f222-0fde-439f-97a3-0da74075b415,0,1,3a716aad-9b2c-48a7-b802-80732066391b,3a716aad-9b2c-48a7-b802-80732066391b,0,1,480d959f-aac8-4241-875f-78e1c1f32621,480d959f-aac8-4241-875f-78e1c1f32621,0,1,496e5de8-d75c-4536-9993-75374f070b40,496e5de8-d75c-4536-9993-75374f070b40,0,1,b4e610ba-c9c8-4b25-903b-e567dcbc2556,b4e610ba-c9c8-4b25-903b-e567dcbc2556,0,1,48febdbd-a085-4113-8511-ed7ff6be7d3c,48febdbd-a085-4113-8511-ed7ff6be7d3c,0,1,49413232-c0c3-4983-9d10-291a0399281b,49413232-c0c3-4983-9d10-291a0399281b,0,1,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,032bb782-96a7-4c1b-8b8f-eb4e18b555b7,0,1,b9b076bb-38ab-4a94-8226-41a4d4d7432c,b9b076bb-38ab-4a94-8226-41a4d4d7432c,0,1,e12da8db-4037-473e-ba2b-d0ceb4534dcb,e12da8db-4037-473e-ba2b-d0ceb4534dcb,0,1,789514e5-8ea3-4a5e-88c5-ed89c4135866,789514e5-8ea3-4a5e-88c5-ed89c4135866,0,1,a16768ff-6137-43d8-8784-4805ed83632a,a16768ff-6137-43d8-8784-4805ed83632a,0,1,61971286-9f94-4a27-aa34-e10848adb70a,61971286-9f94-4a27-aa34-e10848adb70a,0,1,1e75d143-3452-496e-a137-6d7f4c4ed019,1e75d143-3452-496e-a137-6d7f4c4ed019,0,1,e0619d14-c658-4eb5-841a-3a029de28be4,e0619d14-c658-4eb5-841a-3a029de28be4,0,1,99a3b660-7875-47f7-9c6c-c552e5673deb,99a3b660-7875-47f7-9c6c-c552e5673deb,0,1,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,2bdcf3a5-c8e1-492c-afee-f9db68e2fbb6,0,1,41cbf934-ea54-41df-abf0-09f319d2e67a,41cbf934-ea54-41df-abf0-09f319d2e67a,0,1,47246084-a5f8-4d0f-b4e2-204c1b97483a,47246084-a5f8-4d0f-b4e2-204c1b97483a,0,1,e58233ec-6cfc-4a8b-9929-689fa69cdb07,e58233ec-6cfc-4a8b-9929-689fa69cdb07,0,1,3291a891-a47c-43ca-b088-aecd3867d38c,3291a891-a47c-43ca-b088-aecd3867d38c,0,1,56cde2b4-00f2-49ba-b407-16e241c17fd2,56cde2b4-00f2-49ba-b407-16e241c17fd2,0,1,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,bd84fb2b-4c52-4e2f-a8c5-f289b8336145,0,1,219ed110-f2a0-41c1-ac5a-02301b248c54,219ed110-f2a0-41c1-ac5a-02301b248c54,0,1,1c722dfd-2b07-4985-9188-17353de24771,1c722dfd-2b07-4985-9188-17353de24771,0,1,1a630496-2cdd-4c89-a1aa-ed20545ad133,1a630496-2cdd-4c89-a1aa-ed20545ad133,0,1,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,b0dd02ee-ea6a-43f2-baa2-abac0a1ab4bb,0,1,b19cea0e-e57a-4969-8daf-f48d3d16705f,b19cea0e-e57a-4969-8daf-f48d3d16705f,0,1,d4059340-3361-4baa-ae48-ecbfb9800a2e,d4059340-3361-4baa-ae48-ecbfb9800a2e,0,1,f78f6c43-dd90-4117-acf7-ed5b951cb964,f78f6c43-dd90-4117-acf7-ed5b951cb964,0,1,8eebd519-4989-4784-82b8-39d77eebfb17,8eebd519-4989-4784-82b8-39d77eebfb17,0,1,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0a2cb6e3-d9fa-4881-b136-7b6db9efca07,0,1,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,c1561ed9-2fbf-4c12-a484-07f8adbe8fa3,0,1,4527877b-5723-4aa5-8705-98174ac9c337,4527877b-5723-4aa5-8705-98174ac9c337,0,1,d6b21e7b-df57-4280-8c95-c269b5316018,d6b21e7b-df57-4280-8c95-c269b5316018,0,1,808c468b-6322-428d-ac6a-ccf2228b05b6,808c468b-6322-428d-ac6a-ccf2228b05b6,0,1,13664bb2-738f-4d18-b382-a7bcf8105a5a,13664bb2-738f-4d18-b382-a7bcf8105a5a,0,1,f3f56abe-9248-4555-bf99-29560eb4f9ee,f3f56abe-9248-4555-bf99-29560eb4f9ee,0,1,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0dbd5d55-a85f-4c7e-ac31-7ba4ab7cc371,0,1,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,dd9d09ef-3b4b-4bb5-9408-9c4080049bb3,0,1,3eb43a06-b32d-4904-8489-6264d0207623,3eb43a06-b32d-4904-8489-6264d0207623,0,1,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,a18098cf-5a61-46b5-bd55-cc61d15aa6bc,0,1,18615fe1-cfee-4888-9c09-88d1c5db39eb,18615fe1-cfee-4888-9c09-88d1c5db39eb,0,1,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,63e363fa-8b0c-4d48-ab1b-9c953c5ed4c0,0,1,087c83c0-75e7-476b-b7c6-5be55498a190,087c83c0-75e7-476b-b7c6-5be55498a190,0,1,ec5e5413-9e77-4929-83b8-6fee70688b28,ec5e5413-9e77-4929-83b8-6fee70688b28,0,1,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,59cd8e3f-ecf3-4e1d-bd98-41551d5d6f68,0,1,8390c864-2b84-4c45-8583-cb4a4ab49168,8390c864-2b84-4c45-8583-cb4a4ab49168,0,1,1b2fefca-fef5-4319-90cc-325444cb63a6,1b2fefca-fef5-4319-90cc-325444cb63a6,0,1,34a128be-8fbb-4dd8-ac23-9f35041feb63,34a128be-8fbb-4dd8-ac23-9f35041feb63,0,1,baa31006-e0d6-496e-a60e-27b3dfd19397,baa31006-e0d6-496e-a60e-27b3dfd19397,0,1,3007d8ff-3942-45ed-bac5-8a6c40ca060c,3007d8ff-3942-45ed-bac5-8a6c40ca060c,0,1,8bfe1474-fd12-4744-a9ab-3383bfe766b3,8bfe1474-fd12-4744-a9ab-3383bfe766b3,0,1,3af97375-f776-4129-9521-b8d65d795db6,3af97375-f776-4129-9521-b8d65d795db6,0,1,0e98801b-a45b-44cb-a341-7e43d723f6ed,0e98801b-a45b-44cb-a341-7e43d723f6ed,0,1,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,5b71cd3b-d5b8-4632-9678-0ab1e1d2ea91,0,1,103ac72d-c386-40ea-89d4-35798d064f1a,103ac72d-c386-40ea-89d4-35798d064f1a,0,1,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,645ceb40-1e9f-4a67-aa7f-b9002fa066b3,0,1,d1fe15e9-8e5c-4819-85cd-24ab31409437,d1fe15e9-8e5c-4819-85cd-24ab31409437,0,1,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,c8c5bfe9-ead5-4e79-9fd5-60ad275faa1e,0,1,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,8f9826b6-890e-4ba3-a1f2-bc9ebb3238dd,0,1,74f68bda-17b1-4b3c-aa64-b1014300f9b5,74f68bda-17b1-4b3c-aa64-b1014300f9b5,0,1,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,90a195b0-7f64-4ccb-986e-8c8c2cf12ccd,0,1,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,9f9d1f8c-7ff9-420f-a426-48f33493d9f2,0,1,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,ab7bc0bc-b4b8-4a4a-aecc-1cbe14fd4975,0,1,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,9f8d9594-674f-49ef-9fb8-bb64d5c40a37,0,1,47ee7d38-9fa9-458d-abee-e11270f79494,47ee7d38-9fa9-458d-abee-e11270f79494,0,1,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,bb6b83ff-81f4-4c39-ad8e-8cda9ccd9cb9,0,1,076daecf-8fcb-496b-9f13-c4faa3a8a722,076daecf-8fcb-496b-9f13-c4faa3a8a722,0,1,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,f1a8357b-7083-42b3-ab5d-36223a3dd2a4,0,1,296d7725-bdd3-4210-9db9-31de5711ea9b,296d7725-bdd3-4210-9db9-31de5711ea9b,0,1,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,6ecc5bc2-20b3-46f3-8019-ae1e1f3de319,0,1,1d05f89a-23dd-4d30-8786-abe8a9a39a40,1d05f89a-23dd-4d30-8786-abe8a9a39a40,0,1,245c2c6c-7b7f-4381-9304-1d7287a215fa,245c2c6c-7b7f-4381-9304-1d7287a215fa,0,1,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,fd17bbe4-34d9-4832-8eea-8eeb82194e4c,0,1,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,d4c72d7f-7e1f-473c-9a2b-fa675fc78731,0,1,8bb5be12-98df-4a38-bffe-432fb13d8101,8bb5be12-98df-4a38-bffe-432fb13d8101,0,1,94209023-ce88-401c-9aff-526fb7e43709,94209023-ce88-401c-9aff-526fb7e43709,0,1,22b99094-b52a-4244-ae91-53848d82560b,22b99094-b52a-4244-ae91-53848d82560b,0,1,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,22c9e2fa-c1f0-41ec-b6f2-9d7357dd3479,0,1,b0002134-d5c9-4508-9f0e-97f92461b590,b0002134-d5c9-4508-9f0e-97f92461b590,0,1,1506ec71-cb38-4831-a29d-dac2c4deddda,1506ec71-cb38-4831-a29d-dac2c4deddda,0,1,e05fd82b-b77b-4b7f-b300-43653017f341,e05fd82b-b77b-4b7f-b300-43653017f341,0,1,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,d3b5e5ee-2317-43b4-b669-3af2ce635cf3,0,1,f15a0526-c207-42fe-aed9-438ae0c4a4b8,f15a0526-c207-42fe-aed9-438ae0c4a4b8,0,1,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,9d444a41-7190-48fb-9a4a-08f8e7bc32a3,0,1,8583cab0-0620-4346-96e0-bcac40981b8a,8583cab0-0620-4346-96e0-bcac40981b8a,0,1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,e1dfba26-c682-42a2-8e15-fe6f535c9ce1,0,1,095990b1-187b-400c-941a-275f272239ca,095990b1-187b-400c-941a-275f272239ca,0,1,ba108470-350d-40c3-bb44-9852c2aa8c97,ba108470-350d-40c3-bb44-9852c2aa8c97,0,1,a37c33fa-64b0-4a1b-846a-0a236bad44f8,a37c33fa-64b0-4a1b-846a-0a236bad44f8,0,1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,d8481ce1-7f64-47b0-8fc0-6642ae93aca1,0,1,a50f4324-da44-449b-b500-74228b2aa7e0,a50f4324-da44-449b-b500-74228b2aa7e0,0,1,04236716-9c36-4a1d-b4fb-4b8c65644ab4,04236716-9c36-4a1d-b4fb-4b8c65644ab4,0,1,97276702-6686-4ac4-8360-d85369a08b20,97276702-6686-4ac4-8360-d85369a08b20,0,1,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,e5450ee7-e891-4f58-9a01-d2d81d5ddd6d,0,1,068883fe-d7ae-40e7-ad82-864867916daa,068883fe-d7ae-40e7-ad82-864867916daa,0,1,c1b02568-2095-4f83-8543-2402f67dbe3d,c1b02568-2095-4f83-8543-2402f67dbe3d,0,1,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,8b749b7a-5e68-4523-adc2-8b3c5ce9701c,0,1,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,bf3c7edc-0791-459e-a7ac-b7e8d7ed97fe,0,1,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,7dc6d13e-4edf-4e6a-9ee9-4b32ad889ecf,0,1,aecbd726-6952-49e6-b544-4c5cc764c24c,aecbd726-6952-49e6-b544-4c5cc764c24c,0,1,d335cfbf-bc78-4274-a178-10f60372474a,d335cfbf-bc78-4274-a178-10f60372474a,0,1,0f4411b3-addf-4fcf-8da8-c5140dea356c,0f4411b3-addf-4fcf-8da8-c5140dea356c,0,1,c501f9ab-d01b-4137-8cd0-e66103117c84,c501f9ab-d01b-4137-8cd0-e66103117c84,0,1,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,8d5d4e0f-b7b5-4cdc-aedc-571517fa101f,0,1,66e65355-1424-4c74-801c-faf5357257aa,66e65355-1424-4c74-801c-faf5357257aa,0,1,0a93187b-7ae4-4985-8089-3099dfec2b48,0a93187b-7ae4-4985-8089-3099dfec2b48,0,1,044458f3-ed9b-4afb-ae73-8f9162c032bf,044458f3-ed9b-4afb-ae73-8f9162c032bf,0,1,578f618e-5f4a-4e86-959d-39b59e973936,578f618e-5f4a-4e86-959d-39b59e973936,0,1,f74ede2e-2d28-4224-ba44-773eda7760a4,f74ede2e-2d28-4224-ba44-773eda7760a4,0,1,217df06a-1bdf-4394-b617-ed756ff17bc6,217df06a-1bdf-4394-b617-ed756ff17bc6,0,1,a1572e97-a487-497a-9062-49315e237e0f,a1572e97-a487-497a-9062-49315e237e0f,0,1,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,969cdcb8-0f2a-427f-93a0-e7ae38f465e8,0,1,3c5d87a0-cfce-464a-b946-64c5a589a376,3c5d87a0-cfce-464a-b946-64c5a589a376,0,1,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,2d22c67d-4795-4a6b-bc81-a3ed1eb28367,0,1,763de8d1-7f53-41b6-8d97-7da724e9f763,763de8d1-7f53-41b6-8d97-7da724e9f763,0,1,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,75592ed4-2aab-4dfc-ae7b-d93e2a98370f,0,1,4ad59c75-cca4-4968-82e6-babd72d8b318,4ad59c75-cca4-4968-82e6-babd72d8b318,0,1,c248de15-63a2-48ec-8695-7a5213d4fc9b,c248de15-63a2-48ec-8695-7a5213d4fc9b,0,1,272ff0f9-7266-4c22-be12-fe62682b56a5,272ff0f9-7266-4c22-be12-fe62682b56a5,0,1,9f141dd5-d866-4c25-b58a-a7766a08b4e7,9f141dd5-d866-4c25-b58a-a7766a08b4e7,0,1,0570d846-889d-4cfc-98fb-a1ad0181597f,0570d846-889d-4cfc-98fb-a1ad0181597f,0,1,19e17c58-953f-4917-8b6a-c88808fcca36,19e17c58-953f-4917-8b6a-c88808fcca36,0,1,4804316d-3765-4a83-8438-10e8e82656db,4804316d-3765-4a83-8438-10e8e82656db,0,1,59458556-e343-4215-8e6c-69f924ec4183,59458556-e343-4215-8e6c-69f924ec4183,0,1,dd553dca-7eba-41bf-8939-2c61e170ff65,dd553dca-7eba-41bf-8939-2c61e170ff65,0,1,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,b4ecf3dc-a2aa-406e-a593-1700ea8746bc,0,1,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,933d7ce7-ea82-4b26-8d1b-dc92cb5ac92d,0,1,8099e978-28cc-4ade-ac5a-3785f3a45f70,8099e978-28cc-4ade-ac5a-3785f3a45f70,0,1,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,11eff613-8077-41fa-8cb8-5e8dc27d0e4f,0,1,fe023ca5-f11a-4b98-99c1-363508e4ea4a,fe023ca5-f11a-4b98-99c1-363508e4ea4a,0,1,6f8d515e-13d9-45f8-9793-3757f5b85f81,6f8d515e-13d9-45f8-9793-3757f5b85f81,0,1,25ec541c-c437-4318-b2a8-5146df6ae080,25ec541c-c437-4318-b2a8-5146df6ae080,0,1,148754ed-3063-40a7-a3c3-8ad105552370,148754ed-3063-40a7-a3c3-8ad105552370,0,1,ab3f0862-c355-4fd7-a2a7-4eb8278de510,ab3f0862-c355-4fd7-a2a7-4eb8278de510,0,1,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,85bbfe20-a6a4-49ca-8f20-342f4cbe8258,0,1,c12c3f3b-3a96-4e70-b131-8d7bd765095f,c12c3f3b-3a96-4e70-b131-8d7bd765095f,0,1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,70ee4b32-80d1-4b79-a322-0433f1b8c7f1,0,1,c563588c-346e-499e-ae33-9ff3cb62e658,c563588c-346e-499e-ae33-9ff3cb62e658,0,1,40dbc001-97b6-4188-8de9-3adac670bac4,40dbc001-97b6-4188-8de9-3adac670bac4,0,1,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,a4ed8b24-bd23-45a7-9f34-61b25b91d0c6,0,1,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,65efaa10-3239-4f0f-a08e-88c89d9d8d5a,0,1,93aa5247-6823-4f70-9d47-e5a0f409828a,93aa5247-6823-4f70-9d47-e5a0f409828a,0,1,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,030c6a22-a3d5-4cf2-9f7b-dc4fe3732f83,0,1,b19f1223-5ebe-4446-bacc-bc7d53486f2e,b19f1223-5ebe-4446-bacc-bc7d53486f2e,0,1,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,6ea7e8e9-0faa-43fd-b9c8-1a7b8f899d6d,0,1,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,7be1decf-feb1-422b-a3f2-f60d08fdb0e6,0,1,bf3167d6-3047-482a-b280-184f446ae7a3,bf3167d6-3047-482a-b280-184f446ae7a3,0,1,50c47c0a-a199-4020-9df4-91b17c159454,50c47c0a-a199-4020-9df4-91b17c159454,0,1,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,c1d449af-8a6e-4cb0-b2c9-50ea5405c44c,0,1,faecdc33-fed8-4b44-96f4-4215c26959b6,faecdc33-fed8-4b44-96f4-4215c26959b6,0,1,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,09c29992-47a8-4fca-bd95-e7dbc53e8c4c,0,1,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,f07cf7bd-6f3f-426a-8b71-ba1dcb827654,0,1,9df3792e-a4ee-4a2c-9296-c1384925521e,9df3792e-a4ee-4a2c-9296-c1384925521e,0,1,03d423db-f98a-468f-9040-5b76454e5a98,03d423db-f98a-468f-9040-5b76454e5a98,0,1,08f394f9-d254-4fe5-8651-a69c96de7a62,08f394f9-d254-4fe5-8651-a69c96de7a62,0,1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,e90ec54b-8b86-43df-8c3c-18c6676bf3f1,0,1,6aff6b2f-660b-4d75-9064-fed7a6b0feac,6aff6b2f-660b-4d75-9064-fed7a6b0feac,0,1,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,53502127-9f47-4e2e-b3ed-eb3c3aae1c50,0,1,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,2fcdd0b5-b738-4e19-8bbf-13a72d7014ec,0,1,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,59dc7e8d-6f5c-4e1b-816e-5fc15c0e96e0,0,1,e60a9221-7676-456f-8a01-b317b03a278b,e60a9221-7676-456f-8a01-b317b03a278b,0,1,4e81ec90-f668-49ca-9193-22337bafb01b,4e81ec90-f668-49ca-9193-22337bafb01b,0,1,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,104c7c31-5bbd-4242-b29a-2c0d8b69a1b9,0,1,cd60adec-52d6-4fa8-85ca-26551196432c,cd60adec-52d6-4fa8-85ca-26551196432c,0,1,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,4dfbabd7-d5e5-4b2a-b8d1-752e416629a0,0,1,b71ddbdb-08bb-46be-a79d-319c4a557e76,b71ddbdb-08bb-46be-a79d-319c4a557e76,0,1,d3dfa867-3d52-4872-a69e-f27636abe1bd,d3dfa867-3d52-4872-a69e-f27636abe1bd,0,1,6952d1aa-7132-4e40-8542-f64a4dc1e029,6952d1aa-7132-4e40-8542-f64a4dc1e029,0,1,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,51a1bc4c-9139-42a4-92c3-f45c837cbdb9,0,1,1621811b-dfd3-4c58-8e15-ced16690147a,1621811b-dfd3-4c58-8e15-ced16690147a,0,1,3f266e51-0476-4b7f-8d61-6f9f4456049d,3f266e51-0476-4b7f-8d61-6f9f4456049d,0,1,2b9ce591-ff13-4c2d-85c4-632a2609a211,2b9ce591-ff13-4c2d-85c4-632a2609a211,0,1,689ca0ec-61ce-4590-b73b-ac81e8f1d459,689ca0ec-61ce-4590-b73b-ac81e8f1d459,0,1,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,3ea1895f-66d0-4bbb-a66b-0c9d411a7c55,0,1,55ad36d7-399e-4b82-8d1c-d45bd890abfe,55ad36d7-399e-4b82-8d1c-d45bd890abfe,0,1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0f3b9012-7bf6-4451-b0c3-139d98d9c2c1,0,1,1b39a65f-5425-4bcb-85bd-1425274af8a8,1b39a65f-5425-4bcb-85bd-1425274af8a8,0,1,392a0618-a41a-4713-a561-f3a80b85abd8,392a0618-a41a-4713-a561-f3a80b85abd8,0,1,a453384d-658d-40f1-ac69-578aa3a24e39,a453384d-658d-40f1-ac69-578aa3a24e39,0,1,2215a441-b9b1-4e5c-8df3-e6cee9226c43,2215a441-b9b1-4e5c-8df3-e6cee9226c43,0,1,2a8d4908-ea0d-4837-be3f-bd78f6b61254,2a8d4908-ea0d-4837-be3f-bd78f6b61254,0,1,ec1deb79-7369-4b26-8e91-f51399e8052a,ec1deb79-7369-4b26-8e91-f51399e8052a,0,1,75dde4fb-3a1a-450c-95c2-c1f95a781db9,75dde4fb-3a1a-450c-95c2-c1f95a781db9,0,1,0ae3ac56-160a-417e-9952-719d02e7f089,0ae3ac56-160a-417e-9952-719d02e7f089,0,1,f5b3983d-d22d-44a8-9069-0a60d8b858bf,f5b3983d-d22d-44a8-9069-0a60d8b858bf,0,1,48659b94-ace8-45f4-a043-6b2731ec6925,48659b94-ace8-45f4-a043-6b2731ec6925,0,1,3a8e60f9-19cb-42a6-a448-ad211261d9b8,3a8e60f9-19cb-42a6-a448-ad211261d9b8,0,1,74320602-094a-4645-b2c9-3053377a3ac3,74320602-094a-4645-b2c9-3053377a3ac3,0,1,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,3aba26a3-76ee-46c0-9e11-6f64fc754a0d,0,1,b066c732-9c5f-4504-894f-96d457b0768f,b066c732-9c5f-4504-894f-96d457b0768f,0,1,9366463d-aa8a-4e89-86d8-c7f746f9551b,9366463d-aa8a-4e89-86d8-c7f746f9551b,0,1,e25da569-d435-45b2-b4e8-fc76d7f1c8df,e25da569-d435-45b2-b4e8-fc76d7f1c8df,0,1,a51a7f57-9c52-4457-819c-13e1b6f886e1,a51a7f57-9c52-4457-819c-13e1b6f886e1,0,1,7d08daba-5e36-4ce3-8a70-17750959b89e,7d08daba-5e36-4ce3-8a70-17750959b89e,0,1,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,e2c2d915-ae50-4fa0-add3-26ad7dc75efb,0,1,39344a8c-2662-48ff-937b-12951bb268fb,39344a8c-2662-48ff-937b-12951bb268fb,0,1,b577663f-ead2-4b18-a4f6-f7f303e89319,b577663f-ead2-4b18-a4f6-f7f303e89319,0,1,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,43dc335f-5503-47ab-9c6b-0b4c6ab13f57,0,1,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,6cc0a1d7-01eb-4af6-b4ed-4002e2316080,0,1,72663843-4010-42ed-989b-0b58bf9f7146,72663843-4010-42ed-989b-0b58bf9f7146,0,1,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,79da4490-f0b0-48b5-b435-3b2c9ffb0eb3,0,1,3adcceea-867e-4b88-a633-4f8d4ccb43c0,3adcceea-867e-4b88-a633-4f8d4ccb43c0,0,1,a132189c-6584-4bb1-9cfd-1415cd83228a,a132189c-6584-4bb1-9cfd-1415cd83228a,0,1,7ba50e13-0a78-4cca-821f-006b1c83b0b0,7ba50e13-0a78-4cca-821f-006b1c83b0b0,0,1,a3670f95-5abe-49ee-8ea5-d7e4438801ba,a3670f95-5abe-49ee-8ea5-d7e4438801ba,0,1,4443dea1-5143-4e76-97a7-c35dbe1665e4,4443dea1-5143-4e76-97a7-c35dbe1665e4,0,1,0d780521-0767-425a-b44d-315d2dc42d04,0d780521-0767-425a-b44d-315d2dc42d04,0,1,c5b1572d-28f5-42f3-b2e0-8b54f091642e,c5b1572d-28f5-42f3-b2e0-8b54f091642e,0,1,0986c1b6-b677-428d-b49f-a93e40e77171,0986c1b6-b677-428d-b49f-a93e40e77171,0,1,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,b9c41558-8fe7-45f6-bcb0-5ea3a35264cf,0,1,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,597c1f9b-3cbd-42bd-b819-f29b3a3f073a,0,1,b6662b2e-7e93-4eaa-9e4b-b5647285932b,b6662b2e-7e93-4eaa-9e4b-b5647285932b,0,1,4a180f2c-dc54-4591-8f62-f236d1e07799,4a180f2c-dc54-4591-8f62-f236d1e07799,0,1,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,3f1578ba-3d55-4eff-bbdd-6329dd5060d5,0,1,a9a51e79-4c79-4a43-931b-c0321c1cd65b,a9a51e79-4c79-4a43-931b-c0321c1cd65b,0,1,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,e8644d90-ec2f-4ac0-8fbd-a7aa95c9bcec,0,1,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,048a1d86-bcf5-47aa-a36c-eb20c3f9f7e5,0,1,22f2696e-0ac1-4a74-bca9-987b267b2b59,22f2696e-0ac1-4a74-bca9-987b267b2b59,0,1,d705cacc-3485-46d7-9ff4-48c3c0757c81,d705cacc-3485-46d7-9ff4-48c3c0757c81,0,1,98f043ea-633c-4a03-a56f-efbc9e6ef288,98f043ea-633c-4a03-a56f-efbc9e6ef288,0,1,2033b92a-0750-478a-a12d-cf4f74d0a9da,2033b92a-0750-478a-a12d-cf4f74d0a9da,0,1,92fa2196-d8e5-45f9-9d2e-59d837b163ea,92fa2196-d8e5-45f9-9d2e-59d837b163ea,0,1,25dc2290-e283-4449-81c1-1ce15b58067f,25dc2290-e283-4449-81c1-1ce15b58067f,0,1,c534a865-a17f-41e7-88b9-c6af89c9d202,c534a865-a17f-41e7-88b9-c6af89c9d202,0,1,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0214bfe6-fb98-4487-8d98-6b10d24a3c4d,0,1,0127937c-94c0-43fe-9630-cc2ec6904ad8,0127937c-94c0-43fe-9630-cc2ec6904ad8,0,1,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,ce7c87b8-e4ab-47e2-b70a-7dcae8bfb8a8,0,1,8df5b3cd-7788-4198-a530-e88be83f1cdf,8df5b3cd-7788-4198-a530-e88be83f1cdf,0,1,ffaeea66-66d5-4741-a9b5-875afebfce7f,ffaeea66-66d5-4741-a9b5-875afebfce7f,0,1,7572095f-d755-4929-8862-071b1c34f758,7572095f-d755-4929-8862-071b1c34f758,0,1,4e36184e-d818-4f38-9257-6d91d9cc85ae,4e36184e-d818-4f38-9257-6d91d9cc85ae,0,1,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,afcba8a1-5d3e-4a76-9be9-5fbda20d55bd,0,1,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,cbdc8d7e-b685-4c8d-9f47-d8bfb08300d4,0,1,3893a258-a9c7-441a-b80c-1cc8c3f4735c,3893a258-a9c7-441a-b80c-1cc8c3f4735c,0,1,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,f9ad1ef3-7475-4d55-a1ef-eadceda9bf6b,0,1,c66d0377-45bb-4ef0-bf9b-b44a9c510d38,c66d0377-45bb-4ef0-bf9b-b44a9c510d38,0,1,420748d8-4042-4e1e-aca1-ac0190cdf54e,420748d8-4042-4e1e-aca1-ac0190cdf54e,0,1,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,a64b15fa-fc34-43fe-a366-d27c0f1c3df2,0,1,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,8b13e848-8fd3-4326-bd18-5a5b12ed3dc5,0,1,f8a456fa-a533-444c-a504-0e74306ada44,f8a456fa-a533-444c-a504-0e74306ada44,0,1,4751a91a-f211-4f66-8238-9bb5668cbc67,4751a91a-f211-4f66-8238-9bb5668cbc67,0,1,f1381abc-e09f-407d-b6b5-c59e7c9e2fd7,f1381abc-e09f-407d-b6b5-c59e7c9e2fd7,0,1,e6c871d6-e06f-420b-ae04-dbf735d3233d,e6c871d6-e06f-420b-ae04-dbf735d3233d,0,1,b9a6b053-2b93-4946-9531-040d3131dcc5,b9a6b053-2b93-4946-9531-040d3131dcc5,0,1,6287eded-23d8-4b04-8415-1d9afa17713b,6287eded-23d8-4b04-8415-1d9afa17713b,0,1,8ce3513d-d086-46f4-81c3-1761594a64c5,8ce3513d-d086-46f4-81c3-1761594a64c5,0,1,79cb147c-8c6b-4f6e-8d5d-dfa29a6e6e53,79cb147c-8c6b-4f6e-8d5d-dfa29a6e6e53,0,1,704f07f2-0513-4a54-bb41-27ca3deb5834,704f07f2-0513-4a54-bb41-27ca3deb5834,0,1,0504ea28-d8ed-43ac-afa5-c3f32c21b385,0504ea28-d8ed-43ac-afa5-c3f32c21b385,0,1,2ccbc9aa-52d3-4cf3-8e83-77aaef82a38d,2ccbc9aa-52d3-4cf3-8e83-77aaef82a38d,0,1,e9c632b0-7977-4e44-ac56-882617ad7cdc,e9c632b0-7977-4e44-ac56-882617ad7cdc,0,1,e84acba7-7e0f-43e8-a545-6e53d529d5d4,e84acba7-7e0f-43e8-a545-6e53d529d5d4,0,1,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,3b089d90-7ece-4b74-a4dc-e436d9d31b3b,0,1,6086d53f-f1b2-4126-ab46-64705fe63b87,6086d53f-f1b2-4126-ab46-64705fe63b87,0,1,9295d88f-0865-440c-a98a-4710c50211be,9295d88f-0865-440c-a98a-4710c50211be,0,1,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,90aa51ae-434d-48f4-bfe3-0e1dd3aeea6f,0,1,38ac9a13-665a-4201-b5cc-687fe4a01130,38ac9a13-665a-4201-b5cc-687fe4a01130,0,1,97c59096-b2dc-45d0-a580-b3018a04f9af,97c59096-b2dc-45d0-a580-b3018a04f9af,0,1,6fbf63b7-1692-495e-a8ec-bdda182997a3,6fbf63b7-1692-495e-a8ec-bdda182997a3,0,1,8172256e-f51e-4de0-bd07-3668785f4cb9,8172256e-f51e-4de0-bd07-3668785f4cb9,0,1,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,ccb54dc9-3d12-43d0-af6a-138d3526f5d5,0,1,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,b82bcff8-49c9-44a9-8a9f-4428b0cc54a5,0,1,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,870b4d6d-0b89-4eda-a2b3-5c6db7dbe864,0,1,c172aeaf-b444-47c0-baee-80ccd91fe934,c172aeaf-b444-47c0-baee-80ccd91fe934,0,1,b8c36d5a-7966-4978-9225-67502b9c60a4,b8c36d5a-7966-4978-9225-67502b9c60a4,0,1,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,37ea0c64-2fec-4c2e-922b-d3a2f01f3e22,0,1,bb6e6574-4328-4cf5-a043-a7d8f6c81414,bb6e6574-4328-4cf5-a043-a7d8f6c81414,0,1,b46b5090-5eb1-4950-9031-8b43f611fa9c,b46b5090-5eb1-4950-9031-8b43f611fa9c,0,1,94e02f76-8656-4999-9470-dd996118400c,94e02f76-8656-4999-9470-dd996118400c,0,1,9effd265-3783-44e2-8698-80dd82137546,9effd265-3783-44e2-8698-80dd82137546,0,1,bef52020-98f8-465b-8981-e5f8eed62308,bef52020-98f8-465b-8981-e5f8eed62308,0,1,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,19897ad0-bdb5-439c-b4a2-a773c0ce5cf5,0,1,e731dab7-df9e-48ae-8542-4c0c30666ae9,e731dab7-df9e-48ae-8542-4c0c30666ae9,0,1,6ac484a9-4d96-4521-9b8c-66212a365725,6ac484a9-4d96-4521-9b8c-66212a365725,0,1,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0841ebfc-12e6-4b3e-a60f-861b15e1b63c,0,1,bde05768-2dd6-4800-985d-27075f610cca,bde05768-2dd6-4800-985d-27075f610cca,0,1,d18956cf-e449-48cc-a127-01b5dc910ea2,d18956cf-e449-48cc-a127-01b5dc910ea2,0,1,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,8e5487a3-b5e5-40ca-88f3-5b0ea0c4d481,0,1,e352fc19-96be-4410-a516-bc58cc234422,e352fc19-96be-4410-a516-bc58cc234422,0,1,9b742da4-1696-4c06-9dfa-dd85c9286c74,9b742da4-1696-4c06-9dfa-dd85c9286c74,0,1,757ea742-8c14-4e0a-a867-432eee5cfc64,757ea742-8c14-4e0a-a867-432eee5cfc64,0,1,db1062bc-4164-4095-9640-9804c0ebcd0b,db1062bc-4164-4095-9640-9804c0ebcd0b,0,1,d5a13430-518a-4917-9de9-d00abbcce500,d5a13430-518a-4917-9de9-d00abbcce500,0,1,ea7c61ff-745c-4908-9a94-bba022d12de4,ea7c61ff-745c-4908-9a94-bba022d12de4,0,1,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,4d6683a3-1edd-4d04-8e02-0be002e4e5a4,0,1,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,c7ffd8ab-15e9-4cf1-a7fd-d05534dff000,0,1,53caada5-1d53-45dc-9432-90075ddca890,53caada5-1d53-45dc-9432-90075ddca890,0,1,d1472d23-954b-4069-b2d6-df08c6ec0be1,d1472d23-954b-4069-b2d6-df08c6ec0be1,0,1,93fe2ce6-7193-42bc-a966-4653b7989eaa,93fe2ce6-7193-42bc-a966-4653b7989eaa,0,1,a7fe0aa5-722c-4a09-889b-ee422421addc,a7fe0aa5-722c-4a09-889b-ee422421addc,0,1,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,798bd34c-d0ee-4590-9b1d-8bc47e42ca8c,0,1,0c838a31-2b08-447c-b39a-a613cfba526c,0c838a31-2b08-447c-b39a-a613cfba526c,0,1,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,b25083c5-9b97-49a4-b6c3-bbf8d7f91cd3,0,1,86c679c0-3531-4622-9a1f-3d9d6ccdd431,86c679c0-3531-4622-9a1f-3d9d6ccdd431,0,1,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,3bc2ca38-4a10-4ebd-a5dc-3418db494f0c,0,1,670c62c1-1a33-4dec-9540-5b4c1fe29074,670c62c1-1a33-4dec-9540-5b4c1fe29074,0,1,cc664d81-d0af-4d25-ae29-64f422e51bf2,cc664d81-d0af-4d25-ae29-64f422e51bf2,0,1,e1314cd1-e662-4c29-ad51-492cb0029883,e1314cd1-e662-4c29-ad51-492cb0029883,0,1,879844f0-30b4-47f5-8d2e-5fea29910368,879844f0-30b4-47f5-8d2e-5fea29910368,0,1,9bc09758-a7ce-44e0-baa3-a3e909869d9b,9bc09758-a7ce-44e0-baa3-a3e909869d9b,0,1,303334ba-2785-47fe-a094-84f9dea33be2,303334ba-2785-47fe-a094-84f9dea33be2,0,1,9690842c-7a2c-4b5d-a238-f730afc49a7b,9690842c-7a2c-4b5d-a238-f730afc49a7b,0,1,04424730-6992-4a5b-838b-7a7c16dedbd0,04424730-6992-4a5b-838b-7a7c16dedbd0,0,1,240bec31-cd59-477b-8459-8e3278da22dc,240bec31-cd59-477b-8459-8e3278da22dc,0,1,e0519f0c-9c99-4f5c-a3a9-27adce45737d,e0519f0c-9c99-4f5c-a3a9-27adce45737d,0,1,554320a0-55dc-4289-bb08-63d405cb4ca5,554320a0-55dc-4289-bb08-63d405cb4ca5,0,1,0874a3c0-0d16-4172-b467-f0666d5fcaee,0874a3c0-0d16-4172-b467-f0666d5fcaee,0,1,cc380a19-ab29-4f20-93ad-9a58cd4de56e,cc380a19-ab29-4f20-93ad-9a58cd4de56e,0,1,6a5f7521-270e-476e-88ec-a8cf79ea61a6,6a5f7521-270e-476e-88ec-a8cf79ea61a6,0,1,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,9bb841e7-e629-4a1f-8ff6-f8bca0b2b133,0,1,e54a8786-86a4-48e3-a210-aaae4e5fce8c,e54a8786-86a4-48e3-a210-aaae4e5fce8c,0,1,86c86ea2-d14e-4443-b36c-c1c17c4f768a,86c86ea2-d14e-4443-b36c-c1c17c4f768a,0,1,14512818-58b0-44cc-b00d-d37913c57aad,14512818-58b0-44cc-b00d-d37913c57aad,0,1,57964dd6-4b0b-4590-bc44-de744cc423af,57964dd6-4b0b-4590-bc44-de744cc423af,0,1,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,364cbfe2-bc44-4387-aa7e-6b4aa086c9e9,0,1,46e0522b-b88b-43b2-9067-a5359e90994b,46e0522b-b88b-43b2-9067-a5359e90994b,0,1,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,727c7c01-83e6-4d59-afa4-ee36f1cbacf2,0,1,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,b143bc6d-ead6-41a2-9a15-1a44488c1ce4,0,1,72d41d01-9c9d-4fbe-8a39-932d82d171ef,72d41d01-9c9d-4fbe-8a39-932d82d171ef,0,1,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,b1e7d3c3-9fc1-4364-a8c3-b076080c7472,0,1,697d5715-dd04-40be-9b28-539734725158,697d5715-dd04-40be-9b28-539734725158,0,1,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,d831a8ac-88a4-4191-ab0b-7538dfb3e7d7,0,1,d95fcb37-fc65-466d-93e2-489f41683276,d95fcb37-fc65-466d-93e2-489f41683276,0,1,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,c6b0d31e-7b68-4c7f-a565-0ac8a7c11143,0,1,a27a9296-46bb-49a1-8308-db675baa81d0,a27a9296-46bb-49a1-8308-db675baa81d0,0,1,1456f317-360c-4190-b2d1-1be7484369a5,1456f317-360c-4190-b2d1-1be7484369a5,0,1,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,5ac74bb3-a4df-47db-ad87-6cb95b85c51f,0,1,4867948f-b027-44ae-b78c-a94e00eed52b,4867948f-b027-44ae-b78c-a94e00eed52b,0,1,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,39ed5463-b1c0-44bb-9d71-4ef08007a7d0,0,1,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,3d4cb11a-7ce7-4c46-a427-99d6f41f08bf,0,1,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,56cc2ba7-fee3-4dcb-9a2a-93dc94a5ee1f,0,1,ef044879-e731-418a-b917-6a685f27c5f4,ef044879-e731-418a-b917-6a685f27c5f4,0,1,f0ffe529-481f-4eed-8fc8-02a9d8f08f7a,f0ffe529-481f-4eed-8fc8-02a9d8f08f7a,0,1,618d13d5-fd1f-4b70-ad45-dd6a17a50730,618d13d5-fd1f-4b70-ad45-dd6a17a50730,0,1,58037b76-b548-4f07-bd67-67e552a5c6e5,58037b76-b548-4f07-bd67-67e552a5c6e5,0,1,68f19104-5fa3-4f28-a84b-bf68c3bed49b,68f19104-5fa3-4f28-a84b-bf68c3bed49b,0,1,ab0b6824-99ba-4b8d-857d-ed8ef017d499,ab0b6824-99ba-4b8d-857d-ed8ef017d499,0,1,f88ccd7a-8d15-4b24-addf-da522a0b4a43,f88ccd7a-8d15-4b24-addf-da522a0b4a43,0,1,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0f8e87d4-ffb7-4cff-a2d3-6d5c5219ff0b,0,1,1511c2e3-aeb4-422a-b6ae-03412b714c93,1511c2e3-aeb4-422a-b6ae-03412b714c93,0,1,349378d1-abe3-44de-84a4-d525b08e0474,349378d1-abe3-44de-84a4-d525b08e0474,0,1,1526b18d-7fab-414e-a5b2-377b67ac0b55,1526b18d-7fab-414e-a5b2-377b67ac0b55,0,1,c561fe6b-53ea-435b-a230-1850e2dc1ff5,c561fe6b-53ea-435b-a230-1850e2dc1ff5,0,1,aba7605f-6baf-42a8-b5ad-8f71c780b81f,aba7605f-6baf-42a8-b5ad-8f71c780b81f,0,1,8fc19eca-1a15-4758-af4b-79637e51edfb,8fc19eca-1a15-4758-af4b-79637e51edfb,0,1,be9144ce-5560-47bb-8c5e-9beefd15bfc3,be9144ce-5560-47bb-8c5e-9beefd15bfc3,0,1,ad09d1e6-5982-4e1c-864e-452ac5b2915a,ad09d1e6-5982-4e1c-864e-452ac5b2915a,0,1,caea53be-d2f7-4109-8017-d2bfdfde8c6f,caea53be-d2f7-4109-8017-d2bfdfde8c6f,0,1,60f30706-9919-4767-a17c-660754b9d542,60f30706-9919-4767-a17c-660754b9d542,0,1,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,7de19812-ed6c-41b5-82aa-b9a8e6d808f2,0,1,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0dcc3bbf-afbe-4a4e-bc4a-17534d5fab28,0,1,28dc34df-1daa-49a2-a12e-db91ee963459,28dc34df-1daa-49a2-a12e-db91ee963459,0,1,e590825f-10c6-4fdd-98cd-3da01da2ed4f,e590825f-10c6-4fdd-98cd-3da01da2ed4f,0,1,d02fe5f5-412c-4c4f-bfc7-c1d7206cd092,d02fe5f5-412c-4c4f-bfc7-c1d7206cd092,0,1,2233ce53-b8a8-4c83-97a2-683c8575462a,2233ce53-b8a8-4c83-97a2-683c8575462a,0,1,2071f210-dc13-43c0-a58e-b982821d6842,2071f210-dc13-43c0-a58e-b982821d6842,0,1,3cda70d0-3116-4508-82ea-5ea0f0921262,3cda70d0-3116-4508-82ea-5ea0f0921262,0,1,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,d5588c0d-3e94-485b-a7e9-45f5cf74df9e,0,1,c2ef8d6b-de7b-430d-ac30-76cdaf0579c2,c2ef8d6b-de7b-430d-ac30-76cdaf0579c2,0,1,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0e805e1f-3797-4ef9-94d3-0ec58ac1b605,0,1,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,8677bd53-5569-4d44-b7ce-d1b3fe12c78d,0,1,19056365-9ff1-4733-876e-a7ebdbbe0557,19056365-9ff1-4733-876e-a7ebdbbe0557,0,1,5e09dc5e-bbb7-4c38-b609-940c24f63c84,5e09dc5e-bbb7-4c38-b609-940c24f63c84,0,1,017b28eb-8ba9-465e-a748-20eadbeb4ea2,017b28eb-8ba9-465e-a748-20eadbeb4ea2,0,1,c0bb2d66-94c9-4bc6-afd5-534075e8395b,c0bb2d66-94c9-4bc6-afd5-534075e8395b,0,1,db7cc693-1645-4416-a9d9-5a7584cd3bbc,db7cc693-1645-4416-a9d9-5a7584cd3bbc,0,1,c849fb09-7833-49c8-9461-98426dc6c0af,c849fb09-7833-49c8-9461-98426dc6c0af,0,1,6c58fc3a-37f8-44b7-b076-2c10ce09b554,6c58fc3a-37f8-44b7-b076-2c10ce09b554,0,1,8ca0258c-96d8-4a12-b94f-db968195ee0a,8ca0258c-96d8-4a12-b94f-db968195ee0a,0,1,245c07a9-98b0-452b-b899-dc8751ab7ce0,245c07a9-98b0-452b-b899-dc8751ab7ce0,0,1,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,9cd9a3e1-b52c-4151-abd3-2744ed03cc1b,0,1,00579e31-e97d-4d79-ba25-b8d500a17e7f,00579e31-e97d-4d79-ba25-b8d500a17e7f,0,1,75ffd0b9-79be-4600-a310-591fddb6d63e,75ffd0b9-79be-4600-a310-591fddb6d63e,0,1,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,4883cb3d-4ab3-4e0e-bddb-ae8852547a3c,0,1,47da49ee-b243-4e78-9c8f-bb26c60e6136,47da49ee-b243-4e78-9c8f-bb26c60e6136,0,1,39bee714-cacd-4d48-97a5-c838660e049a,39bee714-cacd-4d48-97a5-c838660e049a,0,1,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,ea97b67e-1182-49c3-b95a-8fcce4cd3d09,0,1,2baf6d7a-12ed-4f22-ad96-92bb31b747ff,2baf6d7a-12ed-4f22-ad96-92bb31b747ff,0,1,becf53b6-3fbc-4c70-822f-4a70b0434353,becf53b6-3fbc-4c70-822f-4a70b0434353,0,1,9376b18c-cffd-488b-8a1e-cca598f018bc,9376b18c-cffd-488b-8a1e-cca598f018bc,0,1,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,f8dc2485-685b-4e41-834a-a2cbbbe4d53b,0,1,652ee894-047b-4a5a-a500-2d61b4c4a473,652ee894-047b-4a5a-a500-2d61b4c4a473,0,1,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,8a95d199-9bd1-4cbb-9d1a-941e80fa2105,0,1,fef727fa-f63b-4467-9367-73a2425b19e3,fef727fa-f63b-4467-9367-73a2425b19e3,0,1,33f8cd94-71e7-4703-92c3-22690fbd871a,33f8cd94-71e7-4703-92c3-22690fbd871a,0,1,b6e5de4d-0156-4342-b646-6e6920a4bd3a,b6e5de4d-0156-4342-b646-6e6920a4bd3a,0,1,c03f9972-5a1f-449b-b170-5a958c2b5846,c03f9972-5a1f-449b-b170-5a958c2b5846,0,1,25896075-2484-4879-8310-7f5680d80b48,25896075-2484-4879-8310-7f5680d80b48,0,1,09858042-6284-4499-8055-c1b5b783ce5f,09858042-6284-4499-8055-c1b5b783ce5f,0,1,1e3c444d-6f73-4eb0-a12d-7106daf36b14,1e3c444d-6f73-4eb0-a12d-7106daf36b14,0,1,1e63c656-a0e7-4b33-8bac-2a196e028ffa,1e63c656-a0e7-4b33-8bac-2a196e028ffa,0,1,085cbea9-1df1-4ee9-afb7-da2bf313697e,085cbea9-1df1-4ee9-afb7-da2bf313697e,0,1,b3152292-5546-4896-ad24-cb41057698d8,b3152292-5546-4896-ad24-cb41057698d8,0,1,38fc1e6e-7cd3-437b-b429-6655be34cd01,38fc1e6e-7cd3-437b-b429-6655be34cd01,0,1,c38d8135-e11f-4860-b370-84ff279b7fbd,c38d8135-e11f-4860-b370-84ff279b7fbd,0,1,ee0798f5-47a8-4118-a25c-cfd3473007c1,ee0798f5-47a8-4118-a25c-cfd3473007c1,0,1,e25b2b10-bf08-42db-9642-861efc5e583b,e25b2b10-bf08-42db-9642-861efc5e583b,0,1,29f2094a-d0d1-425c-8161-45a9ba186e19,29f2094a-d0d1-425c-8161-45a9ba186e19,0,1,bfa90848-930f-433d-8f6f-c11ac2c5eba2,bfa90848-930f-433d-8f6f-c11ac2c5eba2,0,1,69149ce1-d3f8-4e12-be8f-b328ade60882,69149ce1-d3f8-4e12-be8f-b328ade60882,0,1,ff592ecb-eb08-4554-87bf-1d2935b21d3c,ff592ecb-eb08-4554-87bf-1d2935b21d3c,0,1,e50cb13a-151b-45d2-a7b7-d23440ddfa24,e50cb13a-151b-45d2-a7b7-d23440ddfa24,0,1,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0b8bfb71-d430-4bdf-8391-a534b3a15fc3,0,1,0d8770aa-fa6e-471c-92c8-b96576927ef0,0d8770aa-fa6e-471c-92c8-b96576927ef0,0,1,b8a32c33-4e15-4c21-baab-64a86d44321b,b8a32c33-4e15-4c21-baab-64a86d44321b,0,1,e7d51ada-f286-4519-bfae-ece95dd4d7b0,e7d51ada-f286-4519-bfae-ece95dd4d7b0,0,1,d7dd9a03-6818-4987-8f39-58e1c906569f,d7dd9a03-6818-4987-8f39-58e1c906569f,0,1,fce028b8-b530-49f0-b6ad-a28d03e19b0f,fce028b8-b530-49f0-b6ad-a28d03e19b0f,0,1,301eea20-0e7f-441e-a531-28b4627dfd93,301eea20-0e7f-441e-a531-28b4627dfd93,0,1,95a71c2e-aa39-42ec-8889-2390a553f146,95a71c2e-aa39-42ec-8889-2390a553f146,0,1,d975aef4-8da8-4486-baeb-a99c48cff0ec,d975aef4-8da8-4486-baeb-a99c48cff0ec,0,1,75666bb9-f6d3-4dd6-8220-427a81f23fc9,75666bb9-f6d3-4dd6-8220-427a81f23fc9,0,1,9da27139-0bed-47b0-aef6-246929968502,9da27139-0bed-47b0-aef6-246929968502,0,1,68e82adf-bc03-4f23-9ec4-749ed42241da,68e82adf-bc03-4f23-9ec4-749ed42241da,0,1,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,7ae5d177-a3e6-4989-b10c-8e0a605c26d9,0,1,41f87891-ddd5-4e0f-a4f2-8039fb71981b,41f87891-ddd5-4e0f-a4f2-8039fb71981b,0,1,a57f6dc1-59d7-4311-8acd-65ce57a9f386,a57f6dc1-59d7-4311-8acd-65ce57a9f386,0,1,893b2dd9-a939-4799-9b78-50d788a5f3ba,893b2dd9-a939-4799-9b78-50d788a5f3ba,0,1,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,68229ecd-7ecc-4194-a3e5-f8df39b55d6a,0,1,e4842271-4fc0-4e15-afef-876f05af78c0,e4842271-4fc0-4e15-afef-876f05af78c0,0,1,135d57fe-d420-4bb0-9120-e43fd9b55c16,135d57fe-d420-4bb0-9120-e43fd9b55c16,0,1,31ee6430-b65d-42fa-859b-c4f1c40686ae,31ee6430-b65d-42fa-859b-c4f1c40686ae,0,1,c59e11f3-6bcb-404a-9d76-1416c12be354,c59e11f3-6bcb-404a-9d76-1416c12be354,0,1,c1a1f12b-3978-4047-956e-a5c7de8371a0,c1a1f12b-3978-4047-956e-a5c7de8371a0,0,1,ac39b903-0c60-417e-a50f-49ed375424f5,ac39b903-0c60-417e-a50f-49ed375424f5,0,1,831f4abd-4f96-417f-a71a-9ff481c23922,831f4abd-4f96-417f-a71a-9ff481c23922,0,1,387d3bbf-cddd-4506-b14f-89c1f37adbbc,387d3bbf-cddd-4506-b14f-89c1f37adbbc,0,1,16392cf6-dd83-4df0-a54b-6efc29778a89,16392cf6-dd83-4df0-a54b-6efc29778a89,0,1,64f667e5-6a8f-448f-aed5-a4d461232845,64f667e5-6a8f-448f-aed5-a4d461232845,0,1,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,a148cdff-0e67-48e6-9cc5-e8a6f5aa1ae8,0,1,037842ca-aeaf-4e27-9a0e-e929438b6f40,037842ca-aeaf-4e27-9a0e-e929438b6f40,0,1,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,a4ec7d3d-2d01-436c-98ec-ec42733ee5c6,0,1,230722e6-942f-4594-be89-eff59c6572bf,230722e6-942f-4594-be89-eff59c6572bf,0,1,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,b43abcf7-1f1d-4a59-b0d1-0a493c3a4785,0,1,eaf6045f-9ac0-43ef-b165-a45be75a4d44,eaf6045f-9ac0-43ef-b165-a45be75a4d44,0,1,237dab99-ed72-432c-ad01-c6045d74f000,237dab99-ed72-432c-ad01-c6045d74f000,0,1,59855d19-29cd-4efd-a453-b19e574113ef,59855d19-29cd-4efd-a453-b19e574113ef,0,1,94e08dcf-3885-4a73-82ab-cb291f1cf95f,94e08dcf-3885-4a73-82ab-cb291f1cf95f,0,1,405c52c4-25fe-45ff-abab-bf01041e768d,405c52c4-25fe-45ff-abab-bf01041e768d,0,1,55ce840b-5838-4107-886d-f935b9907bd8,55ce840b-5838-4107-886d-f935b9907bd8,0,1,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0b3088c9-7fb9-4979-acce-16d7ae7ba6b7,0,1,f1753bda-16db-4b00-a16a-37ddade8403f,f1753bda-16db-4b00-a16a-37ddade8403f,0,1,a1875d63-4303-46f1-bdea-fc529b5891f3,a1875d63-4303-46f1-bdea-fc529b5891f3,0,1,59123b12-6052-4480-9c86-f4de1b5cdc04,59123b12-6052-4480-9c86-f4de1b5cdc04,0,1,133f181a-fade-4182-826d-904fac780326,133f181a-fade-4182-826d-904fac780326,0,1,a687748a-0b2a-4277-b935-07616d28430d,a687748a-0b2a-4277-b935-07616d28430d,0,1,f60cb71a-f451-426a-aa3a-aa266b8da149,f60cb71a-f451-426a-aa3a-aa266b8da149,0,1,641ebe22-7135-4adb-bbd6-e0c37d246a2d,641ebe22-7135-4adb-bbd6-e0c37d246a2d,0,1,f71ba01e-9f6b-4241-8048-4368c8888756,f71ba01e-9f6b-4241-8048-4368c8888756,0,1,b95681f4-8f91-483e-a9c5-c8a21058679a,b95681f4-8f91-483e-a9c5-c8a21058679a,0,1,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,ab6fdd75-2ea6-4408-8c03-0cfab775a7a0,0,1,9059defa-047f-4dac-9749-3d0a6a77308a,9059defa-047f-4dac-9749-3d0a6a77308a,0,1,6010c27f-e857-4fc3-be13-1eea51f02ea7,6010c27f-e857-4fc3-be13-1eea51f02ea7,0,1,6aa814fa-417e-428c-951e-6efd9d0775da,6aa814fa-417e-428c-951e-6efd9d0775da,0,1,a247efe1-8608-4780-9cc8-54e29944475b,a247efe1-8608-4780-9cc8-54e29944475b,0,1,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,4b8c3c82-6e8f-469e-8a80-144361d1d0b2,0,1,a8f162e9-3f59-41a5-b82f-da20928213c7,a8f162e9-3f59-41a5-b82f-da20928213c7,0,1,ade68dfd-5037-4fd7-b043-9514e3fe6342,ade68dfd-5037-4fd7-b043-9514e3fe6342,0,1,7b008aad-9d05-43e1-8295-62ae58cfff42,7b008aad-9d05-43e1-8295-62ae58cfff42,0,1,fdaf9255-d621-4a98-9530-f618ed440795,fdaf9255-d621-4a98-9530-f618ed440795,0,1,0daac965-2026-4acc-8ba1-3c1f01779257,0daac965-2026-4acc-8ba1-3c1f01779257,0,1,65a331c0-7501-49f6-8027-35b703d11834,65a331c0-7501-49f6-8027-35b703d11834,0,1,c67fab0a-704f-43ae-bd03-4b5b1a880b24,c67fab0a-704f-43ae-bd03-4b5b1a880b24,0,1,c1703a14-61a0-4461-8ad8-7173e2c431fe,c1703a14-61a0-4461-8ad8-7173e2c431fe,0,1,b1b5841d-0cf9-4de5-8561-b35b8f286d21,b1b5841d-0cf9-4de5-8561-b35b8f286d21,0,1,aecf5653-3005-43f2-ab49-40977e70f02b,aecf5653-3005-43f2-ab49-40977e70f02b,0,1,4093fe34-7557-4f15-831b-d654b94b8010,4093fe34-7557-4f15-831b-d654b94b8010,0,1,ee10023f-5c63-4cb3-8e6c-db566c788c9d,ee10023f-5c63-4cb3-8e6c-db566c788c9d,0,1,475f8577-a141-496b-94e1-53215c0dd017,475f8577-a141-496b-94e1-53215c0dd017,0,1,97638762-c01e-4c8f-88e2-b356e517e18f,97638762-c01e-4c8f-88e2-b356e517e18f,0,1,074e34f2-e9be-4bd3-beca-8b916772e2be,074e34f2-e9be-4bd3-beca-8b916772e2be,0,1,28fecf1b-7cab-4087-b66e-2052edb8ce3a,28fecf1b-7cab-4087-b66e-2052edb8ce3a,0,1,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,d85b00b7-b0d8-4b91-8d7f-0c2da524d446,0,1,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,cc906f05-5ea6-43cb-a084-c4ee51ca4bd5,0,1,f5417147-4d2a-4e49-911b-2bb5eccb8441,f5417147-4d2a-4e49-911b-2bb5eccb8441,0,1,20fbed2b-4393-4de0-a71d-017a336bdac0,20fbed2b-4393-4de0-a71d-017a336bdac0,0,1,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,2ca4fc58-798b-4fc3-8673-27688ce7a1f2,0,1,fbbb2449-9a07-4229-8ea5-bee0afab5f56,fbbb2449-9a07-4229-8ea5-bee0afab5f56,0,1,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,9fdddb51-0605-4f64-8d2e-aa7dbcd37262,0,1,0d124daf-dc52-4391-a2d9-3c43a45c422c,0d124daf-dc52-4391-a2d9-3c43a45c422c,0,1,44b28019-01c0-468d-9b60-e050ff8b71ac,44b28019-01c0-468d-9b60-e050ff8b71ac,0,1,69f6173c-a570-41ff-b07f-5b85f7187515,69f6173c-a570-41ff-b07f-5b85f7187515,0,1,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,9c443dd3-4acb-4c5a-9c4b-af8b0c87e861,0,1,98153b59-8cc6-4dc7-b945-99c1146d07da,98153b59-8cc6-4dc7-b945-99c1146d07da,0,1,3e2828b4-2b55-471e-ac69-55119c2480f8,3e2828b4-2b55-471e-ac69-55119c2480f8,0,1,9da32b56-ff89-4739-bb99-615074b72298,9da32b56-ff89-4739-bb99-615074b72298,0,1,08baf3ee-b8ca-4f29-89fc-c15344064ad3,08baf3ee-b8ca-4f29-89fc-c15344064ad3,0,1,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,2c8ab5a6-66d5-4b6f-94ae-4292724ded7f,0,1,01b85e3a-9920-425a-9de5-5079fffeef93,01b85e3a-9920-425a-9de5-5079fffeef93,0,1,82e12316-cc64-4d2f-83fa-054b5a738f02,82e12316-cc64-4d2f-83fa-054b5a738f02,0,1,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,6b70f7e1-8bdb-4fc4-9b95-0e045bfa288c,0,1,a890be6b-f050-4ea4-a388-570948ffd22b,a890be6b-f050-4ea4-a388-570948ffd22b,0,1,9039f720-5728-4918-87d5-8b2d07cabcfd,9039f720-5728-4918-87d5-8b2d07cabcfd,0,1,f3e2f35e-53f8-44e8-b24c-8385ba2c6974,f3e2f35e-53f8-44e8-b24c-8385ba2c6974,0,1,b00c31d6-4fc6-4189-9f72-f91742ec705f,b00c31d6-4fc6-4189-9f72-f91742ec705f,0,1,1333101b-82e8-41a9-a793-5af5dcd6f68a,1333101b-82e8-41a9-a793-5af5dcd6f68a,0,1,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,3ba630c2-cdc1-40a8-a24e-538ddb1abe38,0,1,0f25646a-90f9-4747-a778-7efdaabc284c,0f25646a-90f9-4747-a778-7efdaabc284c,0,1,3705a086-46e6-4090-a52a-535908eea8a5,3705a086-46e6-4090-a52a-535908eea8a5,0,1,3a2d9324-8260-478d-ad62-a964d860cb8f,3a2d9324-8260-478d-ad62-a964d860cb8f,0,1,9b9cd161-5bee-4433-a0ec-b67deb099b5e,9b9cd161-5bee-4433-a0ec-b67deb099b5e,0,1,ca179cb5-65e1-4a55-bf12-096b926accb0,ca179cb5-65e1-4a55-bf12-096b926accb0,0,1,472ce1c2-9e83-418b-b1ec-e15e126bc919,472ce1c2-9e83-418b-b1ec-e15e126bc919,0,1,9fe30414-8261-4403-a854-f22b61824f69,9fe30414-8261-4403-a854-f22b61824f69,0,1,07bb26ac-bd97-465f-a192-db7fedbb579b,07bb26ac-bd97-465f-a192-db7fedbb579b,0,1,cd8244d1-0996-40ea-9263-7179c1e8aa26,cd8244d1-0996-40ea-9263-7179c1e8aa26,0,1,bb129cf2-5a5a-433a-924a-a1d0d895644a,bb129cf2-5a5a-433a-924a-a1d0d895644a,0,1,faa34cb8-2d48-4851-a839-fc40536a0234,faa34cb8-2d48-4851-a839-fc40536a0234,0,1,0894db61-51f6-4068-9634-e55d95e2a8ac,0894db61-51f6-4068-9634-e55d95e2a8ac,0,1,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,ad3fb691-68b2-4d65-93ab-ab8fcb77e035,0,1,67aed41e-9707-4007-bb3c-7273476664bb,67aed41e-9707-4007-bb3c-7273476664bb,0,1,954e7804-e8b1-42aa-9d49-bef73f9d13d1,954e7804-e8b1-42aa-9d49-bef73f9d13d1,0,1,de25a90c-4b46-4340-b649-93e16dde33de,de25a90c-4b46-4340-b649-93e16dde33de,0,1,5462f1ab-2095-4515-875e-471900f05db9,5462f1ab-2095-4515-875e-471900f05db9,0,1,4f2d0398-49f4-410c-a451-436cbf96a262,4f2d0398-49f4-410c-a451-436cbf96a262,0,1,ed297409-6215-4fd4-b47d-a2247e0343da,ed297409-6215-4fd4-b47d-a2247e0343da,0,1,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,5ae2a1de-6380-45cc-9c8f-5612cd5ba627,0,1,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,e8aa2ba2-7dfa-47e3-bc18-6156f700ceed,0,1,8c472f51-47ec-43c4-9858-fd19ac3e17f3,8c472f51-47ec-43c4-9858-fd19ac3e17f3,0,1,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,e7d0cc1f-f3ee-486e-b1f3-db8e6a6162cc,0,1,c54f31ce-114b-46d3-b4c6-12c8f07727ca,c54f31ce-114b-46d3-b4c6-12c8f07727ca,0,1,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,5a9c82c1-d0cd-48ff-b91c-38b950591e4c,0,1,b2c8bd74-21c9-4495-93e2-ca5355698350,b2c8bd74-21c9-4495-93e2-ca5355698350,0,1,712c2b73-4697-4581-a095-70555aee8be2,712c2b73-4697-4581-a095-70555aee8be2,0,1,c1508d67-ac6d-41e3-884d-b3bdd54659f8,c1508d67-ac6d-41e3-884d-b3bdd54659f8,0,1,65dd4904-0837-4de5-a5e5-601151055d94,65dd4904-0837-4de5-a5e5-601151055d94,0,1,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,3436b16e-ef5b-4abb-9aad-c70a7c8560ed,0,1,ce6d1259-af90-482b-b19a-405512321bd9,ce6d1259-af90-482b-b19a-405512321bd9,0,1,df48bfa3-5502-4a61-a79f-1dea043dac36,df48bfa3-5502-4a61-a79f-1dea043dac36,0,1,adee37e6-f087-422f-91b3-681f3d73189c,adee37e6-f087-422f-91b3-681f3d73189c,0,1,35103a27-230c-45c0-a8c9-24bd46608bbb,35103a27-230c-45c0-a8c9-24bd46608bbb,0,1,c5e9f987-4466-4161-8e36-278b0b3ce056,c5e9f987-4466-4161-8e36-278b0b3ce056,0,1,b6566d54-e821-4a2a-a447-0f533f35de91,b6566d54-e821-4a2a-a447-0f533f35de91,0,1,46568b9a-a765-4037-8a86-b184a570ab37,46568b9a-a765-4037-8a86-b184a570ab37,0,1,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,4fcc7278-2fec-49ee-b0ef-c7d5f5f698a4,0,1,547a6dec-6fe8-439d-a8d9-ac2612af20d2,547a6dec-6fe8-439d-a8d9-ac2612af20d2,0,1,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,2bc2c4b7-dacb-4cb3-b5b2-712b19bebcd7,0,1,84395058-d46a-428c-b782-a9fa89fea14a,84395058-d46a-428c-b782-a9fa89fea14a,0,1,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,39bc2bc6-2a4f-4e26-b1b9-fb8473234f09,0,1,5b7eb8bc-ad6b-4191-a6c1-92561bb944f2,5b7eb8bc-ad6b-4191-a6c1-92561bb944f2,0,1,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,cc9679a5-1ed2-4290-8c9b-8a2f6614d053,0,1,93016393-c637-4d81-8675-aa5e51e678e0,93016393-c637-4d81-8675-aa5e51e678e0,0,1,d8621f68-106e-4058-963f-56010491ae2e,d8621f68-106e-4058-963f-56010491ae2e,0,1,1f3057c2-135f-44b2-9f86-34481fbc5596,1f3057c2-135f-44b2-9f86-34481fbc5596,0,1,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,f8f0d92c-b7f0-496c-8d33-f8a57dfa16f2,0,1,f2e2df50-52fc-4e95-909b-80fc91a68f62,f2e2df50-52fc-4e95-909b-80fc91a68f62,0,1,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,1a1d8dd0-1559-426c-ad3c-baa6eb3a53db,0,1,1fca06d9-b015-4fc8-abdd-3e2397e0c307,1fca06d9-b015-4fc8-abdd-3e2397e0c307,0,1,573f1753-9194-4aaf-9217-5cac70ff108f,573f1753-9194-4aaf-9217-5cac70ff108f,0,1,1f7ec25a-05b1-468b-8857-2bb1aed3678a,1f7ec25a-05b1-468b-8857-2bb1aed3678a,0,1,4a1e6d25-89e7-468a-aef1-6ded0154dca2,4a1e6d25-89e7-468a-aef1-6ded0154dca2,0,1,905624ea-b253-413f-b651-1eb2c5a7d52a,905624ea-b253-413f-b651-1eb2c5a7d52a,0,1,b639ed30-3e37-4c65-a39f-00fe735950eb,b639ed30-3e37-4c65-a39f-00fe735950eb,0,1,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,76ef7f67-0ce8-4ee2-9134-e793c41b8de3,0,1,f137eb0f-bde7-412d-9229-d7a4f9456e6c,f137eb0f-bde7-412d-9229-d7a4f9456e6c,0,1,90880131-8065-4a7e-a0fa-ecff9e27363c,90880131-8065-4a7e-a0fa-ecff9e27363c,0,1,57e9fcea-342c-4089-bd10-befb3faf0dbd,57e9fcea-342c-4089-bd10-befb3faf0dbd,0,1,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,7b01236c-5ab7-43fa-aa0e-1ae55c8a4efe,0,1,f811b0b7-41b5-4591-9910-780f08780236,f811b0b7-41b5-4591-9910-780f08780236,0,1,6b10167a-f5c3-4d7b-b444-d5ff6e705ea4,6b10167a-f5c3-4d7b-b444-d5ff6e705ea4,0,1,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,f85ff11a-163e-4d18-98bc-b0ebe83d34e4,0,1,51a0444d-13c8-45a8-97f6-f3f976964bf8,51a0444d-13c8-45a8-97f6-f3f976964bf8,0,1,7e2ba519-fbb9-4163-b20b-b99898e6ac57,7e2ba519-fbb9-4163-b20b-b99898e6ac57,0,1,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,38eb3fd1-57be-4dc2-bed4-d8107086bf2a,0,1,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,6b6d541b-5dc1-4150-b8d1-5844a694ac6a,0,1,2b1619a6-c841-4963-8c51-c1d8d6ba3746,2b1619a6-c841-4963-8c51-c1d8d6ba3746,0,1,eab50f82-4612-47fd-a5c2-9678016a1937,eab50f82-4612-47fd-a5c2-9678016a1937,0,1,4212bb94-7c24-4d4f-8bb8-4060bd21a135,4212bb94-7c24-4d4f-8bb8-4060bd21a135,0,1,2609ba3c-e4de-45b3-86e0-93db39a21eee,2609ba3c-e4de-45b3-86e0-93db39a21eee,0,1,00dcfeab-7ba1-4a50-996e-4fd693dd0514,00dcfeab-7ba1-4a50-996e-4fd693dd0514,0,1,d21971c9-9aa6-448a-ab37-49ad0b0547ec,d21971c9-9aa6-448a-ab37-49ad0b0547ec,0,1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,627438b8-c738-4e02-a0e7-cfd7fbf8eca1,0,1,00418e6c-77b2-4753-b9ff-3a8013436f8a,00418e6c-77b2-4753-b9ff-3a8013436f8a,0,1,e2c76c41-4c47-4588-a081-7bd81ac1698b,e2c76c41-4c47-4588-a081-7bd81ac1698b,0,1,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,8deaa3d0-b36b-4f20-a9a8-11d829f5ef9d,0,1,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,d5537afb-df5f-4edf-a3d3-ff6b2a908ad9,0,1,d9f1f56b-75c8-43e9-8043-89076c225f78,d9f1f56b-75c8-43e9-8043-89076c225f78,0,1,a3c9a7eb-2104-4402-954c-3e12de4a7de3,a3c9a7eb-2104-4402-954c-3e12de4a7de3,0,1,38bf6d3b-5435-4bac-b9fc-23b80afeb760,38bf6d3b-5435-4bac-b9fc-23b80afeb760,0,1,138e674b-c9d4-4b89-b5ac-a50bd5313b98,138e674b-c9d4-4b89-b5ac-a50bd5313b98,0,1,6c34eef9-9405-4de0-9177-1bae85251ae4,6c34eef9-9405-4de0-9177-1bae85251ae4,0,1,556a0e57-5b3b-4303-a013-0bd296c506b8,556a0e57-5b3b-4303-a013-0bd296c506b8,0,1,fabbac92-cb98-4087-b3fa-387482ed0d86,fabbac92-cb98-4087-b3fa-387482ed0d86,0,1,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,bbbc2d1f-2f78-4b7e-b5fb-ca7c74051221,0,1,e09534e3-ac6e-42a6-86e8-564acb20089a,e09534e3-ac6e-42a6-86e8-564acb20089a,0,1,5e380276-2a08-435c-927e-a7f56f5a4dbc,5e380276-2a08-435c-927e-a7f56f5a4dbc,0,1,d06e845a-9f54-40dd-b0df-6988def62017,d06e845a-9f54-40dd-b0df-6988def62017,0,1,7badb97b-c359-42af-9066-6bbfc0650cf9,7badb97b-c359-42af-9066-6bbfc0650cf9,0,1,63223883-06cf-4d01-be95-5e410cc58a22,63223883-06cf-4d01-be95-5e410cc58a22,0,1,1929139f-dabb-4c40-9423-158093360889,1929139f-dabb-4c40-9423-158093360889,0,1,dad92df4-685b-4260-b35f-4d031262dfea,dad92df4-685b-4260-b35f-4d031262dfea,0,1,4399c19a-ddba-42e9-88b4-c5c28abad237,4399c19a-ddba-42e9-88b4-c5c28abad237,0,1,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,304525f8-c697-4835-b0a6-4ed3cbcaf3c6,0,1,7e089889-cf8d-4f5f-879c-0a1bcca1c19b,7e089889-cf8d-4f5f-879c-0a1bcca1c19b,0,1,982315ba-df74-4a31-8929-71d1e5e6f147,982315ba-df74-4a31-8929-71d1e5e6f147,0,1,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,8d1c01a9-9806-4e5d-bafb-ce6af11d5650,0,1,fd3a6a7e-203d-447a-aebd-7626579387fb,fd3a6a7e-203d-447a-aebd-7626579387fb,0,1,2cd04d4c-2619-40c9-adf4-7bb281f045b6,2cd04d4c-2619-40c9-adf4-7bb281f045b6,0,1,cbc1c36d-7bbf-4892-8220-a33ec91a7b1f,cbc1c36d-7bbf-4892-8220-a33ec91a7b1f,0,1,ff976027-75e8-475c-abfa-876d36733c13,ff976027-75e8-475c-abfa-876d36733c13,0,1,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,7452d9c0-cb03-4d1b-afd4-8855950f2ad8,0,1,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,32d4a42d-6e4d-49db-b5bc-1ea6dbe9fe4d,0,1,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,3f823f5b-e5a8-40af-8fc3-e4c6ffb18fa3,0,1,b3554203-b930-496d-a712-353bc13a0946,b3554203-b930-496d-a712-353bc13a0946,0,1,59775ce0-f778-45f6-9453-bbd0a0ec1f27,59775ce0-f778-45f6-9453-bbd0a0ec1f27,0,1,f772abd3-8ea0-41e9-aaca-c5375778941a,f772abd3-8ea0-41e9-aaca-c5375778941a,0,1,a1e494f8-96a4-41bd-9234-b87e8d8742c5,a1e494f8-96a4-41bd-9234-b87e8d8742c5,0,1,b322b047-16eb-4500-826a-6dfebb7d997a,b322b047-16eb-4500-826a-6dfebb7d997a,0,1,f08afb10-3467-4af8-804c-ba7761f1dac9,f08afb10-3467-4af8-804c-ba7761f1dac9,0,1,c8da922f-e31e-49b0-b90e-1c060424bde5,c8da922f-e31e-49b0-b90e-1c060424bde5,0,1,41462827-fd8b-4ee6-a739-a884d704bba5,41462827-fd8b-4ee6-a739-a884d704bba5,0,1,eca025d2-4fe9-4542-b9f5-46ae2631256e,eca025d2-4fe9-4542-b9f5-46ae2631256e,0,1,35bc58df-8aff-48dd-83a9-b60b0461f94d,35bc58df-8aff-48dd-83a9-b60b0461f94d,0,1,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0f46ae6b-9fe8-471a-a59f-af5e66cb9e00,0,1,b65afceb-a200-42d5-9948-831a5ad84b1b,b65afceb-a200-42d5-9948-831a5ad84b1b,0,1,feb1a5c1-c805-4079-8f05-8a44f51b0b02,feb1a5c1-c805-4079-8f05-8a44f51b0b02,0,1,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,ff7916bd-cbd1-4d9e-8aab-bad9fffaa0d4,0,1,1f55f330-7c0a-4a29-905f-51d664515bc5,1f55f330-7c0a-4a29-905f-51d664515bc5,0,1,6106e958-354c-4211-992c-3c3819e8828e,6106e958-354c-4211-992c-3c3819e8828e,0,1,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,9d6d77a9-1f55-4162-93a5-14bb3f3febaf,0,1,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,1d6b8425-360c-4ab1-9bab-cc9a3b590bb2,0,1,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,9f67d228-79aa-44e6-8dc7-fae4fbdfef2a,0,1,231d3950-f363-4e63-83cd-8ddb81507c27,231d3950-f363-4e63-83cd-8ddb81507c27,0,1,87429f11-bf95-4013-bf13-da904570f88d,87429f11-bf95-4013-bf13-da904570f88d,0,1,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,6173cab2-e0f5-40c1-8e74-4f41fc8bd68f,0,1,feb41347-62db-41cf-ace0-d8b9de361af3,feb41347-62db-41cf-ace0-d8b9de361af3,0,1,cdce186a-229d-492d-8811-147fc4d7cdf5,cdce186a-229d-492d-8811-147fc4d7cdf5,0,1,5f91b00f-d8fc-4d63-8486-66339357ab22,5f91b00f-d8fc-4d63-8486-66339357ab22,0,1,16d44ab1-4bce-4df8-a215-6ed5173c75a8,16d44ab1-4bce-4df8-a215-6ed5173c75a8,0,1,543f976e-fea3-4a51-9962-b8e0fcd3f707,543f976e-fea3-4a51-9962-b8e0fcd3f707,0,1,375977c1-5745-4e78-a4df-cef966c0ccf8,375977c1-5745-4e78-a4df-cef966c0ccf8,0,1,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,2582a714-a6d6-4d37-b9a7-5e89e18b0f27,0,1,c3796d85-2a24-43c4-9673-64e56249a1d0,c3796d85-2a24-43c4-9673-64e56249a1d0,0,1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,fc1066b5-20d4-4c73-85f8-9889e554d6e1,0,1,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,a9b6b5fd-1862-4207-87e8-5c25a8f86c57,0,1,731211c2-ef90-4883-9525-83cd91b742ac,731211c2-ef90-4883-9525-83cd91b742ac,0,1,0adf02da-940a-4bfc-afa5-59605494a169,0adf02da-940a-4bfc-afa5-59605494a169,0,1,50a1e3bf-8624-4474-854e-21b89aaf97ed,50a1e3bf-8624-4474-854e-21b89aaf97ed,0,1,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,6c7b82ca-37b0-4f67-b7fa-ab1b77c0fb61,0,1,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,24f9d1a6-73d0-4cc7-b3ca-d36c5c7a9892,0,1,847b97a3-d0bc-45e2-b06c-932bb22d8eca,847b97a3-d0bc-45e2-b06c-932bb22d8eca,0,1,503b3eab-b7f1-4ede-8845-3290a834cec7,503b3eab-b7f1-4ede-8845-3290a834cec7,0,1,8361991a-0f30-4a03-9a4c-90556b744f53,8361991a-0f30-4a03-9a4c-90556b744f53,0,1,3116fa60-bc42-4dea-aa03-387896168690,3116fa60-bc42-4dea-aa03-387896168690,0,1,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,5a3cc2a8-f519-45ac-af9b-c57a4f1acdc0,0,1,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,08427a9a-fb3a-4bc1-b2e2-72e4f89680cd,0,1,f9196766-4ae2-4a73-bed6-4a8838323e02,f9196766-4ae2-4a73-bed6-4a8838323e02,0,1,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,4eeda6df-fb48-4c88-853f-9c35e2b3a3cf,0,1,06afe397-1c7e-400e-bb24-f8e611d114e8,06afe397-1c7e-400e-bb24-f8e611d114e8,0,1,f0105e51-9510-426a-8aa0-af827d93ffd9,f0105e51-9510-426a-8aa0-af827d93ffd9,0,1,3df19dbf-efe7-4e31-99ad-fafb59ec1329,3df19dbf-efe7-4e31-99ad-fafb59ec1329,0,1,baf12d47-fbfe-4563-aa23-26d9f7e83169,baf12d47-fbfe-4563-aa23-26d9f7e83169,0,1,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,e2046f49-6fea-4bf4-92b0-92f3c8357bcf,0,1,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0ba11486-1972-4434-ab1a-5bb75cc05e9f,0,1,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,4ed9c555-7dd0-4577-bf62-152b4c5ec9f2,0,1,11fe3a42-98c4-49ba-b697-86ffb172f16f,11fe3a42-98c4-49ba-b697-86ffb172f16f,0,1,07b53818-7318-4400-8af5-457fac012755,07b53818-7318-4400-8af5-457fac012755,0,1,292b47e7-5cf3-462d-a466-dac6253a7f03,292b47e7-5cf3-462d-a466-dac6253a7f03,0,1,8ecc070f-f6fb-46b1-9636-b77aa80f8804,8ecc070f-f6fb-46b1-9636-b77aa80f8804,0,1,8405be9d-465b-4744-b04f-03933b52f02e,8405be9d-465b-4744-b04f-03933b52f02e,0,1,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,a8021ff9-f0ae-49ab-b8ac-5e3d8fe90d82,0,1,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,f09b09ce-9e3c-406a-8508-b6e7e6ec966e,0,1,9bf55587-1ffe-42bc-b8e8-3f956956f689,9bf55587-1ffe-42bc-b8e8-3f956956f689,0,1,2f67931e-543f-457e-80fd-78ca754e2e9c,2f67931e-543f-457e-80fd-78ca754e2e9c,0,1,595e5752-36a7-4bba-8a40-26920acae01d,595e5752-36a7-4bba-8a40-26920acae01d,0,1,28801fba-c429-4afa-bdcd-b3ec3ec22fda,28801fba-c429-4afa-bdcd-b3ec3ec22fda,0,1,d1a873ae-d45b-4600-9419-e701dce3da02,d1a873ae-d45b-4600-9419-e701dce3da02,0,1,e3a31f0d-a98f-43c6-bc39-087095ae8c39,e3a31f0d-a98f-43c6-bc39-087095ae8c39,0,1,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,e39d8ff3-52db-4ba4-b4ea-42d5ee787076,0,1,eb3dfdc7-58b8-4b1f-b079-368c262364c9,eb3dfdc7-58b8-4b1f-b079-368c262364c9,0,1,5030a318-f8f7-4ec7-80d6-6eee0772562f,5030a318-f8f7-4ec7-80d6-6eee0772562f,0,1,242e911d-e49c-4b8a-8543-cc2e079220fd,242e911d-e49c-4b8a-8543-cc2e079220fd,0,1,9ea39d31-3775-4fb8-a3f3-202e54354d49,9ea39d31-3775-4fb8-a3f3-202e54354d49,0,1,73044e20-148c-46e9-b5b5-973c91de0d61,73044e20-148c-46e9-b5b5-973c91de0d61,0,1,f8ab477c-8e78-48c0-9f99-27748b109706,f8ab477c-8e78-48c0-9f99-27748b109706,0,1,24cff6c8-6c20-4383-b97c-6afa52738960,24cff6c8-6c20-4383-b97c-6afa52738960,0,1,462e2694-750d-49ef-93ac-17a7779be68d,462e2694-750d-49ef-93ac-17a7779be68d,0,1,c24ff02e-5afc-45df-81cf-64ea2b261c2d,c24ff02e-5afc-45df-81cf-64ea2b261c2d,0,1,2d51aae9-650d-4719-a94d-2609b69a2d36,2d51aae9-650d-4719-a94d-2609b69a2d36,0,1,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,6025f5b5-6dc7-46b8-96e6-02823c5b4de7,0,1,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,5d9d88ea-b2e4-425c-bb4d-a005e867d56c,0,1,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,b76d342c-0f9d-4eb0-b49e-a9f472a4dd0d,0,1,85639a53-b367-49ce-84f2-4e21d81c489b,85639a53-b367-49ce-84f2-4e21d81c489b,0,1,24b59586-178e-4efc-90ae-529553f3bb6c,24b59586-178e-4efc-90ae-529553f3bb6c,0,1,20e75dd5-222a-4100-aa43-3684991e3f21,20e75dd5-222a-4100-aa43-3684991e3f21,0,1,3c611832-4bc2-4229-a27d-d5dc82f3a498,3c611832-4bc2-4229-a27d-d5dc82f3a498,0,1,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,50e9eb52-02e3-44ff-9c9e-e76dbe38da63,0,1,5dadc422-1fbd-4918-9db3-09ec72c3404e,5dadc422-1fbd-4918-9db3-09ec72c3404e,0,1,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,ffdaf8a0-7a8f-4756-bdfc-a0c6ae6c3869,0,1,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,ab1bcabf-ffb0-4914-8ad0-b94b5aaeab1d,0,1,c5478d09-c8d3-4cc6-878e-27656ecc8409,c5478d09-c8d3-4cc6-878e-27656ecc8409,0,1,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,01b97d2f-40b9-4f12-8bc5-ab75fd160b7c,0,1,75974146-5b1a-412c-b7d5-1575704bbdab,75974146-5b1a-412c-b7d5-1575704bbdab,0,1,949f87cb-258c-4b6b-95ee-8a7491a4b64e,949f87cb-258c-4b6b-95ee-8a7491a4b64e,0,1,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,8a348012-99dc-4dc9-8bec-0df3caf4cdc5,0,1,5c089988-5381-41ed-9f05-f85db46b8d94,5c089988-5381-41ed-9f05-f85db46b8d94,0,1,85a36352-1569-4ce4-aeba-477db524c36d,85a36352-1569-4ce4-aeba-477db524c36d,0,1,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,ebfb6f80-88f5-4046-8ae7-e11a7b0c1beb,0,1,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,b2e656c1-f4ff-4d95-b066-4ee11ce4dea8,0,1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,2d86d1fc-5367-47b8-804e-7f9c5fc8f3b1,0,1,b99c2068-15ea-43a1-9e9f-db29647e2387,b99c2068-15ea-43a1-9e9f-db29647e2387,0,1,9a4a0b04-3dfb-4551-90f0-16231f64b14f,9a4a0b04-3dfb-4551-90f0-16231f64b14f,0,1,98edcd6b-1c50-45c6-9a4c-390827a4ba52,98edcd6b-1c50-45c6-9a4c-390827a4ba52,0,1,2fcde115-5c5a-465c-a326-d7ba379675fc,2fcde115-5c5a-465c-a326-d7ba379675fc,0,1,346cb8b7-a20e-4a06-823e-26dfb2e3e741,346cb8b7-a20e-4a06-823e-26dfb2e3e741,0,1,6d83f50f-32e9-45a6-8b5e-d91ba005ae95,6d83f50f-32e9-45a6-8b5e-d91ba005ae95,0,1,538f0963-de90-4659-987d-df71a9586548,538f0963-de90-4659-987d-df71a9586548,0,1,9afe457f-3c88-4cd3-94e7-7cea8a1a99a1,9afe457f-3c88-4cd3-94e7-7cea8a1a99a1,0,1,86ff5ea0-394a-4d8f-9601-acc2eb841bf6,86ff5ea0-394a-4d8f-9601-acc2eb841bf6,0,1,782cb93d-36e6-4923-b2b6-75caa3459cd6,782cb93d-36e6-4923-b2b6-75caa3459cd6,0,1,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,2767473e-79fb-4c7c-a7d1-a83a8f2df71d,0,1,996c7873-1cc9-44f6-915b-5c6ed7ef2370,996c7873-1cc9-44f6-915b-5c6ed7ef2370,0,1,45a2569e-820c-4d7d-ba74-4a781d26bb2b,45a2569e-820c-4d7d-ba74-4a781d26bb2b,0,1,ced01234-9417-49ce-adf0-8cdd15e6dd7d,ced01234-9417-49ce-adf0-8cdd15e6dd7d,0,1,0eea37cc-47f8-4819-85da-d4991f4e58ed,0eea37cc-47f8-4819-85da-d4991f4e58ed,0,1,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,b51eaf45-baa1-4d1c-bcb7-a89bb8bcc26a,0,1,c1272bfc-196a-4f99-935f-e2516bc138d2,c1272bfc-196a-4f99-935f-e2516bc138d2,0,1,313e0688-745a-4385-b040-7ef8317a0eb7,313e0688-745a-4385-b040-7ef8317a0eb7,0,1,5f6c6be3-058a-43c8-aa33-3e89af2ea3f1,5f6c6be3-058a-43c8-aa33-3e89af2ea3f1,0,1,8dc08932-0988-4e82-8a5f-385c0694f9ff,8dc08932-0988-4e82-8a5f-385c0694f9ff,0,1,aa7ceeee-3b3c-49e2-95c2-bfb34e381aa3,aa7ceeee-3b3c-49e2-95c2-bfb34e381aa3,0,1,37c37f15-f84b-456b-aab6-729562dc0908,37c37f15-f84b-456b-aab6-729562dc0908,0,1,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,f5ef3f75-7d12-4284-844f-54d19d1f7e2f,0,1,7974e41d-5af3-4636-b405-c9405d89fb53,7974e41d-5af3-4636-b405-c9405d89fb53,0,1,21fad9b6-44df-417c-ba18-de4b8af98a34,21fad9b6-44df-417c-ba18-de4b8af98a34,0,1,11c086b0-c646-4701-983d-c38758286354,11c086b0-c646-4701-983d-c38758286354,0,1,92876c9e-52ff-480d-9878-5766f4f9d12c,92876c9e-52ff-480d-9878-5766f4f9d12c,0,1,433a114f-3198-4ef6-bbf8-ce9b54fdb736,433a114f-3198-4ef6-bbf8-ce9b54fdb736,0,1,02ac711c-e38e-422e-ac28-ba1b298df9cc,02ac711c-e38e-422e-ac28-ba1b298df9cc,0,1,b729d739-5249-4765-85ee-fd792bb22911,b729d739-5249-4765-85ee-fd792bb22911,0,1,d65c4485-7bac-4206-9a6c-7156f4bb876d,d65c4485-7bac-4206-9a6c-7156f4bb876d,0,1,bbfd9834-12b4-49ca-bdae-5c94efa80482,bbfd9834-12b4-49ca-bdae-5c94efa80482,0,1,d431d1e2-13dc-495c-9de1-b5ec872eceed,d431d1e2-13dc-495c-9de1-b5ec872eceed,0,1,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,9dc3a563-11bb-40a7-8431-c1d4367ccbaf,0,1,c9ea4e72-5f01-42ae-88e3-52e49757b26f,c9ea4e72-5f01-42ae-88e3-52e49757b26f,0,1,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,38d92d75-c8b8-42d6-9e0a-6dc0811a8652,0,1,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0f564dbe-6a6e-48df-9718-5cea5d608ee6,0,1,a623fef1-96eb-41ba-93fe-09162698f419,a623fef1-96eb-41ba-93fe-09162698f419,0,1,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,45a8d7cb-c927-4a4e-a653-13fd9b1eda10,0,1,d8e1f92f-9efa-422d-bb21-43bd1a363cec,d8e1f92f-9efa-422d-bb21-43bd1a363cec,0,1,c1416383-bd7e-4dc4-ad88-d98ac87157fd,c1416383-bd7e-4dc4-ad88-d98ac87157fd,0,1,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,5e8bddc7-7836-4ec8-b6e1-0c15d228f47e,0,1,d5d9976a-4cc0-43f7-afd6-d43cebb07940,d5d9976a-4cc0-43f7-afd6-d43cebb07940,0,1,79a0746b-4dbe-4068-8832-4d0da08d6fd3,79a0746b-4dbe-4068-8832-4d0da08d6fd3,0,1,899f1526-d6bc-42ef-852e-7297a06db9e3,899f1526-d6bc-42ef-852e-7297a06db9e3,0,1,c694c132-1ddb-4273-818a-d3cca88c082a,c694c132-1ddb-4273-818a-d3cca88c082a,0,1,cd4da06e-c06b-4233-befc-1bc4c4db58e3,cd4da06e-c06b-4233-befc-1bc4c4db58e3,0,1,918a01fe-f753-4a4a-9200-55bbd6edaf5f,918a01fe-f753-4a4a-9200-55bbd6edaf5f,0,1,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,51a8a209-2a9d-419f-9fda-f7aeac68bdbe,0,1,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,ef43961f-8cac-4f3f-bcee-c6bc51c4148c,0,1,d6704410-6297-481e-a6cb-6d6aa566b4f8,d6704410-6297-481e-a6cb-6d6aa566b4f8,0,1,398937ca-b035-43bd-b0da-8c5153a87cb8,398937ca-b035-43bd-b0da-8c5153a87cb8,0,1,5b441321-bd1e-4c56-8f09-365b05985eed,5b441321-bd1e-4c56-8f09-365b05985eed,0,1,559f1e66-e8da-437a-aa27-d0e1be6619b6,559f1e66-e8da-437a-aa27-d0e1be6619b6,0,1,704d69cd-d921-4957-a004-43bd7eb4d979,704d69cd-d921-4957-a004-43bd7eb4d979,0,1,f1594682-16ac-408c-8307-a7a8db79b09f,f1594682-16ac-408c-8307-a7a8db79b09f,0,1,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,863aebd2-ce32-4f1f-bb3d-d6062ab187fd,0,1,4cb814d8-cb1b-4366-b500-e820ad526b0c,4cb814d8-cb1b-4366-b500-e820ad526b0c,0,1,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,7da5f3b4-6330-4112-9d3a-7bb42996aa4a,0,1,6c43df9f-ca36-415b-afec-302807820d73,6c43df9f-ca36-415b-afec-302807820d73,0,1,c7fb7551-806a-40b2-8879-14cd897b60d8,c7fb7551-806a-40b2-8879-14cd897b60d8,0,1,68337023-d573-4d04-95b6-44f73258c2a4,68337023-d573-4d04-95b6-44f73258c2a4,0,1,7cf39337-b722-486f-8e37-a62239d0ccd2,7cf39337-b722-486f-8e37-a62239d0ccd2,0,1,2571cfaf-d876-4385-a60a-1488aacf7080,2571cfaf-d876-4385-a60a-1488aacf7080,0,1,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,4ea1dd0a-6eab-48e4-a6a7-314d0e211d6c,0,1,44398566-3189-4584-8f8a-9deb1d07ce41,44398566-3189-4584-8f8a-9deb1d07ce41,0,1,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,6f4e3082-9c8c-4289-8cc2-704c8d2763ce,0,1,accfa63a-479d-4996-95bc-cdf5acdf203c,accfa63a-479d-4996-95bc-cdf5acdf203c,0,1,351998e0-8939-4dd4-a833-f4756bcc53b8,351998e0-8939-4dd4-a833-f4756bcc53b8,0,1,cd69bad8-524e-4be4-88cc-7732a88b38b8,cd69bad8-524e-4be4-88cc-7732a88b38b8,0,1,0a32248c-6994-4988-90d1-30882bc9da6b,0a32248c-6994-4988-90d1-30882bc9da6b,0,1,b57b53cb-6972-4bda-ae46-96571be1ebec,b57b53cb-6972-4bda-ae46-96571be1ebec,0,1,1a1a9636-fb72-4e4a-af96-5858442b1e61,1a1a9636-fb72-4e4a-af96-5858442b1e61,0,1,bca9cf34-9e11-4014-976a-28c4330b136e,bca9cf34-9e11-4014-976a-28c4330b136e,0,1,65fffe1a-6f36-4f50-975f-4471ad29d3ec,65fffe1a-6f36-4f50-975f-4471ad29d3ec,0,1,8fe5dad5-686a-4631-ae05-2917c33f7d83,8fe5dad5-686a-4631-ae05-2917c33f7d83,0,1,edef86c6-73bf-4e47-b62d-b2b548a732cd,edef86c6-73bf-4e47-b62d-b2b548a732cd,0,1,a1715044-d76f-4238-ba3e-989d04078d83,a1715044-d76f-4238-ba3e-989d04078d83,0,1,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,a7ec91a5-2ed4-4ecd-b794-fcd3bb5ea4a2,0,1,299c47a7-0b30-4f62-8f5c-f087ad6411fb,299c47a7-0b30-4f62-8f5c-f087ad6411fb,0,1,4d4724df-24fb-4c59-9d04-3f984906214a,4d4724df-24fb-4c59-9d04-3f984906214a,0,1,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,95b10bc8-39ef-43f5-b74e-f36cfa9bc806,0,1,cb9b73ee-8531-48d9-9266-9aaa4336a612,cb9b73ee-8531-48d9-9266-9aaa4336a612,0,1,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,b7b80237-d642-4c21-a9ee-64fc4ed20d2f,0,1,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,aeee2eea-1bb9-4e8a-ac5c-c940eaa86511,0,1,d042687f-0725-4611-a868-f5b4f6a3a3a8,d042687f-0725-4611-a868-f5b4f6a3a3a8,0,1,bb143340-7fff-49ef-b121-355c96613f78,bb143340-7fff-49ef-b121-355c96613f78,0,1,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,cd5fbbcb-19b8-4c0b-93c7-ebdf642826db,0,1,f2f69644-80dc-4b5e-a208-ed1de131e25e,f2f69644-80dc-4b5e-a208-ed1de131e25e,0,1,73060f72-6d08-47da-aac8-d4d2ed8f871c,73060f72-6d08-47da-aac8-d4d2ed8f871c,0,1,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,f3a6219e-bff5-4d36-9baa-bb214cebc2ed,0,1,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,9f832f4b-ae60-4d81-9ffd-6e00f7e02560,0,1,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,6f6ef6ac-5bb7-41e4-b6d5-0f068e8cb176,0,1,821225ea-1bad-49a6-a422-80d8a09baf13,821225ea-1bad-49a6-a422-80d8a09baf13,0,1,d0106f3a-8490-4277-a278-75c318ec252c,d0106f3a-8490-4277-a278-75c318ec252c,0,1,5035aa55-d557-419a-89e2-10ed0f8d109b,5035aa55-d557-419a-89e2-10ed0f8d109b,0,1,fb79315a-8d27-4c5e-9cfb-c7778dabedef,fb79315a-8d27-4c5e-9cfb-c7778dabedef,0,1,5f93d2af-64ff-41cc-8403-4a0e83160fea,5f93d2af-64ff-41cc-8403-4a0e83160fea,0,1,c12c90e4-7c40-489b-b14b-6b9442016e0f,c12c90e4-7c40-489b-b14b-6b9442016e0f,0,1,6371e288-3502-4d66-9006-b5a36107c0b7,6371e288-3502-4d66-9006-b5a36107c0b7,0,1,245814f7-028c-4c13-98eb-15412e851f81,245814f7-028c-4c13-98eb-15412e851f81,0,1,0132e564-2cd3-4930-8962-1068532f4be4,0132e564-2cd3-4930-8962-1068532f4be4,0,1,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,57d0f9b0-18d0-48ba-9f3c-d106f66ac602,0,1,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,3a7cfd4c-c943-43c2-a8d5-6d8ab3a10fc9,0,1,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,36b8b08f-0da3-4dbd-9aa8-73220ca9101d,0,1,7021fca5-d612-43e1-927b-7f822153cf75,7021fca5-d612-43e1-927b-7f822153cf75,0,1,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,9fd16d51-91bb-4973-a7c4-cf4db87da8bf,0,1,ee0a8d23-660a-492b-a813-b57394acee05,ee0a8d23-660a-492b-a813-b57394acee05,0,1,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,d1eda8f4-ffdd-445a-882c-6124d9f7fcf2,0,1,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,f3a8dd22-4469-4a3b-a7dd-78a5624b7bf0,0,1,ade21e2e-349f-414b-8f35-6ae3b6a4064d,ade21e2e-349f-414b-8f35-6ae3b6a4064d,0,1,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,cce823c6-3bd5-4e46-91f6-8715cb72b1d5,0,1,83f51efe-e2af-459a-b59f-2c036124ac23,83f51efe-e2af-459a-b59f-2c036124ac23,0,1,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,6ed466d7-e016-4d9c-9c0e-8deed48cbd70,0,1,b03829e9-ba22-4584-85f0-c36d63f48242,b03829e9-ba22-4584-85f0-c36d63f48242,0,1,084a7c95-a59b-4861-b8b3-b5710a57ac60,084a7c95-a59b-4861-b8b3-b5710a57ac60,0,1,efcea6da-6746-4e00-913a-14cab38b5d84,efcea6da-6746-4e00-913a-14cab38b5d84,0,1,aff367fb-7fca-44d0-adf9-3731f14834f6,aff367fb-7fca-44d0-adf9-3731f14834f6,0,1,a2782760-dd4c-44d2-a785-814d6f610455,a2782760-dd4c-44d2-a785-814d6f610455,0,1,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,245162d8-6ae1-47e5-a0c9-0d5f2e5d8ea8,0,1,6581ac1f-11ef-42b8-9f3b-590bb7546e63,6581ac1f-11ef-42b8-9f3b-590bb7546e63,0,1,ce952e88-35b7-4506-81ac-d7081e50a650,ce952e88-35b7-4506-81ac-d7081e50a650,0,1,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,5d7a53fa-1a89-4e6e-868c-4077bd84c0ce,0,1,3bf1281f-7570-4633-86b9-3e953a7e6647,3bf1281f-7570-4633-86b9-3e953a7e6647,0,1,715dc289-5b14-4ee0-8716-9c15958b9069,715dc289-5b14-4ee0-8716-9c15958b9069,0,1,92707138-5004-4378-8477-f909166d319d,92707138-5004-4378-8477-f909166d319d,0,1,43661775-43bb-4d9e-bfbb-c46e7d194ca3,43661775-43bb-4d9e-bfbb-c46e7d194ca3,0,1,532637ef-be0d-4f42-9747-a88e17eb3def,532637ef-be0d-4f42-9747-a88e17eb3def,0,1,61127152-3e24-40b4-8a23-5eb6cae568ff,61127152-3e24-40b4-8a23-5eb6cae568ff,0,1,ffd987e3-e8af-4d46-881e-1e312e74dbac,ffd987e3-e8af-4d46-881e-1e312e74dbac,0,1,ad1142ed-183d-47a3-800c-997a3770e11e,ad1142ed-183d-47a3-800c-997a3770e11e,0,1,ebef37c6-4808-4683-93be-036ce19cafd5,ebef37c6-4808-4683-93be-036ce19cafd5,0,1,66364cd4-aaa5-421d-96d6-3c283c14650d,66364cd4-aaa5-421d-96d6-3c283c14650d,0,1,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,fdbbbf8b-dacf-436e-8d8b-1e2b8e854b17,0,1,3c54d440-e908-43d6-a5cc-bb64620c82d7,3c54d440-e908-43d6-a5cc-bb64620c82d7,0,1,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,23a240a2-52ee-46ab-89d9-50dcee2cc8d2,0,1,bf1dd911-8ee1-407b-acae-10c85b74baf3,bf1dd911-8ee1-407b-acae-10c85b74baf3,0,1,e924058f-25c3-4744-a565-836b824991b7,e924058f-25c3-4744-a565-836b824991b7,0,1,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,bc6a47a1-a3f3-4d7e-9dad-099bd3dba751,0,1,518dcd70-4ccf-4866-a94f-7ceec7dd2801,518dcd70-4ccf-4866-a94f-7ceec7dd2801,0,1,0481bc65-6a32-46b9-ae87-993ba52a29a5,0481bc65-6a32-46b9-ae87-993ba52a29a5,0,1,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,36ebebbb-dff1-4dbd-870b-58bd4a71fa1f,0,1,dbc5f419-63b0-4cbe-90ff-c0101105e46c,dbc5f419-63b0-4cbe-90ff-c0101105e46c,0,1,c708f6e9-b7a0-4046-90f3-83527da7b872,c708f6e9-b7a0-4046-90f3-83527da7b872,0,1,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0006b44a-3a0c-4be4-8dd0-bd0db9ddcc4d,0,1,14256e0a-a947-42a3-8e36-47bfbb052a0c,14256e0a-a947-42a3-8e36-47bfbb052a0c,0,1,1b1aa77a-d14b-4751-a7da-0b5bac4db461,1b1aa77a-d14b-4751-a7da-0b5bac4db461,0,1,c0dcdb22-6719-4597-a781-bca1370909e5,c0dcdb22-6719-4597-a781-bca1370909e5,0,1,7a34f723-cd14-4949-a40f-7ce579bf0449,7a34f723-cd14-4949-a40f-7ce579bf0449,0,1,5cdc9ac7-bba9-4ed1-845a-607976fc4679,5cdc9ac7-bba9-4ed1-845a-607976fc4679,0,1,295f3692-0721-4c41-a69b-171ef20a5018,295f3692-0721-4c41-a69b-171ef20a5018,0,1,86c22871-6d1c-44e0-8ade-ce4bdeb23321,86c22871-6d1c-44e0-8ade-ce4bdeb23321,0,1,da51de81-4d4f-46b5-a308-7b50db6c45a7,da51de81-4d4f-46b5-a308-7b50db6c45a7,0,1,8d31ce6a-4d44-46c6-a11c-47fb33e88691,8d31ce6a-4d44-46c6-a11c-47fb33e88691,0,1,c2a8c2d3-ff13-4a13-acd4-797118c4e767,c2a8c2d3-ff13-4a13-acd4-797118c4e767,0,1,bc6adf75-8666-49f3-9703-b0014dfee123,bc6adf75-8666-49f3-9703-b0014dfee123,0,1,30632f54-b779-4857-a5cc-c53fe8887ee5,30632f54-b779-4857-a5cc-c53fe8887ee5,0,1,df22b227-b2c3-4e65-9706-7582f99fe59c,df22b227-b2c3-4e65-9706-7582f99fe59c,0,1,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,eafaec9c-030b-4e5f-8fa8-e17dad2feec9,0,1,087480bb-8c89-4b00-a29b-b7e29926478d,087480bb-8c89-4b00-a29b-b7e29926478d,0,1,685373b7-638a-439a-8cba-703d56e4e404,685373b7-638a-439a-8cba-703d56e4e404,0,1,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,8a41b8f1-93fc-44e6-bf45-0d1fa9d24f4a,0,1,1cfba08f-d5e5-4833-b494-a25d0477e9c3,1cfba08f-d5e5-4833-b494-a25d0477e9c3,0,1,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,ae22743b-6d21-4fbb-bb4c-fee53e2b87cb,0,1,921a0a14-8c06-4894-95ce-423000769364,921a0a14-8c06-4894-95ce-423000769364,0,1,3805ee39-a48a-499a-9ef8-9c2a5985404f,3805ee39-a48a-499a-9ef8-9c2a5985404f,0,1,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,07ccfe87-e1ab-4da7-92cb-a612e0972b0b,0,1,08c2f92c-eb05-49e7-bfc9-4a89607b9864,08c2f92c-eb05-49e7-bfc9-4a89607b9864,0,1,6d751379-89a7-49b5-93e5-578329c63d9c,6d751379-89a7-49b5-93e5-578329c63d9c,0,1,c3f156ef-947e-4ebb-883f-4f099a116063,c3f156ef-947e-4ebb-883f-4f099a116063,0,1,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,5e3ab0a3-c0a6-4f41-85d3-2eede4abb555,0,1,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,a065ffc3-f50b-4a78-9b84-bfc4e5515a4b,0,1,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,4cba5a06-1484-4dd1-8e35-2d702c7d96d0,0,1,e98e9e56-2995-430c-bd3b-f1070aec15a5,e98e9e56-2995-430c-bd3b-f1070aec15a5,0,1,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,d35c51b0-4cb7-4f9c-8aac-6a25a1b49adf,0,1,8a7546f4-bfc9-4732-bf60-43a41e2c8753,8a7546f4-bfc9-4732-bf60-43a41e2c8753,0,1,16244165-d5a4-4012-8bb5-7f5fee1111af,16244165-d5a4-4012-8bb5-7f5fee1111af,0,1,290b72ad-004f-46ab-be5e-47557543b965,290b72ad-004f-46ab-be5e-47557543b965,0,1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,e1b2ccf9-5a8f-4008-86f3-d2c7cf5581d1,0,1,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,fa0e0792-bffb-47ce-866f-9e8dbdab17a4,0,1,263bcd20-9878-48d4-aac4-b371ec49d8d6,263bcd20-9878-48d4-aac4-b371ec49d8d6,0,1,da1d8660-2757-4cea-bae0-c2210b9406ae,da1d8660-2757-4cea-bae0-c2210b9406ae,0,1,d60329c6-8f48-481d-82e7-18da355cb09c,d60329c6-8f48-481d-82e7-18da355cb09c,0,1,c4b14162-b25b-4099-9ec3-7251848ef08a,c4b14162-b25b-4099-9ec3-7251848ef08a,0,1,8eb5ba97-eb38-4357-8bfc-e9618280800d,8eb5ba97-eb38-4357-8bfc-e9618280800d,0,1,b72f73d5-e274-472b-871b-16af72dab603,b72f73d5-e274-472b-871b-16af72dab603,0,1,b008d184-0b61-460d-9490-89ecc1cd58ba,b008d184-0b61-460d-9490-89ecc1cd58ba,0,1,c8340e2f-6958-4bcd-8e17-499c4adfe60b,c8340e2f-6958-4bcd-8e17-499c4adfe60b,0,1,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,c72831cd-d064-4fe8-9603-64e6d7b8ac4d,0,1,03f68d82-752c-45d1-bf9a-60ecd21a2c81,03f68d82-752c-45d1-bf9a-60ecd21a2c81,0,1,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,307e8938-e347-4eff-b2fb-fd0b8f4aa27f,0,1,d4fffc79-2841-49a9-a382-e9e4138984df,d4fffc79-2841-49a9-a382-e9e4138984df,0,1,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,84e4c572-5b32-46e0-82a0-0c76d4ef5d73,0,1,9f41f903-d316-4189-8dc0-603ea9036c1c,9f41f903-d316-4189-8dc0-603ea9036c1c,0,1,e19e70d6-8707-4dde-ae69-7bd97035ca03,e19e70d6-8707-4dde-ae69-7bd97035ca03,0,1,425b5272-1130-457d-8a05-aee8fad681d9,425b5272-1130-457d-8a05-aee8fad681d9,0,1,8d583436-f2a6-4a33-8137-1376f5754643,8d583436-f2a6-4a33-8137-1376f5754643,0,1,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,4a864e74-41ce-4673-a080-bc3c2ba1b8ee,0,1,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,d279958e-6dd4-4bb0-a65f-c8768b4c4d96,0,1,2d66502d-77ab-4cc9-9ccf-5433458fae9f,2d66502d-77ab-4cc9-9ccf-5433458fae9f,0,1,cff48da7-3c46-4602-83e8-90c9ea53e107,cff48da7-3c46-4602-83e8-90c9ea53e107,0,1,7155472d-c791-402c-96e1-d25612024c88,7155472d-c791-402c-96e1-d25612024c88,0,1,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,fb90c261-24a7-4cef-8a2c-85c0e4fdd64a,0,1,9005911d-ea81-48b6-bf50-1a328ff4d7be,9005911d-ea81-48b6-bf50-1a328ff4d7be,0,1,7df12006-c0c0-42a6-b852-bdced72c62e3,7df12006-c0c0-42a6-b852-bdced72c62e3,0,1,9c00987d-3c55-40eb-bae8-f36e71e4ef87,9c00987d-3c55-40eb-bae8-f36e71e4ef87,0,1,29273130-5142-48c9-8399-00e5ab4b6203,29273130-5142-48c9-8399-00e5ab4b6203,0,1,9e14cd7e-1293-4008-baf8-88df6a98abf7,9e14cd7e-1293-4008-baf8-88df6a98abf7,0,1,98e3aace-52a6-4911-8205-92165adca6de,98e3aace-52a6-4911-8205-92165adca6de,0,1,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,91f4dbf9-d539-4239-a95d-c1d9e14e50f8,0,1,577e5fea-b792-4c8b-b3b3-a03a14b64b04,577e5fea-b792-4c8b-b3b3-a03a14b64b04,0,1,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,ba5ec2d6-1791-42b5-8e6f-04d1d18e9469,0,1,b18d312b-f9c3-4f37-ac77-d499e949f154,b18d312b-f9c3-4f37-ac77-d499e949f154,0,1,ace2beea-d393-412f-8b71-b845b665e2c4,ace2beea-d393-412f-8b71-b845b665e2c4,0,1,3fd4bc77-2a1b-4750-a54a-4171c8d40027,3fd4bc77-2a1b-4750-a54a-4171c8d40027,0,1,5b27fde9-fa80-48b1-aea1-73e132b9a944,5b27fde9-fa80-48b1-aea1-73e132b9a944,0,1,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,00bf04d6-6a8e-4b13-94cf-36c1c6090cd8,0,1,a747ec6b-f230-49b4-a929-7ed1ba87b078,a747ec6b-f230-49b4-a929-7ed1ba87b078,0,1,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,796f8fb4-d9cd-40ae-936b-8a70d2eb1121,0,1,4802e016-a9e9-47d0-916b-b42194a1f388,4802e016-a9e9-47d0-916b-b42194a1f388,0,1,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,a1740d1f-1b8f-4db5-be5e-0eac44e934b8,0,1,4062674a-4a81-494d-82bc-4984cd7c7903,4062674a-4a81-494d-82bc-4984cd7c7903,0,1,782a8801-06ca-4d63-bf8b-63d2320766d8,782a8801-06ca-4d63-bf8b-63d2320766d8,0,1,93a73123-d98c-4286-9269-7bfcedd115e8,93a73123-d98c-4286-9269-7bfcedd115e8,0,1,c5985c02-1824-4ce9-b415-1621dd2ee864,c5985c02-1824-4ce9-b415-1621dd2ee864,0,1,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,993ce747-cdc9-445f-ad7d-daf53cd5f7e9,0,1,e819aaf6-3dfb-492a-8a4a-50a7c6854790,e819aaf6-3dfb-492a-8a4a-50a7c6854790,0,1,62b95ba1-f213-42fb-90f3-a03e8094bc9e,62b95ba1-f213-42fb-90f3-a03e8094bc9e,0,1,619b534d-5605-40d3-9b8c-4443a21d7795,619b534d-5605-40d3-9b8c-4443a21d7795,0,1,a010bbf4-d547-4576-9797-28e3096ffed3,a010bbf4-d547-4576-9797-28e3096ffed3,0,1,a44c3eb2-1054-41ca-82e8-fc35336e7009,a44c3eb2-1054-41ca-82e8-fc35336e7009,0,1,01f67911-4ca7-4668-b970-62c299b98e56,01f67911-4ca7-4668-b970-62c299b98e56,0,1,20c89c94-f77f-4e14-8c97-2a70c1419ce3,20c89c94-f77f-4e14-8c97-2a70c1419ce3,0,1,1c09bf33-9b54-4bfd-bc92-e7324025fab0,1c09bf33-9b54-4bfd-bc92-e7324025fab0,0,1,8d7750e9-899f-4434-8702-44cd02681779,8d7750e9-899f-4434-8702-44cd02681779,0,1,426cbebb-880b-49c5-b046-83c5e071273e,426cbebb-880b-49c5-b046-83c5e071273e,0,1,d85244dc-c417-4e69-9aa7-7ad313ecb940,d85244dc-c417-4e69-9aa7-7ad313ecb940,0,1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,3bebf5e9-68bb-48dc-a39d-cbdca2dbecb1,0,1,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,cd392ef0-dedb-4f83-9a2c-a24190ee0dc0,0,1,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,bb2f0c1c-3cfb-4a26-b6de-5bbeb5614587,0,1,0713de12-87d5-4877-bd8a-2b6466df67df,0713de12-87d5-4877-bd8a-2b6466df67df,0,1,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,b848aafc-44fb-4dfe-8eec-233dc08fbbb6,0,1,c4d7c569-4649-4f98-a048-45f3c5933670,c4d7c569-4649-4f98-a048-45f3c5933670,0,1,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,6dc05d69-bd54-4e8a-8985-c2ddfa0aaffb,0,1,ad08b104-01f8-4900-a06c-baa1d55eba84,ad08b104-01f8-4900-a06c-baa1d55eba84,0,1,9352d10d-188f-4074-8dd1-7be5c11525e3,9352d10d-188f-4074-8dd1-7be5c11525e3,0,1,1933634a-6f10-48e7-99f0-60ac338f7832,1933634a-6f10-48e7-99f0-60ac338f7832,0,1,655deec5-c079-4748-8521-b3f10c243394,655deec5-c079-4748-8521-b3f10c243394,0,1,f6d4d818-d54c-4337-82cf-abd5e6dbe770,f6d4d818-d54c-4337-82cf-abd5e6dbe770,0,1,656c447b-291f-4e62-81ac-1c004841aa72,656c447b-291f-4e62-81ac-1c004841aa72,0,1,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,c9a06c8d-2f6d-4e03-bc62-a1a19f17faf3,0,1,5ba93404-58ad-4321-9a62-27db828f75f6,5ba93404-58ad-4321-9a62-27db828f75f6,0,1,3da20e86-1d83-4935-b425-a91392dc8f35,3da20e86-1d83-4935-b425-a91392dc8f35,0,1,b56f25d2-72a9-4d80-8998-77ac3097c873,b56f25d2-72a9-4d80-8998-77ac3097c873,0,1,03bd775a-e0a1-4205-82ce-6068e73ad134,03bd775a-e0a1-4205-82ce-6068e73ad134,0,1,40bed47b-7754-4a70-b51a-47385fd46e83,40bed47b-7754-4a70-b51a-47385fd46e83,0,1,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,773ef914-5e7e-4ec1-bcdb-b2d111b560e6,0,1,1e5a4f93-1ab9-4775-9538-2a1772215d89,1e5a4f93-1ab9-4775-9538-2a1772215d89,0,1,c25db165-0734-4fef-b161-e5164954a616,c25db165-0734-4fef-b161-e5164954a616,0,1,4f97b909-68f9-482a-b958-b4caa9b83763,4f97b909-68f9-482a-b958-b4caa9b83763,0,1,c31e34db-41ff-4db3-a4d0-f780f67070f6,c31e34db-41ff-4db3-a4d0-f780f67070f6,0,1,7a014fcb-a4b8-4c1c-b0de-21907a917c25,7a014fcb-a4b8-4c1c-b0de-21907a917c25,0,1,1688ef5d-72df-4bc4-a879-89033d466ad7,1688ef5d-72df-4bc4-a879-89033d466ad7,0,1,30f18fbf-4240-4708-a71a-189f8fc324f3,30f18fbf-4240-4708-a71a-189f8fc324f3,0,1,344cb0de-315d-4d05-93f8-8a1f53208470,344cb0de-315d-4d05-93f8-8a1f53208470,0,1,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,98aa5d5e-6c0e-4b9b-a3fa-335635d15217,0,1,a7973409-b18e-4b88-ad50-e2ae89470d8f,a7973409-b18e-4b88-ad50-e2ae89470d8f,0,1,a537875e-492e-4cf2-96e9-e2e97bb206da,a537875e-492e-4cf2-96e9-e2e97bb206da,0,1,085a08f3-9d93-429d-9b1b-9065ab8363f7,085a08f3-9d93-429d-9b1b-9065ab8363f7,0,1,a530c0a1-c1d2-40bb-9d0e-320074dbb684,a530c0a1-c1d2-40bb-9d0e-320074dbb684,0,1,55c63580-16f1-4d6f-a40b-e630f71ebb98,55c63580-16f1-4d6f-a40b-e630f71ebb98,0,1,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0a136ad9-22ad-4ba7-a31a-40a193b49d26,0,1,208c7b8c-3df9-4441-8ebf-34ffa81572a2,208c7b8c-3df9-4441-8ebf-34ffa81572a2,0,1,8c17fd7c-74d7-496a-a843-42022afb0707,8c17fd7c-74d7-496a-a843-42022afb0707,0,1,b456d820-8034-4381-960d-66d9f86b0a4b,b456d820-8034-4381-960d-66d9f86b0a4b,0,1,bd55fd03-cf67-4333-a554-98e03d18f780,bd55fd03-cf67-4333-a554-98e03d18f780,0,1,6eac5f7b-0952-4c94-9028-529b14ffcd4f,6eac5f7b-0952-4c94-9028-529b14ffcd4f,0,1,1a7c774d-5b86-4051-b797-3081e19fa30a,1a7c774d-5b86-4051-b797-3081e19fa30a,0,1,00949768-5833-4fe2-8752-b009d1bceef8,00949768-5833-4fe2-8752-b009d1bceef8,0,1,167455d1-6658-409f-834c-f6ccfe7b25de,167455d1-6658-409f-834c-f6ccfe7b25de,0,1,c5b3ca21-8f7b-4933-853c-7d95b17b5631,c5b3ca21-8f7b-4933-853c-7d95b17b5631,0,1,8b0faa1e-09da-4ba4-894e-e86abc5d39df,8b0faa1e-09da-4ba4-894e-e86abc5d39df,0,1,cb50b309-1b6c-400c-9e9e-67204dcccaae,cb50b309-1b6c-400c-9e9e-67204dcccaae,0,1,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,e2b482cb-6954-4e6a-abe9-d0a01f64b73a,0,1,c46fd680-efbe-49a8-91f0-73e36d791fa9,c46fd680-efbe-49a8-91f0-73e36d791fa9,0,1,6995567b-5a3c-4e03-9fb4-e22363ed6555,6995567b-5a3c-4e03-9fb4-e22363ed6555,0,1,32c38c2b-072d-4cf2-bf9a-f9c4b4c463e8,32c38c2b-072d-4cf2-bf9a-f9c4b4c463e8,0,1,b8a966ba-3452-44df-91d0-7040ecd3e4c2,b8a966ba-3452-44df-91d0-7040ecd3e4c2,0,1,80d6883d-c608-4fe5-acae-78bc45e40e5f,80d6883d-c608-4fe5-acae-78bc45e40e5f,0,1,213b173a-c3b7-449c-a618-d479c4dc38e8,213b173a-c3b7-449c-a618-d479c4dc38e8,0,1,7a64dffc-5cfe-41e2-bd55-fbf4957559a4,7a64dffc-5cfe-41e2-bd55-fbf4957559a4,0,1,a78249aa-ca9f-4bee-b00d-68ff59ea81a4,a78249aa-ca9f-4bee-b00d-68ff59ea81a4,0,1,7534148d-0124-49a2-a446-c6205d153153,7534148d-0124-49a2-a446-c6205d153153,0,1,32ed8a10-7177-4e45-866e-04a1b6831570,32ed8a10-7177-4e45-866e-04a1b6831570,0,1,e2a90d7a-5480-47cd-b296-8d60d8baf7f9,e2a90d7a-5480-47cd-b296-8d60d8baf7f9,0,1,8190a432-1037-4334-b2c7-bae39f7f9442,8190a432-1037-4334-b2c7-bae39f7f9442,0,1,4733e5c1-8198-408b-8903-866d3b0fdc43,4733e5c1-8198-408b-8903-866d3b0fdc43,0,1,e1fc5146-37c5-4207-af05-7250976bd406,e1fc5146-37c5-4207-af05-7250976bd406,0,1,60038cd9-8d01-44b1-9d3f-f3a31e59e5db,60038cd9-8d01-44b1-9d3f-f3a31e59e5db,0,1,f0bfb98b-cc43-4b6c-8166-9b81b4c22cb0,f0bfb98b-cc43-4b6c-8166-9b81b4c22cb0,0,1,f5e27159-789a-4d34-ac51-fd99d753b83a,f5e27159-789a-4d34-ac51-fd99d753b83a,0,1,f1cb02ff-a2f0-4a34-93fa-e47c6e210ee1,f1cb02ff-a2f0-4a34-93fa-e47c6e210ee1,0,1,981a74f4-cdc2-4016-b462-9b5fd0d6de4d,981a74f4-cdc2-4016-b462-9b5fd0d6de4d,0,1,1d89e2b7-8f66-4210-8ab4-29efde5e5295,1d89e2b7-8f66-4210-8ab4-29efde5e5295,0,1,fafff964-8daa-4921-9d53-fd6be3878d94,fafff964-8daa-4921-9d53-fd6be3878d94,0,1,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,7183d525-212a-42f3-a7e5-eb9deaeaa4a3,0,1,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,b82b27cc-e81c-4b7c-9833-ea4f2ce21edb,0,1,4347f77e-bad9-4525-90a0-794787f03585,4347f77e-bad9-4525-90a0-794787f03585,0,1,cfde3330-2bed-4273-8d69-c213ebdde247,cfde3330-2bed-4273-8d69-c213ebdde247,0,1,2d6ca049-89a5-437e-971c-b8e42f61b460,2d6ca049-89a5-437e-971c-b8e42f61b460,0,1,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,c450ebe1-4223-4a7a-b9fa-374d5c13dc8c,0,1,271d58d0-4449-40cc-bae9-cc4c50eebd9b,271d58d0-4449-40cc-bae9-cc4c50eebd9b,0,1,58df9322-c786-4dd1-af49-7cd164b378da,58df9322-c786-4dd1-af49-7cd164b378da,0,1,8d48de7f-61d6-4462-9c14-f728206a482c,8d48de7f-61d6-4462-9c14-f728206a482c,0,1,a87e890a-8924-4f56-9e37-04579b95297a,a87e890a-8924-4f56-9e37-04579b95297a,0,1,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,c71d4fa4-86b0-41e2-8b6a-cfb91e131eaf,0,1,4c1f2581-ee42-4df5-9169-20205a18a9be,4c1f2581-ee42-4df5-9169-20205a18a9be,0,1,bb3d9ea3-8895-4950-9ee9-4249ca983d48,bb3d9ea3-8895-4950-9ee9-4249ca983d48,0,1,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,86ea21fa-5ecc-4d81-b6ad-d71e7ed39009,0,1,b806d2b6-bbd1-4abd-9471-7791603a2fcf,b806d2b6-bbd1-4abd-9471-7791603a2fcf,0,1,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,d7aa519b-9a2e-4946-bd06-9ac22bb7c1e4,0,1,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,ecee1ec8-aa1f-4b90-a1b3-2538a53c0dd7,0,1,34f50dd9-de16-4013-a2ef-6595d9c28930,34f50dd9-de16-4013-a2ef-6595d9c28930,0,1,56fcca65-3429-4409-bce7-f434f6530a74,56fcca65-3429-4409-bce7-f434f6530a74,0,1,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,5236ca8d-a4a6-4df8-a6a3-5cfe02c49aeb,0,1,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,bcfabf25-ae2f-4f73-836c-2cab3617a0b6,0,1,b286f047-a4d0-4808-b1b4-27997ead6d49,b286f047-a4d0-4808-b1b4-27997ead6d49,0,1,49da2d3a-657a-4cfd-8e37-422b96d2cda5,49da2d3a-657a-4cfd-8e37-422b96d2cda5,0,1,fced16ae-abee-4fbe-9582-dfd368d5610a,fced16ae-abee-4fbe-9582-dfd368d5610a,0,1,afe60bad-1585-487f-9a39-9b9e031f9576,afe60bad-1585-487f-9a39-9b9e031f9576,0,1,4c4f0475-bd11-40c8-af0d-8affec6f838d,4c4f0475-bd11-40c8-af0d-8affec6f838d,0,1,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,7aee36ac-bbd1-4b06-8266-b7325fb9ce3c,0,1,855439d7-a621-48f5-b6d9-bc2bbd11ad90,855439d7-a621-48f5-b6d9-bc2bbd11ad90,0,1,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,4e0ec0f0-eb44-41b0-b950-88fdb6ac0db2,0,1,2f25e742-555b-4db8-bff2-2d345ce2a93a,2f25e742-555b-4db8-bff2-2d345ce2a93a,0,1,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,303d8c17-4303-4f1d-8bed-51cd7ea0a4b2,0,1,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,46affd3a-f31c-4432-bd58-2f2b1ed9bc4e,0,1,a7fee9d3-569d-4b5b-bd47-44790e0095f5,a7fee9d3-569d-4b5b-bd47-44790e0095f5,0,1,a258fe12-7e55-4f89-86fa-962b1d2947ac,a258fe12-7e55-4f89-86fa-962b1d2947ac,0,1,93701593-5ac8-4266-b471-7e9ed35a9c3e,93701593-5ac8-4266-b471-7e9ed35a9c3e,0,1,0fdb864e-ede9-4777-835c-0804968ee544,0fdb864e-ede9-4777-835c-0804968ee544,0,1,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,04c45a51-4a8e-48fa-a39c-f67ce2079fc4,0,1,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,b46546fe-3d6b-473f-a7cb-ff3b3ae0bafe,0,1,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,e7b1810c-8e6c-4759-9e6f-c754b5a1ac77,0,1,5dee9814-fe38-4631-8148-8d6c87ef6f47,5dee9814-fe38-4631-8148-8d6c87ef6f47,0,1,37d17053-5c2b-4972-b6a5-a589f2ddbde6,37d17053-5c2b-4972-b6a5-a589f2ddbde6,0,1,c349968a-3f87-425b-8efb-d847934dee4b,c349968a-3f87-425b-8efb-d847934dee4b,0,1,3bb8dc33-970c-4c58-9036-ce716d963847,3bb8dc33-970c-4c58-9036-ce716d963847,0,1,b3ff39fa-f665-4d01-9a2a-69722e6b1071,b3ff39fa-f665-4d01-9a2a-69722e6b1071,0,1,0abacb0a-ce00-474e-8aec-35685c51ddef,0abacb0a-ce00-474e-8aec-35685c51ddef,0,1,ae407b17-03aa-4268-8603-58d6714dae89,ae407b17-03aa-4268-8603-58d6714dae89,0,1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,5c0ce79b-97a9-4917-9b02-a4548a97d5a1,0,1,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,c552cfac-d3ef-4b63-a0b9-7c79261ff9f3,0,1,5bb6e52c-ac26-4143-8e90-f04f703f823b,5bb6e52c-ac26-4143-8e90-f04f703f823b,0,1,579baaa4-6493-4d99-8744-6399757295c7,579baaa4-6493-4d99-8744-6399757295c7,0,1,9c1325af-7492-42be-b3af-51b692534510,9c1325af-7492-42be-b3af-51b692534510,0,1,dface15c-cd65-4fb1-b4dd-b513086d3f8e,dface15c-cd65-4fb1-b4dd-b513086d3f8e,0,1,ae6d0e12-8857-476c-b4b2-f03295cbed3e,ae6d0e12-8857-476c-b4b2-f03295cbed3e,0,1,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,bd0e3bd4-1207-41ea-8dfc-afa8f7d08cc2,0,1,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,d6969c1e-e13c-4542-abb7-9cf6bb50b8e2,0,1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,ccd91f94-d3f1-4aa3-90cf-081d72c4cab1,0,1,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,aa7d5ca4-3c02-4ca1-a790-2435ee9f9f02,0,1,b7e85f5c-4312-44c6-895a-3f636a8c78d8,b7e85f5c-4312-44c6-895a-3f636a8c78d8,0,1,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,3b6e7ee6-0ef5-464a-a01a-6143479c7a61,0,1,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,1969e8d1-0a82-44cb-a0d4-e5badb1d28d4,0,1,a1afacc5-f49a-4df2-a44d-479594d50179,a1afacc5-f49a-4df2-a44d-479594d50179,0,1,fe70eba3-7477-4a38-a511-d69960abb928,fe70eba3-7477-4a38-a511-d69960abb928,0,1,6534ea96-2145-49e6-9739-f59459dc7f6b,6534ea96-2145-49e6-9739-f59459dc7f6b,0,1,f49bffa0-cad6-4801-b82e-21aa580e72e6,f49bffa0-cad6-4801-b82e-21aa580e72e6,0,1,bbbfb817-8db3-4415-86c3-af028276d6e9,bbbfb817-8db3-4415-86c3-af028276d6e9,0,1,6a91112c-f6cc-47a0-9d26-a36c7702af7d,6a91112c-f6cc-47a0-9d26-a36c7702af7d,0,1,cb92dc2e-6053-4233-a408-4464514b1257,cb92dc2e-6053-4233-a408-4464514b1257,0,1,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,8cd65ad3-a7a3-46f6-9061-e8751fd5073e,0,1,85550a7a-8fe0-4296-ace5-63cf053536b4,85550a7a-8fe0-4296-ace5-63cf053536b4,0,1,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,cf1bd9cd-2ef2-4868-b6c0-5160860690f7,0,1,3f8b6411-6606-4d27-891e-7c77be47c5f9,3f8b6411-6606-4d27-891e-7c77be47c5f9,0,1,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,bed3f0b2-40c6-4323-9bca-cb8864e38ec0,0,1,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,f8f0857f-2c75-471a-ae0b-a3a265e1eb25,0,1,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,a23f97fb-7ac9-4941-a2c6-bbff6c36ac12,0,1,80cf54ed-8677-4c89-a378-0abef6c64010,80cf54ed-8677-4c89-a378-0abef6c64010,0,1,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,f0dec7b3-2d6a-44ce-a1da-9c71ccd37539,0,1,56ee3afd-5ae6-421e-b9f3-26505e40f100,56ee3afd-5ae6-421e-b9f3-26505e40f100,0,1,63c9a839-78b2-4706-b380-5aedf6914930,63c9a839-78b2-4706-b380-5aedf6914930,0,1,40f5c1cb-2654-4738-bb44-6734b0e3490b,40f5c1cb-2654-4738-bb44-6734b0e3490b,0,1,2ec484b1-95eb-43a7-9430-1c1ef49f05af,2ec484b1-95eb-43a7-9430-1c1ef49f05af,0,1,1a314ce2-03bc-4267-89a9-bb5bb866f552,1a314ce2-03bc-4267-89a9-bb5bb866f552,0,1,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,e3b783a6-5ea2-4cd4-955b-df63d93c1f25,0,1,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,f8ab62ad-7776-49ae-b1bb-51bea9a9992b,0,1,e859dd18-8baf-49c0-b7a0-1205b6c125d3,e859dd18-8baf-49c0-b7a0-1205b6c125d3,0,1,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,778c28e6-4548-45f3-a1bc-cb1dbf0cb388,0,1,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,a2d6f2d9-0610-4ca9-bc15-58e341a049a4,0,1,4dbf114a-5402-40b0-9cab-19601aa8328e,4dbf114a-5402-40b0-9cab-19601aa8328e,0,1,a0856ca2-6a66-4108-b6d4-82443cdccca6,a0856ca2-6a66-4108-b6d4-82443cdccca6,0,1,378b0708-a0a1-4c82-b55a-796acb27e696,378b0708-a0a1-4c82-b55a-796acb27e696,0,1,8e462c0e-c67a-45e9-9871-1f976b01632d,8e462c0e-c67a-45e9-9871-1f976b01632d,0,1,c5335e1f-3e47-46b7-b695-0653f825d855,c5335e1f-3e47-46b7-b695-0653f825d855,0,1,d7faad11-1e35-460c-8943-49370f328c03,d7faad11-1e35-460c-8943-49370f328c03,0,1,e4726010-85c5-4ccc-b574-4b3b55f0d391,e4726010-85c5-4ccc-b574-4b3b55f0d391,0,1,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,5d6770f2-9b3d-45c7-9e34-4c8626e482cf,0,1,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,b01ace0e-7f21-4b6b-b751-074dcd9a8f54,0,1,1f4f839a-4e19-45b8-a988-13ee604c269c,1f4f839a-4e19-45b8-a988-13ee604c269c,0,1,b3aa97e1-baef-45f4-9179-052f35527a5e,b3aa97e1-baef-45f4-9179-052f35527a5e,0,1,d613941f-ed4c-4957-b469-ea6b0d2a121d,d613941f-ed4c-4957-b469-ea6b0d2a121d,0,1,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0d8d08e3-194f-416c-a1e0-aa92b40b7911,0,1,af0178fe-eb3a-485b-9acf-35c8702aa330,af0178fe-eb3a-485b-9acf-35c8702aa330,0,1,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,9e2c01b1-ccfe-4a68-a6af-8284e3e2396f,0,1,c513ceb0-0855-43ce-a311-c9bea88e2563,c513ceb0-0855-43ce-a311-c9bea88e2563,0,1,974bfc13-85c2-454a-b562-e72384eb4c31,974bfc13-85c2-454a-b562-e72384eb4c31,0,1,69cd6adc-b129-4fbc-804d-8d5aaef77280,69cd6adc-b129-4fbc-804d-8d5aaef77280,0,1,3431a3de-cb9d-46dc-b597-3203831796a9,3431a3de-cb9d-46dc-b597-3203831796a9,0,1,f3866271-04ed-4963-852e-cf41e9e18e1d,f3866271-04ed-4963-852e-cf41e9e18e1d,0,1,b77e5ec2-35cd-43ae-957f-af35214fa621,b77e5ec2-35cd-43ae-957f-af35214fa621,0,1,4a04d83d-cadd-4f36-9ec8-f926259c18ba,4a04d83d-cadd-4f36-9ec8-f926259c18ba,0,1,85e670c0-1616-4611-984c-3d40e890b2e9,85e670c0-1616-4611-984c-3d40e890b2e9,0,1,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,48ed25b0-afb9-414b-9a4e-8647fbdd95c3,0,1,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,1e3a1148-1e9c-47b0-8f3c-f218c3b0094f,0,1,f1693207-2637-412a-972f-2bc79b9c7fc8,f1693207-2637-412a-972f-2bc79b9c7fc8,0,1,da59378e-0a97-4cff-977b-cc51967068ee,da59378e-0a97-4cff-977b-cc51967068ee,0,1,bbaad46d-f60d-49e6-a077-075366bca47e,bbaad46d-f60d-49e6-a077-075366bca47e,0,1,0d9f5703-91e4-4769-bedd-5bd974f2f617,0d9f5703-91e4-4769-bedd-5bd974f2f617,0,1,926cdf17-1929-43d6-8205-858aab558ad9,926cdf17-1929-43d6-8205-858aab558ad9,0,1,5ec6838f-2d70-4f91-b41b-16adfe8ed587,5ec6838f-2d70-4f91-b41b-16adfe8ed587,0,1,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,6420ad7e-61ca-4af9-9715-f2b0c3e2c58f,0,1,bee8b8a0-f058-44cb-822c-620351567627,bee8b8a0-f058-44cb-822c-620351567627,0,1,26365e29-903b-47fd-ad96-e0d87f5d6e87,26365e29-903b-47fd-ad96-e0d87f5d6e87,0,1,569180cb-ce54-4267-94b9-332e35e3c17d,569180cb-ce54-4267-94b9-332e35e3c17d,0,1,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,9ec6fc35-e84e-4f82-b616-5c02e945cc8f,0,1,a2c42946-1cdb-457a-a45b-97781cfb4a15,a2c42946-1cdb-457a-a45b-97781cfb4a15,0,1,20adf54c-044c-4bea-8028-b6d20917a030,20adf54c-044c-4bea-8028-b6d20917a030,0,1,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,dea6b05f-d3e1-4ff4-8f71-6a0c18134e94,0,1,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,a666af62-aa5d-4b2b-b9e5-017d1c93ae6a,0,1,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,7604b15a-8c5e-4515-84b9-c1d36f9efd0a,0,1,4033eb31-8281-402a-afff-431fa36e589e,4033eb31-8281-402a-afff-431fa36e589e,0,1,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,5a1e1da5-7307-4f48-bb1c-2977fc4d7cef,0,1,f59488c7-4643-4988-8043-5c9724e04279,f59488c7-4643-4988-8043-5c9724e04279,0,1,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,cfe022b5-7647-4b5c-a2bd-f5d313f4a9db,0,1,77149f7a-8a76-4569-9487-991c41e132ef,77149f7a-8a76-4569-9487-991c41e132ef,0,1,9e1be65e-986f-4d21-91f0-15c66db0c947,9e1be65e-986f-4d21-91f0-15c66db0c947,0,1,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,75a0f8f1-6d8d-47d0-81c5-20b5e55b9cd1,0,1,d2fe4578-a1f8-4586-b052-fa71d25365c9,d2fe4578-a1f8-4586-b052-fa71d25365c9,0,1,f31f3dab-5796-47ac-a54d-3081f8cad817,f31f3dab-5796-47ac-a54d-3081f8cad817,0,1,cd59707e-b9e4-4038-8203-ae22a8060e8d,cd59707e-b9e4-4038-8203-ae22a8060e8d,0,1,db497857-33d3-49a1-b328-dfc62c973ecb,db497857-33d3-49a1-b328-dfc62c973ecb,0,1,139c001c-7b07-465a-9187-399ad32d294f,139c001c-7b07-465a-9187-399ad32d294f,0,1,5d228ce4-069e-4f98-beed-b8e1de17c3d9,5d228ce4-069e-4f98-beed-b8e1de17c3d9,0,1,9770fc09-87bf-4fce-9b0d-410efd30edae,9770fc09-87bf-4fce-9b0d-410efd30edae,0,1,f3d8590a-dcfa-4d41-8d03-642b99ffa040,f3d8590a-dcfa-4d41-8d03-642b99ffa040,0,1,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,3d73d5ff-995e-40ed-a401-cec2a3d12c8f,0,1,20156709-1481-4007-8e89-9ce79fc589fc,20156709-1481-4007-8e89-9ce79fc589fc,0,1,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,fbcda361-0ef2-47b4-ba1c-1d1952898bd3,0,1,7e7c5abd-b645-4de5-a40e-5805ec4456e2,7e7c5abd-b645-4de5-a40e-5805ec4456e2,0,1,763a16c3-a728-4b65-a485-705990310b4a,763a16c3-a728-4b65-a485-705990310b4a,0,1,65338920-c744-4d1e-b351-848b90a3feda,65338920-c744-4d1e-b351-848b90a3feda,0,1,2aedb1ac-caf1-45c7-913e-82a36637d5d4,2aedb1ac-caf1-45c7-913e-82a36637d5d4,0,1,56177464-5e9f-4598-96bc-eb311993c503,56177464-5e9f-4598-96bc-eb311993c503,0,1,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,c2308e60-2844-4bd8-bc8a-c9c20e5fc62d,0,1,bdfe65f4-4174-4e66-915c-943137981cf0,bdfe65f4-4174-4e66-915c-943137981cf0,0,1,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,5271de2d-d3a0-4128-90e0-cd8e1ea2ad30,0,1,c895d58a-5be1-4157-81af-f4f6db9b4b9e,c895d58a-5be1-4157-81af-f4f6db9b4b9e,0,1,8ce6cc1a-8570-4704-b9a3-44e815b2e753,8ce6cc1a-8570-4704-b9a3-44e815b2e753,0,1,7d336fdd-5cbf-4c92-a783-f451f7590502,7d336fdd-5cbf-4c92-a783-f451f7590502,0,1,05243f56-7e9b-4a61-8efb-1b5e525fff21,05243f56-7e9b-4a61-8efb-1b5e525fff21,0,1,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,b16d5e79-9d7e-4d3e-9be8-3b2a932abf78,0,1,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,bc110a6a-26fa-4aa1-a2ef-bdaeaa0a33af,0,1,86760ecb-2ddd-40ce-bc4f-94c23027a55e,86760ecb-2ddd-40ce-bc4f-94c23027a55e,0,1,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,fb42ad06-d5a4-40ea-817c-fa7ff385d8db,0,1,7aa86a2d-2b47-447e-8901-806411011279,7aa86a2d-2b47-447e-8901-806411011279,0,1,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,f5d90a5a-1adb-49d6-8640-2e4054bdb99f,0,1,903af13a-1f73-4145-a3d0-971c3be5fbe6,903af13a-1f73-4145-a3d0-971c3be5fbe6,0,1,37722a34-1148-4cc8-95e6-4645ae9cca98,37722a34-1148-4cc8-95e6-4645ae9cca98,0,1,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,934b8380-c6e0-49f8-a6c2-91c0ddb2f95e,0,1,fca0dfad-f853-4694-9ce9-53a3a10f59b7,fca0dfad-f853-4694-9ce9-53a3a10f59b7,0,1,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,703a3e8a-0204-4e8f-8fa0-a2ed1aeb7662,0,1,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,4019a5e9-1f50-44b9-98ba-87c07a0ce4e5,0,1,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,71aa2bf7-85c9-40f3-a9b0-f6d666eddd28,0,1,1470f052-f032-46bc-b1ee-54555e725dfd,1470f052-f032-46bc-b1ee-54555e725dfd,0,1,497cbe4d-586d-48a2-8e98-d20e3e09ed42,497cbe4d-586d-48a2-8e98-d20e3e09ed42,0,1,150c9d05-4ccc-4cb7-879d-b1d9c3534343,150c9d05-4ccc-4cb7-879d-b1d9c3534343,0,1,38b7679d-3739-4572-baf2-d8c7b2a94f0a,38b7679d-3739-4572-baf2-d8c7b2a94f0a,0,1,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,11f32e0f-7d16-4ebd-9cef-fffd2d64e70a,0,1,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,b1ed134b-f2aa-4b06-b7a2-0e524ead04df,0,1,1281fe19-bbca-4a4f-84d8-14187e62000f,1281fe19-bbca-4a4f-84d8-14187e62000f,0,1,953dbad6-4f5c-4319-874a-db358a77d001,953dbad6-4f5c-4319-874a-db358a77d001,0,1,69ceac29-06d3-45f2-b914-7966465cd0d3,69ceac29-06d3-45f2-b914-7966465cd0d3,0,1,cc34bd23-de0a-4b09-8333-e4693576b9f4,cc34bd23-de0a-4b09-8333-e4693576b9f4,0,1,b4cb92fb-ad82-44ed-9203-397b412b3453,b4cb92fb-ad82-44ed-9203-397b412b3453,0,1,b690721d-960b-4374-8d2c-feed3a2b354b,b690721d-960b-4374-8d2c-feed3a2b354b,0,1,271243d3-1871-4a0a-bf7f-63bacacf0a59,271243d3-1871-4a0a-bf7f-63bacacf0a59,0,1,bc10ad8f-383c-469a-8c0e-60805161055b,bc10ad8f-383c-469a-8c0e-60805161055b,0,1,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,57f4ee70-185e-4f2a-91a6-6c0bf93c1000,0,1,ee8af8ee-e49a-4511-9a91-48814ab99d23,ee8af8ee-e49a-4511-9a91-48814ab99d23,0,1,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,3a7d9d49-b5e5-4c5c-958e-a4c6afda8b9d,0,1,6fbf844e-ee8d-490f-9177-6392d262312f,6fbf844e-ee8d-490f-9177-6392d262312f,0,1,65000437-bd07-4841-a458-679d44768c46,65000437-bd07-4841-a458-679d44768c46,0,1,9b7051d5-abc4-416c-a0e6-515d120d78e4,9b7051d5-abc4-416c-a0e6-515d120d78e4,0,1,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,86d1bc4e-f08d-48c7-8b3a-3c5feb0c843c,0,1,869938e6-6310-4326-bd15-5b91fe2e0911,869938e6-6310-4326-bd15-5b91fe2e0911,0,1,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,8ed7254b-bbf8-49d9-8a73-9a91316fd02d,0,1,a156521a-ece1-49d3-8056-1c3508273c45,a156521a-ece1-49d3-8056-1c3508273c45,0,1,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,075d39e0-a77a-4d0b-9260-7524fb5b2d0c,0,1,10018f80-3138-4089-bf9a-a5f178f1e295,10018f80-3138-4089-bf9a-a5f178f1e295,0,1,43aba109-4b7f-45ef-9c30-8b754e81911b,43aba109-4b7f-45ef-9c30-8b754e81911b,0,1,4ccd72e1-7fd7-4a3b-8428-71b44992937e,4ccd72e1-7fd7-4a3b-8428-71b44992937e,0,1,46077650-2b2c-4319-8279-41f277971669,46077650-2b2c-4319-8279-41f277971669,0,1,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,4afe733d-64a0-4ea5-9d12-6e2c86eb91e4,0,1,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,d0b79c3d-b0c5-4eb3-9971-1def1c88698f,0,1,e82ebd72-7b5a-4f45-b853-1001bf680a05,e82ebd72-7b5a-4f45-b853-1001bf680a05,0,1,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,a74879b8-c080-4cc0-b44f-2b7c4dae87fe,0,1,e9e9b733-e97a-430d-95ce-45ea27751f64,e9e9b733-e97a-430d-95ce-45ea27751f64,0,1,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,86ffe9a7-9b3e-49ab-bd88-20269fec56bc,0,1,3dd50c66-27f7-4f1e-86e9-c709995c8609,3dd50c66-27f7-4f1e-86e9-c709995c8609,0,1,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,45c0003f-0ed7-4582-b84e-217fdc4ddeaf,0,1,ed1369c5-c274-45bd-ae91-7648565ae09f,ed1369c5-c274-45bd-ae91-7648565ae09f,0,1,8d0fce61-a22f-4033-9e03-3f00c4a21722,8d0fce61-a22f-4033-9e03-3f00c4a21722,0,1,bfb3f026-e940-49c3-ac30-408186f9e11e,bfb3f026-e940-49c3-ac30-408186f9e11e,0,1,e1dc83eb-a8cd-454b-8de8-cff2049be78c,e1dc83eb-a8cd-454b-8de8-cff2049be78c,0,1,9edd9288-1463-4d67-b9f0-40f351d978e9,9edd9288-1463-4d67-b9f0-40f351d978e9,0,1,c9db6c68-965f-4567-b26e-5d497a389de1,c9db6c68-965f-4567-b26e-5d497a389de1,0,1,4da2f65d-56bd-4140-9b31-e5ccac4a800a,4da2f65d-56bd-4140-9b31-e5ccac4a800a,0,1,eb163bba-b94c-4a78-9c2d-7b519325e3d4,eb163bba-b94c-4a78-9c2d-7b519325e3d4,0,1,939bdb9a-294b-4b42-a56f-030f69bc29c4,939bdb9a-294b-4b42-a56f-030f69bc29c4,0,1,ee7a763b-bcbf-4ff3-89af-eb7965b33515,ee7a763b-bcbf-4ff3-89af-eb7965b33515,0,1,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,e72b3ae6-00e9-45d7-a4f3-bc8a5a2f5ae4,0,1,b8931f98-c1d7-4e9b-be43-065064e7ba95,b8931f98-c1d7-4e9b-be43-065064e7ba95,0,1,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,ab2b472d-97d5-4c33-86fd-e2cdaedf3f3d,0,1,60848308-931c-4da3-aa4b-37f6fb4b194f,60848308-931c-4da3-aa4b-37f6fb4b194f,0,1,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,08af8da8-d44b-46f0-a8d3-60421e7b5a1a,0,1,54b14504-503b-45f6-9b5d-785b49829425,54b14504-503b-45f6-9b5d-785b49829425,0,1,80d3ee33-1cdc-4af6-85c2-787094526592,80d3ee33-1cdc-4af6-85c2-787094526592,0,1,c8b28660-6cb0-4ef5-85c2-a75da863ba96,c8b28660-6cb0-4ef5-85c2-a75da863ba96,0,1,1cd607b4-49fc-460e-a014-6afe50083b47,1cd607b4-49fc-460e-a014-6afe50083b47,0,1,a215e767-36e9-4408-9d18-7b4be757022a,a215e767-36e9-4408-9d18-7b4be757022a,0,1,a3e262bc-9f0d-480d-a1d1-c2326105d22d,a3e262bc-9f0d-480d-a1d1-c2326105d22d,0,1,8eae0c79-288b-4773-90bb-49299ad45628,8eae0c79-288b-4773-90bb-49299ad45628,0,1,2faa5594-f1b4-4312-b674-82fdf9623105,2faa5594-f1b4-4312-b674-82fdf9623105,0,1,185c1ad3-b5db-49b6-9342-d08e1bf64903,185c1ad3-b5db-49b6-9342-d08e1bf64903,0,1,3c69a4ad-001d-4421-88f6-412e15d710d6,3c69a4ad-001d-4421-88f6-412e15d710d6,0,1,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,d0373603-5abb-4f7b-8d2f-9f7fb52615aa,0,1,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,f20a35fe-6029-4dc8-b6b4-b098dbce12e8,0,1,6a68a08a-ea37-4573-ab9f-ec822f6d250b,6a68a08a-ea37-4573-ab9f-ec822f6d250b,0,1,00e87d04-8104-420b-b2c6-7304889a75b2,00e87d04-8104-420b-b2c6-7304889a75b2,0,1,bde86820-f7bb-463b-97d0-bfa5f8323af0,bde86820-f7bb-463b-97d0-bfa5f8323af0,0,1,289a6aac-dc4e-4fae-8815-853e78d450bb,289a6aac-dc4e-4fae-8815-853e78d450bb,0,1,557e7d89-83ed-45d0-86cc-6e355f14025d,557e7d89-83ed-45d0-86cc-6e355f14025d,0,1,d681b26b-dd8d-46d7-986e-10f05c37a1e4,d681b26b-dd8d-46d7-986e-10f05c37a1e4,0,1,4d3c216e-c04f-4884-8681-1c861c50ce7d,4d3c216e-c04f-4884-8681-1c861c50ce7d,0,1,4a41eee0-c973-4824-a07c-9fcf731f055e,4a41eee0-c973-4824-a07c-9fcf731f055e,0,1,ee756c33-f408-4449-a6bb-3186a0421362,ee756c33-f408-4449-a6bb-3186a0421362,0,1,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,fbfa8f64-52e4-48f6-b0fb-fd06976dd93d,0,1,6ff66622-4d20-4696-9fe9-4b4faeb21d96,6ff66622-4d20-4696-9fe9-4b4faeb21d96,0,1,46237eec-c206-4d21-883c-27599b9ed38c,46237eec-c206-4d21-883c-27599b9ed38c,0,1,8b451909-2c15-48f2-b869-65e7031cc542,8b451909-2c15-48f2-b869-65e7031cc542,0,1,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,ab6ff81a-56aa-4742-afe4-d7a652e9d2de,0,1,7b377fca-4466-476f-9eb2-0b00141103d6,7b377fca-4466-476f-9eb2-0b00141103d6,0,1,9ce5eceb-f366-4035-956e-62721358b154,9ce5eceb-f366-4035-956e-62721358b154,0,1,52c016dd-f0df-4251-94c2-2e29ed5bc2d6,52c016dd-f0df-4251-94c2-2e29ed5bc2d6,0,1,c559ab26-8ed8-418e-9342-0559442dbcbf,c559ab26-8ed8-418e-9342-0559442dbcbf,0,1,1685c406-d0cb-4e0a-a3b0-036c8c22942a,1685c406-d0cb-4e0a-a3b0-036c8c22942a,0,1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,892dc4c4-a72b-4dbf-af62-9f9ae0e05aa1,0,1,81db41a6-2580-4a69-b1fd-57cfd48a7efa,81db41a6-2580-4a69-b1fd-57cfd48a7efa,0,1,0db8b3b2-bf24-4006-9897-797084c241ef,0db8b3b2-bf24-4006-9897-797084c241ef,0,1,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,fd9d34d9-9c9c-4c05-9c08-b93d4b237adf,0,1,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,381b7dae-6b34-42a7-9fee-2a4af8a1cc18,0,1,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,31e9ca0d-9ae1-4740-a0a6-2739aa29c99f,0,1,20091427-d173-40ca-b2c4-53ee99b0b5ae,20091427-d173-40ca-b2c4-53ee99b0b5ae,0,1,14cbde39-a39a-48e5-9b72-b798a0bcea3f,14cbde39-a39a-48e5-9b72-b798a0bcea3f,0,1,56871c10-e3af-4679-afad-3baa910d73bb,56871c10-e3af-4679-afad-3baa910d73bb,0,1,f81b51c5-57e4-41f8-9ad5-3d2717351b95,f81b51c5-57e4-41f8-9ad5-3d2717351b95,0,1,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,3c09f0cd-fbec-46ae-95b0-a00cc53c07ef,0,1,de0a39e0-d37d-47c6-a019-e44836edc8d1,de0a39e0-d37d-47c6-a019-e44836edc8d1,0,1,1fdcc1e7-ad53-409e-ba13-84c6429740cd,1fdcc1e7-ad53-409e-ba13-84c6429740cd,0,1,71d544bf-15c1-4581-8baa-ac126308425c,71d544bf-15c1-4581-8baa-ac126308425c,0,1,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,1bd0b688-d0fb-4ca2-85aa-4bd82b72ccc2,0,1,7acfe30e-73cb-465a-88f2-92b7275dc49b,7acfe30e-73cb-465a-88f2-92b7275dc49b,0,1,8e387dac-5029-49da-a013-355df0a51a44,8e387dac-5029-49da-a013-355df0a51a44,0,1,13859664-8307-40e8-855b-557b9cf2f1ec,13859664-8307-40e8-855b-557b9cf2f1ec,0,1,e4397fba-507f-497c-9414-7d08ccd4d799,e4397fba-507f-497c-9414-7d08ccd4d799,0,1,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,794f5fb5-3b8f-4f45-9250-7a3b9d1db383,0,1,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,f7a89bfc-e3c9-4894-a2df-6c229b4e0fd8,0,1,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,1e8b70ce-27fc-418f-b3f3-e6efbce9f7a2,0,1,d915d338-3e4c-45c3-aef5-a07cf41b05f6,d915d338-3e4c-45c3-aef5-a07cf41b05f6,0,1,978640a2-5c4b-4e21-857e-34f00840fba8,978640a2-5c4b-4e21-857e-34f00840fba8,0,1,da2913e3-a29b-423f-9aae-08fed56a7d90,da2913e3-a29b-423f-9aae-08fed56a7d90,0,1,149e72b8-cc03-4b4f-8ca4-07987600c34d,149e72b8-cc03-4b4f-8ca4-07987600c34d,0,1,7649bd7b-fe8c-4338-80fc-153160a5e538,7649bd7b-fe8c-4338-80fc-153160a5e538,0,1,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,7779cd6d-8fa1-49cb-9bbc-9dfd0979f3f4,0,1,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,3dec1ae7-90bb-45ab-aa04-48cfbc14742e,0,1,6137605e-4850-44ec-b4ee-048bd8e0ec3a,6137605e-4850-44ec-b4ee-048bd8e0ec3a,0,1,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,ee28aa9b-0f31-4d8b-8444-43b8bc88bd23,0,1,0e6e9372-beb4-478e-9428-71b19a60739b,0e6e9372-beb4-478e-9428-71b19a60739b,0,1,32b11498-542f-46b2-829f-1525936ab7fa,32b11498-542f-46b2-829f-1525936ab7fa,0,1,64afa916-4750-4008-8c6c-2a470fb11283,64afa916-4750-4008-8c6c-2a470fb11283,0,1,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,f4a85bfb-40c7-4f81-af32-d07b96c53ad0,0,1,35354abc-9a76-4ee8-8796-c24b37365ea0,35354abc-9a76-4ee8-8796-c24b37365ea0,0,1,840a1d4d-e5f6-4a88-886f-03830fe4f99a,840a1d4d-e5f6-4a88-886f-03830fe4f99a,0,1,7078977f-31bf-427e-ac37-e309d81fe999,7078977f-31bf-427e-ac37-e309d81fe999,0,1,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,bb39ae51-be82-4bb5-a30e-2bf2b53be59e,0,1,d8854555-9e15-4d82-a1fd-656a848a8e8a,d8854555-9e15-4d82-a1fd-656a848a8e8a,0,1,53191842-ea05-4491-84d7-071cd201992d,53191842-ea05-4491-84d7-071cd201992d,0,1,86c70449-4cf7-4baf-9742-b82b134ed929,86c70449-4cf7-4baf-9742-b82b134ed929,0,1,af3b1881-163a-4c07-a1d9-77ceadf59c77,af3b1881-163a-4c07-a1d9-77ceadf59c77,0,1,b78be6fb-7db8-48c8-ba7b-aab1fea34890,b78be6fb-7db8-48c8-ba7b-aab1fea34890,0,1,bd27276a-e80c-4135-b341-f99a816ffe86,bd27276a-e80c-4135-b341-f99a816ffe86,0,1,35306678-147c-4ad1-a3c6-c80a11afa22f,35306678-147c-4ad1-a3c6-c80a11afa22f,0,1,0da75726-ae71-4d83-a696-a774c787a8a2,0da75726-ae71-4d83-a696-a774c787a8a2,0,1,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,5b30b0e9-f986-49b8-8668-5bb0e09f0cfe,0,1,896a7267-0198-4cbb-b6e6-7aa157c0cc61,896a7267-0198-4cbb-b6e6-7aa157c0cc61,0,1,2005bf54-219b-4111-bff1-e12e2c6dca3e,2005bf54-219b-4111-bff1-e12e2c6dca3e,0,1,abab8f73-d705-4350-b44d-f912649a2190,abab8f73-d705-4350-b44d-f912649a2190,0,1,20c9c25c-f8c9-429f-84bd-543cb809abef,20c9c25c-f8c9-429f-84bd-543cb809abef,0,1,dc5f451e-3275-43a8-9f48-45b83220d461,dc5f451e-3275-43a8-9f48-45b83220d461,0,1,028f5e81-61df-4d13-876d-781c5fd18ee6,028f5e81-61df-4d13-876d-781c5fd18ee6,0,1,3cbb59ef-7f64-4590-8a54-ba01e78283c3,3cbb59ef-7f64-4590-8a54-ba01e78283c3,0,1,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,a5b83672-2ead-4d0a-a4e5-ddd991f1addc,0,1,388eb513-fadb-40cd-8a7b-33b904dd758e,388eb513-fadb-40cd-8a7b-33b904dd758e,0,1,0613c6aa-e1fe-4632-a396-a17ec773158f,0613c6aa-e1fe-4632-a396-a17ec773158f,0,1,1a330987-4c79-4ab7-b250-db8d32c78751,1a330987-4c79-4ab7-b250-db8d32c78751,0,1,555062ed-9a04-41d8-877f-0a667e9a08cd,555062ed-9a04-41d8-877f-0a667e9a08cd,0,1,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,5b1db523-b5cb-4ff8-8662-5feeb4282b4a,0,1,ac160e1c-fef7-4625-84e0-964b397f6bdb,ac160e1c-fef7-4625-84e0-964b397f6bdb,0,1,b8946d9c-dda8-4b94-8cbf-db62b647c53e,b8946d9c-dda8-4b94-8cbf-db62b647c53e,0,1,24215916-7732-4030-9f88-163f644e94f7,24215916-7732-4030-9f88-163f644e94f7,0,1,69697945-9748-4cea-a20f-e244b46de2e8,69697945-9748-4cea-a20f-e244b46de2e8,0,1,68538fd1-262c-43ea-b09f-8a66643a0062,68538fd1-262c-43ea-b09f-8a66643a0062,0,1,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,d042a8e1-a7b9-4f26-abc4-d618bc73e9f5,0,1,82ad24cc-d9f8-440b-a720-e204101d85da,82ad24cc-d9f8-440b-a720-e204101d85da,0,1,8010065f-aec8-4768-85ec-9eb7b2b01e7e,8010065f-aec8-4768-85ec-9eb7b2b01e7e,0,1,a44348cb-e20c-4afd-8483-3b9c735b352c,a44348cb-e20c-4afd-8483-3b9c735b352c,0,1,ebfe4c74-6e16-4b64-8a52-cea95c446903,ebfe4c74-6e16-4b64-8a52-cea95c446903,0,1,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,ea9ed37c-7f58-43a8-990c-f1feb5d2d275,0,1,d912e472-9553-4b96-8b16-7aaff6c14239,d912e472-9553-4b96-8b16-7aaff6c14239,0,1,b04018b5-a74d-43c9-8519-6cc8aa23fe09,b04018b5-a74d-43c9-8519-6cc8aa23fe09,0,1,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,8f5af22e-3e73-4a4f-b91e-eccd0f5084fd,0,1,9283277f-2b75-4c3a-810a-8d4071b3afcc,9283277f-2b75-4c3a-810a-8d4071b3afcc,0,1,d03d5b18-57a2-43c0-99ea-8ad9d5788179,d03d5b18-57a2-43c0-99ea-8ad9d5788179,0,1,c491a7fc-14f9-498a-b7dd-575dfc66878e,c491a7fc-14f9-498a-b7dd-575dfc66878e,0,1,db15f8eb-4736-4b47-9cee-3e6883f0888c,db15f8eb-4736-4b47-9cee-3e6883f0888c,0,1,59064eb2-2770-4f1c-96bd-801926fe68ef,59064eb2-2770-4f1c-96bd-801926fe68ef,0,1,6b2340d7-687f-43a3-8eb8-8ddb86712466,6b2340d7-687f-43a3-8eb8-8ddb86712466,0,1,ca5d586f-81bb-40ee-b3bd-de854857c984,ca5d586f-81bb-40ee-b3bd-de854857c984,0,1,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,9846e2f6-d82a-42a6-bf50-2a9cdf750a8f,0,1,ee7d970c-cef7-4740-a357-1fe78f88a6e6,ee7d970c-cef7-4740-a357-1fe78f88a6e6,0,1,73f89524-dbe8-426f-8ee6-1277eb1967cc,73f89524-dbe8-426f-8ee6-1277eb1967cc,0,1,6733f1bd-7878-4a33-8995-c07526e87c1a,6733f1bd-7878-4a33-8995-c07526e87c1a,0,1,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,b5e81952-e469-4f26-b8d2-90e7d9e7bc1d,0,1,ec34befe-3c0b-4a75-b943-840c52e7dda5,ec34befe-3c0b-4a75-b943-840c52e7dda5,0,1,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0b7c4cb7-5126-4b5e-8941-cd56eaef76a0,0,1,40b08a20-51a3-438b-ba54-466917ea809f,40b08a20-51a3-438b-ba54-466917ea809f,0,1,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0e0670d6-d8f7-4728-bd1b-f016fffa0570,0,1,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,7f18eb86-e9ac-4cb8-a9aa-389f61dff582,0,1,144d5498-bb61-4bec-bef3-85a5a4aec3d5,144d5498-bb61-4bec-bef3-85a5a4aec3d5,0,1,ff18803b-4c3a-4720-a718-7547f04c6e2f,ff18803b-4c3a-4720-a718-7547f04c6e2f,0,1,9328da5c-4689-4a60-8136-ae9eac46ab38,9328da5c-4689-4a60-8136-ae9eac46ab38,0,1,42641296-64da-46e0-a407-de2d492f9c90,42641296-64da-46e0-a407-de2d492f9c90,0,1,b834af0b-086c-445d-a271-7e178c324551,b834af0b-086c-445d-a271-7e178c324551,0,1,32c10512-7bb8-423b-9503-ab2fa41386a4,32c10512-7bb8-423b-9503-ab2fa41386a4,0,1,888edfc4-8140-4675-b267-c32bf1d8d29d,888edfc4-8140-4675-b267-c32bf1d8d29d,0,1,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,a53f6e85-fbf7-4fb1-9301-d63e812fe16c,0,1,57a0f5f3-6573-4b35-af25-cea3a25641f1,57a0f5f3-6573-4b35-af25-cea3a25641f1,0,1,21d296a1-6809-4ff6-a4da-b455cad86cc2,21d296a1-6809-4ff6-a4da-b455cad86cc2,0,1,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,ecaa0af8-549c-4c07-82ff-1c4e02ff15b8,0,1,45a8c780-c067-40d7-bbe9-81f854aacf7a,45a8c780-c067-40d7-bbe9-81f854aacf7a,0,1,57885cac-059a-4a08-aa2c-43b116d2c777,57885cac-059a-4a08-aa2c-43b116d2c777,0,1,56b570b1-93b0-468a-9672-9c71113753f3,56b570b1-93b0-468a-9672-9c71113753f3,0,1,e693eac3-f55d-4102-ac6d-b14ef33fb2e7,e693eac3-f55d-4102-ac6d-b14ef33fb2e7,0,1,e7b0ae70-0192-456c-9dc5-e66049fa9df2,e7b0ae70-0192-456c-9dc5-e66049fa9df2,0,1,68944d09-618e-4fa3-a7af-8c84218e0ac7,68944d09-618e-4fa3-a7af-8c84218e0ac7,0,1,91b12ce3-e8ba-4c9d-9daa-1d5532500314,91b12ce3-e8ba-4c9d-9daa-1d5532500314,0,1,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,733dc291-0bef-4fe8-ac9f-63440f0c2ad0,0,1,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,5b7b7dc3-dbef-4854-9395-30a3ae4d751c,0,1,cb57aabc-eeef-42b4-9bc2-873cebd9618c,cb57aabc-eeef-42b4-9bc2-873cebd9618c,0,1,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,2fcd2c85-6778-42fa-9bdd-a6ba47497ec0,0,1,52f30ed7-aa16-4ce2-9684-e50229ab0015,52f30ed7-aa16-4ce2-9684-e50229ab0015,0,1,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,79c2e2bd-f923-42ec-8bdc-3e517e08ee7c,0,1,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0526492c-be48-4c84-8d68-19fa1c7e9d6e,0,1,54ecaf7b-9bc5-483c-96e1-270bcd323590,54ecaf7b-9bc5-483c-96e1-270bcd323590,0,1,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,2a1f77ba-fa2e-4281-8e68-7ec4ca0261b7,0,1,58f6f8fa-7473-40f5-973a-6279335d8f33,58f6f8fa-7473-40f5-973a-6279335d8f33,0,1,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,ec0c3187-de61-4bc8-a52a-7617f47ffb6d,0,1,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,1e71ec59-55a4-45e8-a8c9-f70c2cb56589,0,1,fa3632fe-185b-49aa-85ae-dfb721835d40,fa3632fe-185b-49aa-85ae-dfb721835d40,0,1,a4f15108-477c-465e-aaea-cb495ef52cf5,a4f15108-477c-465e-aaea-cb495ef52cf5,0,1,9cda5c2c-f401-4f63-b445-cef160296e48,9cda5c2c-f401-4f63-b445-cef160296e48,0,1,e8ae4a26-3127-43ae-af7a-c2e278d2611d,e8ae4a26-3127-43ae-af7a-c2e278d2611d,0,1,b923c78f-d074-41b4-b832-086686258f19,b923c78f-d074-41b4-b832-086686258f19,0,1,8ff96413-6fdd-4b8d-a181-ea0d8633defc,8ff96413-6fdd-4b8d-a181-ea0d8633defc,0,1,54604ed2-766b-4308-b99e-447817d82799,54604ed2-766b-4308-b99e-447817d82799,0,1,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,7abdb07b-edbc-4c3b-aa53-afaa92dc9071,0,1,f48b4475-2cd9-41df-962a-6529f84985ca,f48b4475-2cd9-41df-962a-6529f84985ca,0,1,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,2fbfe405-48e6-4abf-99c2-7f1f66a62b48,0,1,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,5e6637c7-19b5-4ac2-a8e9-d119e49f444e,0,1,bf94feb9-edf7-4df8-b5f5-805613663a0a,bf94feb9-edf7-4df8-b5f5-805613663a0a,0,1,6d852a13-c85e-4e84-8396-f91c1ed0596e,6d852a13-c85e-4e84-8396-f91c1ed0596e,0,1,9c2d5313-a4fd-417e-a340-ad4980d0028b,9c2d5313-a4fd-417e-a340-ad4980d0028b,0,1,4fb4a280-9426-4c41-a9ba-11f9d01a0740,4fb4a280-9426-4c41-a9ba-11f9d01a0740,0,1,1591ee7e-870c-4bf7-9450-be84f1b2506f,1591ee7e-870c-4bf7-9450-be84f1b2506f,0,1,8f088f33-92d7-4e35-915d-6cda1129dd80,8f088f33-92d7-4e35-915d-6cda1129dd80,0,1,9a8578a2-8a92-4ab3-a480-173340f8b34a,9a8578a2-8a92-4ab3-a480-173340f8b34a,0,1,4889d27b-435b-4059-a34d-6afdf3c77fa3,4889d27b-435b-4059-a34d-6afdf3c77fa3,0,1,4ebf0988-ccc3-440c-bd0f-2d01636bd730,4ebf0988-ccc3-440c-bd0f-2d01636bd730,0,1,69f42341-268b-4e74-9d6d-527800d018ab,69f42341-268b-4e74-9d6d-527800d018ab,0,1,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,c1be2a02-53b8-4c28-92b2-b6e0c83ab452,0,1,ca6ecedc-f4c5-4c14-8a02-6255ce45033a,ca6ecedc-f4c5-4c14-8a02-6255ce45033a,0,1,7eb5217f-684d-4a9e-8aef-48cedc809cbb,7eb5217f-684d-4a9e-8aef-48cedc809cbb,0,1,4b54d626-dc59-4e49-a708-0a7f98833b9a,4b54d626-dc59-4e49-a708-0a7f98833b9a,0,1,1c90a423-ef1b-42dc-a43b-1fda89672481,1c90a423-ef1b-42dc-a43b-1fda89672481,0,1,095cf2d6-5a7c-452d-8d60-991afb6e52bd,095cf2d6-5a7c-452d-8d60-991afb6e52bd,0,1,2c155a03-2aff-4632-adb2-be3266e0fac3,2c155a03-2aff-4632-adb2-be3266e0fac3,0,1,f9213a70-bfd6-464f-b28b-ed35bdf351c0,f9213a70-bfd6-464f-b28b-ed35bdf351c0,0,1,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,ca5957af-69c9-4640-b9a9-b241c4f9eaa7,0,1,7e32c295-a769-4cff-a3eb-992f7031475f,7e32c295-a769-4cff-a3eb-992f7031475f,0,1,eb81610a-eb2f-4068-ba74-75e0f5bbace8,eb81610a-eb2f-4068-ba74-75e0f5bbace8,0,1,21826316-0b49-4034-a49e-6d34c15ceb5c,21826316-0b49-4034-a49e-6d34c15ceb5c,0,1,3abffa47-8d47-4173-897b-708e1a06ef39,3abffa47-8d47-4173-897b-708e1a06ef39,0,1,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,0cf3d615-76a1-428d-9d25-0d7fdf09e4ae,0,1,5a398637-a06c-4442-9093-a864fa7f049f,5a398637-a06c-4442-9093-a864fa7f049f,0,1,38692186-a62a-42d1-87cd-7dbc6d4816ed,38692186-a62a-42d1-87cd-7dbc6d4816ed,0,1,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,6cfcdb89-ccb2-45fe-a7b1-5a29ccd6c5ae,0,1,3a28cea9-7fd7-4834-ab89-2a74331a64e3,3a28cea9-7fd7-4834-ab89-2a74331a64e3,0,1,0f881709-4520-4f18-af9d-cf08757693ff,0f881709-4520-4f18-af9d-cf08757693ff,0,1,c5151ca9-5103-42b2-8573-273c15416db8,c5151ca9-5103-42b2-8573-273c15416db8,0,1,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,fe4aa694-76c4-49c9-96ce-a2476f4ff58b,0,1,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,ba8c43ad-678a-4b18-8bbe-5a1b12d19b74,0,1,115a6019-ef87-4126-8ebf-070c1e882940,115a6019-ef87-4126-8ebf-070c1e882940,0,1,162ce023-b2e1-41dc-bcaf-b8e30caccce0,162ce023-b2e1-41dc-bcaf-b8e30caccce0,0,1,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,52bdd3cc-7103-4dbf-a3c3-dd46cf03da12,0,1,c13fb1cd-fe72-48a6-b383-55b6323619ce,c13fb1cd-fe72-48a6-b383-55b6323619ce,0,1,956fc8ee-96be-4309-b1e8-209372f151ab,956fc8ee-96be-4309-b1e8-209372f151ab,0,1,526c688e-a4d4-45f7-8bba-b8ceff38fe27,526c688e-a4d4-45f7-8bba-b8ceff38fe27,0,1,67efa786-312f-4c9c-b970-0320e92069af,67efa786-312f-4c9c-b970-0320e92069af,0,1,12f85e09-1190-4483-b531-630ab718db7f,12f85e09-1190-4483-b531-630ab718db7f,0,1,52f4453e-e968-4290-a79a-470f68fbd07f,52f4453e-e968-4290-a79a-470f68fbd07f,0,1,5b952e35-1037-4447-8293-6d8889692c8b,5b952e35-1037-4447-8293-6d8889692c8b,0,1,33e0072d-7d5b-4298-ae77-31a7cb358f5d,33e0072d-7d5b-4298-ae77-31a7cb358f5d,0,1,1051c0c7-1058-427c-8bf5-5e30b8fbfb54,1051c0c7-1058-427c-8bf5-5e30b8fbfb54,0,1,b27688c3-6682-45e1-a03f-0d2e8b1214e4,b27688c3-6682-45e1-a03f-0d2e8b1214e4,0,1,c8158812-024b-4f94-bd07-c3f1fd59e8a1,c8158812-024b-4f94-bd07-c3f1fd59e8a1,0,1,05bc8b4e-8c90-4502-8b16-7b1e7625d569,05bc8b4e-8c90-4502-8b16-7b1e7625d569,0,1,ce34d88d-3017-4197-a962-ea23a6a96d32,ce34d88d-3017-4197-a962-ea23a6a96d32,0,1,2cbc16da-aa67-4ad6-82f8-fa6922447be6,2cbc16da-aa67-4ad6-82f8-fa6922447be6,0,1,19d7a1ba-c343-4575-95da-53dac6d4b2cb,19d7a1ba-c343-4575-95da-53dac6d4b2cb,0,1,6cc8b3a0-3377-4b39-b6b0-69c862a15465,6cc8b3a0-3377-4b39-b6b0-69c862a15465,0,1,acb193f4-52e5-4572-a79b-b825a2f6525f,acb193f4-52e5-4572-a79b-b825a2f6525f,0,1,5d46f719-e468-48e2-b4ec-acb85c710451,5d46f719-e468-48e2-b4ec-acb85c710451,0,1,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,9fb13bfe-80c7-43c3-b0da-9185ab197ce2,0,1,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,cd80a520-1d1c-4d80-8a4a-360ac1ca98d8,0,1,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,e9aef0c8-9dc4-4c4a-8288-8b2d9860624d,0,1,5422610d-b92c-4213-a58c-8db067d93b66,5422610d-b92c-4213-a58c-8db067d93b66,0,1,8f59a635-9e0e-470d-8fda-a47a262a59c2,8f59a635-9e0e-470d-8fda-a47a262a59c2,0,1,ffb50eb9-149a-46ec-9472-d8f20ad09810,ffb50eb9-149a-46ec-9472-d8f20ad09810,0,1,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,5ae3bba3-dc98-4470-a73d-3bd951c0a3f2,0,1,7a6449e2-e90a-4720-a769-192284ef69c1,7a6449e2-e90a-4720-a769-192284ef69c1,0,1,02118b98-2349-46b1-a328-d6e2b5781f7e,02118b98-2349-46b1-a328-d6e2b5781f7e,0,1,67de9cbb-5c80-4cff-bfbe-269a958e08e6,67de9cbb-5c80-4cff-bfbe-269a958e08e6,0,1,2228a457-6805-41ee-85af-5ebca9568bf4,2228a457-6805-41ee-85af-5ebca9568bf4,0,1,96b71795-e230-4ecb-b98d-4feb3f8b9662,96b71795-e230-4ecb-b98d-4feb3f8b9662,0,1,04055821-03ce-4049-af2c-8670c80517f6,04055821-03ce-4049-af2c-8670c80517f6,0,1,0101305d-62eb-4802-9cd4-d615a518d842,0101305d-62eb-4802-9cd4-d615a518d842,0,1,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,898d2ba7-631a-4e7a-9bdf-cd2ef411e57a,0,1,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,bf1fc624-60d7-4a04-bb3a-b6e2882bebfe,0,1,7c424424-9660-462d-9cf2-4c1e6bd284fa,7c424424-9660-462d-9cf2-4c1e6bd284fa,0,1,e118f957-ab2c-473b-ab64-37032f727416,e118f957-ab2c-473b-ab64-37032f727416,0,1,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,e770e26e-a3a4-487d-b3bb-aeb63d8b7323,0,1,21f64e5f-dc94-4ce9-b836-e75646ae3325,21f64e5f-dc94-4ce9-b836-e75646ae3325,0,1,82e8a180-f2e1-406c-9609-89d33504aff2,82e8a180-f2e1-406c-9609-89d33504aff2,0,1,e7437c81-3d5b-466e-880c-8febe4a68e88,e7437c81-3d5b-466e-880c-8febe4a68e88,0,1,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,99bc26f9-ba56-4c63-9fd1-c2f3d630b93c,0,1,307771e6-bcf7-4016-b369-e1655bbe9e94,307771e6-bcf7-4016-b369-e1655bbe9e94,0,1,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,bf8c60f7-7dea-4a2c-8ce2-7001a6a37bfa,0,1,38fc6a54-846c-40b0-9254-3261f540bf18,38fc6a54-846c-40b0-9254-3261f540bf18,0,1,d9134d0c-56cd-4b8f-ab11-ae37fc306801,d9134d0c-56cd-4b8f-ab11-ae37fc306801,0,1,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,9408d0ee-bd61-4b95-ac7c-98de139b5f9e,0,1,8f2af24b-f5fa-4f6d-831e-28453bdedefc,8f2af24b-f5fa-4f6d-831e-28453bdedefc,0,1,d119e21d-0087-4f22-b3bd-b14707b65330,d119e21d-0087-4f22-b3bd-b14707b65330,0,1,dc9b4072-11de-40fe-bf2a-f7b15af0a250,dc9b4072-11de-40fe-bf2a-f7b15af0a250,0,1,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,e2cf5ca9-c2a0-4506-89e6-318cad0a48a3,0,1,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,5aecdfd1-1cd7-4523-be23-7e32fcb01a94,0,1,932b1c1a-72eb-49cd-8218-d0ced9c454d8,932b1c1a-72eb-49cd-8218-d0ced9c454d8,0,1,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,96d70dc4-02bd-47ad-9465-81de6ff5bdc9,0,1,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,38acaf7a-5a77-40bf-ba2a-17b31cccd37d,0,1,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,cb604857-8e49-4f2f-b5c8-2a7d8a3cf8e4,0,1,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,f33e9c76-e523-4f4e-ab4b-3fc1b256d8dd,0,1,5dd336c4-88c5-4f53-acf0-5f86a658c528,5dd336c4-88c5-4f53-acf0-5f86a658c528,0,1,c723112b-286d-46f1-989d-81252062a025,c723112b-286d-46f1-989d-81252062a025,0,1,67e8b47e-4bad-4b2f-b196-8a9708893051,67e8b47e-4bad-4b2f-b196-8a9708893051,0,1,a583e53a-3f3c-48c7-8928-37ce40b2bafe,a583e53a-3f3c-48c7-8928-37ce40b2bafe,0,1,a844dd4a-274a-4894-9446-031dbe006084,a844dd4a-274a-4894-9446-031dbe006084,0,1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,9a740f81-5437-47af-8ed9-ea62edcb2ea1,0,1,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,cdf54c86-0a1c-4f74-93ee-6d8d8db0a778,0,1,77bdd30f-4933-4bda-9c7a-b0a097da0910,77bdd30f-4933-4bda-9c7a-b0a097da0910,0,1,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,a8d52851-4293-4fe4-b2cb-f9c8c166ed97,0,1,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,d4879ecc-8f1a-4183-99a8-d6dfc1eed3f8,0,1,a682e9e1-284f-4e32-86b2-6736f159f585,a682e9e1-284f-4e32-86b2-6736f159f585,0,1,84f0bd89-9b86-440f-b942-9b685e22233e,84f0bd89-9b86-440f-b942-9b685e22233e,0,1,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,f2d508b3-9425-4ce6-86d8-5893ca4a8cd6,0,1,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,ce61612f-bcbb-4a02-bca0-d88e0ee42bd7,0,1,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,c1c35035-44cc-4aa1-ae8e-db3513ddc5f3,0,1,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,ac52baa1-02cb-4ce8-8f4f-1f9441b1cda0,0,1,fabf8a0b-366f-4f23-9377-315534bb854b,fabf8a0b-366f-4f23-9377-315534bb854b,0,1,7aac6439-64c9-4492-b866-bf91dda82d06,7aac6439-64c9-4492-b866-bf91dda82d06,0,1,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,6ffe3723-c6df-497b-a3ff-d817fbabfd8c,0,1,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,528a82b7-ef06-4d90-bb32-bd6d76ed6c74,0,1,08b86f29-64ef-467a-af1a-d27ffdf621ba,08b86f29-64ef-467a-af1a-d27ffdf621ba,0,1,6483d1ab-c53d-4985-ad7e-b799adbcd9da,6483d1ab-c53d-4985-ad7e-b799adbcd9da,0,1,82f66233-ed13-49ae-ab72-7cf91c88c760,82f66233-ed13-49ae-ab72-7cf91c88c760,0,1,75cddbcd-e960-4164-81d8-ac0a2a36e95b,75cddbcd-e960-4164-81d8-ac0a2a36e95b,0,1,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,e14d57f4-ae4a-4644-9ec1-a6af1b3e4c41,0,1,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,314f8451-ba96-46cd-bf9f-3a87df7d2a5b,0,1,d9151001-a911-45c1-a8e6-dcf0da623ed3,d9151001-a911-45c1-a8e6-dcf0da623ed3,0,1,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,30e06f80-b6d0-4fa9-a346-8e17dbe2fb68,0,1,e589a693-ff50-4c36-ae26-a8fcae966d57,e589a693-ff50-4c36-ae26-a8fcae966d57,0,1,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,8bacb87e-c2e9-41f5-bae1-c3a6b0e8179f,0,1,90f023f5-5b48-4f98-bfc6-b704277a355d,90f023f5-5b48-4f98-bfc6-b704277a355d,0,1,99485603-706d-4301-be25-82b1c0ee8f4d,99485603-706d-4301-be25-82b1c0ee8f4d,0,1,e7a28021-c75e-41b2-9974-cf4beee34d28,e7a28021-c75e-41b2-9974-cf4beee34d28,0,1,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,21e3bdf3-7cec-42de-8ef3-5815b9a1b747,0,1,2a603c61-4cbf-4c6d-a0b2-40c835d36737,2a603c61-4cbf-4c6d-a0b2-40c835d36737,0,1,a8d7f071-401b-499e-957c-d077d8002e54,a8d7f071-401b-499e-957c-d077d8002e54,0,1,211a539b-4be9-4816-98f6-f756e65eafd8,211a539b-4be9-4816-98f6-f756e65eafd8,0,1,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,e2d8167d-3ebf-4771-b9e0-e6382d68cc18,0,1,e9b9da80-7806-4c9c-a002-01cfa3109169,e9b9da80-7806-4c9c-a002-01cfa3109169,0,1,a271041d-0203-4ecd-bb39-70256c50192e,a271041d-0203-4ecd-bb39-70256c50192e,0,1,73eff626-a363-4a5a-879e-61ef6ce0726f,73eff626-a363-4a5a-879e-61ef6ce0726f,0,1,acf15b79-a6c4-4c46-8013-50d3b223baf6,acf15b79-a6c4-4c46-8013-50d3b223baf6,0,1,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,f6a29b80-e4c3-4c4f-8e2c-d4dda851d813,0,1,2d8d5d74-2bc0-4282-af66-e4a37694c147,2d8d5d74-2bc0-4282-af66-e4a37694c147,0,1,cfd31341-287b-4684-9ac0-b28b4e066f15,cfd31341-287b-4684-9ac0-b28b4e066f15,0,1,81de1b0b-7f2d-4098-ae99-061c6a90dc29,81de1b0b-7f2d-4098-ae99-061c6a90dc29,0,1,f829e2a9-5bdb-4171-8b32-8d10d5968813,f829e2a9-5bdb-4171-8b32-8d10d5968813,0,1,647ba8f8-57f7-4c19-af59-525517c1e392,647ba8f8-57f7-4c19-af59-525517c1e392,0,1,39062cb3-4ae8-4c0d-889b-038a55179946,39062cb3-4ae8-4c0d-889b-038a55179946,0,1,c62d4212-36ca-4afb-bac9-269b6f64ca51,c62d4212-36ca-4afb-bac9-269b6f64ca51,0,1,5cec5e16-46ad-4f8c-b869-f5b1cc487884,5cec5e16-46ad-4f8c-b869-f5b1cc487884,0,1,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,ca0363bb-81c2-4fce-b2f0-e8f42d118a74,0,1,7aacdf81-49fd-47a3-a36a-c483f1b05872,7aacdf81-49fd-47a3-a36a-c483f1b05872,0,1,857015e2-afb2-403d-bfb7-7acb5080797b,857015e2-afb2-403d-bfb7-7acb5080797b,0,1,5657286b-114b-41de-ab7d-45d0f0d95e2d,5657286b-114b-41de-ab7d-45d0f0d95e2d,0,1,42a0271e-6783-44db-95c1-09805ae01f58,42a0271e-6783-44db-95c1-09805ae01f58,0,1,8628783e-4fad-4dff-8220-9e0ddc8580f8,8628783e-4fad-4dff-8220-9e0ddc8580f8,0,1,356fc245-3034-42d1-84d0-632c6dc7a3d5,356fc245-3034-42d1-84d0-632c6dc7a3d5,0,1,07462664-6b58-4f5a-9b3f-2e5c376f17df,07462664-6b58-4f5a-9b3f-2e5c376f17df,0,1,6f23e946-f700-424b-b9bf-3a9c8846908d,6f23e946-f700-424b-b9bf-3a9c8846908d,0,1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,f3ef5989-a848-4a7f-8ac5-0eca882a6aa1,0,1,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,4f5087ab-cc60-4d1e-ba83-a319536bf8ba,0,1,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,07d0d6e9-e0a7-4543-9668-3850c1e0a15c,0,1,c656771c-dcb7-4c78-9a16-e62806d5bb5a,c656771c-dcb7-4c78-9a16-e62806d5bb5a,0,1,ec42c45c-18ca-44b0-9c59-1cb204552a43,ec42c45c-18ca-44b0-9c59-1cb204552a43,0,1,2aafb1a1-4321-47e9-9783-03ab616a2873,2aafb1a1-4321-47e9-9783-03ab616a2873,0,1,71109997-6da0-4eaf-bbf2-f94fa24f37cc,71109997-6da0-4eaf-bbf2-f94fa24f37cc,0,1,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,a3deeef2-f8a2-462f-a57f-87d89e4ec12a,0,1,d601281c-379d-4a9d-843e-478fd6567415,d601281c-379d-4a9d-843e-478fd6567415,0,1,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,fd9b3f7d-d25d-4ecb-8b87-218d5ccf1f7b,0,1,427e6f15-334e-42be-9554-895d8f7ebfc6,427e6f15-334e-42be-9554-895d8f7ebfc6,0,1,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,e85a4314-7b63-4294-9bd0-ff77e3ae7c1e,0,1,36bc8523-41a5-48ff-9bd0-758d078c4408,36bc8523-41a5-48ff-9bd0-758d078c4408,0,1,94ca1b45-3cf0-4857-8299-999c93f4fb56,94ca1b45-3cf0-4857-8299-999c93f4fb56,0,1,ee8419c6-79ca-4546-9a66-bacaa08d2a73,ee8419c6-79ca-4546-9a66-bacaa08d2a73,0,1,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,e36ddb60-2f21-4c5f-b96c-947bcf2af42a,0,1,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,d4a0ca3b-3985-4ba2-9e96-1c5baed28b46,0,1,ada11ea2-94d5-4172-a383-a51774599568,ada11ea2-94d5-4172-a383-a51774599568,0,1,50515bbc-43ee-4b00-bfc5-105b7981bd8f,50515bbc-43ee-4b00-bfc5-105b7981bd8f,0,1,1ea080b0-0a11-4152-b8bb-4918bc142a23,1ea080b0-0a11-4152-b8bb-4918bc142a23,0,1,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,a21cd1c1-4649-4dc2-9dbd-a913f2d6ca75,0,1,6930e471-7935-4d68-a980-2acde93ba801,6930e471-7935-4d68-a980-2acde93ba801,0,1,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,2c425fa5-b10b-4a6f-926a-5cb4c1f2d491,0,1,5135cc48-c749-4acb-a225-d110f386f482,5135cc48-c749-4acb-a225-d110f386f482,0,1,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,15e6f31b-556a-4f47-9f40-2f69ac7fcb43,0,1,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,53c4c3b2-9257-4d02-8df8-6b55fe9abdae,0,1,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,d2dba2ae-e987-4c9d-a289-3dc19afa87cd,0,1,2e9fa546-96fb-4ecb-b933-7921e131e89b,2e9fa546-96fb-4ecb-b933-7921e131e89b,0,1,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,4645b1ad-eb8f-484c-b29c-2093d9ef9dba,0,1,637a132b-1a88-44ba-b45f-ed4ed1ac1001,637a132b-1a88-44ba-b45f-ed4ed1ac1001,0,1,699f734b-43d2-4351-bff8-e0e21e164a42,699f734b-43d2-4351-bff8-e0e21e164a42,0,1,95f0792a-7ac4-450a-b05c-219741e61abd,95f0792a-7ac4-450a-b05c-219741e61abd,0,1,742a2e8c-496e-4e02-931d-d33f7afe07a5,742a2e8c-496e-4e02-931d-d33f7afe07a5,0,1,c3efa853-cd29-4618-929f-e3bec33dfd65,c3efa853-cd29-4618-929f-e3bec33dfd65,0,1,62185c28-3d24-487a-9441-b309dcf11e31,62185c28-3d24-487a-9441-b309dcf11e31,0,1,9f264aeb-664d-4724-8248-11873d63ef3b,9f264aeb-664d-4724-8248-11873d63ef3b,0,1,b926d058-53a9-4eea-b4f9-98e77f798dd9,b926d058-53a9-4eea-b4f9-98e77f798dd9,0,1,495e2c77-4868-4191-ac18-f94e55a5982e,495e2c77-4868-4191-ac18-f94e55a5982e,0,1,20191a65-322c-457d-85f5-ed1258b6fe8e,20191a65-322c-457d-85f5-ed1258b6fe8e,0,1,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,23b46ecd-14dc-4cc5-8ff0-c676a8337aee,0,1,769c60aa-44f4-4c98-a461-d3f5c2b67f61,769c60aa-44f4-4c98-a461-d3f5c2b67f61,0,1,f9809c99-0eaa-4249-967c-a4bef4763277,f9809c99-0eaa-4249-967c-a4bef4763277,0,1,37fa88a0-f2c1-455f-a28d-74165e8b933d,37fa88a0-f2c1-455f-a28d-74165e8b933d,0,1,e4476f09-909b-49f7-8e01-72eea8ceaca6,e4476f09-909b-49f7-8e01-72eea8ceaca6,0,1,2861412c-46f0-454e-b81d-fe081afb5c7a,2861412c-46f0-454e-b81d-fe081afb5c7a,0,1,2b4ece05-b694-42e9-8239-55722fd84294,2b4ece05-b694-42e9-8239-55722fd84294,0,1,6564ce89-134f-4726-8693-fd93aad46180,6564ce89-134f-4726-8693-fd93aad46180,0,1,0d743731-da5d-4c99-b19f-e93c69b77e14,0d743731-da5d-4c99-b19f-e93c69b77e14,0,1,d6f15367-23e2-4766-bc7c-8acd0063aa0c,d6f15367-23e2-4766-bc7c-8acd0063aa0c,0,1,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,966b1bde-5b0c-446d-b38b-dc037e2ff7ad,0,1,fa4c5665-4d73-4db2-a055-8c1c8a302f82,fa4c5665-4d73-4db2-a055-8c1c8a302f82,0,1,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,e3e0caa1-6d3f-45a6-9043-d58a34f35b8f,0,1,9100b286-8ae9-4de3-b116-5ce0fa95b80c,9100b286-8ae9-4de3-b116-5ce0fa95b80c,0,1,3d315df6-e000-4cbd-810d-0b26c0d1bc54,3d315df6-e000-4cbd-810d-0b26c0d1bc54,0,1,fa429302-ccaf-4c89-8a11-3a1d30817c00,fa429302-ccaf-4c89-8a11-3a1d30817c00,0,1,9b4c49ce-93da-439a-8d67-f3774e92800a,9b4c49ce-93da-439a-8d67-f3774e92800a,0,1,5f8fa827-7017-4b45-b458-3571b8b611f5,5f8fa827-7017-4b45-b458-3571b8b611f5,0,1,79749167-2912-4e06-9deb-7915a1b4390d,79749167-2912-4e06-9deb-7915a1b4390d,0,1,1c93fcd3-53a1-403f-a30b-454fbc941d55,1c93fcd3-53a1-403f-a30b-454fbc941d55,0,1,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0fc54be4-2e19-45cf-b62f-7cbc70a70d5f,0,1,adec3963-b22f-4463-a3f4-c9ec27d187a8,adec3963-b22f-4463-a3f4-c9ec27d187a8,0,1,d8dae0c8-8e11-44bf-bf60-d316220f3e82,d8dae0c8-8e11-44bf-bf60-d316220f3e82,0,1,12afec4d-1728-4aa8-86e5-23cd2f1572b3,12afec4d-1728-4aa8-86e5-23cd2f1572b3,0,1,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,16bc197b-5a2f-43f4-8ba0-ffabd9289f5c,0,1,ee0c3960-d1bf-411f-a51f-e6e27dabea87,ee0c3960-d1bf-411f-a51f-e6e27dabea87,0,1,d7fb9441-1aef-4257-af3f-7f16340ac85e,d7fb9441-1aef-4257-af3f-7f16340ac85e,0,1,d07c094c-2795-4e0c-b030-bdb82be7ba6d,d07c094c-2795-4e0c-b030-bdb82be7ba6d,0,1,62637860-2013-4f9d-9aed-7cbb0dce8983,62637860-2013-4f9d-9aed-7cbb0dce8983,0,1,331217f6-7ec2-425d-93bd-f2979c5f2e05,331217f6-7ec2-425d-93bd-f2979c5f2e05,0,1,67c1269a-79e6-44d9-9254-671c50fb3974,67c1269a-79e6-44d9-9254-671c50fb3974,0,1,5d455d2a-910d-48c7-bc74-ba5ad7855110,5d455d2a-910d-48c7-bc74-ba5ad7855110,0,1,7cf3feea-75e2-42cc-9c89-4a9182034910,7cf3feea-75e2-42cc-9c89-4a9182034910,0,1,930a0156-feb3-4e14-96a5-cd183a4891f4,930a0156-feb3-4e14-96a5-cd183a4891f4,0,1,cfa55ab3-1335-4712-8352-03c2f0277708,cfa55ab3-1335-4712-8352-03c2f0277708,0,1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,fb176f8b-edb9-4e4b-926d-dabe9552bfa1,0,1,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,cd5c52d4-f832-4a3b-b4c7-b4f3e0c98222,0,1,e268a337-f576-4ec2-8a22-0500b79b2441,e268a337-f576-4ec2-8a22-0500b79b2441,0,1,eb33a8fa-75a6-4926-a025-05bc0abe4374,eb33a8fa-75a6-4926-a025-05bc0abe4374,0,1,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,c352da94-ea64-44b1-b2df-2c4ed9e2efc5,0,1,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,6babd40a-8b8f-454b-b4a4-7cf2854f49a2,0,1,bf480259-6e72-4ad1-ac41-0b0d41a75387,bf480259-6e72-4ad1-ac41-0b0d41a75387,0,1,a41f060a-f0f6-4940-960b-5056082b2c45,a41f060a-f0f6-4940-960b-5056082b2c45,0,1,073e14d4-5d43-428b-a9a7-985d173e94c7,073e14d4-5d43-428b-a9a7-985d173e94c7,0,1,2394775b-8910-4667-9c74-e1606e0b13bc,2394775b-8910-4667-9c74-e1606e0b13bc,0,1,43c88ffd-a036-4563-890b-bdc60180e841,43c88ffd-a036-4563-890b-bdc60180e841,0,1,af6e5e8e-6482-4820-a810-9e275ae039bf,af6e5e8e-6482-4820-a810-9e275ae039bf,0,1,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,fe3ccb8b-fee7-4825-a7bc-4b0fd432d382,0,1,7690620b-21d9-463a-8c22-60844927b4a0,7690620b-21d9-463a-8c22-60844927b4a0,0,1,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,e7f96a15-9f62-4a7f-85f3-06ba5d30b130,0,1,b1db3255-38da-4684-b44e-4e2e9ee1dc35,b1db3255-38da-4684-b44e-4e2e9ee1dc35,0,1,4761f89b-7894-4dca-83b0-3be2d0828781,4761f89b-7894-4dca-83b0-3be2d0828781,0,1,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,573ff1f2-0ef5-4962-a0f6-eb84d430fe03,0,1,7236d52f-9068-45ad-8b92-a7319e737e08,7236d52f-9068-45ad-8b92-a7319e737e08,0,1,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,3b0b708f-1b6c-4eb2-a2ad-86c088d9f1bf,0,1,9db23e96-d13a-4847-941a-462f64d0619d,9db23e96-d13a-4847-941a-462f64d0619d,0,1,7575fd54-c91b-4220-a2ef-2cf533f60426,7575fd54-c91b-4220-a2ef-2cf533f60426,0,1,1b751f19-bb0c-40c2-a5d1-068544c36c6b,1b751f19-bb0c-40c2-a5d1-068544c36c6b,0,1,26e2c83b-8873-4ad3-9c50-e94421473a43,26e2c83b-8873-4ad3-9c50-e94421473a43,0,1,f0b2ec05-8e01-4ccf-b927-671329a9013b,f0b2ec05-8e01-4ccf-b927-671329a9013b,0,1,ab442b11-2482-4f80-ac82-01966e0657ec,ab442b11-2482-4f80-ac82-01966e0657ec,0,1,14fe4d39-81a1-470e-9724-6642ce34ad89,14fe4d39-81a1-470e-9724-6642ce34ad89,0,1,457578ab-dfe2-4419-8d8a-64283b341f42,457578ab-dfe2-4419-8d8a-64283b341f42,0,1,67ef6671-f537-46bf-88e6-f5bcf34a17a4,67ef6671-f537-46bf-88e6-f5bcf34a17a4,0,1,de778ca7-feaf-4531-80ae-11a534c56928,de778ca7-feaf-4531-80ae-11a534c56928,0,1,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0dfbe7a9-9c2e-4cbd-ac53-3b547fd73e91,0,1,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0a76a84d-e883-477e-8b87-7bf984cdc1cf,0,1,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,2b6c4184-6d7d-48e5-bd4e-ad31e63398d6,0,1,86df8648-e195-4661-99ee-6052788eb276,86df8648-e195-4661-99ee-6052788eb276,0,1,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,a22cf6e9-1157-4be5-8d30-aa9bbf2b5e6e,0,1,35133725-9647-42dc-a76a-2e62b2918ac4,35133725-9647-42dc-a76a-2e62b2918ac4,0,1,fa9572ee-0303-4421-9125-70cf3dd5a8c7,fa9572ee-0303-4421-9125-70cf3dd5a8c7,0,1,4cdd7920-0c49-4950-b92f-fdf6e34578b2,4cdd7920-0c49-4950-b92f-fdf6e34578b2,0,1,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0af48650-5fef-4a5b-8ac8-38a9ded23bd4,0,1,c7b883dc-6c26-4eb5-bc19-7919ad57da27,c7b883dc-6c26-4eb5-bc19-7919ad57da27,0,1,7fc37008-c378-4a70-a9a9-07543c7248a6,7fc37008-c378-4a70-a9a9-07543c7248a6,0,1,6410853e-a17e-44db-b8cc-bfefd7c4d239,6410853e-a17e-44db-b8cc-bfefd7c4d239,0,1,df042e4e-01a6-4480-a9c5-c0d7a454bb41,df042e4e-01a6-4480-a9c5-c0d7a454bb41,0,1,bad3d1fa-9618-427a-93e0-90f151e468bf,bad3d1fa-9618-427a-93e0-90f151e468bf,0,1,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,6a4972f1-012c-438b-b1d3-81e7f6da3ddd,0,1,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,ff7cfd75-e0ba-49a3-92e1-33ea26df46e2,0,1,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,bc37fc81-6a86-4e72-b75a-abb75bddc4b3,0,1,ff830967-faa9-415f-aa6e-8d27779f91f8,ff830967-faa9-415f-aa6e-8d27779f91f8,0,1,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,34dd0dd6-880c-4a90-9b9c-0503c8dc4ef3,0,1,88618d0f-97af-4055-a490-561d4b8065a7,88618d0f-97af-4055-a490-561d4b8065a7,0,1,faffa228-4f4f-43f6-99b9-ed8c93af85c0,faffa228-4f4f-43f6-99b9-ed8c93af85c0,0,1,7b816ca0-ba60-4637-8348-23b26ad23e3f,7b816ca0-ba60-4637-8348-23b26ad23e3f,0,1,814a6db4-a43c-44e6-ac44-11983642c5ad,814a6db4-a43c-44e6-ac44-11983642c5ad,0,1,0bd74786-e018-4a66-b994-cdb439c57657,0bd74786-e018-4a66-b994-cdb439c57657,0,1,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,f50fcf2b-90bb-4d73-9fda-f4575e7682fa,0,1,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,a01b8078-a6cd-4184-9317-2f1e0bcefb3a,0,1,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,54a279b1-9e6a-49b0-8fda-e2807cf3a2a3,0,1,09502176-c53d-4525-b8ed-32d0a2e21a5d,09502176-c53d-4525-b8ed-32d0a2e21a5d,0,1,75ad984e-d41f-4591-b207-e8a4b05757a7,75ad984e-d41f-4591-b207-e8a4b05757a7,0,1,3f020f90-7aeb-4b21-ad71-4572ac796d4c,3f020f90-7aeb-4b21-ad71-4572ac796d4c,0,1,759e2ba0-2941-4cc1-8409-50b8a3620058,759e2ba0-2941-4cc1-8409-50b8a3620058,0,1,491cf25d-091e-4e09-b145-92d7073326cf,491cf25d-091e-4e09-b145-92d7073326cf,0,1,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,9b9d4d10-a4f2-4b0d-a63a-15d55f30fb26,0,1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,579f18ce-a7ce-4eb8-a4e3-a134a9a27bc1,0,1,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,e7d05eca-2fdd-4cbb-8e2c-537525326ffe,0,1,900bc96e-fbcc-473e-970c-96f561420f8e,900bc96e-fbcc-473e-970c-96f561420f8e,0,1,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,c3bb7b85-1e90-45c4-9bc1-39bbd253d498,0,1,21d5a0b0-9a2b-4989-a50a-781645513179,21d5a0b0-9a2b-4989-a50a-781645513179,0,1,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,22df0fa4-cb1c-45a2-bcce-d32ed44e462a,0,1,d97c6204-3656-4591-aea9-6ebedffe1247,d97c6204-3656-4591-aea9-6ebedffe1247,0,1,7caabe33-184f-45db-bef4-59d4e9cd2394,7caabe33-184f-45db-bef4-59d4e9cd2394,0,1,3255033a-e922-412e-a825-a3e8bd284703,3255033a-e922-412e-a825-a3e8bd284703,0,1,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,1aa65c35-e8a0-4c8a-90a3-48b62314cb19,0,1,f250f992-ad5a-4dab-ad38-240604adb0c4,f250f992-ad5a-4dab-ad38-240604adb0c4,0,1,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,c4a7efca-f27d-4fdd-86ab-cc22a2a96fb2,0,1,e63671f6-c96d-4ea4-8300-af7dbd0d016f,e63671f6-c96d-4ea4-8300-af7dbd0d016f,0,1,2c511469-0df6-470f-a808-decb275e8b1a,2c511469-0df6-470f-a808-decb275e8b1a,0,1,1bbb289c-a78a-47d0-b082-c2225ae1dc83,1bbb289c-a78a-47d0-b082-c2225ae1dc83,0,1,99b40f9f-f8f1-4779-8afc-59d30612f3d6,99b40f9f-f8f1-4779-8afc-59d30612f3d6,0,1,6131e875-3254-4281-9343-9118564c5451,6131e875-3254-4281-9343-9118564c5451,0,1,69622ff8-8a23-42fc-b63d-5097e3f636ac,69622ff8-8a23-42fc-b63d-5097e3f636ac,0,1,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,b88450cc-0dd4-4881-b3d9-a9e4e07e08f5,0,1,ef326bd8-1570-455e-ae8c-063b5578ad15,ef326bd8-1570-455e-ae8c-063b5578ad15,0,1,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,3713c76d-6ff7-4d45-9f15-d061bdf7dee2,0,1,cb6d4979-2d70-4ceb-af08-deb2b19daf14,cb6d4979-2d70-4ceb-af08-deb2b19daf14,0,1,bf30b754-84fb-4104-b52b-a4f7df6fba12,bf30b754-84fb-4104-b52b-a4f7df6fba12,0,1,7bbd0835-b3e9-40cb-a424-670828b60bbb,7bbd0835-b3e9-40cb-a424-670828b60bbb,0,1,3e2138ea-48f9-4a60-8f22-53933bea49db,3e2138ea-48f9-4a60-8f22-53933bea49db,0,1,16bda2eb-eab8-4230-b89f-517fb943e009,16bda2eb-eab8-4230-b89f-517fb943e009,0,1,00964512-297f-4b8b-8def-8e4fc0eba991,00964512-297f-4b8b-8def-8e4fc0eba991,0,1,4185fea3-baba-4ba5-8019-9023b3011d4d,4185fea3-baba-4ba5-8019-9023b3011d4d,0,1,ea790035-92d6-445e-9fa3-08e565634d2b,ea790035-92d6-445e-9fa3-08e565634d2b,0,1,cce8900a-51eb-487d-b380-227d1b9d3943,cce8900a-51eb-487d-b380-227d1b9d3943,0,1,c043c36c-90c6-483b-bc20-7c2d85109b90,c043c36c-90c6-483b-bc20-7c2d85109b90,0,1,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,a1e619a6-3bb2-468d-a225-c88ccc3b71f5,0,1,91d2d40a-c271-412c-b344-1fc98b94ba21,91d2d40a-c271-412c-b344-1fc98b94ba21,0,1,7ce47046-aee8-4809-bac9-a98930a844e1,7ce47046-aee8-4809-bac9-a98930a844e1,0,1,f480b8b9-ecec-4207-a0aa-12c5be4c2250,f480b8b9-ecec-4207-a0aa-12c5be4c2250,0,1,32717d25-6644-4903-8950-03e4c9b1a8fe,32717d25-6644-4903-8950-03e4c9b1a8fe,0,1,3644d8f3-db88-4fce-a851-39c115acfe03,3644d8f3-db88-4fce-a851-39c115acfe03,0,1,4653da74-34b2-47b9-ad88-efd761d6f1e9,4653da74-34b2-47b9-ad88-efd761d6f1e9,0,1,abf8a23d-45c3-4feb-8df2-279b709d7722,abf8a23d-45c3-4feb-8df2-279b709d7722,0,1,b0cd056f-c601-4d07-89c4-f7137b88bab6,b0cd056f-c601-4d07-89c4-f7137b88bab6,0,1,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,5cc3ebef-8f09-443c-b131-e5c3a9f7d260,0,1,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,b9a21b8f-8a95-4c86-9ab2-ee6c90164e18,0,1,96ed4d39-3bdc-480f-af86-218f22000514,96ed4d39-3bdc-480f-af86-218f22000514,0,1,c9f72e74-22ac-4dc0-8462-0aa7819a9342,c9f72e74-22ac-4dc0-8462-0aa7819a9342,0,1,ca650484-293f-403a-b916-5ec7c3a8969e,ca650484-293f-403a-b916-5ec7c3a8969e,0,1,b71e706d-623e-4039-9bf0-24f151d861d8,b71e706d-623e-4039-9bf0-24f151d861d8,0,1,528f4823-33d8-49bd-a8fe-756a08a107c2,528f4823-33d8-49bd-a8fe-756a08a107c2,0,1,4869095b-b76e-45ca-b77d-0e74f59673f0,4869095b-b76e-45ca-b77d-0e74f59673f0,0,1,bcca2442-448b-4760-923b-cc9621ecb441,bcca2442-448b-4760-923b-cc9621ecb441,0,1,ba7657df-429a-4737-b787-19ef09fdebb2,ba7657df-429a-4737-b787-19ef09fdebb2,0,1,867d72be-f406-45a5-a511-b90459683f11,867d72be-f406-45a5-a511-b90459683f11,0,1,88b22e62-c144-401f-9635-3fb4d914772e,88b22e62-c144-401f-9635-3fb4d914772e,0,1,efeb2914-6604-403a-a11e-5cb995ab2bc9,efeb2914-6604-403a-a11e-5cb995ab2bc9,0,1,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,4c2dd77f-adc7-4f11-8e8f-1f8e41e6c84b,0,1,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,8f2b8a8e-4cd3-45e3-89ae-1cc4bd0ff30a,0,1,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,24b3aecc-f92f-475b-862e-83dd6d6aa2b9,0,1,de506523-241a-4845-9259-37066afbf16a,de506523-241a-4845-9259-37066afbf16a,0,1,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0510206f-eef0-4a5e-aeb7-d53c26d34adb,0,1,e616e007-43e7-4740-a083-b85f5435718a,e616e007-43e7-4740-a083-b85f5435718a,0,1,727da5b1-e054-4832-8e44-f5d5e56f52e5,727da5b1-e054-4832-8e44-f5d5e56f52e5,0,1,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,6135ffd5-1510-4aa8-8bf5-d7c0ca624414,0,1,6feaad7c-9680-4341-b215-14581e2e2b37,6feaad7c-9680-4341-b215-14581e2e2b37,0,1,d5656a92-adfb-4733-830d-2b1565798b1f,d5656a92-adfb-4733-830d-2b1565798b1f,0,1,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,2ee0d56b-cd7c-42db-8fb6-c1567fe1967d,0,1,b0f6ea83-2849-4151-930d-692866919db3,b0f6ea83-2849-4151-930d-692866919db3,0,1,05558ce4-8568-4009-b1d7-307d54967515,05558ce4-8568-4009-b1d7-307d54967515,0,1,74380324-9b7b-49f6-9458-88deb9405f98,74380324-9b7b-49f6-9458-88deb9405f98,0,1,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,5286ceb2-0f16-4d70-ad89-dc15a308bb8d,0,1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0abf70e0-0d81-4d85-a288-a2134da5fbf1,0,1,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,392fc734-4251-4d28-bfd1-d6f2f33ec0e5,0,1,f66cb2da-3b3c-481f-823a-506f8290f619,f66cb2da-3b3c-481f-823a-506f8290f619,0,1,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,b80ddaf8-c5c3-4bde-98ed-74a1a0446f38,0,1,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,e4f16dbf-609d-4a34-a0bf-b20e5925c1ba,0,1,0bdcf045-5132-4a68-839c-a30515dc569e,0bdcf045-5132-4a68-839c-a30515dc569e,0,1,683861f9-9a5f-47db-8b03-959f839d5a3a,683861f9-9a5f-47db-8b03-959f839d5a3a,0,1,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,56fda0b0-c0ae-4ea2-8f77-df22a9ca3e87,0,1,125be5bf-f410-451d-aa96-22fabc6a4d8a,125be5bf-f410-451d-aa96-22fabc6a4d8a,0,1,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,e5017fd0-ecea-48ae-99c8-7fc8c4f1d72b,0,1,0a46166a-4562-4a50-b139-39dbe8a1fc84,0a46166a-4562-4a50-b139-39dbe8a1fc84,0,1,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,9aa6d1d1-75ad-40e4-b01f-274826c0c9da,0,1,6ce64d65-f710-4d3f-a85f-26ce6915451e,6ce64d65-f710-4d3f-a85f-26ce6915451e,0,1,33eb9806-e34f-42a0-9825-3ff2de92c503,33eb9806-e34f-42a0-9825-3ff2de92c503,0,1,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,4905fcc5-9bd7-4b1b-b51d-882b11ee3d74,0,1,bcb58235-7cd7-4c15-a1eb-194ee38259e6,bcb58235-7cd7-4c15-a1eb-194ee38259e6,0,1,e19aefe7-634d-4218-8d40-75802d1691e0,e19aefe7-634d-4218-8d40-75802d1691e0,0,1,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,ce2a8ff8-94fd-4ce2-9caa-4711e9b79ee9,0,1,f942d212-9be0-4d80-84b6-5b63070e33e4,f942d212-9be0-4d80-84b6-5b63070e33e4,0,1,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,bea6bbc1-c1e4-4306-a0ca-efd47b9a8b23,0,1,64c91eaa-084f-4801-8dbf-4e075c689c2b,64c91eaa-084f-4801-8dbf-4e075c689c2b,0,1,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,c01bb4de-06f7-4c3d-8ea3-d861f89948c0,0,1,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,3c8c4f7b-d267-422c-becd-b6e8a9d6fe49,0,1,3aa12805-823a-439b-b039-fb9940aee312,3aa12805-823a-439b-b039-fb9940aee312,0,1,87d53573-f266-4b74-94af-041ae4b6518f,87d53573-f266-4b74-94af-041ae4b6518f,0,1,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,65a8545a-e73c-4c6a-8f87-7734d7ff5c03,0,1,801cf1f7-2c65-4126-a3e9-b66abfdde67a,801cf1f7-2c65-4126-a3e9-b66abfdde67a,0,1,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,b991eefb-0d97-48a1-89c8-3d83b3b8d97a,0,1,29c2bc01-8838-4459-8ac2-79862aa1dbc9,29c2bc01-8838-4459-8ac2-79862aa1dbc9,0,1,ad556c33-6811-48b4-ae90-57700a4d3fd6,ad556c33-6811-48b4-ae90-57700a4d3fd6,0,1,6e0833f4-3b57-4a5f-810f-9e2a492335df,6e0833f4-3b57-4a5f-810f-9e2a492335df,0,1,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,78ccdf33-9c2b-4931-afa3-5d652f2bcbc5,0,1,977bc9d8-9843-4343-85af-11a3d91f9966,977bc9d8-9843-4343-85af-11a3d91f9966,0,1,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,02ff9ef0-1057-4bc2-b745-1c2ae41835e3,0,1,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,5a86abe7-db6c-43a3-9bcd-9b3647519c6b,0,1,a6582448-734d-4a4c-a32c-c4755ca1bc93,a6582448-734d-4a4c-a32c-c4755ca1bc93,0,1,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,6a0b9a91-51a0-4ef4-b630-4f1b5a1da2b7,0,1,53327cc4-22b0-40f9-bae7-db483f85901c,53327cc4-22b0-40f9-bae7-db483f85901c,0,1,098d904d-95c9-459e-86d0-357ba9a40191,098d904d-95c9-459e-86d0-357ba9a40191,0,1,e9ab9d00-6e42-439b-8efc-fcacf727016d,e9ab9d00-6e42-439b-8efc-fcacf727016d,0,1,2d58033f-e15d-4a91-8165-dd311025c7c4,2d58033f-e15d-4a91-8165-dd311025c7c4,0,1,49cb3a36-90b3-4154-b571-265fc5cee21e,49cb3a36-90b3-4154-b571-265fc5cee21e,0,1,10472d2c-18ca-49b0-bd9d-c750db8498c5,10472d2c-18ca-49b0-bd9d-c750db8498c5,0,1,8efe5daf-272d-4255-b5c4-66dca7463b50,8efe5daf-272d-4255-b5c4-66dca7463b50,0,1,65af25a6-f699-4c40-b13e-3b7dff3f16fe,65af25a6-f699-4c40-b13e-3b7dff3f16fe,0,1,c4d2486d-289c-4812-b223-5ccfcd7f29e3,c4d2486d-289c-4812-b223-5ccfcd7f29e3,0,1,b6ae3a72-c686-409d-9cda-9d1a00be1d8d,b6ae3a72-c686-409d-9cda-9d1a00be1d8d,0,1,7da57c89-af2c-445a-96f7-39250f70306f,7da57c89-af2c-445a-96f7-39250f70306f,0,1,b5b94d94-25f7-4cfa-b1e9-6009fb848763,b5b94d94-25f7-4cfa-b1e9-6009fb848763,0,1,a2accf54-5966-42e8-ab2e-e56e415963ee,a2accf54-5966-42e8-ab2e-e56e415963ee,0,1,d8eb5329-5900-4b5d-b45e-458513dddfef,d8eb5329-5900-4b5d-b45e-458513dddfef,0,1,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,6d521e58-24a3-4f19-b4b0-dff84f7ca86b,0,1,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,d5afea8a-1b7a-4b23-8ae0-cefa0b937b17,0,1,6ffd2da8-db97-46fc-9a53-8e665a598e3c,6ffd2da8-db97-46fc-9a53-8e665a598e3c,0,1,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,8c413fa5-9e24-4b81-aa55-0e78c5e3e20f,0,1,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,a4322f22-7de0-4018-8e06-9f1aa7cf0c07,0,1,eaaed107-69d4-4963-be83-74519e331715,eaaed107-69d4-4963-be83-74519e331715,0,1,38cddf96-8703-4396-8c73-47fb22828a48,38cddf96-8703-4396-8c73-47fb22828a48,0,1,2c2cb793-0177-4983-91ca-9c292c5b10f1,2c2cb793-0177-4983-91ca-9c292c5b10f1,0,1,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,2a2e7f51-a4e5-48ec-b969-b1fca18ba9b5,0,1,221fa473-3327-44e6-a033-6fdfd2be713c,221fa473-3327-44e6-a033-6fdfd2be713c,0,1,7a5973f0-7e29-44af-8e7b-70af71f704a4,7a5973f0-7e29-44af-8e7b-70af71f704a4,0,1,27089e8e-2c75-431c-b808-5d4dcba3cdca,27089e8e-2c75-431c-b808-5d4dcba3cdca,0,1,9ab3980e-a480-4f90-a8cc-bde99d5ace35,9ab3980e-a480-4f90-a8cc-bde99d5ace35,0,1,ec928563-6e35-4b84-b477-90d2481cec1c,ec928563-6e35-4b84-b477-90d2481cec1c,0,1,5d3e9678-20fe-4128-867a-3f7addaa7831,5d3e9678-20fe-4128-867a-3f7addaa7831,0,1,bb878f73-8a0f-459a-9076-ce57fe7957dc,bb878f73-8a0f-459a-9076-ce57fe7957dc,0,1,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,a2b4110b-4d9c-40fd-ab46-bfa08d2eb993,0,1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,4f262b7f-927e-45f2-ad90-9d5e1b3155d1,0,1,9f4b8e36-83ff-4694-8540-b5f47b18395f,9f4b8e36-83ff-4694-8540-b5f47b18395f,0,1,b4c026eb-4271-4366-b529-1cdfe2874563,b4c026eb-4271-4366-b529-1cdfe2874563,0,1,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,b99f2a63-54e8-490b-a0a4-1941fbc38b3f,0,1,314b0da2-24d3-48cc-8532-d36c45eb3bf8,314b0da2-24d3-48cc-8532-d36c45eb3bf8,0,1,4077e700-ec20-4afa-8155-bf7e516a70cb,4077e700-ec20-4afa-8155-bf7e516a70cb,0,1,10008125-3aeb-4912-8ad6-d92d283ea09a,10008125-3aeb-4912-8ad6-d92d283ea09a,0,1,d22a0a50-220d-459e-a23a-39730a1e67c4,d22a0a50-220d-459e-a23a-39730a1e67c4,0,1,dd050ca0-8335-4654-ab5c-7babcb4824ef,dd050ca0-8335-4654-ab5c-7babcb4824ef,0,1,706cbf55-626d-4cab-b589-a2464368f6c1,706cbf55-626d-4cab-b589-a2464368f6c1,0,1,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,2e3ac3fb-9f0e-463f-95c2-9f661ce2e015,0,1,e010c0f9-f770-4fdc-8607-50838c0262ef,e010c0f9-f770-4fdc-8607-50838c0262ef,0,1,483dfce4-9c66-4739-94d4-17a005d64f5b,483dfce4-9c66-4739-94d4-17a005d64f5b,0,1,19506116-43ef-433c-822c-ef8717b0da6b,19506116-43ef-433c-822c-ef8717b0da6b,0,1,464b92cc-b577-4350-ae9f-e697390248d7,464b92cc-b577-4350-ae9f-e697390248d7,0,1,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,5a1242c8-3817-4d2c-9bfd-f62a6b80730c,0,1,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,b9be6caf-e5e0-45a9-8cc8-3c83721632a2,0,1,2fac5a7b-cb3e-4442-892f-77f338035eeb,2fac5a7b-cb3e-4442-892f-77f338035eeb,0,1,f2076747-0bc4-41dd-bab9-33cec85111f0,f2076747-0bc4-41dd-bab9-33cec85111f0,0,1,9f74c0bb-b876-4a37-b954-c93898a21067,9f74c0bb-b876-4a37-b954-c93898a21067,0,1,97e853dc-065f-4c6d-84cb-3d3aff367b22,97e853dc-065f-4c6d-84cb-3d3aff367b22,0,1,2f1fdf47-2627-496f-9e1f-77019abb2104,2f1fdf47-2627-496f-9e1f-77019abb2104,0,1,c996532a-8795-4136-8a40-9bb4b263277c,c996532a-8795-4136-8a40-9bb4b263277c,0,1,64c77788-fc49-4979-8163-949a891bd8b7,64c77788-fc49-4979-8163-949a891bd8b7,0,1,c39750ca-e33f-40c2-b830-119423d9a2ae,c39750ca-e33f-40c2-b830-119423d9a2ae,0,1,9372ff6b-27b6-48f3-a2a2-762e7c485766,9372ff6b-27b6-48f3-a2a2-762e7c485766,0,1,f454595a-4a3d-451b-8e8b-b17aa8314591,f454595a-4a3d-451b-8e8b-b17aa8314591,0,1,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,d3b7f89e-eb04-404e-bcc1-1d3557fb8d1a,0,1,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,442f9d7b-ae8f-4074-8ece-d5aa1c66e35c,0,1,bc708da8-7fc6-4da1-8129-9ef6a86667af,bc708da8-7fc6-4da1-8129-9ef6a86667af,0,1,061842fe-4077-4d6e-aefe-de79409da730,061842fe-4077-4d6e-aefe-de79409da730,0,1,da6e4bff-9835-4b92-b62b-291a5d6c86fe,da6e4bff-9835-4b92-b62b-291a5d6c86fe,0,1,3fadaeb7-2c41-42a4-bfa8-c585602b1028,3fadaeb7-2c41-42a4-bfa8-c585602b1028,0,1,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,171a0dfc-032e-4eaf-81a2-e5e0dfde8d56,0,1,083c709b-ed8c-47e4-a190-421e14259e73,083c709b-ed8c-47e4-a190-421e14259e73,0,1,b98dacc7-29e1-426b-a664-0a988f18186c,b98dacc7-29e1-426b-a664-0a988f18186c,0,1,d678856d-6e7c-443f-a6e3-350bbe8af659,d678856d-6e7c-443f-a6e3-350bbe8af659,0,1,d0979762-22ce-41be-b7a4-5e9ac149d94b,d0979762-22ce-41be-b7a4-5e9ac149d94b,0,1,ae23e70c-479e-47ad-9bfa-58560a903410,ae23e70c-479e-47ad-9bfa-58560a903410,0,1,c0d83781-bbda-43f7-bf0e-5defa3d47143,c0d83781-bbda-43f7-bf0e-5defa3d47143,0,1,21fa5fdd-acbc-403b-9acb-bbf95284bd20,21fa5fdd-acbc-403b-9acb-bbf95284bd20,0,1,576a01e3-4d6d-4241-a3c4-7661ba129bcb,576a01e3-4d6d-4241-a3c4-7661ba129bcb,0,1,9f7290dd-19f4-4163-9795-fe562e84f06d,9f7290dd-19f4-4163-9795-fe562e84f06d,0,1,c3b5c81f-b787-4f63-8cba-79def0921477,c3b5c81f-b787-4f63-8cba-79def0921477,0,1,1f0cb3d4-1344-451b-a257-be3cd854acfd,1f0cb3d4-1344-451b-a257-be3cd854acfd,0,1,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0131fe59-ce47-48b7-8f7e-1544bf0fa031,0,1,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,c8b0a1be-97c6-4a16-b1dd-31901ac61cdc,0,1,372150e2-526e-4424-8c54-e4b16bdd25b5,372150e2-526e-4424-8c54-e4b16bdd25b5,0,1,752dc569-cf84-42d7-911d-49d455f7214e,752dc569-cf84-42d7-911d-49d455f7214e,0,1,fecab2b9-27e1-44d6-9082-79c3569b7477,fecab2b9-27e1-44d6-9082-79c3569b7477,0,1,07ae092f-8517-47b7-b54c-5dbcb6506929,07ae092f-8517-47b7-b54c-5dbcb6506929,0,1,db4c25bb-d199-43ec-833d-82972de04a41,db4c25bb-d199-43ec-833d-82972de04a41,0,1,43d19685-0794-41f2-9171-bf565133718d,43d19685-0794-41f2-9171-bf565133718d,0,1,b68c15c4-4966-4f13-8912-2d479b65089a,b68c15c4-4966-4f13-8912-2d479b65089a,0,1,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,8f6770c2-654c-4cc7-8ed5-15b5b2e3109a,0,1,f87e3935-dae1-4192-b6a7-05e3c700c590,f87e3935-dae1-4192-b6a7-05e3c700c590,0,1,ee635706-6ee2-4956-8d58-a235f64687f6,ee635706-6ee2-4956-8d58-a235f64687f6,0,1,a5a40ca7-d665-420b-a516-1355019d6901,a5a40ca7-d665-420b-a516-1355019d6901,0,1,adf9304c-ccf8-492e-95b1-0754764586a2,adf9304c-ccf8-492e-95b1-0754764586a2,0,1,fd175112-ec8f-4088-9b21-d8135056f0c5,fd175112-ec8f-4088-9b21-d8135056f0c5,0,1,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,ddd82a66-1eda-409f-b6c0-e22c4bd2c1b7,0,1,df76a1b7-312a-4e77-bac1-79befadb4495,df76a1b7-312a-4e77-bac1-79befadb4495,0,1,ab39fad8-1039-491e-982a-c49637770ec0,ab39fad8-1039-491e-982a-c49637770ec0,0,1,7d93a6ba-3ca7-45ab-a540-743c79587535,7d93a6ba-3ca7-45ab-a540-743c79587535,0,1,76b58810-0527-4dfc-8858-bac68e7e65f3,76b58810-0527-4dfc-8858-bac68e7e65f3,0,1,aba97fd9-f05e-45cd-8404-ed702070e17a,aba97fd9-f05e-45cd-8404-ed702070e17a,0,1,f5c415cd-429b-469f-9332-c43ab5d1c8d6,f5c415cd-429b-469f-9332-c43ab5d1c8d6,0,1,458e9c6b-b828-404b-be5a-c6c0aeea34c9,458e9c6b-b828-404b-be5a-c6c0aeea34c9,0,1,7262eb4d-2d2d-454c-beaa-974645813af7,7262eb4d-2d2d-454c-beaa-974645813af7,0,1,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,45fa9f17-eeb1-43e2-b78c-f81a341f1bff,0,1,b2265070-9cd3-4176-92c8-6d9f32c2ca84,b2265070-9cd3-4176-92c8-6d9f32c2ca84,0,1,b347e774-2261-4f76-9bdb-3c6736983589,b347e774-2261-4f76-9bdb-3c6736983589,0,1,be7e2715-1243-49a8-8c7c-55d632d3cf6c,be7e2715-1243-49a8-8c7c-55d632d3cf6c,0,1,49221b2f-aae2-4bee-9a1a-18263fc74244,49221b2f-aae2-4bee-9a1a-18263fc74244,0,1,da0cd264-da2f-4044-af28-c91d2efe1d5c,da0cd264-da2f-4044-af28-c91d2efe1d5c,0,1,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,f1b1db38-2d9f-4409-a6d6-fd7192b1f102,0,1,fad26b16-8638-496b-bd12-381fc6f5b71f,fad26b16-8638-496b-bd12-381fc6f5b71f,0,1,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,ed3cfb74-a37a-4314-a2d7-4ce717a2edd9,0,1,324a56c9-02d9-4177-af84-a817b8c41169,324a56c9-02d9-4177-af84-a817b8c41169,0,1,1e44abfe-c173-4802-b535-96849d384983,1e44abfe-c173-4802-b535-96849d384983,0,1,2751a509-037b-49aa-9ca8-e87057d6d82c,2751a509-037b-49aa-9ca8-e87057d6d82c,0,1,35f62549-eb6a-4284-a6e3-406b0d9df0cf,35f62549-eb6a-4284-a6e3-406b0d9df0cf,0,1,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,cee94c04-7a46-47a5-bdd5-6f0dbd884e97,0,1,fd66995b-ee76-41d3-983f-33d84bdcbbd4,fd66995b-ee76-41d3-983f-33d84bdcbbd4,0,1,73e97918-b34e-4ad2-8591-4c219eb92f2c,73e97918-b34e-4ad2-8591-4c219eb92f2c,0,1,445cf7eb-35d0-48f8-9579-c2ec574ef324,445cf7eb-35d0-48f8-9579-c2ec574ef324,0,1,1025657e-afd2-4c7b-96d5-ccbedaca4619,1025657e-afd2-4c7b-96d5-ccbedaca4619,0,1,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,64839c78-b2fa-4d80-bee0-b3d3a7e5db35,0,1,e754ad5c-cf3c-4198-af81-128475924cb0,e754ad5c-cf3c-4198-af81-128475924cb0,0,1,ed65d504-b210-4014-85ec-275ad633ef04,ed65d504-b210-4014-85ec-275ad633ef04,0,1,dc31edb1-273e-4b1a-8e69-32393479ff36,dc31edb1-273e-4b1a-8e69-32393479ff36,0,1,46169f0b-8514-40a1-9d27-8489cab72503,46169f0b-8514-40a1-9d27-8489cab72503,0,1,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,d9cf39cc-8652-4c4d-bc5b-b4e455c0083f,0,1,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,4b0d7d39-5f79-4a21-b0bb-d3142a3bc8a9,0,1,c90243af-582c-4f5a-88e7-e0cbc0555fcb,c90243af-582c-4f5a-88e7-e0cbc0555fcb,0,1,14bf4066-15cb-4165-b854-45443ee27da1,14bf4066-15cb-4165-b854-45443ee27da1,0,1,c35904cf-4954-434e-96fd-5ca537a88c66,c35904cf-4954-434e-96fd-5ca537a88c66,0,1,5545798f-72dc-4630-a5ba-88039f4bfe3c,5545798f-72dc-4630-a5ba-88039f4bfe3c,0,1,f293ac4b-91ed-4c97-90b3-bfe98c983a0f,f293ac4b-91ed-4c97-90b3-bfe98c983a0f,0,1,4427cab9-4eea-4415-98ef-6021a447c60c,4427cab9-4eea-4415-98ef-6021a447c60c,0,1,fe46b4da-d865-468f-badd-83644bf88faa,fe46b4da-d865-468f-badd-83644bf88faa,0,1,2851c9d4-4366-4488-926d-a7fcd3b1548c,2851c9d4-4366-4488-926d-a7fcd3b1548c,0,1,31116aa2-cfbc-48e8-886b-45c1c17508fd,31116aa2-cfbc-48e8-886b-45c1c17508fd,0,1,6aa819d3-c56d-4561-a2e4-a1188ab1295a,6aa819d3-c56d-4561-a2e4-a1188ab1295a,0,1,2ddf344d-7065-40d5-9306-23870d8fc04a,2ddf344d-7065-40d5-9306-23870d8fc04a,0,1,c630ab2d-0a20-4136-88b6-220b2cad6a71,c630ab2d-0a20-4136-88b6-220b2cad6a71,0,1,00cd1dea-bc54-475c-956d-dc5221104932,00cd1dea-bc54-475c-956d-dc5221104932,0,1,c343495b-5947-4fe7-a94b-d1f2b2455b4f,c343495b-5947-4fe7-a94b-d1f2b2455b4f,0,1,fbce7316-bb9a-40c1-af3c-352f4b559ab6,fbce7316-bb9a-40c1-af3c-352f4b559ab6,0,1,a3721457-b33b-4742-b6e1-531af10969d1,a3721457-b33b-4742-b6e1-531af10969d1,0,1,9619a603-e578-4f30-bcc6-adfddfa915c0,9619a603-e578-4f30-bcc6-adfddfa915c0,0,1,3807f865-dd2c-44f7-9238-3db191f0a186,3807f865-dd2c-44f7-9238-3db191f0a186,0,1,8f184df5-bfe8-4df3-bc7c-18218cef7650,8f184df5-bfe8-4df3-bc7c-18218cef7650,0,1,387e273a-889f-454b-8b43-feaa12025fde,387e273a-889f-454b-8b43-feaa12025fde,0,1,1c38ad75-b294-4c05-89ce-69ce4d9a291f,1c38ad75-b294-4c05-89ce-69ce4d9a291f,0,1,078d1e8f-6d27-4761-9532-b1e7a60e4c13,078d1e8f-6d27-4761-9532-b1e7a60e4c13,0,1,4262193c-58ad-47c6-8088-735d8cd037ea,4262193c-58ad-47c6-8088-735d8cd037ea,0,1,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,36a2b5f9-ded5-4fc3-a7bd-e12b37cd6bab,0,1,de6d1aad-39eb-46ce-87aa-d29812bb37bf,de6d1aad-39eb-46ce-87aa-d29812bb37bf,0,1,4ad859ec-cc75-4bac-9e89-397798450e48,4ad859ec-cc75-4bac-9e89-397798450e48,0,1,d93ab94c-0f55-4b80-b226-41b44c73b3ea,d93ab94c-0f55-4b80-b226-41b44c73b3ea,0,1,94cbed80-5a35-471f-b354-439a11629210,94cbed80-5a35-471f-b354-439a11629210,0,1,1162cc0a-42e5-47cb-9507-68459579f110,1162cc0a-42e5-47cb-9507-68459579f110,0,1,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,17f9f188-d3fd-4fe1-a00c-b0dde64a0f9e,0,1,bb49dc80-4934-4f44-8f27-9a363dca8dc4,bb49dc80-4934-4f44-8f27-9a363dca8dc4,0,1,7338e497-03a7-4ed4-85a2-ca802c065a9f,7338e497-03a7-4ed4-85a2-ca802c065a9f,0,1,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,49fe879c-8972-4c9a-bb08-e3e5b2e5ff84,0,1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,5249687b-9ff4-46f5-be15-dbb5d5047fd1,0,1,d33df51c-3dcd-496c-90f2-7ee05582bdf7,d33df51c-3dcd-496c-90f2-7ee05582bdf7,0,1,24b39ebd-2424-4939-8e3e-d09eb674d409,24b39ebd-2424-4939-8e3e-d09eb674d409,0,1,08c751bb-9e57-4536-901e-bb316c8e96d7,08c751bb-9e57-4536-901e-bb316c8e96d7,0,1,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,de0afa6f-07c6-441c-a4ca-e7ed709a8da5,0,1,034cdcef-08e5-4751-9885-400aa69e0b94,034cdcef-08e5-4751-9885-400aa69e0b94,0,1,efefebea-2032-4006-b9ca-50a23b7da1ef,efefebea-2032-4006-b9ca-50a23b7da1ef,0,1,4c794d37-3352-4acb-a939-5e90fb682db8,4c794d37-3352-4acb-a939-5e90fb682db8,0,1,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,5f3fea83-6ca8-481b-9e2b-789a6fd01e2e,0,1,008f5068-da9c-4dac-9c0a-a50366d27cbb,008f5068-da9c-4dac-9c0a-a50366d27cbb,0,1,950b3ee3-070f-4946-8b9b-0aa2058de986,950b3ee3-070f-4946-8b9b-0aa2058de986,0,1,bd04a870-0943-4bdb-9e30-50a69daa8a13,bd04a870-0943-4bdb-9e30-50a69daa8a13,0,1,a23e6c77-8c12-4f99-ae2d-68a12274be38,a23e6c77-8c12-4f99-ae2d-68a12274be38,0,1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,3c4454cd-31e9-42a5-9127-fb66a628f0e1,0,1,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,c02c5cbf-b25a-4956-8aa7-74cfeb66d508,0,1,6e61d717-de36-4dce-8af9-b6c14ed76acb,6e61d717-de36-4dce-8af9-b6c14ed76acb,0,1,474518fe-9cb5-4a12-9388-bc7a64511617,474518fe-9cb5-4a12-9388-bc7a64511617,0,1,64337614-b1c9-4931-b576-448721fa4602,64337614-b1c9-4931-b576-448721fa4602,0,1,1d73b59c-0594-4ed3-b584-cf1261941e1d,1d73b59c-0594-4ed3-b584-cf1261941e1d,0,1,8ff2547f-d596-4fa1-9e12-079e1cc4c057,8ff2547f-d596-4fa1-9e12-079e1cc4c057,0,1,1ab0c8f8-b908-4618-ae88-af37b8f1224e,1ab0c8f8-b908-4618-ae88-af37b8f1224e,0,1,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,bd3ec5a9-161d-487e-ab1d-e5e15a6e3a7b,0,1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,b85b3a58-95e4-4698-b1ae-037901ecc1b1,0,1,b77d748a-d180-432d-91c3-774e6ccf7efa,b77d748a-d180-432d-91c3-774e6ccf7efa,0,1,e5b9c1b0-4690-442c-b160-e6c587e42e57,e5b9c1b0-4690-442c-b160-e6c587e42e57,0,1,e3adb576-6b33-475b-976b-7a6783de3184,e3adb576-6b33-475b-976b-7a6783de3184,0,1,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,c6cef8db-0689-42a6-9f43-c86b7c3cf0e9,0,1,78f5a205-dffb-4009-897a-e8f36372f33c,78f5a205-dffb-4009-897a-e8f36372f33c,0,1,f7597041-f182-42fb-803a-2521c70d627d,f7597041-f182-42fb-803a-2521c70d627d,0,1,ce988b8a-d0c1-400a-9466-aa757501bb58,ce988b8a-d0c1-400a-9466-aa757501bb58,0,1,ab98d665-8da8-406e-9e0e-3e130ab393ef,ab98d665-8da8-406e-9e0e-3e130ab393ef,0,1,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,9e823bb6-b0c0-439e-81e4-ebd46b79b99c,0,1,118a0e62-c0bb-435b-9e3e-c64563efa602,118a0e62-c0bb-435b-9e3e-c64563efa602,0,1,b57bc8a9-8a59-4192-a442-2e1982e83179,b57bc8a9-8a59-4192-a442-2e1982e83179,0,1,5b06ccda-2a70-4621-8273-78408cbe72a9,5b06ccda-2a70-4621-8273-78408cbe72a9,0,1,89753385-64fd-4e76-9857-bfd5d7c23f71,89753385-64fd-4e76-9857-bfd5d7c23f71,0,1,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,1b3113f3-e7d4-4e6f-b6ed-08f5fd78c68e,0,1,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,53e72cf2-e2a5-4b59-b5b1-a1fc28fda5bf,0,1,e20bcb57-2f68-4709-8a11-105d561a2dda,e20bcb57-2f68-4709-8a11-105d561a2dda,0,1,878fe826-fa99-44ad-9891-5eada9744017,878fe826-fa99-44ad-9891-5eada9744017,0,1,0d61712a-dfaf-46f1-b728-62993dd94fbe,0d61712a-dfaf-46f1-b728-62993dd94fbe,0,1,3a6cf496-09b9-4947-9df5-06d23b474558,3a6cf496-09b9-4947-9df5-06d23b474558,0,1,625b498a-33d1-4162-9525-fb7790cbb6a8,625b498a-33d1-4162-9525-fb7790cbb6a8,0,1,28223f7b-d15a-4f12-b57c-1f6d08a902f9,28223f7b-d15a-4f12-b57c-1f6d08a902f9,0,1,dd9eb5b7-5aed-4e51-9939-9ff14492d240,dd9eb5b7-5aed-4e51-9939-9ff14492d240,0,1,b2a14899-d589-4990-b85e-7bffb427e8af,b2a14899-d589-4990-b85e-7bffb427e8af,0,1,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0981d114-05bd-4ee1-a8fd-398fa6620d0b,0,1,3210ba40-382e-4917-ad0f-9bd88d23dc25,3210ba40-382e-4917-ad0f-9bd88d23dc25,0,1,835e3ead-d01f-410b-937a-902dd5e66aec,835e3ead-d01f-410b-937a-902dd5e66aec,0,1,40141982-d1d6-416f-844e-19143a407ff9,40141982-d1d6-416f-844e-19143a407ff9,0,1,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,66ec2482-c1f3-45d3-9257-e0b9f5ae772a,0,1,d3211832-c8ca-437a-8810-82e06cbb48de,d3211832-c8ca-437a-8810-82e06cbb48de,0,1,8131d701-1014-4196-9b67-914e451f8a3a,8131d701-1014-4196-9b67-914e451f8a3a,0,1,2b102933-c660-4e74-ae9a-5061a88ed672,2b102933-c660-4e74-ae9a-5061a88ed672,0,1,56c897b7-d34e-4d7d-9a3b-d0779be5c189,56c897b7-d34e-4d7d-9a3b-d0779be5c189,0,1,3ac81c80-56bd-4750-b135-07ab522e3eab,3ac81c80-56bd-4750-b135-07ab522e3eab,0,1,5657872f-c7d5-446f-bcc3-d0b86ad63a42,5657872f-c7d5-446f-bcc3-d0b86ad63a42,0,1,d5214cb9-67e2-469f-989f-3f2b662ae830,d5214cb9-67e2-469f-989f-3f2b662ae830,0,1,69679e88-4f2b-4dd6-8cb2-b88293d07b55,69679e88-4f2b-4dd6-8cb2-b88293d07b55,0,1,68679208-9972-4854-8649-49bdf6212255,68679208-9972-4854-8649-49bdf6212255,0,1,98393093-7ba6-4b4d-86be-ee5826cd8cd5,98393093-7ba6-4b4d-86be-ee5826cd8cd5,0,1,87de486d-3f35-4432-a7cd-9d3832db63cf,87de486d-3f35-4432-a7cd-9d3832db63cf,0,1,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,246f17a0-93a7-4e2c-8fa6-f57405f0abeb,0,1,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,ea6c4830-a34d-4026-a0ca-5cf7e44f089d,0,1,bb7ce04a-8143-4c0b-a196-1b57f1640142,bb7ce04a-8143-4c0b-a196-1b57f1640142,0,1,4872f12c-705c-4dd3-802f-d27496a0d634,4872f12c-705c-4dd3-802f-d27496a0d634,0,1,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0c0bbfba-c1c4-4bb5-a813-10da4bef7911,0,1,f9ada91a-e673-4821-9bce-cb0dd75ca28b,f9ada91a-e673-4821-9bce-cb0dd75ca28b,0,1,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,9fcf68bb-43e2-4cd1-89ec-8797ad9c0e8b,0,1,90ce635a-0277-4056-980d-d1a16d91cb30,90ce635a-0277-4056-980d-d1a16d91cb30,0,1,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,e61a8360-a0f8-4d86-b91a-2ae9b8552bf0,0,1,1e77e873-632c-482b-8f46-8f8cc3cc8cef,1e77e873-632c-482b-8f46-8f8cc3cc8cef,0,1,766208a3-2780-427b-a7d3-93abe99d236b,766208a3-2780-427b-a7d3-93abe99d236b,0,1,63ce4c3c-5bad-409c-904f-18f34cf1da78,63ce4c3c-5bad-409c-904f-18f34cf1da78,0,1,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,62bddcee-bef6-42cc-9ba3-e99b8160dcc2,0,1,26ac22f9-0bbb-4671-b446-626e345e2461,26ac22f9-0bbb-4671-b446-626e345e2461,0,1,0d63ee6d-e17f-4a86-b384-adf9793f3331,0d63ee6d-e17f-4a86-b384-adf9793f3331,0,1,f152945b-2a7b-449e-a915-176166af7bac,f152945b-2a7b-449e-a915-176166af7bac,0,1,77f5d86a-7fae-4490-9740-0e31102dab5c,77f5d86a-7fae-4490-9740-0e31102dab5c,0,1,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,5a54bc1a-d178-412c-bf4a-cf92d7f141aa,0,1,24be43ec-d39e-46aa-9c11-2536b835e515,24be43ec-d39e-46aa-9c11-2536b835e515,0,1,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,c9ca80ef-c7b7-4425-b5c0-3d13af82f291,0,1,df9af3ee-6a69-4a03-8ff5-0735e9a38013,df9af3ee-6a69-4a03-8ff5-0735e9a38013,0,1,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,1b27eb77-d535-43a5-8ae1-fa2fec15d92c,0,1,7743fe24-b941-4dad-bc76-05fb6b26b1d7,7743fe24-b941-4dad-bc76-05fb6b26b1d7,0,1,5bf2da0d-f318-4036-9234-8a3a6eca88b2,5bf2da0d-f318-4036-9234-8a3a6eca88b2,0,1,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,288525fc-d3fa-4c8e-a1d7-d2d1ef4cd0ef,0,1,c3634571-6fe5-45ab-9362-161305eef661,c3634571-6fe5-45ab-9362-161305eef661,0,1,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,ecd8772d-e33f-426f-a87a-e28bd94d5fdf,0,1,96661303-1286-4f84-93b7-0e6da2bd7893,96661303-1286-4f84-93b7-0e6da2bd7893,0,1,68076431-36e6-46dc-92cb-e0d8e605bf66,68076431-36e6-46dc-92cb-e0d8e605bf66,0,1,239fa55a-6572-4e5c-9918-c2e14063c76d,239fa55a-6572-4e5c-9918-c2e14063c76d,0,1,8211a1b6-c3b1-466b-8d11-22603fb50c7a,8211a1b6-c3b1-466b-8d11-22603fb50c7a,0,1,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,7e7dfcb5-04eb-40f4-8f4c-f29644e81473,0,1,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,daef68a3-c6c3-450d-b8fd-7af2a2f5572e,0,1,a83cb338-5707-42c9-9e88-11f6c68fcc32,a83cb338-5707-42c9-9e88-11f6c68fcc32,0,1,985106b7-7476-4b48-90ac-ad86876395b5,985106b7-7476-4b48-90ac-ad86876395b5,0,1,0d8db0c9-adbc-478d-997c-3d7feccac99b,0d8db0c9-adbc-478d-997c-3d7feccac99b,0,1,3fd2ef04-c178-47bf-ab62-7baf83236d99,3fd2ef04-c178-47bf-ab62-7baf83236d99,0,1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,b4cd1b51-dbc0-4bb0-879e-5ac0d58e78c1,0,1,320bf2e6-a3a8-490b-8aa0-21369ffb121b,320bf2e6-a3a8-490b-8aa0-21369ffb121b,0,1,a3bafc54-8fe4-4841-acc6-74a87baf9caf,a3bafc54-8fe4-4841-acc6-74a87baf9caf,0,1,f93741c9-ab94-464b-b0d4-4af99c9f92d5,f93741c9-ab94-464b-b0d4-4af99c9f92d5,0,1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0fddbd8d-12dd-4af1-9e34-feebf4bc38b1,0,1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,2e9548a6-1fd8-4430-8864-91bde0d2a7a1,0,1,c59fd3f8-c734-49d3-90ba-e608a22ac981,c59fd3f8-c734-49d3-90ba-e608a22ac981,0,1,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,b26235ed-374c-44ab-8b3c-01d7c4d82d4c,0,1,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,5056db9f-9ebe-4cca-98f0-5f4817a1cba4,0,1,475f76ea-f494-41f1-9b65-f39907e5a427,475f76ea-f494-41f1-9b65-f39907e5a427,0,1,986280d1-41bb-4b15-a5ae-516d6a04c1f4,986280d1-41bb-4b15-a5ae-516d6a04c1f4,0,1,43bfd29a-d254-4c33-8639-200b483578c1,43bfd29a-d254-4c33-8639-200b483578c1,0,1,6a274167-7f80-4613-9890-259ffd8ccfc4,6a274167-7f80-4613-9890-259ffd8ccfc4,0,1,4e90e1ab-b1ec-4795-ad45-1db151a5492c,4e90e1ab-b1ec-4795-ad45-1db151a5492c,0,1,91791e56-ca80-4d90-b8a8-16145f6a9721,91791e56-ca80-4d90-b8a8-16145f6a9721,0,1,b242c6a2-5ac9-4edb-b5dd-24eda8162151,b242c6a2-5ac9-4edb-b5dd-24eda8162151,0,1,8d080f3c-06ed-48bf-9709-eea73d676741,8d080f3c-06ed-48bf-9709-eea73d676741,0,1,57b31a5d-9fdc-43d2-ae81-67157822c4b6,57b31a5d-9fdc-43d2-ae81-67157822c4b6,0,1,d4e2da66-9a70-459f-a873-cb4ad71d17b2,d4e2da66-9a70-459f-a873-cb4ad71d17b2,0,1,a84a91d2-d326-4bf4-82e6-d573ee35d090,a84a91d2-d326-4bf4-82e6-d573ee35d090,0,1,39cbda23-db3f-4ddd-8981-8540247406db,39cbda23-db3f-4ddd-8981-8540247406db,0,1,c8a18d99-62ff-45a4-acb5-48e3310c1b53,c8a18d99-62ff-45a4-acb5-48e3310c1b53,0,1,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,a6eb0cb1-80f0-4390-80ff-7af53f8e63c3,0,1,3500c6fa-813a-49dd-a4bf-163500db5b7f,3500c6fa-813a-49dd-a4bf-163500db5b7f,0,1,1d02493a-dd89-4a51-b75e-9c49f9818b95,1d02493a-dd89-4a51-b75e-9c49f9818b95,0,1,2845c5d1-e836-4499-bcae-f3c8fdae75ee,2845c5d1-e836-4499-bcae-f3c8fdae75ee,0,1,fe4e8e4e-9471-4583-b9b3-576007db08ee,fe4e8e4e-9471-4583-b9b3-576007db08ee,0,1,49deaaa8-6d50-4b25-8153-6712d88fb0fb,49deaaa8-6d50-4b25-8153-6712d88fb0fb,0,1,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,1eeb7634-e924-4ad8-92e0-1c54c22b1ba6,0,1,46a06de8-06fd-4b49-835f-4f24b832b3c4,46a06de8-06fd-4b49-835f-4f24b832b3c4,0,1,3845a567-4375-4c3a-af61-5b82674060ab,3845a567-4375-4c3a-af61-5b82674060ab,0,1,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,ab210fb8-4fc4-47f8-b8ef-3a00eeb0ab8b,0,1,a835a3a7-989b-4247-b836-d23bba2f391a,a835a3a7-989b-4247-b836-d23bba2f391a,0,1,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,58f5c354-8f1d-4064-ba35-527ea3d2f4a9,0,1,9b149c20-9328-4e2d-a34b-95c883ae4dcc,9b149c20-9328-4e2d-a34b-95c883ae4dcc,0,1,f8dbf226-ea56-4b15-baf1-a41fceba2a32,f8dbf226-ea56-4b15-baf1-a41fceba2a32,0,1,fc1476f7-26e6-4374-b99b-e515d86c050a,fc1476f7-26e6-4374-b99b-e515d86c050a,0,1,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,e0eb7b4a-9a13-4752-9327-e13d2abc4fc5,0,1,59fe985a-f169-495b-bd6d-4b64401f81b0,59fe985a-f169-495b-bd6d-4b64401f81b0,0,1,184d1023-fba9-4e56-b592-519254abe922,184d1023-fba9-4e56-b592-519254abe922,0,1,cb68b275-f191-4632-a8ea-aa8809256804,cb68b275-f191-4632-a8ea-aa8809256804,0,1,174011b9-8fe2-43f5-adea-21f6d73835ff,174011b9-8fe2-43f5-adea-21f6d73835ff,0,1,c4753515-a483-453e-a48b-b12d8ef48fd9,c4753515-a483-453e-a48b-b12d8ef48fd9,0,1,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,2d9048eb-abdf-4980-96ed-788fbb0f4ea7,0,1,98c3bc52-2351-460c-8b8e-0d3f45ca3131,98c3bc52-2351-460c-8b8e-0d3f45ca3131,0,1,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,b1ff31b9-c9f2-4be4-ac9a-62faa1d1eb81,0,1,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,c14ea7a0-1fb6-4d54-82d6-7f12f11b0c0b,0,1,29645810-44aa-402c-9561-7819d6f4a7ab,29645810-44aa-402c-9561-7819d6f4a7ab,0,1,46bf4911-5200-44ac-9b4d-eb0089c12e34,46bf4911-5200-44ac-9b4d-eb0089c12e34,0,1,6e1685bd-7269-401c-b36e-def6a36b41d5,6e1685bd-7269-401c-b36e-def6a36b41d5,0,1,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,9d77103a-9921-4f6c-98fc-d7f42f0f2d8d,0,1,e03b6592-b597-4795-a78e-775d4f2258db,e03b6592-b597-4795-a78e-775d4f2258db,0,1,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,6ae9e86a-a42f-4de0-a891-6abe1ed16cdd,0,1,3b207d5f-6584-4cf2-9173-20235484f9f4,3b207d5f-6584-4cf2-9173-20235484f9f4,0,1,878d9efe-b0e7-487f-b8f7-83470c131e09,878d9efe-b0e7-487f-b8f7-83470c131e09,0,1,8270573d-8ed6-449d-853b-462d2dabaaa9,8270573d-8ed6-449d-853b-462d2dabaaa9,0,1,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,baeec6cd-b220-4240-95f2-3a0c1ee06c2e,0,1,f2502463-67e4-4bfe-8ad5-fb80aa73975a,f2502463-67e4-4bfe-8ad5-fb80aa73975a,0,1,59e885e6-d978-40c2-95b6-35fc61074fb4,59e885e6-d978-40c2-95b6-35fc61074fb4,0,1,267dc512-9ee1-4bc1-9034-3effb7fb2949,267dc512-9ee1-4bc1-9034-3effb7fb2949,0,1,0f211e73-5be9-4015-93e7-ccf63e793cb6,0f211e73-5be9-4015-93e7-ccf63e793cb6,0,1,6574d8f4-fb97-4a26-b166-711fad63aa07,6574d8f4-fb97-4a26-b166-711fad63aa07,0,1,fb3eddaf-3241-4d59-8314-97a5ae9258c4,fb3eddaf-3241-4d59-8314-97a5ae9258c4,0,1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,6528bd7a-bac1-4c8b-9b00-6be01c0121b1,0,1,d8601e95-af94-4805-974a-99c539725d74,d8601e95-af94-4805-974a-99c539725d74,0,1,6d98f877-f3bb-4795-9025-2631468a331f,6d98f877-f3bb-4795-9025-2631468a331f,0,1,89b9379d-ace9-48cc-b979-a66fd45aeb1d,89b9379d-ace9-48cc-b979-a66fd45aeb1d,0,1,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,c4a5c44d-329d-41b5-9a6c-bddbc15f6249,0,1,9767a113-5a42-4749-bf40-0f349e85615d,9767a113-5a42-4749-bf40-0f349e85615d,0,1,a3b0494c-f436-45ea-9577-4c0c86b057c9,a3b0494c-f436-45ea-9577-4c0c86b057c9,0,1,5101c142-b25c-4bef-80e7-7407f2c15c90,5101c142-b25c-4bef-80e7-7407f2c15c90,0,1,6d7872f1-fd54-41c4-8253-5f2b125f31ae,6d7872f1-fd54-41c4-8253-5f2b125f31ae,0,1,0c218200-27a8-4f71-9b09-3632dd453644,0c218200-27a8-4f71-9b09-3632dd453644,0,1,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,2d8a74e5-eb29-448b-b4c0-1f41fa171b5e,0,1,b5d30250-18ab-4af1-b99a-ff5dba334d1f,b5d30250-18ab-4af1-b99a-ff5dba334d1f,0,1,936f1aa5-7516-444b-b451-1162fa5d705f,936f1aa5-7516-444b-b451-1162fa5d705f,0,1,e8d5533e-2669-44f6-9eed-eaedab666d42,e8d5533e-2669-44f6-9eed-eaedab666d42,0,1,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,dd8e0f41-51a3-4bf2-a32e-084f9ad09be7,0,1,9e323b0d-4e3b-45d4-9705-aa30e63014f5,9e323b0d-4e3b-45d4-9705-aa30e63014f5,0,1,5afa798a-958e-4e0c-a380-0104f4c037a7,5afa798a-958e-4e0c-a380-0104f4c037a7,0,1,c0295fd9-c749-41b3-8d0d-6af16f484b1f,c0295fd9-c749-41b3-8d0d-6af16f484b1f,0,1,bd32a863-3090-432d-89c4-356ba86a0bdc,bd32a863-3090-432d-89c4-356ba86a0bdc,0,1,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,4621bf5a-46b5-4b82-8ae4-cc8e11e81ba0,0,1,ed5465b4-a556-4078-ab18-49fef2afba2e,ed5465b4-a556-4078-ab18-49fef2afba2e,0,1,7368ab8f-59d5-4270-a43b-0f3e422169ed,7368ab8f-59d5-4270-a43b-0f3e422169ed,0,1,eeb0571b-1b74-4889-b8b5-f94186d692d7,eeb0571b-1b74-4889-b8b5-f94186d692d7,0,1,9ef3b72c-caa3-486b-9917-04c00f6689c1,9ef3b72c-caa3-486b-9917-04c00f6689c1,0,1,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,cb3039d8-4b11-4d03-b0ca-eae5dfc01b0a,0,1,9245417f-f247-47ba-a1b4-a17ec2e8776c,9245417f-f247-47ba-a1b4-a17ec2e8776c,0,1,a4b721d7-b119-47eb-80e0-7db34c83964f,a4b721d7-b119-47eb-80e0-7db34c83964f,0,1,512629d1-e8b7-4f66-b613-b8c0cb9c250b,512629d1-e8b7-4f66-b613-b8c0cb9c250b,0,1,b7cf4684-4432-4658-9c06-b315d470a3a6,b7cf4684-4432-4658-9c06-b315d470a3a6,0,1,d3bc8211-54d8-47dd-aecf-5da72b65195f,d3bc8211-54d8-47dd-aecf-5da72b65195f,0,1,33f11da8-f670-4ec3-9d40-96fce031c60f,33f11da8-f670-4ec3-9d40-96fce031c60f,0,1,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,97cbd5b5-5a39-418c-93b5-f9934fa1ba4e,0,1,f74c2d41-2433-4bed-8aef-adfeed198252,f74c2d41-2433-4bed-8aef-adfeed198252,0,1,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,3c2b8a8a-bfe7-4e37-9d83-55a695a06605,0,1,56c9703a-751a-4e6c-81f4-a8756fb040e3,56c9703a-751a-4e6c-81f4-a8756fb040e3,0,1,c3a86eec-1ff5-4392-9904-91a12a2e253a,c3a86eec-1ff5-4392-9904-91a12a2e253a,0,1,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,f5df72a3-c71c-412b-8c3e-6329f1d3a7da,0,1,f02b7246-dae9-4e15-b4cd-b06133664d34,f02b7246-dae9-4e15-b4cd-b06133664d34,0,1,77f20022-17ce-4e00-8a84-015238bce6f3,77f20022-17ce-4e00-8a84-015238bce6f3,0,1,3734619b-7059-4547-8b97-0b3393389d4d,3734619b-7059-4547-8b97-0b3393389d4d,0,1,a30bf95f-aabd-4da0-8287-61e08f9362fb,a30bf95f-aabd-4da0-8287-61e08f9362fb,0,1,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,f5a7df18-2ddb-4053-9aeb-57fc37ae557e,0,1,4078867c-2972-47f9-bebd-935a6f1cc667,4078867c-2972-47f9-bebd-935a6f1cc667,0,1,8502fe39-c241-4be5-a313-fd887bbbdfa1,8502fe39-c241-4be5-a313-fd887bbbdfa1,0,1,67a71201-13e5-42a3-902f-fb3a59710dfb,67a71201-13e5-42a3-902f-fb3a59710dfb,0,1,3a79a951-a997-4596-ab62-ba376d67725d,3a79a951-a997-4596-ab62-ba376d67725d,0,1,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,dd4fe688-c113-4ac5-8114-b89cf1b0eb55,0,1,884c28de-434f-440a-8c63-67e659c097ad,884c28de-434f-440a-8c63-67e659c097ad,0,1,92ead3b5-8c55-4e4d-bd47-009e025b22f8,92ead3b5-8c55-4e4d-bd47-009e025b22f8,0,1,50d8e365-aa58-4b60-8992-01943379d485,50d8e365-aa58-4b60-8992-01943379d485,0,1,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,9bb58c7c-d87d-435b-adf6-09c8f75d47b2,0,1,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,bcd705ba-c9ac-4e73-94b1-7632c0f06c04,0,1,094d5482-286d-4e1a-8888-c0452d2e5af0,094d5482-286d-4e1a-8888-c0452d2e5af0,0,1,fec102ea-a3f6-49b5-b4b8-6884b0654129,fec102ea-a3f6-49b5-b4b8-6884b0654129,0,1,184405d0-34a7-4668-9a64-d92a6a7da142,184405d0-34a7-4668-9a64-d92a6a7da142,0,1,bccf8909-6f99-44d8-9c91-688958fc95f4,bccf8909-6f99-44d8-9c91-688958fc95f4,0,1,246571fb-38c7-4da6-929d-d8b44bc3437c,246571fb-38c7-4da6-929d-d8b44bc3437c,0,1,047fd6d7-5e30-4184-a09a-6525de526cc7,047fd6d7-5e30-4184-a09a-6525de526cc7,0,1,beb44b02-5d5e-4127-aee7-e184a43a4210,beb44b02-5d5e-4127-aee7-e184a43a4210,0,1,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,1dedfbc2-9250-4229-a6ea-5e085f33e7c3,0,1,e24641ed-3e92-46d7-852b-9958ab7bc520,e24641ed-3e92-46d7-852b-9958ab7bc520,0,1,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,bc2aa3f9-ef2c-49a5-8cd9-ddd8a8cbe19d,0,1,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,b6ac4cd6-c68f-4464-88e9-a8d335d581c6,0,1,2c61114f-abd7-4415-8cdf-4fe95d9fe354,2c61114f-abd7-4415-8cdf-4fe95d9fe354,0,1,abd7a766-5cc1-48db-8d29-797e9d666a78,abd7a766-5cc1-48db-8d29-797e9d666a78,0,1,1704b5e3-8e77-4df6-9223-e6e5c41a280d,1704b5e3-8e77-4df6-9223-e6e5c41a280d,0,1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,62eca88f-025d-44de-b92c-46cd8bc7e4a1,0,1,b0dde395-8498-4469-9507-d290798117d7,b0dde395-8498-4469-9507-d290798117d7,0,1,999616ea-0faa-4ae2-9841-6a6997ea6694,999616ea-0faa-4ae2-9841-6a6997ea6694,0,1,c5f91669-13d8-4f0a-a054-2701078da38a,c5f91669-13d8-4f0a-a054-2701078da38a,0,1,34f9872b-e02e-4093-ba06-3cb5b8995850,34f9872b-e02e-4093-ba06-3cb5b8995850,0,1,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,18515c19-c9ef-4c9f-8d12-4f58ffa251e8,0,1,e61eef89-b3de-4b73-b7d9-af75318093e5,e61eef89-b3de-4b73-b7d9-af75318093e5,0,1,94e68502-adf1-476e-be2f-8418385959fa,94e68502-adf1-476e-be2f-8418385959fa,0,1,bf80ccc5-f907-4e7f-a007-6030c7ba682e,bf80ccc5-f907-4e7f-a007-6030c7ba682e,0,1,a330acd1-bc97-4ef8-8ecb-5604868ca044,a330acd1-bc97-4ef8-8ecb-5604868ca044,0,1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,05f1f184-50cb-47c5-b3a8-62be6a9780c1,0,1,58c3936c-4db0-45c8-a22e-b5dd49a61497,58c3936c-4db0-45c8-a22e-b5dd49a61497,0,1,8928693b-1933-4e02-8a33-99b6f05b1c57,8928693b-1933-4e02-8a33-99b6f05b1c57,0,1,9aa607bc-5870-436a-bbe1-296560393e3b,9aa607bc-5870-436a-bbe1-296560393e3b,0,1,1635be16-4861-4a7d-babc-4caff448a7f7,1635be16-4861-4a7d-babc-4caff448a7f7,0,1,9e399087-c957-4a7a-ab9d-2b689736caab,9e399087-c957-4a7a-ab9d-2b689736caab,0,1,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,e7542e37-a2f0-43b5-852e-4e2b24b1b71f,0,1,61f283c7-f887-432b-a2d7-c27483e04317,61f283c7-f887-432b-a2d7-c27483e04317,0,1,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,3e94649c-7d69-4fb4-ada1-ae00eabf02b6,0,1,2b7372be-af0d-464e-8d09-8172229790af,2b7372be-af0d-464e-8d09-8172229790af,0,1,079bc65d-da8e-431d-847c-ec46868ca92d,079bc65d-da8e-431d-847c-ec46868ca92d,0,1,d85346db-be25-4dab-a2db-647c3d40dd17,d85346db-be25-4dab-a2db-647c3d40dd17,0,1,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,c960082b-8c16-4d7b-b7fd-b1f2bfe07e0b,0,1,fb07fd61-2aae-4759-b6ef-c44c2bba4036,fb07fd61-2aae-4759-b6ef-c44c2bba4036,0,1,cd6770d5-cd3c-47af-bc46-c865993adf63,cd6770d5-cd3c-47af-bc46-c865993adf63,0,1,9f9936fc-54a0-4812-b12d-2f8f91551440,9f9936fc-54a0-4812-b12d-2f8f91551440,0,1,a5667633-9264-4dfa-9e26-c45e96e61ae3,a5667633-9264-4dfa-9e26-c45e96e61ae3,0,1,2eeea138-481c-4fde-9e8a-709d751cc469,2eeea138-481c-4fde-9e8a-709d751cc469,0,1,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,02c5f3b2-d691-4eaf-84fd-763770e4b1cb,0,1,1f169cd2-573f-408d-92e7-3eee7ff4528a,1f169cd2-573f-408d-92e7-3eee7ff4528a,0,1,845262f8-8208-4c90-98ec-c85dd5734cf0,845262f8-8208-4c90-98ec-c85dd5734cf0,0,1,3326bbcb-b277-44db-a252-2448119e8146,3326bbcb-b277-44db-a252-2448119e8146,0,1,61cac5f7-320c-4098-9078-44fadcdeb219,61cac5f7-320c-4098-9078-44fadcdeb219,0,1,304304b1-36a4-42bb-8ab9-b23b59795001,304304b1-36a4-42bb-8ab9-b23b59795001,0,1,9ed016b2-2a4a-43a1-a336-6b13d68b3d0a,9ed016b2-2a4a-43a1-a336-6b13d68b3d0a,0,1,75b9ab9f-7cbb-4468-9570-39f719fd682b,75b9ab9f-7cbb-4468-9570-39f719fd682b,0,1,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,a22d1a4f-cb7c-4bcc-b258-ecca282fb071,0,1,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,e5beda2c-f4e2-4a6b-a1d0-a877eb0c9f5b,0,1,cd454738-62dd-4f95-af33-b52750678428,cd454738-62dd-4f95-af33-b52750678428,0,1,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,2a479b8f-7569-43d0-8ca3-9001d6ec57f0,0,1,e4abafc6-f859-4d96-9818-5b9bf8d66d69,e4abafc6-f859-4d96-9818-5b9bf8d66d69,0,1,535acd2c-26d2-4f32-9ae6-cc1956317c59,535acd2c-26d2-4f32-9ae6-cc1956317c59,0,1,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,801adeeb-8a7f-44c1-b649-a7dfffc7b65d,0,1,ac4e0868-ba49-46b4-8872-d42483a5591f,ac4e0868-ba49-46b4-8872-d42483a5591f,0,1,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,45e6c4a6-1d63-4b94-a7d2-fbd3fb68061b,0,1,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0493dcf1-5f94-41f9-a4c7-a52e12a29068,0,1,ca4c0299-625a-4b03-be0e-36ffb45c6d08,ca4c0299-625a-4b03-be0e-36ffb45c6d08,0,1,7fa1119b-4321-4b8f-a879-1d940084145a,7fa1119b-4321-4b8f-a879-1d940084145a,0,1,5d9c0841-6ea6-48dc-a53b-9f19894750f8,5d9c0841-6ea6-48dc-a53b-9f19894750f8,0,1,86b5303b-d967-4bc6-b2da-066c5a58613f,86b5303b-d967-4bc6-b2da-066c5a58613f,0,1,853b824d-9377-475f-913e-d02bd60f5f64,853b824d-9377-475f-913e-d02bd60f5f64,0,1,0c5e261f-961e-4780-877a-06589400b88a,0c5e261f-961e-4780-877a-06589400b88a,0,1,ee1f8545-ea64-41de-a29a-2d40e15d4f16,ee1f8545-ea64-41de-a29a-2d40e15d4f16,0,1,4599ef83-5f1e-44af-ae0c-67988656a99e,4599ef83-5f1e-44af-ae0c-67988656a99e,0,1,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,acb0d7eb-2ed9-4419-b79d-7dc661d70c30,0,1,e1b94dcf-ec37-4b2d-a7af-120eeee40944,e1b94dcf-ec37-4b2d-a7af-120eeee40944,0,1,7d2a37b1-a1a0-435a-846a-95e255655044,7d2a37b1-a1a0-435a-846a-95e255655044,0,1,109db64c-00dc-490e-99a5-4430d9344e99,109db64c-00dc-490e-99a5-4430d9344e99,0,1,85837a55-fed5-4b7b-a622-30d728b9a677,85837a55-fed5-4b7b-a622-30d728b9a677,0,1,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0fd79cdb-dc7a-40ca-a3bc-2c7a7b4691bb,0,1,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,6ede8b5c-7df0-44a5-9136-8109bbd8b5a9,0,1,da9821c3-4b16-48b7-9088-d3cf8ac536a6,da9821c3-4b16-48b7-9088-d3cf8ac536a6,0,1,d5142574-a040-4dd0-a482-cdc61c1d86ab,d5142574-a040-4dd0-a482-cdc61c1d86ab,0,1,fb36c775-1124-4ba6-8af8-133bf66fcb54,fb36c775-1124-4ba6-8af8-133bf66fcb54,0,1,51f9aff4-71da-4b1b-b48b-04122a17d855,51f9aff4-71da-4b1b-b48b-04122a17d855,0,1,778e79ee-eb1a-4d52-8a31-58e781c78fe4,778e79ee-eb1a-4d52-8a31-58e781c78fe4,0,1,90385850-d37b-4b2e-ac87-95c17f32197c,90385850-d37b-4b2e-ac87-95c17f32197c,0,1,f480ac52-e2f1-4ed0-a0b1-20a622f77302,f480ac52-e2f1-4ed0-a0b1-20a622f77302,0,1,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,5c63e7cd-ecdb-45ae-a589-f6c38f5a8e76,0,1,b9b0fbdc-8fda-46d1-bb3e-561a03604971,b9b0fbdc-8fda-46d1-bb3e-561a03604971,0,1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,eadfdbe3-bc85-4084-aef6-4cfd258ee6f1,0,1,672c2936-9771-4e32-a970-7ac7f12a21e8,672c2936-9771-4e32-a970-7ac7f12a21e8,0,1,c264441d-4805-4968-baa2-37b8970049c7,c264441d-4805-4968-baa2-37b8970049c7,0,1,f36150de-33af-4410-8a4c-8c9f4b545793,f36150de-33af-4410-8a4c-8c9f4b545793,0,1,62f97480-7d4a-48f3-9d1d-612909b242c9,62f97480-7d4a-48f3-9d1d-612909b242c9,0,1,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,2b4f6e2f-6cc4-4c7c-98a6-786f3793366b,0,1,3068be84-a401-4701-8ac9-411fae130f84,3068be84-a401-4701-8ac9-411fae130f84,0,1,957394a7-e5b8-47fc-8680-1e71efe2be7d,957394a7-e5b8-47fc-8680-1e71efe2be7d,0,1,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,ba49a9e4-6ec1-43ff-92cd-9dbf221bbf09,0,1,4f25ef45-c8d9-401d-b0e8-2217ac310f04,4f25ef45-c8d9-401d-b0e8-2217ac310f04,0,1,504ca240-b5ae-433e-ae5f-d818263eea23,504ca240-b5ae-433e-ae5f-d818263eea23,0,1,32461819-9437-417d-8d1e-851c9a2dcee2,32461819-9437-417d-8d1e-851c9a2dcee2,0,1,74228950-8a4b-4dd6-a053-8650de202521,74228950-8a4b-4dd6-a053-8650de202521,0,1,ff700f82-aba3-417c-be1b-b1b37ad98543,ff700f82-aba3-417c-be1b-b1b37ad98543,0,1,6b9ce91e-08b9-4972-9878-1724c67b68ec,6b9ce91e-08b9-4972-9878-1724c67b68ec,0,1,640814f2-6082-475e-8006-25fd5b24afdb,640814f2-6082-475e-8006-25fd5b24afdb,0,1,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,6fcd2a3a-4d66-40e3-bde0-5c274b43783f,0,1,f1b66ea8-262d-4b38-a039-b83a843f6ee8,f1b66ea8-262d-4b38-a039-b83a843f6ee8,0,1,bcae6e05-f1fd-413e-9eef-2e1cee42a962,bcae6e05-f1fd-413e-9eef-2e1cee42a962,0,1,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,40da1bca-ebb3-4c64-bf54-1f37b71d47b6,0,1,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,778b4c8f-7a1e-4b4b-9f68-12cbf52bf195,0,1,91562fe8-e630-4bcb-a14e-c0e1e129141a,91562fe8-e630-4bcb-a14e-c0e1e129141a,0,1,c261abfd-3828-47b5-aa32-dfdd3a1636ad,c261abfd-3828-47b5-aa32-dfdd3a1636ad,0,1,e71f8f26-addf-4b12-a244-11610ed03bba,e71f8f26-addf-4b12-a244-11610ed03bba,0,1,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,e9aa6dab-0d96-42ce-9bd6-b8b10d755f8c,0,1,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,84da1ef8-1784-4dfc-b17a-7728aa7ff62a,0,1,9155c95b-6afb-41bb-bd0b-d37e503fc163,9155c95b-6afb-41bb-bd0b-d37e503fc163,0,1,d917c19e-be15-41cc-9c8a-a97c8de85309,d917c19e-be15-41cc-9c8a-a97c8de85309,0,1,47907538-9357-4885-8b50-17f2e16c260f,47907538-9357-4885-8b50-17f2e16c260f,0,1,17e1840f-fef3-4f17-8476-273e6af24cb4,17e1840f-fef3-4f17-8476-273e6af24cb4,0,1,a64566fa-b706-49bc-8277-4531145c400e,a64566fa-b706-49bc-8277-4531145c400e,0,1,a8f32b13-249c-4ce6-a521-f06a87f2e670,a8f32b13-249c-4ce6-a521-f06a87f2e670,0,1,815775e4-cfb7-495b-87c4-d134b90d93d4,815775e4-cfb7-495b-87c4-d134b90d93d4,0,1,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,e867f2f1-0550-4d15-9e40-ba36c9aabfbd,0,1,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,8bdbb9ef-3a91-4374-b3c5-9447005bb1b7,0,1,7a27b378-89ac-4cad-8c69-a0cd14812d7e,7a27b378-89ac-4cad-8c69-a0cd14812d7e,0,1,d2433a11-8e1d-4e4c-966d-37cde6283f72,d2433a11-8e1d-4e4c-966d-37cde6283f72,0,1,59eb5919-3c33-48bf-b322-ec78018e4142,59eb5919-3c33-48bf-b322-ec78018e4142,0,1,63f308a5-b955-48a5-8052-50c5bede65d0,63f308a5-b955-48a5-8052-50c5bede65d0,0,1,1b614b97-5c1d-497a-9574-40114059f836,1b614b97-5c1d-497a-9574-40114059f836,0,1,477dfea4-e401-4cf0-b0a8-2df7c3836c58,477dfea4-e401-4cf0-b0a8-2df7c3836c58,0,1,294c000f-6979-4ed1-bbc7-7402facd9185,294c000f-6979-4ed1-bbc7-7402facd9185,0,1,db607fbc-f785-47d5-9550-577424aa3fe9,db607fbc-f785-47d5-9550-577424aa3fe9,0,1,b7111ddf-a623-4bae-90aa-636148492ca2,b7111ddf-a623-4bae-90aa-636148492ca2,0,1,905d9dcd-5793-4362-8fe8-2edce8c35e32,905d9dcd-5793-4362-8fe8-2edce8c35e32,0,1,a96cb6fd-54e0-4514-9210-7f4636acd336,a96cb6fd-54e0-4514-9210-7f4636acd336,0,1,3580e7a7-95d1-4a8e-bc12-a1449fe03757,3580e7a7-95d1-4a8e-bc12-a1449fe03757,0,1,13759790-6c70-4323-9321-a68b90c51663,13759790-6c70-4323-9321-a68b90c51663,0,1,d9704b20-c29c-4e7f-b777-0ac9080a5631,d9704b20-c29c-4e7f-b777-0ac9080a5631,0,1,c1372891-0f55-4868-ab97-906eff52be0e,c1372891-0f55-4868-ab97-906eff52be0e,0,1,33e96bda-1708-4ee4-8d4d-3b919bda3e38,33e96bda-1708-4ee4-8d4d-3b919bda3e38,0,1,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,53fb35a7-44ab-42e7-8dba-6fa08bf5ba2c,0,1,93fcaa62-2a19-468b-9128-c7930583fbfd,93fcaa62-2a19-468b-9128-c7930583fbfd,0,1,2d885109-4c96-41c0-a996-785bfd793c2d,2d885109-4c96-41c0-a996-785bfd793c2d,0,1,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,cae8a6f2-bbe9-4b73-b839-9bf8e5e2818d,0,1,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0a79ee40-e6d6-4dbf-8378-98c2ec1e8ef9,0,1,5148d263-de26-4c92-b090-ae59f42dfb05,5148d263-de26-4c92-b090-ae59f42dfb05,0,1,dbefe81f-85cf-4d84-9600-b359598c2543,dbefe81f-85cf-4d84-9600-b359598c2543,0,1,1a624a06-93b8-4d1f-8c14-2061e1e7927c,1a624a06-93b8-4d1f-8c14-2061e1e7927c,0,1,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,4ad54ca8-8e4a-4a35-9537-0395851fcdfb,0,1,d5967e0f-03cd-4190-a702-7e9290eae1eb,d5967e0f-03cd-4190-a702-7e9290eae1eb,0,1,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,27b27cc5-d1ad-4a2a-bcf4-ec2ebb3eba43,0,1,7059b117-714c-4710-aebe-76f88c4d41d5,7059b117-714c-4710-aebe-76f88c4d41d5,0,1,ea050453-4947-40dc-aa2a-503ddd1a235a,ea050453-4947-40dc-aa2a-503ddd1a235a,0,1,37d0e6d4-702e-46f5-ae87-4d393fa0c701,37d0e6d4-702e-46f5-ae87-4d393fa0c701,0,1,1e963c1e-f914-46e1-81d3-90d126fc6f8d,1e963c1e-f914-46e1-81d3-90d126fc6f8d,0,1,3a62d88e-9298-42c0-bd87-c749ecd01d19,3a62d88e-9298-42c0-bd87-c749ecd01d19,0,1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,abbf064e-c6ea-4712-930b-a9fef42e0ee1,0,1,fc13dd80-ce44-4ed1-a9d7-dae44602b954,fc13dd80-ce44-4ed1-a9d7-dae44602b954,0,1,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,a3fe224e-c3ef-4e30-90e4-c4ed5eb11824,0,1,433b23a1-a863-4775-b2f2-1384e8f3cbbb,433b23a1-a863-4775-b2f2-1384e8f3cbbb,0,1,a1677c47-b9a4-427a-972d-9bb2293445b6,a1677c47-b9a4-427a-972d-9bb2293445b6,0,1,e4a328c0-e73b-465d-ae36-38e5a71690fa,e4a328c0-e73b-465d-ae36-38e5a71690fa,0,1,85bebd81-a355-4010-889b-cff6f72dafcb,85bebd81-a355-4010-889b-cff6f72dafcb,0,1,49521f36-fd1b-47dd-81cc-48b6fb651e22,49521f36-fd1b-47dd-81cc-48b6fb651e22,0,1,bc946e21-53bb-4332-8c63-7b0aa78826eb,bc946e21-53bb-4332-8c63-7b0aa78826eb,0,1,4be2bdad-9a43-4593-acbc-a02e9144a89f,4be2bdad-9a43-4593-acbc-a02e9144a89f,0,1,eb4455f2-a5a0-44fb-8302-7312bc32df66,eb4455f2-a5a0-44fb-8302-7312bc32df66,0,1,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,cd6d2ab5-8e5c-4db3-8c8c-0526046a9b68,0,1,9f20e59e-7db8-466f-b965-7045fc3f1489,9f20e59e-7db8-466f-b965-7045fc3f1489,0,1,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,cb057756-d3f7-4c50-a9d0-bac9ca2abd46,0,1,89ac3d39-1915-4e67-a4e4-5a67a155cb75,89ac3d39-1915-4e67-a4e4-5a67a155cb75,0,1,d27b637d-5a51-49ff-bf73-343891534586,d27b637d-5a51-49ff-bf73-343891534586,0,1,b5a073a2-54e2-47c9-b533-f75fd2c9f343,b5a073a2-54e2-47c9-b533-f75fd2c9f343,0,1,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0c8571be-f9b6-4292-add9-980cfe7fa2ec,0,1,989b8ccd-bc05-48c1-9969-b3733028b65f,989b8ccd-bc05-48c1-9969-b3733028b65f,0,1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,6c70b13d-f9d0-459f-8d38-c01c11f356f1,0,1,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,3e427c09-79ed-45f7-b4c9-d9aa7ccc01b2,0,1,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,1a4dd1f5-c2d6-4e06-b428-ab7870810bf3,0,1,bf66612b-aec4-414b-bee6-9bcab145c7cc,bf66612b-aec4-414b-bee6-9bcab145c7cc,0,1,811f356f-554a-4a63-90b6-dedb5fec7c05,811f356f-554a-4a63-90b6-dedb5fec7c05,0,1,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,78fdbce8-8479-4edd-89c0-1bbaf8ffd482,0,1,8eb18de5-8283-4d0c-bb11-b882e78181d5,8eb18de5-8283-4d0c-bb11-b882e78181d5,0,1,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,1491cc2a-b3be-4bcc-a181-ce68d4b5d4cb,0,1,64a86d5d-f925-45ee-82da-76df1cc20729,64a86d5d-f925-45ee-82da-76df1cc20729,0,1,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,bbaed1bd-0eb7-4f2b-b844-ab79c1d0a091,0,1,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,2e7fbea4-57ac-4633-bb39-8725e57bc7ba,0,1,83ae9b22-20ff-4e94-9282-19daf2274328,83ae9b22-20ff-4e94-9282-19daf2274328,0,1,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,dcad5d84-6643-4f0b-9e6e-73fe343db4a7,0,1,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,e1ca1374-6dad-46d3-bb72-b67f3e6b1809,0,1,a92b2b70-7e69-49d1-b921-c9d1b0718f94,a92b2b70-7e69-49d1-b921-c9d1b0718f94,0,1,d57a3300-0f9f-4fe5-b627-01c96b723053,d57a3300-0f9f-4fe5-b627-01c96b723053,0,1,19f690a3-d27b-43c1-94b7-585fc628da05,19f690a3-d27b-43c1-94b7-585fc628da05,0,1,d375fac5-098c-42b5-a0bd-9a4ae7516ada,d375fac5-098c-42b5-a0bd-9a4ae7516ada,0,1,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,29034f3e-d2eb-44e0-ac85-f2ffaf14eb90,0,1,162137ef-dea2-4ace-9e67-897dad0e7c3d,162137ef-dea2-4ace-9e67-897dad0e7c3d,0,1,012fb2f1-1c15-4800-8968-78a90c2a1348,012fb2f1-1c15-4800-8968-78a90c2a1348,0,1,436162a0-263f-4126-aa3a-7508505cc4a8,436162a0-263f-4126-aa3a-7508505cc4a8,0,1,aec8f9e6-d177-45f5-ba55-2d662428c2ae,aec8f9e6-d177-45f5-ba55-2d662428c2ae,0,1,7dfdd08b-7cd9-480c-829d-97f5e7152eec,7dfdd08b-7cd9-480c-829d-97f5e7152eec,0,1,767176d4-4fe9-4de5-9246-59b7fec09c53,767176d4-4fe9-4de5-9246-59b7fec09c53,0,1,64752b64-80ae-4537-986a-d61423dc546b,64752b64-80ae-4537-986a-d61423dc546b,0,1,8e587969-0263-4789-a501-a6c2e102f88e,8e587969-0263-4789-a501-a6c2e102f88e,0,1,f26bfc01-7d8a-43a7-b869-c2deb18218e5,f26bfc01-7d8a-43a7-b869-c2deb18218e5,0,1,b0bf8af5-d824-459c-bc40-17495406af3c,b0bf8af5-d824-459c-bc40-17495406af3c,0,1,2c37e123-ea35-4501-93e1-2fa295444bec,2c37e123-ea35-4501-93e1-2fa295444bec,0,1,a997a430-3ea8-4fde-9f53-7b507a04c215,a997a430-3ea8-4fde-9f53-7b507a04c215,0,1,f648e19d-026b-4fa7-8e70-1866b27b94f8,f648e19d-026b-4fa7-8e70-1866b27b94f8,0,1,36475bf5-5da6-48ad-8077-4de4426f7e10,36475bf5-5da6-48ad-8077-4de4426f7e10,0,1,d32081fc-47d3-4e66-837e-705c94ba8ca8,d32081fc-47d3-4e66-837e-705c94ba8ca8,0,1,69c207c2-7699-4467-b127-286ecd6d0f29,69c207c2-7699-4467-b127-286ecd6d0f29,0,1,e33df42d-4c64-4475-8294-6b05ecdb4e02,e33df42d-4c64-4475-8294-6b05ecdb4e02,0,1,6094a0ed-2051-4649-ad75-dfeb389d3cbb,6094a0ed-2051-4649-ad75-dfeb389d3cbb,0,1,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,6944a7e2-b9a1-492f-a6f2-9bf31d97ec78,0,1,f3750ea4-5f9e-4ab3-9495-3f182ecff407,f3750ea4-5f9e-4ab3-9495-3f182ecff407,0,1,14002d51-87d4-4647-92ef-a9b1935cb666,14002d51-87d4-4647-92ef-a9b1935cb666,0,1,e941a39d-1f3c-4e6e-af17-75f92a15dd40,e941a39d-1f3c-4e6e-af17-75f92a15dd40,0,1,d9bbedcb-4872-4183-83c2-6c2aae9634b0,d9bbedcb-4872-4183-83c2-6c2aae9634b0,0,1,72c695c3-66f6-4aa8-8a39-737ec6967a1d,72c695c3-66f6-4aa8-8a39-737ec6967a1d,0,1,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,2beef1e0-7a59-407e-b454-ee2ec38ca4b3,0,1,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,b57a1d6f-8375-4d57-a2c1-f53e25318ddb,0,1,d5d11480-d5c7-4569-80c1-f872655ff084,d5d11480-d5c7-4569-80c1-f872655ff084,0,1,b1e45d36-08e9-430e-976b-03e6e3320c6a,b1e45d36-08e9-430e-976b-03e6e3320c6a,0,1,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,b5384eb7-40e4-4437-b96b-eab9b7b5b8f2,0,1,8e21374f-5a65-406c-856d-2040607da4bc,8e21374f-5a65-406c-856d-2040607da4bc,0,1,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,1b63cbbb-77b1-4e78-a4c7-ddea8ea7294d,0,1,3e5f5167-8978-4191-b0f6-6a262b848b95,3e5f5167-8978-4191-b0f6-6a262b848b95,0,1,ae3aef9e-df3b-4ebc-912d-2bc581063745,ae3aef9e-df3b-4ebc-912d-2bc581063745,0,1,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,5c4ecf15-b92d-4610-b2bb-f2331c5c7528,0,1,a8c09e65-6e10-4772-b264-6ead83d52fe3,a8c09e65-6e10-4772-b264-6ead83d52fe3,0,1,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,eb74ebf0-a9c6-4c4c-b279-5a46f40ea0d3,0,1,d5e1806b-9827-40ab-9cfa-23c22456d137,d5e1806b-9827-40ab-9cfa-23c22456d137,0,1,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,b57b186a-ec1e-46a2-87ae-6ba27793ebf6,0,1,d24170d7-5477-4ec8-acd2-0de8bd2067d6,d24170d7-5477-4ec8-acd2-0de8bd2067d6,0,1,f047da82-7574-4da4-b54e-480195280a11,f047da82-7574-4da4-b54e-480195280a11,0,1,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,4a749e8c-cb35-4bc4-9b31-fb5bc0eab474,0,1,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,da4a0c05-2285-434b-b7f8-83b2a0d7f23d,0,1,ecbe625a-55eb-437a-8dee-33fb034d4c0d,ecbe625a-55eb-437a-8dee-33fb034d4c0d,0,1,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,5d4cefac-5dc4-4d73-8b4b-900a8464fbb2,0,1,84796b00-79db-42ba-94d0-5bf543e09cd6,84796b00-79db-42ba-94d0-5bf543e09cd6,0,1,e85695f1-ec94-42ce-8f80-2bda4c90685b,e85695f1-ec94-42ce-8f80-2bda4c90685b,0,1,6f08cc54-d4b1-4c6f-96dc-e0b6891c81b6,6f08cc54-d4b1-4c6f-96dc-e0b6891c81b6,0,1,948b10b3-0d7c-4dca-8816-75eb86e7881b,948b10b3-0d7c-4dca-8816-75eb86e7881b,0,1,9de91b5a-98e4-414b-b650-b669b0159b49,9de91b5a-98e4-414b-b650-b669b0159b49,0,1,840dc727-288a-4bf2-8b1a-47629d28229c,840dc727-288a-4bf2-8b1a-47629d28229c,0,1,314ac8ca-8845-40c2-b844-91beb05fb601,314ac8ca-8845-40c2-b844-91beb05fb601,0,1,db15717d-1b6a-42fd-9b8f-959e1d5841e9,db15717d-1b6a-42fd-9b8f-959e1d5841e9,0,1,3de3948d-40ff-4e0d-8445-9bf49c916161,3de3948d-40ff-4e0d-8445-9bf49c916161,0,1,37ae1946-9436-47ef-8b8c-17ed0a24971c,37ae1946-9436-47ef-8b8c-17ed0a24971c,0,1,0d3cd7ca-089f-4858-a4a6-0ed373aa77bf,0d3cd7ca-089f-4858-a4a6-0ed373aa77bf,0,1,d844d861-fbe9-4391-89e3-00e505b33b33,d844d861-fbe9-4391-89e3-00e505b33b33,0,1,495ddb5f-f75d-46c9-b134-e925c814b890,495ddb5f-f75d-46c9-b134-e925c814b890,0,1,0a4ded35-1cfa-4e53-91c7-139ee0b94ade,0a4ded35-1cfa-4e53-91c7-139ee0b94ade,0,1,c0688817-fd73-4ead-b9dd-ec966780a2c2,c0688817-fd73-4ead-b9dd-ec966780a2c2,0,1,b1fbfbfe-766f-4018-9491-507748193808,b1fbfbfe-766f-4018-9491-507748193808,0,1,65d9f3a7-6258-49f3-8252-0a60e2735ff3,65d9f3a7-6258-49f3-8252-0a60e2735ff3,0,1,a0ba7e86-b894-4a63-8687-bb2a840fe1ab,a0ba7e86-b894-4a63-8687-bb2a840fe1ab,0,1,e55dfadb-8e12-4808-ad90-e891a4644548,e55dfadb-8e12-4808-ad90-e891a4644548,0,1,a792b3dc-ac80-492b-bd94-83eb0438ba9f,a792b3dc-ac80-492b-bd94-83eb0438ba9f,0,1,73a093ea-1927-483b-b6f5-8f0cbd253753,73a093ea-1927-483b-b6f5-8f0cbd253753,0,1,345f04c0-0274-4e79-b523-f1fa3cf0d92a,345f04c0-0274-4e79-b523-f1fa3cf0d92a,0,1,f3a14787-de1b-4b65-8cb1-bc33a785821c,f3a14787-de1b-4b65-8cb1-bc33a785821c,0,1,b9ba3ce3-9059-4135-9d31-725f01907431,b9ba3ce3-9059-4135-9d31-725f01907431,0,1,f637a14d-08ed-4c62-a873-ca36cdcd1e88,f637a14d-08ed-4c62-a873-ca36cdcd1e88,0,1,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,8afa9a0e-04c1-4cac-82bb-6767cc0594d9,0,1,4d2b3767-7c96-44a6-bb1b-ab74b103b90e,4d2b3767-7c96-44a6-bb1b-ab74b103b90e,0,1,fc9fc58f-c888-41f0-9f57-70748b21706e,fc9fc58f-c888-41f0-9f57-70748b21706e,0,1,fc761833-aa85-4c6d-a36c-d1ed060e3bb1,fc761833-aa85-4c6d-a36c-d1ed060e3bb1,0,1,f0ba2ff2-b353-4f84-8e45-23e47ee6c1b6,f0ba2ff2-b353-4f84-8e45-23e47ee6c1b6,0,1,bb8bade2-5c1b-49a6-b66f-79a3ebff86f7,bb8bade2-5c1b-49a6-b66f-79a3ebff86f7,0,1,33596560-3d45-4d3e-b6ec-1c22162110ad,33596560-3d45-4d3e-b6ec-1c22162110ad,0,1,d3e82a06-daae-4f4d-b3f8-45a406e31664,d3e82a06-daae-4f4d-b3f8-45a406e31664,0,1,af76c3c9-d8dc-4156-9e10-80ee02fcf4fe,af76c3c9-d8dc-4156-9e10-80ee02fcf4fe,0,1,ac6a184d-1247-4b54-a023-f0d16daa5fe9,ac6a184d-1247-4b54-a023-f0d16daa5fe9,0,1,f9af5fe6-0b4f-4d48-92a4-1f2a29972155,f9af5fe6-0b4f-4d48-92a4-1f2a29972155,0,1,3ca1682d-5ff5-4b2b-96c2-54d2dd5297a9,3ca1682d-5ff5-4b2b-96c2-54d2dd5297a9,0,1,a687d346-73cf-4aea-a4d0-f29824f0f6f1,a687d346-73cf-4aea-a4d0-f29824f0f6f1,0,1,f51fda72-56d9-4b45-a775-a0e1dfbf3a27,f51fda72-56d9-4b45-a775-a0e1dfbf3a27,0,1,8bf73614-81a4-4702-88b9-3c6f2594d204,8bf73614-81a4-4702-88b9-3c6f2594d204,0,1,b8d4410b-f626-41b8-87c8-67102256bae2,b8d4410b-f626-41b8-87c8-67102256bae2,0,1,484eeb5f-12af-4139-a081-4dcac067a712,484eeb5f-12af-4139-a081-4dcac067a712,0,1,ec61075e-fbcb-494a-b790-81548a212d2b,ec61075e-fbcb-494a-b790-81548a212d2b,0,1,2f3bdc3c-4c5d-4fcb-85bb-932fe1747d98,2f3bdc3c-4c5d-4fcb-85bb-932fe1747d98,0,1,0c444045-302b-4dbd-a9a3-81fd40004948,0c444045-302b-4dbd-a9a3-81fd40004948,0,1,16099d54-e84f-47c5-aaf3-f8ced3cba5e0,16099d54-e84f-47c5-aaf3-f8ced3cba5e0,0,1,39fce130-be22-42d9-8bcd-b162ae00fc7a,39fce130-be22-42d9-8bcd-b162ae00fc7a,0,1,1528b799-1c0f-4244-85e8-e738b827934a,1528b799-1c0f-4244-85e8-e738b827934a,0,1,45d79e4d-8c2a-432b-abb8-fb9046abea40,45d79e4d-8c2a-432b-abb8-fb9046abea40,0,1,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,8f4d2fa9-c6ed-4f85-b3ef-f9214468ffc4,0,1,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,cb73c8c2-3b09-42e9-ac26-1bd51854efb6,0,1,256618cc-0956-4cda-9691-e4ced68a791f,256618cc-0956-4cda-9691-e4ced68a791f,0,1,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,e20593fd-b3e3-41d2-8c8d-97b5d6148fa4,0,1,4b9771a7-b924-4e61-8468-4633e3c54706,4b9771a7-b924-4e61-8468-4633e3c54706,0,1,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,bc846fc8-3c67-45f8-9c5c-69bf1190baf9,0,1,667de710-cee5-4a97-8434-641d199f3b68,667de710-cee5-4a97-8434-641d199f3b68,0,1,f6e85eeb-d81b-4526-9a33-ab77bd447236,f6e85eeb-d81b-4526-9a33-ab77bd447236,0,1,470e37fe-d149-4007-b397-12fc84f93041,470e37fe-d149-4007-b397-12fc84f93041,0,1,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,f8d9068d-8a4e-4b23-b5ca-5b9ddce1f60f,0,1,7175cfa0-885c-4807-98ec-af255dcd55d9,7175cfa0-885c-4807-98ec-af255dcd55d9,0,1,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,1773ff66-ebe4-46e1-b505-d07d87c7fe3e,0,1,f5b66759-8102-4cba-a3fd-ee96db5bc809,f5b66759-8102-4cba-a3fd-ee96db5bc809,0,1,6c205eae-9113-46c1-a245-25d29173646e,6c205eae-9113-46c1-a245-25d29173646e,0,1,4cc4aa90-49fb-4602-9f9c-d4d47d223988,4cc4aa90-49fb-4602-9f9c-d4d47d223988,0,1,66ef1631-277b-4c22-99d7-1434b4dbbb3f,66ef1631-277b-4c22-99d7-1434b4dbbb3f,0,1,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,7cfa5a37-b9f8-43e4-ae33-e3a7251dd052,0,1,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,2f8a5b9d-ab86-492b-85d1-5a28535b2ebc,0,1,898535ff-50cd-464a-aadc-5e4f9de15b04,898535ff-50cd-464a-aadc-5e4f9de15b04,0,1,737f6f1b-9ffc-4916-b378-7321eab1f886,737f6f1b-9ffc-4916-b378-7321eab1f886,0,1,01dedf5b-2cce-4d24-81ea-2e3af82f5794,01dedf5b-2cce-4d24-81ea-2e3af82f5794,0,1,385e209d-65aa-43b1-8591-f92544882740,385e209d-65aa-43b1-8591-f92544882740,0,1,8381bc76-0e0f-4196-9911-ec05730cb1c9,8381bc76-0e0f-4196-9911-ec05730cb1c9,0,1,c224e520-7204-4f4a-aac9-b6221ea9ce44,c224e520-7204-4f4a-aac9-b6221ea9ce44,0,1,771a1900-46be-49fe-a02d-584780de8363,771a1900-46be-49fe-a02d-584780de8363,0,1,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,f81b1f2d-6fde-4861-8fee-1dbe6acf3985,0,1,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,b62eecf6-6ee3-4a70-a4d6-3f064ae35c43,0,1,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,9bf2525c-e8fc-44e6-ac14-7df3208dbb0f,0,1,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,a2faa3f8-5064-4fbf-a90e-26d15c021cd3,0,1,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,527ea8ca-e723-454a-8e9e-f2e7a38e62ee,0,1,ef257b20-da10-4cda-8b9d-7de2d68a2f71,ef257b20-da10-4cda-8b9d-7de2d68a2f71,0,1,de0d41b7-acc0-4ebc-8933-d6b5ad351860,de0d41b7-acc0-4ebc-8933-d6b5ad351860,0,1,04013c34-8d59-4f87-b272-732d5a6dd675,04013c34-8d59-4f87-b272-732d5a6dd675,0,1,7fffceb9-8725-46ab-b797-ad7aa67f1075,7fffceb9-8725-46ab-b797-ad7aa67f1075,0,1,f9df9b6b-5051-46ef-bb1f-1974f41054a7,f9df9b6b-5051-46ef-bb1f-1974f41054a7,0,1,005b3f60-d740-4670-b522-8c352958889e,005b3f60-d740-4670-b522-8c352958889e,0,1,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,9ef5dd5e-1f26-4187-90a0-a3ac7aaabc1d,0,1,1a354069-07ea-40e0-bbac-e1b6232750c2,1a354069-07ea-40e0-bbac-e1b6232750c2,0,1,df31548b-0b8e-412b-999a-761970ae3c23,df31548b-0b8e-412b-999a-761970ae3c23,0,1,05135747-43e7-4b61-bc30-57b3289ea923,05135747-43e7-4b61-bc30-57b3289ea923,0,1,6d63728d-3384-4131-b890-1b82d14a04b7,6d63728d-3384-4131-b890-1b82d14a04b7,0,1,6da034af-0481-4a3c-aff9-c50ced6f21d4,6da034af-0481-4a3c-aff9-c50ced6f21d4,0,1,6fe57ea6-fe5e-48b1-bb31-5d42e4c2c6c7,6fe57ea6-fe5e-48b1-bb31-5d42e4c2c6c7,0,1,d07016c8-7d97-42cd-865b-85b49075adfb,d07016c8-7d97-42cd-865b-85b49075adfb,0,1,9202335d-50bb-4282-9438-24c7fb9cf637,9202335d-50bb-4282-9438-24c7fb9cf637,0,1,a62906e5-27f8-4e72-8769-9a3eed6997d7,a62906e5-27f8-4e72-8769-9a3eed6997d7,0,1,6c5d0ac3-6086-434c-812b-1c1158ecc574,6c5d0ac3-6086-434c-812b-1c1158ecc574,0,1,783536d7-c0db-44c9-96e8-58b57804d7c8,783536d7-c0db-44c9-96e8-58b57804d7c8,0,1,a8295435-c2c4-4aff-874b-7412556aa76d,a8295435-c2c4-4aff-874b-7412556aa76d,0,1,f6c4e24b-172b-4ba3-8e3e-988306ade660,f6c4e24b-172b-4ba3-8e3e-988306ade660,0,1,9baab24c-a5a3-46f4-ad17-a28d4a49f851,9baab24c-a5a3-46f4-ad17-a28d4a49f851,0,1,d1952319-0e42-4684-a386-fbe7c24526c2,d1952319-0e42-4684-a386-fbe7c24526c2,0,1,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,01cd59fc-8577-4b3c-9d69-6db75e81e7c4,0,1,83b47a9d-d44b-4c40-becd-df74f9cb2e91,83b47a9d-d44b-4c40-becd-df74f9cb2e91,0,1,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,d03e636e-ff88-4e96-bf3c-d795d10cbcb0,0,1,86e2a2eb-160f-4e93-a449-b2f726286d1b,86e2a2eb-160f-4e93-a449-b2f726286d1b,0,1,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,8e6e1f24-83bf-42c2-9eda-b3874c7910c3,0,1,364184c2-ec71-44be-b40c-ba719b4ab0e1,364184c2-ec71-44be-b40c-ba719b4ab0e1,0,1,7ef46c54-ec0c-4211-a750-e5949956b593,7ef46c54-ec0c-4211-a750-e5949956b593,0,1,04823681-875e-459a-b3cf-051c89527f38,04823681-875e-459a-b3cf-051c89527f38,0,1,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,8e115a0c-a17c-4d7e-bd2c-305fb53d09ca,0,1,38265f08-3301-40d1-b630-a319c983e826,38265f08-3301-40d1-b630-a319c983e826,0,1,5175c496-bac7-4c57-9628-793b727aecd0,5175c496-bac7-4c57-9628-793b727aecd0,0,1,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,1453309e-77d0-444d-ac3f-fd7c2cb65c0c,0,1,fc42df4a-93f0-461f-acfe-fea09158030f,fc42df4a-93f0-461f-acfe-fea09158030f,0,1,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,9f0a7909-0b97-48a7-964f-a52cb3c19c4e,0,1,6d002aef-00c9-4069-80df-153151218831,6d002aef-00c9-4069-80df-153151218831,0,1,4fec3a6c-5a99-4763-aa07-d5de8712559e,4fec3a6c-5a99-4763-aa07-d5de8712559e,0,1,968a1202-d271-43e0-bfd4-d38e49ceadd4,968a1202-d271-43e0-bfd4-d38e49ceadd4,0,1,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,c80e2ef7-93b6-4cef-806a-2dfcf2fd80e6,0,1,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,b3b4fbf1-cbf0-4ee2-a490-4d657693479b,0,1,ea61e442-273e-4ce4-a806-8090893729ba,ea61e442-273e-4ce4-a806-8090893729ba,0,1,e7100f2b-d169-4635-ab87-7a2225ff12ee,e7100f2b-d169-4635-ab87-7a2225ff12ee,0,1,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,d6bd5459-6f95-4f9c-8d84-c67bdc716acf,0,1,4a2d2790-debf-4dc2-8216-878d8808d161,4a2d2790-debf-4dc2-8216-878d8808d161,0,1,836d0590-a8ee-40d0-a649-41cf4fae36a6,836d0590-a8ee-40d0-a649-41cf4fae36a6,0,1,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,6dcbb379-d4f5-418a-a3ab-bb7c0e169058,0,1,6ddbc80a-38c8-4eda-8cdf-6d64331818a3,6ddbc80a-38c8-4eda-8cdf-6d64331818a3,0,1,eda3c675-04b7-4c14-b78a-0caa22843ac0,eda3c675-04b7-4c14-b78a-0caa22843ac0,0,1,fc097ab3-8b3e-4b8f-9e51-d888735a69bd,fc097ab3-8b3e-4b8f-9e51-d888735a69bd,0,1,23c2c28b-867e-41d0-ba61-b9ee20fa38d1,23c2c28b-867e-41d0-ba61-b9ee20fa38d1,0,1,e5ddc65a-e886-4ed6-9598-bec30ddb7341,e5ddc65a-e886-4ed6-9598-bec30ddb7341,0,1,6cf48813-8097-44ae-8630-58f5b002ff31,6cf48813-8097-44ae-8630-58f5b002ff31,0,1,e0cee0ee-24b9-400a-95af-c61debec912b,e0cee0ee-24b9-400a-95af-c61debec912b,0,1,578bc873-5e23-4222-a655-7d653d761a4c,578bc873-5e23-4222-a655-7d653d761a4c,0,1,09bccd03-1492-4ebe-bfb4-8ace744d367f,09bccd03-1492-4ebe-bfb4-8ace744d367f,0,1,4d9294db-1abd-4e34-812f-fdcac0cf657d,4d9294db-1abd-4e34-812f-fdcac0cf657d,0,1,14bc3be4-3075-418d-90ec-be5d2686f875,14bc3be4-3075-418d-90ec-be5d2686f875,0,1,adffd81c-a566-4b4f-89d5-6abc705da36f,adffd81c-a566-4b4f-89d5-6abc705da36f,0,1,9f67e6d4-0b7c-4318-b127-7c8b7daf1d1b,9f67e6d4-0b7c-4318-b127-7c8b7daf1d1b,0,1,23ced9be-cb9d-451f-aea7-aa211054bd4d,23ced9be-cb9d-451f-aea7-aa211054bd4d,0,1,3991175c-0152-44c6-8e1c-4090d960050a,3991175c-0152-44c6-8e1c-4090d960050a,0,1,aa2760cf-b8cd-4eb3-b2f1-0e1fbdec09a8,aa2760cf-b8cd-4eb3-b2f1-0e1fbdec09a8,0,1,d1fabcdd-c072-4341-85d4-9a9ba168f301,d1fabcdd-c072-4341-85d4-9a9ba168f301,0,1,030a9c93-322b-4421-ad70-0acaa94870a2,030a9c93-322b-4421-ad70-0acaa94870a2,0,1,7121d241-9450-4bf2-b7ff-a0e963bbfd0a,7121d241-9450-4bf2-b7ff-a0e963bbfd0a,0,1,01a3ab71-56fa-4ddc-a5a3-9c923ee9c74a,01a3ab71-56fa-4ddc-a5a3-9c923ee9c74a,0,1,5c660f50-c63a-466d-bb32-de5699ad8a95,5c660f50-c63a-466d-bb32-de5699ad8a95,0,1,032587fa-2993-463c-af9f-bdd67f12604f,032587fa-2993-463c-af9f-bdd67f12604f,0,1,64d4aaed-e068-431b-bed0-faef7b5358f3,64d4aaed-e068-431b-bed0-faef7b5358f3,0,1,4507a92e-abb6-4329-88b2-3429bc694bc6,4507a92e-abb6-4329-88b2-3429bc694bc6,0,1,2694c1b4-536b-4187-adf6-0f8757aaae76,2694c1b4-536b-4187-adf6-0f8757aaae76,0,1,e523f88b-b3de-476e-a3cc-592970492dec,e523f88b-b3de-476e-a3cc-592970492dec,0,1,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,efb6b3b6-d57b-469f-a7c2-f4e0308d0c7f,0,1,00c29d0d-338a-4eb0-9e0f-5b64f6521e6e,00c29d0d-338a-4eb0-9e0f-5b64f6521e6e,0,1,ea0843f4-60fb-4d44-abf4-0021867c636b,ea0843f4-60fb-4d44-abf4-0021867c636b,0,1,59aadc03-adbc-481f-89bc-d7f391789522,59aadc03-adbc-481f-89bc-d7f391789522,0,1,254f6ccd-0451-4231-91c9-4abe57b647be,254f6ccd-0451-4231-91c9-4abe57b647be,0,1,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,1e2d790c-0076-413a-b5fb-f25c01ab6ad5,0,1,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0dcc537b-76b3-4e73-b060-6cbdcf6345db,0,1,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,ae662b53-e11e-4b59-be52-b9d4ab00c4a4,0,1,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,ce55df94-71e4-46ac-9b3b-bdae5d336b0a,0,1,7601fa7e-079a-4347-abea-e161b2d00783,7601fa7e-079a-4347-abea-e161b2d00783,0,1,ee84cb40-f82d-4558-91be-229d68ad9f4a,ee84cb40-f82d-4558-91be-229d68ad9f4a,0,1,101a7eff-9556-4165-879a-a7c8a852e236,101a7eff-9556-4165-879a-a7c8a852e236,0,1,01775932-3603-4efc-9235-abdb97490dea,01775932-3603-4efc-9235-abdb97490dea,0,1,7637844b-4059-4f8a-8436-b4f4e8cb4f74,7637844b-4059-4f8a-8436-b4f4e8cb4f74,0,1,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,b6bb4cbe-b6fa-4d28-b372-0b959951ad4d,0,1,0ee5b788-61dc-464b-86da-f985df7704b6,0ee5b788-61dc-464b-86da-f985df7704b6,0,1,2375c6a8-9799-4b7c-a48d-091a90c67693,2375c6a8-9799-4b7c-a48d-091a90c67693,0,1,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,3d3c3360-4502-4ad4-bbe9-35d4ba9b54b3,0,1,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,9b0671c6-6e92-42e6-9cf4-13d4be11f27d,0,1,63c6522f-be04-422a-b4f4-0f55f58b09a8,63c6522f-be04-422a-b4f4-0f55f58b09a8,0,1,be919dc1-a377-43e1-82e6-ce946cabdd55,be919dc1-a377-43e1-82e6-ce946cabdd55,0,1,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,6b17a0fc-4d6f-4189-9067-c58a95f04dd7,0,1,9ded532e-9e60-4895-a4c5-4ea6697aa83c,9ded532e-9e60-4895-a4c5-4ea6697aa83c,0,1,106c5159-ffc7-4059-b3e3-acf74326a44f,106c5159-ffc7-4059-b3e3-acf74326a44f,0,1,d39fd717-1a69-4fd3-889e-4fa9abefea1c,d39fd717-1a69-4fd3-889e-4fa9abefea1c,0,1,5b85e6df-7493-4201-97ad-2aea14de6006,5b85e6df-7493-4201-97ad-2aea14de6006,0,1,061e6c0f-ba52-40ec-96ad-2eba3eee3097,061e6c0f-ba52-40ec-96ad-2eba3eee3097,0,1,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,d77e3c65-e9fd-4ba7-885f-a8a2f4c827d2,0,1,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,4fb86bf3-02ad-4f0e-85a9-98be6c350a06,0,1,4840753b-e2e1-4e67-b35f-2f5eab7754f5,4840753b-e2e1-4e67-b35f-2f5eab7754f5,0,1,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,4095c9e7-83ab-4db9-a2d0-a9f4ef9ee53e,0,1,6ffd9c17-d90b-4d19-b337-0fbc2c717557,6ffd9c17-d90b-4d19-b337-0fbc2c717557,0,1,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,9a11a6bd-0c13-4be2-9e34-b12b7554f3c9,0,1,3bb83275-7a0e-420f-8c6b-028038f11a8c,3bb83275-7a0e-420f-8c6b-028038f11a8c,0,1,e1950a23-f6e7-48af-b78a-77aa61f08ece,e1950a23-f6e7-48af-b78a-77aa61f08ece,0,1,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,1cc3d7c4-9178-4a40-86ea-2bbc1f5aa69f,0,1,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,790735cf-f6e2-4b0d-bb16-c5b9ea95efae,0,1,5d726fa3-bde0-4d97-a577-415857bbb5c1,5d726fa3-bde0-4d97-a577-415857bbb5c1,0,1,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,f63d0e2d-4685-4ac5-b22c-1b83e3ab955f,0,1,49068231-202c-4ac6-a39a-69207cb597dd,49068231-202c-4ac6-a39a-69207cb597dd,0,1,5a470575-e012-42ad-9ad7-53930a8e843f,5a470575-e012-42ad-9ad7-53930a8e843f,0,1,5872d4ed-6503-422d-bcf9-63a8df3e777d,5872d4ed-6503-422d-bcf9-63a8df3e777d,0,1,e21cda29-2579-485e-a207-20b76f719c80,e21cda29-2579-485e-a207-20b76f719c80,0,1,1b232a57-2833-42c6-b318-38dae2af1ab2,1b232a57-2833-42c6-b318-38dae2af1ab2,0,1,007ade8c-b102-408b-b877-b531e046560b,007ade8c-b102-408b-b877-b531e046560b,0,1,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,a8dfea6c-0c21-456d-96ab-f4bb5d579b13,0,1,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,305f1ef1-4f9c-40a2-a978-3a4c0ecf75d4,0,1,eb69c41a-392d-43bb-9b67-a0adcb651b1e,eb69c41a-392d-43bb-9b67-a0adcb651b1e,0,1,93b01c88-48a2-4753-b443-0e9892395a8f,93b01c88-48a2-4753-b443-0e9892395a8f,0,1,0b7f8e05-bb34-47cc-9775-04362e814316,0b7f8e05-bb34-47cc-9775-04362e814316,0,1,e71e0297-3709-4247-933e-18a6350cbf39,e71e0297-3709-4247-933e-18a6350cbf39,0,1,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0b32e372-c6ad-4dda-acd1-8b5d58537d37,0,1,602dac6f-abe6-407a-92d3-7f1613e5dda6,602dac6f-abe6-407a-92d3-7f1613e5dda6,0,1,df6417d1-c722-4a87-a543-5d2c31795b20,df6417d1-c722-4a87-a543-5d2c31795b20,0,1,526a85c9-3a8d-4044-adb9-fd0689c70601,526a85c9-3a8d-4044-adb9-fd0689c70601,0,1,c4203772-580c-4db1-9bde-8925faa90688,c4203772-580c-4db1-9bde-8925faa90688,0,1,9ab0fe18-4dd7-4eed-958d-8537d4896d84,9ab0fe18-4dd7-4eed-958d-8537d4896d84,0,1,2278dc46-46ce-4d00-9289-4de1640782d7,2278dc46-46ce-4d00-9289-4de1640782d7,0,1,1f983a04-c2df-40bb-bee2-b326474d89f8,1f983a04-c2df-40bb-bee2-b326474d89f8,0,1,f03f1b68-e924-4c06-b0aa-8033a9a2f592,f03f1b68-e924-4c06-b0aa-8033a9a2f592,0,1,5e453d10-235d-4e53-86b1-20eed3247992,5e453d10-235d-4e53-86b1-20eed3247992,0,1,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0eefb856-0fb4-4c3e-bb08-e88b03a44065,0,1,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,21ba8b9f-de97-40a1-8ea1-85a29e8e53ef,0,1,738228ad-c30a-42f4-a6ad-bde0edba6266,738228ad-c30a-42f4-a6ad-bde0edba6266,0,1,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,c08aea99-ee33-488c-9ba0-f8b24a6d1d04,0,1,df8e8344-d7bc-4cf2-b498-88d3abb66c09,df8e8344-d7bc-4cf2-b498-88d3abb66c09,0,1,e6d13536-3021-45b2-a8e1-bdb0e0be850c,e6d13536-3021-45b2-a8e1-bdb0e0be850c,0,1,b49f538c-b2b2-4a1f-a6b4-a911033b1666,b49f538c-b2b2-4a1f-a6b4-a911033b1666,0,1,794e952b-6b03-4a1e-ad3f-453376bccf45,794e952b-6b03-4a1e-ad3f-453376bccf45,0,1,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,3e2a0713-e6ed-4d38-8036-72f7b62ca64a,0,1,5cd997ba-f123-47b3-8cde-fbba45a4a11c,5cd997ba-f123-47b3-8cde-fbba45a4a11c,0,1,0d746247-c4f4-47a5-a373-45ec4023d3ef,0d746247-c4f4-47a5-a373-45ec4023d3ef,0,1,a25bcf4e-1a47-472b-9f93-f6ab45abf461,a25bcf4e-1a47-472b-9f93-f6ab45abf461,0,1,958b7dab-0aba-423f-ab81-b70f2b93a027,958b7dab-0aba-423f-ab81-b70f2b93a027,0,1,a17ec3be-2255-42af-a6ee-d3fb8bb00519,a17ec3be-2255-42af-a6ee-d3fb8bb00519,0,1,add0b22d-ff5a-41f7-88a1-ef34880e50c9,add0b22d-ff5a-41f7-88a1-ef34880e50c9,0,1,7dc10935-69aa-4f2b-8b01-798dbbaa6cc6,7dc10935-69aa-4f2b-8b01-798dbbaa6cc6,0,1,9c15b35b-d658-4e52-a441-3b79294d65eb,9c15b35b-d658-4e52-a441-3b79294d65eb,0,1,d5fdac2a-e3aa-4859-8485-0cf114748c87,d5fdac2a-e3aa-4859-8485-0cf114748c87,0,1,eb3d278b-e8fe-4d43-90a8-dd361009196f,eb3d278b-e8fe-4d43-90a8-dd361009196f,0,1,d30fbeae-e97f-422d-b5c4-289aaeaa2ae4,d30fbeae-e97f-422d-b5c4-289aaeaa2ae4,0,1,a3582d0c-6a63-442e-8422-83f251df0ed9,a3582d0c-6a63-442e-8422-83f251df0ed9,0,1,9aae5d2a-81b7-4f1c-8b65-b3e4a8a9bc4d,9aae5d2a-81b7-4f1c-8b65-b3e4a8a9bc4d,0,1,4b714d9c-26f4-46e8-ac79-471522b3853b,4b714d9c-26f4-46e8-ac79-471522b3853b,0,1,411489de-f907-4d60-a776-64bb0aa12a0e,411489de-f907-4d60-a776-64bb0aa12a0e,0,1,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,58d9ba60-a0c7-405d-a76e-0b0a796daaf3,0,1,9c47670e-9eb9-49ec-876c-cd545aaa093c,9c47670e-9eb9-49ec-876c-cd545aaa093c,0,1,f57e74e6-75e8-4136-911e-86793036a077,f57e74e6-75e8-4136-911e-86793036a077,0,1,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,8492ee20-3f15-45d8-b70d-19b5cd6f1ae3,0,1,3ba8c378-ef3d-4646-90b3-6d8078aa623e,3ba8c378-ef3d-4646-90b3-6d8078aa623e,0,1,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,b96b2e45-8fb3-4d48-ab53-d3bbf6ef0284,0,1,2dd7eb87-8130-425a-be13-85235508cde6,2dd7eb87-8130-425a-be13-85235508cde6,0,1,8a62c997-4fda-4464-90bd-ab719161949f,8a62c997-4fda-4464-90bd-ab719161949f,0,1,28af52dd-3144-428b-956d-b6f27863ec4a,28af52dd-3144-428b-956d-b6f27863ec4a,0,1,c34c330a-991a-4ec9-a0ad-73c04c6a6fc3,c34c330a-991a-4ec9-a0ad-73c04c6a6fc3,0,1,8ac94328-2300-4681-9c35-fd7e2f830310,8ac94328-2300-4681-9c35-fd7e2f830310,0,1,da0ee165-1917-466b-ac5c-16c28e2318bb,da0ee165-1917-466b-ac5c-16c28e2318bb,0,1,4868cb2e-0892-42bc-9de1-73cb8a15a96f,4868cb2e-0892-42bc-9de1-73cb8a15a96f,0,1,e8b80879-33b3-4c45-ad68-1acabcf91faf,e8b80879-33b3-4c45-ad68-1acabcf91faf,0,1,239601eb-e8de-4d58-a32a-01ee52f6e698,239601eb-e8de-4d58-a32a-01ee52f6e698,0,1,11370667-bec5-4a2d-8aa1-97f4d795718f,11370667-bec5-4a2d-8aa1-97f4d795718f,0,1,2032162d-fbb5-4e6a-be72-cda79869b9ff,2032162d-fbb5-4e6a-be72-cda79869b9ff,0,1,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,95a8e790-25ef-4ef3-a44a-f150bf1ceb1f,0,1,10543f9a-4e3f-427a-b36a-9c66709dd6fb,10543f9a-4e3f-427a-b36a-9c66709dd6fb,0,1,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,973967e5-1702-4fb8-ba36-70fd5b3b7e7c,0,1,96ab5424-7be1-416d-b74d-d0c815726b1f,96ab5424-7be1-416d-b74d-d0c815726b1f,0,1,3714e794-ddef-4ad9-a933-6130bbc84545,3714e794-ddef-4ad9-a933-6130bbc84545,0,1,282b089c-7411-40d6-9a0a-ceaf6abb5586,282b089c-7411-40d6-9a0a-ceaf6abb5586,0,1,678188aa-76e7-49bc-a4be-1c55ccd625b1,678188aa-76e7-49bc-a4be-1c55ccd625b1,0,1,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,6c27eece-2f8e-48eb-b9c7-f9c414ee15bd,0,1,b3415b4a-d8de-4536-aa4b-82e75fd986ee,b3415b4a-d8de-4536-aa4b-82e75fd986ee,0,1,acc996ab-672a-4602-b7ad-8eee83557e61,acc996ab-672a-4602-b7ad-8eee83557e61,0,1,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,bf9e9c2f-e5dc-4f82-8e9a-7f35e3ad9a0b,0,1,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,371361b6-15fd-4e62-9f60-cc8ee3fbacf0,0,1,97745768-ed35-44f1-beba-abb8b28a29ae,97745768-ed35-44f1-beba-abb8b28a29ae,0,1,69364942-bcd1-4b06-9b57-fa59b4e7c552,69364942-bcd1-4b06-9b57-fa59b4e7c552,0,1,ab201c5f-4134-42cf-a528-c1c4df02f2d7,ab201c5f-4134-42cf-a528-c1c4df02f2d7,0,1,303fb7b5-6a23-40ea-ae12-b54f4ebae026,303fb7b5-6a23-40ea-ae12-b54f4ebae026,0,1,634cd26b-78f1-4446-8aad-b96ed16e5329,634cd26b-78f1-4446-8aad-b96ed16e5329,0,1,d8e62f1a-92ca-4971-9609-e79da798c083,d8e62f1a-92ca-4971-9609-e79da798c083,0,1,6b0ddefa-ee70-4b27-989f-e23c734ab943,6b0ddefa-ee70-4b27-989f-e23c734ab943,0,1,ee873280-28ea-41fb-af52-c10c2018cbe4,ee873280-28ea-41fb-af52-c10c2018cbe4,0,1,a388ed70-a68d-4713-a280-881315351f07,a388ed70-a68d-4713-a280-881315351f07,0,1,fd9e84c9-2322-4aa7-b5fe-31d0c8f373c7,fd9e84c9-2322-4aa7-b5fe-31d0c8f373c7,0,1,2c81edc8-02b9-42dd-be4d-e7ad595421a0,2c81edc8-02b9-42dd-be4d-e7ad595421a0,0,1,83cb38ff-1174-449f-b8ce-44d5e064f2df,83cb38ff-1174-449f-b8ce-44d5e064f2df,0,1,d11b51ac-708a-4ee1-b73e-ae62e162101e,d11b51ac-708a-4ee1-b73e-ae62e162101e,0,1,17a50950-6091-4306-9f15-2a621a29c1a0,17a50950-6091-4306-9f15-2a621a29c1a0,0,1,32012b27-1b43-49be-b9af-df0c877e7a4c,32012b27-1b43-49be-b9af-df0c877e7a4c,0,1,e97d5152-9e58-4a91-a691-b4d358f1c89d,e97d5152-9e58-4a91-a691-b4d358f1c89d,0,1,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,1de4d7ee-7ddd-44db-bf7f-1b99b653652c,0,1,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,dfe624ac-9f49-46dd-b821-1f1f5b5e0d15,0,1,296c478b-4103-46cb-9d14-97f59034ffd4,296c478b-4103-46cb-9d14-97f59034ffd4,0,1,fb918a68-f86d-46c0-9078-61d2b32b5aef,fb918a68-f86d-46c0-9078-61d2b32b5aef,0,1,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,9ca4d0c4-f5d3-4748-bf73-f3cd1bc4ac46,0,1,1ddfc773-4f3c-4764-978e-585aab4666de,1ddfc773-4f3c-4764-978e-585aab4666de,0,1,e424d122-1dbb-4545-975c-177997129f2e,e424d122-1dbb-4545-975c-177997129f2e,0,1,c83bc626-dfdd-4451-92b0-b53eed40f534,c83bc626-dfdd-4451-92b0-b53eed40f534,0,1,7b9b1d11-4f78-4113-8fca-1a3a30953aef,7b9b1d11-4f78-4113-8fca-1a3a30953aef,0,1,7f84cb85-c3e4-4b53-b829-3b1e216f978a,7f84cb85-c3e4-4b53-b829-3b1e216f978a,0,1,7e621ecc-7d2b-42bf-a502-f8e59de56b63,7e621ecc-7d2b-42bf-a502-f8e59de56b63,0,1,798fd445-d02e-4e97-890a-0283f33317cf,798fd445-d02e-4e97-890a-0283f33317cf,0,1,095583ca-010d-43ad-8c7a-8938fa4cb761,095583ca-010d-43ad-8c7a-8938fa4cb761,0,1,178d210c-e847-4805-a8d4-31acdf4983af,178d210c-e847-4805-a8d4-31acdf4983af,0,1,aa214d9f-23b1-4996-8a43-9010dceeb53d,aa214d9f-23b1-4996-8a43-9010dceeb53d,0,1,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,26a5527e-dc2b-45a4-a51c-b1dfb31fa8a2,0,1,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,aefc3149-90ee-4ccc-8fb6-b1f6096237f6,0,1,d9d103bd-1dd6-48a9-8869-6c8485705393,d9d103bd-1dd6-48a9-8869-6c8485705393,0,1,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,cf2f7e1f-9b0b-4ae9-9c94-99d80bf95eae,0,1,ff0e8487-bdbf-4b21-877e-00008c81bc09,ff0e8487-bdbf-4b21-877e-00008c81bc09,0,1,39c9f8ac-56a0-4057-8359-7228bf97184a,39c9f8ac-56a0-4057-8359-7228bf97184a,0,1,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,763fbb4c-cab2-4c71-ba16-7e2ce8c3dc97,0,1,2c0dd892-1d3e-4497-850b-080bdb9c59d8,2c0dd892-1d3e-4497-850b-080bdb9c59d8,0,1,3b727d49-c9ed-4d9e-af61-c13b9a170c75,3b727d49-c9ed-4d9e-af61-c13b9a170c75,0,1,1b264744-bdcd-4c5c-932b-0ac4b990dd78,1b264744-bdcd-4c5c-932b-0ac4b990dd78,0,1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,a2dbf20e-1fe9-463d-8fd4-76ce2e4854d1,0,1,37bde288-8e02-4127-bd80-de8ae7590a14,37bde288-8e02-4127-bd80-de8ae7590a14,0,1,a9b8e517-78cd-4428-b2fc-9e16af0069d7,a9b8e517-78cd-4428-b2fc-9e16af0069d7,0,1,5c592024-c009-4674-bbb8-283669e673ef,5c592024-c009-4674-bbb8-283669e673ef,0,1,e76f16b9-77a0-4033-90d0-6e04e4494747,e76f16b9-77a0-4033-90d0-6e04e4494747,0,1,cfb221fc-8639-4e15-9a78-f7837d657a99,cfb221fc-8639-4e15-9a78-f7837d657a99,0,1,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,4e61c8c3-756e-4937-adf6-6a1e9a89fc6a,0,1,022147c1-1ebe-4c8d-b367-4c47115b101d,022147c1-1ebe-4c8d-b367-4c47115b101d,0,1,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,2975d4c8-90d8-4791-8bc2-4adaa328ddc0,0,1,fca6b230-a38e-4791-9cc5-3d215f79dc6f,fca6b230-a38e-4791-9cc5-3d215f79dc6f,0,1,04e87de4-940a-4533-8c81-8f145b201dc0,04e87de4-940a-4533-8c81-8f145b201dc0,0,1,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,573ef4f4-e9e6-4b7c-944d-30808a6a00b7,0,1,fa488af9-a5ec-47d8-8661-fa5058a60a6b,fa488af9-a5ec-47d8-8661-fa5058a60a6b,0,1,97cc84c6-3565-474c-a028-83acb5390446,97cc84c6-3565-474c-a028-83acb5390446,0,1,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,9bf07c3e-7fdf-4a4f-ab00-98c7668349bd,0,1,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,ebbf6957-6ff6-4dc2-9e20-23d1da091f05,0,1,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,9b80acf6-6bf0-42c4-abb3-2fa2fcf4088c,0,1,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,1dcec107-9d5f-4b69-ad65-cc4cb1f27a9c,0,1,b366d7eb-626c-4c0c-b4cc-c392763e6e94,b366d7eb-626c-4c0c-b4cc-c392763e6e94,0,1,4c7e24aa-726a-4595-82ad-ef1e525b14fa,4c7e24aa-726a-4595-82ad-ef1e525b14fa,0,1,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,b9e5bb39-ed0a-4e12-b7e4-2d9b5015bf9c,0,1,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,dbced4aa-6432-4f0c-a99a-5a3e7b0f6755,0,1,e849e46c-2ce6-427b-92bc-06d7997f59bf,e849e46c-2ce6-427b-92bc-06d7997f59bf,0,1,5a971dc0-28bf-4426-9426-9f456aea080a,5a971dc0-28bf-4426-9426-9f456aea080a,0,1,1e7684f0-1b3b-4a32-8602-dd0672c5a800,1e7684f0-1b3b-4a32-8602-dd0672c5a800,0,1,ab178a93-8570-43b6-ae42-f34a7cc4f359,ab178a93-8570-43b6-ae42-f34a7cc4f359,0,1,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,4c82f31d-7a98-47dd-89dc-1846cb15bf3b,0,1,168e3189-2676-4cdb-bc9d-78d85df51faf,168e3189-2676-4cdb-bc9d-78d85df51faf,0,1,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,ecf1a87f-4ca4-4efb-a84c-b2db1b0e8829,0,1,470bbff8-20d0-475c-a61a-1a09ac14c2db,470bbff8-20d0-475c-a61a-1a09ac14c2db,0,1,6ea25680-c4db-4717-9498-62420ca16970,6ea25680-c4db-4717-9498-62420ca16970,0,1,14e20d48-635e-4c52-9099-e743323fc190,14e20d48-635e-4c52-9099-e743323fc190,0,1,c37a660e-16c5-495e-9486-e61bcb693fa0,c37a660e-16c5-495e-9486-e61bcb693fa0,0,1,8f44ebad-1160-474e-a566-fb9da55ffcba,8f44ebad-1160-474e-a566-fb9da55ffcba,0,1,11cf336e-7890-4972-bf71-32d7416ff647,11cf336e-7890-4972-bf71-32d7416ff647,0,1,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,4c4d61a6-6bb6-4a15-9a81-25fdcf96ec4b,0,1,14bd3392-36cd-4ed0-8847-44375d6fb861,14bd3392-36cd-4ed0-8847-44375d6fb861,0,1,759ede7a-e832-44e6-9b11-5bfb3c507820,759ede7a-e832-44e6-9b11-5bfb3c507820,0,1,64484611-b32c-4155-a063-7df5a3f924dd,64484611-b32c-4155-a063-7df5a3f924dd,0,1,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,2f2ac0db-db86-4ed2-a55a-b245b4d00d70,0,1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,821b93bd-f0dd-4468-972a-d9b2b4de72f1,0,1,56900066-90e3-40c0-b64a-8f7964a4dfc1,56900066-90e3-40c0-b64a-8f7964a4dfc1,0,1,56f0c4d6-9b13-486a-9586-05e657dca8be,56f0c4d6-9b13-486a-9586-05e657dca8be,0,1,c795c0d3-6a0d-4311-9821-df320663727e,c795c0d3-6a0d-4311-9821-df320663727e,0,1,512b8d89-8798-4549-9e79-b9c3f7d9098f,512b8d89-8798-4549-9e79-b9c3f7d9098f,0,1,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,e1fe71f8-f37c-4705-aca1-c25e2bdc5db6,0,1,7f356abf-9045-4a76-89f3-8b52d467122a,7f356abf-9045-4a76-89f3-8b52d467122a,0,1,625a61ac-4ad0-4b31-aa67-9f864154b9c4,625a61ac-4ad0-4b31-aa67-9f864154b9c4,0,1,51fa8d01-44a1-4e75-9b04-6a2504972f08,51fa8d01-44a1-4e75-9b04-6a2504972f08,0,1,73dae482-a1ee-4c57-8859-2dd8e8635a49,73dae482-a1ee-4c57-8859-2dd8e8635a49,0,1,e4ea640f-e3a4-44ad-b17d-51f32136372e,e4ea640f-e3a4-44ad-b17d-51f32136372e,0,1,7dca913d-e37a-4740-8e3d-677d379605ee,7dca913d-e37a-4740-8e3d-677d379605ee,0,1,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,bd1cf7ef-f3e2-4441-836b-16f2cc227aa9,0,1,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,c9035b0f-cfc4-4761-9ba0-a8aacfaa9c72,0,1,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,7efb0bf4-d40c-417b-b9bc-f4a5af66ec09,0,1,4cd4694f-17f8-43ba-8940-07628bd937fe,4cd4694f-17f8-43ba-8940-07628bd937fe,0,1,7df6c94b-3cfe-4764-988e-858d733e35d9,7df6c94b-3cfe-4764-988e-858d733e35d9,0,1,8b251c7d-2d55-4734-a1da-7f1115d95080,8b251c7d-2d55-4734-a1da-7f1115d95080,0,1,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,87b3153d-bef0-4441-8b1c-a5fc7ba4c36a,0,1,5a8c3621-595a-4168-8bba-a7f8d499e47e,5a8c3621-595a-4168-8bba-a7f8d499e47e,0,1,fc4cfed6-e492-4420-b357-8143a8c2a41a,fc4cfed6-e492-4420-b357-8143a8c2a41a,0,1,4311a250-64af-443e-a711-93b7c41175cf,4311a250-64af-443e-a711-93b7c41175cf,0,1,804b6c57-1d7b-4927-be5b-84b7959fe55e,804b6c57-1d7b-4927-be5b-84b7959fe55e,0,1,f2655d85-79ea-4736-8f41-94a4f9b2b998,f2655d85-79ea-4736-8f41-94a4f9b2b998,0,1,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,21258174-3a95-4c10-bb8f-4d6db0c5ae0e,0,1,a8eb5ed9-df99-405b-afad-eeaa98956eee,a8eb5ed9-df99-405b-afad-eeaa98956eee,0,1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,a64d4b1b-fae4-43ae-ae98-bdc4e59a94c1,0,1,26a1279f-91f0-4632-ad7c-21cf2f524208,26a1279f-91f0-4632-ad7c-21cf2f524208,0,1,bf751ed0-ee47-4eaf-81bd-f0da00bef343,bf751ed0-ee47-4eaf-81bd-f0da00bef343,0,1,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,14b65111-4c0e-4521-9fcd-2a8d4aaa6b4b,0,1,1f1def7c-e0ee-4963-afea-1751bf1b812c,1f1def7c-e0ee-4963-afea-1751bf1b812c,0,1,9a4c0898-ab56-425c-8191-5ab90f4e12bf,9a4c0898-ab56-425c-8191-5ab90f4e12bf,0,1,6841ec47-7a84-441a-b975-69d089072ce7,6841ec47-7a84-441a-b975-69d089072ce7,0,1,ead4001a-0d8a-4b95-8212-2a40e5aa6659,ead4001a-0d8a-4b95-8212-2a40e5aa6659,0,1,22165c8a-2179-4cd5-b195-bd2721e9e232,22165c8a-2179-4cd5-b195-bd2721e9e232,0,1,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,b28c3a8f-8cad-45eb-90d3-6d90a0b3f881,0,1,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,3c5974ec-f76d-401c-a8e4-d51c7cd4c4fb,0,1,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,609a9bc9-4225-4fe1-91fa-90c9c2e5cfba,0,1,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,d22ed498-c7df-45bb-869f-f16d3aa2d3d3,0,1,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,4a966f6e-87dd-4dae-9cc0-dbabee9424dc,0,1,9d9debfd-4a10-4f09-9d09-2aa5e058b525,9d9debfd-4a10-4f09-9d09-2aa5e058b525,0,1,fc19586c-d89c-495c-b473-6f85967ed48e,fc19586c-d89c-495c-b473-6f85967ed48e,0,1,2ac7c701-a281-4e77-a5f8-294526021e2d,2ac7c701-a281-4e77-a5f8-294526021e2d,0,1,979df549-889d-496a-b6ce-c56d54c771b5,979df549-889d-496a-b6ce-c56d54c771b5,0,1,91b320d8-3426-44d3-97d7-c200287d7343,91b320d8-3426-44d3-97d7-c200287d7343,0,1,b9297f72-b40a-4adb-9975-bb693d4834a4,b9297f72-b40a-4adb-9975-bb693d4834a4,0,1,41cf3916-216f-4c4e-a587-82777f4263e0,41cf3916-216f-4c4e-a587-82777f4263e0,0,1,2ce3a350-86f1-4275-8299-3c3693ca11fa,2ce3a350-86f1-4275-8299-3c3693ca11fa,0,1,59f0ed15-c84c-4f41-bdd4-26317e4e914d,59f0ed15-c84c-4f41-bdd4-26317e4e914d,0,1,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,4b5ff142-47b8-4548-b6f9-56ebcbd40e35,0,1,8fef790c-a3f4-460c-9093-5065cbdba196,8fef790c-a3f4-460c-9093-5065cbdba196,0,1,79bd24d0-61a9-4558-90ac-4e726066789c,79bd24d0-61a9-4558-90ac-4e726066789c,0,1,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,d843cbd7-e2b5-4c50-8ed2-7cb0baac8ecc,0,1,ef356548-51a4-4b09-b37d-ede5b8f3edb6,ef356548-51a4-4b09-b37d-ede5b8f3edb6,0,1,53c0d900-5e96-4381-a1ed-4424a5799608,53c0d900-5e96-4381-a1ed-4424a5799608,0,1,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,64fe317a-7d0e-4758-b5cf-0d871d2bf4ad,0,1,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,abfb7ac3-ebfa-4275-a039-a6b94bb9a76f,0,1,45ca9e20-1246-4400-a019-ffb521af6ea7,45ca9e20-1246-4400-a019-ffb521af6ea7,0,1,73eed854-5c3a-4a10-9bfa-793fd517f303,73eed854-5c3a-4a10-9bfa-793fd517f303,0,1,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,c3eb2836-ea4d-48cc-a03f-3a0c30f67e7f,0,1,9134dc40-a8f1-4c60-9431-27cb98be5ecd,9134dc40-a8f1-4c60-9431-27cb98be5ecd,0,1,16c4622a-33af-4a95-b44e-0861a6df21d2,16c4622a-33af-4a95-b44e-0861a6df21d2,0,1,d8cac67b-cce2-4a00-a8df-c6570c50153f,d8cac67b-cce2-4a00-a8df-c6570c50153f,0,1,37213c65-bf26-4e50-a2fa-58eb45439b58,37213c65-bf26-4e50-a2fa-58eb45439b58,0,1,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,e43c08a9-6496-4c8e-bfe2-9d728e31d63d,0,1,b6b31892-73ee-4c9b-92b0-2735536c4938,b6b31892-73ee-4c9b-92b0-2735536c4938,0,1,deb8b883-142e-47d0-a722-7c734a0cf9b3,deb8b883-142e-47d0-a722-7c734a0cf9b3,0,1,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,a6794f74-08a4-4b73-add7-e6d0d1b6e7a3,0,1,29233058-ccb1-4110-a9bc-cdb4c531f35a,29233058-ccb1-4110-a9bc-cdb4c531f35a,0,1,cf3729b2-9ee6-437c-81df-83966793be50,cf3729b2-9ee6-437c-81df-83966793be50,0,1,429d08b7-0b98-4f9b-a053-d04dd84a7026,429d08b7-0b98-4f9b-a053-d04dd84a7026,0,1,b64fd964-cee8-4619-872f-82d2fdc14240,b64fd964-cee8-4619-872f-82d2fdc14240,0,1,5ce7846d-9806-40f5-8631-4e14deb8bc95,5ce7846d-9806-40f5-8631-4e14deb8bc95,0,1,79528a0e-1e48-4d14-bd28-756fd5db57b9,79528a0e-1e48-4d14-bd28-756fd5db57b9,0,1,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,4eeab8c2-d901-4b95-adea-4a08f79d0fa2,0,1,d9426219-4b37-4776-8d5d-acab5825e789,d9426219-4b37-4776-8d5d-acab5825e789,0,1,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,7ce1f9eb-ac51-46fd-adc5-c8b9bfb32e44,0,1,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,4fef5026-1cba-4c33-ae75-5f9570a8e6b6,0,1,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,243ee3d4-4130-41ea-a37c-c7b39a5e73fa,0,1,29e7299a-ce80-497a-8102-615d0a001ea8,29e7299a-ce80-497a-8102-615d0a001ea8,0,1,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,f9e48170-62eb-4d6b-b861-c7af1b4a38c3,0,1,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,9bcc8f9a-ec12-45f2-8a32-6946d556f57a,0,1,adc2cc11-b647-453f-a98e-8a73b7c368c7,adc2cc11-b647-453f-a98e-8a73b7c368c7,0,1,4522c564-61da-40da-a749-5312121a331d,4522c564-61da-40da-a749-5312121a331d,0,1,9394c709-6cbe-4ef6-bc8c-cba8af65821e,9394c709-6cbe-4ef6-bc8c-cba8af65821e,0,1,2943b572-7411-4f92-a6cc-7ee552b85223,2943b572-7411-4f92-a6cc-7ee552b85223,0,1,28478e7a-e8aa-40aa-866c-a3624f903141,28478e7a-e8aa-40aa-866c-a3624f903141,0,1,f692ab21-a8de-4feb-914f-4beef350543a,f692ab21-a8de-4feb-914f-4beef350543a,0,1,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0ec0b1a0-5f0d-4a14-9a84-49098befa0af,0,1,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,c644ab9b-7bcb-4bfa-b8ba-4c5f7689c91c,0,1,dabb3395-6100-4f53-913d-e0230e81b494,dabb3395-6100-4f53-913d-e0230e81b494,0,1,e0a3fae1-1582-4c7a-acd8-870b558acec4,e0a3fae1-1582-4c7a-acd8-870b558acec4,0,1,8e755ce0-c571-4ed5-b0bb-9470edcb7c73,8e755ce0-c571-4ed5-b0bb-9470edcb7c73,0,1,02e1c293-7302-4751-a248-4bbeed9cbad5,02e1c293-7302-4751-a248-4bbeed9cbad5,0,1,c946cde8-c0d7-4acb-a3be-8858e392fc40,c946cde8-c0d7-4acb-a3be-8858e392fc40,0,1,3a111e0d-6466-46fd-95a2-1798b6e51ba0,3a111e0d-6466-46fd-95a2-1798b6e51ba0,0,1,645edcb0-e358-4d32-a9a9-9534af0398ca,645edcb0-e358-4d32-a9a9-9534af0398ca,0,1,efa1b4e5-d16c-4921-a48a-fe700e39dc71,efa1b4e5-d16c-4921-a48a-fe700e39dc71,0,1,e93402db-e7dd-465e-8c62-2a41efd811b8,e93402db-e7dd-465e-8c62-2a41efd811b8,0,1,e0157f72-a362-4b9f-a272-68ca8078b91c,e0157f72-a362-4b9f-a272-68ca8078b91c,0,1,422155c7-1640-48c4-bb21-36595b405c66,422155c7-1640-48c4-bb21-36595b405c66,0,1,16d37b5a-88db-4787-b2de-fb50da0ca94b,16d37b5a-88db-4787-b2de-fb50da0ca94b,0,1,f653bcbf-5659-4605-9bb9-3737f19e79dd,f653bcbf-5659-4605-9bb9-3737f19e79dd,0,1,8b980868-fe63-49ff-ba3d-4c29732e1b90,8b980868-fe63-49ff-ba3d-4c29732e1b90,0,1,54668731-4963-4ec3-b188-9feacaefa182,54668731-4963-4ec3-b188-9feacaefa182,0,1,3702135e-5380-4ca6-82f5-63eff1b043e9,3702135e-5380-4ca6-82f5-63eff1b043e9,0,1,29b2104b-fd02-4d51-951f-51ea213b8ebd,29b2104b-fd02-4d51-951f-51ea213b8ebd,0,1,ba5c945e-554f-45a2-a2de-3157b2d7e931,ba5c945e-554f-45a2-a2de-3157b2d7e931,0,1,f7085f33-f122-4443-a3f5-4e765300175e,f7085f33-f122-4443-a3f5-4e765300175e,0,1,b7e4c512-b856-4679-a025-5f0f28918593,b7e4c512-b856-4679-a025-5f0f28918593,0,1,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,bba56b8f-a3f3-4d3f-9804-f9569bb1f6f3,0,1,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,cff7ba79-9418-43a4-badc-3e3cc2f6bd5b,0,1,a9362ac4-85ee-4214-80c1-048fab769885,a9362ac4-85ee-4214-80c1-048fab769885,0,1,a4e89d2a-d6f7-4966-ac3c-57f1ef1d1a3a,a4e89d2a-d6f7-4966-ac3c-57f1ef1d1a3a,0,1,20f1114a-0b98-464f-aed8-80ce706b808e,20f1114a-0b98-464f-aed8-80ce706b808e,0,1,988b05ae-987a-4433-b446-bcc7bf5d9ea4,988b05ae-987a-4433-b446-bcc7bf5d9ea4,0,1,07e3de4e-28d9-48dc-9253-a2c39c34f827,07e3de4e-28d9-48dc-9253-a2c39c34f827,0,1,241db5c5-e3bc-4db8-bc88-39db84bb60e9,241db5c5-e3bc-4db8-bc88-39db84bb60e9,0,1,c147916d-1fb6-473d-bde0-8dd528dde8eb,c147916d-1fb6-473d-bde0-8dd528dde8eb,0,1,00359e00-aba0-4afb-8b58-2e1247dbe04f,00359e00-aba0-4afb-8b58-2e1247dbe04f,0,1,fc959221-6313-45d9-b2c4-85befaede226,fc959221-6313-45d9-b2c4-85befaede226,0,1,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,6ffa8536-7639-4e9a-9f6d-4eda71f5ca3b,0,1,5206d407-ac91-477e-80e7-97c312da934c,5206d407-ac91-477e-80e7-97c312da934c,0,1,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,15b53eaa-cb35-4385-9515-c2ec6e1fdb4b,0,1,ccb8a530-260a-4488-b1d9-c67325c69bf4,ccb8a530-260a-4488-b1d9-c67325c69bf4,0,1,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0b13cad5-91ae-4cd1-a620-9a315ae8024c,0,1,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,d0634a8e-676f-4f49-9a38-7cb80cfa9fdf,0,1,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,59bb5271-4cc7-45aa-8e2a-f556a4afa2dc,0,1,81dd61e5-fe02-4272-a525-affda9b606ca,81dd61e5-fe02-4272-a525-affda9b606ca,0,1,8de7b423-b7d1-46fe-b1dc-fb936736b864,8de7b423-b7d1-46fe-b1dc-fb936736b864,0,1,f565876c-0326-4b12-895e-c248b9e64115,f565876c-0326-4b12-895e-c248b9e64115,0,1,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,62f075c5-1ad0-4a29-9f40-567b9fa70cdf,0,1,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0f6f8fd9-b3af-4d06-bc47-bdad238d15b7,0,1,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,460e76d2-4ed6-464e-bf9c-a6bcf920aaf2,0,1,80c23bf0-cef0-4d07-a017-d90635f8041d,80c23bf0-cef0-4d07-a017-d90635f8041d,0,1,47a24216-3299-470b-a18c-d8c1258fff24,47a24216-3299-470b-a18c-d8c1258fff24,0,1,72dcfd46-491e-4f88-a0ea-57919f8fbdea,72dcfd46-491e-4f88-a0ea-57919f8fbdea,0,1,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,fa7a11cc-7ee0-4550-8d0d-9c7464d57a37,0,1,f9161bc3-9a1c-4870-8681-8e97d8ce838a,f9161bc3-9a1c-4870-8681-8e97d8ce838a,0,1,a75ed1c8-20c2-49a8-a730-22237ef91366,a75ed1c8-20c2-49a8-a730-22237ef91366,0,1,1c0ebdfd-1913-48fe-b80a-10c30201129b,1c0ebdfd-1913-48fe-b80a-10c30201129b,0,1,22ad3db7-1ad3-4868-8598-b0b90db3fa1f,22ad3db7-1ad3-4868-8598-b0b90db3fa1f,0,1,14025e38-09af-43b2-a49b-403e398a28ea,14025e38-09af-43b2-a49b-403e398a28ea,0,1,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,5e53ccc6-5ab4-4f9d-b524-0081d345d7a2,0,1,c3b3805b-3501-47a7-b280-46180049b235,c3b3805b-3501-47a7-b280-46180049b235,0,1,29af05c2-37de-495b-b3cf-477d452abe5e,29af05c2-37de-495b-b3cf-477d452abe5e,0,1,5e922083-0ceb-449a-8201-7dd27a46f2fc,5e922083-0ceb-449a-8201-7dd27a46f2fc,0,1,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,d97e78c7-f2c1-4e0e-9c9b-d2dd6a94da22,0,1,e757303e-c61a-4e42-9829-c5a36dba9414,e757303e-c61a-4e42-9829-c5a36dba9414,0,1,091de87c-0801-4bd3-aaaa-ed37bc4cd161,091de87c-0801-4bd3-aaaa-ed37bc4cd161,0,1,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,9a6bfcbe-6ac7-4839-bfb9-a11b97e64185,0,1,b53c545c-3b1c-4315-a213-4f2b2c7128aa,b53c545c-3b1c-4315-a213-4f2b2c7128aa,0,1,02a84df9-2171-43e6-8135-a74edd384826,02a84df9-2171-43e6-8135-a74edd384826,0,1,ff36356d-cb1d-4316-896a-c6ae83b92437,ff36356d-cb1d-4316-896a-c6ae83b92437,0,1,465cce6a-7064-4b0a-932c-40f842042f33,465cce6a-7064-4b0a-932c-40f842042f33,0,1,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,f9cd82e7-8252-4bb6-8e08-23ab45ed3976,0,1,8f17ec3f-6d62-46b8-baef-b20430e948ce,8f17ec3f-6d62-46b8-baef-b20430e948ce,0,1,ea1298d0-9396-4a50-b83e-24064e8dd99d,ea1298d0-9396-4a50-b83e-24064e8dd99d,0,1,038dbb00-e4c6-4e64-b861-3a0764f54ab3,038dbb00-e4c6-4e64-b861-3a0764f54ab3,0,1,1c291f7d-a493-4297-8aaa-912896800066,1c291f7d-a493-4297-8aaa-912896800066,0,1,69149801-a825-4ed2-b077-c26660dff271,69149801-a825-4ed2-b077-c26660dff271,0,1,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,12146ed3-c159-4d6b-ae1a-1ecd30e5a87e,0,1,518ab687-b84a-40c8-8547-aee4257c1b71,518ab687-b84a-40c8-8547-aee4257c1b71,0,1,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,5cec0949-bfe8-4f7e-98c1-0c402be3ea09,0,1,7732ef07-16eb-46a0-9645-7de95c5482af,7732ef07-16eb-46a0-9645-7de95c5482af,0,1,75dac536-b316-4b04-a57b-03656c678bec,75dac536-b316-4b04-a57b-03656c678bec,0,1,a07d6c85-159d-4d09-b117-561a1e20329f,a07d6c85-159d-4d09-b117-561a1e20329f,0,1,8a2f9733-4f83-41f2-9d74-dca7161a4b41,8a2f9733-4f83-41f2-9d74-dca7161a4b41,0,1,fbd2d900-1e0d-48f3-9793-0186ee49915c,fbd2d900-1e0d-48f3-9793-0186ee49915c,0,1,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,4a69a70d-1b4c-4999-a3dd-ae1deb331fea,0,1,3a36e0f5-a645-47f1-99ae-5b0493d604ad,3a36e0f5-a645-47f1-99ae-5b0493d604ad,0,1,57f762f7-b8e4-498b-a3dc-3d40c94855ec,57f762f7-b8e4-498b-a3dc-3d40c94855ec,0,1,ca7d4086-de35-40fd-af65-73369d452135,ca7d4086-de35-40fd-af65-73369d452135,0,1,563c0f5c-e0b4-4229-a3f6-183091060aa4,563c0f5c-e0b4-4229-a3f6-183091060aa4,0,1,bf967588-ea8f-49a3-9331-af2331ffa162,bf967588-ea8f-49a3-9331-af2331ffa162,0,1,5083530c-9a24-4def-99c1-6eb9514e9b33,5083530c-9a24-4def-99c1-6eb9514e9b33,0,1,d59c2725-5d98-495e-9f86-f5d38dbfad90,d59c2725-5d98-495e-9f86-f5d38dbfad90,0,1,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,176f8835-73d2-4fbe-9d2a-0a4c79d3b871,0,1,0ba68198-983d-409b-be27-96f1572b3f12,0ba68198-983d-409b-be27-96f1572b3f12,0,1,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,9cd1e8dd-e2be-48a9-b32d-43688e1748bc,0,1,decb27a8-7dd3-4601-a694-30429e638b39,decb27a8-7dd3-4601-a694-30429e638b39,0,1,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,922ac6c0-a6a8-444e-9aad-27dc0f49b32e,0,1,d7a128e4-f31f-4b09-8424-e816ab59d5c3,d7a128e4-f31f-4b09-8424-e816ab59d5c3,0,1,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0ce6e252-8d6e-4bfe-b8cc-daf3434fa51e,0,1,aa9513b4-f575-4030-a7f9-ac09aa319e98,aa9513b4-f575-4030-a7f9-ac09aa319e98,0,1,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,f01afc5e-91b8-4cc2-b63a-c245e5e36d01,0,1,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,028cbc0e-023d-40ad-86c3-5e6f8dc96c57,0,1,d03f66b1-48a3-434b-bb58-9fd53c183514,d03f66b1-48a3-434b-bb58-9fd53c183514,0,1,a469e55e-d7ca-4c27-b350-fafe7364c18f,a469e55e-d7ca-4c27-b350-fafe7364c18f,0,1,1a4991f8-7832-4ca9-8809-88a97de88749,1a4991f8-7832-4ca9-8809-88a97de88749,0,1,4f44c1c0-0480-415e-8058-41b28f2f43a0,4f44c1c0-0480-415e-8058-41b28f2f43a0,0,1,3b708ec7-6543-40ff-8ea2-16d4ddb7d56f,3b708ec7-6543-40ff-8ea2-16d4ddb7d56f,0,1,433e502d-ab5c-4e8e-a7c0-0fde1aa6f767,433e502d-ab5c-4e8e-a7c0-0fde1aa6f767,0,1,6bd65f02-9531-4dd4-bd4a-4132aa3c4787,6bd65f02-9531-4dd4-bd4a-4132aa3c4787,0,1,5d9863e6-aab7-4808-a516-8bc42dae5d01,5d9863e6-aab7-4808-a516-8bc42dae5d01,0,1,a2910bb8-fdd2-480c-8ae2-78661d7d18e0,a2910bb8-fdd2-480c-8ae2-78661d7d18e0,0,1,218302fa-674d-45e1-a7e2-2cce2d011342,218302fa-674d-45e1-a7e2-2cce2d011342,0,1,70264a0a-95c5-426f-a1bf-0f57b86d4030,70264a0a-95c5-426f-a1bf-0f57b86d4030,0,1,ba3ba1ac-e7c6-4bab-9771-4ef522011c52,ba3ba1ac-e7c6-4bab-9771-4ef522011c52,0,1,3291428e-6727-43cc-a1f8-c62f90320e90,3291428e-6727-43cc-a1f8-c62f90320e90,0,1,d867720c-c937-4689-b241-0afda05ef993,d867720c-c937-4689-b241-0afda05ef993,0,1,1390da8f-bac6-44ee-8413-1438f1f66074,1390da8f-bac6-44ee-8413-1438f1f66074,0,1,9616956d-a537-44fd-9d3f-5071fb5f4883,9616956d-a537-44fd-9d3f-5071fb5f4883,0,1,4ad1eed9-89ff-4086-b0ff-4eadcebcdce9,4ad1eed9-89ff-4086-b0ff-4eadcebcdce9,0,1,41d31712-6181-4cfe-9aa4-02b7a50150b0,41d31712-6181-4cfe-9aa4-02b7a50150b0,0,1,3ad5d8a7-3071-46aa-aebf-306bdb67983b,3ad5d8a7-3071-46aa-aebf-306bdb67983b,0,1,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,ab7ef662-71c1-4d51-9f0f-ea8c5ea3df8a,0,1,cb954476-c551-4a06-9bcd-18d67ba47dc8,cb954476-c551-4a06-9bcd-18d67ba47dc8,0,1,79201015-bfae-463e-81f1-0ae2d3066f3f,79201015-bfae-463e-81f1-0ae2d3066f3f,0,1,1ea3178b-73dd-4063-9140-c61687a4b1b8,1ea3178b-73dd-4063-9140-c61687a4b1b8,0,1,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,85fd7ef4-2886-4e2c-a6eb-63d0b0b9cd55,0,1,696723be-7b4f-4321-956e-eff07ea9f5fa,696723be-7b4f-4321-956e-eff07ea9f5fa,0,1,616c27dc-5c59-4469-97a7-27e0752bd3a7,616c27dc-5c59-4469-97a7-27e0752bd3a7,0,1,f7323121-74bc-441c-a3e9-dd5cb4f0accd,f7323121-74bc-441c-a3e9-dd5cb4f0accd,0,1,bb264e83-49f4-4b7a-8be2-094712fc0640,bb264e83-49f4-4b7a-8be2-094712fc0640,0,1,07bf650d-e61e-44f3-9643-6ffc95b913fb,07bf650d-e61e-44f3-9643-6ffc95b913fb,0,1,6b90ed05-813c-4324-8a69-02c2268856b2,6b90ed05-813c-4324-8a69-02c2268856b2,0,1,081ed48d-cb87-459d-97d6-9af121edbabb,081ed48d-cb87-459d-97d6-9af121edbabb,0,1,6c4074b2-f631-451d-b412-1c8c096a71b1,6c4074b2-f631-451d-b412-1c8c096a71b1,0,1,f9931a20-8391-4b13-8c6d-1836f2492e53,f9931a20-8391-4b13-8c6d-1836f2492e53,0,1,c6eec20b-13b9-44a0-968f-1325680c399b,c6eec20b-13b9-44a0-968f-1325680c399b,0,1,02fbf083-1bdd-4900-9dc1-62f415b792a4,02fbf083-1bdd-4900-9dc1-62f415b792a4,0,1,35454c2d-7088-487b-abb3-f95f2dfdcffa,35454c2d-7088-487b-abb3-f95f2dfdcffa,0,1,96fe619a-b819-4f96-9788-e1f4ef57833a,96fe619a-b819-4f96-9788-e1f4ef57833a,0,1,94dff2da-f721-411a-9fc0-5d013b685dcc,94dff2da-f721-411a-9fc0-5d013b685dcc,0,1,9343fc5f-7b08-4be5-8cd5-dbed635b819d,9343fc5f-7b08-4be5-8cd5-dbed635b819d,0,1,99e87e66-1b07-451b-a476-f5213cbd7150,99e87e66-1b07-451b-a476-f5213cbd7150,0,1,c3317f75-f6ad-41f6-97f1-77074c3ff62a,c3317f75-f6ad-41f6-97f1-77074c3ff62a,0,1,8800dec9-84f8-4643-8742-1d76fe575f58,8800dec9-84f8-4643-8742-1d76fe575f58,0,1,62903794-3b41-4d21-b800-1c26dbeda3ce,62903794-3b41-4d21-b800-1c26dbeda3ce,0,1,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,9bda4a0b-e8a7-4acf-9f07-4033b3a84ebc,0,1,93de88de-0069-4aa8-96b2-d5709e4def2f,93de88de-0069-4aa8-96b2-d5709e4def2f,0,1,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,9f94fadf-ac9d-4e57-9fe4-41ce8cfbec6a,0,1,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,12d4ffc8-592e-42a7-b8c6-20bd58f6da90,0,1,3a8d9010-8785-4d8d-b908-b821d7d681c9,3a8d9010-8785-4d8d-b908-b821d7d681c9,0,1,2568a935-ea49-4b99-aa9c-de27de6a0e81,2568a935-ea49-4b99-aa9c-de27de6a0e81,0,1,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,1c1e01f2-b2b3-480d-ae51-2db27b82dedd,0,1,df459525-4e4d-4819-b996-5a6379b22a88,df459525-4e4d-4819-b996-5a6379b22a88,0,1,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,ed1d69f4-b09f-430a-bb2e-a23fe4dedf6b,0,1,e67b4a32-4bac-450e-be6d-88c262383f31,e67b4a32-4bac-450e-be6d-88c262383f31,0,1,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,8b83bb54-4c23-4bd8-bd00-374a7a101cfa,0,1,6c4c3eca-8b02-451b-af52-93073c3da146,6c4c3eca-8b02-451b-af52-93073c3da146,0,1,095c281c-3903-465d-baea-af1e6abf8019,095c281c-3903-465d-baea-af1e6abf8019,0,1,440d115d-a769-427e-891a-88d65fba2057,440d115d-a769-427e-891a-88d65fba2057,0,1,f7932210-027e-4fad-b7f7-3530789ce803,f7932210-027e-4fad-b7f7-3530789ce803,0,1,7bbfd95e-39a1-485b-930f-c9210c18dcd0,7bbfd95e-39a1-485b-930f-c9210c18dcd0,0,1,4975d3d6-b5a2-41c6-973b-6817013a388d,4975d3d6-b5a2-41c6-973b-6817013a388d,0,1,18ebc799-9724-4ffb-855e-b09a0723869e,18ebc799-9724-4ffb-855e-b09a0723869e,0,1,a06b8ef5-83e6-4fc6-91e1-256004134d69,a06b8ef5-83e6-4fc6-91e1-256004134d69,0,1,1d6a68ec-917f-4c3b-b970-797a6921cbc9,1d6a68ec-917f-4c3b-b970-797a6921cbc9,0,1,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,ae29eb40-5c8f-4ab4-8556-f98d45e8effe,0,1,5b663988-3599-46dc-8d59-4c82ceac537c,5b663988-3599-46dc-8d59-4c82ceac537c,0,1,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0f5f136c-688b-491e-a72b-3d9c2e609f0e,0,1,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,5573b405-6ac4-4632-b8d6-5d1cbdb63b97,0,1,679cc0df-df5c-4c33-8c64-c0b6cee39116,679cc0df-df5c-4c33-8c64-c0b6cee39116,0,1,b156752b-f25c-4f35-9474-8ac3636597f5,b156752b-f25c-4f35-9474-8ac3636597f5,0,1,bdc51d67-5fc2-4d28-8875-69e33e625be6,bdc51d67-5fc2-4d28-8875-69e33e625be6,0,1,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,94ca9aa0-f61f-496b-8fef-9e6fb7bd8f87,0,1,b494ca7b-6548-4fa2-932c-acdf8c62a78a,b494ca7b-6548-4fa2-932c-acdf8c62a78a,0,1,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,2d279292-f9d6-4d5a-aaeb-f82f6485ac54,0,1,f335aa38-4e9e-4653-9a76-b6d4ae178c93,f335aa38-4e9e-4653-9a76-b6d4ae178c93,0,1,a62894bc-fab4-4ed4-a57d-cbe725527198,a62894bc-fab4-4ed4-a57d-cbe725527198,0,1,17aadd5f-cda2-4785-a07f-3ab4b04434a6,17aadd5f-cda2-4785-a07f-3ab4b04434a6,0,1,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,71bc35e6-0fec-4e54-af2d-23d1357d1c3b,0,1,1832336e-32f6-42c4-9087-8614ead52bb3,1832336e-32f6-42c4-9087-8614ead52bb3,0,1,ff9f7b5c-70f4-4eed-8216-64448e7da76f,ff9f7b5c-70f4-4eed-8216-64448e7da76f,0,1,44ac2869-990d-4cac-a14b-c1a28854341e,44ac2869-990d-4cac-a14b-c1a28854341e,0,1,d5df31c3-89f9-469c-80a9-fb4706d30bc4,d5df31c3-89f9-469c-80a9-fb4706d30bc4,0,1,e73a6a9d-8ddd-4531-9f17-745117d9da9b,e73a6a9d-8ddd-4531-9f17-745117d9da9b,0,1,9dd4e17c-d10b-435e-8665-08997edc3e7e,9dd4e17c-d10b-435e-8665-08997edc3e7e,0,1,cafd44e1-8509-4550-8329-ff8cab0c31ae,cafd44e1-8509-4550-8329-ff8cab0c31ae,0,1,ee6e5e56-5848-46b6-89bf-b9345a57d94c,ee6e5e56-5848-46b6-89bf-b9345a57d94c,0,1,8817c872-bdee-4577-bcc3-4046edc72803,8817c872-bdee-4577-bcc3-4046edc72803,0,1,5b88c214-4e4e-45c2-b8c5-14eb852e9900,5b88c214-4e4e-45c2-b8c5-14eb852e9900,0,1,105cd740-1f60-45e1-871c-adeecd291b0d,105cd740-1f60-45e1-871c-adeecd291b0d,0,1,95aec7d2-179b-4ea3-a3df-3d737b713564,95aec7d2-179b-4ea3-a3df-3d737b713564,0,1,4bd1cae4-d5b5-444e-9cf5-67a969714293,4bd1cae4-d5b5-444e-9cf5-67a969714293,0,1,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,b1a330d7-9b88-44e9-aba6-41ce5e5e669c,0,1,f279a625-b88f-43b4-bce9-de1186fe7d7e,f279a625-b88f-43b4-bce9-de1186fe7d7e,0,1,99fc224a-2a61-441a-85e9-d69df6aa8b5e,99fc224a-2a61-441a-85e9-d69df6aa8b5e,0,1,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,a528c26f-3ceb-4ae4-8420-edfbdea6e1ac,0,1,d009782b-d73e-42d1-9979-2cbaf20ee98e,d009782b-d73e-42d1-9979-2cbaf20ee98e,0,1,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,1ef6282c-ae81-4d76-8e3e-99fec58fc7bd,0,1,88d8edf7-654f-4627-b68d-c7e929726da6,88d8edf7-654f-4627-b68d-c7e929726da6,0,1,1725c619-9c4a-40ac-9044-00fee71945a4,1725c619-9c4a-40ac-9044-00fee71945a4,0,1,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,45a85e25-7c33-4ff5-87a0-2a0b4cda8130,0,1,e95b126d-797d-4071-b7b4-b14aaf595f2d,e95b126d-797d-4071-b7b4-b14aaf595f2d,0,1,9241ea3c-633f-4469-9e70-c5a20e464da8,9241ea3c-633f-4469-9e70-c5a20e464da8,0,1,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,bbadbe1b-cb33-4cc5-84c8-a4fdfc8a2247,0,1,961ae0fb-7f7b-414d-8fbf-32b893b41085,961ae0fb-7f7b-414d-8fbf-32b893b41085,0,1,10adf8c8-6f5f-477f-b244-4452b774b766,10adf8c8-6f5f-477f-b244-4452b774b766,0,1,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,ac9dcb8c-d4f5-4f0d-affb-e4187eafdf14,0,1,04ec5e44-8469-4e9c-8021-83d258f2ec54,04ec5e44-8469-4e9c-8021-83d258f2ec54,0,1,cff36ede-0bd1-424b-8c75-b9695133f32e,cff36ede-0bd1-424b-8c75-b9695133f32e,0,1,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,9d872d99-eac7-43ee-8ce2-c9d31a76bd75,0,1,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,77e5bd01-35f3-4072-bc7a-8730e6dcbab3,0,1,58b33683-1916-4aef-9b98-5569ef7782ed,58b33683-1916-4aef-9b98-5569ef7782ed,0,1,d3e1f622-f438-4cad-94ae-0272f51610f7,d3e1f622-f438-4cad-94ae-0272f51610f7,0,1,64ac2c2a-2726-4ab9-9a6a-3d08f3fc0618,64ac2c2a-2726-4ab9-9a6a-3d08f3fc0618,0,1,8569cd73-d40d-4d92-83e0-8ece0c03a86a,8569cd73-d40d-4d92-83e0-8ece0c03a86a,0,1,9ebe2809-be6b-4c91-9443-b237fb7ad43c,9ebe2809-be6b-4c91-9443-b237fb7ad43c,0,1,bf29c091-de15-4cd4-be0e-a9785f97d444,bf29c091-de15-4cd4-be0e-a9785f97d444,0,1,6a675752-fd31-46a5-8a62-2a1ede437c68,6a675752-fd31-46a5-8a62-2a1ede437c68,0,1,8ff109f7-db33-4713-92bf-000f70d2014a,8ff109f7-db33-4713-92bf-000f70d2014a,0,1,97a65f49-845f-4eed-ae81-61266ed3e05b,97a65f49-845f-4eed-ae81-61266ed3e05b,0,1,060b2bb4-ca03-4da9-930f-7f91f6299a35,060b2bb4-ca03-4da9-930f-7f91f6299a35,0,1,394b1a1c-a7ae-41b7-a346-4bac99fa567d,394b1a1c-a7ae-41b7-a346-4bac99fa567d,0,1,9a5fa511-59e8-4a1b-a101-f276f0b7b261,9a5fa511-59e8-4a1b-a101-f276f0b7b261,0,1,ccfe4e36-80b6-419f-8bb3-c1046203d023,ccfe4e36-80b6-419f-8bb3-c1046203d023,0,1,94b2e060-53b7-4b40-af05-30bea3520330,94b2e060-53b7-4b40-af05-30bea3520330,0,1,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0f634f7e-7d6b-43e4-8e5e-a31ed05898ea,0,1,41b0dabd-85a3-4819-84dd-371eaf4f996e,41b0dabd-85a3-4819-84dd-371eaf4f996e,0,1,86a5ba4d-0681-4ddc-a505-0f537528e1a3,86a5ba4d-0681-4ddc-a505-0f537528e1a3,0,1,12d936f5-932b-4561-b934-c8444808a450,12d936f5-932b-4561-b934-c8444808a450,0,1,2ccb06ca-9bb7-4b74-9a96-c109bb117984,2ccb06ca-9bb7-4b74-9a96-c109bb117984,0,1,ac1a661d-db18-4576-80a9-a19d4140c05e,ac1a661d-db18-4576-80a9-a19d4140c05e,0,1,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,acd89f6c-a25f-47b9-ac21-036bfafcc0fc,0,1,c3ffeb09-121b-4d77-9c15-def4648b4f3c,c3ffeb09-121b-4d77-9c15-def4648b4f3c,0,1,c2de0724-04c1-4adb-b62a-b7ba727dbe67,c2de0724-04c1-4adb-b62a-b7ba727dbe67,0,1,4ae26777-69ff-4a55-942b-0bad8ab7a70a,4ae26777-69ff-4a55-942b-0bad8ab7a70a,0,1,a0d8fb0a-0e90-4140-8687-e249b153dc66,a0d8fb0a-0e90-4140-8687-e249b153dc66,0,1,917c6f60-2a07-4587-9496-d393aff93953,917c6f60-2a07-4587-9496-d393aff93953,0,1,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,4bac50a2-762a-44e6-b8c5-3b09ef1a3f5e,0,1,9fe72d73-4c95-47e0-bf92-dcb714d747c6,9fe72d73-4c95-47e0-bf92-dcb714d747c6,0,1,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,fe00e64f-2fa9-44a7-9bd7-854ebb6c0185,0,1,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,4d84bb11-e06e-4ed9-915b-76ee0e385a8b,0,1,2b94076d-39ee-45ad-9ba5-435115cf5d4f,2b94076d-39ee-45ad-9ba5-435115cf5d4f,0,1,72ace16c-e90a-4d05-bc23-4351d4c87683,72ace16c-e90a-4d05-bc23-4351d4c87683,0,1,bd86e378-84bb-486a-be7b-319a3fe3b70b,bd86e378-84bb-486a-be7b-319a3fe3b70b,0,1,ef3bc279-6721-4949-8dc0-f96141f7f05c,ef3bc279-6721-4949-8dc0-f96141f7f05c,0,1,f81c7e21-48ad-4b64-975d-e62d34c7235a,f81c7e21-48ad-4b64-975d-e62d34c7235a,0,1,d0523c14-585e-45d3-9735-891235631004,d0523c14-585e-45d3-9735-891235631004,0,1,b6f8bc3e-f0cd-43ef-b060-d701cd446197,b6f8bc3e-f0cd-43ef-b060-d701cd446197,0,1,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,4f10e5f9-6cfd-4fa9-9c72-d19a484a796c,0,1,b94e805f-e1ab-4870-b855-98aa401864b2,b94e805f-e1ab-4870-b855-98aa401864b2,0,1,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,ff8eedeb-fc3e-4bee-852b-6da6d59ff38c,0,1,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,a98bd18f-ccda-41a2-a1b2-8b37cc1f6c36,0,1,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,62f9fe19-3d64-4506-a0bc-dbfe47b4df64,0,1,60aaa289-1f07-438c-8f10-81058ac671c3,60aaa289-1f07-438c-8f10-81058ac671c3,0,1,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,7312a4ab-a269-4d85-a2c2-25bd5c5dc59c,0,1,c44b0868-bd7f-4230-973b-544ff4dd2afe,c44b0868-bd7f-4230-973b-544ff4dd2afe,0,1,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,51e6a6f9-ce9d-4cb0-a40c-384ede074e07,0,1,6236ac73-5b9f-4fb5-bb2c-a5d8e205c5db,6236ac73-5b9f-4fb5-bb2c-a5d8e205c5db,0,1,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,5e22429f-9ec0-4943-bf80-1becc4b8e5cb,0,1,0153e60e-daca-48ac-b1c6-adecc89f579e,0153e60e-daca-48ac-b1c6-adecc89f579e,0,1,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,1ed4cf25-19f0-49f5-96a0-0ffe13adfe35,0,1,a896bc34-30a6-48b6-acfc-786c24c186bd,a896bc34-30a6-48b6-acfc-786c24c186bd,0,1,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,3867f4cb-bf54-42fb-8ea6-ca51d7cd6c91,0,1,da8ae00a-7207-4ceb-b739-9114888c5b27,da8ae00a-7207-4ceb-b739-9114888c5b27,0,1,91af7a52-0825-4af5-94df-cc501e0123cd,91af7a52-0825-4af5-94df-cc501e0123cd,0,1,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,1c2cc78a-2ae6-4996-a743-7b55aecbe84c,0,1,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,9292bf81-5668-4d52-a4ec-a93bc4b0ad3b,0,1,9693cc78-852e-445b-a7d2-f1689fa9eeec,9693cc78-852e-445b-a7d2-f1689fa9eeec,0,1,eb33e555-db41-462a-a45d-c7e0945cece8,eb33e555-db41-462a-a45d-c7e0945cece8,0,1,9cfd517c-1008-483a-9f65-7d15feb2cefc,9cfd517c-1008-483a-9f65-7d15feb2cefc,0,1,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,d66adc5e-25a3-472e-b0a4-5f22f88d7a0f,0,1,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,ae48d48f-cd39-4821-a4b7-9394b2a77ef6,0,1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,f34d3a69-533e-49df-b91d-f7f7f49c5fb1,0,1,1d76f613-f4f6-4772-8c16-d97b3104a553,1d76f613-f4f6-4772-8c16-d97b3104a553,0,1,3e58d607-b906-449f-b044-9c130a487b86,3e58d607-b906-449f-b044-9c130a487b86,0,1,7a911212-7fde-4ea8-a1fa-229116b60895,7a911212-7fde-4ea8-a1fa-229116b60895,0,1,f4580043-5bc2-4295-8523-909302009b44,f4580043-5bc2-4295-8523-909302009b44,0,1,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,dc8af632-a5a4-4270-ba5f-2d3ba506f7e3,0,1,81936ac2-32fe-4e14-897b-0aba92b90c05,81936ac2-32fe-4e14-897b-0aba92b90c05,0,1,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,9f88e355-3f8f-4fcd-b45f-39c3d45490f5,0,1,ac028c56-b2a8-4a9b-a325-554c636f838e,ac028c56-b2a8-4a9b-a325-554c636f838e,0,1,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0ed85f4c-c002-49b6-99b9-0c3c4b7f940e,0,1,f99e98ac-cd94-4989-8c02-ef8b323c6815,f99e98ac-cd94-4989-8c02-ef8b323c6815,0,1,e2562347-4549-4111-862e-86c20a6daade,e2562347-4549-4111-862e-86c20a6daade,0,1,b270fc64-15c6-41ed-ad09-44c833ca7c41,b270fc64-15c6-41ed-ad09-44c833ca7c41,0,1,4c3312fd-5613-4e9b-ae7c-572fa1887ded,4c3312fd-5613-4e9b-ae7c-572fa1887ded,0,1,6c8c9618-287a-41ab-890c-60250925ad52,6c8c9618-287a-41ab-890c-60250925ad52,0,1,168fce48-2413-45fc-ad21-9b465121d81b,168fce48-2413-45fc-ad21-9b465121d81b,0,1,55b9650e-098b-4d44-9fb5-d525b46f014b,55b9650e-098b-4d44-9fb5-d525b46f014b,0,1,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,5b7b32ec-3d0e-42e9-bd13-5d2b8cc1942d,0,1,bc55dc06-a769-40be-9c99-0794bdd2dbea,bc55dc06-a769-40be-9c99-0794bdd2dbea,0,1,7861e179-96d2-422f-a7c2-b38b59074956,7861e179-96d2-422f-a7c2-b38b59074956,0,1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0b2416bc-f322-45b3-8c3f-2c8a206c55a1,0,1,3797b4c6-e336-4cbe-8d0b-0902e1247b42,3797b4c6-e336-4cbe-8d0b-0902e1247b42,0,1,67ebc493-d29a-4614-890a-feb8b5bd884b,67ebc493-d29a-4614-890a-feb8b5bd884b,0,1,d65c8992-aabc-4b67-9893-01862231ebe1,d65c8992-aabc-4b67-9893-01862231ebe1,0,1,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,dc79e5e2-37d1-4f19-9500-15c1d9be10eb,0,1,dba6cb38-79c6-4060-87c5-a993548f36c4,dba6cb38-79c6-4060-87c5-a993548f36c4,0,1,6b44227a-e226-4bcb-8638-06b49f830669,6b44227a-e226-4bcb-8638-06b49f830669,0,1,f2406400-87e9-4df2-bcd3-8f1e3ad62088,f2406400-87e9-4df2-bcd3-8f1e3ad62088,0,1,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,ecaacedb-bf2d-4736-a9e1-fa89cda85ee6,0,1,a5623e87-3102-4521-b4ab-c41bf2403a1a,a5623e87-3102-4521-b4ab-c41bf2403a1a,0,1,599b1692-5f4e-42ef-ae1a-822ff527a415,599b1692-5f4e-42ef-ae1a-822ff527a415,0,1,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,ee9abe8a-b3a2-48a9-9157-ea537e83b7e7,0,1,23f70675-6a05-4b50-ad68-c55ddc93e857,23f70675-6a05-4b50-ad68-c55ddc93e857,0,1,4bb7372a-87a9-426e-b09f-fc0110455b10,4bb7372a-87a9-426e-b09f-fc0110455b10,0,1,ac853a0f-c185-4cdb-9f09-c921770937b5,ac853a0f-c185-4cdb-9f09-c921770937b5,0,1,920a7940-4d12-476d-a909-2231787839a9,920a7940-4d12-476d-a909-2231787839a9,0,1,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,b3aeeb3c-622d-4e0c-8c13-199f0e431a7d,0,1,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,ad14c4d1-bc11-44b6-a32c-c00fb89a9ea5,0,1,32eb2a75-ff35-4795-bf0c-12b1328441ee,32eb2a75-ff35-4795-bf0c-12b1328441ee,0,1,8e877990-a64c-4c45-91f1-007d47618cc7,8e877990-a64c-4c45-91f1-007d47618cc7,0,1,73c6640e-2fe6-4132-9237-d6f28cbacc1c,73c6640e-2fe6-4132-9237-d6f28cbacc1c,0,1,46c3341c-352c-43fb-b338-15c8ad487fbf,46c3341c-352c-43fb-b338-15c8ad487fbf,0,1,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,a2a8b35e-04e5-4176-8d3b-2cd4dfb6d653,0,1,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,ea7ad7f5-e502-49a9-b4a6-e9adceb15057,0,1,f9450d6a-849c-4621-b528-9cafc4819b44,f9450d6a-849c-4621-b528-9cafc4819b44,0,1,5b7cac99-2fca-4dbb-8d49-b84f310a2496,5b7cac99-2fca-4dbb-8d49-b84f310a2496,0,1,bb11c22e-0fbd-4985-be67-0866df7f7e61,bb11c22e-0fbd-4985-be67-0866df7f7e61,0,1,a4673d5c-9dae-48f7-9c91-53c1302a266a,a4673d5c-9dae-48f7-9c91-53c1302a266a,0,1,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,1a2a0dd2-b0dc-41e1-8c4f-f275f025bad2,0,1,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,c255932e-fc34-402c-a6e9-2fda1ffbcdf2,0,1,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0d323d88-2823-493e-8c1e-b2b9f3dcdd3e,0,1,3f410b53-e762-41fe-9469-d538dfec3a9a,3f410b53-e762-41fe-9469-d538dfec3a9a,0,1,d08857b9-bc84-48f8-a7a1-09db961427c9,d08857b9-bc84-48f8-a7a1-09db961427c9,0,1,53ea8238-cae6-42c0-b92d-b4539c71c34a,53ea8238-cae6-42c0-b92d-b4539c71c34a,0,1,92ea60c0-1027-4337-9130-40028951f09b,92ea60c0-1027-4337-9130-40028951f09b,0,1,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,46710ce6-0f82-4c4c-91e8-f8ee726e00ce,0,1,d64f18a4-ff93-4284-9eca-085109eafd24,d64f18a4-ff93-4284-9eca-085109eafd24,0,1,bf428e7a-2970-4bab-8c8e-35ea16151c0e,bf428e7a-2970-4bab-8c8e-35ea16151c0e,0,1,232dbd5f-b7f1-4463-946c-b8fbf93ac466,232dbd5f-b7f1-4463-946c-b8fbf93ac466,0,1,a1a74b34-4174-4769-8f03-bd4a32e83418,a1a74b34-4174-4769-8f03-bd4a32e83418,0,1,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,32fd1fe7-34d3-43ed-baba-16ccd43aa25a,0,1,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,8f4d1259-abdc-4495-8e1e-8c8abcd336ca,0,1,1731708f-53cb-4b00-b90e-f581b4baa845,1731708f-53cb-4b00-b90e-f581b4baa845,0,1,d4b0feca-c00a-4d48-9f23-d92277ea6483,d4b0feca-c00a-4d48-9f23-d92277ea6483,0,1,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,00b2a0b3-6af8-4ea4-aa38-d1e078d5cbff,0,1,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,20f7fdd2-30f6-4a52-a63b-7d2c326c0e83,0,1,23cb5bc2-9638-4d1c-b4bc-d5297e271570,23cb5bc2-9638-4d1c-b4bc-d5297e271570,0,1,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,6e547ccb-6d5a-4f7c-aaf0-568c22d2c276,0,1,04b7389d-697d-4b0d-a239-ac8c674cc46f,04b7389d-697d-4b0d-a239-ac8c674cc46f,0,1,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,a1cf5173-2e86-4ed7-9a0b-1bd5e578326a,0,1,864cad61-8280-415d-8fe1-bcb39d56670a,864cad61-8280-415d-8fe1-bcb39d56670a,0,1,b106bd29-5dc7-44d7-94d0-00f61499392e,b106bd29-5dc7-44d7-94d0-00f61499392e,0,1,a4febff8-0566-4977-bf55-1d574568fe9f,a4febff8-0566-4977-bf55-1d574568fe9f,0,1,5199cc65-bed1-40b9-96fe-cf6d855a8b91,5199cc65-bed1-40b9-96fe-cf6d855a8b91,0,1,f518add9-5c26-4dac-ab2e-b30fe3fbd347,f518add9-5c26-4dac-ab2e-b30fe3fbd347,0,1,23f53317-7aa8-4816-8a69-3d39d5e76da0,23f53317-7aa8-4816-8a69-3d39d5e76da0,0,1,9ade5155-fa6d-4999-b019-a5e7e235a158,9ade5155-fa6d-4999-b019-a5e7e235a158,0,1,8b302c5e-b255-4cb5-94d9-0dfef4250097,8b302c5e-b255-4cb5-94d9-0dfef4250097,0,1,49d713b8-6a61-4bd1-9650-0de1869967d2,49d713b8-6a61-4bd1-9650-0de1869967d2,0,1,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,4738ffd0-3c3b-4e5f-8773-0c9a80efdfbf,0,1,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,3d1bae2a-4dfd-48e5-bfe9-b7e30c8475f6,0,1,0ddeed48-b98a-47c3-84a2-2eac065be06c,0ddeed48-b98a-47c3-84a2-2eac065be06c,0,1,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,7987fe2c-d7cc-4fd2-ac4e-610bfb1ab6d2,0,1,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,fc18d95e-a51d-45c0-83b0-09aeb2b5b03a,0,1,554b1360-d3cb-48c5-bfa6-ebcba5c9afc9,554b1360-d3cb-48c5-bfa6-ebcba5c9afc9,0,1,61b947a5-edca-43ca-82c4-5a7b529d8f82,61b947a5-edca-43ca-82c4-5a7b529d8f82,0,1,59eb6a7a-1d96-4985-8d8e-575162759415,59eb6a7a-1d96-4985-8d8e-575162759415,0,1,68564573-ed49-4519-a8b3-997865fe70a6,68564573-ed49-4519-a8b3-997865fe70a6,0,1,6c789969-d066-489d-ad88-92e2a5a6ec69,6c789969-d066-489d-ad88-92e2a5a6ec69,0,1,2a07d696-75d6-4a12-a310-30d6598b4a4c,2a07d696-75d6-4a12-a310-30d6598b4a4c,0,1,dde88f56-417c-4559-a893-85dc91e7e623,dde88f56-417c-4559-a893-85dc91e7e623,0,1,963eedab-6976-4a98-b9ad-b81f89239661,963eedab-6976-4a98-b9ad-b81f89239661,0,1,3370d43e-8e97-4411-8123-2bb2bcf60a75,3370d43e-8e97-4411-8123-2bb2bcf60a75,0,1,d9d377c9-406f-4bc9-8076-1f049348b816,d9d377c9-406f-4bc9-8076-1f049348b816,0,1,dcfcb108-3761-43d9-ad2a-29633bd1ae47,dcfcb108-3761-43d9-ad2a-29633bd1ae47,0,1,36baa776-83c4-413d-b70c-cbbc45e25662,36baa776-83c4-413d-b70c-cbbc45e25662,0,1,b65f9165-c20d-4053-8a0b-cff3f693b762,b65f9165-c20d-4053-8a0b-cff3f693b762,0,1,51af096b-687f-44f4-a0d8-306f670fc5ce,51af096b-687f-44f4-a0d8-306f670fc5ce,0,1,75972f88-aedd-4338-a3b5-320cd632a2e6,75972f88-aedd-4338-a3b5-320cd632a2e6,0,1,a720abc8-dcf0-4684-8d94-22d394a8e4df,a720abc8-dcf0-4684-8d94-22d394a8e4df,0,1,e40f53de-c27b-4e74-8241-f784d7ca5c84,e40f53de-c27b-4e74-8241-f784d7ca5c84,0,1,ef38b84d-277e-48c2-8826-330132eb6807,ef38b84d-277e-48c2-8826-330132eb6807,0,1,67a50910-059a-4724-84e0-c21bc3ac74c2,67a50910-059a-4724-84e0-c21bc3ac74c2,0,1,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,fdd83a89-a2fe-40d8-a531-a10bfeb36a1d,0,1,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0d190f8b-87c5-4dd1-bcfb-609ec3a44f72,0,1,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,9e78a2b9-44fc-4971-801d-1ddd4bb09cfd,0,1,2c0d11fc-b927-4b5d-a16c-d60e69580824,2c0d11fc-b927-4b5d-a16c-d60e69580824,0,1,5251e744-666e-48a0-a5b4-9cef313c7631,5251e744-666e-48a0-a5b4-9cef313c7631,0,1,0b09cf2f-1759-4362-b997-29e09ac00445,0b09cf2f-1759-4362-b997-29e09ac00445,0,1,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,f6a9eb9c-a1c2-4114-b155-3ce94c7b7f20,0,1,828ddf5d-ca09-4baf-897f-77d569e02a6b,828ddf5d-ca09-4baf-897f-77d569e02a6b,0,1,8856015c-a695-4b1a-99ef-770263f9dc4a,8856015c-a695-4b1a-99ef-770263f9dc4a,0,1,183ec2b5-e173-4885-9e26-1098ffa15020,183ec2b5-e173-4885-9e26-1098ffa15020,0,1,74702fdf-bfc5-4658-ba58-e39bcfbaa647,74702fdf-bfc5-4658-ba58-e39bcfbaa647,0,1,2f436ec3-6a04-4d2c-998a-c60ea875ca86,2f436ec3-6a04-4d2c-998a-c60ea875ca86,0,1,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,6a947b2d-3e6b-42c8-a9fd-4c5a71d600a9,0,1,ae641a80-4ada-4592-ace9-29a82e6700e4,ae641a80-4ada-4592-ace9-29a82e6700e4,0,1,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,c6bf0d10-5406-44e8-b3f3-74b7db2b71e6,0,1,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,8d653af4-ac00-4ca9-a9e6-4e1a888c6dfb,0,1,703453e8-cb49-491b-8e19-a17b89894d1e,703453e8-cb49-491b-8e19-a17b89894d1e,0,1,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,190bc52e-0d51-4dfc-9f16-99ed71ebfa75,0,1,0c24858a-7e64-426f-9b59-392449aecaf5,0c24858a-7e64-426f-9b59-392449aecaf5,0,1,b1d61e28-f3dc-418b-b5df-f75622a4b980,b1d61e28-f3dc-418b-b5df-f75622a4b980,0,1,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,bec4c82f-4e76-4d16-bb4d-b6d9fa404c5d,0,1,4033f86b-d250-475a-8837-071bf31664b0,4033f86b-d250-475a-8837-071bf31664b0,0,1,876e31ff-ab7b-4ea4-b491-161963727dd1,876e31ff-ab7b-4ea4-b491-161963727dd1,0,1,bb43995b-68b4-41a1-8458-e10a2d8925f1,bb43995b-68b4-41a1-8458-e10a2d8925f1,0,1,61730dd9-fed7-43ce-8f38-724cac8f3d08,61730dd9-fed7-43ce-8f38-724cac8f3d08,0,1,e6a494b8-27e7-46a6-9435-7be6e150a69e,e6a494b8-27e7-46a6-9435-7be6e150a69e,0,1,133dc852-59d3-4351-934d-8845f8a38431,133dc852-59d3-4351-934d-8845f8a38431,0,1,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,55dbaaf1-554d-46e2-b42a-ce6a8bf20dfb,0,1,b57eca91-04c2-4412-b5e2-f3c71f8ec602,b57eca91-04c2-4412-b5e2-f3c71f8ec602,0,1,b67914a8-d483-4bed-bd4d-a4aadd4998a4,b67914a8-d483-4bed-bd4d-a4aadd4998a4,0,1,744a52c8-6e4d-4356-a35a-3d2b01ad4a9f,744a52c8-6e4d-4356-a35a-3d2b01ad4a9f,0,1,707a8a49-fec5-454c-9e80-c3da829d395c,707a8a49-fec5-454c-9e80-c3da829d395c,0,1,6f630213-c16c-421c-a160-09e3c729ab26,6f630213-c16c-421c-a160-09e3c729ab26,0,1,878c638c-7c84-4914-896a-d4fdf0d759ef,878c638c-7c84-4914-896a-d4fdf0d759ef,0,1,6065653e-b7a9-4033-9617-f64430c57d89,6065653e-b7a9-4033-9617-f64430c57d89,0,1,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,9ec63da6-1f53-417f-9c7d-6879eaa56a7e,0,1,00d1d85b-c258-4f10-9d13-a99375a29fc1,00d1d85b-c258-4f10-9d13-a99375a29fc1,0,1,0544376f-461c-42c3-a102-e0ae65e3c0c6,0544376f-461c-42c3-a102-e0ae65e3c0c6,0,1,6df8d316-6ac3-4626-8951-1ad36d7049ed,6df8d316-6ac3-4626-8951-1ad36d7049ed,0,1,f211b418-899d-4220-a14b-4a7302183e46,f211b418-899d-4220-a14b-4a7302183e46,0,1,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,e499629a-69ed-46b4-be5d-7b1f2f6a11d4,0,1,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,52ab6aea-e6a0-43f0-9cc8-f7c9126635cc,0,1,876b23bf-2f48-4916-ad0f-4de8306e1864,876b23bf-2f48-4916-ad0f-4de8306e1864,0,1,e983f539-e369-491e-9cee-510518187870,e983f539-e369-491e-9cee-510518187870,0,1,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,9a402a9c-a31f-4082-91d5-b4fe7576a5c2,0,1,e99a1b17-0e37-489a-bc39-3dd2e23b0861,e99a1b17-0e37-489a-bc39-3dd2e23b0861,0,1,e7c63a25-c804-4bc4-a6f1-81009dd889e2,e7c63a25-c804-4bc4-a6f1-81009dd889e2,0,1,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,7ccd86cd-4294-4f6c-84f4-98e25e479f4d,0,1,70e710c5-42df-465f-a9c5-8345c87e1f19,70e710c5-42df-465f-a9c5-8345c87e1f19,0,1,4c1576c4-b327-4ec1-87bc-662c5aba343b,4c1576c4-b327-4ec1-87bc-662c5aba343b,0,1,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0f694ef1-4a97-4aed-ab4b-0b2c18ea7e17,0,1,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,14facdfb-9835-4bb6-98a8-5a6ca9a5d2f8,0,1,4492ac73-eb91-41f8-98f1-54c2b3ad212a,4492ac73-eb91-41f8-98f1-54c2b3ad212a,0,1,869b43fb-968f-4fe0-b945-5030c90a38f2,869b43fb-968f-4fe0-b945-5030c90a38f2,0,1,af071a52-212b-4131-98e6-81f6048a70e6,af071a52-212b-4131-98e6-81f6048a70e6,0,1,64eff9f4-c57b-40a0-bd83-7e371fd010ce,64eff9f4-c57b-40a0-bd83-7e371fd010ce,0,1,0eee931a-57bb-4844-8e6e-eaca342640a0,0eee931a-57bb-4844-8e6e-eaca342640a0,0,1,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,3f289f67-dfc7-4f2d-90e4-b47aff76ecdb,0,1,37210dde-9a2f-475c-8341-578ac99f0e17,37210dde-9a2f-475c-8341-578ac99f0e17,0,1,3d662173-e19d-4077-9a08-8c8899226e24,3d662173-e19d-4077-9a08-8c8899226e24,0,1,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,706a3db0-9d4f-4c08-91cd-3ccaa6d06d3b,0,1,3a8fffb6-a732-440c-afb9-d1c699ea53b6,3a8fffb6-a732-440c-afb9-d1c699ea53b6,0,1,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,33dd6bba-0044-4e2f-ae9e-c8a26079ab2a,0,1,a1d91c5f-1acd-4b46-887e-d06e7260dd20,a1d91c5f-1acd-4b46-887e-d06e7260dd20,0,1,3fd26019-c464-4c73-b18e-0888740b1747,3fd26019-c464-4c73-b18e-0888740b1747,0,1,9aadad98-69f5-41ce-ad1c-0afd8c610d86,9aadad98-69f5-41ce-ad1c-0afd8c610d86,0,1,69fd1e6e-7302-4ca8-8419-ec567ae66bef,69fd1e6e-7302-4ca8-8419-ec567ae66bef,0,1,b0650787-8ff5-4407-b491-bcdc2f61fd58,b0650787-8ff5-4407-b491-bcdc2f61fd58,0,1,d792831c-698d-40c6-96c2-dd0ae6f30707,d792831c-698d-40c6-96c2-dd0ae6f30707,0,1,6f9a3d00-d935-4fa6-9fd2-14700226daff,6f9a3d00-d935-4fa6-9fd2-14700226daff,0,1,a21989bd-a57f-4969-be3b-d8b39ead4145,a21989bd-a57f-4969-be3b-d8b39ead4145,0,1,c4aee120-cdbb-4b48-a1c7-99cccbafb120,c4aee120-cdbb-4b48-a1c7-99cccbafb120,0,1,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,6b3e07d5-9299-4933-b3fa-c3cc5f5aa7c9,0,1,a3667b25-7c18-446d-a318-685a4fe4bf89,a3667b25-7c18-446d-a318-685a4fe4bf89,0,1,8103f12c-ed50-4052-8117-33b6d11ef620,8103f12c-ed50-4052-8117-33b6d11ef620,0,1,498b012b-bb63-490e-8100-1d33dc84b400,498b012b-bb63-490e-8100-1d33dc84b400,0,1,7c7857b6-90e8-4b3f-9902-fd81bf68d133,7c7857b6-90e8-4b3f-9902-fd81bf68d133,0,1,617de19c-bf01-4900-832a-c169e9faeb79,617de19c-bf01-4900-832a-c169e9faeb79,0,1,70b73fd0-f5dc-411e-9bbb-10a538e8281b,70b73fd0-f5dc-411e-9bbb-10a538e8281b,0,1,758f44ad-54da-4f72-accf-0afecc4f4827,758f44ad-54da-4f72-accf-0afecc4f4827,0,1,05ee4a7c-63e6-4587-8be7-e206345e3471,05ee4a7c-63e6-4587-8be7-e206345e3471,0,1,98d5e98b-0382-4b28-a5d9-24392925664a,98d5e98b-0382-4b28-a5d9-24392925664a,0,1,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,7c424a77-2a83-4a85-8b7d-e8bb6d013c77,0,1,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,ecaba9aa-fca7-42f5-a4fe-d8176cf875b9,0,1,4378ab20-5467-476b-8f04-4b6876efdee6,4378ab20-5467-476b-8f04-4b6876efdee6,0,1,55e47901-c79c-41c5-9d7f-6b6846ed2782,55e47901-c79c-41c5-9d7f-6b6846ed2782,0,1,3c429fe8-e663-4a58-817f-8f8382697dbb,3c429fe8-e663-4a58-817f-8f8382697dbb,0,1,c37be0c3-d2db-4e63-a8cb-7956a5396650,c37be0c3-d2db-4e63-a8cb-7956a5396650,0,1,83180e0d-fc4b-41ec-9a17-5af555a4776f,83180e0d-fc4b-41ec-9a17-5af555a4776f,0,1,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,7f68e4c1-c4f7-4c6c-8f0a-225e544e07ee,0,1,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,f03cdb56-ef3f-461f-91b1-cdcaed2786e8,0,1,3e8c6546-416c-4437-8c85-2cf591b4fc3f,3e8c6546-416c-4437-8c85-2cf591b4fc3f,0,1,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,038e5027-3cc5-4ea2-b0b5-28a7544ad53e,0,1,9a0b27db-e4ac-496b-b6de-876b90381527,9a0b27db-e4ac-496b-b6de-876b90381527,0,1,bac41d45-249f-40b4-a013-008e261369c8,bac41d45-249f-40b4-a013-008e261369c8,0,1,84e34b4a-02e8-4676-8b81-771ddf3c2931,84e34b4a-02e8-4676-8b81-771ddf3c2931,0,1,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0aa6a024-66ae-4592-87d6-f7cb2a59f906,0,1,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,734b4dc5-dc91-4945-a2d7-cefe56a6e0a6,0,1,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,bb2dcb37-410d-4a6c-9ace-1f04177d6e88,0,1,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,cb6ecc18-a14f-4c3c-a39d-2cd2d1ab4e03,0,1,f71ac535-74a5-4001-a613-455a9e1bf734,f71ac535-74a5-4001-a613-455a9e1bf734,0,1,55a42b83-b6d2-409b-a8ff-7849b08e07ed,55a42b83-b6d2-409b-a8ff-7849b08e07ed,0,1,61889399-ecc2-442c-a790-a8b27a7a540c,61889399-ecc2-442c-a790-a8b27a7a540c,0,1,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,ecd3a928-3e59-439c-8f58-ba360f2a8b3c,0,1,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,4ee2efbc-bc4a-4b47-bfdb-bb83f108c5bb,0,1,d6aed0fd-686c-430d-b884-74494177422e,d6aed0fd-686c-430d-b884-74494177422e,0,1,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,245ec4aa-ed65-41f7-b0f0-f8085cfc5bef,0,1,3ed64288-8bf0-4049-8d44-1b424f31d40f,3ed64288-8bf0-4049-8d44-1b424f31d40f,0,1,a21cf522-d657-49ba-a198-01ff1de5e3f0,a21cf522-d657-49ba-a198-01ff1de5e3f0,0,1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,4dc698da-8471-4b3f-816d-f1467cd2e5f1,0,1,7ceb2f18-4dae-4b13-a5be-e949be165b4e,7ceb2f18-4dae-4b13-a5be-e949be165b4e,0,1,c4f94f6d-e33f-4226-bf47-c4b544098082,c4f94f6d-e33f-4226-bf47-c4b544098082,0,1,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0abca5b8-4974-48aa-bf5d-dbbe2c2ea0e6,0,1,4e892154-3279-492c-9eae-124304225c5d,4e892154-3279-492c-9eae-124304225c5d,0,1,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,53a6ffa4-31f8-4717-9ecc-2852e6e4cce9,0,1,575a135a-6ffd-4ae8-a597-7e584df9bac4,575a135a-6ffd-4ae8-a597-7e584df9bac4,0,1,693a7196-f525-4bd2-a417-e902977f21cb,693a7196-f525-4bd2-a417-e902977f21cb,0,1,9bb39184-08b7-440e-a8f8-5caf0083ba0f,9bb39184-08b7-440e-a8f8-5caf0083ba0f,0,1,d48e817e-f6a4-47e5-a052-35d09e066490,d48e817e-f6a4-47e5-a052-35d09e066490,0,1,091cb921-c7e3-4a5f-97b7-34e625159b9c,091cb921-c7e3-4a5f-97b7-34e625159b9c,0,1,f6118cdd-1dcd-464e-a49d-e95c69466750,f6118cdd-1dcd-464e-a49d-e95c69466750,0,1,39932897-959b-41a6-94ad-61426abfdbd9,39932897-959b-41a6-94ad-61426abfdbd9,0,1,c56ea6f3-1032-4b7a-a20e-e912196da1cd,c56ea6f3-1032-4b7a-a20e-e912196da1cd,0,1,b69b611d-18d3-4e78-8a09-f010bcf9c261,b69b611d-18d3-4e78-8a09-f010bcf9c261,0,1,e8e087c1-9131-4037-8562-8bce8c38f78c,e8e087c1-9131-4037-8562-8bce8c38f78c,0,1,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,3b1c9126-9b9f-4658-967c-cc9ef5b1000f,0,1,6adaef8e-82b6-4664-9748-4f41b170d91a,6adaef8e-82b6-4664-9748-4f41b170d91a,0,1,20d655a7-788c-48bc-83ae-25003106bedb,20d655a7-788c-48bc-83ae-25003106bedb,0,1,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,7bfb78de-899f-4a4d-a8b2-ebadeccf3921,0,1,68a72014-4b2e-4347-aaa7-54d95b8eb919,68a72014-4b2e-4347-aaa7-54d95b8eb919,0,1,a71d9c41-7510-4d38-90df-1034977b8f45,a71d9c41-7510-4d38-90df-1034977b8f45,0,1,25830f5b-27e2-4eff-9728-b21eb498727d,25830f5b-27e2-4eff-9728-b21eb498727d,0,1,379c9295-d0d5-418d-82f3-5ae19985cc53,379c9295-d0d5-418d-82f3-5ae19985cc53,0,1,af02f534-8508-4f9f-bcc1-0c6f3d696971,af02f534-8508-4f9f-bcc1-0c6f3d696971,0,1,dd345cfb-ea0c-4ea8-9b35-22547b000275,dd345cfb-ea0c-4ea8-9b35-22547b000275,0,1,86a871da-3725-43a1-a7c3-98acd187011b,86a871da-3725-43a1-a7c3-98acd187011b,0,1,2447cfeb-d877-4222-8ac2-b0026b85f932,2447cfeb-d877-4222-8ac2-b0026b85f932,0,1,fb94e9cb-1f27-42a6-a701-18bbe5888e70,fb94e9cb-1f27-42a6-a701-18bbe5888e70,0,1,2e26e32e-a0c6-4460-99de-865622202166,2e26e32e-a0c6-4460-99de-865622202166,0,1,c9489a6e-45af-4877-9788-158071571a0a,c9489a6e-45af-4877-9788-158071571a0a,0,1,23959912-f8fc-42bc-9ec2-1d520ebc5dad,23959912-f8fc-42bc-9ec2-1d520ebc5dad,0,1,4770398f-8013-4d43-93ce-ec1165e40c4e,4770398f-8013-4d43-93ce-ec1165e40c4e,0,1,9a706997-90cb-430d-972c-d2bad87c4a79,9a706997-90cb-430d-972c-d2bad87c4a79,0,1,6f661660-b9c4-41d4-99a8-e08006cfe9c8,6f661660-b9c4-41d4-99a8-e08006cfe9c8,0,1,199e79fa-54d6-4748-aaaa-9c55283582a3,199e79fa-54d6-4748-aaaa-9c55283582a3,0,1,5ef026c2-2ef4-45d6-9792-5ba0d298714b,5ef026c2-2ef4-45d6-9792-5ba0d298714b,0,1,45d61391-4cf7-4f45-8775-ada582c42400,45d61391-4cf7-4f45-8775-ada582c42400,0,1,78b2a913-2ab9-455d-85a3-504f0f468468,78b2a913-2ab9-455d-85a3-504f0f468468,0,1,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,8c7e1080-fbb2-4a9c-b740-b3e9eb996565,0,1,560b5b12-4dee-4c69-ab6b-7680757a2797,560b5b12-4dee-4c69-ab6b-7680757a2797,0,1,3cfb1ce0-de42-4914-85c0-807d0c10f77e,3cfb1ce0-de42-4914-85c0-807d0c10f77e,0,1,a27244c2-ac65-423f-afce-42efd288a83d,a27244c2-ac65-423f-afce-42efd288a83d,0,1,d4002184-8e08-4dcc-9070-62f595e82e23,d4002184-8e08-4dcc-9070-62f595e82e23,0,1,62163fda-1a09-4d4f-b290-76ff324042ab,62163fda-1a09-4d4f-b290-76ff324042ab,0,1,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,f2816dd2-47dd-41e8-9709-6dac1e4f4d21,0,1,6e6a1557-06fa-45c0-ad98-c43809553cd7,6e6a1557-06fa-45c0-ad98-c43809553cd7,0,1,179f7436-e328-42b8-9382-19ee6f10c768,179f7436-e328-42b8-9382-19ee6f10c768,0,1,aa89881f-f111-4384-911c-847b04bb56dd,aa89881f-f111-4384-911c-847b04bb56dd,0,1,444d9e3b-c702-4ad6-a929-a220eff0f6e7,444d9e3b-c702-4ad6-a929-a220eff0f6e7,0,1,022c4519-1cdb-45b6-a699-89fd6688999c,022c4519-1cdb-45b6-a699-89fd6688999c,0,1,fb5b79a2-caec-4c6e-a112-27e78a184d5e,fb5b79a2-caec-4c6e-a112-27e78a184d5e,0,1,fa523958-ce1e-42e1-ae00-2dcb401b7eda,fa523958-ce1e-42e1-ae00-2dcb401b7eda,0,1,1518bca2-a004-4566-8991-7c60e6745a49,1518bca2-a004-4566-8991-7c60e6745a49,0,1,ed8618e2-3ce6-4956-856a-9f40279b4da6,ed8618e2-3ce6-4956-856a-9f40279b4da6,0,1,733f6bc2-544d-4fac-bca8-11b981b95a03,733f6bc2-544d-4fac-bca8-11b981b95a03,0,1,0333cd9e-392d-40b2-869d-ad47119e0384,0333cd9e-392d-40b2-869d-ad47119e0384,0,1,82cc8820-0b92-4bb7-b097-7ac79e922f01,82cc8820-0b92-4bb7-b097-7ac79e922f01,0,1,f2267d6c-6972-4621-b677-87798056363b,f2267d6c-6972-4621-b677-87798056363b,0,1,243d201b-3714-4700-b410-c74c9093e6f6,243d201b-3714-4700-b410-c74c9093e6f6,0,1,de3cb50c-ef99-419e-b922-c6a453da6a5b,de3cb50c-ef99-419e-b922-c6a453da6a5b,0,1,d4ca4802-756a-494c-bab3-e77e0777a3fa,d4ca4802-756a-494c-bab3-e77e0777a3fa,0,1,134c1054-8d65-405f-ba3b-5beeca803a72,134c1054-8d65-405f-ba3b-5beeca803a72,0,1,cfa1669b-5310-4171-83fd-4dff3c6ac345,cfa1669b-5310-4171-83fd-4dff3c6ac345,0,1,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,9ec26d14-b09d-4fd7-9c43-062c0120cf3d,0,1,aec7df6a-21a1-495d-b0a9-3769e1069888,aec7df6a-21a1-495d-b0a9-3769e1069888,0,1,463b98bf-b4d4-4edb-995d-0a75ff29b60d,463b98bf-b4d4-4edb-995d-0a75ff29b60d,0,1,317f88a7-12a4-4d21-b637-3050525406f4,317f88a7-12a4-4d21-b637-3050525406f4,0,1,2d9d2319-68fb-436d-b431-98858b88a75a,2d9d2319-68fb-436d-b431-98858b88a75a,0,1,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,8a0d4f7f-7a80-4e5d-8238-05fc169e0319,0,1,8e9f9baf-8d12-46cc-915f-f6f290af5512,8e9f9baf-8d12-46cc-915f-f6f290af5512,0,1,5808331f-9ab4-4a23-a592-1f65087f3214,5808331f-9ab4-4a23-a592-1f65087f3214,0,1,9316738d-3d38-4068-818e-a001355b19fb,9316738d-3d38-4068-818e-a001355b19fb,0,1,d86d766f-021a-4c11-b9e8-403af08918cc,d86d766f-021a-4c11-b9e8-403af08918cc,0,1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,2cedfef0-5d93-475a-b2dd-ee36e553e6e1,0,1,29200d04-d7da-435a-89e6-858c11a1a98c,29200d04-d7da-435a-89e6-858c11a1a98c,0,1,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,8e5f6c70-04b3-46a1-94ef-82c9f6019f8f,0,1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,6c119ef2-d24b-4c3d-ad07-611bed89cab1,0,1,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,13b1cb1f-88df-4ff8-b4cc-0473e4f96005,0,1,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0e861ad8-6fa3-4b0f-a9b0-6c91df1dfc6b,0,1,27df6c22-85d7-4cb6-be19-82af76c84bf9,27df6c22-85d7-4cb6-be19-82af76c84bf9,0,1,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,77bd95d6-3cd5-4b67-a0b6-72d24243fbc2,0,1,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0be7f905-53b8-4bb1-8e37-dcc142e508c5,0,1,4ec242e0-75d1-4bf7-be18-783e7aa4f236,4ec242e0-75d1-4bf7-be18-783e7aa4f236,0,1,e02b1366-9d7a-462f-86a1-436bbf4532ff,e02b1366-9d7a-462f-86a1-436bbf4532ff,0,1,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,40ee729c-c317-4a1c-b985-5f7e4e1e20fb,0,1,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,2feb35c0-b046-4086-a2ce-ccc462fc6e9c,0,1,8811cc64-99d9-4f13-8309-c29965783f5a,8811cc64-99d9-4f13-8309-c29965783f5a,0,1,7c737071-e850-4a3f-8942-697ef52a8ecc,7c737071-e850-4a3f-8942-697ef52a8ecc,0,1,62eff222-7b74-4cab-9138-880db1f05147,62eff222-7b74-4cab-9138-880db1f05147,0,1,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,39c6c277-cfc6-4e8a-8e7f-afcff55f0511,0,1,860f8893-22fe-4b13-adb1-24e1ea8c6544,860f8893-22fe-4b13-adb1-24e1ea8c6544,0,1,95266e9f-073f-4de3-83c6-cc0d9ee9334f,95266e9f-073f-4de3-83c6-cc0d9ee9334f,0,1,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,21b8ac8d-75ca-481c-8e85-01bc2029f0c0,0,1,d5012e69-89bc-40af-8e4f-377a042854ee,d5012e69-89bc-40af-8e4f-377a042854ee,0,1,02f79fd8-5315-4c90-b520-db67dcb6e371,02f79fd8-5315-4c90-b520-db67dcb6e371,0,1,9bb52788-4a3a-48b5-a551-5ca753b6c059,9bb52788-4a3a-48b5-a551-5ca753b6c059,0,1,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,4fb5004f-3cd9-44c4-a44b-d235cccf9e9c,0,1,872a0c47-fab5-4a54-8ab9-23940bbdefbb,872a0c47-fab5-4a54-8ab9-23940bbdefbb,0,1,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,7428a626-3fbc-4f2c-a3dd-f14e8d90c00b,0,1,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,2f20bff4-9201-4f36-9e74-eba4d9b3c59a,0,1,b6c94efd-5994-4c4c-a641-b062ecc38b65,b6c94efd-5994-4c4c-a641-b062ecc38b65,0,1,98501228-7f0e-45a3-b58f-4c654f393f80,98501228-7f0e-45a3-b58f-4c654f393f80,0,1,502384c9-edb7-451a-b7ea-de006f657a6e,502384c9-edb7-451a-b7ea-de006f657a6e,0,1,4e1a4fe0-dca4-40ba-9369-73be303a4aef,4e1a4fe0-dca4-40ba-9369-73be303a4aef,0,1,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,329906a0-0b61-4f3f-8cd0-f06a78e8fe5f,0,1,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,840e0b1b-a599-4c5f-8eaa-7f7e4f2e55a4,0,1,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,1d06a9e4-e637-4219-a81c-64f8ec1b91a4,0,1,50968921-76f3-4108-835a-96b153671c8d,50968921-76f3-4108-835a-96b153671c8d,0,1,b773f510-1485-4886-9071-afcbf49ff856,b773f510-1485-4886-9071-afcbf49ff856,0,1,964403f2-0a87-49e1-b183-dbe3624e3805,964403f2-0a87-49e1-b183-dbe3624e3805,0,1,01579044-5659-4a73-a989-c52cfabaae66,01579044-5659-4a73-a989-c52cfabaae66,0,1,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,9b8509e8-8262-4e6a-b2f3-a0df8f49e2c5,0,1,911baaa1-a4de-4558-b00e-51644144a762,911baaa1-a4de-4558-b00e-51644144a762,0,1,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,8a8ad123-c01a-440a-bd01-1c0da72cf2eb,0,1,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,ca4ef957-36c2-43b9-8ff7-e2b7ee58cde5,0,1,4e036eff-92a8-4010-89b2-ed949c123311,4e036eff-92a8-4010-89b2-ed949c123311,0,1,38160114-dc22-4d0b-86a5-d650f4756932,38160114-dc22-4d0b-86a5-d650f4756932,0,1,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,d49411b4-5f6d-48c5-b4f8-fdfbd1b73317,0,1,8b3da21b-ea3f-47cf-af48-15b886b21f20,8b3da21b-ea3f-47cf-af48-15b886b21f20,0,1,32c4750b-0096-4bbc-8dcd-c1f717734233,32c4750b-0096-4bbc-8dcd-c1f717734233,0,1,be6740b1-1f57-4c01-a67a-d48152931dc8,be6740b1-1f57-4c01-a67a-d48152931dc8,0,1,40fd038d-a93a-4be7-9221-d8ae83350ca0,40fd038d-a93a-4be7-9221-d8ae83350ca0,0,1,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,e9fcabef-5067-477b-8cb0-1bf3ab8161c5,0,1,29adc9e5-a994-48ab-a5a1-919d01119c3a,29adc9e5-a994-48ab-a5a1-919d01119c3a,0,1,c47ffce7-c905-4e88-8b1f-156f47047ccd,c47ffce7-c905-4e88-8b1f-156f47047ccd,0,1,e1755eed-88cf-42c1-83e4-f9047f2c30bf,e1755eed-88cf-42c1-83e4-f9047f2c30bf,0,1,c6ec9d48-9131-4735-9cf7-b498705a57e4,c6ec9d48-9131-4735-9cf7-b498705a57e4,0,1,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,865d76f7-db4a-4fa2-8e1c-3ecbc2d8faf4,0,1,706c421a-74ce-4985-9443-b4a2032481f6,706c421a-74ce-4985-9443-b4a2032481f6,0,1,64da4c24-4aaf-42c8-8595-7f60ff3bc344,64da4c24-4aaf-42c8-8595-7f60ff3bc344,0,1,fb9577e1-00d9-4d52-8de9-23914929a683,fb9577e1-00d9-4d52-8de9-23914929a683,0,1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,ffd62a16-f2b4-4e3a-8849-15b957a3d1a1,0,1,529253ae-9c92-4426-b150-8444ba622f89,529253ae-9c92-4426-b150-8444ba622f89,0,1,06a1955a-2ef0-4607-9dcb-a480a7951af7,06a1955a-2ef0-4607-9dcb-a480a7951af7,0,1,6f8fcc96-bfed-444a-908d-95c5b1c64972,6f8fcc96-bfed-444a-908d-95c5b1c64972,0,1,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,97ce4bf2-6580-4f27-8b5d-d60b66a09c9e,0,1,a84c89d9-2cfe-405f-9bb0-5392b3171695,a84c89d9-2cfe-405f-9bb0-5392b3171695,0,1,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,070ecbfe-88d6-4de8-b236-e7eedbc3ebc6,0,1,91e26e73-027f-4a10-9083-e5182e768723,91e26e73-027f-4a10-9083-e5182e768723,0,1,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,e55680f4-cb1a-4cdb-88f0-5d82f43c1d05,0,1,54433668-4391-4dea-8baf-43e9aa1d624e,54433668-4391-4dea-8baf-43e9aa1d624e,0,1,fc309616-060a-42c3-8401-dfef0f359bc5,fc309616-060a-42c3-8401-dfef0f359bc5,0,1,b968398d-973d-4643-95a5-16633d7e48bc,b968398d-973d-4643-95a5-16633d7e48bc,0,1,b9507495-2536-4895-b68b-62acd74343f6,b9507495-2536-4895-b68b-62acd74343f6,0,1,e05a14cc-9051-4c38-9725-19856e36d260,e05a14cc-9051-4c38-9725-19856e36d260,0,1,8154aa0f-ecd6-4ab0-9498-56ef25486a55,8154aa0f-ecd6-4ab0-9498-56ef25486a55,0,1,9d6429f7-23da-4596-822a-04818deb3088,9d6429f7-23da-4596-822a-04818deb3088,0,1,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,a1b67bd2-3220-497d-b2b4-bd0ea62d9111,0,1,acb533e7-4610-4f92-b548-1a4ff1a423d4,acb533e7-4610-4f92-b548-1a4ff1a423d4,0,1,8697999d-9cdb-43d8-979b-3f283daffdd3,8697999d-9cdb-43d8-979b-3f283daffdd3,0,1,23378687-249c-4ec6-99b8-b13fb04b8643,23378687-249c-4ec6-99b8-b13fb04b8643,0,1,66315b12-7abf-46e0-a994-894b827b1301,66315b12-7abf-46e0-a994-894b827b1301,0,1,dba174fb-8392-4451-8069-ae8145658e34,dba174fb-8392-4451-8069-ae8145658e34,0,1,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,ff5dd4f8-8a16-4a41-875d-c4f7c37ae67a,0,1,4435d99d-a1df-43e6-97ab-5e651017c61d,4435d99d-a1df-43e6-97ab-5e651017c61d,0,1,2398d69d-ecdd-4d34-bdae-34ed5507a61e,2398d69d-ecdd-4d34-bdae-34ed5507a61e,0,1,a707035a-0172-4b55-b589-fa4a8be9b596,a707035a-0172-4b55-b589-fa4a8be9b596,0,1,c4456e94-8c76-49b1-b85a-433e0f65bdb0,c4456e94-8c76-49b1-b85a-433e0f65bdb0,0,1,4a347209-3a07-48ea-b407-6ee37f1d69f2,4a347209-3a07-48ea-b407-6ee37f1d69f2,0,1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,e0a3fab1-3fe9-4927-840e-f983f72bdfc1,0,1,df31eee8-387d-40d1-98df-1f7d8176b50e,df31eee8-387d-40d1-98df-1f7d8176b50e,0,1,c8364283-5525-4bef-8e96-abced54c6a4a,c8364283-5525-4bef-8e96-abced54c6a4a,0,1,40e2fb30-bb03-4178-a8eb-ddf48337ef23,40e2fb30-bb03-4178-a8eb-ddf48337ef23,0,1,1026fbcb-acd8-40dc-b638-6e02c6378c55,1026fbcb-acd8-40dc-b638-6e02c6378c55,0,1,dc9e2ba6-f4f1-493f-9054-cac633f239dd,dc9e2ba6-f4f1-493f-9054-cac633f239dd,0,1,7b95d0b1-c7b2-43b4-9119-320cb8912032,7b95d0b1-c7b2-43b4-9119-320cb8912032,0,1,004582b7-00aa-405e-8e24-ce76c945edae,004582b7-00aa-405e-8e24-ce76c945edae,0,1,97a9b005-a836-4308-8e63-0e00f6890baa,97a9b005-a836-4308-8e63-0e00f6890baa,0,1,98c34ada-0b78-41db-9183-6d7b9e466bde,98c34ada-0b78-41db-9183-6d7b9e466bde,0,1,fb688339-918e-40a1-8721-a26f3077973e,fb688339-918e-40a1-8721-a26f3077973e,0,1,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,1f56de63-81eb-4de5-ad20-01cb6f84e5b0,0,1,079ba95c-8293-47e2-b8bd-7acf73c2d880,079ba95c-8293-47e2-b8bd-7acf73c2d880,0,1,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,fbe1dcf7-c11d-4395-ab3a-c2f986c25419,0,1,a5f264a8-a547-4653-abb1-eb1666d527dc,a5f264a8-a547-4653-abb1-eb1666d527dc,0,1,dabae379-6356-497a-aab5-cf102f16a72a,dabae379-6356-497a-aab5-cf102f16a72a,0,1,337370e0-1021-4887-9d38-6c3833c90a5b,337370e0-1021-4887-9d38-6c3833c90a5b,0,1,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0ff569eb-d5b8-4ab1-ac77-5e5afd6d44d0,0,1,d6f01f1c-801b-4776-ae11-48236103f76a,d6f01f1c-801b-4776-ae11-48236103f76a,0,1,b6fe68cf-657b-40e0-af2e-247607a86519,b6fe68cf-657b-40e0-af2e-247607a86519,0,1,9b0b8191-94b7-428f-be86-e9e4cd24a72f,9b0b8191-94b7-428f-be86-e9e4cd24a72f,0,1,a923dbcb-7146-4445-ad17-f4a32c16a837,a923dbcb-7146-4445-ad17-f4a32c16a837,0,1,41dec792-1d1a-4e06-a54b-a86193b98225,41dec792-1d1a-4e06-a54b-a86193b98225,0,1,52257beb-3e0c-4681-b430-9690398cd13a,52257beb-3e0c-4681-b430-9690398cd13a,0,1,135e637c-c28e-4547-8da2-d897dca54cb2,135e637c-c28e-4547-8da2-d897dca54cb2,0,1,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,245be006-6d0a-4c9e-97c5-f3c2ddd734f7,0,1,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,a0b74de9-06b5-416c-9dd0-2f9dc209fe91,0,1,5356543a-db9a-4265-b83f-31d45544c8e6,5356543a-db9a-4265-b83f-31d45544c8e6,0,1,857dd311-9c6d-4dba-82d8-283d7b05b09e,857dd311-9c6d-4dba-82d8-283d7b05b09e,0,1,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,1055d15b-8cb5-4ff0-a526-7fd20a08a96c,0,1,af88ea84-5742-4c9f-9a02-6d0f25186f72,af88ea84-5742-4c9f-9a02-6d0f25186f72,0,1,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,79ad09ba-875a-46bd-9cd9-9d084bf4f6ea,0,1,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,1a4ed7cf-3294-4a5c-9650-75b61d6b2531,0,1,872521e3-413c-45ac-a6ea-39fe1324bae8,872521e3-413c-45ac-a6ea-39fe1324bae8,0,1,81ef02df-498d-4af0-8254-dc6730cbf140,81ef02df-498d-4af0-8254-dc6730cbf140,0,1,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,bcbdba9e-0b29-4ea7-a7d5-1de819bf86ec,0,1,fe926c88-d792-4db3-abcf-3c94dfdcc407,fe926c88-d792-4db3-abcf-3c94dfdcc407,0,1,e0c51555-1614-4aa7-a075-c5e1251579ba,e0c51555-1614-4aa7-a075-c5e1251579ba,0,1,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,cb65fbad-69a0-47d8-b4a9-da49274c3eb7,0,1,51363236-c8eb-4eb7-9692-5c18edc9a5a8,51363236-c8eb-4eb7-9692-5c18edc9a5a8,0,1,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,402f2fe0-4d08-4701-9c8f-0c2bb75815ef,0,1,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,8cad6cfd-91d0-4563-800a-d60c8a1b6a03,0,1,2902460a-ed86-41cf-8e8f-895adab9a72f,2902460a-ed86-41cf-8e8f-895adab9a72f,0,1,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,c4968b4e-0715-43a5-92ad-c8cd276fbf7b,0,1,f82d5bd6-4c74-4c23-978c-565aae3d752a,f82d5bd6-4c74-4c23-978c-565aae3d752a,0,1,7fba41a5-4faa-412b-b367-b30ced0314c0,7fba41a5-4faa-412b-b367-b30ced0314c0,0,1,98422d20-9a71-40e4-966e-6958d44eaefb,98422d20-9a71-40e4-966e-6958d44eaefb,0,1,37333d0b-3589-4b8b-bf6c-e605e0287b66,37333d0b-3589-4b8b-bf6c-e605e0287b66,0,1,1813c469-da20-46a6-8947-6815b66f64c1,1813c469-da20-46a6-8947-6815b66f64c1,0,1,ad083c26-7461-4e94-b524-0174242fbd91,ad083c26-7461-4e94-b524-0174242fbd91,0,1,5ce39370-f918-493f-bb24-53346b6fd836,5ce39370-f918-493f-bb24-53346b6fd836,0,1,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,84f22fd2-e0d0-42ce-8628-1b13c021a4cb,0,1,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0e3d2750-bb4c-42b9-9829-60f1480ced9c,0,1,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,d1b6c5e8-7625-43aa-bb11-943c9bfa01b7,0,1,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,dad11c2e-08fc-4a6b-8829-8be6c64c15fc,0,1,a76b1fd1-ba00-40e6-8756-f17fee449818,a76b1fd1-ba00-40e6-8756-f17fee449818,0,1,5c913626-48d1-4e0a-a423-64078ce59c7b,5c913626-48d1-4e0a-a423-64078ce59c7b,0,1,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0a4e6b7a-b380-4547-bc3c-5d6895a5d19a,0,1,7b0ec304-1904-413e-a9c6-ff62e87107dd,7b0ec304-1904-413e-a9c6-ff62e87107dd,0,1,d4dd8c96-914d-496f-b735-ef85ec473605,d4dd8c96-914d-496f-b735-ef85ec473605,0,1,62517db4-59e6-4945-bcd6-b3f1845572bf,62517db4-59e6-4945-bcd6-b3f1845572bf,0,1,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,a6a9dd40-24cd-4d40-a12d-44f94f8c05a7,0,1,f0f72149-0e7f-441a-b70d-8f47d4977927,f0f72149-0e7f-441a-b70d-8f47d4977927,0,1,776efc3e-ac27-4550-bafd-6e91aa987af2,776efc3e-ac27-4550-bafd-6e91aa987af2,0,1,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,9f478c85-b72c-40ae-aa08-7ddf73b5b15c,0,1,cc438366-85ea-48be-8b74-d05cddb1fc51,cc438366-85ea-48be-8b74-d05cddb1fc51,0,1,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,4688fd3b-4a92-4ed8-b111-0cf22a729b1c,0,1,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,92029d1f-0472-4aaa-8fd6-9fb3c3cf414e,0,1,3271b800-1825-422f-97bb-757baf403e90,3271b800-1825-422f-97bb-757baf403e90,0,1,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,6fd6efc1-facc-4ece-a5b3-3dce6acca81d,0,1,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,4ee82868-7a20-4c3a-91f9-42a6bf53ac37,0,1,a040c756-4687-4bfd-a690-b122d3c490e5,a040c756-4687-4bfd-a690-b122d3c490e5,0,1,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,bd5940d5-13fd-4f59-bb6c-614f93f9c8e4,0,1,961a9801-3956-4ea0-b0d3-908f09bf4929,961a9801-3956-4ea0-b0d3-908f09bf4929,0,1,6fac5c14-e126-4342-9078-edf1d0efcbf2,6fac5c14-e126-4342-9078-edf1d0efcbf2,0,1,0a3325a1-21c4-4997-882f-4ac2edc175f0,0a3325a1-21c4-4997-882f-4ac2edc175f0,0,1,f0620d5a-e1fe-419f-af37-e0f462f97e8d,f0620d5a-e1fe-419f-af37-e0f462f97e8d,0,1,3e2f2ae1-c809-43fc-8276-b0a16a92858c,3e2f2ae1-c809-43fc-8276-b0a16a92858c,0,1,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,b58942ca-1367-4e1d-b5b4-7d973d0fecd8,0,1,1a7c7427-bead-4655-9dd6-df6e722663c5,1a7c7427-bead-4655-9dd6-df6e722663c5,0,1,3ad08f4a-6202-4099-b6cc-bc116e6731a0,3ad08f4a-6202-4099-b6cc-bc116e6731a0,0,1,fd96c8ab-602a-4735-b168-52b501e80351,fd96c8ab-602a-4735-b168-52b501e80351,0,1,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,b1dc619d-8d91-4f7a-aa50-1d07ff9aebdc,0,1,370f0c75-d2c5-4be5-a633-4bcc77998ece,370f0c75-d2c5-4be5-a633-4bcc77998ece,0,1,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,f80b505f-b4ff-45fb-bd88-74b274ae9d2b,0,1,2139532c-f6cb-4393-936e-cc912e5adca9,2139532c-f6cb-4393-936e-cc912e5adca9,0,1,755c3eca-4956-4a44-9b38-c11dae00b87f,755c3eca-4956-4a44-9b38-c11dae00b87f,0,1,f57c558c-2c94-4b9d-8697-448d0548ab1a,f57c558c-2c94-4b9d-8697-448d0548ab1a,0,1,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,a310c09f-4d3a-4d3a-9ad5-7a5735a33a1d,0,1,c32db021-eca1-4b67-aa85-3d6e28c51b53,c32db021-eca1-4b67-aa85-3d6e28c51b53,0,1,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,e9ed0ee4-3fbe-4093-9078-cb265ed6842c,0,1,02466dcf-02a1-4853-814f-a913a9baba45,02466dcf-02a1-4853-814f-a913a9baba45,0,1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,c4a40dc9-b619-4219-9d9a-e11f49a14fb1,0,1,62b75eb2-42e1-4484-a77f-b676dd36f3d4,62b75eb2-42e1-4484-a77f-b676dd36f3d4,0,1,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,5e28e22a-dd6e-4703-92bd-13f5cb0dc023,0,1,856510ee-74f5-44e9-a3c0-1c60cfb7a787,856510ee-74f5-44e9-a3c0-1c60cfb7a787,0,1,28b761c6-c286-4125-a4ed-da602e49950f,28b761c6-c286-4125-a4ed-da602e49950f,0,1,4ac66a22-c736-4e06-a8aa-ef4a71788c65,4ac66a22-c736-4e06-a8aa-ef4a71788c65,0,1,9cfe9281-8840-4077-824d-a2c9cbb0b730,9cfe9281-8840-4077-824d-a2c9cbb0b730,0,1,76389fa9-b9e0-492e-9c93-24b5f3bf094c,76389fa9-b9e0-492e-9c93-24b5f3bf094c,0,1,23e3de37-9315-45e6-bbfd-60aae28c25ae,23e3de37-9315-45e6-bbfd-60aae28c25ae,0,1,a9957f43-8b6f-4d98-a2d8-77b78047494c,a9957f43-8b6f-4d98-a2d8-77b78047494c,0,1,e470e15d-1b06-43cb-a9f9-ba489e2f596f,e470e15d-1b06-43cb-a9f9-ba489e2f596f,0,1,0408002c-9255-43a2-8022-82f02ee0e8f4,0408002c-9255-43a2-8022-82f02ee0e8f4,0,1,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,88f44c9b-216d-4d7e-bc88-1e6b253ed01e,0,1,1851afd4-5324-45c1-b754-54e65943f945,1851afd4-5324-45c1-b754-54e65943f945,0,1,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,bc5eca9b-32d8-44e0-a127-8ad1f47d7957,0,1,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,6e5307ea-8fbf-4177-bcc8-f163a6ce1b40,0,1,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0fa77ef7-a836-4459-9bca-6010d0bdfc7f,0,1,c322dc4a-30f3-4d23-9824-4a01c496408d,c322dc4a-30f3-4d23-9824-4a01c496408d,0,1,dcff004c-1b61-4a19-b977-ea21bf688614,dcff004c-1b61-4a19-b977-ea21bf688614,0,0,0,1,0,0,0,1,0,1,0,1,1,1,1} \ No newline at end of file diff --git a/SSL/src/Configuration/Splash.bmp b/SSL/src/Configuration/Splash.bmp deleted file mode 100644 index 5bb38ca54559eb4e5b2abe5ebe09a2dbeb3287b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100816 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 diff --git a/SSL/src/Configuration/Splash.png b/SSL/src/Configuration/Splash.png new file mode 100644 index 0000000000000000000000000000000000000000..93fec8664d7fc2b510d2efb5ba1a1f52d46eb28f GIT binary patch literal 36962 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 Eg1Dg8GXMYp literal 0 HcmV?d00001 diff --git a/SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo b/SSL/src/Constants/ВыполнятьПроверкуЭПНаСервере/ВыполнятьПроверкуЭПНаСервере.mdo similarity index 92% rename from SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo rename to SSL/src/Constants/ВыполнятьПроверкуЭПНаСервере/ВыполнятьПроверкуЭПНаСервере.mdo index 5c8f7a270..e8d7bed2a 100644 --- a/SSL/src/Constants/ВыполнятьПроверкуЭЦПНаСервере/ВыполнятьПроверкуЭЦПНаСервере.mdo +++ b/SSL/src/Constants/ВыполнятьПроверкуЭПНаСервере/ВыполнятьПроверкуЭПНаСервере.mdo @@ -5,7 +5,7 @@ <valueManagerType typeId="52444070-22a2-4dc6-8f2d-3d5921b7f170" valueTypeId="f96b5c6b-8820-4b95-84fe-e4b00668b4d7"/> <valueKeyType typeId="b2fb54eb-4aa2-53b4-a251-e76e75156b8f" valueTypeId="a14b640f-4476-56b1-996b-e5e2dd1e1194"/> </producedTypes> - <name>ВыполнятьПроверкуЭЦПНаСервере</name> + <name>ВыполнятьПроверкуЭПНаСервере</name> <synonym> <key>ru</key> <value>Выполнять проверку ЭП на сервере</value> diff --git a/SSL/src/Constants/ОбщийКаталогВременныхФайловLinux/ValueManagerModule.bsl b/SSL/src/Constants/ИдентификаторИнформационнойБазы/ValueManagerModule.bsl similarity index 100% rename from SSL/src/Constants/ОбщийКаталогВременныхФайловLinux/ValueManagerModule.bsl rename to SSL/src/Constants/ИдентификаторИнформационнойБазы/ValueManagerModule.bsl diff --git a/SSL/src/Constants/ИдентификаторИнформационнойБазы/ИдентификаторИнформационнойБазы.mdo b/SSL/src/Constants/ИдентификаторИнформационнойБазы/ИдентификаторИнформационнойБазы.mdo new file mode 100644 index 000000000..8b0212d1b --- /dev/null +++ b/SSL/src/Constants/ИдентификаторИнформационнойБазы/ИдентификаторИнформационнойБазы.mdo @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="f60cb71a-f451-426a-aa3a-aa266b8da149"> + <producedTypes> + <managerType typeId="254024dc-d3cb-49a0-b316-f5337ecda613" valueTypeId="5ea3b631-897f-41ef-a64f-9575ab22c642"/> + <valueManagerType typeId="c5946030-081b-4376-8564-f30aaf7e3641" valueTypeId="bfef8187-d7f7-4490-a734-9661020d6ab9"/> + <valueKeyType typeId="18fe084d-24f8-51a7-b0e1-5a4a7b8332f4" valueTypeId="45bbc399-a677-5fab-90ff-2fbd3dc13ffa"/> + </producedTypes> + <name>ИдентификаторИнформационнойБазы</name> + <synonym> + <key>ru</key> + <value>Идентификатор информационной базы</value> + </synonym> + <type> + <types>String</types> + <stringQualifiers> + <length>36</length> + <fixed>true</fixed> + </stringQualifiers> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <dataLockControlMode>Managed</dataLockControlMode> +</mdclass:Constant> diff --git a/SSL/src/Constants/ИспользоватьВнешнихПользователей/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьВнешнихПользователей/ValueManagerModule.bsl index daea86e92..0182199a6 100644 --- a/SSL/src/Constants/ИспользоватьВнешнихПользователей/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьВнешнихПользователей/ValueManagerModule.bsl @@ -23,8 +23,8 @@ Если ЗначениеИзменено Тогда ПользователиСлужебный.ОбновитьРолиВнешнихПользователей(); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда - МодульУправлениеДоступом = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("УправлениеДоступом"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда + МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); МодульУправлениеДоступом.ОбновитьРолиПользователей(Тип("СправочникСсылка.ВнешниеПользователи")); КонецЕсли; КонецЕсли; diff --git a/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ValueManagerModule.bsl new file mode 100644 index 000000000..3d6447996 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ValueManagerModule.bsl @@ -0,0 +1,11 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +Процедура ПриЗаписи(Отказ) + + УстановитьПривилегированныйРежим(Истина); + + Константы.НеИспользоватьНесколькоОрганизаций.Установить(НЕ ЭтотОбъект.Значение); + +КонецПроцедуры + +#КонецЕсли diff --git a/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ИспользоватьНесколькоОрганизаций.mdo b/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ИспользоватьНесколькоОрганизаций.mdo new file mode 100644 index 000000000..707538347 --- /dev/null +++ b/SSL/src/Constants/ИспользоватьНесколькоОрганизаций/ИспользоватьНесколькоОрганизаций.mdo @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b1b5841d-0cf9-4de5-8561-b35b8f286d21"> + <producedTypes> + <managerType typeId="b76433d4-51a0-4d53-8774-7c40f5f21b50" valueTypeId="e2965015-dc01-4318-bc3e-a5b6b14a064e"/> + <valueManagerType typeId="6a2475be-c2ac-4780-9ac6-23b99a7db25b" valueTypeId="561d03ab-a6ee-49d5-b3ec-19177c4ec1fe"/> + <valueKeyType typeId="3413e223-c7df-563f-967f-f182063bf08e" valueTypeId="44e9237f-98e8-59bf-ba6d-c456c3344f8e"/> + </producedTypes> + <name>ИспользоватьНесколькоОрганизаций</name> + <synonym> + <key>ru</key> + <value>Использовать несколько организаций</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <dataLockControlMode>Managed</dataLockControlMode> +</mdclass:Constant> diff --git a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl index c14ab11fb..b7855f616 100644 --- a/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl +++ b/SSL/src/Constants/ИспользоватьСинхронизациюДанных/ValueManagerModule.bsl @@ -1,22 +1,28 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - Процедура ПриЗаписи(Отказ) - ОбщегоНазначения.УстановитьЗначенияДополнительныхКонстант(Значение, Метаданные().Имя, ЭтотОбъект); + Если Значение = Истина Тогда + + РазделениеВключено = ОбщегоНазначенияПовтИсп.РазделениеВключено(); + Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме.Установить(Не РазделениеВключено); + Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса.Установить(РазделениеВключено); + + Иначе + + Константы.ИспользоватьСинхронизациюДанныхВЛокальномРежиме.Установить(Ложь); + Константы.ИспользоватьСинхронизациюДанныхВМоделиСервиса.Установить(Ложь); + + КонецЕсли; Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли; Если Значение = Истина Тогда - ОбменДаннымиСервер.ПриВключенииСинхронизацииДанных(Отказ); - - ИначеЕсли Значение = Ложь Тогда - + Иначе ОбменДаннымиСервер.ПриОтключенииСинхронизацииДанных(Отказ); - КонецЕсли; КонецПроцедуры diff --git a/SSL/src/Constants/ИспользоватьЭлектронныеЦифровыеПодписи/ИспользоватьЭлектронныеЦифровыеПодписи.mdo b/SSL/src/Constants/ИспользоватьЭлектронныеПодписи/ИспользоватьЭлектронныеПодписи.mdo similarity index 91% rename from SSL/src/Constants/ИспользоватьЭлектронныеЦифровыеПодписи/ИспользоватьЭлектронныеЦифровыеПодписи.mdo rename to SSL/src/Constants/ИспользоватьЭлектронныеПодписи/ИспользоватьЭлектронныеПодписи.mdo index 6cdbb8cb1..db52c7c06 100644 --- a/SSL/src/Constants/ИспользоватьЭлектронныеЦифровыеПодписи/ИспользоватьЭлектронныеЦифровыеПодписи.mdo +++ b/SSL/src/Constants/ИспользоватьЭлектронныеПодписи/ИспользоватьЭлектронныеПодписи.mdo @@ -5,7 +5,7 @@ <valueManagerType typeId="6e365342-209f-4476-92cd-3683bd632347" valueTypeId="948fc611-9b08-488c-b5f9-c9e4bd2e2d3b"/> <valueKeyType typeId="60d79cbb-eb43-59b6-8377-e89c7530256e" valueTypeId="c513dfb4-dc32-5f09-8997-554070a436ea"/> </producedTypes> - <name>ИспользоватьЭлектронныеЦифровыеПодписи</name> + <name>ИспользоватьЭлектронныеПодписи</name> <synonym> <key>ru</key> <value>Использовать электронные подписи</value> diff --git a/SSL/src/Constants/ОбщийКаталогВременныхФайлов/ОбщийКаталогВременныхФайлов.mdo b/SSL/src/Constants/КаталогОбменаФайламиВМоделиСервиса/КаталогОбменаФайламиВМоделиСервиса.mdo similarity index 83% rename from SSL/src/Constants/ОбщийКаталогВременныхФайлов/ОбщийКаталогВременныхФайлов.mdo rename to SSL/src/Constants/КаталогОбменаФайламиВМоделиСервиса/КаталогОбменаФайламиВМоделиСервиса.mdo index 48d3badb7..47471eacf 100644 --- a/SSL/src/Constants/ОбщийКаталогВременныхФайлов/ОбщийКаталогВременныхФайлов.mdo +++ b/SSL/src/Constants/КаталогОбменаФайламиВМоделиСервиса/КаталогОбменаФайламиВМоделиСервиса.mdo @@ -5,10 +5,10 @@ <valueManagerType typeId="5f810441-942a-4df6-b25d-a0d2a84a8b10" valueTypeId="adeeabff-5b6b-4cb8-8a59-a24217262ec8"/> <valueKeyType typeId="4521e941-2efa-55e2-8696-8a993ce5ddf5" valueTypeId="1321e507-2674-5e2b-80fb-e8cc15e42703"/> </producedTypes> - <name>ОбщийКаталогВременныхФайлов</name> + <name>КаталогОбменаФайламиВМоделиСервиса</name> <synonym> <key>ru</key> - <value>Общий каталог временных файлов</value> + <value>Каталог обмена файлами в модели сервиса</value> </synonym> <type> <types>String</types> diff --git a/SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl b/SSL/src/Constants/КаталогОбменаФайламиВМоделиСервисаLinux/ValueManagerModule.bsl similarity index 100% rename from SSL/src/InformationRegisters/ПраваПоЗначениямДоступа/RecordSetModule.bsl rename to SSL/src/Constants/КаталогОбменаФайламиВМоделиСервисаLinux/ValueManagerModule.bsl diff --git a/SSL/src/Constants/ОбщийКаталогВременныхФайловLinux/ОбщийКаталогВременныхФайловLinux.mdo b/SSL/src/Constants/КаталогОбменаФайламиВМоделиСервисаLinux/КаталогОбменаФайламиВМоделиСервисаLinux.mdo similarity index 83% rename from SSL/src/Constants/ОбщийКаталогВременныхФайловLinux/ОбщийКаталогВременныхФайловLinux.mdo rename to SSL/src/Constants/КаталогОбменаФайламиВМоделиСервисаLinux/КаталогОбменаФайламиВМоделиСервисаLinux.mdo index 14525de90..eff8795ba 100644 --- a/SSL/src/Constants/ОбщийКаталогВременныхФайловLinux/ОбщийКаталогВременныхФайловLinux.mdo +++ b/SSL/src/Constants/КаталогОбменаФайламиВМоделиСервисаLinux/КаталогОбменаФайламиВМоделиСервисаLinux.mdo @@ -5,10 +5,10 @@ <valueManagerType typeId="6a45074a-3f77-4b10-94cc-44c7d92fceb3" valueTypeId="79a381a3-90b8-41cc-9733-ec97bc3f6188"/> <valueKeyType typeId="10de0d9b-46b1-563d-8cb3-bac727140b7b" valueTypeId="17d2e1fa-62ab-590e-b1e3-987dfc61ff57"/> </producedTypes> - <name>ОбщийКаталогВременныхФайловLinux</name> + <name>КаталогОбменаФайламиВМоделиСервисаLinux</name> <synonym> <key>ru</key> - <value>Общий каталог временных файлов Linux</value> + <value>Каталог обмена файлами в модели сервиса Linux</value> </synonym> <type> <types>String</types> diff --git a/SSL/src/Constants/КаталогВременныхФайловДляLinux/КаталогВременныхФайловДляLinux.mdo b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/КаталогСообщенийОбменаДаннымиДляLinux.mdo similarity index 83% rename from SSL/src/Constants/КаталогВременныхФайловДляLinux/КаталогВременныхФайловДляLinux.mdo rename to SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/КаталогСообщенийОбменаДаннымиДляLinux.mdo index eac04d027..0eaa3ed37 100644 --- a/SSL/src/Constants/КаталогВременныхФайловДляLinux/КаталогВременныхФайловДляLinux.mdo +++ b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляLinux/КаталогСообщенийОбменаДаннымиДляLinux.mdo @@ -5,10 +5,10 @@ <valueManagerType typeId="236e17dd-dc05-441f-b32b-2eb7f085b630" valueTypeId="342c7cd0-b553-4610-8ef9-b6854dcde804"/> <valueKeyType typeId="797b391a-2878-56a0-b1e6-c76542ecdc5a" valueTypeId="6388e03f-d4a6-595d-904d-65780e91e871"/> </producedTypes> - <name>КаталогВременныхФайловДляLinux</name> + <name>КаталогСообщенийОбменаДаннымиДляLinux</name> <synonym> <key>ru</key> - <value>Каталог временных файлов для Linux</value> + <value>Каталог сообщений синхронизации для Linux</value> </synonym> <type> <types>String</types> diff --git a/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/ValueManagerModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/Constants/КаталогВременныхФайловДляWindows/КаталогВременныхФайловДляWindows.mdo b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/КаталогСообщенийОбменаДаннымиДляWindows.mdo similarity index 83% rename from SSL/src/Constants/КаталогВременныхФайловДляWindows/КаталогВременныхФайловДляWindows.mdo rename to SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/КаталогСообщенийОбменаДаннымиДляWindows.mdo index f38dc04ea..9b789c38b 100644 --- a/SSL/src/Constants/КаталогВременныхФайловДляWindows/КаталогВременныхФайловДляWindows.mdo +++ b/SSL/src/Constants/КаталогСообщенийОбменаДаннымиДляWindows/КаталогСообщенийОбменаДаннымиДляWindows.mdo @@ -5,10 +5,10 @@ <valueManagerType typeId="32ede9f6-707f-4151-831f-151d9e811cb2" valueTypeId="5d7a72d4-647d-4a31-a2f0-90b02dc0df90"/> <valueKeyType typeId="e33339ce-521b-5923-add3-2d6012de18fa" valueTypeId="398ae1b6-014e-550e-ad29-25f13e0eb76d"/> </producedTypes> - <name>КаталогВременныхФайловДляWindows</name> + <name>КаталогСообщенийОбменаДаннымиДляWindows</name> <synonym> <key>ru</key> - <value>Каталог временных файлов для Windows</value> + <value>Каталог сообщений синхронизации для Windows</value> </synonym> <type> <types>String</types> diff --git a/SSL/src/Constants/НеИспользоватьНесколькоОрганизаций/НеИспользоватьНесколькоОрганизаций.mdo b/SSL/src/Constants/НеИспользоватьНесколькоОрганизаций/НеИспользоватьНесколькоОрганизаций.mdo new file mode 100644 index 000000000..005c7781c --- /dev/null +++ b/SSL/src/Constants/НеИспользоватьНесколькоОрганизаций/НеИспользоватьНесколькоОрганизаций.mdo @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Constant xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3a2d9324-8260-478d-ad62-a964d860cb8f"> + <producedTypes> + <managerType typeId="16e0c106-f466-4497-98f8-050ea8ee4750" valueTypeId="738ecaa1-b40e-46d4-a53b-1f355ac1a877"/> + <valueManagerType typeId="b99b34c5-5a51-4538-9a26-f459086d8d0e" valueTypeId="844e97bd-8d1a-48ec-a7bf-4d117402c056"/> + <valueKeyType typeId="661d487a-6793-5b50-aa45-af5036a5b94e" valueTypeId="6d931e3f-a5a1-5f3a-8603-ce39e6216da8"/> + </producedTypes> + <name>НеИспользоватьНесколькоОрганизаций</name> + <synonym> + <key>ru</key> + <value>Не использовать несколько организаций</value> + </synonym> + <type> + <types>Boolean</types> + </type> + <minValue xsi:type="core:UndefinedValue"/> + <maxValue xsi:type="core:UndefinedValue"/> + <dataLockControlMode>Managed</dataLockControlMode> +</mdclass:Constant> diff --git a/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl b/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl index b0e1912c8..b579819e6 100644 --- a/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl +++ b/SSL/src/Constants/ПараметрыОграниченияДоступа/ValueManagerModule.bsl @@ -3,14 +3,14 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС -// Процедура обновляет общие параметры ограничения доступа в +// Обновляет описание свойств видов доступа в // параметрах ограничения доступа при изменении конфигурации. // // Параметры: // ЕстьИзменения - Булево (возвращаемое значение) - если производилась запись, // устанавливается Истина, иначе не изменяется. // -Процедура ОбновитьОбщиеПараметры(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт +Процедура ОбновитьОписаниеСвойствВидовДоступа(ЕстьИзменения = Неопределено, ТолькоПроверка = Ложь) Экспорт УстановитьПривилегированныйРежим(Истина); @@ -21,7 +21,7 @@ УстановитьМонопольныйРежим(Истина); КонецЕсли; - ВсеПустыеСсылки = ВсеПустыеСсылки(); + СвойстваВидовДоступа = СвойстваВидовДоступа(); Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить("Константа.ПараметрыОграниченияДоступа"); @@ -36,10 +36,12 @@ Сохраненные = Неопределено; - Если Параметры.Свойство("ВсеПустыеСсылки") Тогда - Сохраненные = Параметры.ВсеПустыеСсылки; + Если Параметры.Свойство("СвойстваВидовДоступа") Тогда + Сохраненные = Параметры.СвойстваВидовДоступа; - Если НЕ ОбщегоНазначения.ДанныеСовпадают(ВсеПустыеСсылки, Сохраненные) Тогда + Если НЕ ОбщегоНазначения.ДанныеСовпадают(СвойстваВидовДоступа, Сохраненные) Тогда + ЕстьИзмененияТиповГруппИЗначенийДоступа = + ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, Сохраненные); Сохраненные = Неопределено; КонецЕсли; КонецЕсли; @@ -51,11 +53,23 @@ Возврат; КонецЕсли; СтандартныеПодсистемыСервер.УстановитьПараметрРаботыПрограммы( - "ПараметрыОграниченияДоступа", "ВсеПустыеСсылки", ВсеПустыеСсылки); + "ПараметрыОграниченияДоступа", + "СвойстваВидовДоступа", + СвойстваВидовДоступа); КонецЕсли; СтандартныеПодсистемыСервер.ПодтвердитьОбновлениеПараметраРаботыПрограммы( - "ПараметрыОграниченияДоступа", "ВсеПустыеСсылки"); + "ПараметрыОграниченияДоступа", + "СвойстваВидовДоступа"); + + Если НЕ ТолькоПроверка Тогда + СтандартныеПодсистемыСервер.ДобавитьИзмененияПараметраРаботыПрограммы( + "ПараметрыОграниченияДоступа", + "ТипыГруппИЗначенийДоступа", + ?(ЕстьИзмененияТиповГруппИЗначенийДоступа = Истина, + Новый ФиксированнаяСтруктура("ЕстьИзменения", Истина), + Новый ФиксированнаяСтруктура()) ); + КонецЕсли; ЗафиксироватьТранзакцию(); Исключение @@ -75,18 +89,433 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Возвращает массив пустых ссылок всех типов конфигурации. -Функция ВсеПустыеСсылки() +// Возвращает свойства видов доступа, заполняемых при внедрении +// в процедуре ПриЗаполненииВидовДоступа общего модуля +// УправлениеДоступомПереопределяемый и одноименных процедурах служебного события. +// +Функция СвойстваВидовДоступа() - ВсеПустыеСсылки = Новый Массив; - ТипыПустыхСсылок = Метаданные.Справочники.ИдентификаторыОбъектовМетаданных.Реквизиты.ЗначениеПустойСсылки.Тип.Типы(); + // 1. Заполнение данных, указанных при внедрении. - Для каждого ТипЗначения Из ТипыПустыхСсылок Цикл - ВсеПустыеСсылки.Добавить(ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( - Метаданные.НайтиПоТипу(ТипЗначения).ПолноеИмя()).ПустаяСсылка()); + ВидыДоступа = Новый ТаблицаЗначений; + ВидыДоступа.Колонки.Добавить("Имя", Новый ОписаниеТипов("Строка")); + ВидыДоступа.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); + ВидыДоступа.Колонки.Добавить("ТипЗначений", Новый ОписаниеТипов("Тип")); + ВидыДоступа.Колонки.Добавить("ТипГруппЗначений", Новый ОписаниеТипов("Тип")); + ВидыДоступа.Колонки.Добавить("НесколькоГруппЗначений", Новый ОписаниеТипов("Булево")); + ВидыДоступа.Колонки.Добавить("ДополнительныеТипы", Новый ОписаниеТипов("ТаблицаЗначений")); + + ВидДоступаПользователи = ВидыДоступа.Добавить(); + ВидДоступаВнешниеПользователи = ВидыДоступа.Добавить(); + + ЗаполнитьНеизмененныеСвойстваВидовДоступаПользователиИВнешниеПользователи( + ВидДоступаПользователи, ВидДоступаВнешниеПользователи); + + ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( + "СтандартныеПодсистемы.УправлениеДоступом\ПриЗаполненииВидовДоступа"); + + Для каждого Обработчик Из ОбработчикиСобытия Цикл + Обработчик.Модуль.ПриЗаполненииВидовДоступа(ВидыДоступа); КонецЦикла; - Возврат Новый ФиксированныйМассив(ВсеПустыеСсылки); + УправлениеДоступомПереопределяемый.ПриЗаполненииВидовДоступа(ВидыДоступа); + + ЗаполнитьНеизмененныеСвойстваВидовДоступаПользователиИВнешниеПользователи( + ВидДоступаПользователи, ВидДоступаВнешниеПользователи); + + // Проверки: + // - тип значений доступа не указан для 2-х видов доступа + // - тип значений доступа Пользователи, ГруппыПользователей используется только для вида доступа Пользователи. + // - тип значений доступа ВнешниеПользователи, ГруппыВнешнихПользователей используется только для вида доступа ВнешниеПользователи. + // - имена видов доступа Объект, Условие, НастройкиПрав, ПравоЧтения, ПравоИзменения не указаны. + // - тип групп значений не совпадает с типом значений. + + // 2. Подготовка различных коллекций свойств видов доступа, используемых при работе программы. + МассивСвойств = Новый Массив; + ПоСсылкам = Новый Соответствие; + ПоИменам = Новый Соответствие; + ПоТипамЗначений = Новый Соответствие; + ПоТипамГруппИЗначений = Новый Соответствие; + + ЗначенияДоступаСГруппами = Новый Структура; + ЗначенияДоступаСГруппами.Вставить("ПоТипам", Новый Соответствие); + ЗначенияДоступаСГруппами.Вставить("ПоТипамСсылок", Новый Соответствие); + ЗначенияДоступаСГруппами.Вставить("ИменаТаблиц", Новый Массив); + ЗначенияДоступаСГруппами.Вставить("ТипыГруппЗначений", Новый Соответствие); + + Параметры = Новый Структура; + Параметры.Вставить("ОпределяемыеТипыЗначенийДоступа", + УправлениеДоступомСлужебныйПовтИсп.ТипыПоляТаблицы("ОпределяемыйТип.ЗначениеДоступа")); + + ЗаголовокОшибки = + НСтр("ru = 'Ошибка в процедуре ЗаполнитьСвойстваВидаДоступа + |общего модуля УправлениеДоступомПереопределяемый. + | + |'"); + + Параметры.Вставить("ЗаголовокОшибки", ЗаголовокОшибки); + + Параметры.Вставить("ТипыПодпискиОбновитьГруппыЗначенийДоступа", + УправлениеДоступомСлужебныйПовтИсп.ТипыОбъектовВПодпискахНаСобытия( + "ОбновитьГруппыЗначенийДоступа")); + + ВсеИменаВидовДоступа = Новый Соответствие; + ВсеИменаВидовДоступа.Вставить(ВРег("Объект"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("Условие"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("НастройкиПрав"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("ПравоЧтения"), Истина); + ВсеИменаВидовДоступа.Вставить(ВРег("ПравоИзменения"), Истина); + + ВсеТипыЗначений = Новый Соответствие; + ВсеТипыГруппЗначений = Новый Соответствие; + + Для каждого ВидДоступа Из ВидыДоступа Цикл + + Если ВсеИменаВидовДоступа[ВРег(ВидДоступа.Имя)] <> Неопределено Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ЗаголовокОшибки + + НСтр("ru = 'Имя вида доступа ""%1"" уже определено.'"), + ВидДоступа.Имя); + КонецЕсли; + + // Проверка повторения типов значений и групп. + ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыЗначений, Параметры); + ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); + // Проверка пересечения типов значений и групп. + ПроверитьТип(ВидДоступа, ВидДоступа.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); + ПроверитьТип(ВидДоступа, ВидДоступа.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); + + Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл + // Проверка повторения типов значений и групп. + ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыЗначений, Параметры); + ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыГруппЗначений, Параметры, Истина); + // Проверка пересечения типов значений и групп. + ПроверитьТип(ВидДоступа, Строка.ТипЗначений, ВсеТипыГруппЗначений, Параметры, , Истина); + ПроверитьТип(ВидДоступа, Строка.ТипГруппЗначений, ВсеТипыЗначений, Параметры, Истина, Истина); + КонецЦикла; + + ПустаяСсылкаТипаЗначений = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени( + Метаданные.НайтиПоТипу(ВидДоступа.ТипЗначений).ПолноеИмя()).ПустаяСсылка(); + + Свойства = Новый Структура; + Свойства.Вставить("Имя", ВидДоступа.Имя); + Свойства.Вставить("Ссылка", ПустаяСсылкаТипаЗначений); + Свойства.Вставить("Представление", ВидДоступа.Представление); + Свойства.Вставить("ТипЗначений", ВидДоступа.ТипЗначений); + Свойства.Вставить("ТипГруппЗначений", ВидДоступа.ТипГруппЗначений); + Свойства.Вставить("НесколькоГруппЗначений", ВидДоступа.НесколькоГруппЗначений); + Свойства.Вставить("ДополнительныеТипы", Новый Массив); + Свойства.Вставить("ТипыВыбираемыхЗначений", Новый Массив); + + МассивСвойств.Добавить(Свойства); + ПоИменам.Вставить(Свойства.Имя, Свойства); + ПоСсылкам.Вставить(ПустаяСсылкаТипаЗначений, Свойства); + ПоТипамЗначений.Вставить(Свойства.ТипЗначений, Свойства); + ПоТипамГруппИЗначений.Вставить(Свойства.ТипЗначений, Свойства); + Если Свойства.ТипГруппЗначений <> Тип("Неопределено") Тогда + ПоТипамГруппИЗначений.Вставить(Свойства.ТипГруппЗначений, Свойства); + КонецЕсли; + ЗаполнитьЗначенияДоступаСГруппами(Свойства, ЗначенияДоступаСГруппами, Свойства, Параметры); + + Для каждого Строка Из ВидДоступа.ДополнительныеТипы Цикл + Элемент = Новый Структура; + Элемент.Вставить("ТипЗначений", Строка.ТипЗначений); + Элемент.Вставить("ТипГруппЗначений", Строка.ТипГруппЗначений); + Элемент.Вставить("НесколькоГруппЗначений", Строка.НесколькоГруппЗначений); + Свойства.ДополнительныеТипы.Добавить(Элемент); + ПоТипамЗначений.Вставить(Строка.ТипЗначений, Свойства); + ПоТипамГруппИЗначений.Вставить(Строка.ТипЗначений, Свойства); + Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда + ПоТипамГруппИЗначений.Вставить(Строка.ТипГруппЗначений, Свойства); + КонецЕсли; + ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры); + КонецЦикла; + + КонецЦикла; + + БезГруппДляЗначенияДоступа = Новый Массив; + СОднойГруппойДляЗначенияДоступа = Новый Массив; + ТипыЗначенийДоступаСГруппами = Новый Соответствие; + + ВидыДоступаСГруппами = Новый Соответствие; + + Для каждого КлючИЗначение Из ЗначенияДоступаСГруппами.ПоТипамСсылок Цикл + ИмяВидаДоступа = КлючИЗначение.Значение.Имя; + ВидыДоступаСГруппами.Вставить(ИмяВидаДоступа, Истина); + + ПустаяСсылка = УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(КлючИЗначение.Ключ); + ТипыЗначенийДоступаСГруппами.Вставить(ТипЗнч(ПустаяСсылка), ПустаяСсылка); + + Если НЕ КлючИЗначение.Значение.НесколькоГруппЗначений + И СОднойГруппойДляЗначенияДоступа.Найти(ИмяВидаДоступа) = Неопределено Тогда + + СОднойГруппойДляЗначенияДоступа.Добавить(ИмяВидаДоступа); + КонецЕсли; + КонецЦикла; + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.Пользователи"), + Справочники.Пользователи.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыПользователей"), + Справочники.ГруппыПользователей.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ВнешниеПользователи"), + Справочники.ВнешниеПользователи.ПустаяСсылка()); + + ТипыЗначенийДоступаСГруппами.Вставить(Тип("СправочникСсылка.ГруппыВнешнихПользователей"), + Справочники.ГруппыВнешнихПользователей.ПустаяСсылка()); + + Для каждого СвойстваВидаДоступа Из МассивСвойств Цикл + Если ВидыДоступаСГруппами.Получить(СвойстваВидаДоступа.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Если СвойстваВидаДоступа.Имя = "Пользователи" + ИЛИ СвойстваВидаДоступа.Имя = "ВнешниеПользователи" Тогда + Продолжить; + КонецЕсли; + БезГруппДляЗначенияДоступа.Добавить(СвойстваВидаДоступа.Имя); + КонецЦикла; + + СвойстваВидовДоступа = Новый Структура; + СвойстваВидовДоступа.Вставить("Массив", МассивСвойств); + СвойстваВидовДоступа.Вставить("ПоИменам", ПоИменам); + СвойстваВидовДоступа.Вставить("ПоСсылкам", ПоСсылкам); + СвойстваВидовДоступа.Вставить("ПоТипамЗначений", ПоТипамЗначений); + СвойстваВидовДоступа.Вставить("ПоТипамГруппИЗначений", ПоТипамГруппИЗначений); + СвойстваВидовДоступа.Вставить("ЗначенияДоступаСГруппами", ЗначенияДоступаСГруппами); + СвойстваВидовДоступа.Вставить("БезГруппДляЗначенияДоступа", БезГруппДляЗначенияДоступа); + СвойстваВидовДоступа.Вставить("СОднойГруппойДляЗначенияДоступа", СОднойГруппойДляЗначенияДоступа); + СвойстваВидовДоступа.Вставить("ТипыЗначенийДоступаСГруппами", ТипыЗначенийДоступаСГруппами); + + // Проверка совместимости перехода на новые версии программы. + Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить( + ТипЗнч(ПланыВидовХарактеристик.УдалитьВидыДоступа.ПустаяСсылка())) = Неопределено Тогда + + ОписаниеОшибки = + НСтр("ru = 'Тип ПланВидовХарактеристикСсылка.УдалитьВидыДоступа, + |необходимый для перехода на новые версии программы + |не указан в определяемом типе ""Значение доступа"".'"); + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + ОписаниеОшибки); + КонецЕсли; + + Возврат ОбщегоНазначения.ФиксированныеДанные(СвойстваВидовДоступа); + +КонецФункции + +Процедура ЗаполнитьЗначенияДоступаСГруппами(Строка, ЗначенияДоступаСГруппами, Свойства, Параметры) + + Если Свойства.Имя = "Пользователи" Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.Пользователи")); + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыПользователей")); + Возврат; + КонецЕсли; + + Если Свойства.Имя = "ВнешниеПользователи" Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ВнешниеПользователи")); + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Тип("СправочникСсылка.ГруппыВнешнихПользователей")); + Возврат; + КонецЕсли; + + Если Строка.ТипГруппЗначений = Тип("Неопределено") Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипЗначений); + Возврат; + КонецЕсли; + + ТипСсылки = Строка.ТипЗначений; + + МетаданныеТипаЗначений = Метаданные.НайтиПоТипу(Строка.ТипЗначений); + Если ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда + ТипОбъекта = ТипСсылки; + Иначе + ТипОбъекта = СтандартныеПодсистемыСервер.ТипОбъектаИлиНабораЗаписейОбъектаМетаданных( + МетаданныеТипаЗначений); + КонецЕсли; + + Если Строка.ТипГруппЗначений <> Тип("Неопределено") Тогда + ДобавитьВМассив(Свойства.ТипыВыбираемыхЗначений, Строка.ТипГруппЗначений); + КонецЕсли; + + ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипСсылки, Свойства); + ЗначенияДоступаСГруппами.ПоТипам.Вставить(ТипОбъекта, Свойства); + ЗначенияДоступаСГруппами.ПоТипамСсылок.Вставить(ТипСсылки, Свойства); + ЗначенияДоступаСГруппами.ИменаТаблиц.Добавить(МетаданныеТипаЗначений.ПолноеИмя()); + + МетаданныеТипаГруппЗначений = Метаданные.НайтиПоТипу(Строка.ТипГруппЗначений); + ПустаяСсылкаТипаГруппЗначений = + УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаГруппЗначений); + + ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить(ТипСсылки, ПустаяСсылкаТипаГруппЗначений); + ЗначенияДоступаСГруппами.ТипыГруппЗначений.Вставить( + УправлениеДоступомСлужебный.ПустаяСсылкаОбъектаМетаданных(МетаданныеТипаЗначений), + ПустаяСсылкаТипаГруппЗначений); + + // Проверка наличия типа ссылки в соответствующих объектах метаданных. + Если Параметры.ТипыПодпискиОбновитьГруппыЗначенийДоступа.Получить(ТипОбъекта) = Неопределено + И НЕ ОбщегоНазначения.ЭтоПеречисление(МетаданныеТипаЗначений) Тогда + + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + + НСтр("ru = 'Тип значения доступа ""%1"", использующий группы значений, + |не указан в подписке на событие ""Обновить группы значений доступа"".'"), + Строка(ТипОбъекта)); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаполнитьНеизмененныеСвойстваВидовДоступаПользователиИВнешниеПользователи( + ВидДоступаПользователи, ВидДоступаВнешниеПользователи) + + ВидДоступаПользователи.Имя = "Пользователи"; + ВидДоступаПользователи.Представление = НСтр("ru = 'Пользователи'"); + ВидДоступаПользователи.ТипЗначений = Тип("СправочникСсылка.Пользователи"); + ВидДоступаПользователи.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыПользователей"); + ВидДоступаПользователи.НесколькоГруппЗначений = Истина; + + ВидДоступаВнешниеПользователи.Имя = "ВнешниеПользователи"; + ВидДоступаВнешниеПользователи.Представление = НСтр("ru = 'Внешние пользователи'"); + ВидДоступаВнешниеПользователи.ТипЗначений = Тип("СправочникСсылка.ВнешниеПользователи"); + ВидДоступаВнешниеПользователи.ТипГруппЗначений = Тип("СправочникСсылка.ГруппыВнешнихПользователей"); + ВидДоступаВнешниеПользователи.НесколькоГруппЗначений = Истина; + +КонецПроцедуры + +Процедура ПроверитьТип(ВидДоступа, Тип, ВсеТипы, Параметры, ПроверкаТиповГрупп = Ложь, ПроверкаПересечения = Ложь) + + Если Тип = Тип("Неопределено") Тогда + Если ПроверкаТиповГрупп Тогда + Возврат; + КонецЕсли; + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + + НСтр("ru = 'Для вида доступа ""%1"" не указан тип значений доступа.'"), + ВидДоступа.Имя); + КонецЕсли; + + // Проверка, что указан тип ссылки. + Если НЕ ОбщегоНазначения.ЭтоСсылка(Тип) Тогда + Если ПроверкаТиповГрупп Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". + |Однако это не тип ссылки.'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". + |Однако это не тип ссылки.'"); + КонецЕсли; + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + ОписаниеОшибки, Тип, ВидДоступа.Имя); + КонецЕсли; + + // Проверка повторения и пересечения типов значений и групп значений. + ДляТогоЖеВидаДоступаОшибкиНет = Ложь; + + Если ПроверкаТиповГрупп Тогда + Если ПроверкаПересечения Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип значений, для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать, как тип групп значений.'"); + Иначе + ДляТогоЖеВидаДоступаОшибкиНет = Истина; + ОписаниеОшибки = + НСтр("ru = 'Тип групп значений ""%1"" уже указан для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать.'"); + КонецЕсли; + Иначе + Если ПроверкаПересечения Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип ""%1"" указан, как тип групп значений, для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать, как тип значений.'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип значений ""%1"" уже указан для вида доступа ""%2"". + |Для вида доступа ""%3"" его нельзя указать.'"); + КонецЕсли; + КонецЕсли; + + Если ВсеТипы.Получить(Тип) <> Неопределено Тогда + Если НЕ (ДляТогоЖеВидаДоступаОшибкиНет И ВидДоступа.Имя = ВсеТипы.Получить(Тип)) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + ОписаниеОшибки, Тип, ВсеТипы.Получить(Тип), ВидДоступа.Имя); + КонецЕсли; + ИначеЕсли НЕ ПроверкаПересечения Тогда + ВсеТипы.Вставить(Тип, ВидДоступа.Имя); + КонецЕсли; + + // Проверка состава определяемых типов. + ОписаниеОшибки = ""; + Если Параметры.ОпределяемыеТипыЗначенийДоступа.Получить(Тип) = Неопределено Тогда + Если ПроверкаТиповГрупп Тогда + ОписаниеОшибки = + НСтр("ru = 'Тип групп значений доступа ""%1"" вида доступа ""%2"" + |не указан в определяемом типе ""Значение доступа"".'"); + Иначе + ОписаниеОшибки = + НСтр("ru = 'Тип значений доступа ""%1"" вида доступа ""%2"" + |не указан в определяемом типе ""Значение доступа"".'"); + КонецЕсли; + КонецЕсли; + + Если ЗначениеЗаполнено(ОписаниеОшибки) Тогда + ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + Параметры.ЗаголовокОшибки + ОписаниеОшибки, + Тип, + ВидДоступа.Имя); + КонецЕсли; + +КонецПроцедуры + +Процедура ДобавитьВМассив(Массив, Значение) + + Если Массив.Найти(Значение) = Неопределено Тогда + Массив.Добавить(Значение); + КонецЕсли; + +КонецПроцедуры + +// Проверяет наличие изменений типов групп и значений доступа +Функция ЕстьИзмененияТиповГруппИЗначенийДоступа(СвойстваВидовДоступа, Сохраненные) + + Если НЕ ТипЗнч(Сохраненные) = Тип("ФиксированнаяСтруктура") + ИЛИ НЕ Сохраненные.Свойство("ПоТипамЗначений") + ИЛИ НЕ Сохраненные.Свойство("ТипыЗначенийДоступаСГруппами") + ИЛИ НЕ ТипЗнч(Сохраненные.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ ТипЗнч(Сохраненные.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ СвойстваВидовДоступа.Свойство("ПоТипамЗначений") + ИЛИ НЕ СвойстваВидовДоступа.Свойство("ТипыЗначенийДоступаСГруппами") + ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ПоТипамЗначений) = Тип("ФиксированноеСоответствие") + ИЛИ НЕ ТипЗнч(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами) = Тип("ФиксированноеСоответствие") Тогда + + Возврат Истина; + КонецЕсли; + + Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ПоТипамЗначений, Сохраненные.ПоТипамЗначений) Тогда + Возврат Истина; + КонецЕсли; + + Если КлючиСоответствийОтличаются(СвойстваВидовДоступа.ТипыЗначенийДоступаСГруппами, + Сохраненные.ТипыЗначенийДоступаСГруппами) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +Функция КлючиСоответствийОтличаются(Новое, Старое) + + Если Новое.Количество() <> Старое.Количество() Тогда + Возврат Истина; + КонецЕсли; + + Для каждого КлючИЗначение Из Новое Цикл + Если Старое.Получить(КлючИЗначение.Ключ) = Неопределено Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; КонецФункции diff --git a/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl b/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl index 4ec14f1de..48c6e961b 100644 --- a/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl +++ b/SSL/src/Constants/ПараметрыРаботыПользователей/ValueManagerModule.bsl @@ -232,9 +232,9 @@ УстановитьПривилегированныйРежим(Истина); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.БазоваяФункциональностьВМоделиСервиса") Тогда - МодульРаботаВМоделиСервисаПовтИсп = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("РаботаВМоделиСервисаПовтИсп"); + МодульРаботаВМоделиСервисаПовтИсп = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервисаПовтИсп"); МодельДанных = МодульРаботаВМоделиСервисаПовтИсп.ПолучитьМодельДанныхОбласти(); РазделенныеОбъектыМетаданных = Новый Соответствие(); @@ -306,11 +306,15 @@ Права.Вставить("Администрирование", НСтр("ru = 'Администрирование'")); Права.Вставить("АдминистрированиеДанных", НСтр("ru = 'Администрирование данных'")); + Права = Новый Соответствие; + НедоступныеПрава.Вставить(Перечисления.ТипыПользователей.ПользовательЛокальногоРешения, Права); + Права.Вставить("Администрирование", НСтр("ru = 'Администрирование'")); + Права.Вставить("ОбновлениеКонфигурацииБазыДанных", НСтр("ru = 'Обновление конфигурации базы данных'")); + Права = Новый Соответствие; НедоступныеПрава.Вставить(Перечисления.ТипыПользователей.ПользовательОбластиДанных, Права); Права.Вставить("Администрирование", НСтр("ru = 'Администрирование'")); Права.Вставить("ОбновлениеКонфигурацииБазыДанных", НСтр("ru = 'Обновление конфигурации базы данных'")); - Права.Вставить("МонопольныйРежим", НСтр("ru = 'Монопольный режим'")); Права.Вставить("ТолстыйКлиент", НСтр("ru = 'Толстый клиент'")); Права.Вставить("ВнешнееСоединение", НСтр("ru = 'Внешнее соединение'")); Права.Вставить("Automation", НСтр("ru = 'Automation'")); diff --git a/SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo b/SSL/src/Constants/ПровайдерЭП/ПровайдерЭП.mdo similarity index 96% rename from SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo rename to SSL/src/Constants/ПровайдерЭП/ПровайдерЭП.mdo index 3a83213f4..ef86d33cf 100644 --- a/SSL/src/Constants/ПровайдерЭЦП/ПровайдерЭЦП.mdo +++ b/SSL/src/Constants/ПровайдерЭП/ПровайдерЭП.mdo @@ -5,7 +5,7 @@ <valueManagerType typeId="2e4066ed-8f07-42e6-8391-b5ba23353e3e" valueTypeId="d7612a65-ec24-45ad-9369-dfee6c385fb9"/> <valueKeyType typeId="146c802c-2224-5964-8e58-743d53ed6037" valueTypeId="d4429742-f6b1-586e-a93d-fc417e8d9f8c"/> </producedTypes> - <name>ПровайдерЭЦП</name> + <name>ПровайдерЭП</name> <synonym> <key>ru</key> <value>Провайдер ЭП</value> diff --git a/SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo b/SSL/src/Constants/ТипПровайдераЭП/ТипПровайдераЭП.mdo similarity index 95% rename from SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo rename to SSL/src/Constants/ТипПровайдераЭП/ТипПровайдераЭП.mdo index dc372b5d1..17b8a6b42 100644 --- a/SSL/src/Constants/ТипПровайдераЭЦП/ТипПровайдераЭЦП.mdo +++ b/SSL/src/Constants/ТипПровайдераЭП/ТипПровайдераЭП.mdo @@ -5,7 +5,7 @@ <valueManagerType typeId="980140ca-9ee7-4026-8943-578fbcec9e0c" valueTypeId="a3e11ead-1101-4289-a210-db72af4642bb"/> <valueKeyType typeId="59d923e2-71e3-5319-908c-5b3e7f0e0d11" valueTypeId="397b58a4-7de2-5607-b812-94042b018782"/> </producedTypes> - <name>ТипПровайдераЭЦП</name> + <name>ТипПровайдераЭП</name> <synonym> <key>ru</key> <value>Тип провайдера ЭП</value> diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form index aa12742ef..e77f72778 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Form.form @@ -23,7 +23,7 @@ <name>ИнтервалВремениВыполненияПриИзменении</name> </handlers> <extendedTooltip> - <name>ИнтервалВремениВыполненияРасширеннаяПодсказка</name> + <name>ИнтервалВремениВыполненияExtendedTooltip</name> <id>26</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -66,8 +66,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДекорацияСекРасширеннаяПодсказка</name> - <id>28</id> + <name>ДекорацияСекExtendedTooltip</name> + <id>27</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -102,7 +102,7 @@ <value>Группа интервал времени</value> </toolTip> <extendedTooltip> - <name>ГруппаИнтервалВремениРасширеннаяПодсказка</name> + <name>ГруппаИнтервалВремениExtendedTooltip</name> <id>25</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -136,8 +136,8 @@ <name>КоличествоФайловВПорцииПриИзменении</name> </handlers> <extendedTooltip> - <name>КоличествоФайловВПорцииРасширеннаяПодсказка</name> - <id>29</id> + <name>КоличествоФайловВПорцииExtendedTooltip</name> + <id>28</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -177,8 +177,8 @@ <segments>КоличествоФайловСНеизвлеченнымТекстом</segments> </dataPath> <extendedTooltip> - <name>КоличествоФайловСНеизвлеченнымТекстомРасширеннаяПодсказка</name> - <id>31</id> + <name>КоличествоФайловСНеизвлеченнымТекстомExtendedTooltip</name> + <id>29</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -223,8 +223,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>СтатусРасширеннаяПодсказка</name> - <id>34</id> + <name>СтатусExtendedTooltip</name> + <id>31</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -262,8 +262,8 @@ <value>Группа статуса</value> </toolTip> <extendedTooltip> - <name>ГруппаСтатусаРасширеннаяПодсказка</name> - <id>33</id> + <name>ГруппаСтатусаExtendedTooltip</name> + <id>30</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -295,7 +295,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СтартРасширеннаяПодсказка</name> + <name>СтартExtendedTooltip</name> <id>21</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -321,7 +321,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>СтопРасширеннаяПодсказка</name> + <name>СтопExtendedTooltip</name> <id>22</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -347,7 +347,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИзвлечьТекстИзВсехФайловРасширеннаяПодсказка</name> + <name>ИзвлечьТекстИзВсехФайловExtendedTooltip</name> <id>23</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -374,7 +374,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ЗакрытьРасширеннаяПодсказка</name> + <name>ЗакрытьExtendedTooltip</name> <id>24</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl index acdd68291..838365edb 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Forms/Форма/Module.bsl @@ -39,14 +39,14 @@ Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда Отказ = Истина; - Предупреждение(НСтр("ru = 'Извлечение текстов не поддерживается в Веб-клиенте.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Извлечение текстов не поддерживается в Веб-клиенте.'")); Возврат; КонецЕсли; Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда Отказ = Истина; ТекстСообщения = НСтр("ru = 'Извлечение текстов не поддерживается в клиенте под управлением ОС Linux.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(, ТекстСообщения); Возврат; КонецЕсли; @@ -112,7 +112,7 @@ РазмерПорции = 0; // извлечь все ИзвлечениеТекстовКлиент(РазмерПорции); - Предупреждение(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ПоказатьПредупреждение(, СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru='Завершено извлечение текста из |всех файлов с неизвлеченным текстом. | @@ -303,17 +303,17 @@ &НаСервереБезКонтекста Функция ПолучитьНавигационнуюСсылкуФайла(Знач ФайлИлиВерсияФайла, Знач УникальныйИдентификатор) - НавигационнаяСсылка = Неопределено; + НавигационнаяСсылкаФайла = Неопределено; ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"); Для каждого Обработчик Из ОбработчикиСобытия Цикл Обработчик.Модуль.ПриОпределенииНавигационнойСсылкиФайла( - ФайлИлиВерсияФайла, УникальныйИдентификатор, НавигационнаяСсылка); + ФайлИлиВерсияФайла, УникальныйИдентификатор, НавигационнаяСсылкаФайла); КонецЦикла; - Возврат НавигационнаяСсылка; + Возврат НавигационнаяСсылкаФайла; КонецФункции diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html index 9229e4a09..31236844f 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстов/Help/ru.html @@ -1,3 +1,3 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Если один или несколько рабочих процессов сервера работают под Linux, а часть или все клиенты подключаются с помощью веб-клиента, то в информационной базе могут быть добавлены файлы, текст из которых не извлечен, и соответственно эти файлы не могут быть найдены полнотекстовым поиском по содержимому. В этом случае на одном из клиентских компьютеров, работающих под управлением ОС Microsoft Windows нужно запустить тонкий или толстый клиент, и на нем открыть обработку «Автоматическое извлечение текстов». Эта обработка в автоматическом режиме будет извлекать текст из файлов. По умолчанию интервал времени выполнения равен 60 секундам.</p> <p>См. также: <a href="v8help://frame/form_common">Общая информация о формах</a>.</p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Form.form b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Form.form index 51060b62b..7e85a8ce9 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Form.form @@ -23,7 +23,7 @@ <name>ИнтервалВремениВыполненияПриИзменении</name> </handlers> <extendedTooltip> - <name>ИнтервалВремениВыполненияРасширеннаяПодсказка</name> + <name>ИнтервалВремениВыполненияExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -66,8 +66,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ДекорацияСекРасширеннаяПодсказка</name> - <id>16</id> + <name>ДекорацияСекExtendedTooltip</name> + <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -102,7 +102,7 @@ <value>Группа интервал времени</value> </toolTip> <extendedTooltip> - <name>ГруппаИнтервалВремениРасширеннаяПодсказка</name> + <name>ГруппаИнтервалВремениExtendedTooltip</name> <id>13</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -136,8 +136,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>СтатусРасширеннаяПодсказка</name> - <id>18</id> + <name>СтатусExtendedTooltip</name> + <id>17</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -171,8 +171,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ЗапуститьСейчасРасширеннаяПодсказка</name> - <id>20</id> + <name>ЗапуститьСейчасExtendedTooltip</name> + <id>18</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -203,8 +203,8 @@ <value>Группа статуса</value> </toolTip> <extendedTooltip> - <name>ГруппаСтатусаРасширеннаяПодсказка</name> - <id>17</id> + <name>ГруппаСтатусаExtendedTooltip</name> + <id>16</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -237,7 +237,7 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>ЗакрытьРасширеннаяПодсказка</name> + <name>ЗакрытьExtendedTooltip</name> <id>12</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Module.bsl index 37d2b3805..9844897a5 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Forms/Форма/Module.bsl @@ -25,14 +25,14 @@ Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда Отказ = Истина; - Предупреждение(НСтр("ru = 'Извлечение текстов не поддерживается в Веб-клиенте.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Извлечение текстов не поддерживается в Веб-клиенте.'")); Возврат; КонецЕсли; Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда Отказ = Истина; ТекстСообщения = НСтр("ru = 'Извлечение текстов не поддерживается в клиенте под управлением ОС Linux.'"); - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(, ТекстСообщения); Возврат; КонецЕсли; @@ -310,17 +310,17 @@ &НаСервереБезКонтекста Функция ПолучитьНавигационнуюСсылкуФайла(Знач ФайлИлиВерсияФайла, Знач УникальныйИдентификатор) - НавигационнаяСсылка = Неопределено; + НавигационнаяСсылкаФайла = Неопределено; ОбработчикиСобытия = ОбщегоНазначения.ОбработчикиСлужебногоСобытия( "СтандартныеПодсистемы.ФайловыеФункции\ПриОпределенииНавигационнойСсылкиФайла"); Для каждого Обработчик Из ОбработчикиСобытия Цикл Обработчик.Модуль.ПриОпределенииНавигационнойСсылкиФайла( - ФайлИлиВерсияФайла, УникальныйИдентификатор, НавигационнаяСсылка); + ФайлИлиВерсияФайла, УникальныйИдентификатор, НавигационнаяСсылкаФайла); КонецЦикла; - Возврат НавигационнаяСсылка; + Возврат НавигационнаяСсылкаФайла; КонецФункции diff --git a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Help/ru.html b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Help/ru.html index 9229e4a09..31236844f 100644 --- a/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Help/ru.html +++ b/SSL/src/DataProcessors/АвтоматическоеИзвлечениеТекстовДляВсехОбластейДанных/Help/ru.html @@ -1,3 +1,3 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Если один или несколько рабочих процессов сервера работают под Linux, а часть или все клиенты подключаются с помощью веб-клиента, то в информационной базе могут быть добавлены файлы, текст из которых не извлечен, и соответственно эти файлы не могут быть найдены полнотекстовым поиском по содержимому. В этом случае на одном из клиентских компьютеров, работающих под управлением ОС Microsoft Windows нужно запустить тонкий или толстый клиент, и на нем открыть обработку «Автоматическое извлечение текстов». Эта обработка в автоматическом режиме будет извлекать текст из файлов. По умолчанию интервал времени выполнения равен 60 секундам.</p> <p>См. также: <a href="v8help://frame/form_common">Общая информация о формах</a>.</p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Form.form b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Form.form index ebb85686e..fa5cd02bb 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Form.form +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Form.form @@ -1,5 +1,417 @@ <?xml version="1.0" encoding="UTF-8"?> <form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> + <items xsi:type="form:FormGroup"> + <name>ГруппаБыстрыеОтборы</name> + <id>69</id> + <items xsi:type="form:FormField"> + <name>ОтборИмяПриложения</name> + <id>61</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ОтборИмяПриложения</segments> + </dataPath> + <handlers> + <event>OnChange</event> + <name>ОтборИмяПриложенияПриИзменении</name> + </handlers> + <extendedTooltip> + <name>ОтборИмяПриложенияРасширеннаяПодсказка</name> + <id>63</id> + <type>Label</type> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <extInfo xsi:type="form:LabelDecorationExtInfo"> + <horizontalAlign>Left</horizontalAlign> + </extInfo> + </extendedTooltip> + <contextMenu> + <name>ОтборИмяПриложенияКонтекстноеМеню</name> + <id>62</id> + <autoFill>true</autoFill> + </contextMenu> + <type>InputField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:InputFieldExtInfo"> + <width>25</width> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <horizontalStretch>false</horizontalStretch> + <wrap>true</wrap> + <clearButton>true</clearButton> + <listChoiceMode>true</listChoiceMode> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textEdit>true</textEdit> + <choiceList> + <presentation> + <key>ru</key> + <value>Все сеансы</value> + </presentation> + <value xsi:type="core:StringValue"/> + </choiceList> + <choiceList> + <presentation> + <key>ru</key> + <value>Сеансы пользователей</value> + </presentation> + <value xsi:type="core:StringValue"> + <value>1CV8,1CV8C,WebClient</value> + </value> + </choiceList> + <textSize>Normal</textSize> + </extInfo> + </items> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <title> + <key>ru</key> + <value>Быстрые отборы</value> + + + ГруппаБыстрыеОтборыРасширеннаяПодсказка + 70 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ОсновнаяКоманднаяПанель + 64 + + ОткрытьПользователя + 33 + true + true + + true + + + ОткрытьПользователяExtendedTooltip + 40 + Label + true + true + + Left + + + Form.Command.Открыть + Normal + Auto + true + true + UserCmds + Auto + + + ЗавершитьСеанс + 31 + true + true + + true + + false + + ЗавершитьСеансExtendedTooltip + 41 + Label + true + true + + Left + + + Form.Command.ЗавершитьСеанс + Normal + Auto + true + true + UserCmds + Auto + + + ЖурналРегистрации + 16 + true + true + + true + + false + + ЖурналРегистрацииExtendedTooltip + 42 + Label + true + true + + Left + + + Form.Command.ЖурналРегистрации + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Найти + 38 + true + true + + true + + + НайтиExtendedTooltip + 43 + Label + true + true + + Left + + + Form.Item.СписокПользователей.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ОтменитьПоиск + 39 + true + true + + true + + + ОтменитьПоискExtendedTooltip + 44 + Label + true + true + + Left + + + Form.Item.СписокПользователей.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + + СортировкаПоВозрастанию + 26 + true + true + + true + + false + + СортировкаПоВозрастаниюExtendedTooltip + 45 + Label + true + true + + Left + + + Form.Command.СортировкаПоВозрастанию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + СортировкаПоУбыванию + 27 + true + true + + true + + false + + СортировкаПоУбываниюExtendedTooltip + 46 + Label + true + true + + Left + + + Form.Command.СортировкаПоУбыванию + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + Обновить + 18 + true + true + + true + + false + + ОбновитьExtendedTooltip + 47 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + + Style.ButtonTextColor + + + Style.ButtonBackColor + + + Style.BorderColor + + Auto + + + ПараметрыАдминистрированияИнформационнойБазы + 30 + + <key>ru</key> + <value>Параметры администрирования информационной базы</value> + + true + true + + + true + Role.ПолныеПрава + + + false + + ПараметрыАдминистрированияИнформационнойБазыExtendedTooltip + 48 + Label + true + true + + Left + + + Form.Command.ПараметрыАдминистрированияИнформационнойБазы + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + true + true + + true + + + <key>ru</key> + <value>Основная командная панель</value> + + + ru + Основная командная панель + + + ОсновнаяКоманднаяПанельРасширеннаяПодсказка + 65 + Label + true + true + + Left + + + CommandBar + + Left + Form + + СписокПользователей 2 @@ -33,8 +445,8 @@ СписокПользователей.Пользователь - ПользовательРасширеннаяПодсказка - 62 + ПользовательExtendedTooltip + 53 Label true true @@ -77,8 +489,8 @@ СписокПользователей.ИмяПользователя - ПолноеИмяПользователяРасширеннаяПодсказка - 64 + ПолноеИмяПользователяExtendedTooltip + 54 Label true true @@ -121,8 +533,8 @@ СписокПользователей.Приложение - ПриложениеРасширеннаяПодсказка - 66 + ПриложениеExtendedTooltip + 55 Label true true @@ -165,8 +577,8 @@ СписокПользователей.НачалоРаботы - НачалоРаботыРасширеннаяПодсказка - 68 + НачалоРаботыExtendedTooltip + 56 Label true true @@ -209,8 +621,8 @@ СписокПользователей.Компьютер - КомпьютерРасширеннаяПодсказка - 70 + КомпьютерExtendedTooltip + 57 Label true true @@ -253,8 +665,8 @@ СписокПользователей.Сеанс - СеансРасширеннаяПодсказка - 72 + СеансExtendedTooltip + 58 Label true true @@ -301,8 +713,8 @@ СписокПользователей.РазделениеДанных - СписокПользователейРазделениеДанныхРасширеннаяПодсказка - 74 + СписокПользователейРазделениеДанныхExtendedTooltip + 59 Label true true @@ -343,10 +755,10 @@ СписокПользователейСтрокаПоиска - 53 + 72 СписокПользователейСтрокаПоискаРасширеннаяПодсказка - 55 + 74 Label true true @@ -356,7 +768,7 @@ СписокПользователейСтрокаПоискаКонтекстноеМеню - 54 + 73 true СписокПользователей @@ -366,10 +778,10 @@ СписокПользователейСостояниеПросмотра - 56 + 75 СписокПользователейСостояниеПросмотраРасширеннаяПодсказка - 58 + 77 Label true true @@ -379,7 +791,7 @@ СписокПользователейСостояниеПросмотраКонтекстноеМеню - 57 + 76 true ViewStatusAddition @@ -390,10 +802,10 @@ СписокПользователейУправлениеПоиском - 59 + 78 СписокПользователейУправлениеПоискомРасширеннаяПодсказка - 61 + 80 Label true true @@ -403,7 +815,7 @@ СписокПользователейУправлениеПоискомКонтекстноеМеню - 60 + 79 true SearchControlAddition @@ -413,7 +825,7 @@ - СписокПользователейРасширеннаяПодсказка + СписокПользователейExtendedTooltip 52 Label true @@ -435,7 +847,7 @@ false - ЖурналРегистрацииКонтекстРасширеннаяПодсказка + ЖурналРегистрацииКонтекстExtendedTooltip 49 Label true @@ -462,7 +874,7 @@ false - ЗавершитьСеансКонтекстРасширеннаяПодсказка + ЗавершитьСеансКонтекстExtendedTooltip 50 Label true @@ -489,7 +901,7 @@ false - ОбновитьКонтекстРасширеннаяПодсказка + ОбновитьКонтекстExtendedTooltip 51 Label true @@ -519,7 +931,6 @@ true true - 80 true true 4 @@ -563,8 +974,8 @@ КоличествоАктивныхПользователей - КоличествоАктивныхПользователейРасширеннаяПодсказка - 84 + КоличествоАктивныхПользователейExtendedTooltip + 60 Label true true @@ -589,295 +1000,11 @@ true - Top - true + None + false ФормаКоманднаяПанель -1 - - ОткрытьПользователя - 33 - true - true - - true - - - ОткрытьПользователяРасширеннаяПодсказка - 40 - Label - true - true - - Left - - - Form.Command.Открыть - Normal - Auto - true - true - UserCmds - Auto - - - ЗавершитьСеанс - 31 - true - true - - true - - false - - ЗавершитьСеансРасширеннаяПодсказка - 41 - Label - true - true - - Left - - - Form.Command.ЗавершитьСеанс - Normal - Auto - true - true - UserCmds - Auto - - - ЖурналРегистрации - 16 - true - true - - true - - false - - ЖурналРегистрацииРасширеннаяПодсказка - 42 - Label - true - true - - Left - - - Form.Command.ЖурналРегистрации - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - - - Найти - 38 - true - true - - true - - - НайтиРасширеннаяПодсказка - 43 - Label - true - true - - Left - - - Form.Item.СписокПользователей.StandardCommand.Find - Normal - Auto - true - true - UserCmds - Auto - - - ОтменитьПоиск - 39 - true - true - - true - - - ОтменитьПоискРасширеннаяПодсказка - 44 - Label - true - true - - Left - - - Form.Item.СписокПользователей.StandardCommand.CancelSearch - Normal - Auto - true - true - UserCmds - Auto - - - СортировкаПоВозрастанию - 26 - true - true - - true - - false - - СортировкаПоВозрастаниюРасширеннаяПодсказка - 45 - Label - true - true - - Left - - - Form.Command.СортировкаПоВозрастанию - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - - - СортировкаПоУбыванию - 27 - true - true - - true - - false - - СортировкаПоУбываниюРасширеннаяПодсказка - 46 - Label - true - true - - Left - - - Form.Command.СортировкаПоУбыванию - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - - - Обновить - 18 - true - true - - true - - false - - ОбновитьРасширеннаяПодсказка - 47 - Label - true - true - - Left - - - Form.Command.Обновить - Normal - Auto - true - true - UserCmds - - Style.ButtonTextColor - - - Style.ButtonBackColor - - - Style.BorderColor - - Auto - - - ПараметрыАдминистрированияИнформационнойБазы - 30 - - <key>ru</key> - <value>Параметры администрирования информационной базы</value> - - true - true - - - true - Role.ПолныеПрава - - - false - - ПараметрыАдминистрированияИнформационнойБазыРасширеннаяПодсказка - 48 - Label - true - true - - Left - - - Form.Command.ПараметрыАдминистрированияИнформационнойБазы - Normal - Auto - true - true - UserCmds - Auto - InAdditionalSubmenu - Left true @@ -896,6 +1023,7 @@ OK Retry Yes + 110 LockOwner true true @@ -1119,10 +1247,7 @@ - - true - Role.ПолныеПрава - + true true @@ -1224,6 +1349,24 @@ true + + ОтборИмяПриложения + + <key>ru</key> + <value>Показывать</value> + + 8 + + String + + + + true + + + true + + ЖурналРегистрации diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html index 3ca7da41d..ade7739ad 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Активные пользователи - это пользователи, которые сейчас работают с информационной базой. В этом списке отображаются не только пользователи, работающие с информационной базой при помощи приложений "Тонкий клиент", "Веб-клиент" или "Конфигуратор", но и такие пользователи как "COM-соединение", "WS-соединение", "Фоновое задание" и т.п.</p> <p>Для анализа работы пользователя можно перейти к <a href="DataProcessor.ЖурналРегистрации.Form.ЖурналРегистрации/Help">журналу регистрации</a>, выбрав пользователя в списке и выполнив команду "Журнал регистрации".</p> <p>В клиент-серверном режиме работы также доступна команда "Завершить сеанс". Для того чтобы ею воспользоваться, может потребовать настроить дополнительные параметры подключения к серверу 1С:Предприятие (см. команду "Параметры администрирования информационной базы" в меню "Все действия").</p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl index f003b023a..192a4c84b 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl +++ b/SSL/src/DataProcessors/АктивныеПользователи/Forms/ФормаСпискаАктивныхПользователей/Module.bsl @@ -33,6 +33,14 @@ ИмяКолонкиСортировки = "НачалоРаботы"; НаправлениеСортировки = "Возр"; + + ЗаполнитьСписокВыбораФильтраСоединений(); + Если Параметры.Свойство("ОтборИмяПриложения") Тогда + Если Элементы.ОтборИмяПриложения.СписокВыбора.НайтиПоЗначению(Параметры.ОтборИмяПриложения) <> Неопределено Тогда + ОтборИмяПриложения = Параметры.ОтборИмяПриложения; + КонецЕсли; + КонецЕсли; + ЗаполнитьСписокПользователей(); КонецПроцедуры @@ -48,6 +56,11 @@ //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ +&НаКлиенте +Процедура ОтборИмяПриложенияПриИзменении(Элемент) + ЗаполнитьСписок(); +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ТАБЛИЦЫ СписокПользователей @@ -67,17 +80,17 @@ НомерСеансаДляЗавершения = Элементы.СписокПользователей.ТекущиеДанные.Сеанс; Если НомерСеансаДляЗавершения = НомерСеансаИнформационнойБазы Тогда - Предупреждение(НСтр("ru = 'Невозможно завершить текущий сеанс. Для выхода из программы можно закрыть главное окно программы.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Невозможно завершить текущий сеанс. Для выхода из программы можно закрыть главное окно программы.'")); Возврат; КонецЕсли; Отключено = СоединенияИБКлиентСервер.ОтключитьСеанс(НомерСеансаДляЗавершения, Сообщение); Если НЕ ПустаяСтрока(Сообщение) и Не Отключено Тогда - Предупреждение(Сообщение); + ПоказатьПредупреждение(,Сообщение); КонецЕсли; Если Отключено Тогда - Предупреждение(НСтр("ru = 'Сеанс завершен.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Сеанс завершен.'")); КонецЕсли; ЗаполнитьСписок(); @@ -95,18 +108,17 @@ Процедура ОткрытьЖурналРегистрации() Если Элементы.СписокПользователей.ВыделенныеСтроки.Количество() > 1 Тогда - Предупреждение(НСтр("ru = 'Для просмотра журнала регистрации выберите в списке только одного пользователя.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Для просмотра журнала регистрации выберите в списке только одного пользователя.'")); Возврат; КонецЕсли; ТекущиеДанные = Элементы.СписокПользователей.ТекущиеДанные; Если ТекущиеДанные = Неопределено Тогда - Предупреждение(НСтр("ru = 'Невозможно открыть журнал регистрации для выбранного пользователя.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Невозможно открыть журнал регистрации для выбранного пользователя.'")); Возврат; КонецЕсли; ИмяПользователя = ТекущиеДанные.ИмяПользователя; - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", Новый Структура("Пользователь", ИмяПользователя)); КонецПроцедуры @@ -182,6 +194,30 @@ КонецПроцедуры +&НаСервере +Процедура ЗаполнитьСписокВыбораФильтраСоединений() + ИменаПриложений = Новый Массив; + ИменаПриложений.Добавить("1CV8"); + ИменаПриложений.Добавить("1CV8C"); + ИменаПриложений.Добавить("WebClient"); + ИменаПриложений.Добавить("Designer"); + ИменаПриложений.Добавить("COMConnection"); + ИменаПриложений.Добавить("WSConnection"); + ИменаПриложений.Добавить("BackgroundJob"); + ИменаПриложений.Добавить("SystemBackgroundJob"); + ИменаПриложений.Добавить("SrvrConsole"); + ИменаПриложений.Добавить("COMConsole"); + ИменаПриложений.Добавить("JobScheduler"); + ИменаПриложений.Добавить("Debugger"); + ИменаПриложений.Добавить("OpenIDProvider"); + ИменаПриложений.Добавить("RAS"); + + СписокВыбора = Элементы.ОтборИмяПриложения.СписокВыбора; + Для Каждого ИмяПриложения Из ИменаПриложений Цикл + СписокВыбора.Добавить(ИмяПриложения, ПредставлениеПриложения(ИмяПриложения)); + КонецЦикла; +КонецПроцедуры + &НаСервере Процедура ЗаполнитьСписокПользователей() @@ -194,8 +230,20 @@ КонецЕсли; СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы(); + КоличествоАктивныхПользователей = СеансыИнформационнойБазы.Количество(); + + ФильтроватьИменаПриложений = ЗначениеЗаполнено(ОтборИмяПриложения); + Если ФильтроватьИменаПриложений Тогда + ИменаПриложений = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ОтборИмяПриложения, ","); + КонецЕсли; Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл + Если ФильтроватьИменаПриложений + И ИменаПриложений.Найти(СеансИБ.ИмяПриложения) = Неопределено Тогда + КоличествоАктивныхПользователей = КоличествоАктивныхПользователей - 1; + Продолжить; + КонецЕсли; + СтрПользователя = СписокПользователей.Добавить(); СтрПользователя.Приложение = ПредставлениеПриложения(СеансИБ.ИмяПриложения); @@ -203,7 +251,7 @@ СтрПользователя.Компьютер = СеансИБ.ИмяКомпьютера; СтрПользователя.Сеанс = СеансИБ.НомерСеанса; СтрПользователя.Соединение = СеансИБ.НомерСоединения; - + Если ТипЗнч(СеансИБ.Пользователь) = Тип("ПользовательИнформационнойБазы") И ЗначениеЗаполнено(СеансИБ.Пользователь.Имя) Тогда @@ -234,7 +282,6 @@ КонецЦикла; - КоличествоАктивныхПользователей = СеансыИнформационнойБазы.Количество(); СписокПользователей.Сортировать(ИмяКолонкиСортировки + " " + НаправлениеСортировки); КонецПроцедуры diff --git a/SSL/src/DataProcessors/АктивныеПользователи/Help/ru.html b/SSL/src/DataProcessors/АктивныеПользователи/Help/ru.html index 1c0479cdd..c75b8b651 100644 --- a/SSL/src/DataProcessors/АктивныеПользователи/Help/ru.html +++ b/SSL/src/DataProcessors/АктивныеПользователи/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Список содержит список пользователей, работающих в данный момент времени в системе. </p> <p>Для удобства просмотра списка можно использовать сортировку по любой колонке. Полужирным шрифтом выделена строка, соответствующая тому сеансу работы пользователя, из которого открыт список активных пользователей. </p> <p>С помощью команд меню <strong>Все действия</strong> можно настроить форму и вывести данные списка в табличный и текстовый документ. По команде <strong>Журнал регистрации</strong> можно перейти к <a href="DataProcessor.ЖурналРегистрации/Help">журналу регистрации</a> с установленным фильтром по выбранному пользователю. </p> diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form index 60fd1b644..6752a7544 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/ОшибкаУстановкиМонопольногоРежима/Form.form @@ -22,7 +22,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>КартинкаПредупреждениеРасширеннаяПодсказка</name> + <name>КартинкаПредупреждениеExtendedTooltip</name> <id>50</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -65,7 +65,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстСообщенияОбОшибкеРасширеннаяПодсказка</name> + <name>ТекстСообщенияОбОшибкеExtendedTooltip</name> <id>53</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -99,7 +99,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>АктивныеПользователиРасширеннаяПодсказка</name> + <name>АктивныеПользователиExtendedTooltip</name> <id>54</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -135,7 +135,7 @@ <value>Группа сообщение об ошибке</value> - ГруппаСообщениеОбОшибкеРасширеннаяПодсказка + ГруппаСообщениеОбОшибкеExtendedTooltip 52 Label true @@ -167,7 +167,7 @@ true - ПояснениеПоОшибкеРасширеннаяПодсказка + ПояснениеПоОшибкеExtendedTooltip 55 Label true @@ -202,7 +202,7 @@ Группа информация - ГруппаИнформацияРасширеннаяПодсказка + ГруппаИнформацияExtendedTooltip 51 Label true @@ -231,7 +231,7 @@ Группа информация для пользователя - ГруппаИнформацияДляПользователяРасширеннаяПодсказка + ГруппаИнформацияДляПользователяExtendedTooltip 49 Label true @@ -255,7 +255,7 @@ true - Страница1РасширеннаяПодсказка + Страница1ExtendedTooltip 48 Label true @@ -288,7 +288,7 @@ true - КартинкаОжиданиеРасширеннаяПодсказка + КартинкаОжиданиеExtendedTooltip 58 Label true @@ -328,7 +328,7 @@ true - ТекстПоясненияРасширеннаяПодсказка + ТекстПоясненияExtendedTooltip 60 Label true @@ -363,7 +363,7 @@ true - АктивныеПользователи2РасширеннаяПодсказка + АктивныеПользователи2ExtendedTooltip 61 Label true @@ -395,7 +395,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 59 Label true @@ -424,7 +424,7 @@ Группа содержание - ГруппаСодержаниеРасширеннаяПодсказка + ГруппаСодержаниеExtendedTooltip 57 Label true @@ -448,7 +448,7 @@ true - Страница2РасширеннаяПодсказка + Страница2ExtendedTooltip 56 Label true @@ -472,7 +472,7 @@ Группа страницы - ГруппаСтраницыРасширеннаяПодсказка + ГруппаСтраницыExtendedTooltip 47 Label true @@ -500,7 +500,7 @@ true - ФормаПовторитьЗапускПрограммыРасширеннаяПодсказка + ФормаПовторитьЗапускПрограммыExtendedTooltip 43 Label true @@ -526,7 +526,7 @@ true - ФормаЗавершитьСеансыИПерезапуститьПрограммуРасширеннаяПодсказка + ФормаЗавершитьСеансыИПерезапуститьПрограммуExtendedTooltip 44 Label true @@ -552,7 +552,7 @@ true - ФормаОтменитьЗапускПрограммыРасширеннаяПодсказка + ФормаОтменитьЗапускПрограммыExtendedTooltip 45 Label true @@ -578,7 +578,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 46 Label true @@ -605,7 +605,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true true Vertical diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form index 1e133d1f2..74e7bf17d 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Form.form @@ -12,7 +12,7 @@ true - ДекорацияОшибкаРасширеннаяПодсказка + ДекорацияОшибкаExtendedTooltip 86 Label true @@ -52,7 +52,7 @@ true - ТекстОшибкиРасширеннаяПодсказка + ТекстОшибкиExtendedTooltip 88 Label true @@ -93,7 +93,7 @@ true - НадписьПараметрыРасширеннаяПодсказка + НадписьПараметрыExtendedTooltip 90 Label true @@ -130,7 +130,7 @@ true - НастроитьРасширеннаяПодсказка + НастроитьExtendedTooltip 91 Label true @@ -154,7 +154,7 @@ true - ГруппаПараметрыРасширеннаяПодсказка + ГруппаПараметрыExtendedTooltip 89 Label true @@ -192,7 +192,7 @@ Возможно необходимо обновить версию компоненты "comcntr". При этом потребуется перезапустить сеанс 1С. Для этого нажмите здесь - НадписьОбновитьВерсиюКомпонентыРасширеннаяПодсказка + НадписьОбновитьВерсиюКомпонентыExtendedTooltip 93 Label true @@ -222,7 +222,7 @@ true - ГруппаComcntrРасширеннаяПодсказка + ГруппаComcntrExtendedTooltip 92 Label true @@ -246,7 +246,7 @@ true - ГруппаРасширеннаяПодсказка + ГруппаExtendedTooltip 87 Label true @@ -279,7 +279,7 @@ Группа ошибка - ГруппаОшибкаРасширеннаяПодсказка + ГруппаОшибкаExtendedTooltip 85 Label true @@ -320,7 +320,7 @@ None - НачальныйСтатусЗапретаРаботыПользователейРасширеннаяПодсказка + НачальныйСтатусЗапретаРаботыПользователейExtendedTooltip 97 Label true @@ -356,7 +356,7 @@ true - ГруппаСтатусЗапретаРаботыПользователейРасширеннаяПодсказка + ГруппаСтатусЗапретаРаботыПользователейExtendedTooltip 96 Label true @@ -388,8 +388,8 @@ Объект.СообщениеДляПользователей - СообщениеДляПользователейРасширеннаяПодсказка - 99 + СообщениеДляПользователейExtendedTooltip + 98 Label true true @@ -442,8 +442,8 @@ Объект.НачалоДействияБлокировки - НачалоБлокировкиРасширеннаяПодсказка - 102 + НачалоБлокировкиExtendedTooltip + 100 Label true true @@ -490,8 +490,8 @@ Объект.ОкончаниеДействияБлокировки - ОкончаниеБлокировкиРасширеннаяПодсказка - 104 + ОкончаниеБлокировкиExtendedTooltip + 101 Label true true @@ -533,8 +533,8 @@ Ctrl+S - ГруппаПериодБлокировкиРасширеннаяПодсказка - 101 + ГруппаПериодБлокировкиExtendedTooltip + 99 Label true true @@ -568,8 +568,8 @@ Left - КодДляРазблокировкиРасширеннаяПодсказка - 106 + КодДляРазблокировкиExtendedTooltip + 102 Label true true @@ -624,8 +624,8 @@ Right - ЗапретитьРаботуРегламентныхЗаданийРасширеннаяПодсказка - 109 + ЗапретитьРаботуРегламентныхЗаданийExtendedTooltip + 104 Label true true @@ -655,8 +655,8 @@ Группа запретить работу регламентных заданий - ГруппаЗапретитьРаботуРегламентныхЗаданийРасширеннаяПодсказка - 108 + ГруппаЗапретитьРаботуРегламентныхЗаданийExtendedTooltip + 103 Label true true @@ -685,7 +685,7 @@ Страница настройки - СтраницаНастройкиРасширеннаяПодсказка + СтраницаНастройкиExtendedTooltip 95 Label true @@ -715,8 +715,8 @@ true - ДекорацияСостояниеРасширеннаяПодсказка - 113 + ДекорацияСостояниеExtendedTooltip + 107 Label true true @@ -756,8 +756,8 @@ true - СостояниеРасширеннаяПодсказка - 115 + СостояниеExtendedTooltip + 109 Label true true @@ -795,8 +795,8 @@ Объект.СообщениеДляПользователей - СообщениеДляПользователей1РасширеннаяПодсказка - 116 + СообщениеДляПользователей1ExtendedTooltip + 110 Label true true @@ -850,8 +850,8 @@ Объект.НачалоДействияБлокировки - НачалоБлокировки1РасширеннаяПодсказка - 119 + НачалоБлокировки1ExtendedTooltip + 112 Label true true @@ -891,8 +891,8 @@ Объект.ОкончаниеДействияБлокировки - ОкончаниеБлокировки1РасширеннаяПодсказка - 121 + ОкончаниеБлокировки1ExtendedTooltip + 113 Label true true @@ -928,8 +928,8 @@ true Ctrl+S - ГруппаПериодБлокировки1РасширеннаяПодсказка - 118 + ГруппаПериодБлокировки1ExtendedTooltip + 111 Label true true @@ -953,8 +953,8 @@ true - ГруппаСодержимоеРасширеннаяПодсказка - 114 + ГруппаСодержимоеExtendedTooltip + 108 Label true true @@ -979,8 +979,8 @@ false - ГруппаСостояниеРасширеннаяПодсказка - 112 + ГруппаСостояниеExtendedTooltip + 106 Label true true @@ -1008,8 +1008,8 @@ Страница состояния блокировки - СтраницаСостоянияБлокировкиРасширеннаяПодсказка - 111 + СтраницаСостоянияБлокировкиExtendedTooltip + 105 Label true true @@ -1038,7 +1038,7 @@ true - ГруппаРежимРасширеннаяПодсказка + ГруппаРежимExtendedTooltip 94 Label true @@ -1065,8 +1065,8 @@ false - КомандаПрименитьРасширеннаяПодсказка - 124 + КомандаПрименитьExtendedTooltip + 115 Label true true @@ -1099,8 +1099,8 @@ true - КомандаОстановитьРасширеннаяПодсказка - 125 + КомандаОстановитьExtendedTooltip + 116 Label true true @@ -1126,8 +1126,8 @@ false - КомандаЗакрытьРасширеннаяПодсказка - 126 + КомандаЗакрытьExtendedTooltip + 117 Label true true @@ -1148,8 +1148,8 @@ true - ОсновнаяКоманднаяПанельРасширеннаяПодсказка - 123 + ОсновнаяКоманднаяПанельExtendedTooltip + 114 Label true true @@ -1178,7 +1178,7 @@ false - АктивныеПользователиРасширеннаяПодсказка + АктивныеПользователиExtendedTooltip 83 Label true @@ -1212,7 +1212,7 @@ false - ПараметрыАдминистрированияИнформационнойБазыРасширеннаяПодсказка + ПараметрыАдминистрированияИнформационнойБазыExtendedTooltip 84 Label true diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl index 61b39ae1a..94108ae5f 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Forms/Форма/Module.bsl @@ -18,9 +18,7 @@ КонецЕсли; Если ОбщегоНазначенияПовтИсп.РазделениеВключено() Тогда - Элементы.КодДляРазблокировки.Видимость = Ложь; - КонецЕсли; ПолучитьПараметрыБлокировки(); @@ -35,7 +33,7 @@ КлиентПодключенЧерезВебСервер = ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер(); Если РаботаПользователейЗавершается = Истина Тогда Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.СтраницаСостоянияБлокировки; - ОбновитьСтраницуСостояния(ЭтаФорма); + ОбновитьСтраницуСостояния(ЭтотОбъект); КонецЕсли; КонецПроцедуры @@ -63,7 +61,7 @@ // Проверка возможности принудительно завершить сеансы при работе с клиента через веб-сервер. // Невозможно установить блокировку, на сервере не установлена ОС Microsoft Windows и не включено разделение (локальный режим работы). Если НЕ ТолькоКлиентскиеПриложения И Не ОбщегоНазначенияПовтИсп.РазделениеВключено() И КлиентПодключенЧерезВебСервер - И Не СоединенияИБПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда + И Не СоединенияИБВызовСервераПовтИсп.ПараметрыОтключенияСеансов().WindowsПлатформаНаСервере Тогда ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Имеются активные сеансы, которые не могут быть завершены принудительно (т.к. сервер работает под управлением ОС, отличной от Microsoft Windows). Блокировка не установлена. |%1'"), @@ -97,11 +95,11 @@ Если ИмяСобытия = "ЗавершениеРаботыПользователей" Тогда КоличествоСеансов = Параметр.КоличествоСеансов; - ОбновитьСостояниеБлокировки(ЭтаФорма); + ОбновитьСостояниеБлокировки(ЭтотОбъект); Если Параметр.Статус = "Готово" Тогда Закрыть(); ИначеЕсли Параметр.Статус = "Ошибка" Тогда - Предупреждение(НСтр("ru = 'Не удалось завершить работу всех активных пользователей. + ПоказатьПредупреждение(,НСтр("ru = 'Не удалось завершить работу всех активных пользователей. |Подробности см. в Журнале регистрации.'"), 30); Закрыть(); КонецЕсли; @@ -117,7 +115,7 @@ &НаКлиенте Процедура АктивныеПользователи(Команда) - ОткрытьФорму("Обработка.АктивныеПользователи.Форма",, ЭтаФорма); + ОткрытьФорму("Обработка.АктивныеПользователи.Форма",, ЭтотОбъект); КонецПроцедуры @@ -154,12 +152,8 @@ Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Заблокировать через 5 минут'")); Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Заблокировать сейчас'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); - Ответ = Вопрос(ТекстВопроса, Кнопки,,, ЗаголовокВопроса); - Если Ответ = КодВозвратаДиалога.Да Тогда - Объект.НачалоДействияБлокировки = ОбщегоНазначенияКлиент.ДатаСеанса() + 5 * 60; - ИначеЕсли Ответ <> КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПрименитьЗавершение", ЭтотОбъект, "СлишкомБлизкоеВремяБлокировки"); + ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки,,, ЗаголовокВопроса); ИначеЕсли Объект.НачалоДействияБлокировки > ОбщегоНазначенияКлиент.ДатаСеанса() + 60 * 60 Тогда ТекстВопроса = НСтр("ru = 'Указано слишком большое время начала действия блокировки (более, чем через час). |Запланировать блокировку на указанное время?'"); @@ -167,12 +161,8 @@ Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Запланировать'")); Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Заблокировать сейчас'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); - Ответ = Вопрос(ТекстВопроса, Кнопки,,, ЗаголовокВопроса); - Если Ответ = КодВозвратаДиалога.Да Тогда - Объект.НачалоДействияБлокировки = ОбщегоНазначенияКлиент.ДатаСеанса() + 5 * 60; - ИначеЕсли Ответ <> КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПрименитьЗавершение", ЭтотОбъект, "СлишкомБольшоеВремяБлокировки"); + ПоказатьВопрос(Оповещение, ТекстВопроса, Кнопки,,, ЗаголовокВопроса); Иначе Если Объект.НачалоДействияБлокировки - ОбщегоНазначенияКлиент.ДатаСеанса() > 15*60 Тогда ТекстВопроса = НСтр("ru = 'Завершение работы всех активных пользователей будет произведено в период с %1 по %2. @@ -181,16 +171,40 @@ ТекстВопроса = НСтр("ru = 'Сеансы всех активных пользователей будут завершены к %2. |Продолжить?'"); КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПрименитьЗавершение", ЭтотОбъект, "Подтверждение"); ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ТекстВопроса, Объект.НачалоДействияБлокировки - 900, Объект.НачалоДействияБлокировки); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена,,, ЗаголовокВопроса); - Если Ответ <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена,,, ЗаголовокВопроса); КонецЕсли; КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПрименитьЗавершение", ЭтотОбъект, "Подтверждение"); + ВыполнитьОбработкуОповещения(Оповещение, КодВозвратаДиалога.ОК); + +КонецПроцедуры + +&НаКлиенте +Процедура ПрименитьЗавершение(Ответ, Вариант) Экспорт + + Если Вариант = "СлишкомБлизкоеВремяБлокировки" Тогда + Если Ответ = КодВозвратаДиалога.Да Тогда + Объект.НачалоДействияБлокировки = ОбщегоНазначенияКлиент.ДатаСеанса() + 5 * 60; + ИначеЕсли Ответ <> КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + ИначеЕсли Вариант = "СлишкомБольшоеВремяБлокировки" Тогда + Если Ответ = КодВозвратаДиалога.Да Тогда + Объект.НачалоДействияБлокировки = ОбщегоНазначенияКлиент.ДатаСеанса() + 5 * 60; + ИначеЕсли Ответ <> КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + ИначеЕсли Вариант = "СлишкомБольшоеВремяБлокировки" Тогда + Если Ответ <> КодВозвратаДиалога.ОК Тогда + Возврат; + КонецЕсли; + КонецЕсли; + Если Не УстановитьСнятьБлокировку() Тогда Возврат; КонецЕсли; @@ -202,7 +216,7 @@ СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей( Объект.ВременноЗапретитьРаботуПользователей); Если Объект.ВременноЗапретитьРаботуПользователей Тогда - ОбновитьСтраницуСостояния(ЭтаФорма); + ОбновитьСтраницуСостояния(ЭтотОбъект); Иначе ОбновитьСтраницуНастройки(); КонецЕсли; @@ -216,7 +230,7 @@ Возврат; КонецЕсли; СоединенияИБКлиент.УстановитьОбработчикиОжиданияЗавершенияРаботыПользователей(Ложь); - Предупреждение(НСтр("ru = 'Завершение работы активных пользователей отменено. + ПоказатьПредупреждение(,НСтр("ru = 'Завершение работы активных пользователей отменено. |Вход в программу новых пользователей оставлен заблокированным.'")); КонецПроцедуры diff --git a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html index 3f75f058f..ecefaaf99 100644 --- a/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/БлокировкаРаботыПользователей/Help/ru.html @@ -1,4 +1,4 @@ - +

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

            При установке блокировки можно задать следующие параметры:

            • Период (время) начала действия и окончания действия блокировки; diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form index 6b322f315..2e9f8cecf 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Form.form @@ -30,7 +30,7 @@ СтранаПриИзменении - СтранаРасширеннаяПодсказка + СтранаExtendedTooltip 107 Label true @@ -110,8 +110,8 @@ None - КодСтраныРасширеннаяПодсказка - 109 + КодСтраныExtendedTooltip + 108 Label true true @@ -157,7 +157,7 @@ Страна - ГруппаСтраныРасширеннаяПодсказка + ГруппаСтраныExtendedTooltip 106 Label true @@ -198,8 +198,8 @@ ИндексПриИзменении - ИндексРасширеннаяПодсказка - 112 + ИндексExtendedTooltip + 110 Label true true @@ -218,6 +218,10 @@ Left true + + ChoiceProcessing + ИндексОбработкаВыбора + true true true @@ -242,8 +246,8 @@ Индекс - ГруппаИндексаРасширеннаяПодсказка - 111 + ГруппаИндексаExtendedTooltip + 109 Label true true @@ -276,7 +280,7 @@ true - СтранаАдресаРасширеннаяПодсказка + СтранаАдресаExtendedTooltip 105 Label true @@ -322,8 +326,8 @@ НаселенныйПунктПриИзменении - НаселенныйПунктРасширеннаяПодсказка - 116 + НаселенныйПунктExtendedTooltip + 113 Label true true @@ -389,8 +393,8 @@ УлицаПриИзменении - УлицаРасширеннаяПодсказка - 118 + УлицаExtendedTooltip + 114 Label true true @@ -459,8 +463,8 @@ ТипДомаПриИзменении - ТипДомаРасширеннаяПодсказка - 121 + ТипДомаExtendedTooltip + 116 Label true true @@ -511,8 +515,8 @@ ДомПриИзменении - ДомРасширеннаяПодсказка - 123 + ДомExtendedTooltip + 117 Label true true @@ -535,7 +539,7 @@ true true true - true + true true true true @@ -558,8 +562,8 @@ false - ГруппаДомРасширеннаяПодсказка - 120 + ГруппаДомExtendedTooltip + 115 Label true true @@ -603,8 +607,8 @@ ТипСтроенияПриИзменении - ТипСтроенияРасширеннаяПодсказка - 127 + ТипСтроенияExtendedTooltip + 120 Label true true @@ -655,8 +659,8 @@ СтроениеПриИзменении - СтроениеРасширеннаяПодсказка - 129 + СтроениеExtendedTooltip + 121 Label true true @@ -679,7 +683,7 @@ true true true - true + true true true true @@ -702,8 +706,8 @@ false - ГруппаСтроениеНачальноеРасширеннаяПодсказка - 126 + ГруппаСтроениеНачальноеExtendedTooltip + 119 Label true true @@ -738,8 +742,8 @@ false - ГруппаСтроенияДополнительноРасширеннаяПодсказка - 131 + ГруппаСтроенияДополнительноExtendedTooltip + 122 Label true true @@ -773,8 +777,8 @@ true false - ГруппаСтроенияРасширеннаяПодсказка - 125 + ГруппаСтроенияExtendedTooltip + 118 Label true true @@ -819,8 +823,8 @@ ТипПомещенияПриИзменении - ТипПомещенияРасширеннаяПодсказка - 134 + ТипПомещенияExtendedTooltip + 125 Label true true @@ -871,8 +875,8 @@ ПомещениеПриИзменении - ПомещениеРасширеннаяПодсказка - 136 + ПомещениеExtendedTooltip + 126 Label true true @@ -916,8 +920,8 @@ false - ГруппаПомещениеНачальноеРасширеннаяПодсказка - 133 + ГруппаПомещениеНачальноеExtendedTooltip + 124 Label true true @@ -952,8 +956,8 @@ false - ГруппаПомещенияДополнительноРасширеннаяПодсказка - 138 + ГруппаПомещенияДополнительноExtendedTooltip + 127 Label true true @@ -987,8 +991,8 @@ true false - ГруппаПомещениеРасширеннаяПодсказка - 132 + ГруппаПомещениеExtendedTooltip + 123 Label true true @@ -1015,8 +1019,8 @@ true - ДобавитьОбъектРасширеннаяПодсказка - 139 + ДобавитьОбъектExtendedTooltip + 128 Label true true @@ -1058,8 +1062,8 @@ ПредставлениеАдресаПриИзменении - ПредставлениеАдресаРасширеннаяПодсказка - 141 + ПредставлениеАдресаExtendedTooltip + 130 Label true true @@ -1107,8 +1111,8 @@ true - ГруппаПредставленияРасширеннаяПодсказка - 140 + ГруппаПредставленияExtendedTooltip + 129 Label true true @@ -1141,8 +1145,8 @@ Российский адрес - РоссийскийАдресРасширеннаяПодсказка - 115 + РоссийскийАдресExtendedTooltip + 112 Label true true @@ -1171,8 +1175,8 @@ None - ПредставлениеИностранногоАдресаРасширеннаяПодсказка - 144 + ПредставлениеИностранногоАдресаExtendedTooltip + 132 Label true true @@ -1215,8 +1219,8 @@ Иностранный адрес - ИностранныйАдресРасширеннаяПодсказка - 143 + ИностранныйАдресExtendedTooltip + 131 Label true true @@ -1244,8 +1248,8 @@ true - ТипАдресаРасширеннаяПодсказка - 114 + ТипАдресаExtendedTooltip + 111 Label true true @@ -1281,8 +1285,8 @@ true true - ГруппаДополнительныхПолейРасширеннаяПодсказка - 147 + ГруппаДополнительныхПолейExtendedTooltip + 134 Label true true @@ -1318,8 +1322,8 @@ Дополнительный комментарий, не включаемый в представление адреса - КомментарийРасширеннаяПодсказка - 148 + КомментарийExtendedTooltip + 135 Label true true @@ -1369,8 +1373,8 @@ Общие данные - ОбщиеДанныеРасширеннаяПодсказка - 146 + ОбщиеДанныеExtendedTooltip + 133 Label true true @@ -1404,8 +1408,8 @@ true - ПроверитьЗаполнениеАдресаРасширеннаяПодсказка - 152 + ПроверитьЗаполнениеАдресаExtendedTooltip + 138 Label true true @@ -1428,8 +1432,8 @@ true - Группа2РасширеннаяПодсказка - 151 + Группа2ExtendedTooltip + 137 Label true true @@ -1454,8 +1458,8 @@ true - ФормаКомандаОКРасширеннаяПодсказка - 154 + ФормаКомандаОКExtendedTooltip + 140 Label true true @@ -1480,8 +1484,8 @@ true - ФормаОтменаРасширеннаяПодсказка - 155 + ФормаОтменаExtendedTooltip + 141 Label true true @@ -1489,7 +1493,7 @@ Left - Form.StandardCommand.Cancel + Form.Command.КомандаОтмена Normal Auto true @@ -1500,33 +1504,6 @@ ФормаВсеДействия 96 - - ФормаОчиститьАдрес - 90 - true - true - - true - - - ФормаОчиститьАдресРасширеннаяПодсказка - 157 - Label - true - true - - Left - - - Form.Command.ОчиститьАдрес - Normal - Auto - true - true - UserCmds - Auto - InCommandBarAndInAdditionalSubmenu - ФормаВводАдресаВСвободнойФорме 101 @@ -1539,8 +1516,8 @@ true - ВвестиАдресВСвободнойФормеРасширеннаяПодсказка - 159 + ВвестиАдресВСвободнойФормеExtendedTooltip + 145 Label true true @@ -1570,8 +1547,81 @@ Форма ввод адреса в свободной форме - ФормаВводАдресаВСвободнойФормеРасширеннаяПодсказка - 158 + ФормаВводАдресаВСвободнойФормеExtendedTooltip + 144 + Label + true + true + + Left + + + + + + ФормаВсеДействияИзмененияАдреса + 152 + + ЗаполнитьПоПочтовомуИндексу + 150 + true + true + + true + + + ЗаполнитьПоПочтовомуИндексуРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + Form.Command.ЗаполнитьПоПочтовомуИндексу + Normal + Auto + true + true + UserCmds + Auto + + + ФормаОчиститьАдрес + 90 + true + true + + true + + + ФормаОчиститьАдресExtendedTooltip + 143 + Label + true + true + + Left + + + Form.Command.ОчиститьАдрес + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + true + true + + true + + + ФормаВсеДействияИзмененияАдресаРасширеннаяПодсказка + 153 Label true true @@ -1593,8 +1643,8 @@ true - ИзменитьФормуРасширеннаяПодсказка - 161 + ИзменитьФормуExtendedTooltip + 147 Label true true @@ -1620,8 +1670,8 @@ true - СправкаРасширеннаяПодсказка - 162 + СправкаExtendedTooltip + 148 Label true true @@ -1652,8 +1702,8 @@ Форма стандартные действия - ФормаСтандартныеДействияРасширеннаяПодсказка - 160 + ФормаСтандартныеДействияExtendedTooltip + 146 Label true true @@ -1677,8 +1727,8 @@ Все действия - ФормаВсеДействияРасширеннаяПодсказка - 156 + ФормаВсеДействияExtendedTooltip + 142 Label true true @@ -1704,8 +1754,8 @@ true - ФормаСправкаРасширеннаяПодсказка - 163 + ФормаСправкаExtendedTooltip + 149 Label true true @@ -1735,8 +1785,8 @@ Панель команд формы - ПанельКомандФормыРасширеннаяПодсказка - 153 + ПанельКомандФормыExtendedTooltip + 139 Label true true @@ -1763,8 +1813,8 @@ Панель команд - ПанельКомандРасширеннаяПодсказка - 150 + ПанельКомандExtendedTooltip + 136 Label true true @@ -2616,10 +2666,10 @@ - ЭтоПлатформа83 + ЕстьКлассификатор <key>ru</key> - <value>Платформа версии 83</value> + <value>Есть классификатор</value> 40 @@ -2775,6 +2825,50 @@ Auto Auto + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 7 + + ru + Отменить изменения и закрыть форму + + + true + + + + КомандаОтмена + + + Auto + Auto + + + ЗаполнитьПоПочтовомуИндексу + + <key>ru</key> + <value>Заполнить по почтовому индексу...</value> + + 8 + + ru + Заполнить части адреса по почтовому индексу + + + true + + + + ЗаполнитьПоПочтовомуИндексу + + + Auto + Auto + ВидКонтактнойИнформации diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html index 9ac325bb5..780c32f7f 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Help/ru.html @@ -1,6 +1,6 @@ +

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

              • Поле "Страна" позволяет выбрать страну адреса. Редактирование адресов за пределами России производится в общем поле, без учета частей адреса
              • Поле "Индекс" предназначено для ввода почтового индекса, соответствующего данному адресу.Если адрес найден а вдресном классификаторе, то индекс может быть проставлен автоматически. diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl index dcf90e06b..5ba69c256 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводАдреса/Module.bsl @@ -31,8 +31,6 @@ ВызватьИсключение НСтр("ru='Обработка не предназначена для непосредственного использования.'"); КонецЕсли; - ЭтоПлатформа83 = ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(); - Параметры.Свойство("ВозвращатьСписокЗначений", ВозвращатьСписокЗначений); // Внутренняя инициализация @@ -60,6 +58,8 @@ ПроверятьКорректность = ВидКонтактнойИнформации.ПроверятьКорректность; ЗапрещатьВводНекорректного = ВидКонтактнойИнформации.ЗапрещатьВводНекорректного; МожноЗагружатьКлассификатор = КонтактнаяИнформацияСлужебный.ЕстьВозможностьИзмененияАдресногоКлассификатора(); + ЕстьКлассификатор = Неопределено <> КонтактнаяИнформацияКлиентСервер.ИспользуемыйАдресныйКлассификатор(); + СкрыватьНеактуальныеАдреса = ВидКонтактнойИнформации.СкрыватьНеактуальныеАдреса; АдресТолькоРоссийский = ВидКонтактнойИнформации.АдресТолькоРоссийский; @@ -91,7 +91,7 @@ КонтактнаяИнформацияСлужебный.КомментарийКонтактнойИнформации(XDTOКонтактная, Параметры.Комментарий); КонецЕсли; - ЗначениеРеквизитовПоКонтактнойИнформации(ЭтаФорма, XDTOКонтактная); + ЗначениеРеквизитовПоКонтактнойИнформации(ЭтотОбъект, XDTOКонтактная); Если ЗначениеЗаполнено(Страна) Тогда // Нашли в справочнике стран ИсходноеПредставлениеСтраны = ""; @@ -127,10 +127,11 @@ Если Не ПустаяСтрока(Параметры.ЗначенияПолей) Тогда // Считаем адрес российским, но введенным в свободной форме. ПредставлениеАдреса = СокрЛП( - СокрЛП(Страна) + " " + СокрЛП(ПредставлениеАдреса) + " " + СокрЛП(ПредставлениеИностранногоАдреса) + СокрЛП(Страна) + " " + СокрЛП(ПредставлениеИностранногоАдреса) ); РазрешитьВводАдресаВСвободнойФорме = Истина; ПредставлениеАдресаИзменено = Истина; + Модифицированность = Истина; КонецЕсли; Страна = СтранаРоссия; КонецЕсли; @@ -140,7 +141,6 @@ Если Не ЗначениеЗаполнено(Страна) Тогда Если ПустаяСтрока(ИсходноеПредставлениеСтраны) Тогда Страна = СтранаРоссия; - КодСтраны = СтранаРоссия.Код; Иначе // Не определили страну, но точно не Россия Если ПустаяСтрока(ТекстПредупрежденияПриОткрытии) Тогда @@ -162,16 +162,19 @@ ТекущийЭлемент = Элементы.ПредставлениеИностранногоАдреса; КонецЕсли; - // Обход особенности платформы 8.3 Если ОбщегоНазначенияКлиентСервер.ЭтоВебКлиент() Тогда МожноЗагружатьКлассификатор = Ложь; Иначе КнопкаПанели = Элементы.Добавить("ФормаЗагрузитьКлассификатор", Тип("КнопкаФормы")); КнопкаПанели.ИмяКоманды = "ЗагрузитьКлассификатор"; - Элементы.Переместить(КнопкаПанели, Элементы.ФормаВсеДействия, Элементы.ФормаВводАдресаВСвободнойФорме); + Элементы.Переместить(КнопкаПанели, Элементы.ФормаВсеДействия, Элементы.ФормаСтандартныеДействия); Элементы.ФормаЗагрузитьКлассификатор.Видимость = МожноЗагружатьКлассификатор; КонецЕсли; + Если Не ЕстьКлассификатор Тогда + Элементы.ЗаполнитьПоПочтовомуИндексу.Видимость = Ложь; + КонецЕсли; + УстановитьКлючИспользованияФормы(); КонецПроцедуры @@ -190,14 +193,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, - МодифицированностьПриВыборе(), ВыбраноДействиеВыбора() ); - - Если Не Отказ Тогда - УстановитьКлючИспользованияФормы(); - СохраняемыеВНастройкахДанныеМодифицированы = Истина; - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -226,8 +223,6 @@ &НаКлиенте Процедура СтранаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - -#Если Не ВебКлиент Тогда Если Ожидание=0 Тогда // Формирование списка быстрого выбора Если ПустаяСтрока(Текст) Тогда @@ -235,8 +230,7 @@ КонецЕсли; Возврат; КонецЕсли; -#КонецЕсли - + #Если ВебКлиент Тогда // Обход особенности платформы СтандартнаяОбработка = Ложь; @@ -276,9 +270,54 @@ &НаКлиенте Процедура ИндексПриИзменении(Элемент) + Контекст = КонтекстФормыКлиент(); + + ТекущийИндекс = СокрЛП(Индекс); + Если ЕстьКлассификатор И СтрДлина(ТекущийИндекс) = 6 Тогда + ПараметрыФормы = Новый Структура("Индекс, СкрыватьНеактуальныеАдреса", ТекущийИндекс, СкрыватьНеактуальныеАдреса); + ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ПоискАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); + КонецЕсли; + ЗаполнитьПредставлениеАдреса(Контекст); КонтекстФормыКлиент(Контекст); + +КонецПроцедуры + +&НаКлиенте +Процедура ИндексОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + Если ВыбранноеЗначение = Неопределено Тогда + Возврат; + КонецЕсли; + + Контекст = КонтекстФормыКлиент(); + ЗаполнитьАдресПоДаннымИндекса(Контекст, ВыбранноеЗначение); + КонтекстФормыКлиент(Контекст); + + ВизуализироватьКорректностьВыбора(); + Модифицированность = Истина; + + ТекущийЭлемент = Элементы.Дом; +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьАдресПоДаннымИндекса(Контекст, Знач ДанныеИндекса) + + ОчиститьАдресСервер(Контекст); + + XDTOКонтактнаяИнфо = КонтактнаяИнформацияПоЗначениюРеквизитов(Контекст); + + // Предполагаем, что адрес все еще российский + XDTOАдрес = XDTOКонтактнаяИнфо.Состав.Состав; + + КонтактнаяИнформацияСлужебный.ПочтовыйИндексАдреса(XDTOАдрес, ДанныеИндекса.Индекс); + КонтактнаяИнформацияСлужебный.УстановитьНаселенныйПунктАдресаПоКоду(XDTOАдрес, ДанныеИндекса.Код); + КонтактнаяИнформацияСлужебный.УстановитьУлицуАдресаПоКоду(XDTOАдрес, ДанныеИндекса.Код); + + ЗначениеРеквизитовПоКонтактнойИнформации(Контекст, XDTOКонтактнаяИнфо); + + ЗаполнитьПредставлениеАдреса(Контекст); КонецПроцедуры &НаКлиенте @@ -346,7 +385,7 @@ Процедура НаселенныйПунктНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - // Если пришли впрямую после редактирования, то сбрасываем и переформируем адрес + // Если пришли впрямую после редактирования, то сбрасываем адрес Если Элемент.ТекстРедактирования<>НаселенныйПункт Тогда Модифицированность = Истина; НаселенныйПункт = Элемент.ТекстРедактирования; @@ -421,42 +460,12 @@ &НаКлиенте Процедура НаселенныйПунктАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - Если ЭтоПлатформа83 Тогда - ДанныеВыбора = Новый СписокЗначений; - - Если Ожидание = 0 Тогда - // Формирование списка быстрого выбора, стандартную обработку не надо трогать - Возврат; - КонецЕсли; - - Элементы.НаселенныйПункт.ЦветФона = АвтоЦвет; - Если СтрДлина(Текст) < 3 Тогда - // Нет вариантов, список пуст, стандартную обработку не надо трогать - ВизуализироватьКорректностьВыбора(); - Возврат; - КонецЕсли; - - АнализКлассификатора = РезультатыАвтоПодбораНаселенногоПункта(Текст, СкрыватьНеактуальныеАдреса, Истина); - ДанныеВыбора = АнализКлассификатора.ДанныеВыбора; - - // Стандартную обработку отключаем, только если есть наши варианты - СтандартнаяОбработка = ДанныеВыбора.Количество() = 0; - Возврат; - КонецЕсли; - - // Совместимость - -#Если Не ВебКлиент Тогда Если Ожидание=0 Тогда // Формирование списка быстрого выбора - Если ПустаяСтрока(Текст) Тогда - ДанныеВыбора = Новый СписокЗначений; - КонецЕсли; + ДанныеВыбора = Новый СписокЗначений; Возврат; КонецЕсли; -#КонецЕсли - + Элементы.НаселенныйПункт.ЦветФона = АвтоЦвет; СтандартнаяОбработка = Ложь; @@ -465,13 +474,7 @@ Возврат; КонецЕсли; -#Если ВебКлиент Тогда - ПредупреждатьОНеактуальных = Ложь; -#Иначе - ПредупреждатьОНеактуальных = Истина; -#КонецЕсли - - АнализКлассификатора = РезультатыАвтоПодбораНаселенногоПункта(Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных); + АнализКлассификатора = РезультатыАвтоПодбораНаселенногоПункта(Текст, СкрыватьНеактуальныеАдреса, Истина); ДанныеВыбора = АнализКлассификатора.ДанныеВыбора; КонецПроцедуры @@ -530,6 +533,7 @@ ПараметрыФормы = Новый Структура("СкрыватьНеактуальныеАдреса, КодКлассификатораНаселенногоПункта, Улица, Заголовок", СкрыватьНеактуальныеАдреса, -1, Улица, НаселенныйПункт + " (не найден)"); КонецЕсли; + УправлениеКонтактнойИнформациейКлиент.НачалоВыбораУлицы(Элемент, КодКлассификатораНаселенногоПункта, Улица, ПараметрыФормы); КонецПроцедуры @@ -566,42 +570,12 @@ &НаКлиенте Процедура УлицаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - Если ЭтоПлатформа83 Тогда - ДанныеВыбора = Новый СписокЗначений; - - Если Ожидание=0 Тогда - // Формирование списка быстрого выбора, стандартную обработку не надо трогать - Возврат; - КонецЕсли; - - Элементы.Улица.ЦветФона = АвтоЦвет; - Если СтрДлина(Текст) < 3 Или КодКлассификатораНаселенногоПункта <= 0 Тогда - // Нет вариантов, список пуст, стандартную обработку не надо трогать - ВизуализироватьКорректностьВыбора(); - Возврат; - КонецЕсли; - - АнализКлассификатора = РезультатыАвтоПодбораУлицы(КодКлассификатораНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, Истина); - ДанныеВыбора = АнализКлассификатора.ДанныеВыбора; - - // Стандартную обработку отключаем, только если есть наши варианты - СтандартнаяОбработка = ДанныеВыбора.Количество() = 0; - Возврат; - КонецЕсли; - - // Совместимость - -#Если Не ВебКлиент Тогда Если Ожидание=0 Тогда // Формирование списка быстрого выбора - Если ПустаяСтрока(Текст) Тогда - ДанныеВыбора = Новый СписокЗначений; - КонецЕсли; + ДанныеВыбора = Новый СписокЗначений; Возврат; КонецЕсли; -#КонецЕсли - + Элементы.Улица.ЦветФона = АвтоЦвет; СтандартнаяОбработка = Ложь; @@ -610,13 +584,7 @@ Возврат; КонецЕсли; -#Если ВебКлиент Тогда - ПредупреждатьОНеактуальных = Ложь; -#Иначе - ПредупреждатьОНеактуальных = Истина; -#КонецЕсли - - АнализКлассификатора = РезультатыАвтоПодбораУлицы(КодКлассификатораНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, ПредупреждатьОНеактуальных); + АнализКлассификатора = РезультатыАвтоПодбораУлицы(КодКлассификатораНаселенногоПункта, Текст, СкрыватьНеактуальныеАдреса, Истина); ДанныеВыбора = АнализКлассификатора.ДанныеВыбора; КонецПроцедуры @@ -645,7 +613,7 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария(Элемент.ТекстРедактирования, Комментарий, Модифицированность); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Комментарий") КонецПроцедуры /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -654,6 +622,86 @@ &НаКлиенте Процедура КомандаОК(Команда) + ПодтвердитьИЗакрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтмена(Команда) + Модифицированность = Ложь; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверитьЗаполнениеАдреса(Команда) + + Если РазрешитьВводАдресаВСвободнойФорме Тогда + ПоказатьПредупреждение(, НСтр("ru='Адрес не может быть проверен, так как он введен в свободной форме.'")); + Возврат; + КонецЕсли; + + Контекст = КонтекстФормыКлиент(); + СписокОшибок = СписокОшибокЗаполнения(Контекст); + СообщитьОбОшибкахЗаполнения(СписокОшибок, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьАдрес(Команда) + + ОчиститьАдресКлиент(); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьПоПочтовомуИндексу(Команда) + + Если ЕстьКлассификатор Тогда + ПараметрыФормы = Новый Структура("Индекс, СкрыватьНеактуальныеАдреса", СокрЛП(Индекс), СкрыватьНеактуальныеАдреса); + ОткрытьФорму("Обработка.ВводКонтактнойИнформации.Форма.ПоискАдресаПоПочтовомуИндексу", ПараметрыФормы, Элементы.Индекс); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗагрузитьКлассификатор(Команда) + УправлениеКонтактнойИнформациейКлиент.ЗагрузитьАдресныйКлассификатор(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьОбъект(Команда) + Варианты = НеиспользованныеЭлементыДополнительнойТаблицы(ДополнительныеЗдания, Элементы.ТипСтроения, 1); + Для Каждого ЭлементОбъект Из НеиспользованныеЭлементыДополнительнойТаблицы(ДополнительныеПомещения, Элементы.ТипПомещения, 2) Цикл + ЗаполнитьЗначенияСвойств(Варианты.Добавить(), ЭлементОбъект); + КонецЦикла; + + КоличествоВариантов = Варианты.Количество(); + Если КоличествоВариантов>0 Тогда + ДополнительныеПараметры = Новый Структура("КоличествоВариантов", КоличествоВариантов); + Оповещение = Новый ОписаниеОповещения("ДобавитьОбъектЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПоказатьВыборИзМеню(Оповещение, Варианты, Элементы.ДобавитьОбъект); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВвестиАдресВСвободнойФорме(Команда) + + Если РазрешитьВводАдресаВСвободнойФорме Тогда + ТекстВопроса = НСтр("ru='Изменения, введенные вручную, будут потеряны. + |Продолжить?'"); + Иначе + ТекстВопроса = НСтр("ru='Ввести адрес в свободной форме? + |Адреса, введенные в свободной форме, могут не пройти проверку по адресному классификатору.'"); + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения("ВвестиАдресВСвободнойФормеЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , НСтр("ru='Подтверждение'")); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// + +&НаКлиенте +Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт // При немодифицированности работает как "отмена" Если Модифицированность Тогда @@ -679,6 +727,7 @@ #Иначе ОповеститьОВыборе(Результат); #КонецЕсли + СохранитьСостояниеФормы(); ИначеЕсли Комментарий<>КопияКомментария Тогда // Изменен только комментарий, пробуем вернуть обновленное @@ -694,6 +743,7 @@ #Иначе ОповеститьОВыборе(Результат); #КонецЕсли + СохранитьСостояниеФормы(); Иначе Результат = Неопределено; @@ -701,87 +751,52 @@ Если (МодальныйРежим Или ЗакрыватьПриВыборе) И Открыта() Тогда СброситьМодифицированностьПриВыборе(); + СохранитьСостояниеФормы(); Закрыть(Результат); КонецЕсли; + КонецПроцедуры &НаКлиенте -Процедура ПроверитьЗаполнениеАдреса(Команда) - - Если РазрешитьВводАдресаВСвободнойФорме Тогда - Предупреждение(НСтр("ru='Адрес не может быть проверен, так как он введен в свободной форме.'")); +Процедура СохранитьСостояниеФормы() + УстановитьКлючИспользованияФормы(); + СохраняемыеВНастройкахДанныеМодифицированы = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьОбъектЗавершение(Знач ВыбранныйЭлемент, Знач ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент=Неопределено Тогда + // Отказ от выбора Возврат; КонецЕсли; - - Контекст = КонтекстФормыКлиент(); - СписокОшибок = СписокОшибокЗаполнения(Контекст); - СообщитьОбОшибкахЗаполнения(СписокОшибок, Истина); -КонецПроцедуры - -&НаКлиенте -Процедура ОчиститьАдрес(Команда) - ОчиститьАдресКлиент(); -КонецПроцедуры - -&НаКлиенте -Процедура ЗагрузитьКлассификатор(Команда) - УправлениеКонтактнойИнформациейКлиент.ЗагрузитьАдресныйКлассификатор(); -КонецПроцедуры - -&НаКлиенте -Процедура ДобавитьОбъект(Команда) - Варианты = НеиспользованныеЭлементыДополнительнойТаблицы(ДополнительныеЗдания, Элементы.ТипСтроения, 1); - Для Каждого ЭлементОбъект Из НеиспользованныеЭлементыДополнительнойТаблицы(ДополнительныеПомещения, Элементы.ТипПомещения, 2) Цикл - ЗаполнитьЗначенияСвойств(Варианты.Добавить(), ЭлементОбъект); - КонецЦикла; - КоличествоВариантов = Варианты.Количество(); - Если КоличествоВариантов>0 Тогда - Выбрано = ВыбратьИзМеню(Варианты); + Если ВыбранныйЭлемент.Значение=1 Тогда + Строка = ДополнительныеЗдания.Добавить(); + + Строка.Тип = ВыбранныйЭлемент.Представление; + Строка.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); + ИмяТекущего = ОтрисоватьДополнительныеЗдания(); Иначе - Выбрано = Неопределено; + Строка = ДополнительныеПомещения.Добавить(); + + Строка.Тип = ВыбранныйЭлемент.Представление; + Строка.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); + ИмяТекущего = ОтрисоватьДополнительныеПомещения(); КонецЕсли; - Если Выбрано<>Неопределено Тогда - Если Выбрано.Значение=1 Тогда - Строка = ДополнительныеЗдания.Добавить(); - - Строка.Тип = Выбрано.Представление; - Строка.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); - ИмяТекущего = ОтрисоватьДополнительныеЗдания(); - Иначе - Строка = ДополнительныеПомещения.Добавить(); - - Строка.Тип = Выбрано.Представление; - Строка.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(Строка.Тип); - ИмяТекущего = ОтрисоватьДополнительныеПомещения(); - КонецЕсли; - - // Запрещаем добавлять больше чем есть вариантов - Элементы.ДобавитьОбъект.Доступность = КоличествоВариантов>1; - - Если ИмяТекущего<>Неопределено Тогда - ТекущийЭлемент = Элементы[ИмяТекущего]; - КонецЕсли; - - Модифицированность = Истина; + // Запрещаем добавлять больше чем есть вариантов + Элементы.ДобавитьОбъект.Доступность = ДополнительныеПараметры.КоличествоВариантов>1; + + Если ИмяТекущего<>Неопределено Тогда + ТекущийЭлемент = Элементы[ИмяТекущего]; КонецЕсли; + Модифицированность = Истина; КонецПроцедуры &НаКлиенте -Процедура ВвестиАдресВСвободнойФорме(Команда) - - Если РазрешитьВводАдресаВСвободнойФорме Тогда - ТекстВопроса = НСтр("ru='Изменения, введенные вручную, будут потеряны. - |Продолжить?'"); - Иначе - ТекстВопроса = НСтр("ru='Ввести адрес в свободной форме? - |Адреса, введенные в свободной форме, могут не пройти проверку по адресному классификатору.'"); - КонецЕсли; - - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , НСтр("ru='Подтверждение'")); - Если Ответ<>КодВозвратаДиалога.Да Тогда +Процедура ВвестиАдресВСвободнойФормеЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса<>КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; @@ -791,20 +806,6 @@ Модифицированность = Истина; КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// - -&НаКлиенте -Функция МодифицированностьПриВыборе() - Возврат Модифицированность Или Комментарий<>КопияКомментария; -КонецФункции - -&НаКлиенте -Функция ВыбраноДействиеВыбора() - Возврат Не (Модифицированность Или Комментарий<>КопияКомментария); -КонецФункции - &НаКлиенте Процедура СброситьМодифицированностьПриВыборе() Модифицированность = Ложь; @@ -841,9 +842,6 @@ XDTOИнформация.Состав, Контекст.ВидКонтактнойИнформации); - // Подавляем перенос строк в возвращаемом отдельно представлении. - Результат.ДанныеВыбора.Представление = СокрЛП(СтрЗаменить(Результат.ДанныеВыбора.Представление, Символы.ПС, " ")); - Возврат Результат; КонецФункции @@ -965,11 +963,11 @@ &НаСервере Процедура УстановитьСписокВыбораЭлемента(ЭлементВид, ЭлементЗначение, Данные) - ЭлементЗначение.КнопкаСпискаВыбора = Данные.МожноПодбиратьЗначения; + ЭлементЗначение.КнопкаВыпадающегоСписка = Данные.МожноПодбиратьЗначения; СписокТипов = Данные.ВариантыТипа; - ЭлементВид.КнопкаВыбора = СписокТипов.Количество()>0; - Если ЭлементВид.КнопкаВыбора Тогда + ЭлементВид.КнопкаВыпадающегоСписка = СписокТипов.Количество()>0; + Если ЭлементВид.КнопкаВыпадающегоСписка Тогда ЭлементВид.СписокВыбора.ЗагрузитьЗначения(СписокТипов); КонецЕсли; @@ -1092,10 +1090,6 @@ ДанныеАдреса.Состав.Адрес_по_документу = ""; КонецЕсли; КонецЕсли; - - Если Контекст.РазрешитьВводАдресаВСвободнойФорме Тогда - Контекст.ПредставлениеАдреса = ДанныеАдреса.Состав.Адрес_по_документу; - КонецЕсли; Иначе Контекст.ПредставлениеИностранногоАдреса = Строка(ДанныеАдреса.Состав); КонецЕсли; @@ -1412,8 +1406,8 @@ Добавлять.Добавить(Новый РеквизитФормы(НовыйЭлемент.Имя, Новый ОписаниеТипов("Строка"))); ИзменитьРеквизиты(Добавлять); - ЭтаФорма[НовыйТип.Имя] = Строка.Тип; - ЭтаФорма[НовыйЭлемент.Имя] = Строка.Значение; + ЭтотОбъект[НовыйТип.Имя] = Строка.Тип; + ЭтотОбъект[НовыйЭлемент.Имя] = Строка.Значение; НовыйТип.ПутьКДанным = НовыйТип.Имя; НовыйЭлемент.ПутьКДанным = НовыйЭлемент.Имя; @@ -1426,7 +1420,7 @@ Процедура Подключаемый_ТипСтроенияПриИзменении(Элемент) НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("ТипСтроения")); СтрокаЗданий = ДополнительныеЗдания.Получить(НомерСтроки); - СтрокаЗданий.Тип = ЭтаФорма[Элемент.Имя]; + СтрокаЗданий.Тип = ЭтотОбъект[Элемент.Имя]; СтрокаЗданий.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(СтрокаЗданий.Тип); Контекст = КонтекстФормыКлиент(); @@ -1441,7 +1435,7 @@ Процедура Подключаемый_СтроениеПриИзменении(Элемент) НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("Строение")); СтрокаЗданий = ДополнительныеЗдания.Получить(НомерСтроки); - СтрокаЗданий.Значение = ЭтаФорма[Элемент.Имя]; + СтрокаЗданий.Значение = ЭтотОбъект[Элемент.Имя]; Контекст = КонтекстФормыКлиент(); ОбновитьИндексИПредставление(Контекст); @@ -1504,8 +1498,8 @@ Добавлять.Добавить(Новый РеквизитФормы(НовыйЭлемент.Имя, Новый ОписаниеТипов("Строка"))); ИзменитьРеквизиты(Добавлять); - ЭтаФорма[НовыйТип.Имя] = Строка.Тип; - ЭтаФорма[НовыйЭлемент.Имя] = Строка.Значение; + ЭтотОбъект[НовыйТип.Имя] = Строка.Тип; + ЭтотОбъект[НовыйЭлемент.Имя] = Строка.Значение; НовыйТип.ПутьКДанным = НовыйТип.Имя; НовыйЭлемент.ПутьКДанным = НовыйЭлемент.Имя; @@ -1518,7 +1512,7 @@ Процедура Подключаемый_ТипПомещенияПриИзменении(Элемент) НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("ТипПомещения")); СтрокаПомещений = ДополнительныеПомещения.Получить(НомерСтроки); - СтрокаПомещений.Тип = ЭтаФорма[Элемент.Имя]; + СтрокаПомещений.Тип = ЭтотОбъект[Элемент.Имя]; СтрокаПомещений.ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(СтрокаПомещений.Тип); Контекст = КонтекстФормыКлиент(); @@ -1533,7 +1527,7 @@ Процедура Подключаемый_ПомещениеПриИзменении(Элемент) НомерСтроки = Сред(Элемент.Имя, 1 + СтрДлина("Помещение")); СтрокаЗданий = ДополнительныеПомещения.Получить(НомерСтроки); - СтрокаЗданий.Значение = ЭтаФорма[Элемент.Имя]; + СтрокаЗданий.Значение = ЭтотОбъект[Элемент.Имя]; Контекст = КонтекстФормыКлиент(); ЗаполнитьПредставлениеАдреса(Контекст); @@ -1549,7 +1543,7 @@ ОчиститьСообщения(); Если СписокОшибок.Количество()=0 И ПредупреждатьОбОтсутствии Тогда - Предупреждение(НСтр("ru='Адрес введен корректно.'")); + ПоказатьПредупреждение(, НСтр("ru='Адрес введен корректно.'")); Возврат; КонецЕсли; @@ -1562,53 +1556,66 @@ &НаКлиенте Функция ПутьКДаннымФормыПоПутиXPath(ПутьXPath) - Если ПутьXPath="СубъектРФ" Тогда + Если ПутьXPath = "СубъектРФ" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath="Округ" Тогда + ИначеЕсли ПутьXPath = "Округ" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath=КонтактнаяИнформацияКлиентСерверПовтИсп.XPathРайона() Тогда + ИначеЕсли ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathРайона() Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath="Город" Тогда + ИначеЕсли ПутьXPath = "Город" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath="ВнутригРайон" Тогда + ИначеЕсли ПутьXPath = "ВнутригРайон" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath="НаселПункт" Тогда + ИначеЕсли ПутьXPath = "НаселПункт" Тогда Возврат "НаселенныйПункт"; - ИначеЕсли ПутьXPath="Улица" Тогда + ИначеЕсли ПутьXPath = "Улица" Тогда Возврат "Улица"; - ИначеЕсли ПутьXPath=КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса() Тогда + ИначеЕсли ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathПочтовогоИндекса() Тогда Возврат "Индекс"; - ИначеЕсли ПутьXPath=КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ТипДома) Тогда - Возврат "Дом"; - - ИначеЕсли ПутьXPath=КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ТипСтроения) Тогда - Возврат "Строение"; - - ИначеЕсли ПутьXPath=КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ТипПомещения) Тогда - Возврат "Помещение"; - - Иначе - // Дополнительно добавленные - Фильтр = Новый Структура("ПутьXPath", ПутьXPath); - Строки = ДополнительныеЗдания.НайтиСтроки(Фильтр); - Если Строки.Количество()>0 Тогда - Возврат "Строение" + Формат(ДополнительныеЗдания.Индекс(Строки[0]), "ЧН=; ЧГ="); - КонецЕсли; - - Строки = ДополнительныеПомещения.НайтиСтроки(Фильтр); - Если Строки.Количество()>0 Тогда - Возврат "Помещение" + Формат(ДополнительныеПомещения.Индекс(Строки[0]), "ЧН=; ЧГ="); - КонецЕсли; КонецЕсли; + // Варианты дома + Для Каждого ЭлементСписка Из Элементы.ТипДома.СписокВыбора Цикл + Если ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Возврат "Дом"; + КонецЕсли; + КонецЦикла; + + // Варианты корпуса + Для Каждого ЭлементСписка Из Элементы.ТипСтроения.СписокВыбора Цикл + Если ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Возврат "Строение"; + КонецЕсли; + КонецЦикла; + + // Варианты помещения + Для Каждого ЭлементСписка Из Элементы.ТипПомещения.СписокВыбора Цикл + Если ПутьXPath = КонтактнаяИнформацияКлиентСерверПовтИсп.XPathНомераДополнительногоОбъектаАдресации(ЭлементСписка.Значение) Тогда + Возврат "Помещение"; + КонецЕсли; + КонецЦикла; + + // Дополнительно добавленные + Фильтр = Новый Структура("ПутьXPath", ПутьXPath); + Строки = ДополнительныеЗдания.НайтиСтроки(Фильтр); + Если Строки.Количество()>0 Тогда + Возврат "Строение" + Формат(ДополнительныеЗдания.Индекс(Строки[0]), "ЧН=; ЧГ="); + КонецЕсли; + + Строки = ДополнительныеПомещения.НайтиСтроки(Фильтр); + Если Строки.Количество()>0 Тогда + Возврат "Помещение" + Формат(ДополнительныеПомещения.Индекс(Строки[0]), "ЧН=; ЧГ="); + КонецЕсли; + + // Не нашли Возврат ""; КонецФункции @@ -1671,7 +1678,7 @@ &НаКлиенте Функция НеиспользованныеЭлементыДополнительнойТаблицы(ТаблицаДанных, ЭлементИсточник, ЗначениеМаркера) Использованные = Новый Соответствие; - Использованные.Вставить(ЭтаФорма[ЭлементИсточник.Имя], Истина); + Использованные.Вставить(ЭтотОбъект[ЭлементИсточник.Имя], Истина); Для Каждого Строка Из ТаблицаДанных Цикл Использованные.Вставить(Строка.Тип, Истина); КонецЦикла; @@ -1752,11 +1759,12 @@ СписокРеквизитов = " |ВидКонтактнойИнформации, |Страна, КодСтраны, СтранаРоссия, СкрыватьНеактуальныеАдреса, - |Индекс, ПредставлениеАдреса, ПредставлениеИностранногоАдреса, Комментарий, + |Индекс, ПредставлениеАдреса, ПредставлениеИностранногоАдреса, Комментарий, КопияКомментария, |НаселенныйПункт, КодКлассификатораНаселенногоПункта, НаселенныйПунктДетально, НаселенныйПунктНайденТочно, |Улица, КодКлассификатораУлицы, УлицаНайденаТочно, |ТипДома, Дом, ДомНайденТочно, ТипСтроения, Строение, ТипПомещения, Помещение, - |РазрешитьВводАдресаВСвободнойФорме, ПредставлениеАдресаИзменено + |РазрешитьВводАдресаВСвободнойФорме, ПредставлениеАдресаИзменено, + |Модифицированность |"; СписокКоллекций = "ДополнительныеЗдания, ДополнительныеПомещения"; @@ -1764,12 +1772,12 @@ Если НовыеДанные=Неопределено Тогда // Читаем Результат = Новый Структура(СписокРеквизитов + "," + СписокКоллекций); - ЗаполнитьЗначенияСвойств(Результат, ЭтаФорма, СписокРеквизитов + "," + СписокКоллекций); + ЗаполнитьЗначенияСвойств(Результат, ЭтотОбъект, СписокРеквизитов + "," + СписокКоллекций); Возврат Результат; КонецЕсли; - ЗаполнитьЗначенияСвойств(ЭтаФорма, НовыеДанные, СписокРеквизитов, СписокКоллекций); - ЗаполнитьЗначенияКоллекций(ЭтаФорма, НовыеДанные, СписокКоллекций); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НовыеДанные, СписокРеквизитов, СписокКоллекций); + ЗаполнитьЗначенияКоллекций(ЭтотОбъект, НовыеДанные, СписокКоллекций); Возврат НовыеДанные; КонецФункции @@ -1840,7 +1848,7 @@ Элементы.ПредставлениеАдреса.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; Элементы.ПредставлениеАдреса.Заголовок = ""; - Элементы.ГруппаПредставления.Отображение = ОбщегоНазначенияКлиентСервер.ОтображениеОбычнойГруппыОтступ(); + Элементы.ГруппаПредставления.Отображение = ОтображениеОбычнойГруппы.ОбычноеВыделение; Элементы.СтранаАдреса.Отображение = Элементы.ГруппаПредставления.Отображение; ТекущийЭлемент = Элементы.НаселенныйПункт; @@ -1903,10 +1911,10 @@ ТекущееПредставление = ПредставлениеАдреса; ТекущаяСтрана = Страна; - ОчиститьАдресСервер(ЭтаФорма); + ОчиститьАдресСервер(ЭтотОбъект); // Возможно будет отключен свободного ввода - ЗначениеРеквизитовПоКонтактнойИнформации(ЭтаФорма, XDTOКонтактная); + ЗначениеРеквизитовПоКонтактнойИнформации(ЭтотОбъект, XDTOКонтактная); ПредставлениеАдреса = ТекущееПредставление; Страна = ТекущаяСтрана; diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form index 369777bf9..b5f56e2af 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Form.form @@ -31,7 +31,7 @@ КодСтраныПриИзменении - КодСтраныРасширеннаяПодсказка + КодСтраныExtendedTooltip 41 Label true @@ -83,8 +83,8 @@ КодГородаПриИзменении - КодГородаРасширеннаяПодсказка - 43 + КодГородаExtendedTooltip + 42 Label true true @@ -135,8 +135,8 @@ НомерТелефонаПриИзменении - НомерТелефонаРасширеннаяПодсказка - 45 + НомерТелефонаExtendedTooltip + 43 Label true true @@ -187,8 +187,8 @@ ДобавочныйПриИзменении - ДобавочныйРасширеннаяПодсказка - 47 + ДобавочныйExtendedTooltip + 44 Label true true @@ -224,7 +224,7 @@ true - ГруппаТелефонаРасширеннаяПодсказка + ГруппаТелефонаExtendedTooltip 40 Label true @@ -255,8 +255,8 @@ None - ПредставлениеРасширеннаяПодсказка - 49 + ПредставлениеExtendedTooltip + 45 Label true true @@ -306,8 +306,8 @@ Дополнительный комментарий, не попадающий в представление - КомментарийРасширеннаяПодсказка - 52 + КомментарийExtendedTooltip + 47 Label true true @@ -356,8 +356,8 @@ Группа комментария - ГруппаКомментарияРасширеннаяПодсказка - 51 + ГруппаКомментарияExtendedTooltip + 46 Label true true @@ -390,7 +390,7 @@ Основной номер - ОсновнойНомерРасширеннаяПодсказка + ОсновнойНомерExtendedTooltip 39 Label true @@ -421,8 +421,8 @@ true - КомандаОКРасширеннаяПодсказка - 55 + КомандаОКExtendedTooltip + 49 Label true true @@ -447,8 +447,8 @@ true - ОтменаРасширеннаяПодсказка - 56 + ОтменаExtendedTooltip + 50 Label true true @@ -456,7 +456,7 @@ Left - Form.StandardCommand.Cancel + Form.Command.КомандаОтмена Normal Auto true @@ -473,8 +473,8 @@ true - СправкаРасширеннаяПодсказка - 57 + СправкаExtendedTooltip + 51 Label true true @@ -502,8 +502,8 @@ true - ОчиститьТелефонРасширеннаяПодсказка - 59 + ОчиститьТелефонExtendedTooltip + 53 Label true true @@ -531,8 +531,8 @@ true - ИзменитьФормуРасширеннаяПодсказка - 61 + ИзменитьФормуExtendedTooltip + 55 Label true true @@ -558,8 +558,8 @@ true - СправкаФормыРасширеннаяПодсказка - 62 + СправкаФормыExtendedTooltip + 56 Label true true @@ -582,8 +582,8 @@ true - Группа5РасширеннаяПодсказка - 60 + Группа5ExtendedTooltip + 54 Label true true @@ -607,8 +607,8 @@ Все действия формы - ФормаВсеДействияРасширеннаяПодсказка - 58 + ФормаВсеДействияExtendedTooltip + 52 Label true true @@ -639,8 +639,8 @@ Панель команд - ПанельКомандРасширеннаяПодсказка - 54 + ПанельКомандExtendedTooltip + 48 Label true true @@ -961,6 +961,28 @@ Auto Auto + + КомандаОтмена + + <key>ru</key> + <value>Отмена</value> + + 3 + + ru + Команда отмена + + + true + + + + КомандаОтмена + + + Auto + Auto + ВидКонтактнойИнформации diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl index e885d3725..21e496d78 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ВводТелефона/Module.bsl @@ -53,7 +53,8 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ЗапроситьПодтверждениеЗакрытияФормы(Отказ, Модифицированность, ВыбраноДействиеВыбора()); + Оповещение = Новый ОписаниеОповещения("ПодтвердитьИЗакрыть", ЭтотОбъект); + ОбщегоНазначенияКлиент.ПоказатьПодтверждениеЗакрытияФормы(Оповещение, Отказ); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -82,8 +83,7 @@ &НаКлиенте Процедура КомментарийНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - ОбщегоНазначенияКлиент.ОткрытьФормуРедактированияКомментария( - Элемент.ТекстРедактирования, Комментарий, Модифицированность); + ОбщегоНазначенияКлиент.ПоказатьФормуРедактированияКомментария(Элемент.ТекстРедактирования, ЭтотОбъект, "Комментарий"); КонецПроцедуры /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -92,13 +92,34 @@ &НаКлиенте Процедура КомандаОК(Команда) + ПодтвердитьИЗакрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура КомандаОтмена(Команда) + Модифицированность = Ложь; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьТелефон(Команда) + ОчиститьТелефонСервер(); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// + +&НаКлиенте +Процедура ПодтвердитьИЗакрыть(Результат = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + // При немодифицированности работает "отмена" Если Модифицированность Тогда // Изменено значение адреса ЕстьОшибкиЗаполнения = Ложь; - // Смотрим, надо ли проверять на корректность. + // Смотрим, надо ли проверять на корректность. Если ПроверятьКорректность Тогда СписокОшибок = ОшибкиЗаполненияТелефонаСервер(); ЕстьОшибкиЗаполнения = СписокОшибок.Количество()>0; @@ -133,20 +154,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ОчиститьТелефон(Команда) - ОчиститьТелефонСервер(); -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// - -&НаКлиенте -Функция ВыбраноДействиеВыбора() - Возврат Не (Модифицированность Или Комментарий<>КопияКомментария); -КонецФункции - &НаКлиенте Процедура СброситьМодифицированностьПриВыборе() Модифицированность = Ложь; @@ -259,7 +266,7 @@ Процедура СообщитьОбОшибкахЗаполнения(СписокОшибок) Если СписокОшибок.Количество()=0 Тогда - Предупреждение(НСтр("ru='Телефон введен корректно.'")); + ПоказатьПредупреждение(, НСтр("ru='Телефон введен корректно.'")); Возврат; КонецЕсли; @@ -289,4 +296,3 @@ ЗаполнитьПредставлениеТелефона(); Модифицированность = Истина; КонецПроцедуры - diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form index 9db9efa92..59fb19efa 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Form.form @@ -18,7 +18,7 @@ true - ФормаКомандаОКРасширеннаяПодсказка + ФормаКомандаОКExtendedTooltip 4 Label true @@ -44,7 +44,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 5 Label true @@ -70,7 +70,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 6 Label true @@ -184,23 +184,6 @@ true - - ЭтоПлатформа83 - - <key>ru</key> - <value>Это платформа83</value> - - 6 - - Boolean - - - true - - - true - - КомандаОК diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl index 599d200c8..564f8ac6f 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/НаселенныйПунктАдреса/Module.bsl @@ -23,8 +23,6 @@ Возврат; КонецЕсли; - ЭтоПлатформа83 = ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(); - МожноЗагружатьКлассификатор = КонтактнаяИнформацияСлужебный.ЕстьВозможностьИзмененияАдресногоКлассификатора(); ПрефиксИмениЧастиАдреса = "Часть"; @@ -112,7 +110,7 @@ Элемент.УстановитьДействие("Автоподбор", "Подключаемый_ПолеАвтоподбор"); Элемент.УстановитьДействие("ОкончаниеВводаТекста", "Подключаемый_ПолеОкончаниеВводаТекста"); - ЭтаФорма[Элемент.Имя] = Часть.Значение; + ЭтотОбъект[Элемент.Имя] = Часть.Значение; КонецЦикла; КонецПроцедуры @@ -123,12 +121,10 @@ Функция ИмяЧастиАдресаЭлемента(Элемент) Возврат Сред(Элемент.Имя, 1 + СтрДлина(ПрефиксИмениЧастиАдреса)); КонецФункции - &НаКлиенте Функция ЧастьАдресаЭлемента(Элемент) Возврат ЧастиАдреса[ИмяЧастиАдресаЭлемента(Элемент)]; КонецФункции - &НаКлиенте Функция УстановитьЗначениеЧастиАдреса(Элемент, ВыбранноеЗначение) ЧастьАдреса = ЧастьАдресаЭлемента(Элемент); @@ -149,7 +145,7 @@ КонецЕсли; // Ставим в форму, автоматически сгенерированные имена элементов и реквизитов совпадают - ЭтаФорма[Элемент.Имя] = ЧастьАдреса.Значение; + ЭтотОбъект[Элемент.Имя] = ЧастьАдреса.Значение; Возврат ЧастьАдреса.Значение; КонецФункции @@ -160,7 +156,6 @@ Процедура Подключаемый_ПолеПриИзменении(Элемент) Модифицированность = Истина; КонецПроцедуры - &НаКлиенте Процедура Подключаемый_ПолеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; @@ -168,12 +163,10 @@ УправлениеКонтактнойИнформациейКлиент.НачалоВыбораЭлементаАдреса( Элемент, ИмяЧастиАдресаЭлемента(Элемент), ЧастиАдреса, ПараметрыФормы); КонецПроцедуры - &НаКлиенте Процедура Подключаемый_Очистка(Элемент, СтандартнаяОбработка) Модифицированность = Истина; КонецПроцедуры - &НаКлиенте Процедура Подключаемый_ПолеОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Перем МожноЗагружатьРегион; @@ -199,33 +192,8 @@ СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры - &НаКлиенте Процедура Подключаемый_ПолеАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка) - - Если ЭтоПлатформа83 Тогда - ДанныеВыбора = Новый СписокЗначений; - - Если Ожидание=0 Тогда - // Формирование списка быстрого выбора, стандартную обработку не надо трогать - Возврат; - КонецЕсли; - - Если СтрДлина(Текст) < 3 Тогда - // Нет вариантов, список пуст, стандартную обработку не надо трогать - Возврат; - КонецЕсли; - - ДанныеВыбора = СписокАвтоПодбораЭлементаАдреса(Текст, ИмяЧастиАдресаЭлемента(Элемент), ЧастиАдреса, Истина); - - // Стандартную обработку отключаем, только если есть наши варианты - СтандартнаяОбработка = ДанныеВыбора.Количество() = 0; - Возврат; - КонецЕсли; - - // Совместимость - -#Если Не ВебКлиент Тогда Если Ожидание=0 Тогда // Формирование списка быстрого выбора Если ПустаяСтрока(Текст) Тогда @@ -233,23 +201,14 @@ КонецЕсли; Возврат; КонецЕсли; -#КонецЕсли - + СтандартнаяОбработка = Ложь; Если СтрДлина(Текст)<3 Тогда Возврат; КонецЕсли; -#Если ВебКлиент Тогда - ПредупреждатьОНеактуальных = Ложь; -#Иначе - ПредупреждатьОНеактуальных = Истина; -#КонецЕсли - - ДанныеВыбора = СписокАвтоПодбораЭлементаАдреса(Текст, ИмяЧастиАдресаЭлемента(Элемент), ЧастиАдреса, ПредупреждатьОНеактуальных); - + ДанныеВыбора = СписокАвтоПодбораЭлементаАдреса(Текст, ИмяЧастиАдресаЭлемента(Элемент), ЧастиАдреса, Истина); КонецПроцедуры - &НаКлиенте Процедура Подключаемый_ПолеОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) Модифицированность = Истина; @@ -271,13 +230,11 @@ Функция КодНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса) Возврат КонтактнаяИнформацияСлужебный.КодНаселенногоПунктаПоЧастямАдреса(ЧастиАдреса); КонецФункции - &НаСервереБезКонтекста Функция СписокАвтоПодбораЭлементаАдреса(Текст, КодЧастиАдреса, Знач ЧастиАдреса, ПредупреждатьОНеактуальных) Возврат КонтактнаяИнформацияСлужебный.СписокАвтоПодбораЭлементаАдреса( Текст, КодЧастиАдреса, ЧастиАдреса, ПредупреждатьОНеактуальных); КонецФункции - &НаСервереБезКонтекста Функция СписокВариантовЭлементаАдресаПоТексту(Текст, КодЧастиАдреса, ЧастиАдреса, ВыбиратьСтрок) Возврат КонтактнаяИнформацияСлужебный.СписокВариантовЭлементаАдресаПоТексту( diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Form.form b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Form.form new file mode 100644 index 000000000..c21b5b48b --- /dev/null +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Form.form @@ -0,0 +1,827 @@ +<?xml version="1.0" encoding="UTF-8"?> +<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:form="http://g5.1c.ru/v8/dt/form"> + <title> + <key>ru</key> + <value>Выберите улицу, населенный пункт</value> + + + ОбщаяЧастьПредставления + 3 + true + true + + true + + + ОбщаяЧастьПредставления + + None + + ОбщаяЧастьПредставленияРасширеннаяПодсказка + 5 + Label + true + true + + Left + + + + ОбщаяЧастьПредставленияКонтекстноеМеню + 4 + true + + LabelField + Enter + true + Left + true + + true + true + + System.DefaultGUIFont + true + false + false + false + + + + + ВариантыАдреса + 8 + true + true + + true + + + ВариантыАдреса + + None + Change + + ВариантыАдресаГруппа + 21 + + ВариантыАдресаАктуальность + 18 + + <key>ru</key> + <value>Актуальность</value> + + true + true + + true + + + ВариантыАдреса.Неактуален + + None + + ВариантыАдресаАктуальностьРасширеннаяПодсказка + 20 + Label + true + true + + Left + + + + ВариантыАдресаАктуальностьКонтекстноеМеню + 19 + true + + PictureField + true + Auto + true + Left + true + + true + true + true + true + + CommonPicture.КонтактнаяИнформацияНеактуально + + + + 1 + + + + + ВариантыАдресаПредставление + 15 + true + true + + true + + + ВариантыАдреса.Представление + + + ВариантыАдресаПредставлениеРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + ВариантыАдресаПредставлениеКонтекстноеМеню + 16 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Варианты адреса группа</value> + + + ru + Варианты адреса группа + + + ВариантыАдресаГруппаРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + ВариантыАдресаКоманднаяПанель + 10 + + ВариантыАдресаВыбрать + 39 + true + true + + true + + + ВариантыАдресаВыбратьРасширеннаяПодсказка + 40 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.Choose + Auto + true + true + true + UserCmds + Auto + + + ВариантыАдресаГруппаКнопокПоиска + 37 + + ВариантыАдресаНайти + 25 + true + true + + true + + + ВариантыАдресаНайтиРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ВариантыАдресаОтменитьПоиск + 27 + true + true + + true + + + ВариантыАдресаОтменитьПоискРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ВариантыАдресаГруппаКнопокПоискаРасширеннаяПодсказка + 38 + Label + true + true + + Left + + + + + + ВариантыАдресаОбновить + 31 + true + true + + true + + + ВариантыАдресаОбновитьРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.Command.Обновить + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВариантыАдресаВывестиСписок + 33 + true + true + + true + + + ВариантыАдресаВывестиСписокРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВариантыАдресаИзменитьФорму + 35 + true + true + + true + + + ВариантыАдресаИзменитьФормуРасширеннаяПодсказка + 36 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ВариантыАдресаСправка + 29 + true + true + + true + + + ВариантыАдресаСправкаРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + Left + + + ValueChoice + ВариантыАдресаВыборЗначения + + + Selection + ВариантыАдресаВыбор + + + ВариантыАдресаСтрокаПоиска + 52 + + ВариантыАдресаСтрокаПоискаРасширеннаяПодсказка + 54 + Label + true + true + + Left + + + + ВариантыАдресаСтрокаПоискаКонтекстноеМеню + 53 + true + + ВариантыАдреса + + true + + + + ВариантыАдресаСостояниеПросмотра + 55 + + ВариантыАдресаСостояниеПросмотраРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + + ВариантыАдресаСостояниеПросмотраКонтекстноеМеню + 56 + true + + ViewStatusAddition + ВариантыАдреса + + true + + + + ВариантыАдресаУправлениеПоиском + 58 + + ВариантыАдресаУправлениеПоискомРасширеннаяПодсказка + 60 + Label + true + true + + Left + + + + ВариантыАдресаУправлениеПоискомКонтекстноеМеню + 59 + true + + SearchControlAddition + ВариантыАдреса + + true + + + + ВариантыАдресаРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ВариантыАдресаКонтекстноеМеню + 9 + + ВариантыАдресаКонтекстноеМенюВыбрать + 45 + true + true + + true + + + ВариантыАдресаКонтекстноеМенюВыбратьРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.Choose + Normal + Auto + true + true + UserCmds + Auto + + + ВариантыАдресаКонтекстноеМенюГруппаНайти + 49 + + ВариантыАдресаКонтекстноеМенюНайти + 41 + true + true + + true + + + ВариантыАдресаКонтекстноеМенюНайтиРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.Find + Normal + Auto + true + true + UserCmds + Auto + + + ВариантыАдресаКонтекстноеМенюОтменитьПоиск + 43 + true + true + + true + + + ВариантыАдресаКонтекстноеМенюОтменитьПоискРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.CancelSearch + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ВариантыАдресаКонтекстноеМенюГруппаНайтиРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + + + + ВариантыАдресаКонтекстноеМенюКопироватьВБуферОбмена + 47 + true + true + + true + + + ВариантыАдресаКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + Form.Item.ВариантыАдреса.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + true + true + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + true + Auto + Auto + true + true + true + true + None + None + None + true + + + None + false + + ФормаКоманднаяПанель + -1 + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + 50 + 16 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + String + + + + true + + + true + +
                true
                +
                + + ВариантыАдреса + + <key>ru</key> + <value>Варианты адреса</value> + + 2 + + ValueTable + + + true + + + true + + + Код + + <key>ru</key> + <value>Код</value> + + 1 + + Number + + 21 + + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 2 + + String + + + + true + + + true + + + + Неактуален + + <key>ru</key> + <value>Неактуален</value> + + 3 + + Boolean + + + true + + + true + + + + + ОбщаяЧастьПредставления + + <key>ru</key> + <value>Общая часть представления</value> + + 3 + + String + + + + true + + + true + + + + Индекс + + <key>ru</key> + <value>Индекс</value> + + 4 + + String + + + + true + + + true + + + + Обновить + + <key>ru</key> + <value>Обновить</value> + + 2 + + ru + Обновить + + + true + + F5 + + StdPicture.Refresh + + Auto + Auto + + + Индекс + + String + + + true + + + СкрыватьНеактуальныеАдреса + + Boolean + + + + + + + diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Module.bsl b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Module.bsl new file mode 100644 index 000000000..d7638d517 --- /dev/null +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/Forms/ПоискАдресаПоПочтовомуИндексу/Module.bsl @@ -0,0 +1,101 @@ +// Параметры формы: +// Индекс - Число - Почтовый индекс для поиска вариантов адресов +// СкрыватьНеактуальныеАдреса - Булево - флаг того, что при неактуальные адреса будут скрываться +// +// В качестве значения выбора возвращается: +// При отказе от выбора - неопределено +// При успешном выборе - структура с полями Код, Представление с данными классификатора +// + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Индекс = Параметры.Индекс; + ПараметрыПоиска = Новый Структура("СкрыватьНеактуальные", Параметры.СкрыватьНеактуальныеАдреса); + ДанныеКлассификатора = КонтактнаяИнформацияСлужебный.АдресаКлассификатораПоИндексу(Индекс, ПараметрыПоиска); + + Если ДанныеКлассификатора.Данные.Количество() = 0 Тогда + // Нет данных, функционал выбора не применим + Отказ = Истина; + Возврат; + КонецЕсли; + + ВариантыАдреса.Загрузить(ДанныеКлассификатора.Данные); + + ОбщаяЧастьПредставления = ДанныеКлассификатора.ОбщаяЧастьПредставления; + ОбщаяЧастьПредставления = Индекс + ?(ПустаяСтрока(ОбщаяЧастьПредставления), "", ", ") + ОбщаяЧастьПредставления; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ВариантыАдресаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ПроизвестиВыбор(ВыбраннаяСтрока); +КонецПроцедуры + +&НаКлиенте +Процедура ВариантыАдресаВыборЗначения(Элемент, Значение, СтандартнаяОбработка) + ПроизвестиВыбор(Значение); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПроизвестиВыбор(Знач НомерСтроки) + + Данные = ВариантыАдреса.НайтиПоИдентификатору(НомерСтроки); + Если Данные = Неопределено Тогда + Возврат; + КонецЕсли; + + Если Не Данные.Неактуален Тогда + ПередатьДанныеВыбораВладельцу(Данные); + Возврат; + КонецЕсли; + + Если ПустаяСтрока(ОбщаяЧастьПредставления) Тогда + ТекстВопроса = НСтр("ru = 'Адрес ""%1"" неактуален. + |Продолжить?'"); + Иначе + ТекстВопроса = НСтр("ru = 'Адрес ""%2, %1"" неактуален. + |Продолжить?'"); + КонецЕсли; + + ПредупреждениеНеактуальности = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + ТекстВопроса, Данные.Представление, ОбщаяЧастьПредставления); + + ЗаголовокПредупреждения = НСтр("ru = 'Подтверждение'"); + + Оповещение = Новый ОписаниеОповещения("ПроизвестиВыборЗавершениеВопроса", ЭтотОбъект, Данные); + ПоказатьВопрос(Оповещение, ПредупреждениеНеактуальности, РежимДиалогаВопрос.ДаНет, , ,ЗаголовокПредупреждения); + +КонецПроцедуры + +&НаКлиенте +Процедура ПроизвестиВыборЗавершениеВопроса(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ПередатьДанныеВыбораВладельцу(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередатьДанныеВыбораВладельцу(Знач Данные) + Результат = Новый Структура("Индекс, Код, Представление"); + + ЗаполнитьЗначенияСвойств(Результат, Данные); + Результат.Индекс = Индекс; + + ОповеститьОВыборе(Результат); +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo index a515b1f7d..d6d430deb 100644 --- a/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo +++ b/SSL/src/DataProcessors/ВводКонтактнойИнформации/ВводКонтактнойИнформации.mdo @@ -42,4 +42,13 @@ PersonalComputer MobileDevice + + ПоискАдресаПоПочтовомуИндексу + + ru + Поиск адреса по почтовому индексу + + PersonalComputer + MobileDevice + diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form index 2ec798ae8..57658b709 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Form.form @@ -19,7 +19,7 @@ true - Декорация2РасширеннаяПодсказка + Декорация2ExtendedTooltip 90 Label true @@ -56,7 +56,7 @@ WSПароль - WSПарольРасширеннаяПодсказка + WSПарольExtendedTooltip 92 Label true @@ -99,8 +99,8 @@ true - ЗабылиПарольРасширеннаяПодсказка - 94 + ЗабылиПарольExtendedTooltip + 93 Label true true @@ -123,7 +123,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 91 Label true @@ -154,8 +154,8 @@ true - ВыполнитьОбменРасширеннаяПодсказка - 96 + ВыполнитьОбменExtendedTooltip + 95 Label true true @@ -180,8 +180,8 @@ true - ФормаЗакрыть2РасширеннаяПодсказка - 97 + ФормаЗакрыть2ExtendedTooltip + 96 Label true true @@ -206,8 +206,8 @@ Командная панель закрыть - КоманднаяПанельВыполненияОбменаРасширеннаяПодсказка - 95 + КоманднаяПанельВыполненияОбменаExtendedTooltip + 94 Label true true @@ -234,7 +234,7 @@ Загрузка данных - ЗапросПароляПользователяРасширеннаяПодсказка + ЗапросПароляПользователяExtendedTooltip 89 Label true @@ -265,8 +265,8 @@ true - ДлительнаяОперацияРасширеннаяПодсказка - 99 + ДлительнаяОперацияExtendedTooltip + 98 Label true true @@ -303,8 +303,8 @@ true - СтатусЗагрузкиДанныхРасширеннаяПодсказка - 100 + СтатусЗагрузкиДанныхExtendedTooltip + 99 Label true true @@ -340,8 +340,8 @@ Ожидание синхронизации данных - ОжиданиеСинхронизацииДанныхРасширеннаяПодсказка - 98 + ОжиданиеСинхронизацииДанныхExtendedTooltip + 97 Label true true @@ -376,8 +376,8 @@ true - КартинкаОбменЗавершенУспешноРасширеннаяПодсказка - 104 + КартинкаОбменЗавершенУспешноExtendedTooltip + 103 Label true true @@ -413,8 +413,8 @@ true - СтатусОбменЗавершенУспешноРасширеннаяПодсказка - 105 + СтатусОбменЗавершенУспешноExtendedTooltip + 104 Label true true @@ -450,8 +450,8 @@ Обмен завершен успешно - ОбменЗавершенУспешноРасширеннаяПодсказка - 103 + ОбменЗавершенУспешноExtendedTooltip + 102 Label true true @@ -480,8 +480,8 @@ true - КартинкаОбменЗавершенСОшибкойРасширеннаяПодсказка - 107 + КартинкаОбменЗавершенСОшибкойExtendedTooltip + 106 Label true true @@ -518,8 +518,8 @@ true - СтатусОбменЗавершенСОшибкойРасширеннаяПодсказка - 108 + СтатусОбменЗавершенСОшибкойExtendedTooltip + 107 Label true true @@ -554,8 +554,8 @@ Обмен завершен с ошибкой - ОбменЗавершенСОшибкойРасширеннаяПодсказка - 106 + ОбменЗавершенСОшибкойExtendedTooltip + 105 Label true true @@ -584,8 +584,8 @@ true - КартинкаОбменЗавершенСОшибкой1РасширеннаяПодсказка - 110 + КартинкаОбменЗавершенСОшибкой1ExtendedTooltip + 109 Label true true @@ -624,8 +624,8 @@ true - СтатусОбменЗавершенСОшибкойДляАдминистратораРасширеннаяПодсказка - 112 + СтатусОбменЗавершенСОшибкойДляАдминистратораExtendedTooltip + 111 Label true true @@ -656,8 +656,8 @@ true - ПерейтиВЖурналРегистрацииРасширеннаяПодсказка - 113 + ПерейтиВЖурналРегистрацииExtendedTooltip + 112 Label true true @@ -688,8 +688,8 @@ Статусное сообщение - СтатусноеСообщениеРасширеннаяПодсказка - 111 + СтатусноеСообщениеExtendedTooltip + 110 Label true true @@ -721,8 +721,8 @@ Обмен завершен с ошибкой - ОбменЗавершенСОшибкойДляАдминистратораРасширеннаяПодсказка - 109 + ОбменЗавершенСОшибкойДляАдминистратораExtendedTooltip + 108 Label true true @@ -751,8 +751,8 @@ true - КартинкаОбменЗавершенСОшибкой2РасширеннаяПодсказка - 115 + КартинкаОбменЗавершенСОшибкой2ExtendedTooltip + 114 Label true true @@ -788,8 +788,8 @@ None - СообщениеОбОшибкеПользователюРасширеннаяПодсказка - 116 + СообщениеОбОшибкеПользователюExtendedTooltip + 115 Label true true @@ -833,8 +833,8 @@ Обмен завершен с ошибкой - ОбменЗавершенСОшибкойПодключенияРасширеннаяПодсказка - 114 + ОбменЗавершенСОшибкойПодключенияExtendedTooltip + 113 Label true true @@ -863,8 +863,8 @@ true - КартинкаТребуетсяОбновлениеРасширеннаяПодсказка - 119 + КартинкаТребуетсяОбновлениеExtendedTooltip + 117 Label true true @@ -908,8 +908,8 @@ true - ТекстТребуетсяОбновлениеОграниченныеПраваРасширеннаяПодсказка - 122 + ТекстТребуетсяОбновлениеОграниченныеПраваExtendedTooltip + 120 Label true true @@ -945,8 +945,8 @@ Требуется обновление ограниченные права - ТребуетсяОбновлениеОграниченныеПраваРасширеннаяПодсказка - 121 + ТребуетсяОбновлениеОграниченныеПраваExtendedTooltip + 119 Label true true @@ -977,8 +977,8 @@ true - ТекстТребуетсяОбновлениеПолныеПраваРасширеннаяПодсказка - 124 + ТекстТребуетсяОбновлениеПолныеПраваExtendedTooltip + 122 Label true true @@ -1014,8 +1014,8 @@ Требуется обновление полные права - ТребуетсяОбновлениеПолныеПраваРасширеннаяПодсказка - 123 + ТребуетсяОбновлениеПолныеПраваExtendedTooltip + 121 Label true true @@ -1042,10 +1042,9 @@ ru Панель требуется обновление - 1 - ПанельТребуетсяОбновлениеРасширеннаяПодсказка - 120 + ПанельТребуетсяОбновлениеExtendedTooltip + 118 Label true true @@ -1072,8 +1071,8 @@ Требуется обновление - ТребуетсяОбновлениеРасширеннаяПодсказка - 118 + ТребуетсяОбновлениеExtendedTooltip + 116 Label true true @@ -1100,8 +1099,8 @@ Статус завершения обмена - СтатусЗавершенияОбменаРасширеннаяПодсказка - 102 + СтатусЗавершенияОбменаExtendedTooltip + 101 Label true true @@ -1132,8 +1131,8 @@ true - ФормаЗакрытьРасширеннаяПодсказка - 128 + ФормаЗакрытьExtendedTooltip + 126 Label true true @@ -1162,8 +1161,8 @@ Командная панель закрыть - КоманднаяПанельЗакрытьРасширеннаяПодсказка - 127 + КоманднаяПанельЗакрытьExtendedTooltip + 125 Label true true @@ -1190,8 +1189,8 @@ Действия закрыть - ДействияЗакрытьРасширеннаяПодсказка - 126 + ДействияЗакрытьExtendedTooltip + 124 Label true true @@ -1220,8 +1219,8 @@ true - УстановитьОбновлениеРасширеннаяПодсказка - 131 + УстановитьОбновлениеExtendedTooltip + 129 Label true true @@ -1246,8 +1245,8 @@ true - ФормаЗакрыть1РасширеннаяПодсказка - 132 + ФормаЗакрыть1ExtendedTooltip + 130 Label true true @@ -1276,8 +1275,8 @@ Командная панель - КоманднаяПанельУстановитьЗакрытьРасширеннаяПодсказка - 130 + КоманднаяПанельУстановитьЗакрытьExtendedTooltip + 128 Label true true @@ -1304,8 +1303,8 @@ Действия установить закрыть - ДействияУстановитьЗакрытьРасширеннаяПодсказка - 129 + ДействияУстановитьЗакрытьExtendedTooltip + 127 Label true true @@ -1333,8 +1332,8 @@ Панель действий - ПанельДействийРасширеннаяПодсказка - 125 + ПанельДействийExtendedTooltip + 123 Label true true @@ -1361,8 +1360,8 @@ Завершение обмена - ЗавершениеОбменаРасширеннаяПодсказка - 101 + ЗавершениеОбменаExtendedTooltip + 100 Label true true @@ -1390,7 +1389,7 @@ Выполнение обмена данными - ВыполнениеОбменаДаннымиРасширеннаяПодсказка + ВыполнениеОбменаДаннымиExtendedTooltip 88 Label true diff --git a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl index 214d1fcfa..69676802c 100644 --- a/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ВыполнениеОбменаДанными/Forms/Форма/Module.bsl @@ -49,8 +49,8 @@ ПарольСинхронизацииСохранен = РегистрыСведений.НастройкиТранспортаОбмена.НастройкиТранспортаWS(УзелИнформационнойБазы).WSЗапомнитьПароль; ИспользоватьСохраненныеПараметрыАутентификации = Не ОбменДаннымиПовтИсп.ЭтоУзелРаспределеннойИнформационнойБазы(УзелИнформационнойБазы) И ПарольСинхронизацииСохранен; - РольДоступнаДобавлениеИзменениеОбменовДанными = Пользователи.РолиДоступны("НастройкаСинхронизацииДанных"); - РольДоступнаПолныеПрава = Пользователи.РолиДоступны("ПолныеПрава"); + РольДоступнаДобавлениеИзменениеОбменовДанными = Пользователи.РолиДоступны("НастройкаСинхронизацииДанных",, Ложь); + РольДоступнаПолныеПрава = Пользователи.ЭтоПолноправныйПользователь(,, Ложь); Элементы.ПанельТребуетсяОбновление.ТекущаяСтраница = ?(РольДоступнаПолныеПрава, Элементы.ТребуетсяОбновлениеПолныеПрава, Элементы.ТребуетсяОбновлениеОграниченныеПрава); Элементы.ТекстТребуетсяОбновлениеПолныеПрава.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Элементы.ТекстТребуетсяОбновлениеПолныеПрава.Заголовок, УзелИнформационнойБазы); @@ -151,7 +151,7 @@ Процедура ПерейтиВЖурналРегистрации(Команда) ПараметрыФормы = ПолучитьСтруктуруДанныхОтбораЖурналаРегистрации(УзелИнформационнойБазы); - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Commands/ГрупповоеИзменениеРеквизитов/CommandModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Commands/ГрупповоеИзменениеРеквизитов/CommandModule.bsl new file mode 100644 index 000000000..46a89ec14 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Commands/ГрупповоеИзменениеРеквизитов/CommandModule.bsl @@ -0,0 +1,5 @@ + +&НаКлиенте +Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) + ОткрытьФорму("Обработка.ГрупповоеИзменениеОбъектов.Форма", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка); +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Form.form new file mode 100644 index 000000000..690ce6366 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Form.form @@ -0,0 +1,326 @@ + + + + <key>ru</key> + <value>Выберите изменяемые элементы</value> + + + ДоступныеОбъектыДляИзменения + 8 + true + true + + true + + + ДоступныеОбъектыДляИзменения + + None + Add + Change + CheckAll + Copy + CopyToClipboard + Delete + EndEdit + MoveDown + MoveUp + Pickup + SortListAsc + SortListDesc + UncheckAll + + ДоступныеОбъектыДляИзмененияЗначение + 12 + true + true + + true + + + ДоступныеОбъектыДляИзменения.Value + + + ДоступныеОбъектыДляИзмененияЗначениеРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + ДоступныеОбъектыДляИзмененияЗначениеКонтекстноеМеню + 13 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + ДоступныеОбъектыДляИзмененияКоманднаяПанель + 10 + Left + + + Selection + ДоступныеОбъектыДляИзмененияВыбор + + + ДоступныеОбъектыДляИзмененияСтрокаПоиска + 17 + + ДоступныеОбъектыДляИзмененияСтрокаПоискаРасширеннаяПодсказка + 19 + Label + true + true + + Left + + + + ДоступныеОбъектыДляИзмененияСтрокаПоискаКонтекстноеМеню + 18 + true + + ДоступныеОбъектыДляИзменения + + true + + + + ДоступныеОбъектыДляИзмененияСостояниеПросмотра + 20 + + ДоступныеОбъектыДляИзмененияСостояниеПросмотраРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + ДоступныеОбъектыДляИзмененияСостояниеПросмотраКонтекстноеМеню + 21 + true + + ViewStatusAddition + ДоступныеОбъектыДляИзменения + + true + + + + ДоступныеОбъектыДляИзмененияУправлениеПоиском + 23 + + ДоступныеОбъектыДляИзмененияУправлениеПоискомРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ДоступныеОбъектыДляИзмененияУправлениеПоискомКонтекстноеМеню + 24 + true + + SearchControlAddition + ДоступныеОбъектыДляИзменения + + true + + + + ДоступныеОбъектыДляИзмененияРасширеннаяПодсказка + 11 + Label + true + true + + Left + + + + ДоступныеОбъектыДляИзмененияКонтекстноеМеню + 9 + true + + true + true + true + true + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + true + Auto + Auto + true + true + + ДоступныеОбъектыДляИзменения.Picture + + None + None + None + true + + + ФормаКоманднаяПанель + -1 + + ФормаВыбрать + 15 + true + true + + true + + + ФормаВыбратьРасширеннаяПодсказка + 16 + Label + true + true + + Left + + + Form.Command.Выбрать + Auto + true + true + true + UserCmds + Auto + + Left + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Close + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 45 + 9 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.ГрупповоеИзменениеОбъектов + + + true + + + true + +
                true
                +
                + + ДоступныеОбъектыДляИзменения + + <key>ru</key> + <value>Доступные объекты для изменения</value> + + 3 + + ValueList + + + true + + + true + + + + + + + Выбрать + + <key>ru</key> + <value>Выбрать</value> + + 1 + + ru + Выбрать + + + true + + + + Выбрать + + + Auto + Auto + + + ТекущийОбъект + + String + + + + + ПоказыватьСкрытые + + Boolean + + + + + + + +
                diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Module.bsl new file mode 100644 index 000000000..97c41b081 --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыборВидаОбъектов/Module.bsl @@ -0,0 +1,337 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + КоллекцииОбъектовМетаданных = Новый Массив; + КоллекцииОбъектовМетаданных.Добавить(Метаданные.Справочники); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.Документы); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.БизнесПроцессы); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.Задачи); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.ПланыВидовРасчета); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.ПланыВидовХарактеристик); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.ПланыСчетов); + КоллекцииОбъектовМетаданных.Добавить(Метаданные.ПланыОбмена); + + ПрефиксУдаляемыхОбъектов = "Удалить"; + Для Каждого КоллекцияОбъектовМетаданных Из КоллекцииОбъектовМетаданных Цикл + Для Каждого ОбъектМетаданных Из КоллекцияОбъектовМетаданных Цикл + Если Не Параметры.ПоказыватьСкрытые Тогда + Если НРег(Лев(ОбъектМетаданных.Имя, СтрДлина(ПрефиксУдаляемыхОбъектов))) = НРег(ПрефиксУдаляемыхОбъектов) + Или ЭтоСлужебныйОбъект(ОбъектМетаданных) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + Если ПравоДоступа("Изменение", ОбъектМетаданных) Тогда + ДоступныеОбъектыДляИзменения.Добавить(ОбъектМетаданных.ПолноеИмя(), ОбъектМетаданных.Синоним); + КонецЕсли; + КонецЦикла; + КонецЦикла; + ДоступныеОбъектыДляИзменения.СортироватьПоПредставлению(); + + Если Не ПустаяСтрока(Параметры.ТекущийОбъект) Тогда + Элементы.ДоступныеОбъектыДляИзменения.ТекущаяСтрока = ДоступныеОбъектыДляИзменения.НайтиПоЗначению(Параметры.ТекущийОбъект).ПолучитьИдентификатор(); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ДоступныеОбъектыДляИзмененияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + Закрыть(Элементы.ДоступныеОбъектыДляИзменения.ТекущиеДанные.Значение); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура Выбрать(Команда) + ТекущиеДанные = Элементы.ДоступныеОбъектыДляИзменения.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + Закрыть(ТекущиеДанные.Значение); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервереБезКонтекста +Функция ЭтоСлужебныйОбъект(ОбъектМетаданных) + + МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); + + Попытка + Редактируемые = МенеджерОбъекта.РеквизитыРедактируемыеВГрупповойОбработке(); + Если Редактируемые.Количество() = 0 Тогда + Возврат Истина; + КонецЕсли; + Исключение + Редактируемые = Новый Массив; + КонецПопытки; + + Попытка + НеРедактируемые = МенеджерОбъекта.РеквизитыНеРедактируемыеВГрупповойОбработке(); + Если НеРедактируемые.Найти("*") <> Неопределено Тогда + Возврат Истина; + КонецЕсли; + Исключение + НеРедактируемые = Новый Массив; + КонецПопытки; + + Возврат Ложь; + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции из базовой функциональности для обеспечения автономности + +&НаСервереБезКонтекста +Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) + Перем КлассОМ, ИмяОМ, Менеджер; + + ЧастиИмени = РазложитьСтрокуВМассивПодстрок(ПолноеИмя, "."); + + Если ЧастиИмени.Количество() = 2 Тогда + КлассОМ = ЧастиИмени[0]; + ИмяОМ = ЧастиИмени[1]; + КонецЕсли; + + Если ВРег(КлассОМ) = "ПЛАНОБМЕНА" Тогда + Менеджер = ПланыОбмена; + + ИначеЕсли ВРег(КлассОМ) = "СПРАВОЧНИК" Тогда + Менеджер = Справочники; + + ИначеЕсли ВРег(КлассОМ) = "ДОКУМЕНТ" Тогда + Менеджер = Документы; + + ИначеЕсли ВРег(КлассОМ) = "ЖУРНАЛДОКУМЕНТОВ" Тогда + Менеджер = ЖурналыДокументов; + + ИначеЕсли ВРег(КлассОМ) = "ПЕРЕЧИСЛЕНИЕ" Тогда + Менеджер = Перечисления; + + ИначеЕсли ВРег(КлассОМ) = "ОТЧЕТ" Тогда + Менеджер = Отчеты; + + ИначеЕсли ВРег(КлассОМ) = "ОБРАБОТКА" Тогда + Менеджер = Обработки; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда + Менеджер = ПланыВидовХарактеристик; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНСЧЕТОВ" Тогда + Менеджер = ПланыСчетов; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВРАСЧЕТА" Тогда + Менеджер = ПланыВидовРасчета; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРСВЕДЕНИЙ" Тогда + Менеджер = РегистрыСведений; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРНАКОПЛЕНИЯ" Тогда + Менеджер = РегистрыНакопления; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРБУХГАЛТЕРИИ" Тогда + Менеджер = РегистрыБухгалтерии; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРРАСЧЕТА" Тогда + Если ЧастиИмени.Количество() = 2 Тогда + // Регистр расчета + Менеджер = РегистрыРасчета; + Иначе + КлассПодчиненногоОМ = ЧастиИмени[2]; + ИмяПодчиненногоОМ = ЧастиИмени[3]; + Если ВРег(КлассПодчиненногоОМ) = "ПЕРЕРАСЧЕТ" Тогда + // Перерасчет + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ПолноеИмя); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(КлассОМ) = "БИЗНЕСПРОЦЕСС" Тогда + Менеджер = БизнесПроцессы; + + ИначеЕсли ВРег(КлассОМ) = "ЗАДАЧА" Тогда + Менеджер = Задачи; + + ИначеЕсли ВРег(КлассОМ) = "КОНСТАНТА" Тогда + Менеджер = Константы; + + ИначеЕсли ВРег(КлассОМ) = "ПОСЛЕДОВАТЕЛЬНОСТЬ" Тогда + Менеджер = Последовательности; + КонецЕсли; + + Если Менеджер <> Неопределено Тогда + Попытка + Возврат Менеджер[ИмяОМ]; + Исключение + Менеджер = Неопределено; + КонецПопытки; + КонецЕсли; + + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ПолноеИмя); + +КонецФункции + +// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. +// +// Параметры: +// Строка - Строка - текст с разделителями; +// Разделитель - Строка - разделитель строк текста, минимум 1 символ; +// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. +// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: +// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат. +// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а +// при других разделителях результатом функции будет пустой массив. +// +// +// Возвращаемое значение: +// Массив - массив строк. +// +// Примеры: +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые строки; +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; +// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); +// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); +// +&НаКлиентеНаСервереБезКонтекста +Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) + + Результат = Новый Массив; + + // для обеспечения обратной совместимости + Если ПропускатьПустыеСтроки = Неопределено Тогда + ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); + Если ПустаяСтрока(Строка) Тогда + Если Разделитель = " " Тогда + Результат.Добавить(""); + КонецЕсли; + Возврат Результат; + КонецЕсли; + КонецЕсли; + // + + Позиция = Найти(Строка, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Строка, Позиция - 1); + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда + Результат.Добавить(Подстрока); + КонецЕсли; + Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); + Позиция = Найти(Строка, Разделитель); + КонецЦикла; + + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда + Результат.Добавить(Строка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. +// +// Параметры: +// СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); +// Параметр - Строка - подставляемый параметр. +// +// Возвращаемое значение: +// Строка – текстовая строка с подставленными параметрами. +// +// Пример: +// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". +// +&НаКлиентеНаСервереБезКонтекста +Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + ИспользоватьАльтернативныйАлгоритм = + Найти(Параметр1, "%") + Или Найти(Параметр2, "%") + Или Найти(Параметр3, "%") + Или Найти(Параметр4, "%") + Или Найти(Параметр5, "%") + Или Найти(Параметр6, "%") + Или Найти(Параметр7, "%") + Или Найти(Параметр8, "%") + Или Найти(Параметр9, "%"); + + Если ИспользоватьАльтернативныйАлгоритм Тогда + СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1, + Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); + Иначе + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); + КонецЕсли; + + Возврат СтрокаПодстановки; +КонецФункции + +// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. +&НаКлиентеНаСервереБезКонтекста +Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + Результат = ""; + Позиция = Найти(СтрокаПодстановки, "%"); + Пока Позиция > 0 Цикл + Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); + СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); + ПодставляемыйПараметр = ""; + Если СимволПослеПроцента = "1" Тогда + ПодставляемыйПараметр = Параметр1; + ИначеЕсли СимволПослеПроцента = "2" Тогда + ПодставляемыйПараметр = Параметр2; + ИначеЕсли СимволПослеПроцента = "3" Тогда + ПодставляемыйПараметр = Параметр3; + ИначеЕсли СимволПослеПроцента = "4" Тогда + ПодставляемыйПараметр = Параметр4; + ИначеЕсли СимволПослеПроцента = "5" Тогда + ПодставляемыйПараметр = Параметр5; + ИначеЕсли СимволПослеПроцента = "6" Тогда + ПодставляемыйПараметр = Параметр6; + ИначеЕсли СимволПослеПроцента = "7" Тогда + ПодставляемыйПараметр = Параметр7 + ИначеЕсли СимволПослеПроцента = "8" Тогда + ПодставляемыйПараметр = Параметр8; + ИначеЕсли СимволПослеПроцента = "9" Тогда + ПодставляемыйПараметр = Параметр9; + КонецЕсли; + Если ПодставляемыйПараметр = "" Тогда + Результат = Результат + "%"; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); + Иначе + Результат = Результат + ПодставляемыйПараметр; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); + КонецЕсли; + Позиция = Найти(СтрокаПодстановки, "%"); + КонецЦикла; + Результат = Результат + СтрокаПодстановки; + + Возврат Результат; +КонецФункции + diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 89% rename from SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Папки/ExtInfo/ListSettings.dcss +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Form.form new file mode 100644 index 000000000..0ad71111e --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Form.form @@ -0,0 +1,820 @@ + + + + <key>ru</key> + <value>Выбранные элементы</value> + + + ГруппаУсловияОтбора + 27 + + КомпоновщикНастроекНастройкиОтбор + 23 + true + true + + true + + + КомпоновщикНастроек.Settings.Filter + + None + + КомпоновщикНастроекНастройкиОтборКоманднаяПанель + 25 + + КомпоновщикНастроекНастройкиОтборДобавитьЭлементОтбора + 49 + + <key>ru</key> + <value>Добавить условие отбора</value> + + true + true + + true + + + КомпоновщикНастроекНастройкиОтборДобавитьЭлементОтбораРасширеннаяПодсказка + 50 + Label + true + true + + Left + + + Form.Item.КомпоновщикНастроекНастройкиОтбор.StandardCommand.AddFilterItem + Normal + Auto + true + true + UserCmds + Auto + + + КомпоновщикНастроекНастройкиОтборСтандартныеКнопки + 51 + true + true + + true + + + <key>ru</key> + <value>Компоновщик настроек настройки отбор стандартные кнопки</value> + + + ru + Компоновщик настроек настройки отбор стандартные кнопки + + + КомпоновщикНастроекНастройкиОтборСтандартныеКнопкиРасширеннаяПодсказка + 52 + Label + true + true + + Left + + + + Item.КомпоновщикНастроекНастройкиОтбор + + + Left + + + OnEditEnd + КомпоновщикНастроекНастройкиОтборПриОкончанииРедактирования + + + BeforeAddRow + КомпоновщикНастроекНастройкиОтборПередНачаломДобавления + + + AfterDeleteRow + КомпоновщикНастроекНастройкиОтборПослеУдаления + + + КомпоновщикНастроекНастройкиОтборСтрокаПоиска + 53 + + КомпоновщикНастроекНастройкиОтборСтрокаПоискаРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборСтрокаПоискаКонтекстноеМеню + 54 + true + + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотра + 56 + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотраРасширеннаяПодсказка + 58 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотраКонтекстноеМеню + 57 + true + + ViewStatusAddition + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборУправлениеПоиском + 59 + + КомпоновщикНастроекНастройкиОтборУправлениеПоискомРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборУправлениеПоискомКонтекстноеМеню + 60 + true + + SearchControlAddition + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборРасширеннаяПодсказка + 26 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборКонтекстноеМеню + 24 + true + + Tree + true + true + true + true + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + All + false +
                + true + true + + true + + + <key>ru</key> + <value>Условия отбора</value> + + + ru + Группа условия отбора + + + ГруппаУсловияОтбораРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + +
                + + ГруппаВыбранныеОбъекты + 29 + + Список + 11 + true + true + + true + + + Список + + None + CancelSearch + Choose + DynamicListStandardSettings + Find + ListSettings + LoadDynamicListSettings + SaveDynamicListSettings + + СписокСсылка + 15 + true + true + + true + + + Список.Ссылка + + + СписокСсылкаРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + + СписокСсылкаКонтекстноеМеню + 16 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 13 + Left + + + СписокСтрокаПоиска + 70 + + СписокСтрокаПоискаРасширеннаяПодсказка + 72 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 71 + true + + Список + + true + + + + СписокСостояниеПросмотра + 73 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 74 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 76 + + СписокУправлениеПоискомРасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 77 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 14 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 12 + + СписокКонтекстноеМенюОбновить + 45 + true + true + + true + + + СписокКонтекстноеМенюОбновитьРасширеннаяПодсказка + 46 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.Refresh + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюВывестиСписок + 43 + true + true + + true + + + СписокКонтекстноеМенюВывестиСписокРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Item.Список.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + СписокКонтекстноеМенюКопироватьВБуферОбмена + 47 + true + true + + true + + + СписокКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + 48 + Label + true + true + + Left + + + 0 + Normal + Auto + true + true + UserCmds + Auto + + true + + true + true + true + 8 + true + true + MultiRow + 1 + 1 + AutoUse + AutoUse + true + true + false + false + false + Auto + Auto + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Выбранные элементы</value> + + + ru + Группа выбранные объекты + + + ГруппаВыбранныеОбъектыРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + + + Bottom + true + + ФормаКоманднаяПанель + -1 + + ФормаВыбратьИЗакрыть + 21 + true + true + + true + + + ФормаВыбратьИЗакрытьРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true + true + true + UserCmds + Auto + + + ФормаОтмена + 31 + true + true + + true + + + ФормаОтменаРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + Right + true + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Close + CustomizeForm + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 22 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + 1 + + DataProcessorObject.ГрупповоеИзменениеОбъектов + + + true + + + true + +
                true
                +
                + + ОбъектыДляОбработки + + <key>ru</key> + <value>Объекты для обработки</value> + + 2 + + ValueList + + + true + + + true + + + + + + + Список + + <key>ru</key> + <value>Список</value> + + 3 + + DynamicList + + + true + + + true + + + ВЫБРАТЬ + "" КАК Ссылка + true + true + true + + + + КомпоновщикНастроек + + <key>ru</key> + <value>Компоновщик настроек</value> + + 4 + + DataCompositionSettingsComposer + + + true + + + true + + + + ВидИзменяемыхОбъектов + + <key>ru</key> + <value>Вид изменяемых объектов</value> + + 6 + + String + + + + true + + + true + + + + АдресСхемы + + <key>ru</key> + <value>Адрес схемы</value> + + 7 + + String + + + + true + + + true + + + + ТекстЗапроса + + <key>ru</key> + <value>Текст запроса</value> + + 8 + + String + + + + true + + + true + + + + ОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + ОК + + + true + + + + ОК + + + Auto + Auto + + + СкрытьПоказать + + <key>ru</key> + <value>Скрыть показать</value> + + 2 + + ru + Скрыть показать + + + true + + Auto + Auto + + + Настройки + + + + ВидИзменяемыхОбъектов + + String + + + + + + + + +
                diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Module.bsl new file mode 100644 index 000000000..da8ff03ea --- /dev/null +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ВыбранныеЭлементы/Module.bsl @@ -0,0 +1,115 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда // Возврат при получении формы для анализа. + Возврат; + КонецЕсли; + + ВидИзменяемыхОбъектов = Параметры.ВидИзменяемыхОбъектов; + ОбъектОбработка = РеквизитФормыВЗначение("Объект"); + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + ТекстЗапроса = ОбъектОбработка.ТекстЗапроса(ОбъектМетаданных); + + ИнициализироватьКомпоновщикНастроек(); + КомпоновщикНастроек.ЗагрузитьНастройки(Параметры.Настройки); + + Список.ТекстЗапроса = ТекстЗапроса; + Список.ОсновнаяТаблица = ВидИзменяемыхОбъектов; + ОбновитьСписокВыбранныхНаСервере(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ КомпоновщикНастроекНастройкиОтбор + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + ИнициализироватьОбновлениеСпискаВыбранных(); +КонецПроцедуры + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПослеУдаления(Элемент) + ИнициализироватьОбновлениеСпискаВыбранных(); +КонецПроцедуры + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных"); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ОК(Команда) + Результат = КомпоновщикНастроек.Настройки; + Закрыть(Результат); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ИнициализироватьКомпоновщикНастроек() + Если Не ПустаяСтрока(ВидИзменяемыхОбъектов) Тогда + СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция СхемаКомпоновкиДанных(ТекстЗапроса) + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; + НаборДанных.Запрос = ТекстЗапроса; + НаборДанных.Имя = "НаборДанных1"; + + Возврат СхемаКомпоновкиДанных; + +КонецФункции + +&НаСервере +Процедура ОбновитьСписокВыбранныхНаСервере() + + Список.КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.Настройки); + + Структура = Список.КомпоновщикНастроек.Настройки.Структура; + Структура.Очистить(); + ГруппировкаКомпоновкиДанных = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + ГруппировкаКомпоновкиДанных.Использование = Истина; + + Выбор = Список.КомпоновщикНастроек.Настройки.Выбор; + ПолеВыбора = Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); + ПолеВыбора.Использование = Истина; + +КонецПроцедуры + +&НаКлиенте +Процедура ИнициализироватьОбновлениеСпискаВыбранных() + ОтключитьОбработчикОжидания("ОбновитьСписокВыбранных"); + Если Элементы.ГруппаВыбранныеОбъекты.Видимость Тогда + ПодключитьОбработчикОжидания("ОбновитьСписокВыбранных", 1, Истина); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСписокВыбранных() + ОбновитьСписокВыбранныхНаСервере(); +КонецПроцедуры + + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Form.form similarity index 64% rename from SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form rename to SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Form.form index 3ab22c685..6fba527bb 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Form.form @@ -2,7 +2,7 @@ <key>ru</key> - <value>Настройка параметров изменения</value> + <value>Дополнительные параметры</value> ГруппаИзменятьВТранзакции @@ -24,7 +24,7 @@ ИзменятьВТранзакцииПриИзменении - ИзменятьВТранзакцииРасширеннаяПодсказка + ИзменятьВТранзакцииExtendedTooltip 54 Label true @@ -50,7 +50,7 @@ 7 <key>ru</key> - <value>При невозможности изменения элементов в транзакции, все изменения будут отменены</value> + <value>При невозможности изменения элементов в транзакции, все изменения будут отменены.</value> true true @@ -58,8 +58,8 @@ true - ПояснениеИзменятьВТранзакцииРасширеннаяПодсказка - 56 + ПояснениеИзменятьВТранзакцииExtendedTooltip + 55 Label true true @@ -96,7 +96,7 @@ Группа изменять в транзакции - ГруппаИзменятьВТранзакцииРасширеннаяПодсказка + ГруппаИзменятьВТранзакцииExtendedTooltip 53 Label true @@ -132,8 +132,8 @@ Right - ПрерыватьПриОшибкеРасширеннаяПодсказка - 58 + ПрерыватьПриОшибкеExtendedTooltip + 57 Label true true @@ -158,7 +158,7 @@ 40 <key>ru</key> - <value>Предупреждать, если во время изменения элементов возникнут ошибки</value> + <value>Предупреждать, если во время изменения элементов возникнут ошибки.</value> true true @@ -166,8 +166,8 @@ true - ПояснениеПрерыватьПриОшибкеРасширеннаяПодсказка - 60 + ПояснениеПрерыватьПриОшибкеExtendedTooltip + 58 Label true true @@ -204,8 +204,8 @@ Группа прерывание при ошибке - ГруппаПрерываниеПриОшибкеРасширеннаяПодсказка - 57 + ГруппаПрерываниеПриОшибкеExtendedTooltip + 56 Label true true @@ -240,8 +240,8 @@ Right - ОбрабатыватьГруппыРекурсивноРасширеннаяПодсказка - 62 + ОбрабатыватьГруппыРекурсивноExtendedTooltip + 60 Label true true @@ -266,7 +266,7 @@ 9 <key>ru</key> - <value>Обрабатывать дочерние элементы групп и родительских элементов</value> + <value>Обрабатывать дочерние элементы групп и родительских элементов.</value> true true @@ -274,8 +274,8 @@ true - ПояснениеОбрабатыватьГруппыРекурсивноРасширеннаяПодсказка - 64 + ПояснениеОбрабатыватьГруппыРекурсивноExtendedTooltip + 61 Label true true @@ -312,8 +312,8 @@ Группа обрабатывать рекурсивно - ГруппаОбрабатыватьРекурсивноРасширеннаяПодсказка - 61 + ГруппаОбрабатыватьРекурсивноExtendedTooltip + 59 Label true true @@ -333,19 +333,23 @@ - ГруппаНастройкиИзмененияПорциями - 29 - - ПустаяДекорация - 30 + ГруппаПоказыватьСлужебныеРеквизиты + 78 + + ПоказыватьСлужебныеРеквизиты + 80 true true true + + ПоказыватьСлужебныеРеквизиты + + Right - ПустаяДекорацияРасширеннаяПодсказка - 66 + ПоказыватьСлужебныеРеквизитыРасширеннаяПодсказка + 82 Label true true @@ -354,268 +358,32 @@ - ПустаяДекорацияКонтекстноеМеню - 31 + ПоказыватьСлужебныеРеквизитыКонтекстноеМеню + 81 true - Label - true - true - - Left - + CheckBoxField + Enter + true + Left + true + - - ГруппаИзменятьПорциями - 13 - - ГруппаПереключатель - 14 - - НастройкаПорции - 11 - true - true - - true - - - НастройкаПорции - - None - - OnChange - ИзменятьПорциямиПриИзменении - - - НастройкаПорцииРасширеннаяПодсказка - 69 - Label - true - true - - Left - - - - НастройкаПорцииКонтекстноеМеню - 12 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Одной порцией - - - 1 - - - - - ru - Порциями по числу объектов: - - - 2 - - - - - ru - Порциями по проценту объектов: - - - 3 - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа переключатель</value> - - - ru - Группа переключатель - - - ГруппаПереключательРасширеннаяПодсказка - 68 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаПараметрыПорции - 32 - - ЧислоОбъектовВПорции - 33 - true - true - - true - - - ЧислоОбъектовВПорции - - None - - ЧислоОбъектовВПорцииРасширеннаяПодсказка - 72 - Label - true - true - - Left - - - - ЧислоОбъектовВПорцииКонтекстноеМеню - 34 - true - - InputField - Enter - true - Left - true - - 6 - true - true - true - true - true - true - - 0 - - Normal - - - - ПроцентОбъектовВПорции - 35 - true - true - - true - - - ПроцентОбъектовВПорции - - None - - ПроцентОбъектовВПорцииРасширеннаяПодсказка - 74 - Label - true - true - - Left - - - - ПроцентОбъектовВПорцииКонтекстноеМеню - 36 - true - - InputField - Enter - true - Left - true - - 6 - true - true - true - true - true - true - - 0 - - - 100 - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа параметры порции</value> - - - ru - Группа параметры порции - - - ГруппаПараметрыПорцииРасширеннаяПодсказка - 71 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - + + ПояснениеПоказыватьСлужебныеРеквизиты + 83 + + <key>ru</key> + <value>Показывать все реквизиты и табличные части элементов, в том числе служебные.</value> + + true true true - - ru - Группа изменять порциями - - true - ГруппаИзменятьПорциямиРасширеннаяПодсказка - 67 + ПояснениеПоказыватьСлужебныеРеквизитыРасширеннаяПодсказка + 85 Label true true @@ -623,30 +391,37 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto + + ПояснениеПоказыватьСлужебныеРеквизитыКонтекстноеМеню + 84 + true + + Label + true + true + + Style.ПоясняющийТекст + + + Left + true true true <key>ru</key> - <value>Группа настройки изменения порциями</value> + <value>Группа показывать служебные реквизиты</value> ru - Группа настройки изменения порциями + Группа показывать служебные реквизиты - ГруппаНастройкиИзмененияПорциямиРасширеннаяПодсказка - 65 + ГруппаПоказыватьСлужебныеРеквизитыРасширеннаяПодсказка + 79 Label true true @@ -656,6 +431,7 @@ UsualGroup + Vertical Auto true true @@ -677,7 +453,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 50 Label true @@ -703,7 +479,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 51 Label true @@ -729,7 +505,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 52 Label true @@ -880,6 +656,23 @@ true + + ПоказыватьСлужебныеРеквизиты + + <key>ru</key> + <value>Показывать служебные реквизиты и табличные части</value> + + 8 + + Boolean + + + true + + + true + + ОК @@ -956,6 +749,12 @@ <types>Boolean</types> </valueType> </parameters> + <parameters> + <name>КонтекстныйВызов</name> + <valueType> + <types>Boolean</types> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Help/ru.html b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Help/ru.html similarity index 74% rename from SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Help/ru.html rename to SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Help/ru.html index 87f52b558..7b425c04e 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Help/ru.html +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Help/ru.html @@ -1,4 +1,5 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Дополнительно <a href="DataProcessor.ГрупповоеИзменениеОбъектов/Help">на первой странице помощника</a> можно задать особые настройки с помощью команды <strong>Настроить параметры изменения</strong>. Система позволяет обрабатывать объекты в транзакции. Если в процессе записи при установленном флажке <strong>Изменять в транзакции </strong>не удается записать один из объектов (например, потому что объект редактируется другим пользователем), то будут отменены изменения во всех объектах. По умолчанию флажок не установлен. </p> <p>Если изменение объектов выполняется не в транзакции, то рекомендуется выполнять ее с установленным флажком <strong>Прерывать по ошибке</strong>. В этом случае, если запись объекта по каким-либо причинам не возможна, система выдаст предупреждение и предложит продолжить изменение оставшихся объектов, либо прервать для выяснения причин проблемы. Если флажок не установлен, а объект записать нельзя, то обработка пропустит такой объект и продолжит изменение оставшихся объектов.</p> -<p>Установка флажка <strong>Обрабатывать дочерние элементы</strong> (по умолчанию флажок не установлен) позволяет изменять дочерние элементы выбранных групп и родительских объектов без необходимости установки флажков у всех элементов групп и дочерних объектов. Если флажок снят, то система обрабатывает саму группу, а не ее дочерние элементы.</p></body></html> \ No newline at end of file +<p>Установка флажка <strong>Обрабатывать дочерние элементы</strong> (по умолчанию флажок не установлен) позволяет изменять дочерние элементы выбранных групп и родительских объектов без необходимости установки флажков у всех элементов групп и дочерних объектов. Если флажок снят, то система обрабатывает саму группу, а не ее дочерние элементы.</p> +<p>Служебные реквизиты, в том числе и реквизиты табличных частей, по умолчанию скрыты. Для того, чтобы включить отображение этих реквизитов на форме, необходимо установить флажок <strong>Показывать служебные реквизиты и табличные части</strong>. Редактирование служебных реквизитов может нарушить работоспособность программы, поэтому рекомендуется использовать эту возможность крайне осторожно и только в ремонтных целях.</p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Module.bsl similarity index 75% rename from SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl rename to SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Module.bsl index ff33fc76c..431dafb9a 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Настройка/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/ДополнительныеПараметры/Module.bsl @@ -14,6 +14,15 @@ Параметры.Свойство("ЧислоОбъектовВПорции", ЧислоОбъектовВПорции); Параметры.Свойство("ПрерыватьПриОшибке", ПрерыватьПриОшибке); + ЕстьПравоАдминистрированияДанных = ПравоДоступа("АдминистрированиеДанных", Метаданные); + КлючСохраненияПоложенияОкна = ?(ЕстьПравоАдминистрированияДанных, "ЕстьПравоАдминистрированияДанных", "НетПраваАдминистрированияДанных"); + Если Не Параметры.КонтекстныйВызов И ЕстьПравоАдминистрированияДанных Тогда + Параметры.Свойство("ПоказыватьСлужебныеРеквизиты", ПоказыватьСлужебныеРеквизиты); + Элементы.ГруппаПоказыватьСлужебныеРеквизиты.Видимость = Истина; + Иначе + Элементы.ГруппаПоказыватьСлужебныеРеквизиты.Видимость = Ложь; + КонецЕсли; + Если НЕ Параметры.УчитыватьИерархию Тогда Элементы.ОбрабатыватьГруппыРекурсивно.Доступность = Ложь; КонецЕсли; @@ -37,13 +46,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ИзменятьПорциямиПриИзменении(Элемент) - - УстановитьЭлементыФормы(); - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ КОМАНД ФОРМЫ @@ -57,6 +59,7 @@ РезультатВыбора.Вставить("ПроцентОбъектовВПорции", ПроцентОбъектовВПорции); РезультатВыбора.Вставить("ЧислоОбъектовВПорции", ЧислоОбъектовВПорции); РезультатВыбора.Вставить("ПрерыватьПриОшибке", ИзменятьВТранзакции Или ПрерыватьПриОшибке); + РезультатВыбора.Вставить("ПоказыватьСлужебныеРеквизиты", ПоказыватьСлужебныеРеквизиты); ОповеститьОВыборе(РезультатВыбора); diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca index 7c4efab7c..3b14d997e 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/ConditionalAppearance.dcssca @@ -3,12 +3,12 @@ <item> <selection> <item> - <field>ТаблицаОперацийПредставление</field> + <field>РеквизитыОбъектаПредставление</field> </item> </selection> <filter> <item xsi:type="FilterItemComparison"> - <left xsi:type="dcscor:Field">Объект.Операции.ЗаблокированныйРеквизит</left> + <left xsi:type="dcscor:Field">РеквизитыОбъекта.ЗаблокированныйРеквизит</left> <comparisonType>Equal</comparisonType> <right xsi:type="xs:boolean">true</right> </item> diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form index bd56bad6f..3d9781991 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Form.form @@ -7,19 +7,22 @@ <name>НастройкаИзменений</name> <id>2</id> <items xsi:type="form:FormGroup"> - <name>ГруппаКнопок</name> - <id>62</id> - <items xsi:type="form:Button"> - <name>ИсторияОпераций</name> - <id>57</id> + <name>ОтборОбъектов</name> + <id>110</id> + <items xsi:type="form:FormField"> + <name>ПредставлениеИзменяемыхОбъектов</name> + <id>167</id> <visible>true</visible> <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>ПредставлениеИзменяемыхОбъектов</segments> + </dataPath> <extendedTooltip> - <name>ИсторияОперацийРасширеннаяПодсказка</name> - <id>77</id> + <name>ПредставлениеИзменяемыхОбъектовРасширеннаяПодсказка</name> + <id>169</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -27,29 +30,381 @@ <horizontalAlign>Left</horizontalAlign> </extInfo> </extendedTooltip> - <type>UsualButton</type> - <commandName>Form.Command.ИсторияОпераций</commandName> - <buttonImportance>Normal</buttonImportance> - <representation>Auto</representation> - <width>9</width> + <contextMenu> + <name>ПредставлениеИзменяемыхОбъектовКонтекстноеМеню</name> + <id>168</id> + <autoFill>true</autoFill> + </contextMenu> + <type>InputField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:InputFieldExtInfo"> + <handlers> + <event>StartChoice</event> + <name>ВидИзменяемыхОбъектовНачалоВыбора</name> + </handlers> + <width>50</width> + <autoMaxWidth>true</autoMaxWidth> + <autoMaxHeight>true</autoMaxHeight> + <horizontalStretch>false</horizontalStretch> + <wrap>true</wrap> + <choiceButton>true</choiceButton> + <chooseType>true</chooseType> + <typeDomainEnabled>true</typeDomainEnabled> + <textSize>Normal</textSize> + </extInfo> + </items> + <items xsi:type="form:Table"> + <name>КомпоновщикНастроекНастройкиОтбор</name> + <id>170</id> + <visible>true</visible> + <enabled>true</enabled> + <userVisible> + <common>true</common> + </userVisible> + <dataPath xsi:type="form:DataPath"> + <segments>КомпоновщикНастроек.Settings.Filter</segments> + </dataPath> + <titleLocation>None</titleLocation> + <autoCommandBar> + <name>КомпоновщикНастроекНастройкиОтборКоманднаяПанель</name> + <id>172</id> + <items xsi:type="form:Button"> + <name>КомпоновщикНастроекНастройкиОтборДобавитьЭлементОтбора</name> + <id>179</id> + <title> + <key>ru</key> + <value>Добавить условие отбора</value> + + true + true + + true + + + КомпоновщикНастроекНастройкиОтборДобавитьЭлементОтбораРасширеннаяПодсказка + 180 + Label + true + true + + Left + + + Form.Item.КомпоновщикНастроекНастройкиОтбор.StandardCommand.AddFilterItem + Normal + Auto + true + true + UserCmds + Auto + + + КомпоновщикНастроекНастройкиОтборГруппа1 + 181 + true + true + + true + + + КомпоновщикНастроекНастройкиОтборГруппа1РасширеннаяПодсказка + 182 + Label + true + true + + Left + + + + Item.КомпоновщикНастроекНастройкиОтбор + + + Left + + + OnEditEnd + КомпоновщикНастроекНастройкиОтборПриОкончанииРедактирования + + + OnStartEdit + КомпоновщикНастроекНастройкиОтборПриНачалеРедактирования + + + AfterDeleteRow + КомпоновщикНастроекНастройкиОтборПослеУдаления + + + КомпоновщикНастроекНастройкиОтборСтрокаПоиска + 216 + + КомпоновщикНастроекНастройкиОтборСтрокаПоискаРасширеннаяПодсказка + 218 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборСтрокаПоискаКонтекстноеМеню + 217 + true + + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотра + 219 + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотраРасширеннаяПодсказка + 221 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборСостояниеПросмотраКонтекстноеМеню + 220 + true + + ViewStatusAddition + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборУправлениеПоиском + 222 + + КомпоновщикНастроекНастройкиОтборУправлениеПоискомРасширеннаяПодсказка + 224 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборУправлениеПоискомКонтекстноеМеню + 223 + true + + SearchControlAddition + КомпоновщикНастроекНастройкиОтбор + + true + + + + КомпоновщикНастроекНастройкиОтборРасширеннаяПодсказка + 173 + Label + true + true + + Left + + + + КомпоновщикНастроекНастройкиОтборКонтекстноеМеню + 171 + true + + Tree + true + true + true + true + 5 + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + false + Auto + Auto + ExpandAllLevels + true + true + true + true + None + None + None + true + All + false +
                + + НастройкаОтбора + 107 + + <key>ru</key> + <value>Элементы не выбраны</value> + + true + true + + true + + + НастройкаОтбораРасширеннаяПодсказка + 109 + Label + true + true + + Left + + + + НастройкаОтбораКонтекстноеМеню + 108 + true + + Label true true - UserCmds - Auto + + + Click + НастройкаОтбораНажатие + + Left + + true + true + + true + + + <key>ru</key> + <value>Выбор элементов для изменения</value> + + + ru + Отбор объектов + + + ОтборОбъектовРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + WeakSeparation + true + true + auto + Auto + Auto + +
                + + ИзменяемыеРеквизиты + 183 - ПараметрыИзменения - 58 + ПанельНастроек + 187 + + РанееИзмененныеРеквизиты + 189 + + Заглушка + 201 + true + false + + true + + + ЗаглушкаРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + Form.Command.Заглушка + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Ранее измененные реквизиты</value> + + + ru + Ранее измененные реквизиты + + + РанееИзмененныеРеквизитыРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + Popup + + Auto + Normal + + НастроитьПараметрыИзменений 44 + + <key>ru</key> + <value>Дополнительные параметры...</value> + true true true - НастроитьПараметрыИзмененийРасширеннаяПодсказка + НастроитьПараметрыИзмененийExtendedTooltip 79 Label true @@ -61,32 +416,7 @@ Form.Command.НастроитьПараметрыИзменения Normal Auto - true - true - UserCmds - Auto - - - РазрешитьРедактированиеРеквизитов - 24 - true - true - - true - - - РазрешитьРедактированиеРеквизитовРасширеннаяПодсказка - 80 - Label - true - true - - Left - - - Form.Command.РазрешитьРедактированиеРеквизитов - Normal - Auto + 21 true true UserCmds @@ -99,15 +429,15 @@ <key>ru</key> - <value>Параметры изменения</value> + <value>Панель настроек</value> ru - Параметры изменения + Панель настроек - ПараметрыИзмененияРасширеннаяПодсказка - 78 + ПанельНастроекРасширеннаяПодсказка + 188 Label true true @@ -120,6 +450,380 @@ Left + + СоставОбъекта + 112 + + Реквизиты + 114 + + РеквизитыОбъекта + 116 + + <key>ru</key> + <value>Реквизиты</value> + + true + true + + true + + + РеквизитыОбъекта + + None + + РеквизитыОбъектаПредставление + 126 + + <key>ru</key> + <value>Реквизит</value> + + true + true + + true + + + РеквизитыОбъекта.Представление + + + РеквизитыОбъектаПредставлениеРасширеннаяПодсказка + 128 + Label + true + true + + Left + + + + РеквизитыОбъектаПредставлениеКонтекстноеМеню + 127 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РеквизитыОбъектаИзменять + 123 + true + true + + true + + + РеквизитыОбъекта.Изменять + + None + + OnChange + Подключаемый_ПриИзмененииФлажка + + + РеквизитыОбъектаИзменятьРасширеннаяПодсказка + 125 + Label + true + true + + Left + + + + РеквизитыОбъектаИзменятьКонтекстноеМеню + 124 + true + + CheckBoxField + Auto + true + + StdPicture.Change + + Left + true + + + + РеквизитыОбъектаЗначение + 129 + true + true + + true + + + РеквизитыОбъекта.Значение + + + OnChange + Подключаемый_ЗначениеПриИзменении + + + РеквизитыОбъектаЗначениеРасширеннаяПодсказка + 131 + Label + true + true + + Left + + + + РеквизитыОбъектаЗначениеКонтекстноеМеню + 130 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + + РеквизитыОбъектаКоманднаяПанель + 118 + Left + + + BeforeRowChange + Подключаемый_ПередНачаломИзменения + + + РеквизитыОбъектаСтрокаПоиска + 233 + + РеквизитыОбъектаСтрокаПоискаРасширеннаяПодсказка + 235 + Label + true + true + + Left + + + + РеквизитыОбъектаСтрокаПоискаКонтекстноеМеню + 234 + true + + РеквизитыОбъекта + + true + + + + РеквизитыОбъектаСостояниеПросмотра + 236 + + РеквизитыОбъектаСостояниеПросмотраРасширеннаяПодсказка + 238 + Label + true + true + + Left + + + + РеквизитыОбъектаСостояниеПросмотраКонтекстноеМеню + 237 + true + + ViewStatusAddition + РеквизитыОбъекта + + true + + + + РеквизитыОбъектаУправлениеПоиском + 239 + + РеквизитыОбъектаУправлениеПоискомРасширеннаяПодсказка + 241 + Label + true + true + + Left + + + + РеквизитыОбъектаУправлениеПоискомКонтекстноеМеню + 240 + true + + SearchControlAddition + РеквизитыОбъекта + + true + + + + РеквизитыОбъектаРасширеннаяПодсказка + 119 + Label + true + true + + Left + + + + РеквизитыОбъектаКонтекстноеМеню + 117 + true + + true + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + false + true + Auto + Auto + true + true + true + true + + РеквизитыОбъекта.ВидОперации + + + CommonPicture.ВидыОпераций + + None + None + None + true + +
                + true + true + + true + + + <key>ru</key> + <value>Реквизиты</value> + + + ru + Реквизиты + + + РеквизитыРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + Page + + Vertical + auto + +
                + true + true + + true + + + <key>ru</key> + <value>Состав объекта</value> + + + ru + Состав объекта + + + СоставОбъектаРасширеннаяПодсказка + 113 + Label + true + true + + Left + + + Pages + + TabsOnTop + Auto + +
                + + ПояснениеОНастроенныхИзменениях + 196 + + <key>ru</key> + <value>Изменить реквизит Номенклатура табличной части Товары в тех строках выбранных элементов, которые удовлетворяют условиям отбора.</value> + + true + true + + true + + + ПояснениеОНастроенныхИзмененияхРасширеннаяПодсказка + 198 + Label + true + true + + Left + + + + ПояснениеОНастроенныхИзмененияхКонтекстноеМеню + 197 + true + + true + Label + true + 2 + true + + Left + + true true @@ -127,15 +831,16 @@ <key>ru</key> - <value>Группа кнопок</value> + <value>Изменяемые реквизиты</value> ru - Группа кнопок + Изменяемые реквизиты + 15 - ГруппаКнопокРасширеннаяПодсказка - 76 + ИзменяемыеРеквизитыРасширеннаяПодсказка + 184 Label true true @@ -145,336 +850,16 @@ UsualGroup + Vertical Auto + WeakSeparation true true + auto Auto Auto
                - - ТаблицаОпераций - 4 - true - true - - true - - - Объект.Операции - - None - Add - CancelSearch - Copy - CopyToClipboard - Delete - EndEdit - Find - MoveDown - MoveUp - OutputList - SortListAsc - SortListDesc - - ТаблицаОперацийПредставление - 27 - - <key>ru</key> - <value>Реквизит (свойство)</value> - - true - true - - true - - - Объект.Операции.Представление - - - ТаблицаОперацийПредставлениеРасширеннаяПодсказка - 91 - Label - true - true - - Left - - - - ТаблицаОперацийПредставлениеКонтекстноеМеню - 28 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - - ТаблицаОперацийИзменять - 42 - true - true - - true - - - Объект.Операции.Изменять - - None - - ru - Изменять - - - ТаблицаОперацийИзменятьРасширеннаяПодсказка - 93 - Label - true - true - - Left - - - - ТаблицаОперацийИзменятьКонтекстноеМеню - 43 - true - - CheckBoxField - true - - StdPicture.Change - - Left - true - - - - ТаблицаОперацийЗначение - 13 - - <key>ru</key> - <value>Новое значение</value> - - true - true - - true - - - Объект.Операции.Значение - - - ТаблицаОперацийЗначениеРасширеннаяПодсказка - 95 - Label - true - true - - Left - - - - ТаблицаОперацийЗначениеКонтекстноеМеню - 14 - true - - InputField - true - Left - true - - true - true - true - true - true - true - Normal - - - None - - ТаблицаОперацийКоманднаяПанель - 6 - Left - true - - - OnEditEnd - ТаблицаОперацийПриОкончанииРедактирования - - - Selection - ТаблицаОперацийВыбор - - - BeforeRowChange - ТаблицаОперацийПередНачаломИзменения - - - ТаблицаОперацийСтрокаПоиска - 82 - - ТаблицаОперацийСтрокаПоискаРасширеннаяПодсказка - 84 - Label - true - true - - Left - - - - ТаблицаОперацийСтрокаПоискаКонтекстноеМеню - 83 - true - - ТаблицаОпераций - - true - - - - ТаблицаОперацийСостояниеПросмотра - 85 - - ТаблицаОперацийСостояниеПросмотраРасширеннаяПодсказка - 87 - Label - true - true - - Left - - - - ТаблицаОперацийСостояниеПросмотраКонтекстноеМеню - 86 - true - - ViewStatusAddition - ТаблицаОпераций - - true - - - - ТаблицаОперацийУправлениеПоиском - 88 - - ТаблицаОперацийУправлениеПоискомРасширеннаяПодсказка - 90 - Label - true - true - - Left - - - - ТаблицаОперацийУправлениеПоискомКонтекстноеМеню - 89 - true - - SearchControlAddition - ТаблицаОпераций - - true - - - - ТаблицаОперацийРасширеннаяПодсказка - 81 - Label - true - true - - Left - - - - ТаблицаОперацийКонтекстноеМеню - 5 - true - - HierarchicalList - true - true - true -
                true
                - 1 - 1 - AutoUse - AutoUse - true - true - Auto - Auto - true - true - true - true - - Объект.Операции.ВидОперации - - - CommonPicture.ВидыОпераций - - None - None - None - true - -
                - - ПодсказкаСтраницыДействий - 25 - - <key>ru</key> - <value> -Нажмите кнопку "Далее", чтобы перейти к просмотру изменяемых элементов списка (%1).</value> - - true - true - - true - - - ПодсказкаСтраницыДействийРасширеннаяПодсказка - 105 - Label - true - true - - Left - - - - ПодсказкаСтраницыДействийКонтекстноеМеню - 26 - true - - Label - true - true - - Left - - true true @@ -489,7 +874,7 @@ Настройка изменений - НастройкаИзмененийРасширеннаяПодсказка + НастройкаИзмененийExtendedTooltip 75 Label true @@ -507,281 +892,22 @@ ИзменениеОбъектов 3 - - ОбъектыДляИзменения - 29 + + НадписьРезультатыОбработки + 139 + + <key>ru</key> + <value>Изменено: 0 +Не удалось изменить: 0</value> + true true true - - ИзменяемыеОбъекты - - None - Add - Change - Copy - CopyToClipboard - Delete - EndEdit - HierarchicalList - List - MoveDown - MoveUp - OutputList - SortListAsc - SortListDesc - Tree - - ОбъектыДляИзмененияИзменять - 53 - - <key>ru</key> - <value> </value> - - true - true - - true - - - ИзменяемыеОбъекты.Изменять - - None - - ru - Изменять - - - ОбъектыДляИзмененияИзменятьРасширеннаяПодсказка - 120 - Label - true - true - - Left - - - - ОбъектыДляИзмененияИзменятьКонтекстноеМеню - 54 - true - - CheckBoxField - Auto - true - - StdPicture.Change - - Left - true - - - - ОбъектыДляИзмененияСсылка - 32 - true - true - - true - - - ИзменяемыеОбъекты.Ссылка - - - ОбъектыДляИзмененияСсылкаРасширеннаяПодсказка - 122 - Label - true - true - - Left - - - - ОбъектыДляИзмененияСсылкаКонтекстноеМеню - 33 - true - - InputField - true - Auto - true - Left - true - - true - true - true - true - true - true - Normal - - - Top - - ОбъектыДляИзмененияКоманднаяПанель - 31 - - ОбъектыДляИзмененияПометкаИзмененияПометитьВсе - 60 - true - true - - true - - - ОбъектыДляИзмененияПометкаИзмененияПометитьВсеРасширеннаяПодсказка - 107 - Label - true - true - - Left - - - Form.Command.ПометкаИзмененияПометитьВсе - Normal - Auto - true - true - UserCmds - Auto - - - ОбъектыДляИзмененияПометкаИзмененияСнятьВсе - 61 - true - true - - true - - - ОбъектыДляИзмененияПометкаИзмененияСнятьВсеРасширеннаяПодсказка - 108 - Label - true - true - - Left - - - Form.Command.ПометкаИзмененияСнятьВсе - Normal - Auto - true - true - UserCmds - Auto - - - ОбъектыДляИзмененияОткрытьОбъектПоСсылке - 59 - true - true - - true - - - ОбъектыДляИзмененияОткрытьОбъектПоСсылкеРасширеннаяПодсказка - 109 - Label - true - true - - Left - - - Form.Command.ОткрытьОбъектПоСсылке - Normal - Auto - true - true - UserCmds - Auto - - Left - - - Selection - ОбъектыДляИзмененияВыбор - - - ОбъектыДляИзмененияСтрокаПоиска - 111 - - ОбъектыДляИзмененияСтрокаПоискаРасширеннаяПодсказка - 113 - Label - true - true - - Left - - - - ОбъектыДляИзмененияСтрокаПоискаКонтекстноеМеню - 112 - true - - ОбъектыДляИзменения - - true - - - - ОбъектыДляИзмененияСостояниеПросмотра - 114 - - ОбъектыДляИзмененияСостояниеПросмотраРасширеннаяПодсказка - 116 - Label - true - true - - Left - - - - ОбъектыДляИзмененияСостояниеПросмотраКонтекстноеМеню - 115 - true - - ViewStatusAddition - ОбъектыДляИзменения - - true - - - - ОбъектыДляИзмененияУправлениеПоиском - 117 - - ОбъектыДляИзмененияУправлениеПоискомРасширеннаяПодсказка - 119 - Label - true - true - - Left - - - - ОбъектыДляИзмененияУправлениеПоискомКонтекстноеМеню - 118 - true - - SearchControlAddition - ОбъектыДляИзменения - - true - - - ОбъектыДляИзмененияРасширеннаяПодсказка - 110 + НадписьРезультатыОбработкиРасширеннаяПодсказка + 141 Label true true @@ -790,57 +916,64 @@ - ОбъектыДляИзмененияКонтекстноеМеню - 30 + НадписьРезультатыОбработкиКонтекстноеМеню + 140 true - Tree + Label true true - true -
                true
                - 1 - 1 - AutoUse - AutoUse - true - true - Auto - ExpandTopLevel - true - true - - ИзменяемыеОбъекты.КодКартинки - - - CommonPicture.ПиктограммыЭлементов - - None - None - None - true + + Left +
                - СтраницыПодсказокИзмененияОбъектов - 34 - - СтраницаПодсказкаПоКнопкеИзменить - 36 - - ПодсказкаПоКнопкеИзменить - 37 + ГруппаОбъектыКоторыеНеУдалосьИзменить + 158 + + ОбъектыКоторыеНеУдалосьИзменить + 145 + + <key>ru</key> + <value>Элементы, которые не удалось изменить</value> + + true + true + + true + + + ОбъектыКоторыеНеУдалосьИзменить + + Top + Add + CancelSearch + Copy + Delete + EndEdit + Find + MoveDown + MoveUp + SortListAsc + SortListDesc + + ОбъектыКоторыеНеУдалосьИзменитьОбъект + 155 <key>ru</key> - <value>Выберите элементы, которые нужно изменить.</value> + <value>Элемент</value> true true true + + ОбъектыКоторыеНеУдалосьИзменить.Объект + - ПодсказкаПоКнопкеИзменитьРасширеннаяПодсказка - 134 + ОбъектыКоторыеНеУдалосьИзменитьОбъектРасширеннаяПодсказка + 157 Label true true @@ -849,35 +982,186 @@ - ПодсказкаПоКнопкеИзменитьКонтекстноеМеню - 38 + ОбъектыКоторыеНеУдалосьИзменитьОбъектКонтекстноеМеню + 156 true - Label - true - 2 - true - - Left - Bottom + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal - true - true - - true - - - <key>ru</key> - <value>Страница подсказка по кнопке изменить</value> - - - ru - Страница подсказка по кнопке изменить - + + ОбъектыКоторыеНеУдалосьИзменитьПричина + 162 + true + true + + true + + + ОбъектыКоторыеНеУдалосьИзменить.Причина + + + ОбъектыКоторыеНеУдалосьИзменитьПричинаРасширеннаяПодсказка + 164 + Label + true + true + + Left + + + + ОбъектыКоторыеНеУдалосьИзменитьПричинаКонтекстноеМеню + 163 + true + + InputField + true + Auto + true + true + Left + true + + true + true + true + true + true + true + Normal + + + + ОбъектыКоторыеНеУдалосьИзменитьКоманднаяПанель + 147 + + ОбъектыКоторыеНеУдалосьИзменитьИзменить + 165 + + <key>ru</key> + <value>Открыть</value> + + true + true + + true + + + ОбъектыКоторыеНеУдалосьИзменитьИзменитьРасширеннаяПодсказка + 166 + Label + true + true + + Left + + + Form.Item.ОбъектыКоторыеНеУдалосьИзменить.StandardCommand.Change + Normal + PictureAndText + true + true + UserCmds + Auto + + Left + true + + + OnActivateRow + ОбъектыКоторыеНеУдалосьИзменитьПриАктивизацииСтроки + + + BeforeRowChange + ОбъектыКоторыеНеУдалосьИзменитьПередНачаломИзменения + + + ОбъектыКоторыеНеУдалосьИзменитьСтрокаПоиска + 253 + + ОбъектыКоторыеНеУдалосьИзменитьСтрокаПоискаРасширеннаяПодсказка + 255 + Label + true + true + + Left + + + + ОбъектыКоторыеНеУдалосьИзменитьСтрокаПоискаКонтекстноеМеню + 254 + true + + ОбъектыКоторыеНеУдалосьИзменить + + true + + + + ОбъектыКоторыеНеУдалосьИзменитьСостояниеПросмотра + 256 + + ОбъектыКоторыеНеУдалосьИзменитьСостояниеПросмотраРасширеннаяПодсказка + 258 + Label + true + true + + Left + + + + ОбъектыКоторыеНеУдалосьИзменитьСостояниеПросмотраКонтекстноеМеню + 257 + true + + ViewStatusAddition + ОбъектыКоторыеНеУдалосьИзменить + + true + + + + ОбъектыКоторыеНеУдалосьИзменитьУправлениеПоиском + 259 + + ОбъектыКоторыеНеУдалосьИзменитьУправлениеПоискомРасширеннаяПодсказка + 261 + Label + true + true + + Left + + + + ОбъектыКоторыеНеУдалосьИзменитьУправлениеПоискомКонтекстноеМеню + 260 + true + + SearchControlAddition + ОбъектыКоторыеНеУдалосьИзменить + + true + + - СтраницаПодсказкаПоКнопкеИзменитьРасширеннаяПодсказка - 133 + ОбъектыКоторыеНеУдалосьИзменитьРасширеннаяПодсказка + 148 Label true true @@ -885,95 +1169,95 @@ Left - Page - - Vertical - auto + + ОбъектыКоторыеНеУдалосьИзменитьКонтекстноеМеню + 146 + true + + true + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + true + true + true + true + None + None + None + true + +
                + + Причина + 142 + true + true + + true + + + Причина + + + ПричинаРасширеннаяПодсказка + 144 + Label + true + true + + Left + + + + ПричинаКонтекстноеМеню + 143 + true + + InputField + true + Enter + true + Left + true + + true + 5 + true + false + true + true + true + true + true + Normal - - СтраницаПодсказкаПослеИзмененияЕстьОшибки - 35 - - ПодсказкаПослеИзмененияЕстьОшибки - 39 - - <key>ru</key> - <value>Не удалось изменить элементы. Изменено %1 из %2.</value> - - true - true - - true - - - ПодсказкаПослеИзмененияЕстьОшибкиРасширеннаяПодсказка - 136 - Label - true - true - - Left - - - - ПодсказкаПослеИзмененияЕстьОшибкиКонтекстноеМеню - 40 - true - - Label - true - true - - Style.ПоясняющийОшибкуТекст - - - Left - - - - ПерейтиВЖурналРегистрации - 41 - true - true - - true - - - ПерейтиВЖурналРегистрацииРасширеннаяПодсказка - 137 - Label - true - true - - Left - - - Hyperlink - Form.Command.ПерейтиВЖурналРегистрации - Normal - Auto - true - true - UserCmds - Auto - + + ПерейтиВЖурналРегистрации + 160 + + <key>ru</key> + <value>Технические подробности</value> + true true true - - <key>ru</key> - <value>Страница подсказка после изменения есть ошибки</value> - - - ru - Страница подсказка после изменения есть ошибки - - СтраницаПодсказкаПослеИзмененияЕстьОшибкиРасширеннаяПодсказка - 135 + ПерейтиВЖурналРегистрацииРасширеннаяПодсказка + 161 Label true true @@ -981,82 +1265,14 @@ Left - Page - - Vertical - auto - - - - СтраницаПодсказкаУспешноеИзменение - 47 - - ПодсказкаУспешноеИзменение - 48 - - <key>ru</key> - <value>Изменение элементов успешно завершено: %n -</value> - - true - true - - true - - - ПодсказкаУспешноеИзменениеРасширеннаяПодсказка - 139 - Label - true - true - - Left - - - - ПодсказкаУспешноеИзменениеКонтекстноеМеню - 49 - true - - Label - true - true - - Style.ПоясняющийТекст - - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница подсказка успешное изменение</value> - - - ru - Страница подсказка успешное изменение - - - СтраницаПодсказкаУспешноеИзменениеРасширеннаяПодсказка - 138 - Label - true - true - - Left - - - Page - - Vertical - auto - + Hyperlink + Form.Command.ПерейтиВЖурналРегистрации + Normal + Auto + true + true + UserCmds + Auto true true @@ -1065,16 +1281,15 @@
                <key>ru</key> - <value>Страницы подсказок изменения объектов</value> + <value>Группа объекты которые не удалось изменить</value> ru - Страницы подсказок изменения объектов + Группа объекты которые не удалось изменить - true - СтраницыПодсказокИзмененияОбъектовРасширеннаяПодсказка - 132 + ГруппаОбъектыКоторыеНеУдалосьИзменитьРасширеннаяПодсказка + 159 Label true true @@ -1082,8 +1297,13 @@ Left - Pages - + UsualGroup + + Vertical + Auto + true + true + Auto Auto
                @@ -1101,8 +1321,8 @@ Изменение объектов - ИзменениеОбъектовРасширеннаяПодсказка - 106 + ИзменениеОбъектовExtendedTooltip + 86 Label true true @@ -1132,8 +1352,8 @@ true - ДекорацияДлительнаяОперацияРасширеннаяПодсказка - 141 + ДекорацияДлительнаяОперацияExtendedTooltip + 102 Label true true @@ -1171,8 +1391,8 @@ true - ДекорацияПоясняющийТекстДлительнойОперацииРасширеннаяПодсказка - 142 + ДекорацияПоясняющийТекстДлительнойОперацииExtendedTooltip + 103 Label true true @@ -1210,8 +1430,8 @@ Ожидание обработки - ОжиданиеОбработкиРасширеннаяПодсказка - 140 + ОжиданиеОбработкиExtendedTooltip + 101 Label true true @@ -1238,7 +1458,7 @@ Страницы - СтраницыРасширеннаяПодсказка + СтраницыExtendedTooltip 74 Label true @@ -1252,159 +1472,196 @@ Auto + + КоманднаяПанель + 213 + + КнопкиСлева + 209 + + ФормаНазад + 203 + true + true + + true + + + ФормаНазадРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки слева</value> + + + ru + Кнопки слева + + + КнопкиСлеваРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + CommandBar + + Left + + + + КнопкиСправа + 211 + + ФормаИзменить + 22 + + <key>ru</key> + <value>Изменить реквизиты</value> + + true + true + + true + + + ФормаИзменитьExtendedTooltip + 71 + Label + true + true + + Left + + + Form.Command.Изменить + Auto + true + true + true + UserCmds + Auto + + + ФормаСправка + 63 + true + true + + true + + + ФормаСправкаExtendedTooltip + 73 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Кнопки справа</value> + + + ru + Кнопки справа + + + КнопкиСправаРасширеннаяПодсказка + 212 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + + КоманднаяПанельРасширеннаяПодсказка + 214 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + Bottom true ФормаКоманднаяПанель -1 - - ФормаНазад - 23 - true - true - - true - - - ФормаНазадРасширеннаяПодсказка - 69 - Label - true - true - - Left - - - Form.Command.Назад - Normal - Auto - true - true - UserCmds - Auto - - - ФормаДалее - 21 - true - true - - true - - - ФормаДалееРасширеннаяПодсказка - 70 - Label - true - true - - Left - - - Form.Command.Далее - Normal - Auto - true - true - UserCmds - Auto - - - ФормаИзменить - 22 - - <key>ru</key> - <value>Изменить</value> - - true - true - - true - - - ФормаИзменитьРасширеннаяПодсказка - 71 - Label - true - true - - Left - - - Form.Command.Изменить - Auto - true - true - true - UserCmds - Auto - - - ФормаОтмена - 20 - - <key>ru</key> - <value>Закрыть</value> - - true - true - - true - - - ФормаОтменаРасширеннаяПодсказка - 72 - Label - true - true - - Left - - - Form.StandardCommand.Cancel - Normal - Auto - true - true - UserCmds - Auto - - - ФормаСправка - 63 - true - true - - true - - - ФормаСправкаРасширеннаяПодсказка - 73 - Label - true - true - - Left - - - Form.StandardCommand.Help - Normal - Auto - true - true - UserCmds - Auto - - Right + Left ChoiceProcessing ОбработкаВыбора - - OnOpen - ПриОткрытии - OnCreateAtServer ПриСозданииНаСервере @@ -1415,8 +1672,6 @@ 70 LockOwner - Use - UseList true true Vertical @@ -1445,138 +1700,6 @@ Объект.ПрерыватьПриОшибке
                true
                - - - Объект.Операции - - - ОписаниеТипов - - <key>ru</key> - <value>Описание типов</value> - - 1 - - TypeDescription - - - true - - - true - - - - - - ИзменяемыеОбъекты - - <key>ru</key> - <value>Изменяемые объекты</value> - - 2 - - ValueTree - - - true - - - true - - - Ссылка - - <key>ru</key> - <value>Ссылка</value> - - 1 - - AnyRef - - - true - - - true - - - - КодОшибки - - <key>ru</key> - <value>Код ошибки</value> - - 2 - - Number - - 2 - true - - - - true - - - true - - - - Изменять - - <key>ru</key> - <value>Изменять</value> - - 3 - - Boolean - - - true - - - true - - - - КодКартинки - - <key>ru</key> - <value>Код картинки</value> - - 4 - - Number - - 1 - true - - - - true - - - true - - - - ЭтоГруппа - - <key>ru</key> - <value>Это группа</value> - - 5 - - Boolean - - - true - - - true - - ТОНастройкаПорции @@ -1676,24 +1799,6 @@ true - - ТекущийПользователь - - <key>ru</key> - <value>Текущий пользователь</value> - - 8 - - CatalogRef.ВнешниеПользователи - CatalogRef.Пользователи - - - true - - - true - - ТекущееСостояниеИзменения @@ -1913,11 +2018,504 @@ <common>true</common> </edit> </attributes> + <attributes> + <name>ВидИзменяемыхОбъектов</name> + <title> + <key>ru</key> + <value>Изменять</value> + + 22 + + String + + + + true + + + true + + + + КомпоновщикНастроек + + <key>ru</key> + <value>Компоновщик настроек</value> + + 23 + + DataCompositionSettingsComposer + + + true + + + true + + + + РеквизитыОбъекта + + <key>ru</key> + <value>Реквизиты объекта</value> + + 24 + + ValueTable + + + true + + + true + + + Имя + + <key>ru</key> + <value>Имя</value> + + 1 + + String + + + + true + + + true + + + + Изменять + + <key>ru</key> + <value>Изменять</value> + + 2 + + Boolean + + + true + + + true + + + + Представление + + <key>ru</key> + <value>Представление</value> + + 3 + + String + + + + true + + + true + + + + Значение + + <key>ru</key> + <value>Новое значение</value> + + 4 + + Boolean + String + Date + Number + AnyRef + + 10 + + + + Date + + + + true + + + true + + + + ДопустимыеТипы + + <key>ru</key> + <value>Допустимые типы</value> + + 5 + + TypeDescription + + + true + + + true + + + + СвязиПараметровВыбора + + <key>ru</key> + <value>Связи параметров выбора</value> + + 6 + + String + + + + true + + + true + + + + ВыборГруппИЭлементов + + <key>ru</key> + <value>Выбор групп и элементов</value> + + 7 + + String + + 15 + + + + true + + + true + + + + ЗаблокированныйРеквизит + + <key>ru</key> + <value>Заблокированный реквизит</value> + + 8 + + Boolean + + + true + + + true + + + + ВидОперации + + <key>ru</key> + <value>Вид операции</value> + + 9 + + Number + + 1 + true + + + + true + + + true + + + + Свойство + + <key>ru</key> + <value>Свойство</value> + + 10 + + ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения + + + true + + + true + + + + ПараметрыВыбора + + <key>ru</key> + <value>Параметры выбора</value> + + 11 + + String + + + + true + + + true + + + + + ТабличныеЧастиОбъекта + + <key>ru</key> + <value>Табличные части объекта</value> + + 25 + + ValueList + + + true + + + true + + + + + + + Причина + + <key>ru</key> + <value>Причина</value> + + 27 + + String + + + + true + + + true + + + + ОбъектыКоторыеНеУдалосьИзменить + + <key>ru</key> + <value>Объекты которые не удалось изменить</value> + + 28 + + ValueTable + + + true + + + true + + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + String + AnyRef + + + + true + + + true + + + + Причина + + <key>ru</key> + <value>Причина</value> + + 2 + + String + + + + true + + + true + + + + + ПредставлениеИзменяемыхОбъектов + + <key>ru</key> + <value>Изменять</value> + + 29 + + String + + + + true + + + true + + + + АдресСпискаВыбранных + + <key>ru</key> + <value>Адрес списка выбранных</value> + + 30 + + String + + + + true + + + true + + + + КонтекстныйВызов + + <key>ru</key> + <value>Контекстный вызов</value> + + 31 + + Boolean + + + true + + + + + ВыбранныеОбъектыВКонтексте + + <key>ru</key> + <value>Выбранные объекты в контексте</value> + + 26 + + ValueList + + + true + + + true + + + + + + + ОбработкаЗавершена + + <key>ru</key> + <value>Обработка завершена</value> + + 32 + + Boolean + + + true + + + true + + + + ЭтоВнешняяОбработка + + <key>ru</key> + <value>Это внешняя обработка</value> + + 2 + + Boolean + + + true + + + true + + + + ВремяНачалаИзменения + + <key>ru</key> + <value>Время начала изменения</value> + + 8 + + Date + + Date + + + + true + + + true + + + + ДополнительнаяОбработкаСсылка + + <key>ru</key> + <value>Дополнительная обработка ссылка</value> + + 33 + + CatalogRef.ДополнительныеОтчетыИОбработки + + + true + + + Назад <key>ru</key> - <value><< Назад</value> + <value>< Назад</value> 1 @@ -2020,14 +2618,7 @@ Перейти в журнал регистрации - - true - Role.ПолныеПрава - - - true - Role.ПросмотрЖурналаРегистрации - + true @@ -2060,100 +2651,19 @@ Auto - ИсторияОпераций + Заглушка <key>ru</key> - <value>История</value> + <value><Нет></value> - 7 + 12 ru - Окрыть список ранее выполненных действий + Заглушка true - - StdPicture.MoveDown - - - - ИсторияОпераций - - - TextPicture - Auto - Auto - - - ОткрытьОбъектПоСсылке - - <key>ru</key> - <value>Открыть элемент</value> - - 8 - - ru - Открыть элемент по ссылке - - - true - - - - ОткрытьОбъектПоСсылкеОбработчикКоманды - - - Auto - Auto - - - ПометкаИзмененияПометитьВсе - - <key>ru</key> - <value>Пометить все</value> - - 9 - - ru - Пометить все элементы для изменения - - - true - - - StdPicture.CheckAll - - - - ПометкаИзмененияПометитьВсе - - - Auto - Auto - - - ПометкаИзмененияСнятьВсе - - <key>ru</key> - <value>Снять все</value> - - 10 - - ru - Снять пометку изменения со всех элементов - - - true - - - StdPicture.UncheckAll - - - - ПометкаИзмененияСнятьВсе - - Auto Auto diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl index 7d7077ee5..48ccef198 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Forms/Форма/Module.bsl @@ -1,29 +1,3 @@ -//////////////////////////////////////////////////////////////////////////////// -// Создаваемые реквизиты в реквизите ИзменяемыеОбъекты имеют имена Реквизит_<поля> -// Создаваемые поля на форме в таблице формы ОбъектыДляИзменения имеют имена Элемент_<имя> -// -// ОПИСАНИЕ РЕКВИЗИТОВ -// -// --- Настройки транзакционной обработки --------------------------------------- -// ТОНастройкаПорции - число -// 1 - одной порцией -// 2 - порциями по числу объектов -// 3 - порциями по проценту объектов -// ТОПроцентОбъектовВПорции - содержит значение если НастройкаПорцииИзменения = 2 -// ТОЧислоОбъектовВПорции - содержит значение если НастройкаПорцииИзменения = 3 -// ------------------------------------------------------------------------------ -// -// --- Изменение блокируемых реквизитов ----------------------------------------- -// ЕстьФормаРазблокированияРеквизитов - имеет смысл использовать для объектов -// с блокируемыми реквизитами, Истина - если есть форма, для работы -// с блокируемыми реквизитами (ФормаРаботыСБлокируемымиРеквизитами). -// -// ПолноеИмяФормыРаботыСБлокируемымиРеквизитами - строка - полное имя формы для использования -// в функции ОткрытьФорму, Например, -// "Справочник.Номенклатура.Форма.ФормаРаботыСБлокируемымиРеквизитами" -// ------------------------------------------------------------------------------ -//////////////////////////////////////////////////////////////////////////////// - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -34,100 +8,69 @@ Возврат; КонецЕсли; - НекорректныйВызовОбработки = ТипЗнч(Параметры.МассивОбъектов) <> Тип("Массив"); - Если НекорректныйВызовОбработки Тогда - Возврат; - КонецЕсли; + Параметры.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработкаСсылка); - ТипПереданногоОбъекта = ТипЗнч(Параметры.МассивОбъектов[0]); - КоличествоОбъектов = Параметры.МассивОбъектов.Количество(); - ШаблонЗаголовка = НСтр("ru = 'Изменение выделенных элементов ""%1"" (%2)'"); - Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ШаблонЗаголовка, ТипПереданногоОбъекта, КоличествоОбъектов); - - ЗапретРедактированияВстроен = Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.ЗапретРедактированияРеквизитовОбъектовКлиент") <> Неопределено; - СвойстваВстроены = Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеСвойствами") <> Неопределено; - - // При отсутствии права сохранения настроек необходимо спрятать весь функционал работы с настройками - Элементы.ИсторияОпераций.Видимость = ПравоДоступа("СохранениеДанныхПользователя", Метаданные); - - // Оптимизация, для того, что бы не переформировывать таблицу - // изменяемых объектов при простом перелистывании - ИзменитьТаблицуОбъектов = Ложь; - - МетаданныеОбъекта = Параметры.МассивОбъектов[0].Метаданные(); - - ПолноеИмя = МетаданныеОбъекта.ПолноеИмя(); - - ТекущийПользователь = Пользователи.АвторизованныйПользователь(); - - // Подгружаем настройки обработки ЗагрузитьНастройкиОбработки(); - - // Подгружаем историю операций с данным типом объектов - ЗагрузитьИсториюОпераций(); - - // Устанавливаем заголовок для таблицы изменяемых объектов - Элементы.ОбъектыДляИзмененияСсылка.Заголовок = МетаданныеОбъекта.Синоним; - - // Объект иерархический - УчитыватьИерархию = ОбъектМетаданныхИерархический(Параметры.МассивОбъектов[0]); - ИерархияГрупп = ИерархияГруппИЭлементов(Параметры.МассивОбъектов[0]); - - // По переданному составу объектов и типу объекта заполнить допустимые действия с объектом - ЗаполнитьДеревоОбъектовИОпераций(); - - // Если нет заблокированных реквизитов скрываем кнопку "РазрешитьРедактированиеРеквизитов" - Если НЕ ЗапретРедактированияВстроен - ИЛИ Объект.Операции.НайтиСтроки( - Новый Структура("ЗаблокированныйРеквизит", Истина) ).Количество() = 0 Тогда - Если Элементы.Найти("РазрешитьРедактированиеРеквизитов") <> Неопределено Тогда - Элементы.РазрешитьРедактированиеРеквизитов.Видимость = Ложь; - КонецЕсли; + Элементы.ПерейтиВЖурналРегистрации.Видимость = ПравоДоступа("Администрирование", Метаданные) И ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность"); + КонтекстныйВызов = ТипЗнч(Параметры.МассивОбъектов) = Тип("Массив"); + Элементы.ОтборОбъектов.Видимость = Не КонтекстныйВызов; + Элементы.ФормаНазад.Видимость = Ложь; + Если КонтекстныйВызов Тогда + ВыполнитьДействияПриКонтекстномОткрытии(); Иначе - Если МетаданныеОбъекта.Формы.Найти("РазблокированиеРеквизитов") = Неопределено Тогда - ЕстьФормаРазблокированияРеквизитов = Ложь; - Иначе - ЕстьФормаРазблокированияРеквизитов = Истина; - ПолноеИмяФормыРаботыСБлокируемымиРеквизитами = ПолноеИмя + ".Форма.РазблокированиеРеквизитов"; - КонецЕсли; - + Заголовок = НСтр("ru = 'Групповое изменение реквизитов'"); КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - Если НекорректныйВызовОбработки Тогда - Отказ = Истина; - Предупреждение(НСтр("ru = 'Самостоятельное использование формы не предусмотрено.'")); - Возврат; - КонецЕсли; - + РежимОткрытияОкна = ?(КонтекстныйВызов, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца, РежимОткрытияОкнаФормы.Независимый); + СформироватьПояснениеОНастроенныхИзменениях(); + ОбновитьВидимостьЭлементов(); КонецПроцедуры &НаКлиенте Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора) - Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.ГрупповоеИзменениеОбъектов.Форма.Настройка") Тогда - - ПереформироватьСоставОперацийИДеревоОбъектов = Ложь; + Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.ГрупповоеИзменениеОбъектов.Форма.ДополнительныеПараметры") Тогда + ПерезаполнитьСтруктуруРеквизитовОбъекта = Ложь; Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда Если УчитыватьИерархию И ОбрабатыватьРекурсивно <> ВыбранноеЗначение.ОбрабатыватьРекурсивно Тогда ОбрабатыватьРекурсивно = ВыбранноеЗначение.ОбрабатыватьРекурсивно; - ПереформироватьСоставОперацийИДеревоОбъектов = Истина; + ПерезаполнитьСтруктуруРеквизитовОбъекта = Истина; КонецЕсли; Объект.ИзменятьВТранзакции = ВыбранноеЗначение.ИзменятьВТранзакции; Объект.ПрерыватьПриОшибке = ВыбранноеЗначение.ПрерыватьПриОшибке; + + Если Объект.ПоказыватьСлужебныеРеквизиты <> ВыбранноеЗначение.ПоказыватьСлужебныеРеквизиты Тогда + Объект.ПоказыватьСлужебныеРеквизиты = ВыбранноеЗначение.ПоказыватьСлужебныеРеквизиты; + ПерезаполнитьСтруктуруРеквизитовОбъекта = Истина; + КонецЕсли; + ТОНастройкаПорции = ВыбранноеЗначение.НастройкаПорции; ТОПроцентОбъектовВПорции = ВыбранноеЗначение.ПроцентОбъектовВПорции; ТОЧислоОбъектовВПорции = ВыбранноеЗначение.ЧислоОбъектовВПорции; + + Если ПерезаполнитьСтруктуруРеквизитовОбъекта И Не ПустаяСтрока(ВидИзменяемыхОбъектов) Тогда + СохраненныеНастройки = Неопределено; + ЗагрузитьМетаданныеОбъекта(Истина, СохраненныеНастройки); + Если СохраненныеНастройки <> Неопределено Тогда + УстановитьНастройкуИзменения(СохраненныеНастройки); + КонецЕсли; + КонецЕсли; + + ОбновитьВидимостьЭлементов(); КонецЕсли; - Если ПереформироватьСоставОперацийИДеревоОбъектов Тогда - ЗаполнитьДеревоОбъектовИОпераций(); + ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами) Тогда + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") И ВыбранноеЗначение.Количество() > 0 Тогда + + ЗаблокированныеРеквизитыСтроки = РеквизитыОбъекта.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)); + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + Если ОписаниеОперацииСтрока.ЗаблокированныйРеквизит И ВыбранноеЗначение.Найти(ОписаниеОперацииСтрока.ИмяРеквизита) <> Неопределено Тогда + ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + КонецЕсли; + КонецЦикла; + КонецЕсли; КонецЕсли; @@ -143,7 +86,7 @@ КонецЕсли; СохранитьНастройкиОбработки( - ПолноеИмя, + ВидИзменяемыхОбъектов, Объект.ИзменятьВТранзакции, Объект.ПрерыватьПриОшибке, ТОНастройкаПорции, @@ -154,53 +97,63 @@ КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ТаблицаОпераций +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ &НаКлиенте -Процедура ТаблицаОперацийПередНачаломИзменения(Элемент, Отказ) - - Если (Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийИзменять" - ИЛИ Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийЗначение") - И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда - ВопросПерейтиКРазблокированиюРеквизитов(); - Отказ = Истина; - Возврат; - КонецЕсли; - - УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент); - +Процедура ВидИзменяемыхОбъектовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + ОписаниеОповещения = Новый ОписаниеОповещения("ВидИзменяемыхОбъектовВыборСделан", ЭтотОбъект); + ПараметрыФормы = Новый Структура; + ПараметрыФормы.Вставить("ТекущийОбъект", ВидИзменяемыхОбъектов); + ПараметрыФормы.Вставить("ПоказыватьСкрытые", Объект.ПоказыватьСлужебныеРеквизиты); + ОткрытьФорму(ПолноеИмяФормы("ВыборВидаОбъектов"), ПараметрыФормы, , , , , ОписаниеОповещения); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ КомпоновщикНастроекНастройкиОтбор + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) + ПодключитьОбработчикОжидания("ОбновитьНадписи", 1, Истина); КонецПроцедуры &НаКлиенте -Процедура ТаблицаОперацийВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - Если Поле.Имя = "ТаблицаОперацийЗначение" - И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда - - ВопросПерейтиКРазблокированиюРеквизитов(); - СтандартнаяОбработка = Ложь; - - Возврат; - - КонецЕсли; - - УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент); - +Процедура ОбновитьНадписи() + ОбновитьНадписиСервер(); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьНадписиСервер() + ОбновитьНадписьКоличествоВыбранных(); + СформироватьПояснениеОНастроенныхИзменениях(); КонецПроцедуры &НаКлиенте -Процедура ТаблицаОперацийПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) - - Если ОтменаРедактирования Тогда - Возврат; +Процедура КомпоновщикНастроекНастройкиОтборПослеУдаления(Элемент) + ОбновитьНадписи(); +КонецПроцедуры + +&НаКлиенте +Процедура КомпоновщикНастроекНастройкиОтборПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование) + ОтключитьОбработчикОжидания("ОбновитьНадписи"); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ ОбъектыКоторыеНеУдалосьИзменить + +&НаКлиенте +Процедура ОбъектыКоторыеНеУдалосьИзменитьПередНачаломИзменения(Элемент, Отказ) + Отказ = Истина; + Если ТипЗнч(Элемент.ТекущиеДанные.Объект) <> Тип("Строка") Тогда + ПоказатьЗначение(, Элемент.ТекущиеДанные.Объект); КонецЕсли; - - Если Элемент.ТекущийЭлемент.Имя = "ТаблицаОперацийЗначение" Тогда - Элемент.ТекущиеДанные.Изменять = ЗначениеЗаполнено(Элемент.ТекущиеДанные.Значение); +КонецПроцедуры + +&НаКлиенте +Процедура ОбъектыКоторыеНеУдалосьИзменитьПриАктивизацииСтроки(Элемент) + Если Элемент.ТекущиеДанные <> Неопределено Тогда + Причина = Элемент.ТекущиеДанные.Причина; КонецЕсли; - - ИзменитьТаблицуОбъектов = Истина; - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -216,60 +169,55 @@ &НаКлиенте Процедура Изменить(Команда) - Если Не ВыполняетсяОбработка Тогда - - Если Объект.Операции.НайтиСтроки(Новый Структура("Изменять", Истина)).Количество() = 0 Тогда - - ТекстВопроса = НСтр("ru = 'Не задано ни одного действия. Выполнить перезапись данных без изменений?'"); - Результат = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ОКОтмена, , , - НСтр("ru = 'Изменение элементов'")); - - Если Результат <> КодВозвратаДиалога.ОК Тогда - Возврат; - КонецЕсли; - + НазначениеКнопки = "Изменить"; + Если ВыполняетсяОбработка Тогда + НазначениеКнопки = "Прервать"; + ИначеЕсли ОбработкаЗавершена Или Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов Тогда + НазначениеКнопки = "Закрыть"; + Если ОбъектыКоторыеНеУдалосьИзменить.Количество() > 0 Тогда + НазначениеКнопки = "Повторить"; КонецЕсли; - - УстановитьКнопкиНаВремяИзменения(Истина); - ПерейтиНаСтраницуИзмененияОбъектов(); - ПодключитьОбработчикОжидания("ИзменитьОбъекты", 0.1, Истина); - - ИначеЕсли ТекущееСостояниеИзменения <> Неопределено Тогда - + КонецЕсли; + + Если НазначениеКнопки = "Закрыть" Тогда + Закрыть(); + Возврат; + КонецЕсли; + + Если НазначениеКнопки = "Прервать" Тогда Если Не РезультатФоновогоЗадания.ЗаданиеВыполнено Тогда ОтключитьОбработчикОжидания("ПроверитьВыполнениеИзменения"); ЗавершитьИзменениеОбъектов(); Иначе ТекущееСостояниеИзменения.ПрерватьИзменение = Истина; КонецЕсли; - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ИсторияОпераций(Команда) - - СтандартнаяОбработка = Ложь; - - Если ИсторияОперацийСписок.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Изменение элементов не выполнялось ранее.'")); Возврат; КонецЕсли; - СписокЗначений = Новый СписокЗначений; - - Для Каждого ОписаниеИзменения Из ИсторияОперацийСписок Цикл - СписокЗначений.Добавить(ОписаниеИзменения.Значение, ОписаниеИзменения.Представление); - КонецЦикла; - - Выбор = ВыбратьИзМеню(СписокЗначений, Элементы.ИсторияОпераций); - - Если Выбор <> Неопределено Тогда - УстановитьОперацииИзменения(Выбор.Значение); + Если НазначениеКнопки = "Изменить" Или НазначениеКнопки = "Повторить" Тогда + КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(Истина, Истина); // сброс кеша и выбор объектов с табличными частями КонецЕсли; - ИзменитьТаблицуОбъектов = Истина; + Если НазначениеКнопки = "Изменить" Тогда + Если КоличествоОбъектовДляОбработки = 0 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Не указаны элементы для изменения'")); + Возврат; + КонецЕсли; + + Если ЕстьНастроенныеОтборы() Тогда + ВыполнитьИзменениеПроверкаОтбораВыполнена(); + Иначе + ТекстВопроса = НСтр("ru = 'Отбор не задан. Изменить все элементы?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьИзменениеПроверкаОтбораВыполнена", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена, , , НСтр("ru = 'Изменение элементов'")); + КонецЕсли; + + Возврат; + КонецЕсли; + + Если НазначениеКнопки = "Повторить" Тогда + ВыполнитьИзменениеПроверкиВыполнены(); + КонецЕсли; КонецПроцедуры @@ -278,9 +226,14 @@ Если Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов Тогда Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаИзменений; - УстановитьСостояниеЭлементовФормы(Элементы); КонецЕсли; + ОбъектыКоторыеНеУдалосьИзменить.Очистить(); + Элементы.ФормаНазад.Видимость = Ложь; + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Изменить реквизиты'"); + + ОбновитьНадписи(); + КонецПроцедуры &НаКлиенте @@ -295,39 +248,20 @@ ПараметрыФормы.Вставить("ПроцентОбъектовВПорции", ТОПроцентОбъектовВПорции); ПараметрыФормы.Вставить("ЧислоОбъектовВПорции", ТОЧислоОбъектовВПорции); ПараметрыФормы.Вставить("УчитыватьИерархию", УчитыватьИерархию); + ПараметрыФормы.Вставить("ПоказыватьСлужебныеРеквизиты", Объект.ПоказыватьСлужебныеРеквизиты); + ПараметрыФормы.Вставить("КонтекстныйВызов", КонтекстныйВызов); - ОткрытьФорму("Обработка.ГрупповоеИзменениеОбъектов.Форма.Настройка", ПараметрыФормы, ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьОбъектПоСсылкеОбработчикКоманды(Команда) - - ОткрытьОбъектПоСсылке(); + ОткрытьФорму(ПолноеИмяФормы("ДополнительныеПараметры"), ПараметрыФормы, ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ПерейтиВЖурналРегистрации(Команда) - - ПараметрыФормы = Новый Структура("Пользователь", ТекущийПользователь); - - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма", ПараметрыФормы, ЭтаФорма); - -КонецПроцедуры - -&НаКлиенте -Процедура ПометкаИзмененияПометитьВсе(Команда) - - УстановитьЗначениеПометкиИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), Истина); - -КонецПроцедуры - -&НаКлиенте -Процедура ПометкаИзмененияСнятьВсе(Команда) - - УстановитьЗначениеПометкиИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), Ложь); - + Если ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда + НастройкаОтбора = Новый Структура("Пользователь", ТекущийПользователь()); + МодульЖурналРегистрацииКлиент = ОбщийМодуль("ЖурналРегистрацииКлиент"); + МодульЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(НастройкаОтбора, ЭтаФорма); + КонецЕсли; КонецПроцедуры &НаКлиенте @@ -337,12 +271,158 @@ КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// ПОДКЛЮЧАЕМЫЕ ОБРАБОТЧИКИ + +&НаКлиенте +Процедура Подключаемый_ЗначениеПриИзменении(ПолеФормы) + ТекущиеДанные = ПолеФормы.Родитель.ТекущиеДанные; + ТекущиеДанные.Изменять = ЗначениеЗаполнено(ТекущиеДанные.Значение); + ОбновитьСчетчикиИзменяемыхРеквизитов(ПолеФормы.Родитель); + СформироватьПояснениеОНастроенныхИзменениях(); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПриИзмененииФлажка(ПолеФормы) + ОбновитьСчетчикиИзменяемыхРеквизитов(ПолеФормы.Родитель); + СформироватьПояснениеОНастроенныхИзменениях(); +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_УстановитьНастройку(Команда) + + МестоРазмещенияКоманд = Элементы.РанееИзмененныеРеквизиты; + ШаблонИмениКоманды = МестоРазмещенияКоманд.Имя + "НастройкаИзменений"; + ИндексКоманды = Число(Сред(Команда.Имя, СтрДлина(ШаблонИмениКоманды) + 1)); + УстановитьНастройкуИзменения(ИсторияОперацийСписок[ИндексКоманды].Значение); + СформироватьПояснениеОНастроенныхИзменениях(); + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПередНачаломИзменения(Элемент, Отказ) + + УстановитьОграниченияВыбираемыхТиповИПараметрыВыбораЗначения(Элемент); + Если (Элемент.ТекущийЭлемент = Элементы.РеквизитыОбъектаЗначение + Или Элемент.ТекущийЭлемент = Элементы.РеквизитыОбъектаИзменять) + И Элемент.ТекущиеДанные.ЗаблокированныйРеквизит Тогда + Отказ = Истина; + ВопросПерейтиКРазблокированиюРеквизитов(); + КонецЕсли; + +КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -/////////////////////////////////////////////////////////////////////////////// -// Операции с историей изменений +&НаКлиенте +Процедура ВыполнитьИзменениеПроверкаОтбораВыполнена(РезультатВопроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + Если Не ЕстьНастроенныеИзменения() Тогда + ТекстВопроса = НСтр("ru = 'Изменения не настроены. Выполнить перезапись элементов без изменений?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ВыполнитьИзменениеПроверкиВыполнены", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ОКОтмена, , , НСтр("ru = 'Изменение элементов'")); + Иначе + ВыполнитьИзменениеПроверкиВыполнены(); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ЕстьНастроенныеОтборы() + Для Каждого ЭлементОтбора Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл + Если ЭлементОтбора.Использование Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; +КонецФункции + +&НаКлиенте +Функция ПолноеИмяФормы(Имя) + ЧастиИмени = РазложитьСтрокуВМассивПодстрок(ИмяФормы, "."); + ЧастиИмени[3] = Имя; + Возврат СтрокаИзМассиваПодстрок(ЧастиИмени, "."); +КонецФункции + +&НаСервере +Процедура ВыполнитьДействияПриКонтекстномОткрытии() + + ТипПереданногоОбъекта = ТипЗнч(Параметры.МассивОбъектов[0]); + КоличествоОбъектов = Параметры.МассивОбъектов.Количество(); + ШаблонЗаголовка = НСтр("ru = 'Изменение выделенных элементов ""%1"" (%2)'"); + Заголовок = ПодставитьПараметрыВСтроку(ШаблонЗаголовка, ТипПереданногоОбъекта, КоличествоОбъектов); + + ЗапретРедактированияВстроен = Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.ЗапретРедактированияРеквизитовОбъектовКлиент") <> Неопределено; + СвойстваВстроены = Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеСвойствами") <> Неопределено; + + // При отсутствии права сохранения настроек необходимо спрятать весь функционал работы с настройками + Элементы.РанееИзмененныеРеквизиты.Видимость = ПравоДоступа("СохранениеДанныхПользователя", Метаданные); + + Элементы.ИзменяемыеРеквизиты.Отображение = ОтображениеОбычнойГруппы.Нет; + Элементы.ИзменяемыеРеквизиты.ОтображатьЗаголовок = Ложь; + + МетаданныеОбъекта = Параметры.МассивОбъектов[0].Метаданные(); + ВидИзменяемыхОбъектов = МетаданныеОбъекта.ПолноеИмя(); + + // Подгружаем историю операций с данным типом объектов + ЗагрузитьИсториюОпераций(); + ЗаполнитьПодменюРанееИзмененныеРеквизиты(); + + // Объект иерархический + УчитыватьИерархию = ОбъектМетаданныхИерархический(Параметры.МассивОбъектов[0]); + ИерархияГрупп = ИерархияГруппИЭлементов(Параметры.МассивОбъектов[0]); + + ВыбранныеОбъектыВКонтексте.ЗагрузитьЗначения(Параметры.МассивОбъектов); + ИнициализироватьКомпоновщикНастроек(); + + // Если нет заблокированных реквизитов скрываем кнопку "РазрешитьРедактированиеРеквизитов" + Отбор = Новый Структура("ЗаблокированныйРеквизит", Истина); + + Если ЗапретРедактированияВстроен + И РеквизитыОбъекта.НайтиСтроки(Отбор).Количество() > 0 Тогда + Если МетаданныеОбъекта.Формы.Найти("РазблокированиеРеквизитов") = Неопределено Тогда + ЕстьФормаРазблокированияРеквизитов = Ложь; + Иначе + ЕстьФормаРазблокированияРеквизитов = Истина; + ПолноеИмяФормыРаботыСБлокируемымиРеквизитами = ВидИзменяемыхОбъектов + ".Форма.РазблокированиеРеквизитов"; + КонецЕсли; + КонецЕсли; + + ЗагрузитьМетаданныеОбъекта(); +КонецПроцедуры + +&НаСервере +Функция ТекущийПользователь() + Если ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда + МодульПользователи = ОбщийМодуль("Пользователи"); + Возврат МодульПользователи.АвторизованныйПользователь(); + КонецЕсли; +КонецФункции + +&НаКлиенте +Процедура ВыполнитьИзменениеПроверкиВыполнены(РезультатВопроса = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + УстановитьКнопкиНаВремяИзменения(Истина); + ПерейтиНаСтраницуИзмененияОбъектов(); + ОбъектыКоторыеНеУдалосьИзменить.Очистить(); + + ПодключитьОбработчикОжидания("ИзменитьОбъекты", 0.1, Истина); + +КонецПроцедуры + +&НаСервере +Функция ЕстьНастроенныеИзменения() + Возврат ИзменяемыеРеквизиты().Количество() > 0 Или ИзменяемыеТабличныеЧасти().Количество() > 0; +КонецФункции &НаСервере Процедура ДобавитьИзменениеВИсторию(СтруктураИзменения, ПредставлениеИзменения) @@ -350,9 +430,9 @@ // Настройки истории изменений это массив структур с ключами: // Изменение - массив со структурой изменения // Представление - представление настройки пользователю - Настройки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( + Настройки = ХранилищеОбщихНастроекЗагрузить( "ГрупповоеИзменениеОбъектов", - "ИсторияИзменений/"+ПолноеИмя); + "ИсторияИзменений/"+ВидИзменяемыхОбъектов); Если Настройки = Неопределено Тогда Настройки = Новый Массив; @@ -371,75 +451,28 @@ Настройки.Удалить(19); КонецЕсли; - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( - "ГрупповоеИзменениеОбъектов", - "ИсторияИзменений/"+ПолноеИмя, - Настройки); + ХранилищеОбщихНастроекСохранить("ГрупповоеИзменениеОбъектов", "ИсторияИзменений/"+ВидИзменяемыхОбъектов, Настройки); ЗагрузитьИсториюОпераций(); - + ЗаполнитьПодменюРанееИзмененныеРеквизиты(); КонецПроцедуры &НаСервере Процедура ЗагрузитьИсториюОпераций() - ИсторияОпераций = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( - "ГрупповоеИзменениеОбъектов", - "ИсторияИзменений/"+ПолноеИмя); + ИсторияОперацийСписок.Очистить(); - Если ИсторияОпераций = Неопределено Тогда + ИсторияИзменений = ХранилищеОбщихНастроекЗагрузить("ГрупповоеИзменениеОбъектов", "ИсторияИзменений/"+ВидИзменяемыхОбъектов); + Если ИсторияИзменений = Неопределено Тогда Возврат; КонецЕсли; - ИсторияОперацийСписок.Очистить(); - - Для Каждого ОписаниеОперации Из ИсторияОпераций Цикл - ИсторияОперацийСписок.Добавить(ОписаниеОперации.Изменение, ОписаниеОперации.Представление); + Для Каждого Настройка Из ИсторияИзменений Цикл + ИсторияОперацийСписок.Добавить(Настройка.Изменение, Настройка.Представление); КонецЦикла; КонецПроцедуры -&НаКлиенте -Процедура УстановитьОперацииИзменения(МассивОпераций) - - СброситьОперации(); - - ЕстьЗаблокированные = Ложь; - - Для Каждого ОписаниеИзменения Из МассивОпераций Цикл - - СтруктураПоиска = Новый Структура; - СтруктураПоиска.Вставить("ВидОперации", ОписаниеИзменения.ВидОперации); - - Если ОписаниеИзменения.ВидОперации = 1 Тогда // реквизит объекта - СтруктураПоиска.Вставить("ИмяРеквизита", ОписаниеИзменения.ИмяРеквизита); - Иначе - СтруктураПоиска.Вставить("Свойство", ОписаниеИзменения.Свойство); - КонецЕсли; - - НайденныеСтроки = Объект.Операции.НайтиСтроки(СтруктураПоиска); - - Если НайденныеСтроки.Количество() > 0 Тогда - Если НайденныеСтроки[0].ЗаблокированныйРеквизит Тогда - ЕстьЗаблокированные = Истина; - Продолжить; - КонецЕсли; - НайденныеСтроки[0].Значение = ОписаниеИзменения.Значение; - НайденныеСтроки[0].Изменять = Истина; - КонецЕсли; - - КонецЦикла; - - Если ЕстьЗаблокированные Тогда - Предупреждение(НСтр("ru = 'Некоторые реквизиты заблокированы для изменения, изменения не установлены.'")); - КонецЕсли; - -КонецПроцедуры - - -/////////////////////////////////////////////////////////////////////////////// -// Операции с элементами формы - &НаКлиенте Процедура ВопросПерейтиКРазблокированиюРеквизитов() @@ -449,9 +482,15 @@ Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Да'")); Кнопки.Добавить(КодВозвратаДиалога.Отмена, НСтр("ru = 'Отмена'")); - Результат = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, НСтр("ru = 'Реквизит заблокирован'")); + ОписаниеОповещения = Новый ОписаниеОповещения("ВопросПерейтиКРазблокированиюРеквизитовЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да, НСтр("ru = 'Реквизит заблокирован'")); - Если Результат = КодВозвратаДиалога.Да Тогда +КонецПроцедуры + +&НаКлиенте +Процедура ВопросПерейтиКРазблокированиюРеквизитовЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт + + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда РазрешитьРедактированиеРеквизитов(); КонецЕсли; @@ -464,7 +503,7 @@ ПараметрыВыбораСтрока = СтрПолучитьСтроку(ПараметрыВыбора, Индекс); - ПараметрыВыбораМассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПараметрыВыбораСтрока, ";"); + ПараметрыВыбораМассивСтрок = РазложитьСтрокуВМассивПодстрок(ПараметрыВыбораСтрока, ";"); ИмяПоляОтбора = СокрЛП(ПараметрыВыбораМассивСтрок[0]); ИмяТипа = СокрЛП(ПараметрыВыбораМассивСтрок[1]); XMLСтрока = СокрЛП(ПараметрыВыбораМассивСтрок[2]); @@ -473,11 +512,11 @@ Массив = Новый Массив; - XMLСтрокаМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(XMLСтрока, "%%"); + XMLСтрокаМассив = РазложитьСтрокуВМассивПодстрок(XMLСтрока, "%%"); Для Каждого Элемент Из XMLСтрокаМассив Цикл - ЭлементМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Элемент, "%"); + ЭлементМассив = РазложитьСтрокуВМассивПодстрок(Элемент, "%"); ЗначениеЭлемента = XMLЗначение(Тип(ЭлементМассив[0]), ЭлементМассив[1]); @@ -497,81 +536,14 @@ КонецПроцедуры -// Устанавливает ограничения выбираемых типов значений и параметры выбора -// -&НаКлиенте -Процедура УстановитьОграниченияВыбираемыхТиповИПараметрыВыбора(Элемент) - - Поле = Элемент.ПодчиненныеЭлементы.ТаблицаОперацийЗначение; - Поле.ОграничениеТипа = Элемент.ТекущиеДанные.ОписаниеТипов; - - ПараметрыВыбораМассив = Новый Массив; - - Если НЕ ПустаяСтрока(Элемент.ТекущиеДанные.ПараметрыВыбора) Тогда - УстановитьПараметрыВыбораСервер(Элемент.ТекущиеДанные.ПараметрыВыбора, ПараметрыВыбораМассив) - КонецЕсли; - - Если Не ПустаяСтрока(Элемент.ТекущиеДанные.СвязиПараметровВыбора) Тогда - - Для Индекс = 1 по СтрЧислоСтрок(Элемент.ТекущиеДанные.СвязиПараметровВыбора) Цикл - - СвязьПараметровВыбораСтрока = СтрПолучитьСтроку(Элемент.ТекущиеДанные.СвязиПараметровВыбора, Индекс); - РазложенныеСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СвязьПараметровВыбораСтрока, ";"); - ИмяПараметра = СокрЛП(РазложенныеСтроки[0]); - ИмяРеквизита = СокрЛП(РазложенныеСтроки[1]); - НайденныеСтроки = Объект.Операции.НайтиСтроки(Новый Структура("ВидОперации,ИмяРеквизита", 1, ИмяРеквизита)); - Если НайденныеСтроки.Количество() = 1 Тогда - Значение = НайденныеСтроки[0].Значение; - Если ЗначениеЗаполнено(Значение) Тогда - ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПараметра, Значение)); - КонецЕсли; - КонецЕсли; - - КонецЦикла; - - КонецЕсли; - - Если ЗначениеЗаполнено(Элемент.ТекущиеДанные.Свойство) Тогда - ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", Элемент.ТекущиеДанные.Свойство)); - КонецЕсли; - - Поле.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); - - ВыборГруппИЭлементов = Элемент.ТекущиеДанные.ВыборГруппИЭлементов; - - Если ВыборГруппИЭлементов <> "" Тогда - Если ВыборГруппИЭлементов = "Группы" Тогда - Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы; - ИначеЕсли ВыборГруппИЭлементов = "ГруппыИЭлементы" Тогда - Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы; - ИначеЕсли ВыборГруппИЭлементов = "Элементы" Тогда - Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Элементы; - Иначе - Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; - КонецЕсли; - Иначе - Поле.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбъектыДляИзмененияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - - Если Поле = Элементы.ОбъектыДляИзмененияСсылка Тогда - СтандартнаяОбработка = Ложь; - ОткрытьОбъектПоСсылке(); - КонецЕсли; - -КонецПроцедуры - -/////////////////////////////////////////////////////////////////////////////// -// Операции с формой - &НаСервереБезКонтекста Процедура СохранитьНастройкиОбработки(ПолноеИмя, ИзменятьВТранзакции, ПрерыватьПриОшибке, ТОНастройкаПорции, ТОПроцентОбъектовВПорции, ТОЧислоОбъектовВПорции, ОбрабатыватьРекурсивно) + Если Не ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Возврат; + КонецЕсли; + СтруктураНастроек = Новый Структура; СтруктураНастроек.Вставить("ИзменятьВТранзакции", ИзменятьВТранзакции); @@ -581,149 +553,61 @@ СтруктураНастроек.Вставить("ТОЧислоОбъектовВПорции", ТОЧислоОбъектовВПорции); СтруктураНастроек.Вставить("ОбрабатыватьРекурсивно", ОбрабатыватьРекурсивно); - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( - "Обработка.ГрупповоеИзменениеОбъектов", - ПолноеИмя, - СтруктураНастроек); + ХранилищеОбщихНастроекСохранить("Обработка.ГрупповоеИзменениеОбъектов", ПолноеИмя, СтруктураНастроек); КонецПроцедуры &НаСервере Процедура ЗагрузитьНастройкиОбработки() - СтруктураНастроек = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить( - "Обработка.ГрупповоеИзменениеОбъектов", - ПолноеИмя); - - Если СтруктураНастроек <> Неопределено Тогда - Объект.ИзменятьВТранзакции = СтруктураНастроек.ИзменятьВТранзакции; - Объект.ПрерыватьПриОшибке = СтруктураНастроек.ПрерыватьПриОшибке; - ТОНастройкаПорции = СтруктураНастроек.ТОНастройкаПорции; - ТОПроцентОбъектовВПорции = СтруктураНастроек.ТОПроцентОбъектовВПорции; - ТОЧислоОбъектовВПорции = СтруктураНастроек.ТОЧислоОбъектовВПорции; - ОбрабатыватьРекурсивно = СтруктураНастроек.ОбрабатыватьРекурсивно; - Возврат; - КонецЕсли; - Объект.ИзменятьВТранзакции = Истина; Объект.ПрерыватьПриОшибке = Истина; ТОНастройкаПорции = 1; ТОПроцентОбъектовВПорции = 100; ТОЧислоОбъектовВПорции = 1; ОбрабатыватьРекурсивно = Ложь; + ПоказыватьСлужебныеРеквизиты = Ложь; -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьДеревоОбъектовИОпераций() + СтруктураНастроек = ХранилищеОбщихНастроекЗагрузить( + "Обработка.ГрупповоеИзменениеОбъектов", + ВидИзменяемыхОбъектов); - МассивЗаполненных = Новый Массив; - ЗаполнитьМассивИзмененных(МассивЗаполненных, ИзменяемыеОбъекты.ПолучитьЭлементы()); - - // -------------------------------------------------------- - // сохраняем уже введенные операции, что бы перенести их - // в список операций при переформировании списка операций - // - - ВведенныеОперации = Новый ТаблицаЗначений; - ВведенныеОперации.Колонки.Добавить("ВидОперации", Новый ОписаниеТипов("Число")); - ВведенныеОперации.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); - ВведенныеОперации.Колонки.Добавить("Изменять", Новый ОписаниеТипов("Булево")); - ВведенныеОперации.Колонки.Добавить("Значение"); - - Если СвойстваВстроены Тогда - ВведенныеОперации.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + Если СтруктураНастроек <> Неопределено Тогда + Объект.ИзменятьВТранзакции = СтруктураНастроек.ИзменятьВТранзакции; + Объект.ПрерыватьПриОшибке = СтруктураНастроек.ПрерыватьПриОшибке; + ОбрабатыватьРекурсивно = СтруктураНастроек.ОбрабатыватьРекурсивно; + Если ПравоДоступа("АдминистрированиеДанных", Метаданные) И СтруктураНастроек.Свойство("ПоказыватьСлужебныеРеквизиты") Тогда + ПоказыватьСлужебныеРеквизиты = СтруктураНастроек.ПоказыватьСлужебныеРеквизиты; + Иначе + ПоказыватьСлужебныеРеквизиты = Ложь; + КонецЕсли; КонецЕсли; - Для Каждого ОписаниеОперации Из Объект.Операции.НайтиСтроки(Новый Структура("Изменять", Истина)) Цикл - ЗаполнитьЗначенияСвойств(ВведенныеОперации.Добавить(), ОписаниеОперации); - КонецЦикла; - - // - // -------------------------------------------------------- - - Объект.ОбъектыДляИзменения.Очистить(); - Объект.Операции.Очистить(); - ИзменяемыеОбъекты.ПолучитьЭлементы().Очистить(); - - ЗаполнитьДеревоОбъектовДляИзменения(МассивЗаполненных); - - ЗаполнитьСплошнойСписокОбъектовДляИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы()); - - ОбъектОбработка = РеквизитФормыВЗначение("Объект"); - ОбъектОбработка.ЗаполнитьТаблицуОперацийСОбъектом(); - - // -------------------------------------------------------- - // восстанавливаем значения сохраненных операций, - // если применимо - // - - Для Каждого ОписаниеОперации Из ОбъектОбработка.Операции Цикл - Отбор = Новый Структура; - Отбор.Вставить("ВидОперации", ОписаниеОперации.ВидОперации); - Если ОписаниеОперации.ВидОперации = 1 Тогда - Отбор.Вставить("ИмяРеквизита", ОписаниеОперации.ИмяРеквизита); - Иначе - Отбор.Вставить("Свойство", ОписаниеОперации.Свойство); - КонецЕсли; - НайденныеСтроки = ВведенныеОперации.НайтиСтроки(Отбор); - Если НайденныеСтроки.Количество() = 1 Тогда - НайденнаяСтрока = НайденныеСтроки[0]; - ОписаниеОперации.Изменять = НайденнаяСтрока.Изменять; - ОписаниеОперации.Значение = НайденнаяСтрока.Значение; - КонецЕсли; - КонецЦикла; - - // -------------------------------------------------------- - - ЗначениеВРеквизитФормы(ОбъектОбработка, "Объект"); - - Для Каждого Операция Из Объект.Операции Цикл - Операция.ОписаниеТипов = XMLЗначение(Тип("ХранилищеЗначения"), Операция.ДопустимыеТипы).Получить(); - КонецЦикла; - - УстановитьСостояниеЭлементовФормы(Элементы, Объект.ОбъектыДляИзменения.Количество()); - КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////// -// Обработчики команд - &НаКлиенте Процедура РазрешитьРедактированиеРеквизитов() - ЗаблокированныеРеквизитыСтроки = Объект.Операции.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)); + ЗаблокированныеРеквизитыСтроки = РеквизитыОбъекта.НайтиСтроки( + Новый Структура("ЗаблокированныйРеквизит", Истина)); Если ЕстьФормаРазблокированияРеквизитов Тогда + ЗаблокированныеРеквизиты = Новый Массив; + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + ЗаблокированныеРеквизиты.Добавить(ОписаниеОперацииСтрока.ИмяРеквизита); + КонецЦикла; + ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("РежимВыбора", Истина); - РазрешенныеРеквизиты = ОткрытьФормуМодально(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами, ПараметрыФормы, ЭтаФорма); - - Если ТипЗнч(РазрешенныеРеквизиты) = Тип("Массив") - И РазрешенныеРеквизиты.Количество() > 0 Тогда - - Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - Если ОписаниеОперацииСтрока.ЗаблокированныйРеквизит - И РазрешенныеРеквизиты.Найти(ОписаниеОперацииСтрока.ИмяРеквизита) <> Неопределено Тогда - ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; - КонецЕсли; - КонецЦикла; - - Если Объект.Операции.НайтиСтроки(Новый Структура("ЗаблокированныйРеквизит", Истина)).Количество() = 0 Тогда - Если Элементы.Найти("РазрешитьРедактированиеРеквизитов") <> Неопределено Тогда - Элементы.РазрешитьРедактированиеРеквизитов.Доступность = Ложь; - КонецЕсли; - КонецЕсли; - - КонецЕсли; - + ПараметрыФормы.Вставить("ЗаблокированныеРеквизиты", ЗаблокированныеРеквизиты); + ОткрытьФорму(ПолноеИмяФормыРаботыСБлокируемымиРеквизитами, ПараметрыФормы, ЭтотОбъект); Иначе МассивСсылок = Новый Массив; - - ЗаполнитьМассивИзменяемыхОбъектов(ИзменяемыеОбъекты.ПолучитьЭлементы(), МассивСсылок); + ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок); СинонимыРеквизитов = Новый Массив; @@ -731,32 +615,40 @@ СинонимыРеквизитов.Добавить(ОписаниеОперацииСтрока.Представление); КонецЦикла; - ЗапретРедактированияРеквизитовОбъектовКлиентМодуль = - ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); - - Если ЗапретРедактированияРеквизитовОбъектовКлиентМодуль.ПроверитьСсылкиНаОбъект(МассивСсылок, СинонимыРеквизитов) Тогда - Если Элементы.Найти("РазрешитьРедактированиеРеквизитов") <> Неопределено Тогда - Элементы.РазрешитьРедактированиеРеквизитов.Доступность = Ложь; + Если ПодсистемаСуществует("СтандартныеПодсистемы.ЗапретРедактированияРеквизитовОбъектов") Тогда + ЗапретРедактированияРеквизитовОбъектовКлиентМодуль = ОбщийМодуль("ЗапретРедактированияРеквизитовОбъектовКлиент"); + Если ЗапретРедактированияРеквизитовОбъектовКлиентМодуль <> Неопределено Тогда + ЗапретРедактированияРеквизитовОбъектовКлиентМодуль.ПроверитьСсылкиНаОбъект( + Новый ОписаниеОповещения( + "РазрешитьРедактированиеРеквизитовЗавершение", + ЭтотОбъект, + ЗаблокированныеРеквизитыСтроки), + МассивСсылок, + СинонимыРеквизитов); КонецЕсли; - - Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл - ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; - КонецЦикла; КонецЕсли; - КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура РазрешитьРедактированиеРеквизитовЗавершение(Результат, ЗаблокированныеРеквизитыСтроки) Экспорт + + Если Результат <> Истина Тогда + Возврат; + КонецЕсли; + + Для Каждого ОписаниеОперацииСтрока Из ЗаблокированныеРеквизитыСтроки Цикл + ОписаниеОперацииСтрока.ЗаблокированныйРеквизит = Ложь; + КонецЦикла; + +КонецПроцедуры + &НаКлиенте Процедура ПерейтиНаСтраницуИзмененияОбъектов() Если Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаИзменений Тогда Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов; - УстановитьСостояниеЭлементовФормы(Элементы); - Если ИзменитьТаблицуОбъектов Тогда - СформироватьИЗаполнитьДеревоИзменяемыхОбъектов(); - КонецЕсли; КонецЕсли; КонецПроцедуры @@ -766,58 +658,26 @@ ВыполняетсяОбработка = НачалоИзменения; - Элементы.ФормаНазад.Доступность = НЕ НачалоИзменения; - Элементы.ФормаОтмена.Доступность = НЕ НачалоИзменения; + Элементы.ФормаИзменить.Доступность = Истина; Если НачалоИзменения Тогда - Если Объект.ИзменятьВТранзакции И СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформационнаяБазаФайловая Тогда - Элементы.ФормаИзменить.Доступность = Ложь; - Иначе - Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Прервать'"); - КонецЕсли; + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Прервать'"); Иначе - Элементы.ФормаИзменить.Доступность = Истина; - Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Изменить'"); + Если ОбъектыКоторыеНеУдалосьИзменить.Количество() > 0 Тогда + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Повторить изменение'"); + Иначе + Элементы.ФормаИзменить.Заголовок = НСтр("ru = 'Закрыть'"); + КонецЕсли; КонецЕсли; КонецПроцедуры -&НаКлиенте -Функция ПодготовитьДеревоДляИзменения(КоллекцияЭлементов, ТекущиеИзменяемыеОбъекты) - - КоличествоИзменяемых = 0; - - Для Каждого ИзменяемыйЭлемент Из КоллекцияЭлементов Цикл - ИзменяемыйЭлемент.КодОшибки = ""; - Если ИзменяемыйЭлемент.Изменять Тогда - КоличествоИзменяемых = КоличествоИзменяемых + 1; - ТекущиеИзменяемыеОбъекты.Добавить(ИзменяемыйЭлемент.Ссылка, ИзменяемыйЭлемент.ПолучитьИдентификатор()); - КонецЕсли; - КоличествоИзменяемых = КоличествоИзменяемых + ПодготовитьДеревоДляИзменения(ИзменяемыйЭлемент.ПолучитьЭлементы(), ТекущиеИзменяемыеОбъекты); - КонецЦикла; - - Возврат КоличествоИзменяемых; - -КонецФункции - &НаКлиенте Процедура ИзменитьОбъекты() ОчиститьСообщения(); - ТекущееСостояниеИзменения = Новый Структура; - - ТекущиеИзменяемыеОбъекты = Новый СписокЗначений; - - КоличествоОбъектовДляОбработки = ПодготовитьДеревоДляИзменения(ИзменяемыеОбъекты.ПолучитьЭлементы(), ТекущиеИзменяемыеОбъекты); - - Если КоличествоОбъектовДляОбработки = 0 Тогда - УстановитьКнопкиНаВремяИзменения(Ложь); - Предупреждение(НСтр("ru = 'Не указаны объекты для изменения'")); - Возврат; - КонецЕсли; - - ТекущееСостояниеИзменения.Вставить("ТекущиеИзменяемыеОбъекты", ТекущиеИзменяемыеОбъекты); + КоличествоОбъектовДляОбработки = КоличествоВыбранныхОбъектов(); Если Объект.ИзменятьВТранзакции Тогда @@ -879,18 +739,14 @@ &НаКлиенте Процедура ИзменитьПорциюОбъектов() - НачальнаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция; - ОконечнаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция+ТекущееСостояниеИзменения.РазмерПорции; - - ПорцияМассив = ПолучитьПорциюОбрабатываемыхОбъектов(НачальнаяПозиция+1, ОконечнаяПозиция); - // Изменяем порцию на сервере - РезультатИзменения = ИзменитьНаСервере(ПорцияМассив, ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке); + РезультатИзменения = ИзменитьНаСервере(ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке); Если РезультатФоновогоЗадания.ЗаданиеВыполнено Тогда ОбработатьРезультатИзменения(ПолучитьИзВременногоХранилища(РезультатФоновогоЗадания.АдресХранилища)); Иначе - ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + МодульДлительныеОперацииКлиент = ОбщийМодуль("ДлительныеОперацииКлиент"); + МодульДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); ПодключитьОбработчикОжидания("ПроверитьВыполнениеИзменения", ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); КонецЕсли; @@ -909,20 +765,22 @@ Если РезультатФоновогоЗадания.ЗаданиеВыполнено Тогда ОбработатьРезультатИзменения(ПолучитьИзВременногоХранилища(РезультатФоновогоЗадания.АдресХранилища)); Иначе - ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); + МодульДлительныеОперацииКлиент = ОбщийМодуль("ДлительныеОперацииКлиент"); + МодульДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания); ПодключитьОбработчикОжидания("ПроверитьВыполнениеИзменения", ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ОбработатьРезультатИзменения(РезультатИзменения) - +Процедура ОбработатьРезультатИзменения(РезультатИзменения = Неопределено, ПродолжитьОбработку = Неопределено) Перем КоличествоОшибок, КоличествоИзмененных; - НачальнаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция; + Если ПродолжитьОбработку = Неопределено Тогда + ПродолжитьОбработку = Истина; + КонецЕсли; - Пока Истина Цикл + Пока ПродолжитьОбработку Цикл // Переносим информацию по обработанным объектам в таблицу ЗаполнитьСостояниеОбработанных(РезультатИзменения, КоличествоОшибок, КоличествоИзмененных); @@ -941,47 +799,23 @@ КонецЕсли; ТекстВопроса = НСтр("ru = 'При изменении элементов (группы элементов) возникли ошибки. - |Прервать изменение элементов и перейти к просмотру ошибок? - |'"); + |Прервать изменение элементов и перейти к просмотру ошибок? + |'"); Кнопки = Новый СписокЗначений; Кнопки.Добавить(КодВозвратаДиалога.Прервать, НСтр("ru = 'Прервать'")); Кнопки.Добавить(КодВозвратаДиалога.Пропустить, НСтр("ru = 'Продолжить'")); Кнопки.Добавить(КодВозвратаДиалога.Нет, НСтр("ru = 'Больше не спрашивать'")); - Результат = Вопрос(ТекстВопроса, Кнопки, , КодВозвратаДиалога.Прервать, НСтр("ru = 'Ошибки при изменении элементов'")); - - Если Результат = Неопределено Или Результат = КодВозвратаДиалога.Прервать Тогда - ПодключитьОбработчикОжидания("ЗавершитьИзменениеОбъектов", 0.1, Истина); - Возврат; // досрочный выход из цикла и процедуры - КонецЕсли; - - Если Результат = КодВозвратаДиалога.Пропустить ИЛИ Результат = КодВозвратаДиалога.Нет Тогда - // переходим к дообработке объектов порции - - Если Результат = КодВозвратаДиалога.Нет Тогда - // более в этом цикле изменения не останавливаться по ошибке - ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке = Ложь; - КонецЕсли; - - Для Каждого СостояниеОбработанногоОбъекта Из РезультатИзменения.СостояниеОбработки Цикл - НачальнаяПозиция = НачальнаяПозиция + 1; - Если Не ПустаяСтрока(СостояниеОбработанногоОбъекта.Значение.КодОшибки) Тогда - Прервать; - КонецЕсли; - КонецЦикла; - - КонецЕсли; - - Прервать; + ОписаниеОповещения = Новый ОписаниеОповещения("ОбработатьРезультатИзмененияОтветПолучен", ЭтотОбъект, РезультатИзменения); + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Прервать, НСтр("ru = 'Ошибки при изменении элементов'")); + Возврат; КонецЦикла; - Элементы.ОбъектыДляИзменения.ТекущаяСтрока = ТекущееСостояниеИзменения.ТекущаяПозиция; - ТекущееСостояниеИзменения.ТекущаяПозиция = ТекущееСостояниеИзменения.ТекущаяПозиция + ТекущееСостояниеИзменения.РазмерПорции; Если ТекущееСостояниеИзменения.ПоказыватьПроцентОбработанных Тогда // вычисляем текущий процент обработанных объектов - ТекущийПроцент = ТекущееСостояниеИзменения.ТекущаяПозиция / ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки * 100; + ТекущийПроцент = Окр(ТекущееСостояниеИзменения.ТекущаяПозиция / ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки * 100); Состояние(НСтр("ru = 'Обрабатываются элементы...'"), ТекущийПроцент, НСтр("ru = 'Изменение выделенных элементов'")); КонецЕсли; @@ -996,86 +830,166 @@ КонецПроцедуры &НаКлиенте -Процедура ЗавершитьИзменениеОбъектов() +Процедура ОбработатьРезультатИзмененияОтветПолучен(РезультатВопроса, РезультатИзменения) Экспорт - Если Объект.ИзменятьВТранзакции - И ТОНастройкаПорции = 1 Тогда // обработка одним вызовом - ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение выделенных элементов'"), , НСтр("ru = 'Обработка элементов завершена...'")); + Если РезультатВопроса = Неопределено Или РезультатВопроса = КодВозвратаДиалога.Прервать Тогда + ПодключитьОбработчикОжидания("ЗавершитьИзменениеОбъектов", 0.1, Истина); + Возврат; + ИначеЕсли РезультатВопроса = КодВозвратаДиалога.Нет Тогда + ТекущееСостояниеИзменения.ОстанавливатьИзменениеПриОшибке = Ложь; КонецЕсли; + ОбработатьРезультатИзменения(РезультатИзменения, Ложь); + +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьИзменениеОбъектов() + УстановитьКнопкиНаВремяИзменения(Ложь); ЗавершающиеДействияПриИзмененииСервер(); - ОповеститьОбИзменении(ТипЗнч(Параметры.МассивОбъектов[0])); + ОповеститьОбИзменении(ТипИзменяемыхОбъектов()); Оповестить("ЗавершениеГрупповогоИзмененияОбъектов"); + + ОбработкаЗавершена = ТекущееСостояниеИзменения.КоличествоИзмененных = ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки; + Если ОбработкаЗавершена Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Изменение реквизитов элементов'"), , НСтр("ru = 'Изменение элементов завершено.'")); + Закрыть(); + Возврат; + КонецЕсли; + + Элементы.ГруппаОбъектыКоторыеНеУдалосьИзменить.Видимость = ОбъектыКоторыеНеУдалосьИзменить.Количество() > 0; + + Если ОбработкаЗавершена Тогда + ШаблонСообщения = НСтр("ru = 'Изменения выполнены во всех выбранных элементах (%2).'"); + Иначе + Если Объект.ИзменятьВТранзакции Или ТекущееСостояниеИзменения.КоличествоИзмененных = 0 Тогда + ШаблонСообщения = НСтр("ru = 'Изменения не выполнены.'"); + Иначе + ШаблонСообщения = НСтр("ru = 'Изменения выполнены частично. + |Изменено: %1; Не удалось изменить: %3'"); + КонецЕсли; + КонецЕсли; + + Если Объект.ИзменятьВТранзакции И Не ОбработкаЗавершена Тогда + КоличествоПропущенных = ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки - ТекущееСостояниеИзменения.КоличествоОшибок; + Если КоличествоПропущенных > 0 Тогда + СтрокаТаблицы = ОбъектыКоторыеНеУдалосьИзменить.Добавить(); + СтрокаТаблицы.Объект = ПодставитьПараметрыВСтроку(НСтр("ru = '... и другие элементы (%1)'"), КоличествоПропущенных); + СтрокаТаблицы.Причина = НСтр("ru = 'Пропущены, так как не были изменены один или более элементов.'"); + КонецЕсли; + КонецЕсли; + + Элементы.НадписьРезультатыОбработки.Заголовок = ПодставитьПараметрыВСтроку( + ШаблонСообщения, + ТекущееСостояниеИзменения.КоличествоИзмененных, + ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки, + ТекущееСостояниеИзменения.КоличествоОшибок + ); + + Элементы.ФормаНазад.Видимость = Не КонтекстныйВызов; + ТекущееСостояниеИзменения = Неопределено; КонецПроцедуры +&НаСервере +Функция ТипИзменяемыхОбъектов() + МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); + Возврат ТипЗнч(МенеджерОбъекта.ПустаяСсылка()); +КонецФункции + &НаСервере Процедура ЗавершающиеДействияПриИзмененииСервер() - Если РезультатФоновогоЗадания.Свойство("ИдентификаторЗадания") Тогда - ДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатФоновогоЗадания.ИдентификаторЗадания); - КонецЕсли; - - Если ТекущееСостояниеИзменения.КоличествоОшибок > 0 Тогда - - Элементы.СтраницыПодсказокИзмененияОбъектов.ТекущаяСтраница = - Элементы.СтраницаПодсказкаПослеИзмененияЕстьОшибки; - - Если Объект.ИзменятьВТранзакции Тогда - КоличествоИзмененных = 0; - Иначе - КоличествоИзмененных = Строка(ТекущееСостояниеИзменения.КоличествоИзмененных); - КонецЕсли; - - НеИзмененоОбъектов = ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки - КоличествоИзмененных; - Элементы.ПодсказкаПослеИзмененияЕстьОшибки.Заголовок = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Не удалось изменить все выбранные элементы (%1 из %2).'"), - НеИзмененоОбъектов, - Строка(ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки)); - - Иначе - Элементы.СтраницыПодсказокИзмененияОбъектов.ТекущаяСтраница = - Элементы.СтраницаПодсказкаУспешноеИзменение; - Элементы.ПодсказкаУспешноеИзменение.Заголовок = - СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Изменение элементов успешно завершено: %1.'"), - Строка(ТекущееСостояниеИзменения.КоличествоИзмененных)); - - КонецЕсли; - - КоллекцияОпераций = Объект.Операции.НайтиСтроки(Новый Структура("Изменять", Истина)); - - ОписаниеИзменения = Новый Массив; - ШаблонПредставления = "[Поле]=<Значение>"; - ПредставлениеИзменения = ""; - - Для Каждого ОписаниеОперации Из КоллекцияОпераций Цикл - - СтруктураИзменения = Новый Структура; - СтруктураИзменения.Вставить("ВидОперации", ОписаниеОперации.ВидОперации); - СтруктураИзменения.Вставить("ИмяРеквизита", ОписаниеОперации.ИмяРеквизита); - СтруктураИзменения.Вставить("Свойство", ОписаниеОперации.Свойство); - СтруктураИзменения.Вставить("Значение", ОписаниеОперации.Значение); - - ОписаниеИзменения.Добавить(СтруктураИзменения); - ТекущаяОперация = СтрЗаменить(ШаблонПредставления, "[Поле]", СокрЛП(Строка(ОписаниеОперации.Представление))); - ТекущаяОперация = СтрЗаменить(ТекущаяОперация, "<Значение>", СокрЛП(Строка(ОписаниеОперации.Значение))); - ПредставлениеИзменения = ПредставлениеИзменения + ТекущаяОперация +"; "; - КонецЦикла; - - ПредставлениеИзменения = Лев(ПредставлениеИзменения, СтрДлина(ПредставлениеИзменения) - 2); - - Если ЗначениеЗаполнено(ПредставлениеИзменения) Тогда - ДобавитьИзменениеВИсторию(ОписаниеИзменения, ПредставлениеИзменения); + МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); + МодульДлительныеОперации.ОтменитьВыполнениеЗадания(РезультатФоновогоЗадания.ИдентификаторЗадания); КонецЕсли; Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов; + СохранитьТекущиеНастройкиИзменения(); +КонецПроцедуры + +&НаСервере +Процедура СохранитьТекущиеНастройкиИзменения() + + ТекущиеНастройки = ТекущиеНастройкиИзменения(); + Если ТекущиеНастройки <> Неопределено Тогда + ДобавитьИзменениеВИсторию(ТекущиеНастройки.ОписаниеИзменения, ТекущиеНастройки.ПредставлениеИзменения); + КонецЕсли; КонецПроцедуры +&НаСервере +Функция ТекущиеНастройкиИзменения() + + ОписаниеИзменения = Новый Структура; + КоллекцияОпераций = РеквизитыОбъекта.НайтиСтроки(Новый Структура("Изменять", Истина)); + + ШаблонПредставления = "[Поле] = <Значение>"; + ПредставлениеИзменения = ""; + + НастройкаИзмененияРеквизитов = Новый Массив; + Для Каждого ОписаниеОперации Из КоллекцияОпераций Цикл + СтруктураИзменения = Новый Структура; + СтруктураИзменения.Вставить("ВидОперации", ОписаниеОперации.ВидОперации); + СтруктураИзменения.Вставить("ИмяРеквизита", ОписаниеОперации.Имя); + СтруктураИзменения.Вставить("Свойство", ОписаниеОперации.Свойство); + СтруктураИзменения.Вставить("Значение", ОписаниеОперации.Значение); + НастройкаИзмененияРеквизитов.Добавить(СтруктураИзменения); + + ЗначениеСтрокой = СокрЛП(Строка(ОписаниеОперации.Значение)); + Если ПустаяСтрока(ЗначениеСтрокой) Тогда + ЗначениеСтрокой = """"""; + КонецЕсли; + Изменение = СтрЗаменить(ШаблонПредставления, "[Поле]", СокрЛП(Строка(ОписаниеОперации.Представление))); + Изменение = СтрЗаменить(Изменение, "<Значение>", ЗначениеСтрокой); + + Если Не ПустаяСтрока(ПредставлениеИзменения) Тогда + ПредставлениеИзменения = ПредставлениеИзменения + "; "; + КонецЕсли; + ПредставлениеИзменения = ПредставлениеИзменения + Изменение; + КонецЦикла; + ОписаниеИзменения.Вставить("Реквизиты", НастройкаИзмененияРеквизитов); + + НастройкаИзмененияТабличныхЧастей = Новый Структура; + Для Каждого ТабличнаяЧасть Из ИзменяемыеТабличныеЧасти() Цикл + Если Не ПустаяСтрока(ПредставлениеИзменения) Тогда + ПредставлениеИзменения = ПредставлениеИзменения + "; "; + КонецЕсли; + ПредставлениеИзменения = ПредставлениеИзменения + ТабличнаяЧасть.Ключ + " ("; + НастройкаИзмененияРеквизитов = Новый Массив; + СтрокаРеквизитов = ""; + Для Каждого Реквизит Из ТабличнаяЧасть.Значение Цикл + СтруктураИзменения = Новый Структура("Имя,Значение"); + ЗаполнитьЗначенияСвойств(СтруктураИзменения, Реквизит); + НастройкаИзмененияРеквизитов.Добавить(СтруктураИзменения); + + Изменение = СтрЗаменить(ШаблонПредставления, "[Поле]", СокрЛП(Строка(Реквизит.Представление))); + Изменение = СтрЗаменить(Изменение, "<Значение>", СокрЛП(Строка(Реквизит.Значение))); + + Если Не ПустаяСтрока(СтрокаРеквизитов) Тогда + СтрокаРеквизитов = СтрокаРеквизитов + "; "; + КонецЕсли; + СтрокаРеквизитов = СтрокаРеквизитов + Изменение; + КонецЦикла; + ПредставлениеИзменения = ПредставлениеИзменения + СтрокаРеквизитов + ")"; + НастройкаИзмененияТабличныхЧастей.Вставить(ТабличнаяЧасть.Ключ, НастройкаИзмененияРеквизитов); + КонецЦикла; + + ОписаниеИзменения.Вставить("ТабличныеЧасти", НастройкаИзмененияТабличныхЧастей); + + Результат = Неопределено; + Если ЗначениеЗаполнено(ПредставлениеИзменения) Тогда + Результат = Новый Структура; + Результат.Вставить("ОписаниеИзменения", ОписаниеИзменения); + Результат.Вставить("ПредставлениеИзменения", ПредставлениеИзменения); + КонецЕсли; + + Возврат Результат; + +КонецФункции + &НаКлиенте Процедура ЗаполнитьСостояниеОбработанных(РезультатИзменения, КоличествоОшибок, КоличествоИзмененных) @@ -1083,99 +997,101 @@ КоличествоИзмененных = 0; Для Каждого СостояниеОбработанногоОбъекта Из РезультатИзменения.СостояниеОбработки Цикл - НомерСтроки = -1; - - Идентификатор = Число(ТекущееСостояниеИзменения.ТекущиеИзменяемыеОбъекты.НайтиПоЗначению(СостояниеОбработанногоОбъекта.Ключ).Представление); - - ЭлементДерева = ИзменяемыеОбъекты.НайтиПоИдентификатору(Идентификатор); - - ЭлементДерева.КодОшибки = СостояниеОбработанногоОбъекта.Значение.КодОшибки; - Если Не ПустаяСтрока(СостояниеОбработанногоОбъекта.Значение.КодОшибки) Тогда КоличествоОшибок = КоличествоОшибок + 1; - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - СостояниеОбработанногоОбъекта.Значение.СообщениеОбОшибке - + "(" + Строка(СостояниеОбработанногоОбъекта.Ключ) + ")", ); + ЗаписьОбОшибке = ОбъектыКоторыеНеУдалосьИзменить.Добавить(); + ЗаписьОбОшибке.Объект = СостояниеОбработанногоОбъекта.Ключ; + ЗаписьОбОшибке.Причина = СостояниеОбработанногоОбъекта.Значение.СообщениеОбОшибке; Иначе КоличествоИзмененных = КоличествоИзмененных + 1; - - Если НЕ (Объект.ИзменятьВТранзакции И РезультатИзменения.ЕстьОшибки) Тогда - Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхРеквизитов Цикл - ИмяСвязанногоРеквизита = ПрефиксИмениРеквизита() + ИзмененныйРеквизит.Ключ; - Если ЭлементДерева.Свойство(ИмяСвязанногоРеквизита) Тогда - ЭлементДерева[ИмяСвязанногоРеквизита] = ИзмененныйРеквизит.Значение; - КонецЕсли; - КонецЦикла; - Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхДопРеквизитов Цикл - Если ЭлементДерева.Свойство(ИзмененныйРеквизит.Ключ) Тогда - ЭлементДерева[ИзмененныйРеквизит.Ключ] = ИзмененныйРеквизит.Значение; - КонецЕсли; - КонецЦикла; - Для Каждого ИзмененныйРеквизит Из СостояниеОбработанногоОбъекта.Значение.ЗначенияИзмененныхДопСведений Цикл - Если ЭлементДерева.Свойство(ИзмененныйРеквизит.Ключ) Тогда - ЭлементДерева[ИзмененныйРеквизит.Ключ] = ИзмененныйРеквизит.Значение; - КонецЕсли; - КонецЦикла; - - ЭлементДерева.Изменять = Ложь; - КонецЕсли; - КонецЕсли; - КонецЦикла; КонецПроцедуры -&НаКлиенте -Функция ПолучитьПорциюОбрабатываемыхОбъектов(НижняяГраница, ВерхняяГраница) +&НаСервере +Функция СледующаяПорцияОбъектовДляИзменения() - Порция = Новый Массив; + НачалоВыборки = ТекущееСостояниеИзменения.ТекущаяПозиция; + КонецВыборки = ТекущееСостояниеИзменения.ТекущаяПозиция + ТекущееСостояниеИзменения.РазмерПорции - 1; - Для Индекс = НижняяГраница По ВерхняяГраница Цикл - Если Индекс <= ТекущееСостояниеИзменения.КоличествоОбъектовДляОбработки Тогда - Порция.Добавить( - ИзменяемыеОбъекты.НайтиПоИдентификатору( - Число(ТекущееСостояниеИзменения.ТекущиеИзменяемыеОбъекты.Получить(Индекс-1).Представление)).Ссылка); - КонецЕсли; + ВыбранныеОбъекты = ВыбранныеОбъекты(); + Если КонецВыборки > ВыбранныеОбъекты.Строки.Количество() - 1 Тогда + КонецВыборки = ВыбранныеОбъекты.Строки.Количество() - 1; + КонецЕсли; + + Результат = Новый ДеревоЗначений; + Для Каждого Колонка Из ВыбранныеОбъекты.Колонки Цикл + Результат.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения); КонецЦикла; - Возврат Порция; + Для Индекс = НачалоВыборки По КонецВыборки Цикл + ОписаниеОбъекта = Результат.Строки.Добавить(); + ЗаполнитьЗначенияСвойств(ОписаниеОбъекта, ВыбранныеОбъекты.Строки[Индекс]); + Для Каждого СтрокаОбъекта Из ВыбранныеОбъекты.Строки[Индекс].Строки Цикл + ЗаполнитьЗначенияСвойств(ОписаниеОбъекта.Строки.Добавить(), СтрокаОбъекта); + КонецЦикла; + КонецЦикла; + + Возврат Результат; КонецФункции &НаСервере -Функция ИзменитьНаСервере(ОбъектыДляОбработки, знач ОстанавливатьИзменениеПриОшибке) +Функция ИзменяемыеРеквизиты(ИмяТабличнойЧасти = "РеквизитыОбъекта") + ТаблицаРеквизитов = ЭтаФорма[ИмяТабличнойЧасти]; + Возврат ТаблицаЗначенийВМассив(ТаблицаРеквизитов.Выгрузить(Новый Структура("Изменять", Истина))); +КонецФункции + +&НаСервере +Функция ИзменяемыеТабличныеЧасти() + Результат = Новый Структура; + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + ИзменяемыеРеквизиты = ИзменяемыеРеквизиты(ТабличнаяЧасть.Значение); + Если ИзменяемыеРеквизиты.Количество() > 0 Тогда + ИмяТабличнойЧасти = Сред(ТабличнаяЧасть.Значение, СтрДлина("ТабличнаяЧасть") + 1); + Результат.Вставить(ИмяТабличнойЧасти, ИзменяемыеРеквизиты); + КонецЕсли; + КонецЦикла; + Возврат Результат; +КонецФункции + +&НаСервере +Функция ИзменитьНаСервере(Знач ОстанавливатьИзменениеПриОшибке) + + ОбъектыДляОбработки = СледующаяПорцияОбъектовДляИзменения(); - УправлениеСвойствамиМодуль = - ?(Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеСвойствами") = Неопределено, - Неопределено, - Вычислить("УправлениеСвойствами")); - ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ОбрабатываемыеОбъекты", ОбъектыДляОбработки); + СтруктураПараметров.Вставить("ОбрабатываемыеОбъекты", Новый ХранилищеЗначения(ОбъектыДляОбработки)); СтруктураПараметров.Вставить("ОстанавливатьИзменениеПриОшибке", ОстанавливатьИзменениеПриОшибке); СтруктураПараметров.Вставить("ИзменятьВТранзакции", ОбработкаОбъект.ИзменятьВТранзакции); СтруктураПараметров.Вставить("ПрерыватьПриОшибке", ОбработкаОбъект.ПрерыватьПриОшибке); СтруктураПараметров.Вставить("ИспользуютсяДопРеквизиты", ОбработкаОбъект.ИспользуютсяДопРеквизиты); СтруктураПараметров.Вставить("ИспользуютсяДопСведения", ОбработкаОбъект.ИспользуютсяДопСведения); - СтруктураПараметров.Вставить("Операции", ОбработкаОбъект.Операции.Выгрузить()); - СтруктураПараметров.Вставить("ОбъектыДляИзменения", ОбработкаОбъект.ОбъектыДляИзменения.Выгрузить()); - СтруктураПараметров.Вставить("УправлениеСвойствамиМодуль", УправлениеСвойствамиМодуль); + СтруктураПараметров.Вставить("ИзменяемыеРеквизиты", ИзменяемыеРеквизиты()); + СтруктураПараметров.Вставить("ИзменяемыеТабличныеЧасти", ИзменяемыеТабличныеЧасти()); + СтруктураПараметров.Вставить("ОбъектыДляИзменения", Новый ХранилищеЗначения(ВыбранныеОбъекты())); - Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Или Не Объект.ИзменятьВТранзакции Тогда - АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); - Обработки.ГрупповоеИзменениеОбъектов.ВыполнитьИзменениеОбъектов(СтруктураПараметров, АдресХранилища); - РезультатФоновогоЗадания = Новый Структура("ЗаданиеВыполнено, АдресХранилища", Истина, АдресХранилища); + ЭтоВнешняяОбработка = Не Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные()); + Если Не Объект.ИзменятьВТранзакции Или Не ПодсистемаСуществует("СтандартныеПодсистемы.БазоваяФункциональность") Тогда + АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); + ОбработкаОбъект.ВыполнитьИзменениеОбъектов(СтруктураПараметров, АдресХранилища); + РезультатФоновогоЗадания = Новый Структура("ЗаданиеВыполнено, АдресХранилища", Истина, АдресХранилища); Иначе - НаименованиеЗадания = НСтр("ru = 'Групповое изменение объектов'"); + НаименованиеЗадания = НСтр("ru = 'Групповое изменение элементов'"); - РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне( + ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки"; + СтруктураПараметров = Новый Структура("ИмяОбработки,ИмяМетода,ПараметрыВыполнения,ЭтоВнешняяОбработка,ДополнительнаяОбработкаСсылка", + ИмяОбработки(), "ВыполнитьИзменениеОбъектов", СтруктураПараметров, ЭтоВнешняяОбработка, ДополнительнаяОбработкаСсылка); + + МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); + РезультатФоновогоЗадания = МодульДлительныеОперации.ЗапуститьВыполнениеВФоне( УникальныйИдентификатор, - "Обработки.ГрупповоеИзменениеОбъектов.ВыполнитьИзменениеОбъектов", + ВыполняемыйМетод, СтруктураПараметров, НаименованиеЗадания); КонецЕсли; @@ -1184,28 +1100,24 @@ КонецФункции -&НаКлиенте -Процедура ЗаполнитьМассивИзменяемыхОбъектов(КоллекцияСтрок, МассивСсылок) - - Для Каждого СтрокаИзменяемыйОбъект Из КоллекцияСтрок Цикл - МассивСсылок.Добавить(СтрокаИзменяемыйОбъект.Ссылка); - ЗаполнитьМассивИзменяемыхОбъектов(СтрокаИзменяемыйОбъект.ПолучитьЭлементы(), МассивСсылок) - КонецЦикла; - -КонецПроцедуры - -&НаКлиенте -Процедура ОткрытьОбъектПоСсылке() - - СтруктураПараметров = Новый Структура; - СтруктураПараметров.Вставить("ТолькоПросмотр", Истина); - СтруктураПараметров.Вставить("Ключ", Элементы.ОбъектыДляИзменения.ТекущиеДанные.Ссылка); - - Если Элементы.ОбъектыДляИзменения.ТекущиеДанные.ЭтоГруппа Тогда - ОткрытьФорму(ПолноеИмя + ".ФормаГруппы", СтруктураПараметров); +&НаСервере +Функция ИмяОбработки() + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + ЭтоВнешняяОбработка = Не Метаданные.Обработки.Содержит(ОбработкаОбъект.Метаданные()); + ЧастиИмени = РазложитьСтрокуВМассивПодстрок(ИмяФормы, "."); + Если ЭтоВнешняяОбработка Тогда + Возврат ОбработкаОбъект.ИспользуемоеИмяФайла; Иначе - ОткрытьФорму(ПолноеИмя + ".ФормаОбъекта", СтруктураПараметров); + Возврат ЧастиИмени[1]; КонецЕсли; +КонецФункции + +&НаСервере +Процедура ЗаполнитьМассивИзменяемыхОбъектов(МассивСсылок) + + Для Каждого ВыбранныйОбъект Из ВыбранныеОбъекты().Строки Цикл + МассивСсылок.Добавить(ВыбранныйОбъект.Ссылка); + КонецЦикла; КонецПроцедуры @@ -1219,370 +1131,10 @@ КонецПроцедуры -/////////////////////////////////////////////////////////////////////////////// -// Прочие операции - -&НаСервере -Процедура ЗаполнитьДеревоОбъектовДляИзменения(МассивЗаполненных) - - ТаблицаОтработанных = Новый ТаблицаЗначений; - МассивТипов = Новый Массив; - МассивТипов.Добавить(ТипЗнч(Параметры.МассивОбъектов[0])); - ТаблицаОтработанных.Колонки.Добавить("Ссылка", Новый ОписаниеТипов(МассивТипов)); - - Для Каждого Элемент Из МассивЗаполненных Цикл - ТаблицаОтработанных.Добавить().Ссылка = Элемент; - КонецЦикла; - - ОбъектМетаданных = Параметры.МассивОбъектов[0].Метаданные(); - - ВидОбъектаМетаданных = ОбщегоНазначения.ВидОбъектаПоСсылке(Параметры.МассивОбъектов[0]); - - ТекстЗапроса = - "ВЫБРАТЬ - | Ссылка - |Поместить - | Отработанные - |ИЗ - | &ТаблицаОтработанных КАК Отработанные - |; - |ВЫБРАТЬ - | Таблица.Ссылка КАК Ссылка, - | """" КАК КодОшибки, - | ВЫБОР КОГДА Отработанные.Ссылка ЕСТЬ NULL - | ТОГДА Истина - | ИНАЧЕ Ложь - |КОНЕЦ КАК Изменять,"; - - Если УчитыватьИерархию И ИерархияГрупп Тогда - ТекстЗапроса = ТекстЗапроса + " - | ВЫБОР КОГДА Таблица.ПометкаУдаления ТОГДА - | ВЫБОР КОГДА Таблица.ЭтоГруппа ТОГДА 1 - | ИНАЧЕ 4 - | КОНЕЦ - | ИНАЧЕ - | ВЫБОР КОГДА Таблица.ЭтоГруппа ТОГДА 0 - | ИНАЧЕ 3 - | КОНЕЦ - | Конец КАК КодКартинки"; - Иначе - ТекстЗапроса = ТекстЗапроса + " - | ВЫБОР КОГДА Таблица.ПометкаУдаления ТОГДА 4 - | ИНАЧЕ 3 - | КОНЕЦ КАК КодКартинки"; - КонецЕсли; - - Если УчитыватьИерархию И ИерархияГрупп Тогда - ТекстЗапроса = ТекстЗапроса + "," + " - | Таблица.ЭтоГруппа КАК ЭтоГруппа"; - Иначе - ТекстЗапроса = ТекстЗапроса + "," + " - | Ложь КАК ЭтоГруппа"; - КонецЕсли; - - СчетчикДопРеквизитов = 0; - СчетчикДопСведений = 0; - - ЛевоеСоединениеПоДопРеквизитам = ""; - ЛевоеСоединениеПоДопСведениям = ""; - - ПараметрыСвойства = Новый Соответствие; - - Для Каждого ОписаниеКолонки Из РеквизитФормыВЗначение("ИзменяемыеОбъекты").Колонки Цикл - - Если ПроверитьНеизменяемыйРеквизит(ОписаниеКолонки.Имя) Тогда - Продолжить; - КонецЕсли; - - Если ИмеетПрефикс(ОписаниеКолонки.Имя, ПрефиксИмениРеквизита()) Тогда - - ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС + СтрокаБезПрефикса(ОписаниеКолонки.Имя, ПрефиксИмениРеквизита()) + " КАК " + ОписаниеКолонки.Имя - - ИначеЕсли ИмеетПрефикс(ОписаниеКолонки.Имя, ПрефиксИмениДопРеквизита()) Тогда - - СчетчикДопРеквизитов = СчетчикДопРеквизитов + 1; - ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС + - СтрЗаменить("ДополнительныеРеквизиты[x].Значение КАК ", "[x]", Строка(СчетчикДопРеквизитов)) + ОписаниеКолонки.Имя; - - ЛевоеСоединениеПоДопРеквизитам = ЛевоеСоединениеПоДопРеквизитам + " - | ЛЕВОЕ СОЕДИНЕНИЕ - | [ВидОбъектаМетаданных].[ИмяОбъектаМетаданных].ДополнительныеРеквизиты КАК ДополнительныеРеквизиты[x] - | ПО ДополнительныеРеквизиты[x].Ссылка = Таблица.Ссылка - | И ДополнительныеРеквизиты[x].Свойство = &ДопРеквизит[x]"; - - ЛевоеСоединениеПоДопРеквизитам = СтрЗаменить(ЛевоеСоединениеПоДопРеквизитам, "[x]", Строка(СчетчикДопРеквизитов)); - - УнИдСтрока = СтрЗаменить(СтрокаБезПрефикса(ОписаниеКолонки.Имя, ПрефиксИмениДопРеквизита()), "_", "-"); - УнИд = Новый УникальныйИдентификатор(УнИдСтрока); - Свойство = ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолучитьСсылку(УнИд); - - ПараметрыСвойства.Вставить(СтрЗаменить("ДопРеквизит[x]", "[x]", Строка(СчетчикДопРеквизитов)), Свойство); - - ИначеЕсли ИмеетПрефикс(ОписаниеКолонки.Имя, ПрефиксИмениДопСведения()) Тогда - СчетчикДопСведений = СчетчикДопСведений + 1; - ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС + - СтрЗаменить("ДополнительныеСведения[x].Значение КАК ", "[x]", Строка(СчетчикДопСведений)) + ОписаниеКолонки.Имя; - - ЛевоеСоединениеПоДопСведениям = ЛевоеСоединениеПоДопСведениям + " - | ЛЕВОЕ СОЕДИНЕНИЕ - | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения[x] - | ПО ДополнительныеСведения[x].Объект = Таблица.Ссылка - | И ДополнительныеСведения[x].Свойство = &ДопСведение[x]"; - - ЛевоеСоединениеПоДопСведениям = СтрЗаменить(ЛевоеСоединениеПоДопСведениям, "[x]", Строка(СчетчикДопСведений)); - - УнИдСтрока = СтрЗаменить(СтрокаБезПрефикса(ОписаниеКолонки.Имя, ПрефиксИмениДопСведения()), "_", "-"); - УнИд = Новый УникальныйИдентификатор(УнИдСтрока); - Свойство = ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолучитьСсылку(УнИд); - - ПараметрыСвойства.Вставить(СтрЗаменить("ДопСведение[x]", "[x]", Строка(СчетчикДопСведений)), Свойство); - - КонецЕсли; - - КонецЦикла; - - ТекстЗапроса = ТекстЗапроса + " - |ИЗ - | [ВидОбъектаМетаданных].[ИмяОбъектаМетаданных] КАК Таблица - | ЛЕВОЕ СОЕДИНЕНИЕ Отработанные - | ПО Таблица.Ссылка = Отработанные.Ссылка"; - - ТекстЗапроса = ТекстЗапроса + ЛевоеСоединениеПоДопРеквизитам; - ТекстЗапроса = ТекстЗапроса + ЛевоеСоединениеПоДопСведениям; - - ТекстЗапроса = ТекстЗапроса + " - |ГДЕ"; - - Если ОбрабатыватьРекурсивно И УчитыватьИерархию Тогда - ТекстЗапроса = ТекстЗапроса + " - | Таблица.Ссылка В ИЕРАРХИИ(&МассивСсылок)"; - Иначе - ТекстЗапроса = ТекстЗапроса + " - | Таблица.Ссылка В (&МассивСсылок)"; - КонецЕсли; - - ТекстЗапроса = ТекстЗапроса + " - |УПОРЯДОЧИТЬ ПО"; - - Если ОбрабатыватьРекурсивно И УчитыватьИерархию И ИерархияГрупп Тогда - ТекстЗапроса = ТекстЗапроса + " - | Таблица.ЭтоГруппа ИЕРАРХИЯ ВОЗР,"; - КонецЕсли; - - Если ОбрабатыватьРекурсивно И УчитыватьИерархию И НЕ ИерархияГрупп Тогда - ТекстЗапроса = ТекстЗапроса + " - | Таблица.Ссылка ИЕРАРХИЯ ВОЗР"; - Иначе - ТекстЗапроса = ТекстЗапроса + " - | Таблица.Ссылка ВОЗР"; - КонецЕсли; - - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ВидОбъектаМетаданных]", ВидОбъектаМетаданных); - ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяОбъектаМетаданных]", ОбъектМетаданных.Имя); - - Запрос = Новый Запрос; - Запрос.Текст = ТекстЗапроса; - Запрос.Параметры.Вставить("МассивСсылок", Параметры.МассивОбъектов); - Запрос.УстановитьПараметр("ТаблицаОтработанных", ТаблицаОтработанных); - - Для Каждого ПараметрСвойство Из ПараметрыСвойства Цикл - Запрос.УстановитьПараметр(ПараметрСвойство.Ключ, ПараметрСвойство.Значение); - КонецЦикла; - - ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией), "ИзменяемыеОбъекты"); - -КонецПроцедуры - -&НаСервере -Процедура ЗаполнитьСплошнойСписокОбъектовДляИзменения(КоллекцияЭлементов) - - Для Каждого ЭлементКоллекции Из КоллекцияЭлементов Цикл - НоваяСтрока = Объект.ОбъектыДляИзменения.Добавить(); - НоваяСтрока.СсылкаНаОбъект = ЭлементКоллекции.Ссылка; - ЗаполнитьСплошнойСписокОбъектовДляИзменения(ЭлементКоллекции.ПолучитьЭлементы()); - КонецЦикла; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Функция ТекстПодсказкиСтраницыДействий(КоличествоОбъектов) - - Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = ' - |Нажмите кнопку ""Далее"", чтобы перейти к просмотру изменяемых элементов списка (%1)'"), - КоличествоОбъектов); - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Процедура УстановитьСостояниеЭлементовФормы(Элементы, Количество = 0) - - Если Количество > 0 Тогда - Элементы.ПодсказкаСтраницыДействий.Заголовок = ТекстПодсказкиСтраницыДействий(Количество); - КонецЕсли; - - Если Элементы.Страницы.ТекущаяСтраница = Элементы.НастройкаИзменений Тогда - Элементы.ФормаНазад.Доступность = Ложь; - Элементы.ФормаДалее.Доступность = Истина; - ИначеЕсли Элементы.Страницы.ТекущаяСтраница = Элементы.ИзменениеОбъектов Тогда - Элементы.ФормаНазад.Доступность = Истина; - Элементы.ФормаДалее.Доступность = Ложь; - КонецЕсли; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Процедура ЗаполнитьМассивИзмененных(Массив, Элементы) - - Для Каждого Элемент Из Элементы Цикл - Если НЕ Элемент.Изменять Тогда - Массив.Добавить(Элемент.Ссылка); - КонецЕсли; - Дочерние = Элемент.ПолучитьЭлементы(); - Если Дочерние.Количество() > 0 Тогда - ЗаполнитьМассивИзмененных(Массив, Дочерние); - КонецЕсли; - КонецЦикла; - -КонецПроцедуры - -&НаСервере -Процедура СформироватьИЗаполнитьДеревоИзменяемыхОбъектов() - - МассивЗаполненных = Новый Массив; - - ЗаполнитьМассивИзмененных(МассивЗаполненных, ИзменяемыеОбъекты.ПолучитьЭлементы()); - - СформироватьДеревоИзменяемыхОбъектов(); - ЗаполнитьДеревоОбъектовДляИзменения(МассивЗаполненных); - - ИзменитьТаблицуОбъектов = Ложь; - -КонецПроцедуры - -&НаКлиентеНаСервереБезКонтекста -Функция СтрокаБезПрефикса(ИмяРеквизитаСПрефиксом, Префикс) - Возврат Прав(ИмяРеквизитаСПрефиксом, СтрДлина(ИмяРеквизитаСПрефиксом) - СтрДлина(Префикс)); -КонецФункции - -&НаСервере -Процедура СформироватьДеревоИзменяемыхОбъектов() - - СуществующийСоставРеквизитов = Новый Массив; - - Для Каждого ОписаниеКолонки Из РеквизитФормыВЗначение("ИзменяемыеОбъекты").Колонки Цикл - - Если ПроверитьНеизменяемыйРеквизит(ОписаниеКолонки.Имя) Тогда - Продолжить; - КонецЕсли; - - СуществующийСоставРеквизитов.Добавить(ОписаниеКолонки.Имя); - КонецЦикла; - - НовыйСоставРеквизитов = Новый Массив; - - Для Каждого Операция Из Объект.Операции Цикл - Если Операция.Изменять И Операция.ВидОперации = 1 Тогда - НовыйСоставРеквизитов.Добавить(ПрефиксИмениРеквизита()+Операция.ИмяРеквизита); - ИначеЕсли Операция.Изменять И Операция.ВидОперации = 2 Тогда - НовыйСоставРеквизитов.Добавить(ПрефиксИмениДопРеквизита()+СтрЗаменить(Операция.Свойство.УникальныйИдентификатор(), "-", "_")); - ИначеЕсли Операция.Изменять И Операция.ВидОперации = 3 Тогда - НовыйСоставРеквизитов.Добавить(ПрефиксИмениДопСведения()+СтрЗаменить(Операция.Свойство.УникальныйИдентификатор(), "-", "_")); - КонецЕсли; - КонецЦикла; - - ИменаДобавляемыхРеквизитов = РазницаМассивов(НовыйСоставРеквизитов, СуществующийСоставРеквизитов); - ИменаУдаляемыхРеквизитов = РазницаМассивов(СуществующийСоставРеквизитов, НовыйСоставРеквизитов); - - ДобавляемыеРеквизиты = Новый Массив; - - Для Каждого ИмяРеквизита Из ИменаДобавляемыхРеквизитов Цикл - - Если ИмеетПрефикс(ИмяРеквизита, ПрефиксИмениРеквизита()) Тогда - - Операция = Объект.Операции.НайтиСтроки(Новый Структура("ИмяРеквизита", СтрокаБезПрефикса(ИмяРеквизита, ПрефиксИмениРеквизита())))[0]; - - ОписаниеТипов = Операция.ОписаниеТипов; - - ИначеЕсли ИмеетПрефикс(ИмяРеквизита, ПрефиксИмениДопРеквизита()) - ИЛИ ИмеетПрефикс(ИмяРеквизита, ПрефиксИмениДопСведения()) Тогда - - Префикс = ?(ИмеетПрефикс(ИмяРеквизита, ПрефиксИмениДопРеквизита()), - ПрефиксИмениДопРеквизита(), - ПрефиксИмениДопСведения()); - - УнИд = Новый УникальныйИдентификатор(СтрЗаменить(СтрокаБезПрефикса(ИмяРеквизита, Префикс), "_", "-")); - - Свойство = ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолучитьСсылку(УнИд); - - ОписаниеТипов = Свойство.ТипЗначения; - - Операция = Объект.Операции.НайтиСтроки(Новый Структура("Свойство", Свойство))[0]; - - КонецЕсли; - - ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, ОписаниеТипов, "ИзменяемыеОбъекты", Операция.Представление)); - - КонецЦикла; - - УдаляемыеРеквизиты = Новый Массив; - - Для Каждого ИмяРеквизита Из ИменаУдаляемыхРеквизитов Цикл - УдаляемыеРеквизиты.Добавить("ИзменяемыеОбъекты."+ИмяРеквизита); - КонецЦикла; - - ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты); - - УдаляемыеПоляФормы = Новый Массив; - - Для Каждого ПолеФормы Из Элементы.ОбъектыДляИзменения.ПодчиненныеЭлементы Цикл - Если ТипЗнч(ПолеФормы) = Тип("ПолеФормы") И ПолеФормы.ПутьКДанным = "" Тогда - УдаляемыеПоляФормы.Добавить(ПолеФормы); - КонецЕсли; - КонецЦикла; - - Для Каждого ДобавленныйРеквизит Из ДобавляемыеРеквизиты Цикл - НовыйЭлементФормы = Элементы.Добавить(ПрефиксИмениПоляФормы()+ДобавленныйРеквизит.Имя, Тип("ПолеФормы"), Элементы.ОбъектыДляИзменения); - НовыйЭлементФормы.ПутьКДанным = "ИзменяемыеОбъекты."+ДобавленныйРеквизит.Имя; - КонецЦикла; - -КонецПроцедуры - -&НаСервереБезКонтекста -Функция РазницаМассивов(МассивИсточник, МассивВычитаемый) - - Результат = Новый Массив; - - Для Каждого ЭлементМассива Из МассивИсточник Цикл - Если МассивВычитаемый.Найти(ЭлементМассива) = Неопределено Тогда - Результат.Добавить(ЭлементМассива); - КонецЕсли; - КонецЦикла; - - Возврат Результат; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПроверитьНеизменяемыйРеквизит(ИмяРеквизита) - - Если ИмяРеквизита = "Ссылка" - ИЛИ ИмяРеквизита = "Изменять" - ИЛИ ИмяРеквизита = "КодОшибки" - ИЛИ ИмяРеквизита = "КодКартинки" - ИЛИ ИмяРеквизита = "ЭтоГруппа" - Тогда - Возврат Истина; - Иначе - Возврат Ложь; - КонецЕсли; - -КонецФункции - &НаСервереБезКонтекста Функция ОбъектМетаданныхИерархический(СсылкаПервого) - ВидОбъектаПоСсылке = ОбщегоНазначения.ВидОбъектаПоСсылке(СсылкаПервого); + ВидОбъектаПоСсылке = ВидОбъектаПоСсылке(СсылкаПервого); Если ((ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") И СсылкаПервого.Метаданные().Иерархический) ИЛИ (ВидОбъектаПоСсылке = "ПланСчетов") Тогда @@ -1596,7 +1148,7 @@ &НаСервереБезКонтекста Функция ИерархияГруппИЭлементов(СсылкаПервого) - ВидОбъектаПоСсылке = ОбщегоНазначения.ВидОбъектаПоСсылке(СсылкаПервого); + ВидОбъектаПоСсылке = ВидОбъектаПоСсылке(СсылкаПервого); Если (ВидОбъектаПоСсылке = "Справочник" И СсылкаПервого.Метаданные().Иерархический @@ -1611,33 +1163,6 @@ КонецФункции -&НаКлиентеНаСервереБезКонтекста -Функция ИмеетПрефикс(ИмяРеквизита, Префикс) - - Возврат Лев(ИмяРеквизита, СтрДлина(Префикс)) = Префикс; - -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПрефиксИмениРеквизита() - Возврат "Реквизит_"; -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПрефиксИмениДопРеквизита() - Возврат "ДопРеквизит_"; -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПрефиксИмениДопСведения() - Возврат "ДопСведение_"; -КонецФункции - -&НаКлиентеНаСервереБезКонтекста -Функция ПрефиксИмениПоляФормы() - Возврат "Элемент_"; -КонецФункции - &НаКлиентеНаСервереБезКонтекста Функция НетранзакционнаяПорцияГраницаПерехода() @@ -1667,20 +1192,2487 @@ &НаСервереБезКонтекста Функция ЗаданиеВыполнено(ИдентификаторЗадания) - Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания); + МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); + Возврат МодульДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания); КонецФункции &НаКлиенте -Процедура СброситьОперации() - Для Каждого Операция Из Объект.Операции Цикл - Операция.Значение = Неопределено; - Операция.Изменять = Ложь; +Процедура СброситьНастройкиИзменения() + Для Каждого Реквизит Из РеквизитыОбъекта Цикл + Реквизит.Значение = Неопределено; + Реквизит.Изменять = Ложь; КонецЦикла; + + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + Для Каждого Реквизит Из ЭтаФорма[ТабличнаяЧасть.Значение] Цикл + Реквизит.Значение = Неопределено; + Реквизит.Изменять = Ложь; + КонецЦикла; + КонецЦикла; КонецПроцедуры &НаСервереБезКонтекста Процедура ОтменитьВыполнениеЗадания(ИдентификаторЗадания); - ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); + МодульДлительныеОперации = ОбщийМодуль("ДлительныеОперации"); + МодульДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания); КонецПроцедуры +&НаКлиенте +Процедура НастройкаОтбораНажатие(Элемент) + Если Не ПустаяСтрока(ВидИзменяемыхОбъектов) Тогда + ОписаниеОповещения = Новый ОписаниеОповещения("ПриЗакрытииФормыВыбранныхОбъектов", ЭтотОбъект); + ОткрытьФорму(ПолноеИмяФормы("ВыбранныеЭлементы"), + Новый Структура("ВидИзменяемыхОбъектов, Настройки", ВидИзменяемыхОбъектов, КомпоновщикНастроек.Настройки), , , , , ОписаниеОповещения); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытииФормыВыбранныхОбъектов(Настройки, ДополнительныеПараметры) Экспорт + Если ТипЗнч(Настройки) = Тип("НастройкиКомпоновкиДанных") Тогда + КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); + ОбновитьНадписи(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ВыбранныеОбъекты(ОбновитьСписок = Ложь, ВключитьТабличныеЧастиВВыборку = Ложь, ТекстСообщенияОбОшибке = "") + + Если Не ОбновитьСписок И Не ПустаяСтрока(АдресСпискаВыбранных) Тогда + Возврат ПолучитьИзВременногоХранилища(АдресСпискаВыбранных); + КонецЕсли; + + Результат = Новый ДеревоЗначений; + + Если Не ПустаяСтрока(ВидИзменяемыхОбъектов) Тогда + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + ОбъектОбработка = РеквизитФормыВЗначение("Объект"); + ТекстЗапроса = ОбъектОбработка.ТекстЗапроса(ОбъектМетаданных); + СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); + + КомпоновщикНастроекКомпоновкиДанных = Новый КомпоновщикНастроекКомпоновкиДанных; + АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор); + КомпоновщикНастроекКомпоновкиДанных.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); + КомпоновщикНастроекКомпоновкиДанных.ЗагрузитьНастройки(КомпоновщикНастроек.Настройки); + Если ВключитьТабличныеЧастиВВыборку Тогда + УстановитьНастройкуСтруктурыВыводаРезультата(КомпоновщикНастроекКомпоновкиДанных.Настройки, ВключитьТабличныеЧастиВВыборку); + КонецЕсли; + + Если ОбъектыКоторыеНеУдалосьИзменить.Количество() > 0 И Не Объект.ИзменятьВТранзакции Тогда // повтор для неизмененных + ЭлементОтбора = КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + ЭлементОтбора.ПравоеЗначение = Новый СписокЗначений; + ЭлементОтбора.ПравоеЗначение.ЗагрузитьЗначения(ОбъектыКоторыеНеУдалосьИзменить.Выгрузить().ВыгрузитьКолонку("Объект")); + КонецЕсли; + + Результат = Новый ДеревоЗначений; + КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; + Попытка + МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, + КомпоновщикНастроекКомпоновкиДанных.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); + Исключение + ТекстСообщенияОбОшибке = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + Возврат Результат; + КонецПопытки; + + ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; + ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); + + ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; + ПроцессорВывода.УстановитьОбъект(Результат); + ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); + АдресСпискаВыбранных = ПоместитьВоВременноеХранилище(Результат, УникальныйИдентификатор); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаСервере +Процедура УстановитьНастройкуСтруктурыВыводаРезультата(Настройки, ДляИзменения = Ложь) + + Настройки.Структура.Очистить(); + Настройки.Выбор.Элементы.Очистить(); + + ГруппировкаКомпоновкиДанных = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + ГруппировкаКомпоновкиДанных.Использование = Истина; + + ПолеГруппировки = ГруппировкаКомпоновкиДанных.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); + ПолеГруппировки.Использование = Истина; + + ПолеВыбора = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных("Ссылка"); + ПолеВыбора.Использование = Истина; + + Если ДляИзменения Тогда + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл + ИмяТабличнойЧасти = ТабличнаяЧасть.Имя; + + ГруппировкаТаблицы = ГруппировкаКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); + ГруппировкаТаблицы.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); + ГруппировкаТаблицы.Использование = Истина; + + ПолеГруппировки = ГруппировкаТаблицы.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); + ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяТабличнойЧасти + ".НомерСтроки"); + ПолеГруппировки.Использование = Истина; + + ПолеВыбора = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных")); + ПолеВыбора.Поле = Новый ПолеКомпоновкиДанных(ИмяТабличнойЧасти + ".НомерСтроки"); + ПолеВыбора.Использование = Истина; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция КоличествоВыбранныхОбъектов(Пересчитать = Ложь, ДляИзменения = Ложь, ТекстСообщенияОбОшибке = "") + + Возврат ВыбранныеОбъекты(Пересчитать, ДляИзменения, ТекстСообщенияОбОшибке).Строки.Количество(); + +КонецФункции + +&НаСервере +Функция СхемаКомпоновкиДанных(ТекстЗапроса) + + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; + + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; + + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; + НаборДанных.Запрос = ТекстЗапроса; + НаборДанных.Имя = "НаборДанных1"; + + Возврат СхемаКомпоновкиДанных; + +КонецФункции + +&НаКлиенте +Процедура ВидИзменяемыхОбъектовВыборСделан(ВыбранныйОбъект, ДополнительныеПараметры) Экспорт + Если ВыбранныйОбъект <> Неопределено И ВидИзменяемыхОбъектов <> ВыбранныйОбъект Тогда + ВидИзменяемыхОбъектов = ВыбранныйОбъект; + ПерестроитьИнтерфейсФормыДляВыбранногоВидаОбъектов(); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ПерестроитьИнтерфейсФормыДляВыбранногоВидаОбъектов() + ИнициализироватьНастройкиФормы(); + ОбновитьВидимостьЭлементов(); + СформироватьПояснениеОНастроенныхИзменениях(); +КонецПроцедуры + +&НаСервере +Процедура ИнициализироватьНастройкиФормы() + ИнициализироватьКомпоновщикНастроек(); + ЗагрузитьМетаданныеОбъекта(); + ЗагрузитьИсториюОпераций(); + ЗаполнитьПодменюРанееИзмененныеРеквизиты(); + ПредставлениеИзменяемыхОбъектов = ПредставлениеИзменяемыхОбъектов(); + ОбновитьНадписиСервер(); +КонецПроцедуры + +&НаСервере +Функция ПредставлениеИзменяемыхОбъектов() + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + Результат = ОбъектМетаданных.Синоним; + Если ПустаяСтрока(Результат) Тогда + Результат = ОбъектМетаданных.Имя; + КонецЕсли; + Возврат Результат; +КонецФункции + +&НаСервере +Процедура ИнициализироватьКомпоновщикНастроек() + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + ОбъектОбработка = РеквизитФормыВЗначение("Объект"); + ТекстЗапроса = ОбъектОбработка.ТекстЗапроса(ОбъектМетаданных); + СхемаКомпоновкиДанных = СхемаКомпоновкиДанных(ТекстЗапроса); + КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, УникальныйИдентификатор))); + КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию); + УстановитьНастройкуСтруктурыВыводаРезультата(КомпоновщикНастроек.Настройки); + + Если ВыбранныеОбъектыВКонтексте.Количество() > 0 Тогда + ЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка"); + Если УчитыватьИерархию И ОбрабатыватьРекурсивно Тогда + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСпискеПоИерархии; + Иначе + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; + КонецЕсли; + ЭлементОтбора.ПравоеЗначение = Новый СписокЗначений; + ЭлементОтбора.ПравоеЗначение.ЗагрузитьЗначения(ВыбранныеОбъектыВКонтексте.ВыгрузитьЗначения()); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ОчиститьСведенияОбОбъекте() + УдаляемыеРеквизитыФормы = Новый Массив; + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + УдаляемыеРеквизитыФормы.Добавить(ТабличнаяЧасть.Значение); + Элементы.Удалить(Элементы.Найти("Страница" + ТабличнаяЧасть.Значение)); + КонецЦикла; + ИзменитьРеквизиты(, УдаляемыеРеквизитыФормы); + ТабличныеЧастиОбъекта.Очистить(); +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьМетаданныеОбъекта(СохранитьТекущиеНастройкиИзменения = Ложь, СохраненныеНастройки = Неопределено) + + Если СохранитьТекущиеНастройкиИзменения Тогда + ТекущиеНастройки = ТекущиеНастройкиИзменения(); + Если ТекущиеНастройки <> Неопределено Тогда + СохраненныеНастройки = ТекущиеНастройки.ОписаниеИзменения; + КонецЕсли; + КонецЕсли; + + ОчиститьСведенияОбОбъекте(); + + ЗаблокированныеРеквизиты = ЗаблокированныеРеквизиты(); + НередактируемыеРеквизиты = НередактируемыеРеквизиты(); + ФильтруемыеРеквизиты = ФильтруемыеРеквизиты(); + + ЗаполнитьРеквизитыОбъекта(ЗаблокированныеРеквизиты, НередактируемыеРеквизиты, ФильтруемыеРеквизиты); + Если Не КонтекстныйВызов Тогда + ЗаполнитьТабличныеЧастиОбъектов(ЗаблокированныеРеквизиты, НередактируемыеРеквизиты, ФильтруемыеРеквизиты); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ЗаблокированныеРеквизиты() + + Результат = Новый Массив; + МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); + + // Пытаемся определить, есть ли у объекта блокируемые реквизиты (подсистема запрета редактирования + // реквизитов объектов). Для этого в блоке Попытка .. Исключение пытаемся позвать у объекта метод + // ПолучитьБлокируемыеРеквизитыОбъекта. + Попытка + БлокируемыеРеквизитыОписание = МенеджерОбъекта.ПолучитьБлокируемыеРеквизитыОбъекта(); + Для Каждого БлокируемыйРеквизитОписание Из БлокируемыеРеквизитыОписание Цикл + Результат.Добавить(СокрЛП(РазложитьСтрокуВМассивПодстрок(БлокируемыйРеквизитОписание, ";")[0])); + КонецЦикла; + Исключение + КонецПопытки; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция НередактируемыеРеквизиты() + + Если Объект.ПоказыватьСлужебныеРеквизиты Тогда + Возврат Новый Массив; + КонецЕсли; + + МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + + Попытка + НеРедактируемые = МенеджерОбъекта.РеквизитыНеРедактируемыеВГрупповойОбработке(); + Исключение + НеРедактируемые = Новый Массив; + КонецПопытки; + Если НеРедактируемые.Количество() > 0 Тогда + Возврат НеРедактируемые; + КонецЕсли; + + Попытка + Редактируемые = МенеджерОбъекта.РеквизитыРедактируемыеВГрупповойОбработке(); + Исключение + Редактируемые = Неопределено; + КонецПопытки; + Если Редактируемые = Неопределено Или Редактируемые.Найти("*") <> Неопределено Тогда + Возврат НеРедактируемые; + КонецЕсли; + + Для Каждого ОписаниеРеквизита Из ОбъектМетаданных.СтандартныеРеквизиты Цикл + НеРедактируемые.Добавить(ОписаниеРеквизита.Имя); + КонецЦикла; + + Для Каждого ОписаниеРеквизита Из ОбъектМетаданных.Реквизиты Цикл + НеРедактируемые.Добавить(ОписаниеРеквизита.Имя); + КонецЦикла; + + Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл + Если Редактируемые.Найти(ТабличнаяЧасть.Имя + ".*") <> Неопределено Тогда + Прервать; + КонецЕсли; + Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл + НеРедактируемые.Добавить(ТабличнаяЧасть.Имя + "." + Реквизит.Имя); + КонецЦикла; + КонецЦикла; + + Для Каждого ИмяРедактируемого Из Редактируемые Цикл + Индекс = НеРедактируемые.Найти(ИмяРедактируемого); + Если Индекс = Неопределено Тогда + Продолжить; + КонецЕсли; + НеРедактируемые.Удалить(Индекс); + КонецЦикла; + + Возврат НеРедактируемые; +КонецФункции + +&НаСервере +Функция ФильтруемыеРеквизиты() + + Если Объект.ПоказыватьСлужебныеРеквизиты Тогда + Возврат Новый Массив; + КонецЕсли; + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + ФильтруемыеРеквизиты = ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных); + + ////////////////////////////////////////////////////////////////////////////////////////// + // Фильтрация по отключенным функциональными опциями + + ЗакрытыеФункциональнымиОпциями = Новый ТаблицаЗначений; + ЗакрытыеФункциональнымиОпциями.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); + + Для Каждого ОписаниеФО Из Метаданные.ФункциональныеОпции Цикл + + Если РазложитьСтрокуВМассивПодстрок(ОписаниеФО.Хранение.ПолноеИмя(), ".")[0] = "Константа" Тогда + ЗначениеФО = ПолучитьФункциональнуюОпцию(ОписаниеФО.Имя); + Если ТипЗнч(ЗначениеФО) = Тип("Булево") И ЗначениеФО = Истина Тогда + Продолжить; + КонецЕсли; + Иначе + // не фильтруем реквизиты, которые входят в параметризуемые функциональные опции + Продолжить; + КонецЕсли; + + Для Каждого РеквизитОМ Из ОбъектМетаданных.Реквизиты Цикл + Если ОписаниеФО.Состав.Содержит(РеквизитОМ) Тогда + НоваяСтрока = ЗакрытыеФункциональнымиОпциями.Добавить(); + НоваяСтрока.ИмяРеквизита = РеквизитОМ.Имя; + КонецЕСли; + КонецЦикла; + + КонецЦикла; + + ЗакрытыеФункциональнымиОпциями.Свернуть("ИмяРеквизита"); + + Для Каждого ЗакрытыйФО Из ЗакрытыеФункциональнымиОпциями Цикл + ФильтруемыеРеквизиты.Добавить(ЗакрытыйФО.ИмяРеквизита); + КонецЦикла; + + Возврат ФильтруемыеРеквизиты; + +КонецФункции + +&НаСервере +Процедура ЗаполнитьТабличныеЧастиОбъектов(ЗаблокированныеРеквизиты, НередактируемыеРеквизиты, ФильтруемыеРеквизиты) + + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + + // создание реквизитов для табличных частей + НовыеРеквизитыФормы = Новый Массив; + + КолонкиТаблиц = ОписанияКолонокТаблицыРеквизитов(); + + ТаблицыОбъекта = Новый Структура; + ТабличныеЧастиОбъекта.Очистить(); + Для Каждого ОписаниеТабличнойЧасти Из ОбъектМетаданных.ТабличныеЧасти Цикл + Если Не ПравоДоступа("Редактирование", ОписаниеТабличнойЧасти) Тогда + Продолжить; + КонецЕсли; + // фильтры табличных частей + Если НередактируемыеРеквизиты.Найти(ОписаниеТабличнойЧасти.Имя + ".*") <> Неопределено Тогда + Продолжить; + КонецЕсли; + Если ФильтруемыеРеквизиты.Найти(ОписаниеТабличнойЧасти.Имя + ".*") <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ДоступныеДляИзмененияРеквизиты = ДоступныеДляИзмененияРеквизиты(ОписаниеТабличнойЧасти, НередактируемыеРеквизиты, ФильтруемыеРеквизиты); + Если ДоступныеДляИзмененияРеквизиты.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ИмяРеквизита = "ТабличнаяЧасть" + ОписаниеТабличнойЧасти.Имя; + ТаблицаЗначений = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("ТаблицаЗначений"), , ОписаниеТабличнойЧасти.Синоним); + НовыеРеквизитыФормы.Добавить(ТаблицаЗначений); + + Для Каждого ОписаниеКолонки Из КолонкиТаблиц Цикл + РеквизитТаблицы = Новый РеквизитФормы(ОписаниеКолонки.Имя, ОписаниеКолонки.Тип, ТаблицаЗначений.Имя, ОписаниеКолонки.Представление); + НовыеРеквизитыФормы.Добавить(РеквизитТаблицы); + КонецЦикла; + + ТаблицыОбъекта.Вставить(ИмяРеквизита, ОписаниеТабличнойЧасти); + ТабличныеЧастиОбъекта.Добавить(ИмяРеквизита, ОписаниеТабличнойЧасти.Синоним); + КонецЦикла; + ИзменитьРеквизиты(НовыеРеквизитыФормы); + + Для Каждого ТаблицаОбъекта Из ТаблицыОбъекта Цикл + ИмяРеквизита = ТаблицаОбъекта.Ключ; + ИмяСтраницы = "Страница" + ИмяРеквизита; + Страница = Элементы.Добавить(ИмяСтраницы, Тип("ГруппаФормы"), Элементы.СоставОбъекта); + Страница.Вид = ВидГруппыФормы.Страница; + ОписаниеТабличнойЧасти = ТаблицаОбъекта.Значение; + Страница.Заголовок = ОписаниеТабличнойЧасти.Синоним; + + // создание элементов для табличных частей + ТаблицаФормы = Элементы.Добавить(ИмяРеквизита, Тип("ТаблицаФормы"), Страница); + ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + ТаблицаФормы.ПутьКДанным = ИмяРеквизита; + ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; + ТаблицаФормы.Заголовок = ОписаниеТабличнойЧасти.Синоним; + ТаблицаФормы.УстановитьДействие("ПередНачаломИзменения", "Подключаемый_ПередНачаломИзменения"); + ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; + ТаблицаФормы.ИзменятьСоставСтрок = Ложь; + + Для Каждого ОписаниеКолонки Из КолонкиТаблиц Цикл + Если ОписаниеКолонки.ВидПоля = Неопределено Тогда + Продолжить; + КонецЕсли; + ИмяРеквизита = ОписаниеКолонки.Имя; + ИмяЭлемента = ТаблицаФормы.Имя + ИмяРеквизита; + КолонкаТаблицы = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаФормы); + Если ОписаниеКолонки.Картинка <> Неопределено Тогда + КолонкаТаблицы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет; + КолонкаТаблицы.КартинкаШапки = ОписаниеКолонки.Картинка; + КонецЕсли; + КолонкаТаблицы.ПутьКДанным = ТаблицаОбъекта.Ключ + "." + ИмяРеквизита; + КолонкаТаблицы.Вид = ОписаниеКолонки.ВидПоля; + КолонкаТаблицы.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе; + КолонкаТаблицы.ТолькоПросмотр = ОписаниеКолонки.ТолькоПросмотр; + Если ОписаниеКолонки.Действия <> Неопределено Тогда + Для Каждого Действие Из ОписаниеКолонки.Действия Цикл + КолонкаТаблицы.УстановитьДействие(Действие.Ключ, Действие.Значение); + КонецЦикла; + КонецЕсли; + КонецЦикла; + + ДоступныеДляИзмененияРеквизиты = ДоступныеДляИзмененияРеквизиты(ОписаниеТабличнойЧасти, НередактируемыеРеквизиты, ФильтруемыеРеквизиты); + Для Каждого ОписаниеРеквизита Из ДоступныеДляИзмененияРеквизиты Цикл + Реквизит = ЭтаФорма[ТаблицаОбъекта.Ключ].Добавить(); + Реквизит.Имя = ОписаниеРеквизита.Имя; + Реквизит.Представление = ?(ПустаяСтрока(ОписаниеРеквизита.Синоним), ОписаниеРеквизита.Имя, ОписаниеРеквизита.Синоним); + Реквизит.ДопустимыеТипы = ОписаниеРеквизита.Тип; + КонецЦикла; + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Функция ДоступныеДляИзмененияРеквизиты(ОписаниеТабличнойЧасти, НередактируемыеРеквизиты, ФильтруемыеРеквизиты) + + Результат = Новый Массив; + + Для Каждого ОписаниеРеквизита Из ОписаниеТабличнойЧасти.Реквизиты Цикл + Если Не ПравоДоступа("Редактирование", ОписаниеРеквизита) Тогда + Продолжить; + КонецЕсли; + // фильтры реквизитов табличных частей + Если НередактируемыеРеквизиты.Найти(ОписаниеТабличнойЧасти.Имя + "." + ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + Если ФильтруемыеРеквизиты.Найти(ОписаниеТабличнойЧасти.Имя + "." + ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Результат.Добавить(ОписаниеРеквизита); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаСервере +Функция ОписанияКолонокТаблицыРеквизитов() + + КолонкиТаблиц = Новый ТаблицаЗначений; + КолонкиТаблиц.Колонки.Добавить("Имя"); + КолонкиТаблиц.Колонки.Добавить("Тип"); + КолонкиТаблиц.Колонки.Добавить("Представление"); + КолонкиТаблиц.Колонки.Добавить("ВидПоля"); + КолонкиТаблиц.Колонки.Добавить("Действия"); + КолонкиТаблиц.Колонки.Добавить("ТолькоПросмотр", Новый ОписаниеТипов("Булево")); + КолонкиТаблиц.Колонки.Добавить("Картинка"); + + ОписаниеКолонки = КолонкиТаблиц.Добавить(); + ОписаниеКолонки.Имя = "Имя"; + ОписаниеКолонки.Тип = Новый ОписаниеТипов("Строка"); + + ОписаниеКолонки = КолонкиТаблиц.Добавить(); + ОписаниеКолонки.Имя = "Представление"; + ОписаниеКолонки.Тип = Новый ОписаниеТипов("Строка"); + ОписаниеКолонки.Представление = НСтр("ru = 'Реквизит'"); + ОписаниеКолонки.ВидПоля = ВидПоляФормы.ПолеВвода; + ОписаниеКолонки.ТолькоПросмотр = Истина; + + ОписаниеКолонки = КолонкиТаблиц.Добавить(); + ОписаниеКолонки.Имя = "Изменять"; + ОписаниеКолонки.Тип = Новый ОписаниеТипов("Булево"); + ОписаниеКолонки.ВидПоля = ВидПоляФормы.ПолеФлажка; + ОписаниеКолонки.Картинка = БиблиотекаКартинок.Изменить; + ОписаниеКолонки.Действия = Новый Структура("ПриИзменении", "Подключаемый_ПриИзмененииФлажка"); + + ОписаниеКолонки = КолонкиТаблиц.Добавить(); + ОписаниеКолонки.Имя = "Значение"; + ОписаниеКолонки.Тип = ВсеТипы(); + ОписаниеКолонки.Представление = НСтр("ru = 'Новое значение'"); + ОписаниеКолонки.ВидПоля = ВидПоляФормы.ПолеВвода; + ОписаниеКолонки.Действия = Новый Структура("ПриИзменении", "Подключаемый_ЗначениеПриИзменении"); + + ОписаниеКолонки = КолонкиТаблиц.Добавить(); + ОписаниеКолонки.Имя = "ДопустимыеТипы"; + ОписаниеКолонки.Тип = Новый ОписаниеТипов("ОписаниеТипов"); + + Возврат КолонкиТаблиц; + +КонецФункции + +&НаСервере +Функция ВсеТипы() + Результат = Неопределено; + Реквизиты = ПолучитьРеквизиты("РеквизитыОбъекта"); + Для Каждого Реквизит Из Реквизиты Цикл + Если Реквизит.Имя = "Значение" Тогда + Результат = Реквизит.ТипЗначения; + Прервать; + Конецесли; + КонецЦикла; + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура УстановитьОграниченияВыбираемыхТиповИПараметрыВыбораЗначения(ТабличноеПоле) + Если ТабличноеПоле.ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ПолеВвода = ТабличноеПоле.ПодчиненныеЭлементы[ТабличноеПоле.Имя + "Значение"]; + ПолеВвода.ОграничениеТипа = ТабличноеПоле.ТекущиеДанные.ДопустимыеТипы; + + Если ТабличноеПоле <> Элементы.РеквизитыОбъекта Тогда + Возврат; + КонецЕсли; + + ПараметрыВыбораМассив = Новый Массив; + + Если НЕ ПустаяСтрока(ТабличноеПоле.ТекущиеДанные.ПараметрыВыбора) Тогда + УстановитьПараметрыВыбораСервер(ТабличноеПоле.ТекущиеДанные.ПараметрыВыбора, ПараметрыВыбораМассив) + КонецЕсли; + + Если Не ПустаяСтрока(ТабличноеПоле.ТекущиеДанные.СвязиПараметровВыбора) Тогда + + Для Индекс = 1 по СтрЧислоСтрок(ТабличноеПоле.ТекущиеДанные.СвязиПараметровВыбора) Цикл + + СвязьПараметровВыбораСтрока = СтрПолучитьСтроку(ТабличноеПоле.ТекущиеДанные.СвязиПараметровВыбора, Индекс); + РазложенныеСтроки = РазложитьСтрокуВМассивПодстрок(СвязьПараметровВыбораСтрока, ";"); + ИмяПараметра = СокрЛП(РазложенныеСтроки[0]); + ИмяРеквизита = СокрЛП(РазложенныеСтроки[1]); + НайденныеСтроки = РеквизитыОбъекта.НайтиСтроки(Новый Структура("ВидОперации,Имя", 1, ИмяРеквизита)); + Если НайденныеСтроки.Количество() = 1 Тогда + Значение = НайденныеСтроки[0].Значение; + Если ЗначениеЗаполнено(Значение) Тогда + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора(ИмяПараметра, Значение)); + КонецЕсли; + КонецЕсли; + + КонецЦикла; + + КонецЕсли; + + Если ЗначениеЗаполнено(ТабличноеПоле.ТекущиеДанные.Свойство) Тогда + ПараметрыВыбораМассив.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ТабличноеПоле.ТекущиеДанные.Свойство)); + КонецЕсли; + + ПолеВвода.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыВыбораМассив); + + ВыборГруппИЭлементов = ТабличноеПоле.ТекущиеДанные.ВыборГруппИЭлементов; + + Если ВыборГруппИЭлементов <> "" Тогда + Если ВыборГруппИЭлементов = "Группы" Тогда + ПолеВвода.ВыборГруппИЭлементов = ГруппыИЭлементы.Группы; + ИначеЕсли ВыборГруппИЭлементов = "ГруппыИЭлементы" Тогда + ПолеВвода.ВыборГруппИЭлементов = ГруппыИЭлементы.ГруппыИЭлементы; + ИначеЕсли ВыборГруппИЭлементов = "Элементы" Тогда + ПолеВвода.ВыборГруппИЭлементов = ГруппыИЭлементы.Элементы; + Иначе + ПолеВвода.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; + КонецЕсли; + Иначе + ПолеВвода.ВыборГруппИЭлементов = ГруппыИЭлементы.Авто; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСчетчикиИзменяемыхРеквизитов(Знач ТаблицаФормы = Неопределено) + + СписокТаблиц = Новый Массив; + Если ТаблицаФормы <> Неопределено Тогда + СписокТаблиц.Добавить(ТаблицаФормы); + Иначе + СписокТаблиц.Добавить(Элементы.РеквизитыОбъекта); + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + СписокТаблиц.Добавить(Элементы[ТабличнаяЧасть.Значение]); + КонецЦикла; + КонецЕсли; + + Для Каждого ТаблицаФормы Из СписокТаблиц Цикл + ТабличнаяЧасть = ЭтотОбъект[ТаблицаФормы.Имя]; + КоличествоИзменяемых = 0; + Для Каждого Реквизит Из ТабличнаяЧасть Цикл + Если Реквизит.Изменять Тогда + КоличествоИзменяемых = КоличествоИзменяемых + 1; + КонецЕсли; + КонецЦикла; + + Страница = ТаблицаФормы.Родитель; + Страница.Заголовок = ТаблицаФормы.Заголовок + ?(КоличествоИзменяемых = 0, "", " (" + КоличествоИзменяемых+ ")"); + КонецЦикла; + +КонецПроцедуры + +&НаСервере +Процедура ОбновитьВидимостьЭлементов() + Если ТабличныеЧастиОбъекта.Количество() = 0 Тогда + Элементы.СоставОбъекта.ОтображениеСтраниц = ОтображениеСтраницФормы.Нет; + Иначе + Элементы.СоставОбъекта.ОтображениеСтраниц = ОтображениеСтраницФормы.ЗакладкиСверху; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ЗаполнитьРеквизитыОбъекта(БлокируемыеРеквизиты, НеРедактируемые, ФильтруемыеРеквизиты) + + // Получаем менеджер объекта для получения массивов не редактируемых + // интерактивно и блокируемых реквизитов + МенеджерОбъекта = МенеджерОбъектаПоПолномуИмени(ВидИзменяемыхОбъектов); + ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов); + РеквизитыОбъекта.Очистить(); + + ДобавитьРеквизитыВНабор(ОбъектМетаданных.СтандартныеРеквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты, + ОбъектМетаданных); + + ДобавитьРеквизитыВНабор(ОбъектМетаданных.Реквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты, + ОбъектМетаданных); + + РеквизитыОбъекта.Сортировать("Представление Возр"); + + ИспользуютсяДопРеквизиты = Ложь; + ИспользуютсяДопСведения = Ложь; + Если ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщийМодуль("УправлениеСвойствами"); + Если МодульУправлениеСвойствами <> Неопределено Тогда + ИспользуютсяДопРеквизиты = МодульУправлениеСвойствами.ИспользоватьДопРеквизиты(МенеджерОбъекта.ПустаяСсылка()); + ИспользуютсяДопСведения = МодульУправлениеСвойствами.ИспользоватьДопСведения (МенеджерОбъекта.ПустаяСсылка()); + + Если ИспользуютсяДопРеквизиты Или ИспользуютсяДопСведения Тогда + ДобавитьДополнительныеРеквизитыИСведенияВНабор(); + КонецЕсли; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьДополнительныеРеквизитыИСведенияВНабор() + + Если Не КонтекстныйВызов Тогда + МодульУправлениеСвойствамиСлужебный = ОбщийМодуль("УправлениеСвойствамиСлужебный"); + Если МодульУправлениеСвойствамиСлужебный <> Неопределено Тогда + ДобавитьСвойствоВТаблицуРеквизитов(МодульУправлениеСвойствамиСлужебный.СписокСвойствДляВидаОбъектов(ВидИзменяемыхОбъектов, "ДополнительныеРеквизиты")); + ДобавитьСвойствоВТаблицуРеквизитов(МодульУправлениеСвойствамиСлужебный.СписокСвойствДляВидаОбъектов(ВидИзменяемыхОбъектов, "ДополнительныеСведения"), Ложь); + КонецЕсли; + Возврат; + КонецЕсли; + + ТаблицаДопРеквизитов = Новый ТаблицаЗначений; + ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + ТаблицаДопРеквизитов.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + ТаблицаДопРеквизитов.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + + ТаблицаДопСведений = Новый ТаблицаЗначений; + ТаблицаДопСведений.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); + ТаблицаДопСведений.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); + ТаблицаДопСведений.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); + + Для Каждого ДанныеОбъекта Из ВыбранныеОбъекты(Истина).Строки Цикл + ОбъектДляИзменения = ДанныеОбъекта.Ссылка; + ВидОбъектаПоСсылке = ВидОбъектаПоСсылке(ОбъектДляИзменения); + Если (ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") + И ОбъектЯвляетсяГруппой(ОбъектДляИзменения) Тогда + Продолжить; + КонецЕсли; + + МодульУправлениеСвойствами = ОбщийМодуль("УправлениеСвойствами"); + ДопРеквизиты = МодульУправлениеСвойствами.ПолучитьСписокСвойств(ОбъектДляИзменения, , Ложь); + Для Каждого СвойствоСсылка Из ДопРеквизиты Цикл + ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); + НоваяСтрока = ТаблицаДопРеквизитов.Добавить(); + НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; + НоваяСтрока.Наименование = ОбъектСвойство.Наименование; + НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; + КонецЦикла; + + ДопСведения = МодульУправлениеСвойствами.ПолучитьСписокСвойств(ОбъектДляИзменения, Ложь); + Для Каждого СвойствоСсылка Из ДопСведения Цикл + ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); + НоваяСтрока = ТаблицаДопСведений.Добавить(); + НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; + НоваяСтрока.Наименование= ОбъектСвойство.Наименование; + НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; + КонецЦикла; + КонецЦикла; + + ТаблицаДопРеквизитов.Свернуть("Свойство,Наименование,ТипЗначения"); + ТаблицаДопРеквизитов.Сортировать("Наименование Возр"); + ТаблицаДопСведений.Свернуть("Свойство,Наименование,ТипЗначения"); + ТаблицаДопСведений.Сортировать("Наименование Возр"); + + ДобавитьСвойствоВТаблицуРеквизитов(ТаблицаДопРеквизитов); + ДобавитьСвойствоВТаблицуРеквизитов(ТаблицаДопСведений, Ложь); + +КонецПроцедуры + +&НаСервере +Процедура ДобавитьСвойствоВТаблицуРеквизитов(ТаблицаДопСвойств, ЭтоДопРеквизит = Истина) + + Для Каждого СтрокаТаблицы Из ТаблицаДопСвойств Цикл + Реквизит = РеквизитыОбъекта.Добавить(); + Реквизит.ВидОперации = ?(ЭтоДопРеквизит, 2, 3); + Реквизит.Свойство = СтрокаТаблицы.Свойство; + Реквизит.Представление = СтрокаТаблицы.Наименование; + Реквизит.ДопустимыеТипы = СтрокаТаблицы.ТипЗначения; + КонецЦикла; + +КонецПроцедуры + +// Добавляет в набор операций (фактически набор реквизитов и свойств) те, +// которые могут быть отредактированы +// В него не попадают: +// не редактируемые - зависят от настроек самого объекта метаданных +// фильтруемые - задаются для класса объектов метаданных +// В него попадают с исключением: +// БлокируемыеРеквизиты - реквизиты, которые могут редактироваться +// только при наличии у пользователя роли РедактированиеРеквизитовОбъектов +// Передаваемые параметры: +// Реквизиты - коллекция реквизитов (стандартных реквизитов) объекта метаданных +// НеРедактируемые, ФильтруемыеРеквизиты - массив - фильтр по реквизитам +// БлокируемыеРеквизиты - массив - блокируемые реквизиты +// +&НаСервере +Процедура ДобавитьРеквизитыВНабор(Реквизиты, + НеРедактируемые, + ФильтруемыеРеквизиты, + БлокируемыеРеквизиты, + ОбъектМетаданных) + + Для Каждого ОписаниеРеквизита Из Реквизиты Цикл + Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") Тогда + Если НЕ ПравоДоступа("Редактирование", Метаданные.НайтиПоПолномуИмени(ВидИзменяемыхОбъектов), , ОписаниеРеквизита.Имя) Тогда + Продолжить; + КонецЕсли; + Иначе + Если НЕ ПравоДоступа("Редактирование", ОписаниеРеквизита) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + Если НеРедактируемые.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + Если ФильтруемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + Продолжить; + КонецЕсли; + + ВыборГруппИЭлементов = ""; + + Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") Тогда + + Если ОписаниеРеквизита.Имя = "Родитель" + ИЛИ ОписаниеРеквизита.Имя = "Parent" Тогда + + ВыборГруппИЭлементов = "Группы"; + + ИначеЕсли ОписаниеРеквизита.Имя = "Владелец" + ИЛИ ОписаниеРеквизита.Имя = "Owner" Тогда + + Если ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.Элементам Тогда + + ВыборГруппИЭлементов = "Элементы"; + + ИначеЕсли ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.ГруппамИЭлементам Тогда + + ВыборГруппИЭлементов = "ГруппыИЭлементы"; + + ИначеЕсли ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.Группам Тогда + + ВыборГруппИЭлементов = "Группы"; + + КонецЕсли; + + КонецЕсли; + + Иначе + + ЭтоСсылка = Ложь; + Для Каждого Тип Из ОписаниеРеквизита.Тип.Типы() Цикл + Если ЭтоСсылка(Тип) Тогда + ЭтоСсылка = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если ЭтоСсылка Тогда + Если ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда + ВыборГруппИЭлементов = "Группы"; + ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы Тогда + ВыборГруппИЭлементов = "ГруппыИЭлементы"; + ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда + ВыборГруппИЭлементов = "Элементы"; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + ДопустимыеТипыСтрока = XMLСтрока(Новый ХранилищеЗначения(ОписаниеРеквизита.Тип)); + + ПараметрыВыбораСтрока = ""; + + Для Каждого ОписаниеПараметраВыбора Из ОписаниеРеквизита.ПараметрыВыбора Цикл + + ТекущийПВСтрока = "[ПолеОтбора];[ТипСтрока];[ЗначениеСтрока]"; + + ТипЗначения = ТипЗнч(ОписаниеПараметраВыбора.Значение); + + Если ТипЗначения = Тип("ФиксированныйМассив") Тогда + + СтроковоеПредставлениеТипа = "ФиксированныйМассив"; + ЗначениеСтрока = ""; + + Для Каждого Элемент Из ОписаниеПараметраВыбора.Значение Цикл + + ЗначениеСтрокаШаблон = "[Тип]%[Значение]"; + ЗначениеСтрокаШаблон = СтрЗаменить(ЗначениеСтрокаШаблон, "[Тип]", СтроковоеПредставлениеТипа(ТипЗнч(Элемент))); + ЗначениеСтрокаШаблон = СтрЗаменить(ЗначениеСтрокаШаблон, "[Значение]", XMLСтрока(Элемент)); + ЗначениеСтрока = ЗначениеСтрока + ?(ПустаяСтрока(ЗначениеСтрока), "", "%%") + ЗначениеСтрокаШаблон; + + КонецЦикла; + + Иначе + СтроковоеПредставлениеТипа = СтроковоеПредставлениеТипа(ТипЗначения); + ЗначениеСтрока = XMLСтрока(ОписаниеПараметраВыбора.Значение); + КонецЕсли; + + Если Не ПустаяСтрока(ЗначениеСтрока) Тогда + + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ПолеОтбора]", ОписаниеПараметраВыбора.Имя); + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ТипСтрока]", СтроковоеПредставлениеТипа); + ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ЗначениеСтрока]", ЗначениеСтрока); + + ПараметрыВыбораСтрока = ПараметрыВыбораСтрока + ТекущийПВСтрока + Символы.ПС; + + КонецЕсли; + + КонецЦикла; + + ПараметрыВыбораСтрока = Лев(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-1); + + СвязиПараметровВыбораСтрока = ""; + + Для Каждого ОписаниеСвязиПараметровВыбора Из ОписаниеРеквизита.СвязиПараметровВыбора Цикл + ТекущаяСПВСтрока = "[ИмяПараметра];[ИмяРеквизита]"; + ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяПараметра]", ОписаниеСвязиПараметровВыбора.Имя); + ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяРеквизита]", ОписаниеСвязиПараметровВыбора.ПутьКДанным); + СвязиПараметровВыбораСтрока = СвязиПараметровВыбораСтрока + ТекущаяСПВСтрока + Символы.ПС; + КонецЦикла; + + СвязиПараметровВыбораСтрока = Лев(СвязиПараметровВыбораСтрока, СтрДлина(СвязиПараметровВыбораСтрока)-1); + + НоваяОперация = РеквизитыОбъекта.Добавить(); + НоваяОперация.Имя = ОписаниеРеквизита.Имя; + НоваяОперация.Представление = ?(ПустаяСтрока(ОписаниеРеквизита.Синоним), ОписаниеРеквизита.Имя, ОписаниеРеквизита.Синоним); + НоваяОперация.ВидОперации = 1; // реквизит + НоваяОперация.ДопустимыеТипы = ОписаниеРеквизита.Тип; + НоваяОперация.ПараметрыВыбора = ПараметрыВыбораСтрока; + НоваяОперация.СвязиПараметровВыбора = СвязиПараметровВыбораСтрока; + НоваяОперация.ВыборГруппИЭлементов = ВыборГруппИЭлементов; + + Если БлокируемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда + НоваяОперация.ЗаблокированныйРеквизит = Истина; + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +// Получает массив реквизитов, редактирование которых не предусмотрено +// на уровне конфигурации +// +&НаСервере +Функция ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных) + + ОбработкаОбъект = РеквизитФормыВЗначение("Объект"); + ФильтрXML = ОбработкаОбъект.ПолучитьМакет("ФильтрРеквизитов").ПолучитьТекст(); + + ФильтрТаблица = ПрочитатьXMLВТаблицу(ФильтрXML).Данные; + + // Реквизиты, блокируемые для любого типа объектов метаданных + ОбщийФильтр = ФильтрТаблица.НайтиСтроки(Новый Структура("ObjectType", "*")); + + // Реквизиты, блокируемые для указанного типа объектов метаданных + ФильтрПоТипуОМ = ФильтрТаблица.НайтиСтроки( + Новый Структура("ObjectType", + ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных))); + + ФильтруемыеРеквизиты = Новый Массив; + + Для Каждого СтрокаОписание Из ОбщийФильтр Цикл + ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + КонецЦикла; + + Для Каждого СтрокаОписание Из ФильтрПоТипуОМ Цикл + ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); + КонецЦикла; + + ПрефиксУдаляемыхРеквизитов = "Удалить"; + Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл + Если НРег(Лев(Реквизит.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда + ФильтруемыеРеквизиты.Добавить(Реквизит.Имя); + КонецЕсли; + КонецЦикла; + Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл + Если НРег(Лев(ТабличнаяЧасть.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда + ФильтруемыеРеквизиты.Добавить(ТабличнаяЧасть.Имя + ".*"); + Иначе + Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл + Если НРег(Лев(Реквизит.Имя, СтрДлина(ПрефиксУдаляемыхРеквизитов))) = НРег(ПрефиксУдаляемыхРеквизитов) Тогда + ФильтруемыеРеквизиты.Добавить(ТабличнаяЧасть.Имя + "." + Реквизит.Имя); + КонецЕсли; + КонецЦикла; + КонецЕсли; + КонецЦикла; + + Возврат ФильтруемыеРеквизиты; + +КонецФункции + +&НаСервере +Функция ЭлементыОтбораБезИерархии(Знач ЭлементыОтбора) + Результат = Новый Массив; + Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл + Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда + ПодчиненныеОтборы = ЭлементыОтбораБезИерархии(ЭлементОтбора.Элементы); + Для Каждого ПодчиненныйОтбор Из ПодчиненныеОтборы Цикл + Результат.Добавить(ПодчиненныйОтбор); + КонецЦикла; + Иначе + Результат.Добавить(ЭлементОтбора); + КонецЕсли; + КонецЦикла; + Возврат Результат; +КонецФункции + +&НаСервере +Процедура СформироватьПояснениеОНастроенныхИзменениях() + + ЕстьОтборПоСтрокам = Ложь; + Для Каждого ЭлементОтбора Из ЭлементыОтбораБезИерархии(КомпоновщикНастроек.Настройки.Отбор.Элементы) Цикл + Если Не ЭлементОтбора.Использование Тогда + Продолжить; + КонецЕсли; + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + ИмяТабличнойЧасти = Сред(ТабличнаяЧасть.Значение, СтрДлина("ТабличнаяЧасть") + 1); + Если Лев(ЭлементОтбора.ЛевоеЗначение, СтрДлина(ИмяТабличнойЧасти)) = ИмяТабличнойЧасти Тогда + ЕстьОтборПоСтрокам = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ИзменяемыеТабличныеЧасти = Новый Соответствие; + Для Каждого ТабличнаяЧасть Из ТабличныеЧастиОбъекта Цикл + ИзменяемыеРеквизиты = Новый Массив; + Для Каждого Реквизит Из ЭтотОбъект[ТабличнаяЧасть.Значение] Цикл + Если Реквизит.Изменять Тогда + ИзменяемыеРеквизиты.Добавить(Реквизит.Представление); + КонецЕсли; + КонецЦикла; + Если ИзменяемыеРеквизиты.Количество() > 0 Тогда + ИзменяемыеТабличныеЧасти.Вставить(ТабличнаяЧасть.Представление, ИзменяемыеРеквизиты); + КонецЕсли; + КонецЦикла; + + ИзменяемыеРеквизиты = Новый Массив; + Для Каждого Реквизит Из РеквизитыОбъекта Цикл + Если Реквизит.Изменять Тогда + ИзменяемыеРеквизиты.Добавить(Реквизит.Представление); + КонецЕсли; + КонецЦикла; + + ЕстьВыбранныеОбъекты = КоличествоВыбранныхОбъектов() > 0; + + Пояснение = ""; + Если ИзменяемыеРеквизиты.Количество() > 3 Тогда + Пояснение = "(" + ИзменяемыеРеквизиты.Количество() +")"; + Иначе + Для Каждого Реквизит Из ИзменяемыеРеквизиты Цикл + Если Не ПустаяСтрока(Пояснение) Тогда + Пояснение = Пояснение + ", "; + КонецЕсли; + Пояснение = Пояснение + """" + Реквизит + """"; + КонецЦикла; + КонецЕсли; + + Если ИзменяемыеРеквизиты.Количество() = 1 Тогда + Пояснение = НСтр("ru = 'реквизит'") + " " + Пояснение; + ИначеЕсли ИзменяемыеРеквизиты.Количество() > 1 Тогда + Пояснение = НСтр("ru = 'реквизиты'") + " " + Пояснение; + КонецЕсли; + + Если Не ПустаяСтрока(Пояснение) Тогда + Пояснение = Пояснение + " " + НСтр("ru = 'в выбранных элементах'"); + КонецЕсли; + + Для Каждого ТабличнаяЧасть Из ИзменяемыеТабличныеЧасти Цикл + ИзменяемыеРеквизиты = ТабличнаяЧасть.Значение; + Если ИзменяемыеРеквизиты.Количество() > 3 Тогда + Если Не ПустаяСтрока(Пояснение) Тогда + Пояснение = Пояснение + ", "; + КонецЕсли; + Пояснение = Пояснение + ПодставитьПараметрыВСтроку( + НСтр("ru = 'реквизиты (%1)'"), ИзменяемыеРеквизиты.Количество()); + Иначе + Для Каждого Реквизит Из ИзменяемыеРеквизиты Цикл + Если Не ПустаяСтрока(Пояснение) Тогда + Пояснение = Пояснение + ", "; + КонецЕсли; + Если ИзменяемыеРеквизиты.Найти(Реквизит) = 0 Тогда + Если ИзменяемыеРеквизиты.Количество() = 1 Тогда + Пояснение = Пояснение + НСтр("ru = 'реквизит'") + " "; + ИначеЕсли ИзменяемыеРеквизиты.Количество() > 1 Тогда + Пояснение = Пояснение + НСтр("ru = 'реквизиты'") + " "; + КонецЕсли; + КонецЕсли; + Пояснение = Пояснение + """" + Реквизит + """"; + КонецЦикла; + КонецЕсли; + Пояснение = Пояснение + " " + + ПодставитьПараметрыВСтроку(НСтр("ru = 'в табличной части ""%1""'"), ТабличнаяЧасть.Ключ); + КонецЦикла; + + Если Не ПустаяСтрока(Пояснение) Тогда + Если ИзменяемыеТабличныеЧасти.Количество() > 0 Тогда + Если ЕстьОтборПоСтрокам Тогда + Пояснение = Пояснение + " " + НСтр("ru = 'в тех строках выбранных элементов, которые удовлетворяют условиям отбора'") + Иначе + Пояснение = Пояснение + " " + НСтр("ru = 'во всех строках выбранных элементов'") + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если ЕстьВыбранныеОбъекты Тогда + Если Не ПустаяСтрока(Пояснение) Тогда + Пояснение = НСтр("ru = 'Изменить'") + " " + Пояснение + "."; + Иначе + Пояснение = НСтр("ru = 'Выполнить перезапись выбранных элементов.'"); + КонецЕсли; + Иначе + Пояснение = НСтр("ru = 'Не выбраны элементы, реквизиты которых необходимо изменить.'"); + КонецЕсли; + + Элементы.ПояснениеОНастроенныхИзменениях.Заголовок = Пояснение; +КонецПроцедуры + +&НаСервере +Процедура ОбновитьНадписьКоличествоВыбранных() + ЕстьОшибкиВОтборе = Ложь; + Если ЕстьНастроенныеОтборы() Тогда + ТекстСообщенияОбОшибке = ""; + КоличествоВыбранныхОбъектов = КоличествоВыбранныхОбъектов(Истина, , ТекстСообщенияОбОшибке); + Если ПустаяСтрока(ТекстСообщенияОбОшибке) Тогда + ТекстНадписи = ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выбрано элементов: %1'"), КоличествоВыбранныхОбъектов); + Иначе + ЕстьОшибкиВОтборе = Истина; + ТекстНадписи = ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элементы не выбраны. %1'"), ТекстСообщенияОбОшибке); + КонецЕсли; + Иначе + ТекстНадписи = НСтр("ru = 'Изменять все элементы'"); + КонецЕсли; + + Элементы.НастройкаОтбора.Заголовок = ТекстНадписи; + Элементы.НастройкаОтбора.Гиперссылка = Не ЕстьОшибкиВОтборе; + +КонецПроцедуры + + +&НаСервере +Процедура ЗаполнитьПодменюРанееИзмененныеРеквизиты() + + МестоРазмещенияКоманд = Элементы.РанееИзмененныеРеквизиты; + + УдаляемыеЭлементы = Новый Массив; + Для Каждого Настройка Из МестоРазмещенияКоманд.ПодчиненныеЭлементы Цикл + Если Настройка.Имя = "Заглушка" Тогда + Продолжить; + КонецЕсли; + УдаляемыеЭлементы.Добавить(Настройка); + КонецЦикла; + + Для Каждого Настройка Из УдаляемыеЭлементы Цикл + Команды.Удалить(Команды[Настройка.Имя]); + Элементы.Удалить(Настройка); + КонецЦикла; + + Для Каждого Настройка Из ИсторияОперацийСписок Цикл + НомерКоманды = ИсторияОперацийСписок.Индекс(Настройка); + ИмяКоманды = МестоРазмещенияКоманд.Имя + "НастройкаИзменений" + НомерКоманды; + + КомандаФормы = Команды.Добавить(ИмяКоманды); + КомандаФормы.Действие = "Подключаемый_УстановитьНастройку"; + КомандаФормы.Заголовок = Настройка.Представление; + КомандаФормы.ИзменяетСохраняемыеДанные = Ложь; + + НовыйЭлемент = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), МестоРазмещенияКоманд); + НовыйЭлемент.Вид = ВидКнопкиФормы.КнопкаКоманднойПанели; + НовыйЭлемент.ИмяКоманды = ИмяКоманды; + КонецЦикла; + + Элементы.Заглушка.Видимость = ИсторияОперацийСписок.Количество() = 0; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьНастройкуИзменения(Знач Настройка) + + СброситьНастройкиИзменения(); + + ЕстьЗаблокированные = Ложь; + + // для обеспечения обратной совместимости с настройками, сохраненными в БСП 2.1 + Если ТипЗнч(Настройка) <> Тип("Структура") Тогда + Настройка = Новый Структура("Реквизиты,ТабличныеЧасти", Настройка, Новый Структура); + КонецЕсли; + + Для Каждого ИзменяемыйРеквизит Из Настройка.Реквизиты Цикл + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("ВидОперации", ИзменяемыйРеквизит.ВидОперации); + Если ИзменяемыйРеквизит.ВидОперации = 1 Тогда // реквизит объекта + СтруктураПоиска.Вставить("Имя", ИзменяемыйРеквизит.ИмяРеквизита); + Иначе + СтруктураПоиска.Вставить("Свойство", ИзменяемыйРеквизит.Свойство); + КонецЕсли; + + НайденныеСтроки = РеквизитыОбъекта.НайтиСтроки(СтруктураПоиска); + Если НайденныеСтроки.Количество() > 0 Тогда + Если НайденныеСтроки[0].ЗаблокированныйРеквизит Тогда + ЕстьЗаблокированные = Истина; + Продолжить; + КонецЕсли; + НайденныеСтроки[0].Значение = ИзменяемыйРеквизит.Значение; + НайденныеСтроки[0].Изменять = Истина; + КонецЕсли; + КонецЦикла; + + Для Каждого ТабличнаяЧасть Из Настройка.ТабличныеЧасти Цикл + Для Каждого ИзменяемыйРеквизит Из ТабличнаяЧасть.Значение Цикл + СтруктураПоиска = Новый Структура; + СтруктураПоиска.Вставить("Имя", ИзменяемыйРеквизит.Имя); + Если Элементы.Найти("ТабличнаяЧасть" + ТабличнаяЧасть.Ключ) <> Неопределено Тогда + НайденныеСтроки = ЭтаФорма["ТабличнаяЧасть" + ТабличнаяЧасть.Ключ].НайтиСтроки(СтруктураПоиска); + Если НайденныеСтроки.Количество() > 0 Тогда + НайденныеСтроки[0].Значение = ИзменяемыйРеквизит.Значение; + НайденныеСтроки[0].Изменять = Истина; + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + Если ЕстьЗаблокированные Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Некоторые реквизиты заблокированы для изменения, изменения не установлены.'")); + КонецЕсли; + + ОбновитьСчетчикиИзменяемыхРеквизитов(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции из базовой функциональности для обеспечения автономности + +// Сохраняет настройку в хранилище общих настроек. +// +// Параметры: +// Соответствуют методу ХранилищеОбщихНастроекСохранить.Сохранить, +// подробнее - см. параметры процедуры ХранилищеСохранить() +// +&НаСервереБезКонтекста +Процедура ХранилищеОбщихНастроекСохранить(КлючОбъекта, КлючНастроек, Значение, + ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено, + НужноОбновитьПовторноИспользуемыеЗначения = Ложь) + + ХранилищеСохранить( + ХранилищеОбщихНастроек, + КлючОбъекта, + КлючНастроек, + Значение, + ОписаниеНастроек, + ИмяПользователя, + НужноОбновитьПовторноИспользуемыеЗначения); + +КонецПроцедуры + +// Загружает настройку из хранилища общих настроек. +// +// Параметры: +// Соответствуют методу ХранилищеОбщихНастроек.Загрузить, +// подробнее - см. параметры функции ХранилищеЗагрузить() +// +&НаСервереБезКонтекста +Функция ХранилищеОбщихНастроекЗагрузить(КлючОбъекта, КлючНастроек = "", ЗначениеПоУмолчанию = Неопределено, + ОписаниеНастроек = Неопределено, ИмяПользователя = Неопределено) + + Возврат ХранилищеЗагрузить( + ХранилищеОбщихНастроек, + КлючОбъекта, + КлючНастроек, + ЗначениеПоУмолчанию, + ОписаниеНастроек, + ИмяПользователя); + +КонецФункции + +&НаСервереБезКонтекста +Процедура ХранилищеСохранить(МенеджерХранилища, КлючОбъекта, КлючНастроек, Значение, + ОписаниеНастроек, ИмяПользователя, НужноОбновитьПовторноИспользуемыеЗначения) + + Если НЕ ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Возврат; + КонецЕсли; + + МенеджерХранилища.Сохранить(КлючОбъекта, КлючНастроек(КлючНастроек), Значение, ОписаниеНастроек, ИмяПользователя); + + Если НужноОбновитьПовторноИспользуемыеЗначения Тогда + ОбновитьПовторноИспользуемыеЗначения(); + КонецЕсли; + +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ХранилищеЗагрузить(МенеджерХранилища, КлючОбъекта, КлючНастроек, ЗначениеПоУмолчанию, + ОписаниеНастроек, ИмяПользователя) + + Результат = Неопределено; + + Если ПравоДоступа("СохранениеДанныхПользователя", Метаданные) Тогда + Результат = МенеджерХранилища.Загрузить(КлючОбъекта, КлючНастроек(КлючНастроек), ОписаниеНастроек, ИмяПользователя); + КонецЕсли; + + Если (Результат = Неопределено) И (ЗначениеПоУмолчанию <> Неопределено) Тогда + Результат = ЗначениеПоУмолчанию; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Возвращает строку ключа настроек, не превышающую допустимую длину. +// Проверяет длину строки на входе и, в случае превышения 128, преобразует ее конец по алгоритму MD5 в короткий +// вариант, в результате чего строка становится длиной 128 символов. +// Если исходная строка менее 128 символов, она возвращается в неизменном виде. +// +// Параметры: +// Строка - Строка - строка произвольной длины. +// +&НаСервереБезКонтекста +Функция КлючНастроек(Знач Строка) + Результат = Строка; + Если СтрДлина(Строка) > 128 Тогда // ключ более 128 символов вызовет исключение при обращении к хранилищу настроек + Результат = Лев(Строка, 96); + ХешированиеДанных = Новый ХешированиеДанных(ХешФункция.MD5); + ХешированиеДанных.Добавить(Сред(Строка, 97)); + Результат = Результат + СтрЗаменить(ХешированиеДанных.ХешСумма, " ", ""); + КонецЕсли; + Возврат Результат; +КонецФункции + +// Возвращает менеджер объекта по полному имени объекта метаданных +// +// Не обрабатываются точки маршрутов бизнес-процессов +// +// Параметры: +// ПолноеИмя - Строка, полное имя объекта метаданных, +// например, "Справочник.Организации" +// +// Возвращаемое значение: +// СправочникМенеджер, ДокументМенеджер, ... +// +&НаСервереБезКонтекста +Функция МенеджерОбъектаПоПолномуИмени(ПолноеИмя) + Перем КлассОМ, ИмяОМ, Менеджер; + + ЧастиИмени = РазложитьСтрокуВМассивПодстрок(ПолноеИмя, "."); + + Если ЧастиИмени.Количество() = 2 Тогда + КлассОМ = ЧастиИмени[0]; + ИмяОМ = ЧастиИмени[1]; + КонецЕсли; + + Если ВРег(КлассОМ) = "ПЛАНОБМЕНА" Тогда + Менеджер = ПланыОбмена; + + ИначеЕсли ВРег(КлассОМ) = "СПРАВОЧНИК" Тогда + Менеджер = Справочники; + + ИначеЕсли ВРег(КлассОМ) = "ДОКУМЕНТ" Тогда + Менеджер = Документы; + + ИначеЕсли ВРег(КлассОМ) = "ЖУРНАЛДОКУМЕНТОВ" Тогда + Менеджер = ЖурналыДокументов; + + ИначеЕсли ВРег(КлассОМ) = "ПЕРЕЧИСЛЕНИЕ" Тогда + Менеджер = Перечисления; + + ИначеЕсли ВРег(КлассОМ) = "ОТЧЕТ" Тогда + Менеджер = Отчеты; + + ИначеЕсли ВРег(КлассОМ) = "ОБРАБОТКА" Тогда + Менеджер = Обработки; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВХАРАКТЕРИСТИК" Тогда + Менеджер = ПланыВидовХарактеристик; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНСЧЕТОВ" Тогда + Менеджер = ПланыСчетов; + + ИначеЕсли ВРег(КлассОМ) = "ПЛАНВИДОВРАСЧЕТА" Тогда + Менеджер = ПланыВидовРасчета; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРСВЕДЕНИЙ" Тогда + Менеджер = РегистрыСведений; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРНАКОПЛЕНИЯ" Тогда + Менеджер = РегистрыНакопления; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРБУХГАЛТЕРИИ" Тогда + Менеджер = РегистрыБухгалтерии; + + ИначеЕсли ВРег(КлассОМ) = "РЕГИСТРРАСЧЕТА" Тогда + Если ЧастиИмени.Количество() = 2 Тогда + // Регистр расчета + Менеджер = РегистрыРасчета; + Иначе + КлассПодчиненногоОМ = ЧастиИмени[2]; + ИмяПодчиненногоОМ = ЧастиИмени[3]; + Если ВРег(КлассПодчиненногоОМ) = "ПЕРЕРАСЧЕТ" Тогда + // Перерасчет + Менеджер = РегистрыРасчета[ИмяОМ].Перерасчеты; + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ПолноеИмя); + КонецЕсли; + КонецЕсли; + + ИначеЕсли ВРег(КлассОМ) = "БИЗНЕСПРОЦЕСС" Тогда + Менеджер = БизнесПроцессы; + + ИначеЕсли ВРег(КлассОМ) = "ЗАДАЧА" Тогда + Менеджер = Задачи; + + ИначеЕсли ВРег(КлассОМ) = "КОНСТАНТА" Тогда + Менеджер = Константы; + + ИначеЕсли ВРег(КлассОМ) = "ПОСЛЕДОВАТЕЛЬНОСТЬ" Тогда + Менеджер = Последовательности; + КонецЕсли; + + Если Менеджер <> Неопределено Тогда + Попытка + Возврат Менеджер[ИмяОМ]; + Исключение + Менеджер = Неопределено; + КонецПопытки; + КонецЕсли; + + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неизвестный тип объекта метаданных ""%1""'"), ПолноеИмя); + +КонецФункции + +// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. +// +// Параметры: +// Строка - Строка - текст с разделителями; +// Разделитель - Строка - разделитель строк текста, минимум 1 символ; +// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. +// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: +// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат. +// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а +// при других разделителях результатом функции будет пустой массив. +// +// +// Возвращаемое значение: +// Массив - массив строк. +// +// Примеры: +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые строки; +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; +// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); +// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); +// +&НаКлиентеНаСервереБезКонтекста +Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) + + Результат = Новый Массив; + + // для обеспечения обратной совместимости + Если ПропускатьПустыеСтроки = Неопределено Тогда + ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); + Если ПустаяСтрока(Строка) Тогда + Если Разделитель = " " Тогда + Результат.Добавить(""); + КонецЕсли; + Возврат Результат; + КонецЕсли; + КонецЕсли; + // + + Позиция = Найти(Строка, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Строка, Позиция - 1); + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда + Результат.Добавить(Подстрока); + КонецЕсли; + Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); + Позиция = Найти(Строка, Разделитель); + КонецЦикла; + + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда + Результат.Добавить(Строка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +&НаКлиентеНаСервереБезКонтекста +// Следует использовать МассивВСтроку. +// Объединяет строки из массива в строку с разделителями. +// +// Параметры: +// Массив - Массив - массив строк которые необходимо объединить в одну строку; +// Разделитель - Строка - любой набор символов, который будет использован в качестве разделителя. +// +// Возвращаемое значение: +// Строка - строка с разделителями. +// +Функция СтрокаИзМассиваПодстрок(Массив, Разделитель = ",", СокращатьНепечатаемыеСимволы = Ложь) + + Результат = ""; + + Для Индекс = 0 По Массив.ВГраница() Цикл + Подстрока = Массив[Индекс]; + + Если СокращатьНепечатаемыеСимволы Тогда + Подстрока = СокрЛП(Подстрока); + КонецЕсли; + + Если ТипЗнч(Подстрока) <> Тип("Строка") Тогда + Подстрока = Строка(Подстрока); + КонецЕсли; + + Если Индекс > 0 Тогда + Результат = Результат + Разделитель; + КонецЕсли; + + Результат = Результат + Подстрока; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. +// +// Параметры: +// СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); +// Параметр - Строка - подставляемый параметр. +// +// Возвращаемое значение: +// Строка – текстовая строка с подставленными параметрами. +// +// Пример: +// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". +// +&НаКлиентеНаСервереБезКонтекста +Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + ИспользоватьАльтернативныйАлгоритм = + Найти(Параметр1, "%") + Или Найти(Параметр2, "%") + Или Найти(Параметр3, "%") + Или Найти(Параметр4, "%") + Или Найти(Параметр5, "%") + Или Найти(Параметр6, "%") + Или Найти(Параметр7, "%") + Или Найти(Параметр8, "%") + Или Найти(Параметр9, "%"); + + Если ИспользоватьАльтернативныйАлгоритм Тогда + СтрокаПодстановки = ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(СтрокаПодстановки, Параметр1, + Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9); + Иначе + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); + КонецЕсли; + + Возврат СтрокаПодстановки; +КонецФункции + +// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д. +&НаКлиентеНаСервереБезКонтекста +Функция ПодставитьПараметрыВСтрокуАльтернативныйАлгоритм(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) + + Результат = ""; + Позиция = Найти(СтрокаПодстановки, "%"); + Пока Позиция > 0 Цикл + Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1); + СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1); + ПодставляемыйПараметр = ""; + Если СимволПослеПроцента = "1" Тогда + ПодставляемыйПараметр = Параметр1; + ИначеЕсли СимволПослеПроцента = "2" Тогда + ПодставляемыйПараметр = Параметр2; + ИначеЕсли СимволПослеПроцента = "3" Тогда + ПодставляемыйПараметр = Параметр3; + ИначеЕсли СимволПослеПроцента = "4" Тогда + ПодставляемыйПараметр = Параметр4; + ИначеЕсли СимволПослеПроцента = "5" Тогда + ПодставляемыйПараметр = Параметр5; + ИначеЕсли СимволПослеПроцента = "6" Тогда + ПодставляемыйПараметр = Параметр6; + ИначеЕсли СимволПослеПроцента = "7" Тогда + ПодставляемыйПараметр = Параметр7 + ИначеЕсли СимволПослеПроцента = "8" Тогда + ПодставляемыйПараметр = Параметр8; + ИначеЕсли СимволПослеПроцента = "9" Тогда + ПодставляемыйПараметр = Параметр9; + КонецЕсли; + Если ПодставляемыйПараметр = "" Тогда + Результат = Результат + "%"; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1); + Иначе + Результат = Результат + ПодставляемыйПараметр; + СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2); + КонецЕсли; + Позиция = Найти(СтрокаПодстановки, "%"); + КонецЦикла; + Результат = Результат + СтрокаПодстановки; + + Возврат Результат; +КонецФункции + +// Функция ВидОбъектаПоСсылке возвращает имя вида объектов метаданных +// по ссылке на объект. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +&НаСервереБезКонтекста +Функция ВидОбъектаПоСсылке(Ссылка) + + Возврат ВидОбъектаПоТипу(ТипЗнч(Ссылка)); + +КонецФункции + +// Функция возвращает имя вида объектов метаданных по типу объекта. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Тип - Тип прикладного объекта, определенный в конфигурации +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +&НаСервереБезКонтекста +Функция ВидОбъектаПоТипу(Тип) + + Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Справочник"; + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Документ"; + + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "БизнесПроцесс"; + + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовХарактеристик"; + + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланСчетов"; + + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовРасчета"; + + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Задача"; + + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланОбмена"; + + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Перечисление"; + + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru='Неверный тип значения параметра (%1)'"), Строка(Тип)); + + КонецЕсли; + +КонецФункции + +// Проверяет является ли объект группой элементов. +// +// Параметры: +// Объект - Объект, Ссылка, ДанныеФормыСтруктура по типу Объект. +// +// Возвращаемое значение: +// Булево. +// +&НаСервереБезКонтекста +Функция ОбъектЯвляетсяГруппой(Объект) + + Если ЗначениеСсылочногоТипа(Объект) Тогда + Ссылка = Объект; + Иначе + Ссылка = Объект.Ссылка; + КонецЕсли; + + МетаданныеОбъекта = Ссылка.Метаданные(); + + Если ЭтоСправочник(МетаданныеОбъекта) Тогда + + Если НЕ МетаданныеОбъекта.Иерархический + ИЛИ МетаданныеОбъекта.ВидИерархии + <> Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда + + Возврат Ложь; + КонецЕсли; + + ИначеЕсли НЕ ЭтоПланВидовХарактеристик(МетаданныеОбъекта) Тогда + Возврат Ложь; + + ИначеЕсли НЕ МетаданныеОбъекта.Иерархический Тогда + Возврат Ложь; + КонецЕсли; + + Если Ссылка <> Объект Тогда + Возврат Объект.ЭтоГруппа; + КонецЕсли; + + Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ЭтоГруппа"); + +КонецФункции + +// Определяет принадлежность объекта метаданных к общему типу "Справочник" +// +// Параметры: +// ОбъектМетаданных – объект метаданных, для которого необходимо определить принадлежность к заданному типу +// +// Возвращаемое значение: +// Тип: Булево. Истина – объект метаданных принадлежит заданному типу; Ложь – нет. +// +&НаСервереБезКонтекста +Функция ЭтоСправочник(ОбъектМетаданных) + + Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаСправочники(); + +КонецФункции + +// Проверка того, что тип имеет ссылочный тип данных +// +&НаСервереБезКонтекста +Функция ЭтоСсылка(Тип) + + Возврат Справочники.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) + ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип); + +КонецФункции + +// Проверить, что значение имеет ссылочный тип данных. +// +// Параметры: +// Значение - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Булево - Истина, если тип значения ссылочный. +// +&НаСервереБезКонтекста +Функция ЗначениеСсылочногоТипа(Значение) + + Если Значение = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Определяет принадлежность объекта метаданных к общему типу "План видов характеристик" +// +// Параметры: +// ОбъектМетаданных – объект метаданных, для которого необходимо определить принадлежность к заданному типу +// +// Возвращаемое значение: +// Тип: Булево. Истина – объект метаданных принадлежит заданному типу; Ложь – нет. +// +&НаСервереБезКонтекста +Функция ЭтоПланВидовХарактеристик(ОбъектМетаданных) + + Возврат ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) = ИмяТипаПланыВидовХарактеристик(); + +КонецФункции + +// Возвращает имя базового типа по переданному значению объекта метаданных +// +// Параметры: +// ОбъектМетаданных - объект метаданных, по которому необходимо определить базовый тип +// +// Возвращаемое значение: +// Строка - имя базового типа по переданному значению объекта метаданных +// +&НаСервереБезКонтекста +Функция ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных) + + Если Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаДокументы(); + + ИначеЕсли Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаСправочники(); + + ИначеЕсли Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПеречисления(); + + ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыСведений(); + + ИначеЕсли Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыНакопления(); + + ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыБухгалтерии(); + + ИначеЕсли Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегистрыРасчета(); + + ИначеЕсли Метаданные.ПланыОбмена.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыОбмена(); + + ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыВидовХарактеристик(); + + ИначеЕсли Метаданные.БизнесПроцессы.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаБизнесПроцессы(); + + ИначеЕсли Метаданные.Задачи.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаЗадачи(); + + ИначеЕсли Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыСчетов(); + + ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПланыВидовРасчета(); + + ИначеЕсли Метаданные.Константы.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаКонстанты(); + + ИначеЕсли Метаданные.ЖурналыДокументов.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаЖурналыДокументов(); + + ИначеЕсли Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаПоследовательности(); + + ИначеЕсли Метаданные.РегламентныеЗадания.Содержит(ОбъектМетаданных) Тогда + Возврат ИмяТипаРегламентныеЗадания(); + + Иначе + + Возврат ""; + + КонецЕсли; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Регистры сведений" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаРегистрыСведений() + + Возврат "РегистрыСведений"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Регистры накопления" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаРегистрыНакопления() + + Возврат "РегистрыНакопления"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Регистры бухгалтерии" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаРегистрыБухгалтерии() + + Возврат "РегистрыБухгалтерии"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Регистры расчета" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаРегистрыРасчета() + + Возврат "РегистрыРасчета"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Документы" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаДокументы() + + Возврат "Документы"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Справочники" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаСправочники() + + Возврат "Справочники"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Перечисления" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПеречисления() + + Возврат "Перечисления"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "ПланыОбмена" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПланыОбмена() + + Возврат "ПланыОбмена"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Планы видов характеристик" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПланыВидовХарактеристик() + + Возврат "ПланыВидовХарактеристик"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Бизнес-процессы" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаБизнесПроцессы() + + Возврат "БизнесПроцессы"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Задачи" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаЗадачи() + + Возврат "Задачи"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Планы счетов" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПланыСчетов() + + Возврат "ПланыСчетов"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Планы видов расчета" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПланыВидовРасчета() + + Возврат "ПланыВидовРасчета"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Константы" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаКонстанты() + + Возврат "Константы"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Журналы документов" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаЖурналыДокументов() + + Возврат "ЖурналыДокументов"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "Последовательности" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаПоследовательности() + + Возврат "Последовательности"; + +КонецФункции + +// Возвращает значение для идентификации общего типа "РегламентныеЗадания" +// +// Тип: Строка +// +&НаСервереБезКонтекста +Функция ИмяТипаРегламентныеЗадания() + + Возврат "РегламентныеЗадания"; + +КонецФункции + +// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы +// по ссылке на объект. +// +// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - Ссылка на объект - элемент справочника, документ, ... +// +// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате +// требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". +// - Структура, ФиксированнаяСтруктура - в качестве ключа передается +// псевдоним поля для возвращаемой структуры с результатом, а в качестве +// значения (опционально) фактическое имя поля в таблице. +// Если значение не определено, то имя поля берется из ключа. +// - Массив, ФиксированныйМассив - имена реквизитов в формате требований +// к свойствам структуры. +// +// Возвращаемое значение: +// Структура - содержит имена (ключи) и значения затребованных реквизитов. +// Если строка затребованных реквизитов пуста, то возвращается пустая структура +// +&НаСервереБезКонтекста +Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) + + Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда + Если ПустаяСтрока(Реквизиты) Тогда + Возврат Новый Структура; + КонецЕсли; + Реквизиты = РазложитьСтрокуВМассивПодстрок(Реквизиты, ",", Истина); + КонецЕсли; + + СтруктураРеквизитов = Новый Структура; + Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда + СтруктураРеквизитов = Реквизиты; + ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда + Для Каждого Реквизит Из Реквизиты Цикл + СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); + КонецЦикла; + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), + Строка(ТипЗнч(Реквизиты))); + КонецЕсли; + + ТекстПолей = ""; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Ключ)); + + Псевдоним = СокрЛП(КлючИЗначение.Ключ); + + ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " + | " + ИмяПоля + " КАК " + Псевдоним; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ + |" + ТекстПолей + " + |ИЗ + | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы + |ГДЕ + | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка + |"; + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Результат = Новый Структура; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + Результат.Вставить(КлючИЗначение.Ключ); + КонецЦикла; + ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Возврат Результат; + +КонецФункции + +// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. +// +// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// ИмяРеквизита - Строка, например, "Код". +// +// Возвращаемое значение: +// Произвольный - зависит от типа значения прочитанного реквизита. +// +&НаСервереБезКонтекста +Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) + + Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); + Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; + +КонецФункции + +// Возвращает ссылку на общий модуль по имени. +// +// Параметры: +// Имя - Строка - имя общего модуля, например: +// "ОбщегоНазначения", +// "ОбщегоНазначенияКлиент". +// +// Возвращаемое значение: +// ОбщийМодуль. +// +&НаКлиентеНаСервереБезКонтекста +Функция ОбщийМодуль(Имя) + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда + Модуль = Вычислить(Имя); + Иначе + Модуль = Неопределено; + КонецЕсли; + + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); + КонецЕсли; +#Иначе + Модуль = Вычислить(Имя); +#Если НЕ ВебКлиент Тогда + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); + КонецЕсли; +#КонецЕсли +#КонецЕсли + + Возврат Модуль; + +КонецФункции + +// Возвращает Истина, если подсистема существует. +// +// Параметры: +// ПолноеИмяПодсистемы - Строка. Полное имя объекта метаданных подсистема без слов "Подсистема.". +// Например: "СтандартныеПодсистемы.БазоваяФункциональность". +// +// Пример вызова необязательной подсистемы: +// +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда +// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); +// МодульУправлениеДоступом.<Имя метода>(); +// КонецЕсли; +// +// Возвращаемое значение: +// Булево. +// +&НаСервереБезКонтекста +Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) + Если Не ВерсияБСПСоответствуетТребованиям() Тогда + Возврат Ложь; + КонецЕсли; + + ИменаПодсистем = ИменаПодсистем(); + Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; + +КонецФункции + +// Возвращает соответствие имен подсистем и значения Истина; +&НаСервереБезКонтекста +Функция ИменаПодсистем() + + Возврат Новый ФиксированноеСоответствие(ИменаПодчиненныхПодсистем(Метаданные)); + +КонецФункции + +&НаСервереБезКонтекста +Функция ИменаПодчиненныхПодсистем(РодительскаяПодсистема) + + Имена = Новый Соответствие; + + Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл + + Имена.Вставить(ТекущаяПодсистема.Имя, Истина); + ИменаПодчиненных = ИменаПодчиненныхПодсистем(ТекущаяПодсистема); + + Для каждого ИмяПодчиненной Из ИменаПодчиненных Цикл + Имена.Вставить(ТекущаяПодсистема.Имя + "." + ИмяПодчиненной.Ключ, Истина); + КонецЦикла; + КонецЦикла; + + Возврат Имена; + +КонецФункции + +// Возвращает строковое представление типа. +// Для ссылочных типов возвращает в формате "СправочникСсылка.ИмяОбъекта" или "ДокументСсылка.ИмяОбъекта" +// Для остальных типов приводит тип к строке, например "Число". +// +&НаСервереБезКонтекста +Функция СтроковоеПредставлениеТипа(Тип) + + Представление = ""; + + Если ЭтоСсылка(Тип) Тогда + + ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя(); + ИмяОбъекта = РазложитьСтрокуВМассивПодстрок(ПолноеИмя, ".")[1]; + + Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "СправочникСсылка"; + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ДокументСсылка"; + + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "БизнесПроцессСсылка"; + + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланВидовХарактеристикСсылка"; + + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланСчетовСсылка"; + + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланВидовРасчетаСсылка"; + + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ЗадачаСсылка"; + + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПланОбменаСсылка"; + + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + Представление = "ПеречислениеСсылка"; + + КонецЕсли; + + Результат = ?(Представление = "", Представление, Представление + "." + ИмяОбъекта); + + Иначе + + Результат = Строка(Тип); + + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Преобразует текст формата XML в таблицу значений, +// при этом колонки таблицы формируются на основе описания в XML. +// +// Параметры: +// XML - текст в формате XML или ЧтениеXML. +// +// Схема XML: +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// Примеры XML-файлов см. в демонстрационной конфигурации. +// +// Пример использования: +// КлассификаторТаблица = ПрочитатьXMLВТаблицу(РегистрыСведений.АдресныйКлассификатор. +// ПолучитьМакет("КлассификаторАдресныхОбъектовРоссии").ПолучитьТекст()); +// +// Возвращаемое значение: +// Структура с полями +// ИмяТаблицы - Строка +// Данные - ТаблицаЗначений. +// +&НаСервереБезКонтекста +Функция ПрочитатьXMLВТаблицу(Знач XML) + + Если ТипЗнч(XML) <> Тип("ЧтениеXML") Тогда + Чтение = Новый ЧтениеXML; + Чтение.УстановитьСтроку(XML); + Иначе + Чтение = XML; + КонецЕсли; + + // Прочитаем первый узел и проверим его + Если Не Чтение.Прочитать() Тогда + ВызватьИсключение("Пустой XML"); + ИначеЕсли Чтение.Имя <> "Items" Тогда + ВызватьИсключение("Ошибка в структуре XML"); + КонецЕсли; + + // Получим описание таблицы и создадим ее + ИмяТаблицы = Чтение.ПолучитьАтрибут("Description"); + ИменаКолонок = СтрЗаменить(Чтение.ПолучитьАтрибут("Columns"), ",", Символы.ПС); + Колонок = СтрЧислоСтрок(ИменаКолонок); + + ТаблицаЗначений = Новый ТаблицаЗначений; + Для Сч = 1 По Колонок Цикл + ТаблицаЗначений.Колонки.Добавить(СтрПолучитьСтроку(ИменаКолонок, Сч), Новый ОписаниеТипов("Строка")); + КонецЦикла; + + // Заполним значения в таблице + Пока Чтение.Прочитать() Цикл + + Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента И Чтение.Имя = "Items" Тогда + Прервать; + ИначеЕсли Чтение.ТипУзла <> ТипУзлаXML.НачалоЭлемента Тогда + Продолжить; + ИначеЕсли Чтение.Имя <> "Item" Тогда + ВызватьИсключение("Ошибка в структуре XML"); + КонецЕсли; + + новСтр = ТаблицаЗначений.Добавить(); + Для Сч = 1 По Колонок Цикл + ИмяКолонки = СтрПолучитьСтроку(ИменаКолонок, Сч); + новСтр[Сч-1] = Чтение.ПолучитьАтрибут(ИмяКолонки); + КонецЦикла; + + КонецЦикла; + + // Заполним результат + Результат = Новый Структура; + Результат.Вставить("ИмяТаблицы", ИмяТаблицы); + Результат.Вставить("Данные", ТаблицаЗначений); + + Возврат Результат; + +КонецФункции // ПрочитатьXMLВТаблицу() + +// Преобразует таблицу значений в массив. +// Может использоваться для передачи на клиента данных, полученных +// на сервере в виде таблицы значений в том случае, если таблица +// значений содержит только такие значения, которые могут +// быть переданы на клиента +// +// Полученный массив содержит структуры, каждая из которых повторяет +// структуру колонок таблицы значений. +// +// Не рекомендуется использовать для преобразования таблиц значений +// с большим количеством строк. +// +// Параметры: ТаблицаЗначений +// Возвращаемое значение: Массив +// +&НаСервереБезКонтекста +Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) + + Массив = Новый Массив(); + СтруктураСтрокой = ""; + НужнаЗапятая = Ложь; + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + Если НужнаЗапятая Тогда + СтруктураСтрокой = СтруктураСтрокой + ","; + КонецЕсли; + СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; + НужнаЗапятая = Истина; + КонецЦикла; + Для Каждого Строка Из ТаблицаЗначений Цикл + НоваяСтрока = Новый Структура(СтруктураСтрокой); + ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); + Массив.Добавить(НоваяСтрока); + КонецЦикла; + Возврат Массив; + +КонецФункции + +&НаСервереБезКонтекста +Функция ВерсияБСПСоответствуетТребованиям() + Попытка + МодульСтандартныеПодсистемыСервер = ОбщийМодуль("СтандартныеПодсистемыСервер"); + ВерсияБСП = МодульСтандартныеПодсистемыСервер.ВерсияБиблиотеки(); + Возврат НомерВерсииВЧисло(ВерсияБСП) >= НомерВерсииВЧисло("2.2.1.34"); + Исключение + Возврат Ложь; + КонецПопытки; +КонецФункции + +&НаСервереБезКонтекста +Функция НомерВерсииВЧисло(НомерВерсии) + ЧастиНомера = РазложитьСтрокуВМассивПодстрок(НомерВерсии, ".", Истина); + Если ЧастиНомера.Количество() <> 4 Тогда + Возврат 0; + КонецЕсли; + Результат = 0; + Для Каждого ЧастьНомера Из ЧастиНомера Цикл + Результат = Результат * 1000 + Число(ЧастьНомера); + КонецЦикла; + Возврат Результат; +КонецФункции \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Help/ru.html b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Help/ru.html index 30bdac5e6..8b6f0a43a 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Help/ru.html +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Help/ru.html @@ -1,9 +1,9 @@ - +

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

                Для очистки значения реквизита, нужно проставить напротив него флажок и, оставив колонку Новое значение пустой, нажать на кнопку Изменить.

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

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

                -

                Дополнительно можно задать особые настройки с помощью команды Настроить параметры изменения. 

                +

                Дополнительно можно задать особые настройки с помощью команды Настроить параметры изменения. 

                Особые случаи:

                • Нужно иметь в виду, что в списке реквизитов могут быть реквизиты, недоступные для изменения и отображающиеся серым цветом. В случае особой необходимости изменения их изменения, можно воспользоваться командой Разрешить редактирование реквизитов.
                • При изменении проведённых документов не выполняется их перепроведение. 
                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl index 98046280e..e69de29bb 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ManagerModule.bsl @@ -1,368 +0,0 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -Процедура ВыполнитьИзменениеОбъектов(Параметры, АдресРезультата) Экспорт - - ОбрабатываемыеОбъекты = Параметры.ОбрабатываемыеОбъекты; - ОстанавливатьИзменениеПриОшибке = Параметры.ОстанавливатьИзменениеПриОшибке; - - ИзменятьВТранзакции = Параметры.ИзменятьВТранзакции; - ПрерыватьПриОшибке = Параметры.ПрерыватьПриОшибке; - ИспользуютсяДопРеквизиты = Параметры.ИспользуютсяДопРеквизиты; - ИспользуютсяДопСведения = Параметры.ИспользуютсяДопСведения; - - Операции = Параметры.Операции; - ОбъектыДляИзменения = Параметры.ОбъектыДляИзменения; - - УправлениеСвойствамиМодуль = Параметры.УправлениеСвойствамиМодуль; - - РезультатИзменения = Новый Структура("ЕстьОшибки, СостояниеОбработки"); - РезультатИзменения.ЕстьОшибки = Ложь; - РезультатИзменения.СостояниеОбработки = Новый Соответствие; - - Если ОстанавливатьИзменениеПриОшибке = Неопределено Тогда - ОстанавливатьИзменениеПриОшибке = ПрерыватьПриОшибке; - КонецЕсли; - - Если ОбрабатываемыеОбъекты = Неопределено Тогда - ОбрабатываемыеОбъекты = Новый Массив; - Для Каждого СтрокаИзменяемыйОбъект Из ОбъектыДляИзменения Цикл - ОбрабатываемыеОбъекты.Добавить(СтрокаИзменяемыйОбъект.СсылкаНаОбъект); - КонецЦикла; - КонецЕсли; - - ПроверятьНаГруппу = ПроверятьНаГруппу(ОбрабатываемыеОбъекты[0]); - - Если ИзменятьВТранзакции Тогда - НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); - КонецЕсли; - - ОперацииИзменения = Операции.НайтиСтроки(Новый Структура("Изменять", Истина)); - - Для Каждого Ссылка Из ОбрабатываемыеОбъекты Цикл - - ИзменяемыйОбъект = Ссылка.ПолучитьОбъект(); - - Попытка - ЗаблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); - Исключение - Инфо = ИнформацияОбОшибке(); - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_БлокировкиОбъекта", КраткоеПредставлениеОшибки); - Если ИзменятьВТранзакции Тогда - ОтменитьТранзакцию(); - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - КонецЕсли; - Если ОстанавливатьИзменениеПриОшибке Тогда - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - КонецЕсли; - Продолжить; - КонецПопытки; - - ИзменяемыеРеквизитыОбъекта = Новый Массив; - ИзменяемыеДопРеквизитыОбъекта = Новый Соответствие; - ИзменяемыеДопСведенияОбъекта = Новый Соответствие; - - МассивЗаписейДопСведений = Новый Массив; - - /////////////////////////////////////////////////////////////////////////////////////// - // Отбор операций изменения по каждому объекту - // - - Для Каждого Операция Из ОперацииИзменения Цикл - - Если Операция.ВидОперации = 1 Тогда // изменение реквизита - - // для групп не устанавливаем реквизиты, которых у них нет - Если ПроверятьНаГруппу И ИзменяемыйОбъект.ЭтоГруппа Тогда - Если НЕ ОбщегоНазначения.ЭтоСтандартныйРеквизит(ИзменяемыйОбъект.Метаданные().СтандартныеРеквизиты, Операция.ИмяРеквизита) Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - ИзменяемыйОбъект[Операция.ИмяРеквизита] = Операция.Значение; - ИзменяемыеРеквизитыОбъекта.Добавить(Операция.ИмяРеквизита); - - ИначеЕсли Операция.ВидОперации = 2 Тогда // изменение доп реквизита - - Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство, Параметры) Тогда - Продолжить; - КонецЕсли; - - НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Найти(Операция.Свойство, "Свойство"); - - Если НайденнаяСтрока = Неопределено Тогда - НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить(); - НайденнаяСтрока.Свойство = Операция.Свойство; - КонецЕсли; - - НайденнаяСтрока.Значение = Операция.Значение; - - ИмяРеквизитаФормы = ПрефиксИмениДопРеквизита() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); - ИзменяемыеДопРеквизитыОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); - - ИначеЕсли Операция.ВидОперации = 3 Тогда // изменение доп сведения - - Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство, Параметры) Тогда - Продолжить; - КонецЕсли; - - МенеджерЗаписи = РегистрыСведений["ДополнительныеСведения"].СоздатьМенеджерЗаписи(); - - МенеджерЗаписи.Объект = ИзменяемыйОбъект.Ссылка; - МенеджерЗаписи.Свойство = Операция.Свойство; - МенеджерЗаписи.Значение = Операция.Значение; - - МассивЗаписейДопСведений.Добавить(МенеджерЗаписи); - - ИмяРеквизитаФормы = ПрефиксИмениДопСведения() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); - ИзменяемыеДопСведенияОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); - - КонецЕсли; - - КонецЦикла; - - // - // Отбор операций изменения по каждому объекту - /////////////////////////////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////////////////////////// - // Блок обработки проверки заполнения - // - - ПрерватьИзменение = Ложь; - ПроверкаЗаполненияУспешно = Истина; - - Попытка - Если ИзменяемыйОбъект.ПроверитьЗаполнение() Тогда - - Иначе - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_ОбработкиПроверкиЗаполнения", - ПолучитьСтрокуСообщенийОбОшибках()); - Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда - ПрерватьИзменение = Истина; - КонецЕсли; - ПроверкаЗаполненияУспешно = Ложь; - КонецЕсли; - Исключение - Инфо = ИнформацияОбОшибке(); - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_НеКлассифицированная", КраткоеПредставлениеОшибки); - Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда - ПрерватьИзменение = Истина; - КонецЕсли; - ПроверкаЗаполненияУспешно = Ложь; - КонецПопытки; - - Если ПрерватьИзменение Тогда - Если ИзменятьВТранзакции Тогда - ОтменитьТранзакцию(); - КонецЕсли; - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - КонецЕсли; - - Если НЕ ПроверкаЗаполненияУспешно Тогда - Продолжить; - КонецЕсли; - - // - // Блок обработки проверки заполнения - /////////////////////////////////////////////////////////////////////////////////////// - - /////////////////////////////////////////////////////////////////////////////////////// - // Блок записи дополнительных сведений - // - - Если МассивЗаписейДопСведений.Количество() > 0 Тогда - - Если НЕ ИзменятьВТранзакции Тогда - // Если транзакция при изменении объектов не используется, включаем ее - // для изменения доп сведений в регистре - НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); - КонецЕсли; - - Попытка - Для Каждого МенеджерЗаписи Из МассивЗаписейДопСведений Цикл - МенеджерЗаписи.Записать(Истина); - КонецЦикла; - Исключение - Инфо = ИнформацияОбОшибке(); - - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_ЗаписиДопСведений", КраткоеПредставлениеОшибки); - - ОтменитьТранзакцию(); - - Если ИзменятьВТранзакции ИЛИ ОстанавливатьИзменениеПриОшибке Тогда - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - КонецЕсли; - КонецПопытки; - - КонецЕсли; - - // - // Блок записи дополнительных сведений - /////////////////////////////////////////////////////////////////////////////////////// - - Отказ = Ложь; - Попытка - ИзменяемыйОбъект.Записать(); - Исключение - Инфо = ИнформацияОбОшибке(); - Отказ = Истина; - КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, - "Ошибка_ЗаписиОбъекта", - КраткоеПредставлениеОшибки + Символы.ПС + ПолучитьСтрокуСообщенийОбОшибках()); - Если ИзменятьВТранзакции И ТранзакцияАктивна() Тогда // отменяем транзакцию на любом уровне рекурсии - ОтменитьТранзакцию(); - КонецЕсли; - Если ПрерыватьПриОшибке Тогда - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - КонецЕсли; - КонецПопытки; - - // Фиксируем транзакцию записи доп. свойств, если запись объектов происходит - // не в транзакции - Если НЕ ИзменятьВТранзакции И МассивЗаписейДопСведений.Количество() > 0 Тогда - ЗафиксироватьТранзакцию(); - КонецЕсли; - - Если Не Отказ Тогда - ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "",, - ИзменяемыйОбъект, ИзменяемыеРеквизитыОбъекта, - ИзменяемыеДопРеквизитыОбъекта, ИзменяемыеДопСведенияОбъекта); - КонецЕсли; - - РазблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); - - КонецЦикла; - - Если ИзменятьВТранзакции И ТранзакцияАктивна() Тогда - ЗафиксироватьТранзакцию(); - КонецЕсли; - - ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); - Возврат; - -КонецПроцедуры - -Функция СвойствоНужноИзменять(Ссылка, Свойство, Параметры) - - ОбъектыДляИзменения = Параметры.ОбъектыДляИзменения; - УправлениеСвойствамиМодуль = Параметры.УправлениеСвойствамиМодуль; - - Если УправлениеСвойствамиМодуль = Неопределено Тогда - Возврат Ложь; - КонецЕсли; - - СтрокаИзменяемогоОбъекта = ОбъектыДляИзменения.Найти(Ссылка, "СсылкаНаОбъект"); - - Если СтрокаИзменяемогоОбъекта = Неопределено Тогда - Если НЕ УправлениеСвойствамиМодуль.ПроверитьСвойствоУОбъекта(Ссылка, Свойство) Тогда - Возврат Ложь; - КонецЕсли; - Иначе - СвойствоНайдено = Ложь; - - Если Свойство.ЭтоДополнительноеСведение Тогда - КоллекцияСвойств = СтрокаИзменяемогоОбъекта.СоставДопСведений; - Иначе - КоллекцияСвойств = СтрокаИзменяемогоОбъекта.СоставДопРеквизитов; - КонецЕсли; - - Если ПустаяСтрока(КоллекцияСвойств) Тогда - Возврат Ложь; - КонецЕсли; - - Для ИндексСтроки = 1 По СтрЧислоСтрок(КоллекцияСвойств) Цикл - СтрокаУИд = СтрПолучитьСтроку(КоллекцияСвойств, ИндексСтроки); - СвойствоОбъекта = ПланыВидовХарактеристик["ДополнительныеРеквизитыИСведения"].ПолучитьСсылку(Новый УникальныйИдентификатор(СокрЛП(СтрокаУИд))); - Если Свойство = СвойствоОбъекта Тогда // свойство найдено у объекта - СвойствоНайдено = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - - Если Не СвойствоНайдено Тогда - Возврат Ложь; - КонецЕсли; - - КонецЕсли; - - Возврат Истина; - -КонецФункции - -Функция ПолучитьСтрокуСообщенийОбОшибках() - - ПредставлениеОшибки = ""; - МассивСообщений = ПолучитьСообщенияПользователю(Истина); - - Для Каждого СообщениеПользователю Из МассивСообщений Цикл - ПредставлениеОшибки = ПредставлениеОшибки + СообщениеПользователю.Текст + Символы.ПС; - КонецЦикла; - - Возврат ПредставлениеОшибки; - -КонецФункции - -Процедура ЗаполнитьРезультатИзменения(Результат, Ссылка, КодОшибки, СообщениеОбОшибке = "", - ИзменяемыйОбъект = Неопределено, ИзменяемыеРеквизитыОбъекта = Неопределено, - ИзменяемыеДопРеквизитыОбъекта = Неопределено, ИзменяемыеДопСведенияОбъекта = Неопределено) - - СостояниеИзменения = Новый Структура("КодОшибки,СообщениеОбОшибке"); - - Если ПустаяСтрока(КодОшибки) Тогда - СостояниеИзменения.Вставить("ЗначенияИзмененныхРеквизитов", Новый Соответствие); - Если ИзменяемыеРеквизитыОбъекта <> Неопределено Тогда - Для Каждого ИмяРеквизита Из ИзменяемыеРеквизитыОбъекта Цикл - СостояниеИзменения.ЗначенияИзмененныхРеквизитов.Вставить(ИмяРеквизита, ИзменяемыйОбъект[ИмяРеквизита]); - КонецЦикла; - КонецЕсли; - СостояниеИзменения.Вставить("ЗначенияИзмененныхДопРеквизитов", ИзменяемыеДопРеквизитыОбъекта); - СостояниеИзменения.Вставить("ЗначенияИзмененныхДопСведений", ИзменяемыеДопСведенияОбъекта); - Иначе - Результат.ЕстьОшибки = Истина; - КонецЕсли; - - СостояниеИзменения.КодОшибки = КодОшибки; - СостояниеИзменения.СообщениеОбОшибке = СообщениеОбОшибке; - - Результат.СостояниеОбработки.Вставить(Ссылка, СостояниеИзменения); - -КонецПроцедуры - -Функция ПрефиксИмениДопРеквизита() - Возврат "ДопРеквизит_"; -КонецФункции - -Функция ПрефиксИмениДопСведения() - Возврат "ДопСведение_"; -КонецФункции - -Функция ПроверятьНаГруппу(Ссылка) - - ВидОбъекта = ОбщегоНазначения.ВидОбъектаПоСсылке(Ссылка); - МетаданныеОбъекта = Ссылка.Метаданные(); - - Если ВидОбъекта = "Справочник" - И МетаданныеОбъекта.Иерархический - И МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда - - Возврат Истина; - - КонецЕсли; - - Возврат Ложь; - -КонецФункции - -#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl index 2564de7b8..bf6909d06 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ObjectModule.bsl @@ -1,433 +1,922 @@ #Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда -//////////////////////////////////////////////////////////////////////////////// -// Описание обработки -// Табличная часть Операции - содержит набор информации, описывающей изменения. -// Одна запись при этом описывает одно изменение. -// Реквизиты табличной части: -// ВидОперации - число - описывает ЧТО делать: -// 1 - изменение реквизита -// 2 - изменение дополнительного реквизита -// 3 - изменение дополнительного свойства -// ИмяРеквизита - строка - имя изменяемого реквизита (вид операции = 1) -// Свойство - ПВХ - ссылка на изменяемое свойство (вид операции = 2 или 3) -// Представление - строка - представление операции для пользователя, -// при ВидОперации = 1 - синоним реквизита -// при ВидОперации - 2 и 3 - наименование свойства -// Изменять - Булево - индикатор того, что операция должна быть совершена -// единственный способ очистки значений -// Значение - Новое значение -// ЗаблокированныйРеквизит - Булево - это заблокированный реквизит -// ДопустимыеТипы - Строка - содержит перечисление названий типов (через ";") -// -//////////////////////////////////////////////////////////////////////////////// - -//////////////////////////////////////////////////////////////////////////////// -// РАЗДЕЛ ОПИСАНИЯ ПЕРЕМЕННЫХ - -Перем УправлениеСвойствамиМодуль; - //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// Процедура заполняет таблицу операций объекта: -// 1. Реквизиты -// 2. Свойства -// -Процедура ЗаполнитьТаблицуОперацийСОбъектом() Экспорт +Функция СведенияОВнешнейОбработке() Экспорт + Перем ПараметрыРегистрации; - Перем - ИспользуетсяЗапретРедактированияРеквизитов; + Если ПодсистемаСуществует("СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки") Тогда + МодульДополнительныеОтчетыИОбработки = ОбщийМодуль("ДополнительныеОтчетыИОбработки"); + МодульДополнительныеОтчетыИОбработкиКлиентСервер = ОбщийМодуль("ДополнительныеОтчетыИОбработкиКлиентСервер"); - ПервыйИзменяемый = ОбъектыДляИзменения[0].СсылкаНаОбъект; - - ОбъектМетаданных = ПервыйИзменяемый.Метаданные(); - - // Получаем менеджер объекта для получения массивов не редактируемых - // интерактивно и блокируемых реквизитов - МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ОбъектМетаданных.ПолноеИмя()); - - БлокируемыеРеквизиты = Новый Массив; - - // Пытаемся определить, есть ли у объекта блокируемые реквизиты (подсистема запрета редактирования - // реквизитов объектов). Для этого в блоке Попытка .. Исключение пытаемся позвать у объекта метод - // ПолучитьБлокируемыеРеквизитыОбъекта. - Попытка - БлокируемыеРеквизитыОписание = МенеджерОбъекта.ПолучитьБлокируемыеРеквизитыОбъекта(); - Для Каждого БлокируемыйРеквизитОписание Из БлокируемыеРеквизитыОписание Цикл - БлокируемыеРеквизиты.Добавить( СокрЛП ( - СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( - БлокируемыйРеквизитОписание, ";")[0] ) ); - КонецЦикла; - Исключение - КонецПопытки; - - ФильтруемыеРеквизиты = ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных); - - ////////////////////////////////////////////////////////////////////////////////////////// - // Фильтрация по отключенным функциональными опциями - - ЗакрытыеФункциональнымиОпциями = Новый ТаблицаЗначений; - ЗакрытыеФункциональнымиОпциями.Колонки.Добавить("ИмяРеквизита", Новый ОписаниеТипов("Строка")); - - Для Каждого ОписаниеФО Из Метаданные.ФункциональныеОпции Цикл + ПараметрыРегистрации = МодульДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.1.3.1"); - Если СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ОписаниеФО.Хранение.ПолноеИмя(), ".")[0] = "Константа" Тогда - ЗначениеФО = ПолучитьФункциональнуюОпцию(ОписаниеФО.Имя); - Если ТипЗнч(ЗначениеФО) = Тип("Булево") И ЗначениеФО = Истина Тогда - Продолжить; - КонецЕсли; - Иначе - // не фильтруем реквизиты, которые входят в параметризуемые функциональные опции - Продолжить; + ПараметрыРегистрации.Вид = МодульДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); + ПараметрыРегистрации.Версия = "2.2.1"; + ПараметрыРегистрации.БезопасныйРежим = Ложь; + + НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); + НоваяКоманда.Представление = НСтр("ru = 'Групповое изменение реквизитов'"); + НоваяКоманда.Идентификатор = "ОткрытьГлобально"; + НоваяКоманда.Использование = МодульДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); + НоваяКоманда.ПоказыватьОповещение = Ложь; + КонецЕсли; + + Возврат ПараметрыРегистрации; + +КонецФункции + +Функция ТекстЗапроса(ОбъектМетаданных) Экспорт + + ТекстЗапроса = ""; + + Для Каждого Реквизит Из ОбъектМетаданных.СтандартныеРеквизиты Цикл + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС; КонецЕсли; - - Для Каждого РеквизитОМ Из ОбъектМетаданных.Реквизиты Цикл - Если ОписаниеФО.Состав.Содержит(РеквизитОМ) Тогда - НоваяСтрока = ЗакрытыеФункциональнымиОпциями.Добавить(); - НоваяСтрока.ИмяРеквизита = РеквизитОМ.Имя; - КонецЕСли; + ТекстЗапроса = ТекстЗапроса + Реквизит.Имя + " КАК " + Реквизит.Имя; + КонецЦикла; + + Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл + Если Не ПустаяСтрока(ТекстЗапроса) Тогда + ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС; + КонецЕсли; + ТекстЗапроса = ТекстЗапроса + Реквизит.Имя; + КонецЦикла; + + Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл + ТекстЗапроса = ТекстЗапроса + "," + Символы.ПС + ТабличнаяЧасть.Имя + ".("; + СтрокаРеквизитов = "НомерСтроки"; + Для Каждого Реквизит Из ТабличнаяЧасть.Реквизиты Цикл + Если Не ПустаяСтрока(СтрокаРеквизитов) Тогда + СтрокаРеквизитов = СтрокаРеквизитов + "," + Символы.ПС; + КонецЕсли; + СтрокаРеквизитов = СтрокаРеквизитов + Реквизит.Имя; КонецЦикла; + ТекстЗапроса = ТекстЗапроса + СтрокаРеквизитов +" + |)"; КонецЦикла; - ЗакрытыеФункциональнымиОпциями.Свернуть("ИмяРеквизита"); + ТекстЗапроса = "Выбрать " + ТекстЗапроса + Символы.ПС + " + |ИЗ + | "+ ОбъектМетаданных.ПолноеИмя(); + + Возврат ТекстЗапроса; - Для Каждого ЗакрытыйФО Из ЗакрытыеФункциональнымиОпциями Цикл - ФильтруемыеРеквизиты.Добавить(ЗакрытыйФО.ИмяРеквизита); - КонецЦикла; +КонецФункции + +Функция СхемаКомпоновкиДанных(ТекстЗапроса) Экспорт + СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; - // Фильтрация по отключенным функциональными опциями - ////////////////////////////////////////////////////////////////////////////////////////// + ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); + ИсточникДанных.Имя = "ИсточникДанных1"; + ИсточникДанных.ТипИсточникаДанных = "local"; - Операции.Очистить(); + НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + НаборДанных.ИсточникДанных = "ИсточникДанных1"; + НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; + НаборДанных.Запрос = ТекстЗапроса; + НаборДанных.Имя = "НаборДанных1"; - Попытка - НеРедактируемые = МенеджерОбъекта.РеквизитыНеРедактируемыеВГрупповойОбработке(); - Исключение - НеРедактируемые = Новый Массив; - КонецПопытки; + Возврат СхемаКомпоновкиДанных; +КонецФункции + +Процедура ВыполнитьИзменениеОбъектов(Параметры, АдресРезультата) Экспорт - Если НеРедактируемые.Количество() = 0 Тогда + ОбрабатываемыеОбъекты = Параметры.ОбрабатываемыеОбъекты.Получить().Строки; + ОстанавливатьИзменениеПриОшибке = Параметры.ОстанавливатьИзменениеПриОшибке; + + ИзменятьВТранзакции = Параметры.ИзменятьВТранзакции; + ПрерыватьПриОшибке = Параметры.ПрерыватьПриОшибке; + ИспользуютсяДопРеквизиты = Параметры.ИспользуютсяДопРеквизиты; + ИспользуютсяДопСведения = Параметры.ИспользуютсяДопСведения; + + ОбъектыДляИзменения = Параметры.ОбъектыДляИзменения.Получить().Строки; + + РезультатИзменения = Новый Структура("ЕстьОшибки, СостояниеОбработки"); + РезультатИзменения.ЕстьОшибки = Ложь; + РезультатИзменения.СостояниеОбработки = Новый Соответствие; + + Если ОстанавливатьИзменениеПриОшибке = Неопределено Тогда + ОстанавливатьИзменениеПриОшибке = ПрерыватьПриОшибке; + КонецЕсли; + + Если ОбрабатываемыеОбъекты = Неопределено Тогда + ОбрабатываемыеОбъекты = Новый Массив; + Для Каждого ИзменяемыйОбъект Из ОбъектыДляИзменения Цикл + ОбрабатываемыеОбъекты.Добавить(ИзменяемыйОбъект); + КонецЦикла; + КонецЕсли; + + Если ОбрабатываемыеОбъекты.Количество() = 0 Тогда + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + + ПроверятьНаГруппу = ПроверятьНаГруппу(ОбрабатываемыеОбъекты[0].Ссылка); + + Если ИзменятьВТранзакции Тогда + НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); + КонецЕсли; + + ИзменяемыеРеквизиты = Параметры.ИзменяемыеРеквизиты; + + Для Каждого ДанныеОбъекта Из ОбрабатываемыеОбъекты Цикл + + Ссылка = ДанныеОбъекта.Ссылка; + ИзменяемыйОбъект = Ссылка.ПолучитьОбъект(); + Попытка - Редактируемые = МенеджерОбъекта.РеквизитыРедактируемыеВГрупповойОбработке(); + ЗаблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + Исключение + Инфо = ИнформацияОбОшибке(); + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_БлокировкиОбъекта", КраткоеПредставлениеОшибки); + Если ИзменятьВТранзакции Тогда + ОтменитьТранзакцию(); + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + Если ОстанавливатьИзменениеПриОшибке Тогда + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + Продолжить; + КонецПопытки; + + ИзменяемыеРеквизитыОбъекта = Новый Массив; + ИзменяемыеДопРеквизитыОбъекта = Новый Соответствие; + ИзменяемыеДопСведенияОбъекта = Новый Соответствие; + + МассивЗаписейДопСведений = Новый Массив; + + /////////////////////////////////////////////////////////////////////////////////////// + // Отбор операций изменения по каждому объекту + // + + Отказ = Ложь; + Для Каждого Операция Из ИзменяемыеРеквизиты Цикл - Для Каждого ОписаниеРеквизита Из ОбъектМетаданных.СтандартныеРеквизиты Цикл - НеРедактируемые.Добавить(ОписаниеРеквизита.Имя); - КонецЦикла; - - Для Каждого ОписаниеРеквизита Из ОбъектМетаданных.Реквизиты Цикл - НеРедактируемые.Добавить(ОписаниеРеквизита.Имя); - КонецЦикла; - - Для Каждого ИмяРедактируемого Из Редактируемые Цикл - Индекс = НеРедактируемые.Найти(ИмяРедактируемого); - Если Индекс = Неопределено Тогда + Если Операция.ВидОперации = 1 Тогда // изменение реквизита + + // для групп не устанавливаем реквизиты, которых у них нет + Если ПроверятьНаГруппу И ИзменяемыйОбъект.ЭтоГруппа Тогда + Если НЕ ЭтоСтандартныйРеквизит(ИзменяемыйОбъект.Метаданные().СтандартныеРеквизиты, Операция.Имя) Тогда + Продолжить; + КонецЕсли; + КонецЕсли; + + Попытка + ИзменяемыйОбъект[Операция.Имя] = Операция.Значение; + Исключение + Отказ = Истина; + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_НеКлассифицированная", КраткоеПредставлениеОшибки); + Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда + Если ИзменятьВТранзакции Тогда + ОтменитьТранзакцию(); + КонецЕсли; + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + Прервать; + КонецПопытки; + + ИзменяемыеРеквизитыОбъекта.Добавить(Операция.Имя); + + ИначеЕсли Операция.ВидОперации = 2 Тогда // изменение доп реквизита + + Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство, Параметры) Тогда Продолжить; КонецЕсли; - НеРедактируемые.Удалить(Индекс); - КонецЦикла; + + НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Найти(Операция.Свойство, "Свойство"); + + Если НайденнаяСтрока = Неопределено Тогда + НайденнаяСтрока = ИзменяемыйОбъект.ДополнительныеРеквизиты.Добавить(); + НайденнаяСтрока.Свойство = Операция.Свойство; + КонецЕсли; + + НайденнаяСтрока.Значение = Операция.Значение; + + ИмяРеквизитаФормы = ПрефиксИмениДопРеквизита() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); + ИзменяемыеДопРеквизитыОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); + + ИначеЕсли Операция.ВидОперации = 3 Тогда // изменение доп сведения + + Если Не СвойствоНужноИзменять(ИзменяемыйОбъект.Ссылка, Операция.Свойство, Параметры) Тогда + Продолжить; + КонецЕсли; + + МенеджерЗаписи = РегистрыСведений["ДополнительныеСведения"].СоздатьМенеджерЗаписи(); + + МенеджерЗаписи.Объект = ИзменяемыйОбъект.Ссылка; + МенеджерЗаписи.Свойство = Операция.Свойство; + МенеджерЗаписи.Значение = Операция.Значение; + + МассивЗаписейДопСведений.Добавить(МенеджерЗаписи); + + ИмяРеквизитаФормы = ПрефиксИмениДопСведения() + СтрЗаменить(Строка(Операция.Свойство.УникальныйИдентификатор()), "-", "_"); + ИзменяемыеДопСведенияОбъекта.Вставить(ИмяРеквизитаФормы, Операция.Значение); + + КонецЕсли; + КонецЦикла; + + Если Отказ Тогда + Продолжить; + КонецЕсли; + + Если Параметры.ИзменяемыеТабличныеЧасти.Количество() > 0 Тогда + ВнестиИзмененияВТабличныеЧасти(ИзменяемыйОбъект, ДанныеОбъекта, Параметры.ИзменяемыеТабличныеЧасти); + КонецЕсли; + + // Отбор операций изменения по каждому объекту + /////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////// + // Блок обработки проверки заполнения + // + + ПрерватьИзменение = Ложь; + ПроверкаЗаполненияУспешно = Истина; + + Попытка + Если Не ИзменяемыйОбъект.ПроверитьЗаполнение() Тогда + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_ОбработкиПроверкиЗаполнения", + ПолучитьСтрокуСообщенийОбОшибках()); + Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда + ПрерватьИзменение = Истина; + КонецЕсли; + ПроверкаЗаполненияУспешно = Ложь; + КонецЕсли; Исключение - // Если не определены ни редактируемые, ни не редактируемые реквизиты - ничего не делаем + Инфо = ИнформацияОбОшибке(); + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_НеКлассифицированная", КраткоеПредставлениеОшибки); + Если ОстанавливатьИзменениеПриОшибке Или ИзменятьВТранзакции Тогда + ПрерватьИзменение = Истина; + КонецЕсли; + ПроверкаЗаполненияУспешно = Ложь; КонецПопытки; - КонецЕсли; - - ДобавитьРеквизитыВНабор(ОбъектМетаданных.СтандартныеРеквизиты, - НеРедактируемые, - ФильтруемыеРеквизиты, - БлокируемыеРеквизиты, - ОбъектМетаданных); - - ДобавитьРеквизитыВНабор(ОбъектМетаданных.Реквизиты, - НеРедактируемые, - ФильтруемыеРеквизиты, - БлокируемыеРеквизиты, - ОбъектМетаданных); - - Операции.Сортировать("Представление Возр"); - - Если УправлениеСвойствамиМодуль <> Неопределено Тогда - ИспользуютсяДопРеквизиты = УправлениеСвойствамиМодуль.ИспользоватьДопРеквизиты(ОбъектыДляИзменения[0].СсылкаНаОбъект); - ИспользуютсяДопСведения = УправлениеСвойствамиМодуль.ИспользоватьДопСведения (ОбъектыДляИзменения[0].СсылкаНаОбъект); - Если УправлениеСвойствамиМодуль <> Неопределено И (ИспользуютсяДопРеквизиты ИЛИ ИспользуютсяДопСведения) Тогда - ДобавитьДополнительныеРеквизитыИСведенияВНабор(); + Если ПрерватьИзменение Тогда + Если ИзменятьВТранзакции Тогда + ОтменитьТранзакцию(); + КонецЕсли; + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; КонецЕсли; - Иначе - ИспользуютсяДопРеквизиты = Ложь; - ИспользуютсяДопСведения = Ложь; - КонецЕсли; - -КонецПроцедуры - -Процедура ДобавитьДополнительныеРеквизитыИСведенияВНабор() - - ТаблицаДопРеквизитов = Новый ТаблицаЗначений; - ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); - ТаблицаДопРеквизитов.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); - ТаблицаДопРеквизитов.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); - - ТаблицаДопСведений = Новый ТаблицаЗначений; - ТаблицаДопСведений.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); - ТаблицаДопСведений.Колонки.Добавить("Наименование", Новый ОписаниеТипов("Строка")); - ТаблицаДопСведений.Колонки.Добавить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов")); - - Для Каждого ОбъектДляИзменения Из ОбъектыДляИзменения Цикл - ВидОбъектаПоСсылке = ОбщегоНазначения.ВидОбъектаПоСсылке(ОбъектДляИзменения.СсылкаНаОбъект); - Если (ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") - И ОбщегоНазначения.ОбъектЯвляетсяГруппой(ОбъектДляИзменения.СсылкаНаОбъект) Тогда + Если НЕ ПроверкаЗаполненияУспешно Тогда Продолжить; КонецЕсли; - ДопРеквизиты = УправлениеСвойствамиМодуль.ПолучитьСписокСвойств(ОбъектДляИзменения.СсылкаНаОбъект, , Ложь); + // + // Блок обработки проверки заполнения + /////////////////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////// + // Блок записи дополнительных сведений + // + + Если МассивЗаписейДопСведений.Количество() > 0 Тогда - Для Каждого СвойствоСсылка Из ДопРеквизиты Цикл - ОбъектДляИзменения.СоставДопРеквизитов = ОбъектДляИзменения.СоставДопРеквизитов + Строка(СвойствоСсылка.УникальныйИдентификатор()) + Символы.ПС; - НоваяСтрока = ТаблицаДопРеквизитов.Добавить(); - - ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); - - НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; - НоваяСтрока.Наименование= ОбъектСвойство.Наименование; - НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; - КонецЦикла; - - ДопСведения = УправлениеСвойствамиМодуль.ПолучитьСписокСвойств(ОбъектДляИзменения.СсылкаНаОбъект, Ложь); - - Для Каждого СвойствоСсылка Из ДопСведения Цикл - ОбъектДляИзменения.СоставДопСведений = ОбъектДляИзменения.СоставДопСведений + Строка(СвойствоСсылка.УникальныйИдентификатор()) + Символы.ПС; - НоваяСтрока = ТаблицаДопСведений.Добавить(); - - ОбъектСвойство = СвойствоСсылка.ПолучитьОбъект(); - - НоваяСтрока.Свойство = ОбъектСвойство.Ссылка;; - НоваяСтрока.Наименование= ОбъектСвойство.Наименование; - НоваяСтрока.ТипЗначения = ОбъектСвойство.ТипЗначения; - КонецЦикла; - - КонецЦикла; - - ТаблицаДопРеквизитов.Свернуть("Свойство,Наименование,ТипЗначения"); - ТаблицаДопРеквизитов.Сортировать("Наименование Возр"); - ТаблицаДопСведений.Свернуть("Свойство,Наименование,ТипЗначения"); - ТаблицаДопСведений.Сортировать("Наименование Возр"); - - ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопРеквизитов); - ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопСведений, Ложь); - -КонецПроцедуры - -Процедура ДобавитьСвойствоВТаблицуОпераций(ТаблицаДопСвойств, ЭтоДопРеквизит = Истина) - - Для Каждого СтрокаТаблицы Из ТаблицаДопСвойств Цикл - НоваяОперация = Операции.Добавить(); - НоваяОперация.ВидОперации = ?(ЭтоДопРеквизит, 2, 3); - НоваяОперация.Свойство = СтрокаТаблицы.Свойство; - НоваяОперация.Представление = СтрокаТаблицы.Наименование; - НоваяОперация.ДопустимыеТипы = XMLСтрока(Новый ХранилищеЗначения(СтрокаТаблицы.ТипЗначения)); - КонецЦикла; - -КонецПроцедуры - -// Добавляет в набор операций (фактически набор реквизитов и свойств) те, -// которые могут быть отредактированы -// В него не попадают: -// не редактируемые - зависят от настроек самого объекта метаданных -// фильтруемые - задаются для класса объектов метаданных -// В него попадают с исключением: -// БлокируемыеРеквизиты - реквизиты, которые могут редактироваться -// только при наличии у пользователя роли РедактированиеРеквизитовОбъектов -// Передаваемые параметры: -// Реквизиты - коллекция реквизитов (стандартных реквизитов) объекта метаданных -// НеРедактируемые, ФильтруемыеРеквизиты - массив - фильтр по реквизитам -// БлокируемыеРеквизиты - массив - блокируемые реквизиты -// -Процедура ДобавитьРеквизитыВНабор(Реквизиты, - НеРедактируемые, - ФильтруемыеРеквизиты, - БлокируемыеРеквизиты, - ОбъектМетаданных) - - Для Каждого ОписаниеРеквизита Из Реквизиты Цикл - - Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") Тогда - Если НЕ ПравоДоступа("Редактирование", ОбъектыДляИзменения[0].СсылкаНаОбъект.Метаданные(), , ОписаниеРеквизита.Имя) Тогда - Продолжить; - КонецЕсли; - Иначе - Если НЕ ПравоДоступа("Редактирование", ОписаниеРеквизита) Тогда - Продолжить; - КонецЕсли; - КонецЕсли; - - Если НеРедактируемые.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда - Продолжить; - КонецЕсли; - - Если ФильтруемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда - Продолжить; - КонецЕсли; - - ВыборГруппИЭлементов = ""; - - Если ТипЗнч(ОписаниеРеквизита) = Тип("ОписаниеСтандартногоРеквизита") Тогда - - Если ОписаниеРеквизита.Имя = "Родитель" - ИЛИ ОписаниеРеквизита.Имя = "Parent" Тогда - - ВыборГруппИЭлементов = "Группы"; - - ИначеЕсли ОписаниеРеквизита.Имя = "Владелец" - ИЛИ ОписаниеРеквизита.Имя = "Owner" Тогда - - Если ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.Элементам Тогда - - ВыборГруппИЭлементов = "Элементы"; - - ИначеЕсли ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.ГруппамИЭлементам Тогда - - ВыборГруппИЭлементов = "ГруппыИЭлементы"; - - ИначеЕсли ОбъектМетаданных.ИспользованиеПодчинения = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.Группам Тогда - - ВыборГруппИЭлементов = "Группы"; - - КонецЕсли; - + Если НЕ ИзменятьВТранзакции Тогда + // Если транзакция при изменении объектов не используется, включаем ее + // для изменения доп сведений в регистре + НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); КонецЕсли; - Иначе - - ЭтоСсылка = Ложь; - Для Каждого Тип Из ОписаниеРеквизита.Тип.Типы() Цикл - Если ОбщегоНазначения.ЭтоСсылка(Тип) Тогда - ЭтоСсылка = Истина; - Прервать; - КонецЕсли; - КонецЦикла; - Если ЭтоСсылка Тогда - Если ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Группы Тогда - ВыборГруппИЭлементов = "Группы"; - ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.ГруппыИЭлементы Тогда - ВыборГруппИЭлементов = "ГруппыИЭлементы"; - ИначеЕсли ОписаниеРеквизита.ВыборГруппИЭлементов = ИспользованиеГруппИЭлементов.Элементы Тогда - ВыборГруппИЭлементов = "Элементы"; - КонецЕсли; - КонецЕсли; - КонецЕсли; - - ДопустимыеТипыСтрока = XMLСтрока(Новый ХранилищеЗначения(ОписаниеРеквизита.Тип)); - - ПараметрыВыбораСтрока = ""; - - Для Каждого ОписаниеПараметраВыбора Из ОписаниеРеквизита.ПараметрыВыбора Цикл - - ТекущийПВСтрока = "[ПолеОтбора];[ТипСтрока];[ЗначениеСтрока]"; - - ТипЗначения = ТипЗнч(ОписаниеПараметраВыбора.Значение); - - Если ТипЗначения = Тип("ФиксированныйМассив") Тогда - - СтроковоеПредставлениеТипа = "ФиксированныйМассив"; - ЗначениеСтрока = ""; - - Для Каждого Элемент Из ОписаниеПараметраВыбора.Значение Цикл - - ЗначениеСтрокаШаблон = "[Тип]%[Значение]"; - ЗначениеСтрокаШаблон = СтрЗаменить(ЗначениеСтрокаШаблон, "[Тип]", ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипЗнч(Элемент))); - ЗначениеСтрокаШаблон = СтрЗаменить(ЗначениеСтрокаШаблон, "[Значение]", XMLСтрока(Элемент)); - ЗначениеСтрока = ЗначениеСтрока + ?(ПустаяСтрока(ЗначениеСтрока), "", "%%") + ЗначениеСтрокаШаблон; - + Попытка + Для Каждого МенеджерЗаписи Из МассивЗаписейДопСведений Цикл + МенеджерЗаписи.Записать(Истина); КонецЦикла; + Исключение + Инфо = ИнформацияОбОшибке(); - Иначе - СтроковоеПредставлениеТипа = ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипЗначения); - ЗначениеСтрока = XMLСтрока(ОписаниеПараметраВыбора.Значение); - КонецЕсли; + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "Ошибка_ЗаписиДопСведений", КраткоеПредставлениеОшибки); + + ОтменитьТранзакцию(); + + Если ИзменятьВТранзакции ИЛИ ОстанавливатьИзменениеПриОшибке Тогда + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + КонецПопытки; - Если Не ПустаяСтрока(ЗначениеСтрока) Тогда - - ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ПолеОтбора]", ОписаниеПараметраВыбора.Имя); - ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ТипСтрока]", СтроковоеПредставлениеТипа); - ТекущийПВСтрока = СтрЗаменить(ТекущийПВСтрока, "[ЗначениеСтрока]", ЗначениеСтрока); - - ПараметрыВыбораСтрока = ПараметрыВыбораСтрока + ТекущийПВСтрока + Символы.ПС; - - КонецЕсли; - - КонецЦикла; - - ПараметрыВыбораСтрока = Лев(ПараметрыВыбораСтрока, СтрДлина(ПараметрыВыбораСтрока)-1); - - СвязиПараметровВыбораСтрока = ""; - - Для Каждого ОписаниеСвязиПараметровВыбора Из ОписаниеРеквизита.СвязиПараметровВыбора Цикл - ТекущаяСПВСтрока = "[ИмяПараметра];[ИмяРеквизита]"; - ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяПараметра]", ОписаниеСвязиПараметровВыбора.Имя); - ТекущаяСПВСтрока = СтрЗаменить(ТекущаяСПВСтрока, "[ИмяРеквизита]", ОписаниеСвязиПараметровВыбора.ПутьКДанным); - СвязиПараметровВыбораСтрока = СвязиПараметровВыбораСтрока + ТекущаяСПВСтрока + Символы.ПС; - КонецЦикла; - - СвязиПараметровВыбораСтрока = Лев(СвязиПараметровВыбораСтрока, СтрДлина(СвязиПараметровВыбораСтрока)-1); - - НоваяОперация = Операции.Добавить(); - НоваяОперация.ИмяРеквизита = ОписаниеРеквизита.Имя; - НоваяОперация.Представление = ?(ПустаяСтрока(ОписаниеРеквизита.Синоним), ОписаниеРеквизита.Имя, ОписаниеРеквизита.Синоним); - НоваяОперация.ВидОперации = 1; // реквизит - НоваяОперация.ДопустимыеТипы = ДопустимыеТипыСтрока; - НоваяОперация.ПараметрыВыбора = ПараметрыВыбораСтрока; - НоваяОперация.СвязиПараметровВыбора = СвязиПараметровВыбораСтрока; - НоваяОперация.ВыборГруппИЭлементов = ВыборГруппИЭлементов; - - Если БлокируемыеРеквизиты.Найти(ОписаниеРеквизита.Имя) <> Неопределено Тогда - НоваяОперация.ЗаблокированныйРеквизит = Истина; КонецЕсли; + // + // Блок записи дополнительных сведений + /////////////////////////////////////////////////////////////////////////////////////// + + Отказ = Ложь; + Попытка + ИзменяемыйОбъект.Записать(); + Исключение + Инфо = ИнформацияОбОшибке(); + Отказ = Истина; + КраткоеПредставлениеОшибки = КраткоеПредставлениеОшибки(Инфо); + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, + "Ошибка_ЗаписиОбъекта", + КраткоеПредставлениеОшибки + Символы.ПС + ПолучитьСтрокуСообщенийОбОшибках()); + Если ИзменятьВТранзакции И ТранзакцияАктивна() Тогда // отменяем транзакцию на любом уровне рекурсии + ОтменитьТранзакцию(); + КонецЕсли; + Если ПрерыватьПриОшибке Тогда + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + КонецЕсли; + КонецПопытки; + + // Фиксируем транзакцию записи доп. свойств, если запись объектов происходит + // не в транзакции + Если НЕ ИзменятьВТранзакции И МассивЗаписейДопСведений.Количество() > 0 Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + Если Не Отказ Тогда + ЗаполнитьРезультатИзменения(РезультатИзменения, Ссылка, "",, + ИзменяемыйОбъект, ИзменяемыеРеквизитыОбъекта, + ИзменяемыеДопРеквизитыОбъекта, ИзменяемыеДопСведенияОбъекта); + КонецЕсли; + + РазблокироватьДанныеДляРедактирования(ИзменяемыйОбъект.Ссылка); + КонецЦикла; + Если ИзменятьВТранзакции И ТранзакцияАктивна() Тогда + ЗафиксироватьТранзакцию(); + КонецЕсли; + + ПоместитьВоВременноеХранилище(РезультатИзменения, АдресРезультата); + Возврат; + +КонецПроцедуры + +Функция СвойствоНужноИзменять(Ссылка, Свойство, Параметры) + + ОбъектыДляИзменения = Параметры.ОбъектыДляИзменения; + Если ПодсистемаСуществует("СтандартныеПодсистемы.Свойства") Тогда + МодульУправлениеСвойствами = ОбщийМодуль("УправлениеСвойствами"); + Если МодульУправлениеСвойствами = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + КонецЕсли; + + ВидОбъектаПоСсылке = ВидОбъектаПоСсылке(Ссылка); + Если (ВидОбъектаПоСсылке = "Справочник" ИЛИ ВидОбъектаПоСсылке = "ПланВидовХарактеристик") + И ОбъектЯвляетсяГруппой(Ссылка) Тогда + Возврат Ложь; + КонецЕсли; + + Если НЕ МодульУправлениеСвойствами.ПроверитьСвойствоУОбъекта(Ссылка, Свойство) Тогда + Возврат Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +Функция ПолучитьСтрокуСообщенийОбОшибках() + + ПредставлениеОшибки = ""; + МассивСообщений = ПолучитьСообщенияПользователю(Истина); + + Для Каждого СообщениеПользователю Из МассивСообщений Цикл + ПредставлениеОшибки = ПредставлениеОшибки + СообщениеПользователю.Текст + Символы.ПС; + КонецЦикла; + + Возврат ПредставлениеОшибки; + +КонецФункции + +Процедура ЗаполнитьРезультатИзменения(Результат, Ссылка, КодОшибки, СообщениеОбОшибке = "", + ИзменяемыйОбъект = Неопределено, ИзменяемыеРеквизитыОбъекта = Неопределено, + ИзменяемыеДопРеквизитыОбъекта = Неопределено, ИзменяемыеДопСведенияОбъекта = Неопределено) + + СостояниеИзменения = Новый Структура("КодОшибки,СообщениеОбОшибке"); + + Если ПустаяСтрока(КодОшибки) Тогда + СостояниеИзменения.Вставить("ЗначенияИзмененныхРеквизитов", Новый Соответствие); + Если ИзменяемыеРеквизитыОбъекта <> Неопределено Тогда + Для Каждого ИмяРеквизита Из ИзменяемыеРеквизитыОбъекта Цикл + СостояниеИзменения.ЗначенияИзмененныхРеквизитов.Вставить(ИмяРеквизита, ИзменяемыйОбъект[ИмяРеквизита]); + КонецЦикла; + КонецЕсли; + СостояниеИзменения.Вставить("ЗначенияИзмененныхДопРеквизитов", ИзменяемыеДопРеквизитыОбъекта); + СостояниеИзменения.Вставить("ЗначенияИзмененныхДопСведений", ИзменяемыеДопСведенияОбъекта); + Иначе + Результат.ЕстьОшибки = Истина; + КонецЕсли; + + СостояниеИзменения.КодОшибки = КодОшибки; + СостояниеИзменения.СообщениеОбОшибке = СообщениеОбОшибке; + + Результат.СостояниеОбработки.Вставить(Ссылка, СостояниеИзменения); + КонецПроцедуры -// Получает массив реквизитов, редактирование которых не предусмотрено -// на уровне конфигурации -// -Функция ПолучитьФильтрРедактированияПоТипу(ОбъектМетаданных) +Функция ПрефиксИмениДопРеквизита() + Возврат "ДопРеквизит_"; +КонецФункции + +Функция ПрефиксИмениДопСведения() + Возврат "ДопСведение_"; +КонецФункции + +Функция ПроверятьНаГруппу(Ссылка) - ФильтрXML = Обработки.ГрупповоеИзменениеОбъектов.ПолучитьМакет("ФильтрРеквизитов").ПолучитьТекст(); + ВидОбъекта = ВидОбъектаПоСсылке(Ссылка); + МетаданныеОбъекта = Ссылка.Метаданные(); - ФильтрТаблица = ОбщегоНазначения.ПрочитатьXMLВТаблицу(ФильтрXML).Данные; + Если ВидОбъекта = "Справочник" + И МетаданныеОбъекта.Иерархический + И МетаданныеОбъекта.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда + + Возврат Истина; + + КонецЕсли; - // Реквизиты, блокируемые для любого типа объектов метаданных - ОбщийФильтр = ФильтрТаблица.НайтиСтроки(Новый Структура("ObjectType", "*")); + Возврат Ложь; - // Реквизиты, блокируемые для указанного типа объектов метаданных - ФильтрПоТипуОМ = ФильтрТаблица.НайтиСтроки( - Новый Структура("ObjectType", - ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(ОбъектМетаданных)) ); - - ФильтруемыеРеквизиты = Новый Массив; - - Для Каждого СтрокаОписание Из ОбщийФильтр Цикл - ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); +КонецФункции + +Процедура ВнестиИзмененияВТабличныеЧасти(ИзменяемыйОбъект, ДанныеОбъекта, ИзмененияВТабличныхЧастях) + Для Каждого ИзмененияТабличнойЧасти Из ИзмененияВТабличныхЧастях Цикл + ИмяТаблицы = ИзмененияТабличнойЧасти.Ключ; + ИзменяемыеРеквизиты = ИзмененияТабличнойЧасти.Значение; + Для Каждого СтрокаТаблицы Из ИзменяемыйОбъект[ИмяТаблицы] Цикл + Если СтрокаСоответствуетОтбору(СтрокаТаблицы, ДанныеОбъекта, ИмяТаблицы) Тогда + Для Каждого ИзменяемыйРеквизит Из ИзменяемыеРеквизиты Цикл + СтрокаТаблицы[ИзменяемыйРеквизит.Имя] = ИзменяемыйРеквизит.Значение; + КонецЦикла; + КонецЕсли; + КонецЦикла; КонецЦикла; +КонецПроцедуры + +Функция СтрокаСоответствуетОтбору(СтрокаТаблицы, ДанныеОбъекта, ИмяТаблицы) - Для Каждого СтрокаОписание Из ФильтрПоТипуОМ Цикл - ФильтруемыеРеквизиты.Добавить(СтрокаОписание.Attribute); - КонецЦикла; - - Возврат ФильтруемыеРеквизиты; + Возврат ДанныеОбъекта.Строки.НайтиСтроки(Новый Структура(ИмяТаблицы + "НомерСтроки", СтрокаТаблицы.НомерСтроки)).Количество() = 1; КонецФункции //////////////////////////////////////////////////////////////////////////////// -// РАЗДЕЛ ИНИЦИАЛИЗАЦИИ +// Процедуры и функции из базовой функциональности для обеспечения автономности -// Для использования обработки без подсистемы свойств, связь с модулем УправлениеСвойствами -// вычисляется в режиме предприятия, а не на этапе компиляции -УправлениеСвойствамиМодуль = - ?(Метаданные.НайтиПоПолномуИмени("ОбщийМодуль.УправлениеСвойствами") = Неопределено, - Неопределено, - Вычислить("УправлениеСвойствами")); +// Возвращает признак того, что реквизит входит в подмножество стандартных реквизитов +// +// Параметры: +// СтандартныеРеквизиты – ОписанияСтандартныхРеквизитов - тип и значение описывает коллекцию настроек различных стандартных реквизитов; +// ИмяРеквизита – Строка – реквизит который необходимо проверить на принадлежность множеству стандартных реквизитов; +// +// Возвращаемое значение: +// Тип: Булево. Истина - реквизит входит в подмножество стандартных реквизитов; Ложь – нет. +// +Функция ЭтоСтандартныйРеквизит(СтандартныеРеквизиты, ИмяРеквизита) Экспорт + + Для Каждого Реквизит ИЗ СтандартныеРеквизиты Цикл + Если Реквизит.Имя = ИмяРеквизита Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + Возврат Ложь; + +КонецФункции + +// Функция ВидОбъектаПоСсылке возвращает имя вида объектов метаданных +// по ссылке на объект. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +Функция ВидОбъектаПоСсылке(Ссылка) Экспорт + + Возврат ВидОбъектаПоТипу(ТипЗнч(Ссылка)); + +КонецФункции + +// Функция возвращает имя вида объектов метаданных по типу объекта. +// +// Не обрабатываются точки маршрутов бизнес-процессов. +// +// Параметры: +// Тип - Тип прикладного объекта, определенный в конфигурации +// +// Возвращаемое значение: +// Строка - имя вида объектов метаданных, например, "Справочник", "Документ" ... +// +Функция ВидОбъектаПоТипу(Тип) Экспорт + + Если Справочники.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Справочник"; + + ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Документ"; + + ИначеЕсли БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "БизнесПроцесс"; + + ИначеЕсли ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовХарактеристик"; + + ИначеЕсли ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланСчетов"; + + ИначеЕсли ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланВидовРасчета"; + + ИначеЕсли Задачи.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Задача"; + + ИначеЕсли ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "ПланОбмена"; + + ИначеЕсли Перечисления.ТипВсеСсылки().СодержитТип(Тип) Тогда + Возврат "Перечисление"; + + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru='Неверный тип значения параметра (%1)'"), Строка(Тип)); + + КонецЕсли; + +КонецФункции + +// Проверяет является ли объект группой элементов. +// +// Параметры: +// Объект - Объект, Ссылка, ДанныеФормыСтруктура по типу Объект. +// +// Возвращаемое значение: +// Булево. +// +Функция ОбъектЯвляетсяГруппой(Объект) Экспорт + + Если ЗначениеСсылочногоТипа(Объект) Тогда + Ссылка = Объект; + Иначе + Ссылка = Объект.Ссылка; + КонецЕсли; + + МетаданныеОбъекта = Ссылка.Метаданные(); + + Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда + + Если НЕ МетаданныеОбъекта.Иерархический + ИЛИ МетаданныеОбъекта.ВидИерархии + <> Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда + + Возврат Ложь; + КонецЕсли; + + ИначеЕсли НЕ Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта) Тогда + Возврат Ложь; + + ИначеЕсли НЕ МетаданныеОбъекта.Иерархический Тогда + Возврат Ложь; + КонецЕсли; + + Если Ссылка <> Объект Тогда + Возврат Объект.ЭтоГруппа; + КонецЕсли; + + Возврат ЗначениеРеквизитаОбъекта(Ссылка, "ЭтоГруппа"); + +КонецФункции + +// Проверить, что значение имеет ссылочный тип данных. +// +// Параметры: +// Значение - ссылка на объект, - элемент справочника, документ, ... +// +// Возвращаемое значение: +// Булево - Истина, если тип значения ссылочный. +// +Функция ЗначениеСсылочногоТипа(Значение) Экспорт + + Если Значение = Неопределено Тогда + Возврат Ложь; + КонецЕсли; + + Если Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Перечисления.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыСчетов.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Если ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы +// по ссылке на объект. +// +// Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - Ссылка на объект - элемент справочника, документ, ... +// +// Реквизиты - Строка - имена реквизитов, перечисленные через запятую, в формате +// требований к свойствам структуры. +// Например, "Код, Наименование, Родитель". +// - Структура, ФиксированнаяСтруктура - в качестве ключа передается +// псевдоним поля для возвращаемой структуры с результатом, а в качестве +// значения (опционально) фактическое имя поля в таблице. +// Если значение не определено, то имя поля берется из ключа. +// - Массив, ФиксированныйМассив - имена реквизитов в формате требований +// к свойствам структуры. +// +// Возвращаемое значение: +// Структура - содержит имена (ключи) и значения затребованных реквизитов. +// Если строка затребованных реквизитов пуста, то возвращается пустая структура +// +Функция ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты) Экспорт + + Если ТипЗнч(Реквизиты) = Тип("Строка") Тогда + Если ПустаяСтрока(Реквизиты) Тогда + Возврат Новый Структура; + КонецЕсли; + Реквизиты = РазложитьСтрокуВМассивПодстрок(Реквизиты, ",", Истина); + КонецЕсли; + + СтруктураРеквизитов = Новый Структура; + Если ТипЗнч(Реквизиты) = Тип("Структура") Или ТипЗнч(Реквизиты) = Тип("ФиксированнаяСтруктура") Тогда + СтруктураРеквизитов = Реквизиты; + ИначеЕсли ТипЗнч(Реквизиты) = Тип("Массив") Или ТипЗнч(Реквизиты) = Тип("ФиксированныйМассив") Тогда + Для Каждого Реквизит Из Реквизиты Цикл + СтруктураРеквизитов.Вставить(СтрЗаменить(Реквизит, ".", ""), Реквизит); + КонецЦикла; + Иначе + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Неверный тип второго параметра Реквизиты: %1'"), + Строка(ТипЗнч(Реквизиты))); + КонецЕсли; + + ТекстПолей = ""; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Значение), + СокрЛП(КлючИЗначение.Ключ)); + + Псевдоним = СокрЛП(КлючИЗначение.Ключ); + + ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " + | " + ИмяПоля + " КАК " + Псевдоним; + КонецЦикла; + + Запрос = Новый Запрос; + Запрос.УстановитьПараметр("Ссылка", Ссылка); + Запрос.Текст = + "ВЫБРАТЬ + |" + ТекстПолей + " + |ИЗ + | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы + |ГДЕ + | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка + |"; + Выборка = Запрос.Выполнить().Выбрать(); + Выборка.Следующий(); + + Результат = Новый Структура; + Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл + Результат.Вставить(КлючИЗначение.Ключ); + КонецЦикла; + ЗаполнитьЗначенияСвойств(Результат, Выборка); + + Возврат Результат; + +КонецФункции + +// Возвращает значение реквизита, прочитанного из информационной базы по ссылке на объект. +// +// Если доступа к реквизиту нет, возникнет исключение прав доступа. +// Если необходимо зачитать реквизит независимо от прав текущего пользователя, +// то следует использовать предварительный переход в привилегированный режим. +// +// Параметры: +// Ссылка - ссылка на объект, - элемент справочника, документ, ... +// ИмяРеквизита - Строка, например, "Код". +// +// Возвращаемое значение: +// Произвольный - зависит от типа значения прочитанного реквизита. +// +Функция ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита) Экспорт + + Результат = ЗначенияРеквизитовОбъекта(Ссылка, ИмяРеквизита); + Возврат Результат[СтрЗаменить(ИмяРеквизита, ".", "")]; + +КонецФункции + +// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. +// +// Параметры: +// Строка - Строка - текст с разделителями; +// Разделитель - Строка - разделитель строк текста, минимум 1 символ; +// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. +// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: +// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки +// включаются в результат. +// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в +// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а +// при других разделителях результатом функции будет пустой массив. +// +// +// Возвращаемое значение: +// Массив - массив строк. +// +// Примеры: +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые строки; +// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; +// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; +// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); +// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); +// +Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт + + Результат = Новый Массив; + + // для обеспечения обратной совместимости + Если ПропускатьПустыеСтроки = Неопределено Тогда + ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); + Если ПустаяСтрока(Строка) Тогда + Если Разделитель = " " Тогда + Результат.Добавить(""); + КонецЕсли; + Возврат Результат; + КонецЕсли; + КонецЕсли; + // + + Позиция = Найти(Строка, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Строка, Позиция - 1); + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда + Результат.Добавить(Подстрока); + КонецЕсли; + Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); + Позиция = Найти(Строка, Разделитель); + КонецЦикла; + + Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда + Результат.Добавить(Строка); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Подставляет параметры в строку. Максимально возможное число параметров - 9. +// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы. +// +// Параметры: +// СтрокаПодстановки – Строка – шаблон строки с параметрами (вхождениями вида "%ИмяПараметра"); +// Параметр - Строка - подставляемый параметр. +// +// Возвращаемое значение: +// Строка – текстовая строка с подставленными параметрами. +// +// Пример: +// ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел в Зоопарк". +// +Функция ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки, + Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено, + Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено, + Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт + + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%1", Параметр1); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%2", Параметр2); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%3", Параметр3); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%4", Параметр4); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%5", Параметр5); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%6", Параметр6); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%7", Параметр7); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%8", Параметр8); + СтрокаПодстановки = СтрЗаменить(СтрокаПодстановки, "%9", Параметр9); + + Возврат СтрокаПодстановки; +КонецФункции + +// Возвращает Истина, если подсистема существует. +// +// Параметры: +// ПолноеИмяПодсистемы - Строка. Полное имя объекта метаданных подсистема без слов "Подсистема.". +// Например: "СтандартныеПодсистемы.БазоваяФункциональность". +// +// Пример вызова необязательной подсистемы: +// +// Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.УправлениеДоступом") Тогда +// МодульУправлениеДоступом = ОбщегоНазначения.ОбщийМодуль("УправлениеДоступом"); +// МодульУправлениеДоступом.<Имя метода>(); +// КонецЕсли; +// +// Возвращаемое значение: +// Булево. +// +Функция ПодсистемаСуществует(ПолноеИмяПодсистемы) Экспорт + + ИменаПодсистем = ИменаПодсистем(); + Возврат ИменаПодсистем.Получить(ПолноеИмяПодсистемы) <> Неопределено; + +КонецФункции + +// Возвращает соответствие имен подсистем и значения Истина; +Функция ИменаПодсистем() Экспорт + + Возврат Новый ФиксированноеСоответствие(ИменаПодчиненныхПодсистем(Метаданные)); + +КонецФункции + +Функция ИменаПодчиненныхПодсистем(РодительскаяПодсистема) + + Имена = Новый Соответствие; + + Для Каждого ТекущаяПодсистема Из РодительскаяПодсистема.Подсистемы Цикл + + Имена.Вставить(ТекущаяПодсистема.Имя, Истина); + ИменаПодчиненных = ИменаПодчиненныхПодсистем(ТекущаяПодсистема); + + Для каждого ИмяПодчиненной Из ИменаПодчиненных Цикл + Имена.Вставить(ТекущаяПодсистема.Имя + "." + ИмяПодчиненной.Ключ, Истина); + КонецЦикла; + КонецЦикла; + + Возврат Имена; + +КонецФункции + +// Возвращает ссылку на общий модуль по имени. +// +// Параметры: +// Имя - Строка - имя общего модуля, например: +// "ОбщегоНазначения", +// "ОбщегоНазначенияКлиент". +// +// Возвращаемое значение: +// ОбщийМодуль. +// +Функция ОбщийМодуль(Имя) Экспорт + + Если Метаданные.ОбщиеМодули.Найти(Имя) <> Неопределено Тогда + Модуль = Вычислить(Имя); + Иначе + Модуль = Неопределено; + КонецЕсли; + + Если ТипЗнч(Модуль) <> Тип("ОбщийМодуль") Тогда + ВызватьИсключение ПодставитьПараметрыВСтроку( + НСтр("ru = 'Общий модуль ""%1"" не найден.'"), Имя); + КонецЕсли; + + Возврат Модуль; + +КонецФункции #КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt index 20248732d..009ec2915 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/Templates/ФильтрРеквизитов/Template.txt @@ -3,27 +3,39 @@ + + + + + - - - + + + - - - + + + - + + + + + + + + diff --git a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo index 4797e48e1..6759bdb78 100644 --- a/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo +++ b/SSL/src/DataProcessors/ГрупповоеИзменениеОбъектов/ГрупповоеИзменениеОбъектов.mdo @@ -9,7 +9,6 @@ ru Групповое изменение объектов - true DataProcessor.ГрупповоеИзменениеОбъектов.Form.Форма true @@ -65,264 +64,18 @@ - - - - - - Операции + + ПоказыватьСлужебныеРеквизиты ru - Операции + Показывать служебные реквизиты - - Use - LineNumber - - Use - - - - - ВидОперации - - ru - Вид операции - - - Number - - 1 - true - - - - - - - - ИмяРеквизита - - ru - Имя реквизита (свойство) - - - String - - - - - - - - Свойство - - ru - Свойство - - - ChartOfCharacteristicTypesRef.ДополнительныеРеквизитыИСведения - - - - - - - Представление - - ru - Представление - - - String - - - - - - - - Изменять - - ru - Изменять - - - Boolean - - - - - - - Значение - - ru - Значение - - - Boolean - String - Date - Number - AnyRef - - 30 - 10 - - - 1024 - - - - - - - - - ЗаблокированныйРеквизит - - ru - Заблокированный реквизит - - - Boolean - - - - - - - ДопустимыеТипы - - ru - Допустимые типы - - - String - - - - - - - - ПараметрыВыбора - - ru - Параметры выбора - - - String - - - - - - - - СвязиПараметровВыбора - - ru - Связи параметров выбора - - - String - - - - - - - - ВыборГруппИЭлементов - - ru - Выбор групп и элементов - - - String - - 15 - - - - - - ГруппыИЭлементы - - - - - - - - - ОбъектыДляИзменения - - ru - Объекты для изменения - - - Use - LineNumber - - Use - - - - - СсылкаНаОбъект - - ru - Ссылка на объект - - - AnyRef - - - - - - - СоставДопРеквизитов - - ru - Состав доп реквизитов - - - String - - - - ru - Каждая строка - ссылка на свойство - - true - - - - - - СоставДопСведений - - ru - Состав доп сведений - - - String - - - - ru - Каждая строка - ссылка на свойство - - true - - - - - + + Boolean + + + + Форма @@ -333,10 +86,10 @@ MobileDevice - Настройка + ДополнительныеПараметры ru - Настройка + Дополнительные параметры @@ -346,6 +99,24 @@ PersonalComputer MobileDevice + + ВыбранныеЭлементы + + ru + Выбранные элементы + + PersonalComputer + MobileDevice + + + ВыборВидаОбъектов + + ru + Выбор вида объектов + + PersonalComputer + MobileDevice + ФильтрРеквизитов @@ -354,4 +125,17 @@ TextDocument + + ГрупповоеИзменениеРеквизитов + + ru + Групповое изменение реквизитов + + ActionsPanelTools + Auto + + ru + Групповое изменение реквизитов и табличных частей произвольных объектов + + diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form index 277903bec..135242dd2 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Form.form @@ -31,7 +31,7 @@ КоличествоПоказываемыхСобытийПриИзменении - КоличествоПоказываемыхСобытийРасширеннаяПодсказка + КоличествоПоказываемыхСобытийExtendedTooltip 136 Label true @@ -54,7 +54,7 @@ true true - true + true ru ЧГ=0 @@ -121,8 +121,8 @@ ПредставлениеОтбора - ПредставлениеОтбораРасширеннаяПодсказка - 138 + ПредставлениеОтбораExtendedTooltip + 137 Label true true @@ -160,7 +160,7 @@ Группа отбора - ГруппаОтбораРасширеннаяПодсказка + ГруппаОтбораExtendedTooltip 135 Label true @@ -224,8 +224,8 @@ Журнал.Дата - ДатаРасширеннаяПодсказка - 157 + ДатаExtendedTooltip + 146 Label true true @@ -267,8 +267,8 @@ Журнал.ПредставлениеРазделенияДанныхСеанса - ПредставлениеРазделенияДанныхСеансаРасширеннаяПодсказка - 159 + ПредставлениеРазделенияДанныхСеансаExtendedTooltip + 147 Label true true @@ -315,8 +315,8 @@ Журнал.ИмяПользователя - ИмяПользователяРасширеннаяПодсказка - 162 + ИмяПользователяExtendedTooltip + 149 Label true true @@ -362,8 +362,8 @@ Журнал.Компьютер - КомпьютерРасширеннаяПодсказка - 164 + КомпьютерExtendedTooltip + 150 Label true true @@ -412,8 +412,8 @@ Журнал.ПредставлениеПриложения - ПредставлениеПриложенияРасширеннаяПодсказка - 167 + ПредставлениеПриложенияExtendedTooltip + 152 Label true true @@ -455,8 +455,8 @@ Журнал.Сеанс - СеансРасширеннаяПодсказка - 169 + СеансExtendedTooltip + 153 Label true true @@ -492,8 +492,8 @@ true - ГруппаПриложениеРасширеннаяПодсказка - 166 + ГруппаПриложениеExtendedTooltip + 151 Label true true @@ -513,8 +513,8 @@ true - ГруппаПользовательКомпьютерПриложениеРасширеннаяПодсказка - 161 + ГруппаПользовательКомпьютерПриложениеExtendedTooltip + 148 Label true true @@ -544,8 +544,8 @@ Журнал.РабочийСервер - РабочийСерверРасширеннаяПодсказка - 172 + РабочийСерверExtendedTooltip + 155 Label true true @@ -587,8 +587,8 @@ Журнал.ОсновнойIPПорт - ОсновнойIPПортРасширеннаяПодсказка - 174 + ОсновнойIPПортExtendedTooltip + 156 Label true true @@ -634,8 +634,8 @@ Вспомогательный IP порт - ВспомогательныйIPПортРасширеннаяПодсказка - 176 + ВспомогательныйIPПортExtendedTooltip + 157 Label true true @@ -677,8 +677,8 @@ Группа сервер - ГруппаСерверРасширеннаяПодсказка - 171 + ГруппаСерверExtendedTooltip + 154 Label true true @@ -712,8 +712,8 @@ Журнал.ПредставлениеСобытия - ПредставлениеСобытияРасширеннаяПодсказка - 179 + ПредставлениеСобытияExtendedTooltip + 159 Label true true @@ -759,8 +759,8 @@ Журнал.Комментарий - КомментарийРасширеннаяПодсказка - 181 + КомментарийExtendedTooltip + 160 Label true true @@ -796,8 +796,8 @@ true - ГруппаСобытиеРасширеннаяПодсказка - 178 + ГруппаСобытиеExtendedTooltip + 158 Label true true @@ -831,8 +831,8 @@ Журнал.СтатусТранзакции - СтатусТранзакцииРасширеннаяПодсказка - 184 + СтатусТранзакцииExtendedTooltip + 162 Label true true @@ -874,8 +874,8 @@ Журнал.Транзакция - ТранзакцияРасширеннаяПодсказка - 186 + ТранзакцияExtendedTooltip + 163 Label true true @@ -911,8 +911,8 @@ true - ГруппаТранзакцияРасширеннаяПодсказка - 183 + ГруппаТранзакцияExtendedTooltip + 161 Label true true @@ -946,8 +946,8 @@ Журнал.ПредставлениеМетаданных - ПредставлениеМетаданныхРасширеннаяПодсказка - 189 + ПредставлениеМетаданныхExtendedTooltip + 165 Label true true @@ -989,8 +989,8 @@ Журнал.Данные - ДанныеРасширеннаяПодсказка - 191 + ДанныеExtendedTooltip + 166 Label true true @@ -1032,8 +1032,8 @@ Журнал.ПредставлениеДанных - ПредставлениеДанныхРасширеннаяПодсказка - 193 + ПредставлениеДанныхExtendedTooltip + 167 Label true true @@ -1062,8 +1062,8 @@ true - ГруппаДанныеРасширеннаяПодсказка - 188 + ГруппаДанныеExtendedTooltip + 164 Label true true @@ -1090,10 +1090,10 @@ ЖурналСтрокаПоиска - 148 + 172 ЖурналСтрокаПоискаРасширеннаяПодсказка - 150 + 174 Label true true @@ -1103,7 +1103,7 @@ ЖурналСтрокаПоискаКонтекстноеМеню - 149 + 173 true Журнал @@ -1113,10 +1113,10 @@ ЖурналСостояниеПросмотра - 151 + 175 ЖурналСостояниеПросмотраРасширеннаяПодсказка - 153 + 177 Label true true @@ -1126,7 +1126,7 @@ ЖурналСостояниеПросмотраКонтекстноеМеню - 152 + 176 true ViewStatusAddition @@ -1137,10 +1137,10 @@ ЖурналУправлениеПоиском - 154 + 178 ЖурналУправлениеПоискомРасширеннаяПодсказка - 156 + 180 Label true true @@ -1150,7 +1150,7 @@ ЖурналУправлениеПоискомКонтекстноеМеню - 155 + 179 true SearchControlAddition @@ -1160,8 +1160,8 @@ - ЖурналРасширеннаяПодсказка - 147 + ЖурналExtendedTooltip + 145 Label true true @@ -1185,8 +1185,8 @@ false - УстановитьОтборПоЗначениюВТекущейКолонкеКонтекстРасширеннаяПодсказка - 143 + УстановитьОтборПоЗначениюВТекущейКолонкеКонтекстExtendedTooltip + 141 Label true true @@ -1220,8 +1220,8 @@ true - ЖурналКонтекстноеМенюОтключитьОтборРасширеннаяПодсказка - 144 + ЖурналКонтекстноеМенюОтключитьОтборExtendedTooltip + 142 Label true true @@ -1251,8 +1251,8 @@ Отбор группа контекст - ОтборГруппаКонтекстРасширеннаяПодсказка - 142 + ОтборГруппаКонтекстExtendedTooltip + 140 Label true true @@ -1272,8 +1272,8 @@ false - ПросмотрТекущегоСобытияВОтдельномОкнеКонтекстРасширеннаяПодсказка - 145 + ПросмотрТекущегоСобытияВОтдельномОкнеКонтекстExtendedTooltip + 143 Label true true @@ -1308,8 +1308,8 @@ false - ОткрытьДанныеДляПросмотраКонтекстРасширеннаяПодсказка - 146 + ОткрытьДанныеДляПросмотраКонтекстExtendedTooltip + 144 Label true true @@ -1382,8 +1382,8 @@ Журнал регистрации - ЖурналРегистрацииРасширеннаяПодсказка - 141 + ЖурналРегистрацииExtendedTooltip + 139 Label true true @@ -1413,8 +1413,8 @@ None - ПолеИндикаторДлительныхОперацийРасширеннаяПодсказка - 204 + ПолеИндикаторДлительныхОперацийExtendedTooltip + 169 Label true true @@ -1463,8 +1463,8 @@ Индикатор длительных операций - ИндикаторДлительныхОперацийРасширеннаяПодсказка - 203 + ИндикаторДлительныхОперацийExtendedTooltip + 168 Label true true @@ -1492,8 +1492,8 @@ Страницы - СтраницыРасширеннаяПодсказка - 140 + СтраницыExtendedTooltip + 138 Label true true @@ -1523,7 +1523,7 @@ true - УстановитьИнтервалДатДляПросмотраРасширеннаяПодсказка + УстановитьИнтервалДатДляПросмотраExtendedTooltip 122 Label true @@ -1550,7 +1550,7 @@ false - УстановитьОтборРасширеннаяПодсказка + УстановитьОтборExtendedTooltip 123 Label true @@ -1586,7 +1586,7 @@ false - УстановитьОтборПоЗначениюВТекущейКолонкеРасширеннаяПодсказка + УстановитьОтборПоЗначениюВТекущейКолонкеExtendedTooltip 124 Label true @@ -1622,7 +1622,7 @@ false - ОтключитьОтборРасширеннаяПодсказка + ОтключитьОтборExtendedTooltip 125 Label true @@ -1662,7 +1662,7 @@ Команды отбора - КомандыОтбораРасширеннаяПодсказка + КомандыОтбораExtendedTooltip 121 Label true @@ -1683,7 +1683,7 @@ false - ПросмотрТекущегоСобытияВОтдельномОкнеРасширеннаяПодсказка + ПросмотрТекущегоСобытияВОтдельномОкнеExtendedTooltip 126 Label true @@ -1719,7 +1719,7 @@ false - ОткрытьДанныеДляПросмотраРасширеннаяПодсказка + ОткрытьДанныеДляПросмотраExtendedTooltip 127 Label true @@ -1758,7 +1758,7 @@ false - ОбновитьТекущийСписокРасширеннаяПодсказка + ОбновитьТекущийСписокExtendedTooltip 129 Label true @@ -1798,7 +1798,7 @@ Команда обновить - КомандаОбновитьРасширеннаяПодсказка + КомандаОбновитьExtendedTooltip 128 Label true @@ -1821,7 +1821,7 @@ true - ФормаНайтиРасширеннаяПодсказка + ФормаНайтиExtendedTooltip 131 Label true @@ -1847,7 +1847,7 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка + ФормаОтменитьПоискExtendedTooltip 132 Label true @@ -1878,7 +1878,7 @@ Команды поиска - КомандыПоискаРасширеннаяПодсказка + КомандыПоискаExtendedTooltip 130 Label true @@ -1899,7 +1899,7 @@ false - ИзменитьФормуРасширеннаяПодсказка + ИзменитьФормуExtendedTooltip 133 Label true @@ -1927,7 +1927,7 @@ false - ВывестиСписокРасширеннаяПодсказка + ВывестиСписокExtendedTooltip 134 Label true diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl index a336f31db..262e377e0 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ЖурналРегистрации/Module.bsl @@ -179,14 +179,8 @@ &НаКлиенте Процедура УстановитьИнтервалДатДляПросмотра() - Если ЖурналРегистрацииКлиент.УстановитьИнтервалДатДляПросмотра( - ИнтервалДат, - ОтборЖурналаРегистрации - ) Тогда - - ОбновитьТекущийСписок(); - - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("УстановитьИнтервалДатДляПросмотраЗавершение", ЭтотОбъект); + ЖурналРегистрацииКлиент.УстановитьИнтервалДатДляПросмотра(ИнтервалДат, ОтборЖурналаРегистрации, Оповещение) КонецПроцедуры @@ -201,7 +195,7 @@ ОткрытьФорму( "Обработка.ЖурналРегистрации.Форма.ОтборЖурналаРегистрации", Новый Структура("Отбор, СобытияПоУмолчанию", ОтборФормы, ОтборЖурналаРегистрацииПоУмолчанию.Событие), - ЭтаФорма); + ЭтотОбъект); КонецПроцедуры @@ -228,6 +222,15 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура УстановитьИнтервалДатДляПросмотраЗавершение(ИнтервалУстановлен, ДополнительныеПараметры) Экспорт + + Если ИнтервалУстановлен Тогда + ОбновитьТекущийСписок(); + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура ПриЗакрытииНаСервере() diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form index fa29c43cf..3d65e986e 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Form.form @@ -22,7 +22,7 @@ ИнтервалОтбораПриИзменении - ИнтервалОтбораРасширеннаяПодсказка + ИнтервалОтбораExtendedTooltip 202 Label true @@ -57,7 +57,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 201 Label true @@ -99,8 +99,8 @@ ИнтервалОтбораДатаПриИзменении - ДатаНачалаРасширеннаяПодсказка - 205 + ДатаНачалаExtendedTooltip + 204 Label true true @@ -152,8 +152,8 @@ ИнтервалОтбораДатаПриИзменении - ДатаОкончанияРасширеннаяПодсказка - 207 + ДатаОкончанияExtendedTooltip + 205 Label true true @@ -191,8 +191,8 @@ true - Группа2РасширеннаяПодсказка - 204 + Группа2ExtendedTooltip + 203 Label true true @@ -223,7 +223,7 @@ Группа даты - ГруппаДатыРасширеннаяПодсказка + ГруппаДатыExtendedTooltip 200 Label true @@ -260,8 +260,8 @@ СписокПользователей - ПользователиРасширеннаяПодсказка - 211 + ПользователиExtendedTooltip + 208 Label true true @@ -307,8 +307,8 @@ Приложения - ПриложенияРасширеннаяПодсказка - 213 + ПриложенияExtendedTooltip + 209 Label true true @@ -354,8 +354,8 @@ Компьютеры - КомпьютерыРасширеннаяПодсказка - 215 + КомпьютерыExtendedTooltip + 210 Label true true @@ -395,8 +395,8 @@ true - Группа3РасширеннаяПодсказка - 210 + Группа3ExtendedTooltip + 207 Label true true @@ -443,8 +443,8 @@ Важность.Check - ПометкаВажностиРасширеннаяПодсказка - 228 + ПометкаВажностиExtendedTooltip + 213 Label true true @@ -477,8 +477,8 @@ Важность.Value - ЗначениеВажностиРасширеннаяПодсказка - 230 + ЗначениеВажностиExtendedTooltip + 214 Label true true @@ -518,10 +518,10 @@ ВажностьСтрокаПоиска - 219 + 244 ВажностьСтрокаПоискаРасширеннаяПодсказка - 221 + 246 Label true true @@ -531,7 +531,7 @@ ВажностьСтрокаПоискаКонтекстноеМеню - 220 + 245 true Важность @@ -541,10 +541,10 @@ ВажностьСостояниеПросмотра - 222 + 247 ВажностьСостояниеПросмотраРасширеннаяПодсказка - 224 + 249 Label true true @@ -554,7 +554,7 @@ ВажностьСостояниеПросмотраКонтекстноеМеню - 223 + 248 true ViewStatusAddition @@ -565,10 +565,10 @@ ВажностьУправлениеПоиском - 225 + 250 ВажностьУправлениеПоискомРасширеннаяПодсказка - 227 + 252 Label true true @@ -578,7 +578,7 @@ ВажностьУправлениеПоискомКонтекстноеМеню - 226 + 251 true SearchControlAddition @@ -588,8 +588,8 @@ - ВажностьРасширеннаяПодсказка - 218 + ВажностьExtendedTooltip + 212 Label true true @@ -633,8 +633,8 @@ true - Группа4РасширеннаяПодсказка - 217 + Группа4ExtendedTooltip + 211 Label true true @@ -659,8 +659,8 @@ true - ГруппаРасширеннаяПодсказка - 209 + ГруппаExtendedTooltip + 206 Label true true @@ -697,8 +697,8 @@ Метаданные - МетаданныеРасширеннаяПодсказка - 242 + МетаданныеExtendedTooltip + 217 Label true true @@ -744,8 +744,8 @@ Данные - ДанныеРасширеннаяПодсказка - 244 + ДанныеExtendedTooltip + 218 Label true true @@ -789,8 +789,8 @@ ПредставлениеДанных - ПредставлениеДанныхРасширеннаяПодсказка - 246 + ПредставлениеДанныхExtendedTooltip + 219 Label true true @@ -843,8 +843,8 @@ Данные - ГруппаДанныеСвойстваРасширеннаяПодсказка - 241 + ГруппаДанныеСвойстваExtendedTooltip + 216 Label true true @@ -882,8 +882,8 @@ None - СобытияРасширеннаяПодсказка - 250 + СобытияExtendedTooltip + 222 Label true true @@ -934,8 +934,8 @@ Top - КомментарийРасширеннаяПодсказка - 252 + КомментарийExtendedTooltip + 223 Label true true @@ -980,8 +980,8 @@ Группа основные строковые - ГруппаОсновныеСтроковыеРасширеннаяПодсказка - 249 + ГруппаОсновныеСтроковыеExtendedTooltip + 221 Label true true @@ -1020,8 +1020,8 @@ Основные свойства - ГруппаОсновныеСвойстваРасширеннаяПодсказка - 248 + ГруппаОсновныеСвойстваExtendedTooltip + 220 Label true true @@ -1053,8 +1053,8 @@ Группа основные - ГруппаОсновныеРасширеннаяПодсказка - 240 + ГруппаОсновныеExtendedTooltip + 215 Label true true @@ -1100,8 +1100,8 @@ Номера сеансов задаются через ; - СеансыРасширеннаяПодсказка - 256 + СеансыExtendedTooltip + 226 Label true true @@ -1146,8 +1146,8 @@ Left - РабочиеСерверыРасширеннаяПодсказка - 258 + РабочиеСерверыExtendedTooltip + 227 Label true true @@ -1193,8 +1193,8 @@ ОсновныеIPПорты - ОсновныеIPПортыРасширеннаяПодсказка - 260 + ОсновныеIPПортыExtendedTooltip + 228 Label true true @@ -1240,8 +1240,8 @@ ВспомогательныеIPПорты - ВспомогательныеIPПортыРасширеннаяПодсказка - 262 + ВспомогательныеIPПортыExtendedTooltip + 229 Label true true @@ -1292,8 +1292,8 @@ false - ГруппаСеансыРасширеннаяПодсказка - 255 + ГруппаСеансыExtendedTooltip + 225 Label true true @@ -1333,8 +1333,8 @@ Left - ТранзакцияРасширеннаяПодсказка - 265 + ТранзакцияExtendedTooltip + 231 Label true true @@ -1395,8 +1395,8 @@ СтатусТранзакции.Check - ПометкаСтатусаРасширеннаяПодсказка - 277 + ПометкаСтатусаExtendedTooltip + 233 Label true true @@ -1429,8 +1429,8 @@ СтатусТранзакции.Value - ЗначениеСтатусаРасширеннаяПодсказка - 279 + ЗначениеСтатусаExtendedTooltip + 234 Label true true @@ -1470,10 +1470,10 @@ СтатусТранзакцииСтрокаПоиска - 268 + 273 СтатусТранзакцииСтрокаПоискаРасширеннаяПодсказка - 270 + 275 Label true true @@ -1483,7 +1483,7 @@ СтатусТранзакцииСтрокаПоискаКонтекстноеМеню - 269 + 274 true СтатусТранзакции @@ -1493,10 +1493,10 @@ СтатусТранзакцииСостояниеПросмотра - 271 + 276 СтатусТранзакцииСостояниеПросмотраРасширеннаяПодсказка - 273 + 278 Label true true @@ -1506,7 +1506,7 @@ СтатусТранзакцииСостояниеПросмотраКонтекстноеМеню - 272 + 277 true ViewStatusAddition @@ -1517,10 +1517,10 @@ СтатусТранзакцииУправлениеПоиском - 274 + 279 СтатусТранзакцииУправлениеПоискомРасширеннаяПодсказка - 276 + 281 Label true true @@ -1530,7 +1530,7 @@ СтатусТранзакцииУправлениеПоискомКонтекстноеМеню - 275 + 280 true SearchControlAddition @@ -1540,8 +1540,8 @@ - СтатусТранзакцииРасширеннаяПодсказка - 267 + СтатусТранзакцииExtendedTooltip + 232 Label true true @@ -1596,8 +1596,8 @@ false - ГруппаТранзакцияРасширеннаяПодсказка - 264 + ГруппаТранзакцияExtendedTooltip + 230 Label true true @@ -1622,8 +1622,8 @@ true - ГруппаПрочиеСвойстваРасширеннаяПодсказка - 254 + ГруппаПрочиеСвойстваExtendedTooltip + 224 Label true true @@ -1655,8 +1655,8 @@ false - OKРасширеннаяПодсказка - 290 + OKExtendedTooltip + 236 Label true true @@ -1691,8 +1691,8 @@ false - ОтменитьРасширеннаяПодсказка - 291 + ОтменитьExtendedTooltip + 237 Label true true @@ -1723,8 +1723,8 @@ true - ГруппаКнопокФормыРасширеннаяПодсказка - 289 + ГруппаКнопокФормыExtendedTooltip + 235 Label true true diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl index e4ba86e6b..764e1fd84 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ОтборЖурналаРегистрации/Module.bsl @@ -24,7 +24,7 @@ Перем РедактируемыйСписок, ОтбираемыеПараметры, СтандартнаяОбработка; Если ИмяСобытия = "ВыборЗначенийЭлементовОтбораЖурналаРегистрации" - И Источник = ЭтаФорма Тогда + И Источник = ЭтотОбъект Тогда Если РедакторСоставаСвойстваИмяЭлемента = Элементы.Пользователи.Имя Тогда СписокПользователей = Параметр; ИначеЕсли РедакторСоставаСвойстваИмяЭлемента = Элементы.События.Имя Тогда @@ -107,7 +107,7 @@ // Открытие редактора свойства ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.РедакторСоставаСвойства", ПараметрыФормы, - ЭтаФорма); + ЭтотОбъект); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form index 7d470e3d1..b105e72eb 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Form.form @@ -36,8 +36,8 @@ ПометкаПриИзменении - ПометкаРасширеннаяПодсказка - 27 + ПометкаExtendedTooltip + 18 Label true true @@ -69,8 +69,8 @@ Список.Представление - ПредставлениеРасширеннаяПодсказка - 29 + ПредставлениеExtendedTooltip + 19 Label true true @@ -99,8 +99,8 @@ true - ГруппаРасширеннаяПодсказка - 26 + ГруппаExtendedTooltip + 17 Label true true @@ -128,7 +128,7 @@ false - УстановитьВсеРасширеннаяПодсказка + УстановитьВсеExtendedTooltip 14 Label true @@ -164,7 +164,7 @@ false - СнятьВсеРасширеннаяПодсказка + СнятьВсеExtendedTooltip 15 Label true @@ -194,10 +194,10 @@ СписокСтрокаПоиска - 17 + 23 СписокСтрокаПоискаРасширеннаяПодсказка - 19 + 25 Label true true @@ -207,7 +207,7 @@ СписокСтрокаПоискаКонтекстноеМеню - 18 + 24 true Список @@ -217,10 +217,10 @@ СписокСостояниеПросмотра - 20 + 26 СписокСостояниеПросмотраРасширеннаяПодсказка - 22 + 28 Label true true @@ -230,7 +230,7 @@ СписокСостояниеПросмотраКонтекстноеМеню - 21 + 27 true ViewStatusAddition @@ -241,10 +241,10 @@ СписокУправлениеПоиском - 23 + 29 СписокУправлениеПоискомРасширеннаяПодсказка - 25 + 31 Label true true @@ -254,7 +254,7 @@ СписокУправлениеПоискомКонтекстноеМеню - 24 + 30 true SearchControlAddition @@ -264,7 +264,7 @@ - СписокРасширеннаяПодсказка + СписокExtendedTooltip 16 Label true @@ -320,8 +320,8 @@ false - OKРасширеннаяПодсказка - 40 + OKExtendedTooltip + 21 Label true true @@ -356,8 +356,8 @@ false - ОтменаРасширеннаяПодсказка - 41 + ОтменаExtendedTooltip + 22 Label true true @@ -396,8 +396,8 @@ Кнопки формы - КнопкиФормыРасширеннаяПодсказка - 39 + КнопкиФормыExtendedTooltip + 20 Label true true diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl index 9e0325704..8dcba1d83 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/РедакторСоставаСвойства/Module.bsl @@ -376,10 +376,11 @@ &НаСервереБезКонтекста Функция ПолноеИмяСлужебногоПользователя(ИдентификаторПользователяИБ) - Если Пользователи.ЭтоНеразделенныйПользователь(ИдентификаторПользователяИБ) Тогда - Возврат Пользователи.ПолноеИмяСлужебногоПользователя(ИдентификаторПользователяИБ); - Иначе - Возврат ""; + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса") Тогда + + МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса"); + Возврат МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(ИдентификаторПользователяИБ); + КонецЕсли; КонецФункции diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form index 5c8e408e1..f12afccda 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Form.form @@ -22,7 +22,7 @@ ИмяПользователя - ИмяПользователяРасширеннаяПодсказка + ИмяПользователяExtendedTooltip 111 Label true @@ -66,8 +66,8 @@ Дата - ДатаРасширеннаяПодсказка - 113 + ДатаExtendedTooltip + 112 Label true true @@ -113,7 +113,7 @@ Группа дата пользователь - ГруппаДатаПользовательРасширеннаяПодсказка + ГруппаДатаПользовательExtendedTooltip 110 Label true @@ -147,8 +147,8 @@ ПредставлениеПриложения - ПредставлениеПриложенияРасширеннаяПодсказка - 116 + ПредставлениеПриложенияExtendedTooltip + 114 Label true true @@ -191,8 +191,8 @@ ПредставлениеРазделенияДанныхСеанса - ПредставлениеРазделенияДанныхСеансаРасширеннаяПодсказка - 118 + ПредставлениеРазделенияДанныхСеансаExtendedTooltip + 115 Label true true @@ -237,8 +237,8 @@ Компьютер - КомпьютерРасширеннаяПодсказка - 120 + КомпьютерExtendedTooltip + 116 Label true true @@ -283,8 +283,8 @@ Группа компьютер приложение разделение данных - ГруппаКомпьютерПриложениеРазделениеДанныхРасширеннаяПодсказка - 115 + ГруппаКомпьютерПриложениеРазделениеДанныхExtendedTooltip + 113 Label true true @@ -316,7 +316,7 @@ Группа основные - ГруппаОсновныеРасширеннаяПодсказка + ГруппаОсновныеExtendedTooltip 109 Label true @@ -362,8 +362,8 @@ Представление метаданных - ПредставлениеМетаданныхРасширеннаяПодсказка - 126 + ПредставлениеМетаданныхExtendedTooltip + 121 Label true true @@ -410,8 +410,8 @@ Данные - ДанныеРасширеннаяПодсказка - 128 + ДанныеExtendedTooltip + 122 Label true true @@ -459,8 +459,8 @@ Left - ПредставлениеДанныхРасширеннаяПодсказка - 130 + ПредставлениеДанныхExtendedTooltip + 123 Label true true @@ -508,8 +508,8 @@ Простые данные - ПростыеДанныеРасширеннаяПодсказка - 125 + ПростыеДанныеExtendedTooltip + 120 Label true true @@ -542,8 +542,8 @@ Представление метаданных - ПредставлениеМетаданныхДоступаРасширеннаяПодсказка - 133 + ПредставлениеМетаданныхДоступаExtendedTooltip + 125 Label true true @@ -613,10 +613,10 @@ ТаблицаДанныхДоступаСтрокаПоиска - 137 + 170 ТаблицаДанныхДоступаСтрокаПоискаРасширеннаяПодсказка - 139 + 172 Label true true @@ -626,7 +626,7 @@ ТаблицаДанныхДоступаСтрокаПоискаКонтекстноеМеню - 138 + 171 true ТаблицаДанныхДоступа @@ -636,10 +636,10 @@ ТаблицаДанныхДоступаСостояниеПросмотра - 140 + 173 ТаблицаДанныхДоступаСостояниеПросмотраРасширеннаяПодсказка - 142 + 175 Label true true @@ -649,7 +649,7 @@ ТаблицаДанныхДоступаСостояниеПросмотраКонтекстноеМеню - 141 + 174 true ViewStatusAddition @@ -660,10 +660,10 @@ ТаблицаДанныхДоступаУправлениеПоиском - 143 + 176 ТаблицаДанныхДоступаУправлениеПоискомРасширеннаяПодсказка - 145 + 178 Label true true @@ -673,7 +673,7 @@ ТаблицаДанныхДоступаУправлениеПоискомКонтекстноеМеню - 144 + 177 true SearchControlAddition @@ -683,8 +683,8 @@ - ТаблицаДанныхДоступаРасширеннаяПодсказка - 136 + ТаблицаДанныхДоступаExtendedTooltip + 127 Label true true @@ -704,8 +704,8 @@ true - ТаблицаДанныхДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 135 + ТаблицаДанныхДоступаКонтекстноеМенюВывестиСписокExtendedTooltip + 126 Label true true @@ -762,8 +762,8 @@ Данные доступа - ДанныеДоступаРасширеннаяПодсказка - 132 + ДанныеДоступаExtendedTooltip + 124 Label true true @@ -796,8 +796,8 @@ Представление метаданных - ПредставлениеМетаданныхОтказаПраваДоступаРасширеннаяПодсказка - 155 + ПредставлениеМетаданныхОтказаПраваДоступаExtendedTooltip + 129 Label true true @@ -844,8 +844,8 @@ ОтказПраваДоступа - ОтказПраваДоступаРасширеннаяПодсказка - 157 + ОтказПраваДоступаExtendedTooltip + 130 Label true true @@ -888,8 +888,8 @@ Данные отказа права доступа - ДанныеОтказаПраваДоступаРасширеннаяПодсказка - 154 + ДанныеОтказаПраваДоступаExtendedTooltip + 128 Label true true @@ -922,8 +922,8 @@ Представление метаданных - ПредставлениеМетаданныхОтказаДействияДоступаРасширеннаяПодсказка - 160 + ПредставлениеМетаданныхОтказаДействияДоступаExtendedTooltip + 132 Label true true @@ -970,8 +970,8 @@ ОтказДействияДоступа - ОтказДействияДоступаРасширеннаяПодсказка - 162 + ОтказДействияДоступаExtendedTooltip + 133 Label true true @@ -1035,10 +1035,10 @@ ТаблицаДанныхОтказаДействияДоступаСтрокаПоиска - 166 + 191 ТаблицаДанныхОтказаДействияДоступаСтрокаПоискаРасширеннаяПодсказка - 168 + 193 Label true true @@ -1048,7 +1048,7 @@ ТаблицаДанныхОтказаДействияДоступаСтрокаПоискаКонтекстноеМеню - 167 + 192 true ТаблицаДанныхОтказаДействияДоступа @@ -1058,10 +1058,10 @@ ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотра - 169 + 194 ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотраРасширеннаяПодсказка - 171 + 196 Label true true @@ -1071,7 +1071,7 @@ ТаблицаДанныхОтказаДействияДоступаСостояниеПросмотраКонтекстноеМеню - 170 + 195 true ViewStatusAddition @@ -1082,10 +1082,10 @@ ТаблицаДанныхОтказаДействияДоступаУправлениеПоиском - 172 + 197 ТаблицаДанныхОтказаДействияДоступаУправлениеПоискомРасширеннаяПодсказка - 174 + 199 Label true true @@ -1095,7 +1095,7 @@ ТаблицаДанныхОтказаДействияДоступаУправлениеПоискомКонтекстноеМеню - 173 + 198 true SearchControlAddition @@ -1105,8 +1105,8 @@ - ТаблицаДанныхОтказаДействияДоступаРасширеннаяПодсказка - 165 + ТаблицаДанныхОтказаДействияДоступаExtendedTooltip + 135 Label true true @@ -1126,8 +1126,8 @@ true - ТаблицаДанныхОтказаДействияДоступаКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 164 + ТаблицаДанныхОтказаДействияДоступаКонтекстноеМенюВывестиСписокExtendedTooltip + 134 Label true true @@ -1184,8 +1184,8 @@ Данные отказа действия доступа - ДанныеОтказаДействияДоступаРасширеннаяПодсказка - 159 + ДанныеОтказаДействияДоступаExtendedTooltip + 131 Label true true @@ -1214,8 +1214,8 @@ АутентификацияИмяПользователя - АутентификацияИмяПользователяРасширеннаяПодсказка - 184 + АутентификацияИмяПользователяExtendedTooltip + 137 Label true true @@ -1256,8 +1256,8 @@ АутентификацияПользовательОС - АутентификацияПользовательОСРасширеннаяПодсказка - 186 + АутентификацияПользовательОСExtendedTooltip + 138 Label true true @@ -1298,8 +1298,8 @@ АутентификацияТекущийПользовательОС - АутентификацияТекущийПользовательОСРасширеннаяПодсказка - 188 + АутентификацияТекущийПользовательОСExtendedTooltip + 139 Label true true @@ -1342,8 +1342,8 @@ Данные аутентификации - ДанныеАутентификацииРасширеннаяПодсказка - 183 + ДанныеАутентификацииExtendedTooltip + 136 Label true true @@ -1402,10 +1402,10 @@ ТаблицаСвойствПользователяИБСтрокаПоиска - 194 + 211 ТаблицаСвойствПользователяИБСтрокаПоискаРасширеннаяПодсказка - 196 + 213 Label true true @@ -1415,7 +1415,7 @@ ТаблицаСвойствПользователяИБСтрокаПоискаКонтекстноеМеню - 195 + 212 true ТаблицаСвойствПользователяИБ @@ -1425,10 +1425,10 @@ ТаблицаСвойствПользователяИБСостояниеПросмотра - 197 + 214 ТаблицаСвойствПользователяИБСостояниеПросмотраРасширеннаяПодсказка - 199 + 216 Label true true @@ -1438,7 +1438,7 @@ ТаблицаСвойствПользователяИБСостояниеПросмотраКонтекстноеМеню - 198 + 215 true ViewStatusAddition @@ -1449,10 +1449,10 @@ ТаблицаСвойствПользователяИБУправлениеПоиском - 200 + 217 ТаблицаСвойствПользователяИБУправлениеПоискомРасширеннаяПодсказка - 202 + 219 Label true true @@ -1462,7 +1462,7 @@ ТаблицаСвойствПользователяИБУправлениеПоискомКонтекстноеМеню - 201 + 218 true SearchControlAddition @@ -1472,8 +1472,8 @@ - ТаблицаСвойствПользователяИБРасширеннаяПодсказка - 193 + ТаблицаСвойствПользователяИБExtendedTooltip + 143 Label true true @@ -1493,8 +1493,8 @@ true - ТаблицаСвойствПользователяИБКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 192 + ТаблицаСвойствПользователяИБКонтекстноеМенюВывестиСписокExtendedTooltip + 142 Label true true @@ -1579,10 +1579,10 @@ ТаблицаРолейПользователяИБСтрокаПоиска - 213 + 228 ТаблицаРолейПользователяИБСтрокаПоискаРасширеннаяПодсказка - 215 + 230 Label true true @@ -1592,7 +1592,7 @@ ТаблицаРолейПользователяИБСтрокаПоискаКонтекстноеМеню - 214 + 229 true ТаблицаРолейПользователяИБ @@ -1602,10 +1602,10 @@ ТаблицаРолейПользователяИБСостояниеПросмотра - 216 + 231 ТаблицаРолейПользователяИБСостояниеПросмотраРасширеннаяПодсказка - 218 + 233 Label true true @@ -1615,7 +1615,7 @@ ТаблицаРолейПользователяИБСостояниеПросмотраКонтекстноеМеню - 217 + 232 true ViewStatusAddition @@ -1626,10 +1626,10 @@ ТаблицаРолейПользователяИБУправлениеПоиском - 219 + 234 ТаблицаРолейПользователяИБУправлениеПоискомРасширеннаяПодсказка - 221 + 236 Label true true @@ -1639,7 +1639,7 @@ ТаблицаРолейПользователяИБУправлениеПоискомКонтекстноеМеню - 220 + 235 true SearchControlAddition @@ -1649,8 +1649,8 @@ - ТаблицаРолейПользователяИБРасширеннаяПодсказка - 212 + ТаблицаРолейПользователяИБExtendedTooltip + 145 Label true true @@ -1670,8 +1670,8 @@ true - ТаблицаРолейПользователяИБКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 211 + ТаблицаРолейПользователяИБКонтекстноеМенюВывестиСписокExtendedTooltip + 144 Label true true @@ -1727,8 +1727,8 @@ Горизонтальная группа свойств пользователя ИБ - ГоризонтальнаяГруппаСвойствПользователяИБРасширеннаяПодсказка - 191 + ГоризонтальнаяГруппаСвойствПользователяИБExtendedTooltip + 141 Label true true @@ -1759,8 +1759,8 @@ Данные пользователя ИБ - ДанныеПользователяИБРасширеннаяПодсказка - 190 + ДанныеПользователяИБExtendedTooltip + 140 Label true true @@ -1788,8 +1788,8 @@ Представления данных - ПредставленияДанныхРасширеннаяПодсказка - 124 + ПредставленияДанныхExtendedTooltip + 119 Label true true @@ -1824,8 +1824,8 @@ Данные - ГруппаДанныеРасширеннаяПодсказка - 123 + ГруппаДанныеExtendedTooltip + 118 Label true true @@ -1864,8 +1864,8 @@ None - ПредставлениеСобытияРасширеннаяПодсказка - 231 + ПредставлениеСобытияExtendedTooltip + 147 Label true true @@ -1909,8 +1909,8 @@ Top - КомментарийРасширеннаяПодсказка - 233 + КомментарийExtendedTooltip + 148 Label true true @@ -1965,8 +1965,8 @@ Событие - ГруппаСобытиеРасширеннаяПодсказка - 230 + ГруппаСобытиеExtendedTooltip + 146 Label true true @@ -2000,8 +2000,8 @@ Основное - ГруппаОсновоеРасширеннаяПодсказка - 122 + ГруппаОсновоеExtendedTooltip + 117 Label true true @@ -2039,8 +2039,8 @@ Сеанс - СеансРасширеннаяПодсказка - 237 + СеансExtendedTooltip + 151 Label true true @@ -2083,8 +2083,8 @@ РабочийСервер - РабочийСерверРасширеннаяПодсказка - 239 + РабочийСерверExtendedTooltip + 152 Label true true @@ -2127,8 +2127,8 @@ ОсновнойIPПорт - ОсновнойIPПортРасширеннаяПодсказка - 241 + ОсновнойIPПортExtendedTooltip + 153 Label true true @@ -2172,8 +2172,8 @@ ВспомогательныйIPПорт - ВспомогательныйIPПортРасширеннаяПодсказка - 243 + ВспомогательныйIPПортExtendedTooltip + 154 Label true true @@ -2222,8 +2222,8 @@ false - ГруппаСоединениеРасширеннаяПодсказка - 236 + ГруппаСоединениеExtendedTooltip + 150 Label true true @@ -2258,8 +2258,8 @@ Транзакция - ТранзакцияРасширеннаяПодсказка - 246 + ТранзакцияExtendedTooltip + 156 Label true true @@ -2302,8 +2302,8 @@ СтатусТранзакции - СтатусТранзакцииРасширеннаяПодсказка - 248 + СтатусТранзакцииExtendedTooltip + 157 Label true true @@ -2355,8 +2355,8 @@ Транзакция - ГруппаТранзакцияРасширеннаяПодсказка - 245 + ГруппаТранзакцияExtendedTooltip + 155 Label true true @@ -2381,8 +2381,8 @@ true - ГруппаТранзакцияСоединениеРасширеннаяПодсказка - 235 + ГруппаТранзакцияСоединениеExtendedTooltip + 149 Label true true @@ -2413,8 +2413,8 @@ false - ЗакрытьРасширеннаяПодсказка - 251 + ЗакрытьExtendedTooltip + 159 Label true true @@ -2449,8 +2449,8 @@ false - СправкаРасширеннаяПодсказка - 252 + СправкаExtendedTooltip + 160 Label true true @@ -2480,8 +2480,8 @@ Группа кнопок - ГруппаКнопокРасширеннаяПодсказка - 250 + ГруппаКнопокExtendedTooltip + 158 Label true true diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Help/ru.html b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Help/ru.html index b70237f36..76f49a76c 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Help/ru.html +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Help/ru.html @@ -1,3 +1,3 @@ - +

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

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

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl index e32357d8c..ec5c4265d 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Forms/ФормаСобытия/Module.bsl @@ -134,14 +134,14 @@ &НаКлиенте Процедура ПредставлениеМетаданныхОткрытие(Элемент, СтандартнаяОбработка) - ОткрытьЗначение(ПредставлениеМетаданных); + ПоказатьЗначение(, ПредставлениеМетаданных); КонецПроцедуры &НаКлиенте Процедура РазделениеДанныхСеансаОткрытие(Элемент, СтандартнаяОбработка) - ОткрытьЗначение(ПредставлениеРазделенияДанныхСеанса); + ПоказатьЗначение(, ПредставлениеРазделенияДанныхСеанса); КонецПроцедуры @@ -151,7 +151,7 @@ &НаКлиенте Процедура ТаблицаДанныхВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ОткрытьЗначение(Элемент.ТекущиеДанные[Сред(Поле.Имя, СтрДлина(Элемент.Имя)+1)]); + ПоказатьЗначение(, Элемент.ТекущиеДанные[Сред(Поле.Имя, СтрДлина(Элемент.Имя)+1)]); КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЖурналРегистрации/Help/ru.html b/SSL/src/DataProcessors/ЖурналРегистрации/Help/ru.html index 95a14c6e2..3a3d78c9a 100644 --- a/SSL/src/DataProcessors/ЖурналРегистрации/Help/ru.html +++ b/SSL/src/DataProcessors/ЖурналРегистрации/Help/ru.html @@ -1,4 +1,4 @@ - +

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

                Список событий не является динамическим списком. Для того, чтобы увидеть события, которые попали в журнал регистрации после открытия формы, необходимо выполнить команду Обновить текущий список. Журнал отображает фиксированное количество записей, которое указывается в поле Количество отбираемых событий. Кроме предопределенных значений (200, 500, 1000 и 10000 событий) можно ввести произвольное количество событий, которое будет запомнено.

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

                diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form index 48199a8f9..aded6b087 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Form.form @@ -15,7 +15,7 @@ true - ФормаЗагрузитьКурсыВалютРасширеннаяПодсказка + ФормаЗагрузитьКурсыВалютExtendedTooltip 48 Label true @@ -48,7 +48,7 @@ 10 false - КоманднаяПанельЛеваяРасширеннаяПодсказка + КоманднаяПанельЛеваяExtendedTooltip 47 Label true @@ -74,7 +74,7 @@ Объект.НачалоПериодаЗагрузки - НачалоПериодаРасширеннаяПодсказка + НачалоПериодаExtendedTooltip 49 Label true @@ -120,8 +120,8 @@ Объект.ОкончаниеПериодаЗагрузки - ОкончаниеПериодаРасширеннаяПодсказка - 51 + ОкончаниеПериодаExtendedTooltip + 50 Label true true @@ -165,8 +165,8 @@ true - ФормаВыбратьВсеВалютыРасширеннаяПодсказка - 54 + ФормаВыбратьВсеВалютыExtendedTooltip + 52 Label true true @@ -191,8 +191,8 @@ true - ФормаСнятьВыборРасширеннаяПодсказка - 55 + ФормаСнятьВыборExtendedTooltip + 53 Label true true @@ -222,8 +222,8 @@ - КоманднаяПанельПраваяРасширеннаяПодсказка - 53 + КоманднаяПанельПраваяExtendedTooltip + 51 Label true true @@ -251,7 +251,7 @@ - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 46 Label true @@ -311,8 +311,8 @@ Загружать курсы для этой валюты - ЗагружатьРасширеннаяПодсказка - 67 + ЗагружатьExtendedTooltip + 56 Label true true @@ -345,8 +345,8 @@ Объект.СписокВалют.ЦифровойКод - КодВалютыРасширеннаяПодсказка - 69 + КодВалютыExtendedTooltip + 57 Label true true @@ -382,8 +382,8 @@ Объект.СписокВалют.СимвольныйКод - СписокВалютСимвольныйКодРасширеннаяПодсказка - 71 + СписокВалютСимвольныйКодExtendedTooltip + 58 Label true true @@ -418,8 +418,8 @@ Объект.СписокВалют.Представление - СписокВалютПредставлениеРасширеннаяПодсказка - 73 + СписокВалютПредставлениеExtendedTooltip + 59 Label true true @@ -460,8 +460,8 @@ Объект.СписокВалют.ДатаКурса - ДатаКурсаРасширеннаяПодсказка - 75 + ДатаКурсаExtendedTooltip + 60 Label true true @@ -497,8 +497,8 @@ Объект.СписокВалют.Курс - КурсРасширеннаяПодсказка - 77 + КурсExtendedTooltip + 61 Label true true @@ -534,8 +534,8 @@ Объект.СписокВалют.Кратность - КратностьРасширеннаяПодсказка - 79 + КратностьExtendedTooltip + 62 Label true true @@ -576,10 +576,10 @@ СписокВалютСтрокаПоиска - 58 + 65 СписокВалютСтрокаПоискаРасширеннаяПодсказка - 60 + 67 Label true true @@ -589,7 +589,7 @@ СписокВалютСтрокаПоискаКонтекстноеМеню - 59 + 66 true СписокВалют @@ -599,10 +599,10 @@ СписокВалютСостояниеПросмотра - 61 + 68 СписокВалютСостояниеПросмотраРасширеннаяПодсказка - 63 + 70 Label true true @@ -612,7 +612,7 @@ СписокВалютСостояниеПросмотраКонтекстноеМеню - 62 + 69 true ViewStatusAddition @@ -623,10 +623,10 @@ СписокВалютУправлениеПоиском - 64 + 71 СписокВалютУправлениеПоискомРасширеннаяПодсказка - 66 + 73 Label true true @@ -636,7 +636,7 @@ СписокВалютУправлениеПоискомКонтекстноеМеню - 65 + 72 true SearchControlAddition @@ -646,8 +646,8 @@ - СписокВалютРасширеннаяПодсказка - 57 + СписокВалютExtendedTooltip + 55 Label true true @@ -667,8 +667,8 @@ true - СписокВалютКонтекстноеМенюОтключитьЗагрузкуИзИнтернетаРасширеннаяПодсказка - 56 + СписокВалютКонтекстноеМенюОтключитьЗагрузкуИзИнтернетаExtendedTooltip + 54 Label true true diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl index 6cebca866..5ccfdb1a7 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Forms/Форма/Module.bsl @@ -42,9 +42,6 @@ ПодключитьОбработчикОжидания("ПроверитьСписокЗагружаемыхВалют", 0.1, Истина); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ СписокВалют @@ -226,11 +223,17 @@ &НаКлиенте Процедура ПроверитьСписокЗагружаемыхВалют() Если Объект.СписокВалют.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'В справочнике валют отсутствуют валюты, курсы которых можно загружать из сети Интернет.'")); - Закрыть(); + ОписаниеОповещения = Новый ОписаниеОповещения("ПроверитьСписокЗагружаемыхВалютЗавершение", ЭтотОбъект); + ТекстПредупреждения = НСтр("ru = 'В справочнике валют отсутствуют валюты, курсы которых можно загружать из сети Интернет.'"); + ПоказатьПредупреждение(ОписаниеОповещения, ТекстПредупреждения); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПроверитьСписокЗагружаемыхВалютЗавершение(ДополнительныеПараметры) Экспорт + Закрыть(); +КонецПроцедуры + &НаКлиенте Процедура УстановитьДоступностьЭлементов() diff --git a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html index 1b58286fe..d0cbe379b 100644 --- a/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html +++ b/SSL/src/DataProcessors/ЗагрузкаКурсовВалют/Help/ru.html @@ -1,4 +1,4 @@ - +

                Предназначен для загрузки курсов валют с сайта РБК.

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

                Реквизиты:

                diff --git a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Attributes/Список/ExtInfo/ListSettings.dcss similarity index 89% rename from SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss rename to SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Attributes/Список/ExtInfo/ListSettings.dcss index 91027f589..61e6fb4bb 100644 --- a/SSL/src/Catalogs/Файлы/Forms/ХранилищеФайлов/Attributes/Список/ExtInfo/ListSettings.dcss +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Attributes/Список/ExtInfo/ListSettings.dcss @@ -12,4 +12,6 @@ Normal b75fecce-942b-4aed-abc9-e6a02e460fb3 + Normal + 911b6018-f537-43e8-a417-da56b22f9aec diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/ConditionalAppearance.dcssca new file mode 100644 index 000000000..ad60aff3b --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/ConditionalAppearance.dcssca @@ -0,0 +1,143 @@ + + + + + + МестаИспользованияОсновной + + + + + Список.Код + NotEqual + ЦелевойЭлемент + + + + + false + Шрифт + + + + false + Видимость + false + + + Отображать + false + + + + + + + МестаИспользованияСсылка + + + МестаИспользованияКод + + + МестаИспользованияМестИспользования + + + + + Список.Код + Equal + ЦелевойЭлемент + + + + + Шрифт + + + + + + + + МестаИспользованияМестИспользования + + + + + Список.ПометкаУдаления + Equal + 0 + + + + + false + ЦветТекста + #C0C0C0 + + + Текст + + + ru + Не используется + + + + + + + + + МестаИспользованияМестИспользования + + + + + Список.ПометкаУдаления + Equal + -1 + + + + + false + ЦветТекста + #C0C0C0 + + + Текст + + + ru + Не рассчитано + + + + + + + + + НеудачныеЗаменыКод + + + + + НеудачныеЗамены.Код + NotFilled + + + + + Видимость + false + + + false + Отображать + false + + + + diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Form.form new file mode 100644 index 000000000..ba383c23a --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Form.form @@ -0,0 +1,2237 @@ + + + + <key>ru</key> + <value>Замена элементов</value> + + + ШагиМастера + 70 + + ШагВыборЦелевогоЭлемента + 74 + + НадписьТипВыбираемого + 197 + + <key>ru</key> + <value>Надпись тип выбираемого</value> + + true + true + + true + + + НадписьТипВыбираемогоРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + + НадписьТипВыбираемогоКонтекстноеМеню + 198 + true + + Label + true + true + + Left + + + + КоманднаяПанельВыбораЦелевого + 66 + + СписокГруппа1 + 203 + + ИзменитьФормуИзСписка + 68 + true + true + + true + + + ИзменитьФормуИзСпискаРасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + СписокГруппа1РасширеннаяПодсказка + 204 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Командная панель выбора целевого элемента</value> + + + ru + Командная панель выбора целевого + + + КоманднаяПанельВыбораЦелевогоРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + CommandBar + + Left + Item.Список + + + + Список + 182 + true + true + + true + + + Список + + None + + СписокЭлемент + 195 + + СписокСтандартнаяКартинка + 192 + true + true + + true + + + Список.DefaultPicture + + None + + СписокСтандартнаяКартинкаРасширеннаяПодсказка + 194 + Label + true + true + + Left + + + + СписокСтандартнаяКартинкаКонтекстноеМеню + 193 + true + + PictureField + Enter + true + Left + true + + true + true + true + true + + + 1 + + + + + СписокСсылка + 189 + + <key>ru</key> + <value>Наименование</value> + + true + true + + true + + + Список.Ссылка + + + СписокСсылкаРасширеннаяПодсказка + 191 + Label + true + true + + Left + + + + СписокСсылкаКонтекстноеМеню + 190 + true + + LabelField + Enter + true + Left + true + + true + true + + + true + true + + true + + + <key>ru</key> + <value>Список элемент</value> + + + ru + Список элемент + + + СписокЭлементРасширеннаяПодсказка + 196 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + СписокКод + 186 + true + true + + true + + + Список.Код + + + СписокКодРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + + СписокКодКонтекстноеМеню + 187 + true + + LabelField + Enter + true + Left + true + + true + true + + + + СписокКоманднаяПанель + 184 + Left + + + OnActivateRow + СписокПриАктивизацииСтроки + + + СписокСтрокаПоиска + 205 + + СписокСтрокаПоискаРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + + СписокСтрокаПоискаКонтекстноеМеню + 206 + true + + Список + + true + + + + СписокСостояниеПросмотра + 208 + + СписокСостояниеПросмотраРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + + СписокСостояниеПросмотраКонтекстноеМеню + 209 + true + + ViewStatusAddition + Список + + true + + + + СписокУправлениеПоиском + 211 + + СписокУправлениеПоискомРасширеннаяПодсказка + 213 + Label + true + true + + Left + + + + СписокУправлениеПоискомКонтекстноеМеню + 212 + true + + SearchControlAddition + Список + + true + + + + СписокРасширеннаяПодсказка + 185 + Label + true + true + + Left + + + + СписокКонтекстноеМеню + 183 + true + + HierarchicalList + true + 10 + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + Auto + Auto + true + true + true + + Список.DefaultPicture + + None + None + None + true + + 60 + + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + true + true + +
                + + ГруппаОтчет + 29 + true + true + + true + + + ru + Группа отчет + + true + + ГруппаОтчетРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПодсказка + 36 + + ПодсказкаВыбораЦелевогоЭлемента + 200 + + <key>ru</key> + <value>Подсказка выбора целевого элемента</value> + + true + true + + true + + + ПодсказкаВыбораЦелевогоЭлементаРасширеннаяПодсказка + 202 + Label + true + true + + Left + + + + ПодсказкаВыбораЦелевогоЭлементаКонтекстноеМеню + 201 + true + + Label + true + true + + Style.ПоясняющийТекст + + + + URLProcessing + ПодсказкаВыбораЦелевогоЭлементаОбработкаНавигационнойСсылки + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа подсказка</value> + + + ru + Группа подсказка + + + ГруппаПодсказкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор целевого элемента</value> + + + ru + Шаг выбор целевого элемента + + true + + ШагВыборЦелевогоЭлементаРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Page + + Vertical + auto + +
                + + ШагЗамена + 87 + + ГруппаДлительнаяОперация2 + 89 + + КартинкаДлительнойОперации2 + 91 + + <key>ru</key> + <value>Картинка длительной операции1</value> + + true + true + + true + + + КартинкаДлительнойОперации2РасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + КартинкаДлительнойОперации2КонтекстноеМеню + 92 + true + + true + true + + + + + + ОписаниеДлительнойОперации2 + 94 + + <key>ru</key> + <value>Подождите пожалуйста. +Выполняется замена элементов.</value> + + true + true + + true + + + ОписаниеДлительнойОперации2РасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ОписаниеДлительнойОперации2КонтекстноеМеню + 95 + true + + Label + true + true + true + + Left + Center + + + true + true + + true + + false + + ГруппаДлительнаяОперация2РасширеннаяПодсказка + 90 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Замена</value> + + + ru + Страница поиск мест использования + + + ШагЗаменаРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ШагУспешногоЗавершения + 97 + + РезультатЗамены + 104 + + <key>ru</key> + <value>Результат замены</value> + + true + true + + true + + + РезультатЗаменыРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + РезультатЗаменыКонтекстноеМеню + 105 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Успешное завершение</value> + + + ru + Страница поиск мест использования + + + ШагУспешногоЗавершенияРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ШагПовторЗамены + 107 + + РезультатНеудачныеЗамены + 133 + + <key>ru</key> + <value>Результат неудачные замены</value> + + true + true + + true + + + РезультатНеудачныеЗаменыРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + РезультатНеудачныеЗаменыКонтекстноеМеню + 134 + true + + Label + true + true + + Left + + + + КоманднаяПанельНеудачныеЗамены + 125 + + ОткрытьЭлементНеудачнойЗамены + 164 + true + true + + true + + + ОткрытьЭлементНеудачнойЗаменыРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + Form.Command.ОткрытьЭлементНеудачнойЗамены + Normal + PictureAndText + true + true + UserCmds + Auto + + + РазвернутьВсеНеудачныеЗамены + 129 + true + true + + true + + + РазвернутьВсеНеудачныеЗаменыРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + Form.Command.РазвернутьВсеНеудачныеЗамены + Normal + Auto + true + true + UserCmds + Auto + + + СвернутьВсеНеудачныеЗамены + 131 + true + true + + true + + + СвернутьВсеНеудачныеЗаменыРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + Form.Command.СвернутьВсеНеудачныеЗамены + Normal + Auto + true + true + UserCmds + Auto + + + ВсеДействия2 + 136 + + ВывестиСписок + 138 + true + true + + true + + + ВывестиСписокРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + Form.Item.НеудачныеЗамены.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + КопироватьВБуферОбмена + 140 + true + true + + true + + + КопироватьВБуферОбменаРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Form.Item.НеудачныеЗамены.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 142 + true + true + + true + + + ИзменитьФормуРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Все действия + + + ВсеДействия2РасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + + true + true + + true + + + ru + Командная панель неудачные замены + + + КоманднаяПанельНеудачныеЗаменыРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + CommandBar + + Left + + + + НеудачныеЗамены + 112 + true + true + + true + + + НеудачныеЗамены + + None + + НеудачныеЗаменыДанныеКод + 150 + + НеудачныеЗаменыГруппа1 + 178 + + НеудачныеЗаменыПиктограмма + 175 + true + true + + true + + + НеудачныеЗамены.Пиктограмма + + None + + НеудачныеЗаменыПиктограммаРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + + НеудачныеЗаменыПиктограммаКонтекстноеМеню + 176 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.Предупреждение + + + + 1 + + + + + НеудачныеЗаменыДанные + 144 + true + true + + true + + + НеудачныеЗамены.Данные + + + НеудачныеЗаменыДанныеРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + НеудачныеЗаменыДанныеКонтекстноеМеню + 145 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + НеудачныеЗаменыГруппа1РасширеннаяПодсказка + 179 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + НеудачныеЗаменыКод + 147 + true + true + + true + + + НеудачныеЗамены.Код + + + НеудачныеЗаменыКодРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + НеудачныеЗаменыКодКонтекстноеМеню + 148 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Неудачные замены данные код</value> + + + НеудачныеЗаменыДанныеКодРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + + НеудачныеЗаменыПричина + 122 + true + true + + true + + + НеудачныеЗамены.Причина + + + НеудачныеЗаменыПричинаРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + НеудачныеЗаменыПричинаКонтекстноеМеню + 123 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + None + + НеудачныеЗаменыКоманднаяПанель + 114 + Left + + + Selection + НеудачныеЗаменыВыбор + + + OnActivateRow + НеудачныеЗаменыПриАктивизацииСтроки + + + НеудачныеЗаменыСтрокаПоиска + 225 + + НеудачныеЗаменыСтрокаПоискаРасширеннаяПодсказка + 227 + Label + true + true + + Left + + + + НеудачныеЗаменыСтрокаПоискаКонтекстноеМеню + 226 + true + + НеудачныеЗамены + + true + + + + НеудачныеЗаменыСостояниеПросмотра + 228 + + НеудачныеЗаменыСостояниеПросмотраРасширеннаяПодсказка + 230 + Label + true + true + + Left + + + + НеудачныеЗаменыСостояниеПросмотраКонтекстноеМеню + 229 + true + + ViewStatusAddition + НеудачныеЗамены + + true + + + + НеудачныеЗаменыУправлениеПоиском + 231 + + НеудачныеЗаменыУправлениеПоискомРасширеннаяПодсказка + 233 + Label + true + true + + Left + + + + НеудачныеЗаменыУправлениеПоискомКонтекстноеМеню + 232 + true + + SearchControlAddition + НеудачныеЗамены + + true + + + + НеудачныеЗаменыРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + НеудачныеЗаменыКонтекстноеМеню + 113 + true + + Tree + true + true + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + None + None + None + true +
                + + РасшифровкаПричиныНеудачи + 172 + true + true + + true + + + РасшифровкаПричиныНеудачи + + + РасшифровкаПричиныНеудачиРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + + РасшифровкаПричиныНеудачиКонтекстноеМеню + 173 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Повтор объединения</value> + + + ru + Шаг повтор замены + + + ШагПовторЗаменыРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Page + + Vertical + auto + +
                + true + true + + true + + + <key>ru</key> + <value>Шаги мастера</value> + + + ru + Шаги мастера + + + ШагиМастераРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Pages + + Auto + +
                + + ПанельДействийМастера + 41 + + ГруппаНазад + 56 + + Назад + 43 + true + true + + true + + + НазадРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.ШагМастераНазад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа назад</value> + + + ru + Группа назад + + + ГруппаНазадРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаВперед + 54 + + Далее + 48 + true + true + + true + + + ДалееРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.ШагМастераДалее + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 50 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Command.ШагМастераОтмена + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 58 + true + true + + true + + + СправкаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа вперед</value> + + + ru + Группа вперед + + true + + ГруппаВпередРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Панель действий мастера</value> + + + ru + Панель действий мастера + + true + + ПанельДействийМастераРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + 80 + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.ЗаменаСсылок + + + true + + + true + +
                true
                +
                + + БазовоеИмяФормы + + <key>ru</key> + <value>Базовое имя формы</value> + + 6 + + String + + + + true + + + true + + + + НеудачныеЗамены + + <key>ru</key> + <value>Неудачные замены</value> + + 3 + + ValueTree + + + true + + + true + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 1 + + + 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> + + 5 + + String + + + + true + + + true + + + + Пиктограмма + + <key>ru</key> + <value>Пиктограмма</value> + + 6 + + Number + + 10 + + + + true + + + true + + + + + ЦелевойЭлемент + + <key>ru</key> + <value>Целевой элемент</value> + + 8 + + AnyRef + + + true + + + true + + + + РасшифровкаПричиныНеудачи + + <key>ru</key> + <value>Расшифровка причины</value> + + 4 + + String + + + + true + + + true + + + + Список + + <key>ru</key> + <value>Список</value> + + 2 + + DynamicList + + + true + + + true + + + Список.Владелец + + + Список.Код + + + Список.ПометкаУдаления + + + Список.Ссылка + + + Список.ЭтоГруппа + + + ВЫБРАТЬ + NULL КАК Ссылка, + NULL КАК Владелец, + NULL КАК Код, + ЛОЖЬ КАК ПометкаУдаления, + ЛОЖЬ КАК ЭтоГруппа + + + true + true + true + true + + + + ЗаменяемыеСсылки + + <key>ru</key> + <value>Заменяемые ссылки</value> + + 9 + + ValueTable + + + true + + + true + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 1 + + AnyRef + + + true + + + true + + + + + СобытиеОповещенияОЗамене + + <key>ru</key> + <value>Событие оповещения о замене</value> + + 10 + + String + + + + true + + + true + + + + ТекстОшибкиПараметров + + <key>ru</key> + <value>Текст ошибки параметров</value> + + 12 + + String + + + + true + + + true + + + + ЕстьПравоБезвозвратногоУдаления + + <key>ru</key> + <value>Есть право безвозвратного удаления</value> + + 13 + + Boolean + + + true + + + true + + + + ТекущийВариантУдаления + + <key>ru</key> + <value>Текущий вариант удаления</value> + + 14 + + String + + + + true + + + true + + + + ЦелевойЭлементРезультат + + <key>ru</key> + <value>Целевой элемент результат</value> + + 5 + + AnyRef + + + true + + + true + + + + ОбщийВладелецЗаменяемыхСсылок + + <key>ru</key> + <value>Общий владелец заменяемых ссылок</value> + + 7 + + + true + + + true + + + + ШагМастераДалее + + <key>ru</key> + <value>Далее ></value> + + 3 + + ru + Продолжить выполнение + + + true + + + + ШагМастераДалее + + + Auto + Auto + + + ШагМастераНазад + + <key>ru</key> + <value>< Назад</value> + + 4 + + ru + Вернутся на предыдущий шаг + + + true + + + + ШагМастераНазад + + + Auto + Auto + + + ШагМастераОтмена + + <key>ru</key> + <value>Отмена</value> + + 5 + + ru + Прекратить работу мастера + + + true + + + + ШагМастераОтмена + + + Auto + Auto + + + РазвернутьВсеНеудачныеЗамены + + <key>ru</key> + <value>Развернуть все</value> + + 6 + + ru + Развернуть все неудачные замены + + + true + + + StdPicture.ExpandAll + + + + РазвернутьВсеНеудачныеЗамены + + + Auto + Auto + + + СвернутьВсеНеудачныеЗамены + + <key>ru</key> + <value>Свернуть все</value> + + 7 + + ru + Свернуть все неудачные замены + + + true + + + StdPicture.CollapseAll + + + + СвернутьВсеНеудачныеЗамены + + + Auto + Auto + + + ОткрытьЭлементНеудачнойЗамены + + <key>ru</key> + <value>Изменить</value> + + 9 + + ru + Открыть элемент + + + true + + F2 + + StdPicture.Change + + + + ОткрытьЭлементНеудачнойЗамены + + + Auto + Auto + + + НаборСсылок + + + + Заголовок + + String + + + + + + + + +
                diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Help/ru.html b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Help/ru.html new file mode 100644 index 000000000..8e7748f9b --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Help/ru.html @@ -0,0 +1,3 @@ + +

                Замена элементов позволяет заменить один или несколько элементов на выбраный элемент. Все указанные элементы помечены на удаление или удалены непосредственно, если пользователь обладает административными правами

                +

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

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Items/КартинкаДлительнойОперации2/Picture.gif b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ЗаменаЭлементов/Items/КартинкаДлительнойОперации2/Picture.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd636e679ade7283fb7ee14d5ca5858c0da0716e GIT binary patch literal 14354 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 Неопределено Тогда + НоваяКолонка = Элементы.Добавить("СписокКодНовый", Тип("ПолеФормы"), Элементы.Список); + НоваяКолонка.ПутьКДанным = "Список.Код"; + КонецЕсли; + + Элементы["СписокСсылкаНовый"].Заголовок = НСтр("ru = 'Наименование'"); + + Элементы.Список.ИзменятьПорядокСтрок = Ложь; + Элементы.Список.ИзменятьСоставСтрок = Ложь; + + Если ОбщийВладелецЗаменяемыхСсылок <> Неопределено Тогда + ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Список, "Владелец", ОбщийВладелецЗаменяемыхСсылок ); + КонецЕсли; + + Элементы.НадписьТипВыбираемого.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Выберите элемент %1, на который будет произведена замена.'"), + ОсновныеМетаданные.Представление() + ); + + // Пошаговый мастер + ИнициализироватьМастера(Элементы.ШагиМастера, Элементы.Далее, Элементы.Назад, Элементы.Отмена); + + // Добавляем шаги, зависящие от логики формы + ИнициализироватьСценарийМастера(); +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + // Необходимость сообщения об ошибке + Если Не ПустаяСтрока(ТекстОшибкиПараметров) Тогда + Отказ = Истина; + ПоказатьПредупреждение(, ТекстОшибкиПараметров); + Возврат; + КонецЕсли; + + // Указываем стартовую страницу + УстановитьНачальнуюСтраницуМастера(Элементы.ШагВыборЦелевогоЭлемента); + ЗапуститьРаботуМастера(); +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + // Проверяем клиентскую переменную + Если ПодтверждениеЗакрытияФормы<>Истина Тогда + Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект); + Отказ = Истина; + + Текст = НСтр("ru = 'Закрыть замену элементов?'"); + ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура ПодсказкаВыбораЦелевогоЭлементаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Если НавигационнаяСсылка = "ПереключениеРежимаУдаления" Тогда + Если ТекущийВариантУдаления = "Непосредственно" Тогда + ТекущийВариантУдаления = "Пометка" + Иначе + ТекущийВариантУдаления = "Непосредственно" + КонецЕсли; + + СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ Список + +&НаКлиенте +Процедура СписокПриАктивизацииСтроки(Элемент) + + ПодключитьОбработчикОжидания("СформироватьЦелевойЭлементИПодсказкуОтложенно", 0.01, Истина); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ НеудачныеЗамены + +&НаКлиенте +Процедура НеудачныеЗаменыПриАктивизацииСтроки(Элемент) + ТекущиеДанные = Элемент.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + РасшифровкаПричиныНеудачи = ""; + Иначе + РасшифровкаПричиныНеудачи = ТекущиеДанные.ПодробнаяПричина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НеудачныеЗаменыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Ссылка = НеудачныеЗамены.НайтиПоИдентификатору(ВыбраннаяСтрока).Ссылка; + Если Ссылка<>Неопределено Тогда + ПоказатьЗначение(, Ссылка); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ШагМастераНазад(Команда) + ШагМастера("Назад"); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераДалее(Команда) + ШагМастера("Далее"); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераОтмена(Команда) + ШагМастера("Отмена"); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьЭлементНеудачнойЗамены(Команда) + ТекущиеДанные = Элементы.НеудачныеЗамены.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + ПоказатьЗначение(, ТекущиеДанные.Ссылка); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура РазвернутьВсеНеудачныеЗамены(Команда) + ДеревоФормы = Элементы.НеудачныеЗамены; + Для Каждого Элемент Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + ДеревоФормы.Развернуть(Элемент.ПолучитьИдентификатор(), Истина); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура СвернутьВсеНеудачныеЗамены(Команда) + ДеревоФормы = Элементы.НеудачныеЗамены; + Для Каждого Элемент Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + ДеревоФормы.Свернуть(Элемент.ПолучитьИдентификатор()); + КонецЦикла; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Общий обработчик подтверждения закрытия +&НаКлиенте +Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ЗавершитьРаботуФормы(); + Иначе + ПодтверждениеЗакрытияФормы = Неопределено; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьРаботуФормы(Знач ТекстВсплывающегоСообщения = Неопределено) + + ОтменитьДлительнуюОперациюМастера(); + + Если ТекстВсплывающегоСообщения <> Неопределено Тогда + ПоказатьОповещениеПользователя( , , ТекстВсплывающегоСообщения, БиблиотекаКартинок.Информация32); + КонецЕсли; + + // Закрываем без дополнительных вопросов + ПодтверждениеЗакрытияФормы = Истина; + Закрыть(); +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура СформироватьЦелевойЭлементИПодсказку(Контекст) + + ТекущиеДанные = Контекст.Элементы.Список.ТекущиеДанные; + // Обходим пустоту и группы + Если ТекущиеДанные = Неопределено Или ЗначениеРеквизита(ТекущиеДанные, "ЭтоГруппа", Ложь) Тогда + Возврат; + КонецЕсли; + Контекст.ЦелевойЭлемент = ТекущиеДанные.Ссылка; + + Количество = Контекст.ЗаменяемыеСсылки.Количество(); + Если Количество = 1 Тогда + // Один элемент + + Если Контекст.ЕстьПравоБезвозвратногоУдаления Тогда + Если Контекст.ТекущийВариантУдаления = "Пометка" Тогда + ТекстСсылки = НСтр("ru = 'помечен на удаление'"); + Иначе + ТекстСсылки = НСтр("ru = 'удален безвозвратно'"); + КонецЕсли; + + Гиперссылка = ГиперссылкаФорматированнойСтроки(ТекстСсылки, "ПереключениеРежимаУдаления"); + Иначе + Гиперссылка = НСтр("ru = 'помечен на удаление'"); + КонецЕсли; + + ТекстПодсказки = НСтр("ru = 'Заменить ""%1"" на ""%2"". + |Элемент ""%1"" будет %3'"); + + Контекст.Элементы.ПодсказкаВыбораЦелевогоЭлемента.Заголовок = ФорматированнаяСтрока( + ТекстПодсказки, + Контекст.ЗаменяемыеСсылки[0].Ссылка, Контекст.ЦелевойЭлемент, + Гиперссылка + ); + + Возврат; + КонецЕсли; + + // Много элементов + Если Контекст.ЕстьПравоБезвозвратногоУдаления Тогда + Если Контекст.ТекущийВариантУдаления = "Пометка" Тогда + ТекстСсылки = НСтр("ru = 'помечены на удаление'"); + Иначе + ТекстСсылки = НСтр("ru = 'удалены безвозвратно'"); + КонецЕсли; + + Гиперссылка = ГиперссылкаФорматированнойСтроки(ТекстСсылки, "ПереключениеРежимаУдаления"); + Иначе + Гиперссылка = НСтр("ru = 'помечены на удаление'"); + КонецЕсли; + + ТекстПодсказки = НСтр("ru = 'Заменить элементы (%1) на ""%2"". + |Заменяемые элементы будут %3'"); + + Контекст.Элементы.ПодсказкаВыбораЦелевогоЭлемента.Заголовок = ФорматированнаяСтрока( + ТекстПодсказки, + Количество, Контекст.ЦелевойЭлемент, + Гиперссылка + ); +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьЦелевойЭлементИПодсказкуОтложенно() + СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Функция СформироватьНадписьЗавершения() + Количество = ЗаменяемыеСсылки.Количество(); + + Если Количество = 1 Тогда + ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элемент ""%1"" заменен на ""%2""'"), + ЗаменяемыеСсылки[0].Ссылка, + ЦелевойЭлементРезультат + ); + Иначе + ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элементы (%1) заменены на ""%2""'"), + Количество, + ЦелевойЭлементРезультат + ); + КонецЕсли; + + Элементы.РезультатЗамены.Заголовок = ТекстРезультата; + + Возврат ТекстРезультата; +КонецФункции + +&НаКлиенте +Процедура СформироватьНадписьНеудачныеЗамены() + + Элементы.РезультатНеудачныеЗамены.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось заменить элементы (%1 из %2). В некоторых местах использования не может быть произведена + |автоматическая замена на ""%3""'"), + НеудачныеЗамены.ПолучитьЭлементы().Количество(), + ЗаменяемыеСсылки.Количество(), + ЦелевойЭлемент + ); + +КонецПроцедуры + +// Проверяем возможность замены с прикладной точки зрения +&НаСервере +Функция ТекстОшибкиВозможностиЗаменыСсылок() + + ПарыЗамен = Новый Соответствие; + Для Каждого Строка Из ЗаменяемыеСсылки Цикл + ПарыЗамен.Вставить(Строка.Ссылка, ЦелевойЭлемент); + КонецЦикла; + + // Вычисляем из ссылки менеджер объекта + МодульМенеджера = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ЦелевойЭлемент); + + // Проверяем присутствие метода в менеджере + ТестовыйОбъект = ЦелевойЭлемент.ПолучитьОбъект(); + Попытка + // Тестовым обработчиком должно быть событие, у которого на один параметр меньше, чем у тестируемого метода + // (первым параметром передается сам объект). Например ПриЗаписи имеет один параметр, тогда у обработчика должно быть два + ДобавитьОбработчик ТестовыйОбъект.ПриЗаписи, МодульМенеджера.ВозможностьЗаменыЭлементов; + ЕстьМетод = Истина; + Исключение + ЕстьМетод = Ложь; + КонецПопытки; + + Результат = ""; + + Если ЕстьМетод Тогда + ПараметрыЗамены = Новый Структура("СпособУдаления", ТекущийВариантУдаления); + Ошибки = МодульМенеджера.ВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены); + Для Каждого КлючЗначение Из Ошибки Цикл + Результат = Результат + Символы.ПС + КлючЗначение.Значение; + КонецЦикла; + КонецЕсли; + + Возврат СокрЛП(Результат); +КонецФункции + +// --------------------------------------------------------------------------------------------------------------------- + +&НаСервере +Процедура ЗапуститьЗаменуСсылок() + ЦелевойЭлементРезультат = ЦелевойЭлемент; + + ПолноеИмяМетода = "ОбщегоНазначения.ЗаменитьСсылки"; + ПараметрыМетода = Новый Массив; + + ПарыЗамен = Новый Соответствие; + Для Каждого Строка Из ЗаменяемыеСсылки Цикл + ПарыЗамен.Вставить(Строка.Ссылка, ЦелевойЭлемент); + КонецЦикла; + ПараметрыМетода.Добавить(ПарыЗамен); + + ПараметрыЗамены = Новый Структура; + ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления); + ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина); + + ПараметрыМетода.Добавить(ПараметрыЗамены); + + ЗапуститьДлительнуюОперациюМастера(ПолноеИмяМетода, ПараметрыМетода, Истина); +КонецПроцедуры + +&НаСервере +Функция ПроверитьСостояниеИОбработатьЗаменуСсылок() + СостояниеОперации = СостояниеДлительнойОперацииМастера(); + + Если Не СостояниеОперации.Завершено Тогда + // Клиенту пока можно ничего не говорить + СостояниеОперации.Результат = Неопределено; + + ИначеЕсли СостояниеОперации.ИнформацияОбОшибке <> Неопределено Тогда + // Завершено c ошибками + СостояниеОперации.Результат = Неопределено; + + ИначеЕсли СостояниеОперации.Завершено И СостояниеОперации.Результат <> Неопределено Тогда + // Перекладываем все ошибки в НеудачныеЗамены, получаем флаг их наличия + СостояниеОперации.Результат = Не ЗаполнитьНеудачныеЗамены(СостояниеОперации.Результат); + + КонецЕсли; + + Возврат СостояниеОперации; +КонецФункции + +&НаСервере +Функция ЗаполнитьНеудачныеЗамены(Знач РезультатыЗамены) + // РезультатыЗамены - таблица с колонками Ссылка, ОбъектОшибки, ТипОшибки, ТекстОшибки + КорневыеСтроки = НеудачныеЗамены.ПолучитьЭлементы(); + КорневыеСтроки.Очистить(); + + СоответствиеСтрок = Новый Соответствие; + КэшМетаданных = Новый Соответствие; + + Для Каждого СтрокаРезультата Из РезультатыЗамены Цикл + Ссылка = СтрокаРезультата.Ссылка; + + ОшибкиПоСсылке = СоответствиеСтрок[Ссылка]; + Если ОшибкиПоСсылке = Неопределено Тогда + СтрокаДерева = КорневыеСтроки.Добавить(); + СтрокаДерева.Ссылка = Ссылка; + СтрокаДерева.Данные = Строка(Ссылка); + СтрокаДерева.Код = Строка( ВозможныйКодСсылки(Ссылка, КэшМетаданных) ); + СтрокаДерева.Пиктограмма = -1; + + ОшибкиПоСсылке = СтрокаДерева.ПолучитьЭлементы(); + СоответствиеСтрок.Вставить(Ссылка, ОшибкиПоСсылке); + КонецЕсли; + + СтрокаОшибки = ОшибкиПоСсылке.Добавить(); + СтрокаОшибки.Ссылка = СтрокаРезультата.ОбъектОшибки; + СтрокаОшибки.Данные = СтрокаРезультата.ПредставлениеОбъектаОшибки; + + ТипОшибки = СтрокаРезультата.ТипОшибки; + Если ТипОшибки = "НеизвестныеДанные" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Обнаружена данные, обработка которых не планировалась.'"); + + ИначеЕсли ТипОшибки = "ОшибкаБлокировки" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Данные заблокированы другим пользователем.'"); + + ИначеЕсли ТипОшибки = "ДанныеИзменены" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Данные изменены другим пользователем.'"); + + ИначеЕсли ТипОшибки = "ОшибкаЗаписи" Тогда + СтрокаОшибки.Причина = СтрокаРезультата.ТекстОшибки; + + Иначе + СтрокаОшибки.Причина = НСтр("ru = 'Неизвестная ошибка.'"); + + КонецЕсли; + + СтрокаОшибки.ПодробнаяПричина = СтрокаРезультата.ТекстОшибки; + КонецЦикла; // результаты замены + + Возврат КорневыеСтроки.Количество() > 0; +КонецФункции + +// Параметры: +// СписокДанных - Массив - содержит измененные данные, о типе которых будет оповещено +// +&НаКлиенте +Процедура ОповеститьОбУспешнойЗамене(Знач СписокДанных) + // Изменения объектов, в которых происходили замены + СписокТипов = Новый Соответствие; + Для Каждого Элемент Из СписокДанных Цикл + Тип = ТипЗнч(Элемент); + Если СписокТипов[Тип] = Неопределено Тогда + ОповеститьОбИзменении(Тип); + СписокТипов.Вставить(Тип, Истина); + КонецЕсли; + КонецЦикла; + + // Общее оповещение + Если СписокТипов.Количество()>0 Тогда + Оповестить(СобытиеОповещенияОЗамене, , ЭтотОбъект); + КонецЕСли; +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- + +// Преобразует массив, список значений или коллекцию в массив +&НаСервереБезКонтекста +Функция МассивСсылокИзСписка(Знач Ссылки) + + ТипПараметра = ТипЗнч(Ссылки); + Если Ссылки = Неопределено Тогда + МассивСсылок = Новый Массив; + + ИначеЕсли ТипПараметра = Тип("СписокЗначений") Тогда + МассивСсылок = Ссылки.ВыгрузитьЗначения(); + + ИначеЕсли ТипПараметра = Тип("Массив") Тогда + МассивСсылок = Ссылки; + + Иначе + МассивСсылок = Новый Массив; + Для Каждого Элемент Из Ссылки Цикл + МассивСсылок.Добавить(Элемент.Ссылка); + КонецЦикла; + + КонецЕсли; + + Возврат МассивСсылок; +КонецФункции + +// Возвращает код справочника и т.п. если он есть по метаданным, Неопределено, если кода нет +&НаСервереБезКонтекста +Функция ВозможныйКодСсылки(Знач Ссылка, КэшМетаданных) + Мета = Ссылка.Метаданные(); + ЕстьКод = КэшМетаданных[Мета]; + + Если ЕстьКод = Неопределено Тогда + // Проверяем, если ли код вообще + Тест = Новый Структура("ДлинаКода", 0); + ЗаполнитьЗначенияСвойств(Тест, Мета); + ЕстьКод = Тест.ДлинаКода > 0; + + КэшМетаданных[Мета] = ЕстьКод; + КонецЕсли; + + Возврат ?(ЕстьКод, Ссылка.Код, Неопределено); +КонецФункции + +// Безопасное получение значения реквизита +&НаКлиентеНаСервереБезКонтекста +Функция ЗначениеРеквизита(Знач Данные, Знач ИмяРеквизита, Знач ЗначениеПриОтсутствии = Неопределено) + + Проба = Новый Структура(ИмяРеквизита); + + ЗаполнитьЗначенияСвойств(Проба, Данные); + Если Проба[ИмяРеквизита] <> Неопределено Тогда + // Есть значение + Возврат Проба[ИмяРеквизита]; + КонецЕсли; + + // Возможно значение в данных равно Неопределено + Проба[ИмяРеквизита] = Истина; + ЗаполнитьЗначенияСвойств(Проба, Данные); + Если Проба[ИмяРеквизита] <> Истина Тогда + Возврат Проба[ИмяРеквизита]; + КонецЕсли; + + Возврат ЗначениеПриОтсутствии; +КонецФункции + +&НаСервере +Процедура ИнициализироватьЗаменяемыеСсылки(Знач МассивСсылок) + + КоличествоСсылок = МассивСсылок.Количество(); + Если КоличествоСсылок = 0 Тогда + ТекстОшибкиПараметров = НСтр("ru = 'Не указано ни одного элемента для замены.'"); + Возврат; + КонецЕсли; + + ЦелевойЭлемент = МассивСсылок[0]; + + ОсновныеМетаданные = ЦелевойЭлемент.Метаданные(); + Характеристики= Новый Структура("Владельцы, Иерархический, ВидИерархии", Новый Массив, Ложь); + ЗаполнитьЗначенияСвойств(Характеристики, ОсновныеМетаданные); + + ЕстьВладельцы = Характеристики.Владельцы.Количество() > 0; + ЕстьГруппы = Характеристики.Иерархический И Характеристики.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов; + + ДополнительныеПоля = ""; + Если ЕстьВладельцы Тогда + ДополнительныеПоля = ДополнительныеПоля + ", Владелец КАК Владелец"; + Иначе + ДополнительныеПоля = ДополнительныеПоля + ", НЕОПРЕДЕЛЕНО КАК Владелец"; + КонецЕсли; + + Если ЕстьГруппы Тогда + ДополнительныеПоля = ДополнительныеПоля + ", ЭтоГруппа КАК ЭтоГруппа"; + Иначе + ДополнительныеПоля = ДополнительныеПоля + ", ЛОЖЬ КАК ЭтоГруппа"; + КонецЕсли; + + ИмяТаблицы = ОсновныеМетаданные.ПолноеИмя(); + Запрос = Новый Запрос(" + |ВЫБРАТЬ Ссылка КАК Ссылка" + ДополнительныеПоля + " ПОМЕСТИТЬ ЗаменяемыеСсылки + |ИЗ " + ИмяТаблицы + " ГДЕ Ссылка В (&НаборСсылок) + |ИНДЕКСИРОВАТЬ ПО Владелец, ЭтоГруппа + |; + |ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Владелец) КАК КоличествоВладельцев, + | МИНИМУМ(Владелец) КАК ОбщийВладелец, + | МАКСИМУМ(ЭтоГруппа) КАК ЕстьГруппы, + | КОЛИЧЕСТВО(Ссылка) КАК КоличествоСсылок + |ИЗ + | ЗаменяемыеСсылки + |"); + Запрос.УстановитьПараметр("НаборСсылок", МассивСсылок); + + Условия = Запрос.Выполнить().Выгрузить()[0]; + Если Условия.ЕстьГруппы Тогда + ТекстОшибкиПараметров = НСтр("ru = 'Один из элементов для замены является группой. + |Группы не могут быть заменены.'"); + ИначеЕсли Условия.КоличествоВладельцев > 1 Тогда + ТекстОшибкиПараметров = НСтр("ru = 'У элементов для замены разные владельцы. + |Такие элементы не могут быть заменены.'"); + ИначеЕсли Условия.КоличествоСсылок <> КоличествоСсылок Тогда + ТекстОшибкиПараметров = НСтр("ru = 'Все элементы для замены должны быть одного типа.'"); + Иначе + // Все нормально, перекладываем + ОбщийВладелецЗаменяемыхСсылок = ?(ЕстьВладельцы, Условия.ОбщийВладелец, Неопределено); + Для Каждого Элемент Из МассивСсылок Цикл + ЗаменяемыеСсылки.Добавить().Ссылка = Элемент; + КонецЦикла; + КонецЕсли; + +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +// Работа с мастером + +&НаСервере +Процедура ИнициализироватьСценарийМастера() + + // 0. Выбор основного элемента + ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента, + ДействиеШагаМастера("ПриАктивации", "ШагВыборЦелевогоЭлементаПриАктивации", + ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборЦелевогоЭлементаПередДействиемДалее", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборЦелевогоЭлементаПередДействиемОтмена", + ))), + КнопкаШагаМастера("Далее", НСтр("ru = 'Заменить'") + " >", НСтр("ru = 'Начать замену элементов'"), Истина, Истина, Истина, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Отмена'"), НСтр("ru = 'Отказаться от замены элементов'"), + ))) + ); + + // 1. Ожидание процесса + ДобавитьШагМастера(Элементы.ШагЗамена, + ДействиеШагаМастера("ПриАктивации", "ШагЗаменаПриАктивации", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагЗаменаПередДействиемОтмена", + ДействиеШагаМастера("ПриОбработкеОжидания", "ШагЗаменаПриОбработкеОжидания", + ))), + КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Прервать'"), НСтр("ru = 'Прервать замену элементов'"), + ))) + ); + + // 2. Успешное объединение + ДобавитьШагМастера(Элементы.ШагУспешногоЗавершения, + ДействиеШагаМастера("ПриАктивации", "ШагУспешногоЗавершенияПриАктивации", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагУспешногоЗавершенияПередДействиемОтмена", + )), + КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты замены элементов'"), Истина, Истина, Истина, + ))) + ); + + // 3. Ошибки замены ссылок + ДобавитьШагМастера(Элементы.ШагПовторЗамены, + ДействиеШагаМастера("ПриАктивации", "ШагПовторЗаменыПриАктивации", + ДействиеШагаМастера("ПередДействиемДалее", "ШагПовторЗаменыПередДействиемДалее", + ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторЗаменыПередДействиемНазад", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторЗаменыПередДействиемОтмена", + )))), + КнопкаШагаМастера("Далее", НСтр("ru = 'Повторить замену'") + " >", НСтр("ru = 'Повторить замену элементов'"), Истина, Истина, Истина, + КнопкаШагаМастера("Назад", "< " + НСтр("ru = 'Назад'"), НСтр("ru = 'Вернутся к выбору целевого элемента'"), Истина, Истина, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты замены элементов'"), + ))) + ); + + // Вариант завершения работы - или демонстрацией страницы или всплывающим сообщением и закрытием + УстановитьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном", Истина); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагВыборЦелевогоЭлементаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + + СформироватьЦелевойЭлементИПодсказку(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ШагВыборЦелевогоЭлементаПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Проверяем на неправомерные замены + + ТекущиеДанные = Элементы.Список.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + + ИначеЕсли ЗаменяемыеСсылки.Количество() = 1 И ТекущиеДанные.Ссылка = ЗаменяемыеСсылки.Получить(0).Ссылка Тогда + ПоказатьПредупреждение( , НСтр("ru = 'Нельзя заменять элемент сам на себя.'")); + Возврат; + + ИначеЕсли ЗначениеРеквизита(ТекущиеДанные, "ЭтоГруппа", Ложь) Тогда + ПоказатьПредупреждение( , НСтр("ru = 'Нельзя заменять элемент на группу.'")); + Возврат; + КонецЕсли; + + ТекущийВладелец = ЗначениеРеквизита(ТекущиеДанные, "Владелец"); + Если ТекущийВладелец <> ОбщийВладелецЗаменяемыхСсылок Тогда + ПоказатьПредупреждение( , СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Нельзя заменять на элемент, подчиненный другому владельцу. + |У выбранного элемента владелец ""%1"", а у заменяемого - ""%2"".'"), + ТекущийВладелец, ОбщийВладелецЗаменяемыхСсылок + )); + Возврат; + + ИначеЕсли Не ЗначениеРеквизита(ТекущиеДанные, "ПометкаУдаления", Ложь) Тогда + // Нужна дополнительная проверка по прикладным данным + ПроверкаДопустимостиЗаменыПрикладнойОбласти(ПараметрыШага); + Возврат; + + КонецЕсли; + + // Попытка заменить на элемент, помеченный на удаление + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элемент %1 помечен на удаление. Продолжить?'"), + ТекущиеДанные.Ссылка + ); + + Описание = Новый ОписаниеОповещения("ПодтверждениеВыбораЦелевогоЭлемента", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + ПоказатьВопрос(Описание, Текст, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +&НаКлиенте +Процедура ШагВыборЦелевогоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Запрос подтверждения на отмену + ТекстВопроса = НСтр("ru = 'Отменить замену элементов и закрыть?'"); + Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + + ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагЗаменаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Стартуем длительную обработку по замене + ЗапуститьЗаменуСсылок(); +КонецПроцедуры + +&НаКлиенте +Процедура ШагЗаменаПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт + // Ожидаем завершения замены ссылок + СостояниеОперации = ПроверитьСостояниеИОбработатьЗаменуСсылок(); + + Если Не СостояниеОперации.Завершено Тогда + Возврат; + КонецЕсли; + + Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда + // Выполнено успешно + Если СостояниеОперации.Результат = Истина Тогда + // Успешно заменили все элементы + Если Истина = ПрочитатьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном") Тогда + ЗавершитьРаботуФормы( СформироватьНадписьЗавершения() ); + Иначе + // Переходим на страницу завершения + ШагМастера("Далее"); + КонецЕсли; + + Иначе + // Остались необработанные, переходим на попытку повтора + ПерейтиНаШагМастера(Элементы.ШагПовторЗамены, Истина); + КонецЕсли + Иначе + // Фоновое задание завершено с ошибкой + Прекратить = Истина; + ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке); + ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагЗаменаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Запрос подтверждения на отмену + ТекстВопроса = НСтр("ru = 'Прервать процесс замены и закрыть?'"); + Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + + ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагУспешногоЗавершенияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Обновляем надпись + СформироватьНадписьЗавершения(); + + // Оповещаем о успешной замене + СписокОбновленного = Новый Массив; + СписокОбновленного.Добавить(ЦелевойЭлемент); + Для Каждого Строка Из ЗаменяемыеСсылки Цикл + СписокОбновленного.Добавить(Строка.Ссылка); + КонецЦикла; + ОповеститьОбУспешнойЗамене(СписокОбновленного); +КонецПроцедуры + +&НаКлиенте +Процедура ШагУспешногоЗавершенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + + // Это выход. Закрываем форму принудительно + ЗавершитьРаботуФормы(); + +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагПовторЗаменыПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Обновляем количества неудач + СформироватьНадписьНеудачныеЗамены(); + + // Оповещаем об успешной частичной замене + СписокОбновленного = УдалитьИзЗаменяемыхОбработанные(); // Заодно и удаляем из списка + СписокОбновленного.Добавить(ЦелевойЭлемент); + ОповеститьОбУспешнойЗамене(СписокОбновленного); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторЗаменыПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Повтор замены + ПерейтиНаШагМастера(Элементы.ШагЗамена, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторЗаменыПередДействиемНазад(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + ПерейтиНаШагМастера(Элементы.ШагВыборЦелевогоЭлемента, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторЗаменыПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Это выход. Закрываем форму принудительно + ЗавершитьРаботуФормы(); +КонецПроцедуры + +// Возвращает список успешно замененных ссылок, тех которых нет в НеудачныеЗамены +&НаКлиенте +Функция УдалитьИзЗаменяемыхОбработанные() + Результат = Новый Массив; + + Неудачные = Новый Соответствие; + Для Каждого Строка Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + Неудачные.Вставить(Строка.Ссылка, Истина); + КонецЦикла; + + Индекс = ЗаменяемыеСсылки.Количество() - 1; + Пока Индекс > 0 Цикл + Ссылка = ЗаменяемыеСсылки[Индекс].Ссылка; + Если Ссылка<>ЦелевойЭлемент И Неудачные[Ссылка] = Неопределено Тогда + ЗаменяемыеСсылки.Удалить(Индекс); + Результат.Добавить(Ссылка); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// --------------------------------------------------------------------------------------------------------------------- + +// Общий обработчик немодального продолжения отмены с закрытием +&НаКлиенте +Процедура ЗавершениеОтменыИЗакрытиеФормы(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + // Подтверждаем продолжение процесса + ЗавершитьШагМастера(ДополнительныеПараметры.ПараметрыШага); + Возврат; + КонецЕсли; + + ЗавершитьРаботуФормы(); +КонецПроцедуры + +&НаКлиенте +Процедура ПодтверждениеВыбораЦелевогоЭлемента(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + // Дополнительная проверка по прикладным данным + ПроверкаДопустимостиЗаменыПрикладнойОбласти(ДополнительныеПараметры.ПараметрыШага); +КонецПроцедуры + +&НаКлиенте +Процедура ПроверкаДопустимостиЗаменыПрикладнойОбласти(Знач ПараметрыШага) + + // Проверяем допустимость замены с прикладной точки зрения + ТекстОшибки = ТекстОшибкиВозможностиЗаменыСсылок(); + + Если ПустаяСтрока(ТекстОшибки) Тогда + // Все замены допустимы + ЗавершитьШагМастера(ПараметрыШага); + Возврат; + КонецЕсли; + + ПараметрыПредупреждения = Новый Структура; + ПараметрыПредупреждения.Вставить("Заголовок", НСтр("ru = 'Невозможно заменить элементы'")); + ПараметрыПредупреждения.Вставить("ТекстСообщения", ТекстОшибки); + ОткрытьФорму("Обработка.ЗаменаСсылок.Форма.МногострочноеПредупреждение", ПараметрыПредупреждения, ЭтотОбъект); + +КонецПроцедуры + +// Аналог ПодставитьПараметрыВСтроку для работы с форматированной строкой +&НаКлиентеНаСервереБезКонтекста +Функция ФорматированнаяСтрока(Знач Шаблон, + Знач П1 = Неопределено, Знач П2 = Неопределено, Знач П3 = Неопределено, Знач П4 = Неопределено, Знач П5 = Неопределено, + Знач П6 = Неопределено, Знач П7 = Неопределено, Знач П8 = Неопределено, Знач П9 = Неопределено +) + + ЧастиСтроки = Новый Массив; + ДопустимыеТипы = Новый ОписаниеТипов("Строка, ФорматированнаяСтрока, Картинка"); + + Начало = 1; + Пока Истина Цикл + Фрагмент = Сред(Шаблон, Начало); + + Позиция = Найти(Фрагмент, "%"); + Если Позиция = 0 Тогда + ЧастиСтроки.Добавить(Фрагмент); + Прервать; + КонецЕсли; + + Следующий = Сред(Фрагмент, Позиция + 1, 1); + + Если Следующий = "1" Тогда + Значение = П1; + + ИначеЕсли Следующий = "2" Тогда + Значение = П2; + + ИначеЕсли Следующий = "3" Тогда + Значение = П3; + + ИначеЕсли Следующий = "4" Тогда + Значение = П4; + + ИначеЕсли Следующий = "5" Тогда + Значение = П5; + + ИначеЕсли Следующий = "6" Тогда + Значение = П6; + + ИначеЕсли Следующий = "7" Тогда + Значение = П7; + + ИначеЕсли Следующий = "8" Тогда + Значение = П8; + + ИначеЕсли Следующий = "9" Тогда + Значение = П9; + + ИначеЕсли Следующий = "%" Тогда + Значение = "%"; + + Иначе + Значение = Неопределено; + Позиция = Позиция - 1; + + КонецЕсли; + + ЧастиСтроки.Добавить(Лев(Фрагмент, Позиция - 1)); + + Если Значение <> Неопределено Тогда + Значение = ДопустимыеТипы.ПривестиЗначение(Значение); + Если Значение <> Неопределено Тогда + ЧастиСтроки.Добавить( Значение ); + КонецЕсли; + КонецЕсли; + + Начало = Начало + Позиция + 1; + КонецЦикла; + + Возврат Новый ФорматированнаяСтрока(ЧастиСтроки); +КонецФункции +&НаКлиентеНаСервереБезКонтекста +Функция ГиперссылкаФорматированнойСтроки(Знач Текст, Знач Идентификатор = Неопределено) + + Возврат Новый ФорматированнаяСтрока(Текст, , , , Идентификатор); + +КонецФункции + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПОШАГОВОГО ПОМОЩНИКА + +// Для встраивания функционала мастера необходимо: +// +// 1) Нарисовать на форме группу, содержащую страницы помощника +// 2) Определить на форме три команды для действий "Далее", "Назад", "Отмена". Определить им обработчики как: +// +// &НаКлиенте +// Процедура ШагМастераНазад(Команда) +// ШагМастера("Назад"); +// КонецПроцедуры +// +// &НаКлиенте +// Процедура ШагМастераДалее(Команда) +// ШагМастера("Далее"); +// КонецПроцедуры +// +// &НаКлиенте +// Процедура ШагМастераОтмена(Команда) +// ШагМастера("Отмена"); +// КонецПроцедуры +// +// 3) Добавить блок методов пошагового помощника +// +// 4) В коде на сервере: +// - Инициализировать структуры помощника вызовом "ИнициализироватьМастера", передав туда соответствующие +// элементы формы +// +// - Создать сценарий работы последовательным вызовами "ДобавитьШагМастера". Рекомендуется использовать +// вспомогательные функции "ДействиеШагаМастера" и "КнопкаШагаМастера". Например: +// +// ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента, +// ДействиеШагаМастера("ПриАктивации", "ШагВыборЦелевогоЭлементаПриАктивации", +// ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборЦелевогоЭлементаПередДействиемДалее", +// ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборЦелевогоЭлементаПередДействиемОтмена", +// ))), +// КнопкаШагаМастера("Далее", НСтр("ru = 'Заменить'") + " >", Истина, Истина, Истина, +// КнопкаШагаМастера("Назад", "", Ложь, Ложь, Ложь, +// КнопкаШагаМастера("Отмена", НСтр("ru = 'Отмена'") +// ))) +// ); +// +// 5) В коде на клиенте (обычно при открытии): +// - Указать начальную страницу мастера при помощи вызова "УстановитьНачальнуюСтраницуМастера" +// - Запустить начальную страницу вызовом "ЗапуститьРаботуМастера" +// + +// Инициализирует структуры мастера. +// +// Параметры: +// ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера +// КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее" +// КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад" +// КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена" +// +&НаСервере +Процедура ИнициализироватьМастера(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена) + НастройкиМастера = Новый Структура; + + НастройкиМастера.Вставить("Шаги", Новый Массив); + НастройкиМастера.Вставить("НомерТекущегоШага", 0); + НастройкиМастера.Вставить("СтраницаСтарта", Неопределено); + + // Идентификаторы частей интерфейса + НастройкиМастера.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя); + НастройкиМастера.Вставить("КнопкаДалее", КнопкаДалее.Имя); + НастройкиМастера.Вставить("КнопкаНазад", КнопкаНазад.Имя); + НастройкиМастера.Вставить("КнопкаОтмена", КнопкаОтмена.Имя); + + // Таймаут вызова обработчика + НастройкиМастера.Вставить("ТаймаутОжиданияДлительнойОперации", + ?( ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 5, 3) ); + + // Для обработки длительных операций + НастройкиМастера.Вставить("ИдентификаторФоновогоЗадания"); + НастройкиМастера.Вставить("АдресРезультатаФоновогоЗадания"); + + // Для хранения пользовательских параметров + НастройкиМастера.Вставить("ПользовательскиеПараметры", Новый Соответствие); + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить( Новый РеквизитФормы("НастройкиПошаговогоМастера", Новый ОписаниеТипов) ); + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + ЭтотОбъект.НастройкиПошаговогоМастера = НастройкиМастера; +КонецПроцедуры + +// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. +// +// Параметры: +// +// Страница - ГруппаФормы - Группа-страница, содержащая элементы текущего шага страницы +// +// Действия - Структура - Описание действий, возможных на текущем шаге. Поля структуры: +// +// ПриАктивации - Строка - Необязательное имя процедуры, которая будет выполнена перед активацией страницы +// с двумя параметрами: +// <Страница> - ГруппаФормы - группа-страница, которая активизируется +// <ДополнительныеПараметры> - Неопределено +// +// ПередДействиемДалее - Строка - Необязательное имя процедуры, которая будет выполнена при нажатии кнопки "Далее", +// перед переходом на следующую страницу. Процедура будет вызвана с двумя параметрами: +// <ПараметрыШага> - служебный реквизит. При успешном завершении цепочки немодальных +// вызовов последняя процедура-обработчик должна произвести вызов +// ЗавершитьШагМастера(ПараметрыШага), подтверждая действие. +// <ДополнительныеПараметры> - Неопределено +// +// ПередДействиемНазад - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки "Назад" +// +// ПередДействиемОтмена - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки "Отмена" +// +// ПриОбработкеОжидания - Строка - Необязательное имя процедуры, которая будет периодически вызываться с двумя +// параметрами: +// <Прекратить> - Если при выходе из процедуры установить в значение Истина, то +// периодические вызовы будут прекращены. +// <ДополнительныеПараметры> - Неопределено +// +// Кнопки - Структура - описание кнопок на текущем шаге. Поля структуры: +// +// Далее - Структура - Описание кнопки "Далее". поля: Заголовок, Подсказка, Доступность, Видимость, КнопкаПоУмолчанию. +// Пустая подсказка заменяется на заголовок. По умолчанию будут использованы значения: +// Заголовок = "Далее >", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Истина; +// +// Назад - Структура - Аналогично кнопке "Далее", значения по умолчанию: +// Заголовок = "< Назад", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; +// +// Отмена - Структура - Аналогично кнопке "Далее", значения по умолчанию: +// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; +// +// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера", "ДействиеШагаМастера", "КнопкаШагаМастера" +// +&НаСервере +Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки) + + // Умолчания + ОписаниеШага = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания"); + + ПоляКнопки = "Доступность, Видимость, КнопкаПоУмолчанию, Подсказка"; + + ОписаниеШага.Вставить("КнопкаДалее", Новый Структура(ПоляКнопки, Истина, Истина, Истина)); + ОписаниеШага.КнопкаДалее.Вставить("Заголовок", НСтр("ru='Далее'") + " >" ); + + ОписаниеШага.Вставить("КнопкаНазад", Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); + ОписаниеШага.КнопкаНазад.Вставить("Заголовок", "< " + НСтр("ru='Назад'")); + + ОписаниеШага.Вставить("КнопкаОтмена",Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); + ОписаниеШага.КнопкаОтмена.Вставить("Заголовок", НСтр("ru='Отмена'")); + + ОписаниеШага.Вставить("Страница", Страница.Имя); + + // Устанавливаем действия + ЗаполнитьЗначенияСвойств(ОписаниеШага, Действия); + + Если Кнопки.Свойство("Далее") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаДалее, Кнопки.Далее); + КонецЕсли; + Если Кнопки.Свойство("Назад") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаНазад, Кнопки.Назад); + КонецЕсли; + Если Кнопки.Свойство("Отмена") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаОтмена, Кнопки.Отмена); + КонецЕсли; + + ЭтотОбъект.НастройкиПошаговогоМастера.Шаги.Добавить(ОписаниеШага); +КонецПроцедуры + +// Вспомогательное формирование структуры, описывающей действие +// +// Параметры: +// Идентификатор - Строка - Идентификатор действия, см описание метода "ДобавитьШагМастера" +// ИмяОбработчика - Строка - Имя процедуры, см описание метода "ДобавитьШагМастера" +// СлужебныеДанные - Структура - Накапливает значения. +// +// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями +&НаСервере +Функция ДействиеШагаМастера(Знач Идентификатор, Знач ИмяОбработчика, СлужебныеДанные = Неопределено) + Если СлужебныеДанные = Неопределено Тогда + СлужебныеДанные = Новый Структура; + КонецЕсли; + СлужебныеДанные.Вставить(Идентификатор, ИмяОбработчика);; + Возврат СлужебныеДанные; +КонецФункции + +// Вспомогательное формирование структуры, описывающей кнопку +// +// Параметры: +// Идентификатор - Строка - Идентификатор кнопки, может быть "Далее", "Назад" или "Отмена", +// см описание метода "ДобавитьШагМастера" +// Заголовок - Строка - Заголовок кнопки +// Подсказка - Строка - Подсказка для кнопки +// Видимость - Булево - параметр отображения кнопки +// Доступность - Булево - параметр отображения кнопки +// КнопкаПоУмолчанию - Булево - параметр отображения кнопки +// СлужебныеДанные - Структура - Накапливает значения +// +// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями +// +&НаСервере +Функция КнопкаШагаМастера(Знач Идентификатор, Знач Заголовок = "", Знач Подсказка = "", Знач Видимость = Истина, Знач Доступность = Истина, Знач КнопкаПоУмолчанию = Ложь, Знач СлужебныеДанные = Неопределено) + Если СлужебныеДанные = Неопределено Тогда + СлужебныеДанные = Новый Структура; + КонецЕсли; + + ОписаниеКнопки = Новый Структура; + ОписаниеКнопки.Вставить("Заголовок", Заголовок); + ОписаниеКнопки.Вставить("Подсказка", ?(ПустаяСтрока(Подсказка), Заголовок, Подсказка)); + + ОписаниеКнопки.Вставить("Доступность", Доступность); + ОписаниеКнопки.Вставить("Видимость", Видимость); + ОписаниеКнопки.Вставить("КнопкаПоУмолчанию", КнопкаПоУмолчанию); + + СлужебныеДанные.Вставить(Идентификатор, ОписаниеКнопки); + Возврат СлужебныеДанные; +КонецФункции + +// Читает пользовательский параметр мастера +&НаКлиентеНаСервереБезКонтекста +Функция ПрочитатьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера) + + Возврат Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры[ИмяПараметраМастера]; + +КонецФункции + +// Устанавливает пользовательский параметр мастера +&НаКлиентеНаСервереБезКонтекста +Функция УстановитьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера, Знач ЗначениеПараметраМастера) + + Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры.Вставить(ИмяПараметраМастера, ЗначениеПараметраМастера); + +КонецФункции + +// Устанавливает начальную страницу для первого запуска мастера +// +// Параметры: +// СтартоваяСтраница - Число, Строка, ГруппаФормы - Номер шага, группа-страница, или ее идентификатор +// +&НаКлиенте +Процедура УстановитьНачальнуюСтраницуМастера(Знач Страница) + + ЭтотОбъект.НастройкиПошаговогоМастера.СтраницаСтарта = НомерШагаМастераПоИдентификатору(Страница); + +КонецПроцедуры + +// Запускает начальную работу мастера с шага, установленного предварительно при помощи "УстановитьНачальнуюСтраницуМастера" +&НаКлиенте +Процедура ЗапуститьРаботуМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если НастройкиМастера.СтраницаСтарта = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Перед запуском мастера должна быть установлена начальная страница.'"); + + ИначеЕсли НастройкиМастера.СтраницаСтарта = -1 Тогда + // Разогрев. Проверяем наличие обработчиков действий у всех шагов + ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания"); + Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл + Для Каждого КлючЗначение Из ВозможныеДействия Цикл + ИмяДействия = КлючЗначение.Ключ; + ИмяОбработчика = ОписаниеШага[ИмяДействия]; + Если Не ПустаяСтрока(ИмяОбработчика) Тогда + Попытка + Тест = Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект); + Исключение + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания обработчика события %1 для страницы %2, не определена процедура %3'"), + ИмяДействия, + ОписаниеШага.Страница, + ИмяОбработчика + ); + ВызватьИсключение Текст; + КонецПопытки; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Фактический запуск + ПерейтиНаШагМастера(НастройкиМастера.НомерТекущегоШага, Истина); + Иначе + // По умолчанию все отключено + Элементы[НастройкиМастера.КнопкаДалее].Видимость = Ложь; + Элементы[НастройкиМастера.КнопкаНазад].Видимость = Ложь; + Элементы[НастройкиМастера.КнопкаОтмена].Видимость = Ложь; + + // Отложенный запуск + ЭтотОбъект.НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиМастера.СтраницаСтарта; + ЭтотОбъект.НастройкиПошаговогоМастера.СтраницаСтарта = -1; + ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина); + КонецЕсли; +КонецПроцедуры + +// Выполняет переключение мастера на следующую или предыдущую страницу. +// +// Параметры: +// КодКоманды - Строка - Идентификатор действия, может принимать значения "Далее", "Назад" или "Отмена" +// +&НаКлиенте +Процедура ШагМастера(Знач КодКоманды) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если КодКоманды = "Далее" Тогда + Направление = 1; + ИначеЕсли КодКоманды = "Назад" Тогда + Направление = -1; + ИначеЕсли КодКоманды = "Отмена" Тогда + Направление = 0; + Иначе + ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'"); + КонецЕсли; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + + // Останавливаем обработчик, если есть + Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда + ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера"); + КонецЕсли; + + // Отрабатываем уход с текущей страницы + Если Направление = 1 Тогда + Действие = ОписаниеШага.ПередДействиемДалее; + + ИначеЕсли Направление = -1 Тогда + Действие = ОписаниеШага.ПередДействиемНазад; + + Иначе + Действие = ОписаниеШага.ПередДействиемОтмена; + + КонецЕсли; + + Если ПустаяСтрока(Действие) Тогда + ЗавершитьШагМастера(Направление); + Иначе + Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); + ВыполнитьОбработкуОповещения(Оповещение, Направление); + КонецЕсли; +КонецПроцедуры + +// Выполняет безусловное позиционирование мастера на страницу +// +// Параметры: +// ИдентификаторШага - Число, Строка, ГруппаФормы - Номер, группа-страница формы или ее имя для перехода +// ИнициироватьСобытия - Булево - Флаг того, что необходимо вызывать события, связанные с активацией шага +// +&НаКлиенте +Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага); + Если СледующийШаг = Неопределено Тогда + Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден шаг помощника %1'"), + ИдентификаторШага + ); + ВызватьИсключение Ошибка; + КонецЕсли; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + + // Останавливаем обработчик, если есть + Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда + ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера"); + КонецЕсли; + + // И запускаем новую страницу + ШагМастераЗавершениеБезусловно(СледующийШаг, ИнициироватьСобытия); +КонецПроцедуры + +// Подтверждает действие шага мастера и вызывает переключение страницы +// +// Параметры: +// ПараметрыШага - Служебный реквизит, полученный в обработчике перед началом действия +// +&НаКлиенте +Процедура ЗавершитьШагМастера(Знач ПараметрыШага) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + СледующийШаг = НастройкиМастера.НомерТекущегоШага + ПараметрыШага; + ПоследнийШаг = НастройкиМастера.Шаги.ВГраница(); + + Если ПараметрыШага = 0 Тогда + // Подтверждение отмены - ничего не делаем + Возврат; + + ИначеЕсли ПараметрыШага = 1 И СледующийШаг > ПоследнийШаг Тогда + // Попытка сделать шаг за пределы вперед + ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); + + ИначеЕсли ПараметрыШага = -1 И СледующийШаг < 0 Тогда + // Попытка сделать шаг за пределы назад + ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); + + КонецЕсли; + + ШагМастераЗавершениеБезусловно(СледующийШаг); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[СледующийШаг]; + ПоследнийШаг = НастройкиМастера.Шаги.ВГраница(); + + // Переключаем на новую страницу + Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница]; + + // Обновляем кнопки + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее); + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад); + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена); + + // Успешно перешли + ЭтотОбъект.НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг; + + Если ИнициироватьСобытия И Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда + // Отрабатываем "ПриАктивации" новой страницы, он же запустит ожидание + ПодключитьОбработчикОжидания("ОбработкаАктивацииСтраницыМастера", 0.1, Истина); + + ИначеЕсли Не ПустаяСтрока(ОписаниеШага.ПриОбработкеОжидания) Тогда + // Запускаем обработчик ожидания, если надо + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", 0.1, Истина); + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСвойстваКнопкиМастера(Знач ИмяКнопки, Знач Описание) + + КнопкаМастера = Элементы[ИмяКнопки]; + ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); + КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаАктивацииСтраницыМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда + Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект); + ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]); + КонецЕсли; + + // И запускаем ожидание, если надо + Если Не ПустаяСтрока(ОписаниеШага.ПриОбработкеОжидания) Тогда + // Первый запуск быстрый + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", 0.1, Истина); + КонецЕсли; +КонецПроцедуры + +// Может быть номер шага или группа-страница, или ее идентификатор +&НаКлиенте +Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + НомерШага = Неопределено; + + ТипПараметра = ТипЗнч(ИдентификаторШага); + Если ТипПараметра = Тип("Число") Тогда + НомерШага = ИдентификаторШага; + Иначе + ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага); + Для НомерШага=0 По НастройкиМастера.Шаги.ВГраница() Цикл + Если НастройкиМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда + НомерШага = НомерШага; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат НомерШага; +КонецФункции + +// Возвращает флаг отмены +&НаКлиенте +Функция ОбработкаОжиданияСтраницыМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + Действие = ОписаниеШага.ПриОбработкеОжидания; + Если ПустаяСтрока(Действие) Тогда + Возврат Ложь; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); + + Прекратить = Ложь; + ВыполнитьОбработкуОповещения(Оповещение, Прекратить); + Продолжать = Не Прекратить; + + Если Продолжать Тогда + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиМастера.ТаймаутОжиданияДлительнойОперации, Истина); + КонецЕсли; + + Возврат Продолжать; +КонецФункции + +// Стартует длительную операцию мастера +// +// Параметры: +// ИмяМетода - Строка - Имя метода для фонового задания +// ПараметрыМетода - Массив - Параметры метода для фонового задания. +// ВозвращаетРезультат - Булево - Флаг необходимости получения результатов. Если установлен в Истина, то +// последним параметром вызова добавляется адрес хранилища для результата +// ОписаниеМетода - Строка - Необязательное описание метода для отображения в списке фоновых заданий +// +&НаСервере +Функция ЗапуститьДлительнуюОперациюМастера(Знач ИмяМетода, Знач ПараметрыМетода, Знач ВозвращаетРезультат = Ложь, Знач ОписаниеМетода = "") + + // Отменяем возможно незавершенное предыдущее + ОтменитьДлительнуюОперациюМастера(); + + Если ВозвращаетРезультат Тогда + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); + ПараметрыФоновогоМетода = Новый Массив(Новый ФиксированныйМассив(ПараметрыМетода)); + ПараметрыФоновогоМетода.Добавить(ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания); + Иначе + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + ПараметрыФоновогоМетода = ПараметрыМетода; + КонецЕсли; + + Задание = ФоновыеЗадания.Выполнить(ИмяМетода, ПараметрыФоновогоМетода, , ОписаниеМетода); + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.УникальныйИдентификатор; +КонецФункции + +// Получает состояние текущей длительной операцию +// +// Возвращаемое значение - Структура - Описание состояния с полями: +// Завершено - Булево - Флаг активности длительной операции +// ИнформацияОбОшибке - ИнформацияОбОшибке - Если операция завершилась аварийно, то содержит информацию почему +// СообщенияПользователю - ФиксированныйМассив - Объекты типа "СообщениеПользователю" +// Результат - Произвольный - Если длительное задание было запущено с флагом возвращения результата, +// то содержит текущее значение результата. +// +&НаСервере +Функция СостояниеДлительнойОперацииМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Данные = Новый Структура("Завершено, Результат, ИнформацияОбОшибке", Истина); + Данные.Вставить("СообщенияПользователю", Новый ФиксированныйМассив(Новый Массив)); + + Если НастройкиМастера.ИдентификаторФоновогоЗадания = Неопределено Тогда + Возврат Данные; + КонецЕсли; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиМастера.ИдентификаторФоновогоЗадания); + Если Задание <> Неопределено Тогда + // Все непонятное - завершено, см значения по умолчанию + Если Задание.ИнформацияОбОшибке <> Неопределено Тогда + Данные.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + КонецЕсли; + Данные.Завершено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно; + Если Данные.Завершено Тогда + // Неперехваченные сообщения фонового задания + НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина); + Если НакопленныеСообщения <> Неопределено Тогда + Данные.СообщенияПользователю = НакопленныеСообщения; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Не ПустаяСтрока(НастройкиМастера.АдресРезультатаФоновогоЗадания) Тогда + Данные.Результат = ПолучитьИзВременногоХранилища(НастройкиМастера.АдресРезультатаФоновогоЗадания); + КонецЕсли; + + Если Данные.Завершено Тогда + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено; + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + КонецЕсли; + + Возврат Данные; +КонецФункции + +// Отменяет текущую длительную операцию +&НаСервере +Процедура ОтменитьДлительнуюОперациюМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если НастройкиМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиМастера.ИдентификаторФоновогоЗадания); + Если Задание <> Неопределено Тогда + Задание.Отменить(); + КонецЕсли; + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено; + КонецЕсли; + + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Form.form b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Form.form new file mode 100644 index 000000000..695cbe39b --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Form.form @@ -0,0 +1,337 @@ + + + + Колонки + 15 + + Предупреждение + 5 + + <key>ru</key> + <value>Предупреждение</value> + + true + true + + true + + + ПредупреждениеExtendedTooltip + 18 + Label + true + true + + Left + + + + ПредупреждениеКонтекстноеМеню + 6 + true + + 5 + true + 2 + true + + + CommonPicture.Предупреждение32 + + + + + Строки + 16 + + ТекстСообщения + 12 + + <key>ru</key> + <value>Текст сообщения</value> + + true + true + + true + + + ТекстСообщенияExtendedTooltip + 20 + Label + true + true + + Left + + + + ТекстСообщенияКонтекстноеМеню + 13 + true + + Label + true + true + + Left + + + + МногострочныйТекстСообщения + 10 + true + true + + true + + + ТекстСообщения + + true + None + + МногострочныйТекстСообщенияExtendedTooltip + 21 + Label + true + true + + Left + + + + МногострочныйТекстСообщенияКонтекстноеМеню + 11 + true + + InputField + true + Enter + true + Left + true + + true + 10 + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Строки</value> + + + ru + Строки + + + СтрокиExtendedTooltip + 19 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Колонки</value> + + + ru + Колонки + + + КолонкиExtendedTooltip + 17 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КоманднаяПанель + 14 + + КомандаОК + 24 + true + true + + true + + true + + КомандаОКРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + Form.Command.КомандаОК + Auto + true + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + ru + Командная панель + + true + true + + КоманднаяПанельExtendedTooltip + 23 + Label + true + true + + Left + + + CommandBar + + Right + + + None + false + + ФормаКоманднаяПанель + -1 + Right + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Help + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + DefaultButton + true + true + Vertical + true + true + UseIfNecessary + auto + true + + ТекстСообщения + 2 + + String + + + + true + + + true + + + + КомандаОК + + <key>ru</key> + <value>ОК</value> + + 1 + + ru + Команда ОК + + + true + + + + КомандаОК + + + Auto + Auto + + + ТекстСообщения + + String + + + true + + + Заголовок + + String + + + + + + + + diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Module.bsl b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Module.bsl new file mode 100644 index 000000000..69acd2c5d --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/МногострочноеПредупреждение/Module.bsl @@ -0,0 +1,41 @@ +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + // Размещение заголовка. + Если Не ПустаяСтрока(Параметры.Заголовок) Тогда + Заголовок = Параметры.Заголовок; + ШиринаЗаголовка = 1.3 * СтрДлина(Заголовок); + Если ШиринаЗаголовка > 40 И ШиринаЗаголовка < 80 Тогда + Ширина = ШиринаЗаголовка; + КонецЕсли; + КонецЕсли; + + // Размещение текста. + Если СтрЧислоСтрок(Параметры.ТекстСообщения) < 15 Тогда + // Можно вывести все строки в виде надписи. + Элементы.ТекстСообщения.Заголовок = Параметры.ТекстСообщения; + Элементы.МногострочныйТекстСообщения.Видимость = Ложь; + Иначе + // Многострочный режим. + Элементы.ТекстСообщения.Видимость = Ложь; + ТекстСообщения = Параметры.ТекстСообщения; + КонецЕсли; + + // Сброс размеров и положения окна этой формы. + КлючСохраненияПоложенияОкна = Новый УникальныйИдентификатор; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура КомандаОК(Команда) + Закрыть(); +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/ConditionalAppearance.dcssca b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/ConditionalAppearance.dcssca new file mode 100644 index 000000000..4bab1ef30 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/ConditionalAppearance.dcssca @@ -0,0 +1,259 @@ + + + + + + МестаИспользованияОсновной + + + + + МестаИспользования.Ссылка + NotEqual + ОсновнойЭлемент + + + + + false + Шрифт + + + + false + Видимость + false + + + Отображать + false + + + + + + + МестаИспользованияСсылка + + + МестаИспользованияКод + + + МестаИспользованияМестИспользования + + + + + МестаИспользования.Ссылка + Equal + ОсновнойЭлемент + + + + + Шрифт + + + + + + + + МестаИспользованияНеИспользуется + + + + + МестаИспользования.МестИспользования + LessOrEqual + 0 + + + + + false + ЦветТекста + #C0C0C0 + + + false + Шрифт + + + + false + Текст + + + ru + Не используется + + + + + Видимость + true + + + Отображать + true + + + + + + + МестаИспользованияНеИспользуется + + + + + МестаИспользования.МестИспользования + Greater + 0 + + + + + false + ЦветТекста + #C0C0C0 + + + false + Шрифт + + + + false + Текст + + + ru + Не используется + + + + + Видимость + false + + + Отображать + false + + + + + + + МестаИспользованияМестИспользования + + + + + МестаИспользования.МестИспользования + LessOrEqual + 0 + + + + + false + ЦветТекста + #C0C0C0 + + + false + Шрифт + + + + false + Текст + + + ru + Не используется + + + + + Видимость + false + + + Отображать + false + + + + + + + НеудачныеЗаменыКод + + + + + НеудачныеЗамены.Код + NotFilled + + + + + Видимость + false + + + false + Отображать + false + + + + + + + МестаИспользованияМестИспользования + + + + + МестаИспользования.МестИспользования + Greater + 0 + + + + + false + ЦветТекста + #C0C0C0 + + + false + Шрифт + + + + false + Текст + + + ru + Не используется + + + + + Видимость + true + + + Отображать + true + + + + diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Form.form b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Form.form new file mode 100644 index 000000000..324a17074 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Form.form @@ -0,0 +1,3002 @@ + + + + <key>ru</key> + <value>Объединение элементов в один</value> + + + ШагиМастера + 70 + + ШагПоискМестИспользования + 72 + + ГруппаДлительнаяОперация1 + 79 + + КартинкаДлительнойОперации1 + 76 + + <key>ru</key> + <value>Картинка длительной операции1</value> + + true + true + + true + + + КартинкаДлительнойОперации1РасширеннаяПодсказка + 78 + Label + true + true + + Left + + + + КартинкаДлительнойОперации1КонтекстноеМеню + 77 + true + + true + true + + + + + + ОписаниеДлительнойОперации1 + 81 + + <key>ru</key> + <value>Подождите пожалуйста. +Выполняется поиск мест использования элементов.</value> + + true + true + + true + + + ОписаниеДлительнойОперации1РасширеннаяПодсказка + 83 + Label + true + true + + Left + + + + ОписаниеДлительнойОперации1КонтекстноеМеню + 82 + true + + Label + true + true + true + + Left + Center + + + true + true + + true + + false + + ГруппаДлительнаяОперация1РасширеннаяПодсказка + 80 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Поиск мест использования</value> + + + ru + Шаг поиск мест использования + + + ШагПоискМестИспользованияРасширеннаяПодсказка + 73 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ШагВыборОсновногоЭлемента + 74 + + КоманднаяПанельВыбораОсновного + 66 + + МестаИспользованияОбъединить + 27 + true + true + + true + + + МестаИспользованияОбъединитьРасширеннаяПодсказка + 28 + Label + true + true + + Left + + + Form.Command.УстановитьОсновным + Normal + Auto + true + true + UserCmds + Auto + + + ОткрытьЭлемент + 152 + true + true + + true + + + ОткрытьЭлементРасширеннаяПодсказка + 153 + Label + true + true + + Left + + + Form.Command.ОткрытьЭлементМестаИспользования + Normal + true + true + UserCmds + Auto + + + Добавить + 180 + true + true + + true + + + ДобавитьРасширеннаяПодсказка + 181 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.Add + Normal + Picture + true + true + UserCmds + Auto + + + Удалить + 182 + true + true + + true + + + УдалитьРасширеннаяПодсказка + 183 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + СортироватьСписокПоВозрастанию + 194 + true + true + + true + + + СортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 195 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + СортироватьСписокПоУбыванию + 196 + true + true + + true + + + СортироватьСписокПоУбываниюРасширеннаяПодсказка + 197 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + InCommandBarAndInAdditionalSubmenu + + + ВсеДействия + 60 + + ФормаВывестиСписок + 62 + true + true + + true + + + ФормаВывестиСписокРасширеннаяПодсказка + 63 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + ИзменитьФорму1 + 68 + true + true + + true + + + ИзменитьФорму1РасширеннаяПодсказка + 69 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Все действия</value> + + + ru + Все действия + + + ВсеДействияРасширеннаяПодсказка + 61 + Label + true + true + + Left + + + + + true + true + + true + + + <key>ru</key> + <value>Командная панель выбора основного элемента</value> + + + ru + Командная панель выбора основного + + + КоманднаяПанельВыбораОсновногоРасширеннаяПодсказка + 67 + Label + true + true + + Left + + + CommandBar + + Left + + + + МестаИспользования + 1 + true + true + + true + + + МестаИспользования + + None + + МестаИспользованияСсылкаОсновной + 17 + + МестаИспользованияОсновной + 109 + true + true + + true + + + МестаИспользования.Пиктограмма + + None + + МестаИспользованияОсновнойРасширеннаяПодсказка + 111 + Label + true + true + + Left + + + + МестаИспользованияОсновнойКонтекстноеМеню + 110 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + StdPicture.MoveRight + + + + 1 + + + + + МестаИспользованияСсылка + 5 + true + true + + true + + + МестаИспользования.Ссылка + + + МестаИспользованияСсылкаРасширеннаяПодсказка + 7 + Label + true + true + + Left + + + + МестаИспользованияСсылкаКонтекстноеМеню + 6 + true + + InputField + true + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + ru + Места использования ссылка основной + + + МестаИспользованияСсылкаОсновнойРасширеннаяПодсказка + 18 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + МестаИспользованияКод + 22 + true + true + + true + + + МестаИспользования.Код + + + МестаИспользованияКодРасширеннаяПодсказка + 24 + Label + true + true + + Left + + + + МестаИспользованияКодКонтекстноеМеню + 23 + true + + InputField + true + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + + МестаИспользованияКоличествоМестИспользования + 189 + + МестаИспользованияМестИспользования + 11 + true + true + + true + + + МестаИспользования.МестИспользования + + + МестаИспользованияМестИспользованияРасширеннаяПодсказка + 13 + Label + true + true + + Left + + + + МестаИспользованияМестИспользованияКонтекстноеМеню + 12 + true + + InputField + true + Left + Auto + true + true + Left + true + Show + Always + + true + true + false + true + true + true + true + + 255 + + Normal + + + + МестаИспользованияНеИспользуется + 191 + true + true + + true + + + МестаИспользования.НеИспользуется + + + МестаИспользованияНеИспользуетсяРасширеннаяПодсказка + 193 + Label + true + true + + Left + + + + МестаИспользованияНеИспользуетсяКонтекстноеМеню + 192 + true + + InputField + Auto + true + Left + true + + true + true + false + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Места использования количество мест использования</value> + + + ru + Места использования количество мест использования + + true + false + + МестаИспользованияКоличествоМестИспользованияРасширеннаяПодсказка + 190 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + + МестаИспользованияКоманднаяПанель + 3 + Left + + + Selection + МестаИспользованияВыбор + + + BeforeAddRow + МестаИспользованияПередНачаломДобавления + + + BeforeDeleteRow + МестаИспользованияПередУдалением + + + ChoiceProcessing + МестаИспользованияОбработкаВыбора + + + МестаИспользованияСтрокаПоиска + 202 + + МестаИспользованияСтрокаПоискаРасширеннаяПодсказка + 204 + Label + true + true + + Left + + + + МестаИспользованияСтрокаПоискаКонтекстноеМеню + 203 + true + + МестаИспользования + + true + + + + МестаИспользованияСостояниеПросмотра + 205 + + МестаИспользованияСостояниеПросмотраРасширеннаяПодсказка + 207 + Label + true + true + + Left + + + + МестаИспользованияСостояниеПросмотраКонтекстноеМеню + 206 + true + + ViewStatusAddition + МестаИспользования + + true + + + + МестаИспользованияУправлениеПоиском + 208 + + МестаИспользованияУправлениеПоискомРасширеннаяПодсказка + 210 + Label + true + true + + Left + + + + МестаИспользованияУправлениеПоискомКонтекстноеМеню + 209 + true + + SearchControlAddition + МестаИспользования + + true + + + + МестаИспользованияРасширеннаяПодсказка + 4 + Label + true + true + + Left + + + + МестаИспользованияКонтекстноеМеню + 2 + + МестаИспользованияКонтекстноеМенюГруппа1 + 158 + + МестаИспользованияКонтекстноеМенюУстановитьОсновным + 154 + true + true + + true + + + МестаИспользованияКонтекстноеМенюУстановитьОсновнымРасширеннаяПодсказка + 155 + Label + true + true + + Left + + + Form.Command.УстановитьОсновным + Normal + Auto + true + true + UserCmds + Auto + + + МестаИспользованияКонтекстноеМенюОткрытьЭлемент + 156 + true + true + + true + + + МестаИспользованияКонтекстноеМенюОткрытьЭлементРасширеннаяПодсказка + 157 + Label + true + true + + Left + + + Form.Command.ОткрытьЭлементМестаИспользования + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + МестаИспользованияКонтекстноеМенюГруппа1РасширеннаяПодсказка + 159 + Label + true + true + + Left + + + + + + МестаИспользованияКонтекстноеМенюДобавить + 160 + true + true + + true + + + МестаИспользованияКонтекстноеМенюДобавитьРасширеннаяПодсказка + 161 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.Add + Normal + Auto + true + true + UserCmds + Auto + + + МестаИспользованияКонтекстноеМенюУдалить + 162 + true + true + + true + + + МестаИспользованияКонтекстноеМенюУдалитьРасширеннаяПодсказка + 163 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.Delete + Normal + Auto + true + true + UserCmds + Auto + + + МестаИспользованияКонтекстноеМенюКопироватьВБуферОбмена + 187 + true + true + + true + + + МестаИспользованияКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + 188 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + + + МестаИспользованияКонтекстноеМенюСортироватьСписокПоВозрастанию + 198 + true + true + + true + + + МестаИспользованияКонтекстноеМенюСортироватьСписокПоВозрастаниюРасширеннаяПодсказка + 199 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.SortListAsc + Normal + Auto + true + true + UserCmds + Auto + + + МестаИспользованияКонтекстноеМенюСортироватьСписокПоУбыванию + 200 + true + true + + true + + + МестаИспользованияКонтекстноеМенюСортироватьСписокПоУбываниюРасширеннаяПодсказка + 201 + Label + true + true + + Left + + + Form.Item.МестаИспользования.StandardCommand.SortListDesc + Normal + Auto + true + true + UserCmds + Auto + + + true + true + 88 + true + true + true +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + true + true + true + true + None + None + None + true + +
                + + ГруппаОтчет + 29 + + Декорация1 + 33 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 35 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 34 + true + + Label + true + true + true + + Left + + + + ВсеМестаИспользования + 31 + true + true + + true + + + ВсеМестаИспользованияРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + Hyperlink + Form.Command.ВсеМестаИспользования + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Группа отчет + + true + + ГруппаОтчетРасширеннаяПодсказка + 30 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаПодсказка + 36 + + ПодсказкаВыбораОсновногоЭлемента + 184 + + <key>ru</key> + <value>Подсказка выбора основного элемента</value> + + true + true + + true + + + ПодсказкаВыбораОсновногоЭлементаРасширеннаяПодсказка + 186 + Label + true + true + + Left + + + + ПодсказкаВыбораОсновногоЭлементаКонтекстноеМеню + 185 + true + + Label + true + 3 + true + + Style.ПоясняющийТекст + + + + URLProcessing + ПодсказкаВыбораОсновногоЭлементаОбработкаНавигационнойСсылки + + Left + Top + + + true + true + + true + + + <key>ru</key> + <value>Группа подсказка</value> + + + ru + Группа подсказка + + + ГруппаПодсказкаРасширеннаяПодсказка + 37 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Выбор основного элемента</value> + + + ru + Шаг выбор основного элемента + + + ШагВыборОсновногоЭлементаРасширеннаяПодсказка + 75 + Label + true + true + + Left + + + Page + + Vertical + auto + +
                + + ШагОбъединение + 87 + + ГруппаДлительнаяОперация2 + 89 + + КартинкаДлительнойОперации2 + 91 + + <key>ru</key> + <value>Картинка длительной операции1</value> + + true + true + + true + + + КартинкаДлительнойОперации2РасширеннаяПодсказка + 93 + Label + true + true + + Left + + + + КартинкаДлительнойОперации2КонтекстноеМеню + 92 + true + + true + true + + + + + + ОписаниеДлительнойОперации2 + 94 + + <key>ru</key> + <value>Подождите пожалуйста. +Выполняется объединение элементов.</value> + + true + true + + true + + + ОписаниеДлительнойОперации2РасширеннаяПодсказка + 96 + Label + true + true + + Left + + + + ОписаниеДлительнойОперации2КонтекстноеМеню + 95 + true + + Label + true + true + true + + Left + Center + + + true + true + + true + + false + + ГруппаДлительнаяОперация2РасширеннаяПодсказка + 90 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Объединение</value> + + + ru + Страница поиск мест использования + + + ШагОбъединениеРасширеннаяПодсказка + 88 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ШагУспешногоЗавершения + 97 + + РезультатОбъединения + 104 + + <key>ru</key> + <value>Результат объединения</value> + + true + true + + true + + + РезультатОбъединенияРасширеннаяПодсказка + 106 + Label + true + true + + Left + + + + РезультатОбъединенияКонтекстноеМеню + 105 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Успешное завершение</value> + + + ru + Страница поиск мест использования + + + ШагУспешногоЗавершенияРасширеннаяПодсказка + 98 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ШагПовторОбъединения + 107 + + РезультатНеудачныеЗамены + 133 + + <key>ru</key> + <value>Результат неудачные замены</value> + + true + true + + true + + + РезультатНеудачныеЗаменыРасширеннаяПодсказка + 135 + Label + true + true + + Left + + + + РезультатНеудачныеЗаменыКонтекстноеМеню + 134 + true + + Label + true + true + + Left + + + + КоманднаяПанельНеудачныеЗамены + 125 + + ОткрытьЭлементНеудачнойЗамены + 164 + true + true + + true + + + ОткрытьЭлементНеудачнойЗаменыРасширеннаяПодсказка + 165 + Label + true + true + + Left + + + Form.Command.ОткрытьЭлементНеудачнойЗамены + Normal + PictureAndText + true + true + UserCmds + Auto + + + РазвернутьВсеНеудачныеЗамены + 129 + true + true + + true + + + РазвернутьВсеНеудачныеЗаменыРасширеннаяПодсказка + 130 + Label + true + true + + Left + + + Form.Command.РазвернутьВсеНеудачныеЗамены + Normal + Auto + true + true + UserCmds + Auto + + + СвернутьВсеНеудачныеЗамены + 131 + true + true + + true + + + СвернутьВсеНеудачныеЗаменыРасширеннаяПодсказка + 132 + Label + true + true + + Left + + + Form.Command.СвернутьВсеНеудачныеЗамены + Normal + Auto + true + true + UserCmds + Auto + + + ВсеДействия2 + 136 + + ВывестиСписок + 138 + true + true + + true + + + ВывестиСписокРасширеннаяПодсказка + 139 + Label + true + true + + Left + + + Form.Item.НеудачныеЗамены.StandardCommand.OutputList + Normal + Auto + true + true + UserCmds + Auto + + + КопироватьВБуферОбмена + 140 + true + true + + true + + + КопироватьВБуферОбменаРасширеннаяПодсказка + 141 + Label + true + true + + Left + + + Form.Item.НеудачныеЗамены.StandardCommand.CopyToClipboard + Normal + Auto + true + true + UserCmds + Auto + InAdditionalSubmenu + + + ИзменитьФорму + 142 + true + true + + true + + + ИзменитьФормуРасширеннаяПодсказка + 143 + Label + true + true + + Left + + + Form.StandardCommand.CustomizeForm + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + ru + Все действия + + + ВсеДействия2РасширеннаяПодсказка + 137 + Label + true + true + + Left + + + + + true + true + + true + + + ru + Командная панель неудачные замены + + + КоманднаяПанельНеудачныеЗаменыРасширеннаяПодсказка + 126 + Label + true + true + + Left + + + CommandBar + + Left + + + + НеудачныеЗамены + 112 + true + true + + true + + + НеудачныеЗамены + + None + + НеудачныеЗаменыДанныеКод + 150 + + НеудачныеЗаменыГруппа1 + 178 + + НеудачныеЗаменыПиктограмма + 175 + true + true + + true + + + НеудачныеЗамены.Пиктограмма + + None + + НеудачныеЗаменыПиктограммаРасширеннаяПодсказка + 177 + Label + true + true + + Left + + + + НеудачныеЗаменыПиктограммаКонтекстноеМеню + 176 + true + + PictureField + Auto + true + Left + true + + true + true + true + true + + CommonPicture.Предупреждение + + + + 1 + + + + + НеудачныеЗаменыДанные + 144 + true + true + + true + + + НеудачныеЗамены.Данные + + + НеудачныеЗаменыДанныеРасширеннаяПодсказка + 146 + Label + true + true + + Left + + + + НеудачныеЗаменыДанныеКонтекстноеМеню + 145 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + НеудачныеЗаменыГруппа1РасширеннаяПодсказка + 179 + Label + true + true + + Left + + + ColumnGroup + + InCell + auto + true + + + + НеудачныеЗаменыКод + 147 + true + true + + true + + + НеудачныеЗамены.Код + + + НеудачныеЗаменыКодРасширеннаяПодсказка + 149 + Label + true + true + + Left + + + + НеудачныеЗаменыКодКонтекстноеМеню + 148 + true + + InputField + Auto + true + Left + true + + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Неудачные замены данные код</value> + + + НеудачныеЗаменыДанныеКодРасширеннаяПодсказка + 151 + Label + true + true + + Left + + + ColumnGroup + + auto + true + + + + НеудачныеЗаменыПричина + 122 + true + true + + true + + + НеудачныеЗамены.Причина + + + НеудачныеЗаменыПричинаРасширеннаяПодсказка + 124 + Label + true + true + + Left + + + + НеудачныеЗаменыПричинаКонтекстноеМеню + 123 + true + + InputField + Auto + true + Left + true + + true + 1 + true + true + true + true + true + Normal + + + None + + НеудачныеЗаменыКоманднаяПанель + 114 + Left + + + Selection + НеудачныеЗаменыВыбор + + + OnActivateRow + НеудачныеЗаменыПриАктивизацииСтроки + + + НеудачныеЗаменыСтрокаПоиска + 224 + + НеудачныеЗаменыСтрокаПоискаРасширеннаяПодсказка + 226 + Label + true + true + + Left + + + + НеудачныеЗаменыСтрокаПоискаКонтекстноеМеню + 225 + true + + НеудачныеЗамены + + true + + + + НеудачныеЗаменыСостояниеПросмотра + 227 + + НеудачныеЗаменыСостояниеПросмотраРасширеннаяПодсказка + 229 + Label + true + true + + Left + + + + НеудачныеЗаменыСостояниеПросмотраКонтекстноеМеню + 228 + true + + ViewStatusAddition + НеудачныеЗамены + + true + + + + НеудачныеЗаменыУправлениеПоиском + 230 + + НеудачныеЗаменыУправлениеПоискомРасширеннаяПодсказка + 232 + Label + true + true + + Left + + + + НеудачныеЗаменыУправлениеПоискомКонтекстноеМеню + 231 + true + + SearchControlAddition + НеудачныеЗамены + + true + + + + НеудачныеЗаменыРасширеннаяПодсказка + 115 + Label + true + true + + Left + + + + НеудачныеЗаменыКонтекстноеМеню + 113 + true + + Tree + true + true + true + true + MultiRow +
                true
                + 1 + 1 + AutoUse + AutoUse + true + true + true + Auto + Auto + ExpandTopLevel + true + true + true + true + None + None + None + true +
                + + РасшифровкаПричиныНеудачи + 172 + true + true + + true + + + РасшифровкаПричиныНеудачи + + + РасшифровкаПричиныНеудачиРасширеннаяПодсказка + 174 + Label + true + true + + Left + + + + РасшифровкаПричиныНеудачиКонтекстноеМеню + 173 + true + + InputField + true + Enter + true + Left + true + + true + true + true + true + true + true + true + Normal + + + true + true + + true + + + <key>ru</key> + <value>Повтор объединения</value> + + + ru + Шаг повтор объединения + + + ШагПовторОбъединенияРасширеннаяПодсказка + 108 + Label + true + true + + Left + + + Page + + Vertical + auto + +
                + true + true + + true + + + <key>ru</key> + <value>Шаги мастера</value> + + + ru + Шаги мастера + + + ШагиМастераРасширеннаяПодсказка + 71 + Label + true + true + + Left + + + Pages + + Auto + +
                + + ПанельДействийМастера + 41 + + ГруппаНазад + 56 + + Назад + 43 + true + true + + true + + + НазадРасширеннаяПодсказка + 44 + Label + true + true + + Left + + + Form.Command.ШагМастераНазад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа назад</value> + + + ru + Группа назад + + + ГруппаНазадРасширеннаяПодсказка + 57 + Label + true + true + + Left + + + CommandBar + + Left + + + + ГруппаВперед + 54 + + Далее + 48 + true + true + + true + + + ДалееРасширеннаяПодсказка + 49 + Label + true + true + + Left + + + Form.Command.ШагМастераДалее + Normal + Auto + true + true + UserCmds + Auto + + + Отмена + 50 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 51 + Label + true + true + + Left + + + Form.Command.ШагМастераОтмена + Normal + Auto + true + true + UserCmds + Auto + + + Справка + 58 + true + true + + true + + + СправкаРасширеннаяПодсказка + 59 + Label + true + true + + Left + + + Form.StandardCommand.Help + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Группа вперед</value> + + + ru + Группа вперед + + true + + ГруппаВпередРасширеннаяПодсказка + 55 + Label + true + true + + Left + + + CommandBar + + Right + + + true + true + + true + + + <key>ru</key> + <value>Панель действий мастера</value> + + + ru + Панель действий мастера + + true + + ПанельДействийМастераРасширеннаяПодсказка + 42 + Label + true + true + + Left + + + UsualGroup + + Auto + NormalSeparation + true + true + Auto + Auto + + + + ФормаКоманднаяПанель + -1 + Left + + + OnOpen + ПриОткрытии + + + BeforeClose + ПередЗакрытием + + + OnCreateAtServer + ПриСозданииНаСервере + + Abort + Cancel + Ignore + No + OK + RestoreValues + Retry + SaveValues + Yes + LockOwner + true + true + Vertical + true + true + true + auto + true + + Объект + + <key>ru</key> + <value>Объект</value> + + 1 + + DataProcessorObject.ЗаменаСсылок + + + true + + + true + +
                true
                +
                + + МестаИспользования + + <key>ru</key> + <value>Места использования</value> + + 2 + + ValueTable + + + true + + + true + + + Ссылка + + <key>ru</key> + <value>Наименование</value> + + 1 + + AnyRef + + + true + + + true + + + + МестИспользования + + <key>ru</key> + <value>Мест использования</value> + + 3 + + Number + + 10 + + + + true + + + true + + + + Код + + <key>ru</key> + <value>Код</value> + + 2 + + String + + + + true + + + true + + + + Пиктограмма + + <key>ru</key> + <value>Пиктограмма</value> + + 4 + + Number + + 10 + + + + true + + + true + + + + НеИспользуется + + <key>ru</key> + <value>Мест использования</value> + + 5 + + String + + + + true + + + true + + + + Владелец + + <key>ru</key> + <value>Владелец</value> + + 6 + + + true + + + true + + + + + НеудачныеЗамены + + <key>ru</key> + <value>Неудачные замены</value> + + 3 + + ValueTree + + + true + + + true + + + Ссылка + + <key>ru</key> + <value>Ссылка</value> + + 1 + + + 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> + + 5 + + String + + + + true + + + true + + + + Пиктограмма + + <key>ru</key> + <value>Пиктограмма</value> + + 6 + + Number + + 10 + + + + true + + + true + + + + + ОсновнойЭлемент + + <key>ru</key> + <value>Основной элемент</value> + + 8 + + AnyRef + + + true + + + true + + + + РасшифровкаПричиныНеудачи + + <key>ru</key> + <value>Расшифровка причины</value> + + 4 + + String + + + + true + + + true + + + + СобытиеОповещенияОЗамене + + <key>ru</key> + <value>Событие оповещения о замене</value> + + 9 + + String + + + + true + + + true + + + + ТекстОшибкиПараметров + + <key>ru</key> + <value>Текст ошибки параметров</value> + + 10 + + String + + + + true + + + true + + + + ТекущийВариантУдаления + + <key>ru</key> + <value>Текущий вариант удаления</value> + + 6 + + String + + + + true + + + true + + + + ЕстьПравоБезвозвратногоУдаления + + <key>ru</key> + <value>Есть право безвозвратного удаления</value> + + 7 + + Boolean + + + true + + + true + + + + ОбщийВладелецЗаменяемыхСсылок + + <key>ru</key> + <value>Общий владелец заменяемых ссылок</value> + + 5 + + + true + + + true + + + + УстановитьОсновным + + <key>ru</key> + <value>Объединить в</value> + + 1 + + ru + Установить выделенный элемент как результат объединения + + + true + + + StdPicture.MoveRight + + + + УстановитьОсновным + + + TextPicture + Auto + Auto + + + ВсеМестаИспользования + + <key>ru</key> + <value>Все места использования</value> + + 2 + + ru + Все места использования + + + true + + + + ВсеМестаИспользования + + + Auto + Auto + + + ШагМастераДалее + + <key>ru</key> + <value>Далее ></value> + + 3 + + ru + Продолжить выполнение + + + true + + + + ШагМастераДалее + + + Auto + Auto + + + ШагМастераНазад + + <key>ru</key> + <value>< Назад</value> + + 4 + + ru + Вернутся на предыдущий шаг + + + true + + + + ШагМастераНазад + + + Auto + Auto + + + ШагМастераОтмена + + <key>ru</key> + <value>Отмена</value> + + 5 + + ru + Прекратить работу мастера + + + true + + + + ШагМастераОтмена + + + Auto + Auto + + + РазвернутьВсеНеудачныеЗамены + + <key>ru</key> + <value>Развернуть все</value> + + 6 + + ru + Развернуть все неудачные замены + + + true + + + StdPicture.ExpandAll + + + + РазвернутьВсеНеудачныеЗамены + + + Auto + Auto + + + СвернутьВсеНеудачныеЗамены + + <key>ru</key> + <value>Свернуть все</value> + + 7 + + ru + Свернуть все неудачные замены + + + true + + + StdPicture.CollapseAll + + + + СвернутьВсеНеудачныеЗамены + + + Auto + Auto + + + ОткрытьЭлементМестаИспользования + + <key>ru</key> + <value>Открыть</value> + + 8 + + ru + Открыть элемент + + + true + + F2 + + StdPicture.Change + + + + ОткрытьЭлементМестаИспользования + + + Auto + Auto + + + ОткрытьЭлементНеудачнойЗамены + + <key>ru</key> + <value>Изменить</value> + + 9 + + ru + Открыть элемент (F2) + + + true + + F2 + + StdPicture.Change + + + + ОткрытьЭлементНеудачнойЗамены + + + Auto + Auto + + + НаборСсылок + + + + Заголовок + + String + + + + + + + + +
                diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Help/ru.html b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Help/ru.html new file mode 100644 index 000000000..eb0fd044a --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Help/ru.html @@ -0,0 +1,5 @@ + +

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

                +

                Если пользователь обладает административными правами, то вместо пометки на удаление он может удалить элементы непосредственно.

                +

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

                +

                 

                \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Items/КартинкаДлительнойОперации1/Picture.gif b/SSL/src/DataProcessors/ЗаменаСсылок/Forms/ОбъединениеЭлементов/Items/КартинкаДлительнойОперации1/Picture.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd636e679ade7283fb7ee14d5ca5858c0da0716e GIT binary patch literal 14354 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Истина Тогда + Оповещение = Новый ОписаниеОповещения("ЗакрытиеФормыЗавершение", ЭтотОбъект); + Отказ = Истина; + + Текст = НСтр("ru = 'Закрыть объединение элементов?'"); + ПоказатьВопрос(Оповещение, Текст, РежимДиалогаВопрос.ДаНет); + КонецЕсли; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура ПодсказкаВыбораОсновногоЭлементаОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Если НавигационнаяСсылка = "ПереключениеРежимаУдаления" Тогда + Если ТекущийВариантУдаления = "Непосредственно" Тогда + ТекущийВариантУдаления = "Пометка" + Иначе + ТекущийВариантУдаления = "Непосредственно" + КонецЕсли; + СформироватьПодсказкуОбъединения(); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ МестаИспользования + +&НаКлиенте +Процедура МестаИспользованияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + Ссылка = МестаИспользования.НайтиПоИдентификатору(ВыбраннаяСтрока).Ссылка; + + Если Поле <> Элементы.МестаИспользованияМестИспользования Тогда + ПоказатьЗначение(, Ссылка); + Возврат; + КонецЕсли; + + НаборСсылок = Новый Массив; + НаборСсылок.Добавить(Ссылка); + + СтандартныеПодсистемыКлиент.ПоказатьМестаИспользования(НаборСсылок); +КонецПроцедуры + +&НаКлиенте +Процедура МестаИспользованияПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; + Если Копирование Тогда + Возврат; + КонецЕсли; + + // Добавляем всегда того же типа, что и основной + ИмяФормыВыбора = ИмяФормыВыбораПоСсылке(ОсновнойЭлемент); + Если Не ПустаяСтрока(ИмяФормыВыбора) Тогда + ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина); + Если ОбщийВладелецЗаменяемыхСсылок <> Неопределено Тогда + ПараметрыФормы.Вставить("Отбор", Новый Структура("Владелец", ОбщийВладелецЗаменяемыхСсылок)); + КонецЕсли; + ОткрытьФорму(ИмяФормыВыбора, ПараметрыФормы, Элемент); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура МестаИспользованияПередУдалением(Элемент, Отказ) + Отказ = Истина; + + ТекущиеДанные = Элемент.ТекущиеДанные; + Если ТекущиеДанные=Неопределено Или МестаИспользования.Количество()<3 Тогда + Возврат; + КонецЕсли; + + Ссылка = ТекущиеДанные.Ссылка; + Код = Строка(ТекущиеДанные.Код); + + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Удалить из списка элементов для объединения ""%1""?'"), + Строка(Ссылка) + ?(ПустаяСтрока(Код), "", " (" + Код + ")" ) + ); + + Оповещение = Новый ОписаниеОповещения("МестаИспользованияПередУдалениемЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ТекущаяСтрока", Элемент.ТекущаяСтрока); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +&НаКлиенте +Процедура МестаИспользованияОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Если ТипЗнч(ВыбранноеЗначение) = Тип("Массив") Тогда + Добавляемые = ВыбранноеЗначение; + Иначе + Добавляемые = Новый Массив; + Добавляемые.Добавить(ВыбранноеЗначение); + КонецЕсли; + + ДобавитьСтрокиМестИспользования(Добавляемые); + СформироватьПодсказкуОбъединения(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ТАБЛИЦЫ ФОРМЫ НеудачныеЗамены + +&НаКлиенте +Процедура НеудачныеЗаменыПриАктивизацииСтроки(Элемент) + ТекущиеДанные = Элемент.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + РасшифровкаПричиныНеудачи = ""; + Иначе + РасшифровкаПричиныНеудачи = ТекущиеДанные.ПодробнаяПричина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НеудачныеЗаменыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + СтандартнаяОбработка = Ложь; + + Ссылка = НеудачныеЗамены.НайтиПоИдентификатору(ВыбраннаяСтрока).Ссылка; + Если Ссылка<>Неопределено Тогда + ПоказатьЗначение(, Ссылка); + КонецЕсли; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ШагМастераНазад(Команда) + ШагМастера("Назад"); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераДалее(Команда) + ШагМастера("Далее"); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераОтмена(Команда) + ШагМастера("Отмена"); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьЭлементМестаИспользования(Команда) + ТекущиеДанные = Элементы.МестаИспользования.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + ПоказатьЗначение(, ТекущиеДанные.Ссылка); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВсеМестаИспользования(Команда) + + Если МестаИспользования.Количество() > 0 Тогда + СтандартныеПодсистемыКлиент.ПоказатьМестаИспользования(МестаИспользования); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьОсновным(Команда) + ТекущиеДанные = Элементы.МестаИспользования.ТекущиеДанные; + Если ТекущиеДанные = Неопределено Тогда + Возврат; + КонецЕсли; + + ОсновнойЭлемент = ТекущиеДанные.Ссылка; + СформироватьПодсказкуОбъединения(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьЭлементНеудачнойЗамены(Команда) + ТекущиеДанные = Элементы.НеудачныеЗамены.ТекущиеДанные; + Если ТекущиеДанные <> Неопределено Тогда + ПоказатьЗначение(, ТекущиеДанные.Ссылка); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура РазвернутьВсеНеудачныеЗамены(Команда) + ДеревоФормы = Элементы.НеудачныеЗамены; + Для Каждого Элемент Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + ДеревоФормы.Развернуть(Элемент.ПолучитьИдентификатор(), Истина); + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура СвернутьВсеНеудачныеЗамены(Команда) + ДеревоФормы = Элементы.НеудачныеЗамены; + Для Каждого Элемент Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + ДеревоФормы.Свернуть(Элемент.ПолучитьИдентификатор()); + КонецЦикла; +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ИнициализироватьОбъединяемыеСсылки(Знач МассивСсылок) + + РезультатПроверки = ПроверитьОбъединяемыеСсылки(МассивСсылок); + ТекстОшибкиПараметров = РезультатПроверки.Ошибка; + Если Не ПустаяСтрока(ТекстОшибкиПараметров) ТОгда + Возврат; + КонецЕсли; + + ОсновнойЭлемент = МассивСсылок[0]; + ОбщийВладелецЗаменяемыхСсылок = РезультатПроверки.ОбщийВладелец; + + МестаИспользования.Очистить(); + Для Каждого Элемент Из МассивСсылок Цикл + МестаИспользования.Добавить().Ссылка = Элемент; + КонецЦикла; +КонецПроцедуры + +&НаСервереБезКонтекста +Функция ПроверитьОбъединяемыеСсылки(Знач НаборСсылок) + + Результат = Новый Структура("Ошибка, ОбщийВладелец"); + + КоличествоСсылок = НаборСсылок.Количество(); + Если КоличествоСсылок < 2 Тогда + Результат.Ошибка = НСтр("ru = 'Для объединения необходимо указать несколько элементов.'"); + Возврат Результат; + КонецЕсли; + + ПервыйЭлемент = НаборСсылок[0]; + + ОсновныеМетаданные = ПервыйЭлемент.Метаданные(); + Характеристики= Новый Структура("Владельцы, Иерархический, ВидИерархии", Новый Массив, Ложь); + ЗаполнитьЗначенияСвойств(Характеристики, ОсновныеМетаданные); + + ЕстьВладельцы = Характеристики.Владельцы.Количество() > 0; + ЕстьГруппы = Характеристики.Иерархический И Характеристики.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов; + + ДополнительныеПоля = ""; + Если ЕстьВладельцы Тогда + ДополнительныеПоля = ДополнительныеПоля + ", Владелец КАК Владелец"; + Иначе + ДополнительныеПоля = ДополнительныеПоля + ", НЕОПРЕДЕЛЕНО КАК Владелец"; + КонецЕсли; + + Если ЕстьГруппы Тогда + ДополнительныеПоля = ДополнительныеПоля + ", ЭтоГруппа КАК ЭтоГруппа"; + Иначе + ДополнительныеПоля = ДополнительныеПоля + ", ЛОЖЬ КАК ЭтоГруппа"; + КонецЕсли; + + ИмяТаблицы = ОсновныеМетаданные.ПолноеИмя(); + Запрос = Новый Запрос(" + |ВЫБРАТЬ Ссылка КАК Ссылка" + ДополнительныеПоля + " ПОМЕСТИТЬ ЗаменяемыеСсылки + |ИЗ " + ИмяТаблицы + " ГДЕ Ссылка В (&НаборСсылок) + |ИНДЕКСИРОВАТЬ ПО Владелец, ЭтоГруппа + |; + |ВЫБРАТЬ + | КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Владелец) КАК КоличествоВладельцев, + | МИНИМУМ(Владелец) КАК ОбщийВладелец, + | МАКСИМУМ(ЭтоГруппа) КАК ЕстьГруппы, + | КОЛИЧЕСТВО(Ссылка) КАК КоличествоСсылок + |ИЗ + | ЗаменяемыеСсылки + |"); + Запрос.УстановитьПараметр("НаборСсылок", НаборСсылок); + + Контроль = Запрос.Выполнить().Выгрузить()[0]; + Если Контроль.ЕстьГруппы Тогда + Результат.Ошибка = НСтр("ru = 'Один из элементов для объединения является группой. + |Группы не могут быть объединены.'"); + ИначеЕсли Контроль.КоличествоВладельцев > 1 Тогда + Результат.Ошибка = НСтр("ru = 'У элементов для объединения различные владельцы. + |Такие элементы не могут быть объединены.'"); + ИначеЕсли Контроль.КоличествоСсылок <> КоличествоСсылок Тогда + Результат.Ошибка = НСтр("ru = 'Все элементы для объединения должны быть одного типа.'"); + Иначе + // Все нормально + Результат.ОбщийВладелец = ?(ЕстьВладельцы, Контроль.ОбщийВладелец, Неопределено); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Общий обработчик подтверждения закрытия +&НаКлиенте +Процедура ЗакрытиеФормыЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса = КодВозвратаДиалога.Да Тогда + ЗавершитьРаботуФормы(); + Иначе + ПодтверждениеЗакрытияФормы = Неопределено; + КонецЕсли; +КонецПроцедуры + +// Обработчик подтверждения удаления строки обрабатываемых ссылок +&НаКлиенте +Процедура МестаИспользованияПередУдалениемЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + // Фактическое удаление из таблицы + Строка = МестаИспользования.НайтиПоИдентификатору(ДополнительныеПараметры.ТекущаяСтрока); + Если Строка = Неопределено Тогда + Возврат; + КонецЕсли; + + ИндексУдаленнойСтроки = МестаИспользования.Индекс(Строка); + ВычислятьОсновной = Строка.Ссылка = ОсновнойЭлемент; + + МестаИспользования.Удалить(Строка); + Если ВычислятьОсновной Тогда + ИндексПоследнейСтроки = МестаИспользования.Количество() - 1; + Если ИндексУдаленнойСтроки <= ИндексПоследнейСтроки Тогда + ИндексОсновнойСтроки = ИндексУдаленнойСтроки; + Иначе + ИндексОсновнойСтроки = ИндексПоследнейСтроки; + КонецЕсли; + + ОсновнойЭлемент = МестаИспользования[ИндексОсновнойСтроки].Ссылка; + КонецЕсли; + + СформироватьПодсказкуОбъединения(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗавершитьРаботуФормы(Знач ТекстВсплывающегоСообщения = Неопределено) + + ОтменитьДлительнуюОперациюМастера(); + + Если ТекстВсплывающегоСообщения <> Неопределено Тогда + ПоказатьОповещениеПользователя( , , ТекстВсплывающегоСообщения, БиблиотекаКартинок.Информация32); + КонецЕсли; + + // Закрываем без дополнительных вопросов + ПодтверждениеЗакрытияФормы = Истина; + Закрыть(); +КонецПроцедуры + +&НаКлиенте +Процедура СформироватьПодсказкуОбъединения() + + Если ЕстьПравоБезвозвратногоУдаления Тогда + Если ТекущийВариантУдаления = "Пометка" Тогда + ТекстСсылки = НСтр("ru = 'помечены на удаление'"); + Иначе + ТекстСсылки = НСтр("ru = 'удалены безвозвратно'"); + КонецЕсли; + + Гиперссылка = ГиперссылкаФорматированнойСтроки(ТекстСсылки, + "ПереключениеРежимаУдаления"); + Иначе + Гиперссылка = НСтр("ru = 'помечены на удаление'"); + КонецЕсли; + + Элементы.ПодсказкаВыбораОсновногоЭлемента.Заголовок = ФорматированнаяСтрока( + НСтр("ru = 'Объединить элементы (%1) в ""%2"". + |Все остальные элементы из списка будут %3 и заменены во всех местах + |использования на ""%2""'"), + МестаИспользования.Количество(), + ОсновнойЭлемент, + Гиперссылка + ); + +КонецПроцедуры + +&НаКлиенте +Функция СформироватьНадписьЗавершения() + + ТекстРезультата = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Элементы (%1) объединены в ""%2""'"), + МестаИспользования.Количество(), + ОсновнойЭлемент + ); + + Элементы.РезультатОбъединения.Заголовок = ТекстРезультата; + + Возврат ТекстРезультата; +КонецФункции + +&НаКлиенте +Процедура СформироватьНадписьНеудачныеЗамены() + + Элементы.РезультатНеудачныеЗамены.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не удалось объединить элементы (%1 из %2). В некоторых местах использования не может быть произведена + |автоматическая замена на ""%3""'"), + НеудачныеЗамены.ПолучитьЭлементы().Количество(), + МестаИспользования.Количество(), + ОсновнойЭлемент + ); + +КонецПроцедуры + +// Параметры: +// СписокДанных - Массив - содержит измененные данные, о типе которых будет оповещено +// +&НаКлиенте +Процедура ОповеститьОбУспешнойЗамене(Знач СписокДанных) + // Изменения объектов, в которых происходили замены + СписокТипов = Новый Соответствие; + Для Каждого Элемент Из СписокДанных Цикл + Тип = ТипЗнч(Элемент); + Если СписокТипов[Тип] = Неопределено Тогда + ОповеститьОбИзменении(Тип); + СписокТипов.Вставить(Тип, Истина); + КонецЕсли; + КонецЦикла; + + // Общее оповещение + Если СписокТипов.Количество()>0 Тогда + Оповестить(СобытиеОповещенияОЗамене, , ЭтотОбъект); + КонецЕСли; +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаСервере +Процедура ЗапуститьЗаполнениеМестИспользования() + + ПолноеИмяМетода = "ОбщегоНазначения.ФоновыйРасчетКоличестваВхождений"; + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить( МассивСсылокИзНабора(МестаИспользования) ); + + ЗапуститьДлительнуюОперациюМастера(ПолноеИмяМетода, ПараметрыМетода, Истина); +КонецПроцедуры + +&НаСервере +Функция ПроверитьСостояниеИОбработатьЗаполнениеМестИспользования(); + СостояниеОперации = СостояниеДлительнойОперацииМастера(); + + Если СостояниеОперации.Завершено И СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда + ЗаполнитьМестаИспользования(СостояниеОперации.Результат); + КонецЕсли; + + // Результат всегда обработан, клиенту можно не возвращать + СостояниеОперации.Результат = Неопределено; + + Возврат СостояниеОперации; +КонецФункции + +&НаСервере +Процедура ЗаполнитьМестаИспользования(Знач ТаблицаИспользования) + + НовыеМестаИспользования = МестаИспользования.Выгрузить(); + НовыеМестаИспользования.Индексы.Добавить("Ссылка"); + + ЭтоОбновление = НовыеМестаИспользования.Найти(ОсновнойЭлемент, "Ссылка") <> Неопределено; + + Если Не ЭтоОбновление Тогда + НовыеМестаИспользования = МестаИспользования.Выгрузить(Новый Массив); + НовыеМестаИспользования.Индексы.Добавить("Ссылка"); + КонецЕсли; + + КэшМетаданных = Новый Соответствие; + + МаксСсылка = Неопределено; + МаксМест = -1; + Для Каждого Строка Из ТаблицаИспользования Цикл + Ссылка = Строка.Ссылка; + + СтрокаИспользования = НовыеМестаИспользования.Найти(Ссылка, "Ссылка"); + Если СтрокаИспользования = Неопределено Тогда + СтрокаИспользования = НовыеМестаИспользования.Добавить(); + СтрокаИспользования.Ссылка = Ссылка; + КонецЕсли; + + Мест = Строка.Вхождения; + Если Мест>МаксМест Тогда + МаксСсылка = Ссылка; + МаксМест = Мест; + КонецЕсли; + + СтрокаИспользования.МестИспользования = Мест; + СтрокаИспользования.Код = ВозможныйКодСсылки(Ссылка, КэшМетаданных); + СтрокаИспользования.Владелец = ВозможныйВладелецСсылки(Ссылка, КэшМетаданных); + + СтрокаИспользования.НеИспользуется = ?(Мест = 0, НСтр("ru = 'Не используется'"), ""); + КонецЦикла; + + МестаИспользования.Загрузить(НовыеМестаИспользования); + + Если ЭтоОбновление Тогда + Если НовыеМестаИспользования.Найти(ОсновнойЭлемент, "Ссылка") = Неопределено Тогда + ОсновнойЭлемент = МаксСсылка; + КонецЕсли; + Иначе + ОсновнойЭлемент = МаксСсылка; + КонецЕсли; + + // Обновляем заголовки + Представление = ?(ОсновнойЭлемент=Неопределено, "", ОсновнойЭлемент.Метаданные().Представление()); + + ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Объединение элементов %1 в один'"), + Представление + ); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаСервере +Процедура ЗапуститьЗаменуСсылок() + + ПолноеИмяМетода = "ОбщегоНазначения.ЗаменитьСсылки"; + ПараметрыМетода = Новый Массив; + + ПарыЗамен = Новый Соответствие; + Для Каждого Строка Из МестаИспользования Цикл + ПарыЗамен.Вставить(Строка.Ссылка, ОсновнойЭлемент); + КонецЦикла; + ПараметрыМетода.Добавить(ПарыЗамен); + + ПараметрыЗамены = Новый Структура; + ПараметрыЗамены.Вставить("СпособУдаления", ТекущийВариантУдаления); + ПараметрыЗамены.Вставить("ВключатьБизнесЛогику", Истина); + + ПараметрыМетода.Добавить(ПараметрыЗамены); + + ЗапуститьДлительнуюОперациюМастера(ПолноеИмяМетода, ПараметрыМетода, Истина); +КонецПроцедуры + +&НаСервере +Функция ПроверитьСостояниеИОбработатьЗаменуСсылок() + СостояниеОперации = СостояниеДлительнойОперацииМастера(); + + Если Не СостояниеОперации.Завершено Тогда + // Клиенту пока можно ничего не говорить + СостояниеОперации.Результат = Неопределено; + + ИначеЕсли СостояниеОперации.ИнформацияОбОшибке <> Неопределено Тогда + // Завершено c ошибками + СостояниеОперации.Результат = Неопределено; + + ИначеЕсли СостояниеОперации.Завершено И СостояниеОперации.Результат <> Неопределено Тогда + // Перекладываем все ошибки в НеудачныеЗамены, получаем флаг их наличия + СостояниеОперации.Результат = Не ЗаполнитьНеудачныеЗамены(СостояниеОперации.Результат); + + КонецЕсли; + + Возврат СостояниеОперации; +КонецФункции + +&НаСервере +Функция ЗаполнитьНеудачныеЗамены(Знач РезультатыЗамены) + // РезультатыЗамены - таблица с колонками Ссылка, ОбъектОшибки, ТипОшибки, ТекстОшибки + КорневыеСтроки = НеудачныеЗамены.ПолучитьЭлементы(); + КорневыеСтроки.Очистить(); + + СоответствиеСтрок = Новый Соответствие; + КэшМетаданных = Новый Соответствие; + + Для Каждого СтрокаРезультата Из РезультатыЗамены Цикл + Ссылка = СтрокаРезультата.Ссылка; + + ОшибкиПоСсылке = СоответствиеСтрок[Ссылка]; + Если ОшибкиПоСсылке = Неопределено Тогда + СтрокаДерева = КорневыеСтроки.Добавить(); + СтрокаДерева.Ссылка = Ссылка; + СтрокаДерева.Данные = Строка(Ссылка); + СтрокаДерева.Код = Строка( ВозможныйКодСсылки(Ссылка, КэшМетаданных) ); + СтрокаДерева.Пиктограмма = -1; + + ОшибкиПоСсылке = СтрокаДерева.ПолучитьЭлементы(); + СоответствиеСтрок.Вставить(Ссылка, ОшибкиПоСсылке); + КонецЕсли; + + СтрокаОшибки = ОшибкиПоСсылке.Добавить(); + СтрокаОшибки.Ссылка = СтрокаРезультата.ОбъектОшибки; + СтрокаОшибки.Данные = СтрокаРезультата.ПредставлениеОбъектаОшибки; + + ТипОшибки = СтрокаРезультата.ТипОшибки; + Если ТипОшибки = "НеизвестныеДанные" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Обнаружена данные, обработка которых не планировалась.'"); + + ИначеЕсли ТипОшибки = "ОшибкаБлокировки" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Данные заблокированы другим пользователем.'"); + + ИначеЕсли ТипОшибки = "ДанныеИзменены" Тогда + СтрокаОшибки.Причина = НСтр("ru = 'Данные изменены другим пользователем.'"); + + ИначеЕсли ТипОшибки = "ОшибкаЗаписи" Тогда + СтрокаОшибки.Причина = СтрокаРезультата.ТекстОшибки; + + Иначе + СтрокаОшибки.Причина = НСтр("ru = 'Неизвестная ошибка.'"); + + КонецЕсли; + + СтрокаОшибки.ПодробнаяПричина = СтрокаРезультата.ТекстОшибки; + КонецЦикла; // результаты замены + + Возврат КорневыеСтроки.Количество() > 0; +КонецФункции + +// --------------------------------------------------------------------------------------------------------------------- + +&НаСервереБезКонтекста +Функция ИмяФормыВыбораПоСсылке(Знач Ссылка) + Мета = Метаданные.НайтиПоТипу(ТипЗнч(Ссылка)); + Возврат ?(Мета = Неопределено, Неопределено, Мета.ПолноеИмя() + ".ФормаВыбора"); +КонецФункции + +// Преобразует массив, список значений или коллекцию в массив +&НаСервереБезКонтекста +Функция МассивСсылокИзНабора(Знач Ссылки) + + ТипПараметра = ТипЗнч(Ссылки); + Если Ссылки = Неопределено Тогда + МассивСсылок = Новый Массив; + + ИначеЕсли ТипПараметра = Тип("СписокЗначений") Тогда + МассивСсылок = Ссылки.ВыгрузитьЗначения(); + + ИначеЕсли ТипПараметра = Тип("Массив") Тогда + МассивСсылок = Ссылки; + + Иначе + МассивСсылок = Новый Массив; + Для Каждого Элемент Из Ссылки Цикл + МассивСсылок.Добавить(Элемент.Ссылка); + КонецЦикла; + + КонецЕсли; + + Возврат МассивСсылок; +КонецФункции + +// Добавляет массив ссылок +&НаСервере +Процедура ДобавитьСтрокиМестИспользования(Знач МассивСсылок) + ИндексПоследнего = Неопределено; + КэшМетаданных = Новый Соответствие; + + Фильтр = Новый Структура("Ссылка"); + Для Каждого Ссылка Из МассивСсылок Цикл + Фильтр.Ссылка = Ссылка; + СуществующиеСтроки = МестаИспользования.НайтиСтроки(Фильтр); + Если СуществующиеСтроки.Количество() = 0 Тогда + Строка = МестаИспользования.Добавить(); + Строка.Ссылка = Ссылка; + + Строка.Код = ВозможныйКодСсылки(Ссылка, КэшМетаданных); + Строка.Владелец = ВозможныйВладелецСсылки(Ссылка, КэшМетаданных); + + Строка.МестИспользования = -1; + Строка.НеИспользуется = НСтр("ru = 'Не рассчитано'"); + Иначе + Строка = СуществующиеСтроки[0]; + КонецЕсли; + + ИндексПоследнего = Строка.ПолучитьИдентификатор(); + КонецЦикла; + + Если ИндексПоследнего <> Неопределено Тогда + Элементы.МестаИспользования.ТекущаяСтрока = ИндексПоследнего; + КонецЕсли; +КонецПроцедуры + +// Возвращает код справочника и т.п. если он есть по метаданным, Неопределено, если кода нет +&НаСервереБезКонтекста +Функция ВозможныйКодСсылки(Знач Ссылка, КэшМетаданных) + Данные = ОписаниеМетаПоСсылке(Ссылка, КэшМетаданных); + Возврат ?(Данные.ЕстьКод, Ссылка.Код, Неопределено); +КонецФункции + +// Возвращает владельца справочника и т.п. если он есть по метаданным, Неопределено, если владельца нет +&НаСервереБезКонтекста +Функция ВозможныйВладелецСсылки(Знач Ссылка, КэшМетаданных) + Данные = ОписаниеМетаПоСсылке(Ссылка, КэшМетаданных); + Возврат ?(Данные.ЕстьВладелец, Ссылка.Владелец, Неопределено); +КонецФункции + +// Возвращает описание справочника и т.п. по метаданным +&НаСервереБезКонтекста +Функция ОписаниеМетаПоСсылке(Знач Ссылка, КэшМетаданных) + + Мета = Ссылка.Метаданные(); + Данные = КэшМетаданных[Мета]; + + Если Данные = Неопределено Тогда + Тест = Новый Структура("ДлинаКода, Владельцы", 0, Новый Массив); + ЗаполнитьЗначенияСвойств(Тест, Мета); + + Данные = Новый Структура; + Данные.Вставить("ЕстьКод", Тест.ДлинаКода > 0); + Данные.Вставить("ЕстьВладелец", Тест.Владельцы.Количество() > 0); + + КэшМетаданных[Мета] = Данные; + КонецЕсли; + + Возврат Данные; +КонецФункции + +// Возвращает список успешно замененных ссылок, тех которых нет в НеудачныеЗамены +&НаКлиенте +Функция УдалитьИзМестИспользованияОбработанные() + Результат = Новый Массив; + + Неудачные = Новый Соответствие; + Для Каждого Строка Из НеудачныеЗамены.ПолучитьЭлементы() Цикл + Неудачные.Вставить(Строка.Ссылка, Истина); + КонецЦикла; + + Индекс = МестаИспользования.Количество() - 1; + Пока Индекс > 0 Цикл + Ссылка = МестаИспользования[Индекс].Ссылка; + Если Ссылка<>ОсновнойЭлемент И Неудачные[Ссылка] = Неопределено Тогда + МестаИспользования.Удалить(Индекс); + Результат.Добавить(Ссылка); + КонецЕсли; + Индекс = Индекс - 1; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Проверяем возможность замены с прикладной точки зрения +&НаСервере +Функция ТекстОшибкиВозможностиЗаменыСсылок() + + НаборСсылок = Новый Массив; + ПарыЗамен = Новый Соответствие; + Для Каждого Строка Из МестаИспользования Цикл + НаборСсылок.Добавить(Строка.Ссылка); + ПарыЗамен.Вставить(Строка.Ссылка, ОсновнойЭлемент); + КонецЦикла; + + // Проверим еще раз возможно измененный набор. + Контроль = ПроверитьОбъединяемыеСсылки(НаборСсылок); + Если Не ПустаяСтрока(Контроль.Ошибка) Тогда + Возврат Контроль.Ошибка; + КонецЕсли; + + // Прикладная проверка, если она определена + + // Вычисляем из ссылки менеджер объекта + МодульМенеджера = ОбщегоНазначения.МенеджерОбъектаПоСсылке(ОсновнойЭлемент); + + // Проверяем присутствие метода в менеджере + ТестовыйОбъект = ОсновнойЭлемент.ПолучитьОбъект(); + Попытка + // Тестовым обработчиком должно быть событие, у которого на один параметр меньше, чем у тестируемого метода + // (первым параметром передается сам объект). Например ПриЗаписи имеет один параметр, тогда у обработчик должно быть два + ДобавитьОбработчик ТестовыйОбъект.ПриЗаписи, МодульМенеджера.ВозможностьЗаменыЭлементов; + ЕстьМетод = Истина; + Исключение + ЕстьМетод = Ложь; + КонецПопытки; + + Результат = ""; + + Если ЕстьМетод Тогда + ПараметрыЗамены = Новый Структура("СпособУдаления", ТекущийВариантУдаления); + Ошибки = МодульМенеджера.ВозможностьЗаменыЭлементов(ПарыЗамен, ПараметрыЗамены); + Для Каждого КлючЗначение Из Ошибки Цикл + Результат = Результат + Символы.ПС + КлючЗначение.Значение; + КонецЦикла; + КонецЕсли; + + Возврат СокрЛП(Результат); + +КонецФункции + +// --------------------------------------------------------------------------------------------------------------------- +// Общий обработчик немодального продолжения отмены с закрытием +&НаКлиенте +Процедура ЗавершениеОтменыИЗакрытиеФормы(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + // Подтверждаем продолжение процесса + ЗавершитьШагМастера(ДополнительныеПараметры.ПараметрыШага); + Возврат; + КонецЕсли; + + ЗавершитьРаботуФормы(); +КонецПроцедуры + +// Аналог ПодставитьПараметрыВСтроку для работы с форматированной строкой +Функция ФорматированнаяСтрока(Знач Шаблон, + Знач П1 = Неопределено, Знач П2 = Неопределено, Знач П3 = Неопределено, Знач П4 = Неопределено, Знач П5 = Неопределено, + Знач П6 = Неопределено, Знач П7 = Неопределено, Знач П8 = Неопределено, Знач П9 = Неопределено +) + + ЧастиСтроки = Новый Массив; + ДопустимыеТипы = Новый ОписаниеТипов("Строка, ФорматированнаяСтрока, Картинка"); + + Начало = 1; + Пока Истина Цикл + Фрагмент = Сред(Шаблон, Начало); + + Позиция = Найти(Фрагмент, "%"); + Если Позиция = 0 Тогда + ЧастиСтроки.Добавить(Фрагмент); + Прервать; + КонецЕсли; + + Следующий = Сред(Фрагмент, Позиция + 1, 1); + + Если Следующий = "1" Тогда + Значение = П1; + + ИначеЕсли Следующий = "2" Тогда + Значение = П2; + + ИначеЕсли Следующий = "3" Тогда + Значение = П3; + + ИначеЕсли Следующий = "4" Тогда + Значение = П4; + + ИначеЕсли Следующий = "5" Тогда + Значение = П5; + + ИначеЕсли Следующий = "6" Тогда + Значение = П6; + + ИначеЕсли Следующий = "7" Тогда + Значение = П7; + + ИначеЕсли Следующий = "8" Тогда + Значение = П8; + + ИначеЕсли Следующий = "9" Тогда + Значение = П9; + + ИначеЕсли Следующий = "%" Тогда + Значение = "%"; + + Иначе + Значение = Неопределено; + Позиция = Позиция - 1; + + КонецЕсли; + + ЧастиСтроки.Добавить(Лев(Фрагмент, Позиция - 1)); + + Если Значение <> Неопределено Тогда + Значение = ДопустимыеТипы.ПривестиЗначение(Значение); + Если Значение <> Неопределено Тогда + ЧастиСтроки.Добавить( Значение ); + КонецЕсли; + КонецЕсли; + + Начало = Начало + Позиция + 1; + КонецЦикла; + + Возврат Новый ФорматированнаяСтрока(ЧастиСтроки); +КонецФункции + +Функция ГиперссылкаФорматированнойСтроки(Знач Текст, Знач Идентификатор = Неопределено) + + Возврат Новый ФорматированнаяСтрока(Текст, , , , Идентификатор); + +КонецФункции + +// --------------------------------------------------------------------------------------------------------------------- +// Работа с мастером + +&НаСервере +Процедура ИнициализироватьСценарийМастера() + + // 0. Поиск мест использования по параметрам + ДобавитьШагМастера(Элементы.ШагПоискМестИспользования, + ДействиеШагаМастера("ПриАктивации", "ШагПоискМестИспользованияПриАктивации", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагПоискМестИспользованияПередДействиемОтмена", + ДействиеШагаМастера("ПриОбработкеОжидания", "ШагПоискМестИспользованияПриОбработкеОжидания", + ))), + КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Прервать'"), НСтр("ru = 'Отказаться от объединения элементов'"), + ))) + ); + + // 1. Выбор основного элемента + ДобавитьШагМастера(Элементы.ШагВыборОсновногоЭлемента, + ДействиеШагаМастера("ПриАктивации", "ШагВыборОсновногоЭлементаПриАктивации", + ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборОсновногоЭлементаПередДействиемДалее", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборОсновногоЭлементаПередДействиемОтмена", + ))), + КнопкаШагаМастера("Далее", НСтр("ru = 'Объединить'") + " >", НСтр("ru = 'Начать объединение элементов'"), Истина, Истина, Истина, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Отмена'"), НСтр("ru = 'Отказаться от объединения элементов'"), + ))) + ); + + // 2. Ожидание процесса + ДобавитьШагМастера(Элементы.ШагОбъединение, + ДействиеШагаМастера("ПриАктивации", "ШагОбъединениеПриАктивации", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагОбъединениеПередДействиемОтмена", + ДействиеШагаМастера("ПриОбработкеОжидания", "ШагОбъединениеПриОбработкеОжидания", + ))), + КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Прервать'"), НСтр("ru = 'Прервать объединение элементов'"), + ))) + ); + + // 3. Успешное объединение + ДобавитьШагМастера(Элементы.ШагУспешногоЗавершения, + ДействиеШагаМастера("ПриАктивации", "ШагУспешногоЗавершенияПриАктивации", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагУспешногоЗавершенияПередДействиемОтмена", + )), + КнопкаШагаМастера("Далее", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Назад", "", "", Ложь, Ложь, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты объединения'"), Истина, Истина, Истина, + ))) + ); + + // 4. Ошибки замены ссылок + ДобавитьШагМастера(Элементы.ШагПовторОбъединения, + ДействиеШагаМастера("ПриАктивации", "ШагПовторОбъединенияПриАктивации", + ДействиеШагаМастера("ПередДействиемДалее", "ШагПовторОбъединенияПередДействиемДалее", + ДействиеШагаМастера("ПередДействиемНазад", "ШагПовторОбъединенияПередДействиемНазад", + ДействиеШагаМастера("ПередДействиемОтмена", "ШагПовторОбъединенияПередДействиемОтмена", + )))), + КнопкаШагаМастера("Далее", НСтр("ru = 'Повторить объединение'") + " >", НСтр("ru = 'Повторить объединение'"), Истина, Истина, Истина, + КнопкаШагаМастера("Назад", "< " + НСтр("ru = 'Назад'"), НСтр("ru = 'Вернутся к выбору основного элемента'"), Истина, Истина, Ложь, + КнопкаШагаМастера("Отмена", НСтр("ru = 'Закрыть'"), НСтр("ru = 'Закрыть результаты объединения'"), + ))) + ); + + // Вариант завершения работы - или демонстрацией страницы или всплывающим сообщением и закрытием + УстановитьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном", Истина); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагПоискМестИспользованияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Стартуем длительную обработку + ЗапуститьЗаполнениеМестИспользования(); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПоискМестИспользованияПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт + // Ожидаем завершения поиска ссылок + СостояниеОперации = ПроверитьСостояниеИОбработатьЗаполнениеМестИспользования(); + + Если СостояниеОперации.Завершено Тогда + Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда + // Успешно выполнено, идем дальше + ШагМастера("Далее"); + Иначе + Прекратить = Истина; + ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагПоискМестИспользованияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + + // Запрос подтверждения на отмену + ТекстВопроса = НСтр("ru = 'Прервать поиск мест использования и закрыть?'"); + Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + + ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагВыборОсновногоЭлементаПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + + СформироватьПодсказкуОбъединения(); + +КонецПроцедуры + +&НаКлиенте +Процедура ШагВыборОсновногоЭлементаПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + + // Проверка на допустимость объединения с прикладной точки зрения + ТекстОшибки = ТекстОшибкиВозможностиЗаменыСсылок(); + + Если ПустаяСтрока(ТекстОшибки) Тогда + // Все замены допустимы + ЗавершитьШагМастера(ПараметрыШага); + Возврат; + КонецЕсли; + + ПараметрыПредупреждения = Новый Структура; + ПараметрыПредупреждения.Вставить("Заголовок", НСтр("ru = 'Невозможно объединить элементы'")); + ПараметрыПредупреждения.Вставить("ТекстСообщения", ТекстОшибки); + ОткрытьФорму("Обработка.ЗаменаСсылок.Форма.МногострочноеПредупреждение", ПараметрыПредупреждения, ЭтотОбъект); + Возврат; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагВыборОсновногоЭлементаПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Запрос подтверждения на отмену + ТекстВопроса = НСтр("ru = 'Отменить объединение элементов и закрыть?'"); + Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + + ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагОбъединениеПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Стартуем длительную обработку по замене + ЗапуститьЗаменуСсылок(); +КонецПроцедуры + +&НаКлиенте +Процедура ШагОбъединениеПриОбработкеОжидания(Прекратить, Знач ДополнительныеПараметры) Экспорт + // Ожидаем завершения замены ссылок + СостояниеОперации = ПроверитьСостояниеИОбработатьЗаменуСсылок(); + + Если Не СостояниеОперации.Завершено Тогда + Возврат; + КонецЕсли; + + Если СостояниеОперации.ИнформацияОбОшибке = Неопределено Тогда + // Выполнено успешно + Если СостояниеОперации.Результат = Истина Тогда + // Успешно заменили все элементы + Если Истина = ПрочитатьПараметрПользователяМастера(ЭтотОбъект, "СообщатьОбУспехеВсплывающимОкном") Тогда + ЗавершитьРаботуФормы( СформироватьНадписьЗавершения() ); + Иначе + // Переходим на страницу завершения + ШагМастера("Далее"); + КонецЕсли; + + Иначе + // Остались необработанные, переходим на попытку повтора + ПерейтиНаШагМастера(Элементы.ШагПовторОбъединения, Истина); + КонецЕсли + Иначе + // Фоновое задание завершилось с ошибкой + Прекратить = Истина; + ПоказатьПредупреждение(, СостояниеОперации.ИнформацияОбОшибке); + ПерейтиНаШагМастера(Элементы.ШагВыборОсновногоЭлемента); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ШагОбъединениеПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Запрос подтверждения на отмену + ТекстВопроса = НСтр("ru = 'Прервать процесс объединения и закрыть?'"); + Описание = Новый ОписаниеОповещения("ЗавершениеОтменыИЗакрытиеФормы", ЭтотОбъект, Новый Структура); + Описание.ДополнительныеПараметры.Вставить("ПараметрыШага", ПараметрыШага); + + ПоказатьВопрос(Описание, ТекстВопроса, РежимДиалогаВопрос.ДаНет); +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагУспешногоЗавершенияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Обновляем надпись + СформироватьНадписьЗавершения(); + + // Оповещаем о успешной замене + СписокОбновленного = Новый Массив; + Для Каждого Строка Из МестаИспользования Цикл + СписокОбновленного.Добавить(Строка.Ссылка); + КонецЦикла; + ОповеститьОбУспешнойЗамене(СписокОбновленного); +КонецПроцедуры + +&НаКлиенте +Процедура ШагУспешногоЗавершенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + + // Это выход. Закрываем форму принудительно + ЗавершитьРаботуФормы(); + +КонецПроцедуры + +// --------------------------------------------------------------------------------------------------------------------- +&НаКлиенте +Процедура ШагПовторОбъединенияПриАктивации(Знач Страница, Знач ДополнительныеПараметры) Экспорт + // Обновляем количества неудач + СформироватьНадписьНеудачныеЗамены(); + + // Оповещаем об успешной частичной замене + СписокОбновленного = УдалитьИзМестИспользованияОбработанные(); // Заодно и удаляем из списка вариантов + ОповеститьОбУспешнойЗамене(СписокОбновленного); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторОбъединенияПередДействиемДалее(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Повтор замены + ПерейтиНаШагМастера(Элементы.ШагОбъединение, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторОбъединенияПередДействиемНазад(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Перезаполняем список обрабатываемых + ПерейтиНаШагМастера(Элементы.ШагПоискМестИспользования, Истина); +КонецПроцедуры + +&НаКлиенте +Процедура ШагПовторОбъединенияПередДействиемОтмена(Знач ПараметрыШага, Знач ДополнительныеПараметры) Экспорт + // Это выход. Закрываем форму принудительно + ЗавершитьРаботуФормы(); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ПРОЦЕДУРЫ И ФУНКЦИИ ПОШАГОВОГО ПОМОЩНИКА + +// Для встраивания функционала мастера необходимо: +// +// 1) Нарисовать на форме группу, содержащую страницы помощника +// 2) Определить на форме три команды для действий "Далее", "Назад", "Отмена". Определить им обработчики как: +// +// &НаКлиенте +// Процедура ШагМастераНазад(Команда) +// ШагМастера("Назад"); +// КонецПроцедуры +// +// &НаКлиенте +// Процедура ШагМастераДалее(Команда) +// ШагМастера("Далее"); +// КонецПроцедуры +// +// &НаКлиенте +// Процедура ШагМастераОтмена(Команда) +// ШагМастера("Отмена"); +// КонецПроцедуры +// +// 3) Добавить блок методов пошагового помощника +// +// 4) В коде на сервере: +// - Инициализировать структуры помощника вызовом "ИнициализироватьМастера", передав туда соответствующие +// элементы формы +// +// - Создать сценарий работы последовательным вызовами "ДобавитьШагМастера". Рекомендуется использовать +// вспомогательные функции "ДействиеШагаМастера" и "КнопкаШагаМастера". Например: +// +// ДобавитьШагМастера(Элементы.ШагВыборЦелевогоЭлемента, +// ДействиеШагаМастера("ПриАктивации", "ШагВыборЦелевогоЭлементаПриАктивации", +// ДействиеШагаМастера("ПередДействиемДалее", "ШагВыборЦелевогоЭлементаПередДействиемДалее", +// ДействиеШагаМастера("ПередДействиемОтмена", "ШагВыборЦелевогоЭлементаПередДействиемОтмена", +// ))), +// КнопкаШагаМастера("Далее", НСтр("ru = 'Заменить'") + " >", Истина, Истина, Истина, +// КнопкаШагаМастера("Назад", "", Ложь, Ложь, Ложь, +// КнопкаШагаМастера("Отмена", НСтр("ru = 'Отмена'") +// ))) +// ); +// +// 5) В коде на клиенте (обычно при открытии): +// - Указать начальную страницу мастера при помощи вызова "УстановитьНачальнуюСтраницуМастера" +// - Запустить начальную страницу вызовом "ЗапуститьРаботуМастера" +// + +// Инициализирует структуры мастера. +// +// Параметры: +// ГруппаСтраниц - ГруппаФормы - Элемент формы, группа типа "страницы", содержащая в себе страницы-шаги мастера +// КнопкаДалее - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Далее" +// КнопкаНазад - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Назад" +// КнопкаОтмена - КнопкаФормы, КнопкаКоманднойПанели - Элемент формы, используемый для кнопки "Отмена" +// +&НаСервере +Процедура ИнициализироватьМастера(Знач ГруппаСтраниц, Знач КнопкаДалее, Знач КнопкаНазад, Знач КнопкаОтмена) + НастройкиМастера = Новый Структура; + + НастройкиМастера.Вставить("Шаги", Новый Массив); + НастройкиМастера.Вставить("НомерТекущегоШага", 0); + НастройкиМастера.Вставить("СтраницаСтарта", Неопределено); + + // Идентификаторы частей интерфейса + НастройкиМастера.Вставить("ГруппаСтраниц", ГруппаСтраниц.Имя); + НастройкиМастера.Вставить("КнопкаДалее", КнопкаДалее.Имя); + НастройкиМастера.Вставить("КнопкаНазад", КнопкаНазад.Имя); + НастройкиМастера.Вставить("КнопкаОтмена", КнопкаОтмена.Имя); + + // Таймаут вызова обработчика + НастройкиМастера.Вставить("ТаймаутОжиданияДлительнойОперации", + ?( ПолучитьСкоростьКлиентскогоСоединения() = СкоростьКлиентскогоСоединения.Низкая, 5, 3) ); + + // Для обработки длительных операций + НастройкиМастера.Вставить("ИдентификаторФоновогоЗадания"); + НастройкиМастера.Вставить("АдресРезультатаФоновогоЗадания"); + + // Для хранения пользовательских параметров + НастройкиМастера.Вставить("ПользовательскиеПараметры", Новый Соответствие); + + ДобавляемыеРеквизиты = Новый Массив; + ДобавляемыеРеквизиты.Добавить( Новый РеквизитФормы("НастройкиПошаговогоМастера", Новый ОписаниеТипов) ); + ИзменитьРеквизиты(ДобавляемыеРеквизиты); + + ЭтотОбъект.НастройкиПошаговогоМастера = НастройкиМастера; +КонецПроцедуры + +// Добавляет шаг мастера. Переходы между страницами будут происходить согласно порядку добавления. +// +// Параметры: +// +// Страница - ГруппаФормы - Группа-страница, содержащая элементы текущего шага страницы +// +// Действия - Структура - Описание действий, возможных на текущем шаге. Поля структуры: +// +// ПриАктивации - Строка - Необязательное имя процедуры, которая будет выполнена перед активацией страницы +// с двумя параметрами: +// <Страница> - ГруппаФормы - группа-страница, которая активизируется +// <ДополнительныеПараметры> - Неопределено +// +// ПередДействиемДалее - Строка - Необязательное имя процедуры, которая будет выполнена при нажатии кнопки "Далее", +// перед переходом на следующую страницу. Процедура будет вызвана с двумя параметрами: +// <ПараметрыШага> - служебный реквизит. При успешном завершении цепочки немодальных +// вызовов последняя процедура-обработчик должна произвести вызов +// ЗавершитьШагМастера(ПараметрыШага), подтверждая действие. +// <ДополнительныеПараметры> - Неопределено +// +// ПередДействиемНазад - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки "Назад" +// +// ПередДействиемОтмена - Строка - Аналогично ПередДействиемДалее, описывает поведение при нажатии кнопки "Отмена" +// +// ПриОбработкеОжидания - Строка - Необязательное имя процедуры, которая будет периодически вызываться с двумя +// параметрами: +// <Прекратить> - Если при выходе из процедуры установить в значение Истина, то +// периодические вызовы будут прекращены. +// <ДополнительныеПараметры> - Неопределено +// +// Кнопки - Структура - описание кнопок на текущем шаге. Поля структуры: +// +// Далее - Структура - Описание кнопки "Далее". поля: Заголовок, Подсказка, Доступность, Видимость, КнопкаПоУмолчанию. +// Пустая подсказка заменяется на заголовок. По умолчанию будут использованы значения: +// Заголовок = "Далее >", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Истина; +// +// Назад - Структура - Аналогично кнопке "Далее", значения по умолчанию: +// Заголовок = "< Назад", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; +// +// Отмена - Структура - Аналогично кнопке "Далее", значения по умолчанию: +// Заголовок = "Отмена", Доступность = Истина, Видимость = Истина, КнопкаПоУмолчанию = Ложь; +// +// Для составления параметров рекомендуется использовать вспомогательные методы "ДобавитьШагМастера", "ДействиеШагаМастера", "КнопкаШагаМастера" +// +&НаСервере +Процедура ДобавитьШагМастера(Знач Страница, Знач Действия, Знач Кнопки) + + // Умолчания + ОписаниеШага = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания"); + + ПоляКнопки = "Доступность, Видимость, КнопкаПоУмолчанию, Подсказка"; + + ОписаниеШага.Вставить("КнопкаДалее", Новый Структура(ПоляКнопки, Истина, Истина, Истина)); + ОписаниеШага.КнопкаДалее.Вставить("Заголовок", НСтр("ru='Далее'") + " >" ); + + ОписаниеШага.Вставить("КнопкаНазад", Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); + ОписаниеШага.КнопкаНазад.Вставить("Заголовок", "< " + НСтр("ru='Назад'")); + + ОписаниеШага.Вставить("КнопкаОтмена",Новый Структура(ПоляКнопки, Истина, Истина, Ложь)); + ОписаниеШага.КнопкаОтмена.Вставить("Заголовок", НСтр("ru='Отмена'")); + + ОписаниеШага.Вставить("Страница", Страница.Имя); + + // Устанавливаем действия + ЗаполнитьЗначенияСвойств(ОписаниеШага, Действия); + + Если Кнопки.Свойство("Далее") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаДалее, Кнопки.Далее); + КонецЕсли; + Если Кнопки.Свойство("Назад") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаНазад, Кнопки.Назад); + КонецЕсли; + Если Кнопки.Свойство("Отмена") Тогда + ЗаполнитьЗначенияСвойств(ОписаниеШага.КнопкаОтмена, Кнопки.Отмена); + КонецЕсли; + + ЭтотОбъект.НастройкиПошаговогоМастера.Шаги.Добавить(ОписаниеШага); +КонецПроцедуры + +// Вспомогательное формирование структуры, описывающей действие +// +// Параметры: +// Идентификатор - Строка - Идентификатор действия, см описание метода "ДобавитьШагМастера" +// ИмяОбработчика - Строка - Имя процедуры, см описание метода "ДобавитьШагМастера" +// СлужебныеДанные - Структура - Накапливает значения. +// +// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями +&НаСервере +Функция ДействиеШагаМастера(Знач Идентификатор, Знач ИмяОбработчика, СлужебныеДанные = Неопределено) + Если СлужебныеДанные = Неопределено Тогда + СлужебныеДанные = Новый Структура; + КонецЕсли; + СлужебныеДанные.Вставить(Идентификатор, ИмяОбработчика);; + Возврат СлужебныеДанные; +КонецФункции + +// Вспомогательное формирование структуры, описывающей кнопку +// +// Параметры: +// Идентификатор - Строка - Идентификатор кнопки, может быть "Далее", "Назад" или "Отмена", +// см описание метода "ДобавитьШагМастера" +// Заголовок - Строка - Заголовок кнопки +// Подсказка - Строка - Подсказка для кнопки +// Видимость - Булево - параметр отображения кнопки +// Доступность - Булево - параметр отображения кнопки +// КнопкаПоУмолчанию - Булево - параметр отображения кнопки +// СлужебныеДанные - Структура - Накапливает значения +// +// Возвращаемое значение - Структура - СлужебныеДанные с добавленными полями +// +&НаСервере +Функция КнопкаШагаМастера(Знач Идентификатор, Знач Заголовок = "", Знач Подсказка = "", Знач Видимость = Истина, Знач Доступность = Истина, Знач КнопкаПоУмолчанию = Ложь, Знач СлужебныеДанные = Неопределено) + Если СлужебныеДанные = Неопределено Тогда + СлужебныеДанные = Новый Структура; + КонецЕсли; + + ОписаниеКнопки = Новый Структура; + ОписаниеКнопки.Вставить("Заголовок", Заголовок); + ОписаниеКнопки.Вставить("Подсказка", ?(ПустаяСтрока(Подсказка), Заголовок, Подсказка)); + + ОписаниеКнопки.Вставить("Доступность", Доступность); + ОписаниеКнопки.Вставить("Видимость", Видимость); + ОписаниеКнопки.Вставить("КнопкаПоУмолчанию", КнопкаПоУмолчанию); + + СлужебныеДанные.Вставить(Идентификатор, ОписаниеКнопки); + Возврат СлужебныеДанные; +КонецФункции + +// Читает пользовательский параметр мастера +&НаКлиентеНаСервереБезКонтекста +Функция ПрочитатьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера) + + Возврат Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры[ИмяПараметраМастера]; + +КонецФункции + +// Устанавливает пользовательский параметр мастера +&НаКлиентеНаСервереБезКонтекста +Функция УстановитьПараметрПользователяМастера(Форма, Знач ИмяПараметраМастера, Знач ЗначениеПараметраМастера) + + Форма.НастройкиПошаговогоМастера.ПользовательскиеПараметры.Вставить(ИмяПараметраМастера, ЗначениеПараметраМастера); + +КонецФункции + +// Устанавливает начальную страницу для первого запуска мастера +// +// Параметры: +// СтартоваяСтраница - Число, Строка, ГруппаФормы - Номер шага, группа-страница, или ее идентификатор +// +&НаКлиенте +Процедура УстановитьНачальнуюСтраницуМастера(Знач Страница) + + ЭтотОбъект.НастройкиПошаговогоМастера.СтраницаСтарта = НомерШагаМастераПоИдентификатору(Страница); + +КонецПроцедуры + +// Запускает начальную работу мастера с шага, установленного предварительно при помощи "УстановитьНачальнуюСтраницуМастера" +&НаКлиенте +Процедура ЗапуститьРаботуМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если НастройкиМастера.СтраницаСтарта = Неопределено Тогда + ВызватьИсключение НСтр("ru = 'Перед запуском мастера должна быть установлена начальная страница.'"); + + ИначеЕсли НастройкиМастера.СтраницаСтарта = -1 Тогда + // Разогрев. Проверяем наличие обработчиков действий у всех шагов + ВозможныеДействия = Новый Структура("ПриАктивации, ПередДействиемДалее, ПередДействиемНазад, ПередДействиемОтмена, ПриОбработкеОжидания"); + Для Каждого ОписаниеШага Из НастройкиМастера.Шаги Цикл + Для Каждого КлючЗначение Из ВозможныеДействия Цикл + ИмяДействия = КлючЗначение.Ключ; + ИмяОбработчика = ОписаниеШага[ИмяДействия]; + Если Не ПустаяСтрока(ИмяОбработчика) Тогда + Попытка + Тест = Новый ОписаниеОповещения(ИмяОбработчика, ЭтотОбъект); + Исключение + Текст = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Ошибка создания обработчика события %1 для страницы %2, не определена процедура %3'"), + ИмяДействия, + ОписаниеШага.Страница, + ИмяОбработчика + ); + ВызватьИсключение Текст; + КонецПопытки; + КонецЕсли; + КонецЦикла; + КонецЦикла; + + // Фактический запуск + ПерейтиНаШагМастера(НастройкиМастера.НомерТекущегоШага, Истина); + Иначе + // По умолчанию все отключено + Элементы[НастройкиМастера.КнопкаДалее].Видимость = Ложь; + Элементы[НастройкиМастера.КнопкаНазад].Видимость = Ложь; + Элементы[НастройкиМастера.КнопкаОтмена].Видимость = Ложь; + + // Отложенный запуск + ЭтотОбъект.НастройкиПошаговогоМастера.НомерТекущегоШага = НастройкиМастера.СтраницаСтарта; + ЭтотОбъект.НастройкиПошаговогоМастера.СтраницаСтарта = -1; + ПодключитьОбработчикОжидания("ЗапуститьРаботуМастера", 0.1, Истина); + КонецЕсли; +КонецПроцедуры + +// Выполняет переключение мастера на следующую или предыдущую страницу. +// +// Параметры: +// КодКоманды - Строка - Идентификатор действия, может принимать значения "Далее", "Назад" или "Отмена" +// +&НаКлиенте +Процедура ШагМастера(Знач КодКоманды) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если КодКоманды = "Далее" Тогда + Направление = 1; + ИначеЕсли КодКоманды = "Назад" Тогда + Направление = -1; + ИначеЕсли КодКоманды = "Отмена" Тогда + Направление = 0; + Иначе + ВызватьИсключение НСтр("ru = 'Некорректная команда шага помощника'"); + КонецЕсли; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + + // Останавливаем обработчик, если есть + Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда + ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера"); + КонецЕсли; + + // Отрабатываем уход с текущей страницы + Если Направление = 1 Тогда + Действие = ОписаниеШага.ПередДействиемДалее; + + ИначеЕсли Направление = -1 Тогда + Действие = ОписаниеШага.ПередДействиемНазад; + + Иначе + Действие = ОписаниеШага.ПередДействиемОтмена; + + КонецЕсли; + + Если ПустаяСтрока(Действие) Тогда + ЗавершитьШагМастера(Направление); + Иначе + Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); + ВыполнитьОбработкуОповещения(Оповещение, Направление); + КонецЕсли; +КонецПроцедуры + +// Выполняет безусловное позиционирование мастера на страницу +// +// Параметры: +// ИдентификаторШага - Число, Строка, ГруппаФормы - Номер, группа-страница формы или ее имя для перехода +// ИнициироватьСобытия - Булево - Флаг того, что необходимо вызывать события, связанные с активацией шага +// +&НаКлиенте +Процедура ПерейтиНаШагМастера(Знач ИдентификаторШага, Знач ИнициироватьСобытия = Ложь) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + СледующийШаг = НомерШагаМастераПоИдентификатору(ИдентификаторШага); + Если СледующийШаг = Неопределено Тогда + Ошибка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Не найден шаг помощника %1'"), + ИдентификаторШага + ); + ВызватьИсключение Ошибка; + КонецЕсли; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + + // Останавливаем обработчик, если есть + Если ОписаниеШага.ПриОбработкеОжидания <> Неопределено Тогда + ОтключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера"); + КонецЕсли; + + // И запускаем новую страницу + ШагМастераЗавершениеБезусловно(СледующийШаг, ИнициироватьСобытия); +КонецПроцедуры + +// Подтверждает действие шага мастера и вызывает переключение страницы +// +// Параметры: +// ПараметрыШага - Служебный реквизит, полученный в обработчике перед началом действия +// +&НаКлиенте +Процедура ЗавершитьШагМастера(Знач ПараметрыШага) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + СледующийШаг = НастройкиМастера.НомерТекущегоШага + ПараметрыШага; + ПоследнийШаг = НастройкиМастера.Шаги.ВГраница(); + + Если ПараметрыШага = 0 Тогда + // Подтверждение отмены - ничего не делаем + Возврат; + + ИначеЕсли ПараметрыШага = 1 И СледующийШаг > ПоследнийШаг Тогда + // Попытка сделать шаг за пределы вперед + ВызватьИсключение НСтр("ru='Попытка выхода за последний шаг мастера'"); + + ИначеЕсли ПараметрыШага = -1 И СледующийШаг < 0 Тогда + // Попытка сделать шаг за пределы назад + ВызватьИсключение НСтр("ru='Попытка выхода назад из первого шага мастера'"); + + КонецЕсли; + + ШагМастераЗавершениеБезусловно(СледующийШаг); +КонецПроцедуры + +&НаКлиенте +Процедура ШагМастераЗавершениеБезусловно(Знач СледующийШаг, Знач ИнициироватьСобытия = Истина) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[СледующийШаг]; + ПоследнийШаг = НастройкиМастера.Шаги.ВГраница(); + + // Переключаем на новую страницу + Элементы[НастройкиМастера.ГруппаСтраниц].ТекущаяСтраница = Элементы[ОписаниеШага.Страница]; + + // Обновляем кнопки + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаДалее, ОписаниеШага.КнопкаДалее); + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаНазад, ОписаниеШага.КнопкаНазад); + ОбновитьСвойстваКнопкиМастера(НастройкиМастера.КнопкаОтмена, ОписаниеШага.КнопкаОтмена); + + // Успешно перешли + ЭтотОбъект.НастройкиПошаговогоМастера.НомерТекущегоШага = СледующийШаг; + + Если ИнициироватьСобытия И Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда + // Отрабатываем "ПриАктивации" новой страницы, он же запустит ожидание + ПодключитьОбработчикОжидания("ОбработкаАктивацииСтраницыМастера", 0.1, Истина); + + ИначеЕсли Не ПустаяСтрока(ОписаниеШага.ПриОбработкеОжидания) Тогда + // Запускаем обработчик ожидания, если надо + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", 0.1, Истина); + + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьСвойстваКнопкиМастера(Знач ИмяКнопки, Знач Описание) + + КнопкаМастера = Элементы[ИмяКнопки]; + ЗаполнитьЗначенияСвойств(КнопкаМастера, Описание); + КнопкаМастера.РасширеннаяПодсказка.Заголовок = Описание.Подсказка; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаАктивацииСтраницыМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + Если Не ПустаяСтрока(ОписаниеШага.ПриАктивации) Тогда + Оповещение = Новый ОписаниеОповещения(ОписаниеШага.ПриАктивации, ЭтотОбъект); + ВыполнитьОбработкуОповещения(Оповещение, Элементы[ОписаниеШага.Страница]); + КонецЕсли; + + // И запускаем ожидание, если надо + Если Не ПустаяСтрока(ОписаниеШага.ПриОбработкеОжидания) Тогда + // Первый запуск быстрый + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", 0.1, Истина); + КонецЕсли; +КонецПроцедуры + +// Может быть номер шага или группа-страница, или ее идентификатор +&НаКлиенте +Функция НомерШагаМастераПоИдентификатору(Знач ИдентификаторШага) + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + НомерШага = Неопределено; + + ТипПараметра = ТипЗнч(ИдентификаторШага); + Если ТипПараметра = Тип("Число") Тогда + НомерШага = ИдентификаторШага; + Иначе + ИмяПоиска = ?(ТипПараметра = Тип("ГруппаФормы"), ИдентификаторШага.Имя, ИдентификаторШага); + Для НомерШага=0 По НастройкиМастера.Шаги.ВГраница() Цикл + Если НастройкиМастера.Шаги[НомерШага].Страница = ИмяПоиска Тогда + НомерШага = НомерШага; + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат НомерШага; +КонецФункции + +// Возвращает флаг отмены +&НаКлиенте +Функция ОбработкаОжиданияСтраницыМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + ОписаниеШага = НастройкиМастера.Шаги[НастройкиМастера.НомерТекущегоШага]; + Действие = ОписаниеШага.ПриОбработкеОжидания; + Если ПустаяСтрока(Действие) Тогда + Возврат Ложь; + КонецЕсли; + + Оповещение = Новый ОписаниеОповещения(Действие, ЭтотОбъект); + + Прекратить = Ложь; + ВыполнитьОбработкуОповещения(Оповещение, Прекратить); + Продолжать = Не Прекратить; + + Если Продолжать Тогда + ПодключитьОбработчикОжидания("ОбработкаОжиданияСтраницыМастера", НастройкиМастера.ТаймаутОжиданияДлительнойОперации, Истина); + КонецЕсли; + + Возврат Продолжать; +КонецФункции + +// Стартует длительную операцию мастера +// +// Параметры: +// ИмяМетода - Строка - Имя метода для фонового задания +// ПараметрыМетода - Массив - Параметры метода для фонового задания. +// ВозвращаетРезультат - Булево - Флаг необходимости получения результатов. Если установлен в Истина, то +// последним параметром вызова добавляется адрес хранилища для результата +// ОписаниеМетода - Строка - Необязательное описание метода для отображения в списке фоновых заданий +// +&НаСервере +Функция ЗапуститьДлительнуюОперациюМастера(Знач ИмяМетода, Знач ПараметрыМетода, Знач ВозвращаетРезультат = Ложь, Знач ОписаниеМетода = "") + + // Отменяем возможно незавершенное предыдущее + ОтменитьДлительнуюОперациюМастера(); + + Если ВозвращаетРезультат Тогда + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор); + ПараметрыФоновогоМетода = Новый Массив(Новый ФиксированныйМассив(ПараметрыМетода)); + ПараметрыФоновогоМетода.Добавить(ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания); + Иначе + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + ПараметрыФоновогоМетода = ПараметрыМетода; + КонецЕсли; + + Задание = ФоновыеЗадания.Выполнить(ИмяМетода, ПараметрыФоновогоМетода, , ОписаниеМетода); + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Задание.УникальныйИдентификатор; +КонецФункции + +// Получает состояние текущей длительной операцию +// +// Возвращаемое значение - Структура - Описание состояния с полями: +// Завершено - Булево - Флаг активности длительной операции +// ИнформацияОбОшибке - ИнформацияОбОшибке - Если операция завершилась аварийно, то содержит информацию почему +// СообщенияПользователю - ФиксированныйМассив - Объекты типа "СообщениеПользователю" +// Результат - Произвольный - Если длительное задание было запущено с флагом возвращения результата, +// то содержит текущее значение результата. +// +&НаСервере +Функция СостояниеДлительнойОперацииМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Данные = Новый Структура("Завершено, Результат, ИнформацияОбОшибке", Истина); + Данные.Вставить("СообщенияПользователю", Новый ФиксированныйМассив(Новый Массив)); + + Если НастройкиМастера.ИдентификаторФоновогоЗадания = Неопределено Тогда + Возврат Данные; + КонецЕсли; + + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиМастера.ИдентификаторФоновогоЗадания); + Если Задание <> Неопределено Тогда + // Все непонятное - завершено, см значения по умолчанию + Если Задание.ИнформацияОбОшибке <> Неопределено Тогда + Данные.ИнформацияОбОшибке = ПодробноеПредставлениеОшибки(Задание.ИнформацияОбОшибке); + КонецЕсли; + Данные.Завершено = Задание.Состояние <> СостояниеФоновогоЗадания.Активно; + Если Данные.Завершено Тогда + // Неперехваченные сообщения фонового задания + НакопленныеСообщения = Задание.ПолучитьСообщенияПользователю(Истина); + Если НакопленныеСообщения <> Неопределено Тогда + Данные.СообщенияПользователю = НакопленныеСообщения; + КонецЕсли; + КонецЕсли; + КонецЕсли; + + Если Не ПустаяСтрока(НастройкиМастера.АдресРезультатаФоновогоЗадания) Тогда + Данные.Результат = ПолучитьИзВременногоХранилища(НастройкиМастера.АдресРезультатаФоновогоЗадания); + КонецЕсли; + + Если Данные.Завершено Тогда + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено; + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + КонецЕсли; + + Возврат Данные; +КонецФункции + +// Отменяет текущую длительную операцию +&НаСервере +Процедура ОтменитьДлительнуюОперациюМастера() + НастройкиМастера = ЭтотОбъект.НастройкиПошаговогоМастера; + + Если НастройкиМастера.ИдентификаторФоновогоЗадания <> Неопределено Тогда + Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(НастройкиМастера.ИдентификаторФоновогоЗадания); + Если Задание <> Неопределено Тогда + Задание.Отменить(); + КонецЕсли; + ЭтотОбъект.НастройкиПошаговогоМастера.ИдентификаторФоновогоЗадания = Неопределено; + КонецЕсли; + + ЭтотОбъект.НастройкиПошаговогоМастера.АдресРезультатаФоновогоЗадания = Неопределено; + +КонецПроцедуры + diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/ManagerModule.bsl b/SSL/src/DataProcessors/ЗаменаСсылок/ManagerModule.bsl new file mode 100644 index 000000000..1cb7decb2 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/ManagerModule.bsl @@ -0,0 +1,12 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЙ ПРОГРАММНЫЙ ИНТЕРФЕЙС + +// Возвращает имя события для оповещения о замене +// +Функция СобытиеОповещенияОЗамене() Экспорт + Возврат "ПроизведенаЗаменаСсылок"; +КонецФункции + +#КонецЕсли \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/ObjectModule.bsl b/SSL/src/DataProcessors/ЗаменаСсылок/ObjectModule.bsl new file mode 100644 index 000000000..e69de29bb diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs b/SSL/src/DataProcessors/ЗаменаСсылок/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs new file mode 100644 index 000000000..c65833956 --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/Templates/ОсновнаяСхемаКомпоновкиДанных/Template.dcs @@ -0,0 +1,262 @@ + + + + ИсточникДанных + Local + + + МестаИспользования + + Ссылка + Ссылка + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ссылка</v8:content> + </v8:item> + + + d5p1:AnyRef + + + + Данные + Данные + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Данные</v8:content> + </v8:item> + + ПредставлениеДанных + + + ПредставлениеДанных + ПредставлениеДанных + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Представление данных</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + ТипСсылки + ТипСсылки + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип ссылки</v8:content> + </v8:item> + + + true + true + true + true + + + true + true + true + true + + + + ВедущееИзмерение + ВедущееИзмерение + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ведущее измерение</v8:content> + </v8:item> + + + true + true + true + + + true + true + true + true + + + xs:boolean + + + ИсточникДанных + МестаИспользования + + + КоличествоДанных + Данные + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вхождений</v8:content> + </v8:item> + + + true + true + true + + + + КоличествоДанных + Количество(КоличествоДанных) + Данные + Ссылка + ОбщийИтог + + + СписокСсылок + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Список элементов</v8:content> + </v8:item> + + false + true + true + + + Основной + Основной + + + + ВедущееИзмерение + Equal + false + + + + + СписокСсылок + + 5bef22e4-9ca8-45bc-aaa6-29de7d91e343 + + + ru + Список элементов + + + + + + + ВыводитьЗаголовок + Output + + + Заголовок + + + + ВыводитьПараметрыДанных + DontOutput + + + ВыводитьОтбор + DontOutput + + + + + + Ссылка + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + false + ТипСсылки + Equal + + + + + + + + + Ссылка + + + ru + Наименование + + + + + Ссылка.Код + + + ru + Код + + + + + КоличествоДанных + + + ru + Вхождений + + + + + + + + Данные + Items + None + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + + + + + + + Данные + + + ru + Места использования + + + + + КоличествоДанных + + + ru + Вхождений + + + + + + + + + \ No newline at end of file diff --git a/SSL/src/DataProcessors/ЗаменаСсылок/ЗаменаСсылок.mdo b/SSL/src/DataProcessors/ЗаменаСсылок/ЗаменаСсылок.mdo new file mode 100644 index 000000000..e4b41c37e --- /dev/null +++ b/SSL/src/DataProcessors/ЗаменаСсылок/ЗаменаСсылок.mdo @@ -0,0 +1,59 @@ + + + + + + + ЗаменаСсылок + + ru + Замена ссылок + + true + DataProcessor.ЗаменаСсылок.Form.ЗаменаЭлементов + + ЗаменаЭлементов + + ru + Замена элементов + + + + ru + + + PersonalComputer + MobileDevice + + + ОбъединениеЭлементов + + ru + Объединение элементов + + + + ru + + + PersonalComputer + MobileDevice + + + МногострочноеПредупреждение + + ru + Многострочное предупреждение + + PersonalComputer + MobileDevice + + + ОсновнаяСхемаКомпоновкиДанных + + ru + Основная схема компоновки данных + + DataCompositionSchema + + diff --git a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form index b22dc01ae..8878299ea 100644 --- a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Form.form @@ -33,7 +33,7 @@ КоличествоПоказываемыхСобытийПриИзменении - КоличествоПоказываемыхСобытийРасширеннаяПодсказка + КоличествоПоказываемыхСобытийExtendedTooltip 141 Label true @@ -56,7 +56,6 @@ true true - true ru ЧГ=0 @@ -123,8 +122,8 @@ ПредставлениеОтбора - ПредставлениеОтбораРасширеннаяПодсказка - 143 + ПредставлениеОтбораExtendedTooltip + 142 Label true true @@ -162,7 +161,7 @@ Группа отбора - ГруппаОтбораРасширеннаяПодсказка + ГруппаОтбораExtendedTooltip 140 Label true @@ -195,8 +194,8 @@ true - УстановитьИнтервалДатДляПросмотраРасширеннаяПодсказка - 147 + УстановитьИнтервалДатДляПросмотраExtendedTooltip + 145 Label true true @@ -222,8 +221,8 @@ false - УстановитьОтборРасширеннаяПодсказка - 148 + УстановитьОтборExtendedTooltip + 146 Label true true @@ -258,8 +257,8 @@ false - УстановитьОтборПоЗначениюВТекущейКолонкеРасширеннаяПодсказка - 149 + УстановитьОтборПоЗначениюВТекущейКолонкеExtendedTooltip + 147 Label true true @@ -294,8 +293,8 @@ false - ОтключитьОтборРасширеннаяПодсказка - 150 + ОтключитьОтборExtendedTooltip + 148 Label true true @@ -334,8 +333,8 @@ Команды отбора - КомандыОтбораРасширеннаяПодсказка - 146 + КомандыОтбораExtendedTooltip + 144 Label true true @@ -355,8 +354,8 @@ false - ИзменитьФормуРасширеннаяПодсказка - 151 + ИзменитьФормуExtendedTooltip + 149 Label true true @@ -383,8 +382,8 @@ false - ПросмотрТекущегоСобытияВОтдельномОкнеРасширеннаяПодсказка - 152 + ПросмотрТекущегоСобытияВОтдельномОкнеExtendedTooltip + 150 Label true true @@ -419,8 +418,8 @@ false - ВывестиСписокРасширеннаяПодсказка - 153 + ВывестиСписокExtendedTooltip + 151 Label true true @@ -458,8 +457,8 @@ false - ОбновитьТекущийСписокРасширеннаяПодсказка - 155 + ОбновитьТекущийСписокExtendedTooltip + 153 Label true true @@ -498,8 +497,8 @@ Команда обновить - КомандаОбновитьРасширеннаяПодсказка - 154 + КомандаОбновитьExtendedTooltip + 152 Label true true @@ -521,8 +520,8 @@ true - ФормаНайтиРасширеннаяПодсказка - 157 + ФормаНайтиExtendedTooltip + 155 Label true true @@ -547,8 +546,8 @@ true - ФормаОтменитьПоискРасширеннаяПодсказка - 158 + ФормаОтменитьПоискExtendedTooltip + 156 Label true true @@ -578,8 +577,8 @@ Команды поиска - КомандыПоискаРасширеннаяПодсказка - 156 + КомандыПоискаExtendedTooltip + 154 Label true true @@ -598,8 +597,8 @@ true - СправкаРасширеннаяПодсказка - 159 + СправкаExtendedTooltip + 157 Label true true @@ -629,8 +628,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 145 + КоманднаяПанельExtendedTooltip + 143 Label true true @@ -689,8 +688,8 @@ Журнал.Дата - ДатаРасширеннаяПодсказка - 176 + ДатаExtendedTooltip + 165 Label true true @@ -739,8 +738,8 @@ Журнал.ПредставлениеСобытия - ПредставлениеСобытияРасширеннаяПодсказка - 179 + ПредставлениеСобытияExtendedTooltip + 167 Label true true @@ -785,8 +784,8 @@ Журнал.Комментарий - КомментарийРасширеннаяПодсказка - 181 + КомментарийExtendedTooltip + 168 Label true true @@ -822,8 +821,8 @@ true - ГруппаСобытиеРасширеннаяПодсказка - 178 + ГруппаСобытиеExtendedTooltip + 166 Label true true @@ -857,8 +856,8 @@ Журнал.ИмяПользователя - ИмяПользователяРасширеннаяПодсказка - 184 + ИмяПользователяExtendedTooltip + 170 Label true true @@ -903,8 +902,8 @@ Журнал.Компьютер - КомпьютерРасширеннаяПодсказка - 186 + КомпьютерExtendedTooltip + 171 Label true true @@ -953,8 +952,8 @@ Журнал.ПредставлениеПриложения - ПредставлениеПриложенияРасширеннаяПодсказка - 189 + ПредставлениеПриложенияExtendedTooltip + 173 Label true true @@ -996,8 +995,8 @@ Журнал.Сеанс - СеансРасширеннаяПодсказка - 191 + СеансExtendedTooltip + 174 Label true true @@ -1032,8 +1031,8 @@ true - ГруппаПриложениеРасширеннаяПодсказка - 188 + ГруппаПриложениеExtendedTooltip + 172 Label true true @@ -1053,8 +1052,8 @@ true - ГруппаПользовательКомпьютерПриложениеРасширеннаяПодсказка - 183 + ГруппаПользовательКомпьютерПриложениеExtendedTooltip + 169 Label true true @@ -1084,8 +1083,8 @@ Журнал.РабочийСервер - РабочийСерверРасширеннаяПодсказка - 194 + РабочийСерверExtendedTooltip + 176 Label true true @@ -1127,8 +1126,8 @@ Журнал.ОсновнойIPПорт - ОсновнойIPПортРасширеннаяПодсказка - 196 + ОсновнойIPПортExtendedTooltip + 177 Label true true @@ -1174,8 +1173,8 @@ Вспомогательный IP порт - ВспомогательныйIPПортРасширеннаяПодсказка - 198 + ВспомогательныйIPПортExtendedTooltip + 178 Label true true @@ -1216,8 +1215,8 @@ Группа сервер - ГруппаСерверРасширеннаяПодсказка - 193 + ГруппаСерверExtendedTooltip + 175 Label true true @@ -1251,8 +1250,8 @@ Журнал.СтатусТранзакции - СтатусТранзакцииРасширеннаяПодсказка - 201 + СтатусТранзакцииExtendedTooltip + 180 Label true true @@ -1294,8 +1293,8 @@ Журнал.Транзакция - ТранзакцияРасширеннаяПодсказка - 203 + ТранзакцияExtendedTooltip + 181 Label true true @@ -1330,8 +1329,8 @@ true - ГруппаТранзакцияРасширеннаяПодсказка - 200 + ГруппаТранзакцияExtendedTooltip + 179 Label true true @@ -1365,8 +1364,8 @@ Журнал.ПредставлениеМетаданных - ПредставлениеМетаданныхРасширеннаяПодсказка - 206 + ПредставлениеМетаданныхExtendedTooltip + 183 Label true true @@ -1408,8 +1407,8 @@ Журнал.Данные - ДанныеРасширеннаяПодсказка - 208 + ДанныеExtendedTooltip + 184 Label true true @@ -1451,8 +1450,8 @@ Журнал.ПредставлениеДанных - ПредставлениеДанныхРасширеннаяПодсказка - 210 + ПредставлениеДанныхExtendedTooltip + 185 Label true true @@ -1480,8 +1479,8 @@ true - ГруппаДанныеРасширеннаяПодсказка - 205 + ГруппаДанныеExtendedTooltip + 182 Label true true @@ -1508,8 +1507,8 @@ Журнал.СведенияОСобытии - СведенияОСобытииРасширеннаяПодсказка - 212 + СведенияОСобытииExtendedTooltip + 186 Label true true @@ -1548,10 +1547,10 @@ ЖурналСтрокаПоиска - 167 + 191 ЖурналСтрокаПоискаРасширеннаяПодсказка - 169 + 193 Label true true @@ -1561,7 +1560,7 @@ ЖурналСтрокаПоискаКонтекстноеМеню - 168 + 192 true Журнал @@ -1571,10 +1570,10 @@ ЖурналСостояниеПросмотра - 170 + 194 ЖурналСостояниеПросмотраРасширеннаяПодсказка - 172 + 196 Label true true @@ -1584,7 +1583,7 @@ ЖурналСостояниеПросмотраКонтекстноеМеню - 171 + 195 true ViewStatusAddition @@ -1595,10 +1594,10 @@ ЖурналУправлениеПоиском - 173 + 197 ЖурналУправлениеПоискомРасширеннаяПодсказка - 175 + 199 Label true true @@ -1608,7 +1607,7 @@ ЖурналУправлениеПоискомКонтекстноеМеню - 174 + 198 true SearchControlAddition @@ -1618,8 +1617,8 @@ - ЖурналРасширеннаяПодсказка - 166 + ЖурналExtendedTooltip + 164 Label true true @@ -1643,8 +1642,8 @@ false - УстановитьОтборПоЗначениюВТекущейКолонкеКонтекстРасширеннаяПодсказка - 163 + УстановитьОтборПоЗначениюВТекущейКолонкеКонтекстExtendedTooltip + 161 Label true true @@ -1678,8 +1677,8 @@ true - ЖурналКонтекстноеМенюОтключитьОтборРасширеннаяПодсказка - 164 + ЖурналКонтекстноеМенюОтключитьОтборExtendedTooltip + 162 Label true true @@ -1709,8 +1708,8 @@ Отбор группа контекст - ОтборГруппаКонтекстРасширеннаяПодсказка - 162 + ОтборГруппаКонтекстExtendedTooltip + 160 Label true true @@ -1730,8 +1729,8 @@ false - ПросмотрТекущегоСобытияВОтдельномОкнеКонтекстРасширеннаяПодсказка - 165 + ПросмотрТекущегоСобытияВОтдельномОкнеКонтекстExtendedTooltip + 163 Label true true @@ -1804,8 +1803,8 @@ Журнал регистрации - ЖурналРегистрацииРасширеннаяПодсказка - 161 + ЖурналРегистрацииExtendedTooltip + 159 Label true true @@ -1835,8 +1834,8 @@ None - ПолеИндикаторДлительныхОперацийРасширеннаяПодсказка - 223 + ПолеИндикаторДлительныхОперацийExtendedTooltip + 188 Label true true @@ -1885,8 +1884,8 @@ Индикатор длительных операций - ИндикаторДлительныхОперацийРасширеннаяПодсказка - 222 + ИндикаторДлительныхОперацийExtendedTooltip + 187 Label true true @@ -1914,8 +1913,8 @@ Страницы - СтраницыРасширеннаяПодсказка - 160 + СтраницыExtendedTooltip + 158 Label true true @@ -1942,7 +1941,7 @@ Журнал - ГруппаЖурналРасширеннаяПодсказка + ГруппаЖурналExtendedTooltip 139 Label true @@ -1975,7 +1974,7 @@ Просмотр зарегистрированных событий - ГруппаПросмотрЗарегистрированныхСобытийРасширеннаяПодсказка + ГруппаПросмотрЗарегистрированныхСобытийExtendedTooltip 138 Label true diff --git a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Module.bsl index 68cb7f2cd..242cb97bd 100644 --- a/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ЗащитаПерсональныхДанных/Forms/Форма/Module.bsl @@ -93,9 +93,8 @@ &НаКлиенте Процедура УстановитьИнтервалДатДляПросмотра() - Если ЖурналРегистрацииКлиент.УстановитьИнтервалДатДляПросмотра(ИнтервалДат, ОтборЖурналаРегистрации) Тогда - ОбновитьТекущийСписок(); - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("УстановитьИнтервалДатДляПросмотраЗавершение", ЭтотОбъект); + ЖурналРегистрацииКлиент.УстановитьИнтервалДатДляПросмотра(ИнтервалДат, ОтборЖурналаРегистрации, Оповещение) КонецПроцедуры @@ -124,6 +123,15 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура УстановитьИнтервалДатДляПросмотраЗавершение(ИнтервалУстановлен, ДополнительныеПараметры) Экспорт + + Если ИнтервалУстановлен Тогда + ОбновитьТекущийСписок(); + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура ПриЗакрытииНаСервере() diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form index 3efa0c734..8aa91913a 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ВыборВидаОбъектаСоставаУзла/Form.form @@ -28,8 +28,8 @@ ДоступныеВидыОбъектов.ПредставлениеСписка - ДоступныеВидыОбъектовПредставлениеСпискаРасширеннаяПодсказка - 37 + ДоступныеВидыОбъектовПредставлениеСпискаExtendedTooltip + 28 Label true true @@ -65,10 +65,10 @@ ДоступныеВидыОбъектовСтрокаПоиска - 28 + 29 ДоступныеВидыОбъектовСтрокаПоискаРасширеннаяПодсказка - 30 + 31 Label true true @@ -78,7 +78,7 @@ ДоступныеВидыОбъектовСтрокаПоискаКонтекстноеМеню - 29 + 30 true ДоступныеВидыОбъектов @@ -88,10 +88,10 @@ ДоступныеВидыОбъектовСостояниеПросмотра - 31 + 32 ДоступныеВидыОбъектовСостояниеПросмотраРасширеннаяПодсказка - 33 + 34 Label true true @@ -101,7 +101,7 @@ ДоступныеВидыОбъектовСостояниеПросмотраКонтекстноеМеню - 32 + 33 true ViewStatusAddition @@ -112,10 +112,10 @@ ДоступныеВидыОбъектовУправлениеПоиском - 34 + 35 ДоступныеВидыОбъектовУправлениеПоискомРасширеннаяПодсказка - 36 + 37 Label true true @@ -125,7 +125,7 @@ ДоступныеВидыОбъектовУправлениеПоискомКонтекстноеМеню - 35 + 36 true SearchControlAddition @@ -135,7 +135,7 @@ - ДоступныеВидыОбъектовРасширеннаяПодсказка + ДоступныеВидыОбъектовExtendedTooltip 27 Label true @@ -197,7 +197,7 @@ true - ФормаКомандаОКРасширеннаяПодсказка + ФормаКомандаОКExtendedTooltip 24 Label true @@ -226,7 +226,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 25 Label true @@ -252,7 +252,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 26 Label true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ОбщиеПараметрыСинхронизации/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ОбщиеПараметрыСинхронизации/Form.form index 44b2dc13e..d31855e30 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ОбщиеПараметрыСинхронизации/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/ОбщиеПараметрыСинхронизации/Form.form @@ -17,7 +17,7 @@ None - ОбщиеПараметрыСинхронизацииСтрокойРасширеннаяПодсказка + ОбщиеПараметрыСинхронизацииСтрокойExtendedTooltip 5 Label true @@ -69,7 +69,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 4 Label true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form index 129a80abd..7ca7149c3 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Form.form @@ -27,7 +27,7 @@ Общий отбор по периоду, применяется для всех документов - ПериодДанныхРасширеннаяПодсказка + ПериодДанныхExtendedTooltip 21 Label true @@ -75,7 +75,7 @@ Группа период - ГруппаПериодРасширеннаяПодсказка + ГруппаПериодExtendedTooltip 20 Label true @@ -121,8 +121,8 @@ true - КомпоновщикНастроекОтборДобавитьЭлементОтбораРасширеннаяПодсказка - 23 + КомпоновщикНастроекОтборДобавитьЭлементОтбораExtendedTooltip + 22 Label true true @@ -155,8 +155,8 @@ Компоновщик настроек отбор группа все действия - КомпоновщикНастроекОтборГруппаВсеДействияРасширеннаяПодсказка - 24 + КомпоновщикНастроекОтборГруппаВсеДействияExtendedTooltip + 23 Label true true @@ -242,8 +242,8 @@ - КомпоновщикНастроекОтборРасширеннаяПодсказка - 25 + КомпоновщикНастроекОтборExtendedTooltip + 24 Label true true @@ -300,7 +300,7 @@ true - ФормаКомандаОКРасширеннаяПодсказка + ФормаКомандаОКExtendedTooltip 17 Label true @@ -326,7 +326,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 18 Label true @@ -352,7 +352,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 19 Label true @@ -534,7 +534,10 @@
                АдресХранилищаФормы - + + String + + true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Module.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Module.bsl index aa7dbd164..7903d974c 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Module.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеПериодаИОтбора/Module.bsl @@ -28,7 +28,7 @@ Параметры.Свойство("ПериодДанных", ПериодДанных); Если Параметры.ВыборПериода Тогда - ВыгружатьЗаПериод = Истина; + ВыгружатьЗаПериод = ЗначениеЗаполнено(ПериодДанных); Иначе ВыгружатьЗаПериод = Ложь; // Отключаем выбор периода совсем diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form index b19ee208e..6b6eaf62e 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Form.form @@ -45,8 +45,8 @@ ВариантыНастроек.Value - ВариантыНастроекЗначениеРасширеннаяПодсказка - 27 + ВариантыНастроекЗначениеExtendedTooltip + 18 Label true true @@ -90,10 +90,10 @@ ВариантыНастроекСтрокаПоиска - 18 + 20 ВариантыНастроекСтрокаПоискаРасширеннаяПодсказка - 20 + 22 Label true true @@ -103,7 +103,7 @@ ВариантыНастроекСтрокаПоискаКонтекстноеМеню - 19 + 21 true ВариантыНастроек @@ -113,10 +113,10 @@ ВариантыНастроекСостояниеПросмотра - 21 + 23 ВариантыНастроекСостояниеПросмотраРасширеннаяПодсказка - 23 + 25 Label true true @@ -126,7 +126,7 @@ ВариантыНастроекСостояниеПросмотраКонтекстноеМеню - 22 + 24 true ViewStatusAddition @@ -137,10 +137,10 @@ ВариантыНастроекУправлениеПоиском - 24 + 26 ВариантыНастроекУправлениеПоискомРасширеннаяПодсказка - 26 + 28 Label true true @@ -150,7 +150,7 @@ ВариантыНастроекУправлениеПоискомКонтекстноеМеню - 25 + 27 true SearchControlAddition @@ -160,7 +160,7 @@ - ВариантыНастроекРасширеннаяПодсказка + ВариантыНастроекExtendedTooltip 17 Label true @@ -223,8 +223,8 @@ Имя, под которым будут сохранены текущие настройки - ПредставлениеНастройкиРасширеннаяПодсказка - 37 + ПредставлениеНастройкиExtendedTooltip + 19 Label true true @@ -268,7 +268,7 @@ true - ФормаСохранитьРасширеннаяПодсказка + ФормаСохранитьExtendedTooltip 14 Label true @@ -298,7 +298,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 15 Label true @@ -324,7 +324,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 16 Label true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Module.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Module.bsl index 4d9094ab6..b6abf245a 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Module.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/РедактированиеСоставаНастроек/Module.bsl @@ -52,21 +52,20 @@ &НаКлиенте Процедура ВариантыНастроекПередУдалением(Элемент, Отказ) + Отказ = Истина; + ПредставлениеНастройки = Элемент.ТекущиеДанные.Представление; ТекстЗаголовка = НСтр("ru='Подтверждение'"); ТекстВопроса = НСтр("ru='Удалить настройку ""%1""?'"); ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеНастройки); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); - Если Ответ=КодВозвратаДиалога.Да Тогда - УдалитьНастройкуСервер(ПредставлениеНастройки); - // Форму перестраиваем сами - ПрочитатьСохраненныеНастройки(); - КонецЕсли; + ДополнительныеПараметры = Новый Структура("ПредставлениеНастройки", ПредставлениеНастройки); + ОписаниеОповещения = Новый ОписаниеОповещения("ОповещениеВопросУдаленияВариантаНастроек", ЭтотОбъект, + ДополнительныеПараметры); - Отказ = Истина; + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -76,28 +75,29 @@ &НаКлиенте Процедура СохранитьНастройку(Команда) - Если Не ПустаяСтрока(ПредставлениеТекущейНастройки) Тогда - Если ВариантыНастроек.НайтиПоЗначению(ПредставлениеТекущейНастройки)<>Неопределено Тогда - ТекстЗаголовка = НСтр("ru='Подтверждение'"); - ТекстВопроса = НСтр("ru='Перезаписать существующую настройку ""%1""?'"); - ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеТекущейНастройки); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); - Если Ответ<>КодВозвратаДиалога.Да Тогда - Возврат; - КонецЕсли; - КонецЕсли; - СохранитьТекущиеНастройки(); - ПрочитатьСохраненныеНастройки(); + Если ПустаяСтрока(ПредставлениеТекущейНастройки) Тогда + ОбщегоНазначенияКлиентСервер.СообщитьПользователю( + НСтр("ru='Не заполнено имя для текущей настройки.'"), , "ПредставлениеТекущейНастройки"); + Возврат; + КонецЕсли; - ЗакрыватьПриВыборе = Истина; - ВыполнитьВыбор(ПредставлениеТекущейНастройки); + Если ВариантыНастроек.НайтиПоЗначению(ПредставлениеТекущейНастройки)<>Неопределено Тогда + ТекстЗаголовка = НСтр("ru='Подтверждение'"); + ТекстВопроса = НСтр("ru='Перезаписать существующую настройку ""%1""?'"); + ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеТекущейНастройки); + + ДополнительныеПараметры = Новый Структура("ПредставлениеНастройки", ПредставлениеТекущейНастройки); + ОписаниеОповещения = Новый ОписаниеОповещения("ОповещениеВопросСохраненияВариантаНастроек", ЭтотОбъект, + ДополнительныеПараметры); + + ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); Возврат; КонецЕсли; - ОбщегоНазначенияКлиентСервер.СообщитьПользователю( - НСтр("ru='Не заполнено имя для текущей настройки.'"), , "ПредставлениеТекущейНастройки"); + // Сохраняем без вопросов + СохранитьИВыполнитьВыборТекущейНастройки(); КонецПроцедуры - + &НаКлиенте Процедура ПроизвестиВыбор(Команда) ВыполнитьВыбор(ПредставлениеТекущейНастройки); @@ -144,3 +144,32 @@ КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ОповещениеВопросУдаленияВариантаНастроек(Результат, ДополнительныеПараметры) Экспорт + Если Результат<>КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + УдалитьНастройкуСервер(ДополнительныеПараметры.ПредставлениеНастройки); + ПрочитатьСохраненныеНастройки(); +КонецПроцедуры + +&НаКлиенте +Процедура ОповещениеВопросСохраненияВариантаНастроек(Результат, ДополнительныеПараметры) Экспорт + Если Результат<>КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ПредставлениеТекущейНастройки = ДополнительныеПараметры.ПредставлениеНастройки; + СохранитьИВыполнитьВыборТекущейНастройки(); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьИВыполнитьВыборТекущейНастройки() + + СохранитьТекущиеНастройки(); + ПрочитатьСохраненныеНастройки(); + + ЗакрыватьПриВыборе = Истина; + ВыполнитьВыбор(ПредставлениеТекущейНастройки); +КонецПроцедуры; diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form index 8b45346b9..3c6066869 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Form.form @@ -26,10 +26,10 @@ КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоиска - 29 + 30 КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоискаРасширеннаяПодсказка - 31 + 32 Label true true @@ -39,7 +39,7 @@ КомпоновщикНастроекПользовательскиеНастройкиСтрокаПоискаКонтекстноеМеню - 30 + 31 true КомпоновщикНастроекПользовательскиеНастройки @@ -49,10 +49,10 @@ КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотра - 32 + 33 КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотраРасширеннаяПодсказка - 34 + 35 Label true true @@ -62,7 +62,7 @@ КомпоновщикНастроекПользовательскиеНастройкиСостояниеПросмотраКонтекстноеМеню - 33 + 34 true ViewStatusAddition @@ -73,10 +73,10 @@ КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоиском - 35 + 36 КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоискомРасширеннаяПодсказка - 37 + 38 Label true true @@ -86,7 +86,7 @@ КомпоновщикНастроекПользовательскиеНастройкиУправлениеПоискомКонтекстноеМеню - 36 + 37 true SearchControlAddition @@ -96,7 +96,7 @@ - КомпоновщикНастроекПользовательскиеНастройкиРасширеннаяПодсказка + КомпоновщикНастроекПользовательскиеНастройкиExtendedTooltip 28 Label true @@ -150,8 +150,8 @@ None - РезультатРасширеннаяПодсказка - 46 + РезультатExtendedTooltip + 29 Label true true @@ -202,7 +202,7 @@ true - ФормаСформироватьОтчетРасширеннаяПодсказка + ФормаСформироватьОтчетExtendedTooltip 23 Label true @@ -228,7 +228,7 @@ true - ФормаНастройкиОтчетаРасширеннаяПодсказка + ФормаНастройкиОтчетаExtendedTooltip 24 Label true @@ -254,7 +254,7 @@ true - ФормаВыбратьНастройкуРасширеннаяПодсказка + ФормаВыбратьНастройкуExtendedTooltip 25 Label true @@ -281,7 +281,7 @@ true - ФормаСохранитьНастройкуРасширеннаяПодсказка + ФормаСохранитьНастройкуExtendedTooltip 26 Label true @@ -308,7 +308,7 @@ true - ФормаСтандартнаяНастройкаРасширеннаяПодсказка + ФормаСтандартнаяНастройкаExtendedTooltip 27 Label true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Module.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Module.bsl index 8f2bc3cd0..6fc1fac4a 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Module.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/СоставВыгрузки/Module.bsl @@ -75,7 +75,7 @@ Если ТипРасшифровки = Тип("Массив") Или ТипРасшифровки = Тип("СписокЗначений") Тогда // Расшифровка списка - ПараметрыРасшифровки.Вставить("НастройкиОбъекта", Объект); + ПараметрыРасшифровки.Вставить("АдресОбъекта", АдресЭтогоОбъекта()); ПараметрыРасшифровки.Вставить("УпрощенныйРежим", УпрощенныйРежим); ОткрытьФорму(БазовоеИмяДляФормы + "Форма.СоставВыгрузки", ПараметрыРасшифровки); @@ -88,7 +88,7 @@ ИначеЕсли Не ПустаяСтрока(ПараметрыРасшифровки.ПредставлениеСписка) Тогда // Открываем себя же с новыми параметрами - ПараметрыРасшифровки.Вставить("НастройкиОбъекта", Объект); + ПараметрыРасшифровки.Вставить("АдресОбъекта", АдресЭтогоОбъекта()); ПараметрыРасшифровки.Вставить("УпрощенныйРежим", УпрощенныйРежим); ОткрытьФорму(БазовоеИмяДляФормы + "Форма.СоставВыгрузки", ПараметрыРасшифровки); @@ -158,7 +158,7 @@ ОстановитьФормированиеОтчета(); // Запускаем новое, следить будем из обработки ожидания - АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор); + АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, ЭтотОбъект.УникальныйИдентификатор); ИдентификаторФоновогоЗадания = ЭтотОбъект().ФоновоеФормированиеТабличногоДокументаПользователя(АдресРезультатаФоновогоЗадания, Параметры.ПолноеИмяМетаданных, Параметры.ПредставлениеСписка, УпрощенныйРежим); Если ОбменДаннымиСервер.ФоновоеЗаданиеЗавершено(ИдентификаторФоновогоЗадания) Тогда ЗагрузитьРезультатОтчета(); @@ -279,3 +279,9 @@ КонецЦикла; КонецПроцедуры + +&НаСервере +Функция АдресЭтогоОбъекта() + Возврат ЭтотОбъект().СохранитьЭтотОбъект(УникальныйИдентификатор); +КонецФункции + diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form index 660c24bf5..e6f4495b7 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Form.form @@ -23,7 +23,7 @@ true - ДополнительнаяРегистрацияДобавитьРасширеннаяПодсказка + ДополнительнаяРегистрацияДобавитьExtendedTooltip 57 Label true @@ -49,7 +49,7 @@ true - ДополнительнаяРегистрацияУдалитьРасширеннаяПодсказка + ДополнительнаяРегистрацияУдалитьExtendedTooltip 58 Label true @@ -80,7 +80,7 @@ Доп регистрация действия - ДопРегистрацияДействияРасширеннаяПодсказка + ДопРегистрацияДействияExtendedTooltip 56 Label true @@ -106,7 +106,7 @@ true - НастройкиОтборовРасширеннаяПодсказка + НастройкиОтборовExtendedTooltip 60 Label true @@ -131,7 +131,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 59 Label true @@ -164,7 +164,7 @@ Доп регистрация командная панель - ДопРегистрацияКоманднаяПанельРасширеннаяПодсказка + ДопРегистрацияКоманднаяПанельExtendedTooltip 55 Label true @@ -210,8 +210,8 @@ Объект.ДополнительнаяРегистрация.Представление - ДополнительнаяРегистрацияПредставлениеРасширеннаяПодсказка - 71 + ДополнительнаяРегистрацияПредставлениеExtendedTooltip + 62 Label true true @@ -250,8 +250,8 @@ Объект.ДополнительнаяРегистрация.ОтборСтрокой - ДополнительнаяРегистрацияОтборСтрокойРасширеннаяПодсказка - 73 + ДополнительнаяРегистрацияОтборСтрокойExtendedTooltip + 63 Label true true @@ -297,8 +297,8 @@ Объект.ДополнительнаяРегистрация.Количество - ДополнительнаяРегистрацияКоличествоРасширеннаяПодсказка - 75 + ДополнительнаяРегистрацияКоличествоExtendedTooltip + 64 Label true true @@ -356,10 +356,10 @@ ДополнительнаяРегистрацияСтрокаПоиска - 62 + 71 ДополнительнаяРегистрацияСтрокаПоискаРасширеннаяПодсказка - 64 + 73 Label true true @@ -369,7 +369,7 @@ ДополнительнаяРегистрацияСтрокаПоискаКонтекстноеМеню - 63 + 72 true ДополнительнаяРегистрация @@ -379,10 +379,10 @@ ДополнительнаяРегистрацияСостояниеПросмотра - 65 + 74 ДополнительнаяРегистрацияСостояниеПросмотраРасширеннаяПодсказка - 67 + 76 Label true true @@ -392,7 +392,7 @@ ДополнительнаяРегистрацияСостояниеПросмотраКонтекстноеМеню - 66 + 75 true ViewStatusAddition @@ -403,10 +403,10 @@ ДополнительнаяРегистрацияУправлениеПоиском - 68 + 77 ДополнительнаяРегистрацияУправлениеПоискомРасширеннаяПодсказка - 70 + 79 Label true true @@ -416,7 +416,7 @@ ДополнительнаяРегистрацияУправлениеПоискомКонтекстноеМеню - 69 + 78 true SearchControlAddition @@ -426,7 +426,7 @@ - ДополнительнаяРегистрацияРасширеннаяПодсказка + ДополнительнаяРегистрацияExtendedTooltip 61 Label true @@ -482,8 +482,8 @@ true - СоставВыгрузкиРасширеннаяПодсказка - 86 + СоставВыгрузкиExtendedTooltip + 66 Label true true @@ -513,8 +513,8 @@ true - Декорация1РасширеннаяПодсказка - 87 + Декорация1ExtendedTooltip + 67 Label true true @@ -544,8 +544,8 @@ true - ОбновитьКоличествоРасширеннаяПодсказка - 88 + ОбновитьКоличествоExtendedTooltip + 68 Label true true @@ -574,8 +574,8 @@ true - КартинкаРасчетаКоличестваРасширеннаяПодсказка - 89 + КартинкаРасчетаКоличестваExtendedTooltip + 69 Label true true @@ -609,8 +609,8 @@ None - ОбщееКоличествоОбъектовРегистрацииРасширеннаяПодсказка - 90 + ОбщееКоличествоОбъектовРегистрацииExtendedTooltip + 70 Label true true @@ -649,8 +649,8 @@ true - ГруппаСоставВыгрузкиРасширеннаяПодсказка - 85 + ГруппаСоставВыгрузкиExtendedTooltip + 65 Label true true @@ -681,7 +681,7 @@ true - ФормаПодтвердитьВыборРасширеннаяПодсказка + ФормаПодтвердитьВыборExtendedTooltip 52 Label true @@ -707,7 +707,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 53 Label true @@ -733,7 +733,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 54 Label true diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl index b263605ac..04af581ef 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/Forms/Форма/Module.bsl @@ -86,7 +86,6 @@ &НаКлиенте Процедура ДополнительнаяРегистрацияПередУдалением(Элемент, Отказ) - Выделенные = Элементы.ДополнительнаяРегистрация.ВыделенныеСтроки; Количество = Выделенные.Количество(); Если Количество>1 Тогда @@ -97,16 +96,18 @@ Возврат; КонецЕсли; - ЗаголовокВопроса = НСтр("ru='Подтверждение'"); - ТекстВопроса = НСтр("ru='Удалить из дополнительных данных %1 ?'"); + // Действие будет произведено из подтверждения + Отказ = Истина; + ТекстВопроса = НСтр("ru='Удалить из дополнительных данных %1 ?'"); ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ТекстПредставления); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ЗаголовокВопроса); - Если Ответ<>КодВозвратаДиалога.Да Тогда - Отказ = Истина; - КонецЕсли; + ЗаголовокВопроса = НСтр("ru='Подтверждение'"); + Оповещение = Новый ОписаниеОповещения("ДополнительнаяРегистрацияПередУдалениемЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ВыделенныеСтроки", Выделенные); + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , ,ЗаголовокВопроса); КонецПроцедуры &НаКлиенте @@ -123,14 +124,14 @@ // Восстановление настроек ПредставлениеНастройки = ВыбранноеЗначение.ПредставлениеНастройки; Если Не ПустаяСтрока(ПредставлениеТекущейНастройки) И ПредставлениеНастройки<>ПредставлениеТекущейНастройки Тогда + ТекстВопроса = НСтр("ru='Восстановить настройки ""%1""?'"); + ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеНастройки); ТекстЗаголовка = НСтр("ru='Подтверждение'"); - ТекстВопроса = НСтр("ru='Восстановить настройки ""%1""?'"); - ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеНастройки); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); - Если Ответ=КодВозвратаДиалога.Да Тогда - УстановитьНастройкиСервер(ПредставлениеНастройки); - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ДополнительнаяРегистрацияОбработкаВыбораЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ПредставлениеНастройки", ПредставлениеНастройки); + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ТекстЗаголовка); Иначе ПредставлениеТекущейНастройки = ПредставлениеНастройки; КонецЕсли; @@ -187,21 +188,31 @@ Текст = НСтр("ru='Сохранить текущую настройку...'"); СписокВариантов.Добавить(1, Текст, , БиблиотекаКартинок.СохранитьНастройкиОтчета); - ВыбранныйВариант = ВыбратьИзМеню(СписокВариантов, Элементы.НастройкиОтборов); - Если ВыбранныйВариант=Неопределено Тогда + Оповещение = Новый ОписаниеОповещения("НастройкиОтборовВыборВариантаЗавершение", ЭтотОбъект); + + ПоказатьВыборИзМеню(Оповещение, СписокВариантов, Элементы.НастройкиОтборов); +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +// + +&НаКлиенте +Процедура НастройкиОтборовВыборВариантаЗавершение(Знач ВыбранныйЭлемент, Знач ДополнительныеПараметры) Экспорт + Если ВыбранныйЭлемент = Неопределено Тогда Возврат; КонецЕсли; - - ПредставлениеНастройки = ВыбранныйВариант.Значение; + + ПредставлениеНастройки = ВыбранныйЭлемент.Значение; Если ТипЗнч(ПредставлениеНастройки)=Тип("Строка") Тогда ТекстЗаголовка = НСтр("ru='Подтверждение'"); ТекстВопроса = НСтр("ru='Восстановить настройки ""%1""?'"); + ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеНастройки); - ТекстВопроса = СтрЗаменить(ТекстВопроса, "%1", ПредставлениеНастройки); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,,,ТекстЗаголовка); - Если Ответ=КодВозвратаДиалога.Да Тогда - УстановитьНастройкиСервер(ПредставлениеНастройки); - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("НастройкиОтборовЗавершение", ЭтотОбъект, Новый Структура); + Оповещение.ДополнительныеПараметры.Вставить("ПредставлениеНастройки", ПредставлениеНастройки); + + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , , ТекстЗаголовка); ИначеЕсли ПредставлениеНастройки=1 Тогда // Форма всех настроек @@ -211,11 +222,43 @@ Объект, ПредставлениеТекущейНастройки ), Элементы.ДополнительнаяРегистрация); КонецЕсли; + КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ -// +&НаКлиенте +Процедура НастройкиОтборовЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + УстановитьНастройкиСервер(ДополнительныеПараметры.ПредставлениеНастройки); +КонецПроцедуры + +&НаКлиенте +Процедура ДополнительнаяРегистрацияОбработкаВыбораЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + УстановитьНастройкиСервер(ДополнительныеПараметры.ПредставлениеНастройки); +КонецПроцедуры + +&НаКлиенте +Процедура ДополнительнаяРегистрацияПередУдалениемЗавершение(Знач РезультатВопроса, Знач ДополнительныеПараметры) Экспорт + Если РезультатВопроса <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + + ТаблицаУдаления = Объект.ДополнительнаяРегистрация; + Для Каждого ИдентификаторСтроки Из ДополнительныеПараметры.ВыделенныеСтроки Цикл + УдаляемаяСтрока = ТаблицаУдаления.НайтиПоИдентификатору(ИдентификаторСтроки); + Если УдаляемаяСтрока<>Неопределено Тогда + ТаблицаУдаления.Удалить(УдаляемаяСтрока); + КонецЕсли; + КонецЦикла; + + ОбновитьНадписьОбщегоКоличества(); +КонецПроцедуры &НаСервере Функция РезультатВыбораСервер() @@ -369,7 +412,7 @@ ОстановитьРасчетКоличеств(); // Запускаем новое, следить будем из обработки ожидания - АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, ЭтаФорма.УникальныйИдентификатор); + АдресРезультатаФоновогоЗадания = ПоместитьВоВременноеХранилище(Неопределено, ЭтотОбъект.УникальныйИдентификатор); ИдентификаторФоновогоЗадания = ЭтотОбъект().ФоновоеФормированиеДереваЗначений(АдресРезультатаФоновогоЗадания); Если ОбменДаннымиСервер.ФоновоеЗаданиеЗавершено(ИдентификаторФоновогоЗадания) Тогда Возврат ЗагрузитьЗначенияКоличеств(); diff --git a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl index 6f4ea7dcd..b8622de9f 100644 --- a/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl +++ b/SSL/src/DataProcessors/ИнтерактивноеИзменениеВыгрузки/ObjectModule.bsl @@ -784,40 +784,35 @@ Продолжить; КонецЕсли; - ИмяНабораПоМетаданным = СтрЗаменить(ПолноеИмяМетаданных, ".", "_"); - ИмяНабора = "Автоматически_" + ИмяНабораПоМетаданным; - Если ЭлементыНабораИзменения.Найти(ИмяНабора) = Неопределено Тогда - Набор = ЭлементыНабораИзменения.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - Набор.АвтоЗаполнениеДоступныхПолей = Ложь; - Набор.ИсточникДанных = ИсточникДанных; - Набор.Имя = ИмяНабора; - Набор.Запрос = " - |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ - | " + ИмяНабора + "_Изменения.Ссылка КАК ОбъектРегистрации, - | ТИП(" + ПолноеИмяМетаданных + ") КАК ОбъектРегистрацииТип, - | &ПричинаРегистрацииАвтоматически КАК ПричинаРегистрации - |ИЗ - | " + ПолноеИмяМетаданных + ".Изменения КАК " + ИмяНабора + "_Изменения - |ГДЕ - | Узел=&УзелИнформационнойБазы - |"; - КонецЕсли; + Набор = ЭлементыНабораИзменения.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - ИмяНабора = "Количество_" + ИмяНабораПоМетаданным; - Если ЭлементыНаборыКоличества.Найти(ИмяНабора) = Неопределено Тогда - Набор = ЭлементыНаборыКоличества.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - Набор.АвтоЗаполнениеДоступныхПолей = Истина; - Набор.ИсточникДанных = ИсточникДанных; - Набор.Имя = ИмяНабора; - Набор.Запрос = " - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | ТИП(" + ПолноеИмяМетаданных + ") КАК Тип, - | КОЛИЧЕСТВО(" + ИмяНабора + ".Ссылка) КАК ОбщееКоличество - |ИЗ - | " + ПолноеИмяМетаданных + " КАК " + ИмяНабора + " - |"; - КонецЕсли; + // В отбор попадет только если не строим отбор + Набор.АвтоЗаполнениеДоступныхПолей = Не ОграничиватьИспользованиеОтбором; + Набор.ИсточникДанных = ИсточникДанных; + Набор.Имя = "Автоматически" + Формат(ЭлементыНабораИзменения.Количество()-1, "ЧН=; ЧГ="); + Набор.Запрос = " + |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ + | Ссылка КАК ОбъектРегистрации, + | ТИП(" + ПолноеИмяМетаданных + ") КАК ОбъектРегистрацииТип, + | &ПричинаРегистрацииАвтоматически КАК ПричинаРегистрации + |ИЗ + | " + ПолноеИмяМетаданных + ".Изменения + |ГДЕ + | Узел=&УзелИнформационнойБазы + |"; + + Набор = ЭлементыНаборыКоличества.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + Набор.АвтоЗаполнениеДоступныхПолей = Истина; + Набор.ИсточникДанных = ИсточникДанных; + Набор.Имя = "Количества" + Формат(ЭлементыНаборыКоличества.Количество()-1, "ЧН=; ЧГ="); + Набор.Запрос = " + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | ТИП(" + ПолноеИмяМетаданных + ") КАК Тип, + | КОЛИЧЕСТВО(Ссылка) КАК ОбщееКоличество + |ИЗ + | " + ПолноеИмяМетаданных + " + |"; КонецЦикла; // Варианты дополнительных изменений @@ -853,28 +848,25 @@ Продолжить; КонецЕсли; - ИмяНабора = "Дополнительно_" + СтрЗаменить(ИмяДобавляемойТаблицы, ".", "_"); - Если ЭлементыНабораИзменения.Найти(ИмяНабора) = Неопределено Тогда - Набор = ЭлементыНабораИзменения.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); - Набор.ИсточникДанных = ИсточникДанных; - Набор.АвтоЗаполнениеДоступныхПолей = Истина; - Набор.Имя = ИмяНабора; + Набор = ЭлементыНабораИзменения.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); + Набор.ИсточникДанных = ИсточникДанных; + Набор.АвтоЗаполнениеДоступныхПолей = Истина; + Набор.Имя = "Дополнительно_" + СтрЗаменить(ИмяДобавляемойТаблицы, ".", "_"); + + Набор.Запрос = " + |ВЫБРАТЬ РАЗРЕШЕННЫЕ + | Ссылка КАК ОбъектРегистрации, + | ТИП(" + ИмяДобавляемойТаблицы + ") КАК ОбъектРегистрацииТип, + | &ПричинаРегистрацииДополнительно КАК ПричинаРегистрации + |ИЗ + | " + ИмяДобавляемойТаблицы + " + |"; - Набор.Запрос = " - |ВЫБРАТЬ РАЗРЕШЕННЫЕ - | " + ИмяНабора +".Ссылка КАК ОбъектРегистрации, - | ТИП(" + ИмяДобавляемойТаблицы + ") КАК ОбъектРегистрацииТип, - | &ПричинаРегистрацииДополнительно КАК ПричинаРегистрации - |ИЗ - | " + ИмяДобавляемойТаблицы + " КАК " + ИмяНабора + " - |"; - - // Добавляем дополнительные наборы для получения данных их табличных частей отбора - ПараметрыДобавления = Новый Структура; - ПараметрыДобавления.Вставить("ИмяДобавляемойТаблицы", ИмяДобавляемойТаблицы); - ПараметрыДобавления.Вставить("СхемаКомпоновки", СхемаКомпоновки); - ДобавитьДополнительныеНаборыКомпоновкиТабличныхЧастей(Строка.Отбор.Элементы, ПараметрыДобавления) - КонецЕсли; + // Добавляем дополнительные наборы для получения данных их табличных частей отбора + ПараметрыДобавления = Новый Структура; + ПараметрыДобавления.Вставить("ИмяДобавляемойТаблицы", ИмяДобавляемойТаблицы); + ПараметрыДобавления.Вставить("СхемаКомпоновки", СхемаКомпоновки); + ДобавитьДополнительныеНаборыКомпоновкиТабличныхЧастей(Строка.Отбор.Элементы, ПараметрыДобавления) КонецЦикла; КонецЦикла; @@ -998,10 +990,10 @@ КонецЕсли; Для Каждого Элемент Из ЭлементыИсточника Цикл + // Ветка разбора аналогична ветке в ДобавитьДополнительныеНаборыКомпоновкиТабличныхЧастей - Если ТипЗнч(Элемент) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда - ДобавитьДополнительныеНаборыКомпоновкиТабличныхЧастей(Элемент.Элементы, ПараметрыДобавления); - Продолжить; + Если ТипЗнч(Элемент)=Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда + ДобавитьДополнительныеНаборыКомпоновкиТабличныхЧастей(ЭлементыИсточника, ПараметрыДобавления) КонецЕсли; // Это элемент, смотрим чтобы попало на нашу табличку @@ -1035,35 +1027,28 @@ Псевдоним = СтрЗаменить(ИмяДобавляемойТаблицы, ".", "") + ИмяТаблицы; ИмяНабора = "Дополнительно_" + Псевдоним; Набор = ОбщийНабор.Элементы.Найти(ИмяНабора); - Если Набор = Неопределено Тогда + Если Набор=Неопределено Тогда Набор = ОбщийНабор.Элементы.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); Набор.АвтоЗаполнениеДоступныхПолей = Истина; Набор.ИсточникДанных = ИсточникДанных; Набор.Имя = ИмяНабора; - - ВсеПоляТабличнойЧасти = РеквизитыТабличнойЧастиДляЗапроса(МетаТабличнаяЧасть, Псевдоним); Набор.Запрос = " |ВЫБРАТЬ РАЗРЕШЕННЫЕ | Ссылка КАК ОбъектРегистрации, | ТИП(" + ИмяДобавляемойТаблицы + ") КАК ОбъектРегистрацииТип, | &ПричинаРегистрацииДополнительно КАК ПричинаРегистрации - | " + ВсеПоляТабличнойЧасти.ПоляЗапроса + " + | " + РеквизитыТабличнойЧастиДляЗапроса(МетаТабличнаяЧасть, Псевдоним) + " |ИЗ | " + ИмяДобавляемойТаблицы + "." + ИмяТаблицы + " |"; - - Для Каждого ИмяПоля Из ВсеПоляТабличнойЧасти.ИменаПолей Цикл - Поле = Набор.Поля.Найти(ИмяПоля); - Если Поле = Неопределено Тогда - Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); - Поле.ПутьКДанным = ИмяПоля; - Поле.Поле = ИмяПоля; - КонецЕсли; - Поле.ОграничениеИспользованияРеквизитов.Условие = Истина; - Поле.ОграничениеИспользованияРеквизитов.Поле = Истина; - Поле.ОграничениеИспользования.Условие = Истина; - Поле.ОграничениеИспользования.Поле = Истина; - КонецЦикла; + КонецЕсли; + + ПутьКДанным = Псевдоним + ПутьКДанным; + Поле = Набор.Поля.Найти(ПутьКДанным); + Если Поле=Неопределено Тогда + Поле = Набор.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); + Поле.ПутьКДанным = ПутьКДанным; + Поле.Поле = ПутьКДанным; КонецЕсли; КонецЕсли; @@ -1118,74 +1103,44 @@ ИмяТаблицы = Лев(ИмяПоля, Позиция-1); МетаТабличнаяЧасть = МетаОбъекта.ТабличныеЧасти.Найти(ИмяТаблицы); - Если Позиция = 0 Тогда - // Отбор к шапке, будет получен через ссылку + Если Позиция=0 Тогда + // Отбор к шапке, получим через ссылку ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбъектРегистрации." + ИмяПоля); Продолжить; - - ИначеЕсли МетаТабличнаяЧасть = Неопределено Тогда - // Табличная часть указана, но не наша. Усиливаем отбор. - ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); - ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолноеИмяМетаданных"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.Использование = Истина; - ЭлементОтбора.ПравоеЗначение = ""; - + ИначеЕсли МетаТабличнаяЧасть=Неопределено Тогда + // Табличная часть есть, но не наша Продолжить; КонецЕсли; // Отбор к табличной части + ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); + ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); + ПутьКДанным = Сред(ИмяПоля, Позиция + 1); - Если Лев(ПутьКДанным + ".", 7) = "Ссылка." Тогда + Если Лев(ПутьКДанным + ".", 7)="Ссылка." Тогда // Переадресуем на головную таблицу - ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); - ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбъектРегистрации." + Сред(ПутьКДанным, 8)); - - ИначеЕсли ПутьКДанным <> "НомерСтроки" И ПутьКДанным <> "Ссылка" - И МетаТабличнаяЧасть.Реквизиты.Найти(ПутьКДанным) = Неопределено - Тогда - // Табличная часть совпадает, но реквизит не наш. Усиливаем отбор. - ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); - ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); - ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ПолноеИмяМетаданных"); - ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; - ЭлементОтбора.Использование = Истина; - ЭлементОтбора.ПравоеЗначение = ""; - Иначе // Корректируем имя - ЭлементОтбора = ЭлементыПриемника.Добавить(Тип); - ЗаполнитьЗначенияСвойств(ЭлементОтбора, Элемент); ПутьКДанным = СтрЗаменить(ИмяДобавляемойТаблицы + ИмяТаблицы, ".", "") + ПутьКДанным; ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ПутьКДанным); КонецЕсли; - КонецЦикла; КонецПроцедуры -Функция РеквизитыТабличнойЧастиДляЗапроса(Знач МетаТабличнаяЧасть, Знач Префикс = "") - - ПоляЗапроса = ", НомерСтроки КАК " + Префикс + "НомерСтроки - |, Ссылка КАК " + Префикс + "Ссылка - |"; - - ИменаПолей = Новый Массив; - ИменаПолей.Добавить(Префикс + "НомерСтроки"); - ИменаПолей.Добавить(Префикс + "Ссылка"); - +Функция РеквизитыТабличнойЧастиДляЗапроса(Знач МетаТабличнаяЧасть, Знач Префикс="") + Результат = ""; Для Каждого МетаРеквизит Из МетаТабличнаяЧасть.Реквизиты Цикл - Имя = МетаРеквизит.Имя; + Имя = МетаРеквизит.Имя; Псевдоним = Префикс + Имя; - ПоляЗапроса = ПоляЗапроса + ", " + Имя + " КАК " + Псевдоним + Символы.ПС; - ИменаПолей.Добавить(Псевдоним); + + Результат = Результат + "," + Символы.ПС + Имя + " КАК " + Псевдоним; КонецЦикла; - Возврат Новый Структура("ПоляЗапроса, ИменаПолей", ПоляЗапроса, ИменаПолей); + Возврат Результат; КонецФункции // Возвращает параметры-ключи для сохранения настроек в разрезе плана обмена для всех пользователей diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form index addcd398e..21da8e793 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Form.form @@ -16,7 +16,7 @@ true - ФормаНазадРасширеннаяПодсказка + ФормаНазадExtendedTooltip 10 Label true @@ -42,7 +42,7 @@ true - ФормаВпередРасширеннаяПодсказка + ФормаВпередExtendedTooltip 11 Label true @@ -76,7 +76,7 @@ Без подменю - БезПодменюРасширеннаяПодсказка + БезПодменюExtendedTooltip 12 Label true @@ -101,7 +101,7 @@ Верхняя панель - ВерхняяПанельРасширеннаяПодсказка + ВерхняяПанельExtendedTooltip 9 Label true @@ -129,7 +129,7 @@ None - ВебСодержимоеРасширеннаяПодсказка + ВебСодержимоеExtendedTooltip 13 Label true @@ -174,8 +174,8 @@ Right - ПоказыватьПриНачалеРаботыРасширеннаяПодсказка - 15 + ПоказыватьПриНачалеРаботыExtendedTooltip + 14 Label true true diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl index fcf6346f7..f9e35aa2a 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Forms/Форма/Module.bsl @@ -10,8 +10,8 @@ ТекущаяСтрокаИндекс = -1; КонфигурацияБазовая = СтандартныеПодсистемыСервер.ЭтоБазоваяВерсияКонфигурации(); КонфигурацияМоделиСервиса = ОбщегоНазначенияПовтИсп.РазделениеВключено(); - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда - МодульОбменДаннымиПовтИсп = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("ОбменДаннымиПовтИсп"); + Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбменДанными") Тогда + МодульОбменДаннымиПовтИсп = ОбщегоНазначения.ОбщийМодуль("ОбменДаннымиПовтИсп"); КонфигурацияМоделиСервиса = КонфигурацияМоделиСервиса Или МодульОбменДаннымиПовтИсп.ЭтоАвтономноеРабочееМесто(); КонецЕсли; @@ -111,11 +111,17 @@ &НаСервере Процедура ОпределитьКаталогВременныхФайлов() - ПутьККаталогу = ПолучитьИмяВременногоФайла("extras"); + ПутьККаталогу = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла("extras")); СоздатьКаталог(ПутьККаталогу); - Каталог = Новый Файл(ПутьККаталогу); - КаталогВременныхФайлов = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(Каталог.ПолноеИмя); - Каталог = Неопределено; + ИмяВременногоФайла = ПутьККаталогу + "null.tmp"; + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.Вывод = ИспользованиеВывода.Разрешить; + ТекстовыйДокумент.Записать(ИмяВременногоФайла); + ТекстовыйДокумент = Неопределено; + + Найденные = НайтиФайлы(ПутьККаталогу, "*", Истина); + КаталогВременныхФайлов = Найденные[0].Путь; КонецПроцедуры &НаСервере @@ -130,7 +136,7 @@ // Чтение данных первой колонки ИмяМакета = ДанныеКолонки(ТабличныйДокумент, ПрефиксСтроки, 1, , "КонецТаблицы"); - Если НРег(ИмяМакета) = "конецтаблицы" Тогда + Если ВРег(ИмяМакета) = ВРег("КонецТаблицы") Тогда Прервать; КонецЕсли; diff --git a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html index d569d373c..6b1a09ea9 100644 --- a/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html +++ b/SSL/src/DataProcessors/ИнформацияПриЗапуске/Help/ru.html @@ -1,4 +1,4 @@ - +

                В этой форме выводится справочная, нормативная и другая информация, поставляемая в составе программы.

                Для открытия формы откройте Рабочий стол и вызовите команду "Информация при запуске" из группы "Информация" панели действий. При открытии сразу показывается одна из страниц дополнительной информации.

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

                diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form index de3dbf59f..a759fde3b 100644 --- a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Form.form @@ -16,7 +16,7 @@ БизнесПроцессПриИзменении - БизнесПроцессРасширеннаяПодсказка + БизнесПроцессExtendedTooltip 33 Label true @@ -60,8 +60,8 @@ Автор - АвторРасширеннаяПодсказка - 36 + АвторExtendedTooltip + 35 Label true true @@ -107,8 +107,8 @@ Дата - ДатаРасширеннаяПодсказка - 39 + ДатаExtendedTooltip + 37 Label true true @@ -157,8 +157,8 @@ None - СтатусРасширеннаяПодсказка - 43 + СтатусExtendedTooltip + 40 Label true true @@ -196,8 +196,8 @@ None - СостояниеРасширеннаяПодсказка - 45 + СостояниеExtendedTooltip + 41 Label true true @@ -233,8 +233,8 @@ Не завершен - ГруппаНеЗавершенРасширеннаяПодсказка - 42 + ГруппаНеЗавершенExtendedTooltip + 39 Label true true @@ -262,8 +262,8 @@ ДатаЗавершения - ДатаЗавершенияРасширеннаяПодсказка - 48 + ДатаЗавершенияExtendedTooltip + 43 Label true true @@ -303,8 +303,8 @@ Завершен - ГруппаЗавершенРасширеннаяПодсказка - 47 + ГруппаЗавершенExtendedTooltip + 42 Label true true @@ -326,8 +326,8 @@ 1 - ГруппаСтатусРасширеннаяПодсказка - 41 + ГруппаСтатусExtendedTooltip + 38 Label true true @@ -351,8 +351,8 @@ true - ГруппаСвойстваБизнесПроцессаРасширеннаяПодсказка - 38 + ГруппаСвойстваБизнесПроцессаExtendedTooltip + 36 Label true true @@ -379,8 +379,8 @@ Свойства бизнес процесса - СвойстваБизнесПроцессаРасширеннаяПодсказка - 35 + СвойстваБизнесПроцессаExtendedTooltip + 34 Label true true @@ -412,8 +412,8 @@ false - ЗадачиВТочкеМаршрутаРасширеннаяПодсказка - 51 + ЗадачиВТочкеМаршрутаExtendedTooltip + 45 Label true true @@ -439,8 +439,8 @@ false - ОбновитьРасширеннаяПодсказка - 52 + ОбновитьExtendedTooltip + 46 Label true true @@ -471,8 +471,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 50 + КоманднаяПанельExtendedTooltip + 44 Label true true @@ -499,8 +499,8 @@ None - КартаМаршрутаРасширеннаяПодсказка - 54 + КартаМаршрутаExtendedTooltip + 48 Label true true @@ -521,8 +521,8 @@ false - ЗадачиРасширеннаяПодсказка - 53 + ЗадачиExtendedTooltip + 47 Label true true diff --git a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl index 6d605bf2f..8e29fa7db 100644 --- a/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/КартаМаршрутаБизнесПроцесса/Forms/Форма/Module.bsl @@ -64,7 +64,7 @@ СвойстваБизнесПроцесса = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( БизнесПроцесс, "Автор,Дата,ДатаЗавершения,Завершен,Стартован" + ?(БизнесПроцесс.Метаданные().Реквизиты.Найти("Состояние") = Неопределено, "", ",Состояние")); - ЗаполнитьЗначенияСвойств(ЭтаФорма, СвойстваБизнесПроцесса); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, СвойстваБизнесПроцесса); Если СвойстваБизнесПроцесса.Завершен Тогда Статус = НСтр("ru = 'Завершен'"); Элементы.ГруппаСтатус.ТекущаяСтраница = Элементы.ГруппаЗавершен; @@ -82,7 +82,7 @@ Процедура ОткрытьСписокЗадачТочкиМаршрута() #Если ВебКлиент Тогда - Предупреждение(НСтр("ru = 'Данная операция недоступна в веб-клиенте.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Данная операция недоступна в веб-клиенте.'")); Возврат; #КонецЕсли ОчиститьСообщения(); @@ -111,7 +111,7 @@ Новый Структура("Отбор,ЗаголовокФормы,ПоказыватьЗадачи,ВидимостьОтборов,БлокировкаОкнаВладельца,Задача,БизнесПроцесс", Новый Структура("БизнесПроцесс,ТочкаМаршрута", БизнесПроцесс, ТекЭлемент.Значение), ЗаголовокФормы,0,Ложь,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца,Строка(ТекЭлемент.Значение),Строка(БизнесПроцесс)), - ЭтаФорма, БизнесПроцесс); + ЭтотОбъект, БизнесПроцесс); КонецПроцедуры diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl index 9bd3f37ca..aab668e8a 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовИнформационныхБаз/ObjectModule.bsl @@ -92,7 +92,8 @@ Перем XMLПравила; // xml-Строка, содержащая описание правил обмена Перем СтрокаТиповДляПриемника; Перем ПолеДокументыДляОтложенногоПроведения; // Таблица значений для проведения документов после загрузки данных -Перем ПолеОбъектыДляОтложеннойЗаписи; // Таблица значений для запись объектов ссылочных типов после загрузки данных +Перем СоответствиеДокументовДляОтложенногоПроведения; // Соответствие для хранения дополнительных свойств документов после загрузки данных +Перем ПолеОбъектыДляОтложеннойЗаписи; // Соответствие для записи объектов ссылочных типов после загрузки данных Перем ФайлОбмена; // Последовательно записываемый/читаемый файл обмена //////////////////////////////////////////////////////////////////////////////// @@ -430,24 +431,34 @@ // инициализируем таблицу для отложенного проведения документов ПолеДокументыДляОтложенногоПроведения = Новый ТаблицаЗначений; - ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументОбъект"); // Поле оставлено для совместимости с предыдущими версиями ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументСсылка"); ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДатаДокумента", одОписаниеТипа("Дата")); - ПолеДокументыДляОтложенногоПроведения.Колонки.Добавить("ДокументПроведенУспешно", одОписаниеТипа("Булево")); КонецЕсли; Возврат ПолеДокументыДляОтложенногоПроведения; + +КонецФункции + +Функция ДополнительныеСвойстваДляОтложенногоПроведения() + + Если ТипЗнч(СоответствиеДокументовДляОтложенногоПроведения) <> Тип("Соответствие") Тогда + + // Инициализируем соответствие для отложенного проведения документов + СоответствиеДокументовДляОтложенногоПроведения = Новый Соответствие; + + КонецЕсли; + + Возврат СоответствиеДокументовДляОтложенногоПроведения; + КонецФункции Функция ОбъектыДляОтложеннойЗаписи() - Если ТипЗнч(ПолеОбъектыДляОтложеннойЗаписи) <> Тип("ТаблицаЗначений") Тогда + Если ТипЗнч(ПолеОбъектыДляОтложеннойЗаписи) <> Тип("Соответствие") Тогда - // инициализируем таблицу для отложенной записи объектов - ПолеОбъектыДляОтложеннойЗаписи = Новый ТаблицаЗначений; - ПолеОбъектыДляОтложеннойЗаписи.Колонки.Добавить("ОбъектСсылка"); - ПолеОбъектыДляОтложеннойЗаписи.Колонки.Добавить("ОбъектЗаписанУспешно", одОписаниеТипа("Булево")); + // Инициализируем соответствие для отложенной записи объектов + ПолеОбъектыДляОтложеннойЗаписи = Новый Соответствие; КонецЕсли; @@ -604,7 +615,7 @@ КонецЦикла; - ПолеВерсияФорматаВходящегоСообщенияОбмена = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(РазрядыВерсий, "."); + ПолеВерсияФорматаВходящегоСообщенияОбмена = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(РазрядыВерсий, "."); КонецЕсли; @@ -798,6 +809,7 @@ ПолеСчетчикЗагруженныхОбъектов = Неопределено; ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСвойстваУзлаПланаОбмена = Неопределено; ПолеВерсияФорматаВходящегоСообщенияОбмена = Неопределено; ПолеРежимСовместимостиСБСП20 = Неопределено; @@ -887,6 +899,7 @@ // сбрасываем модальные переменные перед помещением обработки в платформенный кэш ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; ГлобальныйСтекНеЗаписанныхОбъектов = Неопределено; СоответствиеПравилКонвертации = Неопределено; @@ -915,6 +928,7 @@ ПолеРезультатВыполненияОбмена = Неопределено; ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСвойстваУзлаПланаОбмена = Неопределено; ПолеВерсияФорматаВходящегоСообщенияОбмена = Неопределено; ПолеРежимСовместимостиСБСП20 = Неопределено; @@ -951,6 +965,7 @@ // сбрасываем модальные переменные перед помещением обработки в платформенный кэш ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; ГлобальныйСтекНеЗаписанныхОбъектов = Неопределено; СоответствиеПравилКонвертации = Неопределено; @@ -976,6 +991,7 @@ ПолеРезультатВыполненияОбмена = Неопределено; ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСвойстваУзлаПланаОбмена = Неопределено; ПолеВерсияФорматаВходящегоСообщенияОбмена = Неопределено; ПолеРежимСовместимостиСБСП20 = Неопределено; @@ -1002,6 +1018,7 @@ // сбрасываем модальные переменные перед помещением обработки в платформенный кэш ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; ГлобальныйСтекНеЗаписанныхОбъектов = Неопределено; СоответствиеПравилКонвертации = Неопределено; @@ -1112,6 +1129,7 @@ // сбрасываем модальные переменные перед помещением обработки в платформенный кэш ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; ГлобальныйСтекНеЗаписанныхОбъектов = Неопределено; СоответствиеПравилКонвертации = Неопределено; @@ -1194,6 +1212,7 @@ ПолеСчетчикЗагруженныхОбъектов = Неопределено; ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСвойстваУзлаПланаОбмена = Неопределено; ПолеВерсияФорматаВходящегоСообщенияОбмена = Неопределено; ПолеРежимСовместимостиСБСП20 = Неопределено; @@ -1296,6 +1315,7 @@ // сбрасываем модальные переменные перед помещением обработки в платформенный кэш ПолеДокументыДляОтложенногоПроведения = Неопределено; ПолеОбъектыДляОтложеннойЗаписи = Неопределено; + СоответствиеДокументовДляОтложенногоПроведения = Неопределено; ПолеСоответствиеТиповДанныхДляЗагрузки = Неопределено; ГлобальныйСтекНеЗаписанныхОбъектов = Неопределено; ФайлОбмена = Неопределено; @@ -2307,7 +2327,7 @@ Отказ = Ложь; Свойства = Неопределено; - + ВходящиеДанные = Неопределено; ПриоритетОбъектовОбмена = Правило.ПриоритетОбъектовОбмена; Если ТипЗнч(НаборЗаписейДляВыгрузки) = Тип("Структура") Тогда @@ -2872,7 +2892,7 @@ НайденныйОбъектПоУникальномуИдентификатору = Неопределено, ОбщаяСтруктураСвойств = Неопределено, ОбщиеСвойстваПоиска = Неопределено, РежимПоискаОсновногоОбъекта = Истина, СтрокаЗапросаПоискаПоУникальномуИдентификатору = "") - + Если Свойство = "Имя" Тогда Возврат Менеджер[Значение]; @@ -2888,21 +2908,13 @@ ИначеЕсли Свойство = "{ИмяПредопределенногоЭлемента}" Тогда - Попытка - - Ссылка = Менеджер[Значение]; - - Исключение - + Ссылка = ПредопределенныйЭлементМенеджера(Менеджер, Значение); + Если Ссылка = Неопределено Тогда Ссылка = Менеджер.НайтиПоКоду(Значение); - Если Ссылка = Неопределено Тогда - Ссылка = Менеджер.ПустаяСсылка(); - КонецЕсли; - - КонецПопытки; + КонецЕсли; Возврат Ссылка; @@ -2916,6 +2928,30 @@ КонецФункции +// Возвращает значение предопределенного элемента по его имени +// +Функция ПредопределенныйЭлементМенеджера(Знач Менеджер, Знач ИмяПредопределенного) + + Запрос = Новый Запрос( СтрЗаменить(" + |ВЫБРАТЬ + | ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + | Ссылка КАК Ссылка + |ИЗ + | {ИмяТаблицы} + |ГДЕ + | Предопределенный + |", + "{ИмяТаблицы}", Метаданные.НайтиПоТипу(ТипЗнч(Менеджер)).ПолноеИмя() + )); + + Выборка = Запрос.Выполнить().Выбрать(); + Если Выборка.НайтиСледующий( Новый Структура("ИмяПредопределенныхДанных", ИмяПредопределенного) ) Тогда + Возврат Выборка.Ссылка; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + // Осуществляет простой поиск объекта информационной базы по указанному свойству. // // Параметры: @@ -4486,8 +4522,8 @@ ТаблицаПоляТаблицы.Свернуть("Приемник"); СвойстваМассив = ТаблицаПоляТаблицы.ВыгрузитьКолонку("Приемник"); - ПоляТаблицы = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(СвойстваМассив); - ПоляПоиска = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(СвойстваПоискаМассив); + ПоляТаблицы = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(СвойстваМассив); + ПоляПоиска = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(СвойстваПоискаМассив); Если Не ПустаяСтрока(ПоляТаблицы) Тогда одЗаписатьЭлемент(ЗаписьXML, "ПоляТаблицы", ПоляТаблицы); @@ -6182,7 +6218,6 @@ Попытка СтрокаДвижения.НаборЗаписей.Записать(); Исключение - ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения(Ложь); // возможно «сработал» RLS или подсистема даты запрета изменения ВызватьИсключение "Операция не выполнена: " + СтрокаДвижения.Имя + Символы.ПС + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; @@ -6556,13 +6591,10 @@ Объект = одНайтиОбъектПоСвойству(СтруктураСвойств.Менеджер, СвойствоПоиска, ЗначениеСвойстваПоиска, НайденныйИлиСозданныйОбъект, , , РежимПоискаОсновногоОбъекта, СтруктураСвойств.СтрокаПоиска); - ОбъектНайденИлиСоздан = НЕ (Объект = Неопределено - ИЛИ Объект.Пустая()); - - ОбъектНайден = НЕ Объект.Пустая(); + ОбъектНайден = НЕ (Объект = Неопределено + ИЛИ Объект.Пустая()); - - Если Не ОбъектНайденИлиСоздан + Если Не ОбъектНайден И СоздаватьНовыйЭлементЕслиНеНайден Тогда Объект = СоздатьНовыйОбъект(ТипОбъекта, СвойстваПоиска, НайденныйИлиСозданныйОбъект, @@ -6836,12 +6868,9 @@ ИмяПараметра = Свойство.Ключ; - // не по всем параметрам можно искать - Если ИмяПараметра = "{УникальныйИдентификатор}" - ИЛИ ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда - + // Не по всем параметрам можно искать + Если ИмяПараметра = "{УникальныйИдентификатор}" Или ИмяПараметра = "{ИмяПредопределенногоЭлемента}" Тогда Продолжить; - КонецЕсли; ЗначениеПараметра = Свойство.Значение; @@ -7629,7 +7658,7 @@ КонецЦикла; - КлючевыеПоляПоиска = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивКлючевыхПолейПоиска); + КлючевыеПоляПоиска = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивКлючевыхПолейПоиска); КонецЕсли; @@ -9431,7 +9460,20 @@ // документы которые просто нужно записать - так и записываем Если РежимЗаписи = РежимЗаписиДокумента.Запись Тогда - ЗаписатьОбъектВИБ(Объект, ТипОбъекта,, ОтправкаНазад); + // Отключаем механизм регистрации объектов при отмене проведения документа. + // Механизм регистрации будет выполнен при отложенном проведении документов + // (оптимизация производительности загрузки данных). + Объект.ДополнительныеСвойства.Вставить("ОтключитьМеханизмРегистрацииОбъектов"); + + ЗаписатьОбъектВИБ(Объект, ТипОбъекта, ЗаписатьОбъект, ОтправкаНазад); + + Если ЗаписатьОбъект + И Объект <> Неопределено + И Объект.Ссылка <> Неопределено Тогда + + ОбъектыДляОтложеннойЗаписи().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства); + + КонецЕсли; ИначеЕсли РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда @@ -9456,6 +9498,8 @@ СтрокаТаблицы.ДокументСсылка = Объект.Ссылка; СтрокаТаблицы.ДатаДокумента = Объект.Дата; + ДополнительныеСвойстваДляОтложенногоПроведения().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства); + КонецЕсли; КонецЕсли; @@ -9528,8 +9572,7 @@ И Объект <> Неопределено И Объект.Ссылка <> Неопределено Тогда - СтрокаТаблицы = ОбъектыДляОтложеннойЗаписи().Добавить(); - СтрокаТаблицы.ОбъектСсылка = Объект.Ссылка; + ОбъектыДляОтложеннойЗаписи().Вставить(Объект.Ссылка, Объект.ДополнительныеСвойства); КонецЕсли; @@ -13686,7 +13729,7 @@ // удаляем поле "Ссылка" из визуальных полей таблицы ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(МассивПодстрок, "Ссылка"); - СтрокаТаблицы.ПоляТаблицы = СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(МассивПодстрок); + СтрокаТаблицы.ПоляТаблицы = СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(МассивПодстрок); одПропустить(ФайлОбмена, ИмяУзла); @@ -14063,21 +14106,20 @@ КонецЕсли; // сворачиваем таблицу по уникальным полям - ДокументыДляОтложенногоПроведения().Свернуть("ДокументСсылка, ДатаДокумента, ДокументПроведенУспешно"); + ДокументыДляОтложенногоПроведения().Свернуть("ДокументСсылка, ДатаДокумента"); // сортируем документы по возрастанию даты документов ДокументыДляОтложенногоПроведения().Сортировать("ДатаДокумента"); - // инициализируем колонку результата проведения документа - ДокументыДляОтложенногоПроведения().ЗаполнитьЗначения(Ложь, "ДокументПроведенУспешно"); - Для Каждого СтрокаТаблицы Из ДокументыДляОтложенногоПроведения() Цикл - Если СтрокаТаблицы.ДокументСсылка.Пустая() Тогда + ДокументСсылка = СтрокаТаблицы.ДокументСсылка; + + Если ДокументСсылка.Пустая() Тогда Продолжить; КонецЕсли; - Объект = СтрокаТаблицы.ДокументСсылка.ПолучитьОбъект(); + Объект = ДокументСсылка.ПолучитьОбъект(); Если Объект = Неопределено Тогда Продолжить; @@ -14088,9 +14130,18 @@ УстановитьОбменДаннымиЗагрузка(Объект, Ложь); ОписаниеОшибки = ""; + ДокументПроведенУспешно = Ложь; Попытка + ДополнительныеСвойства = ДополнительныеСвойстваДляОтложенногоПроведения().Получить(ДокументСсылка); + + Для Каждого Свойство Из ДополнительныеСвойства Цикл + + Объект.ДополнительныеСвойства.Вставить(Свойство.Ключ, Свойство.Значение); + + КонецЦикла; + Объект.ДополнительныеСвойства.Вставить("ОтложенноеПроведение"); Если Объект.ПроверитьЗаполнение() Тогда @@ -14113,11 +14164,11 @@ // выполняем попытку проведения документа Объект.Записать(РежимЗаписиДокумента.Проведение); - СтрокаТаблицы.ДокументПроведенУспешно = Объект.Проведен; + ДокументПроведенУспешно = Объект.Проведен; Иначе - СтрокаТаблицы.ДокументПроведенУспешно = Ложь; + ДокументПроведенУспешно = Ложь; ОписаниеОшибки = НСтр("ru = 'Ошибка заполнения реквизитов документа'"); @@ -14127,14 +14178,13 @@ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СтрокаТаблицы.ДокументПроведенУспешно = Ложь; + ДокументПроведенУспешно = Ложь; КонецПопытки; ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения(Ложь); - // если документ провести не удалось фиксируем ошибку в ЖР - Если Не СтрокаТаблицы.ДокументПроведенУспешно Тогда + Если Не ДокументПроведенУспешно Тогда ОбменДаннымиСервер.ЗарегистрироватьОшибкуПроведенияДокумента(Объект, УзелОбменаЗагрузкаДанных, ОписаниеОшибки); @@ -14150,19 +14200,13 @@ Возврат // Нет объектов в очереди КонецЕсли; - // Сворачиваем таблицу по уникальным полям - ОбъектыДляОтложеннойЗаписи().Свернуть("ОбъектСсылка, ОбъектЗаписанУспешно"); - - // Инициализируем колонку результата записи объекта - ОбъектыДляОтложеннойЗаписи().ЗаполнитьЗначения(Ложь, "ОбъектЗаписанУспешно"); - - Для Каждого СтрокаТаблицы Из ОбъектыДляОтложеннойЗаписи() Цикл + Для Каждого ОбъектСоответствия Из ОбъектыДляОтложеннойЗаписи() Цикл - Если СтрокаТаблицы.ОбъектСсылка.Пустая() Тогда + Если ОбъектСоответствия.Ключ.Пустая() Тогда Продолжить; КонецЕсли; - Объект = СтрокаТаблицы.ОбъектСсылка.ПолучитьОбъект(); + Объект = ОбъектСоответствия.Ключ.ПолучитьОбъект(); Если Объект = Неопределено Тогда Продолжить; @@ -14173,9 +14217,18 @@ УстановитьОбменДаннымиЗагрузка(Объект, Ложь); ОписаниеОшибки = ""; + ОбъектЗаписанУспешно = Ложь; Попытка + ДополнительныеСвойства = ОбъектСоответствия.Значение; + + Для Каждого Свойство Из ДополнительныеСвойства Цикл + + Объект.ДополнительныеСвойства.Вставить(Свойство.Ключ, Свойство.Значение); + + КонецЦикла; + Объект.ДополнительныеСвойства.Вставить("ОтложеннаяЗапись"); Если Объект.ПроверитьЗаполнение() Тогда @@ -14198,11 +14251,11 @@ // выполняем попытку записи объекта Объект.Записать(); - СтрокаТаблицы.ОбъектЗаписанУспешно = Истина; + ОбъектЗаписанУспешно = Истина; Иначе - СтрокаТаблицы.ОбъектЗаписанУспешно = Ложь; + ОбъектЗаписанУспешно = Ложь; ОписаниеОшибки = НСтр("ru = 'Ошибка проверки заполнения реквизитов'"); @@ -14212,14 +14265,13 @@ ОписаниеОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); - СтрокаТаблицы.ОбъектЗаписанУспешно = Ложь; + ОбъектЗаписанУспешно = Ложь; КонецПопытки; ОбменДаннымиСервер.ПропуститьПроверкуЗапретаИзменения(Ложь); - // если документ провести не удалось фиксируем ошибку в ЖР - Если Не СтрокаТаблицы.ОбъектЗаписанУспешно Тогда + Если Не ОбъектЗаписанУспешно Тогда ОбменДаннымиСервер.ЗарегистрироватьОшибкуЗаписиОбъекта(Объект, УзелОбменаЗагрузкаДанных, ОписаниеОшибки); @@ -14519,7 +14571,7 @@ ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПоляПоискаКоллекция, "ЭтоГруппа"); - Возврат СтроковыеФункцииКлиентСервер.ПолучитьСтрокуИзМассиваПодстрок(ПоляПоискаКоллекция); + Возврат СтроковыеФункцииКлиентСервер.СтрокаИзМассиваПодстрок(ПоляПоискаКоллекция); КонецФункции // diff --git a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl index c86350294..f078cfc34 100644 --- a/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl +++ b/SSL/src/DataProcessors/КонвертацияОбъектовРаспределенныхИнформационныхБаз/ObjectModule.bsl @@ -23,7 +23,7 @@ ЗагрузитьМетаданные = ЗагрузитьТолькоПараметры И ОбменДаннымиСервер.ЭтоПодчиненныйУзелРИБ() И (ОбменДаннымиВызовСервера.ПовторитьЗагрузкуСообщенияОбменаДаннымиПередЗапуском() - ИЛИ НЕ ПараметрыСеанса.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском.Свойство( + ИЛИ НЕ ОбменДаннымиВызовСервера.РежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( "СообщениеПолученоИзКэша")); ЧтениеXML = Новый ЧтениеXML; @@ -109,24 +109,29 @@ Попытка + УстановитьПривилегированныйРежим(Истина); ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( "ЗагрузкаПараметровРаботыПрограммы", Истина); + УстановитьПривилегированныйРежим(Ложь); // Получаем изменения конфигурации, изменения данных игнорируем. ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции); - // Получаем идентификаторы объектов метаданных - ПрочитатьИдентификаторыОбъектовМетаданных(ЧтениеСообщения); + // Читаем приоритетные данные (идентификаторы объектов метаданных) + ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения); // Сообщение считаем не принятым, для этого прерываем чтение. ЧтениеСообщения.ПрерватьЧтение(); + УстановитьПривилегированныйРежим(Истина); ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( "ЗагрузкаПараметровРаботыПрограммы", Ложь); - + УстановитьПривилегированныйРежим(Ложь); Исключение + УстановитьПривилегированныйРежим(Истина); ОбменДаннымиСервер.УстановитьРежимЗагрузкиСообщенияОбменаДаннымиПередЗапуском( "ЗагрузкаПараметровРаботыПрограммы", Ложь); + УстановитьПривилегированныйРежим(Ложь); ЧтениеСообщения.ПрерватьЧтение(); ЗафиксироватьЗавершениеОбмена(Отказ, ОписаниеОшибки(), ОшибкаЧтенияФайлаСообщенияОбмена()); @@ -142,8 +147,8 @@ ЧтениеСообщения.ЧтениеXML.Прочитать(); // - // Получаем идентификаторы объектов метаданных - ПрочитатьИдентификаторыОбъектовМетаданных(ЧтениеСообщения); + // Читаем приоритетные данные (идентификаторы объектов метаданных) + ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения); // Сообщение считаем не принятым, для этого прерываем чтение. ЧтениеСообщения.ПрерватьЧтение(); @@ -162,8 +167,8 @@ // Получаем изменения конфигурации и изменения данных из сообщения обмена ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения, КоличествоЭлементовВТранзакции); - // Получаем идентификаторы объектов метаданных - ПрочитатьИдентификаторыОбъектовМетаданных(ЧтениеСообщения); + // Читаем приоритетные данные (идентификаторы объектов метаданных) + ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(ЧтениеСообщения); // Сообщение считаем принятым ЧтениеСообщения.ЗакончитьЧтение(); @@ -195,8 +200,8 @@ // Записываем изменения конфигурации и изменения данных в сообщение обмена ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, КоличествоЭлементовВТранзакции); - // Записываем идентификаторы объектов метаданных в конец сообщения обмена - ЗаписатьИдентификаторыОбъектовМетаданных(ЗаписьСообщения); + // Записываем приоритетные данные в конец сообщения обмена + ЗаписатьПриоритетныеИзмененияВСообщениеОбмена(ЗаписьСообщения); ЗаписьСообщения.ЗакончитьЗапись(); Исключение @@ -207,7 +212,10 @@ КонецПроцедуры -Процедура ЗаписатьИдентификаторыОбъектовМетаданных(Знач ЗаписьСообщения) +// Запись приоритетных данных в сообщение обмена. +// Например, идентификаторов объектов метаданных. +// +Процедура ЗаписатьПриоритетныеИзмененияВСообщениеОбмена(Знач ЗаписьСообщения) // Записываем элемент ЗаписьСообщения.ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters"); @@ -272,7 +280,10 @@ КонецПроцедуры -Процедура ПрочитатьИдентификаторыОбъектовМетаданных(Знач ЧтениеСообщения) +// Чтение приоритетных данных из сообщения обмена. +// Например, идентификаторов объектов метаданных. +// +Процедура ПрочитатьПриоритетныеИзмененияИзСообщенияОбмена(Знач ЧтениеСообщения) Если ЧтениеСообщения.Отправитель = ПланыОбмена.ГлавныйУзел() Тогда @@ -297,9 +308,7 @@ КонецЦикла; - Если СтандартныеПодсистемыПовтИсп.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбновитьУдалениеПредопределенных(); - КонецЕсли; + ОбновитьУдалениеПредопределенных(); ЗафиксироватьТранзакцию(); Исключение @@ -351,7 +360,7 @@ КоллекцииМетаданных.Добавить(Метаданные.ПланыВидовРасчета); Для каждого Коллекция Из КоллекцииМетаданных Цикл - Для каждого ОбъектМетаданных Из Коллекция Цикл + Для Каждого ОбъектМетаданных Из Коллекция Цикл ОбновитьУдалениеПредопределенного(ОбъектМетаданных.ПолноеИмя()); КонецЦикла; КонецЦикла; @@ -376,6 +385,7 @@ Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл + Если Лев(Выборка.ИмяПредопределенныхДанных, 1) = "#" Тогда ТекущийОбъект = Выборка.Ссылка.ПолучитьОбъект(); @@ -389,6 +399,7 @@ ТекущийОбъект.Записать(); КонецЕсли; + КонецЦикла; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form index 6fd609acf..5be917f36 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Form.form @@ -13,7 +13,7 @@ None - ТекстПредупрежденияРасширеннаяПодсказка + ТекстПредупрежденияExtendedTooltip 9 Label true @@ -55,8 +55,8 @@ true None - ПодтверждениеВыбораРасширеннаяПодсказка - 11 + ПодтверждениеВыбораExtendedTooltip + 10 Label true true @@ -110,8 +110,8 @@ true - ПримечаниеРасширеннаяПодсказка - 13 + ПримечаниеExtendedTooltip + 11 Label true true @@ -145,7 +145,7 @@ true - ФормаПродолжитьРасширеннаяПодсказка + ФормаПродолжитьExtendedTooltip 8 Label true @@ -173,7 +173,7 @@ ПриЗакрытии 75 - LockOwner + LockWholeInterface true true true @@ -254,6 +254,23 @@ true + + ПропуститьПерезапуск + + <key>ru</key> + <value>Пропустить перезапуск</value> + + 5 + + Boolean + + + true + + + true + + Продолжить @@ -284,7 +301,13 @@ <keyParameter>true</keyParameter> </parameters> <parameters> - <name>ПринудительныйЗапуск</name> + <name>ПрограммноеОткрытие</name> + <valueType> + <types>Boolean</types> + </valueType> + </parameters> + <parameters> + <name>ПропуститьПерезапуск</name> <valueType> <types>Boolean</types> </valueType> diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl index e63aa32cf..2ef5ff11c 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Forms/ПроверкаЛегальностиПолученияОбновления/Module.bsl @@ -8,19 +8,20 @@ Возврат; КонецЕсли; - Если Не Параметры.ПринудительныйЗапуск Тогда - ВызватьИсключение НСтр("ru='Обработка не предназначена для непосредственного использования.'"); + Если Не Параметры.ПрограммноеОткрытие Тогда + ВызватьИсключение + НСтр("ru = 'Обработка не предназначена для непосредственного использования.'"); КонецЕсли; - МакетДокумента = Обработки.ЛегальностьПолученияОбновлений.ПолучитьМакет("УсловияРаспространенияОбновлений"); + ПропуститьПерезапуск = Параметры.ПропуститьПерезапуск; + + МакетДокумента = Обработки.ЛегальностьПолученияОбновлений.ПолучитьМакет( + "УсловияРаспространенияОбновлений"); + ТекстПредупреждения = МакетДокумента.ПолучитьТекст(); - ПодтверждениеВыбора = 0; // пользователю требуется явно выбрать один из вариантов + ПодтверждениеВыбора = 0; // Пользователю требуется явно выбрать один из вариантов Элементы.Примечание.Видимость = Параметры.ПоказыватьПредупреждениеОПерезапуске; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Выполнить("РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс"); - КонецЕсли; - КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -30,13 +31,15 @@ Процедура ОсновныеДействияФормыПродолжить(Команда) Результат = ПодтверждениеВыбора = 1; + Если Результат <> Истина Тогда - Если Параметры.ПоказыватьПредупреждениеОПерезапуске Тогда + Если Параметры.ПоказыватьПредупреждениеОПерезапуске И НЕ ПропуститьПерезапуск Тогда ПрекратитьРаботуСистемы(); КонецЕсли; Иначе - ЛегальностьПолученияОбновленийПодтверждена(); + ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); КонецЕсли; + Закрыть(Результат); КонецПроцедуры @@ -45,15 +48,11 @@ Процедура ПриЗакрытии() Если Результат <> Истина Тогда - Если Параметры.ПоказыватьПредупреждениеОПерезапуске Тогда + Если Параметры.ПоказыватьПредупреждениеОПерезапуске И НЕ ПропуститьПерезапуск Тогда ПрекратитьРаботуСистемы(); КонецЕсли; Иначе - ЛегальностьПолученияОбновленийПодтверждена(); - КонецЕсли; - - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - ОбновлениеИнформационнойБазыКлиент.ПодключитьОбработчикПроверкиСтатусаОтложенногоОбновления(); + ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); КонецЕсли; Оповестить("ЛегальностьПолученияОбновлений", Результат); @@ -64,14 +63,10 @@ // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаСервере -Процедура ЛегальностьПолученияОбновленийПодтверждена() +Процедура ЗаписатьПодтверждениеЛегальностиПолученияОбновлений() - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() И Не ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - Возврат; - КонецЕсли; + УстановитьПривилегированныйРежим(Истина); - СведенияОбОбновлении = ОбновлениеИнформационнойБазы.СведенияОбОбновленииИнформационнойБазы(); - СведенияОбОбновлении.ЛегальностьПолученияОбновленияПодтверждена = Истина; - ОбновлениеИнформационнойБазы.ЗаписатьСведенияОбОбновленииИнформационнойБазы(СведенияОбОбновлении); + ОбновлениеИнформационнойБазы.ЗаписатьПодтверждениеЛегальностиПолученияОбновлений(); -КонецПроцедуры \ No newline at end of file +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html index fde835bc4..013df553f 100644 --- a/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html +++ b/SSL/src/DataProcessors/ЛегальностьПолученияОбновлений/Templates/УсловияРаспространенияОбновлений/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body scroll="auto"><font size="2" face="Verdana"> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body scroll="auto"><font size="2" face="Verdana"> <p align="center"><strong>УСЛОВИЯ РАСПРОСТРАНЕНИЯ ОБНОВЛЕНИЙ ПРОГРАММ "1С:ПРЕДПРИЯТИЕ"</strong></p> <p></p> <p>Обновления к программам производства фирмы "1С", также как и сами программы, являются объектами исключительного права фирмы "1С" и распространяются по правилам, установленным фирмой "1С" как правообладателем в соответствии со ст. 1225 Гражданского кодекса.</p> diff --git a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаРедактораТекстовогоДокумента/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Form.form similarity index 50% rename from SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаРедактораТекстовогоДокумента/Form.form rename to SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Form.form index 74b14455c..83c542f73 100644 --- a/SSL/src/DataProcessors/УниверсальныйОбменДаннымиXML/Forms/УправляемаяФормаРедактораТекстовогоДокумента/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Form.form @@ -1,29 +1,103 @@ <?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"> - <title> - <key>ru</key> - <value>Модуль отладки обработчиков и алгоритмов</value> - + - ПанельОбработчиков - 3 - - Страница_ПолеОбработчикиСобытий + Группа1 + 7 + + ДекорацияИнформация 4 - - ПолеОбработчикиСобытий + + <key>ru</key> + <value>Декорация информация</value> + + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 6 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 5 + true + + 6 + true + 2 + true + + + CommonPicture.Информация32 + + + + + Группа2 + 9 + + ДекорацияНапоминание 1 + + <key>ru</key> + <value>В клиент-серверноем варианте работы необходимо настроить +резервное копирование и восстановление данных средствами +СУБД или другими сторонними средствами.</value> + + true + true + + true + + + ДекорацияНапоминаниеРасширеннаяПодсказка + 3 + Label + true + true + + Left + + + + ДекорацияНапоминаниеКонтекстноеМеню + 2 + true + + Label + true + true + + Left + 3 + + + + ОтключитьНапоминания + 11 + + <key>ru</key> + <value>Больше не напоминать</value> + true true true - ПолеОбработчикиСобытий + ОтключитьНапоминания - None + Right - ПолеОбработчикиСобытийРасширеннаяПодсказка + ОтключитьНапоминанияРасширеннаяПодсказка 13 Label true @@ -33,170 +107,24 @@ - ПолеОбработчикиСобытийКонтекстноеМеню - 2 + ОтключитьНапоминанияКонтекстноеМеню + 12 true - TextDocumentField - true + CheckBoxField Enter true Left true - - 50 - true - 10 - true - true - true - + true true true - - <key>ru</key> - <value>Модуль отладки</value> - - - ru - Страница поле обработчики событий - - Страница_ПолеОбработчикиСобытийРасширеннаяПодсказка - 12 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - Страница_ПолеОшибкиВыгрузки - 5 - - ПолеОшибкиВыгрузки - 8 - true - true - - true - - - ПолеОшибкиВыгрузки - - None - - ПолеОшибкиВыгрузкиРасширеннаяПодсказка - 16 - Label - true - true - - Left - - - - ПолеОшибкиВыгрузкиКонтекстноеМеню - 9 - true - - TextDocumentField - true - Enter - true - Left - true - - 50 - true - 10 - true - true - true - - - true - true - - true - - - <key>ru</key> - <value>Ошибки выгрузки</value> - - - ru - Страница поле ошибки выгрузки - - - Страница_ПолеОшибкиВыгрузкиРасширеннаяПодсказка - 15 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Панель обработчиков</value> - - - ru - Панель обработчиков - - - ПанельОбработчиковРасширеннаяПодсказка - 11 - Label - true - true - - Left - - - Pages - - TabsOnTop - Auto - - - - ФормаКоманднаяПанель - -1 - - Закрыть - 7 - true - true - - true - - - ЗакрытьРасширеннаяПодсказка + Группа2РасширеннаяПодсказка 10 Label true @@ -205,35 +133,113 @@ Left - Form.StandardCommand.Close - Normal - PictureAndText + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 8 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + КоманднаяПанель + 16 + + ОК + 20 + true + true + + true + + + ОКРасширеннаяПодсказка + 21 + Label + true + true + + Left + + + Form.Command.ОК + Auto + true true true UserCmds Auto + true + true + + true + + + КоманднаяПанельРасширеннаяПодсказка + 17 + Label + true + true + + Left + + + CommandBar + + Right + + + + ФормаКоманднаяПанель + -1 Left OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockOwner true + true true Vertical true true true - UseIfNecessary auto true Объект 1 - DataProcessorObject.УниверсальныйОбменДаннымиXML + DataProcessorObject.НастройкаРезервногоКопированияИБ true @@ -244,14 +250,14 @@
                true
                - ПолеОбработчикиСобытий + ОтключитьНапоминания <key>ru</key> - <value>Поле обработчики событий</value> + <value>Отключить напоминания</value> 2 - TextDocument + Boolean true @@ -260,37 +266,28 @@ true - - ПолеОшибкиВыгрузки + + ОК <key>ru</key> - <value>Поле ошибки выгрузки</value> + <value>ОК</value> - 3 - - TextDocument - - + 1 + + ru + ОК + + true - - - true - - - - ИмяВременногоФайлаОбработчиковСобытий - - String - - - - - ИмяВременногоФайлаПротоколаОбмена - - String - - - + + + + ОК + + + Auto + Auto +
                diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Module.bsl new file mode 100644 index 000000000..0b4bf363b --- /dev/null +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/НапоминаниеКлиентСервер/Module.bsl @@ -0,0 +1,51 @@ + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + ПараметрыРезервногоКопирования = РезервноеКопированиеИБСервер.ПараметрыРезервногоКопирования(); + ОтключитьНапоминания = (ПараметрыРезервногоКопирования.ВыборПунктаНастройки = 3); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура ОК(Команда) + + ОКНаСервере(); + Оповестить("ЗакрытаФормаНастройкиРезервногоКопирования"); + Закрыть(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Процедура ОКНаСервере() + + ПараметрыРезервногоКопирования = РезервноеКопированиеИБСервер.ПараметрыРезервногоКопирования(); + + Если ОтключитьНапоминания Тогда + + Если ПараметрыРезервногоКопирования.ВыборПунктаНастройки <> 3 Тогда + + ПараметрыРезервногоКопирования.ВыборПунктаНастройки = 3; + РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + + КонецЕсли; + + Иначе + + ПараметрыРезервногоКопирования.ВыборПунктаНастройки = 0; + РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + + КонецЕсли; + +КонецПроцедуры + + diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Form.form deleted file mode 100644 index 8e64db266..000000000 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Form.form +++ /dev/null @@ -1,3556 +0,0 @@ - - - - <key>ru</key> - <value>Настройка резервного копирования информационной базы</value> - - - СтраницыПомощника - 3 - - СтраницаНачальногоОповещения - 4 - - ГруппаОповещенияОбОпасности - 8 - - КартинкаВнимание - 9 - - <key>ru</key> - <value>Картинка внимание</value> - - true - true - - true - - - КартинкаВниманиеРасширеннаяПодсказка - 271 - Label - true - true - - Left - - - - КартинкаВниманиеКонтекстноеМеню - 10 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - - НадписьВнимание - 11 - true - true - - true - - - НадписьВниманиеРасширеннаяПодсказка - 272 - Label - true - true - - Left - - - - НадписьВниманиеКонтекстноеМеню - 12 - true - - Label - true - 2 - true - true - - System.DefaultGUIFont - true - false - false - false - - - Left - Center - - - - Группа1 - 187 - true - true - - true - - - Группа1РасширеннаяПодсказка - 273 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - WeakSeparation - true - true - auto - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа оповещения об опасности</value> - - - ru - Группа оповещения об опасности - - - ГруппаОповещенияОбОпасностиРасширеннаяПодсказка - 270 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ПереключательКодТипаРезервногоКопирования - 13 - - <key>ru</key> - <value>Выберите действие</value> - - - System.DefaultGUIFont - false - false - false - false - - true - true - - true - - - Объект.КодТипаРезервногоКопирования - - Top - - OnChange - ПереключательКодТипаРезервногоКопированияПриИзменении - - - ПереключательКодТипаРезервногоКопированияРасширеннаяПодсказка - 274 - Label - true - true - - Left - - - - ПереключательКодТипаРезервногоКопированияКонтекстноеМеню - 14 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Настроить выполнение резервного копирования (рекомендуется) - - - 1 - - - - - ru - Не требуется резервное копирование, так как оно выполняется средствами СУБД или другими сторонними программами - - - 2 - - - - - ru - Напомнить мне о необходимости настройки резервного копирования позднее - - - 3 - - - Vertical - - - - СтраницыПараметровОтложенногоОповещения - 132 - - ПустаяСтраница - 135 - - ПустаяНадпись - 136 - true - true - - true - - - ПустаяНадписьРасширеннаяПодсказка - 278 - Label - true - true - - Left - - - - ПустаяНадписьКонтекстноеМеню - 137 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Пустая страница</value> - - - ru - Пустая страница - - - ПустаяСтраницаРасширеннаяПодсказка - 277 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаПараметровОтложенногоОповещения - 133 - - ГруппаПараметровНапоминания1 - 127 - - ПериодОповещения1 - 128 - - <key>ru</key> - <value>Через</value> - - true - true - - true - - - Объект.ПериодОповещения - - Left - - ПериодОповещения1РасширеннаяПодсказка - 281 - Label - true - true - - Left - - - - ПериодОповещения1КонтекстноеМеню - 129 - true - - InputField - true - Enter - true - Left - true - - 5 - true - true - true - true - true - true - true - - 1 - - Normal - - - - ЕдиницаИзмеренияПериодаОповещения2 - 130 - true - true - - true - - - Объект.ЕдиницаИзмеренияПериодаОповещения - - None - - ЕдиницаИзмеренияПериодаОповещения2РасширеннаяПодсказка - 283 - Label - true - true - - Left - - - - ЕдиницаИзмеренияПериодаОповещения2КонтекстноеМеню - 131 - true - - InputField - true - Enter - true - Left - true - - 5 - true - true - true - true - true - true - true - true - - - ru - мин. - - - Минута - - - - - ru - час. - - - Час - - - - - ru - дн. - - - День - - - - - ru - нед. - - - Неделя - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа параметров напоминания</value> - - - ru - Группа параметров напоминания - - - ГруппаПараметровНапоминания1РасширеннаяПодсказка - 280 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница параметров отложенного оповещения</value> - - - ru - Страница параметров отложенного оповещения - - - СтраницаПараметровОтложенногоОповещенияРасширеннаяПодсказка - 279 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Страницы параметров отложенного оповещения</value> - - - ru - Страницы параметров отложенного оповещения - - true - - СтраницыПараметровОтложенногоОповещенияРасширеннаяПодсказка - 276 - Label - true - true - - Left - - - Pages - - Auto - - - - ИнформационнаяНадпись - 15 - - <key>ru</key> - <value>Нажмите "Далее", чтобы перейти к настройке резервного копирования по расписанию.</value> - - true - true - - true - - - ИнформационнаяНадписьРасширеннаяПодсказка - 285 - Label - true - true - - Left - - - - ИнформационнаяНадписьКонтекстноеМеню - 16 - true - - Label - true - 10 - true - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница начального оповещения</value> - - - ru - Страница начального оповещения - - - СтраницаНачальногоОповещенияРасширеннаяПодсказка - 269 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаНастройкиПараметровРезервногоКопирования - 6 - - ГруппаПриветствияПриНастройкеРасписанияРК - 47 - - ВариантПроведенияРезервногоКопирования - 245 - - <key>ru</key> - <value>Выберите способ проведения резервного копирования:</value> - - true - true - - true - - - Объект.ВариантПроведенияРезервногоКопирования - - - OnChange - ВариантПроведенияРезервногоКопированияПриИзменении - - - ВариантПроведенияРезервногоКопированияРасширеннаяПодсказка - 288 - Label - true - true - - Left - - - - ВариантПроведенияРезервногоКопированияКонтекстноеМеню - 246 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Выполнять резервное копирование по расписанию - - - 1 - - - - - ru - Выполнять резервное копирование при завершении работы - - - 2 - - - Vertical - - - true - true - - true - - - <key>ru</key> - <value>Группа приветствия при настройке расписания РК</value> - - - ru - Группа приветствия при настройке расписания РК - - - ГруппаПриветствияПриНастройкеРасписанияРКРасширеннаяПодсказка - 287 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаНастройкиРасписанияКопирования - 57 - - Декорация2 - 58 - true - true - - true - - - Декорация2РасширеннаяПодсказка - 291 - Label - true - true - - Left - - - - Декорация2КонтекстноеМеню - 59 - true - - 4 - true - 1 - true - - - StdPicture.ScheduledJob - - - - - ВариантРасписанияРезервногоКопирования - 93 - - <key>ru</key> - <value>Расписание </value> - - true - true - - true - - - Объект.ВариантРасписанияРезервногоКопирования - - - OnChange - ВариантРасписанияРезервногоКопированияПриИзменении - - - ВариантРасписанияРезервногоКопированияРасширеннаяПодсказка - 292 - Label - true - true - - Left - - - - ВариантРасписанияРезервногоКопированияКонтекстноеМеню - 94 - true - - InputField - Enter - true - Left - true - - 25 - true - true - false - true - true - true - true - true - - - ru - Еженедельно, в пятницу, в 23:30 - - - 1 - - - - - ru - Ежедневно в 23:30 - - - 2 - - - - - ru - По вторникам и четвергам в 23:30 - - - 3 - - - Normal - - - - ИзменитьРасписание - 238 - true - true - - true - - - ИзменитьРасписаниеРасширеннаяПодсказка - 294 - Label - true - true - - Left - - - UsualButton - Form.Command.ИзменитьРасписание - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - <key>ru</key> - <value>Шаг 2: Настройка расписания проведения резервного копирования</value> - - - ru - Группа настройки расписания копирования - - true - - ГруппаНастройкиРасписанияКопированияРасширеннаяПодсказка - 290 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаЗаведенияПутиКопирования1 - 52 - - НадписьПутьКопирования1 - 53 - - <key>ru</key> - <value>Укажите каталог, куда будут сохраняться резервные копии информационной базы:</value> - - true - true - - true - - - НадписьПутьКопирования1РасширеннаяПодсказка - 296 - Label - true - true - - Left - - - - НадписьПутьКопирования1КонтекстноеМеню - 54 - true - - Label - true - true - true - - Left - - - - ПутьККаталогуАрхивов2 - 55 - - <key>ru</key> - <value>Каталог</value> - - true - true - - true - - - Объект.КаталогСРезервнымиКопиями - - None - - ПутьККаталогуАрхивов2РасширеннаяПодсказка - 297 - Label - true - true - - Left - - - - ПутьККаталогуАрхивов2КонтекстноеМеню - 56 - true - - InputField - Left - Enter - true - Left - true - - - StartChoice - ПутьККаталогуАрхивов2НачалоВыбора - - true - true - true - true - true - true - true - true - Normal - - - - НадписьРекомендацииПоВыборуПути2 - 202 - - <key>ru</key> - <value>Рекомендуется выполнять резервное копирование на другой компьютер или внешний носитель.</value> - - true - true - - true - - - НадписьРекомендацииПоВыборуПути2РасширеннаяПодсказка - 299 - Label - true - true - - Left - - - - НадписьРекомендацииПоВыборуПути2КонтекстноеМеню - 203 - true - - Label - true - true - true - - Style.ПоясняющийТекст - - - Left - Top - - - true - true - - true - - - <key>ru</key> - <value>Шаг 1. Выбор каталога</value> - - - ru - Шаг 1 - - true - - ГруппаЗаведенияПутиКопирования1РасширеннаяПодсказка - 295 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаАвторизации - 254 - - АдминистраторИБ1 - 255 - true - false - - true - - - АдминистраторИБ - - - АдминистраторИБ1РасширеннаяПодсказка - 301 - Label - true - true - - Left - - - - АдминистраторИБ1КонтекстноеМеню - 256 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - Normal - - - - ПарольАдминистратораИБ1 - 257 - true - true - - true - - - ПарольАдминистратораИБ - - - ПарольАдминистратораИБ1РасширеннаяПодсказка - 303 - Label - true - true - - Left - - - - ПарольАдминистратораИБ1КонтекстноеМеню - 258 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>Введите пароль администратора информационной базы (если задан)</value> - - - ru - Группа авторизации - - - ГруппаАвторизацииРасширеннаяПодсказка - 300 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаВыбораОчисткиКаталогаОтСтарыхФайлов1 - 62 - - ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении1 - 63 - - <key>ru</key> - <value>Хранить ограниченное количество старых копий</value> - - true - true - - true - - - Объект.ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении - - Right - - OnChange - ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении1ПриИзменении - - - ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении1РасширеннаяПодсказка - 306 - Label - true - true - - Left - - - - ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении1КонтекстноеМеню - 64 - true - - CheckBoxField - Enter - true - Left - true - - - - ГруппаВыбораТипаОчистки - 65 - - ТипОграниченияКаталогаСРезервнымиКопиями - 66 - true - true - - true - - - Объект.ТипОграниченияКаталогаСРезервнымиКопиями - - None - - ТипОграниченияКаталогаСРезервнымиКопиямиРасширеннаяПодсказка - 309 - Label - true - true - - Left - - - - ТипОграниченияКаталогаСРезервнымиКопиямиКонтекстноеМеню - 67 - true - - RadioButtonField - Top - Enter - true - Left - true - - 1 - - - ru - Хранить резервные копии за последние: - - - ПоПериоду - - - - - ru - Максимальное количество копий (шт.): - - - МаксКопий - - - Vertical - - - - Группа5 - 68 - - Группа4 - 69 - - ДатаПоследнегоАктуальногоАрхива1 - 70 - - <key>ru</key> - <value>Хранить резервные копии за последние</value> - - true - true - - true - - - Объект.ПериодХраненияРезервныхКопий - - None - - ДатаПоследнегоАктуальногоАрхива1РасширеннаяПодсказка - 313 - Label - true - true - - Left - - - - ДатаПоследнегоАктуальногоАрхива1КонтекстноеМеню - 71 - true - - InputField - Enter - true - Left - true - - 6 - true - true - true - true - true - true - - 1 - - Normal - - - - ЕдиницаИзмеренияПериодаХраненияРезервныхКопий - 72 - true - true - - true - - - Объект.ЕдиницаИзмеренияПериодаХраненияРезервныхКопий - - None - - ЕдиницаИзмеренияПериодаХраненияРезервныхКопийРасширеннаяПодсказка - 315 - Label - true - true - - Left - - - - ЕдиницаИзмеренияПериодаХраненияРезервныхКопийКонтекстноеМеню - 73 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - true - - - ru - дн. - - - День - - - - - ru - нед. - - - Неделя - - - - - ru - мес. - - - Месяц - - - - - ru - лет - - - Год - - - Normal - - - true - true - - true - - - Группа4РасширеннаяПодсказка - 312 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - КоличествоКопийВКаталоге1 - 74 - - <key>ru</key> - <value>Максимальное количество копий (шт.)</value> - - true - true - - true - - - Объект.КоличествоКопийВКаталоге - - None - - КоличествоКопийВКаталоге1РасширеннаяПодсказка - 317 - Label - true - true - - Left - - - - КоличествоКопийВКаталоге1КонтекстноеМеню - 75 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - - 1 - - Normal - - - true - true - - true - - - Группа5РасширеннаяПодсказка - 311 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа выбора типа очистки</value> - - - ru - Группа выбора типа очистки - - - ГруппаВыбораТипаОчисткиРасширеннаяПодсказка - 308 - Label - true - true - - Left - - - UsualGroup - - Auto - StrongSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Шаг 3: Очистка каталога от старых архивов</value> - - - ru - Группа выбора очистки каталога от старых файлов - - true - - ГруппаВыбораОчисткиКаталогаОтСтарыхФайлов1РасширеннаяПодсказка - 305 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаФлажка - 145 - - ВыполнитьРезервноеКопированиеСейчас - 115 - - <key>ru</key> - <value>Также выполнить резервное копирование прямо сейчас</value> - - true - true - - true - - - Объект.ВыполнитьРезервноеКопированиеСейчас - - Right - - ВыполнитьРезервноеКопированиеСейчасРасширеннаяПодсказка - 320 - Label - true - true - - Left - - - - ВыполнитьРезервноеКопированиеСейчасКонтекстноеМеню - 116 - true - - CheckBoxField - Bottom - Enter - true - Left - true - - - true - true - - true - - - <key>ru</key> - <value>Группа флажка</value> - - - ru - Группа флажка - - - ГруппаФлажкаРасширеннаяПодсказка - 319 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница настройки параметров резервного копирования</value> - - - ru - Страница настройки параметров резервного копирования - - - СтраницаНастройкиПараметровРезервногоКопированияРасширеннаяПодсказка - 286 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаДляПользователяБезПрав - 151 - - ГруппаОповещенияОбОпасности1 - 152 - - КартинкаВнимание1 - 153 - - <key>ru</key> - <value>Картинка внимание</value> - - true - true - - true - - - КартинкаВнимание1РасширеннаяПодсказка - 324 - Label - true - true - - Left - - - - КартинкаВнимание1КонтекстноеМеню - 154 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - - НадписьВнимание1 - 155 - - <key>ru</key> - <value>Внимание! Данные информационной базы подвергаются риску, -так как не выполняется их резервное копирование.</value> - - true - true - - true - - - НадписьВнимание1РасширеннаяПодсказка - 325 - Label - true - true - - Left - - - - НадписьВнимание1КонтекстноеМеню - 156 - true - - Label - true - true - true - - System.DefaultGUIFont - true - false - false - false - - - Left - 2 - - - true - true - - true - - - <key>ru</key> - <value>Группа оповещения об опасности</value> - - - ru - Группа оповещения об опасности - - - ГруппаОповещенияОбОпасности1РасширеннаяПодсказка - 323 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаПоясненияДальнейшихДействий - 157 - - НадписьНедостаточноПрав - 158 - - <key>ru</key> - <value>Недостаточно прав для выполнения операции резервного копирования данных. Обратитесь к администратору.</value> - - true - true - - true - - - НадписьНедостаточноПравРасширеннаяПодсказка - 327 - Label - true - true - - Left - - - - НадписьНедостаточноПравКонтекстноеМеню - 159 - true - - Label - true - true - - Left - 2 - - - true - true - - true - - - ru - Группа пояснения дальнейших действий - - - ГруппаПоясненияДальнейшихДействийРасширеннаяПодсказка - 326 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - Auto - Auto - - - - Декорация4 - 241 - true - true - - true - - - Декорация4РасширеннаяПодсказка - 328 - Label - true - true - - Left - - - - Декорация4КонтекстноеМеню - 242 - true - - Label - true - true - true - - Left - - - - НадписьГотово - 185 - - <key>ru</key> - <value>Нажмите "Готово" для завершения работы помощника.</value> - - true - true - - true - - - НадписьГотовоРасширеннаяПодсказка - 329 - Label - true - true - - Left - - - - НадписьГотовоКонтекстноеМеню - 186 - true - - Label - true - true - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница для пользователя без прав</value> - - - ru - Страница для пользователя без прав - - - СтраницаДляПользователяБезПравРасширеннаяПодсказка - 322 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаНачальногоОповещенияКлиентСервер - 160 - - ГруппаОповещенияОбОпасности2 - 161 - - КартинкаВнимание2 - 162 - - <key>ru</key> - <value>Картинка внимание</value> - - true - true - - true - - - КартинкаВнимание2РасширеннаяПодсказка - 332 - Label - true - true - - Left - - - - КартинкаВнимание2КонтекстноеМеню - 163 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - - НадписьВнимание2 - 164 - - <key>ru</key> - <value>Внимание! Данные информационной базы подвергаются риску, -так как не выполняется их резервное копирование.</value> - - true - true - - true - - - НадписьВнимание2РасширеннаяПодсказка - 333 - Label - true - true - - Left - - - - НадписьВнимание2КонтекстноеМеню - 165 - true - - Label - true - true - true - - System.DefaultGUIFont - true - false - false - false - - - Left - 2 - - - true - true - - true - - - <key>ru</key> - <value>Группа оповещения об опасности</value> - - - ru - Группа оповещения об опасности - - - ГруппаОповещенияОбОпасности2РасширеннаяПодсказка - 331 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ПереключательКодТипаРезервногоКопированияКС - 168 - - <key>ru</key> - <value>Выберите вариант решения проблемы</value> - - - System.DefaultGUIFont - false - false - false - false - - true - true - - true - - - Объект.КодТипаРезервногоКопирования - - Top - - OnChange - ПереключательКодТипаРезервногоКопированияКСПриИзменении - - - ПереключательКодТипаРезервногоКопированияКСРасширеннаяПодсказка - 334 - Label - true - true - - Left - - - - ПереключательКодТипаРезервногоКопированияКСКонтекстноеМеню - 169 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Резервное копирование выполняется сторонними средствами (рекомендуется) - - - 2 - - - - - ru - Напоминать мне о необходимости резервного копирования в дальнейшем - - - 3 - - - Vertical - - - - СтраницыПараметровОтложенногоОповещения1 - 170 - - ПустаяСтраница1 - 171 - - ПустаяНадпись1 - 172 - true - true - - true - - - ПустаяНадпись1РасширеннаяПодсказка - 338 - Label - true - true - - Left - - - - ПустаяНадпись1КонтекстноеМеню - 173 - true - - Label - true - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Пустая страница</value> - - - ru - Пустая страница - - - ПустаяСтраница1РасширеннаяПодсказка - 337 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаПараметровОтложенногоОповещения1 - 174 - - ГруппаПараметровНапоминания2 - 175 - - ПериодОповещения2 - 176 - - <key>ru</key> - <value>Через</value> - - true - true - - true - - - Объект.ПериодОтложенногоОповещения - - Left - - ПериодОповещения2РасширеннаяПодсказка - 341 - Label - true - true - - Left - - - - ПериодОповещения2КонтекстноеМеню - 177 - true - - InputField - true - Enter - true - Left - true - - 5 - true - true - true - true - true - true - true - Normal - - - - ЕдиницаИзмеренияПериодаОповещения3 - 178 - true - true - - true - - - Объект.ЕдиницаИзмеренияПериодаОповещения - - None - - ЕдиницаИзмеренияПериодаОповещения3РасширеннаяПодсказка - 343 - Label - true - true - - Left - - - - ЕдиницаИзмеренияПериодаОповещения3КонтекстноеМеню - 179 - true - - InputField - true - Enter - true - Left - true - - 5 - true - true - true - true - true - true - true - true - - - ru - мин. - - - Минута - - - - - ru - час. - - - Час - - - - - ru - дн. - - - День - - - - - ru - нед. - - - Неделя - - - Normal - - - true - true - - true - - - <key>ru</key> - <value>Группа параметров напоминания</value> - - - ru - Группа параметров напоминания - - - ГруппаПараметровНапоминания2РасширеннаяПодсказка - 340 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Страница параметров отложенного оповещения</value> - - - ru - Страница параметров отложенного оповещения - - - СтраницаПараметровОтложенногоОповещения1РасширеннаяПодсказка - 339 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Страницы параметров отложенного оповещения</value> - - - ru - Страницы параметров отложенного оповещения - - - СтраницыПараметровОтложенногоОповещения1РасширеннаяПодсказка - 336 - Label - true - true - - Left - - - Pages - - Auto - - - - Декорация5 - 243 - true - true - - true - - - Декорация5РасширеннаяПодсказка - 345 - Label - true - true - - Left - - - - Декорация5КонтекстноеМеню - 244 - true - - Label - true - true - true - - Left - - - - ИнформационнаяНадпись1 - 183 - - <key>ru</key> - <value>Нажмите "Готово", чтобы отложить оповещение о резервном копировании на выбранный срок.</value> - - true - true - - true - - - ИнформационнаяНадпись1РасширеннаяПодсказка - 346 - Label - true - true - - Left - - - - ИнформационнаяНадпись1КонтекстноеМеню - 184 - true - - Label - true - true - - Left - Bottom - 1 - - - true - true - - true - - - <key>ru</key> - <value>Страница начального оповещения клиент сервер</value> - - - ru - Страница начального оповещения клиент сервер - - - СтраницаНачальногоОповещенияКлиентСерверРасширеннаяПодсказка - 330 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - ДополнительныеНастройки - 204 - - НадписьШапкаДополнительныеНастройки - 205 - - <key>ru</key> - <value>Настройка не завершена</value> - - true - true - - true - - - НадписьШапкаДополнительныеНастройкиРасширеннаяПодсказка - 348 - Label - true - true - - Left - - - - НадписьШапкаДополнительныеНастройкиКонтекстноеМеню - 206 - true - - Label - true - 2 - true - true - false - - System.DefaultGUIFont - 12.0 - true - false - false - false - - - Left - - - - ГоризонтальнаяГруппаОшибкаПодключения - 207 - - Картинка12 - 208 - true - true - - true - - - Картинка12РасширеннаяПодсказка - 350 - Label - true - true - - Left - - - - Картинка12КонтекстноеМеню - 209 - true - - 6 - true - 2 - true - false - - - CommonPicture.Предупреждение32 - - - - - ГруппаОшибки - 259 - - ОбнаруженнаяОшибкаПодключения1 - 210 - - <key>ru</key> - <value>Ошибка проверки подключения</value> - - true - true - - true - - - ОбнаруженнаяОшибкаПодключения - - None - - ОбнаруженнаяОшибкаПодключения1РасширеннаяПодсказка - 352 - Label - true - true - - Left - - - - ОбнаруженнаяОшибкаПодключения1КонтекстноеМеню - 211 - true - - InputField - true - Center - Enter - true - Left - true - - true - 3 - true - true - true - true - true - true - - Style.FormBackColor - - Normal - - - - НадписьПерейтиВЖурналРегистрации1 - 234 - - <key>ru</key> - <value>Техническая информация об ошибке</value> - - true - true - - true - - - НадписьПерейтиВЖурналРегистрации1РасширеннаяПодсказка - 354 - Label - true - true - - Left - - - - НадписьПерейтиВЖурналРегистрации1КонтекстноеМеню - 235 - true - - Label - true - true - true - false - - 128 - 128 - 128 - - - - Click - НадписьПерейтиВЖурналРегистрации1Нажатие - - true - Left - - - true - true - - true - - - ru - Группа ошибки - - - ГруппаОшибкиРасширеннаяПодсказка - 351 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - false - - ГоризонтальнаяГруппаОшибкаПодключенияРасширеннаяПодсказка - 349 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - АвторизацияАдминистратораИнформационнойБазы - 249 - - АдминистраторИБ - 250 - - <key>ru</key> - <value>Имя</value> - - true - false - - true - - - АдминистраторИБ - - - АдминистраторИБРасширеннаяПодсказка - 356 - Label - true - true - - Left - - - - АдминистраторИБКонтекстноеМеню - 251 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - Normal - - - - ПарольАдминистратораИБ - 252 - - <key>ru</key> - <value>Пароль</value> - - true - true - - true - - - ПарольАдминистратораИБ - - - ПарольАдминистратораИБРасширеннаяПодсказка - 358 - Label - true - true - - Left - - - - ПарольАдминистратораИБКонтекстноеМеню - 253 - true - - InputField - Enter - true - Left - true - - true - true - true - true - true - true - true - Normal - - - true - true - - true - - - <key>ru</key> - <value>1. Если задан неправильный пароль, то введите его еще раз</value> - - - ru - Авторизация администратора информационной базы - - false - - АвторизацияАдминистратораИнформационнойБазыРасширеннаяПодсказка - 355 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаComcntrФайловыйРежим - 212 - - НадписьОбновитьВерсиюКомпоненты1 - 213 - - <key>ru</key> - <value>2. При ошибке версии компоненты "comcntr", рекомендуется выполнить ее перерегистрацию (потребуется перезапуск сеанса).</value> - - true - true - - true - - - ru - Возможно необходимо обновить версию компоненты "comcntr". При этом потребуется перезапустить сеанс 1С. Для этого нажмите здесь - - - НадписьОбновитьВерсиюКомпоненты1РасширеннаяПодсказка - 361 - Label - true - true - - Left - - - - НадписьОбновитьВерсиюКомпоненты1КонтекстноеМеню - 214 - true - - Label - true - true - false - - Left - 2 - - - - КнопкаОбновитьВерсиюКомпоненты1 - 215 - - <key>ru</key> - <value>Исправить</value> - - true - true - - true - - false - - КнопкаОбновитьВерсиюКомпоненты1РасширеннаяПодсказка - 362 - Label - true - true - - Left - - - UsualButton - Form.Command.ОбновитьВерсиюКомпоненты - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - ГруппаComcntrФайловыйРежимРасширеннаяПодсказка - 360 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ПанельЖурналРегистрации4 - 228 - - ВертикальнаяГруппаНадписиЖР3 - 231 - true - true - - true - - false - - ВертикальнаяГруппаНадписиЖР3РасширеннаяПодсказка - 364 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - false - - ПанельЖурналРегистрации4РасширеннаяПодсказка - 363 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Дополнительные настройки</value> - - - ru - Дополнительные настройки - - - ДополнительныеНастройкиРасширеннаяПодсказка - 347 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Страницы помощника</value> - - - ru - Страницы помощника - - - СтраницыПомощникаРасширеннаяПодсказка - 268 - Label - true - true - - Left - - - Pages - - Auto - - - - ГруппаПояснениеДляLinuxКлиента - 260 - - КартинкаИнформация - 261 - - <key>ru</key> - <value> </value> - - true - true - - true - - - КартинкаИнформацияРасширеннаяПодсказка - 366 - Label - true - true - - Left - - - - КартинкаИнформацияКонтекстноеМеню - 262 - true - - 2 - true - 1 - true - - - CommonPicture.Информация - - - - - ПояснениеДляLinuxКлиента - 263 - - <key>ru</key> - <value>Резервное копирование программы может запускаться -только на компьютере под управлением ОС Windows</value> - - true - true - - true - - - ПояснениеДляLinuxКлиентаРасширеннаяПодсказка - 367 - Label - true - true - - Left - - - - ПояснениеДляLinuxКлиентаКонтекстноеМеню - 264 - true - - Label - true - true - - Style.ПоясняющийТекст - - - Left - - - true - true - - true - - - <key>ru</key> - <value> </value> - - - ru - - - true - 86 - false - - ГруппаПояснениеДляLinuxКлиентаРасширеннаяПодсказка - 365 - Label - true - true - - Left - - - UsualGroup - - Auto - StrongSeparation - true - true - Auto - Auto - - - Bottom - true - - ФормаКоманднаяПанель - -1 - - Назад - 138 - - <key>ru</key> - <value><< Назад</value> - - true - - true - - - НазадРасширеннаяПодсказка - 265 - Label - true - true - - Left - - - Form.Command.ФормаНазад - Normal - Auto - true - true - UserCmds - Auto - - - Далее - 1 - - <key>ru</key> - <value>Далее >></value> - - true - true - - true - - - ДалееРасширеннаяПодсказка - 266 - Label - true - true - - Left - - - Form.Command.ФормаДалее - Auto - true - true - true - UserCmds - Auto - - - Отмена - 2 - - <key>ru</key> - <value>Отмена</value> - - true - true - - true - - - ОтменаРасширеннаяПодсказка - 267 - Label - true - true - - Left - - - Form.Command.ФормаОтмена - Normal - Auto - true - true - UserCmds - Auto - - Right - true - - - OnOpen - ПриОткрытии - - - OnCreateAtServer - ПриСозданииНаСервере - - - OnClose - ПриЗакрытии - - 75 - LockOwner - Use - true - true - Vertical - true - true - UseIfNecessary - auto - true - - Объект - 1 - - DataProcessorObject.НастройкаРезервногоКопированияИБ - - - true - - - true - - - Объект.ЕдиницаИзмеренияПериодаОповещения - - - Объект.ЕдиницаИзмеренияПериодаОтложенногоОповещения - - - Объект.ПериодОповещения - - - Объект.ПериодОтложенногоОповещения - -
                true
                -
                - - АдминистраторИБ - - <key>ru</key> - <value>Имя</value> - - 2 - - String - - - - true - - - true - - - - ОбнаруженнаяОшибкаПодключения - - <key>ru</key> - <value>Обнаруженная ошибка подключения</value> - - 3 - - String - - - - true - - - true - - - - ПарольАдминистратораИБ - - <key>ru</key> - <value>Пароль</value> - - 4 - - String - - - - true - - - true - - - - ЭтоФайловаяБаза - - <key>ru</key> - <value>Это файловая база</value> - - 5 - - Boolean - - - true - - - true - - - - ФормаДалее - - <key>ru</key> - <value>ФормаДалее</value> - - 1 - - ru - Далее - - - true - - - - Далее - - - Auto - Auto - - - ФормаОтмена - - <key>ru</key> - <value>Форма отмена</value> - - 2 - - ru - Отмена - - - true - - - - Отмена - - - Auto - Auto - - - ФормаНазад - - <key>ru</key> - <value>Форма назад</value> - - 3 - - ru - Назад - - - true - - - - Назад - - - Auto - Auto - - - ОбновитьВерсиюКомпоненты - - <key>ru</key> - <value>Обновить версию компоненты</value> - - 4 - - ru - Обновить версию компоненты - - - true - - - - ОбновитьВерсиюКомпоненты - - - Auto - Auto - - - ИзменитьРасписание - - <key>ru</key> - <value>Изменить</value> - - 5 - - ru - Изменить - - - true - - - - ИзменитьРасписание - - - Auto - Auto - - - - - - -
                diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Module.bsl deleted file mode 100644 index 6afde3e46..000000000 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/РезервноеКопированиеИнформационнойБазы/Module.bsl +++ /dev/null @@ -1,820 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ - -&НаСервере -Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) - - Если Параметры.Свойство("АвтоТест") Тогда - Возврат; - КонецЕсли; - - ЭтоФайловаяБаза = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - - Элементы.ГруппаПояснениеДляLinuxКлиента.Видимость = ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент(); - Элементы.ВыполнитьРезервноеКопированиеСейчас.Видимость = ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент(); - - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - Объект.КодТипаРезервногоКопирования = НастройкиРезервногоКопирования.ВыборПунктаНастройки; - Если НастройкиРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы Тогда - Объект.ВариантПроведенияРезервногоКопирования = 2; - Иначе - Объект.ВариантПроведенияРезервногоКопирования = 1; - КонецЕсли; - Объект.КодТипаИнтерактивногоРезервногоКопирования = 1; - Объект.ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении = НастройкиРезервногоКопирования.ПроизводитьУдаление; - Объект.ПериодХраненияРезервныхКопий = 1; - Объект.ЕдиницаИзмеренияПериодаХраненияРезервныхКопий = "Месяц"; - Объект.ПериодОтложенногоОповещения = 1; - Объект.ЕдиницаИзмеренияПериодаОповещения = "День"; - Объект.ЕдиницаИзмеренияПериодаОтложенногоОповещения = "Час"; - Объект.ПериодОповещения = 1; - Объект.НажатиеГиперссылки = Ложь; - Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(НастройкиРезервногоКопирования.РасписаниеКопирования); - Объект.СтрокаРасписания = Строка(Расписание); - Элементы.СтраницыПомощника.ТекущаяСтраница = ОпределитьСтраницуПоПравамИАрхитектуре(); - Если Параметры.Свойство("ТипВызова") Тогда - - Если Параметры.ТипВызова = 1 Тогда - Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницыПомощника.ПодчиненныеЭлементы[Параметры.ТекущаяСтраница]; - Элементы.НадписьВремяОжиданияРезервногоКопирования.Заголовок = Параметры.ЗаголовокНадписи; - КонецЕсли; - - Если Параметры.ТипВызова = 2 Тогда - Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.СтраницыПомощника.ПодчиненныеЭлементы[Параметры.ТекущаяСтраница]; - КонецЕсли; - - КонецЕсли; - - Объект.КаталогСРезервнымиКопиями = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования().КаталогХраненияРезервныхКопий; - ТекстЗаголовка = НСтр("ru = 'В последний раз резервное копирование проводилось: %1'"); - МассивПараметров = Новый Массив; - МассивПараметров.Добавить(Формат(НастройкиРезервногоКопирования.ДатаПоследнегоРезервногоКопирования, "ДЛФ=ДДВ")); - ТекстЗаголовка = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстЗаголовка, МассивПараметров); - - Если Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Количество() > 3 Тогда - Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Удалить(3); - КонецЕсли; - - Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Добавить("0", Расписание); - Объект.ВариантРасписанияРезервногоКопирования = "0"; - Элементы.ГруппаНастройкиРасписанияКопирования.Доступность = (Объект.ВариантПроведенияРезервногоКопирования = 1); - - // Заполнение настроек по хранению старых копий. - Элементы.ГруппаВыбораТипаОчистки.Доступность = НастройкиРезервногоКопирования.ПроизводитьУдаление; - Если НастройкиРезервногоКопирования.ПроизводитьУдаление Тогда - Если НастройкиРезервногоКопирования.УдалятьПоПериоду Тогда - НастройкиЗначенияПериода = РезервноеКопированиеИБСервер.ПолучитьПоИнтервалуВремениЗначениеПериода(НастройкиРезервногоКопирования.ЗначениеПараметра); - Объект.ТипОграниченияКаталогаСРезервнымиКопиями = Элементы.ТипОграниченияКаталогаСРезервнымиКопиями.СписокВыбора.НайтиПоЗначению("ПоПериоду").Значение; - Объект.ЕдиницаИзмеренияПериодаХраненияРезервныхКопий = НастройкиЗначенияПериода.ТипПериода; - Объект.ПериодХраненияРезервныхКопий = НастройкиЗначенияПериода.ЗначениеПериода; - Иначе - Объект.ТипОграниченияКаталогаСРезервнымиКопиями = Элементы.ТипОграниченияКаталогаСРезервнымиКопиями.СписокВыбора.НайтиПоЗначению("МаксКопий").Значение; - Объект.КоличествоКопийВКаталоге = НастройкиРезервногоКопирования.ЗначениеПараметра; - КонецЕсли; - КонецЕсли; - - // Определение надписи заголовка формы. - Элементы.НадписьВнимание.Заголовок = РезервноеКопированиеИБСервер.ТекущаяНастройкаРезервногоКопирования( - Объект.КодТипаРезервногоКопирования, - НастройкиРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы, - НастройкиРезервногоКопирования.РасписаниеКопирования); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриОткрытии(Отказ) - - АдминистраторИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе.Имя; - - ПриОткрытииНовойСтраницы(Элементы.СтраницыПомощника.ТекущаяСтраница); - - Если Объект.КодТипаРезервногоКопирования = 1 Тогда - УстановитьЗаголовокКнопкиДалее(Истина); - Иначе - УстановитьЗаголовокКнопкиДалее(Ложь); - КонецЕсли; - - УстановитьСтраницуПараметровОтложенногоОповещения(); - УстановитьТекстПоясняющейНадписи(); - -КонецПроцедуры - -&НаКлиенте -Процедура ПриЗакрытии() - - Оповестить("ЗакрытаФормаНастройкиРезервногоКопирования"); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ - -&НаСервереБезКонтекста -Процедура ЗапомнитьПараметрыАдминистратора(АдминистраторИБ, ПарольАдминистратораИБ) - - ПараметрыРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьПараметрыРезервногоКопирования(); - - ПараметрыРезервногоКопирования.Вставить("АдминистраторИБ", АдминистраторИБ); - ПараметрыРезервногоКопирования.Вставить("ПарольАдминистратораИБ", ПарольАдминистратораИБ); - - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); - -КонецПроцедуры - -&НаКлиенте -Процедура ПутьККаталогуАрхивов2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) - - ВыбранныйПуть = ПолучитьПуть(РежимДиалогаВыбораФайла.ВыборКаталога); - Если Не ПустаяСтрока(ВыбранныйПуть) Тогда - Объект.КаталогСРезервнымиКопиями = ВыбранныйПуть; - КонецЕсли; - -КонецПроцедуры - -// Обработчик перехода к журналу регистрации. -&НаКлиенте -Процедура НадписьПерейтиВЖурналРегистрации1Нажатие(Элемент) - ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", , ЭтаФорма); -КонецПроцедуры - -&НаКлиенте -Процедура ВариантПроведенияРезервногоКопированияПриИзменении(Элемент) - Элементы.ГруппаНастройкиРасписанияКопирования.Доступность = (Объект.ВариантПроведенияРезервногоКопирования = 1); -КонецПроцедуры - -&НаКлиенте -Процедура ПереключательКодТипаРезервногоКопированияПриИзменении(Элемент) - - Если Объект.КодТипаРезервногоКопирования = 1 Тогда - УстановитьЗаголовокКнопкиДалее(Истина); - Иначе - УстановитьЗаголовокКнопкиДалее(Ложь); - КонецЕсли; - - УстановитьСтраницуПараметровОтложенногоОповещения(); - УстановитьТекстПоясняющейНадписи(); - -КонецПроцедуры - -&НаКлиенте -Процедура ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении1ПриИзменении(Элемент) - - Элементы.ГруппаВыбораТипаОчистки.Доступность = Объект.ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении; - -КонецПроцедуры - -// Обработчик выбора из списка или изменения расписания проведения резервного копирования. -&НаКлиенте -Процедура ВариантРасписанияРезервногоКопированияПриИзменении(Элемент) - РасписаниеРезервногоКопирования = Новый РасписаниеРегламентногоЗадания; - Если Объект.ВариантРасписанияРезервногоКопирования = "1" Тогда - - РасписаниеРезервногоКопирования.ПериодНедель = 1; - РасписаниеРезервногоКопирования.ПериодПовтораДней = 1; - МассивДнейНедели = Новый Массив; - МассивДнейНедели.Добавить(5); - РасписаниеРезервногоКопирования.ДниНедели = МассивДнейНедели; - РасписаниеРезервногоКопирования.ВремяНачала = Дата(2010, 01, 01, 23, 30, 00); - - ИначеЕсли Объект.ВариантРасписанияРезервногоКопирования = "2" Тогда - - РасписаниеРезервногоКопирования.ПериодПовтораДней = 1; - РасписаниеРезервногоКопирования.ВремяНачала = Дата(2010, 01, 01, 23, 30, 00); - - ИначеЕсли Объект.ВариантРасписанияРезервногоКопирования = "3" Тогда - - РасписаниеРезервногоКопирования.ПериодПовтораДней = 1; - МассивДнейНедели = Новый Массив; - МассивДнейНедели.Добавить(2); - МассивДнейНедели.Добавить(4); - РасписаниеРезервногоКопирования.ДниНедели = МассивДнейНедели; - РасписаниеРезервногоКопирования.ВремяНачала = Дата(2010, 01, 01, 23 ,30, 00); - - КонецЕсли; - Объект.СтрокаРасписания = Строка(РасписаниеРезервногоКопирования); - РасписаниеСтруктура = ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(РасписаниеРезервногоКопирования); - - ПараметрыРезервногоКопированияИБ.РасписаниеЗначение = РасписаниеРезервногоКопирования; - - ПоместитьРасписаниеВНастройку(РасписаниеСтруктура); - -КонецПроцедуры - -&НаКлиенте -Процедура ПереключательКодТипаРезервногоКопированияКСПриИзменении(Элемент) - - УстановитьСтраницуПараметровОтложенногоОповещения(); - УстановитьТекстПоясняющейНадписи(); - -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// ОБРАБОТЧИКИ КОМАНД ФОРМЫ - -&НаКлиенте -Процедура Далее(Команда) - ОчиститьСообщения(); - ТекущаяСтраницаПомощника = Элементы.СтраницыПомощника.ТекущаяСтраница; - - Если ТекущаяСтраницаПомощника = Элементы.СтраницаНачальногоОповещения - ИЛИ ТекущаяСтраницаПомощника = Элементы.СтраницаНачальногоОповещенияКлиентСервер Тогда - - ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; - ОстановитьАвтоматическоеРезервноеКопирование(Ложь); - КодПереключателя = Объект.КодТипаРезервногоКопирования; - УстановитьКодВыбора(КодПереключателя); - НоваяСтраницаПомощника = Неопределено; - - Если КодПереключателя = 1 Тогда // Настройка автоматического резервного копирования. - НоваяСтраницаПомощника = Элементы.СтраницаНастройкиПараметровРезервногоКопирования; - ИначеЕсли КодПереключателя = 2 Тогда // Копирование сторонними средствами. - ОповещениеПользователю(НСтр("ru ='Работа помощника завершена. С этого момента оповещения о резервном копировании поступать не будут.'")); - ОстановитьСервисОповещения(); - ПараметрыРезервногоКопированияИБ.ПараметрОповещения = "НеОповещать"; - ИначеЕсли КодПереключателя = 3 Тогда // Отложенное копирование. - НастроеноПользователем = Неопределено; - ПриИзмененииВремениОповещения(Объект.ПериодОповещения, Объект.ЕдиницаИзмеренияПериодаОповещения, НастроеноПользователем); - ОповещениеПользователю(НСтр("ru ='Был изменен период оповещений о резервном копировании.'")); - Если НастроеноПользователем Тогда - ПараметрыРезервногоКопированияИБ.ПараметрОповещения = "Напомнить"; - Иначе - ПараметрыРезервногоКопированияИБ.ПараметрОповещения = "ЕщеНеНастроено"; - КонецЕсли; - КонецЕсли; - ПриОткрытииНовойСтраницы(НоваяСтраницаПомощника); - - ИначеЕсли ТекущаяСтраницаПомощника = Элементы.СтраницаНастройкиПараметровРезервногоКопирования - ИЛИ ТекущаяСтраницаПомощника = Элементы.ДополнительныеНастройки Тогда - - ИнформацияОбОшибке = ""; - Если Не ПроверитьЗаполнениеРеквизитов(ИнформацияОбОшибке) и Не ПустаяСтрока(ИнформацияОбОшибке) Тогда - ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ИнформацияОбОшибке); - Возврат; - КонецЕсли; - - Если НЕ ПроверитьДоступКИБ() Тогда - НоваяСтраницаПомощника = Элементы.ДополнительныеНастройки; - ПриОткрытииНовойСтраницы(НоваяСтраницаПомощника); - Возврат; - КонецЕсли; - - ЗапомнитьПараметрыАдминистратора(АдминистраторИБ, ПарольАдминистратораИБ); - ПриПереходеНаАвтоматическийРежимКопирования(); - ПриИзмененииВремениОповещения(-1, ""); - ПараметрыРезервногоКопированияИБ.ПараметрОповещения = "НеОповещать"; - УстановитьПутьАрхиваСКопиями(Объект.КаталогСРезервнымиКопиями); - - Если Объект.ВыполнитьРезервноеКопированиеСейчас И Не ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ТипВызова", 1); - ПараметрыФормы.Вставить("ТекущаяСтраница", "СтраницаИнформацииИВыполненияРезервногоКопирования"); - ПараметрыФормы.Вставить("ЗаголовокНадписи", ""); - - ОткрытьФорму("Обработка.РезервноеКопированиеИБ.Форма.РезервноеКопированиеИнформационнойБазы", ПараметрыФормы); - - КонецЕсли; - - Иначе - - Закрыть(); - - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Процедура Отмена(Команда) - - ДатаОтложенногоРезервногоКопирования = Дата('00010101'); - Закрыть(); - -КонецПроцедуры - -// Вызывает стандартную форму настройки расписания регламентного задания, -// заполняя его текущими настройками расписания резервного копирования. -&НаКлиенте -Процедура ИзменитьРасписание(Команда) - - Расписание = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().РезервноеКопированиеИБ.РасписаниеКопирования; - Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(Расписание); - ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - Если НЕ ДиалогРасписания.ОткрытьМодально() Тогда - Возврат; - КонецЕсли; - - Расписание = ДиалогРасписания.Расписание; - Если Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Количество() > 3 Тогда - Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Удалить(3); - КонецЕсли; - Элементы.ВариантРасписанияРезервногоКопирования.СписокВыбора.Добавить("0", Расписание); - Объект.ВариантРасписанияРезервногоКопирования = "0"; - Объект.СтрокаРасписания = Строка(Расписание); - РасписаниеСтруктура = ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Расписание); - - ПоместитьРасписаниеВНастройку(РасписаниеСтруктура); - - ПараметрыРезервногоКопированияИБ.РасписаниеЗначение = Расписание; - -КонецПроцедуры - -&НаКлиенте -Процедура Назад(Команда) - - ТекущаяСтраницаПомощника = Элементы.СтраницыПомощника.ТекущаяСтраница; - Если ТекущаяСтраницаПомощника = Элементы.СтраницаНастройкиПараметровРезервногоКопирования Тогда - ПриОткрытииНовойСтраницы(Элементы.СтраницаНачальногоОповещения); - ИначеЕсли ТекущаяСтраницаПомощника = Элементы.СтраницаНачальногоОповещения Тогда - ПриОткрытииНовойСтраницы(Элементы.СтраницаВыполненияРезервногоКопирования); - ИначеЕсли ТекущаяСтраницаПомощника = Элементы.ДополнительныеНастройки Тогда - ПриОткрытииНовойСтраницы(Элементы.СтраницаНастройкиПараметровРезервногоКопирования); - КонецЕсли; - -КонецПроцедуры - -// Процедура обновления компоненты comcntr. -&НаКлиенте -Процедура ОбновитьВерсиюКомпоненты(Команда) - - ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(); - -КонецПроцедуры - - -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаКлиенте -Функция ПроверитьЗаполнениеРеквизитов(ИнформацияОбОшибке) - - Если ПустаяСтрока(Объект.КаталогСРезервнымиКопиями) Тогда - ИнформацияОбОшибке = Нстр("ru = 'Не выбран каталог для резервной копии.'"); - Возврат Ложь; - КонецЕсли; - - Если НайтиФайлы(Объект.КаталогСРезервнымиКопиями).Количество() = 0 Тогда - ИнформацияОбОшибке = Нстр("ru = 'Указан несуществующий каталог.'"); - Возврат Ложь; - КонецЕсли; - - Попытка - ТестовыйФайл = Новый ЗаписьXML; - ТестовыйФайл.ОткрытьФайл(Объект.КаталогСРезервнымиКопиями + "/test.test1С"); - ТестовыйФайл.ЗаписатьОбъявлениеXML(); - ТестовыйФайл.Закрыть(); - Исключение - ИнформацияОбОшибке = Нстр("ru = 'Нет доступа к каталогу с резервными копиями.'"); - Возврат Ложь; - КонецПопытки; - - Попытка - УдалитьФайлы(Объект.КаталогСРезервнымиКопиями, "*.test1С"); - Исключение - КонецПопытки; - - Возврат Истина; - -КонецФункции - -// Возвращает страницу, которая должна быть показана пользователю при открытии окна помощника. -// Если ПолныеПрава - тогда попадаем на функциональную страницу. -// Если нет - тогда на информационную страницу с просьбой обратиться к системному администратору. -// Состав элементов функциональной страницы зависит от архитектуры информационной базы. -&НаСервере -Функция ОпределитьСтраницуПоПравамИАрхитектуре() - - СтраницыПомощника = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; - СтартоваяСтраница = Неопределено; - - Если Пользователи.ЭтоПолноправныйПользователь() Тогда - - Если ЭтоФайловаяБаза Тогда - СтартоваяСтраница = Элементы.СтраницаНачальногоОповещения; - Иначе - - СтартоваяСтраница = СтраницыПомощника.СтраницаНачальногоОповещенияКлиентСервер; - Элементы.Далее.Заголовок = НСтр("ru = 'Готово'"); - - КонецЕсли; - Иначе - СтартоваяСтраница = СтраницыПомощника.СтраницаДляПользователяБезПрав; - КонецЕсли; - Возврат СтартоваяСтраница; - -КонецФункции - -// Устанавливает текущую страницу при отложенном резервном копировании в зависимости от начального выбора пользователя. -&НаКлиенте -Процедура УстановитьСтраницуПараметровОтложенногоОповещения() - - ПозицияПереключателя = Объект.КодТипаРезервногоКопирования; - Постфикс = ?(ЭтоФайловаяБаза, "", "1"); - ИмяГруппыСтраниц = "СтраницыПараметровОтложенногоОповещения" + Постфикс; - ИмяСтраницыПараметров = "СтраницаПараметровОтложенногоОповещения" + Постфикс; - ИмяПустойСтраницы = "ПустаяСтраница" + Постфикс; - - Если Объект.КодТипаРезервногоКопирования = 3 Тогда - Элементы[ИмяГруппыСтраниц].ТекущаяСтраница = Элементы[ИмяГруппыСтраниц].ПодчиненныеЭлементы[ИмяСтраницыПараметров]; - Иначе - Элементы[ИмяГруппыСтраниц].ТекущаяСтраница = Элементы[ИмяГруппыСтраниц].ПодчиненныеЭлементы[ИмяПустойСтраницы]; - КонецЕсли; - -КонецПроцедуры - -// Устанавливает значение поясняющей надписи в зависимости от текущего выбора пользователя. -&НаКлиенте -Процедура УстановитьТекстПоясняющейНадписи() - - Постфикс = ?(ЭтоФайловаяБаза, "", "1"); - ПоясняющаяНадпись = Элементы["ИнформационнаяНадпись" +Постфикс]; - - ЗначениеПереключателя = Объект.КодТипаРезервногоКопирования; - - Если ЗначениеПереключателя = 1 Тогда - ТекстНадписи = НСтр("ru = 'Нажмите ""Далее"" для перехода к настройке расписания автоматического резервного копирования.'"); - ИначеЕсли ЗначениеПереключателя = 2 Тогда - Если ЭтоФайловаяБаза Тогда - ТекстНадписи = НСтр("ru = 'Более подробно о выполнении резервного копирования можно узнать из документации к используемым специализированным средствам резервного копирования. Нажмите ""Готово"", чтобы закрыть помощник.'"); - Иначе - ТекстНадписи = НСтр("ru = 'Более подробно о выполнении резервного копирования можно узнать из документации к используемой СУБД или специализированным средствам резервного копирования. Нажмите ""Готово"", чтобы закрыть помощник.'"); - КонецЕсли; - ИначеЕсли ЗначениеПереключателя = 3 Тогда - ТекстНадписи = НСтр("ru = 'Нажмите ""Готово"", чтобы отложить оповещение на выбранный срок.'"); - Иначе - ТекстНадписи = ""; - КонецЕсли; - - ПоясняющаяНадпись.Заголовок = ТекстНадписи; - -КонецПроцедуры - -// Устанавливает заголовок кнопки "Далее" в зависимости от текущего выбора пользователя. -&НаКлиенте -Процедура УстановитьЗаголовокКнопкиДалее(ПараметрЗаголовка) - - Если ПараметрЗаголовка Тогда - Элементы.Далее.Заголовок = НСтр("ru = 'Далее >>'"); - Иначе - Элементы.Далее.Заголовок = НСтр("ru = 'Готово'"); - КонецЕсли; - -КонецПроцедуры - -// Запрашивает у пользователя путь к файлу или каталогу. -&НаКлиенте -Функция ПолучитьПуть(РежимДиалога) - - Режим = РежимДиалога; - ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); - - Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда - ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите каталог'"); - Иначе - ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите файл'"); - КонецЕсли; - - Если ДиалогОткрытияФайла.Выбрать() Тогда - Если РежимДиалога = РежимДиалогаВыбораФайла.ВыборКаталога тогда - Возврат ДиалогОткрытияФайла.Каталог; - Иначе - Возврат ДиалогОткрытияФайла.ПолноеИмяФайла; - КонецЕсли; - КонецЕсли; - -КонецФункции - -// Устанавливает новые параметры резервного копирования при изменении времени оповещения. -&НаСервереБезКонтекста -Процедура ПриИзмененииВремениОповещения(ПериодОповещения, ЕдиницаИзмеренияПериодаОповещения, НастроеноПользователем = Неопределено) - - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - НастроеноПользователем = НастройкиРезервногоКопирования.НастроеноПользователем; - ТекущаяДата = ТекущаяДатаСеанса(); - Если ПериодОповещения = -1 Тогда // Пользователь отказался от оповещений. - - НастройкиРезервногоКопирования.ПериодОповещения = 0; - НастройкиРезервногоКопирования.НастроеноПользователем = Истина; - - ИначеЕсли ПериодОповещения = 0 Тогда // Пользователь хочет получать оповещения, но отказался от копирования. - - НастройкиРезервногоКопирования.ДатаПоследнегоОповещения = ТекущаяДата; - - Иначе - - Если ЕдиницаИзмеренияПериодаОповещения = "Месяц" Тогда - РазностьДат = ДобавитьМесяц(ТекущаяДата, ПериодОповещения) - ТекущаяДата; - Иначе - РазностьДат = РезервноеКопированиеИБСервер.ПолучитьВременнойПараметрПоСтроке(ЕдиницаИзмеренияПериодаОповещения); - КонецЕсли; - - НастройкиРезервногоКопирования.ДатаПоследнегоОповещения = ТекущаяДата; - НастройкиРезервногоКопирования.ПериодОповещения = ПериодОповещения * РазностьДат; - - КонецЕсли; - - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); - -КонецПроцедуры - -// Останавливает работу сервиса резервного копирования. -&НаСервереБезКонтекста -Процедура ОстановитьСервисОповещенияОРезервномКопировании() - - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - НастройкиРезервногоКопирования.ДатаПоследнегоОповещения = Дата('00010101'); - НастройкиРезервногоКопирования.ПериодОповещения = 0; - - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); - -КонецПроцедуры - -// Записывает параметры настройки удаления резервных копий из каталога. -&НаСервереБезКонтекста -Процедура УстановитьНастройкиУдаленияУстаревшихКопий(ТипУдаления, ПараметрЗначения) - - СтруктураНастроек = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - СтруктураНастроек.ПроизводитьУдаление = Истина; - СтруктураНастроек.УдалятьПоПериоду = ТипУдаления; - СтруктураНастроек.ЗначениеПараметра = ПараметрЗначения; - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(СтруктураНастроек); - -КонецПроцедуры - -// Записывает настройку - путь к каталогу с резервными копиями. -&НаСервереБезКонтекста -Процедура УстановитьПутьАрхиваСКопиями(КаталогХраненияРезервныхКопий) - РезервноеКопированиеИБСервер.УстановитьЗначениеНастройки("КаталогХраненияРезервныхКопий", КаталогХраненияРезервныхКопий); -КонецПроцедуры - -// Записывает настройку - расписание проведения резервного копирования. -&НаСервереБезКонтекста -Процедура ПоместитьРасписаниеВНастройку(НовоеРасписаниеКопирования) - - Параметры = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - Параметры.РасписаниеКопирования = НовоеРасписаниеКопирования; - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(Параметры); - ОбновитьПовторноИспользуемыеЗначения(); // сбрасываем кеш для применения настроек - -КонецПроцедуры - -// Показывает оповещение пользователю с заданным текстом. -&НаКлиенте -Процедура ОповещениеПользователю(ТекстОповещения) - - ПоказатьОповещениеПользователя("Резервное копирование", , ТекстОповещения) - -КонецПроцедуры - -// Показывает оповещение пользователю при завершении работы с формой настройки резервного копирования. -&НаКлиенте -Процедура ПриЗавершенииРаботыПомощника(РезультатРаботыПомощника) - - ПоказатьОповещениеПользователя(НСтр("ru = 'Работа помощника завершена.'"), "e1cib/app/Обработка.НастройкаРезервногоКопированияИБ", РезультатРаботыПомощника); - ЭтаФорма.Закрыть(); - -КонецПроцедуры - -// Обработчик изменения страницы помощника. Открывает новую страницу и выполняет необходимые действия. -// Параметры : -// НоваяСтраницаПомощника - страница , которую необходимо открыть в данный момент. -&НаКлиенте -Процедура ПриОткрытииНовойСтраницы(НоваяСтраница, ТекстПути = "") - - ПодчиненныеСтраницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; - Если НоваяСтраница = ПодчиненныеСтраницы.СтраницаНачальногоОповещения Тогда - - Элементы.Назад.Видимость = Объект.НажатиеГиперссылки; - УстановитьЗаголовокКнопкиДалее(Истина); - - ИначеЕсли НоваяСтраница = ПодчиненныеСтраницы.СтраницаНастройкиПараметровРезервногоКопирования Тогда - - УстановитьЗаголовокКнопкиДалее(Ложь); - Элементы.Назад.Видимость = Истина; - - ИначеЕсли НоваяСтраница = ПодчиненныеСтраницы.СтраницаНачальногоОповещенияКлиентСервер Тогда - - УстановитьЗаголовокКнопкиДалее(Ложь); - - ИначеЕсли НоваяСтраница = ПодчиненныеСтраницы.ДополнительныеНастройки Тогда - - Элементы.Назад.Видимость = Истина; - АдминистраторИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе.Имя; - - КонецЕсли; - - Если НоваяСтраница = Неопределено Тогда - Закрыть(); - Иначе - Элементы.СтраницыПомощника.ТекущаяСтраница = НоваяСтраница; - КонецЕсли; - -КонецПроцедуры - -&НаКлиенте -Функция ПроверитьДоступКИБ() - - Результат = Истина; - // В базовых версиях проверку подключения не осуществляем; - // при некорректном вводе имени и пароля обновление завершится неуспешно. - Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда - Возврат Результат; - КонецЕсли; - ПараметрыПодключения = ПолучитьПараметрыАутентификацииАдминистратораОбновления(); - - Попытка - ComConnector = Новый COMОбъект(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяCOMСоединителя); - СтрокаСоединенияИнформационнойБазы = ПараметрыПодключения.СтрокаСоединенияИнформационнойБазы + ПараметрыПодключения.СтрокаПодключения; - Соединение = ComConnector.Connect(СтрокаСоединенияИнформационнойБазы); - Исключение - Результат = Ложь; - Инфо = ИнформацияОбОшибке(); - ОбнаруженнаяОшибкаПодключения = КраткоеПредставлениеОшибки(Инфо); - - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации( - РезервноеКопированиеИБКлиент.СобытиеЖурналаРегистрации(),"Ошибка", ОбнаруженнаяОшибкаПодключения, , Истина); - - КонецПопытки; - - Возврат Результат; - -КонецФункции - -// Обработчик перехода на автоматическое резервное копирование. -&НаКлиенте -Процедура ПриПереходеНаАвтоматическийРежимКопирования() - - Если ПроверитьЗаполнение() Тогда - - СохранитьНастройкиПоОчисткеКаталогаСРезервнымиКопиями(); - - Если Объект.ВариантПроведенияРезервногоКопирования = 1 Тогда - ОповещатьОРезервномКопированииПриЗавершенииСеанса = Ложь; - ДатыСледующегоАвтоматическогоКопирования = РезервноеКопированиеИБВызовСервера.СформироватьДатыСледующегоАвтоматическогоКопирования(Истина); - ЗаполнитьЗначенияСвойств(ПараметрыРезервногоКопированияИБ, ДатыСледующегоАвтоматическогоКопирования); - Иначе - ОповещатьОРезервномКопированииПриЗавершенииСеанса = Истина; - ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; - ОстановитьАвтоматическоеРезервноеКопирование(Истина); - КонецЕсли; - ПриЗавершенииРаботыПомощника(НСтр("ru = 'Настройка расписания резервного копирования прошла успешно.'")); - ОстановитьСервисОповещенияОРезервномКопировании(); - КонецЕсли; - -КонецПроцедуры - -&НаСервере -Процедура СохранитьНастройкиПоОчисткеКаталогаСРезервнымиКопиями() - - РезервноеКопированиеИБСервер.УстановитьЗначениеНастройки("ПроизводитьУдаление", Объект.ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении); - Если Объект.ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении Тогда - Если Объект.ТипОграниченияКаталогаСРезервнымиКопиями = "ПоПериоду" Тогда - ЗаданныйПериод = Объект.ЕдиницаИзмеренияПериодаХраненияРезервныхКопий; - Если ЗаданныйПериод = "Год" Тогда - ПериодВСекундах = 3600 * 24 * 365; - ИначеЕсли ЗаданныйПериод = "Месяц" Тогда - ПериодВСекундах = 3600 * 24 * 30; - Иначе - ПериодВСекундах = РезервноеКопированиеИБСервер.ПолучитьВременнойПараметрПоСтроке(ЗаданныйПериод); - КонецЕсли; - ПараметрЗначенияОграничения = Объект.ПериодХраненияРезервныхКопий * ПериодВСекундах; - Иначе - ПараметрЗначенияОграничения = Объект.КоличествоКопийВКаталоге; - КонецЕсли; - УстановитьНастройкиУдаленияУстаревшихКопий(?(Объект.ТипОграниченияКаталогаСРезервнымиКопиями = "ПоПериоду", Истина, Ложь), ПараметрЗначенияОграничения); - УстановитьПутьАрхиваСКопиями(Объект.КаталогСРезервнымиКопиями); - Иначе - ПараметрЗначенияОграничения = 0; - УстановитьНастройкиУдаленияУстаревшихКопий(Ложь, 0); - КонецЕсли; - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ОстановитьАвтоматическоеРезервноеКопирование(ПроводитьРезервноеКопированиеПриЗавершенииРаботы) - // Останавливает механизм автоматического резервного копирования. - // Устанавливает пустое расписание и минимальную дату копирования в будущее время. - - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - НастройкиРезервногоКопирования.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; - НастройкиРезервногоКопирования.ПроводитьРезервноеКопированиеПриЗавершенииРаботы = ПроводитьРезервноеКопированиеПриЗавершенииРаботы; - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); - -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура УстановитьКодВыбора(КодПереключателя) - // Устанавливает элемент "Код выбора" настроек резервного копирования. - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - НастройкиРезервногоКопирования.ВыборПунктаНастройки = КодПереключателя; - Если КодПереключателя = 3 Тогда - НастройкиРезервногоКопирования.НастроеноПользователем = Ложь; - КонецЕсли; - - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); -КонецПроцедуры - -&НаСервереБезКонтекста -Процедура ОстановитьСервисОповещения() - // Останавливает оповещения о резервном копировании. - НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.ПолучитьНастройкиРезервногоКопирования(); - НастройкиРезервногоКопирования.ПериодОповещения = 0; - НастройкиРезервногоКопирования.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; - НастройкиРезервногоКопирования.НастроеноПользователем = Истина; - РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); -КонецПроцедуры - -//////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции проведения резервного копирования - - &НаСервере -Функция ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации) - - // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); - - Результат = ПолучитьИнформациюОНаличииСоединений(); - Результат.Вставить("СтрокаСоединенияИнформационнойБазы", - СоединенияИБКлиентСервер.ПолучитьСтрокуСоединенияИнформационнойБазы(0)); - - Возврат Результат; - -КонецФункции - -&НаКлиенте -Функция ПолучитьПараметрыАутентификацииАдминистратораОбновления() - - Результат = Новый Структура("ИмяПользователя, - |ПарольПользователя, - |СтрокаПодключения, - |ПараметрыАутентификации, - |СтрокаСоединенияИнформационнойБазы", - Неопределено, "", "", "", "", ""); - - ТекущиеСоединения = ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации); - Результат.СтрокаСоединенияИнформационнойБазы = ТекущиеСоединения.СтрокаСоединенияИнформационнойБазы; - // Диагностика случая, когда ролевой безопасности в системе не предусмотрено. - // Т.е. ситуация, когда любой пользователь «может» в системе все. - Если НЕ ТекущиеСоединения.ЕстьАктивныеПользователи Тогда - Возврат Результат; - КонецЕсли; - - Пользователь = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе.Имя; - - Результат.ИмяПользователя = Пользователь; - Результат.ПарольПользователя = ПарольАдминистратораИБ; - Результат.СтрокаПодключения = "Usr=""" + Пользователь + """;Pwd=""" + ПарольАдминистратораИБ + """;"; - Результат.ПараметрыАутентификации = "/N""" + Пользователь + """ /P""" + ПарольАдминистратораИБ + """ /WA-"; - Возврат Результат; - -КонецФункции - -&НаСервереБезКонтекста -Функция ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации = Неопределено) - - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); - - УстановитьПривилегированныйРежим(Истина); - - Результат = Новый Структура("НаличиеАктивныхСоединений, НаличиеCOMСоединений, НаличиеСоединенияКонфигуратором, ЕстьАктивныеПользователи", - Ложь, - Ложь, - Ложь, - Ложь); - - Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0 Тогда - Результат.ЕстьАктивныеПользователи = Истина; - КонецЕсли; - - МассивСеансов = ПолучитьСеансыИнформационнойБазы(); - Если МассивСеансов.Количество() = 1 Тогда - Возврат Результат; - КонецЕсли; - - Результат.НаличиеАктивныхСоединений = Истина; - - Для Каждого Сеанс Из МассивСеансов Цикл - Если ЭтоCOMСоединение(Сеанс) Тогда - Результат.НаличиеCOMСоединений = Истина; - ИначеЕсли ЭтоСеансКонфигуратором(Сеанс) Тогда - Результат.НаличиеСоединенияКонфигуратором = Истина; - КонецЕсли; - КонецЦикла; - - Возврат Результат; - -КонецФункции - -&НаСервереБезКонтекста -Функция ЭтоСеансКонфигуратором(СеансИнформационнойБазы) - - Возврат ВРег(СеансИнформационнойБазы.ИмяПриложения) = ВРег("Designer"); - -КонецФункции - -&НаСервереБезКонтекста -Функция ЭтоCOMСоединение(СеансИнформационнойБазы) - - Возврат ВРег(СеансИнформационнойБазы.ИмяПриложения) = ВРег("COMConnection"); - -КонецФункции diff --git a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Form.form similarity index 56% rename from SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии/Form.form rename to SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Form.form index 5f6b01c84..5291cbda1 100644 --- a/SSL/src/DataProcessors/РезервноеКопированиеИБ/Forms/ВосстановлениеДанныхИнформационнойБазыИзРезервнойКопии/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Form.form @@ -1,75 +1,104 @@ - - <key>ru</key> - <value>Восстановление данных информационной базы из резервной копии</value> - - СтраницыЗагрузкиДанных - 29 + СтраницыПомощника + 3 - СтраницаНастройкиЗагрузки - 30 + СтраницаНастройкиПараметровРезервногоКопирования + 6 - СтраницаЗагрузкиДанных - 1 - - ГруппаЗаведенияПутиКопирования2 - 7 - - НадписьПутьКопирования2 - 8 - - <key>ru</key> - <value> Укажите путь к файлу с резервной копией:</value> - - true - true - - true - - - НадписьПутьКопирования2РасширеннаяПодсказка - 99 - Label - true - true - - Left - - - - НадписьПутьКопирования2КонтекстноеМеню - 9 - true - + ГруппаПриветствияПриНастройкеРасписанияРК + 47 + + ВариантПроведенияРезервногоКопирования + 245 + + <key>ru</key> + <value>Выполнять резервное копирование</value> + + true + true + + true + + + Объект.ВариантПроведенияРезервногоКопирования + + Top + + OnChange + ВариантПроведенияРезервногоКопированияПриИзменении + + + ВариантПроведенияРезервногоКопированияExtendedTooltip + 285 Label true true - true Left - - - ПутьККаталогуАрхивов2 - 10 +
                + + ВариантПроведенияРезервногоКопированияКонтекстноеМеню + 246 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Регулярно по расписанию: + + + 1 + + + + + ru + При завершении работы + + + 2 + + + + + ru + Не выполнять + + + 3 + + + Vertical + + + + ГруппаНастройкиРасписанияКопирования + 57 + + ИзменитьРасписание + 238 <key>ru</key> - <value>Каталог</value> + <value>Не задано</value> true true true - - Объект.ФайлЗагрузкиРезервнойКопии - - None - ПутьККаталогуАрхивов2РасширеннаяПодсказка - 100 + ИзменитьРасписаниеExtendedTooltip + 289 Label true true @@ -77,76 +106,86 @@ Left - - ПутьККаталогуАрхивов2КонтекстноеМеню - 11 - true - - InputField - Left - Enter - true - Left - true - - - StartChoice - ПутьККаталогуАрхивов2НачалоВыбора - - true - true - true - true - true - true - true - Normal + Hyperlink + Form.Command.ИзменитьРасписание + Normal + Auto + 37 + true + true + UserCmds + Auto + + true + true + + true + + false + + ГруппаНастройкиРасписанияКопированияExtendedTooltip + 286 + Label + true + true + + Left - - - ПроводитьРезервноеКопированиеПриВосстановленииДанных - 25 - true - true - - true - - - Объект.ПроводитьРезервноеКопированиеПриВосстановленииДанных - - Right - - OnChange - ПроводитьРезервноеКопированиеПриВосстановленииДанныхПриИзменении - - - ПроводитьРезервноеКопированиеПриВосстановленииДанныхРасширеннаяПодсказка - 102 - Label - true - true - - Left - - - - ПроводитьРезервноеКопированиеПриВосстановленииДанныхКонтекстноеМеню - 26 - true - - CheckBoxField - Enter - true - Left - true - - +
                + UsualGroup + + Auto + true + true + auto + Auto + Auto + + + true + true + + true + + + <key>ru</key> + <value>Группа приветствия при настройке расписания РК</value> + + + ГруппаПриветствияПриНастройкеРасписанияРКExtendedTooltip + 284 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + СтраницыРежима + 379 + + СтраницаВыполнять + 377 - ГруппаРезервнойКопииПриВосстановлении - 85 + ГруппаЗаведенияПутиКопирования + 52 ПутьККаталогуАрхивов - 27 + 55 + + <key>ru</key> + <value>Каталог для сохранения резервных копий</value> + true true @@ -155,9 +194,10 @@ Объект.КаталогСРезервнымиКопиями + Top ПутьККаталогуАрхивовРасширеннаяПодсказка - 105 + 292 Label true true @@ -167,10 +207,11 @@ ПутьККаталогуАрхивовКонтекстноеМеню - 28 + 56 true InputField + Left Enter true Left @@ -182,6 +223,7 @@ true true + true true true true @@ -191,8 +233,8 @@ - НадписьРекомендацииПоВыборуПути - 83 + НадписьРекомендацииПоВыборуПути2 + 202 <key>ru</key> <value>Рекомендуется выполнять резервное копирование на другой компьютер или внешний носитель.</value> @@ -203,8 +245,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьРекомендацииПоВыборуПутиРасширеннаяПодсказка</name> - <id>107</id> + <name>НадписьРекомендацииПоВыборуПути2ExtendedTooltip</name> + <id>293</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -213,8 +255,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>НадписьРекомендацииПоВыборуПутиКонтекстноеМеню</name> - <id>84</id> + <name>НадписьРекомендацииПоВыборуПути2КонтекстноеМеню</name> + <id>203</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -230,21 +272,17 @@ </extInfo> </items> <visible>true</visible> - <enabled>false</enabled> + <enabled>true</enabled> <userVisible> <common>true</common> </userVisible> <title> <key>ru</key> - <value>Группа резервной копии при восстановлении</value> + <value>Шаг 1. Выбор каталога</value> - - ru - Группа резервной копии при восстановлении - - ГруппаРезервнойКопииПриВосстановленииРасширеннаяПодсказка - 104 + ГруппаЗаведенияПутиКопированияРасширеннаяПодсказка + 290 Label true true @@ -256,6 +294,7 @@ Vertical Auto + NormalSeparation true true Auto @@ -264,10 +303,10 @@ ГруппаАвторизации - 86 + 254 - АдминистраторИБ - 87 + АдминистраторИБ1 + 255 true false @@ -277,8 +316,8 @@ АдминистраторИБ - АдминистраторИБРасширеннаяПодсказка - 109 + АдминистраторИБ1ExtendedTooltip + 295 Label true true @@ -287,8 +326,8 @@ - АдминистраторИБКонтекстноеМеню - 88 + АдминистраторИБ1КонтекстноеМеню + 256 true InputField @@ -307,20 +346,60 @@ Normal - - ПарольАдминистратораИБ - 89 + + Группа2 + 396 + + ПарольАдминистратораИБ1 + 257 + true + true + + true + + + ПарольАдминистратораИБ + + + ПарольАдминистратораИБ1ExtendedTooltip + 296 + Label + true + true + + Left + + + + ПарольАдминистратораИБ1КонтекстноеМеню + 258 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal + + true true true - - ПарольАдминистратораИБ - - ПарольАдминистратораИБРасширеннаяПодсказка - 111 + Группа2РасширеннаяПодсказка + 397 Label true true @@ -328,26 +407,13 @@ Left - - ПарольАдминистратораИБКонтекстноеМеню - 90 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - Normal + UsualGroup + + Auto + true + true + Auto + Auto true @@ -355,17 +421,9 @@ true - - <key>ru</key> - <value>Введите пароль администратора информационной базы (если задан)</value> - - - ru - Группа авторизации - - ГруппаАвторизацииРасширеннаяПодсказка - 108 + ГруппаАвторизацииExtendedTooltip + 294 Label true true @@ -380,70 +438,36 @@ NormalSeparation true true - auto Auto Auto - АктивныеПользователи1 - 12 - - ГруппаКартинки1 - 13 - - КартинкаПредупреждение1 - 14 - - <key>ru</key> - <value>Картинка предупреждение</value> - - true - true - - true - - - КартинкаПредупреждение1РасширеннаяПодсказка - 115 - Label - true - true - - Left - - - - КартинкаПредупреждение1КонтекстноеМеню - 15 - true - - 6 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - + ГруппаВыбораОчисткиКаталогаОтСтарыхФайлов + 62 + + ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении + 63 + + <key>ru</key> + <value>Хранить ограниченное количество резервных копий</value> + true true true - - <key>ru</key> - <value>Группа картинки</value> - - - ru - Группа картинки - + + Объект.ПроизводитьУдаление + + Right + + OnChange + ОчисткаКаталогаСРезервнымиКопиямиПриПереполненииПриИзменении + - ГруппаКартинки1РасширеннаяПодсказка - 114 + ОчисткаКаталогаСРезервнымиКопиямиПриПереполненииРасширеннаяПодсказка + 298 Label true true @@ -451,34 +475,40 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - + + ОчисткаКаталогаСРезервнымиКопиямиПриПереполненииКонтекстноеМеню + 64 + true + + CheckBoxField + Enter + true + Left + true + - ГруппаНадписей1 - 16 - - Надпись44 - 17 - - <key>ru</key> - <value>С информационной базой сейчас работают другие пользователи. Их работа будет завершена автоматически.</value> - + ГруппаВыбораТипаОчистки + 65 + + ТипОграниченияКаталогаСРезервнымиКопиями + 66 true true true + + Объект.ТипОграничения + + None + + OnChange + ТипОграниченияКаталогаСРезервнымиКопиямиПриИзменении + - Надпись44РасширеннаяПодсказка - 117 + ТипОграниченияКаталогаСРезервнымиКопиямиExtendedTooltip + 300 Label true true @@ -487,33 +517,327 @@ - Надпись44КонтекстноеМеню - 18 + ТипОграниченияКаталогаСРезервнымиКопиямиКонтекстноеМеню + 67 true - Label - true - true - false - - Left + RadioButtonField + Top + Enter + true + Left + true + + 1 + + + ru + Хранить резервные копии за последние: + + + ПоПериоду + + + + + ru + Максимальное количество копий: + + + ПоКоличеству + + + Vertical - - НадписьСписокДействий1 - 19 - - <key>ru</key> - <value>Посмотреть список активных пользователей</value> - + + Группа5 + 68 + + ГруппаХранитьПоследниеЗаПериод + 69 + + ДатаПоследнегоАктуальногоАрхива + 70 + + <key>ru</key> + <value>Хранить резервные копии за последние</value> + + true + true + + true + + + Объект.ЗначениеВЕдиницахИзмерения + + None + + ДатаПоследнегоАктуальногоАрхиваРасширеннаяПодсказка + 303 + Label + true + true + + Left + + + + ДатаПоследнегоАктуальногоАрхиваКонтекстноеМеню + 71 + true + + InputField + Enter + true + Left + true + + 6 + true + true + true + true + true + true + true + + 1 + + Normal + + + + ЕдиницаИзмеренияПериодаХраненияРезервныхКопий + 72 + true + true + + true + + + Объект.ЕдиницаИзмеренияПериода + + None + + ЕдиницаИзмеренияПериодаХраненияРезервныхКопийExtendedTooltip + 304 + Label + true + true + + Left + + + + ЕдиницаИзмеренияПериодаХраненияРезервныхКопийКонтекстноеМеню + 73 + true + + InputField + Enter + true + Left + true + + 7 + true + true + true + true + true + + + ru + дн. + + + День + + + + + ru + нед. + + + Неделя + + + + + ru + мес. + + + Месяц + + + + + ru + лет + + + Год + + + Normal + 7 + + + true + true + + true + + + <key>ru</key> + <value>Группа хранить последние за период</value> + + + ГруппаХранитьПоследниеЗаПериодРасширеннаяПодсказка + 302 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + + ГруппаКоличествоКопийВКаталоге + 356 + + КоличествоКопийВКаталоге + 74 + + <key>ru</key> + <value>Максимальное количество копий (шт.)</value> + + true + true + + true + + + Объект.КоличествоКопий + + None + + КоличествоКопийВКаталогеРасширеннаяПодсказка + 305 + Label + true + true + + Left + + + + КоличествоКопийВКаталогеКонтекстноеМеню + 75 + true + + InputField + Enter + true + Left + true + + 6 + true + true + true + true + true + true + true + + 2 + + Normal + + + + ДекорацияШтук + 353 + + <key>ru</key> + <value>шт.</value> + + true + true + + true + + + ДекорацияШтукРасширеннаяПодсказка + 355 + Label + true + true + + Left + + + + ДекорацияШтукКонтекстноеМеню + 354 + true + + Label + true + true + + Left + + + true + true + + true + + + <key>ru</key> + <value>Группа количество копий в каталоге</value> + + + ГруппаКоличествоКопийВКаталогеРасширеннаяПодсказка + 357 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + true true true - НадписьСписокДействий1РасширеннаяПодсказка - 118 + Группа5ExtendedTooltip + 301 Label true true @@ -521,23 +845,14 @@ Left - - НадписьСписокДействий1КонтекстноеМеню - 20 - true - - Label - true - true - true - false - - - Click - НадписьСписокДействий1Нажатие - - true - Left + UsualGroup + + Vertical + Auto + true + true + Auto + Auto true @@ -547,15 +862,11 @@ <key>ru</key> - <value>Группа надписей</value> + <value>Группа выбора типа очистки</value> - - ru - Группа надписей - - ГруппаНадписей1РасширеннаяПодсказка - 116 + ГруппаВыбораТипаОчисткиExtendedTooltip + 299 Label true true @@ -565,8 +876,8 @@ UsualGroup - Vertical Auto + NormalSeparation true true Auto @@ -578,17 +889,9 @@ true - - <key>ru</key> - <value>Активные пользователи</value> - - - ru - Активные пользователи - - АктивныеПользователи1РасширеннаяПодсказка - 113 + ГруппаВыбораОчисткиКаталогаОтСтарыхФайловРасширеннаяПодсказка + 297 Label true true @@ -598,8 +901,9 @@ UsualGroup + Vertical Auto - NormalSeparation + StrongSeparation true true Auto @@ -611,18 +915,9 @@ true - - <key>ru</key> - <value>Шаг 1. Выбор каталога</value> - - - ru - Шаг 1 - - true - ГруппаЗаведенияПутиКопирования2РасширеннаяПодсказка - 98 + СтраницаВыполнятьРасширеннаяПодсказка + 378 Label true true @@ -630,27 +925,120 @@ Left
                - UsualGroup - + Page + Vertical - Auto - true - true - Auto - Auto + auto - - Декорация1 - 80 + + СтраницаНеВыполнять + 381 + + Группа1 + 391 + + ДекорацияИнформация + 383 + true + true + + true + + + ДекорацияИнформацияРасширеннаяПодсказка + 385 + Label + true + true + + Left + + + + ДекорацияИнформацияКонтекстноеМеню + 384 + true + + 6 + true + 2 + true + + + CommonPicture.Информация32 + + + + + ДекорацияНеВыполнять + 388 + + <key>ru</key> + <value>Этот вариант рекомендуется выбирать только в том случае, если +резервное копирование выполняется сторонними средствами.</value> + + true + true + + true + + + ДекорацияНеВыполнятьРасширеннаяПодсказка + 390 + Label + true + true + + Left + + + + ДекорацияНеВыполнятьКонтекстноеМеню + 389 + true + + Label + true + true + + Left + Center + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 392 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + auto + Auto + Auto + + true true true - Декорация1РасширеннаяПодсказка - 119 + СтраницаНеВыполнятьРасширеннаяПодсказка + 382 Label true true @@ -658,52 +1046,9 @@ Left
                - - Декорация1КонтекстноеМеню - 81 - true - - Label - true - true - true - - Left - - - - НадписьПояснениеКнопкиДалее2 - 21 - - <key>ru</key> - <value>Нажмите "Далее" для начала восстановления данных.</value> - - true - true - - true - - - НадписьПояснениеКнопкиДалее2РасширеннаяПодсказка - 120 - Label - true - true - - Left - - - - НадписьПояснениеКнопкиДалее2КонтекстноеМеню - 22 - true - - Label - true - true - - Center - Bottom + Page + + auto true @@ -711,17 +1056,9 @@ true - - <key>ru</key> - <value>Страница загрузки данных</value> - - - ru - Страница загрузки данных - - СтраницаЗагрузкиДанныхРасширеннаяПодсказка - 97 + СтраницыРежимаРасширеннаяПодсказка + 380 Label true true @@ -729,13 +1066,8 @@ Left - UsualGroup - - Vertical - Auto - true - true - Auto + Pages + Auto @@ -746,402 +1078,11 @@ <key>ru</key> - <value>Страница настройки загрузки</value> + <value>Страница настройки параметров резервного копирования</value> - - ru - Страница настройки загрузки - - СтраницаНастройкиЗагрузкиРасширеннаяПодсказка - 96 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СтраницаИнформацииИВыполненияРезервногоКопирования - 31 - - ГруппаПояснения - 32 - - НадписьПояснения - 33 - - <key>ru</key> - <value>Проводится подготовка к восстановлению данных информационной базы. Пожалуйста, не выключайте компьютер.</value> - - true - true - - true - - - НадписьПоясненияРасширеннаяПодсказка - 123 - Label - true - true - - Left - - - - НадписьПоясненияКонтекстноеМеню - 34 - true - - Label - true - 2 - true - true - - Style.TextFont - true - false - false - false - - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа пояснения</value> - - - ru - Группа пояснения - - - ГруппаПоясненияРасширеннаяПодсказка - 122 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - - ГруппаАктивныхПользователей - 35 - - ГруппаКартинкиАктивныхПользователей - 36 - - Декорация5 - 37 - true - true - - true - - - Декорация5РасширеннаяПодсказка - 126 - Label - true - true - - Left - - - - Декорация5КонтекстноеМеню - 38 - true - - 4 - true - 2 - true - - - CommonPicture.Предупреждение32 - - - - true - true - - true - - - <key>ru</key> - <value>Группа картинки активных пользователей</value> - - - ru - Группа картинки активных пользователей - - - ГруппаКартинкиАктивныхПользователейРасширеннаяПодсказка - 125 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - - ГруппаНадписиАктивныхПользователей - 39 - - СписокПользователей - 40 - - <key>ru</key> - <value>Активные пользователи</value> - - true - true - - true - - - СписокПользователейРасширеннаяПодсказка - 128 - Label - true - true - - Left - - - - СписокПользователейКонтекстноеМеню - 41 - true - - Label - true - 2 - true - - - Click - СписокПользователейНажатие - - true - Left - - - - КоличествоАктивныхПользователей - 42 - true - true - - true - - - КоличествоАктивныхПользователейРасширеннаяПодсказка - 129 - Label - true - true - - Left - - - - КоличествоАктивныхПользователейКонтекстноеМеню - 43 - true - - Label - true - 2 - true - - Left - - - true - true - - true - - - <key>ru</key> - <value>Группа надписи активных пользователей</value> - - - ru - Группа надписи активных пользователей - - - ГруппаНадписиАктивныхПользователейРасширеннаяПодсказка - 127 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto - - - true - true - - true - - - <key>ru</key> - <value>Группа активных пользователей</value> - - - ru - Группа активных пользователей - - - ГруппаАктивныхПользователейРасширеннаяПодсказка - 124 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - НадписьОтключениеПользователей - 44 - - <key>ru</key> - <value>Проводится отключение активных пользователей...</value> - - true - true - - true - - - НадписьОтключениеПользователейРасширеннаяПодсказка - 130 - Label - true - true - - Left - - - - НадписьОтключениеПользователейКонтекстноеМеню - 45 - true - - Label - true - true - - Left - - - - НадписьВремяОжиданияРезервногоКопирования - 46 - true - true - - true - - - НадписьВремяОжиданияРезервногоКопированияРасширеннаяПодсказка - 131 - Label - true - true - - Left - - - - НадписьВремяОжиданияРезервногоКопированияКонтекстноеМеню - 47 - true - - Label - true - 3 - true - - Left - Bottom - - - true - true - - true - - - <key>ru</key> - <value>Страница информации и выполнения резервного копирования</value> - - - ru - Страница информации и выполнения резервного копирования - - - СтраницаИнформацииИВыполненияРезервногоКопированияРасширеннаяПодсказка - 121 + СтраницаНастройкиПараметровРезервногоКопированияExtendedTooltip + 283 Label true true @@ -1157,66 +1098,21 @@ ДополнительныеНастройки - 48 - - НадписьШапкаДополнительныеНастройки - 49 - - <key>ru</key> - <value>Настройка не завершена</value> - - true - true - - true - - - НадписьШапкаДополнительныеНастройкиРасширеннаяПодсказка - 133 - Label - true - true - - Left - - - - НадписьШапкаДополнительныеНастройкиКонтекстноеМеню - 50 - true - - Label - true - 2 - true - true - false - - System.DefaultGUIFont - 12.0 - true - false - false - false - - - Left - - + 204 ГоризонтальнаяГруппаОшибкаПодключения - 51 + 207 Картинка12 - 52 + 208 true true true - Картинка12РасширеннаяПодсказка - 135 + Картинка12ExtendedTooltip + 333 Label true true @@ -1226,7 +1122,7 @@ Картинка12КонтекстноеМеню - 53 + 209 true 6 @@ -1242,10 +1138,10 @@ ГруппаОшибки - 91 + 259 - ОбнаруженнаяОшибкаПодключения1 - 54 + ОбнаруженнаяОшибкаПодключения + 210 <key>ru</key> <value>Ошибка проверки подключения</value> @@ -1260,8 +1156,8 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ОбнаруженнаяОшибкаПодключения1РасширеннаяПодсказка</name> - <id>137</id> + <name>ОбнаруженнаяОшибкаПодключенияРасширеннаяПодсказка</name> + <id>335</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1270,8 +1166,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ОбнаруженнаяОшибкаПодключения1КонтекстноеМеню</name> - <id>55</id> + <name>ОбнаруженнаяОшибкаПодключенияКонтекстноеМеню</name> + <id>211</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -1285,6 +1181,7 @@ <autoMaxWidth>true</autoMaxWidth> <height>3</height> <autoMaxHeight>true</autoMaxHeight> + <verticalStretch>false</verticalStretch> <wrap>true</wrap> <multiLine>true</multiLine> <chooseType>true</chooseType> @@ -1297,8 +1194,8 @@ </extInfo> </items> <items xsi:type="form:Decoration"> - <name>НадписьПерейтиВЖурналРегистрации1</name> - <id>78</id> + <name>НадписьПерейтиВЖурналРегистрации</name> + <id>234</id> <title> <key>ru</key> <value>Техническая информация об ошибке</value> @@ -1309,8 +1206,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>НадписьПерейтиВЖурналРегистрации1РасширеннаяПодсказка</name> - <id>139</id> + <name>НадписьПерейтиВЖурналРегистрацииРасширеннаяПодсказка</name> + <id>336</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1319,14 +1216,13 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>НадписьПерейтиВЖурналРегистрации1КонтекстноеМеню</name> - <id>79</id> + <name>НадписьПерейтиВЖурналРегистрацииКонтекстноеМеню</name> + <id>235</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> - <horizontalStretch>true</horizontalStretch> <skipOnInput>false</skipOnInput> <textColor xsi:type="core:ColorDef"> <red>128</red> @@ -1336,7 +1232,7 @@ <extInfo xsi:type="form:LabelDecorationExtInfo"> <handlers> <event>Click</event> - <name>НадписьПерейтиВЖурналРегистрации1Нажатие</name> + <name>НадписьПерейтиВЖурналРегистрацииНажатие</name> </handlers> <hyperlink>true</hyperlink> <horizontalAlign>Left</horizontalAlign> @@ -1347,13 +1243,9 @@ <userVisible> <common>true</common> </userVisible> - <toolTip> - <key>ru</key> - <value>Группа ошибки</value> - </toolTip> <extendedTooltip> - <name>ГруппаОшибкиРасширеннаяПодсказка</name> - <id>136</id> + <name>ГруппаОшибкиExtendedTooltip</name> + <id>334</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1378,8 +1270,8 @@ </userVisible> <verticalStretch>false</verticalStretch> <extendedTooltip> - <name>ГоризонтальнаяГруппаОшибкаПодключенияРасширеннаяПодсказка</name> - <id>134</id> + <name>ГоризонтальнаяГруппаОшибкаПодключенияExtendedTooltip</name> + <id>332</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1397,11 +1289,11 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>ПанельАвторизацияИБ1</name> - <id>60</id> + <name>АвторизацияАдминистратораИнформационнойБазы</name> + <id>249</id> <items xsi:type="form:FormField"> - <name>ИмяАдминистратораИБ1</name> - <id>61</id> + <name>АдминистраторИБ</name> + <id>250</id> <title> <key>ru</key> <value>Имя</value> @@ -1415,8 +1307,8 @@ <segments>АдминистраторИБ</segments> </dataPath> <extendedTooltip> - <name>ИмяАдминистратораИБ1РасширеннаяПодсказка</name> - <id>141</id> + <name>АдминистраторИБExtendedTooltip</name> + <id>338</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1425,8 +1317,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ИмяАдминистратораИБ1КонтекстноеМеню</name> - <id>62</id> + <name>АдминистраторИБКонтекстноеМеню</name> + <id>251</id> <autoFill>true</autoFill> </contextMenu> <type>InputField</type> @@ -1446,66 +1338,26 @@ </extInfo> </items> <items xsi:type="form:FormGroup"> - <name>Группа37</name> - <id>63</id> - <items xsi:type="form:FormGroup"> - <name>Группа38</name> - <id>64</id> - <items xsi:type="form:FormField"> - <name>ПолеПарольАдминистратораИБ1</name> - <id>65</id> - <title> - <key>ru</key> - <value>Пароль</value> - - true - true - - true - - - ПарольАдминистратораИБ - - - ПолеПарольАдминистратораИБ1РасширеннаяПодсказка - 145 - Label - true - true - - Left - - - - ПолеПарольАдминистратораИБ1КонтекстноеМеню - 66 - true - - InputField - Enter - true - Left - true - - true - true - false - true - true - true - true - true - Normal - - + Группа3 + 398 + + ПарольАдминистратораИБ + 252 + + <key>ru</key> + <value>Пароль</value> + true true true + + ПарольАдминистратораИБ + - Группа38РасширеннаяПодсказка - 144 + ПарольАдминистратораИБExtendedTooltip + 339 Label true true @@ -1513,14 +1365,26 @@ Left
                - UsualGroup - - Vertical - Auto - true - true - Auto - Auto + + ПарольАдминистратораИБКонтекстноеМеню + 253 + true + + InputField + Enter + true + Left + true + + true + true + false + true + true + true + true + true + Normal true @@ -1529,8 +1393,8 @@ true - Группа37РасширеннаяПодсказка - 143 + Группа3РасширеннаяПодсказка + 399 Label true true @@ -1554,15 +1418,11 @@ <key>ru</key> - <value>1. Если задан неправильный пароль, то введите его еще раз</value> + <value>1. Если задан неправильный пароль администратора, введите его еще раз</value> - - ru - Панель авторизация ИБ - - ПанельАвторизацияИБ1РасширеннаяПодсказка - 140 + АвторизацияАдминистратораИнформационнойБазыExtendedTooltip + 337 Label true true @@ -1584,10 +1444,10 @@ ГруппаComcntrФайловыйРежим - 56 + 212 - НадписьОбновитьВерсиюКомпоненты1 - 57 + НадписьОбновитьВерсиюКомпоненты + 213 <key>ru</key> <value>2. При ошибке версии компоненты "comcntr", рекомендуется выполнить ее перерегистрацию (потребуется перезапуск сеанса).</value> @@ -1602,8 +1462,8 @@ <value>Возможно необходимо обновить версию компоненты "comcntr". При этом потребуется перезапустить сеанс 1С. Для этого нажмите здесь</value> </toolTip> <extendedTooltip> - <name>НадписьОбновитьВерсиюКомпоненты1РасширеннаяПодсказка</name> - <id>148</id> + <name>НадписьОбновитьВерсиюКомпонентыРасширеннаяПодсказка</name> + <id>341</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1612,8 +1472,8 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>НадписьОбновитьВерсиюКомпоненты1КонтекстноеМеню</name> - <id>58</id> + <name>НадписьОбновитьВерсиюКомпонентыКонтекстноеМеню</name> + <id>214</id> <autoFill>true</autoFill> </contextMenu> <type>Label</type> @@ -1626,8 +1486,8 @@ </extInfo> </items> <items xsi:type="form:Button"> - <name>КнопкаОбновитьВерсиюКомпоненты1</name> - <id>59</id> + <name>КнопкаОбновитьВерсиюКомпоненты</name> + <id>215</id> <title> <key>ru</key> <value>Исправить</value> @@ -1639,8 +1499,8 @@ </userVisible> <skipOnInput>false</skipOnInput> <extendedTooltip> - <name>КнопкаОбновитьВерсиюКомпоненты1РасширеннаяПодсказка</name> - <id>149</id> + <name>КнопкаОбновитьВерсиюКомпонентыРасширеннаяПодсказка</name> + <id>342</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1663,8 +1523,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ГруппаComcntrФайловыйРежимРасширеннаяПодсказка</name> - <id>147</id> + <name>ГруппаComcntrФайловыйРежимExtendedTooltip</name> + <id>340</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -1691,13 +1551,9 @@ <key>ru</key> <value>Дополнительные настройки</value> - - ru - Дополнительные настройки - - ДополнительныеНастройкиРасширеннаяПодсказка - 132 + ДополнительныеНастройкиExtendedTooltip + 330 Label true true @@ -1718,15 +1574,11 @@ <key>ru</key> - <value>Страницы загрузки данных</value> + <value>Страницы помощника</value> - - ru - Страницы загрузки данных - - СтраницыЗагрузкиДанныхРасширеннаяПодсказка - 95 + СтраницыПомощникаExtendedTooltip + 268 Label true true @@ -1739,42 +1591,15 @@ Auto - Bottom - true - - ФормаКоманднаяПанель - -1 + + КоманднаяПанель + 370 - Назад - 82 - true - - true - - - НазадРасширеннаяПодсказка - 92 - Label - true - true - - Left - - - Form.Command.ФормаНазад - Normal - Auto - true - true - UserCmds - Auto - - - Готово - 23 + Далее + 1 <key>ru</key> - <value>Далее >></value> + <value>Готово</value> true true @@ -1782,8 +1607,8 @@ true - ГотовоРасширеннаяПодсказка - 93 + ДалееExtendedTooltip + 266 Label true true @@ -1791,7 +1616,7 @@ Left - Form.Command.ФормаГотово + Form.Command.Готово Auto true true @@ -1800,20 +1625,16 @@ Auto - Закрыть - 24 - - <key>ru</key> - <value>Отмена</value> - + Справка + 375 true true true - ЗакрытьРасширеннаяПодсказка - 94 + СправкаРасширеннаяПодсказка + 376 Label true true @@ -1821,24 +1642,71 @@ Left - Form.Command.ФормаОтмена + Form.StandardCommand.Help Normal + Auto true true UserCmds Auto + + Отмена + 403 + true + true + + true + + + ОтменаРасширеннаяПодсказка + 404 + Label + true + true + + Left + + + Form.StandardCommand.Cancel + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + КоманднаяПанельРасширеннаяПодсказка + 371 + Label + true + true + + Left + + + CommandBar + + Right + + + Bottom + true + + ФормаКоманднаяПанель + -1 Right - true OnOpen ПриОткрытии - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере @@ -1848,7 +1716,9 @@ ПриЗакрытии LockOwner + Use true + true true Vertical true @@ -1860,7 +1730,7 @@ Объект 1 - DataProcessorObject.РезервноеКопированиеИБ + DataProcessorObject.НастройкаРезервногоКопированияИБ true @@ -1874,7 +1744,7 @@ АдминистраторИБ <key>ru</key> - <value>Имя</value> + <value>Имя администратора</value> 2 @@ -1923,17 +1793,17 @@ true + ShowError - ИмяФайлаЗапускаПриложенияВРежимеПредприятия + ТребуетсяВводПароля <key>ru</key> - <value>Имя файла запуска приложения в режиме предприятия</value> + <value>Требуется ввод пароля</value> 5 - String - + Boolean true @@ -1942,11 +1812,26 @@ true - - ФормаГотово + + Расписание <key>ru</key> - <value>Далее >></value> + <value>Расписание</value> + + 6 + + + true + + + true + + + + Готово + + <key>ru</key> + <value>Готово</value> 1 @@ -1970,7 +1855,7 @@ ru Обновить версию компоненты - 2 + 4 ru Обновить версию компоненты @@ -1987,44 +1872,18 @@ Auto - ФормаНазад + ИзменитьРасписание <key>ru</key> - <value><< Назад</value> + <value>Изменить</value> - 3 - - ru - Назад - + 5 true - Назад - - - Auto - Auto - - - ФормаОтмена - - <key>ru</key> - <value>Форма отмена</value> - - 4 - - ru - Форма отмена - - - true - - - - ФормаОтмена + ИзменитьРасписание Auto diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Module.bsl new file mode 100644 index 000000000..c3cf575b5 --- /dev/null +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Forms/Форма/Module.bsl @@ -0,0 +1,474 @@ +&НаКлиенте +Перем ЗаписатьНастройки, МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования; + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + Возврат; // Отказ устанавливается в ПриОткрытии(). + КонецЕсли; + + НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования(); + + Объект.ВариантПроведенияРезервногоКопирования = НастройкиРезервногоКопирования.ВыборПунктаНастройки; + ПарольАдминистратораИБ = НастройкиРезервногоКопирования.ПарольАдминистратораИБ; + Расписание = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(НастройкиРезервногоКопирования.РасписаниеКопирования); + Элементы.ИзменитьРасписание.Заголовок = Строка(Расписание); + Объект.КаталогСРезервнымиКопиями = НастройкиРезервногоКопирования.КаталогХраненияРезервныхКопий; + + // Заполнение настроек по хранению старых копий. + + ЗаполнитьЗначенияСвойств(Объект, НастройкиРезервногоКопирования.ПараметрыУдаления); + Элементы.ГруппаВыбораТипаОчистки.Доступность = Объект.ПроизводитьУдаление; + ОбновитьТипОграниченияКаталогаСРезервнымиКопиями(ЭтотОбъект); + + // Первая часть проверки на сервере - если в информационной базе есть пользователи + ТребуетсяВводПароля = (ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0); + + Если Объект.ВариантПроведенияРезервногоКопирования = 0 Тогда + + Объект.ВариантПроведенияРезервногоКопирования = 1; + + КонецЕсли; + + Элементы.ГруппаНастройкиРасписанияКопирования.Доступность = (Объект.ВариантПроведенияРезервногоКопирования = 1); + Элементы.СтраницыРежима.ТекущаяСтраница = ?(Объект.ВариантПроведенияРезервногоКопирования = 3, + Элементы.СтраницаНеВыполнять, Элементы.СтраницаВыполнять); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + + Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + Отказ = Истина; + ТекстСообщения = НСтр("ru = 'Резервное копирование не поддерживается в клиенте под управлением ОС Linux.'"); + ПоказатьПредупреждение(, ТекстСообщения); + Возврат; + КонецЕсли; + + МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования; + ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; + ЗаписатьНастройки = Ложь; + + ИнформацияОПользователе = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе; + + // Вторая часть проверки на клиенте - если у текущего пользователя (администратор) + // используется стандартная аутентификация и установлен пароль + ТребуетсяВводПароля = ТребуетсяВводПароля И ИнформацияОПользователе.АутентификацияСтандартная И ИнформацияОПользователе.ПарольУстановлен; + + Если ТребуетсяВводПароля Тогда + АдминистраторИБ = ИнформацияОПользователе.Имя; + Иначе + Элементы.ГруппаАвторизации.Видимость = Ложь; + Элементы.АвторизацияАдминистратораИнформационнойБазы.Видимость = Ложь; + КонецЕсли; + +#Если ВебКлиент Тогда + Элементы.ГруппаComcntrФайловыйРежим.Видимость = Ложь; +#КонецЕсли + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + Если Не ЗаписатьНастройки Тогда + ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования; + КонецЕсли; + + Оповестить("ЗакрытаФормаНастройкиРезервногоКопирования"); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ + +&НаКлиенте +Процедура ТипОграниченияКаталогаСРезервнымиКопиямиПриИзменении(Элемент) + + ОбновитьТипОграниченияКаталогаСРезервнымиКопиями(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПутьККаталогуАрхивовНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + ВыбранныйПуть = ПолучитьПуть(РежимДиалогаВыбораФайла.ВыборКаталога); + Если Не ПустаяСтрока(ВыбранныйПуть) Тогда + Объект.КаталогСРезервнымиКопиями = ВыбранныйПуть; + КонецЕсли; + +КонецПроцедуры + +// Обработчик перехода к журналу регистрации. +&НаКлиенте +Процедура НадписьПерейтиВЖурналРегистрацииНажатие(Элемент) + ОткрытьФорму("Обработка.ЖурналРегистрации.Форма.ЖурналРегистрации", , ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ВариантПроведенияРезервногоКопированияПриИзменении(Элемент) + + Элементы.ГруппаНастройкиРасписанияКопирования.Доступность = (Объект.ВариантПроведенияРезервногоКопирования = 1); + + Элементы.СтраницыРежима.ТекущаяСтраница = ?(Объект.ВариантПроведенияРезервногоКопирования = 3, + Элементы.СтраницаНеВыполнять, Элементы.СтраницаВыполнять); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчисткаКаталогаСРезервнымиКопиямиПриПереполненииПриИзменении(Элемент) + + Элементы.ГруппаВыбораТипаОчистки.Доступность = Объект.ПроизводитьУдаление; + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ КОМАНД ФОРМЫ + +&НаКлиенте +Процедура Готово(Команда) + + ЗаписатьНастройки = Истина; + ПерейтиСоСтраницыНастройки(); + +КонецПроцедуры + +// Вызывает стандартную форму настройки расписания регламентного задания, +// заполняя его текущими настройками расписания резервного копирования. +&НаКлиенте +Процедура ИзменитьРасписание(Команда) + + ДиалогРасписания = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); + ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьРасписаниеЗавершение", ЭтотОбъект); + ДиалогРасписания.Показать(ОписаниеОповещения); + +КонецПроцедуры + +// Процедура обновления компоненты comcntr. +&НаКлиенте +Процедура ОбновитьВерсиюКомпоненты(Команда) + + ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаКлиенте +Процедура ПерейтиСоСтраницыНастройки() + + Если Объект.ВариантПроведенияРезервногоКопирования = 3 Тогда + + ОстановитьСервисОповещения(); + ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; + + Иначе + + Если Не ПроверитьКаталогСРезервнымиКопиями() Тогда + Возврат; + КонецЕсли; + + Если НЕ ПроверитьДоступКИБ() Тогда + Элементы.СтраницыПомощника.ТекущаяСтраница = Элементы.ДополнительныеНастройки; + Возврат; + КонецЕсли; + + ЗаписатьНастройки(); + + Если Объект.ВариантПроведенияРезервногоКопирования = 1 Тогда // По расписанию + + ТекущаяДата = ОбщегоНазначенияКлиент.ДатаСеанса(); + ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = ТекущаяДата; + ПараметрыРезервногоКопированияИБ.ДатаПоследнегоРезервногоКопирования = ТекущаяДата; + ПараметрыРезервногоКопированияИБ.РасписаниеЗначение = Расписание; + + ИначеЕсли Объект.ВариантПроведенияРезервногоКопирования = 2 Тогда // При завершении + + ПараметрыРезервногоКопированияИБ.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; + + КонецЕсли; + + ИмяФормыНастроек = "e1cib/app/%1"; + ИмяФормыНастроек = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ИмяФормыНастроек, + РезервноеКопированиеИБКлиент.ИмяФормыНастроекРезервногоКопирования()); + + ПоказатьОповещениеПользователя(НСтр("ru = 'Резервное копирование'"), ИмяФормыНастроек, + НСтр("ru = 'Резервное копирование настроено.'")); + + КонецЕсли; + + ПараметрыРезервногоКопированияИБ.ПараметрОповещения = "НеОповещать"; + + ОбновитьПовторноИспользуемыеЗначения(); + Закрыть(); + +КонецПроцедуры + +&НаКлиенте +Функция ПроверитьКаталогСРезервнымиКопиями() + + РеквизитыЗаполнены = Истина; + + Если ПустаяСтрока(Объект.КаталогСРезервнымиКопиями) Тогда + + ТекстСообщения = Нстр("ru = 'Не выбран каталог для резервной копии.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями"); + РеквизитыЗаполнены = Ложь; + + ИначеЕсли НайтиФайлы(Объект.КаталогСРезервнымиКопиями).Количество() = 0 Тогда + + ТекстСообщения = Нстр("ru = 'Указан несуществующий каталог.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями"); + РеквизитыЗаполнены = Ложь; + + Иначе + + Попытка + ТестовыйФайл = Новый ЗаписьXML; + ТестовыйФайл.ОткрытьФайл(Объект.КаталогСРезервнымиКопиями + "/test.test1С"); + ТестовыйФайл.ЗаписатьОбъявлениеXML(); + ТестовыйФайл.Закрыть(); + Исключение + ТекстСообщения = Нстр("ru = 'Нет доступа к каталогу с резервными копиями.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,, "Объект.КаталогСРезервнымиКопиями"); + РеквизитыЗаполнены = Ложь; + КонецПопытки; + + Если РеквизитыЗаполнены Тогда + + Попытка + УдалитьФайлы(Объект.КаталогСРезервнымиКопиями, "*.test1С"); + Исключение + // Исключение не обрабатываем т.к. на этом шаге не происходит удаления файлов + КонецПопытки; + + КонецЕсли; + + КонецЕсли; + + Если ТребуетсяВводПароля И ПустаяСтрока(ПарольАдминистратораИБ) Тогда + + ТекстСообщения = НСтр("ru = 'Не задан пароль администратора.'"); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,, "ПарольАдминистратораИБ"); + РеквизитыЗаполнены = Ложь; + + КонецЕсли; + + Возврат РеквизитыЗаполнены; + +КонецФункции + +// Запрашивает у пользователя путь к файлу или каталогу. +&НаКлиенте +Функция ПолучитьПуть(РежимДиалога) + + Режим = РежимДиалога; + ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); + + Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда + ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите каталог'"); + Иначе + ДиалогОткрытияФайла.Заголовок= НСтр("ru = 'Выберите файл'"); + КонецЕсли; + + Если ДиалогОткрытияФайла.Выбрать() Тогда + Если РежимДиалога = РежимДиалогаВыбораФайла.ВыборКаталога тогда + Возврат ДиалогОткрытияФайла.Каталог; + Иначе + Возврат ДиалогОткрытияФайла.ПолноеИмяФайла; + КонецЕсли; + КонецЕсли; + +КонецФункции + +&НаКлиенте +Функция ПроверитьДоступКИБ() + + Результат = Истина; + // В базовых версиях проверку подключения не осуществляем; + // при некорректном вводе имени и пароля обновление завершится неуспешно. + Если СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации Тогда + Возврат Результат; + КонецЕсли; + ПараметрыПодключения = ПолучитьПараметрыАутентификацииАдминистратораОбновления(); + + Попытка + ComConnector = Новый COMОбъект(СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИмяCOMСоединителя); + СтрокаСоединенияИнформационнойБазы = ПараметрыПодключения.СтрокаСоединенияИнформационнойБазы + ПараметрыПодключения.СтрокаПодключения; + Соединение = ComConnector.Connect(СтрокаСоединенияИнформационнойБазы); + Исключение + Результат = Ложь; + Инфо = ИнформацияОбОшибке(); + ОбнаруженнаяОшибкаПодключения = КраткоеПредставлениеОшибки(Инфо); + + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации( + РезервноеКопированиеИБКлиент.СобытиеЖурналаРегистрации(),"Ошибка", ОбнаруженнаяОшибкаПодключения, , Истина); + + КонецПопытки; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Процедура ОстановитьСервисОповещения() + // Останавливает оповещения о резервном копировании. + НастройкиРезервногоКопирования = РезервноеКопированиеИБСервер.НастройкиРезервногоКопирования(); + НастройкиРезервногоКопирования.ВыборПунктаНастройки = 3; + НастройкиРезервногоКопирования.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; + РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(НастройкиРезервногоКопирования); +КонецПроцедуры + +&НаСервере +Процедура ЗаписатьНастройки() + + ПараметрыРезервногоКопирования = РезервноеКопированиеИБСервер.ПараметрыРезервногоКопирования(); + + ПараметрыРезервногоКопирования.Вставить("АдминистраторИБ", АдминистраторИБ); + ПараметрыРезервногоКопирования.Вставить("ПарольАдминистратораИБ", ?(ТребуетсяВводПароля, ПарольАдминистратораИБ, "")); + ПараметрыРезервногоКопирования.ДатаПоследнегоОповещения = Дата('29990101'); + ПараметрыРезервногоКопирования.КаталогХраненияРезервныхКопий = Объект.КаталогСРезервнымиКопиями; + ПараметрыРезервногоКопирования.ВыборПунктаНастройки = Объект.ВариантПроведенияРезервногоКопирования; + ЗаполнитьЗначенияСвойств(ПараметрыРезервногоКопирования.ПараметрыУдаления, Объект); + + Если Объект.ВариантПроведенияРезервногоКопирования = 1 Тогда // По расписанию + + РасписаниеСтруктура = ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Расписание); + ПараметрыРезервногоКопирования.РасписаниеКопирования = РасписаниеСтруктура; + + ИначеЕсли Объект.ВариантПроведенияРезервногоКопирования = 2 Тогда // При завершении + + ПараметрыРезервногоКопирования.МинимальнаяДатаСледующегоАвтоматическогоРезервногоКопирования = '29990101'; + + КонецЕсли; + + РезервноеКопированиеИБСервер.УстановитьПараметрыРезервногоКопирования(ПараметрыРезервногоКопирования); + +КонецПроцедуры + +&НаКлиентеНаСервереБезКонтекста +Процедура ОбновитьТипОграниченияКаталогаСРезервнымиКопиями(Форма) + + Форма.Элементы.ГруппаХранитьПоследниеЗаПериод.Доступность = (Форма.Объект.ТипОграничения = "ПоПериоду"); + Форма.Элементы.ГруппаКоличествоКопийВКаталоге.Доступность = (Форма.Объект.ТипОграничения = "ПоКоличеству"); + +КонецПроцедуры + +&НаКлиенте +Процедура ИзменитьРасписаниеЗавершение(РасписаниеРезультат, ДополнительныеПараметры) Экспорт + + Если РасписаниеРезультат = Неопределено Тогда + Возврат; + КонецЕсли; + + Расписание = РасписаниеРезультат; + Элементы.ИзменитьРасписание.Заголовок = Строка(Расписание); + +КонецПроцедуры + +//////////////////////////////////////////////////////////////////////////////// +// Процедуры и функции проведения резервного копирования + + &НаСервере +Функция ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации) + + // запись накопленных событий ЖР + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + + Результат = ПолучитьИнформациюОНаличииСоединений(); + Результат.Вставить("СтрокаСоединенияИнформационнойБазы", + СоединенияИБКлиентСервер.ПолучитьСтрокуСоединенияИнформационнойБазы(0)); + + Возврат Результат; + +КонецФункции + +&НаКлиенте +Функция ПолучитьПараметрыАутентификацииАдминистратораОбновления() + + Результат = Новый Структура("ИмяПользователя, + |ПарольПользователя, + |СтрокаПодключения, + |ПараметрыАутентификации, + |СтрокаСоединенияИнформационнойБазы", + Неопределено, "", "", "", "", ""); + + ТекущиеСоединения = ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации); + Результат.СтрокаСоединенияИнформационнойБазы = ТекущиеСоединения.СтрокаСоединенияИнформационнойБазы; + // Диагностика случая, когда ролевой безопасности в системе не предусмотрено. + // Т.е. ситуация, когда любой пользователь «может» в системе все. + Если НЕ ТекущиеСоединения.ЕстьАктивныеПользователи Тогда + Возврат Результат; + КонецЕсли; + + Пользователь = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе.Имя; + ПарольАдминистратора = ?(ТребуетсяВводПароля, ПарольАдминистратораИБ, ""); + + Результат.ИмяПользователя = Пользователь; + Результат.ПарольПользователя = ПарольАдминистратора; + Результат.СтрокаПодключения = "Usr=""" + Пользователь + """;Pwd=""" + ПарольАдминистратора + """;"; + Результат.ПараметрыАутентификации = "/N""" + Пользователь + """ /P""" + ПарольАдминистратора + """ /WA-"; + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации = Неопределено) + + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + + УстановитьПривилегированныйРежим(Истина); + + Результат = Новый Структура("НаличиеАктивныхСоединений, НаличиеCOMСоединений, НаличиеСоединенияКонфигуратором, ЕстьАктивныеПользователи", + Ложь, + Ложь, + Ложь, + Ложь); + + Если ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0 Тогда + Результат.ЕстьАктивныеПользователи = Истина; + КонецЕсли; + + МассивСеансов = ПолучитьСеансыИнформационнойБазы(); + Если МассивСеансов.Количество() = 1 Тогда + Возврат Результат; + КонецЕсли; + + Результат.НаличиеАктивныхСоединений = Истина; + + Для Каждого Сеанс Из МассивСеансов Цикл + Если ЭтоCOMСоединение(Сеанс) Тогда + Результат.НаличиеCOMСоединений = Истина; + ИначеЕсли ЭтоСеансКонфигуратором(Сеанс) Тогда + Результат.НаличиеСоединенияКонфигуратором = Истина; + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +&НаСервереБезКонтекста +Функция ЭтоСеансКонфигуратором(СеансИнформационнойБазы) + + Возврат ВРег(СеансИнформационнойБазы.ИмяПриложения) = ВРег("Designer"); + +КонецФункции + +&НаСервереБезКонтекста +Функция ЭтоCOMСоединение(СеансИнформационнойБазы) + + Возврат ВРег(СеансИнформационнойБазы.ИмяПриложения) = ВРег("COMConnection"); + +КонецФункции + diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Help/ru.html b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Help/ru.html index 943be235a..0a7898d39 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/Help/ru.html @@ -1,4 +1,4 @@ - +

                Форма настройки системы резервного копирования информационной базы.

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

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

                diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/НастройкаРезервногоКопированияИБ.mdo b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/НастройкаРезервногоКопированияИБ.mdo index 380c5f4db..374c15ba8 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/НастройкаРезервногоКопированияИБ.mdo +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияИБ/НастройкаРезервногоКопированияИБ.mdo @@ -7,10 +7,10 @@ НастройкаРезервногоКопированияИБ ru - Настройка резервного копирования ИБ + Настройка резервного копирования true - DataProcessor.НастройкаРезервногоКопированияИБ.Form.РезервноеКопированиеИнформационнойБазы + DataProcessor.НастройкаРезервногоКопированияИБ.Form.Форма ru @@ -41,44 +41,8 @@ - - ЕдиницаИзмеренияПериодаОповещения - - ru - Единица измерения периода оповещения - - - String - - 10 - - - - - ShowError - Use - DontUse - - - ЕдиницаИзмеренияПериодаОтложенногоОповещения - - ru - Единица измерения периода отложенного оповещения - - - String - - 10 - - - - - ShowError - Use - DontUse - - ЕдиницаИзмеренияПериодаХраненияРезервныхКопий + ЕдиницаИзмеренияПериода ru Единица измерения периода хранения резервных копий @@ -106,22 +70,6 @@ ShowError - - КодТипаИнтерактивногоРезервногоКопирования - - ru - Код типа интерактивного резервного копирования - - - Number - - 1 - true - - - - - КодТипаРезервногоКопирования @@ -139,10 +87,10 @@ - КоличествоКопийВКаталоге + КоличествоКопий ru - Количество копий в каталоге + Количество копий Number @@ -167,10 +115,10 @@ - ОчисткаКаталогаСРезервнымиКопиямиПриПереполнении + ПроизводитьУдаление ru - Очистка каталога с резервными копиями при переполнении + Производить удаление Boolean @@ -178,42 +126,11 @@ - - ПериодОповещения - - ru - Период оповещения - - - Number - - 10 - true - - - - - - - ПериодОтложенногоОповещения - - ru - Период отложенного оповещения - - - Number - - 5 - - - - - - ПериодХраненияРезервныхКопий + ЗначениеВЕдиницахИзмерения ru - Период хранения резервных копий + Значение в единицах измерения Number @@ -236,35 +153,8 @@ - - ПродолжатьНапоминания - - ru - Продолжать напоминания - - - Boolean - - - - - - СтрокаРасписания - - ru - Строка расписания - - - String - - 200 - - - - - - ТипОграниченияКаталогаСРезервнымиКопиями + ТипОграничения ru Тип ограничения каталога с резервными копиями @@ -272,7 +162,7 @@ String - 10 + 12 @@ -291,18 +181,6 @@ - - НажатиеГиперссылки - - ru - Нажатие гиперссылки - - - Boolean - - - - ВариантПроведенияРезервногоКопирования @@ -319,10 +197,19 @@ - РезервноеКопированиеИнформационнойБазы + Форма ru - Резервное копирование информационной базы + Форма + + PersonalComputer + MobileDevice + + + НапоминаниеКлиентСервер + + ru + Напоминание клиент сервер PersonalComputer MobileDevice diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Form.form index 7d367c3b5..a70159b87 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Form.form @@ -13,7 +13,7 @@ true - ФормаУстановитьНастройкиПоУмолчаниюРасширеннаяПодсказка + ФормаУстановитьНастройкиПоУмолчаниюExtendedTooltip 73 Label true @@ -53,7 +53,7 @@ ВремяФормированияКопий - ВремяФормированияКопийРасширеннаяПодсказка + ВремяФормированияКопийExtendedTooltip 76 Label true @@ -96,8 +96,8 @@ None - ЧасовойПоясОбластиРасширеннаяПодсказка - 78 + ЧасовойПоясОбластиExtendedTooltip + 77 Label true true @@ -130,7 +130,7 @@ Время формирования копий - ГруппаВремяФормированияКопийРасширеннаяПодсказка + ГруппаВремяФормированияКопийExtendedTooltip 75 Label true @@ -169,8 +169,8 @@ ФормироватьЕжедневныеКопии - ФормироватьЕжедневныеКопииРасширеннаяПодсказка - 83 + ФормироватьЕжедневныеКопииExtendedTooltip + 81 Label true true @@ -207,8 +207,8 @@ Left - ФормироватьЕжедневныеКопииТолькоВДниРаботыПользователейРасширеннаяПодсказка - 85 + ФормироватьЕжедневныеКопииТолькоВДниРаботыПользователейExtendedTooltip + 82 Label true true @@ -239,8 +239,8 @@ true - ГруппаЕжедневныеКопииРасширеннаяПодсказка - 82 + ГруппаЕжедневныеКопииExtendedTooltip + 80 Label true true @@ -272,8 +272,8 @@ ФормироватьЕжемесячныеКопии - ФормироватьЕжемесячныеКопииРасширеннаяПодсказка - 88 + ФормироватьЕжемесячныеКопииExtendedTooltip + 84 Label true true @@ -310,8 +310,8 @@ Right - ЧислоМесяцаФормированияЕжемесячныхКопийРасширеннаяПодсказка - 90 + ЧислоМесяцаФормированияЕжемесячныхКопийExtendedTooltip + 85 Label true true @@ -356,8 +356,8 @@ Ежемесячные копии - ГруппаЕжемесячныеКопииРасширеннаяПодсказка - 87 + ГруппаЕжемесячныеКопииExtendedTooltip + 83 Label true true @@ -389,8 +389,8 @@ ФормироватьЕжегодныеКопии - ФормироватьЕжегодныеКопииРасширеннаяПодсказка - 93 + ФормироватьЕжегодныеКопииExtendedTooltip + 87 Label true true @@ -423,8 +423,8 @@ None - ЧислоМесяцаФормированияЕжегодныхКопийРасширеннаяПодсказка - 95 + ЧислоМесяцаФормированияЕжегодныхКопийExtendedTooltip + 88 Label true true @@ -472,8 +472,8 @@ None - МесяцФормированияЕжегодныхКопийРасширеннаяПодсказка - 97 + МесяцФормированияЕжегодныхКопийExtendedTooltip + 89 Label true true @@ -513,8 +513,8 @@ Ежегодные копии - ГруппаЕжегодныеКопииРасширеннаяПодсказка - 92 + ГруппаЕжегодныеКопииExtendedTooltip + 86 Label true true @@ -541,8 +541,8 @@ Флаги и время - ГруппаФлагиИВремяРасширеннаяПодсказка - 81 + ГруппаФлагиИВремяExtendedTooltip + 79 Label true true @@ -582,8 +582,8 @@ КоличествоЕжедневныхКопий - КоличествоЕжедневныхКопийРасширеннаяПодсказка - 101 + КоличествоЕжедневныхКопийExtendedTooltip + 92 Label true true @@ -624,8 +624,8 @@ true - ДекорацияКопийЕжедневныхРасширеннаяПодсказка - 103 + ДекорацияКопийЕжедневныхExtendedTooltip + 93 Label true true @@ -656,8 +656,8 @@ true - ГруппаЕжедневныеКопииКоличествоРасширеннаяПодсказка - 100 + ГруппаЕжедневныеКопииКоличествоExtendedTooltip + 91 Label true true @@ -693,8 +693,8 @@ КоличествоЕжемесячныхКопий - КоличествоЕжемесячныхКопийРасширеннаяПодсказка - 105 + КоличествоЕжемесячныхКопийExtendedTooltip + 95 Label true true @@ -735,8 +735,8 @@ true - ДекорацияКопийЕжемесячныхРасширеннаяПодсказка - 107 + ДекорацияКопийЕжемесячныхExtendedTooltip + 96 Label true true @@ -766,8 +766,8 @@ Ежемесячные копии (количество) - ГруппаЕжемесячныеКопииКоличествоРасширеннаяПодсказка - 104 + ГруппаЕжемесячныеКопииКоличествоExtendedTooltip + 94 Label true true @@ -803,8 +803,8 @@ КоличествоЕжегодныхКопий - КоличествоЕжегодныхКопийРасширеннаяПодсказка - 109 + КоличествоЕжегодныхКопийExtendedTooltip + 98 Label true true @@ -845,8 +845,8 @@ true - ДекорацияКопийЕжегодныхРасширеннаяПодсказка - 111 + ДекорацияКопийЕжегодныхExtendedTooltip + 99 Label true true @@ -876,8 +876,8 @@ Ежегодные копии (количество) - ГруппаЕжегодныеКопииКоличествоРасширеннаяПодсказка - 108 + ГруппаЕжегодныеКопииКоличествоExtendedTooltip + 97 Label true true @@ -904,8 +904,8 @@ Количество - ГруппаКоличествоРасширеннаяПодсказка - 99 + ГруппаКоличествоExtendedTooltip + 90 Label true true @@ -933,8 +933,8 @@ Параметры формирования - ГруппаПараметрыФормированияКолонкиРасширеннаяПодсказка - 80 + ГруппаПараметрыФормированияКолонкиExtendedTooltip + 78 Label true true @@ -961,7 +961,7 @@ Параметры формирования - ГруппаПараметрыФормированияРасширеннаяПодсказка + ГруппаПараметрыФормированияExtendedTooltip 74 Label true @@ -999,7 +999,7 @@ true - ФормаОКРасширеннаяПодсказка + ФормаОКExtendedTooltip 70 Label true @@ -1025,7 +1025,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 71 Label true @@ -1051,7 +1051,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 72 Label true diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Module.bsl index 0b9f8960e..cee06c0ca 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаБезИнтервалов/Module.bsl @@ -1,3 +1,5 @@ +&НаКлиенте +Перем ОтветПередЗакрытием; //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -11,7 +13,7 @@ НастройкиРезервногоКопирования = РезервноеКопированиеОбластейДанных.ПолучитьНастройкиРезервногоКопированияОбласти( РаботаВМоделиСервиса.ЗначениеРазделителяСеанса()); - ЗаполнитьЗначенияСвойств(ЭтаФорма, НастройкиРезервногоКопирования); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиРезервногоКопирования); Для НомерМесяца = 1 По 12 Цикл Элементы.МесяцФормированияЕжегодныхКопий.СписокВыбора.Добавить(НомерМесяца, @@ -26,19 +28,32 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если Модифицированность Тогда - Ответ = Вопрос(НСтр("ru = 'Настройки были изменены. Сохранить изменения?'"), - РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - Если Ответ = КодВозвратаДиалога.Да Тогда - ЗаписатьНастройкиРезервногоКопирования(); - КонецЕсли; + Если Не Модифицированность Тогда + Возврат; КонецЕсли; + Если ОтветПередЗакрытием <> Истина Тогда + Отказ = Истина; + ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Настройки были изменены. Сохранить изменения?'"), + РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытиемЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + Если Ответ = КодВозвратаДиалога.Да Тогда + ЗаписатьНастройкиРезервногоКопирования(); + КонецЕсли; + ОтветПередЗакрытием = Истина; + Закрыть(); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -67,7 +82,7 @@ Процедура УстановитьПоУмолчаниюНаСервере() НастройкиРезервногоКопирования = РезервноеКопированиеОбластейДанных.ПолучитьНастройкиРезервногоКопированияОбласти(); - ЗаполнитьЗначенияСвойств(ЭтаФорма, НастройкиРезервногоКопирования); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиРезервногоКопирования); КонецПроцедуры @@ -78,7 +93,7 @@ НастройкиРезервногоКопирования = Новый Структура; Для Каждого КлючИЗначение Из СоответствиеНастроек Цикл - НастройкиРезервногоКопирования.Вставить(КлючИЗначение.Значение, ЭтаФорма[КлючИЗначение.Значение]); + НастройкиРезервногоКопирования.Вставить(КлючИЗначение.Значение, ЭтотОбъект[КлючИЗначение.Значение]); КонецЦикла; РезервноеКопированиеОбластейДанных.УстановитьНастройкиРезервногоКопированияОбласти( diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form index 4ad1d5cd4..9babad3d6 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Form.form @@ -16,7 +16,7 @@ ПредставлениеПриложения - ПредставлениеПриложенияРасширеннаяПодсказка + ПредставлениеПриложенияExtendedTooltip 57 Label true @@ -71,8 +71,8 @@ НачалоИнтервалаФормированияКопий - НачалоИнтервалаФормированияКопийРасширеннаяПодсказка - 62 + НачалоИнтервалаФормированияКопийExtendedTooltip + 61 Label true true @@ -116,8 +116,8 @@ ОкончаниеИнтервалаФормированияКопий - ОкончаниеИнтервалаФормированияКопийРасширеннаяПодсказка - 64 + ОкончаниеИнтервалаФормированияКопийExtendedTooltip + 62 Label true true @@ -158,8 +158,8 @@ None - ЧасовойПоясРасширеннаяПодсказка - 66 + ЧасовойПоясExtendedTooltip + 63 Label true true @@ -192,8 +192,8 @@ Интервал формирования копий страница - ИнтервалФормированияКопийСтраницаРасширеннаяПодсказка - 61 + ИнтервалФормированияКопийСтраницаExtendedTooltip + 60 Label true true @@ -216,8 +216,8 @@ Интервал формирования копий - ИнтервалФормированияКопийРасширеннаяПодсказка - 60 + ИнтервалФормированияКопийExtendedTooltip + 59 Label true true @@ -248,8 +248,8 @@ ФормироватьЕжедневныеКопии - ФормироватьЕжедневныеКопииРасширеннаяПодсказка - 70 + ФормироватьЕжедневныеКопииExtendedTooltip + 66 Label true true @@ -284,8 +284,8 @@ ФормироватьЕжемесячныеКопии - ФормироватьЕжемесячныеКопииРасширеннаяПодсказка - 73 + ФормироватьЕжемесячныеКопииExtendedTooltip + 68 Label true true @@ -322,8 +322,8 @@ Right - ЧислоМесяцаФормированияЕжемесячныхКопийРасширеннаяПодсказка - 75 + ЧислоМесяцаФормированияЕжемесячныхКопийExtendedTooltip + 69 Label true true @@ -372,8 +372,8 @@ Группа ежемесячные копии - ГруппаЕжемесячныеКопииРасширеннаяПодсказка - 72 + ГруппаЕжемесячныеКопииExtendedTooltip + 67 Label true true @@ -405,8 +405,8 @@ ФормироватьЕжегодныеКопии - ФормироватьЕжегодныеКопииРасширеннаяПодсказка - 78 + ФормироватьЕжегодныеКопииExtendedTooltip + 71 Label true true @@ -439,8 +439,8 @@ None - ЧислоМесяцаФормированияЕжегодныхКопийРасширеннаяПодсказка - 80 + ЧислоМесяцаФормированияЕжегодныхКопийExtendedTooltip + 72 Label true true @@ -488,8 +488,8 @@ None - МесяцФормированияЕжегодныхКопийРасширеннаяПодсказка - 82 + МесяцФормированияЕжегодныхКопийExtendedTooltip + 73 Label true true @@ -529,8 +529,8 @@ Группа ежегодные копии - ГруппаЕжегодныеКопииРасширеннаяПодсказка - 77 + ГруппаЕжегодныеКопииExtendedTooltip + 70 Label true true @@ -557,8 +557,8 @@ Группа периодичность - ГруппаПериодичностьРасширеннаяПодсказка - 69 + ГруппаПериодичностьExtendedTooltip + 65 Label true true @@ -602,8 +602,8 @@ КоличествоЕжедневныхКопийПриИзменении - КоличествоЕжедневныхКопийРасширеннаяПодсказка - 86 + КоличествоЕжедневныхКопийExtendedTooltip + 76 Label true true @@ -644,8 +644,8 @@ None - ПодписьКоличестваЕжедневныхРасширеннаяПодсказка - 88 + ПодписьКоличестваЕжедневныхExtendedTooltip + 77 Label true true @@ -678,8 +678,8 @@ Группа количество ежедневных - ГруппаКоличествоЕжедневныхРасширеннаяПодсказка - 85 + ГруппаКоличествоЕжедневныхExtendedTooltip + 75 Label true true @@ -719,8 +719,8 @@ КоличествоЕжемесячныхКопийПриИзменении - КоличествоЕжемесячныхКопийРасширеннаяПодсказка - 91 + КоличествоЕжемесячныхКопийExtendedTooltip + 79 Label true true @@ -761,8 +761,8 @@ None - ПодписьКоличестваЕжемесячныхРасширеннаяПодсказка - 93 + ПодписьКоличестваЕжемесячныхExtendedTooltip + 80 Label true true @@ -795,8 +795,8 @@ Группа количество ежемесячных - ГруппаКоличествоЕжемесячныхРасширеннаяПодсказка - 90 + ГруппаКоличествоЕжемесячныхExtendedTooltip + 78 Label true true @@ -836,8 +836,8 @@ КоличествоЕжегодныхКопийПриИзменении - КоличествоЕжегодныхКопийРасширеннаяПодсказка - 96 + КоличествоЕжегодныхКопийExtendedTooltip + 82 Label true true @@ -878,8 +878,8 @@ None - ПодписьКоличестваЕжегодныхРасширеннаяПодсказка - 98 + ПодписьКоличестваЕжегодныхExtendedTooltip + 83 Label true true @@ -916,8 +916,8 @@ Группа количество ежегодных - ГруппаКоличествоЕжегодныхРасширеннаяПодсказка - 95 + ГруппаКоличествоЕжегодныхExtendedTooltip + 81 Label true true @@ -944,8 +944,8 @@ Группа количество - ГруппаКоличествоРасширеннаяПодсказка - 84 + ГруппаКоличествоExtendedTooltip + 74 Label true true @@ -973,8 +973,8 @@ Группа параметры формирования колонки - ГруппаПараметрыФормированияКолонкиРасширеннаяПодсказка - 68 + ГруппаПараметрыФормированияКолонкиExtendedTooltip + 64 Label true true @@ -1008,8 +1008,8 @@ ФормироватьКопииТолькоПриАктивностиПользователей - ФормироватьКопииТолькоПриАктивностиПользователейРасширеннаяПодсказка - 100 + ФормироватьКопииТолькоПриАктивностиПользователейExtendedTooltip + 84 Label true true @@ -1039,8 +1039,8 @@ Группа параметры формирования - ГруппаПараметрыФормированияРасширеннаяПодсказка - 59 + ГруппаПараметрыФормированияExtendedTooltip + 58 Label true true @@ -1071,7 +1071,7 @@ true - ЗаписатьИЗакрытьРасширеннаяПодсказка + ЗаписатьИЗакрытьExtendedTooltip 53 Label true @@ -1097,7 +1097,7 @@ true - ФормаЗаписатьРасширеннаяПодсказка + ФормаЗаписатьExtendedTooltip 54 Label true @@ -1123,7 +1123,7 @@ true - ФормаПеречитатьРасширеннаяПодсказка + ФормаПеречитатьExtendedTooltip 55 Label true @@ -1149,7 +1149,7 @@ true - ФормаУстановитьПоУмолчаниюРасширеннаяПодсказка + ФормаУстановитьПоУмолчаниюExtendedTooltip 56 Label true diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Module.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Module.bsl index 37728c2e8..94b2e0478 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Module.bsl +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/Forms/НастройкаСИнтервалами/Module.bsl @@ -1,3 +1,5 @@ +&НаКлиенте +Перем ОтветПередЗакрытием; //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -47,19 +49,32 @@ &НаКлиенте Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) - Если Модифицированность Тогда - Ответ = Вопрос(НСтр("ru = 'Данные были изменены. Сохранить изменения?'"), - РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Отмена Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - Если Ответ = КодВозвратаДиалога.Да Тогда - ЗаписатьНовыеНастройки(); - КонецЕсли; + Если Не Модифицированность Тогда + Возврат; КонецЕсли; + Если ОтветПередЗакрытием <> Истина Тогда + Отказ = Истина; + ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, НСтр("ru = 'Данные были изменены. Сохранить изменения?'"), + РежимДиалогаВопрос.ДаНетОтмена, , КодВозвратаДиалога.Да); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытиемЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + Возврат; + КонецЕсли; + + Если Ответ = КодВозвратаДиалога.Да Тогда + ЗаписатьНовыеНастройки(); + КонецЕсли; + ОтветПередЗакрытием = Истина; + Закрыть(); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -110,7 +125,7 @@ &НаСервере Процедура ЗаполнитьФормуПоНастройкам(Знач ДанныеНастроек, Знач ОбновлятьИсходныеНастройки = Истина) - ЗаполнитьЗначенияСвойств(ЭтаФорма, ДанныеНастроек); + ЗаполнитьЗначенияСвойств(ЭтотОбъект, ДанныеНастроек); Если ОбновлятьИсходныеНастройки Тогда ИсходныеНастройки = ДанныеНастроек; @@ -213,7 +228,7 @@ НовыеНастройки = Новый Структура; Для каждого КлючИЗначение Из ИсходныеНастройки Цикл - НовыеНастройки.Вставить(КлючИЗначение.Ключ, ЭтаФорма[КлючИЗначение.Ключ]); + НовыеНастройки.Вставить(КлючИЗначение.Ключ, ЭтотОбъект[КлючИЗначение.Ключ]); КонецЦикла; НовыеНастройки = Новый ФиксированнаяСтруктура(НовыеНастройки); diff --git a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl index 618432c63..d9a936677 100644 --- a/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl +++ b/SSL/src/DataProcessors/НастройкаРезервногоКопированияПриложения/ManagerModule.bsl @@ -1,7 +1,9 @@ -#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда СтандартнаяОбработка = Ложь; УстановитьПривилегированныйРежим(Истина); @@ -25,13 +27,17 @@ ВыбраннаяФорма = "НастройкаБезИнтервалов"; Иначе +#КонецЕсли ВызватьИсключение(НСтр("ru = 'Менеджер сервиса не поддерживает резервное копирование приложений'")); +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда КонецЕсли; +#КонецЕсли КонецПроцедуры +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Функция ПолучитьВерсииWebСервиса() Возврат ОбщегоНазначения.ПолучитьВерсииИнтерфейса( @@ -41,5 +47,4 @@ "ZoneBackupControl"); КонецФункции - -#КонецЕсли \ No newline at end of file +#КонецЕсли diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form index 2e27c80d0..931a8efde 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Form.form @@ -27,7 +27,7 @@ ПоискПриИзменении - ПоискРасширеннаяПодсказка + ПоискExtendedTooltip 106 Label true @@ -51,7 +51,6 @@ true false true - true false true false @@ -76,7 +75,7 @@ Быстрый поиск - БыстрыйПоискРасширеннаяПодсказка + БыстрыйПоискExtendedTooltip 105 Label true @@ -106,8 +105,8 @@ true - ВыбратьРасширеннаяПодсказка - 109 + ВыбратьExtendedTooltip + 108 Label true true @@ -132,8 +131,8 @@ true - ПометитьВсеРасширеннаяПодсказка - 110 + ПометитьВсеExtendedTooltip + 109 Label true true @@ -158,8 +157,8 @@ true - СнятьПометкуСоВсехРасширеннаяПодсказка - 111 + СнятьПометкуСоВсехExtendedTooltip + 110 Label true true @@ -184,8 +183,8 @@ true - ОткрытьРасширеннаяПодсказка - 112 + ОткрытьExtendedTooltip + 111 Label true true @@ -216,8 +215,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 108 + КоманднаяПанельExtendedTooltip + 107 Label true true @@ -280,8 +279,8 @@ ПометкаПриИзменении - ВнешнийВидПометкаРасширеннаяПодсказка - 130 + ВнешнийВидПометкаExtendedTooltip + 120 Label true true @@ -317,8 +316,8 @@ None - ВнешнийВидКартинкаРасширеннаяПодсказка - 132 + ВнешнийВидКартинкаExtendedTooltip + 121 Label true true @@ -362,8 +361,8 @@ None - ВнешнийВидНастройкиРасширеннаяПодсказка - 134 + ВнешнийВидНастройкиExtendedTooltip + 122 Label true true @@ -401,8 +400,8 @@ Внешний вид картинка настройка пометка - ВнешнийВидКартинкаНастройкаПометкаРасширеннаяПодсказка - 129 + ВнешнийВидКартинкаНастройкаПометкаExtendedTooltip + 119 Label true true @@ -428,10 +427,10 @@ ВнешнийВидСтрокаПоиска - 120 + 144 ВнешнийВидСтрокаПоискаРасширеннаяПодсказка - 122 + 146 Label true true @@ -441,7 +440,7 @@ ВнешнийВидСтрокаПоискаКонтекстноеМеню - 121 + 145 true ВнешнийВид @@ -451,10 +450,10 @@ ВнешнийВидСостояниеПросмотра - 123 + 147 ВнешнийВидСостояниеПросмотраРасширеннаяПодсказка - 125 + 149 Label true true @@ -464,7 +463,7 @@ ВнешнийВидСостояниеПросмотраКонтекстноеМеню - 124 + 148 true ViewStatusAddition @@ -475,10 +474,10 @@ ВнешнийВидУправлениеПоиском - 126 + 150 ВнешнийВидУправлениеПоискомРасширеннаяПодсказка - 128 + 152 Label true true @@ -488,7 +487,7 @@ ВнешнийВидУправлениеПоискомКонтекстноеМеню - 127 + 151 true SearchControlAddition @@ -498,8 +497,8 @@ - ВнешнийВидРасширеннаяПодсказка - 119 + ВнешнийВидExtendedTooltip + 118 Label true true @@ -519,8 +518,8 @@ true - ВнешнийВидКонтекстноеМенюОткрытьРасширеннаяПодсказка - 115 + ВнешнийВидКонтекстноеМенюОткрытьExtendedTooltip + 114 Label true true @@ -545,8 +544,8 @@ true - ВнешнийВидКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 116 + ВнешнийВидКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 115 Label true true @@ -571,8 +570,8 @@ true - ВнешнийВидКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 117 + ВнешнийВидКонтекстноеМенюВыделитьВсеExtendedTooltip + 116 Label true true @@ -597,8 +596,8 @@ true - ВнешнийВидКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 118 + ВнешнийВидКонтекстноеМенюВывестиСписокExtendedTooltip + 117 Label true true @@ -657,8 +656,8 @@ Внешний вид страница - ВнешнийВидСтраницаРасширеннаяПодсказка - 114 + ВнешнийВидСтраницаExtendedTooltip + 113 Label true true @@ -718,8 +717,8 @@ ПометкаПриИзменении - ПометкаРасширеннаяПодсказка - 160 + ПометкаExtendedTooltip + 130 Label true true @@ -755,8 +754,8 @@ None - КартинкаРасширеннаяПодсказка - 162 + КартинкаExtendedTooltip + 131 Label true true @@ -799,8 +798,8 @@ None - НастройкиРасширеннаяПодсказка - 164 + НастройкиExtendedTooltip + 132 Label true true @@ -838,8 +837,8 @@ Настройки отчетов картинка настройка пометка - НастройкиОтчетовКартинкаНастройкаПометкаРасширеннаяПодсказка - 159 + НастройкиОтчетовКартинкаНастройкаПометкаExtendedTooltip + 129 Label true true @@ -865,10 +864,10 @@ НастройкиОтчетовДеревоСтрокаПоиска - 150 + 164 НастройкиОтчетовДеревоСтрокаПоискаРасширеннаяПодсказка - 152 + 166 Label true true @@ -878,7 +877,7 @@ НастройкиОтчетовДеревоСтрокаПоискаКонтекстноеМеню - 151 + 165 true НастройкиОтчетовДерево @@ -888,10 +887,10 @@ НастройкиОтчетовДеревоСостояниеПросмотра - 153 + 167 НастройкиОтчетовДеревоСостояниеПросмотраРасширеннаяПодсказка - 155 + 169 Label true true @@ -901,7 +900,7 @@ НастройкиОтчетовДеревоСостояниеПросмотраКонтекстноеМеню - 154 + 168 true ViewStatusAddition @@ -912,10 +911,10 @@ НастройкиОтчетовДеревоУправлениеПоиском - 156 + 170 НастройкиОтчетовДеревоУправлениеПоискомРасширеннаяПодсказка - 158 + 172 Label true true @@ -925,7 +924,7 @@ НастройкиОтчетовДеревоУправлениеПоискомКонтекстноеМеню - 157 + 171 true SearchControlAddition @@ -935,8 +934,8 @@ - НастройкиОтчетовДеревоРасширеннаяПодсказка - 149 + НастройкиОтчетовДеревоExtendedTooltip + 128 Label true true @@ -956,8 +955,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюОткрытьРасширеннаяПодсказка - 145 + НастройкиОтчетовДеревоКонтекстноеМенюОткрытьExtendedTooltip + 124 Label true true @@ -982,8 +981,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 146 + НастройкиОтчетовДеревоКонтекстноеМенюВыделитьВсеExtendedTooltip + 125 Label true true @@ -1008,8 +1007,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 147 + НастройкиОтчетовДеревоКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 126 Label true true @@ -1034,8 +1033,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 148 + НастройкиОтчетовДеревоКонтекстноеМенюВывестиСписокExtendedTooltip + 127 Label true true @@ -1093,8 +1092,8 @@ Настройки отчетов страница - НастройкиОтчетовСтраницаРасширеннаяПодсказка - 144 + НастройкиОтчетовСтраницаExtendedTooltip + 123 Label true true @@ -1155,8 +1154,8 @@ ПометкаПриИзменении - ПрочиеНастройкиПометкаРасширеннаяПодсказка - 190 + ПрочиеНастройкиПометкаExtendedTooltip + 140 Label true true @@ -1192,8 +1191,8 @@ None - ПрочиеНастройкиКартинкаРасширеннаяПодсказка - 192 + ПрочиеНастройкиКартинкаExtendedTooltip + 141 Label true true @@ -1237,8 +1236,8 @@ None - ПрочиеНастройкиНастройкаРасширеннаяПодсказка - 194 + ПрочиеНастройкиНастройкаExtendedTooltip + 142 Label true true @@ -1276,8 +1275,8 @@ Прочие настройки картинка настройка пометка - ПрочиеНастройкиКартинкаНастройкаПометкаРасширеннаяПодсказка - 189 + ПрочиеНастройкиКартинкаНастройкаПометкаExtendedTooltip + 139 Label true true @@ -1302,10 +1301,10 @@ ПрочиеНастройкиСтрокаПоиска - 180 + 184 ПрочиеНастройкиСтрокаПоискаРасширеннаяПодсказка - 182 + 186 Label true true @@ -1315,7 +1314,7 @@ ПрочиеНастройкиСтрокаПоискаКонтекстноеМеню - 181 + 185 true ПрочиеНастройки @@ -1325,10 +1324,10 @@ ПрочиеНастройкиСостояниеПросмотра - 183 + 187 ПрочиеНастройкиСостояниеПросмотраРасширеннаяПодсказка - 185 + 189 Label true true @@ -1338,7 +1337,7 @@ ПрочиеНастройкиСостояниеПросмотраКонтекстноеМеню - 184 + 188 true ViewStatusAddition @@ -1349,10 +1348,10 @@ ПрочиеНастройкиУправлениеПоиском - 186 + 190 ПрочиеНастройкиУправлениеПоискомРасширеннаяПодсказка - 188 + 192 Label true true @@ -1362,7 +1361,7 @@ ПрочиеНастройкиУправлениеПоискомКонтекстноеМеню - 187 + 191 true SearchControlAddition @@ -1372,8 +1371,8 @@ - ПрочиеНастройкиРасширеннаяПодсказка - 179 + ПрочиеНастройкиExtendedTooltip + 138 Label true true @@ -1393,8 +1392,8 @@ true - ПрочиеНастройкиКонтекстноеМенюОткрытьРасширеннаяПодсказка - 175 + ПрочиеНастройкиКонтекстноеМенюОткрытьExtendedTooltip + 134 Label true true @@ -1419,8 +1418,8 @@ true - ПрочиеНастройкиКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 176 + ПрочиеНастройкиКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 135 Label true true @@ -1445,8 +1444,8 @@ true - ПрочиеНастройкиКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 177 + ПрочиеНастройкиКонтекстноеМенюВыделитьВсеExtendedTooltip + 136 Label true true @@ -1471,8 +1470,8 @@ true - ПрочиеНастройкиКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 178 + ПрочиеНастройкиКонтекстноеМенюВывестиСписокExtendedTooltip + 137 Label true true @@ -1529,8 +1528,8 @@ Прочие настройки страница - ПрочиеНастройкиСтраницаРасширеннаяПодсказка - 174 + ПрочиеНастройкиСтраницаExtendedTooltip + 133 Label true true @@ -1558,8 +1557,8 @@ Виды настроек - ВидыНастроекРасширеннаяПодсказка - 113 + ВидыНастроекExtendedTooltip + 112 Label true true @@ -1591,7 +1590,7 @@ Отображать отчет - ОтображатьОтчетРасширеннаяПодсказка + ОтображатьОтчетExtendedTooltip 104 Label true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html index d3c3e2869..b1131860b 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Help/ru.html @@ -1,4 +1,4 @@ - +

                Выбор пользовательских настроек, которые необходимо скопировать или очистить:

                1. Список пользовательских настроек отчетов сгруппирован по названиям вариантов отчетов.
                2. В списке Внешний вид выводятся настройки внешнего вида форм, рабочего стола и командного интерфейса программы. diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl index 52c7a6479..be33b6055 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборНастроек/Module.bsl @@ -23,6 +23,15 @@ КонецПроцедуры +&НаКлиенте +Процедура ПриЗакрытии() + + Если ДанныеВХранилищеНастроекСохранены Тогда + Оповестить("ВыборНастроек_ДанныеСохранены"); + КонецЕсли; + +КонецПроцедуры + &НаСервере Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки) @@ -72,15 +81,6 @@ КонецПроцедуры -&НаКлиенте -Процедура ПриЗакрытии() - - Если ДанныеВХранилищеНастроекСохранены Тогда - Оповестить("ВыборНастроек_ДанныеСохранены"); - КонецЕсли; - -КонецПроцедуры - //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ @@ -232,7 +232,7 @@ КонецЕсли; - Обработки.НастройкиПользователей.ЗаполнитьСпискиНастроек(ЭтаФорма); + Обработки.НастройкиПользователей.ЗаполнитьСпискиНастроек(ЭтотОбъект); Если ПоискНастроек Тогда diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form index fe51d819b..839c2d4e8 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Form.form @@ -16,7 +16,7 @@ true - ВыбратьРасширеннаяПодсказка + ВыбратьExtendedTooltip 52 Label true @@ -42,7 +42,7 @@ true - ПометитьВсеРасширеннаяПодсказка + ПометитьВсеExtendedTooltip 53 Label true @@ -68,7 +68,7 @@ true - СнятьПометкуСоВсехРасширеннаяПодсказка + СнятьПометкуСоВсехExtendedTooltip 54 Label true @@ -94,7 +94,7 @@ true - ПометитьВыбранныеРасширеннаяПодсказка + ПометитьВыбранныеExtendedTooltip 55 Label true @@ -121,7 +121,7 @@ true - СнятьПометкуВыбранныхРасширеннаяПодсказка + СнятьПометкуВыбранныхExtendedTooltip 56 Label true @@ -148,7 +148,7 @@ true - ФормаАктивныеПользователиРасширеннаяПодсказка + ФормаАктивныеПользователиExtendedTooltip 57 Label true @@ -179,7 +179,7 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка + КоманднаяПанельExtendedTooltip 51 Label true @@ -207,7 +207,7 @@ true - НадписьРасширеннаяПодсказка + НадписьExtendedTooltip 58 Label true @@ -275,8 +275,8 @@ None - ГруппыПользователейГруппаРасширеннаяПодсказка - 74 + ГруппыПользователейГруппаExtendedTooltip + 65 Label true true @@ -320,8 +320,8 @@ ГруппыПользователей.Картинка - ГруппыПользователейКартинкаРасширеннаяПодсказка - 76 + ГруппыПользователейКартинкаExtendedTooltip + 66 Label true true @@ -364,8 +364,8 @@ Группа и картинка - ГруппаИКартинкаРасширеннаяПодсказка - 73 + ГруппаИКартинкаExtendedTooltip + 64 Label true true @@ -395,10 +395,10 @@ ГруппыПользователейСтрокаПоиска - 64 + 77 ГруппыПользователейСтрокаПоискаРасширеннаяПодсказка - 66 + 79 Label true true @@ -408,7 +408,7 @@ ГруппыПользователейСтрокаПоискаКонтекстноеМеню - 65 + 78 true ГруппыПользователей @@ -418,10 +418,10 @@ ГруппыПользователейСостояниеПросмотра - 67 + 80 ГруппыПользователейСостояниеПросмотраРасширеннаяПодсказка - 69 + 82 Label true true @@ -431,7 +431,7 @@ ГруппыПользователейСостояниеПросмотраКонтекстноеМеню - 68 + 81 true ViewStatusAddition @@ -442,10 +442,10 @@ ГруппыПользователейУправлениеПоиском - 70 + 83 ГруппыПользователейУправлениеПоискомРасширеннаяПодсказка - 72 + 85 Label true true @@ -455,7 +455,7 @@ ГруппыПользователейУправлениеПоискомКонтекстноеМеню - 71 + 84 true SearchControlAddition @@ -465,7 +465,7 @@ - ГруппыПользователейРасширеннаяПодсказка + ГруппыПользователейExtendedTooltip 63 Label true @@ -486,7 +486,7 @@ true - ГруппыПользователейКонтекстноеМенюИзменитьРасширеннаяПодсказка + ГруппыПользователейКонтекстноеМенюИзменитьExtendedTooltip 60 Label true @@ -512,7 +512,7 @@ true - ГруппыПользователейКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка + ГруппыПользователейКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip 61 Label true @@ -538,7 +538,7 @@ true - ГруппыПользователейКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка + ГруппыПользователейКонтекстноеМенюВыделитьВсеExtendedTooltip 62 Label true @@ -633,8 +633,8 @@ ПользователиФлажокПриИзменении - ПользователиФлажокРасширеннаяПодсказка - 100 + ПользователиФлажокExtendedTooltip + 72 Label true true @@ -667,8 +667,8 @@ None - ПользователиРасширеннаяПодсказка - 102 + ПользователиExtendedTooltip + 73 Label true true @@ -705,8 +705,8 @@ Группа пользователи - ГруппаПользователиРасширеннаяПодсказка - 99 + ГруппаПользователиExtendedTooltip + 71 Label true true @@ -734,10 +734,10 @@ СписокПользователейСтрокаПоиска - 90 + 96 СписокПользователейСтрокаПоискаРасширеннаяПодсказка - 92 + 98 Label true true @@ -747,7 +747,7 @@ СписокПользователейСтрокаПоискаКонтекстноеМеню - 91 + 97 true СписокПользователей @@ -757,10 +757,10 @@ СписокПользователейСостояниеПросмотра - 93 + 99 СписокПользователейСостояниеПросмотраРасширеннаяПодсказка - 95 + 101 Label true true @@ -770,7 +770,7 @@ СписокПользователейСостояниеПросмотраКонтекстноеМеню - 94 + 100 true ViewStatusAddition @@ -781,10 +781,10 @@ СписокПользователейУправлениеПоиском - 96 + 102 СписокПользователейУправлениеПоискомРасширеннаяПодсказка - 98 + 104 Label true true @@ -794,7 +794,7 @@ СписокПользователейУправлениеПоискомКонтекстноеМеню - 97 + 103 true SearchControlAddition @@ -804,8 +804,8 @@ - СписокПользователейРасширеннаяПодсказка - 89 + СписокПользователейExtendedTooltip + 70 Label true true @@ -825,8 +825,8 @@ true - СписокПользователейКонтекстноеМенюИзменитьРасширеннаяПодсказка - 86 + СписокПользователейКонтекстноеМенюИзменитьExtendedTooltip + 67 Label true true @@ -851,8 +851,8 @@ true - СписокПользователейКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 87 + СписокПользователейКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 68 Label true true @@ -877,8 +877,8 @@ true - СписокПользователейКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 88 + СписокПользователейКонтекстноеМенюВыделитьВсеExtendedTooltip + 69 Label true true @@ -933,7 +933,7 @@ Выбор пользователя - ВыборПользователяРасширеннаяПодсказка + ВыборПользователяExtendedTooltip 59 Label true @@ -982,8 +982,8 @@ ПоказыватьПользователейДочернихГруппПриИзменении - ПоказыватьПользователейДочернихГруппРасширеннаяПодсказка - 114 + ПоказыватьПользователейДочернихГруппExtendedTooltip + 76 Label true true @@ -1017,8 +1017,8 @@ Группа установить свойство - ГруппаУстановитьСвойствоРасширеннаяПодсказка - 113 + ГруппаУстановитьСвойствоExtendedTooltip + 75 Label true true @@ -1046,8 +1046,8 @@ Группа показывать пользователей дочерних групп - ГруппаПоказыватьПользователейДочернихГруппРасширеннаяПодсказка - 112 + ГруппаПоказыватьПользователейДочернихГруппExtendedTooltip + 74 Label true true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html index 713a9ad1c..b9b4f3fe8 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Help/ru.html @@ -1,3 +1,3 @@ - +

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

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

                  \ No newline at end of file diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl index ebc19fde1..ea0ff2701 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ВыборПользователей/Module.bsl @@ -97,7 +97,7 @@ Процедура ПриОткрытии(Отказ) ОбновитьЗаголовкиГруппПриПереключенииФлажка(); - + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -124,14 +124,14 @@ Процедура СписокПользователейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; - ОткрытьЗначение(Элемент.ТекущиеДанные.Пользователь); + ПоказатьЗначение(,Элемент.ТекущиеДанные.Пользователь); КонецПроцедуры &НаКлиенте Процедура ГруппыПользователейВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - ОткрытьЗначение(Элемент.ТекущиеДанные.Группа); + ПоказатьЗначение(,Элемент.ТекущиеДанные.Группа); КонецПроцедуры @@ -172,7 +172,7 @@ КонецЦикла; Если ПользователиПриемник.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо отметить одного или несколько пользователей.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Необходимо отметить одного или несколько пользователей.'")); Возврат; КонецЕсли; @@ -240,11 +240,11 @@ Если ТипЗнч(ТекущееЗначение) = Тип("ДанныеФормыЭлементКоллекции") Тогда - ОткрытьЗначение(ТекущееЗначение.Пользователь); + ПоказатьЗначение(,ТекущееЗначение.Пользователь); ИначеЕсли ТипЗнч(ТекущееЗначение) = Тип("ДанныеФормыЭлементДерева") Тогда - ОткрытьЗначение(ТекущееЗначение.Группа); + ПоказатьЗначение(,ТекущееЗначение.Группа); КонецЕсли; @@ -284,7 +284,7 @@ Если СтрокаСпискаПользователей.Пометка Тогда ЗначениеПометки = Истина; СтрокаСпискаПользователей.Пометка = Ложь; - ОбновитьЗаголовокГруппы(ЭтаФорма, ГруппаПользователей, СтрокаСпискаПользователей, ЗначениеПометки); + ОбновитьЗаголовокГруппы(ЭтотОбъект, ГруппаПользователей, СтрокаСпискаПользователей, ЗначениеПометки); СтрокаСпискаПользователей.Пометка = Истина; КонецЕсли; @@ -322,7 +322,7 @@ Если ИспользоватьГруппы Тогда - ОбновитьЗаголовкиГрупп(ЭтаФорма, СтрокаСпискаПользователей, ЗначениеПометки); + ОбновитьЗаголовкиГрупп(ЭтотОбъект, СтрокаСпискаПользователей, ЗначениеПометки); СтрокаСпискаПользователей.Пометка = ЗначениеПометки; Отбор = Новый Структура("Пользователь", СтрокаСпискаПользователей.Пользователь); @@ -331,7 +331,7 @@ НайденныйПользователь.Пометка = ЗначениеПометки; КонецЦикла; Иначе - СтрокаСпискаПользователей.Пометка = ЗначениеПометки; + СтрокаСпискаПользователей.Пометка = ЗначениеПометки; КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form index db44857ba..5b6938c04 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Form.form @@ -25,7 +25,7 @@ ПользовательСсылкаПриИзменении - ПользовательСсылкаРасширеннаяПодсказка + ПользовательСсылкаExtendedTooltip 72 Label true @@ -85,8 +85,8 @@ ПереключательКомуКопироватьНастройкиПриИзменении - ПереключательКомуКопироватьНастройкиРасширеннаяПодсказка - 75 + ПереключательКомуКопироватьНастройкиExtendedTooltip + 74 Label true true @@ -147,8 +147,8 @@ Выберите пользователей, которым необходимо скопировать настройки - ВыбратьПользователейРасширеннаяПодсказка - 78 + ВыбратьПользователейExtendedTooltip + 76 Label true true @@ -184,8 +184,8 @@ Группа выбрать пользователей - ГруппаВыбратьПользователейРасширеннаяПодсказка - 77 + ГруппаВыбратьПользователейExtendedTooltip + 75 Label true true @@ -213,8 +213,8 @@ Кому копировать: - ГруппаКомуКопироватьРасширеннаяПодсказка - 74 + ГруппаКомуКопироватьExtendedTooltip + 73 Label true true @@ -253,8 +253,8 @@ ПереключательКопируемыеНастройкиПриИзменении - ПереключательКопируемыеНастройкиРасширеннаяПодсказка - 80 + ПереключательКопируемыеНастройкиExtendedTooltip + 78 Label true true @@ -307,8 +307,8 @@ true - Отступ1РасширеннаяПодсказка - 83 + Отступ1ExtendedTooltip + 80 Label true true @@ -345,8 +345,8 @@ Выберите настройки, которые необходимо скопировать - ВыбратьНастройкиРасширеннаяПодсказка - 84 + ВыбратьНастройкиExtendedTooltip + 81 Label true true @@ -387,8 +387,8 @@ Группа выбрать - ГруппаВыбратьРасширеннаяПодсказка - 82 + ГруппаВыбратьExtendedTooltip + 79 Label true true @@ -416,8 +416,8 @@ Что копировать: - ГруппаКопируемыеНастройкиРасширеннаяПодсказка - 79 + ГруппаКопируемыеНастройкиExtendedTooltip + 77 Label true true @@ -444,8 +444,8 @@ true - ОтступРасширеннаяПодсказка - 85 + ОтступExtendedTooltip + 82 Label true true @@ -479,7 +479,7 @@ true - ФормаСкопироватьИЗакрытьРасширеннаяПодсказка + ФормаСкопироватьИЗакрытьExtendedTooltip 69 Label true @@ -505,7 +505,7 @@ true - СкопироватьРасширеннаяПодсказка + СкопироватьExtendedTooltip 70 Label true @@ -531,7 +531,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 71 Label true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Help/ru.html index d80a097de..e4ce16ed7 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Help/ru.html @@ -1,4 +1,4 @@ - +

                  Копирование настроек пользователей:

                  1. "Скопировать настройки от пользователя" - пользователь (или внешний пользователь), чьи настройки будут использоваться для копирования другим пользователям.
                  2. "Кому копировать" - выбираются пользователи, которым необходимо скопировать настройки. При отметке значения "Выбранным пользователям" становится доступен выбор пользователей. diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl index d8e9e5b8c..b1b2529f5 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/КопированиеНастроекПользователей/Module.bsl @@ -133,17 +133,34 @@ ВыборТипаПользователей.Добавить("ВнешниеПользователи", НСтр("ru = 'Внешние пользователи'")); ВыборТипаПользователей.Добавить("Пользователи", НСтр("ru = 'Пользователи'")); - ВыбранныйВариант = ВыборТипаПользователей.ВыбратьЭлемент(); - Если ВыбранныйВариант = Неопределено Тогда - Возврат; - КонецЕсли; - ВыбранныйТипПользователей = ВыбранныйВариант.Значение; + Оповещение = Новый ОписаниеОповещения("ПользовательНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОтбора); + ВыборТипаПользователей.ПоказатьВыборЭлемента(Оповещение); + Возврат; Иначе ВыбранныйТипПользователей = "Пользователи"; КонецЕсли; КонецЕсли; + ОткрытьФормуВыбораПользователей(ВыбранныйТипПользователей, ПараметрыОтбора); + +КонецПроцедуры + +&НаКлиенте +Процедура ПользовательНачалоВыбораЗавершение(ВыбранныйВариант, ПараметрыОтбора) Экспорт + + Если ВыбранныйВариант = Неопределено Тогда + Возврат; + КонецЕсли; + ВыбранныйТипПользователей = ВыбранныйВариант.Значение; + + ОткрытьФормуВыбораПользователей(ВыбранныйТипПользователей, ПараметрыОтбора); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуВыбораПользователей(ВыбранныйТипПользователей, ПараметрыОтбора) + Если ВыбранныйТипПользователей = "Пользователи" Или ТипПереданногоПользователя = Тип("СправочникСсылка.Пользователи") Тогда ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); @@ -164,7 +181,7 @@ Для Каждого ПользовательПриемник Из ПользователиПолучателиНастроек.МассивПользователей Цикл Если ПользовательСсылка = ПользовательПриемник Тогда - Предупреждение(НСтр("ru = 'Нельзя копировать настройки пользователя самому себе, + ПоказатьПредупреждение(,НСтр("ru = 'Нельзя копировать настройки пользователя самому себе, |выберите другого пользователя.'")); ПользовательСсылка = ПользовательСсылкаСтарый; Возврат; @@ -299,20 +316,12 @@ Если Отчет <> Неопределено Тогда ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='ОК'")); - КнопкиВопроса.Добавить(НСтр("ru='Показать отчет'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - Возврат; - Иначе - Отчет.ОтображатьГруппировки = Истина; - Отчет.ОтображатьСетку = Ложь; - Отчет.ОтображатьЗаголовки = Ложь; - Отчет.Показать(); - Возврат; - КонецЕсли; + КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + Оповещение = Новый ОписаниеОповещения("СкопироватьНастройкиПоказатьВопрос", ЭтотОбъект, Отчет); + ПоказатьВопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); + Возврат; КонецЕсли; Если Отчет = Неопределено Тогда @@ -331,7 +340,7 @@ ТекстПредупреждения = НСтр("ru = 'Настройки не были скопированы, так как у пользователя ""%1"" не было сохранено ни одной настройки.'"); ТекстПредупреждения = СтроковыеФункцииКлиентСервер. ПодставитьПараметрыВСтроку(ТекстПредупреждения, Строка(ПользовательСсылка)); - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(,ТекстПредупреждения); Возврат; КонецЕсли; @@ -349,19 +358,15 @@ Если ПереключательКопируемыеНастройки = "СкопироватьВсе" Тогда - Если ПредложениеПерезапускаПрограммы() Тогда - Возврат; - КонецЕсли; + ПредложениеПерезапускаПрограммы(ИмяКоманды); ИначеЕсли ПереключательКопируемыеНастройки = "СкопироватьОтдельные" Тогда Если ВыбранныеНастройки.ВнешнийВид.Количество() <> 0 Или ПереключательКопируемыеНастройки = "СкопироватьВсе" Тогда - - Если ПредложениеПерезапускаПрограммы() Тогда - Возврат; - КонецЕсли; - + + ПредложениеПерезапускаПрограммы(ИмяКоманды); + КонецЕсли; КонецЕсли; @@ -382,22 +387,53 @@ КонецПроцедуры &НаКлиенте -Функция ПредложениеПерезапускаПрограммы() +Процедура СкопироватьНастройкиПоказатьВопрос(Ответ, Отчет) + + Если Ответ = "Ок" Тогда + Возврат; + Иначе + Отчет.ОтображатьГруппировки = Истина; + Отчет.ОтображатьСетку = Ложь; + Отчет.ОтображатьЗаголовки = Ложь; + Отчет.Показать(); + Возврат; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Функция ПредложениеПерезапускаПрограммы(ИмяКоманды) ТекстСообщения = НСтр("ru = 'Для того чтобы скопированные настройки внешнего вида вступили в силу, необходимо перезапустить программу. |Перезапустить сейчас?'"); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Перезапустить сейчас'")); - КнопкиВопроса.Добавить(НСтр("ru='Не перезапускать'")); - Ответ = Вопрос(ТекстСообщения, КнопкиВопроса,, КнопкиВопроса[1].Значение); - Если Ответ = КнопкиВопроса[0].Значение Тогда - СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); - ЗавершитьРаботуСистемы(Истина, Истина); - Возврат Истина; + КнопкиВопроса.Добавить("Перезапустить", НСтр("ru='Перезапустить сейчас'")); + КнопкиВопроса.Добавить("НеПерезапускать", НСтр("ru='Не перезапускать'")); + Оповещение = Новый ОписаниеОповещения("ПредложениеПерезапускаПрограммыЗавершение", ЭтотОбъект, ИмяКоманды); + ПоказатьВопрос(Оповещение, ТекстСообщения, КнопкиВопроса,, КнопкиВопроса[1].Значение); + +КонецФункции + +&НаКлиенте +Процедура ПредложениеПерезапускаПрограммыЗавершение(Ответ, ИмяКоманды) Экспорт + + Если Ответ = "Перезапустить" Тогда + ПодключитьОбработчикОжидания("Подключаемый_ПерезапуститьПрограмму", 0.01, Истина); КонецЕсли; - Возврат Ложь; -КонецФункции + Если ИмяКоманды = "СкопироватьИЗакрыть" Тогда + Закрыть(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура Подключаемый_ПерезапуститьПрограмму() + + СтандартныеПодсистемыКлиент.ПропуститьПредупреждениеПередЗавершениемРаботыСистемы(); + ЗавершитьРаботуСистемы(Истина, Истина); + +КонецПроцедуры &НаСервере Процедура СкопироватьВыбранныеНастройки(Отчет) @@ -495,7 +531,7 @@ &НаСервере Процедура ПроверитьАктивныхПользователей() - Если ПользователиПолучателиНастроек <> Неопределено Тогда + Если ПользователиПолучателиНастроек.Свойство("МассивПользователей") Тогда МассивПользователей = ПользователиПолучателиНастроек.МассивПользователей; КонецЕсли; diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form index 7ec79dd02..f62731a30 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Form.form @@ -33,7 +33,7 @@ ПользовательСсылкаПриИзменении - ПользовательСсылкаРасширеннаяПодсказка + ПользовательСсылкаExtendedTooltip 121 Label true @@ -94,8 +94,8 @@ ПоискПриИзменении - ПоискРасширеннаяПодсказка - 123 + ПоискExtendedTooltip + 122 Label true true @@ -118,7 +118,6 @@ true false true - true false true false @@ -143,7 +142,7 @@ Быстрый поиск - БыстрыйПоискРасширеннаяПодсказка + БыстрыйПоискExtendedTooltip 120 Label true @@ -173,8 +172,8 @@ true - ОткрытьРасширеннаяПодсказка - 126 + ОткрытьExtendedTooltip + 124 Label true true @@ -200,8 +199,8 @@ true - СкопироватьРасширеннаяПодсказка - 127 + СкопироватьExtendedTooltip + 125 Label true true @@ -229,8 +228,8 @@ true - СкопироватьНастройкиОтчетовРасширеннаяПодсказка - 129 + СкопироватьНастройкиОтчетовExtendedTooltip + 127 Label true true @@ -256,8 +255,8 @@ true - СкопироватьНастройкиВнешнегоВидаРасширеннаяПодсказка - 130 + СкопироватьНастройкиВнешнегоВидаExtendedTooltip + 128 Label true true @@ -283,8 +282,8 @@ true - СкопироватьНастройкиОтчетовИВнешнегоВидаРасширеннаяПодсказка - 131 + СкопироватьНастройкиОтчетовИВнешнегоВидаExtendedTooltip + 129 Label true true @@ -310,8 +309,8 @@ true - СкопироватьВсеНастройкиРасширеннаяПодсказка - 132 + СкопироватьВсеНастройкиExtendedTooltip + 130 Label true true @@ -345,8 +344,8 @@ Скопировать другим выделенные - СкопироватьДругимВыделенныеРасширеннаяПодсказка - 133 + СкопироватьДругимВыделенныеExtendedTooltip + 131 Label true true @@ -370,8 +369,8 @@ Скопировать все настройки - СкопироватьДругимРасширеннаяПодсказка - 128 + СкопироватьДругимExtendedTooltip + 126 Label true true @@ -394,8 +393,8 @@ true - ОчиститьНастройкиРасширеннаяПодсказка - 134 + ОчиститьНастройкиExtendedTooltip + 132 Label true true @@ -423,8 +422,8 @@ true - ОчиститьВсеНастройкиРасширеннаяПодсказка - 136 + ОчиститьВсеНастройкиExtendedTooltip + 134 Label true true @@ -449,8 +448,8 @@ true - ОчиститьНастройкиОтчетовИВнешнегоВидаРасширеннаяПодсказка - 137 + ОчиститьНастройкиОтчетовИВнешнегоВидаExtendedTooltip + 135 Label true true @@ -478,8 +477,8 @@ true - ОчиститьНастройкиВыбраннымПользователямРасширеннаяПодсказка - 139 + ОчиститьНастройкиВыбраннымПользователямExtendedTooltip + 137 Label true true @@ -505,8 +504,8 @@ true - ОчиститьНастройкиВсехПользователейРасширеннаяПодсказка - 140 + ОчиститьНастройкиВсехПользователейExtendedTooltip + 138 Label true true @@ -537,8 +536,8 @@ Очистить выделенные - ОчиститьВыделенныеРасширеннаяПодсказка - 138 + ОчиститьВыделенныеExtendedTooltip + 136 Label true true @@ -562,8 +561,8 @@ Очистить настройки - ОчиститьРасширеннаяПодсказка - 135 + ОчиститьExtendedTooltip + 133 Label true true @@ -586,8 +585,8 @@ true - СкопироватьОтРасширеннаяПодсказка - 141 + СкопироватьОтExtendedTooltip + 139 Label true true @@ -612,8 +611,8 @@ true - ОбновитьРасширеннаяПодсказка - 142 + ОбновитьExtendedTooltip + 140 Label true true @@ -644,8 +643,8 @@ Командная панель - КоманднаяПанельРасширеннаяПодсказка - 125 + КоманднаяПанельExtendedTooltip + 123 Label true true @@ -703,8 +702,8 @@ None - ВнешнийВидКартинкаРасширеннаяПодсказка - 163 + ВнешнийВидКартинкаExtendedTooltip + 152 Label true true @@ -747,8 +746,8 @@ None - ВнешнийВидНастройкиРасширеннаяПодсказка - 165 + ВнешнийВидНастройкиExtendedTooltip + 153 Label true true @@ -785,8 +784,8 @@ Внешний вид картинка настройка пометка - ВнешнийВидКартинкаНастройкаПометкаРасширеннаяПодсказка - 162 + ВнешнийВидКартинкаНастройкаПометкаExtendedTooltip + 151 Label true true @@ -820,10 +819,10 @@ ВнешнийВидСтрокаПоиска - 153 + 186 ВнешнийВидСтрокаПоискаРасширеннаяПодсказка - 155 + 188 Label true true @@ -833,7 +832,7 @@ ВнешнийВидСтрокаПоискаКонтекстноеМеню - 154 + 187 true ВнешнийВид @@ -843,10 +842,10 @@ ВнешнийВидСостояниеПросмотра - 156 + 189 ВнешнийВидСостояниеПросмотраРасширеннаяПодсказка - 158 + 191 Label true true @@ -856,7 +855,7 @@ ВнешнийВидСостояниеПросмотраКонтекстноеМеню - 157 + 190 true ViewStatusAddition @@ -867,10 +866,10 @@ ВнешнийВидУправлениеПоиском - 159 + 192 ВнешнийВидУправлениеПоискомРасширеннаяПодсказка - 161 + 194 Label true true @@ -880,7 +879,7 @@ ВнешнийВидУправлениеПоискомКонтекстноеМеню - 160 + 193 true SearchControlAddition @@ -890,8 +889,8 @@ - ВнешнийВидРасширеннаяПодсказка - 152 + ВнешнийВидExtendedTooltip + 150 Label true true @@ -911,8 +910,8 @@ true - ВнешнийВидКонтекстноеМенюОткрытьРасширеннаяПодсказка - 145 + ВнешнийВидКонтекстноеМенюОткрытьExtendedTooltip + 143 Label true true @@ -941,8 +940,8 @@ true - ВнешнийВидКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 146 + ВнешнийВидКонтекстноеМенюСкопироватьExtendedTooltip + 144 Label true true @@ -971,8 +970,8 @@ true - ВнешнийВидКонтекстноеМенюУдалитьРасширеннаяПодсказка - 147 + ВнешнийВидКонтекстноеМенюУдалитьExtendedTooltip + 145 Label true true @@ -1000,8 +999,8 @@ true - ВнешнийВидКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 149 + ВнешнийВидКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 147 Label true true @@ -1026,8 +1025,8 @@ true - ВнешнийВидКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 150 + ВнешнийВидКонтекстноеМенюВыделитьВсеExtendedTooltip + 148 Label true true @@ -1052,8 +1051,8 @@ true - ВнешнийВидКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 151 + ВнешнийВидКонтекстноеМенюВывестиСписокExtendedTooltip + 149 Label true true @@ -1075,8 +1074,8 @@ true - ВнешнийВидКонтекстноеМенюПрочееРасширеннаяПодсказка - 148 + ВнешнийВидКонтекстноеМенюПрочееExtendedTooltip + 146 Label true true @@ -1130,8 +1129,8 @@ Внешний вид страница - ВнешнийВидСтраницаРасширеннаяПодсказка - 144 + ВнешнийВидСтраницаExtendedTooltip + 142 Label true true @@ -1186,8 +1185,8 @@ None - КартинкаРасширеннаяПодсказка - 194 + КартинкаExtendedTooltip + 164 Label true true @@ -1229,8 +1228,8 @@ None - НастройкиРасширеннаяПодсказка - 196 + НастройкиExtendedTooltip + 165 Label true true @@ -1267,8 +1266,8 @@ Настройки отчетов картинка настройка пометка - НастройкиОтчетовКартинкаНастройкаПометкаРасширеннаяПодсказка - 193 + НастройкиОтчетовКартинкаНастройкаПометкаExtendedTooltip + 163 Label true true @@ -1302,10 +1301,10 @@ НастройкиОтчетовДеревоСтрокаПоиска - 184 + 205 НастройкиОтчетовДеревоСтрокаПоискаРасширеннаяПодсказка - 186 + 207 Label true true @@ -1315,7 +1314,7 @@ НастройкиОтчетовДеревоСтрокаПоискаКонтекстноеМеню - 185 + 206 true НастройкиОтчетовДерево @@ -1325,10 +1324,10 @@ НастройкиОтчетовДеревоСостояниеПросмотра - 187 + 208 НастройкиОтчетовДеревоСостояниеПросмотраРасширеннаяПодсказка - 189 + 210 Label true true @@ -1338,7 +1337,7 @@ НастройкиОтчетовДеревоСостояниеПросмотраКонтекстноеМеню - 188 + 209 true ViewStatusAddition @@ -1349,10 +1348,10 @@ НастройкиОтчетовДеревоУправлениеПоиском - 190 + 211 НастройкиОтчетовДеревоУправлениеПоискомРасширеннаяПодсказка - 192 + 213 Label true true @@ -1362,7 +1361,7 @@ НастройкиОтчетовДеревоУправлениеПоискомКонтекстноеМеню - 191 + 212 true SearchControlAddition @@ -1372,8 +1371,8 @@ - НастройкиОтчетовДеревоРасширеннаяПодсказка - 183 + НастройкиОтчетовДеревоExtendedTooltip + 162 Label true true @@ -1393,8 +1392,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюОткрытьРасширеннаяПодсказка - 176 + НастройкиОтчетовДеревоКонтекстноеМенюОткрытьExtendedTooltip + 155 Label true true @@ -1423,8 +1422,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 177 + НастройкиОтчетовДеревоКонтекстноеМенюСкопироватьExtendedTooltip + 156 Label true true @@ -1453,8 +1452,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюОчиститьРасширеннаяПодсказка - 178 + НастройкиОтчетовДеревоКонтекстноеМенюОчиститьExtendedTooltip + 157 Label true true @@ -1482,8 +1481,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 180 + НастройкиОтчетовДеревоКонтекстноеМенюВыделитьВсеExtendedTooltip + 159 Label true true @@ -1508,8 +1507,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 181 + НастройкиОтчетовДеревоКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 160 Label true true @@ -1534,8 +1533,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 182 + НастройкиОтчетовДеревоКонтекстноеМенюВывестиСписокExtendedTooltip + 161 Label true true @@ -1557,8 +1556,8 @@ true - НастройкиОтчетовДеревоКонтекстноеМенюПрочееРасширеннаяПодсказка - 179 + НастройкиОтчетовДеревоКонтекстноеМенюПрочееExtendedTooltip + 158 Label true true @@ -1611,8 +1610,8 @@ Настройки отчетов страница - НастройкиОтчетовСтраницаРасширеннаяПодсказка - 175 + НастройкиОтчетовСтраницаExtendedTooltip + 154 Label true true @@ -1666,8 +1665,8 @@ ПрочиеНастройки.Картинка - ПрочиеНастройкиКартинкаРасширеннаяПодсказка - 225 + ПрочиеНастройкиКартинкаExtendedTooltip + 176 Label true true @@ -1709,8 +1708,8 @@ None - ПрочиеНастройкиНастройкаРасширеннаяПодсказка - 227 + ПрочиеНастройкиНастройкаExtendedTooltip + 177 Label true true @@ -1747,8 +1746,8 @@ Прочие настройки картинка настройка пометка - ПрочиеНастройкиКартинкаНастройкаПометкаРасширеннаяПодсказка - 224 + ПрочиеНастройкиКартинкаНастройкаПометкаExtendedTooltip + 175 Label true true @@ -1781,10 +1780,10 @@ ПрочиеНастройкиСтрокаПоиска - 215 + 224 ПрочиеНастройкиСтрокаПоискаРасширеннаяПодсказка - 217 + 226 Label true true @@ -1794,7 +1793,7 @@ ПрочиеНастройкиСтрокаПоискаКонтекстноеМеню - 216 + 225 true ПрочиеНастройки @@ -1804,10 +1803,10 @@ ПрочиеНастройкиСостояниеПросмотра - 218 + 227 ПрочиеНастройкиСостояниеПросмотраРасширеннаяПодсказка - 220 + 229 Label true true @@ -1817,7 +1816,7 @@ ПрочиеНастройкиСостояниеПросмотраКонтекстноеМеню - 219 + 228 true ViewStatusAddition @@ -1828,10 +1827,10 @@ ПрочиеНастройкиУправлениеПоиском - 221 + 230 ПрочиеНастройкиУправлениеПоискомРасширеннаяПодсказка - 223 + 232 Label true true @@ -1841,7 +1840,7 @@ ПрочиеНастройкиУправлениеПоискомКонтекстноеМеню - 222 + 231 true SearchControlAddition @@ -1851,8 +1850,8 @@ - ПрочиеНастройкиРасширеннаяПодсказка - 214 + ПрочиеНастройкиExtendedTooltip + 174 Label true true @@ -1872,8 +1871,8 @@ true - ПрочиеНастройкиКонтекстноеМенюОткрытьРасширеннаяПодсказка - 207 + ПрочиеНастройкиКонтекстноеМенюОткрытьExtendedTooltip + 167 Label true true @@ -1902,8 +1901,8 @@ true - ПрочиеНастройкиКонтекстноеМенюСкопироватьРасширеннаяПодсказка - 208 + ПрочиеНастройкиКонтекстноеМенюСкопироватьExtendedTooltip + 168 Label true true @@ -1932,8 +1931,8 @@ true - ПрочиеНастройкиКонтекстноеМенюУдалитьРасширеннаяПодсказка - 209 + ПрочиеНастройкиКонтекстноеМенюУдалитьExtendedTooltip + 169 Label true true @@ -1961,8 +1960,8 @@ true - ПрочиеНастройкиКонтекстноеМенюВыделитьВсеРасширеннаяПодсказка - 211 + ПрочиеНастройкиКонтекстноеМенюВыделитьВсеExtendedTooltip + 171 Label true true @@ -1987,8 +1986,8 @@ true - ПрочиеНастройкиКонтекстноеМенюКопироватьВБуферОбменаРасширеннаяПодсказка - 212 + ПрочиеНастройкиКонтекстноеМенюКопироватьВБуферОбменаExtendedTooltip + 172 Label true true @@ -2013,8 +2012,8 @@ true - ПрочиеНастройкиКонтекстноеМенюВывестиСписокРасширеннаяПодсказка - 213 + ПрочиеНастройкиКонтекстноеМенюВывестиСписокExtendedTooltip + 173 Label true true @@ -2036,8 +2035,8 @@ true - ПрочиеНастройкиКонтекстноеМенюПрочееРасширеннаяПодсказка - 210 + ПрочиеНастройкиКонтекстноеМенюПрочееExtendedTooltip + 170 Label true true @@ -2088,8 +2087,8 @@ Прочие настройки страница - ПрочиеНастройкиСтраницаРасширеннаяПодсказка - 206 + ПрочиеНастройкиСтраницаExtendedTooltip + 166 Label true true @@ -2117,8 +2116,8 @@ Виды настроек - ВидыНастроекРасширеннаяПодсказка - 143 + ВидыНастроекExtendedTooltip + 141 Label true true @@ -2149,8 +2148,8 @@ false - ЗакрытьРасширеннаяПодсказка - 238 + ЗакрытьExtendedTooltip + 179 Label true true @@ -2179,8 +2178,8 @@ Группа закрыть - ГруппаЗакрытьРасширеннаяПодсказка - 237 + ГруппаЗакрытьExtendedTooltip + 178 Label true true @@ -2207,7 +2206,7 @@ Отображать отчет - ОтображатьОтчетРасширеннаяПодсказка + ОтображатьОтчетExtendedTooltip 119 Label true @@ -2241,8 +2240,8 @@ true - КартинкаИнформацииРасширеннаяПодсказка - 241 + КартинкаИнформацииExtendedTooltip + 182 Label true true @@ -2279,8 +2278,8 @@ true - ТекстИнформацииРасширеннаяПодсказка - 242 + ТекстИнформацииExtendedTooltip + 183 Label true true @@ -2313,8 +2312,8 @@ Группа предупреждение и картинка - ГруппаПредупреждениеИКартинкаРасширеннаяПодсказка - 240 + ГруппаПредупреждениеИКартинкаExtendedTooltip + 181 Label true true @@ -2345,8 +2344,8 @@ Отображать предупреждение - ОтображатьПредупреждениеРасширеннаяПодсказка - 239 + ОтображатьПредупреждениеExtendedTooltip + 180 Label true true @@ -2374,7 +2373,7 @@ Отчет или предупреждение - ОтчетИлиПредупреждениеРасширеннаяПодсказка + ОтчетИлиПредупреждениеExtendedTooltip 118 Label true @@ -3023,6 +3022,21 @@ true + + ПараметрыОбработкиОповещения + + <key>ru</key> + <value>Параметры обработки оповещения</value> + + 16 + + + true + + + true + + Обновить diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Help/ru.html index 347f273ec..6334780bd 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Help/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta></head><body> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="v8help://service_book/service_style"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta></head><body> <p>Просмотр, очистка и копирование пользовательских настроек отчетов, настроек внешнего вида программы и прочих настроек:</p> <ol><ol><li>Список пользовательских настроек отчетов сгруппирован по названиям вариантов отчетов. </li><li>В списке <strong>Внешний вид</strong> выводятся настройки внешнего вида форм, рабочего стола и командного интерфейса программы. diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl index 4f6239e13..7620ab623 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/НастройкиПользователей/Module.bsl @@ -63,129 +63,8 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ВРег(ИмяСобытия) = ВРег("ВыборПользователя") Тогда - - ПользователиПриемник = Параметр.ПользователиПриемник; - КоличествоПользователей = ПользователиПриемник.Количество(); - - ПояснениеКомуСкопированыНастройки = НастройкиПользователейКлиент.ПояснениеПользователи( - КоличествоПользователей, ПользователиПриемник[0]); - - Если Параметр.КопироватьВсе Тогда - - МассивНастроек = Новый Массив; - ИменаНастроек = ""; - Для Каждого Настройка Из КопируемыеНастройки Цикл - - ИменаНастроек = ИменаНастроек + НРег(Настройка.Представление) + ", "; - МассивНастроек.Добавить(Настройка.Значение); - - КонецЦикла; - - ИменаНастроек = Лев(ИменаНастроек, СтрДлина(ИменаНастроек)-2); - - Если МассивНастроек.Количество() = 7 Тогда - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки); - Иначе - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - НСтр("ru = '%1 скопированы %2'"), ИменаНастроек, ПояснениеКомуСкопированыНастройки); - КонецЕсли; - - Состояние(НСтр("ru = 'Выполняется копирование настроек'")); - - Отчет = Неопределено; - СкопироватьВсеНастройкиНаСервере(ПользовательИнформационнойБазы, ПользователиПриемник, МассивНастроек, Отчет); - - Если Отчет <> Неопределено Тогда - ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='ОК'")); - КнопкиВопроса.Добавить(НСтр("ru='Показать отчет'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - Возврат; - Иначе - Отчет.ОтображатьГруппировки = Истина; - Отчет.ОтображатьСетку = Ложь; - Отчет.ОтображатьЗаголовки = Ложь; - Отчет.Показать(); - Возврат; - КонецЕсли; - - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - - Возврат; - КонецЕсли; - - Если Параметр.ОчисткаНастроек Тогда - - ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); - - ОчиститьНаСервере(ПользователиПриемник, Истина); - - Если КоличествоНастроек = 1 Тогда - - НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; - Если СтрДлина(НазваниеНастройки) > 24 Тогда - НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; - КонецЕсли; - - КонецЕсли; - - КоличествоПользователей = Параметр.ПользователиПриемник.Количество(); - ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки, КоличествоПользователей); - - Возврат; - КонецЕсли; - - ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); - - ЛичныхНастроекОтчетов = 0; - Отчет = Неопределено; - СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет); - - Если Отчет <> Неопределено Тогда - - ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); - КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='ОК'")); - КнопкиВопроса.Добавить(НСтр("ru='Показать отчет'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); - - Если Ответ = КнопкиВопроса[0].Значение Тогда - Возврат; - Иначе - Отчет.ОтображатьГруппировки = Истина; - Отчет.ОтображатьСетку = Ложь; - Отчет.ОтображатьЗаголовки = Ложь; - Отчет.Показать(); - Возврат; - КонецЕсли; - - Иначе - - Если КоличествоНастроек = 1 Тогда - ПредставлениеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; - КонецЕсли; - - ТекстПояснения = НастройкиПользователейКлиент.ФормированиеПоясненияПриКопировании( - ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки); - ПоказатьОповещениеПользователя( - НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - - КонецЕсли; - - ИначеЕсли ВРег(ИмяСобытия) = ВРег("СкопированыНастройки") Тогда - ЗаполнитьСпискиНастроек(); - РазвернутьДеревоЗначений(); - КонецЕсли; + ПараметрыОбработкиОповещения = Новый Структура("ИмяСобытия, Параметр", ИмяСобытия, Параметр); + ПодключитьОбработчикОжидания("Подключаемый_ВыполнитьОбработкуОповещения", 0.1, Истина); КонецПроцедуры @@ -247,21 +126,29 @@ ВыборТипаПользователей.Добавить("ВнешниеПользователи", "Внешние пользователи"); ВыборТипаПользователей.Добавить("Пользователи", "Пользователи"); - ВыбранныйВариант = ВыборТипаПользователей.ВыбратьЭлемент(); - Если ВыбранныйВариант = Неопределено Тогда - Возврат; - КонецЕсли; - Если ВыбранныйВариант.Значение = "Пользователи" Тогда - ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); - ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда - ОткрытьФорму("Справочник.ВнешниеПользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); - КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПользовательСсылкаНачалоВыбораЗавершение", ЭтотОбъект, ПараметрыОтбора); + ВыборТипаПользователей.ПоказатьВыборЭлемента(Оповещение); Иначе ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); КонецЕсли; КонецПроцедуры +&НаКлиенте +Процедура ПользовательСсылкаНачалоВыбораЗавершение(ВыбранныйВариант, ПараметрыОтбора) Экспорт + + Если ВыбранныйВариант = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ВыбранныйВариант.Значение = "Пользователи" Тогда + ОткрытьФорму("Справочник.Пользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); + ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда + ОткрытьФорму("Справочник.ВнешниеПользователи.Форма.ФормаСписка", ПараметрыОтбора, Элементы.ПользовательСсылка); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура НастройкиОтчетовИВнешнийВидПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) @@ -277,33 +164,10 @@ &НаКлиенте Процедура НастройкиПередУдалением(Элемент, Отказ) + Отказ = Истина; ТекстВопроса = НСтр("ru = 'Удалить выбранные настройки?'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - - Если Ответ = КодВозвратаДиалога.Нет Тогда - Отказ = Истина; - Возврат; - КонецЕсли; - - ОчиститьНаСервере(); - - ВыделенныеСтроки = Элемент.ВыделенныеСтроки; - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(Элемент); - - Если КоличествоНастроек = 1 Тогда - - ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); - НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; - - Если СтрДлина(НазваниеНастройки) > 24 Тогда - НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; - КонецЕсли; - - КонецЕсли; - - УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки); - - ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки); + Оповещение = Новый ОписаниеОповещения("НастройкиПередУдалениемЗавершение", ЭтотОбъект, Элемент); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -401,33 +265,14 @@ ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); Возврат; КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ОчиститьЗавершение", ЭтотОбъект, ДеревоНастроек); ТекстВопроса = НСтр("ru = 'Удалить выделенные настройки?'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - - КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); - - ОчиститьНаСервере(); - - Если КоличествоНастроек = 1 Тогда - - НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; - Если СтрДлина(НазваниеНастройки) > 24 Тогда - НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; - КонецЕсли; - - КонецЕсли; - - УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки); - - ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -438,22 +283,15 @@ ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки; Если ВыделенныеСтроки.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется удалить.'")); Возврат; КонецЕсли; ТекстВопроса = НСтр("ru = 'Удалить выделенные настройки? |Откроется окно выбора пользователей, которым необходимо очистить настройки.'"); - Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); - Если Ответ = КодВозвратаДиалога.Нет Тогда - Возврат; - КонецЕсли; - - ТипПользователя = ТипЗнч(ПользовательСсылка); - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", - ПользовательСсылка, ТипПользователя, "Очистка"); - ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); + Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВыбраннымПользователямЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет,, КодВозвратаДиалога.Да); КонецПроцедуры @@ -461,35 +299,13 @@ Процедура ОчиститьВсеНастройки(Команда) ТекстВопроса = НСтр("ru = 'Очистить все настройки у пользователя ""%1""?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса, ПользовательСсылка); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ПользовательСсылка); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Очистить'")); - КнопкиВопроса.Добавить(НСтр("ru='Отмена'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); - Если Ответ = КнопкиВопроса[1].Значение Тогда - Возврат; - КонецЕсли; + КнопкиВопроса.Добавить("Очистить", НСтр("ru='Очистить'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); - Если Ответ = КнопкиВопроса[0].Значение Тогда - ТекстПояснения = НСтр("ru = 'Очищены все настройки пользователя ""%1""'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка); - ОчиститьВсе = Истина; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - - ОчищаемыеНастройки = Новый Массив; - ОчищаемыеНастройки.Добавить("НастройкиОтчетов"); - ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида"); - ОчищаемыеНастройки.Добавить("ДанныеФорм"); - ОчищаемыеНастройки.Добавить("ПерсональныеНастройки"); - ОчищаемыеНастройки.Добавить("Избранное"); - ОчищаемыеНастройки.Добавить("НастройкиПечати"); - ОчищаемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки"); - - ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки); + Оповещение = Новый ОписаниеОповещения("ОчиститьВсеНастройкиЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); КонецПроцедуры @@ -497,31 +313,13 @@ Процедура ОчиститьНастройкиОтчетовИВнешнегоВида(Команда) ТекстВопроса = НСтр("ru = 'Очистить все настройки отчетов и внешнего вида у пользователя ""%1""?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса, ПользовательСсылка); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ПользовательСсылка); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Очистить'")); - КнопкиВопроса.Добавить(НСтр("ru='Отмена'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); - Если Ответ = КнопкиВопроса[1].Значение Тогда - Возврат; - КонецЕсли; + КнопкиВопроса.Добавить("Очистить", НСтр("ru='Очистить'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); - Если Ответ = КнопкиВопроса[0].Значение Тогда - ТекстПояснения = НСтр("ru = 'Очищены все настройки отчетов и внешнего вида у пользователя ""%1""'"); - ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка); - ОчиститьВсе = Истина; - КонецЕсли; - - ПоказатьОповещениеПользователя( - НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); - - ОчищаемыеНастройки = Новый Массив; - ОчищаемыеНастройки.Добавить("НастройкиОтчетов"); - ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида"); - ОчищаемыеНастройки.Добавить("ДанныеФорм"); - - ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки); + Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); КонецПроцедуры @@ -538,21 +336,13 @@ ТекстВопроса = НСтр("ru = 'Сейчас будут очищены все настройки всех пользователей. |Продолжить?'"); - ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( - ТекстВопроса, ПользовательСсылка); + ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстВопроса, ПользовательСсылка); КнопкиВопроса = Новый СписокЗначений; - КнопкиВопроса.Добавить(НСтр("ru='Очистить все'")); - КнопкиВопроса.Добавить(НСтр("ru='Отмена'")); - Ответ = Вопрос(ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); + КнопкиВопроса.Добавить("ОчиститьВсе", НСтр("ru='Очистить все'")); + КнопкиВопроса.Добавить("Отмена", НСтр("ru='Отмена'")); - Если Ответ = КнопкиВопроса[1].Значение Тогда - Возврат; - КонецЕсли; - - ОчиститьНастройкиВсехПользователейНаСервере(); - - ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , - НСтр("ru='Очищены все настройки всех пользователя'"), БиблиотекаКартинок.Информация32); + Оповещение = Новый ОписаниеОповещения("ОчиститьНастройкиВсехПользователейЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[1].Значение); КонецПроцедуры @@ -573,7 +363,7 @@ &НаСервере Процедура ЗаполнитьСпискиНастроек() - Обработки.НастройкиПользователей.ЗаполнитьСпискиНастроек(ЭтаФорма); + Обработки.НастройкиПользователей.ЗаполнитьСпискиНастроек(ЭтотОбъект); РассчитатьКоличествоНастроек(); КонецПроцедуры @@ -821,9 +611,275 @@ РассчитатьКоличествоНастроек(); КонецПроцедуры +&НаКлиенте +Процедура ОчиститьЗавершение(Ответ, ДеревоНастроек) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + ВыделенныеСтроки = ДеревоНастроек.ВыделенныеСтроки; + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); + + ОчиститьНаСервере(); + + Если КоличествоНастроек = 1 Тогда + + НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + Если СтрДлина(НазваниеНастройки) > 24 Тогда + НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; + КонецЕсли; + + КонецЕсли; + + УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки); + + ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки); + +КонецПроцедуры + //////////////////////////////////////////////////////////////////////////////// // Вспомогательные процедуры и функции +&НаКлиенте +Процедура Подключаемый_ВыполнитьОбработкуОповещения() + + ИмяСобытия = ПараметрыОбработкиОповещения.ИмяСобытия; + Параметр = ПараметрыОбработкиОповещения.Параметр; + + Если ВРег(ИмяСобытия) = ВРег("ВыборПользователя") Тогда + + ПользователиПриемник = Параметр.ПользователиПриемник; + КоличествоПользователей = ПользователиПриемник.Количество(); + + ПояснениеКомуСкопированыНастройки = НастройкиПользователейКлиент.ПояснениеПользователи( + КоличествоПользователей, ПользователиПриемник[0]); + + Если Параметр.КопироватьВсе Тогда + + МассивНастроек = Новый Массив; + ИменаНастроек = ""; + Для Каждого Настройка Из КопируемыеНастройки Цикл + + ИменаНастроек = ИменаНастроек + НРег(Настройка.Представление) + ", "; + МассивНастроек.Добавить(Настройка.Значение); + + КонецЦикла; + + ИменаНастроек = Лев(ИменаНастроек, СтрДлина(ИменаНастроек)-2); + + Если МассивНастроек.Количество() = 7 Тогда + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = 'Скопированы все настройки %1'"), ПояснениеКомуСкопированыНастройки); + Иначе + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( + НСтр("ru = '%1 скопированы %2'"), ИменаНастроек, ПояснениеКомуСкопированыНастройки); + КонецЕсли; + + Состояние(НСтр("ru = 'Выполняется копирование настроек'")); + + Отчет = Неопределено; + СкопироватьВсеНастройкиНаСервере(ПользовательИнформационнойБазы, ПользователиПриемник, МассивНастроек, Отчет); + + Если Отчет <> Неопределено Тогда + ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + + Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); + + Возврат; + КонецЕсли; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + Возврат; + КонецЕсли; + + Если Параметр.ОчисткаНастроек Тогда + + ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); + + ОчиститьНаСервере(ПользователиПриемник, Истина); + + Если КоличествоНастроек = 1 Тогда + + НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + Если СтрДлина(НазваниеНастройки) > 24 Тогда + НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; + КонецЕсли; + + КонецЕсли; + + КоличествоПользователей = Параметр.ПользователиПриемник.Количество(); + ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки, КоличествоПользователей); + + Возврат; + КонецЕсли; + + ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(ДеревоНастроек); + + ЛичныхНастроекОтчетов = 0; + Отчет = Неопределено; + СкопироватьНаСервере(ПользователиПриемник, ЛичныхНастроекОтчетов, Отчет); + + Если Отчет <> Неопределено Тогда + ТекстВопроса = НСтр("ru = 'Не все варианты отчетов и настройки были скопированы.'"); + КнопкиВопроса = Новый СписокЗначений; + КнопкиВопроса.Добавить("Ок", НСтр("ru='ОК'")); + КнопкиВопроса.Добавить("ПоказатьОтчет", НСтр("ru='Показать отчет'")); + + Оповещение = Новый ОписаниеОповещения("ОбработкаОповещенияПоказатьВопрос", ЭтотОбъект, Отчет); + ПоказатьВопрос(Оповещение, ТекстВопроса, КнопкиВопроса,, КнопкиВопроса[0].Значение); + + Возврат; + Иначе + + Если КоличествоНастроек = 1 Тогда + ПредставлениеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + КонецЕсли; + + ТекстПояснения = НастройкиПользователейКлиент.ФормированиеПоясненияПриКопировании( + ПредставлениеНастройки, КоличествоНастроек, ПояснениеКомуСкопированыНастройки); + ПоказатьОповещениеПользователя( + НСтр("ru = 'Копирование настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + КонецЕсли; + + ИначеЕсли ВРег(ИмяСобытия) = ВРег("СкопированыНастройки") Тогда + ЗаполнитьСпискиНастроек(); + РазвернутьДеревоЗначений(); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьНастройкиВыбраннымПользователямЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + ТипПользователя = ТипЗнч(ПользовательСсылка); + ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия", + ПользовательСсылка, ТипПользователя, "Очистка"); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьНастройкиВсехПользователейЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = "Отмена" Тогда + Возврат; + КонецЕсли; + + ОчиститьНастройкиВсехПользователейНаСервере(); + + ПоказатьОповещениеПользователя(НСтр("ru = 'Очистка настроек'"), , + НСтр("ru='Очищены все настройки всех пользователя'"), БиблиотекаКартинок.Информация32); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьВсеНастройкиЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = "Отмена" Тогда + Возврат; + КонецЕсли; + + ТекстПояснения = НСтр("ru = 'Очищены все настройки пользователя ""%1""'"); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка); + ОчиститьВсе = Истина; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + ОчищаемыеНастройки = Новый Массив; + ОчищаемыеНастройки.Добавить("НастройкиОтчетов"); + ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида"); + ОчищаемыеНастройки.Добавить("ДанныеФорм"); + ОчищаемыеНастройки.Добавить("ПерсональныеНастройки"); + ОчищаемыеНастройки.Добавить("Избранное"); + ОчищаемыеНастройки.Добавить("НастройкиПечати"); + ОчищаемыеНастройки.Добавить("ПрочиеПользовательскиеНастройки"); + + ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки); + +КонецПроцедуры + +&НаКлиенте +Процедура ОчиститьНастройкиОтчетовИВнешнегоВидаЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = "Отмена" Тогда + Возврат; + КонецЕсли; + + ТекстПояснения = НСтр("ru = 'Очищены все настройки отчетов и внешнего вида у пользователя ""%1""'"); + ТекстПояснения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстПояснения, ПользовательСсылка); + ОчиститьВсе = Истина; + + ПоказатьОповещениеПользователя( + НСтр("ru = 'Очистка настроек'"), , ТекстПояснения, БиблиотекаКартинок.Информация32); + + ОчищаемыеНастройки = Новый Массив; + ОчищаемыеНастройки.Добавить("НастройкиОтчетов"); + ОчищаемыеНастройки.Добавить("НастройкиВнешнегоВида"); + ОчищаемыеНастройки.Добавить("ДанныеФорм"); + + ОчиститьВсеНастройкиНаСервере(ОчищаемыеНастройки); + +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиПередУдалениемЗавершение(Ответ, Элемент) Экспорт + + Если Ответ = КодВозвратаДиалога.Нет Тогда + Возврат; + КонецЕсли; + + ОчиститьНаСервере(); + + ВыделенныеСтроки = Элемент.ВыделенныеСтроки; + КоличествоНастроек = КоличествоСкопированныхИлиУдаленныхНастроек(Элемент); + + Если КоличествоНастроек = 1 Тогда + + ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); + НазваниеНастройки = ДеревоНастроек.ТекущиеДанные.Настройка; + + Если СтрДлина(НазваниеНастройки) > 24 Тогда + НазваниеНастройки = Лев(НазваниеНастройки, 24) + "..."; + КонецЕсли; + + КонецЕсли; + + УдалитьНастройкиИЗДереваЗначений(ВыделенныеСтроки); + + ОповеститьОбУдалении(КоличествоНастроек, НазваниеНастройки); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещенияПоказатьВопрос(Ответ, Отчет) Экспорт + + Если Ответ = "Ок" Тогда + Возврат; + Иначе + Отчет.ОтображатьГруппировки = Истина; + Отчет.ОтображатьСетку = Ложь; + Отчет.ОтображатьЗаголовки = Ложь; + Отчет.Показать(); + Возврат; + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Процедура РазвернутьДеревоЗначений() @@ -966,17 +1022,17 @@ ДеревоНастроек = ТаблицаФормыВыбраннойСтраницыНастроек(); Если ДеревоНастроек.ВыделенныеСтроки.Количество() = 0 Тогда - Предупреждение(НСтр("ru = 'Необходимо выбрать настройки, которые требуется скопировать.'")); + ПоказатьПредупреждение(,НСтр("ru = 'Необходимо выбрать настройки, которые требуется скопировать.'")); Возврат; ИначеЕсли ДеревоНастроек.ВыделенныеСтроки.Количество() = 1 Тогда Если ДеревоНастроек.ТекущиеДанные.Тип = "ВариантЛичный" Тогда - Предупреждение(НСтр("ru = 'Невозможно скопировать личный вариант отчета. + ПоказатьПредупреждение(,НСтр("ru = 'Невозможно скопировать личный вариант отчета. |Для того чтобы личный вариант отчета стал доступен другим пользователям, необходимо |его пересохранить со снятой пометкой ""Только для автора"".'")); Возврат; ИначеЕсли ДеревоНастроек.ТекущиеДанные.Тип = "НастройкаЛичная" Тогда - Предупреждение(НСтр("ru = 'Невозможно скопировать настройку личного варианта отчета. + ПоказатьПредупреждение(,НСтр("ru = 'Невозможно скопировать настройку личного варианта отчета. |Копирование настроек личных вариантов отчетов не предусмотрено.'")); Возврат; КонецЕсли; diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form index b025ce376..703db64a3 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Form.form @@ -28,7 +28,7 @@ <name>ПереключательКомуОчищатьНастройкиПриИзменении</name> </handlers> <extendedTooltip> - <name>ПереключательКомуОчищатьНастройкиРасширеннаяПодсказка</name> + <name>ПереключательКомуОчищатьНастройкиExtendedTooltip</name> <id>70</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -90,8 +90,8 @@ <value>Выберите пользователей, которым необходимо скопировать настройки</value> </toolTip> <extendedTooltip> - <name>ВыбратьПользователейРасширеннаяПодсказка</name> - <id>73</id> + <name>ВыбратьПользователейExtendedTooltip</name> + <id>72</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -127,8 +127,8 @@ <value>Группа выбрать пользователей</value> - ГруппаВыбратьПользователейРасширеннаяПодсказка - 72 + ГруппаВыбратьПользователейExtendedTooltip + 71 Label true true @@ -156,7 +156,7 @@ Очистить настройки: - ГруппаОчиститьУПользователейРасширеннаяПодсказка + ГруппаОчиститьУПользователейExtendedTooltip 69 Label true @@ -196,8 +196,8 @@ ПереключательОчищаемыеНастройкиПриИзменении - ПереключательОчищаемыеНастройкиРасширеннаяПодсказка - 75 + ПереключательОчищаемыеНастройкиExtendedTooltip + 74 Label true true @@ -250,8 +250,8 @@ true - Декорация1РасширеннаяПодсказка - 78 + Декорация1ExtendedTooltip + 76 Label true true @@ -288,8 +288,8 @@ Выберите настройки, которые необходимо скопировать - ВыбратьНастройкиРасширеннаяПодсказка - 79 + ВыбратьНастройкиExtendedTooltip + 77 Label true true @@ -335,8 +335,8 @@ true - ГруппаВыбратьНастройкиРасширеннаяПодсказка - 77 + ГруппаВыбратьНастройкиExtendedTooltip + 75 Label true true @@ -365,8 +365,8 @@ Что очистить: - ГруппаОчищаемыеНастройкиРасширеннаяПодсказка - 74 + ГруппаОчищаемыеНастройкиExtendedTooltip + 73 Label true true @@ -398,7 +398,7 @@ true - ФормаОчиститьИЗакрытьРасширеннаяПодсказка + ФормаОчиститьИЗакрытьExtendedTooltip 66 Label true @@ -424,7 +424,7 @@ true - ОчиститьРасширеннаяПодсказка + ОчиститьExtendedTooltip 67 Label true @@ -450,7 +450,7 @@ true - ФормаЗакрытьРасширеннаяПодсказка + ФормаЗакрытьExtendedTooltip 68 Label true diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Help/ru.html b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Help/ru.html index 6d9120be2..b5bd15f9c 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Help/ru.html +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Help/ru.html @@ -1,4 +1,4 @@ - +

                    Очистка настроек пользователей:

                    1. "Очистить настройки" - выбираются пользователи, которым необходимо очистить настройки. При отметке значения "Выбранным пользователям" становится доступен выбор пользователей.
                    2. "Что очистить" - выбирается, какие настройки очищать. Если в поле "Кому очистить" выбран один пользователь, то есть возможность выбора отдельных настроек. При выборе нескольких пользователей или всех пользователей возможна очистка только всех настроек каждого пользователя.
                    \ No newline at end of file diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl index dede413e6..b32c7f7aa 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ОчисткаНастроекПользователей/Module.bsl @@ -12,7 +12,7 @@ ПользователиКоторымОчищаютсяНастройки = Новый Структура; ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям"; - ПереключательОчищаемыеНастройки = "ОчиститьВсе"; + ПереключательОчищаемыеНастройки = "ОчиститьВсе"; ОчиститьИсториюВыбораНастроек = Истина; КонецПроцедуры @@ -124,9 +124,9 @@ Если ПереключательКомуОчищатьНастройки = "ВыбраннымПользователям" И КоличествоПользователей > 1 Или ПереключательКомуОчищатьНастройки = "ВсемПользователям" Тогда - Предупреждение(НСтр("ru = 'Очистка отдельных настроек доступна только при выборе одного пользователя.'")); ПереключательОчищаемыеНастройки = "ОчиститьВсе"; Элементы.ВыбратьНастройки.Доступность = Ложь; + ПоказатьПредупреждение(,НСтр("ru = 'Очистка отдельных настроек доступна только при выборе одного пользователя.'")); ИначеЕсли ПереключательОчищаемыеНастройки = "ОчиститьВсе" Тогда Элементы.ВыбратьНастройки.Доступность = Ложь; Иначе @@ -143,28 +143,14 @@ ВыборТипаПользователей.Добавить("ВнешниеПользователи", "Внешние пользователи"); ВыборТипаПользователей.Добавить("Пользователи", "Пользователи"); - ВыбранныйВариант = ВыборТипаПользователей.ВыбратьЭлемент(); - - Если ВыбранныйВариант = Неопределено Тогда - Возврат; - КонецЕсли; - - Если ВыбранныйВариант.Значение = "Пользователи" Тогда - ТипПользователя = Тип("СправочникСсылка.Пользователи"); - ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда - ТипПользователя = Тип("СправочникСсылка.ВнешниеПользователи"); - КонецЕсли; - + Оповещение = Новый ОписаниеОповещения("ВыбратьПользователейНажатиеВыбратьЭлемент", ЭтотОбъект); + ВыборТипаПользователей.ПоказатьВыборЭлемента(Оповещение); + Возврат; Иначе ТипПользователя = Тип("СправочникСсылка.Пользователи"); КонецЕсли; - ВыбранныеПользователи = Неопределено; - ПользователиКоторымОчищаютсяНастройки.Свойство("МассивПользователей", ВыбранныеПользователи); - - ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия, ВыбранныеПользователи", - "", ТипПользователя, "Очистка", ВыбранныеПользователи); - ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); + ОткрытьФормуВыбораПользователей(ТипПользователя); КонецПроцедуры @@ -207,6 +193,35 @@ //////////////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ВыбратьПользователейНажатиеВыбратьЭлемент(ВыбранныйВариант, ДополнительныеПараметры) Экспорт + + Если ВыбранныйВариант = Неопределено Тогда + Возврат; + КонецЕсли; + + Если ВыбранныйВариант.Значение = "Пользователи" Тогда + ТипПользователя = Тип("СправочникСсылка.Пользователи"); + ИначеЕсли ВыбранныйВариант.Значение = "ВнешниеПользователи" Тогда + ТипПользователя = Тип("СправочникСсылка.ВнешниеПользователи"); + КонецЕсли; + + ОткрытьФормуВыбораПользователей(ТипПользователя); + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуВыбораПользователей(ТипПользователя) + + ВыбранныеПользователи = Неопределено; + ПользователиКоторымОчищаютсяНастройки.Свойство("МассивПользователей", ВыбранныеПользователи); + + ПараметрыФормы = Новый Структура("Пользователь, ТипПользователя, ТипДействия, ВыбранныеПользователи", + "", ТипПользователя, "Очистка", ВыбранныеПользователи); + ОткрытьФорму("Обработка.НастройкиПользователей.Форма.ВыборПользователей", ПараметрыФормы); + +КонецПроцедуры + &НаКлиенте Функция ОчисткаНастроек() diff --git a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form index c93e97d1c..a4acc7b5e 100644 --- a/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form +++ b/SSL/src/DataProcessors/НастройкиПользователей/Forms/ПредупреждениеОКопированииНастроек/Form.form @@ -19,7 +19,7 @@ true - СообщениеРасширеннаяПодсказка + СообщениеExtendedTooltip 20 Label true @@ -56,7 +56,7 @@ true - СписокАктивныхПользователейРасширеннаяПодсказка + СписокАктивныхПользователейExtendedTooltip 22 Label true @@ -93,7 +93,7 @@ Группа активные пользователи - ГруппаАктивныеПользователиРасширеннаяПодсказка + ГруппаАктивныеПользователиExtendedTooltip 21 Label true @@ -125,7 +125,7 @@ true - СкопироватьРасширеннаяПодсказка + СкопироватьExtendedTooltip 18 Label true @@ -151,7 +151,7 @@ true - ОтменаРасширеннаяПодсказка + ОтменаExtendedTooltip 19 Label true diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form index f189be03c..e8b125da7 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Form.form @@ -20,7 +20,7 @@ true - КартинкаПредупреждениеРасширеннаяПодсказка + КартинкаПредупреждениеExtendedTooltip 29 Label true @@ -64,7 +64,7 @@ true - ВерсияРасширеннаяПодсказка + ВерсияExtendedTooltip 32 Label true @@ -102,7 +102,7 @@ true - РекомендуемаяВерсияПлатформыРасширеннаяПодсказка + РекомендуемаяВерсияПлатформыExtendedTooltip 33 Label true @@ -143,7 +143,7 @@ Группа версия - ГруппаВерсияРасширеннаяПодсказка + ГруппаВерсияExtendedTooltip 31 Label true @@ -174,7 +174,7 @@ true - ТекстСообщенияРасширеннаяПодсказка + ТекстСообщенияExtendedTooltip 34 Label true @@ -212,7 +212,7 @@ true - ТекстСсылкиРасширеннаяПодсказка + ТекстСсылкиExtendedTooltip 35 Label true @@ -251,7 +251,7 @@ true - ТекстВопросаРасширеннаяПодсказка + ТекстВопросаExtendedTooltip 36 Label true @@ -284,7 +284,7 @@ Группа текст - ГруппаТекстРасширеннаяПодсказка + ГруппаТекстExtendedTooltip 30 Label true @@ -313,7 +313,7 @@ Группа предупреждение - ГруппаПредупреждениеРасширеннаяПодсказка + ГруппаПредупреждениеExtendedTooltip 28 Label true @@ -345,7 +345,7 @@ true - ФормаЗавершитьРаботуРасширеннаяПодсказка + ФормаЗавершитьРаботуExtendedTooltip 26 Label true @@ -371,7 +371,7 @@ true - ФормаНетРасширеннаяПодсказка + ФормаНетExtendedTooltip 27 Label true @@ -390,16 +390,16 @@ Right - - BeforeClose - ПередЗакрытием - OnCreateAtServer ПриСозданииНаСервере + + OnClose + ПриЗакрытии + 75 - LockOwner + LockWholeInterface true true Vertical @@ -462,6 +462,23 @@ true + + ПропуститьЗавершениеРаботы + + <key>ru</key> + <value>Пропустить завершение работы</value> + + 4 + + Boolean + + + true + + + true + + Продолжить @@ -527,6 +544,12 @@ <stringQualifiers/> </valueType> </parameters> + <parameters> + <name>ПропуститьЗавершениеРаботы</name> + <valueType> + <types>Boolean</types> + </valueType> + </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl index 9219f2e09..470439b80 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/НерекомендуемаяВерсияПлатформы/Module.bsl @@ -12,42 +12,31 @@ ВызватьИсключение НСтр("ru='Обработка не предназначена для непосредственного использования.'"); КонецЕсли; - ДатаПоследнегоПоказа = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НерекомендуемаяВерсияПлатформы", "ДатаПоследнегоОтображения",,, ИмяПользователя()); - - ПоказатьСообщение = Истина; - Если ДатаПоследнегоПоказа <> Неопределено Тогда - ПоказатьСообщение = Формат(ДатаПоследнегоПоказа, "ДЛФ=D") <> Формат(ТекущаяДатаСеанса(), "ДЛФ=D"); - КонецЕсли; - - Если Не ПоказатьСообщение И Не ПараметрыСеанса.ВыполняетсяОбновлениеИБ Тогда - Отказ = Истина; - Возврат; - КонецЕсли; + ПропуститьЗавершениеРаботы = Параметры.ПропуститьЗавершениеРаботы; Элементы.ТекстСообщения.Заголовок = Параметры.ТекстСообщения; Элементы.РекомендуемаяВерсияПлатформы.Заголовок = Параметры.РекомендуемаяВерсияПлатформы; СистемнаяИнформация = Новый СистемнаяИнформация; + Элементы.Версия.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( Элементы.Версия.Заголовок, СистемнаяИнформация.ВерсияПриложения); + Если Параметры.ЗавершитьРаботу Тогда Элементы.ТекстВопроса.Видимость = Ложь; Элементы.ФормаНет.Видимость = Ложь; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Выполнить("РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс"); - КонецЕсли; - КонецПроцедуры &НаКлиенте -Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) +Процедура ПриЗакрытии() Если Не ДействиеОпределено Тогда - СтандартнаяОбработка = Ложь; ДействиеОпределено = Истина; - ПрекратитьРаботуСистемы(); - Закрыть(КодВозвратаДиалога.ОК); + + Если НЕ ПропуститьЗавершениеРаботы Тогда + ПрекратитьРаботуСистемы(); + КонецЕсли; КонецЕсли; КонецПроцедуры @@ -57,8 +46,10 @@ &НаКлиенте Процедура ТекстСсылкиНажатие(Элемент) + СтандартнаяОбработка = Ложь; - ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.ПорядокОбновленияПлатформы"); + ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.ПорядокОбновленияПлатформы",,ЭтотОбъект); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -68,12 +59,7 @@ Процедура ПродолжитьРаботу(Команда) ДействиеОпределено = Истина; - СохранитьДатуПоследнегоПоказа(); - Закрыть(КодВозвратаДиалога.Отмена); - - // СтандартныеПодсистемы.ОбновлениеВерсииИБ - ОбновлениеИнформационнойБазыКлиент.ОбновитьИнформационнуюБазу(); - // Конец СтандартныеПодсистемы.ОбновлениеВерсииИБ + Закрыть("Продолжить"); КонецПроцедуры @@ -81,20 +67,10 @@ Процедура ЗавершитьРаботу(Команда) ДействиеОпределено = Истина; - ПрекратитьРаботуСистемы(); - Закрыть(КодВозвратаДиалога.ОК); + Если НЕ ПропуститьЗавершениеРаботы Тогда + ПрекратитьРаботуСистемы(); + КонецЕсли; + Закрыть(); КонецПроцедуры -//////////////////////////////////////////////////////////////////////////////// -// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ - -&НаСервере -Процедура СохранитьДатуПоследнегоПоказа() - - ОбщегоНазначения.ХранилищеОбщихНастроекСохранить( - "НерекомендуемаяВерсияПлатформы", "ДатаПоследнегоОтображения", ТекущаяДатаСеанса(),, ИмяПользователя()); - -КонецПроцедуры - - diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form index 17fab7ea0..553dbb1af 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Form.form @@ -17,7 +17,7 @@ </dataPath> <titleLocation>None</titleLocation> <extendedTooltip> - <name>ПорядокОбновленияПрограммыРасширеннаяПодсказка</name> + <name>ПорядокОбновленияПрограммыExtendedTooltip</name> <id>10</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -63,7 +63,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаЗакрытьРасширеннаяПодсказка</name> + <name>ФормаЗакрытьExtendedTooltip</name> <id>8</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -88,7 +88,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ФормаСправкаРасширеннаяПодсказка</name> + <name>ФормаСправкаExtendedTooltip</name> <id>9</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -141,12 +141,6 @@ <common>true</common> </edit> </attributes> - <parameters> - <name>ОбновлениеНа83</name> - <valueType> - <types>Boolean</types> - </valueType> - </parameters> <commandInterface> <navigationPanel/> <commandBar/> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl index 49386201e..d134863db 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Forms/ПорядокОбновленияПлатформы/Module.bsl @@ -9,30 +9,25 @@ КонецЕсли; БазаФайловая = ОбщегоНазначения.ИнформационнаяБазаФайловая(); - - ИмяМакета = ?(БазаФайловая, "ПорядокОбновленияДляФайловойБазы", "ПорядокОбновленияДляКлиентСервернойБазы"); - - Постфикс = ?(Параметры.ОбновлениеНа83 Или ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(), "83", ""); - - ПолноеИмяМакета = "[ИмяМакета][Постфикс]"; - ПолноеИмяМакета = СтрЗаменить(ПолноеИмяМакета, "[ИмяМакета]", ИмяМакета); - ПолноеИмяМакета = СтрЗаменить(ПолноеИмяМакета, "[Постфикс]", Постфикс); - - МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет(ПолноеИмяМакета); + Если БазаФайловая Тогда + МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет("ПорядокОбновленияДляФайловойБазы"); + Иначе + МакетПорядокОбновления = Обработки.НерекомендуемаяВерсияПлатформы.ПолучитьМакет("ПорядокОбновленияДляКлиентСервернойБазы"); + КонецЕсли; ПорядокОбновленияПрограммы = МакетПорядокОбновления.ПолучитьТекст(); КонецПроцедуры +//////////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ШАПКИ ФОРМЫ + &НаКлиенте Процедура ПорядокОбновленияПрограммыПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка) - Статус = ОбщегоНазначенияКлиент.ПредложитьУстановкуРасширенияРаботыСФайлами(); - СтандартнаяОбработка = Ложь; - Если Статус = "Подключено" Тогда - Если ДанныеСобытия.Href <> Неопределено Тогда - ЗапуститьПриложение(ДанныеСобытия.Href); - КонецЕсли; + Если ДанныеСобытия.Href <> Неопределено Тогда + СтандартнаяОбработка = Ложь; + ПерейтиПоНавигационнойСсылке(ДанныеСобытия.Href); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы/ru.html b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы/ru.html index 613241c18..b7e5770ba 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы/ru.html +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta><style>H1 { +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta><style>H1 { TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold } .Programtext { @@ -14,8 +14,8 @@ BODY { FONT-FAMILY: Verdana; FONT-SIZE: 8pt } </style></head><body> -<h1 style="MARGIN: auto 0cm">Порядок обновления на новую версию 1С:Предприятия 8.2</h1> +<h1 style="MARGIN: auto 0cm">Порядок обновления на новую версию 1С:Предприятия 8.3</h1> <ol><li> -<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Скачайте дистрибутив последней версии 1С:Предприятия 8.2 с сайта поддержки пользователей 1С по указанному адресу:  <a href="http://users.v8.1c.ru/project.jsp?id=Platform82"><font color="#0000ff">http://users.v8.1c.ru/project.jsp?id=Platform82</font></a></div> +<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Скачайте дистрибутив последней версии 1С:Предприятия 8.3 с сайта поддержки пользователей 1С по указанному адресу: <a href="http://users.v8.1c.ru/project.jsp?id=Platform83"><font color="#0000ff">http://users.v8.1c.ru/project.jsp?id=Platform83</font></a></div> </li><li> -<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Далее необходимо руководствоваться информацией из файла V8Update.htm, включенном в поставку дистрибутива 1С:Предприятия 8.2.</div></li></ol><p style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"> </p></body></html> \ No newline at end of file +<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Далее необходимо руководствоваться информацией из файла V8Update.htm, включенном в поставку дистрибутива 1С:Предприятия 8.3.</div></li></ol></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/Template.htmldoc b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/Template.htmldoc deleted file mode 100644 index 1621f1d23..000000000 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/Template.htmldoc +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<htmldoc:HtmlDocument xmlns:htmldoc="http://g5.1c.ru/v8/dt/html-document"> - <pages lang="ru"/> -</htmldoc:HtmlDocument> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/ru.html b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/ru.html deleted file mode 100644 index a209f8ba6..000000000 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляКлиентСервернойБазы83/ru.html +++ /dev/null @@ -1,21 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta><style>H1 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold -} -.Programtext { - FONT-FAMILY: Courier; COLOR: #000080; FONT-SIZE: 10pt -} -H3 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 11pt; FONT-WEIGHT: bold -} -H4 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 10pt; FONT-WEIGHT: bold -} -BODY { - FONT-FAMILY: Verdana; FONT-SIZE: 8pt -} -</style></head><body> -<h1 style="MARGIN: auto 0cm">Порядок обновления на новую версию 1С:Предприятия 8.3</h1> -<ol><li> -<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Скачайте дистрибутив последней версии 1С:Предприятия 8.3 с сайта поддержки пользователей 1С по указанному адресу:  <a href="http://users.v8.1c.ru/project.jsp?id=Platform83"><font color="#0000ff">http://users.v8.1c.ru/project.jsp?id=Platform83</font></a></div> -</li><li> -<div style="TEXT-INDENT: -18pt; MARGIN-LEFT: 36pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt">Далее необходимо руководствоваться информацией из файла V8Update.htm, включенном в поставку дистрибутива 1С:Предприятия 8.3.</div></li></ol></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Download1.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Download1.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Download1.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Download1.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Download11.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Download11.png new file mode 100644 index 0000000000000000000000000000000000000000..cacdf34d71231bc0e1262bc97b21c60280c33f39 GIT binary patch literal 94896 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⋙md?=S4}#@BFaj;7w*tOhNe2!Ee)-oy6aR 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 $YIIFPpS-R6(Lv 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%0D2d5!N4(L{=jh*}L1+A$V*=~=A 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Safe2.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Safe2.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Safe2.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Safe2.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Safe21.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Safe21.png new file mode 100644 index 0000000000000000000000000000000000000000..ebfe445a0d121d410316d87d2e5bed0c4054a0c4 GIT binary patch literal 158964 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%0AX)1Xp3AoU^DpMSXnVE5nImIZ|=eXsQX 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/UserSite1.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/UserSite1.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/UserSite1.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/UserSite1.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/UserSite11.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/UserSite11.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe1d4e1eb3682963a04fe83e6c4b6d1196dfdd4 GIT binary patch literal 83487 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Ⓢu0`!tRA1A)n4ZST#m5g^H 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 KRH=k<!2bgd?W6Yq literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Платф1.jpg b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Платф1.jpg similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Платф1.jpg rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Платф1.jpg diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Платф11.jpg b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Платф11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf9c39ac5da838003e00ddda8b658becd6b972e6 GIT binary patch literal 128815 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Уст1.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Уст1.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/Уст1.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Уст1.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Уст11.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/Уст11.png new file mode 100644 index 0000000000000000000000000000000000000000..d90e30c7ee33cb3659f5dd824d0431dff369356c GIT binary patch literal 115180 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/запуск.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/запуск.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/запуск.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/запуск.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/запуск1.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/запуск1.png new file mode 100644 index 0000000000000000000000000000000000000000..82bd1be6903b9ffe2d2ba3f6776a1cc4811e8717 GIT binary patch literal 24982 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 F^<V6JsBHiM literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг12.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг12.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг12.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг12.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг121.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг121.png new file mode 100644 index 0000000000000000000000000000000000000000..2d90b6f52675c27ea8ad11a8244621e05788e89c GIT binary patch literal 37956 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 ArT_o{ literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг2.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг2.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг2.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг2.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг21.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг21.png new file mode 100644 index 0000000000000000000000000000000000000000..5c27a3756449518d18cf95f6deffa4e7274412a2 GIT binary patch literal 24638 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг31.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг31.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг31.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг31.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг311.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг311.png new file mode 100644 index 0000000000000000000000000000000000000000..a20057e220b77861fedce136dbaa7134f98c3b56 GIT binary patch literal 25447 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 b;U%kdgfKLKB`OdH_^2ssDwRL5eEq)w`S!0B literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг4.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг4.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг4.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг4.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг41.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг41.png new file mode 100644 index 0000000000000000000000000000000000000000..0d15106f412b9cd275739291a330498f8d3c877e GIT binary patch literal 27923 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг5.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг5.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг5.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг5.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг51.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг51.png new file mode 100644 index 0000000000000000000000000000000000000000..43c801197d0a3d993e67a4ef40977b333306e37a GIT binary patch literal 71213 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%0AyU8)F(=)b=grD}pP;i;ji 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 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг6.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг6.png similarity index 100% rename from SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/_files/шаг6.png rename to SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг6.png diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг61.png b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/_files/шаг61.png new file mode 100644 index 0000000000000000000000000000000000000000..7019b662cdf348129572f2dfc34266989a78af63 GIT binary patch literal 42094 zcmZ6y1yqxN*gs4Nh)76EH%NC47~Lr$k^_<Mu2CYb%%E#@he~%1knU1)Nav&mBi{LY z{^xz4|9j4McD8e0_kDGIuJ7XYb=3%;&^*Dwz#!C6S2n=Fz(k?nQIE0EzZ9nPbD=*T zIVk8TU|@WQ5Zv0}pugjLs+;;?U=a2Gdt*|((2T&qC?e5NRxk>*I_kj7Chu>$>X<;i zr-f!gLr&zl^ByNKVQE=>iTINprA|~}t^9IGBRQ`iuHapn@(?xKPP6N{)Q+Ucie*Q8 zX+>*DYY1G`-+>4Ub<xuc@LR~J@yG$D+zRvmIs#tzQ#!jj~7yf{)YxLlgI#5`_ z<|<RJsUd0gN~c74XbDnmt~)NuU@fP*<k4Po_x0wYP_0#YBWjQ4+`La^iTM^9{Oveo z%er)4B*#fTrevGL<2a1)GG~EOjB)p{!Z^r^W?1SWDwTXjj<d~z;Vp3ferYN7%Tv_w zee8)?5zKwW>DPl&*YA4;srh93n+|@88HE8JZYp1|mtz<)zx{2vVt@ZVcA8viH<61( z8C_`H4tCwmjOO2U-kytSX-+@9Z?j#y3)j|vb<Zgx=Gq6k)QNWgJ){ztF*O|v$$OGo z)JRAxEdAuNuGTRql@aIm4g>|?tps$+`u->yy&(>NXu=G_Vb^eyGB)%M*7XjqDM>zG zPJXHr#6=xcZq$<UD%ib3S9B@!rLHD`qRq`CB{^3~MJM^F3|8-|Qoa<Q@PpK_oK&7m zmEEDA)8QTbi#)YaJhf0J>9j5BbOGEiK`XIHbB_F3Rs}aZi#R(Sxvl<dZSU9hmibdd z2?bvijiZ&>xe~OW*aSb%*j0WOPs~ahHKzGEX_8BZSyE;r(j+0A#C`JaTcBLp5Yu6y zgYCPX^7AgN74chx)4rEdDAQ{J-C`i_uP6nHSv=JT@*X9-;L-J-s6mKE5YvSomrVUj zrj@UB^ib85PvaDYCU1hZ-vqn9i7{=DcmY@85Fr{SA`?&}8cxv57fzFI3JG+wn@;d- z5dUIOr(m}=KPB6?v)YmpY)$pzuDj*~cAGHq{g=?wwB@L-Ka97<>yrY}v0+?N=UU|z zf0eod1&(;tF{dMEnRL{tr(-L-8`cwUr&|I%dUCq&Jb&UDK`*#>sn<lxr_279|M<(z zx8<9wuEQn4_qF1OAH*Q?dvNbd&4$mZUk{n;jQ9Fr6`1#@LgzCM5?msb%Fw`K!EY=I z1Rvrr^b2I_R=JLIelTdZ8T_^Uv5I*mHV`bI1+B9h=@i*rczQ*#E4>+}{<Z-BMm}8a zI4keuGfH(gD$4+Sc|n13*JHhtVAtUl=8Zm^ODZZGS=bsd)ZxYFwUCs&B5e?GqQ2I_ zYI~A2+9B<IdHi#wiQed&N61F!Q9r6N?QqRX^TM`;pvT0nwRWAAj@Y56<r7v>AKCk4 z=FsLR76dhq7j%|8Sg*Fln!i?%fld~DnD*s~<0kZWhQ}w$8ks(4Ci{C>xyq}SS(r$* zyW0u~#h6e#lf_DqR=ekU;E&>{V+e(_<tjn}lA}wd%a8;-1t-LO!`1G>@0{S{`Jgwl zHy3^&=DCiplVlX`dC2BTi038s)kSS}Zg%JkoK<NQe?IZ?!>0db<TuuL0DG$z@-AB! z7RR0WKRM=x0q!~vK`tDI;}hmS;j5VsXY+~`9tq+1B}Q{51XLfN%YG$jwCUPpkYpHt z=fjMnj%Tnrq<G^=(M)L}gea{>$hnQR2jd?XCBPOuC+>pBgA-Ju|Kd<D8D&T%{O~3~ zzd8(bZBlhJq@u;xP-Bh(TVAZJr4hp_AB&9?iRN%CnX`wj*vp;?-UO?xv23*bxd-lq zDdJur=12?94tjb5NC)z(7OpQC-bivESmJm(i^W8RbqtynUEYS4^{%wu#xOw)!x<U) z+D0aF0ZQ3}k*HH(h0nFDBq~OdnDDRu$)MPku^x!<?`&QjC@MG1sm1U0U?Vlvct02w z#B12w1m$!`$pro0DgO=BTe}QGtD;e-<+u2j$8RI`hR+1@59)V#zd@aMxlY8=A98Va z6rad&sgoJRoNsXBuZ1#<ke{vWP*Y719xT?7!ayCt4gNuQxQDR=nAUV>yVM6<yOAeP zw(8EF)SV@G%U|chhz)TZ=02_CmbF)Sw^wEe`w)~rr68?ja3tJ#aam9}PpHp+DuI1T znx_brM)~VOV*>(>IQhN|Xiy)}Z(ghpddf&$hz$n&e9JW)Wj#E_(DP!L$j{Y;U3Cy# z7%`7;iZ?^|-8`WxmpO`z?JSf#2%4L9UD=XvK$39Jtkj`WNOTQ|y3xiC8I$so_LZuK z1$CR3-R%HHeAX*A53|p$PAWGgTX|JFBXtsd6HE2HX?uwhl<6e3wHWK>lENV~3B17o ziX!ZCh0IUFMZ_lYzrJyU`zpQ>Rw^#kz6*(vE~i6aW2KI_qsqouxg9ZL+>nFu#LXsm z!9=fc=B2Lt^DOig;_<f9{=8D*_0oeky~N+5*lB*{ZzV+W=OyRQA1_;<sD`>k(y(AB zTgtBy?}lKw&Ep<NjS!EADQb!b-gq(5%uKv@kmY75l9!Va7n4yn)O`Kau)bh&m%QZ9 z<O>z%mqY$49I^TezpJ8HzAy;m@OZlx={zMW4PH;lmXKN{){-~w!K%sflzpJPHSu{o zhLAnq+3u1~=`-wM2|LV~l2!Rt*l)$McUB@BcI))^IPNCymo!yGT>*e!vyJ@j=eyK| zg3XPOuUvYD<1{9R*7s(-75aa5JcX6!0{Ns5EtiUY-CEYIgHji&n@>xQE#z+_1!U3! zZ%?Ddv>0kkNn7nTkeTeypkTV|p~3G5z@&%sP31`k#!_KB@TC`rVPnMvC|rp+R2RI6 zjoNq~CYar?7wgL;hW5H7iz_c!E2M9MAK$X=&&Dry;(2}z8L#KZMbogIW<1Pe>_&q> zKJZE*x&*1?be<}K7co}y4IJvrbu#mKH`whJ6z$<uLMHgL!1J*P#jc3K@b0A@SZr*J zqFgkvIT=av+a~`uu37Yj$mzS$#INYoy5DZoLAFdQPyD!y;~-K&*As*@y1~Uk(7fL1 zu&cy=^cm%UPTNu|eipdiNq?h{`C@sYg~R`N#^H64O*Q3}@vcb*%HLs41d%WEitI-I z7LzZlpYi(W_%HFXzynj@H6HVb++)iYLGV`ZZVG{|3Ev02YOD0o<i=ndfMJPl*7i6y zjH>*>n)dP(8`<MYDM$Z**Aq|6X23G`a(oUl=}uca<oQzCzE>?Lkm)J>WGMn=L6f@i zbS!aMj*ZEBE9FbOVg<NjQC2A>tmGT?m`lH(Nc@iWhs1nXgnyA&Az&{4xB+`rQKpN> z(J!jy&9^R+T`a?xGz@pTRn2D?Bi3StBmBkRYbs}F9E9%Pzun&Be8~vK^@mS8LFixb zB_l^aCcG-5Z2a@>McZN0>$l!7Qsxyaf5)jmnQ9BXIjw1=&qeBQM#mD)>r9s6+2EJa zG({BVEHO|V)JUwC7J1(&RqA2MkQxyYKb28DRQS;a+=og~&X<mNUcUZYD$2q!$3GAn z7_nqKN(U|^XM~2_AohfqiZ@H(he{)<z&ysZ^zxs(drJC7pQpxRb-nDlmQC`YkKYEc zHr<H@Q9U)5(kREpw2^*5$t|xmU+S-o$D;gzziQ7AVL5tN2j{2=T`D}^cHz9chR7oi zLg#P~eH32QFFCqdpszmao5E3_-_2W?XC659hPcrN;*UZ1^nZ%o|C<b?rfSc=hvh)d z55UbHJ0Y|Sz5fdRH@s$+PRh=OxQUJsecJh&?ojaR@~{^%;?weN`U=gGfJ<{%Cn*vA zjk&UoQyBAaD?eGNyNJr2IGgoi?u!ds8@gFSrOSaO;>jc<ZepwG=F~(Q#Y#n)R}?XV z$tIDk4f(xDQhB$6X-4qvCrc%4+>_A98~2|&qOh=1Z*|Rmr4Solk*_QQ0Z!I<t8SYa zS$d&hGkdz%P=m9o+DE&XqPnm3q_<g*UB<9#T#pH_Hl8o+ny|<iZ*`Jxcuj=j-VJ+$ z@ItY#WYMic?PjOTu9BS7a47L)z`<c#B#@+WrtAJFN6&<Qcj<Ut>xigp_IOw8NVjwL z()FZqC#0!mw(TMXSnbiie51QIe|6IsHreE-zBZo^sHPWxL;`ib#S5{PlY5#JTeohZ zzM;A{Z(`*hTCR6+7WymuXy)>5ZKGO9gY<IcN{`hMQTy!ixI^W-t_%sIBQWC*6@>EF z1%G`ClK>ziM%u9w{QA=bcsm~9V;m=Hp0yl4swGFrMy|HqM0EMT`1?HI-4z8#EtazW z2K6tD4{lQ}DqXdYAHNQxUQH1GArPgIcAHzv3Uuk3Q@qA^rh|rPU;Zo?DP>?m&LIve z$ATY)TAJkz--nHPGp=$SxyP!7uN@zTjD_wWw!H^Fk}Iz}A(;u-Ka`FHBJTkXUE+Cq z@edy10ReXv*a8i5vu$^uSC1eUPT@cF)|b+-C%Tp|r$^js&fR<pL0Qswzm^ZywiO=4 zneTqTuP~E#ebFteaOdzV#$!Vr-F~#LK}#_9<efip6g}PRGhR3IRB1l$N&D3&+nv+Q z*17%5XW0i1^1akMLpaSU?tLv3o!b^t%YDX3!q^nx*gYBQg`-l86AeK7m8kXNYS}cF zo6>bEeU}6gQD^&;RowYr#(R%B3M=!;G>k3i-_^WMz_*UuJEk`$f=Wek^cn#~mTd;I zmhtqKR%C*{;g3Q@nw13_w@It<Yo-F8ZLMW$l}yfjy4y&bf7A_nMQu?OThrpWwq07? znRgQLC^AQI|Cd0U{_|TNNmR(O(hI1HU!a~2Uj=sUcTFQT{5^d}Xs3b+cT68>Ze`Gu zyC>Lp|6qYu+s`7*<1RE-A5tm_;S67kM6KckWvc~}?@D{F5ryW|fhs3sdk>zk=EEK! z;q4FooOpOR^wi|OzWS3xJqo3<k8<cqeQneyx0n?cVjitLC-rrBJ=tNSKpYc*Pd&x% ztL(rp5B_iiK@W1O>6hI?p0`oYERP9^TSa7c2PX4el%n{F30nn4cMm7?W|X3IiSPjc z$=#ppc~MbO$Klub%kfD_qBBB_VW}}O_?c`;xLOk3#!Gr^L{L<95)wycfvc%D)c}4# zF&4*&_8qquYrkCLM$Y+@eU>hNX`K$pf8A7Iw!BrtCtSJ`Y(A4D#p}=no3X<b_2Z23 zNp!e}x)kFXiIU`8C&QDG=iJ}O{$gE38sIH9Iqia2fv(@`B9I#)F$!WN1HpKfc`2)6 z^JlRapf??I<yjN=gg5M@s;p<ZnY<NBAi;bGFIQpOk18QsX9K^D=1m4|;Ex&{h<x)! zo_?EFvGtP`^2K)XW45GPk<un?+1EEWY+p^h#%RwF!GM$};fyXf>2<7E)Fy>?F*kdp zLlpM<Y~v0O7)0h>3<;0xUYZR|wV0jIH)siE5h+V3sB_EARW)@^7aRyGYsuYbt6chh z{rvo9FDuv?aFRa(I1POMsW|4MQfTU(*OOE_CfBrw+cdm2aG0-a*QPBhhwk^u`C^#E z;H9iw<4G|>0F*I_x`C}Waa?wae7}k^DO0rCqpxs2LJIwQ%)1zKmlU!d7{*fc|Bn!U z3;JWs<M*V{d|<a%4D~9RI_rIJG=anFO7PXOwtkklo9J=W8i)_>avq>}JGT%dn;(NR z6^XcKEPY66r~-QGfmMS%cT$j$8<qkRXy`J**iVMI@Xt->+^{a(r=ah#xqd=&_G#sW z!9P0%x3_)ZhRe0h+9A$A%Er4vz4QfuVWc_muQ+L3?K!M8S~G`P%|)Y<<)8ywHm^q} zJZZsjH!zp31d!h6L(gZe)@9R4Kd~GjD_M!#T<gF5b~k`1bYa<qbK^T?!h1OMdDHF( z)PRlYsyvABV1eX3^4rQi>Opq-dS!2EQ&*4C&;F+DOhnBxU2Okv)k_n5NV`zTpXw#n zlTrHX^@eA8lR<s*&(300T1mjg50s79T(`dHi6%;v*-o9Y25aFRPp{v`z9+FKr`0p4 z+SzZ{4r!l*c{Rw3^PYnRyg-b0*PkgJAdZs=j}QCF23O!+kIx*8Yc6nF+CZt2v5%M) zn<p_y@^jsIJxf$RDxl5;Z+_%)9I*%YC5Pko=FE6r%jnw96s_*9<>=>$kBbs))))P^ zj!gIKvQxgW3?;eos%4%LNA=hw%ov5I4yk>yT7vEwev^NQfb?Jjh`>o@A7FoS!$jYV zeA%S8R$@H0@a7`L9zFjN?iiN<?mK@gw2<G4?ViwPhoUAeR*lz0A2L^#n)EtLywQ2O zEuzz_SFEA3GZxddim!=gvh*2)_!bL^|E|bKhQl?V>p}^Ec3EuSt(?6)+7s=ri`Dv& z6TOhr`})`uJpxNn9P;ap<e!id<#18<f#`LfyQXi1gMFs|p9-O%I1qUa(G^AjoDY#- z-8{C^Mt4IpfVr%us`{>UBFA-}dJTB0N$YLr+%g7<S(PN2@2sg`?p0eXk&Zoz=Wp<M zq0{!^7wXMfqNd|l0pfOYZX3$HMpEa6rWsYtl53lK;xbvsK3lP9_KneoShv=Ee_FfW zyl?fS#-pU#L3=d&{ZxWGcciRsxqtWllW0csdu~ocqfBRkAN-AIZd{tZMg{2$iv7nd z!ZMQjhFj|&fp4LGUq!ra-ssZ69L5?2TiH0`H*$%(-gNjTBVIAw2Jc|f1sd1V9pp$} z>@G+&n>@k3;o1A!miwWnXDfha#|uaS5gIrA$OP#PRom^WdYX(HXtdxYa|`af%Zxw8 zurbl0JL}u0c-GdqX4Uj(AR)kmH}q_LTH-_?{H!NILdoPErE--8NsGP0dFJ(Z7lm5R zSE`;e+5e`@PeetyPKv{yfEGA4I4188dgsDlcX-diz8}Yhr`;9CS#<<g-auFxJc*?v zk>FNQT`+E__~nx~^CU|cyGsvVB(!F)s9}CN!ebpGN3-@l=QhqoZ^zgzMOE8+hk1y+ z7zTW!|5iyPHI9kbKZ-p{c)J-%jWDsWr$3WI1c7n01LA%f{;2Kj=1j;l{uD-A@d!6S z_4Z8Em+YdF|C>mlNwRnkcJn25)z+))Qc2{n1;PF)kJvlnJ7K3sAo|x@9U%~*?0w|L z^Qx-`bt7~cyIQWL4qt<XqS_<*-=S)vWH=nwxUT#Z7(DVo*v}YVoWyHzML|6pw+gQq z>7>(xj|2D1qw+o&;)y6Y5N&7Q@m<jw-?ywi8NYk=I;h9glV9)A|3oen^can?to)tA z^CXTR;=*7_^8(8vY-lY)R@FyPF}>m>P`%PZC@4}_rW<#eJCdH}_Y|bN!go!RNenU< zxDO<TF*ZsY(5}%Egk2_#fSvJhy>g7srT5(Sf=BsmJDkQD#mk1-&JJaV$q57%KdO4y zn+9~dyH4w@Eb`3T6OhH6S^;qJpqJB;%qM_lX{W6I7*o)upH9c?*{4@yXQzQwJBabM zfcb*TM^|GC4D{zZJ?QRHqG|URr>&>-*Dya;8Lqu0Q>mb=(hnI^B}?li;h2O$+wnGI zxpb@TQ*k>q5O58mj8gAo*!`XmUsjUaoUcWtgFIQYl{K8!l^86xihOq2jaJG3PXEZQ z^;Yx^$HpUpk(XQY+4al&@x)_|GU?b}w-~2aj4L?1hBuXGcKaOqA}VK<f+O#O;Ez;q zU2-{$BHWYZ!CMy3v2c&2J`PA8DA%57^^tgF!^cLJmXXiRa+b9R%Aq!duWQdIraXzi z?iT^zRyn4Tdg)|tR^7@HUhl}}L#V0-F_OZKNgGJ^(M`0H1H<NQmM-ATsDM*XM;gVD z56bxo{Dj%d1u@ACI9VFpLEv@Yt+dr|QDWU-gfhSu^u8Q=afs>Z0-AUH=MOY=P%U+n z32A>NC3F|v=R*vrIg2j~ywWQ~cxqn|*f0BL`+jXXDsjqAi5D50ahNt0Nh!v9{b;m1 zIBw+(h!h2T{5@WhGzWZ63ccn&l5OPxSg;)2C0^VtM05Leky=U-YPlHKkd@}5_TP@^ zzLRMkTJYs@&e(o!Kh`o{VmTv_Z>%=nS-xpMN15*(p8B<%%!2o92R68%I5sTv6cZDC zTRm?*La8{F+UA|jmvON=#W7{H^XiO5+~(N7fkWffwumRG$4mQ0uXN(2rP)Ejq2kIV z$j6boQ+C611CGH`0^HqKnvqVzOPZg2OSA#CINz*HiK6uqYx&;ywsP|1_|SQt<X)tl z9r($5I&%j{?1}OcG|PAGtY-5o-ljM%_$>sj<-atU2t8>#;!$A0xfxhWVKjVSdN03* zk65YN*s)O|4|xl6nKBOkE2+&@H6~c~Ud`F>j%@SK#VBf9xW@U-U{jC{8QS-KN3OX= zcMMl~5_k706^xwi=hqS=a|b+=+4a*+3Vb^pzLrdtnEjH94Z3P?cx4)!npRfP?>Sk1 z1u9()l{LcV@9LZ6TR3X9LZRG4j@$5$rB8+oxg6Fk*T(i^E*g@uKHM8ym@RL{GvtKg z!9&b`%pDjL`;A07TGdq&a=OGzT3W+~#?N_o57k4O+rD^Na?`gR5m5f19y@gTaWL;- zlGZc_F`S{bl#mv;ZME5VLp>RBy$QJi3{goMZNFU4Ii@}kTgdhAFu7Sd6C3<|@$=wU zgM5zH+KRO$N(OcLxpfsch>jJtFKFp|nes%QYD0*0jqF(J(2-jd9}xWbkH4Ky>|`t{ z?o@T4)yJ(79hXr6zeSC?_bb!P<vs5|C7EAwm#!<`FAFUwN4l>|GK%+y`s>ilUt^bk zc;+zE{kKMP*qPJyIK*1^>cFpRq1MJgwu>QFUo4y12qM96v}Glm^6_kz{OV%7^XhYG z?3~fLO(?1;iy_OWQbh9rp&Doe4;c(5qrO;P$cL(4x14Xd4ytrJ5%)XC%}HEZsg<}r zUn*)dw_~z+lNls$spw3ZGVBF>h?x&blioHW-v#%JanG=1-!z0QDmEk}H-ybf_3Y(w z^NX``&{`JjLi27e1Wk>{{v~I%d6OY5V**6mM(2zqBnQRduq}ie)b2VZ_HpV$QoiX4 z{pEqwImN>ABY!)q9PSM(z3{IKwJi_h;zp{{7PFhbcz<E;!?AC;4xavQ-P5bHUJU|V z$fS8iKbpz>$-PWHbMfY5W#%HF-j~bl)9O^*ho;)?s!usdS;dvJ(|Lqc=8Nz7K*j$3 z`8L@!9~W2;DwSIY58f;^RW7hx5k~o0KDxTr_qqEuUej_yHXgPTeL=`mKu(!Pk(Rs= znV>mbSp)yeQXyRWjyJII9sI{TxB<6G-QDS(E0#lAW$j{`71y}Hw~;*ztSfr$xg_mY z1ZGlVrIEc}L$K`J;_%<O18{T`qM6S+lc8dok#N&;HoA7jx6%K(Fn%8=z2;ZI{B(ct z^Wo&f;}J0d)arMvKzM@qQ{_2%)0}R~KqAx0Wjkqv&51zQajw*kAGsL@Uj(H*0rCS5 z#v#r55iGU>!yBott9T8;G5GT4%%^U6L{qtkW2C5{06xV^a<4>?hXWqO!tn2Iv&k`k zJj{x?!#g+AHT(j9^4EuV%kIkyBcq?{;5DwTbh7#gXG~r2YN{3*Ji$$bT`9p!i`mF2 z|NN@jdaoWAqWs9Lo0Bi^8KWd)o?nXs9L0_xOMG(XCeHKTS1@<;Ycah@G^IS;);#)6 z<oRq7yZ}pq8AwT3k73r0#}@%pgR>$+zggR+PGaf)pRdn|95KVcV~{e&Lts~F(@EFL z1Wbs}NOkZZG!2ONe`xNC>urHkSn6OlASt6%1m!8!|G6lf>nL5XUY?Mot4dA!D_yLB zMjFI4jbFfNt(IwBLm$Ct#Tyz_Pv<u`C(p@sR+1bxMjWdkJHTrj4u)Zxb?@-$W5Wb) zCrTv;TO#g*U5B^=v_c^BjCpJP?lZCPEktc}TYZxmSs50upX2X(q^ZJDV5h;S1vt(T zNEMx|Ru*7<yTPsYr%N}Dh3;u;`jOQ=(D`8FjbTw8-gzJ&tr$)xAH8sSv#CjV-?8ne z2YY<@8~ccva1lN0az(UN_ACG0iKa*!2wd+hLV2=(m}!+5>Jl(7jOSjWG!zfReQ4bE zfO1@oJMF3O5L4jFygXmH+}&KT!_gOm|HiB}!c@P#F`GwpPGUhAj1!T;a`cODS;DSS zO4kere<>&o+I<mmy;pLLeC{jeiya+`nlHld+&b%gUyI1Dz~ChMmVb$AjlaSmD~q2y zF-Eh?J03eyME<1+m)mU?N=;EbBj_6?<2MwfuPDjms0<5xySQ<0ezw&hDysNm=Xck7 zKt5P})nG6~#B`hRVfXX#NjB}z*KUA@6r0l3gz@7cclFHnjmKg>+vmxk;i#OW77<#N zYgLVbxs$Syvf#(d`9m&(%TZhkcs?!7Hbw1ISh#SPN}HbLjJo#M&-w`w%m88`>M)G; zPVl{SQa<>1j2%X(-NS=3%b<nYAyAcI77Ky>n#<3snef&NET=E^Ru|J?hNMtVYcn;Y z_plD-VOd<x!_D#MU~&(G%a*UCQg(T*1smbVB)T{}7bZL5cjX|rod0X{I%=gP!Q^|3 zwDiGAD&wHQ(A9za)ZEE#2J)E9w~EO!ohsg=9wTC<o#lz=nil+wA3(Q+p2>t8yQXh~ zx0{{_S@nhPO=@h_?YJ;*ozudjPY51L@DIPcy}o!J6q{Cq1E*c-&*02%^#oj*P(2g& z96LmnPkh5(1o%I?$}GWJ`{ve9yi?wCGq2B<ebdA7ut>y;x3iX;TKV2rK<wt%&kurW zjnn1>Qg?(Q4aD1K6ZlU)ss?0IP?<>N?CFoCLmyGON65~svhQ+#*`2?<x5P6_M9L5S zI8I>oU<uoE{AEqRS5NWA!m0K%&O@otQAi=KbJ4UQ`}*0?8`C)BUIlE`pVUpC+aV)Z zkVItiB!4Iv&p;9%bFX>HYZKpEI<eAsxp|5q=w;jq+}y;8X3DxWZXD$sO}E2LZnz$) z7EM<uS~cy>upS{GqwF{9naH(_gDD=R@*$|M)G3hD>w|VnYpayQtu|`qRVFf*RCGD> zOg@=X<lF<6<qdL!Ul|3jq{o5ImC^8m>Ds;bMjyOOl<)q^K@)YgP*+ty@xqGz)1Q&z zj-^Y`@2~nkdSippa&qnNZe)zF-*_*NJ~e)W<y_Un!2S)7_XDt@5K`L})3nyAJ!ACB z2zSEw14vT!p8nl7!?DFsn-=FnE_IrR+&**tbX}A1u4RZ`P3;{+N1J&_!=L>ldB%02 z*>|}G0JJi#`IWRMmTKWw=MrQf^NYzWNuc%j^I~z`LO=q+!^Us#XCx09@bE|QD>3U? zQuCJ#XX=_o(i(79mt|I=9%3o;@E;cDu!X+9AoAY){_*EeUX^c<+<R$fq<AG@vj4D6 z*q3~mU)O2FpV_@LkHvi>#$*TK$U5Es%dP9$>%Nv!o&5|nA^~|*p1k0Z#ar;1I7!R_ z7Z?)I)LMeA*5;)p8IQH+KA-(^Ft|IP9v0owe*f%_{yH0(ede2E&M&ZuOh$&9Nps$> z$>@aMV)pS2vnHAc@ZB#sBs`p%?wvy}@H_)KIsQe_QSIvG;|}H*8&yO4E_$K^<cI2W zm(uaGJfY#)gTsVCD8tWIl6OEIJjvZVyOp$o$M3UJ%_Rbk*EbK$<gcAd1V4@gbm`2c z&nO_E1uS>pQ2KYuNz9~b(g)!*A>P|X=M+i)F^P{q)V=tq^mxc3`ne)#^*$~v30w$) z=6)SDve-8U(bEhDJe%XfKOAwvk~&Cw?pLwfl}Y)qhURu}>C39yFz%z&F7d`;MT3Pe zINTcGCY-@7>6V55>Km@W&~i<>-DAQ$(jnwj{>53qc_CwWwz1~zwD<Tm#(mfDvo&K- zj>?G_JWVh3<7Hd;k&a_K-z}{^8S-G!a0VsY0F&0Hj6eB|?f%P2Hus<uj|p+GM2wCd zcW;0(I~Ys_OWX9Id>E<A-t6s!V%&K5R>P@KfqMQkpC<=Kq8)44(G^KHMdwi`CxKKL z1XkNV=6vxq1(|%dzG;$+<Sziov;R(mlHYpJjFn>EY1DBGpZx3&<%*0$WU?`jYax8{ zUBdYgL|>~l;0yaAiSdOvlUT+L@_eM|&Wy9OAYiUXNx=PjXBxkncT+W@f^t|*6s?6% zNMk<bKnAnCp4WM;uz)!ewZboccRzZ&LP~~v=myDL;se5RU2!y&;S%Wvi4qBvWfeFT zT40kp-d#+y&lIlaU5(&Bi!>XZ(889~A859n@q5oEu?UCIiMX_A$2(}v+guBy_wB(i ztldqCqBn_G=vx%vNFt<mus<RF#!R1kSm?cn)xN>+o%xSU74Gn-L@*x$0?AvLTwtpD z(HNBXho}%3&0#%3Q14(%9)CvO$AtV8AnmGPe>|Z?Aj(FN9tTbPqF`*{jPT|VlY3vN zXHOl!_DPd(mB%cvg3=n+<T;L4WdFx21#J`VYy-x9;_gr!jqcTq|5tX5IO4#aY&G~o zmj7&PwZ|tUVM#muV*yTu112j%<jf#Lb6BuqQ}0}ju`9Uv@q{XYC^>;XJk3;c2OIhD z0wGjk*kpBSn{>p4pw$fOM=28+O<*NJCgP#E4}FrIpzpa3lyL(6wsc*=D)|4XF$mJ( z$m{Y9qvvx$qq+er^8nE#2+RYcn8M>3pS~qQ8Eist>}PBl(K^E>@}9iM!I*#qM7cRR zSnF=ndp3o2v5FNV2~_rLo*cZAU<9RpLSA%!gA<||c0+ex<3TioYH$?AK}!^I4!Reb z<JU~bFw4Vy-K~CGbt}qoj<}0OJwbClgQ3Z@%3_w+N~s?=A<6hDH)X;&;SO=ocy#Xd zN^o?LQ;~N7QE8rj3a*#$Xu=?2JRO%pcUf)X=G87GXscb>QFxH>>4y?LkB8<!$BoRA zY~Amo@7oKL-X<zAcHQ*j8_E;R`utOsx$yHHY~ddS&6*?Ck^$SBAL?gqwBt!ZSa3B~ z#6gg0|8FG%qcyA#$XDY*Y@J=m3p2YCzu9NiFV%1NsW`PU`Sd6FteL{>bup=KkoTMG zGc_4+vK>Dv!xzqeBs9fRmUaG*QwjS#QJ|KJRtI;ncCur|gYMw(xzK%53l4e_nGa-2 zydyS>@wx?kD3TlhrE-+Xl^pxOA1@E?4zcHF1wJs6K6tS-ySval-s`4wo)j~DL7)UT z>5{a0;usn1jv0+ifI!XD``-gQq4H2XM7~Q&wJ3Q!XkvtW6&*}Bl<TmaY~r88d~X!t zD6LX@U?Gw3Sbb^?6QUB7Er?SuFWVH6gjB&?YEfBgiO%!>u({yoyY;=@;9E@wLLR)E z>BJWl0ju3X>zDYSelZZ3C)sD1Qb8(thwTO4iEi`R5)1?}rv-lYXkMyZ?1QF4*}^Uo z$x0$9%XTO+zG1Io{*AbaIBb8TuWKbl+BN<SB`E+)?R+OSn^&l7x*^LJCM!@G7~&YY zZyrI$$V6O*#|VWp#6L)KS;S7U*@fXS&%dIy=W0)Y)rNWXl22k?EMw6iBGEkH^h;eE z%??5nU(z#rbZyc5Jw7TUd&AZIfAPCm4*BO$S)kr%*j11O$o#QN!B}HYWADuWvS)Yv zgcRc^6a8LecNNC99eVJumw4}xlddjYodT5fO8?8WFA&w@<3Z90K6SL|O678|@K;@3 z5})xtn{?$#qf`E0mSF;}TQY}*p%=6^8df&=qz?%FW}-@JH#4xgX<*O>;Xk>{{>e@A zJwoxemsCDfUg4z^@M}M}^+>gc5-0=ILu1E7&_HgX2wzb5>Q(+v@()O?9T|3D+FT6m zYD==SV`-k$i6_*NPcjj0B%J?@#7c<)$6l4%`Hbw;4!YwZV06=hz3w4(=L*9ZYgE6b z;nGciY?ha6juC$%kSsw4O=|oYIn^lGg~bK@@V{;%NYeGK?5UByQOryFHDY*QJ+jd; zoo%T%)9o`-%phCv*?+#H2~N0)=!FaOvvoqqKyO@r_p%MK6IVx5eMVliC&Q2Oah!*- z{*`fb9K@YYGIf&cQ7Puz)-o(UnP5V=R7lzY{_|sOM55*}`Xw)ZSZNq*xp{yL?FDN5 zVDB|}ROklz7a3gt0&_MQCjuD}fUbn9VD2m(*gewkDICy7cZEpN_(E{(xs1+iC7R?V zQIus9=zL3sPVNa>BQ362q-z1JGHjo#eV;3FYVfxv!D=VA$W93P^y?_|U{uQE*AZU~ zw1mje{wZ_Z+C_raS(clYQk4qTC#0BpfuLBud}w2YCU_WqoiG6vY1grWg@Z{|L=pf? z^tY;MVpMd2p)qUNAjW1_60PmQnQhWl40^B?B=Cg$jN>Jznzo>8%)nY}JBdr3@jE1o zOCx)~T7^1T7H%uyuMB6^N0*$Q|MVmeCU_ir+gjvlX{DtG7XQ^ax$0`ZlxmI*mqP5V zWr!H>gm2?tBKvf=>>`f7g}?6*(UX)`33yzoy6BKgv+{>Z_(+J&wF105H9RH*5c--+ z%+(VUY%bEE(>NHW6Bcn}s%2ccx@`Ax1zN-Mc470{7!*?<@=|bP4=CZBTECVyo;!e= zT`T%KQ?}se_uy|9)cO_hJ^ij}T24eaJSV1m>Ba|=2_Y^ce!+)#YPd_V=zZ|DL!=x6 z?ap*7%wL)}^ELK4b%{Yf(UW=^88rMr{+gD#Oi7Z5=+bs>8Z#u>5Fo6dn~wirg0x#M z6wtfnEe%PoJy$k__*`VZ>B1uuTCpFq!kMl+40zl1q!LTp@2h|I44R|-AJrojh=j}G zfqLiz>2mswSzWHFcKMf<Q0;~^)LQHPr-sf|{QoKgqdqRofm9hk#9_Yp%2I8ifSG>Y z)g}JDy?K6|ZicBXdfh6Tffu5<GwnT^*}Wf_us_Sg(7X?wP6mt{k-l}HzD!?b7-i;& z{^0)!Fpx**q3u$tzs7w?NR?zIGLgCQ7!?wG=e%#6cP#u|EkEiv%9pKkBVi!mu^J<2 z?GS!`pJV(5((`8YH7-h$bgk#0w$`^Aa-|Y4pqYJ^jI=<f4n@zEPL16V_zagwV#;?D z<6X!JOGRPB+N%^KhWFTo7_yYp-nsU1W?IFXEnwvJ{PPwg$YQy)2fX|&M1Rw$CaxB8 zyI3i)GD6VxWXrS)xLvqX)rRub1P?w=HSAivYZ+e+Vkqs`zMSd>{W@E}Y^s4ISL<ED z(0LABHdla1Z&D~3^kYYXEMkP<<beJ*Gk!lkYSv2GPrGz?QCZ=SDDF`zXxOwwc%WVJ z!eIRIPI^f~z|Pe=(Aq9If9g11y40-j{fr5r$<^K;B6=(v-4&Z1FL2XK`iq=Bq1U55 zz)R4`I%ay*y9@k^iyNyCu%_1|^5}8D`oL1+glw4m1#g@OA7KL}m!bXqTcbe+fIfEL zC6#Bx)+>mVl7*sFv`VvS7MCb?hz8iwu*y5NWs;gcWX11@Z?u*63``s&`Ng)d{yV*~ zY#@hQ=$z@mXCw#u3>eh2=AK^hY->dsTHokUdXceLTFyx+vJ`ty+8V4DfBhW#DVT6E zIKamrZeE4CMM-<!kGE@URO<f1qSWLir#@Nr%hWH{=2O@ENTe>q+tMl0D`GH(Zn+u$ zGz+$|bjSF3h1`{C_;JzrhZ9CBgE+mM5Oa(?hIvuEc+$q@8?*PZe0DY3rP!5uas8aP zvFH<40s9VnHUC2sc5gs<Rr4=>#ROxbHc>QN4FQkEiu&R}lvb}i(~>9sYAcpaN;iOr zz#TM_)EJR37iRV<%$bAYX>adph98Z0`Bo}6U))5do6-ouAz7Kz<b=8wKR-8#>nl@^ zdkZ$f6Gu$OMvMr0baTW=lJlttXCxbqQpF=7v$;rLK+cy~@s&r;>R?9x)eCNy_6404 z2@;u_gL$4!7YS@@ffu}6*~D=PdJdW+0=#HIj1<wp1cd6U&FbX6l7*jj&g{!oLlWl) zby35Ud}<PU@^`$Ht7|E;Al=~A7enbZWd~IqzfcylW1p+MFue8Jcru`PGi7Tu9n5!r zE}|PT>Ce%e5q-j&<$*!a-IDi*;-mvoU=ER6V?+NWQ`m;=AQRA2PDHlY;3a+W=swEz zU|YhPwZ!)U{581Mq6J|YDsqxCNbf^@2n(=Oc?EQ8a@egk@6(WI|09XO{QCr9!y`-- z3WhrO&RxMu6>b$d6~Ihk#&D#6YKy1EMHEC^7Ln3<>COSFgIb3Nc^<}&bC%^VNN^N) zvEDW7gyQ+%X~oOZ#}18K0RFbRG$WQRNkBW>+)<u7WKG}O47WW5C)gcmTDH@lS%0ql zEk19!&9z$Zp+kSEW7XnS_TIbl@C(t|yi{L7VT*R!*(cUPA(ES*cSw)JjgFpMeQMqk zBJ9bXUt9X5XRx4w0O^%<tWYogTqTqaU=^~5U;cStg*nWECJz{~$q)}31O`@vbmek% zHR5KN!u;ZE1@<@=R=sXCtm-9&v$Z?7B~>;0qZm|6Hq?_emNI%1zC1DJRH`{Y_wr7y zDJ>wY`mN^DV!_f4)0FTjbF%*~-M9QI$!7>r>11lFDzTh<@cR{U9peTJizv#Q9^$1P zyY@`tJBldRUJGE6B&V`Xw`c!SOlP!|ZjXhY^P6vA*?F2_=dA2}39Y{yA*%QsQfVV> zTq?157*=2JT+>vQgY=RI$AsuJ3?M?ez7?7;&KuD2N}a=Y@^785k-GYhyl-_0KD5Zx zUH6~+ge`5@(Dm=<w+p3N<qYab@TDbU9ezMw){VA{2PQddyv1wz%VpW42>rn<SwfiF zU^wB$FLn08mIK(@;&#E)HsK6d^eU@!qLit&_nu}cOow3?E@RK`{d_w!@yGcR(804l zK4!9p%D%gC*4a!&@^g&Wb%AybwsBv%j|s7A67GS^8Uek{_LTHk|Mf}~a5W4B!MCmX z04!-UlC@X+Zvi>Z4a>ivmJ&9uY7RO(o3tzvx(>;{;-H!<n1s&A*3%!jYF|pL<VJMt z?2*G4UNz3rgVa5uUw(w>cbe!1q-%|Psfw4Ldi#1bJZjJ!?vRzbvS6^idVO8|{6JQ! zSWE>>wwBX3>-JhBJYi{jfYN^OThS#8d>mNua+wU&MtG;nH%hG*57Ni_R0@N@fnl!B zVG2WsEgrMM^*w2~yEmCseZBy8V!r4FZR}d-IOI)=R^ayqmTIEhL|}z&f|_&&2MF)& zpuq+Q7g4}jy&ZS1MbFfbseQp7G9RVsgXb5P?_I<LKe!8SthP3gveNm<<(xDA)4uuB z!EgV!31lut=!(Q|Tu2kMG^x~9)e=?}UzRk(PMtlqdI~6NBSYyqtnD2}di@1#m8j0L zSeS*v+3GF{03kp3KF;YYN&FY=CZXWP1f6J2bg#)u!2rU+*@iW#Dypl!XcVw>R}7~> z?eG5jDal93XYi|VKOuOVjIN!VPq&7l{L!Br7~<o?{MR&4&I)u#veQ;w0V-tJQx{&m z(`0g&T%V0tT62^iF_QB-$VjEu7lym4imS06WR;6uW*~{g5rR5deY}C0vV{DNv8M2+ zhhk)FHZ7uKq5i8@`)@7*<8NYBUy5Aj0F8W0kJWt7x}Vn+sJcAW>slR|GVb_Qvd59L z3fZ~Fw4Akf55Qi;JV{1=FXycw%c6;d)z%V)7;`hT#}QZNDR=t<3=rQl&k>b>f9{QY z@m?n3)AV8UPn>d;JFoKP9v9=ts36<5ODKuY{^nQoOAB&X#$NTs6Mx!);hD&Zv7j>+ z=qY?g3gOY#8%kmBUTMnaOfn;uZX_nMbyXVjWCPU^$xw+&4i}j<WMpKyY2TtO1Q>gj z9W0GRdg<PhXl)eVsN4?T>~8i?VTCzj{sU?->8_rAR|kU-2)~)V?rfyul#>KZPfw>} zHr-r~moMF}US6pwf@W?ij*$R1Se67KfeN^eqzacRfDODK#jj0j@vh35<pC%s;mGwR zyzcM_lqY&zAs9E}>nzeOB`f83Jpg-0S5ybT&T$}`P(kDW3~A`87d`0(GXeW$NxPii zS9>@hn1IhVkxz%_70-lYn^}f8x%~ny>$^99M5uz-!5D++>pH);C7`t-0860Ujen5m z2JUebVS|jhlRQ9n=6eY{ivl^a(=ock{3S9XblZy)nGiQ2z2*|F*GH%-sOHFGh8Z=* zdOdL<A)#xK1<v!@M9Q*cG?WA+{Si<_f&BA?bo7%2gOyd_pzLv_CRp4THn;1O<jtv6 zJZm`|LEh9SopRIdn{dp$lY_YzO;<|mBZip~47l8@BIi3@kMY2CfI)gvf8&A(7g2U* zg>J?9^96|w3g8tsJAHCwx57f74n3apv?1L<a%Ra3A!FKG^7PN$qC~0e$C4}QK@j&$ zaXU+*a|A80Ul4EAT%I}X>Bp^aWkjz1Mcb6*w&Azj0|xsVm9;i8f2_YRT6SrhQU5ur z_B9&x;t=R(Tu@jmhn(17iUP&nZMtG6l}ZxDl@3a3OKiV|(73}tGqQDF)pxVfcA~du z|II}AU4m#c<@@`&M?GWAbW_oie1zEg(svvR{_?%f8x{cgYGM~(i#+((=8@IxsUNYa zp7_pFk*(<ro@SP8q&bYDH%T4;8S-B><>kN$y~RCRKMTv4Bm<GYakaBSAIV@)0<hVI zu*Z934{1@^3PsEW(XENDWcD4JBmq17-n*1I{d~IGN(+}BcN#w+WdnYhmgCJMmBZ0z z?Dj$<OOws9Sqs5%t;QFC*+yix1ANf6njBGS1*jlVFYo0t?vj%s<69r0oO~vS6Q_r! zxWa*Jfn(kRXD`dt;9AeJ&||H|q>zUrru{$b43z2i9amznoH7?-%Oaxxe*23>tmGDC z#}o~=QiBb?i$zaiGC+bCFi1(R>>0v_ARd&%F*6ui<21!%o?mJOs47e%zYs%D=M+lq z!e)6%yw;py^_sW(Z1<Zb{(ilhmrFBMpGAud5A)NAB#~?fRHRq*q+LnFbXK^0r%2vz zbR^?V03)Q4XgC4m>N|8Kj<~K=L7j8iAh6H&5tLNUF2oMCFVo3MS^ELai_r>}JscYi z9YS(`8Fyl`7h%_xE)`T4GdC(ubojnNkTrh(Ffn6D>KS%hk;aBr#Uu&ue@n`L%BvOj zWJJZw6e&6A*)r3Y|MU@{*St-y_P!k48}jN`xqdgsJyOIh(;5hI#H^PuM(-s(7FWEr z{hku<MMRy1s>k}z;-d`s!F;k(CC!2+-%LLtQ}|T_vCQ%!U!ya$G;Bc;P#`w^iqe?} zu&F}=^&7L`q|(#UOHhSNe0r1E6#ow~{e<jP0Rz%>tGc(R5hZCv)ui73S}z#|;cCo? z%GV!GMeF6U(Ob~9w73aet0imx9DRY1Jx}=8-97bNTmx%__!QRMj|f9J=ccwZq=T^W zhlKS>ao@ZodBS)w^)xe=xd!|ZTUbNFv)m7qj!cyL@zAQ1%CFg3kh4t*!8Oocv62$N zl|Kj0YDE@KuaV0}r8iini_KLRnB^E*VIDy$$Ea$(6c44NiH3PtH#?l!O_$HaEzGdG zTwumq$qR#2;3geUH!>U}V{Flg)l2!?x4RI%hgevxtMb-&Mh}`mcFG{3G@>kd9sVV) zg29m`Lo^6mIttH0W18-mcyMgg)S!ps+5RG)l_?8vzo6`oofcms#_*_f&w2|<!g$by z@Oy^>9GWDYLl^{$5xN0HXVlX;JtY8mJ*67?BkdVD_%*`Z;MB3j5%5Bm`et)y<8f7t zVIV?x3M-`%gA*vvpsyECY_5Jg$WUB<NO;Nwqz^Qv;iiC|W+J<Oni>{;`_7H98RaAG znpSzNCr=>CMBoU+8^`lpW<~H2EDr{@|0v?yIDo!4Pdo|!7~**<fq~GN4b;8;kh}|L zVGG0NZV#+<jMPLUKx?P1ThF<le?i8v4GX3b`SuAAKI?crJ#WQM-l1S%#q32!4lh+D zr`obMDxJ3b?_qT4^#H9n!Zge69WN}te(X}g?w4x-#;(RR+b7Libe-tqY6&bw+XC%U zYZ37i(st-0NAFD&YhG~_)g_b4xnnh7b0hlDct4j?Ady+##=q;(VMGKxpSBU<iR&-r zR=6#YLjSb}Hj()b<{^ngc|y*o&-d@K+=!s8>d|?*{JIUQm6}J#iCuq^)!-(T=j%gg zd)i~7Pf>@1=^`(lqgIXJ)4WA}Z5zKGvyM(unC}%^9C6j3FtAc#+&Fyd-J>plKIi1v zPjy1Yr>{ZqT+JF`N?EY9oKf5H68}cDo>{B&lb9;FwL71E8r{d5yvaVQ_3nAfzlTWz zb^ior3u8|tVo0KNjQ9`Xl-ijK@<SuvU08;S0Ix>_OR3QW{U+QS>r~aR;-F&2Pv}cs zSrN3>d;R9B1V-~%>bEh}gAO^u8BvUwZjA;AgeFOsb&}%shjKP=8PcvFcDN8V0#S>9 z60`l2SUIijNgc&n8CqZo7iRh|;wr4b#Qk-&*O-4oj89=%nf|k6oQK)5CNILjg~v>Y zywi;{49>%bprC}64y%9U<{$1CYO+e9m3hoJDflljq@!0IrK4`%J=!{KUczx<MsbW$ zXZxa~1|I@GQl8FZallKv;jv8fCJvnfzK-P&Zr@VcmHK;P<9(BLGaR^|O><fBQ;klu zspznA8E&v%A!ZE85)z+0$}&!kZ-Njr{7bx|F9<LeO+oa-LA#YvXpo-2tH!XT0U5>) zu%mq7-kF%zdIFW7F7;kc43fW9W($i#J7(SgI40=iS#1dZBpvuoqD_vlfYEr5#4|Zx z84W1M&O{Mx0vFE7jNq}1IDJ$vAN2!+w2S!}BZq3qrfZ5WdLwzNbvb-pn*jzRR$nhF z{dI_p60p}(gG-csNt8f$2npyMMi_(KR|W{~bK}mpRxIzws6dCV>vTv@l5my{;X9+> z>~zq1q8MXC$}tkx4in89b0>U#CPUc93@81`L)ii|z31sphNqseLtM|M#=Ywo2?9mH z{L_CjH2;%<`=3b!<7!n;H%%Wgmh^W05j!Rx9;X9;0a`xEdJIeZYmaX_Gctn?18(_1 zQnNgT{~^$$2Xp1>L{HG&{!4Ic@lnM0K#d&kXq`NwuyJjd?epnBTxieLXQ%R@<kP44 z=OS2$xuBW6G0KwOCJM_-nyYboFdAmP;-(<jdo5g&Qu<Nh|B?iosgrd2*_&%KlcFL6 zqWc5ydpf+A@I<e#Jv~%E9Fj|QDSU8Q5VS@^{aNT`S3lZWgZ037u%9XZrwh`3veg){ z)A%=V@^0DpzQYC_LpU9u(UC0wFOvU>09uQ$l|s6{`GYDV<$=mSdLS%?aR&LoVmJH$ zI4N#F)%qoBK2P#bO^yGl$qY@>6|YCi`1z4zU37|`^_xG#gg^Ma_tw9*FQK;`>Y2_u zP^(-(^q(#?IQ<6mzvbNUKc;lR&uz541O|GhV+0d*+3CQ5#3Wl}?$J;dHn7t(H2ITI zos3_mn9qBQNxb(jb8wBl5%yD9#^}=2bx#T%@L_X1`m3Lh%$`??g@x`|d2eV+h1VEj z9v3f5HS#1Q?S=%unt|BDj1!1*qy7cDJbb|g-lu2+c2Y7Qk`0AuBW|1nS{v2Jvkoj; ze73S%41Q_<o_jf8zc+s_<Q>Myk8b;{um6kqaWua->R@0rk>wC&jKx&YsZufgYYNkS zO1Z9=p7#!Ecj&l<kWK5+eDmKwPHatbq+Q<ZxDfPu?k(ED2doI2_k4_RwRVgm7&6$m zQ(RX7$dkA<wHBY#x}C=eLp}*r^BJ4t(KNAq$l50Y;Z<p~Zk~UH^oXE<(I<*KMtQQr zS~*W!ymf9<;9FiFkhK|)R%QLr)Cn0ruKBgeD|A}k=sj@<H+vw7S+@!LtWs?nY=Opg zq!&iYIg;DVcAv5UODt6I9+$!EP>qL*nfy$*ZISD_@r=v9`eC)ZiPFp;0O#RY{AbQM z59lMPK!^c&VXrl2JU-k_Xt0A7p+VFq8*n;fpSD878FQrwXMH}2b#IRjEm@Y%gphg6 zHT1Rv|Ffp9bdKnl6hc79Uj=-6#f1<lkMhvTaB2~cV7o#eS~7PUy#3dMT*M)VGdW3* zpxA_sibH-TK5qfc_bC$niMFCcQnfBDQng>RgA6WZgnalVky{#u(dM$x5vVstc+b#h zuKrUFEg}Wi+`PQaxMmdA)o9c%Y1J<I>TC8{42S0J;X;4ag6p0SA6K0lbzwA*0$U2% z8vln)l=0Bu=uPRr=SL%lKREf0k^RC1@k;$aRDESsTiv=fQmhoW7D{m_Uc*WuK#RK< z4HPTx9ui!OYw_X~r?@0Qp;&Q;KuUn(?g7G=_k8!9d+r$dkw1HnwU<0H=X{=ZXiW*C zIu0A23XQQiXBBgHQ518I47~a6i_>?P?e^F*YiaJn-{#7mk`e)+2yDIh*8nJvt+?X| z8*rhG^Kfj$2MF$QO@~#F1Za8{P4aS=<fTO}zo(i3lJBMagTZYZ@ujcpXF^0#hx!~$ zuXpqQ*^Xq$3N{DZ5J%hEe%;}H%tw4|5nbUp{?XkHdH)+^q5z3~d!?AHs0QJNHoI^W zwm9nm*`W|tEcbnV%;NwsvZ5mGhmV>;hK}3pT0uDdahS4pSj^f}*?PK!y=!(V7cz`_ zn4NC@^GDeLSJ4Z|T`dy3W^?&}1_7`}@=Cm70g)YN*Si?i4Wq^4PIn0PO}(T2=ZSht zD@$7-?-g?NbKmr5zD={dBv4%K3>`L6^aAKUL}B>zD6HR&z<<mJ8HSbqnY2+LG^vLK zb)*&!s|VaxFtznaaDZvaA=rHZiwv_VzE)9F#lM5tD*y@|2wck^iK`n7t;BPkVQ}Ao zMR{LG3Cv=qO5+nGNsNy7{jzz4+q=sfMobk(yk-(*iFH61x$Qi!W%`4Clx8YC`8S&V z2a`g_67GjrH<_Wmm+BA9s_*`>Ed6pIe$W`#0JSG^uFpEu#q~P_+-NMmv}G(qun4M| zdzLBWi!->T{tD$vMAxoF2Aq^k`T{ln?~xpnBUWxqBa2U2=zymRzBf1@Tl0uE``alv zz$hG+4HD&(j>)ShT8mOiE5KwI0fp#2)ybQ$|7Q?VAkS{9#hcu)LudU@*h|6A3crk= zMF|#-HgmvCX#w&IPpbPR9EeNXMA;-!S76<vmp{OE*qE$^RniDCM9-bleRkR3>3J06 zg>zs+f$##qBYX-<NO*-vI%^ZMeWyr3kf-c=T6H5X`u3`pAOHlg!m?h<`{(4lBa=V0 z`SF{KzKA}DdP|CzB)`q~VHz}6c(sC0w8@oGRJVe<@fmJ)o$VDFqAb~U!IT4ZSuGRv z&IP~YYf6^G@T{f5@xJHU|CpeJs~yAe+7_BDMk+mVR}tShY*gS)W#7|Ffk*)MM`sCw z7AByVwS({NQ*KYfAVR1#Zqb%x)6X0QLrA;U4F%7aohxpf7faxOd~gmW6D=<RoXV(y zFvneqcgirUGuX1DP*D^x!M^01dS&w~HJ6^BJ>IQLq8LWK((m<3p*z41^2?7M3Z(J< zT?xblyg>b48{SlR_|JL6x}sMtV+Qh*h>77ZHwdo9QPm<+^un=K>93D!WbEam9Qc<_ zIa@M;=iGPH<>MHb1elEV`jF|LlSgzM+tN&naBEBZHg#cy4D^?R$$=PZ(cWefpMy7k zU)4{o4XKe(je2sGhh+SQ)74y%*LZMo-zmNd0b_EwrfqzTA&7qWce3UmDZxjNhx$&^ z$Juj#0ZF@|;gY^I+|>o|KFs`#t~YBv3(^6p^R-wFcS^ZIQct~oX8>G>_DL7Hg`o&8 z*O#-}LEb<x{nJ~`p4MER<D8ajWa=~I#sT$Z%GF*C59Z7N|DgXN;{T;|5z-yR-c{^* zR<g_vZl=DkczpAN-!4Mv#E9E1mbx{Q-Qh&#w!>L*$6t*jJL^Gxj&>Bp3uDCwCz^hA zVq;#)9il_R&aE<-kKGf+d_1dM`z=ti9H5C=^mx|z)-!vI0)r`;@>i%NSZJb#5)pY5 z=`4EC$tu}*C!<d}+KKb2H_uW+d_u+*FzZ)R<5EqKoO=}rj`LRnEv*V@xi}}ik)q)O z1IQ^6HHv{>FUc^eyG=IPpB7A*Pj%_?mJJ$x(*g|L%B!R>5`z14LXF_>h4LxyX}UVk ze}|rEuT_=a5Zm~FW*rPsJYm+wRivE5T7s%g;>KQOh9KhESudo2X+mi`HF!}~Ng zXj9Cd!rsDbo<qv;+@HE023@rp!F?`odH?>wJpk5ae<f^b&Zg(f-u_0XNMC73uJ}L` zp4^K)dx*PQ^Bv7z2T(MN_I(lnx|hTLyCTTf6$$JSBa@V*gtf)a3}uU1ku}bD^1J<5 zY4>KDVOiK!+#z_DQa`Tb3W!>L_Vm`g=WDJtl8clxKU7*L@a91^_N-&jk$!5lKQnr? z31d>8A7?1uH(_Fyw#Yfy!{;qr$3<t*NgW34meL^q<m@JRQsp`O1}>Qr7^q_US>iN$ z<E-c;nQBO#lt%56TJ7>h6#FC2V-;!?uHw7Yvm>kBgE)3@pxT`x2;f%6wg7(^b%=Q0 z1-}Wy_%tDT(3Zy-YMJV#9uJgQ!aX$dT+Q{6{X1^*bIVE=?wEJaw{a;V^IFE;?6j_< zqBgj~#p-hp&0B0pB`qYTu(q9?BiCNTakpAgiBr;n{+PW-?ftt5@z1F<K~{hzYI8^O znR}IHpMU!k{`mSUFFY#>*bq@v&8~=fwQFL^RZzwiG@&+O72M)dAHkd0(ybDr0GHCm z?d26*h{I28!Dg=pXan5J88FZx;!raX|A?5lg$<fx1^4$Xk$3QVL4M!#wkn6@#JF8` z{?S8+R>N;+&jy!v@h|a_n}_U!F^ZEBPVAbqf|OzhYjlR6R=5F@DxwS8T#P97aYxG6 z8NH7Rq8SI?V6kU!<FnS?(U>$~sF*{#KE~JEm$WYOpp5CcPUc|jI7hq*%W4`>%d7F$ zi-)`A_UfDR?J^O18|XcnWA~<{-gvlz(yfBZtwvD`ko^}-u(#7W%6E)XXe!b_4*d+L z)-+WHgm;;Jg&VeJ5;pba>gC;F*unZR-GFubi@3wfH&VD)P&_zA9^s#cHY%USXfrMB ze1JJkAZOB1<d7-J8wJ6YK6dgQo<{lubH`+YqO+7&NwZYP#aHKAC_iprXv*7}94+e@ zth-QInOjz)JsJBm8T;u+loC3kD^p>9g#G0T)66A7Ub18j2RrO5TdD=9<lW8zI>G0t zHkyU0;B3dV+{};0I?VHx^(vtI?*69*c(;={2a$pwS&bDNK0L3N3w9>{(fJbxOg?3% z#Y0r}Dk1h9TL(8Y1Wvw-Mc+{{lQGx`v&(ooB60kaHm3Wuw>Q3T9q-eQj<-@S|1Ze% zUjF)DP~fvhjmS(sSrXiZI9TuWRKA6TLv)*RVn_zQlBSmdq_{V|`Z5U$)<oUn*~%-s z)jw&yq;5Tb!v+SqYD!Wf1jPcsUeFP@#O_FW^n6tq)YNiQ(%j}Q->cX03QGY}3?C|O zT=t%jmvMa#=;Fn-2r%>E(g=|uS(6A9(HVywJ$nyy%Fm_ZUzOPocoDXsQ5_{HY5W|X z$@4CQjZ?t7H}5aA9zoFyj?wx)zIr)`2JLkmxlry}E(Or)t}a(tRo;J|+B2OMUy%a0 z91HcGFKbDuv|TaFG@+@PeKRYuUA-G<>rJe5KL%7#kL4E_dXJG{P4t6M#dzOkKx5j0 z6Mo1Sp`r@ghYga?Vf+RM@9~%?A2Me`$>+C-gTz>S7jbvE?mR0u-QoSUWdUV6euJ$- z*^~g#SD#Cv)xSF5Z`^xBIX+EheHwc6BdH`hx`dGEN99BeUm|hnKpp*oE>m6|`nd-T zyE~lo4>axy>&~Sl5<5+(ik%Ri_qn<j-JdpDGCR2${c5rxCdLgf3$O4kI11-?1Mp-1 zMdac7T_E&ntv62HUejk^!b9vX)d_shKqyY&FRWSid}8#wG*c-WSrG;JX!OZ=bPt2u zs^{ValrLl5WR<_+%Xx%}9+<S3E`;u(h|TjB0wf}f?Ux`06@ogs^hpuYR3V#(U8U~V zXv2r!$*gipi9cy%AEmQ~FT`DF^+k>4Lmo_rl($n$Dm-K;OZVx>@?3bm{&$LbyL7WS zwyHev>iern)}1d`48l%lWd#MSu;;-UiVaeXhWTnyhh6<Y$;q%iqOH8Ufz~9riAu?V zWgXaCTh8A1_Ts3qtS1V4YRA7meUEXDo&$t8RyfG_FIEdsE7vGL5m%VBmVKF*^u;kj z2=&r};ht9(f)n7`yIT|0jG(L;p>P_d6^NsAQu(oaVEodlJmV-W<4uljrb(1`Uue0^ zZN==ozQY7taU_KbmS2er1`uNtTqqOW6+38u?O9k!HnZ)b@4ED(>5w5=d*t&YoA>sz z**7YlDz~p9Ai`Oy<PT!{a1c@f<7Sae?R6IYv2_Q;{7<P~oc0#Vb6MBl&s+eUoywaI zv8QU%X?;3+MLGx)lGd~a@#^+y$Md}0AE1m<@y(yzm+PW<*NA*Fa^-fmE5d!eN*>=8 zX0*(Cc_!{(*sV^Bu1*sMw%5W+ecYjr{=99jRv4B&fbz8be5nL^t$0Ln5wppOb+C=S z*}vq4w@7-~#JI%?P`G~<L01?()UH}+v4a7DhnD=w4NnkVG;X!&lgHSfahkg<QH z{M~PnG{moL$4MMM;#HPK{VHLHWvV7;u<kGNn6pVeQ!%eGZB~5iCB=Q$#8jr!G6@<y z*B4fC*~d|mnw~DsA=y`g8e_BAt#0v+&^ME~+dPJze?0>=#2EW|D|_0oc4&3hNnw&k zGzr$0U|Kfa@Ie`WSK9!Yy^s(IPMJ(Ugb`UTFBo=fedj24YxSNSDTVCAYci4O%_f$C ztF4|G?{xHohN8%pdJ?e%{ZZ-r*t0+7xgEal&yjlEN3A07yd7_XpYJv|Q&+3iF>VRK zGrrli#a+GbWiRR7mg#xJ0{+hL6)oh~K)q}f?Hff2uxvR?AQHy9I})*M+1C(U`j)P9 z-oS`+Zni_(Qrb%}PC%A&K$-w0dH_#mP$$mHTA&3823!;roC_-XIr`LL=$Wp&9D-Hj zYrH;-zhH#@EnTVLgOIF41(1@AxBxdmqUT4PlEDa4H!l-qt+D-OdXHZhb>bs)*C-{y z0gXdP6emr|4C;P6!}h#Q9nH6c=S}7Px?3iB;QrD~^c#*TWAuB4S&}4BcfDtv)$ra) zjZIWtX>ZZ#r%~0Hwl&l@c(L>AcSCE!Dd(ivPxE0Hsq~Wu{O~M6<FBmQPgsnz74Cb4 z9gOqL=W^zH=dC{VEImA+dVWw<r(N|jIczIP>r7ckQ&5p2py&_9!(*|_uO7Ynu8`V@ zeKYS8C+6*L=IxW=No%~zNs+3`7{mFrCJ)8i*!bkD%V%;=-<{`QUI|+B-EzEsJ#4FE zQxbLb)Gm6n^7PiT)&e;CPWlp4$pd{ho*&Id-l;I6$Rd2TcJ|DtSFSm0MhP|CEpePV zG(#M-y5b?td~>X%Y6Fe7$ZY%ans@$C!}}bi<va_NL(S&QK#)sp0IlPfbywcs9&bVN zrkLK|A2|U~xq#{SbK&7)%YnF+iR^dZsXdKVTA%-2;gs#3Jq4!TqoC&}dMx)z8Lm=a z&}xsagW2z&)7||wL9pvFt>5u+IFeiFN3JqGxvI92Z~$hpz;n5NRg$l*P^{Tt@_*6r zo2{2xI?fMK3Y={d5v=GS#h(rYz<S2L^6wG*So+?PjIN6P{z?o>Nrltx=}iquk^vK_ zl^;l@w$%^6k0E@LU>^_ACnY~09XPM^fsZfpue(0$r!{0YC4xoIspuQNKx)QC&ABr{ z1LYsjz?UaZCzXs^?s_}AWX9s@T-AUSM5u(T9)WGIh~p7ejvg863br=FYcOMy%T#D( z?9ZmP!$4PZ%HLq_lx>*LLV<XEA;w3ON3ASCSS%8%_4z8S1;B_cB_3G6k~e<e-#XM2 zbRsjY$+DLDkydT#5wn+$pDd3U@i%r{IPrzzgi&wp2>a40&pP{!JhyA%<IZT?;>Q<> zE{-MQ%YG(b3<Y{SitE8i<YH3MTgA`o={Uf>%32?pw$UyGBtIB^2EFo2_eCUju`g9% zo<9Os)KEnv3roT9a3?W-a|TP_8v|Eeds`ERc1cIJZJo<rbp<7`#h@wHT}W*Tc8!ym zFUwP;nCmgo3<s3k%;_Ri-09snd-6XCUhhFw+g+jV{Og~v+IFUQ8J_N?lD9X=BgKXF zGJu>PJ3sj;yZjDr>Tg(mBlMsM@-hD#CE_cBgbhnAB>$4@TS!mYXXQX1)XURQ@{8mQ zzXa;MP_|{y8l8yT#NT;+5m^e8WTVwSQUZ$vm2_*f<&|@h_jOM$^=%$z=6hcLdS}%8 z%6>hoDT7;PosheuS*^3kr8>Q6JiWM`t*HH{Cq3sfqxI5#k|RWY3H?l`D?oPH5r)5@ z*VM#s#~px(MuH=P{h7hn3?rf_lJPlRtS7dKo(tkswcx|<pP}n}&}8V2$n`F_^SuMr zhxxDBNm>}4Mj^0re589-cj)!0o6w$}WTS{AG~8#u0A46Uk*CMCBOd(M{s$KIas`CN z<#26RaPzFVcU$)i-}OD{%f=M}g3*23%QOdx+xvALiHpH0FDc^tL6#HFTDRU>z549V z@qSz`r>0Ts2WdUfluym{af0)_#ZD9!v(cIrInO=nTs+gH^{t6?UOT4S%nPVDn`Rk3 ztDmQTtNIYK5a}-ku#nJKVA>ufELr^?uIL@UaB<$SziUn>e?J@76mNum;K*y3V6Qs3 zYE#_kNL>Z41A*PGvfL5U+vP7kh5yphTVwCeIj@Wk@}fL;7tqPgPv71pc#r%Z7;sSn z1vrGCyG{3<=bRXdcfV9a{$dpF(^ZkD4;Hp7{uJDDK)pfRqF&W^)i{T>_N>??^FU8* zgvD&#hsKV|Br;FlGaIHZ8lHEX3PGnkd-tY4ycCb7zLV2^<YvnBT&R1klIE$XX#?;f zg0C-tmu_FbY{aRC5=T1}#3BoMpM$DoD!w8am9Cipctp8)HnINlTe32{Q`y~kGOIkr zPgi0f_z%mF9!#JKkFee02y>Nw7qPuMJh@My(=7F~*yv|Q_~OMy!@gB-1T5cV*&(l? zF<?B&PE*;uUwi%1`pu^wCH(0vm5t{)n?;R|Ia|q1l-hoF#yKMuKcgTwqsti?^Svp1 zV@<i-+>PrSo11_CTG?#2?8Mi^%RNSJIKA^=-j@q_)X(y)hkIKXFI_@Lb^jNSOXG4w z_s6KxipycaqMBM2bo(*eaQzPjikdT@+h`!(pW=gh;GFIQMQ5e6%e$x>Od>$L=b56@ z694eAVFU0Rpa%Dh2d!#7X&2V!aufq#3p-Wp{;2iBSaX%VjmswX$_!WZ%8RU1t8$Zo z?tpC@L99<pq`yK{IO{`8em~@(`{g{{`eWcZT`2}=qZvJ?8oNw(icfjgRr@i{Kla># zjT$MY(k;ka2@^AJ6Z>LY=HVXcs7}TccjGL+BxzUt2OW~uqdyXAqOJ&pGFM?Ec`4Hx z>Y+E;;Q0Eg&Igr_+Uf2#Zpc%}_|3Bp|Emh7B;91T+NbYXg^YUa#qTmZjZ{Wp{D0!E zn&3H2a1*tZW}|^6-gWVEjI!k0%)_Cj!1q@9ovb>IoG<*2WxG&{DJNm48wF$Q1^nOj zk}Jh}awN4T30prm62!0AhL)O<oo^*Wb>5*Ob(^$byc}gEBLz>}u~@z&`BVFt)N@BL z7zpU|1AlR8s_|(OnYo5iZ(N#x<U2Bn@F7K!>vjj|43VWeJ<{}Wf6;e$@T@7v#L<3n zamCqo?)zqFr>X-(rgFv7mh5{8riO;Y30-{ZyDvAMVgP7AH*LZddW7S5fTKZ|<FMl- zj+iZWR0fOm?dk#h@rs8m*<Zr$)33DiGG@9Z>JDN{BQ&@bG#|99x)5aZyf_n`tXmBD zAD05T7IMyVid;y!A4@-^8|-T*QHl6)avA9j;NT|zZP2q5QttNBqry8?^sL8{XHnVB zOTpI2?4kclzeYuw0j=G^)}GFIOdz53#h8dvih|dH44@+oXuQ4UZ9+su+4#lS_(j>6 zYI#7(*w9$*;?8CP>fE8*(#|{6+OuS{!%d~_`@^J7WJXV1?!n6Dn^QfPs^+B)-(yW@ zFAe7<rz!I02;>gtIF9XiU4MB@;C#kzraj8N!V1_7=E3H{7vSEo_&!bZ303+Dg>Up% zL}pgcezZpCs4amYIMa-*>QO_2CW}9p#txP#mBwJ-%|ZoMs{3WfmcQ1EIBF;|do97? z$dB7Arsp^*FYv0!?2B=S;&LG?bX_E=IoT4-RqT{T`DW<UR3y%j8xBVJfzrs^K727$ zl;ws6^L!H92U9_R(>G0@n3-RP4bCFuiEZ#BOMwNGA0Z{Bgay4!0?WJ3-kUVA+#s|$ zne3&%_BfEKXi94P1Jlwcv%6DHqC62Qu;V8qIL?J~g{e*hO4jx~MsF*#wSmS#qsq0U zQIPdGk>)dYUUQ%kl1m_giZ0>k$z;y4(*uGo^Jg3!@2zTeRE!9OFxmK#q1nh?>MZtk zd)Tc6>TzPxH1^GN6bXFO5m$wL@LTmAsP)0y;iZKt$CyjWWLC2`m8-m3XTsc%Iq4uu z55X)3fmedXy<@!@sVh8wVdR}MUrfzA8@l}L;>bIVBMqHmjICpgm1v;7^i3`AJnGK7 zaaRAbAA2~5ou^z$jG!2^FU==A!CwwDb;b$2)63cvFHH+7VZs^|AMRlXSkJwCB?3+7 zryl2z!Ro2<z9C-0T3ZSlWk90=s&;sRy_eUMaZf%Fw{U=aaKy~9iLzLhpB>7%U_Je- za=P(=j8*Yac~Ci@p8S<C(SlJ`D{Ovm2CIr_Ivm@F>`x8O&1Xi92Lt$U81B*$PuB`Q zwQH}kIWW?D_K6EwT_${A>z9buBCnR5`b%?3#*-aGDX)?ZR;sY}lCt8a+P<_k@_e8f z3DAKEX#DKL)pvkkmf$o@T)Q}nt(f6wF>gqpwuI*nOYY>f$-5bocXP^Zk{{ZZ(i2Uz zMU;HMS4SV57gfUEYM?r6&H`+R!ZltltPseX)@+6y=Fxgd7SBB3M5e=Lf7kXuIZM2X z#BB&1GwR|$UZWd0CRW&bv_0!1!uoA$^@Z-~#?|+2PqEx+_6{}<ep>Chhuc|>Ul9gw z;HJN~zk8(HAAFb4>h?<ls0=}r3sigkiSn}_+ToZ!*`u;(o)-{gyY^RDeMS^6U+hFn zHCx_c%K1T%D!E^AyEClC+k7c3?cs!qrm=G90Ee(_%##g(0PNIh``|b&>(s&9hR`gJ z;pd~aR|*k6W)g)RCd<7)e)~q~SxF#-#!q7jOp4njiV(oGCeJjzrrF_8|D_?D?(PVf zT9lwb05%Au1fpA!==B{a4N?H*3GQb|H()kw|7g0!W^%&z<jC>p8?`n?S(%c-I_H+z zUAIc!kz|Y5=&xM6eQGI4x+ukp&}sFsFEtJez(`-Vuns&a$V*7`M=U{X9m=lG&w>gn zHxqs+eijrJi&HFlYf99~B0INLe#)eJBx+!=`O9I-iHAiUfAA3fb)pcm@Z^Y$|J$L# zA<U^A*FNhDU0jF5O>2aQXPJj%nTJWK{rjRA+&-$nD<>T;)g7MPJ)T^v(VP7h>Roz- z*v26NcN<)K5uq3S`Adicv5`i(6ZA-%%6xYUWhdp&5J*DNW(~#b)n6go`em1cb;<B{ zFw39$n1bM6$CR!YvXyexg{m`N|Au>PVVa&Zpx{mgPmRCr^>u4_-S?Zt)<n_HnH$W) zN6E`x)l}?Q-(4X!>t&B>o-I;M8?f3S;4-TI-TXn|Z$VMqZN}Zq113O|T&G|Ol$|{` ze~AKrVXHr$kAf*JLa;ux!@~Ck!p}Qx|AKn;m+1DQ%k~a=rvt!?Chjb;nk21Sy1}GW z`OY)nCQ@WuMV-E)btdcjL^}G-Y#v$4MRQUUfXgw!)NsWxF%DCiDRwz0MCB#Y#19^o z0{L)_M+C0;WB#4<)(dE$3mE=j(9u&_#@CUwSpS^UGmw~{BvG!wa$p(WoM_H3C6O|P zqc>tG5;5zhr{Xg?pRBo`#%FScP?x|2<Y8)nwrP8}X=8yTctnv`a-j{cKdW`(AN|4o zy2(a!Df8n+g<UB2Z0DUrbIH7u`j6$WcAersPyTqeAHbX@2I)_t6X1jNVzVb^x#uem zqPfZ~FKO9L8CXmh*A;R5rUI%Eo@t|(rB}1NpMb|75;RTvsF*!Bx1UX>Vo#2kdc~u` zblcWk+w(D#qqHgK#wk~V8dWb8)ImFcAS4p6ND>2VH;6MG4kZZsr{XI-3{ML>xE0X# z5tyRYM8f|uzw(_d@}1JpRFc6=N}hK49+iR$@5YtkQ>t*1org&m=bW%JR{!>d!u`Ps zDK{vuSm};~z8jRF_2SjchWW_|w@zYB>#VVuTijD3h)}mYPm*Y8k!O-c$$<IPU}w~1 zEXDZSp*NArqVOe@33;e?(eMkQj(Y93SL3k?3O1BWN^KK!cjlu|Mk!xaOzGs_4*n-5 z&$g?2pX_c%^x}-{yXqYek!?4?wzc{;*k;>We%ph=)?0bI-=@52x1lkt0YkJt?=3eZ z%*v$zJ38ECyfP7#IIeOQrlV`txxhNpZ|2+;9|oS)#<((J78=tMC6X4?e`~Q$+R|Hn zdz0B!-ru!d4bVgfA*6=cEYd!|8xM0hRJ-tCk;fS{*Nwm#lrF*j?&Zaa@L)4)ORQ;6 zboNgI-X!C`UteR}s7T(3__1-+s^Xsg{8QZ1yN8OT>|~~C)uhP+FY`mp)+VK7H&I5g zZN6O40(5f{Yp_t@l5L_&@nilbo2sJ8Q)bt0H1Qoj(3@QSOpj_?&}2t2=aB8$E;4@< z`BIlFq-d(MID~O8f3rnoJBxO*UeB7}xtRPuWHS^<k9&rFr}K7e7eT~VBNCz^x%{JE z$Y4%$W!ePY5y8rM`Cmra`;xu=@v+ze_F2lg%9nE;1fCMYn+5O+=?=%m;Ch(;nIz1T z{daRFgZd_e*1AA1j{F+`1R%kXy!?<p=dii^x`yn!WUr%K(mb8wXa60TyX!bF6SuD; z0H3J6otJvnWpCtHtSNhSu}4M3+~!5P0KI29thThBrfq8c?v6U=kpJ2KUcMUgTO4w1 zzqd*-a@R=d1-sqa=_J`0z0MOPF+(0Ua!K+J8Y+F(Xcks*BBsi{3)p6M-V<=%F;7#1 zutUevy?!$rc1hhHW$09Q1XErG@8LYWOaSk&q92zjY%VTE!Kz+ge`8pfSs3-BI)D(f z=QHL!-)a>-5Zi^Bq25K>QB8$2*Y9)KdNVyX<}rCJC9{}3K*y~p82Em_4Bh3oJI7dz zSPeu+GuIw`xMP3Zz0OQYsZe0*f=ZnezcGY8qQ3A>7wAy&L|bhe3mz+Q$=)ngq&Txw z+m(FY`0?e6zlbTbeJX8p%be5+y1#7W$n=i)cJe{Kdb6tEp#eYngOyGzFtKldzVCbQ zcC0(UpgCB%I3<%SM$F-h(U|?KCfOQ!Kbdn2H$j#Ez`lex>NA3lm!!7a)hvxfPI%d% z+Ovmb?D_jSdtizF&K|$60R2(F?J3f65o6=yj+PEQss>Zx<O4}IMw_a_QD%W>hmHma zwRe-s@|#e~-`amW1<pC^#**7}rnRva0(i<-dZ5*qzIr<#=k0anN$D4c^2b?v$db)I zp^^QRITtd970Nu_N2CRjz+u*_LlJM8TkpIurQk}3_p@FpdL9j(H^CjyEE9&dK~Bd# zPUk&LJ@3Ec9rW0jEAh8eWfBTxs6(8fbEF>6_LAEAQuX?#8a~_|miyybgF1)g<u3Pu zZYkJ;{JN3~S3<T!dN)&<j$XMvb26tQmkvgha^YE6s2=q9D1ET4IK)w&?ybsTrR3yc z+zx;D89phi_uGW6&EnI}E&T|81(@e)B`~<?P@D&6*7>u2Kxr%1=y_6_j&dHIKF+L( zJ)XGRd*W^XW=Zs%UGO`D%vY)V%YS>+W5Wb<!$}AvcsmeU=%OFDw)zQIn&Jt!2Kt*g zh&=oE`s|WOEdD>Iv@XiGIm?5i2a^}0Ub8>CI)_kRND-Y$Ougef)58J3E{Uyvwe?|U zyt8+KKfb-L?ERn#MT+r+`=9IrH{9<zsvYrJoA0yWs0z?3pqMF_I$fBn|DHMTM*aAQ z^}5{aZDX5lW2RLzBVLsUWUBd_sI3P~x{SNr`-gJp?g<T5g$3u19I8ysDN@6ETy$9p zj3ZlKx*SkM&&lHJN%^rU>NKg6%+{$Bn{D%5BZZ|*?X7l7a;CNgQH84lSJ_!aqVheb zldnwN9fA4#!suyOmBNj<tFQ9*W+@Ny-nnld5cG@&U3Ju_Jy`|uOF0ufd25LM*s>BI zQ;Gmwd>MjCQF`yo8LrE-&MdfAWGc3dKKtl=RF8rc=bWi>)i?4kEGU|HVmdO9hg>uj zqP`VURwCvNP;WGhmnm5pkPk~XREEoV3ecL++r!CA^&ztRR@NJ)b@6-YxVz?-zfW8h z-EDtrpKL&qp^)Hv8WBmG<zpanP%5%u;4+uP#%ORtJ@NI(x)FrqCR33&FZJ>+EM^as z1e(hL&8kS=AZq!U?%0-34PI{-rezLXSg*@a9gUoecP{Jk67BAeIJ{`1krZ%R4Z0eh zH_wyU47vi=MN20~gU#hFC{bhUvoM{aTYhrj;>4Eb_5F8+dw<uB7^HmAQ92tG+55W5 z8O_&!$2gux2}~xsJ34-i@u2vhu@V0yFo#=mP2S1iEq3sn+Jo^W1BBjfNmUEpwAyW3 zPD3%<bqVjnMB<*ae4{$osNZ<5m!%OwJ+!mo0?*aT{X31y@Ygg~A*yuYipX1ev8%lG zh<lyH%VwId5L`<x`FkVDoBQ6r@xKcVthY?Pmkf$|chZKZz@{;@^1Gw4lWItkwMco( zy}Hyz^g1j({<aP|3rkeb8cavy3jYy2y3?FRXdFQ1T96koMc&-1NVL2ufd<5QYLa#x zMD+)1UW&#NZ0ftr<;`2xF`Sk`J!aJzffGfN5#b!e>^U9nIRg%5fYN<ff+TVQQ^xZ% z3LhsbSudD)C()*;23=V+V!-?UJ?V|Uf~qn4lPvr`72<%4bC3>OF*ao=y1Me)64$}P zXzReP{ZCPycwc(sRY`0L0zChYZ~;8<6cL_9YMscr*W)4f_d-+p`Aw7hj05`8mj0Ml zHRt(=<+we&_h7Ios=l=W^9!~Wqtb}Cw{^Ewd|fU71forGt4`y3&k4M@kcA@#x$X;* z-GD&=y5h}Wb(+=tcH{{nk?fw49dvuoH--Knd>_-X4J=-TU>)dxxXX(!g4KxL0cq&& zLqOxfP9N^r?uf<B*Z#r=jTo?ZdH>8{^MqH$O1Wf61BKW&8It?PzFuaLy5F{x;b~e0 zRF&7}Ke;CVTL}3T%UpVv;yE%nYrVc?y)I6NqD-<gpOYU;<`7Jx8YzAa!LLjXh?T0v z&QE`TPxGK<)BhO<TDh+ZFqnA%$zYbyMZI~>D;40H5ciK1tQ4ER>yjVKtTezA)8ymo zey{ibnV%y5OJs$bg!ewo8WnBpZe;6DP%jpFJ1@<GUTJ#JP|ClsoOZjYgd&nl5H3a) zeEnytre5hP)66O}Nw9U^rJNbE*)CA6U*#3ILa<WWwXU~dgly=o^(Aigr0cN+vcN^% z$?ae35hc3s(oHl$rM}mdrNv~KxCf5TBK+G6Ee@7cOS|gn@sNiXDY2lTx4X9U<SR~w zlKJKPRVBr^^y%@=pN!5t29;x11+Oojgg^tMSH(^=d3_a)e0{lmbrWtq3EZgY|B>@I zQvqB`WcPbz_t%A_nQd+5ceARlFn4^6o+~E&#^}fHka1#X{+L)C-NcM@O6w377yd5X z0t+L(*cld{{Ci>f`cco0lr&ii!M<PO_@H@iViQ31oNa1z?D5Aj>H7oi$qu>6GnmpE z`g!aX?o10H;SR#i0AF2syQ9u5avt>NSkUr7d;QLax9TuUOXPm-Z>prGH~%iYqzO;8 zk3*-2K$RHy+0y@JdorEjr+hwS;ScAKTuo^g^Q=f7kKK~O?Ygao;+UMJy*AGgs#!uF z>a5s=wH0#4DsPyW%-<Kb{|E=gAiEo`E8Wx6)Z_2CJ|nHxTY+t2g~0>->GQEch<}7T zVf|X%nmLET1I^NtB8+>_B;0qNY_%>%0vi&cpVcJ~WttjGEAPX^&YvD<f_)5e96{lz z^O(HE6+6}uKbg#18@%JEXUu;ml7&*PCNlsEKhex2Gq#U?&ZMpZL~Lkd$-j!W>r|ok zI&7~N!+wddxEl^I;Sa@#YXm%f4w=`Zy3S86z!=s{Ne4Bsvr3at<KYBkx25yQ0Lgq@ zWxeq_E0ReY8FFtb9LbV<*EkA_b|!Qd=4X<D(WFV5z*{LgurLre6ZQs>8PLE1_`XQ_ zT#&fl-o(bO^J@o(2B;>-y<8}$gO$+I{}k^yM5?VbDM}YtC(g5r{_Hpa)?h(8fx~mm zy~*<3f*ma)ZK+Jo_oKg11o>B3N6NQaa4|BknL?y7Q5Y{NcHHL%$8$$DWwR2o_yN_C zc(wv8j)Ek~p`{b!PBNR-^zOyQ?hxxEup|og1Pb*eir9gHUzXF_eyQ=c>|dNdEpD%_ zeMvhJ4?0O=_BMpeqRT>VHJPthecj6IIyMyR*Tqg&PS=-hOolwI%yRA;&Z|ltoFz@D z=gS;4EL>fuPFz)c`^M%?o%JMFpST*toFtA>H#>gHnJEz6+D<Z6tvYN9g{93IX~1{! zdV%ysTUoOw3pNASHmikKPU4ry)KE`T<?WxOCCv}~@wzIo8#$$z{wM6iZ1Oqj^<C!A z8J;+PLnyj(VGQ&eqN|&w2;6eHznhx$#-PE%7)njX@R)0R4WKciX+So<*}`-!Z@Zp1 zSjLr+ywZX^0|0og^Wq<(>AqHKf!DP^aP4ONDz;!S_$4J|Hh;L^A2qTr($#;+CrIj6 zx?%Fn06oWc4ABWix8K#q`v&COX&POJ2%oT~C(%MbzOB-{zLo3g=bxvxc2r^I{YcXA z4flE_(ue98rWXlxt=(o5!(zXmg)<<N$;8vfKI@^BsOnpOtnzn1W-Ca=_GiFiISzm} zSm00mBevmlW~(L+4L8^x_R;}1BuhH;I%=_3J9AXq3sn0m8In+WO0YS8=5Y)fSGBP1 zqneC>q^+PsOq}neaa3<Y-t4Gbo&g89xCS$RS?*~^|9U4Yr>zUWCSV53{=MfUzGqc+ z_>?4C?mEb;o}vOO0KH>FH*i`u8O0Vh2EX|pWnht;R??h6+rV+?jWzKQ>$B4|+wnav z5}<S~-(S-K$CbWF8pJ#q(1Y@Fudie@ILI#!dQ+~RKOvp~+Aw5bVV}X%IlcihC1Ppx zMadm$`U#F#h6N?5{aL1q_orm<STHnQ?5nggc{GFN&mx6nBOS+)bjCzVz=>HDn0Hv5 z-+`$)P0~?a*t1|Fi-d9T?Z=nr21>rwR;tC`49Y*yII-1}TlZ;l<@7`hkQBN5urIzC z;fAHuJB?iBnEBrhta<kqeajGbarFD_6@`fgxdI+@LpHO|+h1UYL03QXSe=DAnS|X+ zqg4OAFt@Zwr$22F?Zopf?YuRoOXdOFnI>M6oj8v?g`K#O`PSePR6CmT3aV?8-VmB{ zW^X5VMgN9W6QUs}N}m&6=xchARXlz}L~MA<kgyVw9wnf*u0g{5@5OW~d<*ozA5zZq zBu|5W_N@pzze{6P>1wBMn|VDh2sZR1Zd<ths+Ak_1ALY@kO6zuD^jPO>woq;y%d>0 z7ySB9ytDHMsN)B@cO0rtm72LuD!P`w#S{a=ofJ=ILLd1@^BsM-B|3Xy{=wohDO`vp zIX8K;ArZ054nxRNEzCq``|82^Ywx7#7Lo_r8Toz~MiMil*N}f?O)L)^i}_o}RZJHb zd;|VelGcve<H7a66IcXD@#0s}YfQxV%0I<)U0uO(iXzM5>n@D=cxn?gnW@)AmMZ}1 ztn&n0xJt9xzVaxY2m-$W-4YkStIdjG%N0MVmI5HTrQXdLK2|(q56VA1DlO9A!=y&e zIq)(EWHOQ(MdLWkxET7|S%p@}jccpybwkvPjyiwEgp?Bf-1N<+R64J3hKq^DPMpq! zI+8uPx{T{1`|Eu<>xZT~!eGB3@H((t*rBU`jF}XdIIKA=XVPe&-}y~?bEg8#aO~pe zFS{*K%Q6$=SzZ+V*4_`xP2#^pKOMu&bC$IH(mT7ifb`i=rrMnULMMUta%z(DW~AOn zTbSM(nPmC*$&SC7hWl?9@H;W_q%{4h&8rK=SJhELC!FJ1aNpRITI}v8<Jp|+N6G8U zzoy-p@Ozyr1D{=uvUe!C3aaQyVhrjaxnLxjw@@!J^1T)(iGQYwpJ^`c+JIqF$k_0q z=PK)F)-bRMm*R!;M=I2DDV<ps*t3Qk<GSv4rrj}txu5CERJ0!Mp=X@{NKbT$kOzx$ zB~%}meV?ce+qORbOi%~^i0(T!`Cd@`tzZp{lnaW+<w$(7f(eRXHzC1pRJcC-d(tzi z#IgF_=??|J9>;%hNpYky@SSp;5G&U`Pr##ZS@#9>c#wPMxVsonW45K1Uti8u-UR-9 z6Her(K1rIQ!uD0}vCvbvFQ=#vf@(cRF0+td^^;}Z%7<)(F=$upc%L@ytNPN40}H>O zwBe+l;bb`94m$)(+ZjK}c`@^xrX!`H$nfUr*CnmoNu|egDvxizyl5+bQCX+07<khy z@TT;o7|BSH;DEDd3Syt{&<9&e{r;D5!P{#-F~k>m06moTGFR`S3;*fqe#|=R^+|5p zQR<bo(Qvrj$<W2gD(y+S<96a@ZW_c+b}ZWdfw&@w?MmSQzz=~ZKKprj1Ov+SjX(LI z1|Tj>zitx8M(8FsFBw@kjZ5+{9D1h-1z@FOPqE7W*KSb1PkwU@GrQsyJCd)zC42L> zMicBn#SFD_V2jdT>Gh`C5QDRP8pYF0nNS@JwO*gu-1?GglQq2SH?-?F3?xl~F(`qb zu<!4c4z{%wdfMiL<2(FQI=tVB2}Ne_Zho-2q2TnLd*QqE!gX00dE$gjVs_QEIj)j& zRkL?JaqsE<+mlh!GyaR&*2UsgS(I|X4Lf!>wngUP3!Dqk>uWP&xAP|n9pxl<{<UGZ zdN!1cp$C9tzGb4Nc0-u}=0hiL*z(s<p(fDcM^Hs9s4VQ(mw{Z>QvA)PSAur~W-<%j z%JPzlK8|C#%qzG#1jz0_D#KdY=BptoI_7vRjlYzckMG8N94p);mditg*-Ap#|3+Le zu6OJHL459)J7SV_CUCGr@QcpwLb`sfE#mQ+r1sNH`5NyXE+Mw$tmJFQfgaM6Mbi`1 z$_d%e^?kN=iM5SW!Q=$5lR9$`hKBU$TL&(v<NE|FO$OVWVYNtz8#z}y?;wHPp#QHZ z;KfvV%@y7hY6ZENi$pTJniJGBC#d+ueF23(!Z{QFtjFfISM$J+pj+RaL6ZcM37XeI zw-k5qX`qX8ZuPi$=2xcW7Q%Cw_t_p9f1Dk9b!y=2o8M7}D-rG-n2+-Za-G{Ou32Tz z1(^t+CAd9YsvT7!uD|rX&QW`I=EP;dwFKAe>6mR0TjX0d3eLSEPQ)bi^O%G_NZx7f zii$otN<EQC<xq(8CXXG{%%SFc;#1n+*h~l<irl)`@=`!G_t%+dsl$}w<#l!cLByk^ zX0mke_~c7fmjdng&krC>%!hgTbPGZsQN;j-t2X&-f~r2p&TIK?8`+bUmzbLiB{FVT z#$wk)3csPrMaax{)UEOX(+^V6>zj!hF9*cshk#^B`sYaqLUyV=uAf<po#3P6Io#u% zPJ%DC0<cA;Tsnni_vZR8!ocetb3gs%wF|D_-S_O{t@4L&2Q0o$$oRb;e~R;pb>-Qr z!R-5$SA+qe^?$XK{*!i<oXg4_D7lHYSABlw{f6~5eKPmR;Iz$#0eSp^)a+S3c$$d) zkU@|sV=FZ-o|Q~I!M>A`jI%vL0Y*v=J0xkLYdQ;cOkTgUSmkr`A`}C3#jdkitRpxh zfn*vpz}q&a8T~uY9eFS#$03vY`I4wF>^o3ya>q_p&=<^XaQ;+mAyR5%lLt<A6CtVk z3&5)mkp?e|W%h|I8rV$Kf;S#e+`b<Rc_)7)h7!t$&6R`b?VCKqe4cd!S4_};`M0|Y zPT2p!KKYM<=Dh@}wsO`om#KOu1zzh%r|Tfz>;9FKxWtohQPCIibi(I#)sI+VaZQKs zL^WrN7>O9T<P#G}*TD%Oj}DMelA<L-<G5dPBgT{(x+Adv%xtb2n=<)!>0`?SF_9GG z#|opbyTe1)3oTZ6kZD0GxMk4o!+fyi*z@ZypX>a>UxNhscHdYpaR;wQ8;Z?c^{>yp zEPH-fdc1ZgW2*W|=5hXH$v77u3K5qm&k<ifF#0t2k^qv!rEl`HZIOq!ljd{IUB~2$ zipKGi*!bYjX8TJ)CkKfqL9VDTZ2#t(#F4|~gr-<6L8FVy>tm=P1WEE`9Ii^Tkziu2 z)U_Mr;Vzq36yi|>-!3a!R0lTI5#aZR$f^Y(Y<fAvdqN?L91YrFf<AZHX4!vIHicyy z&w4#BDw>$hq$EJ%!FK&XLgm&gzhx#CKOw+kosCMTn_rrvS12gT@qIDnf}Esev?;xZ zOZM$4p>O{S-}g*AoUkVfCC#jBnNz>8`k}cRA{~obx#tC<&5fR3%4EyDv7P*bQJeYT zbGQ-0JT(2t&we#_*29PH5Y+lTqN6Up!!hA@moN>FKi&bi{t>O{JM8}u5z4pc0pHq* zV?CedSkjIQ^Cbk|zzOg4Cu`XFhuaB(9ehlg%uE4&m9HONk_E4?9qn6Q&sT6p0Z4!F zISPVKlN!7ecs0qH{8O`;)C9=thl9{3gU2qO$4k;GxF(;;gUsSsFebjx#o15#?V6&3 zzgtCVC#i-VUYxS7c*L-HgeIAviQqNk=OPmJ8cFqEBBimN4heL>QQWGZIn|vxV6$l# zR}Y{J{^Jai;6BtJ!NV<A7fc5S{Vd*3x@5ZyRYmIlLx4wVkSE{Zxn4ibB>sqZm}nk5 z$fRu_#{6&01wqm*6mt%5{z~wdP!P?pjR%2KK%eRh*r*(L{SEZJlfB{-<JC1iK1G8Z znWG5Vz5NGEnHRXN8GU81+5iEvS62BAkOT%zg`5l-fiKMZ`0a@xKh~$5P7DQ8X0BNV z50GMNr#`ndU+t0#ltUDBjIQ^dUq7A}`TpB8q&hcH<gw~azs89Z6Hg^!{U}7*bR|^{ zaiQk_>QMIDQJ9mqZ7SpTOxA?(QGJ-XF{wLxV7PrS@2nv8;b(WibykqhpAPqXMghOi z4%avPTQQO7i@jzEO-bRXXzP)q8`l4X$59Zs`aNmwb>hOokX-h92_hm^k(=Rkxq;38 z!P1gQKzwcWw)N7u@*+SB`szz4e&UhZNh8ZidHMPP`_g6rVaMC-%pMN(8+hCI3P)|{ z>v`VwaZJNh=5&-}0tm#KEh7-iJonG1(~@TKpkL_BkRL~MTL%C#0>|tJ)_6}83F>%) z9uQ14Q?*G9N^7)BNmx>M^k;bZWN)lpOxFC2z3CtBXY}YKi~7u!_iW=R^?fF(ej=Fu zlgUDusZ1-=-SQ5(^T1!r7u^5lBDt}!r?$DHM^zGqj&p9;u8B^ng4kQQqIUAXOAwJz zt2H(``Hr>~hq=7ac>5-s@m=F>;RQ#Hr0(0oCs%XGi*K_tCboUG&U_#|R(UxE0)qDG zpzf2wsIyvLwt;gNC-!?uMM-g*NgMi}H}lWilBHDM=as*%87c+px>Z@;)1b6)+C+mt zG$#svNl=G<A_vKCiz!M9DN2r@>EB38TBX-E*3i&W0f=V4*yk{+vMvpZpnODC(kuOl z%GNoFfall~{((j~+lOg39}-b(GHG8iHA0gAhO+_UvR>uoUD_qwCt`(x==A<Aj(tWB zkO;Z4&v5-{e$v;GXf9zKgE=p%rnB_?{(-}(H;EQ(#cc15caF%ffAhM$XcbO^Ki!c# z!4q}(-eOUv_P&>qlZ5l=SN<|AjqQCkcBG08S8_r%dqE+{`c)@^d`^JuYz&hNEzh%( z*D74UjM6+3F5)yKPjciE36>Q<5M0B3MEWyeT9c*v4V7Db-98pzuD@BK;snQgTM&4; z*@OS$BHXcpm3A)6y9{JEONVr(R4BdU>z(%Sn5}P0vp&SdCy|nQvM~#0%T&j+Hix$+ zf+$F{IMHu@H-5H~VphTx*%QmE)N6kc)Z38kOsd5jrN80sC%qJ|-N~BwLwSA{fie)e zd-n5U<{NuSEXXrs7}rDbN&L5T&i-HN5bCmalKl%6nji1eAbHXM%lbfr9Y~$@C$aB( zJiZPGtvOu~8p#{3?C_)C=q&;$go|+5hJd@4Cd=AyF^zNTL>!0_9mZ%ia>9%88ojd+ z<phSp!F_WlcAy`P0MEhG1Jm_0%Vml8rf?gt?;vO9r~_tTF6MriNT;AbZPgD_$wLP? z4bwa^_f#o1j|9_mB!r&1T%@jbFFw23=*`1lkc31nW5J%NFHG2N5KsLV9V)1jDrAz) zqpe!l)`iwmEuEAC7L&McejHxv<YzkPKe)!ZZ4400cQCvuxEKjM?1{rpi*HXID;yWh zq9<$-WSrAm6rbfq0>Lz-RFG!}rVk1(;+h@D=!W?oOAn%T$`llI=qMM5ot|{2o-O$; zp4>eQ`&R5%>lxtPzk~getT$ay#m&gkC1tmWU2WCrrXZb=g;Bq`_wux3-0`Pi<p0hm zy4be9WO!<We)iGzt5gpct?dlbw7xqf{Kg+0OYJR?ilkLR+Dk`{oX7Y)jELC_S?ARy zsO+*KA%Lv5I-uNx{Si7-+9{s%G8|(z_H{*7ZaqW4uOe&IJ}~oXmxD|)1rSe_kvJRT zKR1*$u*)XDKR6WTt7wmGk67ZR6x}^wrbMVgg?ehI+NV>r!Fk3|(FCbxojU_m);g>t z=9cx}9@_{B#DDw31Y6a+>d6UBji+aL<>wMm>QH?VaABJH%4oV(c6*+*I2kACN_Ia> znJXey)fqV58D?dB*^{QK9NsJdeEh&)N#6Spmmiz!9AQp)O#5$E7;NX_Z_Zyodf)lH zUau5qDTYQnR;YPbMYW{Myx_qTCj%-=02<}fCE+_ic0>I%KJ-mhp4X2<k!6NE3Py<h z4Ozs0P36pXJ(cZ%HN%{>-z494CIQ7~QLFwgd@&KdccLHO3c<@mf%rq|sUZ@a!~~J; z@-1{h^D$X`<9>Y^K&J$IZABdsa)%66kCD%BuFAG|-WYHZ?hyh=O8lL$55DQ!lif9& zIxkH%2h7OddOmKK;M@c-?agf{q<jC@iQUa+4D{@LN)8DqahT(~_S;}L$+PHe?5aLZ zuCnRh=E!;GG*`Zwa%BpXfxqtQe11GqzFogo^h!h3)t@zLSE1+T)tX9rw_a+B2dKkJ z*T&82Rn)%Br?w%HKWaQVkzNnQ0IeWff-8Fr+?*GWw){^X7<5HZXKU<>$8i(}vPh#^ z&gNJWGJ<ZW_8Qd~I14_9o;pn|hqYeP+8}^Q$7WVLKh;|%-vd<1jPfYdQUlgH;lro8 zor&((v3trjHo)xkfaAuF(;p{e>SOJVwOa=_R^BUN4~nzgml1(2-bF3mp$rs}%|5Ak zCe=be;8{|Xi^)e|Io^>JXP@au*Z8T9_JT{fdhAUVAbTFfTI28Zz=SwQWu~>_1&J*1 zhdBV#za7xOIuB<=LG05WwT<*PJCEpj_&4pT{cvdBOojVa{5iP6x=i^a#NC}&6c#vJ zj14cB946d|L?lo^U-BYP_qGJx3t$6L3)zs(pTWD%6@I*ji&?Guh~J&{%$Gx;@5-mI zm?~Ast{<h)p4i$Aw4FuR*E8|)ceK~;jb<VD=Ty8o4w%ZP2wh<Y4^|%g;FrT~q5~=n z0vXm<pC`@dez?%yFMOiZY#zv0BW67$Vl!~ruWTN)!C<IR+CLtjnhaejUP|*^E-GC6 z-Tci;^?pg3HhY8mf1^K;APeDD%WGoG*4MDDm7YC<n5p17EQI#^$MEvg>Q53oF;AKO ze_MZ_A8B<3ZuCKNm|(@suJ-1W&0&KG8ct_ka7)3}0fCOU)FB<h;G>7X`NYWOLuaUw z%Nk=DksI6W)KnqtcO06PcjxqXr0Q1+hF5=hzBSMXK4iY^Mk4(W7Y;gD5MNcRRi=pk zTEB>4Jt2hy=tjb%SEjL93Ke9yD5sR6uR{`bDgegL@c&oURmVlSe0{oM2?3?MB&EAV zQW_Dw0;_aOH@nmV(nyJvh>MacC0$AiE2-4N(p^il@ILCj_jlj@b3ZfBnK{oq=gc{C z=KIYNhLN+!K@H7_ng}hVkI)-}ll;0pU$OU@srO&wj4sp1CCdOrNX_^&)W{^Y#5j8y z691LVxlsAlt0yW#4SVb00&Jvsm$X<tbI7p>bSv<g^{wjsj}?4&kHq+nF4AgPbw}&7 z-tO`Z&sgNwj;0-X2QKk0cRUyB&{e56y0Urp6O%l!6K)!`+cgr*`eF`K$QLGVN>&r3 zbx!d<{xZsg?OCZpAp_*L{XI42YN|PwAHnTYmlv#AbD^4z;+inup5_MRq9M7=%jFJR zYSz2d@_j|cgY;hI;)OA>q!Bu56wE`n$h+zN$ScUu-}vg?cZ5`OE1HnH1)8BrTNl5= z=D*Lu+oT^&Z0-nJWO$xP?iGu(mSbruk*i58Y<}X9veyjFXT%M;X5cGt+<vvC>{*^= zcZv6K^&{kCI8gBDJn++QV49rz;DjhJ*zLon8~C<aMRklYoW#PO94d$99PuUd#jfKQ ztT@}9C_JZrCuOx|qimciBIJl1TbQoZmN}Z6je6$#$TOJox-Yc)4SG&~WLEZI_UCx! zEX7OJrHfJRF_pBjd@j7c1<oZxQ8{ymmJ9JE#Ir4kKG$c(xOI^(mLn`Lu-93<{@$c# zeBWuMvW^3<<%Ca>Dm%PqElkp{Uij00GN$3-b>(s2?>0)qPn95Hf&E>+5-}`wO5!27 zQ4iYN-WJ05b3C4>wcXY)8VbIpq2QTgJeP(cZJ&L4Q6}V{CFCz{rsSBM(q@iFyG2WS zqJtk?(%JH4hCs}<<fcBiXLLn1RPA%-^qsKk<sB$P=gTJ2k*F6%D}2RhBsN+^8&f0` z$T*{}+F4JAnLiEBx%HWNPGLk%NjJ1XSR_Du9pnEd*n2tH`#slFA;<P}SJ|6EZWMS9 z1y7i7AoIG9jO!Mjs`<-O3*g4iZ;}nvMYnVbijtgUrdKh6q_#hV0X$6NgUew3_t>kq z0G5Y8d{Q&i*B!1FW@nN0UJ>-TVjb25$t)ba7Dm=fU)_h2r;SspX`cw{#PURbbueue zU!A?{*Dl9>q4dtCz_f<-ZfO|jm$v=3C!IWEUbU)JWnW^=;tTKePIc(RGw><|4o=i+ z!2{E{zQkjEH53qOh~6H?U!?-q<0fz%zT6Xzn_9A!E%J$Ng{GBV@x~J+mqS+JI;8-U zFj07nZ9T1|<(jRmYXp<z3lb?6xu<fob?)nK(_)B4@LSwBNM1`N;@9_yc1BJFlC}OO z)dI309iK|(WurSt#aSwK917t@xoaZq_G+pIvuAGeCWm|q<lk+@>GOkkUQSck5~{d7 zB>d=Y)XJKYV-x9~#e}CFSD<U;(jc*;n_8xde%kHK?*M<Gh`9T(7CWnu7K>=j0KbZ= zseJy*VH@wHO@bM5t!S!iDBICQ)SRl~i@!EZbRl@Su#q+&ZM^5=wfD-B=Jd*HZHR2( z>kg`j%8GfACdx$0hdwzG3^zTw`u8*Q?;a+-;*$(;o9gmK&=5QXweYfQr4>}y@~t;f zGt~d20Q;!Cmt3W9FH5P{j2jlEpWCT3;k)KB>1XU6I@{rU&Dk0gHv82%?Lu5x_r76; z+Cw26G(Ggn5D6(XgW!i3N=3+N@1LjFt3J*kOl+atgH|fdAHbjkZ3KUX?JqDMbjc<g zE%ldW8bo%}JZ)|!1W(#*O1HEq{8$A4tJ|bggg;9s(t;}2QTpsuC^`-~f)#r1_oWzi z&wOg;edFPa13{%ObqTrpS=yPhdm*yB^sBt@CF6I<RgN$gKVV-l;m~{0BV-JFQ2HB= zE76XiB?=r&4x)t@{V5{l%LL3LDC+4pvr45N7{R)^PmS9Dkm;*hBUTsV%>Qp*h<U&0 z6KCQW?q<h3gNs(OhXr4PCYQD!<UVrhj)|~(K3>|9qhn+hUaiTBq}{)7Zp+Ro6!GSD z8&<@XAgTaEdU#&1&P-4xcm}z8xVCtW-`w9$df&Y_{$t9?Qi^P{#*#pE>)texv^h)w z+Y>adPCm!}kArUDRJyBNxcrH0n~<TU@9I{gk=m|yY$o4}`p7w!=&CzwwKOjAr^k5j zc6aeGW1HqL1N}2?w+f+QQ=if`&Nv;B`GW{ajiTpossp`FXXNNUD~+G~ifsCa5+#fq zR|)48^wvk?au({aO~S{v9{=ZDahUUnk^uV-$!7^Y57$UD)PZHO%h5A~;=_E@snz-E zJ(Np*KVzcP)2fHn2AfMy`_Ay?($r?}T^y@y3j3@kLzVIvEn=@nBM@IEs_UKUs`5=p z^M#n0z!u2yx|X&8R|&S(fSL3XQcFvvT`*?HF7*DqEdQ>v;J>>$%@CG$s3_64APD0| z5{QloM4OS1Zo1%q*ejIWHMBS`LM23gxdrn|r&!_XK&o5p!$yihjmGxnUN@PnU)&oO z>U$0F+V7MxnM|@7m-`<4<Q*{_c4ydt@+p%axkjqcC2%fQG)aunG%AVv_-g;SFz!~6 zed0d5zTmo#mYJ@K)LE4xL`4$meXx+1{@+CdPNhw7pGp;;=X?C1qWKi=EF3wJWkWwy z5&B2ht!FUt#bi4krs3CesTlzr^7~w){31ToNpOb`qwIMJ4V)?V`Y5m#K<U$vnJcGK zR^y2OHRu#^m4~QR&WZ_wT<m$_R>_Dm;xTq#NG5O(J?UyF6bZLl8#&nXcP4JCOr!M! z317@>47}Z`^?9s&`shEO3By|1%9ySO;ea>Ajkhel+6pOj-lCBlS6cQnM$rc<$8Stz z`5nAWhL=mO^0VIZDPx+YN0Q*HZ?E!my`*^0Zg3I#Vwtjg(l*dFp*otEaJh2`UC(sF z!+Qv<YO_|u<oL=V$6HbC_=rYbbwxyD?!8C;?A@UB)($3BpA`b%k^Be*$Zdgisdtj0 zX1;=3*_JAy0>Co($KWHISkOT+Uj3_Zrrv~4CQ7##9{P>+y;>S=Uv94PK67eElj7f^ zC;cQ$Z)bhG|FczEa52}ey|(+Z#&Dz2tKee3RZF9ZjLtz_pcPwa1Boe@r^W-qcE)z2 zd)MlLeS`xaL2~C;a#^gGp*IKdXB>>e=r)SF8b<uvw^X7Bm*LEE>os|~cR1RY;ZGY# z)RaGJ2&NQUyLbwahl?l%kPpfcMwb2?!D?ML)DXRGR;%NPf39krbkPwhtfQQg;mM}B zLRn2qMEVMUYK5l&n~>?$Dm(B4--V7CEcmJ-?Q+@<-yfh#coe_;NH?N_8{}5PKGFX? z-|T?WmOsqU%BQV)&&uhF`DNJLH`FUeji2U46p*sjl03Kwwl<}pT;HNH<t2ZgL@|<b zV}ZO`VXRBjOSOjg!a**96j6Y7!%jR1*XZ&5@J<fgS~r+7jt^$F;Fxo!oDm@o7vZ#} zeO!w5pa}ZGci$R7^#4;J@ZvO@8=&I344<PZXgajmmw1B96&*`rm?3*G_MC7E#~XXU z<gC7*WEUqDIxt}j2`;S=)Z+uu3sSw7G_JX)UFZ1Zd8&Yj-vbFEYAPWriEjs<S_KbS zxH~+*+_5B_v8Qd93@Cxnlb#c#cnQ<bgcpW)et7k!3$f>Na9+F6QC`Bp5a3j!32D82 zanV#d0P^-5;ZwdF+<Ln({Wyd?-C$2exv)Tgil(kX0;MPx)XH>d*^+hx69hgbyv1I& zzJV|Lg5iN+>@1mxFydk2KN(M;x<|9yXqh&1D5t(XBiW;`q;NRajzuwQB@n^0OxA78 zR;u<?Qg-s@S`MdyDl6Fy`&ba6ut|5>3xFevYH?|U*qH5!Ae9dqz!~>dTeqeo@W8r< zwiX#|G*$_{KK%U7!RZI@{@r_*-!I3yGXGNdVC@p502V&uho9wclpB2|-hOgJKX5~X zKdv!h`tdMMAmwi)k1Z(ojRMEyjR!Zqwp@~pmQ#0^VuZCzo~QDAFNjTskq$~|!v3<o z0xGcn6!HEkNuFP9;#899#CIaRvj{@COIgnF&?=lGJNya!Sy1aQ4hHk!P==LWlkP_x z@90Ik4TZ}*t5Q$`Z%#>YbV`Z8jE=nts5mGbhftF4lE1t#Shr@t*}XM?nngQ<-NWk4 z!@Y&88cw%AtgV293DNrSxtO=OZ7Qqa+jQ6Yfj7D={rJsQyS@7<-P@c<7R=9THC-<B zR@70OBZzh0^}&z#mwR7IQc2yulWq`To(x`&^qzQiWwv*#_HRwNj+iv+-M^gNi@-^w z5gm|Vw#sTE{U<_c=1{8fQ<DzFM<ZZ&&P-W+s<o937Nz3l!(rzK+#PjyHU@4dH471B zm$CooKGEc&GVMTX>Az13;E-Sz2*qIgLJn|Lt$En+Y!hQPV6ASV=UMbfLUh*3Yy<&8 zd>F%yvU;)NGfk3Fis^$q&jRwhhHqULnS-~w8Up;orYcPG-qWmsywN?O_<8c5iq~#X zxOVDix37+(Q+z*zZx`b5#Xq!-3wr)F+<A>0%lLNELn3fV0%CkG4ZGr_r$)dwBnu?f zbTsMnfuS)5I}iP0D1hYCe8-Q*h?ak2etA@+iFG!CSkT6pdNzw;cDmQgKs0@TxL`H) zrQOuICBqXF)PYe{<00kKxO7R8{2(M#w`9A&$R<H8g;rtK%8qiea+5T}HIxTWrHy(Y zz7RIA)Nq-_9*O9K#RQ>})Nnm4hS+&&LIA=KOaGsG7@w~!6YT>nVc9XULz9_0Sq@O` zH5&zbP36b0NbmW6x5{^&()YYpSB{p3)W8aCVU_*FkM+x-y`Ul<$V1Bc>6Z9TWeDfO zi!FqmgdFJhcsm1u&vrngr^1-nSg`}mU#r|9xLy4=pKmsfaFLb75LbdnOzh&h<R<@@ zujW)@<noRBDwkGjVx2OiGOQ-;EbdBlvQ}G2&X%!AD^vD)Z~O$+@}{}0t0oJ}a<jC9 zRdP%HQK;;>5Mtz!C!yTg4SOqSrUQ4sfo1?RzmD=&jRCwXL9yH;xlWB#Z@h1P*nTrg z<7pxE29JAjDr+egsx4xT#5$k8fy@_ca8(_NTR6(=a|X}Aeq2RmUl!93!AQn!zZvKW z|C*Hyvr_jddD(m4HG1KjkF$&2ctEQ_j+6tzpgZ}1p1{D((%U0UD*w79ssg_%Jw?(F z6ni1J);v^CG}my|)uj;xF3aBox!t=Wq<pt~&5L*p*N5HB5-&z$l{dF>KZH3t#1J?D zuEi+K^DM*A;PQL(4bL-Bljm8jBZ#qsH1GV32_ttNxeLOCti8%J#70O%SZ(w~LUC<$ zYh21|)T5ZsLvcQ?Ph(Y(0r)-M8XuMyi`$|i!EXMJF=pmBuPXWQpP<L`VCLl6ceE^w zvxjp!cpB_YxcGJH_n6rK$p^}#aCad=h)!ZWTjtw2njVQLw`v6yq@l|0L+P6cgRyMT z-C)7gV<{`g`RIkmfS++<nDb&Q#V@KTk1ED@f<@!d-)`hPq<FW9hu~-0La**9TNh>N zFQ(r&4}gW;vAZ?xbR+h;{@SskDS^*-;k8rHr~;R3^x3O#I)xc{Ojxjvj*xL}nLJ?; zGAc&9g@DF~i60ZNA^CpN##v%ECS2<-BLCSu^KUw3UtyE^Jo%oh#ZbJO=Qf5&6t*$; z7dsbdIMz2<NNf=#9b1O!?W?p+wCg_dcPd>KURK&3B?jF1Rn%h0O>?Kr^q;{AoS(CI zt$Q8Zij6bZUUw8IR(ocvOa{VrYau@bwtb5H7>JCm@WY}=AY~6T>R|3~JYdoUGTB0` z*W!=B*+SZx1G8s}A!pi)ms&%Uoa+D7lKFR=zX~E6eKfvC?h#q?ty<?KyN9K?it3yZ zQRT82ZJ0dr0R~*hj^+#BA;0O_{`yh}rk@R>I6qLwt$MDMcN`r;{#YSnIq=L_D8!18 z0q4m#EJ`r2K+A}2D*Q;EW%ZZ1kdD5L%qy{e7xO^0{3ZC1^C!H{PqImp8o8<~Z%_H_ zPI<dLw_X*x(WnzWBT`8<Hc@uhXU4%wS-owlBK>uN#+j4<6?KU^ug_M|p|py>nN%w8 z_NY^zFZJ5wgXQt6C3n_^FQ|2fLUIq>sh2IyX6;7hb%sOBA@JCG5ruV(V8Fi{#X9BI ziTxPga<mzuiDJKO#sMlg1yBEcDH@h-uvqM~1W%W4A5#oLNy&Mu+g~n3m}VOd9fn{i zOpZ4dpUHLLZfX_lZS=v9$DW7lf<}dyJak4c`cnTr^YQPV3_@JI(cB&1j8;Nad7qt$ z3MYlxZLkO-K(l8>Q0es>c{Q?ET45x46*O;e9OXApy%Zm^A|mU!MZP2XQHA_Jfe&-1 zWy|+!CGW=8r=X(~UlSP>O*4jVXxuc3lYdx=2Pn6maD`!HWgDtGAo>WtC}Xwj5;3Jj z{h#b#cguI2N``=+Y*tEvaJgrUKD$t2`A=2f`KRyvuo0%)gsW%KI1a);CWX5#vRo{3 zk^*S6HUNmE*<197rb|~6!j+@4bm=`=`M`Eq^3oG*)_JAJ@aSL+<tEImag8AnMl$Nu zja=ktsnrQ_VHwPg;;g<bYJSRsnFSz1-%}Q7mL;T1JFYpnHE%R4-oS8oC`=5~J3;j^ zK1o-m*~P5(Zi`9ECE*V)!9?fkON6J7%0ecoVU#q3xp%XqW97-}p+?N%Fzgj1NDzR4 zwEauYJPf=(6G$4uLt;IBORUg3r%^MfHnD0#?I{raIXthaj(hoT(O^BC*#0&O4Ih>K zR1F%un@1JQB^~E?2z!^iKwd~te4TOw?*&`=3)*4x+wz$i0n~E}Hc{BrNKn7L{dXi# z8Bf>@@X`Guf0ULPocf9YiLv^=4SRGex0ZZu*fMCH`f;_Xhg4n{;o9&_xLi7DcMn&_ zeiJ?7%y#>VNN)>wTt%B_3{Qd%&ja@*x(fdsvp0f82<-cZbd|~lg$)3q6#VM`#tn3N zY$BTirfOOtf6o!X6%8`&2|b#ZvC9>n7?$%Nkv&&m=V)=|Aj~eMnDB$imaZQ(`(*g} zCf*Ccg=hq&8yrSYS%_ni;(cL;I+Eof$D)6X!F`TRT0_X$Scbl7$Jp_M_rZ;=3eDj5 z{sTj#$`{-U3at=jzTIq%@Ol6-u`af1oG>Ook75*kC@UX*rxXivHFyH!p7Ono9@)tU zZthx?G0))+jhJH-5poyA*ab7=TX$gl`~=Sjp9f}>QLMlqjd*+@ArjXJg~lXu>k6_R zp!#4}wEgk|3LJ&j>W5&;AeHIKjasC6z0mu}uV2vuw2)|_??ZGOuSKw3V@34L$e%#j z0vH=Qrl3_Fq)-l(&pd9t(HFil*@w&wDH+k^IxK42ovOnVOflpAsFc$%!#T0%S3ubc z0Crk1f|LQn?>N9WE;b*m8_Qi*M@N8j?pb0Rsxqo*i&o+Oh-mS5x*JOnUC3kj#n1Rz zH@zanoUl><)_v#%cR#AjC!+bL6pcV08SQ^Y?W-T+YnoLjRVDRUJhwG*c>ZgN;K;yx z?2Dj8*BWy!#yySwZvwcrO7pci<@_Mq`mQ|rgYSC`s*_R(I#&C_NxC<8Q5UL#J%Z;= zfDV!qPm{j0V4Qa=%dk!EV{x|qrSs^4mG=@bGoP{yr{^HfeGD@}cDQmi@ItI8k>4VO zfR+=~?ewM3*zLZ7qjxv@4+P7XWM~BbU8KNLY3uekBi~yOMU(dAKHv~9H!qeS3H3Jy z=vce34tEIw2v%uPlzDhUcG->p=uC;)`WNv85)3&z!3Dr)Q%`>_hqY{t8mv!P)U0tp zUiM}o{v`lu9>N8n2U_dMuh0Nc_?jrr{Zw3laSiDFtI<i;NYdHe-~Hq9M~tbTlN`E9 zl?kS6CJR)%76N3(tq#~ge{0S#HLz;sH%t9kQzPtd&9w`wz#gWvreF7T43cd-%|I?5 zg(fZcWx4t5*hHp{tpwuKG@=s_C;n14SE1kkM<RSg*Iyg-v@cHV>~qet-Iv!kk?j=J zNcsW!l|JMz|1rJKYKbKT0FaYPgpjIen0H_0#1>H9GAOz0d)Xq_eff)D86bZ907(U? ze<;VrC<|Dj*T4R%!Ln?Z7A!mm)POuy6r=z1Pc87;PJMpO<Ij|l)?rSAyniI17R7(b z`CCchXC-0<zdK>YB@bi$Zn8%YC<e2f^)=-6?<a66DFLecCCM7V4nE1UW;l%d{RBV= z+5Z=U>|O2qv<hO8KbuZn4CC&-WBb=Nsk<_(RM29Mur9?#2HQZ&vt)xiN?h)GKp=H` zIgfqx1qYT~&={~B^h}$0|5JF1U9XHS!2YQGigf#OdAV?!TahEqn)oBxE!b95AjdxY zGwZ*|yOZOG=TY7c6Il^SCr~;YIvG#&U2W}mT-tVF$DrSB4++8DF{7&fIx9S}M$yZ^ z2gCGn_pQpjI*R-cBXsP<xhr<;62yDgp~n0pDInm`nvg?Qk%OqZwREfv&mty4{diWP z<TM39ITr8Un-c(I3l0XMH0fT@W}arT4QPc(vn0<6d74!Qm=cCw>Ua`@LjM9*?q(co zs`Udy;|=o&L15vXCO=mWm~E_6si09_zRVO_HL2mSJ3oEcrTw;4|HPADp-Q5yVJfJ) z?lI&F`9g8r;1dwa3#xzJ6nu}{c1?0raP>K$92C*?ycnP>*XrCHe~<4BJ?#jdWor$i zQI@Eesjr@DY^!@bKQ%pW0M`flPTtz*-`O6%w>L-IXmCV(rgdq#4C1kxq$@Q-c@w&O zRJWoV_x62TSsWmtu(MCZ)HCYk#Mg+WMSs#PHSc(DlKA&!O)gUem7hxt2#@*nugjWj zuIJ3jcd;&QM#YYkw|?|ptUb<2dUsVpcSALkebIMuaaR)Kdik?(X%Z8uxMeY)oZ6Bm zs>pV}sx#{sQ0iRBpo*H5Oxp{pb%ws=P`X_=Bw8Mx=uhGzV`8l-(~9>4gvi*MVh_{u zGx7_o^>w&E?dRe?HTqMUpUq~(>gCoqGibZ}GIdNBQ_}bFGS?<8c#t%iMWr~35f%L6 zYa?<_Z%=5;CcxTMx&|J_x}I?A*PhGr-Z_Oe&bsWfqZ^<EmsAbW2`+wGbsJoXI@QN% zocU>D;uVI)8A=`<qo))Gx7jRdsELgl+t}zFp||=g$XHkNnyL<$C#0+G&i17KLJy*C zs!eLw+Ed0#_qXtvgvrEY>szP-5J9!a&w(p=0H%>1+S0*e(7EuX`raJQg6zHj&6%wg zRq+|U&)ju>4yk;afrao7g8121P+dQ9b$%G4<LjGGeI1pVbj9gPm~b5vZZ}nx*O~lG zVZcmoyb0Xvl}CjPG=()0>W3W9w-{c?2cavI{0|KQ?(#Cqj&8;jeCPO6=XXcKNmaM! zzD_8xG}v{UZxU}~U9<v9?Xej+TU$!`;k-GM_CQ2f*51J3q89>5op$`#qvT8@>eu8& z+y$oSS!;{lhU{DSH2%@<?+JQbRwN45SH70$4}+a(^(@XRm;xj}QC!XAmbEI0)CKf{ zRp%Ry-+Uh(tCdddO$~L)t>Efy2TOkUbBW);IvvvBA?PuE<Un5^^lYChRIXYx4v~N? z-<D>!m-~7}HRO7@W8r76Kl*NtTs?C$;WUOI$b<`lyMJ{5VyoWYulX$J9l=_y2|#-O z_iL<GxqQjzkmPi88s*$QAWhZQ6?q`OKz#BVh0y_QN5JgqY3-rynEQLJ%f@@uR#gv# z0HjT8(&eetQ+Ow8=kDL%EeIg^eQ*{TH~Gs}&Y<R(>e{UR?noT_HH81NHNTDm0N57a zM6PD53QH{B&gGTp^$6UmrNmG}&r5K^Z-dnHGcAuADN#~amKH1iZd{;PbpK^d`vMId z3{Dv_p4$CUb)}lQ9?!@7B5(n$okCGy?d&fpvS;<~ckh#G4idl)4lq%-@uWsMjo0B* zFe~Hdw^|DY66Hh#pZ`%EX2-R+dRYH#JPnp&0T|PnMe!I=93u_;zM_(Hz~9!I3b59p zOR(<We#;R%8L&UW5>zaIjC@Ep;0amJ*u@zCSny)Nbs6-=KIs<`$h$blN#<R|{$u@x z5D>w?w~l+)?E8#}U08kmZ!6ynY_yQUj}}sYH!K7LSkK7naOLJ;z#{<nzFYA1x`z{V z3V|o)UYzI7!6P*PxQ!YWO#L6CQqZ%I=+n>mCGvhd5xa(e%bOSf&8zdR+n}!()?!Fo z_>Vht_&ttXfMevM0s4Ccz?~r{>|oO#-cPU`HNbQIYWWQZJLj{8BgOAQ01yF$q?gxt WC6*U<;hI>#e%c!PcPrIwBK{9bOP^{0 literal 0 HcmV?d00001 diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/ru.html b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/ru.html index 8375a53ad..b91d66359 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/ru.html +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы/ru.html @@ -1,4 +1,4 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta><style>H1 { +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 9.00.8112.16470"></meta><style>H1 { TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold } .Programtext { @@ -14,39 +14,28 @@ BODY { FONT-FAMILY: Verdana; FONT-SIZE: 8pt } </style></head><body> -<h1>Порядок обновления на новую версию 1С:Предприятия 8.2</h1> -<h3>1. Скачать дистрибутив 1С:Предприятия 8.2</h3> -<p>Скачайте дистрибутив последней версии 1С:Предприятия 8.2 с сайта поддержки пользователей 1С по указанному адресу  <a href="http://users.v8.1c.ru/project.jsp?id=Platform82">http://users.v8.1c.ru/project.jsp?id=Platform82</a></p> +<h1>Порядок обновления на новую версию 1С:Предприятия 8.3</h1> +<h3>1. Скачать дистрибутив 1С:Предприятия 8.3</h3> +<p>Скачайте дистрибутив последней версии 1С:Предприятия 8.3 с сайта поддержки пользователей 1С по указанному адресу <a href="http://users.v8.1c.ru/project.jsp?id=Platform83">http://users.v8.1c.ru/project.jsp?id=Platform83</a></p> <p>Укажите имя пользователя и пароль, зарегистрированные на сайте поддержки пользователей: <a href="http://users.v8.1c.ru/">http://users.v8.1c.ru/</a></p> -<p><img src="_files/UserSite.png"></img></p> +<p><img src="_files/UserSite11.png"></img></p> <p>Для скачивания файла перейдите в раздел «Технологическая платформа 1С:Предприятия для Windows»:</p> -<p><img src="_files/Platform.png"></img></p> +<p><img src="_files/Платф11.jpg"></img></p> <p>Сохраните файл на диск, запомните папку, в которую его сохранили:</p> -<p><img src="_files/Download.png"></img></p> -<p> </p> -<h3>2. Установить новую версию 1С:Предприятия 8.2</h3> +<p><img src="_files/Download11.png"></img></p> +<p></p> +<h3>2. Установить новую версию 1С:Предприятия 8.3</h3> <p>Обратите внимание: для установки программы пользователь Windows должен обладать правами администратора! Распакуйте загруженный файл с архивом. В папке, в которую распаковали архив, найдите и запустите файл Setup.exe:</p> -<p><img src="_files/SetupEXE.png"></img></p> +<p><img src="_files/Уст11.png"></img></p> <p>Далее следуйте инструкциям программы – установщика:</p> -<p><img src="_files/Setup1.jpg"></img></p> -<p><img src="_files/Setup2.jpg"></img></p> -<p><img src="_files/Setup3.jpg"></img></p> -<p><img src="_files/Setup4.jpg"></img></p> -<p><img src="_files/setup5.jpg"></img></p> -<p><img src="_files/setup6.jpg"></img></p> -<p> </p> +<p><img src="_files/шаг121.png"></img></p> +<p><img src="_files/шаг21.png"></img></p> +<p><img src="_files/шаг311.png"></img></p> +<p><img src="_files/шаг41.png"></img></p> +<p><img src="_files/шаг51.png"></img></p> +<p><img src="_files/шаг61.png"></img></p> +<p></p> <h3>3. Сделать резервную копию информационной базы</h3> <p>Определите и откройте каталог, в котором находится нужная база данных:</p> -<p><img src="_files/Start1.png"></img></p> -<p><img src="_files/Safe.png"></img></p> -<p> </p> -<h3>4. Особенности перехода с версии платформы 1С:Предприятия 8.2.13 и ниже</h3> -<p>Если обновление происходит с версии платформы 1С:Предприятия 8.2.13 и ниже, то может потребоваться конвертация данных.</p> -<p>Для конвертации базы откройте ее в конфигураторе:</p> -<p><img src="_files/startconf.png"></img></p> -<p>Если система безопасности Windows запросит, разблокируйте программу – это нужно для получения обновлений через Интернет.</p> -<p>Далее следуйте инструкциям, указанным на рисунках.</p> -<p><img src="_files/Convert1.png"></img></p> -<p><img src="_files/Convert2.png"></img></p> -<p>После этого откроется окно конфигуратора – просто закройте его. Конвертация выполнена, база готова к работе в новой версии программы:</p> -<p><img src="_files/StartEnt.png"></img></p></body></html> \ No newline at end of file +<p><img src="_files/запуск1.png"></img></p> +<p><img src="_files/Safe21.png"></img></p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/Template.htmldoc b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/Template.htmldoc deleted file mode 100644 index 1621f1d23..000000000 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/Template.htmldoc +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<htmldoc:HtmlDocument xmlns:htmldoc="http://g5.1c.ru/v8/dt/html-document"> - <pages lang="ru"/> -</htmldoc:HtmlDocument> diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/ru.html b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/ru.html deleted file mode 100644 index adf30967a..000000000 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/Templates/ПорядокОбновленияДляФайловойБазы83/ru.html +++ /dev/null @@ -1,41 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"></meta><link rel="stylesheet" type="text/css" href="__STYLE__"></link><meta name="GENERATOR" content="MSHTML 8.00.7601.17514"></meta><style>H1 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; COLOR: #003366; FONT-SIZE: 18pt; FONT-WEIGHT: bold -} -.Programtext { - FONT-FAMILY: Courier; COLOR: #000080; FONT-SIZE: 10pt -} -H3 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 11pt; FONT-WEIGHT: bold -} -H4 { - TEXT-ALIGN: left; FONT-FAMILY: Arial, Tahoma; FONT-SIZE: 10pt; FONT-WEIGHT: bold -} -BODY { - FONT-FAMILY: Verdana; FONT-SIZE: 8pt -} -</style></head><body> -<h1>Порядок обновления на новую версию 1С:Предприятия 8.3</h1> -<h3>1. Скачать дистрибутив 1С:Предприятия 8.3</h3> -<p>Скачайте дистрибутив последней версии 1С:Предприятия 8.3 с сайта поддержки пользователей 1С по указанному адресу <a href="http://users.v8.1c.ru/project.jsp?id=Platform83">http://users.v8.1c.ru/project.jsp?id=Platform83</a></p> -<p>Укажите имя пользователя и пароль, зарегистрированные на сайте поддержки пользователей: <a href="http://users.v8.1c.ru/">http://users.v8.1c.ru/</a></p> -<p><img src="_files/UserSite1.png"></img></p> -<p>Для скачивания файла перейдите в раздел «Технологическая платформа 1С:Предприятия для Windows»:</p> -<p><img src="_files/Платф1.jpg"></img></p> -<p>Сохраните файл на диск, запомните папку, в которую его сохранили:</p> -<p><img src="_files/Download1.png"></img></p> -<p></p> -<h3>2. Установить новую версию 1С:Предприятия 8.3</h3> -<p>Обратите внимание: для установки программы пользователь Windows должен обладать правами администратора! Распакуйте загруженный файл с архивом. В папке, в которую распаковали архив, найдите и запустите файл Setup.exe:</p> -<p><img src="_files/Уст1.png"></img></p> -<p>Далее следуйте инструкциям программы – установщика:</p> -<p><img src="_files/шаг12.png"></img></p> -<p><img src="_files/шаг2.png"></img></p> -<p><img src="_files/шаг31.png"></img></p> -<p><img src="_files/шаг4.png"></img></p> -<p><img src="_files/шаг5.png"></img></p> -<p><img src="_files/шаг6.png"></img></p> -<p></p> -<h3>3. Сделать резервную копию информационной базы</h3> -<p>Определите и откройте каталог, в котором находится нужная база данных:</p> -<p><img src="_files/запуск.png"></img></p> -<p><img src="_files/Safe2.png"></img></p></body></html> \ No newline at end of file diff --git a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/НерекомендуемаяВерсияПлатформы.mdo b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/НерекомендуемаяВерсияПлатформы.mdo index 3555c0e75..bc60f1544 100644 --- a/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/НерекомендуемаяВерсияПлатформы.mdo +++ b/SSL/src/DataProcessors/НерекомендуемаяВерсияПлатформы/НерекомендуемаяВерсияПлатформы.mdo @@ -44,20 +44,4 @@ </synonym> <templateType>HTMLDocument</templateType> </templates> - <templates uuid="a35baee5-66cd-4888-8db3-de2c8e2509c4"> - <name>ПорядокОбновленияДляФайловойБазы83</name> - <synonym> - <key>ru</key> - <value>Порядок обновления для файловой базы</value> - </synonym> - <templateType>HTMLDocument</templateType> - </templates> - <templates uuid="2f474bb6-7c65-4e09-a3a4-f8cea664f2a0"> - <name>ПорядокОбновленияДляКлиентСервернойБазы83</name> - <synonym> - <key>ru</key> - <value>Порядок обновления для клиент серверной базы</value> - </synonym> - <templateType>HTMLDocument</templateType> - </templates> </mdclass:DataProcessor> diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Form.form b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Form.form index fbc1cf173..451fad812 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Form.form @@ -23,7 +23,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстСообщенияОбновляемаяКонфигурацияРасширеннаяПодсказка</name> + <name>ТекстСообщенияОбновляемаяКонфигурацияExtendedTooltip</name> <id>14</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -58,7 +58,7 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ТекстПоясненияРасширеннаяПодсказка</name> + <name>ТекстПоясненияExtendedTooltip</name> <id>15</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> @@ -89,7 +89,7 @@ <value>Обновление программы</value> - ОбновлениеПрограммыРасширеннаяПодсказка + ОбновлениеПрограммыExtendedTooltip 13 Label true @@ -119,7 +119,7 @@ true - ТекстПодготовкаКЗапускуРасширеннаяПодсказка + ТекстПодготовкаКЗапускуExtendedTooltip 17 Label true @@ -153,7 +153,7 @@ true - ТекстПоясненияПодготовкаКЗапускуРасширеннаяПодсказка + ТекстПоясненияПодготовкаКЗапускуExtendedTooltip 18 Label true @@ -184,7 +184,7 @@ Начальное заполнение - НачальноеЗаполнениеРасширеннаяПодсказка + НачальноеЗаполнениеExtendedTooltip 16 Label true @@ -208,7 +208,7 @@ Режим запуска - РежимЗапускаРасширеннаяПодсказка + РежимЗапускаExtendedTooltip 12 Label true @@ -248,7 +248,7 @@ Retry SaveValues Yes - LockOwner + LockWholeInterface true true Vertical diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl index 19fc150da..76add31f5 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОбновленияИБ/Module.bsl @@ -8,12 +8,6 @@ Возврат; КонецЕсли; - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда - Выполнить("РежимОткрытияОкна = РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс"); - КонецЕсли; - - ПриЗапускеКлиентскогоПриложения = Параметры.ПриЗапускеКлиентскогоПриложения; - НачальноеЗаполнениеДанных = ОбновлениеИнформационнойБазы.НачальноеЗаполнениеДанных(); Если НачальноеЗаполнениеДанных Тогда Заголовок = НСтр("ru = 'Начальное заполнение данных'"); @@ -32,55 +26,24 @@ Возврат; КонецЕсли; - ПодключитьОбработчикОжидания("ОбновитьИнформационнуюБазуПриЗапуске", 0.1, Истина); + ПодключитьОбработчикОжидания("ОбновитьИнформационнуюБазу", 0.1, Истина); + КонецПроцедуры /////////////////////////////////////////////////////////////////////// // СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ &НаКлиенте -Процедура ОбновитьИнформационнуюБазуПриЗапуске() +Процедура ОбновитьИнформационнуюБазу() - Отказ = Ложь; - - НовыйПараметрЗапуска = СтрЗаменить(ПараметрЗапуска, "ЗапуститьОбновлениеИнформационнойБазы", ""); - НовыйПараметрЗапуска = СтрЗаменить(НовыйПараметрЗапуска, """", """"""); - НовыйПараметрЗапуска = "/C """ + НовыйПараметрЗапуска + """"; - - ОбновитьИнформационнуюБазу(Отказ, ПриЗапускеКлиентскогоПриложения); - Если Отказ Тогда - ПрекратитьРаботуСистемы(); - Возврат; - КонецЕсли; - - Если ОбщегоНазначенияПовтИсп.РазделениеВключено() - И ОбщегоНазначенияПовтИсп.ДоступноИспользованиеРазделенныхДанных() Тогда - СтандартныеПодсистемыКлиент.ЗавершающиеДействияПриНачалеРаботыСистемы(); - Закрыть(); - Возврат; - КонецЕсли; - - ПрекратитьРаботуСистемы(Истина, НовыйПараметрЗапуска); - Возврат; - -КонецПроцедуры - -&НаКлиенте -Процедура ОбновитьИнформационнуюБазу(Отказ, ПриЗапускеКлиентскогоПриложения = Ложь) - - Если Не НачальноеЗаполнениеДанных Тогда - ТекстСостояния = НСтр("ru = 'Пожалуйста, подождите, выполняется обновление информационной базы...'"); - КонецЕсли; - - Состояние(ТекстСостояния); - ДокументОписаниеОбновлений = Неопределено; + ДополнительныеПараметры = Новый Структура; ИнформацияОбОшибке = Неопределено; ВремяНачалаОбновления = ОбщегоНазначенияКлиент.ДатаСеанса(); Попытка - ПризнакВыполненияОбработчиков = ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы( - Ложь, ПриЗапускеКлиентскогоПриложения); + ПризнакВыполненияОбработчиков = + ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы(Ложь, Истина); Исключение ИнформацияОбОшибке = ИнформацияОбОшибке(); КонецПопытки; @@ -91,64 +54,107 @@ ПрекратитьРаботуСистемы(Истина, НовыйПараметрЗапуска); КонецЕсли; - Если ИнформацияОбОшибке = Неопределено Тогда - ВремяОкончанияОбновления = ОбщегоНазначенияКлиент.ДатаСеанса(); + ДополнительныеПараметры.Вставить("ДокументОписаниеОбновлений", Неопределено); + ДополнительныеПараметры.Вставить("ИнформацияОбОшибке", ИнформацияОбОшибке); + ДополнительныеПараметры.Вставить("ВремяНачалаОбновления", ВремяНачалаОбновления); + ДополнительныеПараметры.Вставить("ВремяОкончанияОбновления", ОбщегоНазначенияКлиент.ДатаСеанса()); + ДополнительныеПараметры.Вставить("ПризнакВыполненияОбработчиков", ПризнакВыполненияОбработчиков); + + Если ИнформацияОбОшибке = Неопределено + И ПризнакВыполненияОбработчиков = "ОшибкаУстановкиМонопольногоРежима" Тогда + + ОбновитьИнформационнуюБазуПриОшибкеУстановкиМонопольногоРежима(ДополнительныеПараметры); + Возврат; - Пока ПризнакВыполненияОбработчиков = "ОшибкаУстановкиМонопольногоРежима" Цикл - // Открытие формы для отключения активных сеансов - ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Отказ); - Если Не Отказ Тогда - Состояние(ТекстСостояния); - - Попытка - ПризнакВыполненияОбработчиков = ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы( - Ложь, ПриЗапускеКлиентскогоПриложения); - Исключение - ИнформацияОбОшибке = ИнформацияОбОшибке(); - Прервать; - КонецПопытки; - - ВремяОкончанияОбновления = ОбщегоНазначенияКлиент.ДатаСеанса(); - Если ПризнакВыполненияОбработчиков <> "ОшибкаУстановкиМонопольногоРежима" Тогда - ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); - КонецЕсли; - - Иначе - Возврат; - КонецЕсли; - - КонецЦикла; КонецЕсли; - Если ИнформацияОбОшибке <> Неопределено Тогда + ОбновитьИнформационнуюБазуЗавершение(ДополнительныеПараметры); + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформационнуюБазуПриОшибкеУстановкиМонопольногоРежима(ДополнительныеПараметры) + + Если ДополнительныеПараметры.ПризнакВыполненияОбработчиков = "ОшибкаУстановкиМонопольногоРежима" Тогда + + // Открытие формы для отключения активных сеансов + Оповещение = Новый ОписаниеОповещения( + "ОбновитьИнформационнуюБазуПриОшибкеУстановкиМонопольногоРежимаЗавершение", ЭтотОбъект, ДополнительныеПараметры); + ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение); + + Иначе + + ОбновитьИнформационнуюБазуЗавершение(ДополнительныеПараметры); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформационнуюБазуПриОшибкеУстановкиМонопольногоРежимаЗавершение(Результат, ДополнительныеПараметры) Экспорт + + Если Результат = Неопределено Или Результат Тогда + Закрыть(Новый Структура("Отказ, Перезапустить", Истина, Ложь)); + Возврат; + Иначе + + Попытка + ПризнакВыполненияОбработчиков = + ОбновлениеИнформационнойБазыВызовСервера.ВыполнитьОбновлениеИнформационнойБазы( + Ложь, ПриЗапускеКлиентскогоПриложения); + Исключение + ДополнительныеПараметры.ИнформацияОбОшибке = ИнформацияОбОшибке(); + ОбновитьИнформационнуюБазуЗавершение(ДополнительныеПараметры); + Возврат; + КонецПопытки; + + ДополнительныеПараметры.ВремяОкончанияОбновления = ОбщегоНазначенияКлиент.ДатаСеанса(); + КонецЕсли; + + Если ПризнакВыполненияОбработчиков = "ОшибкаУстановкиМонопольногоРежима" Тогда + ДополнительныеПараметры.ПризнакВыполненияОбработчиков = ПризнакВыполненияОбработчиков; + ОбновитьИнформационнуюБазуПриОшибкеУстановкиМонопольногоРежима(ДополнительныеПараметры); + Иначе + ОбновлениеИнформационнойБазыВызовСервера.СнятьБлокировкуФайловойБазы(); + ОбновитьИнформационнуюБазуЗавершение(ДополнительныеПараметры); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформационнуюБазуЗавершение(ДополнительныеПараметры) + + Если ДополнительныеПараметры.ИнформацияОбОшибке <> Неопределено Тогда ВремяОкончанияОбновления = ОбщегоНазначенияКлиент.ДатаСеанса(); ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("КраткоеСообщениеОбОшибке", КраткоеПредставлениеОшибки(ИнформацияОбОшибке)); - ПараметрыФормы.Вставить("ПодробноеСообщениеОбОшибке", ПодробноеПредставлениеОшибки(ИнформацияОбОшибке)); - ПараметрыФормы.Вставить("ВремяНачалаОбновления", ВремяНачалаОбновления); + ПараметрыФормы.Вставить("КраткоеСообщениеОбОшибке", КраткоеПредставлениеОшибки(ДополнительныеПараметры.ИнформацияОбОшибке)); + ПараметрыФормы.Вставить("ПодробноеСообщениеОбОшибке", ПодробноеПредставлениеОшибки(ДополнительныеПараметры.ИнформацияОбОшибке)); + ПараметрыФормы.Вставить("ВремяНачалаОбновления", ДополнительныеПараметры.ВремяНачалаОбновления); ПараметрыФормы.Вставить("ВремяОкончанияОбновления", ВремяОкончанияОбновления); - ЗавершитьРаботу = ОткрытьФормуМодально("Обработка.ОбновлениеИнформационнойБазы.Форма.СообщениеОНеудачномОбновлении", ПараметрыФормы); - Если ЗавершитьРаботу = Неопределено - Или ЗавершитьРаботу Тогда - Отказ = Истина; - Возврат; - Иначе - ПрекратитьРаботуСистемы(Истина, НовыйПараметрЗапуска); - Отказ = Истина; - Возврат; - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ОбновитьИнформационнуюБазуДействияПриОшибке", ЭтотОбъект); + ОткрытьФорму("Обработка.ОбновлениеИнформационнойБазы.Форма.СообщениеОНеудачномОбновлении", + ПараметрыФормы,,,,,ОписаниеОповещения); + + Возврат; КонецЕсли; - Если Не НачальноеЗаполнениеДанных Тогда - Состояние(НСтр("ru = 'Обновление информационной базы выполнено успешно.'")); - КонецЕсли; + ОбновлениеИнформационнойБазыВызовСервера.ЗаписатьВремяВыполненияОбновления( + ДополнительныеПараметры.ВремяНачалаОбновления, ДополнительныеПараметры.ВремяОкончанияОбновления); - ОбновлениеИнформационнойБазыВызовСервера.ЗаписатьВремяВыполненияОбновления(ВремяНачалаОбновления, ВремяОкончанияОбновления); + Закрыть(Новый Структура("Отказ, Перезапустить", Ложь, Ложь)); - Если ТипЗнч(ПараметрыРаботыКлиентаПриОбновлении) <> Тип("Структура") Тогда - ПараметрыРаботыКлиентаПриОбновлении = Новый Структура; +КонецПроцедуры + +&НаКлиенте +Процедура ОбновитьИнформационнуюБазуДействияПриОшибке(ЗавершитьРаботу, ДополнительныеПараметры) Экспорт + + Если ЗавершитьРаботу = Неопределено + Или ЗавершитьРаботу Тогда + Закрыть(Новый Структура("Отказ, Перезапустить", Истина, Ложь)); + Иначе + Закрыть(Новый Структура("Отказ, Перезапустить", Истина, Истина)); КонецЕсли; КонецПроцедуры @@ -162,11 +168,11 @@ // Отказ - булево - если Истина - завершает работу программы // &НаКлиенте -Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Отказ) +Процедура ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение) - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - МодульСоединенияИБКлиент = ОбщегоНазначенияКлиентСервер.ОбщийМодуль("СоединенияИБКлиент"); - МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Отказ); + Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда + МодульСоединенияИБКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("СоединенияИБКлиент"); + МодульСоединенияИБКлиент.ПриОткрытииФормыОшибкиУстановкиМонопольногоРежима(Оповещение); КонецЕсли; КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Form.form b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Form.form index 017f77dff..a5b46ec31 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Form.form @@ -20,8 +20,8 @@ true - КартинкаИнформацияРасширеннаяПодсказка - 136 + КартинкаИнформацияExtendedTooltip + 129 Label true true @@ -36,11 +36,11 @@ 7 true - 1 + 2 true - CommonPicture.Успешно + CommonPicture.Успешно32 @@ -61,8 +61,8 @@ true - ИнформацияОбновлениеЗавершеноРасширеннаяПодсказка - 138 + ИнформацияОбновлениеЗавершеноExtendedTooltip + 131 Label true true @@ -96,8 +96,8 @@ true - ГиперссылкаОсновноеОбновлениеРасширеннаяПодсказка - 139 + ГиперссылкаОсновноеОбновлениеExtendedTooltip + 132 Label true true @@ -136,8 +136,8 @@ Группа информация об обновлении - ГруппаИнформацияОбОбновленииРасширеннаяПодсказка - 137 + ГруппаИнформацияОбОбновленииExtendedTooltip + 130 Label true true @@ -170,8 +170,8 @@ false - ГруппаОбновлениеЗавершеноРасширеннаяПодсказка - 135 + ГруппаОбновлениеЗавершеноExtendedTooltip + 128 Label true true @@ -211,8 +211,8 @@ true - КартинкаИнформацияФайловаяБазаРасширеннаяПодсказка - 143 + КартинкаИнформацияФайловаяБазаExtendedTooltip + 136 Label true true @@ -255,8 +255,8 @@ true - ЗаголовокИнформацииФайловаяБазаРасширеннаяПодсказка - 146 + ЗаголовокИнформацииФайловаяБазаExtendedTooltip + 139 Label true true @@ -290,8 +290,8 @@ true - ОткрытьСписокОтложенныхОбработчиков1РасширеннаяПодсказка - 147 + ОткрытьСписокОтложенныхОбработчиков1ExtendedTooltip + 140 Label true true @@ -317,8 +317,8 @@ true - ВыполнитьРасширеннаяПодсказка - 148 + ВыполнитьExtendedTooltip + 141 Label true true @@ -351,8 +351,8 @@ true - ИнформацияПодсказкаФайловаяБазаРасширеннаяПодсказка - 149 + ИнформацияПодсказкаФайловаяБазаExtendedTooltip + 142 Label true true @@ -379,8 +379,8 @@ true - Группа2РасширеннаяПодсказка - 145 + Группа2ExtendedTooltip + 138 Label true true @@ -414,8 +414,8 @@ true - ИнформацияПодсказкаРасширеннаяПодсказка - 151 + ИнформацияПодсказкаExtendedTooltip + 144 Label true true @@ -445,8 +445,8 @@ true - Группа3РасширеннаяПодсказка - 150 + Группа3ExtendedTooltip + 143 Label true true @@ -478,8 +478,8 @@ Группа информация файловая база - ГруппаИнформацияФайловаяБазаРасширеннаяПодсказка - 144 + ГруппаИнформацияФайловаяБазаExtendedTooltip + 137 Label true true @@ -503,8 +503,8 @@ true - ГруппаНеобходимыеДействияРасширеннаяПодсказка - 142 + ГруппаНеобходимыеДействияExtendedTooltip + 135 Label true true @@ -528,8 +528,8 @@ true - ОбновлениеВФайловойБазеРасширеннаяПодсказка - 141 + ОбновлениеВФайловойБазеExtendedTooltip + 134 Label true true @@ -559,8 +559,8 @@ true - КартинкаИнформацияПользователюРасширеннаяПодсказка - 153 + КартинкаИнформацияПользователюExtendedTooltip + 146 Label true true @@ -586,37 +586,6 @@ ГруппаСодержаниеСтраницы 123 - - ОткрытьСписокОтложенныхОбработчиков2 - 126 - - <key>ru</key> - <value>Список процедур обработки данных</value> - - true - true - - true - - - ОткрытьСписокОтложенныхОбработчиков2РасширеннаяПодсказка - 155 - Label - true - true - - Left - - - Hyperlink - Form.Command.ОткрытьСписокОтложенныхОбработчиков - Normal - Auto - true - true - UserCmds - Auto - ЗаголовокИнформацииДляПользователя 124 @@ -632,8 +601,8 @@ true - ЗаголовокИнформацииДляПользователяРасширеннаяПодсказка - 156 + ЗаголовокИнформацииДляПользователяExtendedTooltip + 148 Label true true @@ -654,14 +623,45 @@ Center + + ОткрытьСписокОтложенныхОбработчиков2 + 126 + + <key>ru</key> + <value>Список процедур обработки данных</value> + + true + true + + true + + + ОткрытьСписокОтложенныхОбработчиков2ExtendedTooltip + 149 + Label + true + true + + Left + + + Hyperlink + Form.Command.ОткрытьСписокОтложенныхОбработчиков + Normal + Auto + true + true + UserCmds + Auto + true true true - ГруппаСодержаниеСтраницыРасширеннаяПодсказка - 154 + ГруппаСодержаниеСтраницыExtendedTooltip + 147 Label true true @@ -685,8 +685,8 @@ true - СтатусОбновленияДляПользователяРасширеннаяПодсказка - 152 + СтатусОбновленияДляПользователяExtendedTooltip + 145 Label true true @@ -716,8 +716,8 @@ true - КартинкаДействиеВыполняетсяРасширеннаяПодсказка - 159 + КартинкаДействиеВыполняетсяExtendedTooltip + 152 Label true true @@ -758,8 +758,8 @@ true - ЗаголовокИнформацииРасширеннаяПодсказка - 161 + ЗаголовокИнформацииExtendedTooltip + 154 Label true true @@ -792,8 +792,8 @@ true - ИнформацияСтатусОбновленияРасширеннаяПодсказка - 162 + ИнформацияСтатусОбновленияExtendedTooltip + 155 Label true true @@ -819,7 +819,7 @@ - ИнформацияПодсказкаКлиентСервернаяБаза + ИнформацияПодсказкаФайловаяБаза2 114 <key>ru</key> @@ -833,8 +833,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ИнформацияПодсказкаКлиентСервернаяБазаРасширеннаяПодсказка</name> - <id>163</id> + <name>ИнформацияПодсказкаФайловаяБаза2ExtendedTooltip</name> + <id>156</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -843,7 +843,7 @@ </extInfo> </extendedTooltip> <contextMenu> - <name>ИнформацияПодсказкаКлиентСервернаяБазаКонтекстноеМеню</name> + <name>ИнформацияПодсказкаФайловаяБаза2КонтекстноеМеню</name> <id>115</id> <autoFill>true</autoFill> </contextMenu> @@ -871,8 +871,8 @@ <common>true</common> </userVisible> <extendedTooltip> - <name>ПодсказкаПроПериодНаименьшейАктивностиПользователейРасширеннаяПодсказка</name> - <id>165</id> + <name>ПодсказкаПроПериодНаименьшейАктивностиПользователейExtendedTooltip</name> + <id>158</id> <type>Label</type> <autoMaxWidth>true</autoMaxWidth> <autoMaxHeight>true</autoMaxHeight> @@ -891,85 +891,24 @@ <horizontalStretch>false</horizontalStretch> <extInfo xsi:type="form:LabelDecorationExtInfo"> <horizontalAlign>Left</horizontalAlign> + <titleHeight>2</titleHeight> </extInfo> </items> - <items xsi:type="form:FormGroup"> - <name>ГруппаНастройкаРасписания</name> - <id>133</id> - <items xsi:type="form:Button"> - <name>ИзменитьРасписание</name> - <id>116</id> - <title> - <key>ru</key> - <value>Настроить расписание</value> - - true - true - - true - - - ИзменитьРасписаниеРасширеннаяПодсказка - 167 - Label - true - true - - Left - - - Hyperlink - Form.Command.ИзменитьРасписание - Normal - Auto - true - true - UserCmds - Auto - - - ПроверитьБлокировкуРегламентныхЗаданий - 132 - true - true - - true - - - ПроверитьБлокировкуРегламентныхЗаданийРасширеннаяПодсказка - 168 - Label - true - true - - Left - - - Hyperlink - Form.Command.СнятьБлокировкуРегламентныхЗаданий - Normal - Auto - true - true - UserCmds - Auto - + + ИзменитьРасписание + 116 + + <key>ru</key> + <value>Настроить расписание</value> + true true true - - <key>ru</key> - <value>Группа настройка расписания</value> - - - ru - Группа настройка расписания - - ГруппаНастройкаРасписанияРасширеннаяПодсказка - 166 + ИзменитьРасписаниеExtendedTooltip + 159 Label true true @@ -977,14 +916,15 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - + Hyperlink + Form.Command.ИзменитьРасписание + Normal + Auto + true + 2 + true + UserCmds + Auto true true @@ -992,8 +932,8 @@ true - ГруппаПодсказкаПроПериодНаименьшейАктивностиПользователейРасширеннаяПодсказка - 164 + ГруппаПодсказкаПроПериодНаименьшейАктивностиПользователейExtendedTooltip + 157 Label true true @@ -1003,7 +943,6 @@ UsualGroup - Vertical Auto true true @@ -1023,8 +962,8 @@ true - ОтступРасширеннаяПодсказка - 170 + ОтступExtendedTooltip + 161 Label true true @@ -1058,8 +997,8 @@ true - ПодсказкаГдеНайтиЭтуФормуРасширеннаяПодсказка - 171 + ПодсказкаГдеНайтиЭтуФормуExtendedTooltip + 162 Label true true @@ -1089,8 +1028,8 @@ true - ГруппаПодсказкаРасширеннаяПодсказка - 169 + ГруппаПодсказкаExtendedTooltip + 160 Label true true @@ -1118,8 +1057,8 @@ Группа информация о прогрессе - ГруппаИнформацияОПрогрессеРасширеннаяПодсказка - 160 + ГруппаИнформацияОПрогрессеExtendedTooltip + 153 Label true true @@ -1147,8 +1086,8 @@ Группа ход обновления - ГруппаХодОбновленияРасширеннаяПодсказка - 158 + ГруппаХодОбновленияExtendedTooltip + 151 Label true true @@ -1176,8 +1115,8 @@ Обновление выполняется - ОбновлениеВыполняетсяРасширеннаяПодсказка - 157 + ОбновлениеВыполняетсяExtendedTooltip + 150 Label true true @@ -1209,8 +1148,8 @@ true - КартинкаИнформация1РасширеннаяПодсказка - 174 + КартинкаИнформация1ExtendedTooltip + 165 Label true true @@ -1225,11 +1164,11 @@ 7 true - 1 + 2 true - StdPicture.Stop + CommonPicture.Ошибка32 @@ -1248,8 +1187,8 @@ true - ИнформацияОтложенныеОбработчикиОтсутствуютРасширеннаяПодсказка - 176 + ИнформацияОтложенныеОбработчикиОтсутствуютExtendedTooltip + 167 Label true true @@ -1285,8 +1224,8 @@ true - ИнформацияОтложенноеОбновлениеЗавершено1РасширеннаяПодсказка - 178 + ИнформацияОтложенноеОбновлениеЗавершено1ExtendedTooltip + 169 Label true true @@ -1319,8 +1258,8 @@ true - ОткрытьСписокОтложенныхОбработчиковРасширеннаяПодсказка - 179 + ОткрытьСписокОтложенныхОбработчиковExtendedTooltip + 170 Label true true @@ -1347,8 +1286,8 @@ Группа переход к списку отложенных обработчиков - ГруппаПереходКСпискуОтложенныхОбработчиковРасширеннаяПодсказка - 177 + ГруппаПереходКСпискуОтложенныхОбработчиковExtendedTooltip + 168 Label true true @@ -1375,8 +1314,8 @@ true - Отступ1РасширеннаяПодсказка - 180 + Отступ1ExtendedTooltip + 171 Label true true @@ -1410,8 +1349,8 @@ true - ИнформацияПодсказка1РасширеннаяПодсказка - 181 + ИнформацияПодсказка1ExtendedTooltip + 172 Label true true @@ -1445,8 +1384,8 @@ Группа информация об обновлении - ГруппаИнформацияОбОбновлении1РасширеннаяПодсказка - 175 + ГруппаИнформацияОбОбновлении1ExtendedTooltip + 166 Label true true @@ -1470,8 +1409,8 @@ true - ГруппаОтложенноеОбновлениеЗавершеноРасширеннаяПодсказка - 173 + ГруппаОтложенноеОбновлениеЗавершеноExtendedTooltip + 164 Label true true @@ -1499,8 +1438,8 @@ Обновление завершено - ОбновлениеЗавершеноРасширеннаяПодсказка - 172 + ОбновлениеЗавершеноExtendedTooltip + 163 Label true true @@ -1523,8 +1462,8 @@ Статус обновления - СтатусОбновленияРасширеннаяПодсказка - 140 + СтатусОбновленияExtendedTooltip + 133 Label true true @@ -1555,8 +1494,8 @@ true - ФормаЗакрытьРасширеннаяПодсказка - 134 + ФормаЗакрытьExtendedTooltip + 127 Label true true @@ -1795,24 +1734,6 @@ Auto Auto - - СнятьБлокировкуРегламентныхЗаданий - - <key>ru</key> - <value>Снять блокировку регламентных заданий</value> - - 5 - - true - - - - СнятьБлокировкуРегламентныхЗаданий - - - Auto - Auto - ОткрытиеИзПанелиАдминистрирования diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Module.bsl b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Module.bsl index 130baa727..bc31cb6e7 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ИндикацияХодаОтложенногоОбновленияИБ/Module.bsl @@ -186,18 +186,16 @@ Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Расписание); - Если Диалог.ОткрытьМодально() Тогда - Расписание = Диалог.Расписание; - УстановитьРасписаниеОтложенногоОбновления(Расписание); - КонецЕсли; + ОписаниеОповещения = Новый ОписаниеОповещения("ИзменитьРасписаниеЗавершение", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещения); КонецПроцедуры &НаКлиенте -Процедура СнятьБлокировкуРегламентныхЗаданий(Команда) +Процедура ИзменитьРасписаниеЗавершение(Расписание, ДополнительныеПараметры) Экспорт - Если ОбщегоНазначенияКлиентСервер.ПодсистемаСуществует("СтандартныеПодсистемы.ЗавершениеРаботыПользователей") Тогда - ОткрытьФорму("Обработка.БлокировкаРаботыПользователей.Форма.Форма"); + Если Расписание <> Неопределено Тогда + УстановитьРасписаниеОтложенногоОбновления(Расписание); КонецЕсли; КонецПроцедуры @@ -218,7 +216,7 @@ Элементы.ИнформацияПодсказка1.Видимость = Ложь; Элементы.Отступ1.Видимость = Ложь; - Если Не ЭтоПолноправныйПользователь И Не РольДоступна("ПросмотрЖурналаРегистрации")Тогда + Если Не ЭтоПолноправныйПользователь И Не Пользователи.РолиДоступны("ПросмотрЖурналаРегистрации") Тогда Элементы.ГиперссылкаОсновноеОбновление.Видимость = Ложь; КонецЕсли; @@ -347,10 +345,10 @@ Иначе ТекстСообщения = НСтр("ru = 'Все процедуры обновления выполнены успешно (%1)'"); КонецЕсли; - Элементы.КартинкаИнформация1.Картинка = БиблиотекаКартинок.Успешно; + Элементы.КартинкаИнформация1.Картинка = БиблиотекаКартинок.Успешно32; Иначе ТекстСообщения = НСтр("ru = 'Не все процедуры удалось выполнить (выполнено %1 из %2)'"); - Элементы.КартинкаИнформация1.Картинка = БиблиотекаКартинок.Остановить; + Элементы.КартинкаИнформация1.Картинка = БиблиотекаКартинок.Ошибка32; КонецЕсли; Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( ТекстСообщения, УспешноВыполненоОбработчиков, ВсегоОбработчиков); diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form index af0f3d664..4677bd20b 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Form.form @@ -28,8 +28,8 @@ ОтложенныеОбработчики.Обработчик - ОтложенныеОбработчикиОбработчикРасширеннаяПодсказка - 33 + ОтложенныеОбработчикиОбработчикExtendedTooltip + 24 Label true true @@ -74,8 +74,8 @@ None - ОтложенныеОбработчикиСтатусКартинкаРасширеннаяПодсказка - 36 + ОтложенныеОбработчикиСтатусКартинкаExtendedTooltip + 26 Label true true @@ -116,8 +116,8 @@ ОтложенныеОбработчики.СтатусОбработчика - ОтложенныеОбработчикиСтатусОбработчикаРасширеннаяПодсказка - 38 + ОтложенныеОбработчикиСтатусОбработчикаExtendedTooltip + 27 Label true true @@ -156,8 +156,8 @@ Группа статус картинка - ГруппаСтатусКартинкаРасширеннаяПодсказка - 35 + ГруппаСтатусКартинкаExtendedTooltip + 25 Label true true @@ -179,10 +179,10 @@ ОтложенныеОбработчикиСтрокаПоиска - 24 + 34 ОтложенныеОбработчикиСтрокаПоискаРасширеннаяПодсказка - 26 + 36 Label true true @@ -192,7 +192,7 @@ ОтложенныеОбработчикиСтрокаПоискаКонтекстноеМеню - 25 + 35 true ОтложенныеОбработчики @@ -202,10 +202,10 @@ ОтложенныеОбработчикиСостояниеПросмотра - 27 + 37 ОтложенныеОбработчикиСостояниеПросмотраРасширеннаяПодсказка - 29 + 39 Label true true @@ -215,7 +215,7 @@ ОтложенныеОбработчикиСостояниеПросмотраКонтекстноеМеню - 28 + 38 true ViewStatusAddition @@ -226,10 +226,10 @@ ОтложенныеОбработчикиУправлениеПоиском - 30 + 40 ОтложенныеОбработчикиУправлениеПоискомРасширеннаяПодсказка - 32 + 42 Label true true @@ -239,7 +239,7 @@ ОтложенныеОбработчикиУправлениеПоискомКонтекстноеМеню - 31 + 41 true SearchControlAddition @@ -249,7 +249,7 @@ - ОтложенныеОбработчикиРасширеннаяПодсказка + ОтложенныеОбработчикиExtendedTooltip 23 Label true @@ -304,8 +304,8 @@ None - ОтложенныеОбработчикиИнформацияОПроцедуреОбновленияРасширеннаяПодсказка - 48 + ОтложенныеОбработчикиИнформацияОПроцедуреОбновленияExtendedTooltip + 28 Label true true @@ -350,8 +350,8 @@ true - ГиперссылкаОтложенноеОбновлениеРасширеннаяПодсказка - 50 + ГиперссылкаОтложенноеОбновлениеExtendedTooltip + 29 Label true true @@ -389,8 +389,8 @@ true - ОбновлениеВыполняетсяРасширеннаяПодсказка - 51 + ОбновлениеВыполняетсяExtendedTooltip + 30 Label true true @@ -424,7 +424,7 @@ 11 <key>ru</key> - <value>Невыполненные процедуры рекомендуется запустить повторно.</value> + <value>Невыполненные процедуры рекомендуется запустить повторно.</value> true true @@ -432,8 +432,8 @@ true - ТекстПоясненияРасширеннаяПодсказка - 53 + ТекстПоясненияExtendedTooltip + 32 Label true true @@ -465,8 +465,8 @@ true - ЗапуститьПовторноРасширеннаяПодсказка - 54 + ЗапуститьПовторноExtendedTooltip + 33 Label true true @@ -493,8 +493,8 @@ Группа повторный запуск - ГруппаПовторныйЗапускРасширеннаяПодсказка - 52 + ГруппаПовторныйЗапускExtendedTooltip + 31 Label true true @@ -527,7 +527,7 @@ true - ФормаЗакрытьФормуРасширеннаяПодсказка + ФормаЗакрытьФормуExtendedTooltip 22 Label true diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl index dac7b4512..f8ef79450 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/ОтложенныеОбработчики/Module.bsl @@ -22,7 +22,7 @@ ОбновлениеВыполняется = (СведенияОбОбновлении.ОтложенноеОбновлениеЗавершеноУспешно = Неопределено); КонецЕсли; - Если Не РольДоступна("ПросмотрЖурналаРегистрации") Тогда + Если Не Пользователи.РолиДоступны("ПросмотрЖурналаРегистрации") Тогда Элементы.ГиперссылкаОтложенноеОбновление.Видимость = Ложь; КонецЕсли; @@ -71,7 +71,7 @@ ТекстПредупреждения = НСтр("ru = 'Обработка данных еще не выполнялась.'"); КонецЕсли; - Предупреждение(ТекстПредупреждения); + ПоказатьПредупреждение(,ТекстПредупреждения); КонецЕсли; КонецПроцедуры @@ -94,6 +94,7 @@ Процедура ОбновитьТаблицуОтложенныхОбработчиков(ВыполненыВсеОбработчики = Истина) ОтложенныеОбработчики.Очистить(); + ОбработчикиНеВыполнялись = Истина; СведенияОбОбновлении = ОбновлениеИнформационнойБазы.СведенияОбОбновленииИнформационнойБазы(); Для Каждого СтрокаДереваБиблиотека Из СведенияОбОбновлении.ДеревоОбработчиков.Строки Цикл @@ -108,16 +109,25 @@ КонецЕсли; Если СтрокаОбработчика.Статус = "Выполнено" Тогда + ОбработчикиНеВыполнялись = Ложь; СтрокаСписка.ИнформацияОПроцедуреОбновления = НСтр("ru = 'Процедура ""%1"" обработки данных завершилась успешно.'"); СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Выполнена'"); СтрокаСписка.Вес = 1; СтрокаСписка.СтатусКартинка = БиблиотекаКартинок.Успешно; + ИначеЕсли СтрокаОбработчика.Статус = "Выполняется" Тогда + ОбработчикиНеВыполнялись = Ложь; + СтрокаСписка.ИнформацияОПроцедуреОбновления = + НСтр("ru = 'Процедура ""%1"" обработки данных в данный момент выполняется.'"); + СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Выполняется'"); + СтрокаСписка.Вес = 3; + СтрокаСписка.СтатусКартинка = БиблиотекаКартинок.Успешно; ИначеЕсли СтрокаОбработчика.Статус = "Ошибка" Тогда + ОбработчикиНеВыполнялись = Ложь; ВыполненыВсеОбработчики = Ложь; СтрокаСписка.ИнформацияОПроцедуреОбновления = СтрокаОбработчика.ИнформацияОбОшибке; СтрокаСписка.СтатусОбработчика = НСтр("ru = 'Ошибка'"); - СтрокаСписка.Вес = 3; + СтрокаСписка.Вес = 4; СтрокаСписка.СтатусКартинка = БиблиотекаКартинок.Остановить; Иначе ВыполненыВсеОбработчики = Ложь; @@ -137,6 +147,12 @@ Элементы.ГруппаПовторныйЗапуск.Видимость = Ложь; КонецЕсли; + Если ОбработчикиНеВыполнялись Тогда + Элементы.ТекстПояснения = НСтр("ru = 'Рекомендуется запустить невыполненные процедуры обработки данных.'"); + Иначе + Элементы.ТекстПояснения = НСтр("ru = 'Невыполненные процедуры рекомендуется запустить повторно.'"); + КонецЕсли; + ОтложенныеОбработчики.Сортировать("Вес Убыв"); Элементы.ОбновлениеВыполняется.Видимость = ОбновлениеВыполняется; diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Form.form b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Form.form index 5518b2c74..3cf32f919 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/Forms/СообщениеОНеудачномОбновлении/Form.form @@ -20,7 +20,7 @@ true - КартинкаОшибкиРасширеннаяПодсказка + КартинкаОшибкиExtendedTooltip 16 Label true @@ -57,7 +57,7 @@ true - ТекстСообщенияОбОшибкеРасширеннаяПодсказка + ТекстСообщенияОбОшибкеExtendedTooltip 17 Label true @@ -88,7 +88,7 @@ Сообщение об ошибке - СообщениеОбОшибкеРасширеннаяПодсказка + СообщениеОбОшибкеExtendedTooltip 15 Label true @@ -118,7 +118,7 @@ true - ОтступРасширеннаяПодсказка + ОтступExtendedTooltip 19 Label true @@ -153,7 +153,7 @@ true - ТехническаяИнформацияОРезультатахОбновленияРасширеннаяПодсказка + ТехническаяИнформацияОРезультатахОбновленияExtendedTooltip 20 Label true @@ -194,7 +194,7 @@ Группа техническая информация о результатах обновления - ГруппаТехническаяИнформацияОРезультатахОбновленияРасширеннаяПодсказка + ГруппаТехническаяИнформацияОРезультатахОбновленияExtendedTooltip 18 Label true @@ -226,7 +226,7 @@ true - ЗавершитьРаботуРасширеннаяПодсказка + ЗавершитьРаботуExtendedTooltip 13 Label true @@ -252,7 +252,7 @@ true - ПерезапуститьПрограммуРасширеннаяПодсказка + ПерезапуститьПрограммуExtendedTooltip 14 Label true @@ -275,7 +275,7 @@ OnCreateAtServer ПриСозданииНаСервере - DontBlock + LockWholeInterface true true Vertical diff --git a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo index 162356908..5b6bb9795 100644 --- a/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo +++ b/SSL/src/DataProcessors/ОбновлениеИнформационнойБазы/ОбновлениеИнформационнойБазы.mdo @@ -9,6 +9,7 @@ ru Обновление информационной базы + true DataProcessor.ОбновлениеИнформационнойБазы.Form.ИндикацияХодаОтложенногоОбновленияИБ ИндикацияХодаОтложенногоОбновленияИБ diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form index d18c5624d..62ec3ea75 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Form.form @@ -2,31 +2,199 @@ <key>ru</key> - <value>Автоматическая проверка обновления в Интернете</value> + <value>Настройка обновления программы через Интернет</value> - - ПроверятьНаличиеОбновленияПриЗапуске - 2 - - <key>ru</key> - <value>Проверять наличие обновления в Интернете автоматически</value> - + + ГруппаАвтоматическогоОбновления + 16 + + ПроверятьНаличиеОбновленияПриЗапуске + 2 + + <key>ru</key> + <value>Проверять наличие обновления в Интернете автоматически</value> + + true + true + + true + + + Объект.ПроверятьНаличиеОбновленияПриЗапуске + + None + + OnChange + ПроверятьНаличиеОбновленияПриЗапускеПриИзменении + + + ПроверятьНаличиеОбновленияПриЗапускеExtendedTooltip + 14 + Label + true + true + + Left + + + + ПроверятьНаличиеОбновленияПриЗапускеКонтекстноеМеню + 3 + true + + RadioButtonField + Enter + true + Left + true + + 1 + + + ru + Отключена + + + 0 + + + + + ru + При запуске программы + + + 2 + + + + + ru + По заданому расписанию: + + + 1 + + + Vertical + + + + Группа3 + 35 + + Декорация1 + 37 + true + true + + true + + + Декорация1РасширеннаяПодсказка + 39 + Label + true + true + + Left + + + + Декорация1КонтекстноеМеню + 38 + true + + Label + true + true + true + + Left + + + + НадписьОткрытьРасписание + 7 + + <key>ru</key> + <value>Не задано</value> + + true + true + + true + + + НадписьОткрытьРасписаниеExtendedTooltip + 15 + Label + true + true + + Left + + + + НадписьОткрытьРасписаниеКонтекстноеМеню + 8 + true + + Label + true + true + false + false + + + Click + НадписьОткрытьРасписаниеНажатие + + true + Left + Center + + + true + true + + true + + + Группа3РасширеннаяПодсказка + 36 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + auto + Auto + Auto + + true true true - - Объект.ПроверятьНаличиеОбновленияПриЗапуске - - None - - OnChange - ПроверятьНаличиеОбновленияПриЗапускеПриИзменении - + + <key>ru</key> + <value>Автоматическая проверка обновлений</value> + + true + false - ПроверятьНаличиеОбновленияПриЗапускеРасширеннаяПодсказка - 14 + ГруппаАвтоматическогоОбновленияРасширеннаяПодсказка + 17 Label true true @@ -34,63 +202,254 @@ Left - - ПроверятьНаличиеОбновленияПриЗапускеКонтекстноеМеню - 3 - true - - RadioButtonField - Enter - true - Left - true - - 1 - - - ru - Отключена - - - 0 - - - - - ru - При каждом запуске программы - - - 2 - - - - - ru - По расписанию - - - 1 - - - Vertical + UsualGroup + + Auto + StrongSeparation + true + true + auto + Auto + Auto - - НадписьОткрытьРасписание - 7 - - <key>ru</key> - <value>Расписание</value> - + + ГруппаДоступаКПользовательскомуСайту + 18 + + Группа1 + 26 + + КодПользователяСервераОбновлений + 20 + + <key>ru</key> + <value>Код пользователя</value> + + true + true + + true + + + Объект.КодПользователяСервераОбновлений + + + КодПользователяСервераОбновленийРасширеннаяПодсказка + 22 + Label + true + true + + Left + + + + КодПользователяСервераОбновленийКонтекстноеМеню + 21 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + Normal + + + + ПарольСервераОбновлений + 23 + + <key>ru</key> + <value>Пароль</value> + + true + true + + true + + + Объект.ПарольСервераОбновлений + + + ПарольСервераОбновленийРасширеннаяПодсказка + 25 + Label + true + true + + Left + + + + ПарольСервераОбновленийКонтекстноеМеню + 24 + true + + InputField + Enter + true + Left + true + + 15 + true + true + false + true + true + true + true + true + Normal + + + true + true + + true + + + Группа1РасширеннаяПодсказка + 27 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + + + Группа2 + 28 + + ПолучитьКодПользователяИПароль + 33 + + <key>ru</key> + <value>Как получить код пользователя и пароль?</value> + + true + true + + true + + + ПолучитьКодПользователяИПарольРасширеннаяПодсказка + 34 + Label + true + true + + Left + + + Hyperlink + Form.Command.ПолучитьКодПользователяИПароль + Normal + Auto + true + true + UserCmds + Auto + + + ЗапомнитьПарольСервераОбновлений + 30 + + <key>ru</key> + <value>Запомнить пароль</value> + + true + true + + true + + + Объект.ЗапомнитьПарольСервераОбновлений + + Right + + ЗапомнитьПарольСервераОбновленийРасширеннаяПодсказка + 32 + Label + true + true + + Left + + + + ЗапомнитьПарольСервераОбновленийКонтекстноеМеню + 31 + true + + CheckBoxField + Enter + true + Left + true + + + true + true + + true + + + Группа2РасширеннаяПодсказка + 29 + Label + true + true + + Left + + + UsualGroup + + Vertical + Auto + true + true + Auto + Auto + + true true true + + <key>ru</key> + <value>Доступ на пользовательский сайт</value> + + true + false - НадписьОткрытьРасписаниеРасширеннаяПодсказка - 16 + ГруппаДоступаКПользовательскомуСайтуРасширеннаяПодсказка + 19 Label true true @@ -98,24 +457,16 @@ Left - - НадписьОткрытьРасписаниеКонтекстноеМеню - 8 - true - - Label - true - true - true - false - - - Click - НадписьОткрытьРасписаниеНажатие - - true - Left - Center + UsualGroup + + Auto + true + StrongSeparation + true + true + auto + Auto + Auto Bottom @@ -137,7 +488,7 @@ false - ОКРасширеннаяПодсказка + ОКExtendedTooltip 11 Label true @@ -163,7 +514,7 @@ true - ФормаОтменаРасширеннаяПодсказка + ФормаОтменаExtendedTooltip 12 Label true @@ -189,7 +540,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 13 Label true @@ -213,6 +564,10 @@ OnCreateAtServer ПриСозданииНаСервере + + OnClose + ПриЗакрытии + Abort CustomizeForm Ignore @@ -221,7 +576,6 @@ Retry SaveValues Yes - 60 LockOwner true true @@ -259,9 +613,6 @@ Объект.ДоступныеОбновления - - Объект.ЗапомнитьПарольСервераОбновлений - Объект.ИмяАдминистратораИБ @@ -289,9 +640,6 @@ Объект.КодЗадачиПланировщика - - Объект.КодПользователяСервераОбновлений - Объект.НестандартныеПортыСервера @@ -304,9 +652,6 @@ Объект.ПарольАдминистратораКластера - - Объект.ПарольСервераОбновлений - Объект.ПовторныйЗапуск @@ -352,6 +697,28 @@ Auto Auto
                    + + ПолучитьКодПользователяИПароль + + <key>ru</key> + <value>Получить код пользователя и пароль</value> + + 2 + + ru + Получить код пользователя и пароль + + + true + + + + ПолучитьКодПользователяИПароль + + + Auto + Auto + ПроверятьНаличиеОбновленияПриЗапуске diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl index c7f17d677..f0c917eef 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРасписания/Module.bsl @@ -1,3 +1,4 @@ + //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ @@ -8,8 +9,12 @@ Возврат; КонецЕсли; - ЗаполнитьЗначенияСвойств(Объект, Параметры); - УстановитьВидимостьРасписания(ЭтаФорма); + НастройкиОбновленияКонфигурации = ОбновлениеКонфигурации.ПолучитьСтруктуруНастроекПомощника(); + + ЗаполнитьЗначенияСвойств(Объект, НастройкиОбновленияКонфигурации); + Объект.РасписаниеПроверкиНаличияОбновления = ОбщегоНазначенияКлиентСервер.СтруктураВРасписание(Объект.РасписаниеПроверкиНаличияОбновления); + + УстановитьВидимостьРасписания(ЭтотОбъект); КонецПроцедуры @@ -19,7 +24,7 @@ &НаКлиенте Процедура ПроверятьНаличиеОбновленияПриЗапускеПриИзменении(Элемент) - УстановитьВидимостьРасписания(ЭтаФорма); + УстановитьВидимостьРасписания(ЭтотОбъект); КонецПроцедуры @@ -30,10 +35,8 @@ Объект.РасписаниеПроверкиНаличияОбновления = Новый РасписаниеРегламентногоЗадания; КонецЕсли; Диалог = Новый ДиалогРасписанияРегламентногоЗадания(Объект.РасписаниеПроверкиНаличияОбновления); - Если Диалог.ОткрытьМодально() Тогда - Объект.РасписаниеПроверкиНаличияОбновления = Диалог.Расписание; - КонецЕсли; - Элементы.НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(ЭтаФорма); + ОписаниеОповещения = Новый ОписаниеОповещения("НадписьОткрытьРасписаниеНажатиеЗавершение", ЭтотОбъект); + Диалог.Показать(ОписаниеОповещения); КонецПроцедуры @@ -56,17 +59,26 @@ КонецЕсли; НастройкиОбновленияКонфигурации.ПроверятьНаличиеОбновленияПриЗапуске = Объект.ПроверятьНаличиеОбновленияПриЗапуске; + НастройкиОбновленияКонфигурации.КодПользователяСервераОбновлений = Объект.КодПользователяСервераОбновлений; + НастройкиОбновленияКонфигурации.ПарольСервераОбновлений = ?(Объект.ЗапомнитьПарольСервераОбновлений, Объект.ПарольСервераОбновлений, ""); + НастройкиОбновленияКонфигурации.ЗапомнитьПарольСервераОбновлений = Объект.ЗапомнитьПарольСервераОбновлений; НастройкиОбновленияКонфигурации.РасписаниеПроверкиНаличияОбновления = ОбщегоНазначенияКлиентСервер.РасписаниеВСтруктуру(Объект.РасписаниеПроверкиНаличияОбновления); + ЗаписатьНастройки(НастройкиОбновленияКонфигурации); ОбновлениеКонфигурацииКлиент.ПодключитьОтключитьПроверкуПоРасписанию(Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 И Объект.РасписаниеПроверкиНаличияОбновления <> Неопределено); + КонецЕсли; - РезультатВыбора = Новый Структура; - РезультатВыбора.Вставить("ПроверятьНаличиеОбновленияПриЗапуске", Объект.ПроверятьНаличиеОбновленияПриЗапуске); - РезультатВыбора.Вставить("РасписаниеПроверкиНаличияОбновления", Объект.РасписаниеПроверкиНаличияОбновления); + Закрыть(); - ОповеститьОВыборе(РезультатВыбора); +КонецПроцедуры + +&НаКлиенте +Процедура ПолучитьКодПользователяИПароль(Команда) + + ПерейтиПоНавигационнойСсылке( + ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления().АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту); КонецПроцедуры @@ -77,9 +89,10 @@ Процедура УстановитьВидимостьРасписания(Форма) НадписьОткрытьРасписание = Форма.Элементы.НадписьОткрытьРасписание; + НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(Форма); + Если Форма.Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 Тогда НадписьОткрытьРасписание.Доступность = Истина; - НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(Форма); Иначе НадписьОткрытьРасписание.Доступность = Ложь; КонецЕсли; @@ -91,7 +104,7 @@ СтроковоеПредставлениеРасписания = Строка(Форма.Объект.РасписаниеПроверкиНаличияОбновления); Возврат ?(Не ПустаяСтрока(СтроковоеПредставлениеРасписания), - СтроковоеПредставлениеРасписания, НСтр("ru = 'Открыть расписание'")); + СтроковоеПредставлениеРасписания, НСтр("ru = 'Не задано'")); КонецФункции @@ -103,3 +116,20 @@ КонецФункции +&НаКлиенте +Процедура НадписьОткрытьРасписаниеНажатиеЗавершение(Расписание, ДополнительныеПараметры) Экспорт + + Если Расписание <> Неопределено Тогда + Объект.РасписаниеПроверкиНаличияОбновления = Расписание; + КонецЕсли; + + Элементы.НадписьОткрытьРасписание.Заголовок = ТекстНадписиОткрытьРасписание(ЭтотОбъект); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + + Оповестить("ЗакрытаФормаНастройкиОбновленияКонфигурации"); + +КонецПроцедуры diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form index 8874d570c..13fff67d4 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Form.form @@ -21,7 +21,7 @@ СоздаватьРезервнуюКопиюПриИзменении - СоздаватьРезервнуюКопиюРасширеннаяПодсказка + СоздаватьРезервнуюКопиюExtendedTooltip 42 Label true @@ -91,8 +91,8 @@ Объект.ИмяКаталогаРезервнойКопииИБ - ПолеКаталогРезервнойКопииРасширеннаяПодсказка - 45 + ПолеКаталогРезервнойКопииExtendedTooltip + 44 Label true true @@ -115,7 +115,6 @@ StartChoice ПолеКаталогРезервнойКопииНачалоВыбора - 20 true true true @@ -140,8 +139,8 @@ Отступ - ОтступРасширеннаяПодсказка - 44 + ОтступExtendedTooltip + 43 Label true true @@ -180,8 +179,8 @@ true - НадписьВосстанавливать1РасширеннаяПодсказка - 49 + НадписьВосстанавливать1ExtendedTooltip + 47 Label true true @@ -197,7 +196,6 @@ Label true true - true false Style.ПоясняющийТекст @@ -221,8 +219,8 @@ Автоматический откат - АвтоматическийОткатРасширеннаяПодсказка - 48 + АвтоматическийОткатExtendedTooltip + 46 Label true true @@ -258,8 +256,8 @@ ВосстанавливатьИнформационнуюБазуПриИзменении - ВосстанавливатьИнформационнуюБазуРасширеннаяПодсказка - 52 + ВосстанавливатьИнформационнуюБазуExtendedTooltip + 50 Label true true @@ -290,8 +288,8 @@ 11 <key>ru</key> - <value>Система автоматически выполнит откат -при возникновении нештатной ситуации в процессе обновления конфигурации.</value> + <value>Система автоматически выполнит откат при возникновении +нештатной ситуации в процессе обновления программы.</value> true true @@ -299,8 +297,8 @@ true - НадписьВосстанавливатьРасширеннаяПодсказка - 56 + НадписьВосстанавливатьExtendedTooltip + 53 Label true true @@ -316,7 +314,6 @@ Label true true - true false Style.ПоясняющийТекст @@ -336,8 +333,8 @@ Восстанавливать - ВосстанавливатьРасширеннаяПодсказка - 55 + ВосстанавливатьExtendedTooltip + 52 Label true true @@ -367,8 +364,8 @@ true - НадписьНеВосстанавливатьРасширеннаяПодсказка - 58 + НадписьНеВосстанавливатьExtendedTooltip + 55 Label true true @@ -404,8 +401,8 @@ Не восстанавливать - НеВосстанавливатьРасширеннаяПодсказка - 57 + НеВосстанавливатьExtendedTooltip + 54 Label true true @@ -429,8 +426,8 @@ true - СтраницыНадписиРучногоОткатаРасширеннаяПодсказка - 54 + СтраницыНадписиРучногоОткатаExtendedTooltip + 51 Label true true @@ -450,8 +447,8 @@ true - ВертикальнаяГруппа1РасширеннаяПодсказка - 51 + ВертикальнаяГруппа1ExtendedTooltip + 49 Label true true @@ -479,8 +476,8 @@ Ручной откат - РучнойОткатРасширеннаяПодсказка - 50 + РучнойОткатExtendedTooltip + 48 Label true true @@ -502,8 +499,9 @@ 17 <key>ru</key> - <value>Откат к резервной копии НЕ будет выполняться при возникновении нештатной ситуации в процессе обновления программы. -Рекомендуется выбирать этот вариант, только если резервное копирование ИБ уже выполняется другими средствами.</value> + <value>Откат к резервной копии НЕ будет выполняться при возникновении нештатной ситуации +в процессе обновления программы. Рекомендуется выбирать этот вариант, только если +резервное копирование ИБ уже выполняется другими средствами.</value> true true @@ -511,8 +509,8 @@ true - Надпись1РасширеннаяПодсказка - 60 + Надпись1ExtendedTooltip + 57 Label true true @@ -528,7 +526,6 @@ Label true true - true false Style.ПоясняющийТекст @@ -536,7 +533,6 @@ Left Center - 2 true @@ -553,8 +549,8 @@ Без отката - БезОткатаРасширеннаяПодсказка - 59 + БезОткатаExtendedTooltip + 56 Label true true @@ -577,10 +573,9 @@ ru Панель информация - true - ПанельИнформацияРасширеннаяПодсказка - 47 + ПанельИнформацияExtendedTooltip + 45 Label true true @@ -612,7 +607,7 @@ false - КнопкаОКРасширеннаяПодсказка + КнопкаОКExtendedTooltip 39 Label true @@ -643,7 +638,7 @@ false - КнопкаЗакрытьРасширеннаяПодсказка + КнопкаЗакрытьExtendedTooltip 40 Label true @@ -668,7 +663,7 @@ true - ФормаСправкаРасширеннаяПодсказка + ФормаСправкаExtendedTooltip 41 Label true diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl index 4a4c750dd..01744e7e8 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/НастройкаРезервнойКопии/Module.bsl @@ -9,7 +9,7 @@ КонецЕсли; ЗаполнитьЗначенияСвойств(Объект, Параметры); - ОбновитьСостояниеЭлементовУправления(ЭтаФорма); + ОбновитьСостояниеЭлементовУправления(ЭтотОбъект); КонецПроцедуры @@ -32,12 +32,12 @@ &НаКлиенте Процедура СоздаватьРезервнуюКопиюПриИзменении(Элемент) - ОбновитьСостояниеЭлементовУправления(ЭтаФорма); + ОбновитьСостояниеЭлементовУправления(ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура ВосстанавливатьИнформационнуюБазуПриИзменении(Элемент) - ОбновитьНадписьРучногоОтката(ЭтаФорма); + ОбновитьНадписьРучногоОтката(ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -50,7 +50,7 @@ Файл = Новый Файл(Объект.ИмяКаталогаРезервнойКопииИБ); Отказ = НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоКаталог(); Если Отказ Тогда - Предупреждение(НСтр("ru = 'Укажите существующий каталог для сохранения резервной копии ИБ.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите существующий каталог для сохранения резервной копии ИБ.'")); ТекущийЭлемент = Элементы.ПолеКаталогРезервнойКопии; КонецЕсли; КонецЕсли; diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form index f5f88ca4c..b943b2c55 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Обозреватель/Form.form @@ -20,7 +20,7 @@ None - АдресСтраницыРасширеннаяПодсказка + АдресСтраницыExtendedTooltip 16 Label true @@ -63,8 +63,8 @@ false - СформироватьРасширеннаяПодсказка - 19 + СформироватьExtendedTooltip + 18 Label true true @@ -90,8 +90,8 @@ false - КнопкаНазадРасширеннаяПодсказка - 20 + КнопкаНазадExtendedTooltip + 19 Label true true @@ -117,8 +117,8 @@ false - КнопкаВпередРасширеннаяПодсказка - 21 + КнопкаВпередExtendedTooltip + 20 Label true true @@ -145,8 +145,8 @@ false - КнопкиРасширеннаяПодсказка - 18 + КнопкиExtendedTooltip + 17 Label true true @@ -170,7 +170,7 @@ true - АдреснаяСтрокаРасширеннаяПодсказка + АдреснаяСтрокаExtendedTooltip 15 Label true @@ -201,8 +201,8 @@ None - HTMLТекстРасширеннаяПодсказка - 22 + HTMLТекстExtendedTooltip + 21 Label true true diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form index bfa63f082..fd8c07954 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/ПредупреждениеWMI/Form.form @@ -14,7 +14,7 @@ true - Декорация1РасширеннаяПодсказка + Декорация1ExtendedTooltip 14 Label true @@ -52,7 +52,7 @@ true - КартинкаРасширеннаяПодсказка + КартинкаExtendedTooltip 16 Label true @@ -93,7 +93,7 @@ true - Декорация3РасширеннаяПодсказка + Декорация3ExtendedTooltip 18 Label true @@ -128,7 +128,7 @@ true - НадписьWebСтраницаРасширеннаяПодсказка + НадписьWebСтраницаExtendedTooltip 19 Label true @@ -161,7 +161,7 @@ true - Группа2РасширеннаяПодсказка + Группа2ExtendedTooltip 17 Label true @@ -186,7 +186,7 @@ true - Группа1РасширеннаяПодсказка + Группа1ExtendedTooltip 15 Label true @@ -219,7 +219,7 @@ false - ЗакрытьРасширеннаяПодсказка + ЗакрытьExtendedTooltip 13 Label true diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form index 623c3255c..c5d386ed8 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Form.form @@ -1,9 +1,5 @@ - - <key>ru</key> - <value>Обновление конфигурации</value> - СтраницыПомощника 1 @@ -15,7 +11,7 @@ 3 <key>ru</key> - <value>Вас приветствует помощник обновления конфигурации</value> + <value>Выбор источника получения обновления</value> true true @@ -23,7 +19,7 @@ true - НадписьШапкаДоброПожаловатьРасширеннаяПодсказка + НадписьШапкаДоброПожаловатьExtendedTooltip 659 Label true @@ -55,21 +51,25 @@ Left - - Декорация3 - 7 - - <key>ru</key> - <value>Выберите, каким образом программа будет получать обновления:</value> - + + ИсточникОбновления + 1012 true true true + + Объект.ИсточникОбновления + + None + + OnChange + ИсточникОбновленияПриИзменении + - Декорация3РасширеннаяПодсказка - 660 + ИсточникОбновленияРасширеннаяПодсказка + 1014 Label true true @@ -78,873 +78,48 @@ - Декорация3КонтекстноеМеню - 8 + ИсточникОбновленияКонтекстноеМеню + 1013 true - Label - true - true - false - - Left - - - - ГруппаИнтеренет - 414 - - СтраницыКартинкиИнтернет - 438 - - ЕстьКартинка - 439 - - ДекорацияЧерезИнтернет - 416 - - <key>ru</key> - <value>Декорация через Интернет</value> - - true - true - - true - - - ДекорацияЧерезИнтернетРасширеннаяПодсказка - 664 - Label - true - true - - Left - - - - ДекорацияЧерезИнтернетКонтекстноеМеню - 417 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияЧерезИнтернетНажатие - - - CommonPicture.Переключатель - - true - - - 1 - - - - true - true - - true - - - ЕстьКартинкаРасширеннаяПодсказка - 663 - Label - true - true - - Left - - - Page - - Vertical - - - - НетКартинки - 440 - - ДекорацияПустаяКартинка - 445 - true - true - - true - - - ДекорацияПустаяКартинкаРасширеннаяПодсказка - 666 - Label - true - true - - Left - - - - ДекорацияПустаяКартинкаКонтекстноеМеню - 446 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияЧерезИнтернетНажатие - - true - - - 1 - - - - true - true - - true - - - НетКартинкиРасширеннаяПодсказка - 665 - Label - true - true - - Left - - - Page - - Vertical - - - true - true - - true - - - СтраницыКартинкиИнтернетРасширеннаяПодсказка - 662 - Label - true - true - - Left - - - Pages - - Auto - - - - Группа8 - 415 - - НадписьПользовательскийСайт - 418 - + <type>RadioButtonField</type> + <editMode>Enter</editMode> + <showInHeader>true</showInHeader> + <headerHorizontalAlign>Left</headerHorizontalAlign> + <showInFooter>true</showInFooter> + <extInfo xsi:type="form:RadioButtonsFieldExtInfo"> + <columnsCount>1</columnsCount> + <choiceList> + <presentation> <key>ru</key> - <value>Пользовательский сайт в Интернете (рекомендуется)</value> - - true - true - - true - - - НадписьПользовательскийСайтРасширеннаяПодсказка - 668 - Label - true - true - - Left - - - - НадписьПользовательскийСайтКонтекстноеМеню - 419 - true - - Label - true - true - false - - Left - Center - - - - ПропускатьПриветствие - 12 - + <value>Автоматический поиск обновления в Интернете (рекомендуется) +Обновление через сайт поддержки пользователей системы "1С:Предприятие 8"</value> + </presentation> + <value xsi:type="core:NumberValue"> + <value>0</value> + </value> + </choiceList> + <choiceList> + <presentation> <key>ru</key> - <value>&Всегда подключаться к Интернету и пропускать этот шаг помощника</value> - - true - true - - true - - - Объект.ПропускатьПриветствие - - Right - - ПропускатьПриветствиеРасширеннаяПодсказка - 669 - Label - true - true - - Left - - - - ПропускатьПриветствиеКонтекстноеМеню - 13 - true - - CheckBoxField - Top - Enter - true - Left - true - - - true - true - - true - - 3 - false - - Группа8РасширеннаяПодсказка - 667 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - ГруппаИнтеренетРасширеннаяПодсказка - 661 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - Auto - Auto - - - - ГруппаИТС - 420 - - СтраницыКартинкиИТС - 443 - - ЕстьКартинка1 - 444 - - ДекорацияЧерезИТС - 421 - true - true - - true - - - ДекорацияЧерезИТСРасширеннаяПодсказка - 674 - Label - true - true - - Left - - - - ДекорацияЧерезИТСКонтекстноеМеню - 422 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияЧерезИТСНажатие - - - CommonPicture.Переключатель - - true - - - 1 - - - - true - true - - true - - - ЕстьКартинка1РасширеннаяПодсказка - 673 - Label - true - true - - Left - - - Page - - Vertical - - - - НетКартинки1 - 447 - - ДекорацияПустаяКартинка1 - 448 - true - true - - true - - - ДекорацияПустаяКартинка1РасширеннаяПодсказка - 676 - Label - true - true - - Left - - - - ДекорацияПустаяКартинка1КонтекстноеМеню - 449 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияЧерезИТСНажатие - - true - - - 1 - - - - true - true - - true - - - НетКартинки1РасширеннаяПодсказка - 675 - Label - true - true - - Left - - - Page - - Vertical - - - true - true - - true - - - СтраницыКартинкиИТСРасширеннаяПодсказка - 672 - Label - true - true - - Left - - - Pages - - Auto - - - - Группа19 - 423 - - НадписьИТС - 424 - + <value>Диск ИТС +Обновление с диска информационно-технологического сопровождения (1С:ИТС)</value> + </presentation> + <value xsi:type="core:NumberValue"> + <value>1</value> + </value> + </choiceList> + <choiceList> + <presentation> <key>ru</key> - <value>Диск ИТС</value> - - true - true - - true - - - НадписьИТСРасширеннаяПодсказка - 678 - Label - true - true - - Left - - - - НадписьИТСКонтекстноеМеню - 425 - true - - Label - true - true - false - - Left - Center - - - - Декорация2 - 426 - - <key>ru</key> - <value>Выберите этот вариант, чтобы выполнить обновление с диска информационно-технологического сопровождения (1С:ИТС).</value> - - true - true - - true - - - Декорация2РасширеннаяПодсказка - 679 - Label - true - true - - Left - - - - Декорация2КонтекстноеМеню - 427 - true - - Label - true - true - false - false - - Left - Center - - - true - true - - true - - 3 - false - - Группа19РасширеннаяПодсказка - 677 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - ГруппаИТСРасширеннаяПодсказка - 671 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - auto - Auto - Auto - - - - ГруппаФайл - 428 - - СтраницыКартинкиФайл - 450 - - ЕстьКартинка2 - 451 - - ДекорацияИзФайла - 429 - true - true - - true - - - ДекорацияИзФайлаРасширеннаяПодсказка - 683 - Label - true - true - - Left - - - - ДекорацияИзФайлаКонтекстноеМеню - 430 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияИзФайлаНажатие - - - CommonPicture.Переключатель - - true - - - 1 - - - - true - true - - true - - - ЕстьКартинка2РасширеннаяПодсказка - 682 - Label - true - true - - Left - - - Page - - Vertical - - - - НетКартинки2 - 452 - - ДекорацияПустаяКартинка2 - 453 - true - true - - true - - - ДекорацияПустаяКартинка2РасширеннаяПодсказка - 685 - Label - true - true - - Left - - - - ДекорацияПустаяКартинка2КонтекстноеМеню - 454 - true - - 4 - true - 2 - true - false - - - Click - ДекорацияИзФайлаНажатие - - true - - - 1 - - - - true - true - - true - - - НетКартинки2РасширеннаяПодсказка - 684 - Label - true - true - - Left - - - Page - - Vertical - - - true - true - - true - - - СтраницыКартинкиФайлРасширеннаяПодсказка - 681 - Label - true - true - - Left - - - Pages - - Auto - - - - Группа22 - 431 - - НадписьЛокальныйКаталог - 432 - - <key>ru</key> - <value>Локальный или сетевой каталог</value> - - true - true - - true - - - НадписьЛокальныйКаталогРасширеннаяПодсказка - 687 - Label - true - true - - Left - - - - НадписьЛокальныйКаталогКонтекстноеМеню - 433 - true - - Label - true - true - false - - Left - Center - - - - Декорация18 - 434 - - <key>ru</key> - <value>Выберите этот вариант, чтобы указать файл поставки обновления в локальном или сетевом каталоге.</value> - - true - true - - true - - - Декорация18РасширеннаяПодсказка - 688 - Label - true - true - - Left - - - - Декорация18КонтекстноеМеню - 435 - true - - Label - true - true - false - false - - Left - Center - - - true - true - - true - - 3 - false - - Группа22РасширеннаяПодсказка - 686 - Label - true - true - - Left - - - UsualGroup - - Vertical - Auto - true - true - Auto - Auto - - - true - true - - true - - - ГруппаФайлРасширеннаяПодсказка - 680 - Label - true - true - - Left - - - UsualGroup - - Auto - NormalSeparation - true - true - auto - Auto - Auto + Локальный или сетевой каталог +Обновление из файла поставки в локальном или сетевом каталоге + + + 2 + + + Vertical @@ -956,8 +131,8 @@ true - ОтступТриРасширеннаяПодсказка - 689 + ОтступТриExtendedTooltip + 688 Label true true @@ -979,145 +154,6 @@ Left - - ГруппаПроверкиНаличияОбновления - 487 - - НадписьПроверкиНаличияОбновления - 488 - - <key>ru</key> - <value>Автоматическая проверка обновления в Интернете:</value> - - true - true - - true - - - НадписьПроверкиНаличияОбновленияРасширеннаяПодсказка - 691 - Label - true - true - - Left - - - - НадписьПроверкиНаличияОбновленияКонтекстноеМеню - 489 - true - - Label - true - true - false - - Left - - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске - 475 - - <key>ru</key> - <value>Не проверять</value> - - true - true - - true - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеРасширеннаяПодсказка - 692 - Label - true - true - - Left - - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеКонтекстноеМеню - 476 - true - - Label - true - true - true - false - - - Click - ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие - - true - Left - - - true - true - - true - - - ГруппаПроверкиНаличияОбновленияРасширеннаяПодсказка - 690 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - auto - Auto - Auto - - - - НадписьСообщениеДалее - 16 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для поиска обновления программы.</value> - - true - true - - true - - - НадписьСообщениеДалееРасширеннаяПодсказка - 693 - Label - true - true - - Left - - - - НадписьСообщениеДалееКонтекстноеМеню - 17 - true - - Label - true - true - false - - Left - - true true @@ -1128,7 +164,7 @@ Добро пожаловать - ДоброПожаловатьРасширеннаяПодсказка + ДоброПожаловатьExtendedTooltip 658 Label true @@ -1159,8 +195,8 @@ true - НадписьШапкаПодключениеКИнтернетРасширеннаяПодсказка - 695 + НадписьШапкаПодключениеКИнтернетExtendedTooltip + 694 Label true true @@ -1203,8 +239,8 @@ true - ДекорацияКартинкаРасширеннаяПодсказка - 697 + ДекорацияКартинкаExtendedTooltip + 696 Label true true @@ -1250,8 +286,8 @@ true - Декорация6РасширеннаяПодсказка - 699 + Декорация6ExtendedTooltip + 698 Label true true @@ -1289,8 +325,8 @@ true - Декорация7РасширеннаяПодсказка - 701 + Декорация7ExtendedTooltip + 700 Label true true @@ -1325,8 +361,8 @@ true - НадписьПерейтиВЖурналРегистрацииРасширеннаяПодсказка - 702 + НадписьПерейтиВЖурналРегистрацииExtendedTooltip + 701 Label true true @@ -1359,8 +395,8 @@ true - Группа4РасширеннаяПодсказка - 700 + Группа4ExtendedTooltip + 699 Label true true @@ -1384,8 +420,8 @@ false - ВертикальнаяГруппаНадписиЖР2РасширеннаяПодсказка - 698 + ВертикальнаяГруппаНадписиЖР2ExtendedTooltip + 697 Label true true @@ -1409,8 +445,8 @@ true - Группа3РасширеннаяПодсказка - 696 + Группа3ExtendedTooltip + 695 Label true true @@ -1439,8 +475,8 @@ true - НастроитьПараметрыПроксиСервераРасширеннаяПодсказка - 704 + НастроитьПараметрыПроксиСервераExtendedTooltip + 703 Label true true @@ -1463,8 +499,8 @@ true - ГруппаНастроитьПараметрыПроксиСервераРасширеннаяПодсказка - 703 + ГруппаНастроитьПараметрыПроксиСервераExtendedTooltip + 702 Label true true @@ -1492,8 +528,8 @@ true - ОтступДевятьРасширеннаяПодсказка - 705 + ОтступДевятьExtendedTooltip + 704 Label true true @@ -1515,41 +551,6 @@ Left - - НадписьДалее - 39 - - <key>ru</key> - <value>Нажмите кнопку "Далее", чтобы повторить поиск обновления программы на пользовательском сайте.</value> - - true - true - - true - - - НадписьДалееРасширеннаяПодсказка - 706 - Label - true - true - - Left - - - - НадписьДалееКонтекстноеМеню - 40 - true - - Label - true - true - false - - Left - - true true @@ -1560,8 +561,8 @@ Подключение к сети Интернет - ПодключениеКИнтернетРасширеннаяПодсказка - 694 + ПодключениеКИнтернетExtendedTooltip + 693 Label true true @@ -1591,8 +592,8 @@ true - Декорация9РасширеннаяПодсказка - 708 + Декорация9ExtendedTooltip + 707 Label true true @@ -1628,7 +629,7 @@ 44 <key>ru</key> - <value>Вы можете получить обновление конфигурации с пользовательского сайта. + <value>Вы можете получить обновление программы с пользовательского сайта. Пожалуйста, укажите код пользователя и пароль.</value> true @@ -1637,8 +638,8 @@ true - Декорация10РасширеннаяПодсказка - 709 + Декорация10ExtendedTooltip + 708 Label true true @@ -1681,8 +682,8 @@ Объект.КодПользователяСервераОбновлений - КодПользователяСервераОбновленийРасширеннаяПодсказка - 712 + КодПользователяСервераОбновленийExtendedTooltip + 711 Label true true @@ -1727,8 +728,8 @@ Объект.ПарольСервераОбновлений - ПарольСервераОбновленийРасширеннаяПодсказка - 714 + ПарольСервераОбновленийExtendedTooltip + 712 Label true true @@ -1764,8 +765,8 @@ true - Группа2РасширеннаяПодсказка - 711 + Группа2ExtendedTooltip + 710 Label true true @@ -1799,8 +800,8 @@ true - НадписьИнформацияОПолученииДоступаРасширеннаяПодсказка - 717 + НадписьИнформацияОПолученииДоступаExtendedTooltip + 714 Label true true @@ -1844,8 +845,8 @@ Right - ЗапомнитьПарольСервераОбновленийРасширеннаяПодсказка - 718 + ЗапомнитьПарольСервераОбновленийExtendedTooltip + 715 Label true true @@ -1871,8 +872,8 @@ true - Группа5РасширеннаяПодсказка - 716 + Группа5ExtendedTooltip + 713 Label true true @@ -1900,8 +901,8 @@ Доступ на пользовательский сайт - ГруппаДоступНаПользовательскийСайтРасширеннаяПодсказка - 710 + ГруппаДоступНаПользовательскийСайтExtendedTooltip + 709 Label true true @@ -1929,8 +930,8 @@ true - НадписьТехническаяИнформацияОбОшибкеРасширеннаяПодсказка - 720 + НадписьТехническаяИнформацияОбОшибкеExtendedTooltip + 716 Label true true @@ -1963,8 +964,8 @@ true - ДекорацияКартинка1РасширеннаяПодсказка - 722 + ДекорацияКартинка1ExtendedTooltip + 718 Label true true @@ -2010,8 +1011,8 @@ true - Декорация11РасширеннаяПодсказка - 725 + Декорация11ExtendedTooltip + 721 Label true true @@ -2045,8 +1046,8 @@ true - НадписьКакОформитьПодпискуИТСРасширеннаяПодсказка - 726 + НадписьКакОформитьПодпискуИТСExtendedTooltip + 722 Label true true @@ -2082,8 +1083,8 @@ ПРОФ - ПРОФРасширеннаяПодсказка - 724 + ПРОФExtendedTooltip + 720 Label true true @@ -2114,8 +1115,8 @@ true - Декорация15РасширеннаяПодсказка - 728 + Декорация15ExtendedTooltip + 724 Label true true @@ -2141,9 +1142,9 @@ 73 <key>ru</key> - <value>Обновление конфигурации также можно получить в рамках информационно-технологического сопровождения (1С:ИТС), -включающего доступ к технологическим, методическим и консультационным материалам -(на DVD или в Интернет), а также сервисные и консалтинговые услуги.</value> + <value>Обновление версии программы также можно получить в рамках информационно-технологического +сопровождения (1С:ИТС), включающего доступ к технологическим, методическим и консультационным +материалам (на DVD или в Интернет), а также сервисные и консалтинговые услуги.</value> true true @@ -2151,8 +1152,8 @@ true - Декорация16РасширеннаяПодсказка - 729 + Декорация16ExtendedTooltip + 725 Label true true @@ -2187,8 +1188,8 @@ true - НадписьПодробнееОбИТСРасширеннаяПодсказка - 730 + НадписьПодробнееОбИТСExtendedTooltip + 726 Label true true @@ -2226,8 +1227,66 @@ Базовая - БазоваяРасширеннаяПодсказка - 727 + БазоваяExtendedTooltip + 723 + Label + true + true + + Left + + + Page + + Vertical + auto + + + + ОшибкаПроверкиЛегальности + 1015 + + ТекстОшибкиПроверкиЛегальности + 1017 + + <key>ru</key> + <value>Ошибка проверки легальности получения обновления.</value> + + true + true + + true + + + ТекстОшибкиПроверкиЛегальностиРасширеннаяПодсказка + 1019 + Label + true + true + + Left + + + + ТекстОшибкиПроверкиЛегальностиКонтекстноеМеню + 1018 + true + + Label + true + true + + Left + + + true + true + + true + + + ОшибкаПроверкиЛегальностиРасширеннаяПодсказка + 1016 Label true true @@ -2251,8 +1310,8 @@ Группа доступа на сайт - ГруппаДоступаНаСайтРасширеннаяПодсказка - 723 + ГруппаДоступаНаСайтExtendedTooltip + 719 Label true true @@ -2275,8 +1334,8 @@ Панель ошибка подключения - ПанельОшибкаПодключенияРасширеннаяПодсказка - 721 + ПанельОшибкаПодключенияExtendedTooltip + 717 Label true true @@ -2309,8 +1368,8 @@ None - ТехническаяИнформацияОбОшибкеРасширеннаяПодсказка - 732 + ТехническаяИнформацияОбОшибкеExtendedTooltip + 728 Label true true @@ -2324,6 +1383,7 @@ true LabelField + true Enter true Left @@ -2349,8 +1409,8 @@ true - НадписьИнфоЖРРасширеннаяПодсказка - 735 + НадписьИнфоЖРExtendedTooltip + 730 Label true true @@ -2385,8 +1445,8 @@ true - НадписьОткрытьЖурналРегистрации1РасширеннаяПодсказка - 736 + НадписьОткрытьЖурналРегистрации1ExtendedTooltip + 731 Label true true @@ -2421,8 +1481,8 @@ true - Группа6РасширеннаяПодсказка - 734 + Группа6ExtendedTooltip + 729 Label true true @@ -2446,8 +1506,8 @@ false - ПанельЖурналРегистрацииРасширеннаяПодсказка - 731 + ПанельЖурналРегистрацииExtendedTooltip + 727 Label true true @@ -2474,8 +1534,8 @@ true - Декорация66РасширеннаяПодсказка - 737 + Декорация66ExtendedTooltip + 732 Label true true @@ -2497,42 +1557,6 @@ Left - - НадписьДалее2 - 79 - - <key>ru</key> - <value>Нажмите кнопку "Далее", чтобы повторить получение обновления с пользовательского сайта, -или выберите "Назад", чтобы повторить поиск обновления в других источниках.</value> - - true - true - - true - - - НадписьДалее2РасширеннаяПодсказка - 738 - Label - true - true - - Left - - - - НадписьДалее2КонтекстноеМеню - 80 - true - - Label - true - true - false - - Left - - true true @@ -2543,8 +1567,8 @@ Подключение к сайту - ПодключениеКСайтуРасширеннаяПодсказка - 707 + ПодключениеКСайтуExtendedTooltip + 706 Label true true @@ -2574,8 +1598,8 @@ true - НадписьШапкаМестоположениеДискаИТСРасширеннаяПодсказка - 740 + НадписьШапкаМестоположениеДискаИТСExtendedTooltip + 735 Label true true @@ -2626,8 +1650,8 @@ ИсточникДискаИТСПриИзменении - ИсточникДискаИТСРасширеннаяПодсказка - 741 + ИсточникДискаИТСExtendedTooltip + 736 Label true true @@ -2693,8 +1717,8 @@ ДискИТС - ДискИТСРасширеннаяПодсказка - 746 + ДискИТСExtendedTooltip + 740 Label true true @@ -2739,8 +1763,8 @@ Указание каталога - УказаниеКаталогаРасширеннаяПодсказка - 745 + УказаниеКаталогаExtendedTooltip + 739 Label true true @@ -2770,8 +1794,8 @@ true - Декорация21РасширеннаяПодсказка - 749 + Декорация21ExtendedTooltip + 742 Label true true @@ -2800,8 +1824,8 @@ true - ИнфНадписьИТСРасширеннаяПодсказка - 748 + ИнфНадписьИТСExtendedTooltip + 741 Label true true @@ -2825,8 +1849,8 @@ Страницы наличия диска ИТС - СтраницыНаличияДискаИТСРасширеннаяПодсказка - 744 + СтраницыНаличияДискаИТСExtendedTooltip + 738 Label true true @@ -2845,8 +1869,8 @@ true - ОтступПятьРасширеннаяПодсказка - 743 + ОтступПятьExtendedTooltip + 737 Label true true @@ -2874,8 +1898,8 @@ true - ОтступШестьРасширеннаяПодсказка - 750 + ОтступШестьExtendedTooltip + 743 Label true true @@ -2897,41 +1921,6 @@ Left - - НадписьСообщениеДалее4 - 471 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для поиска обновления программы на диске 1С:ИТС.</value> - - true - true - - true - - - НадписьСообщениеДалее4РасширеннаяПодсказка - 751 - Label - true - true - - Left - - - - НадписьСообщениеДалее4КонтекстноеМеню - 472 - true - - Label - true - true - false - - Left - - true true @@ -2942,8 +1931,8 @@ Местоположение диска ИТС - МестоположениеДискаИТСРасширеннаяПодсказка - 739 + МестоположениеДискаИТСExtendedTooltip + 734 Label true true @@ -2965,7 +1954,7 @@ 284 <key>ru</key> - <value>Выбор файла поставки обновления конфигурации</value> + <value>Выбор файла поставки обновления</value> true true @@ -2973,8 +1962,8 @@ true - НадписьШапкаФайлОбновленияРасширеннаяПодсказка - 753 + НадписьШапкаФайлОбновленияExtendedTooltip + 746 Label true true @@ -3022,8 +2011,8 @@ ПереключательНуженФайлОбновленияПриИзменении - ПереключательНуженФайлОбновленияРасширеннаяПодсказка - 754 + ПереключательНуженФайлОбновленияExtendedTooltip + 747 Label true true @@ -3080,8 +2069,8 @@ None - ПолеФайлОбновленияРасширеннаяПодсказка - 757 + ПолеФайлОбновленияExtendedTooltip + 749 Label true true @@ -3126,8 +2115,8 @@ Отступ - ОтступРасширеннаяПодсказка - 756 + ОтступExtendedTooltip + 748 Label true true @@ -3158,8 +2147,8 @@ true - Картинка5РасширеннаяПодсказка - 760 + Картинка5ExtendedTooltip + 751 Label true true @@ -3203,8 +2192,8 @@ true - НадписьКонфигурацияИзмененаРасширеннаяПодсказка - 763 + НадписьКонфигурацияИзмененаExtendedTooltip + 754 Label true true @@ -3238,8 +2227,8 @@ true - ЕстьИзмененияРасширеннаяПодсказка - 762 + ЕстьИзмененияExtendedTooltip + 753 Label true true @@ -3269,8 +2258,8 @@ true - НадписьНетИзмененийРасширеннаяПодсказка - 765 + НадписьНетИзмененийExtendedTooltip + 756 Label true true @@ -3304,8 +2293,8 @@ true - НетИзмененийРасширеннаяПодсказка - 764 + НетИзмененийExtendedTooltip + 755 Label true true @@ -3330,8 +2319,8 @@ true - СтраницыНадписиИзмененнойКонфигурацииРасширеннаяПодсказка - 761 + СтраницыНадписиИзмененнойКонфигурацииExtendedTooltip + 752 Label true true @@ -3355,8 +2344,8 @@ false - ПанельОбновлениеИзОсновнойКонфигурацииРасширеннаяПодсказка - 759 + ПанельОбновлениеИзОсновнойКонфигурацииExtendedTooltip + 750 Label true true @@ -3383,8 +2372,8 @@ true - НадписьОтступРасширеннаяПодсказка - 766 + НадписьОтступExtendedTooltip + 757 Label true true @@ -3406,41 +2395,6 @@ Left - - Декорация51 - 293 - - <key>ru</key> - <value>Нажмите кнопку "Далее", чтобы продолжить обновление программы.</value> - - true - true - - true - - - Декорация51РасширеннаяПодсказка - 767 - Label - true - true - - Left - - - - Декорация51КонтекстноеМеню - 294 - true - - Label - true - true - false - - Left - - true true @@ -3451,8 +2405,8 @@ Файл обновления - ФайлОбновленияРасширеннаяПодсказка - 752 + ФайлОбновленияExtendedTooltip + 745 Label true true @@ -3474,7 +2428,7 @@ 116 <key>ru</key> - <value>Обнаружено обновление конфигурации</value> + <value>Доступна новая версия программы</value> true true @@ -3482,8 +2436,8 @@ true - НадписьШапкаДоступноеОбновлениеРасширеннаяПодсказка - 769 + НадписьШапкаДоступноеОбновлениеExtendedTooltip + 760 Label true true @@ -3529,8 +2483,8 @@ true - ДекорацияКартинка2РасширеннаяПодсказка - 772 + ДекорацияКартинка2ExtendedTooltip + 763 Label true true @@ -3573,8 +2527,8 @@ true - НадписьДоступноеОбновлениеРасширеннаяПодсказка - 775 + НадписьДоступноеОбновлениеExtendedTooltip + 766 Label true true @@ -3618,8 +2572,8 @@ true - НадписьИнформацияОбОбновленииРасширеннаяПодсказка - 776 + НадписьИнформацияОбОбновленииExtendedTooltip + 767 Label true true @@ -3662,8 +2616,8 @@ true - Декорация19РасширеннаяПодсказка - 778 + Декорация19ExtendedTooltip + 769 Label true true @@ -3697,8 +2651,8 @@ true - НадписьРазмерОбновленияРасширеннаяПодсказка - 779 + НадписьРазмерОбновленияExtendedTooltip + 770 Label true true @@ -3733,8 +2687,8 @@ true - Группа11РасширеннаяПодсказка - 777 + Группа11ExtendedTooltip + 768 Label true true @@ -3758,8 +2712,8 @@ false - Группа10РасширеннаяПодсказка - 774 + Группа10ExtendedTooltip + 765 Label true true @@ -3780,92 +2734,22 @@ ГруппаТребуетсяОбновлениеПлатформы 641 - - Группа13 - 646 - - ДекорацияВнимание - 647 - - <key>ru</key> - <value>Внимание:</value> - - true - true - - true - - - ДекорацияВниманиеРасширеннаяПодсказка - 782 - Label - true - true - - Left - - - - ДекорацияВниманиеКонтекстноеМеню - 648 - true - - Label - true - true - - System.DefaultGUIFont - true - false - false - false - - - Left - - - - ДекорацияОбновитеПлатформу - 642 - - <key>ru</key> - <value>Для обновления на эту версию необходимо перейти на платформу 1С:Предприятие 8.3</value> - - true - true - - true - - - ДекорацияОбновитеПлатформуРасширеннаяПодсказка - 783 - Label - true - true - - Left - - - - ДекорацияОбновитеПлатформуКонтекстноеМеню - 643 - true - - Label - true - true - - Left - - + + ДекорацияОбновитеПлатформу + 642 + + <key>ru</key> + <value><b>Внимание:</> Для обновления на эту версию необходимо <link Перейти>перейти на следующую редакцию</> + платформы 1С:Предприятие после чего можно будет установить это обновление.</value> + true true true - Группа13РасширеннаяПодсказка - 781 + ДекорацияОбновитеПлатформуExtendedTooltip + 774 Label true true @@ -3873,101 +2757,21 @@ Left - UsualGroup - - Auto - true - true - Auto - Auto - - - - Группа15 - 651 - - ДекорацияПослеОбновленияПлатформы - 649 - - <key>ru</key> - <value>после чего можно будет установить это обновление.</value> - - true - true - - true - - - ДекорацияПослеОбновленияПлатформыРасширеннаяПодсказка - 785 - Label - true - true - - Left - - - - ДекорацияПослеОбновленияПлатформыКонтекстноеМеню - 650 - true - - Label - true - true - - Left - - - - КакПерейтиНаПлатформу83 - 645 - true - true - - true - - - КакПерейтиНаПлатформу83РасширеннаяПодсказка - 786 - Label - true - true - - Left - - - Hyperlink - Form.Command.КакПерейтиНаПлатформу83 - Normal - Auto - true - true - UserCmds - Auto - - true - true - - true - - - Группа15РасширеннаяПодсказка - 784 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - Auto - Auto + + ДекорацияОбновитеПлатформуКонтекстноеМеню + 643 + true + + true + Label + true + true + + + URLProcessing + ДекорацияОбновитеПлатформуОбработкаНавигационнойСсылки + + Left true @@ -3976,8 +2780,8 @@ true - ГруппаТребуетсяОбновлениеПлатформыРасширеннаяПодсказка - 780 + ГруппаТребуетсяОбновлениеПлатформыExtendedTooltip + 771 Label true true @@ -4001,8 +2805,8 @@ true - Группа9РасширеннаяПодсказка - 773 + Группа9ExtendedTooltip + 764 Label true true @@ -4031,8 +2835,8 @@ true - ГруппаНомерВерсииРасширеннаяПодсказка - 771 + ГруппаНомерВерсииExtendedTooltip + 762 Label true true @@ -4059,8 +2863,8 @@ Информация о доступном обновлении - ИнформацияОДоступномОбновленииРасширеннаяПодсказка - 770 + ИнформацияОДоступномОбновленииExtendedTooltip + 761 Label true true @@ -4099,8 +2903,8 @@ true - Декорация20РасширеннаяПодсказка - 789 + Декорация20ExtendedTooltip + 780 Label true true @@ -4134,8 +2938,8 @@ true - НадписьТекущаяКонфигурацияРасширеннаяПодсказка - 790 + НадписьТекущаяКонфигурацияExtendedTooltip + 781 Label true true @@ -4162,8 +2966,8 @@ true - Группа12РасширеннаяПодсказка - 788 + Группа12ExtendedTooltip + 779 Label true true @@ -4193,8 +2997,8 @@ true - НадписьОписаниеКонфигурацииРасширеннаяПодсказка - 791 + НадписьОписаниеКонфигурацииExtendedTooltip + 782 Label true true @@ -4221,8 +3025,8 @@ true - Группа1РасширеннаяПодсказка - 787 + Группа1ExtendedTooltip + 778 Label true true @@ -4253,8 +3057,8 @@ true - ДекорацияКартинка21РасширеннаяПодсказка - 793 + ДекорацияКартинка21ExtendedTooltip + 784 Label true true @@ -4294,8 +3098,8 @@ true - Декорация22РасширеннаяПодсказка - 795 + Декорация22ExtendedTooltip + 786 Label true true @@ -4329,8 +3133,8 @@ true - НадписьПорядокОбновленияРасширеннаяПодсказка - 796 + НадписьПорядокОбновленияExtendedTooltip + 787 Label true true @@ -4362,8 +3166,8 @@ true - Группа14РасширеннаяПодсказка - 794 + Группа14ExtendedTooltip + 785 Label true true @@ -4391,8 +3195,8 @@ Панель порядок обновления - ПанельПорядокОбновленияРасширеннаяПодсказка - 792 + ПанельПорядокОбновленияExtendedTooltip + 783 Label true true @@ -4419,8 +3223,8 @@ true - ОтступДесятьРасширеннаяПодсказка - 797 + ОтступДесятьExtendedTooltip + 788 Label true true @@ -4442,255 +3246,6 @@ Left - - ГруппаПроверкиНаличияОбновления1 - 529 - - НадписьПроверкиНаличияОбновления1 - 530 - - <key>ru</key> - <value>Автоматическая проверка обновления в Интернете:</value> - - true - true - - true - - - НадписьПроверкиНаличияОбновления1РасширеннаяПодсказка - 799 - Label - true - true - - Left - - - - НадписьПроверкиНаличияОбновления1КонтекстноеМеню - 531 - true - - Label - true - true - false - - Left - - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1 - 532 - - <key>ru</key> - <value>Не проверять</value> - - true - true - - true - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1РасширеннаяПодсказка - 800 - Label - true - true - - Left - - - - ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1КонтекстноеМеню - 533 - true - - Label - true - true - true - false - - - Click - ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие - - true - Left - - - true - true - - true - - - ГруппаПроверкиНаличияОбновления1РасширеннаяПодсказка - 798 - Label - true - true - - Left - - - UsualGroup - - Auto - true - true - auto - Auto - Auto - - - - ПанельПереходаНаСледующийШаг - 366 - - Интернет1 - 367 - - Декорация23 - 113 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для получения обновления программы с пользовательского сайта.</value> - - true - true - - true - - - Декорация23РасширеннаяПодсказка - 803 - Label - true - true - - Left - - - - Декорация23КонтекстноеМеню - 114 - true - - Label - true - true - false - - Left - - - true - true - - true - - - Интернет1РасширеннаяПодсказка - 802 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - ИТС1 - 368 - - Декорация63 - 369 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для выбора способа обновления программы.</value> - - true - true - - true - - - Декорация63РасширеннаяПодсказка - 805 - Label - true - true - - Left - - - - Декорация63КонтекстноеМеню - 370 - true - - Label - true - true - false - - Left - - - true - true - - true - - - ИТС1РасширеннаяПодсказка - 804 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Панель перехода на следующий шаг</value> - - - ПанельПереходаНаСледующийШагРасширеннаяПодсказка - 801 - Label - true - true - - Left - - - Pages - - Auto - - true true @@ -4701,8 +3256,8 @@ Доступное обновление - ДоступноеОбновлениеРасширеннаяПодсказка - 768 + ДоступноеОбновлениеExtendedTooltip + 759 Label true true @@ -4732,8 +3287,8 @@ true - ЗаголовокОбновленияРасширеннаяПодсказка - 807 + ЗаголовокОбновленияExtendedTooltip + 798 Label true true @@ -4785,8 +3340,8 @@ true - Картинка26РасширеннаяПодсказка - 812 + Картинка26ExtendedTooltip + 803 Label true true @@ -4824,8 +3379,8 @@ true - НадписьУВасПоследняяВерсияРасширеннаяПодсказка - 813 + НадписьУВасПоследняяВерсияExtendedTooltip + 804 Label true true @@ -4855,8 +3410,8 @@ false - ГоризонтальнаяГруппа12РасширеннаяПодсказка - 811 + ГоризонтальнаяГруппа12ExtendedTooltip + 802 Label true true @@ -4884,8 +3439,8 @@ false - ОбновлениеНеТребуетсяРасширеннаяПодсказка - 810 + ОбновлениеНеТребуетсяExtendedTooltip + 801 Label true true @@ -4913,8 +3468,8 @@ true - Картинка24РасширеннаяПодсказка - 816 + Картинка24ExtendedTooltip + 807 Label true true @@ -4954,8 +3509,8 @@ true - НадписьОбновлениеНеОбнаруженоРасширеннаяПодсказка - 818 + НадписьОбновлениеНеОбнаруженоExtendedTooltip + 809 Label true true @@ -4994,8 +3549,8 @@ НадписьНеобходимыеДискиИТС - НадписьНеобходимыеДискиИТСРасширеннаяПодсказка - 819 + НадписьНеобходимыеДискиИТСExtendedTooltip + 810 Label true true @@ -5041,8 +3596,8 @@ true - НадписьПереченьРелизовНаДискахИТСРасширеннаяПодсказка - 821 + НадписьПереченьРелизовНаДискахИТСExtendedTooltip + 811 Label true true @@ -5080,8 +3635,8 @@ false - ГруппаПодходящихОбновленийИТСРасширеннаяПодсказка - 817 + ГруппаПодходящихОбновленийИТСExtendedTooltip + 808 Label true true @@ -5106,8 +3661,8 @@ false - ГоризонтальнаяГруппа16РасширеннаяПодсказка - 815 + ГоризонтальнаяГруппа16ExtendedTooltip + 806 Label true true @@ -5135,8 +3690,8 @@ false - ОбновлениеНеОбнаруженоРасширеннаяПодсказка - 814 + ОбновлениеНеОбнаруженоExtendedTooltip + 805 Label true true @@ -5165,8 +3720,8 @@ true - Картинка14РасширеннаяПодсказка - 824 + Картинка14ExtendedTooltip + 814 Label true true @@ -5204,8 +3759,8 @@ true - НадписьВключенаВозможностьИзмененийРасширеннаяПодсказка - 825 + НадписьВключенаВозможностьИзмененийExtendedTooltip + 815 Label true true @@ -5236,8 +3791,8 @@ false - ГоризонтальнаяГруппа3РасширеннаяПодсказка - 823 + ГоризонтальнаяГруппа3ExtendedTooltip + 813 Label true true @@ -5265,8 +3820,8 @@ false - ВключенаВозможностьИзмененийРасширеннаяПодсказка - 822 + ВключенаВозможностьИзмененийExtendedTooltip + 812 Label true true @@ -5295,8 +3850,8 @@ true - Картинка27РасширеннаяПодсказка - 828 + Картинка27ExtendedTooltip + 818 Label true true @@ -5334,8 +3889,8 @@ true - НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзломРасширеннаяПодсказка - 829 + НадписьОбновлениеКонфигурацииВыполняетсяПриОбменеДаннымиСГлавнымУзломExtendedTooltip + 819 Label true true @@ -5365,8 +3920,8 @@ false - ГоризонтальнаяГруппа13РасширеннаяПодсказка - 827 + ГоризонтальнаяГруппа13ExtendedTooltip + 817 Label true true @@ -5390,8 +3945,8 @@ false - ОбновлениеПроизводитсяВГлавномУзлеРасширеннаяПодсказка - 826 + ОбновлениеПроизводитсяВГлавномУзлеExtendedTooltip + 816 Label true true @@ -5416,8 +3971,8 @@ false - ПанельИнформацияОбОбновленииРасширеннаяПодсказка - 809 + ПанельИнформацияОбОбновленииExtendedTooltip + 800 Label true true @@ -5446,8 +4001,8 @@ true - Декорация30РасширеннаяПодсказка - 831 + Декорация30ExtendedTooltip + 821 Label true true @@ -5481,8 +4036,8 @@ true - НадписьВерсияТекущейКонфигурацииРасширеннаяПодсказка - 832 + НадписьВерсияТекущейКонфигурацииExtendedTooltip + 822 Label true true @@ -5516,8 +4071,8 @@ true - НадписьВерсияДляОбновленияРасширеннаяПодсказка - 833 + НадписьВерсияДляОбновленияExtendedTooltip + 823 Label true true @@ -5549,8 +4104,8 @@ false - ГруппаТекущаяВерсияРасширеннаяПодсказка - 830 + ГруппаТекущаяВерсияExtendedTooltip + 820 Label true true @@ -5580,8 +4135,8 @@ true - НадписьОписаниеТекущейКонфигурацииРасширеннаяПодсказка - 834 + НадписьОписаниеТекущейКонфигурацииExtendedTooltip + 824 Label true true @@ -5614,8 +4169,8 @@ false - ГруппаРезультатПоискаОбновленияРасширеннаяПодсказка - 808 + ГруппаРезультатПоискаОбновленияExtendedTooltip + 799 Label true true @@ -5651,8 +4206,8 @@ true - Декорация4РасширеннаяПодсказка - 836 + Декорация4ExtendedTooltip + 826 Label true true @@ -5687,8 +4242,8 @@ false - КнопкаПроверитьДискИТСРасширеннаяПодсказка - 837 + КнопкаПроверитьДискИТСExtendedTooltip + 827 Label true true @@ -5711,8 +4266,8 @@ true - ГруппаПроверкиДискаИТСРасширеннаяПодсказка - 835 + ГруппаПроверкиДискаИТСExtendedTooltip + 825 Label true true @@ -5739,8 +4294,8 @@ true - ОтступСемьРасширеннаяПодсказка - 838 + ОтступСемьExtendedTooltip + 828 Label true true @@ -5762,42 +4317,6 @@ Left - - НадписьСообщениеДалее1 - 141 - - <key>ru</key> - <value>Нажмите кнопку "Закрыть" для выхода из помощника обновления конфигурации, -или выберите "Назад", чтобы повторить поиск обновления в других источниках.</value> - - true - true - - true - - - НадписьСообщениеДалее1РасширеннаяПодсказка - 839 - Label - true - true - - Left - - - - НадписьСообщениеДалее1КонтекстноеМеню - 142 - true - - Label - true - true - false - - Left - - true true @@ -5808,8 +4327,8 @@ Обновления не обнаружено - ОбновленияНеОбнаруженоРасширеннаяПодсказка - 806 + ОбновленияНеОбнаруженоExtendedTooltip + 797 Label true true @@ -5839,8 +4358,8 @@ true - НадписьШапкаДлительнаяОперацияРасширеннаяПодсказка - 841 + НадписьШапкаДлительнаяОперацияExtendedTooltip + 831 Label true true @@ -5889,8 +4408,8 @@ true - ДекорацияКартинка33РасширеннаяПодсказка - 845 + ДекорацияКартинка33ExtendedTooltip + 835 Label true true @@ -5927,8 +4446,8 @@ true - Декорация34РасширеннаяПодсказка - 846 + Декорация34ExtendedTooltip + 836 Label true true @@ -5960,8 +4479,8 @@ false - Группа18РасширеннаяПодсказка - 844 + Группа18ExtendedTooltip + 834 Label true true @@ -5988,8 +4507,8 @@ Интернет - ИнтернетРасширеннаяПодсказка - 843 + ИнтернетExtendedTooltip + 833 Label true true @@ -6015,8 +4534,8 @@ true - ДекорацияКартинка35РасширеннаяПодсказка - 848 + ДекорацияКартинка35ExtendedTooltip + 838 Label true true @@ -6053,8 +4572,8 @@ true - Декорация36РасширеннаяПодсказка - 849 + Декорация36ExtendedTooltip + 839 Label true true @@ -6089,8 +4608,8 @@ false - ИТСРасширеннаяПодсказка - 847 + ИТСExtendedTooltip + 837 Label true true @@ -6115,8 +4634,8 @@ 80 false - ПанельОжиданиеДлительнойОперацииРасширеннаяПодсказка - 842 + ПанельОжиданиеДлительнойОперацииExtendedTooltip + 832 Label true true @@ -6145,8 +4664,8 @@ true - НадписьПрогрессРасширеннаяПодсказка - 851 + НадписьПрогрессExtendedTooltip + 841 Label true true @@ -6178,8 +4697,8 @@ Группа прогресс - ГруппаПрогрессРасширеннаяПодсказка - 850 + ГруппаПрогрессExtendedTooltip + 840 Label true true @@ -6208,8 +4727,8 @@ Длительная операция - ДлительнаяОперацияРасширеннаяПодсказка - 840 + ДлительнаяОперацияExtendedTooltip + 830 Label true true @@ -6239,8 +4758,8 @@ true - НадписьШапкаВыборРежимаОбнФайлРасширеннаяПодсказка - 853 + НадписьШапкаВыборРежимаОбнФайлExtendedTooltip + 843 Label true true @@ -6290,8 +4809,8 @@ true - НадписьДляОбновленияПотребуетсяПерезагрузкаРасширеннаяПодсказка - 856 + НадписьДляОбновленияПотребуетсяПерезагрузкаExtendedTooltip + 846 Label true true @@ -6323,8 +4842,8 @@ Все готово - ВсеГотовоРасширеннаяПодсказка - 855 + ВсеГотовоExtendedTooltip + 845 Label true true @@ -6350,8 +4869,8 @@ true - Декорация8РасширеннаяПодсказка - 858 + Декорация8ExtendedTooltip + 848 Label true true @@ -6391,8 +4910,8 @@ true - Декорация39РасширеннаяПодсказка - 860 + Декорация39ExtendedTooltip + 850 Label true true @@ -6426,8 +4945,8 @@ true - НадписьПорядокОбновления1РасширеннаяПодсказка - 861 + НадписьПорядокОбновления1ExtendedTooltip + 851 Label true true @@ -6459,8 +4978,8 @@ true - ВертикальнаяГруппа1РасширеннаяПодсказка - 859 + ВертикальнаяГруппа1ExtendedTooltip + 849 Label true true @@ -6488,8 +5007,8 @@ Все готово порядок обновления - ВсеГотовоПорядокОбновленияРасширеннаяПодсказка - 857 + ВсеГотовоПорядокОбновленияExtendedTooltip + 847 Label true true @@ -6512,8 +5031,8 @@ Панель все готово файл - ПанельВсеГотовоФайлРасширеннаяПодсказка - 854 + ПанельВсеГотовоФайлExtendedTooltip + 844 Label true true @@ -6539,8 +5058,8 @@ true - НадписьПолученоОбновлениеИзПриложенияФайлРасширеннаяПодсказка - 862 + НадписьПолученоОбновлениеИзПриложенияФайлExtendedTooltip + 852 Label true true @@ -6577,8 +5096,8 @@ ПереключательОбновленияПриИзменении - ПереключательОбновленияФайлРасширеннаяПодсказка - 863 + ПереключательОбновленияФайлExtendedTooltip + 853 Label true true @@ -6631,8 +5150,8 @@ true - Картинка1РасширеннаяПодсказка - 866 + Картинка1ExtendedTooltip + 855 Label true true @@ -6675,8 +5194,8 @@ true - Надпись43РасширеннаяПодсказка - 869 + Надпись43ExtendedTooltip + 858 Label true true @@ -6710,8 +5229,8 @@ true - НадписьСписокДействийРасширеннаяПодсказка - 870 + НадписьСписокДействийExtendedTooltip + 859 Label true true @@ -6748,8 +5267,8 @@ Активные пользователи - АктивныеПользователиРасширеннаяПодсказка - 868 + АктивныеПользователиExtendedTooltip + 857 Label true true @@ -6779,8 +5298,8 @@ true - Надпись42РасширеннаяПодсказка - 872 + Надпись42ExtendedTooltip + 861 Label true true @@ -6814,8 +5333,8 @@ true - НадписьСписокДействий1РасширеннаяПодсказка - 873 + НадписьСписокДействий1ExtendedTooltip + 862 Label true true @@ -6852,8 +5371,8 @@ Активные соединения - АктивныеСоединенияРасширеннаяПодсказка - 871 + АктивныеСоединенияExtendedTooltip + 860 Label true true @@ -6883,8 +5402,8 @@ true - Надпись45РасширеннаяПодсказка - 875 + Надпись45ExtendedTooltip + 864 Label true true @@ -6919,8 +5438,8 @@ true - НадписьСписокДействий3РасширеннаяПодсказка - 876 + НадписьСписокДействий3ExtendedTooltip + 865 Label true true @@ -6958,8 +5477,8 @@ Соединение конфигуратора - СоединениеКонфигуратораРасширеннаяПодсказка - 874 + СоединениеКонфигуратораExtendedTooltip + 863 Label true true @@ -6985,8 +5504,8 @@ 80 false - ПанельАктивныеПользователиРасширеннаяПодсказка - 867 + ПанельАктивныеПользователиExtendedTooltip + 856 Label true true @@ -7009,8 +5528,8 @@ Группа соединений - ГруппаСоединенийРасширеннаяПодсказка - 865 + ГруппаСоединенийExtendedTooltip + 854 Label true true @@ -7042,8 +5561,8 @@ true - НадписьПроцессОбновленияМожетЗанятьМногоВремениРасширеннаяПодсказка - 877 + НадписьПроцессОбновленияМожетЗанятьМногоВремениExtendedTooltip + 866 Label true true @@ -7074,8 +5593,8 @@ true - НадписьОтступ3РасширеннаяПодсказка - 878 + НадписьОтступ3ExtendedTooltip + 867 Label true true @@ -7113,8 +5632,8 @@ true - Надпись46РасширеннаяПодсказка - 880 + Надпись46ExtendedTooltip + 869 Label true true @@ -7148,8 +5667,8 @@ true - НадписьРезервнаяКопияФайлРасширеннаяПодсказка - 881 + НадписьРезервнаяКопияФайлExtendedTooltip + 870 Label true true @@ -7182,8 +5701,8 @@ true - ГруппаРезервнаяКопияРасширеннаяПодсказка - 879 + ГруппаРезервнаяКопияExtendedTooltip + 868 Label true true @@ -7201,277 +5720,6 @@ Auto - - ПанельПереходаНаСледующийШагРежимаОбновленияФайл - 333 - - Далее - 334 - - НадписьДалееВыборРежимаОбновленияФайл - 207 - - <key>ru</key> - <value>Нажмите кнопку "Далее", чтобы перезапустить программу.</value> - - true - true - - true - - - НадписьДалееВыборРежимаОбновленияФайлРасширеннаяПодсказка - 884 - Label - true - true - - Left - - - - НадписьДалееВыборРежимаОбновленияФайлКонтекстноеМеню - 208 - true - - Label - true - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Далее</value> - - - ДалееРасширеннаяПодсказка - 883 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - Готово - 335 - - Декорация56 - 336 - - <key>ru</key> - <value>Нажмите кнопку "Готово", чтобы выйти из помощника обновления конфигурации.</value> - - true - true - - true - - - Декорация56РасширеннаяПодсказка - 886 - Label - true - true - - Left - - - - Декорация56КонтекстноеМеню - 337 - true - - Label - true - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Готово</value> - - - ГотовоРасширеннаяПодсказка - 885 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - АктивныеСоединения2 - 338 - - Декорация57 - 339 - - <key>ru</key> - <value>Продолжение невозможно, так как с программой работают другие пользователи или внешние приложения.</value> - - true - true - - true - - - Декорация57РасширеннаяПодсказка - 888 - Label - true - true - - Left - - - - Декорация57КонтекстноеМеню - 340 - true - - Label - true - true - false - - Left - - - true - true - - true - - - АктивныеСоединения2РасширеннаяПодсказка - 887 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - СоединениеКонфигуратора2 - 341 - - Декорация58 - 342 - - <key>ru</key> - <value>Продолжение невозможно, так как открыт Конфигуратор.</value> - - true - true - - true - - - Декорация58РасширеннаяПодсказка - 890 - Label - true - true - - Left - - - - Декорация58КонтекстноеМеню - 343 - true - - Label - true - true - false - - Left - - - true - true - - true - - - СоединениеКонфигуратора2РасширеннаяПодсказка - 889 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Панель перехода на следующий шаг режима обновления файл</value> - - - ПанельПереходаНаСледующийШагРежимаОбновленияФайлРасширеннаяПодсказка - 882 - Label - true - true - - Left - - - Pages - - Auto - - true true @@ -7482,8 +5730,8 @@ Выбор режима обновления файл - ВыборРежимаОбновленияФайлРасширеннаяПодсказка - 852 + ВыборРежимаОбновленияФайлExtendedTooltip + 842 Label true true @@ -7513,8 +5761,8 @@ true - НадписьШапкаВыборРежимаОбнСерверРасширеннаяПодсказка - 892 + НадписьШапкаВыборРежимаОбнСерверExtendedTooltip + 881 Label true true @@ -7564,8 +5812,8 @@ true - НадписьВыберитеСпособОбновленияСерверРасширеннаяПодсказка - 895 + НадписьВыберитеСпособОбновленияСерверExtendedTooltip + 884 Label true true @@ -7594,8 +5842,8 @@ true - ВсеГотово1РасширеннаяПодсказка - 894 + ВсеГотово1ExtendedTooltip + 883 Label true true @@ -7621,8 +5869,8 @@ true - Декорация1РасширеннаяПодсказка - 897 + Декорация1ExtendedTooltip + 886 Label true true @@ -7662,8 +5910,8 @@ true - НадписьПорядокОбновленияСерверРасширеннаяПодсказка - 899 + НадписьПорядокОбновленияСерверExtendedTooltip + 888 Label true true @@ -7697,8 +5945,8 @@ true - НадписьПорядокОбновления3РасширеннаяПодсказка - 900 + НадписьПорядокОбновления3ExtendedTooltip + 889 Label true true @@ -7730,8 +5978,8 @@ true - ВертикальнаяГруппа7РасширеннаяПодсказка - 898 + ВертикальнаяГруппа7ExtendedTooltip + 887 Label true true @@ -7755,8 +6003,8 @@ true - ВсеГотовоПорядокОбновления1РасширеннаяПодсказка - 896 + ВсеГотовоПорядокОбновления1ExtendedTooltip + 885 Label true true @@ -7779,8 +6027,8 @@ Панель все готово сервер - ПанельВсеГотовоСерверРасширеннаяПодсказка - 893 + ПанельВсеГотовоСерверExtendedTooltip + 882 Label true true @@ -7813,8 +6061,8 @@ ПереключательОбновленияПриИзменении - ПереключательОбновленияСерверРасширеннаяПодсказка - 902 + ПереключательОбновленияСерверExtendedTooltip + 891 Label true true @@ -7874,8 +6122,8 @@ Отступ четыре - ОтступЧетыреРасширеннаяПодсказка - 901 + ОтступЧетыреExtendedTooltip + 890 Label true true @@ -7916,8 +6164,8 @@ Объект.ДатаВремяОбновления - ПолеДатаВремяОбновленияРасширеннаяПодсказка - 906 + ПолеДатаВремяОбновленияExtendedTooltip + 894 Label true true @@ -7959,8 +6207,8 @@ true - Надпись51РасширеннаяПодсказка - 908 + Надпись51ExtendedTooltip + 895 Label true true @@ -8008,8 +6256,8 @@ ВыслатьОтчетНаПочтуПриИзменении - ВыслатьОтчетНаПочтуРасширеннаяПодсказка - 910 + ВыслатьОтчетНаПочтуExtendedTooltip + 897 Label true true @@ -8042,8 +6290,8 @@ None - АдресЭлектроннойПочтыРасширеннаяПодсказка - 912 + АдресЭлектроннойПочтыExtendedTooltip + 898 Label true true @@ -8084,8 +6332,8 @@ false - ПанельПочтаРасширеннаяПодсказка - 909 + ПанельПочтаExtendedTooltip + 896 Label true true @@ -8112,8 +6360,8 @@ Страница запланированной перезагрузки - СтраницаЗапланированнойПерезагрузкиРасширеннаяПодсказка - 905 + СтраницаЗапланированнойПерезагрузкиExtendedTooltip + 893 Label true true @@ -8143,8 +6391,8 @@ true - НадписьБудетУстановленоОбновлениеСерверРасширеннаяПодсказка - 915 + НадписьБудетУстановленоОбновлениеСерверExtendedTooltip + 900 Label true true @@ -8180,8 +6428,8 @@ true - Картинка2РасширеннаяПодсказка - 917 + Картинка2ExtendedTooltip + 902 Label true true @@ -8224,8 +6472,8 @@ true - Надпись48РасширеннаяПодсказка - 920 + Надпись48ExtendedTooltip + 905 Label true true @@ -8260,8 +6508,8 @@ true - НадписьСписокДействий2РасширеннаяПодсказка - 921 + НадписьСписокДействий2ExtendedTooltip + 906 Label true true @@ -8298,8 +6546,8 @@ Активные пользователи - АктивныеПользователи1РасширеннаяПодсказка - 919 + АктивныеПользователи1ExtendedTooltip + 904 Label true true @@ -8330,8 +6578,8 @@ true - Надпись49РасширеннаяПодсказка - 923 + Надпись49ExtendedTooltip + 908 Label true true @@ -8366,8 +6614,8 @@ true - НадписьСписокДействий4РасширеннаяПодсказка - 924 + НадписьСписокДействий4ExtendedTooltip + 909 Label true true @@ -8405,8 +6653,8 @@ Активные соединения - АктивныеСоединения1РасширеннаяПодсказка - 922 + АктивныеСоединения1ExtendedTooltip + 907 Label true true @@ -8426,8 +6674,8 @@ true - ПанельАктивныеПользователи1РасширеннаяПодсказка - 918 + ПанельАктивныеПользователи1ExtendedTooltip + 903 Label true true @@ -8447,8 +6695,8 @@ false - ГруппаСоединений1РасширеннаяПодсказка - 916 + ГруппаСоединений1ExtendedTooltip + 901 Label true true @@ -8475,8 +6723,8 @@ Страница перезагрузки сейчас - СтраницаПерезагрузкиСейчас1РасширеннаяПодсказка - 914 + СтраницаПерезагрузкиСейчас1ExtendedTooltip + 899 Label true true @@ -8500,8 +6748,8 @@ Страницы информации перезагрузки - СтраницыИнформацииПерезагрузки1РасширеннаяПодсказка - 904 + СтраницыИнформацииПерезагрузки1ExtendedTooltip + 892 Label true true @@ -8523,8 +6771,8 @@ true - НадписьОтступ2РасширеннаяПодсказка - 925 + НадписьОтступ2ExtendedTooltip + 910 Label true true @@ -8558,8 +6806,8 @@ true - Декорация13РасширеннаяПодсказка - 927 + Декорация13ExtendedTooltip + 912 Label true true @@ -8596,8 +6844,8 @@ true - НадписьРезервнаяКопияСерверРасширеннаяПодсказка - 928 + НадписьРезервнаяКопияСерверExtendedTooltip + 913 Label true true @@ -8630,8 +6878,8 @@ Группа резервная копия сервер - ГруппаРезервнаяКопияСерверРасширеннаяПодсказка - 926 + ГруппаРезервнаяКопияСерверExtendedTooltip + 911 Label true true @@ -8649,222 +6897,6 @@ Auto - - ПанельПереходаНаСледующийШагРежимаОбновленияСервер - 352 - - Сейчас - 353 - - НадписьДалееВыборРежимаОбновленияСервер - 254 - - <key>ru</key> - <value>Нажмите кнопку "Далее", чтобы перезапустить программу.</value> - - true - true - - true - - - НадписьДалееВыборРежимаОбновленияСерверРасширеннаяПодсказка - 931 - Label - true - true - - Left - - - - НадписьДалееВыборРежимаОбновленияСерверКонтекстноеМеню - 255 - true - - Label - true - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Сейчас</value> - - - СейчасРасширеннаяПодсказка - 930 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - Отложить - 354 - - Декорация60 - 355 - - <key>ru</key> - <value>Нажмите кнопку "Готово", чтобы запланировать установку обновления на заданное время.</value> - - true - true - - true - - - Декорация60РасширеннаяПодсказка - 933 - Label - true - true - - Left - - - - Декорация60КонтекстноеМеню - 356 - true - - Label - true - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Отложить</value> - - - ОтложитьРасширеннаяПодсказка - 932 - Label - true - true - - Left - - - Page - - Vertical - auto - - - - Отмена - 357 - - Декорация61 - 358 - - <key>ru</key> - <value>Нажмите кнопку "Готово", чтобы выйти из помощника обновления конфигурации.</value> - - true - true - - true - - - Декорация61РасширеннаяПодсказка - 935 - Label - true - true - - Left - - - - Декорация61КонтекстноеМеню - 359 - true - - Label - true - true - false - - Left - - - true - true - - true - - - <key>ru</key> - <value>Отмена</value> - - - ОтменаРасширеннаяПодсказка - 934 - Label - true - true - - Left - - - Page - - Vertical - auto - - - true - true - - true - - - <key>ru</key> - <value>Панель перехода на следующий шаг режима обновления сервер</value> - - - ПанельПереходаНаСледующийШагРежимаОбновленияСерверРасширеннаяПодсказка - 929 - Label - true - true - - Left - - - Pages - - Auto - - true true @@ -8875,8 +6907,8 @@ Выбор режима обновления сервер - ВыборРежимаОбновленияСерверРасширеннаяПодсказка - 891 + ВыборРежимаОбновленияСерверExtendedTooltip + 880 Label true true @@ -8906,8 +6938,8 @@ true - НадписьШапкаУспешноеОбновлениеРасширеннаяПодсказка - 937 + НадписьШапкаУспешноеОбновлениеExtendedTooltip + 922 Label true true @@ -8951,8 +6983,8 @@ true - Декорация46РасширеннаяПодсказка - 938 + Декорация46ExtendedTooltip + 923 Label true true @@ -8986,8 +7018,8 @@ true - НадписьИнформацияОбОбновленииПриЗавершенииРасширеннаяПодсказка - 939 + НадписьИнформацияОбОбновленииПриЗавершенииExtendedTooltip + 924 Label true true @@ -9026,8 +7058,8 @@ true - Картинка3РасширеннаяПодсказка - 941 + Картинка3ExtendedTooltip + 926 Label true true @@ -9067,8 +7099,8 @@ true - Декорация47РасширеннаяПодсказка - 943 + Декорация47ExtendedTooltip + 928 Label true true @@ -9102,8 +7134,8 @@ true - НадписьПорядокОбновления2РасширеннаяПодсказка - 944 + НадписьПорядокОбновления2ExtendedTooltip + 929 Label true true @@ -9135,8 +7167,8 @@ true - Группа30РасширеннаяПодсказка - 942 + Группа30ExtendedTooltip + 927 Label true true @@ -9164,8 +7196,8 @@ Панель порядок обновления при завершении - ПанельПорядокОбновленияПриЗавершенииРасширеннаяПодсказка - 940 + ПанельПорядокОбновленияПриЗавершенииExtendedTooltip + 925 Label true true @@ -9192,8 +7224,8 @@ true - Отступ45РасширеннаяПодсказка - 945 + Отступ45ExtendedTooltip + 930 Label true true @@ -9228,8 +7260,8 @@ true - НадписьСообщениеДалее2РасширеннаяПодсказка - 946 + НадписьСообщениеДалее2ExtendedTooltip + 931 Label true true @@ -9260,8 +7292,8 @@ Успешное обновление - УспешноеОбновлениеРасширеннаяПодсказка - 936 + УспешноеОбновлениеExtendedTooltip + 921 Label true true @@ -9291,8 +7323,8 @@ true - НадписьШапкаНеудачноеОбновлениеРасширеннаяПодсказка - 948 + НадписьШапкаНеудачноеОбновлениеExtendedTooltip + 933 Label true true @@ -9336,8 +7368,8 @@ true - Надпись54РасширеннаяПодсказка - 949 + Надпись54ExtendedTooltip + 934 Label true true @@ -9373,8 +7405,8 @@ true - НадписьОткрытьЖурналРегистрацииРасширеннаяПодсказка - 950 + НадписьОткрытьЖурналРегистрацииExtendedTooltip + 935 Label true true @@ -9411,8 +7443,8 @@ true - ОтступНеуспешноеОбновлениеРасширеннаяПодсказка - 951 + ОтступНеуспешноеОбновлениеExtendedTooltip + 936 Label true true @@ -9434,42 +7466,6 @@ Left - - Надпись56 - 281 - - <key>ru</key> - <value>Нажмите кнопку "Готово" для выхода из помощника обновления конфигурации, или -вернитесь назад, чтобы попытаться провести обновление еще раз.</value> - - true - true - - true - - - Надпись56РасширеннаяПодсказка - 952 - Label - true - true - - Left - - - - Надпись56КонтекстноеМеню - 282 - true - - Label - true - true - false - - Left - - true true @@ -9480,8 +7476,8 @@ Неуспешное обновление - НеуспешноеОбновлениеРасширеннаяПодсказка - 947 + НеуспешноеОбновлениеExtendedTooltip + 932 Label true true @@ -9511,8 +7507,8 @@ true - НадписьШапкаПараметрыАвторизацииРасширеннаяПодсказка - 954 + НадписьШапкаПараметрыАвторизацииExtendedTooltip + 939 Label true true @@ -9558,8 +7554,8 @@ true - Картинка6РасширеннаяПодсказка - 957 + Картинка6ExtendedTooltip + 942 Label true true @@ -9597,8 +7593,8 @@ true - Декорация53РасширеннаяПодсказка - 958 + Декорация53ExtendedTooltip + 943 Label true true @@ -9635,8 +7631,8 @@ Почти все готово - ПочтиВсеГотовоРасширеннаяПодсказка - 956 + ПочтиВсеГотовоExtendedTooltip + 941 Label true true @@ -9664,8 +7660,8 @@ true - Картинка7РасширеннаяПодсказка - 961 + Картинка7ExtendedTooltip + 946 Label true true @@ -9706,8 +7702,8 @@ None - ОбнаруженнаяОшибкаПодключенияРасширеннаяПодсказка - 962 + ОбнаруженнаяОшибкаПодключенияExtendedTooltip + 947 Label true true @@ -9749,8 +7745,8 @@ false - ГоризонтальнаяГруппа10РасширеннаяПодсказка - 960 + ГоризонтальнаяГруппа10ExtendedTooltip + 945 Label true true @@ -9779,8 +7775,8 @@ true - Картинка9РасширеннаяПодсказка - 965 + Картинка9ExtendedTooltip + 949 Label true true @@ -9816,8 +7812,8 @@ true - НадписьИнфоЖР2РасширеннаяПодсказка - 967 + НадписьИнфоЖР2ExtendedTooltip + 951 Label true true @@ -9852,8 +7848,8 @@ true - НадписьОткрытьЖурналРегистрации3РасширеннаяПодсказка - 968 + НадписьОткрытьЖурналРегистрации3ExtendedTooltip + 952 Label true true @@ -9889,8 +7885,8 @@ false - ВертикальнаяГруппаНадписиЖР1РасширеннаяПодсказка - 966 + ВертикальнаяГруппаНадписиЖР1ExtendedTooltip + 950 Label true true @@ -9914,8 +7910,8 @@ false - ПанельЖурналРегистрации2РасширеннаяПодсказка - 964 + ПанельЖурналРегистрации2ExtendedTooltip + 948 Label true true @@ -9943,8 +7939,8 @@ true - ОбнаруженаОшибкаПодключенияРасширеннаяПодсказка - 959 + ОбнаруженаОшибкаПодключенияExtendedTooltip + 944 Label true true @@ -9969,8 +7965,8 @@ false - СтраницыНадписиПроверкиПодключенияРасширеннаяПодсказка - 955 + СтраницыНадписиПроверкиПодключенияExtendedTooltip + 940 Label true true @@ -9999,8 +7995,8 @@ true - НадписьОбновитьВерсиюКомпоненты2РасширеннаяПодсказка - 970 + НадписьОбновитьВерсиюКомпоненты2ExtendedTooltip + 954 Label true true @@ -10043,8 +8039,8 @@ Объект.ИмяАдминистратораИБ - ИмяАдминистратораИБРасширеннаяПодсказка - 973 + ИмяАдминистратораИБExtendedTooltip + 957 Label true true @@ -10089,8 +8085,8 @@ Объект.ПарольАдминистратораИБ - ПарольАдминистратораИБСерверРасширеннаяПодсказка - 975 + ПарольАдминистратораИБСерверExtendedTooltip + 958 Label true true @@ -10126,8 +8122,8 @@ true - Группа36РасширеннаяПодсказка - 972 + Группа36ExtendedTooltip + 956 Label true true @@ -10161,8 +8157,8 @@ true - Декорация54РасширеннаяПодсказка - 978 + Декорация54ExtendedTooltip + 960 Label true true @@ -10196,8 +8192,8 @@ true - ПанельПредупреждениеОWindowsАвторизацииРасширеннаяПодсказка - 977 + ПанельПредупреждениеОWindowsАвторизацииExtendedTooltip + 959 Label true true @@ -10221,8 +8217,8 @@ true - Группа7РасширеннаяПодсказка - 971 + Группа7ExtendedTooltip + 955 Label true true @@ -10249,8 +8245,8 @@ Пароль администратора для входа в программу - ПанельАвторизацияИБРасширеннаяПодсказка - 969 + ПанельАвторизацияИБExtendedTooltip + 953 Label true true @@ -10297,8 +8293,8 @@ КластерТребуетАутентификацииПриИзменении - КластерТребуетАутентификацииРасширеннаяПодсказка - 981 + КластерТребуетАутентификацииExtendedTooltip + 963 Label true true @@ -10337,8 +8333,8 @@ Объект.ИмяАдминистратораКластера - ИмяАдминистратораКластераРасширеннаяПодсказка - 984 + ИмяАдминистратораКластераExtendedTooltip + 965 Label true true @@ -10383,8 +8379,8 @@ Объект.ПарольАдминистратораКластера - ПарольАдминистратораКластераРасширеннаяПодсказка - 986 + ПарольАдминистратораКластераExtendedTooltip + 966 Label true true @@ -10424,8 +8420,8 @@ Имя и пароль администратора кластера серверов - ПанельДоступККластеруРасширеннаяПодсказка - 983 + ПанельДоступККластеруExtendedTooltip + 964 Label true true @@ -10454,8 +8450,8 @@ Панель администратор кластера серверов - ПанельАдминистраторКластераСерверовРасширеннаяПодсказка - 980 + ПанельАдминистраторКластераСерверовExtendedTooltip + 962 Label true true @@ -10498,8 +8494,8 @@ НестандартныеПортыСервераПриИзменении - НестандартныеПортыСервераРасширеннаяПодсказка - 989 + НестандартныеПортыСервераExtendedTooltip + 968 Label true true @@ -10538,8 +8534,8 @@ Объект.ПортКластераСерверов - ПортКластераСерверовРасширеннаяПодсказка - 992 + ПортКластераСерверовExtendedTooltip + 970 Label true true @@ -10583,8 +8579,8 @@ Объект.ПортАгентаСервера - ПортАгентаСервераРасширеннаяПодсказка - 994 + ПортАгентаСервераExtendedTooltip + 971 Label true true @@ -10622,8 +8618,8 @@ Номера портов - ПанельНестандартныеПортыСервераРасширеннаяПодсказка - 991 + ПанельНестандартныеПортыСервераExtendedTooltip + 969 Label true true @@ -10653,8 +8649,8 @@ false - ПанельПортыСервераРасширеннаяПодсказка - 988 + ПанельПортыСервераExtendedTooltip + 967 Label true true @@ -10683,8 +8679,8 @@ Панель авторизация кластера серверов - ПанельАвторизацияКластераСерверовРасширеннаяПодсказка - 979 + ПанельАвторизацияКластераСерверовExtendedTooltip + 961 Label true true @@ -10717,8 +8713,8 @@ true - НадписьОбновитьВерсиюКомпонентыРасширеннаяПодсказка - 997 + НадписьОбновитьВерсиюКомпонентыExtendedTooltip + 973 Label true true @@ -10750,8 +8746,8 @@ false - КнопкаОбновитьВерсиюКомпонентыРасширеннаяПодсказка - 998 + КнопкаОбновитьВерсиюКомпонентыExtendedTooltip + 974 Label true true @@ -10774,8 +8770,8 @@ true - ГруппаComcntrРасширеннаяПодсказка - 996 + ГруппаComcntrExtendedTooltip + 972 Label true true @@ -10801,8 +8797,8 @@ true - НадписьОтступ1РасширеннаяПодсказка - 999 + НадписьОтступ1ExtendedTooltip + 975 Label true true @@ -10824,41 +8820,6 @@ Left - - НадписьСообщениеДалее3 - 331 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для выбора способа обновления программы.</value> - - true - true - - true - - - НадписьСообщениеДалее3РасширеннаяПодсказка - 1000 - Label - true - true - - Left - - - - НадписьСообщениеДалее3КонтекстноеМеню - 332 - true - - Label - true - true - false - - Left - - true true @@ -10869,8 +8830,8 @@ Параметры авторизации (клиент-серверная ИБ) - ПараметрыАвторизацииРасширеннаяПодсказка - 953 + ПараметрыАвторизацииExtendedTooltip + 938 Label true true @@ -10900,8 +8861,8 @@ true - НадписьШапкаДополнительныеНастройкиРасширеннаяПодсказка - 1002 + НадписьШапкаДополнительныеНастройкиExtendedTooltip + 978 Label true true @@ -10944,8 +8905,8 @@ true - Картинка12РасширеннаяПодсказка - 1004 + Картинка12ExtendedTooltip + 980 Label true true @@ -10986,8 +8947,8 @@ None - ОбнаруженнаяОшибкаПодключения1РасширеннаяПодсказка - 1005 + ОбнаруженнаяОшибкаПодключения1ExtendedTooltip + 981 Label true true @@ -11029,8 +8990,8 @@ false - ГоризонтальнаяГруппаОшибкаПодключенияРасширеннаяПодсказка - 1003 + ГоризонтальнаяГруппаОшибкаПодключенияExtendedTooltip + 979 Label true true @@ -11059,8 +9020,8 @@ true - Картинка10РасширеннаяПодсказка - 1008 + Картинка10ExtendedTooltip + 983 Label true true @@ -11096,8 +9057,8 @@ true - НадписьИнфоЖР3РасширеннаяПодсказка - 1010 + НадписьИнфоЖР3ExtendedTooltip + 985 Label true true @@ -11132,8 +9093,8 @@ true - НадписьОткрытьЖурналРегистрации4РасширеннаяПодсказка - 1011 + НадписьОткрытьЖурналРегистрации4ExtendedTooltip + 986 Label true true @@ -11169,8 +9130,8 @@ false - ВертикальнаяГруппаНадписиЖР3РасширеннаяПодсказка - 1009 + ВертикальнаяГруппаНадписиЖР3ExtendedTooltip + 984 Label true true @@ -11194,8 +9155,8 @@ false - ПанельЖурналРегистрации3РасширеннаяПодсказка - 1007 + ПанельЖурналРегистрации3ExtendedTooltip + 982 Label true true @@ -11228,8 +9189,8 @@ true - НадписьОбновитьВерсиюКомпоненты3РасширеннаяПодсказка - 1013 + НадписьОбновитьВерсиюКомпоненты3ExtendedTooltip + 988 Label true true @@ -11272,8 +9233,8 @@ Объект.ИмяАдминистратораИБ - ИмяАдминистратораИБФайлРасширеннаяПодсказка - 1016 + ИмяАдминистратораИБФайлExtendedTooltip + 991 Label true true @@ -11318,8 +9279,8 @@ Объект.ПарольАдминистратораИБ - ПарольАдминистратораИБФайлРасширеннаяПодсказка - 1018 + ПарольАдминистратораИБФайлExtendedTooltip + 992 Label true true @@ -11355,8 +9316,8 @@ true - Группа38РасширеннаяПодсказка - 1015 + Группа38ExtendedTooltip + 990 Label true true @@ -11390,8 +9351,8 @@ true - Декорация55РасширеннаяПодсказка - 1021 + Декорация55ExtendedTooltip + 994 Label true true @@ -11421,8 +9382,8 @@ true - ПредупреждениеОWindowsАвторизацииФайлРасширеннаяПодсказка - 1020 + ПредупреждениеОWindowsАвторизацииФайлExtendedTooltip + 993 Label true true @@ -11446,8 +9407,8 @@ true - Группа37РасширеннаяПодсказка - 1014 + Группа37ExtendedTooltip + 989 Label true true @@ -11474,8 +9435,8 @@ Пароль администратора для входа в программу - ПанельАвторизацияИБ1РасширеннаяПодсказка - 1012 + ПанельАвторизацияИБ1ExtendedTooltip + 987 Label true true @@ -11511,8 +9472,8 @@ true - НадписьОбновитьВерсиюКомпоненты1РасширеннаяПодсказка - 1023 + НадписьОбновитьВерсиюКомпоненты1ExtendedTooltip + 996 Label true true @@ -11544,8 +9505,8 @@ false - КнопкаОбновитьВерсиюКомпоненты1РасширеннаяПодсказка - 1024 + КнопкаОбновитьВерсиюКомпоненты1ExtendedTooltip + 997 Label true true @@ -11568,8 +9529,8 @@ true - ГруппаComcntrФайловыйРежимРасширеннаяПодсказка - 1022 + ГруппаComcntrФайловыйРежимExtendedTooltip + 995 Label true true @@ -11596,8 +9557,8 @@ true - НадписьОтступ4РасширеннаяПодсказка - 1025 + НадписьОтступ4ExtendedTooltip + 998 Label true true @@ -11619,41 +9580,6 @@ Left - - НадписьСообщениеДалее5 - 639 - - <key>ru</key> - <value>Нажмите кнопку "Далее" для выбора способа обновления программы.</value> - - true - true - - true - - - НадписьСообщениеДалее5РасширеннаяПодсказка - 1026 - Label - true - true - - Left - - - - НадписьСообщениеДалее5КонтекстноеМеню - 640 - true - - Label - true - true - false - - Left - - true true @@ -11664,8 +9590,8 @@ Параметры авторизации (файловая ИБ) - ДополнительныеНастройкиРасширеннаяПодсказка - 1001 + ДополнительныеНастройкиExtendedTooltip + 977 Label true true @@ -11689,7 +9615,7 @@ Страницы помощника - СтраницыПомощникаРасширеннаяПодсказка + СтраницыПомощникаExtendedTooltip 657 Label true @@ -11703,93 +9629,221 @@ Auto - Bottom - true + + КоманднаяПанель + 1003 + + КоманднаяПанельСлева + 1005 + + КнопкаНазад + 19 + true + true + + true + + false + + КнопкаНазадExtendedTooltip + 654 + Label + true + true + + Left + + + Form.Command.Назад + Normal + Auto + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель слева</value> + + + ru + Командная панель слева + + + КоманднаяПанельСлеваРасширеннаяПодсказка + 1006 + Label + true + true + + Left + + + CommandBar + + Left + + + + ОтступКоманднойПанели + 1007 + true + true + + true + + + ОтступКоманднойПанелиРасширеннаяПодсказка + 1009 + Label + true + true + + Left + + + + ОтступКоманднойПанелиКонтекстноеМеню + 1008 + true + + Label + true + true + true + + Left + + + + КоманднаяПанельСправа + 1010 + + КнопкаДалее + 20 + true + true + + true + + false + + КнопкаДалееExtendedTooltip + 655 + Label + true + true + + Left + + + Form.Command.Далее + Auto + true + true + true + UserCmds + Auto + + + КнопкаЗакрыть + 364 + + <key>ru</key> + <value>Отмена</value> + + true + true + + true + + false + + КнопкаЗакрытьРасширеннаяПодсказка + 656 + Label + true + true + + Left + + + Form.StandardCommand.Close + Normal + true + true + UserCmds + Auto + + true + true + + true + + + <key>ru</key> + <value>Командная панель справа</value> + + + ru + Командная панель справа + + + КоманднаяПанельСправаРасширеннаяПодсказка + 1011 + Label + true + true + + Left + + + CommandBar + + Right + Form + + + true + true + + true + + + <key>ru</key> + <value>Командная панель</value> + + + КоманднаяПанельРасширеннаяПодсказка + 1004 + Label + true + true + + Left + + + UsualGroup + + Auto + true + true + Auto + Auto + + + None + false ФормаКоманднаяПанель -1 - - КнопкаНазад - 19 - true - true - - true - - false - - КнопкаНазадРасширеннаяПодсказка - 654 - Label - true - true - - Left - - - Form.Command.Назад - Normal - Auto - true - true - UserCmds - Auto - - - КнопкаДалее - 20 - true - true - - true - - false - - КнопкаДалееРасширеннаяПодсказка - 655 - Label - true - true - - Left - - - Form.Command.Далее - Auto - true - true - true - UserCmds - Auto - - - КнопкаЗакрыть - 364 - true - true - - true - - false - - КнопкаЗакрытьРасширеннаяПодсказка - 656 - Label - true - true - - Left - - - Form.StandardCommand.Close - Normal - true - true - UserCmds - Auto - Right - true ChoiceProcessing @@ -11823,6 +9877,7 @@ Yes LockOwner true + true true Vertical true @@ -11882,9 +9937,6 @@ Объект.ПроверятьНаличиеОбновленияПриЗапуске - - Объект.ПропускатьПриветствие - Объект.РасписаниеПроверкиНаличияОбновления @@ -12177,7 +10229,11 @@ - ДоступноОбновлениеДля83 + ДоступноОбновлениеДляСледующейРедакции + + <key>ru</key> + <value>Доступно обновление для следующей редакции</value> + 8 Boolean @@ -12193,7 +10249,7 @@ Назад <key>ru</key> - <value><< Назад</value> + <value>< Назад</value> 1 @@ -12215,7 +10271,7 @@ Далее <key>ru</key> - <value>Далее >></value> + <value>Далее ></value> 2 @@ -12299,28 +10355,6 @@ Auto Auto - - КакПерейтиНаПлатформу83 - - <key>ru</key> - <value>Как перейти на 1С:Предприятие 8.3</value> - - 6 - - ru - Инструкция по установке новой версии платформы - - - true - - - - КакПерейтиНаПлатформу83 - - - Auto - Auto - ЗавершениеРаботыСистемы diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl index cc8d1dac9..dd403bb45 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Forms/Форма/Module.bsl @@ -36,7 +36,6 @@ Если Параметры.ПолученоОбновлениеКонфигурации Тогда Элементы.ПереключательОбновленияФайл.Видимость = Ложь; Элементы.НадписьПолученоОбновлениеИзПриложенияФайл.Видимость = Истина; - Элементы.НадписьДалееВыборРежимаОбновленияФайл.Заголовок = Нстр("ru = 'Нажмите ""Далее"" для установки обновления.'"); Элементы.НадписьДалееВыборРежимаОбновленияСервер.Заголовок = Нстр("ru = 'Нажмите ""Далее"" для установки обновления.'"); Элементы.НадписьБудетУстановленоОбновлениеСервер.Заголовок = Нстр("ru = 'Получено обновление из приложения в Интернете. Процесс обновления может занять длительное время. |Не выключайте питание компьютера до завершения процесса установки.'"); @@ -55,26 +54,12 @@ &НаКлиенте Процедура ПриОткрытии(Отказ) -#Если ВебКлиент Тогда - Отказ = Истина; - ТекстСообщения = НСтр("ru = 'Обновление программы недоступно в веб-клиенте.'"); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(),, - ТекстСообщения,,Истина); - Предупреждение(ТекстСообщения); - Возврат; -#КонецЕсли - - Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + + Если Не ВозможенЗапускОбновления() Тогда + Отказ = Истина; - ТекстСообщения = НСтр("ru = 'Обновление программы недоступно в клиенте под управлением ОС Linux.'"); - Предупреждение(ТекстСообщения); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации( - ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), - , - ТекстСообщения, - , - Истина); Возврат; + КонецЕсли; ВосстановитьНастройкиОбновленияКонфигурации(); @@ -135,7 +120,7 @@ Если НЕ КонфигурацияГотоваКОбновлению Тогда ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", НСтр("ru = 'Конфигурация не может быть обновлена. Завершение проверки обновления.'")); Отказ = Истина; Возврат; @@ -148,8 +133,6 @@ Объект.ИсточникОбновления = 2 Тогда Объект.НуженФайлОбновления = 0; ИмяСтраницы = Страницы.ФайлОбновления.Имя; - ИначеЕсли Объект.ПропускатьПриветствие = Истина И Объект.ИсточникОбновления = 0 Тогда - ИмяСтраницы = ОбработатьСтраницуДоброПожаловать(Истина); КонецЕсли; Если Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоГлавныйУзел Тогда @@ -164,6 +147,12 @@ ПередОткрытиемСтраницы(Страницы[ИмяСтраницы]); Элементы.СтраницыПомощника.ТекущаяСтраница = Страницы[ИмяСтраницы]; + +#Если ВебКлиент Тогда + Элементы.ГруппаComcntr.Видимость = Ложь; + Элементы.ГруппаComcntrФайловыйРежим.Видимость = Ложь; +#КонецЕсли + КонецПроцедуры &НаКлиенте @@ -196,8 +185,7 @@ &НаКлиенте Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) - Если ИмяСобытия = "ЛегальностьПолученияОбновлений" И Не Параметр - И ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83БезРежимаСовместимости() Тогда + Если ИмяСобытия = "ЛегальностьПолученияОбновлений" И Не Параметр Тогда ОтработатьНажатиеКнопкиНазад(); @@ -222,7 +210,7 @@ КонецЕсли; // запись событий ЖР - ОбщегоНазначенияВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); КонецПроцедуры @@ -233,20 +221,7 @@ // Страница ДоброПожаловать &НаКлиенте -Процедура ДекорацияЧерезИнтернетНажатие(Элемент) - Объект.ИсточникОбновления = 0; - ПередОткрытиемСтраницы(); -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияЧерезИТСНажатие(Элемент) - Объект.ИсточникОбновления = 1; - ПередОткрытиемСтраницы(); -КонецПроцедуры - -&НаКлиенте -Процедура ДекорацияИзФайлаНажатие(Элемент) - Объект.ИсточникОбновления = 2; +Процедура ИсточникОбновленияПриИзменении(Элемент) ПередОткрытиемСтраницы(); КонецПроцедуры @@ -264,7 +239,7 @@ &НаКлиенте Процедура НадписьИнформацияОПолученииДоступаНажатие(Элемент) - ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу( + ПерейтиПоНавигационнойСсылке( ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления().АдресСтраницыИнформацииОПолученииДоступаКПользовательскомуСайту); КонецПроцедуры @@ -337,7 +312,7 @@ Если НЕ ПустаяСтрока(ИмяФайлаИнформацияОбОбновлении) Тогда ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаИнформацияОбОбновлении); Иначе - Предупреждение(НСтр("ru = 'Информация об обновлении отсутствует.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Информация об обновлении отсутствует.'")); КонецЕсли; КонецПроцедуры @@ -346,18 +321,18 @@ Если НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления) Тогда ОбновлениеКонфигурацииКлиент.ОткрытьВебСтраницу(ИмяФайлаПорядокОбновления); Иначе - Предупреждение(НСтр("ru = 'Описание порядка обновления отсутствует.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Описание порядка обновления отсутствует.'")); КонецЕсли; КонецПроцедуры &НаКлиенте -Процедура ГиперссылкаПроверятьНаличиеОбновленияПриЗапускеНажатие(Элемент) +Процедура ДекорацияОбновитеПлатформуОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылка, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ПроверятьНаличиеОбновленияПриЗапуске", Объект.ПроверятьНаличиеОбновленияПриЗапуске); - ПараметрыФормы.Вставить("РасписаниеПроверкиНаличияОбновления", Объект.РасписаниеПроверкиНаличияОбновления); - - ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.НастройкаРасписания", ПараметрыФормы, ЭтаФорма); + ПараметрыФормы.Вставить("ИнструкцияДляСледующейРедакции", Истина); + ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.ПорядокОбновленияПлатформы", ПараметрыФормы); КонецПроцедуры @@ -366,12 +341,22 @@ &НаКлиенте Процедура НадписьПереченьРелизовНаДискахИТСНажатие(Элемент) + Если ПустаяСтрока(ПереченьРелизовНаДискахИТС) Тогда - Предупреждение(НСтр("ru = 'Информация о перечне релизов не обнаружена.'")); + ОписаниеОповещения = Новый ОписаниеОповещения("НадписьПереченьРелизовНаДискахИТСНажатиеЗавершение", ЭтотОбъект); + ПоказатьПредупреждение(ОписаниеОповещения, НСтр("ru = 'Информация о перечне релизов не обнаружена.'")); + Иначе + НадписьПереченьРелизовНаДискахИТСНажатиеЗавершение(Неопределено); КонецЕсли; - + +КонецПроцедуры + +&НаКлиенте +Процедура НадписьПереченьРелизовНаДискахИТСНажатиеЗавершение(ДополнительныеПараметры) Экспорт + ЗапуститьПриложение(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ДискИТС) + - "Autorun.exe -browse """ + ПереченьРелизовНаДискахИТС + """") + "Autorun.exe -browse """ + ПереченьРелизовНаДискахИТС + """"); + КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -384,21 +369,21 @@ Процедура НадписьСписокДействийНажатие(Элемент) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ОповещатьОЗакрытии", Истина); - ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтаФорма); + ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура НадписьСписокДействий1Нажатие(Элемент) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ОповещатьОЗакрытии", Истина); - ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтаФорма); + ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтотОбъект); КонецПроцедуры &НаКлиенте Процедура НадписьСписокДействий3Нажатие(Элемент) ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("ОповещатьОЗакрытии", Истина); - ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтаФорма); + ОткрытьФорму("Обработка.АктивныеПользователи.Форма.ФормаСпискаАктивныхПользователей", , ЭтотОбъект); КонецПроцедуры &НаКлиенте @@ -407,7 +392,7 @@ ПараметрыФормы.Вставить("СоздаватьРезервнуюКопию", Объект.СоздаватьРезервнуюКопию); ПараметрыФормы.Вставить("ИмяКаталогаРезервнойКопииИБ", Объект.ИмяКаталогаРезервнойКопииИБ); ПараметрыФормы.Вставить("ВосстанавливатьИнформационнуюБазу", Объект.ВосстанавливатьИнформационнуюБазу); - ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.НастройкаРезервнойКопии", ПараметрыФормы, ЭтаФорма); + ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.НастройкаРезервнойКопии", ПараметрыФормы, ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -492,16 +477,7 @@ &НаКлиенте Процедура НастроитьПараметрыПроксиСервера(Команда) - ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", , ЭтаФорма); -КонецПроцедуры - -&НаКлиенте -Процедура КакПерейтиНаПлатформу83(Команда) - - ПараметрыФормы = Новый Структура; - ПараметрыФормы.Вставить("ОбновлениеНа83", Истина); - ОткрытьФорму("Обработка.НерекомендуемаяВерсияПлатформы.Форма.ПорядокОбновленияПлатформы", ПараметрыФормы); - + ОткрытьФорму("ОбщаяФорма.ПараметрыПроксиСервера", Новый Структура("НастройкаПроксиНаКлиенте", Истина), ЭтотОбъект); КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// @@ -529,14 +505,14 @@ &НаСервереБезКонтекста Функция НаличиеАктивныхСоединений(СообщенияДляЖурналаРегистрации = Неопределено) // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); Возврат СоединенияИБ.КоличествоСеансовИнформационнойБазы(Ложь) > 1; КонецФункции &НаСервере Функция ПолучитьТекстыМакетов(ИменаМакетов, СтруктураПараметров, СообщенияДляЖурналаРегистрации) // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); Результат = Новый Массив(); Результат.Добавить(ПолучитьТекстСкрипта(СтруктураПараметров)); @@ -602,7 +578,6 @@ ПараметрПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима, "/F", "/S") + ПутьКИнформационнойБазе; СтрокаПутиКИнформационнойБазе = ?(ПризнакФайловогоРежима, ПутьКИнформационнойБазе, ""); - ЭтоПлатформа83 = ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(); Результат = СтрЗаменить(Результат, "[ИменаФайловОбновления]" , ИменаФайловОбновления); Результат = СтрЗаменить(Результат, "[ИмяИсполняемогоФайлаКонфигуратора]" , Форматировать(ИмяИсполняемогоФайлаКонфигуратора)); @@ -611,6 +586,7 @@ Результат = СтрЗаменить(Результат, "[СтрокаПутиКФайлуИнформационнойБазы]" , Форматировать(ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(СтрЗаменить(СтрокаПутиКИнформационнойБазе, """", "")) + "1Cv8.1CD")); Результат = СтрЗаменить(Результат, "[СтрокаСоединенияИнформационнойБазы]" , Форматировать(СтрокаСоединенияИнформационнойБазы)); + Результат = СтрЗаменить(Результат, "[ПараметрыАутентификацииПользователя]" , Форматировать(СтруктураПараметров.ПараметрыСкрипта.ПараметрыАутентификации)); Результат = СтрЗаменить(Результат, "[СобытиеЖурналаРегистрации]" , Форматировать(СтруктураПараметров.СобытиеЖурналаРегистрации)); Результат = СтрЗаменить(Результат, "[АдресЭлектроннойПочты]", Форматировать(?(Объект.РежимОбновления = 2 И Объект.ВыслатьОтчетНаПочту, Объект.АдресЭлектроннойПочты, ""))); @@ -625,8 +601,6 @@ Результат = СтрЗаменить(Результат, "[ИмяCOMСоединителя]" , Форматировать(СтруктураПараметров.ИмяCOMСоединителя)); Результат = СтрЗаменить(Результат, "[ИспользоватьCOMСоединитель]" , ?(СтруктураПараметров.ЭтоБазоваяВерсияКонфигурации, "false", "true")); Результат = СтрЗаменить(Результат, "[ЗапускСеансаПослеОбновления]" , ?(Параметры.ЗавершениеРаботыСистемы, "false", "true")); - Результат = СтрЗаменить(Результат, "[ШиринаОкнаЗаставкиОбновления]" , ?(ЭтоПлатформа83, 600, 400)); - Результат = СтрЗаменить(Результат, "[ВысотаОкнаЗаставкиОбновления]" , ?(ЭтоПлатформа83, 320, 258)); Возврат Результат; @@ -646,7 +620,7 @@ &НаСервереБезКонтекста Функция ЕстьАктивныеПользователи(СообщенияДляЖурналаРегистрации = Неопределено) // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); УстановитьПривилегированныйРежим(Истина); Возврат ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() > 0; Конецфункции @@ -674,7 +648,7 @@ Функция ПроверитьИУстановитьПарольАдминистратора(СообщенияДляЖурналаРегистрации) // Запись накопленных событий журнала регистрации. - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); ТекущийПользователь = ПользователиИнформационнойБазы.ТекущийПользователь(); Если НЕ ТекущийПользователь.АутентификацияСтандартная Тогда @@ -751,7 +725,7 @@ СообщенияДляЖурналаРегистрации) // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); ТаблицаОбновлений = Неопределено; ВыполнитьЗагрузкуСпискаОбновлений(АдресФайлаВоВремХранилище, ТаблицаОбновлений); @@ -924,7 +898,7 @@ &НаСервереБезКонтекста Функция ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации = Неопределено) - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); УстановитьПривилегированныйРежим(Истина); @@ -960,7 +934,7 @@ &НаСервере Функция ПолучитьСтрокуСоединенияИИнформациюОСоединениях(СообщенияДляЖурналаРегистрации) // запись накопленных событий ЖР - ОбщегоНазначения.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрации.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); Результат = ПолучитьИнформациюОНаличииСоединений(); Результат.Вставить("СтрокаСоединенияИнформационнойБазы", СоединенияИБКлиентСервер.ПолучитьСтрокуСоединенияИнформационнойБазы( @@ -999,7 +973,6 @@ Настройки = ОбновлениеКонфигурацииКлиентСервер.ПолучитьОбновленныеНастройкиОбновленияКонфигурации(НастройкиОбновленияКонфигурации); - Настройки.ПропускатьПриветствие = Объект.ПропускатьПриветствие; Настройки.КодПользователяСервераОбновлений = Объект.КодПользователяСервераОбновлений; Настройки.ПарольСервераОбновлений = ?(Объект.ЗапомнитьПарольСервераОбновлений, Объект.ПарольСервераОбновлений, ""); Настройки.ЗапомнитьПарольСервераОбновлений = Объект.ЗапомнитьПарольСервераОбновлений; @@ -1059,7 +1032,7 @@ &НаСервереБезКонтекста Функция ПолучитьПараметрыАдминистрированияИБ() - Возврат СоединенияИБ.ПолучитьПараметрыАдминистрированияИБ(); + Возврат СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); КонецФункции @@ -1097,7 +1070,7 @@ Если ПараметрыРаботыКлиента.НастройкиОбновления.ЕстьДоступДляОбновления Тогда - Настройка = СоединенияИБПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); + Настройка = СоединенияИБВызовСервераПовтИсп.ПолучитьПараметрыАдминистрированияИБ(); Объект.ИмяАдминистратораИБ = Настройка.ИмяАдминистратораИБ; Объект.ПарольАдминистратораИБ = Настройка.ПарольАдминистратораИБ; @@ -1118,7 +1091,7 @@ Исключение ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала,, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала,, НСтр("ru = 'Ошибка при восстановлении настроек обновления:'") + " " + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); @@ -1159,25 +1132,13 @@ Если НоваяТекущаяСтраница = Страницы.ДоброПожаловать Тогда ДоступностьКнопкиНазад = Ложь; - Если Объект.ИсточникОбновления = 0 Тогда - Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.ЕстьКартинка; - Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.НетКартинки1; - Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.НетКартинки2; - ИначеЕсли Объект.ИсточникОбновления = 1 Тогда - Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.НетКартинки; - Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.ЕстьКартинка1; - Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.НетКартинки2; - ИначеЕсли Объект.ИсточникОбновления = 2 Тогда - Элементы.СтраницыКартинкиИнтернет.ТекущаяСтраница = Элементы.СтраницыКартинкиИнтернет.ПодчиненныеЭлементы.НетКартинки; - Элементы.СтраницыКартинкиИТС.ТекущаяСтраница = Элементы.СтраницыКартинкиИТС.ПодчиненныеЭлементы.НетКартинки1; - Элементы.СтраницыКартинкиФайл.ТекущаяСтраница = Элементы.СтраницыКартинкиФайл.ПодчиненныеЭлементы.ЕстьКартинка2; - КонецЕсли; - ИспользоватьОбновлениеСДискаИТС = ОбновлениеКонфигурацииКлиентПереопределяемый.ИспользоватьОбновлениеСДискаИТС(); - Элементы.ГруппаИТС.Видимость = ИспользоватьОбновлениеСДискаИТС; - Элементы.ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске.Заголовок = ТекстНадписиПроверкиОбновления(); - Элементы.ПропускатьПриветствие.Доступность = (Объект.ИсточникОбновления = 0); + Если Не ИспользоватьОбновлениеСДискаИТС И Элементы.ИсточникОбновления.СписокВыбора.Количество() = 3 Тогда + + Элементы.ИсточникОбновления.СписокВыбора.Удалить(1); + + КонецЕсли; ИначеЕсли НоваяТекущаяСтраница = Страницы.ПодключениеКИнтернет Тогда @@ -1192,9 +1153,7 @@ Элементы.ГруппаДоступаНаСайт.ТекущаяСтраница = Элементы.ГруппаДоступаНаСайт.ПодчиненныеЭлементы.Базовая; КонецЕсли; - Если ПустаяСтрока(Объект.ТехническаяИнформацияОбОшибке) Тогда - Объект.ТехническаяИнформацияОбОшибке = ""; - Иначе + Если Не ПустаяСтрока(Объект.ТехническаяИнформацияОбОшибке) Тогда Объект.ТехническаяИнформацияОбОшибке = НСтр("ru = 'Техническая информация об ошибке:'") + Символы.ПС + Объект.ТехническаяИнформацияОбОшибке; КонецЕсли; @@ -1208,17 +1167,13 @@ Элементы.НадписьДоступноеОбновление.Заголовок = НСтр("ru = 'Версия'") + " " + СтруктураДоступногоОбновления.Версия; Элементы.НадписьРазмерОбновления.Заголовок = СтруктураДоступногоОбновления.РазмерОбновления; Элементы.ПанельПорядокОбновления.Видимость = НЕ ПустаяСтрока(ИмяФайлаПорядокОбновления); - Если ДоступноОбновлениеДля83 Тогда + Если ДоступноОбновлениеДляСледующейРедакции Тогда Элементы.ГруппаТребуетсяОбновлениеПлатформы.Видимость = Истина; ДоступностьКнопкиДалее = Ложь; ДоступностьКнопкиЗакрыть = Истина; КонецЕсли; КонецЕсли; - Элементы.ГиперссылкаПроверятьНаличиеОбновленияПриЗапуске1.Заголовок = ТекстНадписиПроверкиОбновления(); - СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШаг.ПодчиненныеЭлементы; - Элементы.ПанельПереходаНаСледующийШаг.ТекущаяСтраница = ?(Объект.ИсточникОбновления = 0, - СтраницыПереходаНаСледующийШаг.Интернет1, СтраницыПереходаНаСледующийШаг.ИТС1); - + ИначеЕсли НоваяТекущаяСтраница = Страницы.ОбновленияНеОбнаружено Тогда СтруктураДоступногоОбновления = ПолучитьСтруктуруДоступногоОбновления(); @@ -1273,10 +1228,6 @@ Элементы.ПанельВсеГотовоФайл.ТекущаяСтраница = ?(ПустаяСтрока(ИмяФайлаПорядокОбновления), СтраницыПанельВсеГотово.ВсеГотово, СтраницыПанельВсеГотово.ВсеГотовоПорядокОбновления); - СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ПодчиненныеЭлементы; - Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = ?(ФункцияКнопкиДалее, - СтраницыПереходаНаСледующийШаг.Далее, СтраницыПереходаНаСледующийШаг.Готово); - СоединенияИнфо = ПолучитьИнформациюОНаличииСоединений(СообщенияДляЖурналаРегистрации); Элементы.ГруппаСоединений.Видимость = ?(СоединенияИнфо.НаличиеАктивныхСоединений, Истина, Ложь); @@ -1285,10 +1236,8 @@ ДоступностьКнопкиДалее = Истина; Если СоединенияИнфо.НаличиеCOMСоединений Тогда Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.АктивныеСоединения; - Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = СтраницыПереходаНаСледующийШаг.АктивныеСоединения2; ИначеЕсли СоединенияИнфо.НаличиеСоединенияКонфигуратором Тогда Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.СоединениеКонфигуратора; - Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияФайл.ТекущаяСтраница = СтраницыПереходаНаСледующийШаг.СоединениеКонфигуратора2; Иначе Элементы.ПанельАктивныеПользователи.ТекущаяСтраница = ВсеСтраницы.АктивныеПользователи; КонецЕсли; @@ -1336,15 +1285,6 @@ Элементы.ПолеДатаВремяОбновления.Доступность = (Объект.РежимОбновления = 2); Элементы.АдресЭлектроннойПочты.Доступность = Объект.ВыслатьОтчетНаПочту; - СтраницыПереходаНаСледующийШаг = Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияСервер.ПодчиненныеЭлементы; - СледСтраница = СтраницыПереходаНаСледующийШаг.Сейчас; - Если Объект.РежимОбновления = 1 Тогда - СледСтраница = СтраницыПереходаНаСледующийШаг.Отмена; - ИначеЕсли Объект.РежимОбновления = 2 Тогда - СледСтраница = СтраницыПереходаНаСледующийШаг.Отложить; - КонецЕсли; - Элементы.ПанельПереходаНаСледующийШагРежимаОбновленияСервер.ТекущаяСтраница = СледСтраница; - Если Не СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоГлавныйУзел Тогда ДоступностьКнопкиНазад = Ложь; КонецЕсли; @@ -1406,18 +1346,20 @@ УстановкаПароля = ВводитьПарольАдминистратора(); Элементы.ПредупреждениеОWindowsАвторизацииФайл.Видимость = УстановкаПароля; Объект.ИмяАдминистратораИБ = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ИнформацияОПользователе.Имя; - КонецЕсли; + КонецЕсли; + #Если Не ВебКлиент Тогда Элементы.ГруппаComcntrФайловыйРежим.Видимость = НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().ЭтоБазоваяВерсияКонфигурации; + #КонецЕсли ТекущийЭлемент = Элементы.ПарольАдминистратораИБФайл; КонецЕсли; // на страницах с ошибками нужно зафиксировать журнал регистрации - ОбщегоНазначенияВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); + ЖурналРегистрацииВызовСервера.ЗаписатьСобытияВЖурналРегистрации(СообщенияДляЖурналаРегистрации); - КнопкаДалее = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаДалее; - КнопкаНазад = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаНазад; - КнопкаЗакрыть = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаЗакрыть; + КнопкаДалее = Элементы.КнопкаДалее; + КнопкаНазад = Элементы.КнопкаНазад; + КнопкаЗакрыть = Элементы.КнопкаЗакрыть; КнопкаНазад.Доступность = ДоступностьКнопкиНазад; КнопкаДалее.Доступность = ДоступностьКнопкиДалее; КнопкаЗакрыть.Доступность = ДоступностьКнопкиЗакрыть; @@ -1431,7 +1373,7 @@ КонецЕсли; КонецЕсли; - КнопкаДалее.Заголовок = ? (ФункцияКнопкиДалее, НСтр("ru = '&Далее >'"), НСтр("ru = '&Готово'")); + КнопкаДалее.Заголовок = ? (ФункцияКнопкиДалее, НСтр("ru = 'Далее >'"), НСтр("ru = 'Готово'")); Если НоваяТекущаяСтраница = Страницы.ДлительнаяОперация Тогда ПодключитьОбработчикОжидания("ВыполнитьПолучениеОбновления", 1, Истина); @@ -1475,7 +1417,7 @@ Если ПроверитьФайлыОбновленияПолучены() Тогда ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", НСтр("ru = 'Обнаружено, что файлы обновления конфигурации уже были получены и сохранены локально.'")); ИмяСтраницы = ПерейтиКВыборуРежимаОбновления(Ложь); @@ -1528,7 +1470,7 @@ Объект.ТехническаяИнформацияОбОшибке = ""; Если НЕ ЗначениеЗаполнено(Объект.КодПользователяСервераОбновлений) Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите код пользователя сервера обновлений.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите код пользователя сервера обновлений.'")); КонецЕсли; ТекущийЭлемент = Элементы.КодПользователяСервераОбновлений; Возврат Страницы.ПодключениеКСайту.Имя; @@ -1536,7 +1478,7 @@ Если НЕ ЗначениеЗаполнено(Объект.ПарольСервераОбновлений) Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите пароль пользователя сервера обновлений.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите пароль пользователя сервера обновлений.'")); КонецЕсли; ТекущийЭлемент = Элементы.ПарольСервераОбновлений; Возврат Страницы.ПодключениеКСайту.Имя; @@ -1566,7 +1508,7 @@ Если ИнформационнаяБазаФайловая И НЕ РежимИмитацииКлиентСервернойИБ() Тогда НаличиеСоединений = НаличиеАктивныхСоединений(СообщенияДляЖурналаРегистрации); Если НаличиеСоединений Тогда - Предупреждение(НСтр("ru = 'Невозможно продолжить обновление конфигурации, так как не завершены все соединения с информационной базой.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Невозможно продолжить обновление конфигурации, так как не завершены все соединения с информационной базой.'")); Возврат ТекущаяСтраница.Имя; КонецЕсли; КонецЕсли; @@ -1592,7 +1534,7 @@ КонецЕсли; Если НЕ ЗапланироватьОбновлениеКонфигурации() Тогда - Предупреждение(НСтр("ru = 'Невозможно запланировать обновление конфигурации. Сведения об ошибке сохранены в журнал регистрации.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Невозможно запланировать обновление конфигурации. Сведения об ошибке сохранены в журнал регистрации.'")); Возврат ТекущаяСтраница.Имя; КонецЕсли; @@ -1612,7 +1554,7 @@ КонецЕсли; Сообщение = Сообщение + "."; ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", Сообщение); Закрыть(); @@ -1626,9 +1568,9 @@ ТекущаяСтраница = Элементы.СтраницыПомощника.ТекущаяСтраница; Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; НоваяТекущаяСтраница = ТекущаяСтраница; - КнопкаДалее = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаДалее; - КнопкаНазад = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаНазад; - КнопкаЗакрыть = КоманднаяПанель.ПодчиненныеЭлементы.КнопкаЗакрыть; + КнопкаДалее = Элементы.КнопкаДалее; + КнопкаНазад = Элементы.КнопкаНазад; + КнопкаЗакрыть = Элементы.КнопкаЗакрыть; ТекущаяСтраница.Доступность = Ложь; КнопкаДалее.Доступность = Ложь; @@ -1681,9 +1623,9 @@ КнопкаНазад.Доступность = Истина; КнопкаДалее.Доступность = Истина; КнопкаЗакрыть.Доступность = Истина; - Предупреждение(НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); КонецЕсли; - + Если Отказ Тогда ОтработатьНажатиеКнопкиНазад(); Иначе @@ -1758,29 +1700,41 @@ &НаКлиенте Процедура ПриПереходеНаСтраницуПомощника(ПредыдущаяСтраница, СледующаяСтраница, Отказ) - Если ПредыдущаяСтраница = "ФайлОбновления" И СледующаяСтраница <> "ФайлОбновления" - И Не ОбновлениеКонфигурацииКлиент.ПроверитьЛегальностьПолученияОбновления() Тогда - Отказ = Истина; + Если ПредыдущаяСтраница = "ФайлОбновления" И СледующаяСтраница <> "ФайлОбновления" Тогда + + Оповещение = Новый ОписаниеОповещения("ПриПереходеНаСтраницуПомощникаЗавершение", ЭтотОбъект); + ОбновлениеКонфигурацииКлиент.ПроверитьЛегальностьПолученияОбновления(Оповещение); + КонецЕсли; ОбновлениеКонфигурацииКлиентПереопределяемый.ПриПереходеНаСтраницуПомощника(ПредыдущаяСтраница, СледующаяСтраница, Отказ); КонецПроцедуры +&НаКлиенте +Процедура ПриПереходеНаСтраницуПомощникаЗавершение(ОбновлениеПолученоЛегально, ДополнительныеПараметры) Экспорт + + Если ОбновлениеПолученоЛегально = Ложь + Или ОбновлениеПолученоЛегально = Неопределено Тогда + ОтработатьНажатиеКнопкиНазад(); + КонецЕсли; + +КонецПроцедуры + &НаКлиенте Функция ОбработатьСтраницуДоступноеОбновление(ВыдаватьСообщения = Истина) Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; Объект.ТехническаяИнформацияОбОшибке = ""; Если НЕ СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления.ЕстьДоступДляОбновления Тогда - Предупреждение(НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Недостаточно прав для выполнения обновления конфигурации.'")); Возврат Страницы.ДоступноеОбновление.Имя; КонецЕсли; СписокФайловДляПолучения.ЗагрузитьЗначения(СоздатьСписокФайловДляПолучения()); Если ПроверитьФайлыОбновленияПолучены() Тогда ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", НСтр("ru = 'Обнаружено, что файлы обновления конфигурации уже были получены и сохранены локально.'")); Возврат ПерейтиКВыборуРежимаОбновления(Ложь); КонецЕсли; @@ -1817,7 +1771,7 @@ Если НЕ ЗначениеЗаполнено(Объект.ИмяФайлаОбновления) Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите файл поставки обновления конфигурации.'")); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Укажите файл поставки обновления конфигурации.'"),,"Объект.ИмяФайлаОбновления"); КонецЕсли; ТекущийЭлемент = Элементы.ПолеФайлОбновления; Возврат Страницы.ФайлОбновления.Имя; @@ -1826,7 +1780,7 @@ Файл = Новый Файл(Объект.ИмяФайлаОбновления); Если НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоФайл() Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Файл поставки обновления конфигурации не найден.'")); + ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru = 'Файл поставки обновления конфигурации не найден.'"),,"Объект.ИмяФайлаОбновления"); КонецЕсли; ТекущийЭлемент = Элементы.ПолеФайлОбновления; Возврат Страницы.ФайлОбновления.Имя; @@ -1857,7 +1811,7 @@ Если НЕ ЗначениеЗаполнено(Объект.ИмяАдминистратораКластера) Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите имя администратора кластера серверов.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите имя администратора кластера серверов.'")); КонецЕсли; ТекущийЭлемент = Элементы.ПолеИмяАдминистратораКластера; Возврат Страницы.ПараметрыАвторизации.Имя; @@ -1865,7 +1819,7 @@ Если НЕ ЗначениеЗаполнено(Объект.ПарольАдминистратораКластера) Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите пароль администратора кластера серверов.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите пароль администратора кластера серверов.'")); КонецЕсли; ТекущийЭлемент = Элементы.ПолеПарольАдминистратораКластера; Возврат Страницы.ПараметрыАвторизации.Имя; @@ -1876,7 +1830,7 @@ ТекстОшибки = ПроверитьИУстановитьПарольАдминистратора(СообщенияДляЖурналаРегистрации); Если НЕ ПустаяСтрока(ТекстОшибки) И ВыдаватьСообщения Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Не удалось установить пароль администратора:'") + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, НСтр("ru = 'Не удалось установить пароль администратора:'") + " " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; Возврат Страницы.ПараметрыАвторизации.Имя; КонецЕсли; @@ -1964,8 +1918,7 @@ &НаКлиенте Функция КаталогШаблонов() - ЭтоПлатформа83 = ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83(); - Постфикс = ?(ЭтоПлатформа83, "1C\1Cv8\tmplts\", "1C\1Cv82\tmplts\"); + Постфикс = "1C\1Cv8\tmplts\"; КаталогПоУмолчанию = КаталогAppData() + Постфикс; ИмяФайла = КаталогAppData() + "1C\1CEStart\1CEStart.cfg"; @@ -2031,7 +1984,7 @@ КонецЦикла; Исключение ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при поиске диска 1С:ИТС:'") + " " + ОписаниеОшибки()); Возврат ""; @@ -2079,6 +2032,7 @@ Результат = Новый Структура("ИмяПользователя, |ПарольПользователя, |СтрокаПодключения, + |ПараметрыАутентификации, |СтрокаСоединенияИнформационнойБазы", Неопределено, "", "", "", "", ""); @@ -2095,6 +2049,7 @@ Результат.ИмяПользователя = Пользователь; Результат.ПарольПользователя = Объект.ПарольАдминистратораИБ; Результат.СтрокаПодключения = "Usr=""" + Пользователь + """;Pwd=""" + Объект.ПарольАдминистратораИБ + """"; + Результат.ПараметрыАутентификации = "/N""" + Пользователь + """ /P""" + Объект.ПарольАдминистратораИБ + """ /WA-"; Возврат Результат; КонецФункции @@ -2118,7 +2073,7 @@ НСтр("ru = ' Проверка подключения к ИБ по адресу: %1, с помощью %2'"), ПараметрыПодключения.СтрокаСоединенияИнформационнойБазы, ИмяCOMСоединителя); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", ТекстСообщения); ОбщегоНазначенияКлиент.ЗарегистрироватьCOMСоединитель(Ложь); @@ -2129,7 +2084,7 @@ Исключение Результат = Ложь; ТекстСообщения = НСтр("ru = 'Не удалось выполнить подключение к информационной базе'") + Символы.ПС; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", ТекстСообщения + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); ОбнаруженнаяОшибкаПодключения = ТекстСообщения + КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); КонецПопытки; @@ -2166,7 +2121,7 @@ ИнфоОбОшибке = ИнформацияОбОшибке(); Результат = НСтр("ru = 'Ошибка при проверке соединения с кластером серверов.'") + " "; ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", Результат + ПодробноеПредставлениеОшибки(ИнфоОбОшибке)); Результат = Результат + КраткоеПредставлениеОшибки(ИнфоОбОшибке); КонецПопытки; @@ -2179,7 +2134,7 @@ Функция ПроверитьНастройкиЭлектроннойПочты(ИмяТекущейСтраницы, ВыдаватьСообщения = Истина) Если Найти(Объект.АдресЭлектроннойПочты, "@") = 0 ИЛИ Найти(Объект.АдресЭлектроннойПочты, ".") = 0 Тогда Если ВыдаватьСообщения Тогда - Предупреждение(НСтр("ru = 'Укажите допустимый адрес электронной почты.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите допустимый адрес электронной почты.'")); КонецЕсли; ТекущийЭлемент = Элементы.ПолеАдресЭлектроннойПочты; Возврат ИмяТекущейСтраницы; @@ -2198,18 +2153,39 @@ КонецПопытки; КонецФункции +&НаСервере +Функция ПараметрыПроверкиЛегальности() + + ПараметрыПроверки = Новый Структура; + + СистемнаяИнформация = Новый СистемнаяИнформация; + ИдентификаторИнформационнойБазы = СтандартныеПодсистемыСервер.ИдентификаторИнформационнойБазы(); + + ПараметрыПроверки.Вставить("login" , Объект.КодПользователяСервераОбновлений); + ПараметрыПроверки.Вставить("password" , Объект.ПарольСервераОбновлений); + ПараметрыПроверки.Вставить("variantBPED" , "authorizationChecking"); + ПараметрыПроверки.Вставить("versionConfiguration", СокрЛП(Метаданные.Версия)); + ПараметрыПроверки.Вставить("versionPlatform" , Строка(СистемнаяИнформация.ВерсияПриложения)); + ПараметрыПроверки.Вставить("nameConfiguration" , Метаданные.Имя); + ПараметрыПроверки.Вставить("language" , СокрЛП(ТекущийКодЛокализации())); + ПараметрыПроверки.Вставить("enterPoint" , "authorizationChecking"); + ПараметрыПроверки.Вставить("InfoBaseID" , ИдентификаторИнформационнойБазы); + + Возврат ПараметрыПроверки; + +КонецФункции // Запланировать обновление конфигурации &НаКлиенте Функция ЗапланироватьОбновлениеКонфигурации() Если НЕ УдалитьЗадачуПланировщика(Объект.КодЗадачиПланировщика) Тогда Возврат Ложь; - КонецЕсли; + КонецЕсли; ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкриптаОбновления(Ложь); ИмяЗапускаемогоСкрипта = ОпределитьИмяСкрипта(); - ПутьЗапускаемогоСкрипта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2 //nologo ""%3"" /p1:""%4""", - ИмяЗапускаемогоСкрипта, ?(РежимОтладкиСкрипта(), "//X //D", ""), ИмяГлавногоФайлаСкрипта, Объект.ПарольАдминистратораИБ); + ПутьЗапускаемогоСкрипта = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1 %2 //nologo ""%3""", + ИмяЗапускаемогоСкрипта, ?(РежимОтладкиСкрипта(), "//X //D", ""), ИмяГлавногоФайлаСкрипта); Объект.КодЗадачиПланировщика = СоздатьЗадачуПланировщика(ПутьЗапускаемогоСкрипта, Объект.ДатаВремяОбновления); ЗаписатьСтатусОбновления(ИмяПользователя(), Объект.КодЗадачиПланировщика <> 0, Ложь, Ложь); @@ -2239,20 +2215,20 @@ Ложь, // InteractWithDesktop КодЗадачи);// out JobId Если КодОшибки <> 0 Тогда // Коды ошибок: http://msdn2.microsoft.com/en-us/library/aa389389(VS.85).aspx - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при создании задачи планировщика:'") + " " + КодОшибки); Возврат 0; КонецЕсли; ТекстСообщения = НСтр("ru = 'Задача планировщика успешно запланирована (команда: %1; дата: %2; код задачи: %3).'"); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайлаПрограммы, ДатаВремя, КодЗадачи)); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при создании задачи планировщика:'") + " " + ОписаниеОшибки()); Возврат 0; @@ -2326,11 +2302,7 @@ ИмяГлавногоФайлаСкрипта = Неопределено; Если ИнтерактивныйРежим Тогда // Вспомогательный файл: splash.png - Если ОбщегоНазначенияКлиентСервер.ЭтоПлатформа83() Тогда - БиблиотекаКартинок.ЗаставкаВнешнейОперации83.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.png"); - Иначе - БиблиотекаКартинок.ЗаставкаВнешнейОперации.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.png"); - КонецЕсли; + БиблиотекаКартинок.ЗаставкаВнешнейОперации.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.png"); // Вспомогательный файл: splash.ico БиблиотекаКартинок.ЗначокЗаставкиВнешнейОперации.Записать(ПараметрыОбновления.КаталогВременныхФайловОбновления + "splash.ico"); // Вспомогательный файл: progress.gif @@ -2358,9 +2330,9 @@ Возврат ОбъектWMI() <> Неопределено; Исключение ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", ОписаниеОшибки()); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", ОписаниеОшибки()); Если ВыдаватьСообщения Тогда - ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.ПредупреждениеWMI", , ЭтаФорма); + ОткрытьФорму("Обработка.ОбновлениеКонфигурации.Форма.ПредупреждениеWMI", , ЭтотОбъект); КонецЕсли; Возврат Ложь; КонецПопытки; @@ -2371,7 +2343,7 @@ ТекстСообщения = ПроверитьДопустимуюДатуОбновленияНаСервере(ДатаВремя); Результат = ПустаяСтрока(ТекстСообщения); Если Не Результат И ВыдаватьСообщения Тогда - Предупреждение(ТекстСообщения); + ПоказатьПредупреждение(, ТекстСообщения); КонецЕсли; Возврат Результат; КонецФункции @@ -2410,20 +2382,20 @@ КодОшибки = Задача.Delete(); Результат = КодОшибки = 0; Если НЕ Результат Тогда // Коды ошибок: http://msdn2.microsoft.com/en-us/library/aa389957(VS.85).aspx - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при удалении задачи планировщика:'") + " " + КодОшибки); Возврат Результат; КонецЕсли; ТекстСообщения = НСтр("ru = 'Задача планировщика успешно удалена (код задачи: %1).'"); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, КодЗадачи)); КодЗадачи = 0; Возврат Результат; Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при удалении задачи планировщика:'") + " " + ОписаниеОшибки()); Возврат Ложь; @@ -2510,7 +2482,7 @@ ТекстСообщения = НСтр("ru = 'Ошибка при удалении временного файла %1 |%2'"); ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; @@ -2553,7 +2525,7 @@ ИмяФайла = ПолучитьИмяЛокальногоФайлаПорядкаОбновления(); Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте(НастройкиОбновления.АдресСервераДляПроверкиНаличияОбновления + ПараметрыОбновления.АдресРесурсовДляПроверкиНаличияОбновления + ПараметрыОбновления.ИмяФайлаПорядкаОбновления, - Новый Структура("ПутьДляСохранения", ? (ПустаяСтрока(ИмяФайла), Неопределено, ИмяФайла))); + Новый Структура("ПутьДляСохранения", ? (ПустаяСтрока(ИмяФайла), Неопределено, ИмяФайла)), Ложь); Если Результат.Статус Тогда Возврат ИмяФайла; КонецЕсли; @@ -2564,7 +2536,7 @@ |%2'"); ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); КонецПопытки; @@ -2590,7 +2562,7 @@ |%2'"); ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстСообщения, ИмяФайла, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()))); @@ -2659,7 +2631,7 @@ Функция РаспаковатьДистрибутивОбновления() #Если НЕ ВебКлиент Тогда ИмяСобытияЖурнала = ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", НСтр("ru = 'Выполняется распаковка дистрибутива обновления...'")); Для Каждого Обновление Из Объект.ДоступныеОбновления Цикл @@ -2677,18 +2649,18 @@ ЧтениеZip.ИзвлечьВсе(КаталогНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать); ИмяФайлаОбновления = КаталогНазначения + "1cv8.cfu"; Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаОбновления) Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Дистрибутив обновления не содержит 1cv8.cfu:'") + " " + Обновление.ПутьКЛокальномуФайлу); Возврат Ложь; КонецЕсли; Обновление.ПутьКЛокальномуФайлуОбновления = ИмяФайлаОбновления; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Информация", НСтр("ru = 'Файлы дистрибутива обновления успешно распакованы:'") + " " + ИмяФайлаОбновления); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытияЖурнала, "Ошибка", НСтр("ru = 'Ошибка при распаковке дистрибутива обновления:'") + " " + ОписаниеОшибки()); Возврат Ложь; @@ -2700,13 +2672,13 @@ ЧтениеZip.ИзвлечьВсе(КаталогНазначения, РежимВосстановленияПутейФайловZIP.Восстанавливать); ИмяФайлаОбновления = КаталогНазначения + "1cv8.cfu"; Если НЕ ФайлСуществуетНаКлиенте(ИмяФайлаОбновления) Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Дистрибутив обновления не содержит 1cv8.cfu:'") + " " + Обновление.ПутьКЛокальномуФайлу); Возврат Ложь; КонецЕсли; Обновление.ПутьКЛокальномуФайлуОбновления = ИмяФайлаОбновления; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Файлы дистрибутива обновления успешно распакованы:'") + " " + ИмяФайлаОбновления); ЧтениеZip.Закрыть(); @@ -2714,7 +2686,7 @@ УдалитьФайлы(Обновление.ПутьКЛокальномуФайлу); КонецЕсли; Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при распаковке дистрибутива обновления:'") + " " + ОписаниеОшибки()); Возврат Ложь; @@ -2725,9 +2697,9 @@ КонецФункции &НаКлиенте -Процедура ПолучитьДоступныеОбновления(ПараметрыОбновления, ВерсияКонфигурации, ВыдаватьСообщения, ДоступноОбновлениеДля83 = Ложь) +Процедура ПолучитьДоступныеОбновления(ПараметрыОбновления, ВерсияКонфигурации, ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции = Ложь) - ПараметрыОбновления = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления(ДоступноОбновлениеДля83); + ПараметрыОбновления = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления(ДоступноОбновлениеДляСледующейРедакции); ПутьКФайлуСпискаОбновлений = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяФайлаСпискаШаблонов; АдресФайлаВоВремХранилище = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ПутьКФайлуСпискаОбновлений)); @@ -2736,7 +2708,7 @@ ВерсияКонфигурации, АдресФайлаВоВремХранилище, СообщенияДляЖурналаРегистрации); Исключение Если ВыдаватьСообщения Тогда - Предупреждение(КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ПоказатьПредупреждение(, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); КонецЕсли; КонецПопытки; @@ -2744,9 +2716,9 @@ // Получение файла списка шаблонов с сервера &НаКлиенте -Функция ПолучитьФайлСпискаШаблонов(Знач ВыдаватьСообщения = Истина, ДоступноОбновлениеДля83 = Ложь) +Функция ПолучитьФайлСпискаШаблонов(Знач ВыдаватьСообщения = Истина, ДоступноОбновлениеДляСледующейРедакции = Ложь) #Если НЕ ВебКлиент Тогда - ПараметрыОбновления = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления(ДоступноОбновлениеДля83); + ПараметрыОбновления = ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления(ДоступноОбновлениеДляСледующейРедакции); НастройкиОбновления = СтандартныеПодсистемыКлиентПовтИсп.ПараметрыРаботыКлиента().НастройкиОбновления; ПутьКФайлуСпискаШаблонов = ПараметрыОбновления.КаталогФайловОбновления + ПараметрыОбновления.ИмяZipФайлаСпискаШаблонов; @@ -2757,14 +2729,14 @@ Попытка УдалитьФайлы(ПутьКФайлуСпискаШаблонов); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при удалении временного файла'") + " " + ПутьКФайлуСпискаШаблонов + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; ТекстОшибки = НСтр("ru = 'Ошибка при получении файла списка шаблонов:'") + " " + Результат.СообщениеОбОшибке; Если ВыдаватьСообщения Тогда - Предупреждение(ТекстОшибки); + ПоказатьПредупреждение(, ТекстОшибки); КонецЕсли; Возврат ТекстОшибки; КонецЕсли; @@ -2779,7 +2751,7 @@ Исключение ТекстОшибки = НСтр("ru = 'Ошибка при распаковке файла со списком доступных обновлений:'") + " "; ИнфоОшибки = ИнформацияОбОшибке(); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", ТекстОшибки + ПодробноеПредставлениеОшибки(ИнфоОшибки)); ТекстОшибки = ТекстОшибки + КраткоеПредставлениеОшибки(ИнфоОшибки); Возврат ТекстОшибки; @@ -2815,7 +2787,7 @@ Иначе Сообщение = Сообщение + НСтр("ru = 'Получение файла обновления из указанного источника...'"); КонецЕсли; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", Сообщение); Объект.ТехническаяИнформацияОбОшибке = ""; @@ -2824,13 +2796,28 @@ Если Файл.Значение <> Неопределено И Файл.Значение.Получен <> Истина Тогда // может быть также Неопределено Если Объект.ИсточникОбновления = 0 Тогда - // Вывод сообщения о закачке файла в журнал регистрации. + + РезультатПроверкиЛегальности = ОбновлениеКонфигурацииКлиент.ПроверитьЛегальностьСкачиванияОбновления( + ПараметрыПроверкиЛегальности()); + + Если Не РезультатПроверкиЛегальности.ЗначениеРезультата Тогда + + Элементы.ГруппаДоступаНаСайт.ТекущаяСтраница = Элементы.ГруппаДоступаНаСайт.ПодчиненныеЭлементы.ОшибкаПроверкиЛегальности; + ТекстОшибки = "Не удалось подтвердить легальность получения обновления через Интернет по причине: + |%1"; + ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибки, РезультатПроверкиЛегальности.ТекстОшибки); + Элементы.ТекстОшибкиПроверкиЛегальности.Заголовок = ТекстОшибки; + Возврат Страницы.ПодключениеКСайту.Имя; + + КонецЕсли; + + // Вывод сообщения о закачке файла в журнал регистрации. Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = ' Получаем файл %1 в %2'"), ОбновлениеКонфигурацииКлиент.ПолучитьПараметрыОбновления().АдресСервераОбновлений + Файл.Значение.Адрес, ? (ПустаяСтрока(Файл.Значение.ЛокальныйПуть), Неопределено, Файл.Значение.ЛокальныйПуть)); Элементы.НадписьПрогресс.Заголовок = Сообщение; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), , Сообщение); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), , Сообщение); СоздатьКаталог(ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(Файл.Значение.ЛокальныйПуть)); Результат = ПолучениеФайловИзИнтернетаКлиент.СкачатьФайлНаКлиенте( @@ -2845,13 +2832,13 @@ Попытка УдалитьФайлы(Файл.Значение.ЛокальныйПуть); Исключение - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", НСтр("ru = 'Ошибка при удалении временного файла'") + " " + Файл.Значение.ЛокальныйПуть + Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); КонецПопытки; Если НЕ ПустаяСтрока(ТекстОшибки) Тогда Если Файл.Значение.Обязательный И ВыдаватьСообщения Тогда - //Предупреждение(ТекстОшибки); + ПоказатьПредупреждение(, ТекстОшибки); Возврат Страницы.ПодключениеКСайту.Имя; КонецЕсли; КонецЕсли; @@ -2867,7 +2854,7 @@ Сообщение = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = ' Получаем файл %1 в %2'"), Файл.Значение.Адрес, Файл.Значение.ЛокальныйПуть); Элементы.НадписьПрогресс.Заголовок = Сообщение; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), , Сообщение); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), , Сообщение); Файл.Значение.Получен = ОбновлениеКонфигурацииКлиент.СкопироватьФайл( Файл.Значение.Адрес, Файл.Значение.ЛокальныйПуть, Файл.Значение.Обязательный И ВыдаватьСообщения); @@ -2879,7 +2866,7 @@ ИмяСтраницы = ""; ФайлыПолученыУспешно = ПроверитьФайлыОбновленияПолучены(); Если ФайлыПолученыУспешно Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Файлы обновления успешно получены.'")); Если Объект.ИсточникОбновления = 1 Тогда ИмяСтраницы = Страницы.ДоступноеОбновление.Имя; @@ -2888,7 +2875,7 @@ КонецЕсли; Иначе Сообщение = НСтр("ru = 'Не удалось получить обновление конфигурации.'"); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Ошибка", Сообщение); ИмяСтраницы = Страницы.ДлительнаяОперация.Имя; КонецЕсли; @@ -2897,13 +2884,13 @@ КонецФункции &НаКлиенте -Функция ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДля83 = Ложь) +Функция ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции = Ложь) Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; ДоступноеОбновление = ОбновлениеКонфигурацииКлиент.ПолучитьДоступноеОбновлениеКонфигурации(); Если ДоступноеОбновление.ИмяСтраницы = Страницы.ДоступноеОбновление.Имя Тогда - ТекстОшибки = ПолучитьФайлСпискаШаблонов(ВыдаватьСообщения, ДоступноОбновлениеДля83); + ТекстОшибки = ПолучитьФайлСпискаШаблонов(ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции); Если НЕ ПустаяСтрока(ТекстОшибки) Тогда Возврат Страницы.ПодключениеКИнтернет.Имя; КонецЕсли; @@ -2912,10 +2899,10 @@ ИмяФайлаПорядокОбновления = ПолучитьФайлПорядкаОбновления(); ПолучитьДоступныеОбновления(ДоступноеОбновление.ПараметрыФайлаПроверкиОбновления, - ДоступноеОбновление.ПоследняяВерсияКонфигурации, ВыдаватьСообщения, ДоступноОбновлениеДля83); + ДоступноеОбновление.ПоследняяВерсияКонфигурации, ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции); ПоследняяВерсияКонфигурации = ДоступноеОбновление.ПоследняяВерсияКонфигурации; Если Объект.ДоступныеОбновления.Количество() = 0 Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Невозможно продолжить обновление: нет доступных обновлений.'")); Возврат Страницы.ОбновленияНеОбнаружено.Имя; КонецЕсли; @@ -2929,20 +2916,20 @@ &НаКлиенте Функция ПроверитьОбновлениеИнтернет(ВыдаватьСообщения = Истина) Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Проверка обновления в Интернете...'")); ДоступноеОбновление = Неопределено; Объект.ДоступныеОбновления.Очистить(); - ОбновлениеКонфигурацииКлиент.ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДля83); + ОбновлениеКонфигурацииКлиент.ПроверитьНаличиеОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции); - Возврат ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДля83); + Возврат ПолучитьФайлыОбновленияЧерезИнтернет(ВыдаватьСообщения, ДоступноОбновлениеДляСледующейРедакции); КонецФункции &НаКлиенте Функция ПроверитьОбновлениеИТС(ВыдаватьСообщения = Истина) Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Проверка обновления на диске ИТС...'")); ДоступноеОбновление = Неопределено; @@ -2955,16 +2942,16 @@ ПутиДискаИТС = ""; Если Объект.ИсточникДискаИТС <> 1 Тогда ТекущийДискИТС = НайтиДискИТС(ПутиДискаИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Обнаружен диск 1С:ИТС:'") + " " + ДискИТС); Иначе Если ПустаяСтрока(ДискИТС) Тогда - Предупреждение(НСтр("ru = 'Укажите местоположение диска 1С:ИТС.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Укажите местоположение диска 1С:ИТС.'")); Возврат Страницы.МестоположениеДискаИТС.Имя; КонецЕсли; ПроверкаСуществования = Новый Файл(ДискИТС); Если НЕ ПроверкаСуществования.Существует() ИЛИ НЕ ПроверкаСуществования.ЭтоКаталог() Тогда - Предупреждение(НСтр("ru = 'Указанный каталог не существует.'")); + ПоказатьПредупреждение(, НСтр("ru = 'Указанный каталог не существует.'")); Возврат Страницы.МестоположениеДискаИТС.Имя; КонецЕсли; ТекущийДискИТС = ДискИТС; @@ -2977,7 +2964,7 @@ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Диск 1С:ИТС не найден по указанным путям: |%1'"), ПутиДискаИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Предупреждение", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; Возврат Страницы.ОбновленияНеОбнаружено.Имя; @@ -2987,7 +2974,7 @@ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'На диске 1С:ИТС не найден каталог обновления. |%1'"), ТекущийДискИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Предупреждение", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; Возврат Страницы.ОбновленияНеОбнаружено.Имя; @@ -3000,7 +2987,7 @@ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'На диске 1С:ИТС не найдена информация о последнем обновлении. |%1'"), ТекущийДискИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Предупреждение", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; Возврат Страницы.ОбновленияНеОбнаружено.Имя; @@ -3012,13 +2999,13 @@ СтрокаСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Нет доступных обновлений. |%1'"), ТекущийДискИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Предупреждение", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; Возврат Страницы.ОбновленияНеОбнаружено.Имя; КонецЕсли; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Обнаружена более новая версия конфигурации на диске 1С:ИТС:'") + " " + ПоследняяВерсияКонфигурации + "."); @@ -3027,7 +3014,7 @@ НСтр("ru = 'На диске 1С:ИТС не найден список доступных обновлений. |%1'"), ТекущийДискИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Предупреждение", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; @@ -3040,7 +3027,7 @@ НСтр("ru = 'Нет доступных обновлений. |%1'"), ТекущийДискИТС); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", СтрокаСообщения); Элементы.НадписьОбновлениеНеОбнаружено.Заголовок = СтрокаСообщения; @@ -3079,7 +3066,7 @@ Страницы = Элементы.СтраницыПомощника.ПодчиненныеЭлементы; - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Проверка обновления в Интернете...'")); Объект.ДоступныеОбновления.Очистить(); @@ -3092,7 +3079,7 @@ Файл = Новый Файл(Объект.ИмяФайлаОбновления); Если НЕ Файл.Существует() ИЛИ НЕ Файл.ЭтоФайл() Тогда - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Невозможно продолжить обновление: файл поставки обновления конфигурации не найден.'")); Возврат Страницы.ФайлОбновления.Имя; @@ -3125,34 +3112,18 @@ КонецФункции -&НаКлиенте -Функция ТекстНадписиПроверкиОбновления() - Результат = НСтр("ru = 'Отключена'"); - Если Объект.ПроверятьНаличиеОбновленияПриЗапуске = 2 Тогда - Результат = НСтр("ru = 'При каждом запуске программы'"); - ИначеЕсли Объект.ПроверятьНаличиеОбновленияПриЗапуске = 1 Тогда - Результат = НСтр("ru = 'По расписанию:'") + " " + Строка(Объект.РасписаниеПроверкиНаличияОбновления); - КонецЕсли; - Возврат Результат; -КонецФункции - &НаКлиенте Процедура ВыполнитьОбновлениеКонфигурации() УдалитьЗадачуПланировщика(Объект.КодЗадачиПланировщика); ИмяГлавногоФайлаСкрипта = СформироватьФайлыСкриптаОбновления(Истина); - ОбщегоНазначенияКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(), "Информация", НСтр("ru = 'Выполняется процедура обновления конфигурации:'") + " " + ИмяГлавногоФайлаСкрипта); ЗаписатьСтатусОбновления(ИмяПользователя(), Истина, Ложь, Ложь, СообщенияДляЖурналаРегистрации); + ЗапуститьПриложение("""" + ИмяГлавногоФайлаСкрипта + """", ОбновлениеКонфигурацииКлиент.ПолучитьКаталогФайла(ИмяГлавногоФайлаСкрипта)); - СтрокаЗапуска = "cmd /c %1 [p1]%2[/p1]"; - СтрокаЗапуска = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СтрокаЗапуска, ИмяГлавногоФайлаСкрипта, - Объект.ПарольАдминистратораИБ); - Оболочка = Новый COMОбъект("Wscript.Shell"); - Оболочка.Run(СтрокаЗапуска, 0); - -КонецПроцедуры +КонецПроцедуры &НаСервереБезКонтекста Процедура ЗаписатьСтатусОбновления(ИмяАдминистратораОбновления, ОбновлениеЗапланировано, ОбновлениеВыполнено, РезультатОбновления, @@ -3186,3 +3157,35 @@ Возврат Неопределено; КонецПопытки; КонецФункции + +&НаКлиенте +Функция ВозможенЗапускОбновления() + + ВозможенЗапускОбновления = Истина; + + #Если ВебКлиент Тогда + ВозможенЗапускОбновления = Ложь; + ТекстСообщения = НСтр("ru = 'Обновление программы недоступно в веб-клиенте.'"); + #КонецЕсли + + Если ОбщегоНазначенияКлиентСервер.ЭтоLinuxКлиент() Тогда + ВозможенЗапускОбновления = Ложь; + ТекстСообщения = НСтр("ru = 'Обновление программы недоступно в клиенте под управлением ОС Linux.'"); + КонецЕсли; + + Если ОбщегоНазначенияКлиент.КлиентПодключенЧерезВебСервер() Тогда + ВозможенЗапускОбновления = Ложь; + ТекстСообщения = НСтр("ru = 'Обновление программы недоступно при подключении через веб-сервер.'"); + КонецЕсли; + + Если Не ВозможенЗапускОбновления Тогда + + ПоказатьПредупреждение(, ТекстСообщения); + ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации(ОбновлениеКонфигурацииКлиент.СобытиеЖурналаРегистрации(),, + ТекстСообщения,,Истина); + + КонецЕсли; + + Возврат ВозможенЗапускОбновления; + +КонецФункции \ No newline at end of file diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html index d46240c01..f62fa2f29 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Help/ru.html @@ -1,10 +1,9 @@ - -

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

                    + +

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

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

                    Получение обновлений через Интернет

                    На первой странице помощника выберите вариант «Пользовательский сайт в Интернете (рекомендуется)». Если на пользовательском сайте имеется доступное обновление, то система сообщает номер версии, краткое описание, размер обновления и предлагает его установить.

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

                    -

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

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

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

                    Получение обновлений с диска 1С:ИТС

                    @@ -14,9 +13,9 @@

                    Установка обновлений 

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

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

                    -

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

                    -

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

                    -

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

                    +

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

                    +

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

                    +

                    После завершения обновления версии 1С:Предприятие будет автоматически перезапущено, и программа будет готова к дальнейшей работе.

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

                    Планирование обновлений

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

                    diff --git a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt index e59bcf995..bcfb1f5d8 100644 --- a/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt +++ b/SSL/src/DataProcessors/ОбновлениеКонфигурации/Templates/ЗаставкаОбновленияКонфигурации/Template.txt @@ -10,6 +10,8 @@